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 に答える