在Jekyll 3中,我能否在实际Markdown解析之前转换帖子的Markdown?

3
我想使用 Jekyll Responsive Image 插件 为我的文章生成适当的响应式图片,并添加 srcset/sizes 属性。
但我也希望能够在提供实时预览的软件(例如MacDown)中编辑我的文章,该软件只了解标准Markdown语法的图片。
这就是为什么我想知道是否有一种方法——某种插件——可以告诉Jekyll将我放在Markdown文件中的标准Markdown语法的图片转换为特定于 Jekyll Responsive Image 插件 的语法: {% responsive_image path: path/to/image.jpg alt: "alt text" %} 然后,Jekyll可以继续使用Kramdown生成HTML...
我还在插件的Github上创建了一个问题,但更普遍的答案也很好,可能对其他需求也有用。
3个回答

5

是的,这绝对是可能的。自 Jekyll 3以来,您可以拥有每个文件扩展名的多个转换器。这使您能够创建像这样的转换器:

class ResponsiveImageify < Jekyll::Converter
  priority :high

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

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

那个转换器将会使用gsub函数替换任何.md文件的内容。
希望这可以帮到你!

我尝试在新插件中使用它,但似乎我用Cloudinary转换器生成的Liquid语法没有被解析。我应该明确调用Kramdown吗? - Nicolas Hoizey
相关:http://stackoverflow.com/questions/38126629/how-is-the-priority-flag-in-jekyll-plugins-supposed-to-work - Nicolas Hoizey

2

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

一个非常基本的插件可以是:

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: \2 alt: \1  %}')
    post.content = newContent
  end
end

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


我更喜欢parkr的回答,但这个也给了我新的想法,非常感谢! - Nicolas Hoizey
谢谢!顺便说一下,我使用了命名匹配来修改正则表达式,还解析出了 title,并且 alttitle 都是可选的。所以在我的情况下,那个 gsub 行看起来像这样:new_content = post.content.gsub(/\!\[(?<alt>.+)?\]\((?<path>\S+) ?"?(?<title>.*?)"?\)/, '{% responsive_image path: \k<path> alt: "\k<alt>" title: "\k<title>" %}’) - Daniel Pietzsch

0

这里发布的示例破坏了alt标签。 否则,alt字符串需要加引号,否则会被截断成一个单词。

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

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


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