2012-11-30 6 views
12

Nun, das ist wahrscheinlich eine dumme Frage, aber ich frage mich, ob es eine Möglichkeit gibt, das generierte Markup in Jekyll zu haben, um den Einzug des Liquid-Tags zu erhalten. Die Welt endet nicht, wenn sie nicht lösbar ist. Ich bin nur neugierig, da ich mag, dass mein Code ordentlich aussieht, selbst wenn er kompiliert wird. :)Eingebettetes Markup in Jekyll/Ruby

Zum Beispiel habe ich diese beiden:

base.html:

<body> 
    <div id="page"> 
     {{content}} 
    </div> 
</body> 

index.md:

--- 
layout: base 
--- 
<div id="recent_articles"> 
    {% for post in site.posts %} 
    <div class="article_puff"> 
     <img src="/resources/images/fancyi.jpg" alt="" /> 
     <h2><a href="{{post.url}}">{{post.title}}</a></h2> 
     <p>{{post.description}}</p> 
     <a href="{{post.url}}" class="read_more">Read more</a> 
    </div> 
    {% endfor %}  
</div> 

Problem ist, dass die importierte {{content}} - Das Tag wird ohne die oben verwendete Indentation gerendert.

Also statt

<body> 
    <div id="page"> 
     <div id="recent_articles"> 
      <div class="article_puff"> 
       <img src="/resources/images/fancyimage.jpg" alt="" /> 
       <h2><a href="/articles/2012/11/14/gettin-down-with-rwd.html">Gettin' down with responsive web design</a></h2> 
       <p>Everyone's talking about it. Your client wants it. You need to code it.</p> 
       <a href="/articles/2012/11/14/gettin-down-with-rwd.html" class="read_more">Read more</a> 
      </div> 
     </div> 
    </div> 
</body> 

ich

<body> 
    <div id="page"> 
     <div id="recent_articles"> 
<div class="article_puff"> 
<img src="/resources/images/fancyimage.jpg" alt="" /> 
    <h2><a href="/articles/2012/11/14/gettin-down-with-rwd.html">Gettin' down with responsive web design</a></h2> 
    <p>Everyone's talking about it. Your client wants it. You need to code it.</p> 
    <a href="/articles/2012/11/14/gettin-down-with-rwd.html" class="read_more">Read more</a> 
</div> 
</div> 
    </div> 
</body> 

wie Scheint nur die erste Zeile korrekt eingerückt ist. Der Rest beginnt am Anfang der Linie ... Also, mehrzeiliger Liquid-Templating-Import? :)

+0

Hat jemand jemals eine Lösung gefunden, die direkt das korrekt eingerückte Markup erzeugt? – mb21

Antwort

13

Flüssigkeitsfilter

Verwendung Mit einem Flüssigkeitsfilter habe ich es geschafft. Es gibt ein paar Vorbehalte:

  • Ihre Eingabe muss sauber sein. Ich hatte ein paar lockige Anführungszeichen und nicht druckbare Zeichen, die in einigen Dateien wie Leerzeichen aussahen (Copypasta von Word oder ähnlichem) und "Ungültige Bytefolge in UTF-8" als Jekyll-Fehler sah.

  • Es könnte einige Dinge brechen. Ich verwendete <i class="icon-file"></i> Symbole von Twitter Bootstrap. Es ersetzt das leere Tag mit <i class="icon-file"/> und Bootstrap hat das nicht gefallen. Zusätzlich verschraubt es die octopress {% codeblock %} s in meinem Inhalt. Ich habe nicht wirklich nach dem Grund gesucht.

  • Während dies die Ausgabe einer Flüssigkeit variabel reinigen wird wie {{ content }} es nicht wirklich das Problem in der ursprünglichen Nachricht lösen, die der umgebenden HTML die HTML in Zusammenhang einrücken ist. Dies liefert gut formatiertes HTML, aber als ein Fragment, das nicht relativ zu Tags über dem Fragment eingerückt wird.Wenn Sie alles im Kontext formatieren möchten, verwenden Sie die Rake-Aufgabe anstelle des Filters.

-

require 'rubygems' 
require 'json' 
require 'nokogiri' 
require 'nokogiri-pretty' 

module Jekyll 
    module PrettyPrintFilter 
    def pretty_print(input) 
     #seeing some ASCII-8 come in 
     input = input.encode("UTF-8") 

     #Parsing with nokogiri first cleans up some things the XSLT can't handle 
     content = Nokogiri::HTML::DocumentFragment.parse input 
     parsed_content = content.to_html 

     #Unfortunately nokogiri-pretty can't use DocumentFragments... 
     html = Nokogiri::HTML parsed_content 
     pretty = html.human 

     #...so now we need to remove the stuff it added to make valid HTML 
     output = PrettyPrintFilter.strip_extra_html(pretty) 
     output 
    end 

    def PrettyPrintFilter.strip_extra_html(html) 
     #type declaration 
     html = html.sub('<?xml version="1.0" encoding="ISO-8859-1"?>','') 

     #second <html> tag 
     first = true 
     html = html.gsub('<html>') do |match| 
     if first == true 
      first = false 
      next 
     else 
      '' 
     end 
     end 

     #first </html> tag 
     html = html.sub('</html>','') 

     #second <head> tag 
     first = true 
     html = html.gsub('<head>') do |match| 
     if first == true 
      first = false 
      next 
     else 
      '' 
     end 
     end 

     #first </head> tag 
     html = html.sub('</head>','') 

     #second <body> tag 
     first = true 
     html = html.gsub('<body>') do |match| 
     if first == true 
      first = false 
      next 
     else 
      '' 
     end 
     end 

     #first </body> tag 
     html = html.sub('</body>','') 

     html 
    end 
    end 
end 

Liquid::Template.register_filter(Jekyll::PrettyPrintFilter) 

Mit einer Rake Aufgabe

ich eine Aufgabe in meinem Rakefile verwenden, um ziemlich die Ausgabe zu drucken, nachdem die jekyll Website generiert wurde.

require 'nokogiri' 
require 'nokogiri-pretty' 

desc "Pretty print HTML output from Jekyll" 
task :pretty_print do 
    #change public to _site or wherever your output goes 
    html_files = File.join("**", "public", "**", "*.html") 

    Dir.glob html_files do |html_file| 
    puts "Cleaning #{html_file}" 

    file = File.open(html_file) 
    contents = file.read 

    begin 
     #we're gonna parse it as XML so we can apply an XSLT 
     html = Nokogiri::XML(contents) 

     #the human() method is from nokogiri-pretty. Just an XSL transform on the XML. 
     pretty_html = html.human 
    rescue Exception => msg 
     puts "Failed to pretty print #{html_file}: #{msg}" 
    end 

    #Yep, we're overwriting the file. Potentially destructive. 
    file = File.new(html_file,"w") 
    file.write(pretty_html) 

    file.close 
    end 
end 
+0

gibt es eine Möglichkeit, nur den Inhalt des 'body'-Elements einzurücken, aber zusätzliche Zeilenumbrüche für die Lesbarkeit? – fcalderan

+0

Sie können die XSL-Transformation wie hier beschrieben explizit ausführen: http://stackoverflow.com/questions/1898829/how-doi-i-pretty-print-html-with-nokogiri und dann passen Sie das XSLT wie Sie benötigen an. – bwest

0

Wir können dies erreichen, indem Sie einen benutzerdefinierten Flüssigkeitsfilter schreiben, um den HTML-Code zu bereinigen, und dann {{content | tidy }} machen, um den HTML-Code einzuschließen.

Eine schnelle Suche suggests, dass der Rubin ordentlich Juwel kann nicht beibehalten werden, aber dass Nokogiri ist der Weg zu gehen. Dies bedeutet natürlich die Installation des Nokogiri-Edelsteins.

Siehe advice on writing liquid filters und Jekyll example filters.

Ein Beispiel könnte wie folgt aussehen: in _plugins, fügen Sie ein Skript namens ordentlich-html.rb enthält:

require 'nokogiri' 
module TextFilter 
    def tidy(input) 
    desired = Nokogiri::HTML::DocumentFragment.parse(input).to_html 
    end 
end 
Liquid::Template.register_filter(TextFilter) 

(ungetestet)

+0

Gerade versucht dieser Ansatz, aber der Text ist immer noch nicht eingerückt – fcalderan