X-Git-Url: http://git.plutz.net/?a=blobdiff_plain;f=markdown.awk;h=92b32fc2d2d462bc30f4069934f48f1e87c6ad70;hb=8e5ffff1d6ed3d99361ffcfdccc1cd21f5d6d813;hp=eb40210c9bc78c8cacadda40389c73df2e8d6d6b;hpb=cc08744f66835d9ad6e9ec7f2c3fa9ed17e712ba;p=cgilite diff --git a/markdown.awk b/markdown.awk index eb40210..92b32fc 100755 --- a/markdown.awk +++ b/markdown.awk @@ -5,6 +5,20 @@ # Meant to support all features of John Grubers basic Markdown # + a number of common extensions, mostly inspired by Pandoc Markdown +# Copyright 2021 - 2023 Paul Hänsch +# +# Permission to use, copy, modify, and/or distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED “AS IS” AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +# SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +# IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + # Supported Features / TODO: # ========================== # [x] done [ ] todo [-] not planned ? unsure @@ -41,7 +55,7 @@ # - [x] Automatic
-wrapping (custom) # - ? Heading identifiers (php md, pandoc) # - [x] Heading attributes (custom) -# - [ ]
ends section +# - [ ]
terminates section # - [x] Automatic heading identifiers (custom) # - [x] Fenced code blocks (php md, pandoc) # - [x] Fenced code attributes @@ -690,39 +704,23 @@ function _block( block, LOCAL, st, len, text, title, attrib, href, guard, code, list = substr( block, 1, RLENGTH); block = substr( block, RLENGTH + 1); 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 ); - - # 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 ); + # Unordered list types + } else if ( text = _startlist( block, "ul", "-", "([+*]|[0-9]+\\.|#\\.|[0-9]+\\)|#\\))") ) { + return text; + } else if ( text = _startlist( block, "ul", "\\+", "([-*]|[0-9]+\\.|#\\.|[0-9]+\\)|#\\))") ) { + return text; + } else if ( text = _startlist( block, "ul", "\\*", "([-+]|[0-9]+\\.|#\\.|[0-9]+\\)|#\\))") ) { + return text; + + # Ordered list types + } else if ( text = _startlist( block, "ol", "[0-9]+\\.", "([-+*]|#\\.|[0-9]+\\)|#\\))") ) { + return text; + } else if ( text = _startlist( block, "ol", "[0-9]+\\)", "([-+*]|[0-9]+\\.|#\\.|#\\))") ) { + return text; + } else if ( text = _startlist( block, "ol", "#\\.", "([-+*]|[0-9]+\\.|[0-9]+\\)|#\\))") ) { + return text; + } else if ( text = _startlist( block, "ol", "#\\)", "([-+*]|[0-9]+\\.|#\\.|[0-9]+\\))") ) { + return text; # Split paragraphs } else if ( match( block, /(^|\n)[[:space:]]*(\n|$)/) ) { @@ -741,16 +739,37 @@ function _block( block, LOCAL, st, len, text, title, attrib, href, guard, code, } } -function _list (block, mark, LOCAL, len, st, text, indent, task) { +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, st, len); + + sub("^\n", "", list); match(list, "^ ? ? ?"); indent = RLENGTH; + gsub( "(^|\n) {0," indent "}", "\n", list); sub("^\n", "", list); + + text = substr(block, 1, st - 1); block = substr(block, st + len); + if (match(text, /\n[[:space:]]*\n/)) return 0; + 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); - 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; + if (match(block, /\n[ \t]*\n/)) p = 1; + + 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); @@ -760,13 +779,13 @@ function _list (block, mark, LOCAL, len, st, text, indent, task) { match( text, /^\[\/\]/ ) ? "
  • " : \ match( text, /^\[\?\]/ ) ? "
  • " : \ match( text, /^\[[xX]\]/) ? "
  • " : "
  • "; - sub(/^\[[-? /xX]\]/, "", text); + sub(/^\[[-? \/xX]\]/, "", text); text = _nblock( text ); - if (match( text, "^

    (]|\n$" )) + if ( ! p && match( text, "^

    (]|\n$" )) gsub( "(^

    |

    \n$)", "", text); - return task text "
  • \n" _list(block, mark); + return task text "\n" _list(block, mark, p); } function _dlist (block, LOCAL, len, st, text, indent, p) {