BusyBird
view release on metacpan or search on metacpan
lib/BusyBird/Main/PSGI/View.pm view on Meta::CPAN
$self->_render_text_segment($timeline_name, $segment, $status)
}catch {
my ($e) = @_;
bblog("error", "Error while rendering text: $e");
undef;
};
$result_text .= defined($rendered_text) ? $rendered_text : _escape_and_linkify_status_text($segment->{text});
}
return $result_text;
},
bb_attached_image_urls => sub {
my ($status) = @_;
my $urls_builder = $self->{main_obj}->get_timeline_config($timeline_name, "attached_image_urls_builder");
my @image_urls = try {
$urls_builder->($status);
}catch {
my ($e) = @_;
bblog("error", "Error in attached_image_urls_builder: $e");
();
};
return [grep { _is_valid_link_url($_) } @image_urls ];
},
};
}
{
my $timezone_cache = Cache::Memory::Simple->new();
my $CACHE_EXPIRATION_TIME = 3600 * 24;
my $CACHE_SIZE_LIMIT = 100;
sub _get_timezone {
my ($self, $timezone_string) = @_;
if($timezone_cache->count > $CACHE_SIZE_LIMIT) {
$timezone_cache->purge();
if($timezone_cache->count > $CACHE_SIZE_LIMIT) {
$timezone_cache->delete_all();
}
}
return $timezone_cache->get_or_set($timezone_string, sub {
return DateTime::TimeZone->new(name => $timezone_string),
}, $CACHE_EXPIRATION_TIME);
}
}
sub _escape_and_linkify_status_text {
my ($text) = @_;
my $result_text = "";
my $remaining_index = 0;
while($text =~ m/\G(.*?)($REGEXP_HTTP_URL)/sg) {
my ($other_text, $url) = ($1, $2);
$result_text .= html_escape($other_text);
$result_text .= _html_link_status_text($url, $url);
$remaining_index = pos($text);
}
$result_text .= html_escape(substr($text, $remaining_index));
return $result_text;
}
sub _format_status_html_destructive {
my ($self, $status, $timeline_name) = @_;
$timeline_name = "" if not defined $timeline_name;
if(ref($status->{retweeted_status}) eq "HASH" && (!defined($status->{busybird}) || ref($status->{busybird}) eq 'HASH')) {
my $retweet = $status->{retweeted_status};
$status->{busybird}{retweeted_by_user} = $status->{user};
foreach my $key (qw(text created_at user entities)) {
$status->{$key} = $retweet->{$key};
}
}
return $self->{renderer}->render(
"status.tx",
{ss => safed($status),
%{$self->template_functions_for_timeline($timeline_name)}}
);
}
my %RESPONSE_FORMATTER_FOR_TL_GET_STATUSES = (
html => sub {
my ($self, $timeline_name, $code, $response_object) = @_;
if($code == 200) {
my $result = "";
foreach my $status (@{$response_object->{statuses}}) {
$result .= $self->_format_status_html_destructive($status, $timeline_name);
}
$result = Encode::encode('utf8', $result);
return [200, ['Content-Type', 'text/html; charset=utf8'], [$result]];
}else {
return $self->response_error_html($code, $response_object->{error});
}
},
json => sub {
my ($self, $timeline_name, $code, $response_object) = @_;
return $self->response_json($code, $response_object);
},
json_only_statuses => sub {
my ($self, $timeline_name, $code, $response_object) = @_;
my $res_array = defined($response_object->{error}) ? [] : $response_object->{statuses};
my $res_msg = try {
to_json($res_array, {ascii => 1});
}catch {
"[]"
};
return [
$code, ['Content-Type' => 'application/json; charset=utf-8'],
[$res_msg]
];
},
);
sub response_statuses {
my ($self, %args) = @_;
if(!defined($args{statuses}) && !defined($args{error})) {
croak "stautses or error parameter is mandatory";
}
foreach my $param_key (qw(http_code format)) {
croak "$param_key parameter is mandatory" if not defined($args{$param_key});
}
my $formatter = $RESPONSE_FORMATTER_FOR_TL_GET_STATUSES{lc($args{format})};
if(!defined($formatter)) {
$formatter = $RESPONSE_FORMATTER_FOR_TL_GET_STATUSES{html};
delete $args{statuses};
$args{error} = "Unknown format: $args{format}";
$args{http_code} = 400;
}
return $formatter->($self, $args{timeline_name}, $args{http_code},
( run in 1.033 second using v1.01-cache-2.11-cpan-39bf76dae61 )