Pregunta

Estoy usando rake para crear una tabla de contenido a partir de un montón de archivos HTML estáticos.

La pregunta es ¿cómo lo inserto en todos los archivos desde el rastrillo?

Tengo un <ul id="toc"> en cada archivo para apuntar. Todo el contenido que quiero reemplazar.

Estaba pensando en usar Nokogiri o similar para analizar el documento y reemplazar el nodo DOM ul#toc. Sin embargo, no me gusta la idea de que tengo que escribir el DOM del analizador en el archivo HTML. ¿Qué pasa si cambia mis diseños / sangrías, etc.?

¿Alguna idea / idea? ¿O tal vez enlaces a ejemplos de trabajo?

¿Fue útil?

Solución 2

Terminé con una idea similar a la que sugirió Mike Woodhouse. Solo que no utilizo plantillas erb (ya que quería que los archivos fuente fueran editables libremente también por no amantes 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

Otros consejos

¿Podría volver a trabajar los archivos a .rhtml, donde

<ul id="toc">

se reemplaza con una directiva erb, como

<%= get_toc() %>

donde get_toc() se define en algún módulo de biblioteca. Escriba los archivos transformados como .html (en otro directorio si lo desea) y está en el negocio y el proceso es repetible.

O, llegado a eso, ¿por qué no usar gsub? Algo así como:

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

Puede manipular el documento directamente y guardar el resultado resultante. Si limita sus manipulaciones a un elemento en particular, no alterará la estructura general y debería estar bien.

Una biblioteca como Nokogiri o Hpricot solo ajustará su documento si está mal formado. Sé que se puede entrenar a Hpricot para que tenga un método de análisis más relajado, o puede operar de una manera más estricta XML / XHTML.

Ejemplo 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

Esto producirá:

<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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top