我正试图使用Nokogiri生成一个部分HTML文档,例如:
html_content = Nokogiri::HTML::Builder.new() do |doc|
# producing document here, redacted for brevity
end.to_html
这很好,除了一个小问题:数据稍后将被调度到远程Drupal服务器,并作为页面的一部分呈现,因此不应包含初始<!DOCTYPE html ...>
声明。
我该如何说服Nokogiri不要生产DOCTYPE
标签?或者Nokogiri的HTML构建器是错误的做法吗?
提前谢谢。
要实现这一点,可以使用文档片段和Builder.with
方法,如下所示:
require 'nokogiri'
include Nokogiri
fragment = HTML.fragment('')
HTML::Builder.with(fragment) do |f|
f.div('foo')
end
fragment.to_html
# => <div>foo</div>
Nokogiri使创建可以动态填充的模板变得容易;我会这样做:
require 'nokogiri'
DESTINATION_HOST = 'http://www.example.com/some/API/call'
HTML_TEMPLATE = <<EOT
<form method="post">
<input name="user" type="text">
<input name="desc" type="text">
</form>
<div id="quote">
</div>
EOT
doc = Nokogiri::HTML::DocumentFragment.parse(HTML_TEMPLATE)
doc.at('form')['action'] = DESTINATION_HOST
doc.at('div').content = "Danger is my middle name."
[
['user', 'Austin Powers'],
['desc', 'Man of Mystery'],
].each do |name, value|
doc.at("input[name="#{name}"]")['value'] = value
end
puts doc.to_html
# >> <form method="post" action="http://www.example.com/some/API/call">
# >> <input name="user" type="text" value="Austin Powers"><input name="desc" type="text" value="Man of Mystery">
# >> </form>
# >> <div id="quote">Danger is my middle name.</div>
填充的数组和其他字段可以很容易地从CSV或YAML文件、从另一台主机动态检索的JSON或直接从数据库调用加载。
你事先就知道你的文档应该是什么样子的,所以利用这些知识来创建一个模板。Nokogiri的Builder更适合那些你甚至不确定需要什么标签并且需要动态构建整个文档结构的时候。
最困难的部分是定义如何在文档中的各种标签上循环,以向它们填充内容或填充参数,但一旦完成了这一点,就很容易创建样板,然后填充并转发到其他内容。