* [PATCH 1/2] extract linkification code to a separate package
2016-03-01 3:50 6% [PATCH 0/2] linkification improvements Eric Wong
@ 2016-03-01 3:50 7% ` Eric Wong
0 siblings, 0 replies; 2+ results
From: Eric Wong @ 2016-03-01 3:50 UTC (permalink / raw)
To: meta
This will allow us to more easily reuse it elsewhere.
---
MANIFEST | 1 +
lib/PublicInbox/Linkify.pm | 57 +++++++++++++++++++++++++++++++++++++++++++++
lib/PublicInbox/View.pm | 58 +++++++++-------------------------------------
3 files changed, 69 insertions(+), 47 deletions(-)
create mode 100644 lib/PublicInbox/Linkify.pm
diff --git a/MANIFEST b/MANIFEST
index 857a3a7..5d790f9 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -30,6 +30,7 @@ lib/PublicInbox/Git.pm
lib/PublicInbox/GitHTTPBackend.pm
lib/PublicInbox/HTTP.pm
lib/PublicInbox/Hval.pm
+lib/PublicInbox/Linkify.pm
lib/PublicInbox/Listener.pm
lib/PublicInbox/MDA.pm
lib/PublicInbox/MID.pm
diff --git a/lib/PublicInbox/Linkify.pm b/lib/PublicInbox/Linkify.pm
new file mode 100644
index 0000000..8f634f4
--- /dev/null
+++ b/lib/PublicInbox/Linkify.pm
@@ -0,0 +1,57 @@
+# Copyright (C) 2014-2016 all contributors <meta@public-inbox.org>
+# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
+
+# two-step linkification.
+# intended usage is in the following order:
+#
+# linkify_1
+# <escape unsafe chars for HTML>
+# linkify_2
+#
+# Maybe this could be done more efficiently...
+package PublicInbox::Linkify;
+use strict;
+use warnings;
+use Digest::SHA qw/sha1_hex/;
+
+my $SALT = rand;
+my $LINK_RE = qr!\b((?:ftp|https?|nntp)://
+ [\@:\w\.-]+/
+ ?[\@\w\+\&\?\.\%\;/#=-]*)!x;
+
+sub new { bless {}, shift }
+
+sub linkify_1 {
+ my ($self, $s) = @_;
+ $s =~ s!$LINK_RE!
+ my $url = $1;
+ # salt this, as this could be exploited to show
+ # links in the HTML which don't show up in the raw mail.
+ my $key = sha1_hex($url . $SALT);
+
+ # only escape ampersands, others do not match LINK_RE
+ $url =~ s/&/&/g;
+ $self->{$key} = $url;
+ 'PI-LINK-'. $key;
+ !ge;
+ $s;
+}
+
+sub linkify_2 {
+ my ($self, $s) = @_;
+
+ # Added "PI-LINK-" prefix to avoid false-positives on git commits
+ $s =~ s!\bPI-LINK-([a-f0-9]{40})\b!
+ my $key = $1;
+ my $url = $self->{$key};
+ if (defined $url) {
+ "<a\nhref=\"$url\">$url</a>";
+ } else {
+ # false positive or somebody tried to mess with us
+ $key;
+ }
+ !ge;
+ $s;
+}
+
+1;
diff --git a/lib/PublicInbox/View.pm b/lib/PublicInbox/View.pm
index 61eb890..4692b22 100644
--- a/lib/PublicInbox/View.pm
+++ b/lib/PublicInbox/View.pm
@@ -12,9 +12,8 @@ use Encode qw/find_encoding/;
use Encode::MIME::Header;
use Email::MIME::ContentType qw/parse_content_type/;
use PublicInbox::Hval;
+use PublicInbox::Linkify;
use PublicInbox::MID qw/mid_clean id_compress mid2path/;
-use Digest::SHA qw/sha1_hex/;
-my $SALT = rand;
require POSIX;
# TODO: make these constants tunable
@@ -302,41 +301,6 @@ sub add_filename_line {
"$pad " . ascii_html($fn) . " $pad\n";
}
-my $LINK_RE = qr!\b((?:ftp|https?|nntp)://
- [\@:\w\.-]+/
- ?[\@\w\+\&\?\.\%\;/#=-]*)!x;
-
-sub linkify_1 {
- my ($link_map, $s) = @_;
- $s =~ s!$LINK_RE!
- my $url = $1;
- # salt this, as this could be exploited to show
- # links in the HTML which don't show up in the raw mail.
- my $key = sha1_hex($url . $SALT);
- $link_map->{$key} = $url;
- 'PI-LINK-'. $key;
- !ge;
- $s;
-}
-
-sub linkify_2 {
- my ($link_map, $s) = @_;
-
- # Added "PI-LINK-" prefix to avoid false-positives on git commits
- $s =~ s!\bPI-LINK-([a-f0-9]{40})\b!
- my $key = $1;
- my $url = $link_map->{$key};
- if (defined $url) {
- $url = ascii_html($url);
- "<a\nhref=\"$url\">$url</a>";
- } else {
- # false positive or somebody tried to mess with us
- $key;
- }
- !ge;
- $s;
-}
-
sub flush_quote {
my ($quot, $n, $part_nr, $full_pfx, $final, $do_anchor) = @_;
@@ -346,11 +310,11 @@ sub flush_quote {
if ($full_pfx) {
if (!$final && scalar(@$quot) <= MAX_INLINE_QUOTED) {
# show quote inline
- my %l;
- my $rv = join('', map { linkify_1(\%l, $_) } @$quot);
+ my $l = PublicInbox::Linkify->new;
+ my $rv = join('', map { $l->linkify_1($_) } @$quot);
@$quot = ();
$rv = ascii_html($rv);
- return linkify_2(\%l, $rv);
+ return $l->linkify_2($rv);
}
# show a short snippet of quoted text and link to full version:
@@ -375,13 +339,13 @@ sub flush_quote {
} else {
# show everything in the full version with anchor from
# short version (see above)
- my %l;
- my $rv .= join('', map { linkify_1(\%l, $_) } @$quot);
+ my $l = PublicInbox::Linkify->new;
+ my $rv .= join('', map { $l->linkify_1($_) } @$quot);
@$quot = ();
$rv = ascii_html($rv);
- return linkify_2(\%l, $rv) unless $do_anchor;
+ return $l->linkify_2($rv) unless $do_anchor;
my $nr = ++$$n;
- "<a\nid=q${part_nr}_$nr></a>" . linkify_2(\%l, $rv);
+ "<a\nid=q${part_nr}_$nr></a>" . $l->linkify_2($rv);
}
}
@@ -420,10 +384,10 @@ sub add_text_body {
}
# regular line, OK
- my %l;
- $cur = linkify_1(\%l, $cur);
+ my $l = PublicInbox::Linkify->new;
+ $cur = $l->linkify_1($cur);
$cur = ascii_html($cur);
- $s .= linkify_2(\%l, $cur);
+ $s .= $l->linkify_2($cur);
} else {
push @quot, $cur;
}
--
EW
^ permalink raw reply related [relevance 7%]
* [PATCH 0/2] linkification improvements
@ 2016-03-01 3:50 6% Eric Wong
2016-03-01 3:50 7% ` [PATCH 1/2] extract linkification code to a separate package Eric Wong
0 siblings, 1 reply; 2+ results
From: Eric Wong @ 2016-03-01 3:50 UTC (permalink / raw)
To: meta
We'll be reusing the linkification code in repobrowse :)
Eric Wong (2):
extract linkification code to a separate package
linkify: do not capture trailing '.' or ';' in URLs
MANIFEST | 2 ++
lib/PublicInbox/Linkify.pm | 65 ++++++++++++++++++++++++++++++++++++++++++++++
lib/PublicInbox/View.pm | 58 ++++++++---------------------------------
t/linkify.t | 26 +++++++++++++++++++
4 files changed, 104 insertions(+), 47 deletions(-)
create mode 100644 lib/PublicInbox/Linkify.pm
create mode 100644 t/linkify.t
^ permalink raw reply [relevance 6%]
Results 1-2 of 2 | reverse | options above
-- pct% links below jump to the message on this page, permalinks otherwise --
2016-03-01 3:50 6% [PATCH 0/2] linkification improvements Eric Wong
2016-03-01 3:50 7% ` [PATCH 1/2] extract linkification code to a separate package Eric Wong
Code repositories for project(s) associated with this public inbox
https://80x24.org/public-inbox.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).