about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2019-02-05 05:24:39 +0000
committerEric Wong <e@80x24.org>2019-02-05 10:58:35 +0000
commit7826c91ef37f9b5fb5396e1168d84a6574385915 (patch)
tree6eb34d14c43702e9e9a9dba2e7aa37da824d12fc
parent60917f384645df7798a9b81ef26ca06df1986072 (diff)
downloadpublic-inbox-7826c91ef37f9b5fb5396e1168d84a6574385915.tar.gz
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.
-rw-r--r--lib/PublicInbox/HlMod.pm21
-rw-r--r--t/hl_mod.t20
2 files changed, 40 insertions, 1 deletions
diff --git a/lib/PublicInbox/HlMod.pm b/lib/PublicInbox/HlMod.pm
index 014d82fd..36e31106 100644
--- a/lib/PublicInbox/HlMod.pm
+++ b/lib/PublicInbox/HlMod.pm
@@ -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;
diff --git a/t/hl_mod.t b/t/hl_mod.t
index f2eb5f91..84a4b576 100644
--- a/t/hl_mod.t
+++ b/t/hl_mod.t
@@ -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;