Wie Rake verwenden, um HTML-Abschnitt in jeder Datei einfügen / ersetzen?
Frage
Ich bin mit Harke ein Inhaltsverzeichnis aus einem Bündel von statischen HTML-Dateien zu erstellen.
Die Frage ist, wie ich es von innen Harke in alle Dateien füge?
Ich habe eine <ul id="toc">
in jeder Datei für Ziel. Der gesamte Inhalt, dass ich will ersetzen.
Ich dachte über die Verwendung von Nokogiri oder ähnlichem Dokument zu analysieren und die DOM-Knoten ul#toc
ersetzen. Aber ich weiß nicht, wie die Idee, dass ich an dem Parser DOM auf die HTML-Datei zu schreiben. Was passiert, wenn es ändert sich meine Layouts / Einzüge etc. ??
Alle Gedanken / Ideen? Oder vielleicht Links auf die Arbeitsbeispiele?
Lösung 2
beenden ich mit einer Idee ähnlich wie Mike Woodhouse vorgeschlagen. Nur nicht mit erb-Vorlagen (wie ich die Quelldateien wollte frei auch von nicht rubin Liebhaber editierbar sein)
def update_toc(filename)
raise "FATAL: Requires self.toc= ... before replacing TOC in files!" if @toc.nil?
content = File.read(filename)
content.gsub(/<h2 class="toc">.+?<\/ul>/, @toc)
end
def replace_toc_in_all_files
@file_names.each do |name|
content = update_toc(name)
File.open(name, "w") do |io|
io.write content
end
end
end
Andere Tipps
Könnten Sie überarbeiten Sie die Dateien auf .rhtml, wobei
<ul id="toc">
ist mit einer erb-Richtlinie, wie
ersetzt<%= get_toc() %>
wo get_toc()
wird in einiger Bibliotheksmodul definiert. Schreiben Sie die transformierten Dateien als .html (in ein anderes Verzeichnis, wenn Sie möchten), und Sie sind im Geschäft und der Prozess ist wiederholbar.
Oder dazu kommen, warum nicht nur gsub
benutzen? So etwas wie:
File.open(out_filename,'w+') do |output_file|
output_file.puts File.read(filename).gsub(/\<ul id="toc"\>/, get_toc())
end
Sie können das Dokument direkt bearbeiten und die resultierende Ausgabe speichern. Wenn Sie Ihre Manipulationen auf ein bestimmtes Element beschränken, werden Sie nicht die Gesamtstruktur verändern und sollte in Ordnung sein.
Eine Bibliothek wie Nokogiri oder Hpricot wird nur das Dokument anpassen, wenn es fehlerhaft ist. Ich weiß, dass Hpricot trainiert werden kann, eine entspanntere Analyseverfahren zu haben, oder kann in einer strengeren XML / XHTML Art und Weise arbeiten.
Einfaches Beispiel:
require 'rubygems'
require 'hpricot'
document = <<END
<html>
<body>
<ul id="tag">
</ul>
<h1 class="indexed">Item 1</h1>
<h2 class="indexed">Item 1.1</h2>
<h1 class="indexed">Item 2</h1>
<h2 class="indexed">Item 2.1</h2>
<h2 class="indexed">Item 2.2</h2>
<h1>Remarks</h1>
<!-- Test Comment -->
</body>
</html>
END
parsed = Hpricot(document)
ul_tag = (parsed / 'ul#tag').first
sections = (parsed / '.indexed')
ul_tag.inner_html = sections.collect { |i| "<li>#{i.inner_html}</li>" }.to_s
puts parsed.to_html
Dies wird ergeben:
<html>
<body>
<ul id="tag"><li>Item 1</li><li>Item 1.1</li><li>Item 2</li><li>Item 2.1</li><li>Item 2.2</li></ul>
<h1 class="indexed">Item 1</h1>
<h2 class="indexed">Item 1.1</h2>
<h1 class="indexed">Item 2</h1>
<h2 class="indexed">Item 2.1</h2>
<h2 class="indexed">Item 2.2</h2>
<h1>Remarks</h1>
<!-- Test Comment -->
</body>
</html>