module ActionView::Helpers::TextHelper
def excerpt(text, phrase, options = {})
excerpt('This is a very beautiful morning', 'very', separator: ' ', radius: 1)
# => "
excerpt('This is also an example', 'an', radius: 8, omission: '
# => "...next..."
excerpt('This next thing is an example', 'ex', radius: 2)
# => "This is an example"
excerpt('This is an example', 'is')
# => "This is a..."
excerpt('This is an example', 'is', radius: 5)
# => "...s is an exam..."
excerpt('This is an example', 'an', radius: 5)
==== Examples
"", which treats each character as a token.
The separator between tokens to count for +:radius+. Defaults to
[+:separator+]
"...".
does not coincide with the start / end of +text+. Defaults to
The marker to prepend / append when the start / end of the excerpt
[+:omission+]
+phrase+ to include in the result. Defaults to 100.
The number of characters (or tokens — see +:separator+ option) around
[+:radius+]
==== Options
is always stripped in any case. Returns +nil+ if +phrase+ isn't found.
the result does not coincide with the start / end of +text+. The result
+text+. An omission marker is prepended / appended if the start / end of
Extracts the first occurrence of +phrase+ plus surrounding text from
def excerpt(text, phrase, options = {}) return unless text && phrase separator = options.fetch(:separator, nil) || "" case phrase when Regexp regex = phrase else regex = /#{Regexp.escape(phrase)}/i end return unless matches = text.match(regex) phrase = matches[0] unless separator.empty? text.split(separator).each do |value| if value.match?(regex) phrase = value break end end end first_part, second_part = text.split(phrase, 2) prefix, first_part = cut_excerpt_part(:first, first_part, separator, options) postfix, second_part = cut_excerpt_part(:second, second_part, separator, options) affix = [first_part, separator, phrase, separator, second_part].join.strip [prefix, affix, postfix].join end