我正在使用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>
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top