diff --git a/app/assets/javascripts/app/pages/post-viewer.js b/app/assets/javascripts/app/pages/post-viewer.js
index fddd01f19..237fdd3f1 100644
--- a/app/assets/javascripts/app/pages/post-viewer.js
+++ b/app/assets/javascripts/app/pages/post-viewer.js
@@ -73,7 +73,12 @@ app.pages.PostViewer = app.views.Base.extend({
},
postRenderTemplate : function() {
- if(this.model.get("title")){ document.title = this.model.get("title"); }
+ if(this.model.get("title")){
+ // formats title to html...
+ var html_title = app.helpers.textFormatter(this.model.get("title"), this.model);
+ //... and converts html to plain text
+ document.title = $('
').html(html_title).text();
+ }
},
commentAnywhere : function(evt) {
diff --git a/app/helpers/posts_helper.rb b/app/helpers/posts_helper.rb
index 5d073a853..ddd8d19d1 100644
--- a/app/helpers/posts_helper.rb
+++ b/app/helpers/posts_helper.rb
@@ -10,7 +10,18 @@ module PostsHelper
I18n.t "posts.show.reshare_by", :author => post.author_name
else
if post.text.present?
- truncate(post.text(:plain_text => true), :length => opts.fetch(:length, 20))
+ if opts.has_key?(:length)
+ truncate(post.text(:plain_text => true), :length => opts.fetch(:length))
+ elsif /\A(?: # Regexp to match a Markdown header present on first line :
+ (?
.{1,200}\n(?:={1,200}|-{1,200}))(?:\r?\n|$) # Setext-style header
+ | # or
+ (?\#{1,6}\s.{1,200})(?:\r?\n|$) # Atx-style header
+ )/x =~ post.text(:plain_text => true)
+ return setext_content unless setext_content.nil?
+ return atx_content unless atx_content.nil?
+ else
+ truncate(post.text(:plain_text => true), :length => 20 )
+ end
elsif post.respond_to?(:photos) && post.photos.present?
I18n.t "posts.show.photos_by", :count => post.photos.size, :author => post.author_name
end
@@ -19,7 +30,7 @@ module PostsHelper
def post_iframe_url(post_id, opts={})
opts[:width] ||= 516
- opts[:height] ||= 315
+ opts[:height] ||= 315
host = AppConfig.pod_uri.authority
"".html_safe
end
diff --git a/app/presenters/post_presenter.rb b/app/presenters/post_presenter.rb
index 03d05f559..919123266 100644
--- a/app/presenters/post_presenter.rb
+++ b/app/presenters/post_presenter.rb
@@ -1,4 +1,7 @@
class PostPresenter
+ include PostsHelper
+ include ActionView::Helpers::TextHelper
+
attr_accessor :post, :current_user
def initialize(post, current_user = nil)
@@ -54,7 +57,7 @@ class PostPresenter
end
def title
- @post.text.present? ? @post.text(:plain_text => true) : I18n.translate('posts.presenter.title', :name => @post.author_name)
+ @post.text.present? ? post_page_title(@post) : I18n.translate('posts.presenter.title', :name => @post.author_name)
end
def template_name #kill me, lol, I should be client side
diff --git a/spec/helpers/posts_helper_spec.rb b/spec/helpers/posts_helper_spec.rb
index eb5d5bcd2..b8be45c97 100644
--- a/spec/helpers/posts_helper_spec.rb
+++ b/spec/helpers/posts_helper_spec.rb
@@ -5,6 +5,42 @@
require 'spec_helper'
describe PostsHelper do
+
+ describe '#post_page_title' do
+ before do
+ @sm = FactoryGirl.create(:status_message)
+ end
+
+ context 'with posts with text' do
+ context 'when :length is passed in parameters' do
+ it 'returns string of size less or equal to :length' do
+ @sm = stub(:text => "## My title\n Post content...")
+ string_size = 12
+ post_page_title(@sm, :length => string_size ).size.should <= string_size
+ end
+ end
+ context 'when :length is not passed in parameters' do
+ context 'with a Markdown header of less than 200 characters on first line'do
+ it 'returns atx style header' do
+ @sm = stub(:text => "## My title\n Post content...")
+ post_page_title(@sm).should == "## My title"
+ end
+ it 'returns setext style header' do
+ @sm = stub(:text => "My title \n======\n Post content...")
+ post_page_title(@sm).should == "My title \n======"
+ end
+ end
+ context 'without a Markdown header of less than 200 characters on first line 'do
+ it 'truncates posts to the 20 first characters' do
+ @sm = stub(:text => "Very, very, very long post")
+ post_page_title(@sm).should == "Very, very, very ..."
+ end
+ end
+ end
+ end
+ end
+
+
describe '#post_iframe_url' do
before do
@post = FactoryGirl.create(:status_message)
diff --git a/spec/javascripts/app/pages/post-viewer_spec.js b/spec/javascripts/app/pages/post-viewer_spec.js
new file mode 100644
index 000000000..eeda1184a
--- /dev/null
+++ b/spec/javascripts/app/pages/post-viewer_spec.js
@@ -0,0 +1,14 @@
+describe("app.Pages.PostViewer", function(){
+ describe("postRenderTemplate", function(){
+ beforeEach(function(){
+ app.setPreload('post', factory.post({frame_name : "note"}).attributes);
+ this.page = new app.pages.PostViewer({id : 2});
+ })
+ it('translates post title from Markdown to plain text and pushes it in document.title', function () {
+ this.page.model.set({title : "### My [Markdown](url) *title*" });
+ this.page.postRenderTemplate();
+ expect(document.title).toEqual("My Markdown title");
+ })
+ })
+});
+
diff --git a/spec/presenters/post_presenter_spec.rb b/spec/presenters/post_presenter_spec.rb
index 1d70df86f..707e7fc5d 100644
--- a/spec/presenters/post_presenter_spec.rb
+++ b/spec/presenters/post_presenter_spec.rb
@@ -76,12 +76,28 @@ describe PostPresenter do
end
describe '#title' do
- it 'includes the text if it is present' do
- @sm = stub(:text => "lalalalalalala", :author => bob.person)
- @presenter.post = @sm
- @presenter.title.should == @sm.text
- end
+ context 'with posts with text' do
+ context 'with a Markdown header of less than 200 characters on first line'do
+ it 'returns atx style header' do
+ @sm = stub(:text => "## My title\n Post content...")
+ @presenter.post = @sm
+ @presenter.title.should == "## My title"
+ end
+ it 'returns setext style header' do
+ @sm = stub(:text => "My title \n======\n Post content...")
+ @presenter.post = @sm
+ @presenter.title.should == "My title \n======"
+ end
+ end
+ context 'without a Markdown header of less than 200 characters on first line 'do
+ it 'truncates post to the 20 first characters' do
+ @sm = stub(:text => "Very, very, very long post")
+ @presenter.post = @sm
+ @presenter.title.should == "Very, very, very ..."
+ end
+ end
+ end
context 'with posts without text' do
it ' displays a messaage with the post class' do