104 lines
3.1 KiB
Perl
104 lines
3.1 KiB
Perl
#!/usr/bin/perl
|
|
#
|
|
# DW::Controller::RPC::CutExpander
|
|
#
|
|
# AJAX endpoint that returns the expanded text for a cut tag.
|
|
#
|
|
# Author:
|
|
# Allen Petersen
|
|
#
|
|
# Copyright (c) 2009-2011 by Dreamwidth Studios, LLC.
|
|
#
|
|
# This program is free software; you may redistribute it and/or modify it under
|
|
# the same terms as Perl itself. For a copy of the license, please reference
|
|
# 'perldoc perlartistic' or 'perldoc perlgpl'.
|
|
#
|
|
|
|
package DW::Controller::RPC::CutExpander;
|
|
|
|
use strict;
|
|
use DW::Routing;
|
|
use LJ::JSON;
|
|
|
|
DW::Routing->register_rpc( "cuttag", \&cutexpander_handler, format => 'json' );
|
|
|
|
sub cutexpander_handler {
|
|
my $opts = shift;
|
|
|
|
# gets the request and args
|
|
my $r = DW::Request->get;
|
|
my $args = $r->get_args;
|
|
|
|
my $remote = LJ::get_remote();
|
|
|
|
# error handler
|
|
my $error_out = sub {
|
|
my ( $code, $message ) = @_;
|
|
$r->status($code);
|
|
$r->print( to_json( { error => $message } ) );
|
|
|
|
return $r->OK;
|
|
};
|
|
|
|
if ( $args->{ditemid} && $args->{journal} && $args->{cutid} ) {
|
|
|
|
# all parameters are included; get the entry.
|
|
my $ditemid = $args->{ditemid};
|
|
my $uid = LJ::get_userid( $args->{journal} );
|
|
my $entry = $uid ? LJ::Entry->new( $uid, ditemid => $ditemid ) : undef;
|
|
|
|
# FIXME: This returns 200 due to old library, Make return proper when we are jQuery only.
|
|
return $error_out->( 200, BML::ml("error.nopermission") ) unless $entry;
|
|
|
|
# make sure the user can read the entry
|
|
if ( $entry->visible_to($remote) ) {
|
|
my $text = load_cuttext( $entry, $remote, $args->{cutid} );
|
|
|
|
# FIXME: temporary fix.
|
|
# remove some unicode characters that could cause the returned JSON to break
|
|
# like in LJ::ejs, but we don't need to escape quotes, etc (to_json does that)
|
|
$text =~ s/\xE2\x80[\xA8\xA9]//gs;
|
|
$r->print( to_json( { text => $text } ) );
|
|
return $r->OK;
|
|
}
|
|
}
|
|
|
|
# FIXME: This returns 200 due to old library, Make return proper when we are jQuery only.
|
|
return $error_out->( 200, BML::ml("error.nopermission") );
|
|
}
|
|
|
|
# loads the cutttext for the given entry
|
|
sub load_cuttext {
|
|
my ( $entry_obj, $remote, $cutid ) = @_;
|
|
|
|
# most of this is taken from S2->Entry_from_entryobj, modified for this
|
|
# more limited purpose.
|
|
my $get = {};
|
|
my $subject = "";
|
|
|
|
my $anum = $entry_obj->anum;
|
|
my $jitemid = $entry_obj->jitemid;
|
|
my $ditemid = $entry_obj->ditemid;
|
|
|
|
# $journal: journal posted to
|
|
my $journalid = $entry_obj->journalid;
|
|
my $journal = LJ::load_userid($journalid);
|
|
|
|
my $suspend_msg = $entry_obj && $entry_obj->should_show_suspend_msg_to($remote) ? 1 : 0;
|
|
my $cleanhtml_opts = {
|
|
cuturl => $entry_obj->url,
|
|
journal => $journal->username,
|
|
ditemid => $ditemid,
|
|
suspend_msg => $suspend_msg,
|
|
cut_retrieve => $cutid,
|
|
};
|
|
|
|
#load and prepare text of entry
|
|
my $text = LJ::CleanHTML::quote_html( $entry_obj->event_html($cleanhtml_opts), $get->{nohtml} );
|
|
|
|
LJ::expand_embedded( $journal, $jitemid, $remote, \$text );
|
|
|
|
return $text;
|
|
}
|
|
|
|
1;
|