Committer: ailyin
LJSUP-8952 (<lj like> tag)[tags: nely_snork]
U trunk/bin/upgrading/update-db.pl U trunk/cgi-bin/Apache/LiveJournal.pm U trunk/cgi-bin/LJ/Entry.pm A trunk/cgi-bin/LJ/Hooks/LJLike.pm U trunk/cgi-bin/LJ/S2/DayPage.pm U trunk/cgi-bin/LJ/S2/FriendsPage.pm U trunk/cgi-bin/LJ/S2/RecentPage.pm U trunk/cgi-bin/LJ/S2.pm U trunk/cgi-bin/cleanhtml.pl U trunk/cgi-bin/ljfeed.pl U trunk/cgi-bin/ljviews.pl U trunk/cgi-bin/weblib.pl U trunk/htdocs/community/moderate.bml U trunk/htdocs/edittags.bml U trunk/htdocs/preview/entry.bml U trunk/htdocs/stc/lj_base.css U trunk/htdocs/talkpost.bml U trunk/htdocs/talkread.bml U trunk/htdocs/update.bml
Modified: trunk/bin/upgrading/update-db.pl =================================================================== --- trunk/bin/upgrading/update-db.pl 2011-06-02 08:43:29 UTC (rev 19200) +++ trunk/bin/upgrading/update-db.pl 2011-06-02 08:53:43 UTC (rev 19201) @@ -508,7 +508,7 @@ } }; - while ( my @batch = splice( @to_compile, 0, 20 ) ) { + while ( my @batch = splice( @to_compile, 0, 50 ) ) { $compile_wrapper->(@batch); } Modified: trunk/cgi-bin/Apache/LiveJournal.pm =================================================================== --- trunk/cgi-bin/Apache/LiveJournal.pm 2011-06-02 08:43:29 UTC (rev 19200) +++ trunk/cgi-bin/Apache/LiveJournal.pm 2011-06-02 08:53:43 UTC (rev 19201) @@ -1781,6 +1781,11 @@ $cb->(\$html); } + # add crap right after <body> + my $after_body_open; + LJ::run_hooks('insert_html_after_body_open', \$after_body_open); + $html =~ s!(<body.*?>)!$1$after_body_open!i if $after_body_open; + # add crap before </body> my $before_body_close = ""; LJ::run_hooks("insert_html_before_body_close", \$before_body_close); Modified: trunk/cgi-bin/LJ/Entry.pm =================================================================== --- trunk/cgi-bin/LJ/Entry.pm 2011-06-02 08:43:29 UTC (rev 19200) +++ trunk/cgi-bin/LJ/Entry.pm 2011-06-02 08:53:43 UTC (rev 19201) @@ -210,6 +210,7 @@ my $view = delete $opts{view}; my $anchor = delete $opts{anchor}; my $mode = delete $opts{mode}; + my $style = delete $opts{style}; croak "Unknown args passed to url: " . join(",", keys %opts) if %opts; @@ -836,6 +837,7 @@ } $opts->{journalid} = $self->journalid; $opts->{posterid} = $self->posterid; + $opts->{entry_url} = $self->url; $self->_load_text unless $self->{_loaded_text}; my $event = $self->{event}; @@ -855,7 +857,14 @@ { my $self = shift; my $event = $self->event_raw; - LJ::CleanHTML::clean_event( \$event, { textonly => 1, journalid => $self->journalid, posterid => $self->posterid } ) if $event; + if ( $event ) { + LJ::CleanHTML::clean_event( \$event, { + 'textonly' => 1, + 'journalid' => $self->journalid, + 'posterid' => $self->posterid, + 'entry_url' => $self->url, + } ); + } return $event; } Added: trunk/cgi-bin/LJ/Hooks/LJLike.pm =================================================================== --- trunk/cgi-bin/LJ/Hooks/LJLike.pm (rev 0) +++ trunk/cgi-bin/LJ/Hooks/LJLike.pm 2011-06-02 08:53:43 UTC (rev 19201) @@ -0,0 +1,34 @@ +package LJ::Hooks::LJLike;+use strict;+use warnings;++LJ::register_hook( 'sitewide_resources' => sub {+ return if $LJ::REQ_GLOBAL{'sitewide_resources_ljlike_google'}++;++ my $language = LJ::Lang::get_remote_lang();++ my $locale = LJ::lang_to_locale($language);+ $locale =~ s/_.*//g;++ LJ::include_raw( 'html' => qq{<script type="text/javascript" src="http://apis.google.com/js/plusone.js">{lang: $locale}</script>} );+} );++LJ::register_hook( 'insert_html_after_body_open' => sub {+ my ($after_body_open_ref) = @_;++ my $language = LJ::Lang::get_remote_lang();+ my $locale = LJ::lang_to_locale($language);++ $$after_body_open_ref .= qq{<div id="fb-root"></div><script src="http://connect.facebook.net/$locale/all.js#appId=214181831945836&xfbml=1"></script>};+} );++LJ::register_hook( 'sitewide_resources' => sub {+ return if $LJ::REQ_GLOBAL{'sitewide_resources_ljlike_vkontakte'}++;++ my $api_id = $LJ::VKONTAKTE_CONF->{'client_id'};++ LJ::include_raw( 'html' => qq{<script type="text/javascript" src="http://userapi.com/js/api/openapi.js?31"></script>}+ . qq{<script type="text/javascript">VK.init({apiId: $api_id, onlyWidgets: true});</script>} );+} );++1; \ No newline at end of file Modified: trunk/cgi-bin/LJ/S2/DayPage.pm =================================================================== --- trunk/cgi-bin/LJ/S2/DayPage.pm 2011-06-02 08:43:29 UTC (rev 19200) +++ trunk/cgi-bin/LJ/S2/DayPage.pm 2011-06-02 08:53:43 UTC (rev 19201) @@ -155,7 +155,8 @@ my $suspend_msg = $entry_obj && $entry_obj->should_show_suspend_msg_to($remote) ? 1 : 0; LJ::CleanHTML::clean_event(\$text, { 'preformatted' => $logprops{$itemid}->{'opt_preformatted'}, - 'cuturl' => LJ::item_link($u, $itemid, $anum), + 'cuturl' => $entry_obj->url, + 'entry_url' => $entry_obj->url, 'ljcut_disable' => $remote ? $remote->{'opt_ljcut_disable_lastn'} : undef, 'suspend_msg' => $suspend_msg, 'unsuspend_supportid' => $suspend_msg ? $entry_obj->prop("unsuspend_supportid") : 0, Modified: trunk/cgi-bin/LJ/S2/FriendsPage.pm =================================================================== --- trunk/cgi-bin/LJ/S2/FriendsPage.pm 2011-06-02 08:43:29 UTC (rev 19200) +++ trunk/cgi-bin/LJ/S2/FriendsPage.pm 2011-06-02 08:53:43 UTC (rev 19201) @@ -251,13 +251,17 @@ my $ditemid = $itemid * 256 + $item->{'anum'}; my $entry_obj = LJ::Entry->new($friends{$friendid}, ditemid => $ditemid); - my $stylemine = ""; - $stylemine .= "style=mine" if $remote && $remote->{'opt_stylemine'} && - $remote->{'userid'} != $friendid; + my %urlopts; + if ( $remote && $remote->{'opt_stylemine'} + && $remote->{'userid'} != $friendid ) + { + $urlopts{'style'} = 'mine'; + } my $suspend_msg = $entry_obj && $entry_obj->should_show_suspend_msg_to($remote) ? 1 : 0; LJ::CleanHTML::clean_event(\$text, { 'preformatted' => $logprops{$datakey}->{'opt_preformatted'}, - 'cuturl' => LJ::item_link($friends{$friendid}, $itemid, $item->{'anum'}, $stylemine), + 'cuturl' => $entry_obj->url(%urlopts), + 'entry_url' => $entry_obj->url, 'maximgwidth' => $maximgwidth, 'maximgheight' => $maximgheight, 'ljcut_disable' => $remote ? $remote->{'opt_ljcut_disable_friends'} : undef, @@ -323,8 +327,8 @@ my $journalbase = LJ::journal_base($friends{$friendid}); my $permalink = $eobj->url; - my $readurl = LJ::Talk::talkargs($permalink, $nc, $stylemine); - my $posturl = LJ::Talk::talkargs($permalink, "mode=reply", $stylemine); + my $readurl = $eobj->url( %urlopts, 'mode' => 'reply' ); + my $posturl = $eobj->url( %urlopts, 'mode' => 'reply' ); my $comments = CommentInfo({ 'read_url' => $readurl, Modified: trunk/cgi-bin/LJ/S2/RecentPage.pm =================================================================== --- trunk/cgi-bin/LJ/S2/RecentPage.pm 2011-06-02 08:43:29 UTC (rev 19200) +++ trunk/cgi-bin/LJ/S2/RecentPage.pm 2011-06-02 08:53:43 UTC (rev 19201) @@ -188,7 +188,8 @@ my $suspend_msg = $entry_obj && $entry_obj->should_show_suspend_msg_to($remote) ? 1 : 0; LJ::CleanHTML::clean_event(\$text, { 'preformatted' => $logprops{$itemid}->{'opt_preformatted'}, - 'cuturl' => LJ::item_link($u, $itemid, $item->{'anum'}), + 'cuturl' => $entry_obj->url, + 'entry_url' => $entry_obj->url, 'ljcut_disable' => ($remote) ? $remote->prop("opt_ljcut_disable_lastn") : undef, 'suspend_msg' => $suspend_msg, 'unsuspend_supportid' => $suspend_msg ? $entry_obj->prop("unsuspend_supportid") : 0, Modified: trunk/cgi-bin/LJ/S2.pm =================================================================== --- trunk/cgi-bin/LJ/S2.pm 2011-06-02 08:43:29 UTC (rev 19200) +++ trunk/cgi-bin/LJ/S2.pm 2011-06-02 08:53:43 UTC (rev 19201) @@ -4424,6 +4424,7 @@ LJ::CleanHTML::clean_event( \$text, { 'preformatted' => $entry->prop('opt_preformatted'), 'cuturl' => $entry->url, + 'entry_url' => $entry->url, 'ljcut_disable' => 0, 'journalid' => $entry->journalid, 'posterid' => $entry->posterid, Modified: trunk/cgi-bin/cleanhtml.pl =================================================================== --- trunk/cgi-bin/cleanhtml.pl 2011-06-02 08:43:29 UTC (rev 19200) +++ trunk/cgi-bin/cleanhtml.pl 2011-06-02 08:53:43 UTC (rev 19201) @@ -308,6 +308,8 @@ # - ailyin, Nov 15, 2010 my @lj_lang_otherwise = ( 1 ); + my %vkontakte_like_js; + TOKEN: while (my $token = $p->get_token) { @@ -712,6 +714,74 @@ $opencount{$tag}++; } + elsif ( $tag eq 'lj-like' ) { + unless ( exists $opts->{'entry_url'} && $opts->{'entry_url'} ) + { + $newdata .= '<b>[lj-like in invalid context]</b>'; + next TOKEN; + } + + my $entry_url = $opts->{'entry_url'}; + my @buttons = qw( facebook google vkontakte ); + + if ( exists $attr->{'buttons'} && $attr->{'buttons'} ) { + my $buttons = $attr->{'buttons'}; + + @buttons = (); + foreach my $button ( split /,\s*/, $buttons ) { + if ( $button =~ /^f/i ) { + push @buttons, 'facebook'; + } + elsif ( $button =~ /^g/i ) { + push @buttons, 'google'; + } + elsif ( $button =~ /^v/i ) { + push @buttons, 'vkontakte'; + } + } + } + + $newdata .= '<div class="lj-like">'; + foreach my $button (@buttons) { + if ( $button eq 'facebook' ) { + my $language = LJ::Lang::get_remote_lang(); + my $locale = LJ::lang_to_locale($language); + my $entry_url_ehtml = LJ::ehtml($entry_url); + + $newdata .= qq{<div class="lj-like-item lj-like-item-facebook">} + . qq{<fb:like href="$entry_url_ehtml" send="false" layout="button_count" } + . qq{width="90" show_faces="false" font="">} + . qq{</fb:like></div>}; + } + + elsif ( $button eq 'google' ) { + my $entry_url_ehtml = LJ::ehtml($entry_url); + $newdata .= qq{<div class="lj-like-item lj-like-item-google">} + . qq{<g:plusone size="medium" href="$entry_url_ehtml">} + . qq{</g:plusone></div>}; + } + + elsif ( $button eq 'vkontakte' ) { + unless ( $LJ::VKONTAKTE_CONF ) { + $newdata .= qq{<div class="lj-like-item lj-like-item-vkontakte"><b>[vkontakte like]</b></div>} + next; + } + + $LJ::REQ_GLOBAL{'ljlike_vkontakte_id'} ||= 1; + my $uniqid = $LJ::REQ_GLOBAL{'ljlike_vkontakte_id'}++; + my $entry_url_ejs = LJ::js_dumper($entry_url); + + $vkontakte_like_js{$uniqid} + = qq{<div id="vk_like_$uniqid"></div>} + . qq{<script type="text/javascript">} + . qq{VK.Widgets.Like("vk_like_$uniqid", {type: "mini", pageUrl: $entry_url_ejs});} + . qq{</script>}; + $newdata .= qq{<div class="lj-like-item lj-like-item-vkontakte"><x-vk-like id="$uniqid"></div>}; + } + } + $newdata .= '</div>'; + } + # Don't allow any tag with the "set" attribute elsif ($tag =~ m/:set$/) { next; @@ -1375,6 +1445,8 @@ # extra-paranoid check 1 while $newdata =~ s/<script\b//ig; + $newdata =~ s/<x-vk-like id="(\d+)">/$vkontakte_like_js{$1}/eg; + $$data = $newdata; $$data .= $extra_text if $extra_text; # invalid markup error Modified: trunk/cgi-bin/ljfeed.pl =================================================================== --- trunk/cgi-bin/ljfeed.pl 2011-06-02 08:43:29 UTC (rev 19200) +++ trunk/cgi-bin/ljfeed.pl 2011-06-02 08:53:43 UTC (rev 19201) @@ -236,6 +236,7 @@ 'preformatted' => $logprops{$itemid}->{'opt_preformatted'}, 'journalid' => $u->userid, 'posterid' => $it->{'posterid'}, + 'entry_url' => $entry_obj->url, } ); Modified: trunk/cgi-bin/ljviews.pl =================================================================== --- trunk/cgi-bin/ljviews.pl 2011-06-02 08:43:29 UTC (rev 19200) +++ trunk/cgi-bin/ljviews.pl 2011-06-02 08:53:43 UTC (rev 19201) @@ -1334,7 +1334,8 @@ my $suspend_msg = $entry_obj && $entry_obj->should_show_suspend_msg_to($remote) ? 1 : 0; LJ::CleanHTML::clean_event(\$event, { 'preformatted' => $logprops{$itemid}->{'opt_preformatted'}, - 'cuturl' => LJ::item_link($u, $itemid, $item->{'anum'}), + 'cuturl' => $entry_obj->url, + 'entry_url' => $entry_obj->url, 'ljcut_disable' => ($remote) ? $remote->{'opt_ljcut_disable_lastn'} : undef, 'suspend_msg' => $suspend_msg, 'unsuspend_supportid' => $suspend_msg ? $entry_obj->prop("unsuspend_supportid") : 0, @@ -1866,13 +1867,17 @@ my $itemargs = "journal=$friend&itemid=$ditemid"; $friends_event{'itemargs'} = $itemargs; - my $stylemine = ""; - $stylemine .= "style=mine" if $remote && $remote->{'opt_stylemine'} && - $remote->{'userid'} != $friendid; + my %urlopts; + if ( $remote && $remote->{'opt_stylemine'} + && $remote->{'userid'} != $friendid ) + { + $urlopts{'style'} = 'mine'; + } my $suspend_msg = $entry_obj && $entry_obj->should_show_suspend_msg_to($remote) ? 1 : 0; LJ::CleanHTML::clean_event(\$event, { 'preformatted' => $logprops{$datakey}->{'opt_preformatted'}, - 'cuturl' => LJ::item_link($friends{$friendid}, $itemid, $item->{'anum'}, $stylemine), + 'cuturl' => $entry_obj->url(%urlopts), + 'entry_url' => $entry_obj->url, 'maximgwidth' => $maximgwidth, 'maximgheight' => $maximgheight, 'ljcut_disable' => ($remote) ? $remote->{'opt_ljcut_disable_friends'} : undef, @@ -1946,8 +1951,8 @@ my $nc = ""; $nc .= "nc=$replycount" if $replycount && $remote && $remote->{'opt_nctalklinks'}; - my $readurl = LJ::Talk::talkargs($permalink, $nc, $stylemine); - my $posturl = LJ::Talk::talkargs($permalink, "mode=reply", $stylemine); + my $readurl = $entry_obj->url(%urlopts); + my $posturl = $entry_obj->url( %urlopts, 'mode' => 'reply' ); $friends_event{'talklinks'} = LJ::fill_var_props($vars, 'FRIENDS_TALK_LINKS', { 'itemid' => $ditemid, @@ -2599,7 +2604,8 @@ my $suspend_msg = $entry_obj && $entry_obj->should_show_suspend_msg_to($remote) ? 1 : 0; LJ::CleanHTML::clean_event(\$event, { 'preformatted' => $logprops{$itemid}->{'opt_preformatted'}, - 'cuturl' => LJ::item_link($u, $itemid, $anum), + 'cuturl' => $entry_obj->url, + 'entry_url' => $entry_obj->url, 'ljcut_disable' => ($remote) ? $remote->{'opt_ljcut_disable_lastn'} : undef, 'suspend_msg' => $suspend_msg, 'unsuspend_supportid' => $suspend_msg ? $entry_obj->prop("unsuspend_supportid") : 0, Modified: trunk/cgi-bin/weblib.pl =================================================================== --- trunk/cgi-bin/weblib.pl 2011-06-02 08:43:29 UTC (rev 19200) +++ trunk/cgi-bin/weblib.pl 2011-06-02 08:53:43 UTC (rev 19201) @@ -1281,7 +1281,7 @@ my $code = shift; die "Bogus include type: $type" - unless $type =~ m!^(js|css|js_link|css_link)$!; + unless $type =~ m!^(js|css|js_link|css_link|html)$!; push @LJ::INCLUDE_RAW => [$type, $code]; } @@ -1504,6 +1504,8 @@ $ret .= qq{<script type="text/javascript" src="$code"></script>\r\n}; } elsif ( $type eq 'css_link' ) { $ret .= qq{<link rel="stylesheet" type="text/css" href="$code" />}; + } elsif ( $type eq 'html' ) { + $ret .= $code; } } Modified: trunk/htdocs/community/moderate.bml =================================================================== --- trunk/htdocs/community/moderate.bml 2011-06-02 08:43:29 UTC (rev 19200) +++ trunk/htdocs/community/moderate.bml 2011-06-02 08:53:43 UTC (rev 19201) @@ -365,6 +365,7 @@ LJ::CleanHTML::clean_event(\$event, {'preformatted' => $req->{'props'}->{'opt_preformatted'}, 'cutpreview' => 1, 'cuturl' => '#', + 'entry_url' => '#', 'journalid' => $c->{'userid'}, 'posterid' => $posterid, }); Modified: trunk/htdocs/edittags.bml =================================================================== --- trunk/htdocs/edittags.bml 2011-06-02 08:43:29 UTC (rev 19200) +++ trunk/htdocs/edittags.bml 2011-06-02 08:53:43 UTC (rev 19201) @@ -78,6 +78,7 @@ $opts{'preformatted'} = $props{$jitemid}{'opt_preformatted'}; $opts{'journalid'} = $u->userid; $opts{'posterid'} = $logrow->{posterid}; + $opts{'entry_url'} = $entry->url; LJ::CleanHTML::clean_subject(\$subj); LJ::CleanHTML::clean_event(\$evt, \%opts); Modified: trunk/htdocs/preview/entry.bml =================================================================== --- trunk/htdocs/preview/entry.bml 2011-06-02 08:43:29 UTC (rev 19200) +++ trunk/htdocs/preview/entry.bml 2011-06-02 08:53:43 UTC (rev 19201) @@ -49,6 +49,7 @@ preformatted => $req{'prop_opt_preformatted'}, journalid => $u->userid, posterid => $up->userid, + entry_url => '#', }); # expand the embedded content for reals LJ::EmbedModule->expand_entry($u, \$event, preview => 1,); Modified: trunk/htdocs/stc/lj_base.css =================================================================== --- trunk/htdocs/stc/lj_base.css 2011-06-02 08:43:29 UTC (rev 19200) +++ trunk/htdocs/stc/lj_base.css 2011-06-02 08:53:43 UTC (rev 19201) @@ -3049,3 +3049,29 @@ color: #222!important; } + +/* LJ like buttons */ +.lj-like { + padding: 0 !important; + margin: 24px 0 !important; + } +.lj-like:after { + content: " "; + display: block; + visibility: hidden; + clear: both; + height: 0; + font-size: 0; + line-height: 0; + } + .lj-like-item { + float: left !important; + margin: 0 24px 0 0 !important; + } + .lj-like-item-facebook, + .lj-like-item-google { + height: 20px !important; + padding: 1px 0 !important; + } + + Modified: trunk/htdocs/talkpost.bml =================================================================== --- trunk/htdocs/talkpost.bml 2011-06-02 08:43:29 UTC (rev 19200) +++ trunk/htdocs/talkpost.bml 2011-06-02 08:53:43 UTC (rev 19201) @@ -205,6 +205,7 @@ 'suspend_msg' => $suspend_msg, 'unsuspend_supportid' => $suspend_msg ? $entry->prop("unsuspend_supportid") : 0, 'cuturl' => $talkurl, + 'entry_url' => $talkurl, 'expand_cut' => 1, 'journalid' => $entry->journalid, 'posterid' => $entry->posterid, Modified: trunk/htdocs/talkread.bml =================================================================== --- trunk/htdocs/talkread.bml 2011-06-02 08:43:29 UTC (rev 19200) +++ trunk/htdocs/talkread.bml 2011-06-02 08:53:43 UTC (rev 19201) @@ -277,6 +277,7 @@ expand_cut => !$no_cut_expand, journalid => $entry->journalid, posterid => $entry->posterid, + entry_url => $entry->url, } ); LJ::expand_embedded($u, $ditemid, $remote, \$event); Modified: trunk/htdocs/update.bml =================================================================== --- trunk/htdocs/update.bml 2011-06-02 08:43:29 UTC (rev 19200) +++ trunk/htdocs/update.bml 2011-06-02 08:53:43 UTC (rev 19201) @@ -170,7 +170,12 @@ $subject ||= (LJ::ehtml($entry->subject_orig) || LJ::Lang::ml("repost.default_subject")); unless ($event){ $event = $entry->event_raw; - LJ::CleanHTML::clean_event(\$event, { cuturl => $entry->url, journalid => $entry->journalid, posterid => $entry->posterid }); + LJ::CleanHTML::clean_event( \$event, { + 'cuturl' => $entry->url, + 'entry_url' => $entry->url, + 'journalid' => $entry->journalid, + 'posterid' => $entry->posterid, + } ); $event = LJ::Lang::ml("repost.wrapper", { username => $entry->poster->username, url => $entry->url,