]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/HlMod.pm
treewide: run update-copyrights from gnulib for 2019
[public-inbox.git] / lib / PublicInbox / HlMod.pm
index 13f27d19cb40b85e8d5bbc33a22525c31576a551..de285fc2a6f665b9bc17d829cb2daf89d8f286ff 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (C) 2019 all contributors <meta@public-inbox.org>
+# Copyright (C) 2019-2020 all contributors <meta@public-inbox.org>
 # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
 
 # I have no idea how stable or safe this is for handling untrusted
@@ -16,10 +16,11 @@ package PublicInbox::HlMod;
 use strict;
 use warnings;
 use highlight; # SWIG-generated stuff
+use PublicInbox::Hval qw(src_escape ascii_html);
 my $hl;
 
 sub _parse_filetypes ($) {
-       my $ft_conf = $_[0]->searchFile('filetypes.conf') or
+       my $ft_conf = $_[0]->getFiletypesConfPath('filetypes') or
                                die 'filetypes.conf not found by highlight';
        open my $fh, '<', $ft_conf or die "failed to open($ft_conf): $!";
        local $/;
@@ -122,7 +123,27 @@ sub do_hl_lang {
        # know that, so ensure it's marked as UTF-8 even if it isnt...
        my $out = $gen->generateString($$str);
        utf8::decode($out);
+       src_escape($out);
        \$out;
 }
 
+# Highlight text, but support Markdown "```$LANG" notation
+# while preserving WYSIWYG of plain-text documentation.
+# This is NOT to be enabled by default or encouraged for parsing
+# emails, since it is NOT stable and can lead to standards
+# proliferation of email.
+sub do_hl_text {
+       my ($self, $str) = @_;
+
+       $$str = join('', map {
+               if (/\A(``` ?)(\w+)\s*?\n(.+)(^```\s*)\z/sm) {
+                       my ($pfx, $lang, $code, $post) = ($1, $2, $3, $4);
+                       my $hl = do_hl_lang($self, \$code, $lang) || \$code;
+                       $pfx . $lang . "\n" . $$hl . $post;
+               } else {
+                       ascii_html($_);
+               }
+       } split(/(^``` ?\w+\s*?\n.+?^```\s*$)/sm, $$str));
+}
+
 1;