我正在使用 rake 从一堆静态 HTML 文件中创建一个目录。
问题是如何将它从 rake 中插入到所有文件中?
我<ul id="toc">
在每个文件中都有一个目标。我要替换的全部内容。
我正在考虑使用 Nokogiri 或类似方法来解析文档并替换 DOM 节点ul#toc
。但是,我不喜欢必须将解析器的 DOM 写入 HTML 文件的想法。如果它改变了我的布局/缩进等怎么办?
有什么想法/想法吗?或者也许链接到工作示例?
你能把文件改成.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
我最终得出了一个类似于 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
您可以直接操作文档并保存结果输出。如果您将操作限制在特定元素,您将不会改变整体结构并且应该没问题。
像 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>