6

我正在为 Jekyll 编写一个转换器插件,并且需要访问一些页眉(YAML 前端)属性。只有内容被传递给主转换器方法,似乎无法访问上下文。

例子:

module Jekyll
  class UpcaseConverter < Converter
    safe true
    priority :low

    def matches(ext)
      ext =~ /^\.upcase$/i
    end

    def output_ext(ext)
      ".html"
    end

    def convert(content)

      ###########
      #
      # Its here that I need access to the content page header data 
      #
      # 
      ###########

      content.upcase
    end
  end
end

任何想法如何访问转换器插件中的页眉数据?

4

2 回答 2

2

根据 Jekyll 源代码,无法在转换器中检索 YAML 前端内容。

我看到两种解决方案可以根据您的情况起作用。

  1. 您的文件扩展名可能具有足够的描述性,以提供您将包含在前面事项中的信息。看起来转换器插件被设计成这个基本的。

  2. 如果可以选择修改 Jekyll,您可以更改 Convertible.transform 方法以将前端内容发送到 Converter.convert。Jekyll 附带的转换器也必须进行修改。在 GitHub 上 fork 看看其他人是否喜欢这个想法。从这里开始:https ://github.com/mojombo/jekyll/blob/cb1a2d1818770ca5088818a73860198b8ccca27a/lib/jekyll/convertible.rb#L49

祝你好运。

于 2013-07-08T22:06:42.940 回答
2

devnull,我遇到了类似的情况,我想出了一种方法。

在转换器中,我注册了一个pre-render钩子来将 YAML 拉入一个变量,这样在实际的convert方法中,我可以访问我刚刚提取的信息。此外,需要另一个post_render挂钩来删除该信息,因为这应该是每个帖子的数据。

一个旁注。我发现convert会调用两次,一次用于 html<meta>标签,一次用于实际内容。钩子只会在第二种情况下被调用,而不是第一种。您可能需要保护您的convert功能。

另一个旁注。我认为在转换器中使用 YAML 并非不合理。就像pandoc您可以在 YAML 部分中指定参考书目文件并进行其他微调一样,人们也应该可以自由地使用 YAML 自定义单个帖子。

  def initialize(config)
    super(config)

    Jekyll::Hooks.register :posts, :pre_render do |post|
      if matches(post.data["ext"])
        # extract per post metadata, including those in YAML
        @myconfig["meta"] = post.data

        # you may need the path to the post: post.path
      end
    end 

    Jekyll::Hooks.register :posts, :post_render do |post|
      if matches(post.data["ext"])
        # remove per post metadata
        @myconfig.delete("meta")
      end
    end
  end 

  def convert(content) 
    return content unless @myconfig["meta"]

    # actual conversion goes here
  end
于 2015-12-07T20:33:55.237 回答