X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FHlMod.pm;h=9016db3a03fc949eb0756d20f02037e6a8d58230;hb=af0b0fb7a454470a32c452119d0392e0dedb3fe1;hp=13f27d19cb40b85e8d5bbc33a22525c31576a551;hpb=8eb2c4f7c0aed11810280c6dfa63f75fd961e3cd;p=public-inbox.git
diff --git a/lib/PublicInbox/HlMod.pm b/lib/PublicInbox/HlMod.pm
index 13f27d19..9016db3a 100644
--- a/lib/PublicInbox/HlMod.pm
+++ b/lib/PublicInbox/HlMod.pm
@@ -1,4 +1,4 @@
-# Copyright (C) 2019 all contributors
+# Copyright (C) 2019-2021 all contributors
# License: AGPL-3.0+
# 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;