2013-07-03 8 views
6

Piszę wtyczkę konwertera dla Jekyll i potrzebuję dostępu do niektórych nagłówków strony (właściwości YAML). Tylko zawartość jest przekazywana do metody konwertera głównego i nie ma możliwości uzyskania dostępu do kontekstu.Jak uzyskać dostęp do właściwości strony (fronty YAML) w wtyczce konwertera

Przykład:

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 

Wszelkie pomysły w jaki sposób mogę uzyskać dostęp do danych w nagłówku strony wtyczki konwerter?

Odpowiedz

2

Na podstawie kodu źródłowego Jekyll nie można odzyskać przedniej części YAML w konwerterze.

Widzę dwa rozwiązania, które mogą działać w zależności od sytuacji.

  1. Twoje rozszerzenie pliku może być wystarczająco opisowe, aby podać informacje, które uwzględniłbyś w pierwszej sprawie. Wygląda na to, że wtyczka Converter została tak zaprojektowana.

  2. Jeśli modyfikowanie Jekyll jest opcją, można zmienić metodę Convertible.transform, aby wysłać pierwszą sprawę do Converter.convert. Konwertery dołączone do Jekyll również musiałyby zostać zmodyfikowane. Rozwiąż go na GitHub i sprawdź, czy inni podoba się ten pomysł. Oto, od czego zacząć: https://github.com/mojombo/jekyll/blob/cb1a2d1818770ca5088818a73860198b8ccca27a/lib/jekyll/convertible.rb#L49

Powodzenia.

+1

Po zejściu z podobnej trasy znalazłem to samo - nie jest to możliwe. Doszedłem też do wniosku, że ** nie powinno być możliwe, ponieważ to, co próbowałem zrobić, nie było odpowiednie dla wtyczki konwertera, po przemyśleniu stworzyłem wtyczki tagów. Wtyczki konwertera powinny zajmować się wyłącznie konwersją tekstu z jednego formatu na inny i nie powinny być zależne od kontekstu. –

2

devnull, wpadłem na podobną sytuację i wymyśliłem sposób na zrobienie tego.

W konwerterze zarejestrowałem hak pre-render, aby pobrać YAML do zmiennej, więc w rzeczywistej metodzie convert mam dostęp do właśnie pobranych informacji. Aby usunąć tę informację, potrzebny jest kolejny haczyk post_render, ponieważ powinny to być dane dotyczące poszczególnych postów.

Notatka boczna. Zauważyłem, że convert zostanie wywołane dwa razy, jeden raz do użycia w tagu html <meta>, raz dla rzeczywistej zawartości. Hak zostanie wywołany tylko w drugim przypadku, a nie w pierwszym. Być może będziesz musiał pilnować funkcji convert.

Kolejna uwaga boczna. Myślę, że posiadanie YAML w konwerterze nie jest nierozsądne. Podobnie jak w pandoc, gdzie można określić plik bibliografii w sekcji YAML i wykonać inne precyzyjne dostrojenie, ludzie powinni mieć swobodę dostosowywania pojedynczego postu przy użyciu 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 
Powiązane problemy