2

我正在使用 rake 从一堆静态 HTML 文件中创建一个目录。

问题是如何将它从 rake 中插入到所有文件中?

<ul id="toc">在每个文件中都有一个目标。我要替换的全部内容。

我正在考虑使用 Nokogiri 或类似方法来解析文档并替换 DOM 节点ul#toc。但是,我不喜欢必须将解析器的 DOM 写入 HTML 文件的想法。如果它改变了我的布局/缩进等怎么办?

有什么想法/想法吗?或者也许链接到工作示例?

4

3 回答 3

3

你能把文件改成.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
于 2009-09-09T23:02:38.040 回答
2

我最终得出了一个类似于 Mike Woodhouse 建议的想法。只是不使用 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
于 2009-09-11T09:53:15.737 回答
1

您可以直接操作文档并保存结果输出。如果您将操作限制在特定元素,您将不会改变整体结构并且应该没问题。

像 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>
于 2009-09-09T20:59:23.860 回答