كيفية استخدام أشعل النار لادخال / قسم أتش تي أم أل استبدال في كل ملف؟
سؤال
وأنا باستخدام أشعل النار لإنشاء جدول محتويات من مجموعة من ملفات HTML ثابتة.
والسؤال هو كيف أدخله في كل الملفات من داخل أشعل النار؟
ولدي <ul id="toc">
في كل ملف لهدف ل. جميع محتويات أنني أريد أن تحل محلها.
وكنت أفكر في استخدام Nokogiri أو ما شابه ذلك لتحليل الوثيقة واستبدال ul#toc
عقدة DOM. ومع ذلك، أنا لا أحب فكرة أن يكون لي أن أكتب DOM محلل إلى ملف HTML. ماذا لو يتغير بلدي تخطيطات / تزكي الخ. ؟؟
وأية أفكار / أفكار؟ أو ربما يرتبط أمثلة العمل؟
المحلول 2
وانتهى بي الأمر مع فكرة على غرار ما اقترح مايك ودهاوس. فقط لا تستخدم القوالب إرب (كما أردت الملفات المصدر لتكون قابلة للتعديل بحرية أيضا من غير محبي روبي)
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">
ويتم استبدال توجيه إرب، مثل
<%= get_toc() %>
وحيث يتم تعريف get_toc()
في بعض وحدة المكتبة. إرسال الملفات حولت كما هتمل (إلى دليل آخر إذا أردت) وكنت في مجال الأعمال التجارية والعملية للتكرار.
وأو تأتي إلى ذلك، لماذا لا تستخدم فقط 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>