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