2013-07-03 14 views
6

Sto scrivendo un plug-in del convertitore per Jekyll e ho bisogno di accedere ad alcune proprietà della pagina di intestazione (YAML front). Solo il contenuto è passato al metodo del convertitore principale e non sembra possibile accedere al contesto.Come è possibile accedere alle proprietà della pagina (frontespizio YAML) all'interno di un plug-in del convertitore

Esempio:

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 

Tutte le idee come posso accedere ai dati di intestazione di pagina all'interno di un plugin convertitore?

risposta

2

In base al codice sorgente di Jekyll, non è possibile recuperare la parte anteriore di YAML in un convertitore.

Vedo due soluzioni che potrebbero funzionare a seconda della situazione.

  1. L'estensione del file potrebbe essere sufficientemente descrittiva da fornire le informazioni che avresti incluso nell'argomento. Sembra che il plugin Converter sia stato progettato per essere così basilare.

  2. Se la modifica di Jekyll è un'opzione, è possibile modificare il metodo Convertible.transform per inviare la parte anteriore a Converter.convert. Anche i convertitori che vengono con Jekyll dovrebbero essere modificati. Forchetta su GitHub e vedi se ad altri piace l'idea. Ecco da dove cominciare: https://github.com/mojombo/jekyll/blob/cb1a2d1818770ca5088818a73860198b8ccca27a/lib/jekyll/convertible.rb#L49

Buona fortuna.

+1

Dopo aver percorso un percorso simile ho trovato lo stesso, non è possibile. Sono anche giunto alla conclusione che ** shoudn't ** non sia possibile in quanto ciò che stavo cercando di fare non era adatto per un plug-in del convertitore, dopo un ripensamento ho creato invece dei plugin per i tag. I plug-in del convertitore devono trattare solo la conversione di testo da un formato all'altro e non essere sensibili al contesto. –

2

Devnull, mi sono imbattuto in una situazione simile e ho trovato un modo per farlo.

Nel convertitore, ho registrato un hook pre-render per inserire YAML in una variabile, in modo che nel metodo effettivo convert, abbia accesso alle informazioni che ho appena estratto. Inoltre, è necessario un altro hook post_render per rimuovere quella parte di informazioni poiché questo dovrebbe essere un dato per post.

Una nota a margine. Ho trovato che il convert verrà chiamato due volte, una volta per l'uso nel tag html <meta>, una volta per il contenuto effettivo. L'hook verrà invocato solo per il secondo caso, non il primo. Potrebbe essere necessario proteggere la funzione convert.

Un'altra nota a margine. Penso che avere YAML nel convertitore non sia irragionevole. Proprio come in pandoc dove puoi specificare il file di bibliografia nella sezione YAML e fare altre regolazioni fini, le persone dovrebbero avere la libertà di personalizzare un singolo post usando anche 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