From 882284387895d0504592ff4f5be7d9927181b1ca Mon Sep 17 00:00:00 2001 From: =?utf8?q?Paul=20H=C3=A4nsch?= Date: Wed, 30 Aug 2023 17:20:25 +0200 Subject: [PATCH] unified list code --- markdown.awk | 65 +++++++++++++++++++++++----------------------------- 1 file changed, 29 insertions(+), 36 deletions(-) diff --git a/markdown.awk b/markdown.awk index 57a04e9..4b180eb 100755 --- a/markdown.awk +++ b/markdown.awk @@ -691,38 +691,12 @@ function _block( block, LOCAL, st, len, text, title, attrib, href, guard, code, return "\n
\n" _dlist( list ) "
\n" _block( block ); # Unordered list - } else if ( match( block, "(^|\n) ? ? ?[-+*][ \t][^\n]+(\n|$)" \ - "(([ \t]*\n)* ? ? ?[-+*][ \t][^\n]+(\n|$)" \ - "|([ \t]*\n)*( ? ? ?\t| +)[^\n]+(\n|$)" \ - "|[^\n \t][^\n]+(\n|$))*" ) ) { - st = RSTART; len = RLENGTH; list = substr( block, RSTART, RLENGTH); - sub("^\n", "", list); match(list, "^ ? ? ?[-+*]"); indent = RLENGTH; - gsub( "(^|\n) {0," indent - 1 "}", "\n", list); sub("^\n", "", list); - - text = substr(block, 1, st - 1); block = substr(block, st + len); - if (match( list, "\n([0-9]+\\.|#\\.)[ \t]" )) { - block = substr(list, RSTART + 1) block; - list = substr(list, 1, RSTART); - } - - return _block( text ) "\n" _block( block ); + } else if ( text = _startlist( block, "ul", "[-+*]", "([0-9]+\\.|#\\.)") ) { + return text; # Ordered list - } else if ( match( block, "(^|\n) ? ? ?([0-9]+\\.|#\\.)[ \t][^\n]+(\n|$)" \ - "(([ \t]*\n)* ? ? ?([0-9]+\\.|#\\.)[ \t][^\n]+(\n|$)" \ - "|([ \t]*\n)*( ? ? ?\t| +)[^\n]+(\n|$)" \ - "|[^\n \t][^\n]+(\n|$))*" ) ) { - st = RSTART; len = RLENGTH; list = substr( block, RSTART, RLENGTH); - sub("^\n", "", list); match(list, "^ ? ? ?[0-9#]"); indent = RLENGTH; - gsub( "(^|\n) {0," indent - 1 "}", "\n", list); sub("^\n", "", list); - - text = substr(block, 1, st - 1); block = substr(block, st + len); - if (match( list, "\n[-+*][ \t]" )) { - block = substr(list, RSTART + 1) block; - list = substr(list, 1, RSTART); - } - - return _block( text ) "
    \n" _list( list, "([0-9]+\\.|#\\.)" ) "
\n" _block( block ); + } else if ( text = _startlist( block, "ol", "([0-9]+\\.|#\\.)", "[-+*]") ) { + return text; # Split paragraphs } else if ( match( block, /(^|\n)[[:space:]]*(\n|$)/) ) { @@ -741,17 +715,36 @@ function _block( block, LOCAL, st, len, text, title, attrib, href, guard, code, } } +function _startlist(block, type, mark, exclude, LOCAL, st, len, list, indent, text) { + if (match( block, "(^|\n) ? ? ?" mark "[ \t][^\n]+(\n|$)" \ + "(([ \t]*\n)* ? ? ?" mark "[ \t][^\n]+(\n|$)" \ + "|([ \t]*\n)*( ? ? ?\t| +)[^\n]+(\n|$)" \ + "|[^\n \t][^\n]+(\n|$))*" ) ) { + st = RSTART; len = RLENGTH; list = substr( block, RSTART, RLENGTH); + + sub("^\n", "", list); match(list, "^ ? ? ?"); indent = RLENGTH; + gsub( "(^|\n) {0," indent - 1 "}", "\n", list); sub("^\n", "", list); + + text = substr(block, 1, st - 1); block = substr(block, st + len); + if (match( list, "\n" exclude "[ \t]" )) { + block = substr(list, RSTART + 1) block; + list = substr(list, 1, RSTART); + } + + return _block( text ) "<" type ">\n" _list( list, mark ) "\n" _block( block ); + } else return 0; +} + function _list (block, mark, p, LOCAL, len, st, text, indent, task) { if ( match(block, "^([ \t]*\n)*$")) return; + match(block, "^" mark "[ \t]"); indent = RLENGTH; sub("^" mark "[ \t]", "", block); + if (match(block, /\n[ \t]*\n/)) p = 1; - match( block, "\n" mark "[ \t][^\n]+(\n|$)" \ - "(([ \t]*\n)* ? ? ?" mark "[ \t][^\n]+(\n|$)" \ - "|([ \t]*\n)*( ? ? ?\t| +)[^\n]+(\n|$)" \ - "|[^\n \t][^\n]+(\n|$))*"); - (RLENGTH == -1) ? st = length(block) + 1 : st = RSTART; + match( block, "\n" mark "[ \t][^\n]+(\n|$)" ); + st = (RLENGTH == -1) ? length(block) + 1 : RSTART; text = substr(block, 1, st); block = substr(block, st + 1); gsub("\n {0," indent "}", "\n", text); @@ -761,7 +754,7 @@ function _list (block, mark, p, LOCAL, len, st, text, indent, task) { match( text, /^\[\/\]/ ) ? "
  • " : \ match( text, /^\[\?\]/ ) ? "
  • " : \ match( text, /^\[[xX]\]/) ? "
  • " : "
  • "; - sub(/^\[[-? /xX]\]/, "", text); + sub(/^\[[-? \/xX]\]/, "", text); text = _nblock( text ); if ( ! p && match( text, "^

    (]|\n$" )) -- 2.39.2