如何使用rake在每个文件中插入/替换html部分?
题
我正在使用rake从一堆静态HTML文件中创建目录。
问题是如何将它插入rake中的所有文件?
我在每个文件中都有一个<ul id="toc">
来瞄准。我要替换的全部内容。
我正在考虑使用Nokogiri或类似方法来解析文档并替换DOM节点ul#toc
。但是,我不喜欢我必须将解析器的DOM写入HTML文件的想法。如果它改变我的布局/缩进等怎么办???
有什么想法/想法吗?或者也许链接到工作示例?
解决方案 2
我最终提出了类似于Mike Woodhouse建议的想法。只是没有使用erb模板(因为我希望源文件也可以由非红宝石爱好者自由编辑)
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
其他提示
你可以将文件重做为.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
您可以直接操作文档并保存结果输出。如果将操作限制在特定元素上,则不会改变整体结构,应该没问题。
像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>
不隶属于 StackOverflow