问题不在于 Liquid 或 kramdown 单独存在,而在于它们如何一起运行。Jekyll 似乎首先使用 Liquid 处理文件,然后将结果传递给 kramdown 以解析为 markdown。
这意味着 kramdown 看到的是这样的:
1. first
2. second
<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"> <span class="k">def</span> <span class="nf">foo</span>
<span class="nb">puts</span> <span class="s1">'foo'</span>
<span class="k">end</span>
</code></pre></figure>
3. third
Liquid 没有保留代码部分的缩进,因此当作为降价处理时,它会导致列表关闭并且第三项被视为新列表。
为了在highlight
此处使用 Liquid 标签,您需要确保 Liquid 处理的结果是适当缩进的 markdown。我不知道这对于普通的 Jekyll 是否可行,但你可以用一个插件相当简单地做到这一点(所以如果你使用的是 Github 页面,这将不起作用)。
创建一个类似_plugins/indent_filter.rb
以下内容的文件:
module IndentFilter
def indent(input)
input.gsub(/\n/, "\n ")
end
end
Liquid::Template.register_filter(IndentFilter)
现在你可以像这样使用它:
1. first
2. second
{% capture the_code %}
{% highlight ruby %}
def foo
puts 'foo'
end
{% endhighlight %}
{% endcapture %}
{{ the_code | indent }}
3. third
请注意,您需要先使用capture
才能使用indent
过滤器(如果您愿意,您可以创建一个自定义标签来代替使用highlight
)。另请注意,Liquid 标签根本不缩进,由过滤器处理。
在 Liquid 处理之后但在降价之前的结果是这样的:
1. first
2. second
<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">def</span> <span class="nf">foo</span>
<span class="nb">puts</span> <span class="s1">'foo'</span>
<span class="k">end</span></code></pre></figure>
3. third
现在代码块已正确缩进,以便 markdown 将其视为第二个列表项的内容。由于它已经是 HTML,kramdown 不会尝试进一步处理它,但也不会导致列表关闭。markdown处理后的结果是:
<ol>
<li>
<p>first</p>
</li>
<li>
<p>second</p>
<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">def</span> <span class="nf">foo</span>
<span class="nb">puts</span> <span class="s1">'foo'</span>
<span class="k">end</span></code></pre></figure>
</li>
<li>
<p>third</p>
</li>
</ol>