如何使用Liquid标签在Jekyll中访问未渲染的(Markdown)内容?

14

从阅读Jekyll模板数据的文档中,一个人可能会认为访问未渲染内容的方法是通过page.content,但据我所知,这提供的是已由Markdown解析器呈现的文章内容。

我需要访问原始Markdown内容的解决方案,而不仅仅是尝试将HTML转换回Markdown。

用例背景

我的用例如下:我使用 pandoc插件为我的Jekyll站点呈现Markdown,并使用“mathjax”选项获得漂亮的公式。 但是,Mathjax需要JavaScript,因此这些内容在RSS源中不会显示,我通过循环page.content生成RSS源。

 {% for post in site.posts %}
 <entry>
   <title>{{ post.title }}</title>
   <link href="{{ site.production_url }}{{ post.url }}"/>
   <updated>{{ post.date | date_to_xmlschema }}</updated>
   <id>{{ site.production_url }}{{ post.id }}</id>
   <content type="html">{{ post.content | xml_escape }}</content>
 </entry>
 {% endfor %}

正如xml_escape过滤器所暗示的,post.content在此处呈现为html格式。如果我可以获得原始内容(假设存在post.contentraw或者类似的东西),那么我就可以轻松地添加一个过滤器,使用pandoc的“webtex”选项来在解析RSS提要时为方程式生成图像,例如:

require 'pandoc-ruby'
module TextFilter
  def webtex(input)
    PandocRuby.new(input, "webtex").to_html
  end
end
Liquid::Template.register_filter(TextFilter)

但是,由于我对已经在html+mathjax中呈现的方程式感到满意,而不是原始的markdown格式,所以我陷入了困境。 回转回去成markdown并没有帮助,因为它不能将mathjax转换(只会使其混乱)。

有什么建议吗? 肯定有一种方法可以调用原始的markdown格式吧?


这里有一种完全不同的方法来解决我的用例:https://dev59.com/cGrWa4cB1Zd3GeqP9Uxb,尽管它没有解决如何访问原始Markdown的问题。 - cboettig
4个回答

11

这里可能会有些问题: https://github.com/mojombo/jekyll/blob/master/lib/jekyll/convertible.rbhttps://github.com/mojombo/jekyll/blob/master/lib/jekyll/site.rb

根据我的阅读,对于给定的文章或页面,可通过在convertible.rb的第79行运行Markdown和Liquid,将self.content替换为结果。

self.content = Liquid::Template.parse(self.content).render(payload, info)

在 site.rb 的第 37-44 行和 197-211 行中,文章会先于页面进行渲染。

def process
  self.reset
  self.read
  self.generate
  self.render
  self.cleanup
  self.write
end

... ...

def render
  payload = site_payload
  self.posts.each do |post|
    post.render(self.layouts, payload)
  end

  self.pages.each do |page|
    page.render(self.layouts, payload)
  end

  self.categories.values.map { |ps| ps.sort! { |a, b| b <=> a } }
  self.tags.values.map { |ps| ps.sort! { |a, b| b <=> a } }
rescue Errno::ENOENT => e
  # ignore missing layout dir
end

当您渲染此页面时,self.content已经被渲染为HTML - 因此无需阻止它进行渲染。它已经完成了。

然而,生成器(https://github.com/mojombo/jekyll/wiki/Plugins)在渲染阶段之前运行,因此根据我从源代码中读取的内容,您应该能够相对容易地编写一个生成器,将self.content复制到某个属性(例如self.raw_content)中,以便稍后在模板中作为原始Markdown访问{{ page.raw_content }}。


这里的解释很好,建议也很好。我的 Ruby 水平不太好(特别是变量作用域),这是否只需要在生成器中加入 self.raw_content = self.content 这一行代码,然后 page.raw_content 就会自动可用了呢? - cboettig
4
请看这个代码片段,它可以正常工作:https://gist.github.com/4025507。然后你可以使用`{{ page.raw_content }}`在你的布局中访问原始内容。 - heliotrope
1
请注意,您自己的插件(在这种情况下是生成器)将无法在Github页面上运行。因此,如果您打算在那里使用它,您需要找到另一个解决方案。 - Pithikos
我相信它一定有!坦白说,过去六年里我没有真正关注Jekyll中的任何事情,所以我无法提供帮助。 - heliotrope
有没有人知道一个能在Github Pages上解决这个问题的解决方案? - Sam Goto
显示剩余2条评论

1

最后我把我的.md文件重命名为.html,这样它们就不会被MarkDown渲染器渲染了。


0

0

这应该可以工作。

# frozen_string_literal: true

module RawContent
  class Generator < Jekyll::Generator
    def generate(site)
      site.posts.docs.each do |post|
        post.data['raw_content'] = post.content
      end
    end
  end
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接