سؤال

لدي موقع قضبان، حيث يتم كتابة المحتوى في علامة. أرغب في عرض مقتطف لكل منهما، مع رابط "قراءة المزيد ..".

كيف أذهب حول هذا؟ بسيطة اقتطاع النص الخام لن يعمل، على سبيل المثال ..

>> "This is an [example](http://example.com)"[0..25]
=> "This is an [example](http:"

من الناحية المثالية، أرغب في السماح للمؤلف (اختياريا) بإدراج علامة لتحديد ما يجب استخدامه ك "مقتطف"، إن لم يكن الأمر كذلك، وسوف يستغرق 250 كلمة، وإلحاق "..." - على سبيل المثال ..

This article is an example of something or other.

This segment will be used as the snippet on the index page.

^^^^^^^^^^^^^^^

This text will be visible once clicking the "Read more.." link

يمكن التفكير في علامة مثل علامة EOF (التي يمكن تجاهلها عند عرض المستند الكامل)

انا استخدم ماروكو بالنسبة لمعالجة الشفاء (RedCloth متحيز للغاية تجاه النسيج، فإن BlueCloth هو عربات التي تجرها الدواب للغاية، وأردت محلل محلل أصلي من الروبي الذي استبعد بيوت وارتدونا و RDiscount)

بدلا من ذلك (نظرا لأن علامة التجسيتم ترجمتها إلى HTML على أي حال) اقتطاع HTML بشكل صحيح سيكون خيارا - على الرغم من أنه سيكون من الأفضل ألا markdown() المستند بأكمله، فقط للحصول على الأسطر القليلة الأولى.

لذلك، الخيارات التي يمكنني التفكير فيها (حسب الأفضلية) ..

  • أضف خيار "اقتطاع" إلى محلل Maruku، والتي ستتحليل كلمات x الأولى فقط، أو حتى علامة "مقتطفات".
  • اكتب / ابحث عن علامة حظيرة-اللاشدة
  • اكتب / ابحث عن وظيفة ذكية HTML
هل كانت مفيدة؟

المحلول

  • اكتب / ابحث عن وظيفة ذكية HTML

ما يلي من http://mikeburnscoder.wordpress.com/2006/11/11/truncating-html-in-ruby/, ، مع اقتطاع بعض التعديلات بشكل صحيح HTML، والسماح بسهولة بإلغاء سلسلة قبل علامات الختام.

>> puts "<p><b><a href=\"hi\">Something</a></p>".truncate_html(5, at_end = "...")
=> <p><b><a href="hi">Someth...</a></b></p>

الرمز المعدل:

require 'rexml/parsers/pullparser'

class String
  def truncate_html(len = 30, at_end = nil)
    p = REXML::Parsers::PullParser.new(self)
    tags = []
    new_len = len
    results = ''
    while p.has_next? && new_len > 0
      p_e = p.pull
      case p_e.event_type
      when :start_element
        tags.push p_e[0]
        results << "<#{tags.last}#{attrs_to_s(p_e[1])}>"
      when :end_element
        results << "</#{tags.pop}>"
      when :text
        results << p_e[0][0..new_len]
        new_len -= p_e[0].length
      else
        results << "<!-- #{p_e.inspect} -->"
      end
    end
    if at_end
      results << "..."
    end
    tags.reverse.each do |tag|
      results << "</#{tag}>"
    end
    results
  end

  private

  def attrs_to_s(attrs)
    if attrs.empty?
      ''
    else
      ' ' + attrs.to_a.map { |attr| %{#{attr[0]}="#{attr[1]}"} }.join(' ')
    end
  end
end

نصائح أخرى

إليك حل يعمل بالنسبة لي مع النسيج.

  1. تحويله إلى HTML
  2. اقتطاعها.
  3. قم بإزالة أي علامات HTML التي حصلت على نصفها

    html_string.gsub(/<[^>]*$/, "")
    
  4. ثم، يستخدم HPRICOT لتنظيفه وأغلق العلامات غير المزعجة

    html_string = Hpricot( html_string ).to_s 
    

أفعل هذا في المساعد، ومع التخزين المؤقت لا توجد مشكلة في الأداء.

يمكنك استخدام تعبير منتظم للعثور على خط يتكون من أي شيء سوى أحرف "^":

markdown_string = <<-eos
This article is an example of something or other.

This segment will be used as the snippet on the index page.

^^^^^^^^^^^^^^^

This text will be visible once clicking the "Read more.." link
eos

preview = markdown_string[0...(markdown_string =~ /^\^+$/)]
puts preview

بدلا من محاولة اقتطاع النص، لماذا لا يكون لديك مربعات الإدخال، واحدة ل "فتحة الفتحة" وواحدة لل "الشجاعة" الرئيسية. وبهذه الطريقة سيعرف مؤلفوك بالضبط ما يجري إظهاره عند الحاجة إلى الاعتماد على نوع من علامة EOF Funkly.

سيتعين علي أن أتفق مع نهج "المدخلات"، وسيحتاج كاتب المحتوى إلى القلق، حيث يمكنك تعديل منطق الخلفية لخلط المدخلات في واحد عند إظهار المحتوى الكامل.

full_content = input1 + input2 // perhaps with some complementary html, for a better formatting

لست متأكدا مما إذا كان ينطبق على هذه الحالة، ولكن إضافة الحل أدناه من أجل الاكتمال. يمكنك استخدام طريقة Strip_tags إذا كنت اقتطاع محتويات تخفيض السعرات المنصوص عليها:

truncate(strip_tags(markdown(article.contents)), length: 50)

مصدر من:http://devblog.boonecommunitynetwork.com/rains-and-markdown/

خيار أبسط يعمل فقط:

truncate(markdown(item.description), length: 100, escape: false)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top