Pergunta

Eu estou usando ancinho para criar uma tabela de conteúdos a partir de um monte de arquivos HTML estáticos.

A questão é como faço para inseri-lo em todos os arquivos de dentro de rake?

Eu tenho um <ul id="toc"> em cada arquivo para apontar para. Todo o conteúdo que deseja substituir.

Eu estava pensando em usar Nokogiri ou similar para analisar o documento e substituir o ul#toc nó DOM. No entanto, eu não gosto da idéia de que eu tenho que escrever DOM do analisador para o arquivo HTML. E se ele muda meus layouts / travessões etc. ??

Qualquer pensamentos / idéias? Ou talvez links para exemplos de trabalho?

Foi útil?

Solução 2

Eu acabei com uma idéia semelhante ao que Mike Woodhouse sugeriu. Só não usando modelos erb (como eu queria que os arquivos de origem para ser livremente editável também por não rubi-amantes)

  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

Outras dicas

Você poderia refazer os arquivos para .rhtml, onde

<ul id="toc">

é substituído por uma directiva erb, como

<%= get_toc() %>

onde get_toc() é definido em algum módulo de biblioteca. Gravar os arquivos transformados como .html (para outro diretório se quiser) e você está no negócio e o processo é repetido.

Ou, chegar a esse ponto, porque não basta usar gsub? Algo como:

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

Você pode manipular o documento diretamente e salvar a saída resultante. Se você limitar suas manipulações a um elemento particular, você não irá alterar a estrutura geral e deve ser fino.

A biblioteca como Nokogiri ou Hpricot só vai ajustar seu documento se ele está mal formado. Eu sei que Hpricot podem ser treinados para ter um método de análise mais relaxado, ou pode operar de uma forma mais rigorosa XML forma / XHTML.

Um exemplo simples:

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

O resultado será:

<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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top