使用 Jekyll 3,我可以在实际 Markdown 解析之前转换 post 的 Markdown 吗?

With Jekyll 3, can I transform a post's Markdown before actual Markdown parsing?

我想使用 Jekyll Responsive Image plugin 为我的帖子的图像生成具有 srcset/sizes 属性的适当响应图像。

但我也希望能够在提供实时预览的软件中编辑我的帖子,例如 MacDown,它只理解图像的标准 Markdown 语法。

这就是为什么我想知道是否有一种方法——某种插件——告诉 Jekyll 转换图像的标准 Markdown 语法,我会把它放在我的 Markdown 文件中…

![alt text](path/to/image.jpg)

...进入此特定于 Jekyll Responsive Image plugin 的语法:

{% responsive_image path: path/to/image.jpg alt: "alt text" %}

然后,Jekyll 可以继续使用 Kramdown 生成 HTML…

我也创建了 an issue in the plugin's Github,但更笼统的答案也很好,也许对其他需求有用。

最简单的解决方案是使用新的 Jekyll hooks

一个非常原始的插件可以是:

Jekyll::Hooks.register :posts, :pre_render do |post, payload|
  docExt = post.extname.tr('.', '')
  # only process if we deal with a markdown file
  if payload['site']['markdown_ext'].include? docExt
    newContent = post.content.gsub(/\!\[(.+)\]\((.+)\)/, '{% responsive_image path:  alt:   %}')
    post.content = newContent
  end
end

将此存储在 _plugins/img-tag-transform.rb

是的,这绝对有可能。从 Jekyll 3 开始,每个文件扩展名 可以有多个转换器 。这允许您创建一个转换器,如:

class ResponsiveImageify < Jekyll::Converter
  priority :high

  def matches(ext)
    ext.downcase == ".md"
  end

  def convert(content)
    content.gsub(/\!\[(.+)\]\((.+)\)/, '{% responsive_image path:  alt:   %}')
  end
end

该转换器将 gsub 任何 .md 文件的内容。

希望对您有所帮助!

此处 post 的示例打破了 alt 标签。 alt 字符串需要用引号引起来,否则它会被截断为一个单词。

例如content.gsub(/\!\[(.+)\]\((.+)\)/, '{% responsive_image path: alt: "" %}')

此外,Nicolas Hoizey 的 post 是唯一适用于最新版本 Jekyll (3.7) 的方法,我似乎无法使其他示例输出 html。 Markdown 似乎在插入 liquid 标签之前就已呈现。