MakeClicky: Difference between revisions
m (12 revisions imported) |
(Add Patch for Umlaut support. Fix syntax.) |
||
Line 1: | Line 1: | ||
= 3.8.x = | = 3.8.x = | ||
This is now built-in functionality. From [[RT Config|RT_Config]].pm: | This is now built-in functionality. From [[RT Config|RT_Config]].pm: | ||
<pre><nowiki>=item C<@Active_MakeClicky> | |||
MakeClicky detects various formats of data in headers and email messages, | MakeClicky detects various formats of data in headers and email messages, | ||
Line 21: | Line 20: | ||
Set(@Active_MakeClicky, qw()); | Set(@Active_MakeClicky, qw()); | ||
</nowiki> | </nowiki></pre> | ||
If you're new to this, the option you choose is contained in qw(), frex: | If you're new to this, the option you choose is contained in qw(), frex: | ||
<pre><nowiki> | |||
Set(@Active_MakeClicky, qw(httpurl)); | |||
</nowiki></pre> | |||
Note that httpurl will result in things like | Note that httpurl will result in things like | ||
<pre><nowiki> | |||
http://www.someplace.tld/path/morepath/etc/target.htm [Open URL] | |||
</nowiki></pre> | |||
where the [Open URL] is your clickable link. httpurl_overwrite will make the existing link clickable (oddly enough). Try both and see how it works on your links; don't forget to reload your webserver when you change it. | where the [Open URL] is your clickable link. httpurl_overwrite will make the existing link clickable (oddly enough). Try both and see how it works on your links; don't forget to reload your webserver when you change it. | ||
Line 42: | Line 41: | ||
* Workaround | * Workaround | ||
<pre><nowiki> | |||
cp $RTHOME/share/html/Elements/MakeClicky $RTHOME/local/html/Elements/MakeClicky | cp $RTHOME/share/html/Elements/MakeClicky $RTHOME/local/html/Elements/MakeClicky | ||
$EDITOR $RTHOME/local/html/Elements/MakeClicky | $EDITOR $RTHOME/local/html/Elements/MakeClicky | ||
</nowiki></pre> | |||
Now change regex to also match # qr@(?<!src=["'])https?:([\w\/\@\-~%#?=;,.:+\[\]\(\)]|\&|\[\])+[\w\/]@, | Now change regex to also match # qr@(?<!src=["'])https?:([\w\/\@\-~%#?=;,.:+\[\]\(\)]|\&|\[\])+[\w\/]@, | ||
<pre><nowiki> | |||
my @types = ( | my @types = ( | ||
{ | { | ||
Line 60: | Line 61: | ||
}, | }, | ||
); | ); | ||
</nowiki></pre> | |||
= Earlier Versions = | = Earlier Versions = | ||
Line 67: | Line 69: | ||
Regexp based on work by Abigail. As always, mind the tab damage. | Regexp based on work by Abigail. As always, mind the tab damage. | ||
<pre><nowiki> | |||
$ diff -u /usr{,/local}/share/request-tracker3/html/Ticket/Elements/ShowMessageStanza | $ diff -u /usr{,/local}/share/request-tracker3/html/Ticket/Elements/ShowMessageStanza | ||
--- /usr/share/request-tracker3/html/Ticket/Elements/ShowMessageStanza 2004-02-13 19:21:02.000000000 +0100 | --- /usr/share/request-tracker3/html/Ticket/Elements/ShowMessageStanza 2004-02-13 19:21:02.000000000 +0100 | ||
Line 80: | Line 83: | ||
<%$content |n%><br> | <%$content |n%><br> | ||
% } | % } | ||
</nowiki></pre> | |||
---- | ---- | ||
Line 86: | Line 89: | ||
[=$your-rt-path/local/html/Callbacks/MI/Ticket/Elements/[[ShowMessageStanza]]/Default] | [=$your-rt-path/local/html/Callbacks/MI/Ticket/Elements/[[ShowMessageStanza]]/Default] | ||
<pre><nowiki> | |||
<%init> | <%init> | ||
my $val = $$content; | my $val = $$content; | ||
Line 99: | Line 102: | ||
$content => undef | $content => undef | ||
</%args> | </%args> | ||
</nowiki></pre> | |||
---- | ---- | ||
Line 116: | Line 119: | ||
A small enhancement to Disk's Callback method, where long http(s) URL's are truncated when displayed: | A small enhancement to Disk's Callback method, where long http(s) URL's are truncated when displayed: | ||
<pre><nowiki> | |||
<%init> | <%init> | ||
my $val = $$content; | my $val = $$content; | ||
Line 150: | Line 154: | ||
$content => undef | $content => undef | ||
</%args> | </%args> | ||
</nowiki></pre> | |||
-Shane PS Copy it in "Edit" mode | |||
= URL with special characters = | |||
This is not a direct edit of MakeClicky, but it's a fix for a problem that MakeClicky can't and should be handled by the module used by MakeClicky (which is Regexp::Common). | |||
As of RT 4.4.4 (using Regexp::Common Version 2013031301-1 or 2017060201), there is no support for URLs that contain Umlaut characters in their path. | |||
This patch adds support for german Umlauts and other special language characters to Regexp::Common::URI. Note that this is an external Perl module, not directly provided by Bestpractical. | |||
<pre><nowiki> | |||
diff -ur /usr/share/perl5/Regexp/Common/URI/RFC2396.pm.orig /usr/share/perl5/Regexp/Common/URI/RFC2396.pm | |||
--- /usr/share/perl5/Regexp/Common/URI/RFC2396.pm.orig 2020-02-05 11:23:35.217557749 +0000 | |||
+++ /usr/share/perl5/Regexp/Common/URI/RFC2396.pm 2020-02-05 12:02:50.441450768 +0000 | |||
@@ -54,12 +54,12 @@ | |||
# unreserved | escaped | [:@&=+$,] | |||
$uric = "(?:[;/?:\@&=+\$,a-zA-Z0-9\\-_.!~*'()]|$escaped)"; | |||
# reserved | unreserved | escaped | |||
-$urics = "(?:(?:[;/?:\@&=+\$,a-zA-Z0-9\\-_.!~*'()]+|" . | |||
+$urics = "(?:(?:[;/?:\@&=+\$,a-zA-Z0-9\x7f-\xff\\-_.!~*'()]+|" . | |||
"$escaped)*)"; | |||
$query = $urics; | |||
$fragment = $urics; | |||
-$param = "(?:(?:[a-zA-Z0-9\\-_.!~*'():\@&=+\$,]+|$escaped)*)"; | |||
+$param = "(?:(?:[a-zA-Z0-9\x7f-\xff\\-_.!~*'():\@&=+\$,]+|$escaped)*)"; | |||
$segment = "(?:$param(?:;$param)*)"; | |||
$path_segments = "(?:$segment(?:/$segment)*)"; | |||
$ftp_segments = "(?:$param(?:/$param)*)"; # NOT from RFC 2396. | |||
</nowiki></pre> | |||
The character range is currently <code>\x7f-\xff</code>, extend it if you need other characters. | |||
This will parse URLs correctly, that have special characters in them. | |||
If you need support for special character domains, also change <code>$domainlabel</code>. | |||
--- | |||
[[Category:3.8.x]] | [[Category:3.8.x]] |
Latest revision as of 07:51, 5 February 2020
3.8.x
This is now built-in functionality. From RT_Config.pm:
=item C<@Active_MakeClicky> 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 and *adds spaces* into text if it's longer then 30 chars. This allow browser to wrap long URLs and avoid horizontal scrolling. See F<share/html/Elements/MakeClicky> for documentation on how to add your own. =cut Set(@Active_MakeClicky, qw());
If you're new to this, the option you choose is contained in qw(), frex:
Set(@Active_MakeClicky, qw(httpurl));
Note that httpurl will result in things like
http://www.someplace.tld/path/morepath/etc/target.htm [Open URL]
where the [Open URL] is your clickable link. httpurl_overwrite will make the existing link clickable (oddly enough). Try both and see how it works on your links; don't forget to reload your webserver when you change it.
If you want to add your own actions be aware that the documentation in docs/extending_clickable_links.pod is not correct where it says to create the file ' local/html/MyCallbacks/Elements/MakeClicky/Default' it needs to be ' local/html/Callbacks/MyCallbacks/Elements/MakeClicky/Default' otherwise it will not be picked up by rt. Doc fixed in 3.8.5. NOTE that such things should be reported via bug tracker.
Known Problems
- html #anchors
- httpurl_overwrite does not work well with http anchors like http://en.wikipedia.org/wiki/HTML_anchor#Anchor
- Workaround
cp $RTHOME/share/html/Elements/MakeClicky $RTHOME/local/html/Elements/MakeClicky $EDITOR $RTHOME/local/html/Elements/MakeClicky
Now change regex to also match # qr@(?<!src=["'])https?:([\w\/\@\-~%#?=;,.:+\[\]\(\)]|\&|\[\])+[\w\/]@,
my @types = ( { name => "httpurl", regex => qr/$RE{URI}{HTTP}{-keep}{-scheme => 'https?'}/, action => "url", }, { name => "httpurl_overwrite", #regex => qr/$RE{URI}{HTTP}{-keep}{-scheme => 'https?'}/, regex => qr@(?<!src=["'])https?:([\w\/\@\-~%#?=;,.:+\[\]\(\)]|\&|\[\])+[\w\/]@, action => "url_overwrite", }, );
Earlier Versions
This is a patch to make links clickable when displaying a ticket. Works for 3.0, success has been reported for 3.4 too.
Regexp based on work by Abigail. As always, mind the tab damage.
$ diff -u /usr{,/local}/share/request-tracker3/html/Ticket/Elements/ShowMessageStanza --- /usr/share/request-tracker3/html/Ticket/Elements/ShowMessageStanza 2004-02-13 19:21:02.000000000 +0100 +++ /usr/local/share/request-tracker3/html/Ticket/Elements/ShowMessageStanza 2005-05-08 01:04:15.000000000 +0200 @@ -37,6 +37,9 @@ $m->comp('/Elements/Callback', content => \$content, %ARGS); $content =~ s/\n/<br>/gi; + # Make URLs in plaintext clickable. This is dangerous! + $content =~ s@(https?://(?:(?:(?:(?:(?:[a-zA-Z\d](?:(?:[a-zA-Z\d]|-)*[a-zA-Z\d])?)\.)*(?:[a-zA-Z](?:(?:[a-zA-Z\d]|-)*[a-zA-Z\d])?))|(?:(?:\d+)(?:\.(?:\d+)){3}))(?::(?:\d+))?)(?:/(?:(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[;:\@&=#])*)(?:/(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[;:\@&=#])*))*)(?:\?(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[;:\@&=#])*))?)?)|(?:ftp://(?:(?:(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[;?&=])*)(?::(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[;?&=])*))?\@)?(?:(?:(?:(?:(?:[a-zA-Z\d](?:(?:[a-zA-Z\d]|-)*[a-zA-Z\d])?)\.)*(?:[a-zA-Z](?:(?:[a-zA-Z\d]|-)*[a-zA-Z\d])?))|(?:(?:\d+)(?:\.(?:\d+)){3}))(?::(?:\d+))?))(?:/(?:(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[?:\@&=])*)(?:/(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[?:\@&=])*))*)(?:;type=[AIDaid])?)?)|(?:mailto:(?:(?:[a-zA-Z\d$\-_.+!*'(),;/?:\@&=]|(?:%[a-fA-F\d]{2}))+))@<a href=\"$1\" target=\"_blank\">$1</a>@g; + </%perl> <%$content |n%><br> % }
Alternatively you could implement this callback by Dirk Pape which goes in
[=$your-rt-path/local/html/Callbacks/MI/Ticket/Elements/ShowMessageStanza/Default]
<%init> my $val = $$content; use bytes; $val =~ s/https?:([\w\/\@\-~%#?=;,.:+]|\&)+[\w\/]/<a href="$&" target="_blank">$&<\/a>/gi; $val =~ s/(s?ftp|ftps):[\w\/\.:+\-]+/<a href="$&">$&<\/a>/gi; $val =~ s/(mailto:)?([a-zA-Z0-9_\+\-\.]+\@([a-zA-Z0-9][\w\.\+\-]+\.[a-zA-Z]{2,})(\?([\w\/\@\-~%#?=;,.:+]|\&)+[\w\/])?)/<a href="mailto:$2">$&<\/a>/gi; $val =~ s/\<((url:\s*)?\w+:[^&<>]+)\>/<<a href="$1" target="_blank">$1<\/a>>/gi; $$content = $val; </%init> <%args> $content => undef </%args>
For what it's worth, the above file content worked for me accept for the 6th line, which contains the "mailto:" parsing. My system complained about the syntax of this line. I deleted it from my Default file, and all works well on my resulting RT 3.4.2 system.
-Matt England
There was a typo in line 6. It read "$val =~ s/(mailto ... <\/a>/ gi;" but the space before "gi" is too much. I removed it, and removed the cached file [=/var/cache/request-tracker3.4/mason_data/obj/local/Callbacks/MI/Ticket/Elements/ShowMessageStanza/Default] (on our server). It then worked as expected.
-Andreas
A small enhancement to Disk's Callback method, where long http(s) URL's are truncated when displayed:
<%init> my $val = $$content; use bytes; my @parts = (); my @markup = (); my $max_length = 67; my $http_regex = 'https?:[\w\/\@\-~%#?=;,.:+&]+[\w\/]'; my $ftp_regex = '(s?ftp|ftps):[\w\/\.:+\-]+'; my $mail_regex = '(mailto:)?([a-zA-Z0-9_\+\-\.]+\@([a-zA-Z0-9][\w\.\+\-]+\.[a-zA-Z]{2,})(\?([\w\/\@\-~%#?=;,.:+]|\&)+[\w\/])?)'; my $url_regex = '\<((url:\s*)?\w+:[^&<>]+)\>'; $val =~ s/$ftp_regex/<a href="$&">$&<\/a>/gi; $val =~ s/$mail_regex/<a href="mailto:$2">$&<\/a>/gi; $val =~ s/$url_regex/<a href="$1" target="_blank">$1<\/a>/gi; @parts = split(/($http_regex)/, $val); foreach my $bit (@parts) { if ($bit =~ m/$http_regex/) { if (length($bit) < $max_length) { $bit = '<a href="'.$bit.'" target="_blank">'.$bit.'</a>'; } else { $bit = '<a href="'.$bit.'" target="_blank">'.substr($bit, 0, $max_length).'...</a>'; } } push(@markup, $bit); } $$content = join("", @markup); </%init> <%args> $content => undef </%args>
-Shane PS Copy it in "Edit" mode
URL with special characters
This is not a direct edit of MakeClicky, but it's a fix for a problem that MakeClicky can't and should be handled by the module used by MakeClicky (which is Regexp::Common).
As of RT 4.4.4 (using Regexp::Common Version 2013031301-1 or 2017060201), there is no support for URLs that contain Umlaut characters in their path.
This patch adds support for german Umlauts and other special language characters to Regexp::Common::URI. Note that this is an external Perl module, not directly provided by Bestpractical.
diff -ur /usr/share/perl5/Regexp/Common/URI/RFC2396.pm.orig /usr/share/perl5/Regexp/Common/URI/RFC2396.pm --- /usr/share/perl5/Regexp/Common/URI/RFC2396.pm.orig 2020-02-05 11:23:35.217557749 +0000 +++ /usr/share/perl5/Regexp/Common/URI/RFC2396.pm 2020-02-05 12:02:50.441450768 +0000 @@ -54,12 +54,12 @@ # unreserved | escaped | [:@&=+$,] $uric = "(?:[;/?:\@&=+\$,a-zA-Z0-9\\-_.!~*'()]|$escaped)"; # reserved | unreserved | escaped -$urics = "(?:(?:[;/?:\@&=+\$,a-zA-Z0-9\\-_.!~*'()]+|" . +$urics = "(?:(?:[;/?:\@&=+\$,a-zA-Z0-9\x7f-\xff\\-_.!~*'()]+|" . "$escaped)*)"; $query = $urics; $fragment = $urics; -$param = "(?:(?:[a-zA-Z0-9\\-_.!~*'():\@&=+\$,]+|$escaped)*)"; +$param = "(?:(?:[a-zA-Z0-9\x7f-\xff\\-_.!~*'():\@&=+\$,]+|$escaped)*)"; $segment = "(?:$param(?:;$param)*)"; $path_segments = "(?:$segment(?:/$segment)*)"; $ftp_segments = "(?:$param(?:/$param)*)"; # NOT from RFC 2396.
The character range is currently \x7f-\xff
, extend it if you need other characters.
This will parse URLs correctly, that have special characters in them.
If you need support for special character domains, also change $domainlabel
.