From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 1B87A2141F for ; Tue, 5 Feb 2019 11:10:55 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 5/6] hlmod: support "```$LANG" blocks in text Date: Tue, 5 Feb 2019 11:10:52 +0000 Message-Id: <20190205111053.7155-6-e@80x24.org> In-Reply-To: <20190205111053.7155-1-e@80x24.org> References: <20190205111053.7155-1-e@80x24.org> List-Id: 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 | 21 ++++++++++++++++++++- t/hl_mod.t | 20 ++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/lib/PublicInbox/HlMod.pm b/lib/PublicInbox/HlMod.pm index 014d82f..36e3110 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 f2eb5f9..84a4b57 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], ":>\n", 'first line escaped'); + is($hl[1], "```perl\n", '2nd line preserved'); + like($hl[2], qr/