Committer: ailyin
LJSUP-7915 (Native sharing server side)U trunk/bin/upgrading/en.dat U trunk/bin/upgrading/s2layers/core1.s2 U trunk/bin/upgrading/s2layers/i18nc/ru1.s2 U trunk/cgi-bin/LJ/HTML/Template.pm A trunk/cgi-bin/LJ/Share.pm U trunk/cgi-bin/LJ/Text.pm U trunk/cgi-bin/LJ/Widget/Browse.pm U trunk/cgi-bin/imageconf.pl A trunk/htdocs/js/share.js A trunk/htdocs/stc/share.css U trunk/templates/Browse/recent_posts.tmpl
Modified: trunk/bin/upgrading/en.dat =================================================================== --- trunk/bin/upgrading/en.dat 2011-03-02 03:19:12 UTC (rev 18427) +++ trunk/bin/upgrading/en.dat 2011-03-02 04:32:51 UTC (rev 18428) @@ -2681,6 +2681,8 @@ img.sharethis=Share this! +img.share=Share + img.tellfriend=Tell a Friend! img.track=Track This Modified: trunk/bin/upgrading/s2layers/core1.s2 =================================================================== --- trunk/bin/upgrading/s2layers/core1.s2 2011-03-02 03:19:12 UTC (rev 18427) +++ trunk/bin/upgrading/s2layers/core1.s2 2011-03-02 04:32:51 UTC (rev 18428) @@ -1389,6 +1389,11 @@ } set text_share_this = "Share this!"; +property string text_share { + des = "Text to share this with a friend"; +} +set text_share = "Share"; + property string text_share_facebook { des = "Text to share this with a friend on Facebook"; } Modified: trunk/bin/upgrading/s2layers/i18nc/ru1.s2 =================================================================== --- trunk/bin/upgrading/s2layers/i18nc/ru1.s2 2011-03-02 03:19:12 UTC (rev 18427) +++ trunk/bin/upgrading/s2layers/i18nc/ru1.s2 2011-03-02 04:32:51 UTC (rev 18428) @@ -113,6 +113,7 @@ set text_icon_alt_private = "[личная запись]"; set text_copyr_agree = "Разрешаю воспроизводить в любой форме"; set text_copyr_disagree = "Запрещаю воспроизводить в какой-либо форме"; +set text_share_this = "Поделиться"; # Three forms, special cases for numbers ending in 1 and 2, 3, 4, except those ending in 1[1-4] function lang_map_plural (int n) : int { Modified: trunk/cgi-bin/LJ/HTML/Template.pm =================================================================== --- trunk/cgi-bin/LJ/HTML/Template.pm 2011-03-02 03:19:12 UTC (rev 18427) +++ trunk/cgi-bin/LJ/HTML/Template.pm 2011-03-02 04:32:51 UTC (rev 18428) @@ -66,6 +66,14 @@ }, ); + HTML::Template::Pro->register_function( + 'lj_enabled' => sub { + my ($what) = @_; + my $remote = LJ::get_remote(); + return LJ::is_enabled( $what, $remote ); + }, + ); + my $template = HTML::Template::Pro->new( global_vars => 1, # normally variables declared outside a loop are not available inside # a loop. This option makes <TMPL_VAR>s like global variables in Perl Modified: trunk/cgi-bin/LJ/Text.pm =================================================================== --- trunk/cgi-bin/LJ/Text.pm 2011-03-02 03:19:12 UTC (rev 18427) +++ trunk/cgi-bin/LJ/Text.pm 2011-03-02 04:32:51 UTC (rev 18428) @@ -326,4 +326,23 @@ return $str; } +# runs HTML cleaner on the passed string (to ensure that +# <lj user="exampleusername"> is expanded), and then actually removes +# all HTML tags in the result +# +# TODO: save some hassle running clean_comment, and/or make this an option +# for the HTML cleaner itself +sub drop_html { + my ( $class, $what ) = @_; + + LJ::CleanHTML::clean_comment(\$what); + + $what =~ s/<.*?>/ /g; + $what =~ s/\s+/ /g; + $what =~ s/^\s+//; + $what =~ s/\s+$//; + + return $what; +} + 1; Modified: trunk/cgi-bin/LJ/Widget/Browse.pm =================================================================== --- trunk/cgi-bin/LJ/Widget/Browse.pm 2011-03-02 03:19:12 UTC (rev 18427) +++ trunk/cgi-bin/LJ/Widget/Browse.pm 2011-03-02 04:32:51 UTC (rev 18428) @@ -9,6 +9,7 @@ sub need_res { qw( stc/widgets/widget-layout.css stc/widgets/search.css stc/widgets/add-community.css stc/widgets/featuredposts.css stc/widgets/featuredcomms.css ) } use LJ::Browse::Parser; +use LJ::Share; sub _build_tree { my ($parentid, $level, $test_uri, $vertical, @categories) = @_; @@ -282,6 +283,12 @@ $event = $parsed->{'text'}; my $images = $parsed->{'images'}; + my $sharing_js = ''; + if ( LJ::is_enabled('sharing') ) { + LJ::Share->request_resources; + $sharing_js = LJ::Share->render_js({ 'entry' => $entry }); + } + push @tmpl_posts, { subject => $trimmed_subj, is_subject_trimmed => $subject ne $trimmed_subj ? 1 : 0, @@ -298,6 +305,7 @@ photo_for_post => scalar @$images ? $images->[0] : '', comments_count => $entry->reply_count, is_need_more => $parsed->{'is_removed_video'} || $parsed->{'is_text_trimmed'}, + sharing_js => $sharing_js, }; } } Modified: trunk/cgi-bin/imageconf.pl =================================================================== --- trunk/cgi-bin/imageconf.pl 2011-03-02 03:19:12 UTC (rev 18427) +++ trunk/cgi-bin/imageconf.pl 2011-03-02 04:32:51 UTC (rev 18428) @@ -173,6 +173,13 @@ 'alt' => 'img.sharethis', }; +$img{'share'} = { + 'src' => '/btn_share.gif?v=1', + 'width' => 24, + 'height' => 24, + 'alt' => 'img.share', +}; + # load the site-local version, if it's around. if (-e "$LJ::HOME/cgi-bin/imageconf-local.pl") { require "$LJ::HOME/cgi-bin/imageconf-local.pl"; Added: trunk/htdocs/js/share.js =================================================================== --- trunk/htdocs/js/share.js (rev 0) +++ trunk/htdocs/js/share.js 2011-03-02 04:32:51 UTC (rev 18428) @@ -0,0 +1,170 @@ +;(function( window, $ ) { + +var default_options = { + services: { + livejournal: { + title: 'LiveJournal', bindLink: 'http://www.livejournal.com/update.bml?repost={url}' + }, + facebook: { + title: 'Facebook', bindLink: 'http://www.facebook.com/sharer.php?u={url}' + }, + twitter: { + title: 'Twitter', bindLink: 'http://twitter.com/share?url={url}&text={title}' + }, + vkontakte: { + title: 'Vkontakte', bindLink: 'http://vkontakte.ru/share.php?url={url}' + }, + moimir: { + title: 'Moi Mir', bindLink: 'http://connect.mail.ru/share?url={url}' + }, + stumbleupon: { + title: 'Stumbleupon', bindLink: 'http://www.stumbleupon.com/submit?url={url}' + }, + digg: { + title: 'Digg', bindLink: 'http://digg.com/submit?url={url}' + }, + email: { + title: 'E-mail', bindLink: 'http://api.addthis.com/oexchange/0.8/forward/email/offer?username=internal&url={url}' + }, + tumblr: { + title: 'Tumblr', bindLink: 'http://www.tumblr.com/share?v=3&u={url}' + }, + odnoklassniki: { + title: 'Odnoklassniki', bindLink: 'http://www.odnoklassniki.ru/dk?st.cmd=addShare&st.s=1&st._surl={url}' + } + }, + links: [ 'livejournal', 'facebook', 'twitter', 'vkontakte', 'odnoklassniki', 'moimir', 'email', 'digg', 'tumblr', 'stumbleupon' ] +}; + +var global_options = $.extend( true, {}, default_options ); + +window.LJShare = {}; + +window.LJShare.init = function( opts ) { + if( opts ) { + global_options.services = $.extend( true, {}, default_options.services, opts.services ); + global_options.links = opts.links || global_options.links; + } +} + +window.LJShare.link = function( opts ) { + var defaults = { + title: '', + description: '', + url: '' + } + + var link = jQuery( 'a:last' ), + url = link.attr( 'href' ), + options = jQuery.extend( {}, defaults, { url: url } , opts ), + dom; + + options.links = ( opts.links ) ? opts.links : global_options.links; + + + function buildDom() { + var list = jQuery( '<ul>', { "class": 'ljshare-service-list' } ), + li, a, clickFunc; + + for( var i = 0; i < options.links.length; ++i ) { + a = jQuery( '<a>' ) + .html( global_options.services[ options.links[i] ].title ); + + global_options.services[ options.links[i] ].href = a; + $( '<li>', { "class": 'ljshare-service-' + options.links[i] } ) + .append( a ) + .appendTo( list ); + } + + dom = $( '<div>', { 'class': 'ljshare-container' } ).css( { + position: 'absolute', + visibility: 'hidden' + } ).append( list ); + } + + function injectDom() { + dom.appendTo( $( document.body ) ); + } + + function bindControls() { + dom.bind( 'click', function( ev ) { + ev.stopPropagation(); + } ); + + $( window ).bind( 'click', function( ev ) { + togglePopup( false ); + } ); + + for( var i = 0; i < options.links.length; ++i ) { + _bindLink( global_options.services[ options.links[i] ] ); + } + } + + function _bindLink( service ) { + if( typeof service.bindLink === "string" ) { + callback = function() { + togglePopup( false ); + window.open( service.bindLink.replace( "{url}", encodeURIComponent( options.url ) ) + .replace( "{title}", options.title ) ); + } + } else { + callback = service.bindLink; + } + service.href.click( callback ); + } + + function updatePopupPosition() { + var linkPos = link.offset(), + linkH = link.height(), linkW = link.width(); + + var scrollOffset = ( window.scrollY !== undefined ) ? scrollY : + ( window.pageYOffset ) ? pageYOffset : + (((t = document.documentElement) || (t = document.body.parentNode)) && typeof t.ScrollTop == 'number' ? t : document.body).ScrollTop; + + var upperSpace = linkPos.top - scrollOffset; + var lowerSpace = $( window ).height() - upperSpace - linkH; + var domH = dom.height(), domW = dom.width(); + + var linkTop = linkPos.top, linkLeft = linkPos.left; + + if( lowerSpace < domH && upperSpace > domH ) { + linkTop -= domH + 5; + } else { + linkTop += linkH + 5; + } + + var windowW = $( window ).width(); + if( linkPos.left + domW > windowW ) { + linkLeft = windowW - domW - 10; + } + + dom.css( { + left: linkLeft + "px", + top: linkTop + "px" + } ); + } + + function togglePopup( show ) { + show = show || false; + if( show ) { + updatePopupPosition(); + } + + dom.css( 'visibility', ( show ) ? 'visible' : 'hidden' ); + } + + link.attr( 'href', 'javascript:void(0)' ) + .click( function( ev ) { + if( !dom ) { + buildDom(); + injectDom(); + bindControls(); + } + + togglePopup( true ); + ev.preventDefault(); + ev.stopPropagation(); + } ); +} + +} )( window, jQuery ); Added: trunk/htdocs/stc/share.css =================================================================== --- trunk/htdocs/stc/share.css (rev 0) +++ trunk/htdocs/stc/share.css 2011-03-02 04:32:51 UTC (rev 18428) @@ -0,0 +1,20 @@ +.ljshare-container { + position: absolute; + border: 1px solid #555; + -moz-border-radius: 4px; + background-color: #fff; + padding: 0.1em; + line-height: 1.3em; +} + +.ljshare-service-list li { + border: 1px solid #fff; + padding: 0.1em; +} + +.ljshare-service-list li:hover { + background-color: #eee; + border: 1px solid #bbb; + -moz-border-radius: 2px; + cursor: pointer; +} Modified: trunk/templates/Browse/recent_posts.tmpl =================================================================== --- trunk/templates/Browse/recent_posts.tmpl 2011-03-02 03:19:12 UTC (rev 18427) +++ trunk/templates/Browse/recent_posts.tmpl 2011-03-02 04:32:51 UTC (rev 18428) @@ -29,19 +29,26 @@ <ul class="b-share"> <li class="b-share-fb"><a href="http://facebook.com/sharer.php?u=<tmpl_var expr="eurl(url_to_post)">" target="_blank">">facebook</a></li> <li class="b-share-twitter"><a href="http://twitter.com/share?url=<tmpl_var expr="eurl(url_to_post)">&text=<tmpl_var expr="eurl(subject)">" target="_blank">twitter</a></li> - <li class="b-share-sharethis"><a href="javascript:void(0);">sharethis</a></li> + <tmpl_if expr="lj_enabled('sharethis')"> + <li class="b-share-sharethis"><a href="javascript:void(0);">sharethis</a></li> + </tmpl_if> + <tmpl_if expr="lj_enabled('sharing')"> + <li class="b-share-sharethis"><a href="#">share</a><tmpl_var sharing_js></li> + </tmpl_if> <li class="b-share-email"><a href="javascript:void(0);">mail</a></li> <li class="b-share-fb-like"><iframe src="http://www.facebook.com/plugins/like.php?href=<tmpl_var expr="eurl(url_to_post)">&layout=button_count&show_faces=true&width=150&action=like&font=verdana&colorscheme=light&height=21" scrolling="no" frameborder="0" allowTransparency="true"></iframe></li> </ul> - <script type="text/javascript"> - (function() { - var s = SHARETHIS.addEntry({url:'<tmpl_var url_to_post>', title: '<tmpl_var expr="ejs(subject)">'}, {button: false}); - var ul = jQuery('ul:last'); + <tmpl_if expr="lj_enabled('sharethis')"> + <script type="text/javascript"> + (function() { + var s = SHARETHIS.addEntry({url:'<tmpl_var url_to_post>', title: '<tmpl_var expr="ejs(subject)">'}, {button: false}); + var ul = jQuery('ul:last'); - s.attachButton( ul.find('.b-share-sharethis a')[0]); - s.attachChicklet("email", ul.find('.b-share-email a')[0]); - }()); - </script> + s.attachButton( ul.find('.b-share-sharethis a')[0]); + s.attachChicklet("email", ul.find('.b-share-email a')[0]); + }()); + </script> + </tmpl_if> <p class="b-catalogue-item-comments"><span class="b-catalogue-comments-count"><a href="<tmpl_var url_to_post>#comments"><tmpl_var comments_count> comments</a> |</span> <a href="<tmpl_var url_to_post>?mode=reply">Leave comment</a></p> </li> </tmpl_loop>