9

ニュース記事を一覧表示するページがあります。ページの長さを短くするために、ティーザー (記事の最初の 200 語 / 600 文字) のみを表示し、「詳細...」リンクを表示します。このリンクをクリックすると、残りの部分が展開されます。 jQuery/Javascript の方法で記事を作成します。これで、ニュース記事 (文字列) が単語の途中で切り捨てられていないことを確認する、貼り付けページで次のヘルパー メソッドを見つけました。

 def shorten (string, count = 30)
    if string.length >= count
      shortened = string[0, count]
      splitted = shortened.split(/\s/)
      words = splitted.length
      splitted[0, words-1].join(" ") + ' ...'
    else
      string
    end
  end

私が抱えている問題は、DB から取得したニュース記事の本文がフォーマットされた HTML であることです。したがって、運が悪いと、上記のヘルパーは記事の文字列を html タグの途中で切り刻み、そこに "more..." 文字列を挿入します (たとえば、"" の間)。これにより、ページ上の html が破損します。 .

これを回避する方法はありますか、または HTML 文字列から抜粋/ティーザーを生成するために使用できるプラグインはありますか?

4

7 に答える 7

2

ご回答ありがとうございます。ただし、その間、jQuery HTML Truncator プラグインに出くわしました。これは、私の目的に完全に適合し、切り捨てをクライアント側にシフトします。これ以上簡単にはなりません:-)

于 2009-02-11T14:43:54.467 に答える
1

HTML要素の途中で分割したくない場合は、より複雑なパーサーを作成する必要があります。<> ブロックの真ん中にあるか、2 つのタグの間にあるかを覚えておく必要があります。

それをしたとしても、まだ問題が発生します。終了タグがないためにパーサーが記事をどこにも分割できなかったため、記事全体を html 要素に入れる場合。

可能であれば、記事にタグを付けないようにするか、何も含まないタグに保持するようにします(いいえ<div>など)。そうすれば、非常に単純なタグの途中にいるかどうかを確認するだけで済みます。

  def shorten (string, count = 30)
     if string.length >= count
       shortened = string[0, count]
       splitted = shortened.split(/\s/)
       words = splitted.length
       if(splitted[words-1].include? "<")
         splitted[0,words-2].join(" ") + ' ...'
       else
         splitted[0, words-1].join(" ") + ' ...'
     else
       string
     end   
  end
于 2009-02-11T13:50:08.463 に答える
1

HTML をサニタイズして、最初の文を抽出したはずです。HTML を含む「body」属性を持つ記事モデルがあると仮定します。

# lib/core_ext/string.rb
class String
  def first_sentence
    self[/(\A[^.|!|?]+)/, 1]
  end
end

# app/models/article.rb
def teaser
  HTML::FullSanitizer.new.sanitize(body).first_sentence
end

これは、「<b>これ</b>は<em>重要</em>の記事です!記事の残りはここにあります」と変換します。「これは重要な記事です」に。

于 2009-02-12T10:56:36.357 に答える
0

次のソリューションを使用してこれを解決しました

gem 'sanitize' をインストール

gem install sanitize

次のコードを使用します。ここで、本文は html タグを含むテキストです。

<%= content_tag :div, Sanitize.clean(truncate(body, length: 200, separator: ' ', omission: "... #{ link_to '(continue)', '#' }"), Sanitize::Config::BASIC).html_safe %>

有効な html の抜粋を提供します。それが誰かに役立つことを願っています。

于 2013-09-28T07:56:17.993 に答える
0

これを処理するHTMLTruncatorという名前の gem があります。投稿の抜粋などを表示するために使用しましたが、非常に堅牢です。

于 2014-03-28T22:08:23.187 に答える