Как использовать rake для вставки / замены раздела html в каждом файле? - PullRequest
2 голосов
/ 09 сентября 2009

Я использую rake для создания оглавления из набора статических файлов HTML.

Вопрос в том, как вставить его во все файлы из граблей?

У меня есть <ul id="toc"> в каждом файле, к которому нужно стремиться. Весь контент, который я хочу заменить.

Я думал об использовании Nokogiri или подобного для анализа документа и замены узла DOM ul#toc. Однако мне не нравится идея, что я должен записать DOM парсера в файл HTML. Что, если это изменит мои макеты / отступы и т. Д .??

Есть мысли / идеи? Или, возможно, ссылки на рабочие примеры?

Ответы [ 3 ]

3 голосов
/ 10 сентября 2009

Не могли бы вы переработать файлы в .rhtml, где

<ul id="toc">

заменяется директивой erb, такой как

<%= get_toc() %>

, где get_toc() определено в некотором модуле библиотеки. Запишите преобразованные файлы в формате .html (в другой каталог, если хотите), и вы в деле, и процесс повторяется.

Или подойди к этому, почему бы просто не использовать gsub? Что-то вроде:

File.open(out_filename,'w+') do |output_file|
    output_file.puts File.read(filename).gsub(/\<ul id="toc"\>/, get_toc())
end
2 голосов
/ 11 сентября 2009

У меня появилась идея, похожая на предложенную Майком Вудхаусом. Только без использования шаблонов erb (поскольку я хотел, чтобы исходные файлы были свободно редактируемыми и любителями не 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
1 голос
/ 10 сентября 2009

Вы можете напрямую управлять документом и сохранять полученный результат. Если вы ограничите свои манипуляции определенным элементом, вы не измените общую структуру и все должно быть в порядке.

Библиотека, такая как Nokogiri или Hpricot, будет корректировать ваш документ только в том случае, если он искажен. Я знаю, что Hpricot можно тренировать, чтобы иметь более удобный метод синтаксического анализа, или он может работать в более строгой манере XML / XHTML.

Простой пример:

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

Это даст:

<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>
...