Skip to content

Commit

Permalink
highlight() now accepts regular expressions as well.
Browse files Browse the repository at this point in the history
  • Loading branch information
jasiek authored and lucasmazza committed Jun 19, 2014
1 parent 2b61778 commit 490f250
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 5 deletions.
10 changes: 6 additions & 4 deletions actionview/lib/action_view/helpers/text_helper.rb
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -123,7 +123,9 @@ def highlight(text, phrases, options = {})
text text
else else
highlighter = options.fetch(:highlighter, '<mark>\1</mark>') highlighter = options.fetch(:highlighter, '<mark>\1</mark>')
match = Array(phrases).map { |p| Regexp.escape(p) }.join('|') match = Array(phrases).map do |p|
Regexp === p ? p.to_s : Regexp.escape(p)
end.join('|')
text.gsub(/(#{match})(?![^<]*?>)/i, highlighter) text.gsub(/(#{match})(?![^<]*?>)/i, highlighter)
end.html_safe end.html_safe
end end
Expand Down Expand Up @@ -156,11 +158,11 @@ def excerpt(text, phrase, options = {})
return unless text && phrase return unless text && phrase


separator = options.fetch(:separator, nil) || "" separator = options.fetch(:separator, nil) || ""
if Regexp === phrase case phrase
when Regexp
regex = phrase regex = phrase
else else
phrase = Regexp.escape(phrase) regex = /#{Regexp.escape(phrase)}/i
regex = /#{phrase}/i
end end


return unless matches = text.match(regex) return unless matches = text.match(regex)
Expand Down
10 changes: 9 additions & 1 deletion actionview/test/template/text_helper_test.rb
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -222,6 +222,11 @@ def test_highlight_with_regexp
) )
end end


def test_highlight_accepts_regexp
assert_equal("This day was challenging for judge <mark>Allen</mark> and his colleagues.",
highlight("This day was challenging for judge Allen and his colleagues.", /\ballen\b/i))
end

def test_highlight_with_multiple_phrases_in_one_pass def test_highlight_with_multiple_phrases_in_one_pass
assert_equal %(<em>wow</em> <em>em</em>), highlight('wow em', %w(wow em), :highlighter => '<em>\1</em>') assert_equal %(<em>wow</em> <em>em</em>), highlight('wow em', %w(wow em), :highlighter => '<em>\1</em>')
end end
Expand Down Expand Up @@ -264,9 +269,12 @@ def test_excerpt
assert_equal("...is a beautiful morn...", excerpt("This is a beautiful morning", "beautiful", :radius => 5)) assert_equal("...is a beautiful morn...", excerpt("This is a beautiful morning", "beautiful", :radius => 5))
assert_equal("This is a...", excerpt("This is a beautiful morning", "this", :radius => 5)) assert_equal("This is a...", excerpt("This is a beautiful morning", "this", :radius => 5))
assert_equal("...iful morning", excerpt("This is a beautiful morning", "morning", :radius => 5)) assert_equal("...iful morning", excerpt("This is a beautiful morning", "morning", :radius => 5))
assert_nil excerpt("This is a beautiful morning", "day")
end

def test_excerpt_with_regex
assert_equal("...udge Allen and...", excerpt("This day was challenging for judge Allen and his colleagues.", /\ballen\b/i, :radius => 5)) assert_equal("...udge Allen and...", excerpt("This day was challenging for judge Allen and his colleagues.", /\ballen\b/i, :radius => 5))
assert_equal("...judge Allen and...", excerpt("This day was challenging for judge Allen and his colleagues.", /\ballen\b/i, :radius => 1, :separator => ' ')) assert_equal("...judge Allen and...", excerpt("This day was challenging for judge Allen and his colleagues.", /\ballen\b/i, :radius => 1, :separator => ' '))
assert_nil excerpt("This is a beautiful morning", "day")
end end


def test_excerpt_should_not_be_html_safe def test_excerpt_should_not_be_html_safe
Expand Down

0 comments on commit 490f250

Please sign in to comment.