Question

J'utilise rake pour créer une table des matières à partir de nombreux fichiers HTML statiques.

La question est de savoir comment puis-je l'insérer dans tous les fichiers de rake?

J'ai un <ul id="toc"> dans chaque fichier à viser. Tout le contenu de celui que je veux remplacer.

Je pensais utiliser Nokogiri ou un logiciel similaire pour analyser le document et remplacer le noeud DOM ul#toc. Cependant, je n'aime pas l'idée de devoir écrire le DOM du parseur dans le fichier HTML. Que faire si cela modifie mes mises en page / retraits, etc.?

Des pensées / idées? Ou peut-être des liens vers des exemples concrets?

Était-ce utile?

La solution 2

Je me suis retrouvé avec une idée similaire à celle suggérée par Mike Woodhouse. Seulement en n'utilisant pas les modèles erb (car je voulais que les fichiers sources puissent être édités librement, même par des non-amoureux de ruby)

  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

Autres conseils

Pourriez-vous retravailler les fichiers au format .rhtml, où

<ul id="toc">

est remplacé par une directive erb, telle que

<%= get_toc() %>

get_toc() est défini dans un module de bibliothèque. Ecrivez les fichiers transformés au format .html (dans un autre répertoire si vous le souhaitez) et vous êtes en affaires et le processus est répétable.

Ou bien, pourquoi ne pas simplement utiliser gsub? Quelque chose comme:

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

Vous pouvez manipuler directement le document et enregistrer le résultat obtenu. Si vous limitez vos manipulations à un élément particulier, vous ne modifierez pas la structure globale et cela devrait aller.

Une bibliothèque telle que Nokogiri ou Hpricot ajustera votre document uniquement s’il est mal formé. Je sais que Hpricot peut avoir pour méthode d’utiliser une méthode d’analyse plus détendue ou de fonctionner de manière plus stricte en XML / XHTML.

Exemple simple:

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

Cela donnera:

<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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top