about summary refs log tree commit homepage
path: root/lib/PublicInbox/Hval.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/PublicInbox/Hval.pm')
-rw-r--r--lib/PublicInbox/Hval.pm53
1 files changed, 53 insertions, 0 deletions
diff --git a/lib/PublicInbox/Hval.pm b/lib/PublicInbox/Hval.pm
new file mode 100644
index 00000000..26a2d0bb
--- /dev/null
+++ b/lib/PublicInbox/Hval.pm
@@ -0,0 +1,53 @@
+# Copyright (C) 2014, Eric Wong <normalperson@yhbt.net> and all contributors
+# License: AGPLv3 or later (https://www.gnu.org/licenses/agpl-3.0.txt)
+#
+# represents a header value in various forms
+package PublicInbox::Hval;
+use strict;
+use warnings;
+use fields qw(raw -as_utf8);
+use Encode qw(find_encoding);
+use CGI qw(escapeHTML);
+use URI::Escape qw(uri_escape);
+
+my $enc_utf8 = find_encoding('utf8');
+my $enc_ascii = find_encoding('us-ascii');
+my $enc_mime = find_encoding('MIME-Header');
+
+sub new {
+        my ($class, $raw) = @_;
+        my $self = fields::new($class);
+
+        # we never care about leading/trailing whitespace
+        $raw =~ s/\A\s*//;
+        $raw =~ s/\s*\z//;
+        $self->{raw} = $raw;
+        $self;
+}
+
+sub new_msgid {
+        my ($class, $raw) = @_;
+        $raw =~ s/\A<//;
+        $raw =~ s/>\z//;
+        $class->new($raw);
+}
+
+sub new_oneline {
+        my ($class, $raw) = @_;
+        $raw = '' unless defined $raw;
+        $raw =~ tr/\t\n / /s; # squeeze spaces
+        $raw =~ tr/\r//d; # kill CR
+        $class->new($raw);
+}
+
+sub as_utf8 {
+        my ($self) = @_;
+        $self->{-as_utf8} ||= $enc_utf8->encode($self->{raw});
+}
+
+sub ascii_html { $enc_ascii->encode(escapeHTML($_[0]), Encode::HTMLCREF) }
+
+sub as_html { ascii_html($_[0]->as_utf8) }
+sub as_href { ascii_html(uri_escape($_[0]->as_utf8)) }
+
+1;