كيفية استخدام أشعل النار لادخال / قسم أتش تي أم أل استبدال في كل ملف؟

StackOverflow https://stackoverflow.com/questions/1401477

  •  05-07-2019
  •  | 
  •  

سؤال

وأنا باستخدام أشعل النار لإنشاء جدول محتويات من مجموعة من ملفات 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>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top