diff --git a/app/models/status_message.rb b/app/models/status_message.rb
index c77d0ce14..976ebac90 100644
--- a/app/models/status_message.rb
+++ b/app/models/status_message.rb
@@ -38,12 +38,30 @@ class StatusMessage < Post
write_attribute(:message, text)
end
- def formatted_message(opts = {})
+ def formatted_message(opts={})
return self.raw_message unless self.raw_message
+
+ escaped_message = opts[:plain_text] ? self.raw_message: ERB::Util.h(self.raw_message)
+ mentioned_message = self.format_mentions(escaped_message, opts)
+ self.format_tags(mentioned_message, opts)
+ end
+
+ def format_tags(text, opts={})
+ return text if opts[:plain_text]
+ regex = /(^|\s)#(\w+)/
+ form_message = text.gsub(regex) do |matched_string|
+ tag = self.tags.detect do |t|
+ t.name == $~[2]
+ end
+ tag ? "#{$~[1]}##{ERB::Util.h(tag.name)}" : ERB::Util.h($~[2])
+ end
+ form_message
+ end
+
+ def format_mentions(text, opts = {})
people = self.mentioned_people
regex = /@\{([^;]+); ([^\}]+)\}/
- escaped_message = opts[:plain_text] ? raw_message : ERB::Util.h(raw_message)
- form_message = escaped_message.gsub(regex) do |matched_string|
+ form_message = text.gsub(regex) do |matched_string|
person = people.detect{ |p|
p.diaspora_handle == $~[2]
}
diff --git a/spec/models/status_message_spec.rb b/spec/models/status_message_spec.rb
index e71e3df0b..7be1cf4f7 100644
--- a/spec/models/status_message_spec.rb
+++ b/spec/models/status_message_spec.rb
@@ -6,6 +6,11 @@ require 'spec_helper'
describe StatusMessage do
+ include ActionView::Helpers::UrlHelper
+ include Rails.application.routes.url_helpers
+ def controller
+ mock()
+ end
before do
@user = alice
@@ -68,12 +73,6 @@ describe StatusMessage do
end
describe 'mentions' do
- def controller
- mock()
- end
-
- include ActionView::Helpers::UrlHelper
- include Rails.application.routes.url_helpers
before do
@people = [alice, bob, eve].map{|u| u.person}
@test_string = <<-STR
@@ -83,9 +82,9 @@ STR
@sm = Factory.create(:status_message, :message => @test_string )
end
- describe '#formatted_message' do
+ describe '#format_mentions' do
it 'adds the links in the formated message text' do
- @sm.formatted_message.should == <<-STR
+ @sm.format_mentions(@sm.raw_message).should == <<-STR
#{link_to('@' << @people[0].name, person_path(@people[0]), :class => 'mention')} can mention people like Raphael #{link_to('@' << @people[1].name, person_path(@people[1]), :class => 'mention')}
can mention people like Raphaellike Raphael #{link_to('@' << @people[2].name, person_path(@people[2]), :class => 'mention')} can mention people like Raph
STR
@@ -94,13 +93,13 @@ STR
context 'with :plain_text option' do
it 'removes the mention syntax and displays the unformatted name' do
status = Factory(:status_message, :message => "@{Barack Obama; barak@joindiaspora.com } is so cool @{Barack Obama; barak@joindiaspora.com } ")
- status.formatted_message(:plain_text => true).should == 'Barack Obama is so cool Barack Obama '
+ status.format_mentions(status.raw_message, :plain_text => true).should == 'Barack Obama is so cool Barack Obama '
end
end
it 'leaves the name of people that cannot be found' do
@sm.stub(:mentioned_people).and_return([])
- @sm.formatted_message.should == <<-STR
+ @sm.format_mentions(@sm.raw_message).should == <<-STR
Raphael can mention people like Raphael Ilya
can mention people like Raphaellike Raphael Daniel can mention people like Raph
STR
@@ -113,8 +112,10 @@ STR
.values
p.save!
- @sm.formatted_message.should_not include(@people[0].profile.first_name)
+ @sm.format_mentions(@sm.raw_message).should_not include(@people[0].profile.first_name)
end
+ end
+ describe '#formatted_message' do
it 'escapes the message' do
xss = " "
@sm.message << xss
@@ -177,6 +178,23 @@ STR
before do
@sm = Factory.build(:status_message)
end
+ describe '#format_tags' do
+ before do
+ @str = '#what #hey'
+ @sm.message = @str
+ @sm.build_tags
+ @sm.save
+ @sm.reload
+ end
+ it 'links the tag to /p' do
+ link = link_to('#what', posts_path(:tag => 'what'), :class => 'tag')
+ @sm.format_tags(@str).should include(link)
+ end
+ it 'responds to plain_text' do
+ @sm.format_tags(@str, :plain_text => true).should == @str
+
+ end
+ end
describe '#build_tags' do
it 'builds the tags' do
@sm.message = '#what'