2013-07-03 43 views
6

我正在寫一個傑基爾插件轉換器和需要訪問一些網頁頭(YAML前面的問題)的屬性中訪問網頁的屬性(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

基於Jekyll源代碼,無法在轉換器中檢索YAML前端物質。

我看到兩種解決方案可以根據您的情況工作。

  1. 您的文件擴展名可能足以描述您提供的信息,這些信息將包含在前面的內容中。它看起來像Converter插件被設計成這個基本的。

  2. 如果修改化身是一個選項,你可以改變Convertible.transform方法將前面的問題發送到Converter.convert。 Jekyll附帶的轉換器也必須進行修改。把它放在GitHub上,看看其他人是否喜歡這個想法。從這裏開始:https://github.com/mojombo/jekyll/blob/cb1a2d1818770ca5088818a73860198b8ccca27a/lib/jekyll/convertible.rb#L49

祝你好運。

+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