ZMonster's Blog 巧者劳而智者忧,无能者无所求,饱食而遨游,泛若不系之舟

在Github Pages博客内容中插入liquid语句示例

由于Github Pages在后端使用jekyll来处理博客文件,对于文章内部插入的原本用来做示例的liquid语句,会被它解析而不是展示原本的内容,比如说,我在文中插入这样的示例(org-mode):

#+begin_example
{% for post in site.posts limit:5 %}
{{ post.title }}
{% endfor %}
#+end_example

最后得到的内容却会是这样的:


论文笔记: ReDecode Framework for Iterative Improvement in Paraphrase Generation

论文笔记:Word Embedding based Edit Distance

论文笔记:Visualizing and understanding recurrent networks

论文笔记:Visualization Analysis for Recurrent Networks

论文笔记:Sequence to Sequence Learning with Neural Networks

这显然不是我们想要的,解决办法也很简单,那就是在每一个liquid语句前后用

{% raw %}

{% endraw %}

包裹起来,这样liquid模板引擎会将内部的文本作为普通文本处理而不是按照liquid语法去解析它,下面是正确的示例:

#+begin_example
{% raw %}{% for post in site.posts %}{% endraw %}
{% raw %}{{ post.title }}{% endraw %}
{% raw %}{% endfor%}{% endraw %}
#+end_example

就能够得到这样正确的示例结果:

{% for post in site.posts %}
{{ post.title }}
{% endfor %}

不过,还没完呢,比如说,像

{% raw %}

这样的标签,又怎么在文中显示呢?用刚才说的方法是不行的,不信试试在文中直接这样写

{% raw %}
{% raw %}
{% endraw %}

本地运行

jekyll build

试试,没错,会得到一个错误。下面的写法同样会得到错误。

{% raw %}
{% endraw %}
{% endraw %}

究其原因,应该是liquid的 raw/endraw 标签在匹配时按照就近原则吧——这个是我推测的。

最后我在Stack Overflow上找到了一个解决方案

像这样:

{{ "{% raw " }}%}

就可以得到:

{% raw %}

的显示效果。

也就是说,把 {% 和 %} 这一对标签的开闭符号分开了,一部分用双引号括起来并用 {{ 和 }} 包裹起来,另一部分则按照平常的方式书写。同样的, {{ 和 }} 也可以通过这种方式来处理。本文第五个示例就是这么得到的。

自己动手试一试吧!