اقتطاع الانقسام؟
-
29-08-2019 - |
سؤال
لدي موقع قضبان، حيث يتم كتابة المحتوى في علامة. أرغب في عرض مقتطف لكل منهما، مع رابط "قراءة المزيد ..".
كيف أذهب حول هذا؟ بسيطة اقتطاع النص الخام لن يعمل، على سبيل المثال ..
>> "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
نصائح أخرى
إليك حل يعمل بالنسبة لي مع النسيج.
- تحويله إلى HTML
- اقتطاعها.
قم بإزالة أي علامات HTML التي حصلت على نصفها
html_string.gsub(/<[^>]*$/, "")
ثم، يستخدم 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)