Domanda

Sto usando il rake per creare un sommario da un mucchio di file HTML statici.

La domanda è: come inserirla in tutti i file all'interno di rake?

Ho un <ul id="toc"> in ogni file a cui puntare. L'intero contenuto che voglio sostituire.

Stavo pensando di usare Nokogiri o simili per analizzare il documento e sostituire il nodo DOM ul#toc. Tuttavia, non mi piace l'idea di dover scrivere il DOM del parser nel file HTML. Cosa succede se cambia i miei layout / rientri ecc. ??

Qualche pensiero / idea? O forse collegamenti ad esempi funzionanti?

È stato utile?

Soluzione 2

Ho avuto un'idea simile a quella suggerita da Mike Woodhouse. Solo non usando i modelli erb (dato che volevo che i file sorgente fossero liberamente modificabili anche dagli amanti dei 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

Altri suggerimenti

Potresti rielaborare i file in .rhtml, dove

<ul id="toc">

è sostituito con una direttiva erb, come

<%= get_toc() %>

dove get_toc() è definito in alcuni moduli di libreria. Scrivi i file trasformati come .html (se vuoi in un'altra directory) e sei in affari e il processo è ripetibile.

Oppure, vieni a quello, perché non usare semplicemente gsub? Qualcosa del tipo:

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

È possibile manipolare direttamente il documento e salvare l'output risultante. Se limiti le tue manipolazioni a un particolare elemento, non altererai la struttura generale e dovresti andare bene.

Una libreria come Nokogiri o Hpricot modificherà il documento solo se non è valido. So che Hpricot può essere istruito per avere un metodo di analisi più rilassato o può operare in un modo XML / XHTML più rigoroso.

Esempio semplice:

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

Questo produrrà:

<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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top