X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=rt%2Fshare%2Fhtml%2FElements%2FMakeClicky;h=4607ba0929f8858f0520be66cd0bf0d308698dae;hp=57964f7a9733a685eaa13029c0b0cb4f60edbfb1;hb=919e930aa9279b3c5cd12b593889cd6de79d67bf;hpb=43a06151e47d2c59b833cbd8c26d97865ee850b6 diff --git a/rt/share/html/Elements/MakeClicky b/rt/share/html/Elements/MakeClicky index 57964f7a9..4607ba092 100644 --- a/rt/share/html/Elements/MakeClicky +++ b/rt/share/html/Elements/MakeClicky @@ -2,7 +2,7 @@ %# %# COPYRIGHT: %# -%# This software is Copyright (c) 1996-2012 Best Practical Solutions, LLC +%# This software is Copyright (c) 1996-2015 Best Practical Solutions, LLC %# %# %# (Except where explicitly superseded by other copyright notices) @@ -48,20 +48,27 @@ <%ONCE> use Regexp::Common qw(URI); +my $escaper = sub { + my $content = shift; + RT::Interface::Web::EscapeUTF8( \$content ); + return $content; +}; + my %actions = ( default => sub { my %args = @_; - return $args{value}; + return $escaper->($args{value}); }, url => sub { my %args = @_; + $args{value} = $escaper->($args{value}); my $result = qq{[}. loc('Open URL') .qq{]}; return $args{value} . qq{ $result}; }, url_overwrite => sub { my %args = @_; - my $result = qq{}; - $result .= qq{$args{'value'}}; + $args{value} = $escaper->($args{value}); + my $result = qq{$args{value}}; return qq{$result}; }, ); @@ -69,12 +76,12 @@ my %actions = ( my @types = ( { name => "httpurl", - regex => qr/$RE{URI}{HTTP}{-keep}{-scheme => 'https?'}(?:#\S+)?/, + regex => qr/$RE{URI}{HTTP}{-keep}{-scheme => 'https?'}(?:#[^\s<]+)?(? "url", }, { name => "httpurl_overwrite", - regex => qr/$RE{URI}{HTTP}{-keep}{-scheme => 'https?'}(?:#\S+)?/, + regex => qr/$RE{URI}{HTTP}{-keep}{-scheme => 'https?'}(?:#[^\s<]+)?(? "url_overwrite", }, ); @@ -89,11 +96,7 @@ my $handle = sub { } }; -my $escaper = sub { - my $content = shift; - RT::Interface::Web::EscapeUTF8( \$content ); - return $content; -}; +my $cache; # only defined via callback # Hook to add more Clicky types # XXX Have to have Page argument, as Mason gets caller wrong in Callback? @@ -103,6 +106,7 @@ $m->callback( types => \@types, actions => \%actions, handle => \$handle, + cache => \$cache, ); @@ -130,6 +134,15 @@ $html => undef <%INIT> return unless defined $$content; +if ( defined $cache ) { + my $cached_content = $cache->(fetch => $content); + if ( $cached_content ) { + RT->Logger->debug("Found MakeClicky cache"); + $$content = $cached_content; + return; + } +} + unless ( $regexp ) { RT::Interface::Web::EscapeUTF8( $content ) unless $html; return; @@ -164,40 +177,6 @@ substr( $$content, $pos ) = $escaper->( substr( $$content, $pos ) ) unless ($pos == length $$content) || $html; pos($$content) = 0; +$cache->(store => $content) if defined $cache; -<%doc> - -MakeClicky detects various formats of data in headers and email -messages, and extends them with supporting links. By default, RT -provides two formats: - - * 'httpurl': detects http:// and https:// URLs and adds '[Open URL]' - link after the URL. - - * 'httpurl_overwrite': also detects URLs as 'httpurl' format, but - replace URL with link. - -To extend this with your own types of data, use the callback. -It will be provided with: - - * 'types': An array reference of hash references. Modify this array - reference to add your own types; the first matching type will be - used. Each hashref should contain: - - 'name': The name of the data format; this is used in the - configuration file to enable the format. - - 'regex': A regular expression to match against - - 'action': The name of the action to run (see "actions", below) - - * 'actions': A hash reference of 'actions'. Modify this hash - reference to change or add action types. Values are subroutine - references which will get called when needed. They should return - the modified string. Note that subroutine must escape HTML. - - * 'handler': A reference to a subroutine reference; modify it if you - have to. This can be used to add pre- or post-processing around - all actions. - -Read more about writing new actions in docs/extending/clickable_links.pod - -