From: Simon McVittie Date: Thu, 8 Mar 2018 23:36:31 +0000 (+0000) Subject: mdwn: Automatically detect which libdiscount flags to use X-Git-Tag: 3.20180311~5 X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/commitdiff_plain/e3279c8b508ce88ea2b23f99a1d8a4295fb06dd9 mdwn: Automatically detect which libdiscount flags to use Unconditionally passing arbitrary numbers as flags turns out to be a bad idea, because some of the "unused" values have historically had side-effects internal to libdiscount. Detect whether the known flags work by rendering short Markdown snippets the first time we htmlize, checking whether each known flag is both necessary and sufficient. Signed-off-by: Simon McVittie --- diff --git a/IkiWiki/Plugin/mdwn.pm b/IkiWiki/Plugin/mdwn.pm index 66116ae01..eefa29a97 100644 --- a/IkiWiki/Plugin/mdwn.pm +++ b/IkiWiki/Plugin/mdwn.pm @@ -89,6 +89,55 @@ sub htmlize (@) { (! exists $config{nodiscount} || ! $config{nodiscount})) { eval q{use Text::Markdown::Discount}; if (! $@) { + my $markdown = \&Text::Markdown::Discount::markdown; + my $always_flags = 0; + + # Disable Pandoc-style % Title, % Author, % Date + # Use the meta plugin instead + $always_flags |= Text::Markdown::Discount::MKD_NOHEADER(); + + # Disable Unicodification of quote marks, em dashes... + # Use the typography plugin instead + $always_flags |= Text::Markdown::Discount::MKD_NOPANTS(); + + # Workaround for discount's eliding of ', 0) !~ '', 0x00400000) =~ m{}) { + $always_flags |= 0x00400000; + } + + # Enable fenced code blocks in libmarkdown >= 2.2.0 + # https://bugs.debian.org/888055 + if (Text::Markdown::Discount->can('MKD_FENCEDCODE')) { + $always_flags |= Text::Markdown::Discount::MKD_FENCEDCODE(); + } + elsif ($markdown->("~~~\nx\n~~~", 0) !~ m{("~~~\nx\n~~~", 0x02000000) =~ m{
+ if (Text::Markdown::Discount->can('MKD_DLEXTRA')) { + $always_flags |= Text::Markdown::Discount::MKD_DLEXTRA(); + } + elsif ($markdown->("term\n: def\n", 0) !~ m{
} && + $markdown->("term\n: def\n", 0x01000000) =~ m{
}) { + $always_flags |= 0x01000000; + } + + # Allow dashes and underscores in tag names + if (Text::Markdown::Discount->can('MKD_GITHUBTAGS')) { + $always_flags |= Text::Markdown::Discount::MKD_GITHUBTAGS(); + } + elsif ($markdown->('', 0) !~ m{('', 0x08000000) =~ m{ blocks. - # https://rt.cpan.org/Ticket/Display.html?id=74016 - if (Text::Markdown::Discount->can("MKD_NOSTYLE")) { - $flags |= Text::Markdown::Discount::MKD_NOSTYLE(); - } - else { - # This is correct for the libmarkdown.so.2 ABI - $flags |= 0x00400000; - } - - # Enable fenced code blocks in libmarkdown >= 2.2.0 - # https://bugs.debian.org/888055 - if (Text::Markdown::Discount->can("MKD_FENCEDCODE")) { - $flags |= Text::Markdown::Discount::MKD_FENCEDCODE(); - } - else { - $flags |= 0x02000000; - } - - # PHP Markdown Extra-style term\n: definition ->
- if (Text::Markdown::Discount->can("MKD_DLEXTRA")) { - $flags |= Text::Markdown::Discount::MKD_DLEXTRA(); - } - else { - $flags |= 0x01000000; - } - - # Allow dashes and underscores in tag names - if (Text::Markdown::Discount->can("MKD_GITHUBTAGS")) { - $flags |= Text::Markdown::Discount::MKD_GITHUBTAGS(); - } - else { - $flags |= 0x08000000; - } - return Text::Markdown::Discount::markdown($t, $flags); } } diff --git a/doc/bugs/discount_stopped_rendering_markdown_links.mdwn b/doc/bugs/discount_stopped_rendering_markdown_links.mdwn index 1d70c926e..cfe544b02 100644 --- a/doc/bugs/discount_stopped_rendering_markdown_links.mdwn +++ b/doc/bugs/discount_stopped_rendering_markdown_links.mdwn @@ -34,3 +34,8 @@ Some guesses: > Orthogonally, pkgsrc should probably use an up-to-date version of Discount, and > [we already know that Text::Markdown::Discount needs updating](https://rt.cpan.org/Public/Bug/Display.html?id=124188). > --[[smcv]] + +>> This should be [[fixed|done]] in current git. The mdwn module now +>> detects what your version of Discount supports by trying several +>> short HTML fragments that render differently under the different +>> flags. --[[smcv]] diff --git a/t/mdwn.t b/t/mdwn.t index 93b8bd8e9..ca3180139 100755 --- a/t/mdwn.t +++ b/t/mdwn.t @@ -8,6 +8,7 @@ BEGIN { use_ok("IkiWiki"); } %config=IkiWiki::defaultconfig(); $config{srcdir}=$config{destdir}="/dev/null"; +$config{disable_plugins}=["htmlscrubber"]; IkiWiki::loadplugins(); IkiWiki::checkconfig(); @@ -41,4 +42,25 @@ like(IkiWiki::htmlize("foo", "foo", "mdwn", "This works[^1]\n\n[^1]: Sometimes it doesn't.\n"), qr{

This works.*

Definition list
\s*
A useful HTML structure
}s, + "definition lists are enabled by default"); + like(IkiWiki::htmlize("foo", "foo", "mdwn", + "```\n#!/bin/sh\n```\n"), + qr{
\s*\s*[#]!/bin/sh\s*\s*
}s, + "code blocks are enabled by default"); + like(IkiWiki::htmlize("foo", "foo", "mdwn", + ""), + qr{}, + "GitHub tag name extensions are enabled by default"); + like(IkiWiki::htmlize("foo", "foo", "mdwn", + ""), + qr{}, + "Styles are not stripped by default"); +} + done_testing();