10

コンテンツがマークダウンで書かれているRailsサイトがあります。「続きを読む..」リンクを使用して、それぞれのスニペットを表示したいと思います。

どうすればいいですか?たとえば、生のテキストの単純な切り捨ては機能しません..

>> "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 マーカーのように考えることができます (完全なドキュメントを表示するときは無視できます)。

Markdown 処理にmarukuを使用しています (RedCloth は Textile に非常に偏っており、BlueCloth は非常にバグが多く、peg-markdown と RDiscount を除外するネイティブ Ruby パーサーが必要でした)。

あるいは (とにかく Markdown は HTML に変換されるため)、HTML を正しく切り捨てることもオプションです。ただしmarkdown()、最初の数行を取得するためだけに、ドキュメント全体ではなく、それが望ましいでしょう。

だから、私が考えることができるオプションは(好みの順序で)..

  • maruku パーサーに "truncate" オプションを追加します。これは、最初の x 個の単語のみを解析するか、"excerpt" マーカーまで解析します。
  • パーサーに依存しない Markdown truncate'r を書く/見つける
  • インテリジェントな HTML 切り捨て関数を書く/見つける
4

7 に答える 7

6
  • インテリジェントな 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
于 2008-12-28T04:21:46.497 に答える
2

テキスタイルで私にとってうまくいく解決策は次のとおりです。

  1. HTMLに変換する
  2. 切り捨てます。
  3. で半分にカットされた HTML タグを削除します

    html_string.gsub(/<[^>]*$/, "")
    
  4. 次に、Hpricot を使用してクリーンアップし、閉じられていないタグを閉じます

    html_string = Hpricot( html_string ).to_s 
    

私はヘルパーでこれを行いますが、キャッシュを使用してもパフォーマンスの問題はありません。

于 2008-12-28T04:37:00.520 に答える
1

テキストを切り捨てようとするのではなく、2つの入力ボックスを用意してください。1つは「宣伝文句」用で、もう1つはメインの「宣伝文句」用です。そうすれば、作成者は、ある種のファンキーなEOFマーカーに依存することなく、何が表示されているかを正確に知ることができます。

于 2008-12-28T04:45:04.170 に答える
1

正規表現を使用して、「^」文字だけで構成される行を見つけることができます。

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
于 2008-12-28T04:10:20.887 に答える
0

このケースに当てはまるかどうかはわかりませんが、完全を期すために以下のソリューションを追加してください。Markdown でレンダリングされたコンテンツを切り捨てる場合は、strip_tags メソッドを使用できます。

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

出典: http://devblog.boonecommunitynetwork.com/rails-and-markdown/

于 2015-09-07T10:26:04.917 に答える
0

機能するより単純なオプション:

truncate(markdown(item.description), length: 100, escape: false)
于 2016-01-22T00:50:00.070 に答える
0

「2 つの入力」アプローチに同意する必要があります。完全なコンテンツを表示するときにバックグラウンド ロジックを変更して 2 つの入力を 1 つにまとめることができるため、コンテンツ ライターは心配する必要はありません。

full_content = input1 + input2 // perhaps with some complementary html, for a better formatting
于 2010-08-15T20:39:13.477 に答える