Commit 3b213a94d9682b4aefcc60500f1f00f76e2351b9
Committed by
Daniela Feitosa
1 parent
3e5f93f4
Exists in
staging
and in
42 other branches
Changing the way content is shared on Facebook
* For all types of article, its title, url and beginning of body are shared * The first image in the body is used as thumbnail * To use this, it's necessary to add 'www.facebook.com' in the list addthis_options in config/noosfero.yml (ActionItem1972)
Showing
5 changed files
with
94 additions
and
0 deletions
Show diff stats
app/helpers/content_viewer_helper.rb
| ... | ... | @@ -46,4 +46,13 @@ module ContentViewerHelper |
| 46 | 46 | end |
| 47 | 47 | end |
| 48 | 48 | |
| 49 | + def addthis_facebook_url(article) | |
| 50 | + "http://www.facebook.com/sharer.php?s=100&p[title]=%{title}&p[summary]=%{summary}&p[url]=%{url}&p[images][0]=%{image}" % { | |
| 51 | + :title => CGI.escape(article.title), | |
| 52 | + :url => CGI.escape(url_for(article.url)), | |
| 53 | + :summary => CGI.escape(truncate(strip_tags(article.body.to_s), 300)), | |
| 54 | + :image => CGI.escape(article.body_images_paths.first.to_s) | |
| 55 | + } | |
| 56 | + end | |
| 57 | + | |
| 49 | 58 | end | ... | ... |
app/models/article.rb
| ... | ... | @@ -509,6 +509,13 @@ class Article < ActiveRecord::Base |
| 509 | 509 | self.parent && self.parent.accept_uploads? |
| 510 | 510 | end |
| 511 | 511 | |
| 512 | + def body_images_paths | |
| 513 | + require 'uri' | |
| 514 | + Hpricot(self.body.to_s).search('img[@src]').collect do |i| | |
| 515 | + (self.profile && self.profile.environment) ? URI.join(self.profile.environment.top_url, i.attributes['src']).to_s : i.attributes['src'] | |
| 516 | + end | |
| 517 | + end | |
| 518 | + | |
| 512 | 519 | private |
| 513 | 520 | |
| 514 | 521 | def sanitize_tag_list | ... | ... |
app/views/content_viewer/view_page.rhtml
| ... | ... | @@ -38,6 +38,13 @@ |
| 38 | 38 | <script type="text/javascript"> |
| 39 | 39 | addthis_pub = '<%= escape_javascript( NOOSFERO_CONF['addthis_pub'] ) %>'; |
| 40 | 40 | addthis_logo = '<%= escape_javascript( NOOSFERO_CONF['addthis_logo'] ) %>'; |
| 41 | + addthis_config = { | |
| 42 | + services_custom: { | |
| 43 | + name: 'Facebook', | |
| 44 | + url: '<%= addthis_facebook_url(@page) %>', | |
| 45 | + icon: 'http://cache.addthiscdn.com/icons/v1/thumbs/facebook.gif' | |
| 46 | + } | |
| 47 | + }; | |
| 41 | 48 | addthis_options = '<%= escape_javascript( NOOSFERO_CONF['addthis_options'] ) %>'; |
| 42 | 49 | </script> |
| 43 | 50 | <a href="http://www.addthis.com/bookmark.php" id="bt_addThis" target="_blank" onmouseover="return addthis_open(this, '', '[URL]')" onmouseout="addthis_close()" onclick="return addthis_sendto()"><img src="/images/bt-bookmark.gif" width="53" height="16" border="0" alt="" /></a><script type="text/javascript" src="http://s7.addthis.com/js/152/addthis_widget.js"></script> | ... | ... |
test/unit/article_test.rb
| ... | ... | @@ -1526,4 +1526,33 @@ class ArticleTest < Test::Unit::TestCase |
| 1526 | 1526 | assert_includes Article.find_by_contents('thing'), art2 |
| 1527 | 1527 | end |
| 1528 | 1528 | |
| 1529 | + should 'get images paths in article body' do | |
| 1530 | + Environment.any_instance.stubs(:default_hostname).returns('noosfero.org') | |
| 1531 | + a = TinyMceArticle.new :profile => @profile | |
| 1532 | + a.body = 'Noosfero <img src="http://noosfero.com/test.png" /> test <img src="http://test.com/noosfero.png" />' | |
| 1533 | + assert_includes a.body_images_paths, 'http://noosfero.com/test.png' | |
| 1534 | + assert_includes a.body_images_paths, 'http://test.com/noosfero.png' | |
| 1535 | + end | |
| 1536 | + | |
| 1537 | + should 'get absolute images paths in article body' do | |
| 1538 | + Environment.any_instance.stubs(:default_hostname).returns('noosfero.org') | |
| 1539 | + a = TinyMceArticle.new :profile => @profile | |
| 1540 | + a.body = 'Noosfero <img src="test.png" alt="Absolute" /> test <img src="/relative/path.png" />' | |
| 1541 | + assert_includes a.body_images_paths, 'http://noosfero.org/test.png' | |
| 1542 | + assert_includes a.body_images_paths, 'http://noosfero.org/relative/path.png' | |
| 1543 | + end | |
| 1544 | + | |
| 1545 | + should 'return empty if there are no images in article body' do | |
| 1546 | + Environment.any_instance.stubs(:default_hostname).returns('noosfero.org') | |
| 1547 | + a = Event.new :profile => @profile | |
| 1548 | + a.body = 'Noosfero test' | |
| 1549 | + assert_equal [], a.body_images_paths | |
| 1550 | + end | |
| 1551 | + | |
| 1552 | + should 'return empty if body is nil' do | |
| 1553 | + Environment.any_instance.stubs(:default_hostname).returns('noosfero.org') | |
| 1554 | + a = Article.new :profile => @profile | |
| 1555 | + assert_equal [], a.body_images_paths | |
| 1556 | + end | |
| 1557 | + | |
| 1529 | 1558 | end | ... | ... |
test/unit/content_viewer_helper_test.rb
| ... | ... | @@ -83,6 +83,42 @@ class ContentViewerHelperTest < Test::Unit::TestCase |
| 83 | 83 | assert_no_match /feed/, result |
| 84 | 84 | end |
| 85 | 85 | |
| 86 | + should 'generate facebook addthis url for article' do | |
| 87 | + Environment.any_instance.stubs(:default_hostname).returns('noosfero.org') | |
| 88 | + [TextileArticle, Blog, Folder, Gallery, UploadedFile, Forum, Event, TextArticle, TinyMceArticle].each do |model| | |
| 89 | + a = model.new(:name => 'Some title', :body => 'Some text here.', :profile => profile) | |
| 90 | + assert_equal "http://www.facebook.com/sharer.php?s=100&p[title]=Some+title&p[summary]=Some+text+here.&p[url]=http%3A%2F%2Fnoosfero.org%2Fblog_helper_test%2Fsome-title&p[images][0]=", addthis_facebook_url(a) | |
| 91 | + end | |
| 92 | + end | |
| 93 | + | |
| 94 | + should 'generate facebook addthis url without body' do | |
| 95 | + Environment.any_instance.stubs(:default_hostname).returns('noosfero.org') | |
| 96 | + a = TinyMceArticle.new(:name => 'Test', :body => nil, :profile => profile) | |
| 97 | + assert_equal "http://www.facebook.com/sharer.php?s=100&p[title]=Test&p[summary]=&p[url]=http%3A%2F%2Fnoosfero.org%2Fblog_helper_test%2Ftest&p[images][0]=", addthis_facebook_url(a) | |
| 98 | + end | |
| 99 | + | |
| 100 | + should 'generate facebook addthis url without tags in body' do | |
| 101 | + Environment.any_instance.stubs(:default_hostname).returns('noosfero.org') | |
| 102 | + a = TinyMceArticle.new(:name => 'Some title', :body => '<p>This <b class="bold">is</b> a test</p>', :profile => profile) | |
| 103 | + assert_equal "http://www.facebook.com/sharer.php?s=100&p[title]=Some+title&p[summary]=This+is+a+test&p[url]=http%3A%2F%2Fnoosfero.org%2Fblog_helper_test%2Fsome-title&p[images][0]=", addthis_facebook_url(a) | |
| 104 | + end | |
| 105 | + | |
| 106 | + should 'generate facebook addthis url with truncated body' do | |
| 107 | + Environment.any_instance.stubs(:default_hostname).returns('noosfero.org') | |
| 108 | + a = TinyMceArticle.new(:name => 'Some title', :body => 'test' * 76, :profile => profile) | |
| 109 | + assert_equal "http://www.facebook.com/sharer.php?s=100&p[title]=Some+title&p[summary]=#{'test' * 74}t...&p[url]=http%3A%2F%2Fnoosfero.org%2Fblog_helper_test%2Fsome-title&p[images][0]=", addthis_facebook_url(a) | |
| 110 | + end | |
| 111 | + | |
| 112 | + should 'generate facebook addthis url for tinymce article with images' do | |
| 113 | + Environment.any_instance.stubs(:default_hostname).returns('noosfero.org') | |
| 114 | + a = TinyMceArticle.new(:name => 'Some title', :body => '<p>This <b class="bold">is</b> a <img src="/images/x.png" />test</p>', :profile => profile) | |
| 115 | + assert_equal "http://www.facebook.com/sharer.php?s=100&p[title]=Some+title&p[summary]=This+is+a+test&p[url]=http%3A%2F%2Fnoosfero.org%2Fblog_helper_test%2Fsome-title&p[images][0]=http%3A%2F%2Fnoosfero.org%2Fimages%2Fx.png", addthis_facebook_url(a) | |
| 116 | + end | |
| 117 | + | |
| 118 | + protected | |
| 119 | + | |
| 120 | + include ActionView::Helpers::TextHelper | |
| 121 | + | |
| 86 | 122 | end |
| 87 | 123 | |
| 88 | 124 | def show_date(date) |
| ... | ... | @@ -96,3 +132,9 @@ def _(text) |
| 96 | 132 | end |
| 97 | 133 | def will_paginate(arg1, arg2) |
| 98 | 134 | end |
| 135 | +def strip_tags(html) | |
| 136 | + html.gsub(/<[^>]+>/, '') | |
| 137 | +end | |
| 138 | +def url_for(args = {}) | |
| 139 | + ['http:/', args[:host], args[:profile], args[:page]].join('/') | |
| 140 | +end | ... | ... |