2 Stimmen

Wie füge ich mit Rake HTML-Abschnitte in jede Datei ein bzw. ersetze sie?

Ich verwende Rake, um ein Inhaltsverzeichnis aus einer Reihe von statischen HTML-Dateien zu erstellen.

Die Frage ist, wie füge ich es in alle Dateien von Rake aus ein?

Ich habe eine <ul id="toc"> in jeder Datei anzustreben. Der gesamte Inhalt der Datei, die ich ersetzen möchte.

Ich dachte über die Verwendung von Nokogiri oder ähnlich, um das Dokument zu analysieren und ersetzen Sie die DOM-Knoten ul#toc . Allerdings gefällt mir der Gedanke nicht, dass ich das DOM des Parsers in die HTML-Datei schreiben muss. Was, wenn er meine Layouts/Einrückungen usw. ändert?

Irgendwelche Gedanken/Ideen? Oder vielleicht Links zu funktionierenden Beispielen?

3voto

Mike Woodhouse Punkte 50241

Könnten Sie die Dateien in .rhtml umwandeln, wobei

<ul id="toc">

wird durch eine erb-Anweisung ersetzt, z. B.

<%= get_toc() %>

donde get_toc() ist in einem Bibliotheksmodul definiert. Schreiben Sie die umgewandelten Dateien als .html (in ein anderes Verzeichnis, wenn Sie möchten) und Sie sind im Geschäft und der Prozess ist wiederholbar.

Oder, warum nicht einfach gsub ? Etwa so:

File.open(out_filename,'w+') do |output_file|
    output_file.puts File.read(filename).gsub(/\<ul id="toc"\>/, get_toc())
end

2voto

Jesper Rønn-Jensen Punkte 98301

Ich bin auf eine ähnliche Idee gekommen wie Mike Woodhouse. Nur ohne die Verwendung von erb-Vorlagen (da ich wollte, dass die Quelldateien auch von Nicht-Ruby-Liebhabern frei editierbar sind)

  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

1voto

tadman Punkte 200181

Sie können das Dokument direkt bearbeiten und die resultierende Ausgabe speichern. Wenn Sie Ihre Manipulationen auf ein bestimmtes Element beschränken, verändern Sie die Gesamtstruktur nicht und sollten keine Probleme haben.

Eine Bibliothek wie Nokogiri oder Hpricot wird Ihr Dokument nur dann anpassen, wenn es missgestaltet ist. Ich weiß, dass Hpricot so gecoacht werden kann, dass es eine entspanntere Parsing-Methode hat, oder dass es in einer strengeren XML/XHTML-Manier arbeitet.

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 ergibt:

<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>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X