X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FHval.pm;h=39256ee01e0380bdfafd8c655265a82ceb796100;hb=c242a28351d3a9a39224d35031d71afc02993c7a;hp=cd3a4df34bec61bad715fbf1546dec1c74338d2e;hpb=1988d730c0088e8b1f6193650c7ee929df8a2ed7;p=public-inbox.git diff --git a/lib/PublicInbox/Hval.pm b/lib/PublicInbox/Hval.pm index cd3a4df3..39256ee0 100644 --- a/lib/PublicInbox/Hval.pm +++ b/lib/PublicInbox/Hval.pm @@ -10,7 +10,7 @@ use Encode qw(find_encoding); use PublicInbox::MID qw/mid_clean mid_escape/; use base qw/Exporter/; our @EXPORT_OK = qw/ascii_html obfuscate_addrs to_filename src_escape - to_attr from_attr/; + to_attr from_attr prurl/; my $enc_ascii = find_encoding('us-ascii'); # safe-ish acceptable filename pattern for portability @@ -84,7 +84,8 @@ sub raw { } } -sub prurl { +# returns a protocol-relative URL string +sub prurl ($$) { my ($env, $u) = @_; if (ref($u) eq 'ARRAY') { my $h = $env->{HTTP_HOST} // $env->{SERVER_NAME}; @@ -138,10 +139,12 @@ sub to_attr ($) { return if index($str, '//') >= 0; my $first = ''; + utf8::encode($str); # to octets if ($str =~ s/\A([^A-Ya-z])//ms) { # start with a letter $first = sprintf('Z%02x', ord($1)); } $str =~ s/([^A-Za-z0-9_\.\-])/$ESCAPES{$1}/egms; + utf8::decode($str); # allow wide chars $first . $str; } @@ -154,6 +157,7 @@ sub from_attr ($) { } $str =~ s!::([a-f0-9]{2})!chr(hex($1))!egms; $str =~ tr!:!/!; + utf8::decode($str); $first . $str; }