¿Cómo usar rake para insertar / reemplazar la sección html en cada archivo?
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?
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>