]> Sergey Matveev's repositories - public-inbox.git/commitdiff
hlmod: support "```$LANG" blocks in text
authorEric Wong <e@80x24.org>
Tue, 5 Feb 2019 05:24:39 +0000 (05:24 +0000)
committerEric Wong <e@80x24.org>
Tue, 5 Feb 2019 10:58:35 +0000 (10:58 +0000)
This is compatible with Markdown; but we still keep the WYSIWYG
nature of plain-text with this.  This is only intended for use
with our documentation.  Enabling any type of Markdown support
for emails can lead to incompatibilities or interopability
problems with alternative implementations.

lib/PublicInbox/HlMod.pm
t/hl_mod.t

index 014d82fdbc52cb9293a96e0a8829154bb0e85ad3..36e311060dcf52bb41eed5f6a2cff38bbb2de006 100644 (file)
@@ -16,7 +16,7 @@ package PublicInbox::HlMod;
 use strict;
 use warnings;
 use highlight; # SWIG-generated stuff
-use PublicInbox::Hval qw(src_escape);
+use PublicInbox::Hval qw(src_escape ascii_html);
 my $hl;
 
 sub _parse_filetypes ($) {
@@ -127,4 +127,23 @@ sub do_hl_lang {
        \$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;
index f2eb5f918765729b2d496402fbf0ef2ed1e3218a..84a4b5766873ba733041c87819450bbfa9dc3fc5 100644 (file)
@@ -40,4 +40,24 @@ my $orig = $str;
        }
 }
 
+if ('experimental, only for help text') {
+       my $tmp = <<'EOF';
+:>
+```perl
+my $foo = 1 & 2;
+```
+:<
+EOF
+       $hls->do_hl_text(\$tmp);
+       my @hl = split(/^/m, $tmp);
+       is($hl[0], ":&gt;\n", 'first line escaped');
+       is($hl[1], "```perl\n", '2nd line preserved');
+       like($hl[2], qr/<span\b/, 'code highlighted');
+       like($hl[2], qr/&amp;/, 'ampersand escaped');
+       is($hl[3], "```\n", '4th line preserved');
+       is($hl[4], ":&lt;\n", '5th line escaped');
+       is(scalar(@hl), 5, 'no extra line');
+
+}
+
 done_testing;