如何在转换器插件中访问页面属性(YAML前端内容)

时间:2013-07-03 15:38:21

标签: ruby jekyll jekyll-extensions

我正在为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

如何了解如何在转换器插件中访问页眉数据?

2 个答案:

答案 0 :(得分:2)

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

我看到两种解决方案可能会根据您的情况而有效。

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

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

  3. 祝你好运。

答案 1 :(得分: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
相关问题