10

ある種のスマートな切り捨てを有効にするプラグインがあるのだろうか。単語または文の精度でテキストを切り詰める必要があります。

例えば:

Post.my_message.smart_truncate(
    "Once upon a time in a world far far away. And they found that many people
     were sleeping better.", :sentences => 1)
# => Once upon a time in a world far far away.

また

Post.my_message.smart_truncate(
    "Once upon a time in a world far far away. And they found that many people
     were sleeping better.", :words => 12)
# => Once upon a time in a world far far away. And they ...
4

5 に答える 5

20

そのようなプラグインは見たことがありませんが、lib またはヘルパー関数の基礎として機能する同様の質問がありました。

関数を表示する方法は、それを String の拡張として配置しているようです。ビューの外でこれを本当に実行できるようにしたい場合を除き、application_helper.rb. もしかして、こういうこと?

module ApplicationHelper

  def smart_truncate(s, opts = {})
    opts = {:words => 12}.merge(opts)
    if opts[:sentences]
      return s.split(/\.(\s|$)+/)[0, opts[:sentences]].map{|s| s.strip}.join('. ') + '.'
    end
    a = s.split(/\s/) # or /[ ]+/ to only split on spaces
    n = opts[:words]
    a[0...n].join(' ') + (a.size > n ? '...' : '')
  end
end

smart_truncate("a b c. d e f. g h i.", :sentences => 2) #=> "a b c. d e f."
smart_truncate("apple blueberry cherry plum", :words => 3) #=> "apple blueberry cherry..."
于 2009-08-18T13:20:15.533 に答える
8

これは、指定された char_limit の長さに基づいてワード境界で切り捨てられます。そのため、奇妙な場所で文が切り捨てられることはありません

def smart_truncate(text, char_limit)
    size = 0
    text.split().reject do |token|
      size += token.size() + 1
      size > char_limit
    end.join(' ') + ( text.size() > char_limit ? ' ' + '...' : '' )
end
于 2010-10-08T08:51:53.163 に答える
1

gem truncate_htmlがこの仕事をします。また、HTML の一部をスキップすることもできます (これは非常に便利です)。また、単語境界の正規表現をカスタマイズする可能性を提供します。さらに、すべてのパラメータのデフォルトは、たとえば で設定できますconfig/environment.rb

例:

some_html = '<ul><li><a href="http://whatever">This is a link</a></li></ul>'

truncate_html(some_html, :length => 15, :omission => '...(continued)')
=> <ul><li><a href="http://whatever">This...(continued)</a></li></ul>
于 2013-08-06T07:56:47.150 に答える
0

素敵なヘルパー。私は別の経験をしたので、最後の単語で停止して文字数制限で動作するように変更しました。これは、ほとんどのアプリではるかに現実的なシナリオだと思います。

更新:上記のコードを取得して、少し更新しました。古いルビーにははるかに優れたアプローチのようで、utf8で動作します。

def smart_truncate(text, char_limit)
  text = text.squish
  size = 0
  text.mb_chars.split().reject do |token|
    size+=token.size()
    size>char_limit
  end.join(" ")
end
于 2012-09-19T09:31:48.193 に答える
0

かなり長い間、さまざまなプロジェクトでいくつかの更新に取り組んでおり、実際のシナリオではるかに使いやすいと思われるコードの改良を思いつきました。

def smart_truncate_characters(text, char_limit)
  text = text.to_s
  text = text.squish
  size = 0
  new_text = text.mb_chars.split().reject do |token|
    size+=token.size()
    size>char_limit
  end.join(" ")
  if size > char_limit
    return new_text += '…'
  else
    return new_text
  end
end

def smart_truncate_sentences(text, sentence_limit)
  text = text.to_s
  text = text.squish
  size = 0
  arr = text.mb_chars.split(/(?:\.|\?|\!)(?= [^a-z]|$)/)
  arr = arr[0...sentence_limit]
  new_text = arr.join(".")
  new_text += '.'
end

def smart_truncate(text, sentence_limit, char_limit)
  text =  smart_truncate_sentences(text, sentence_limit)
  text =  smart_truncate_characters(text, char_limit)
end
于 2013-05-22T07:56:35.743 に答える