smarter mention parsing #2466
This commit is contained in:
@@ -2,7 +2,7 @@ require 'cgi'
|
||||
require 'uri'
|
||||
|
||||
class DText
|
||||
MENTION_REGEXP = /(?:^| )@\S+/
|
||||
MENTION_REGEXP = /(?<=^| )@\S+/
|
||||
|
||||
def self.u(string)
|
||||
CGI.escape(string)
|
||||
@@ -38,7 +38,26 @@ class DText
|
||||
str.gsub!(/&/, "&")
|
||||
str.gsub!(/</, "<")
|
||||
str.gsub!(/>/, ">")
|
||||
str.gsub!(/\n/m, "<br>") unless options[:ignore_newlines]
|
||||
str.gsub!(/\[b\](.+?)\[\/b\]/i, '<strong>\1</strong>')
|
||||
str.gsub!(/\[i\](.+?)\[\/i\]/i, '<em>\1</em>')
|
||||
str.gsub!(/\[s\](.+?)\[\/s\]/i, '<s>\1</s>')
|
||||
str.gsub!(/\[u\](.+?)\[\/u\]/i, '<u>\1</u>')
|
||||
str.gsub!(/\[tn\](.+?)\[\/tn\]/i, '<p class="tn">\1</p>')
|
||||
|
||||
str = parse_mentions(str)
|
||||
str = parse_links(str)
|
||||
str = parse_aliased_wiki_links(str)
|
||||
str = parse_wiki_links(str)
|
||||
str = parse_post_links(str)
|
||||
str = parse_id_links(str)
|
||||
str
|
||||
end
|
||||
|
||||
def self.parse_mentions(str)
|
||||
str.gsub!(MENTION_REGEXP) do |name|
|
||||
next name unless name =~ /[a-z0-9]/i
|
||||
|
||||
if name =~ /([:;,.!?\)\]<>])$/
|
||||
name.chop!
|
||||
ch = $1
|
||||
@@ -48,18 +67,6 @@ class DText
|
||||
|
||||
'<a href="/users?name=' + u(CGI.unescapeHTML(name[1..-1])) + '">' + name + '</a>' + ch
|
||||
end
|
||||
str.gsub!(/\n/m, "<br>") unless options[:ignore_newlines]
|
||||
str.gsub!(/\[b\](.+?)\[\/b\]/i, '<strong>\1</strong>')
|
||||
str.gsub!(/\[i\](.+?)\[\/i\]/i, '<em>\1</em>')
|
||||
str.gsub!(/\[s\](.+?)\[\/s\]/i, '<s>\1</s>')
|
||||
str.gsub!(/\[u\](.+?)\[\/u\]/i, '<u>\1</u>')
|
||||
str.gsub!(/\[tn\](.+?)\[\/tn\]/i, '<p class="tn">\1</p>')
|
||||
|
||||
str = parse_links(str)
|
||||
str = parse_aliased_wiki_links(str)
|
||||
str = parse_wiki_links(str)
|
||||
str = parse_post_links(str)
|
||||
str = parse_id_links(str)
|
||||
str
|
||||
end
|
||||
|
||||
|
||||
@@ -5,6 +5,13 @@ class DTextTest < ActiveSupport::TestCase
|
||||
DText.parse(s)
|
||||
end
|
||||
|
||||
def test_mentions
|
||||
assert_equal('<p><a href="/users?name=bob">@bob</a></p>', p("@bob"))
|
||||
assert_equal('<p>hi <a href="/users?name=bob">@bob</a></p>', p("hi @bob"))
|
||||
assert_equal('<p>this is not @.@ @_@ <a href="/users?name=bob">@bob</a></p>', p("this is not @.@ @_@ @bob"))
|
||||
assert_equal('<p>multiple <a href="/users?name=bob">@bob</a> <a href="/users?name=anna">@anna</a></p>', p("multiple @bob @anna"))
|
||||
end
|
||||
|
||||
def test_sanitize_heart
|
||||
assert_equal('<p><3</p>', p("<3"))
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user