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?

War es hilfreich?

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>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top