From 535abe2ba725d00c0057d645e9bd268ec5380227 Mon Sep 17 00:00:00 2001 From: Tim Allen Date: Tue, 18 Sep 2018 18:55:24 +1000 Subject: [PATCH 1/2] markdown.kak: Clean up code-block and code-span formatting. Previously, a code block was anything between triple-backtics, including inline blocks: some text ``` not a codeblock, but highlighted as one ``` other text and even if the closing backticks had the wrong indent: ``` this is a code block containing a triple backtick ``` this is still a code block, but Kakoune thinks otherwise ``` Now we use the -match-capture flag to ensure the start and end fences have exactly the same indent. Previously, the generic code-block region was defined first, which meant that it took priority over all the language-specific highlighters. Now we define the generic code-block highlighting *after* the others, which fixes #2304. Previously, code-spans were defined as ordinary inline markup, but in Markdown ordinary formatting doesn't work inside code-spans. Therefore, they are now regions unto themselves, defined according to section 6.3 of the CommonMark spec , which addresses a comment on #2111. --- rc/base/markdown.kak | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/rc/base/markdown.kak b/rc/base/markdown.kak index 7b42d580..6fcc4624 100644 --- a/rc/base/markdown.kak +++ b/rc/base/markdown.kak @@ -13,7 +13,6 @@ hook global BufCreate .*[.](markdown|md|mkd) %{ add-highlighter shared/markdown regions add-highlighter shared/markdown/content default-region group -add-highlighter shared/markdown/code region ``` ``` fill meta evaluate-commands %sh{ languages=" @@ -23,13 +22,19 @@ evaluate-commands %sh{ sass scala scss sh swift tupfile typescript yaml " for lang in ${languages}; do - printf 'add-highlighter shared/markdown/%s region ```\h*%s\\b ``` regions\n' "${lang}" "${lang}" + printf 'add-highlighter shared/markdown/%s region -match-capture ^(\h*)```\h*%s\\b ^(\h*)``` regions\n' "${lang}" "${lang}" printf 'add-highlighter shared/markdown/%s/ default-region fill meta\n' "${lang}" [ "${lang}" = kak ] && ref=kakrc || ref="${lang}" printf 'add-highlighter shared/markdown/%s/inner region \A```[^\\n]*\K (?=```) ref %s\n' "${lang}" "${ref}" done } +add-highlighter shared/markdown/codeblock region -match-capture \ + ^(\h*)```\h* \ + ^(\h*)```\h*$ \ + fill meta +add-highlighter shared/markdown/codespan region -match-capture (`+) (`+) fill mono + # Setext-style header add-highlighter shared/markdown/content/ regex (\A|\n\n)[^\n]+\n={2,}\h*\n\h*$ 0:title add-highlighter shared/markdown/content/ regex (\A|\n\n)[^\n]+\n-{2,}\h*\n\h*$ 0:header @@ -39,8 +44,6 @@ add-highlighter shared/markdown/content/ regex ^(#+)(\h+)([^\n]+) 1:header add-highlighter shared/markdown/content/ regex ^\h?((?:[\s\t]+)?[-\*])\h+[^\n]*(\n\h+[^-\*]\S+[^\n]*\n)*$ 0:list 1:bullet add-highlighter shared/markdown/content/ regex \B\+[^\n]+?\+\B 0:mono -add-highlighter shared/markdown/content/ regex [^`](`([^\s`]|([^\s`](\n?[^\n`])*[^\s`]))`)[^`] 1:mono -add-highlighter shared/markdown/content/ regex [^`](``([^\s`]|([^\s`](\n?[^\n`])*[^\s`]))``)[^`] 1:mono add-highlighter shared/markdown/content/ regex [^*](\*([^\s*]|([^\s*](\n?[^\n*])*[^\s*]))\*)[^*] 1:italic add-highlighter shared/markdown/content/ regex [^_](_([^\s_]|([^\s_](\n?[^\n_])*[^\s_]))_)[^_] 1:italic add-highlighter shared/markdown/content/ regex [^*](\*\*([^\s*]|([^\s*](\n?[^\n*])*[^\s*]))\*\*)[^*] 1:bold From 9e142c66436ce716fa5f26647ad843a1dc527a3a Mon Sep 17 00:00:00 2001 From: Tim Allen Date: Tue, 18 Sep 2018 19:21:28 +1000 Subject: [PATCH 2/2] markdown.kak: Use lookahead/lookbehind assertions for formatting spans. Previously, one of the syntaxes for italic was (greatly summarized) something like this: [^_]_[^_]+_[^_] That is to say, the regex matched the blanks on both sides of the italic span, as well as the actual span content. That means that if you had consecutive italic words: _some_ _italic_ _words_ ...only the odd-numbered words would be highlighted: the space after "_some_" was counted as part of that span, so it wasn't available as part of "_italic_" and therefore "_italic_" wouldn't be highlighted. Likewise, if the first word in a buffer was italic, it wouldn't be highlighted because the first underscore was not preceded by a non-underscore character! Now we use lookahead/lookbehind assertions, which don't count as part of the matched span, so consecutive spans don't interfere with one another. Fixes #2111. --- rc/base/markdown.kak | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rc/base/markdown.kak b/rc/base/markdown.kak index 6fcc4624..d7dc65e2 100644 --- a/rc/base/markdown.kak +++ b/rc/base/markdown.kak @@ -44,10 +44,10 @@ add-highlighter shared/markdown/content/ regex ^(#+)(\h+)([^\n]+) 1:header add-highlighter shared/markdown/content/ regex ^\h?((?:[\s\t]+)?[-\*])\h+[^\n]*(\n\h+[^-\*]\S+[^\n]*\n)*$ 0:list 1:bullet add-highlighter shared/markdown/content/ regex \B\+[^\n]+?\+\B 0:mono -add-highlighter shared/markdown/content/ regex [^*](\*([^\s*]|([^\s*](\n?[^\n*])*[^\s*]))\*)[^*] 1:italic -add-highlighter shared/markdown/content/ regex [^_](_([^\s_]|([^\s_](\n?[^\n_])*[^\s_]))_)[^_] 1:italic -add-highlighter shared/markdown/content/ regex [^*](\*\*([^\s*]|([^\s*](\n?[^\n*])*[^\s*]))\*\*)[^*] 1:bold -add-highlighter shared/markdown/content/ regex [^_](__([^\s_]|([^\s_](\n?[^\n_])*[^\s_]))__)[^_] 1:bold +add-highlighter shared/markdown/content/ regex (? 0:link add-highlighter shared/markdown/content/ regex ^\[[^\]\n]*\]:\h*([^\n]*) 1:link add-highlighter shared/markdown/content/ regex ^\h*(>\h*)+ 0:comment