1

我在我的 jekyll博客中使用 pygments 和 kramdown 。

我尝试将代码块添加到降价列表,但显示不正确。

1. first

2. second

    {% highlight ruby %}
    def foo
      puts 'foo'
    end
    {% endhighlight %}

3. third

2015-10-29 6 39 28

生成的html:

<ol>
  <li>
    <p>first</p>
  </li>
  <li>
    <p>second</p>
  </li>
</ol>

<div 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">&#39;foo&#39;</span>
<span class="k">end</span></code></pre></div>

<ol>
  <li>third</li>
</ol>

但如果我这样写,那是没有问题的。

1. first

2. second

    ```
    def foo
      puts 'foo'
    end
    ```

3. third

2015-10-29 6 41 37

这是 pygments 还是 kramdown 问题?希望有人可以帮助我,在此先感谢!

4

3 回答 3

3

问题不在于 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>
于 2015-10-30T03:22:40.590 回答
1

我稍微修改了@matt 的答案。

我们可以在 rb 文件中使用 \t 而不是 4 个空格。

由于这些更改,我们也可以将缩进用于第一级和第二级列表项。

找到下面的rb文件

module IndentFilter
  def indent1(input)
    input.gsub(/\n/, "\n\t")
  end
  def indent2(input)
    input.gsub(/\n/, "\n\t\t")
  end
end

Liquid::Template.register_filter(IndentFilter)
于 2021-12-18T15:17:49.430 回答
1

Jekyllhighlight标签正在修剪内容。由于end语句之前的空格位于文本中间,因此不会被修剪。

取消缩进整个代码块,它应该正确呈现。

1. first

2. second

    {% highlight ruby %}
def foo
  puts 'foo'
end
    {% endhighlight %}

3. third
于 2015-10-29T18:24:18.810 回答