module ActionView::Helpers::TextHelper

def excerpt(text, phrase, options = {})

# => "...a very beautiful..."
excerpt('This is a very beautiful morning', 'very', separator: ' ', radius: 1)

# => " is also an example"
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