X-Git-Url: https://git.plutz.net/?a=blobdiff_plain;f=markdown.awk;h=361e6005c3fc42fa5e1f81859d69ec59d0c0a138;hb=a76f6a5931782adbae717678f8f92569ed0d5bcb;hp=785ece87fbad731d7d4de1343752a2a63ccc9632;hpb=cd49a5ce71b79c56477dc351607484b0718fa594;p=cgilite
diff --git a/markdown.awk b/markdown.awk
index 785ece8..361e600 100755
--- a/markdown.awk
+++ b/markdown.awk
@@ -43,6 +43,7 @@
# Extensions - Block elements:
# ----------------------------
# - ? Heading identifiers (php md, pandoc)
+# - [x] Automatic heading identifiers (custom)
# - [x] Fenced code blocks (php md, pandoc)
# - [-] Fenced code attributes
# - [ ] Tables
@@ -51,7 +52,7 @@
# - ? Grid table (pandoc)
# - ? Pipe table (php md pandoc)
# - [x] Line blocks (pandoc)
-# - [ ] Task lists (pandoc)
+# - [x] Task lists (pandoc)
# - [ ] Definition lists (php md, pandoc)
# - [-] Numbered example lists (pandoc)
# - [-] Metadata blocks (pandoc)
@@ -273,11 +274,6 @@ function _block( block, LOCAL, st, len, hlvl, htxt, guard, code, indent ) {
} else if ( AllowHTML && match( block, /^ ? ? ?(<\/[A-Za-z][A-Za-z0-9-]*[[:space:]]*>|<[A-Za-z][A-Za-z0-9-]*([[:space:]]+[A-Za-z_:][A-Za-z0-9_\.:-]*([[:space:]]*=[[:space:]]*([[:space:]"'=<>`]+|"[^"]*"|'[^']*'))?)*[[:space:]]*\/?>)([[:space:]]*\n)([^\n]|\n[ \t]*[^\n])*(\n[[:space:]]*\n|$)/) ) {
len = RLENGTH; st = RSTART;
return substr(block, st, len) _block(substr(block, st + len));
-
- # Horizontal rule
- } else if ( match( block, /(^|\n) ? ? ?((\* *){3,}|(- *){3,}|(_ *){3,})($|\n)/) ) {
- len = RLENGTH; st = RSTART;
- return _block(substr(block, 1, st - 1)) "
\n" _block(substr(block, st + len));
# Blockquote (leading >)
} else if ( match( block, /^> /) ) {
@@ -347,23 +343,32 @@ function _block( block, LOCAL, st, len, hlvl, htxt, guard, code, indent ) {
# First Order Heading
} else if ( match( block, /^[^\n]+\n===+(\n|$)/ ) ) {
len = RLENGTH;
- return "" inline( gensub( /\n.*$/, "", "g", block ) ) "
\n\n" \
+ HL[1]++; HL[2] = 0; HL[3] = 0; HL[4] = 0; HL[5] = 0; HL[6] = 0;
+ return "" inline( gensub( /\n.*$/, "", "g", block ) ) "
\n\n" \
_block( substr( block, len + 1 ) );
# Second Order Heading
} else if ( match( block, /^[^\n]+\n---+(\n|$)/ ) ) {
len = RLENGTH;
- return "" inline( gensub( /\n.*$/, "", "g", block ) ) "
\n\n" \
+ HL[2]++; HL[3] = 0; HL[4] = 0; HL[5] = 0; HL[6] = 0;
+ return "" inline( gensub( /\n.*$/, "", "g", block ) ) "
\n\n" \
_block( substr( block, len + 1) );
# Nth Order Heading
- } else if ( match( block, /^#{1,6}[[:space:]]*[^\n]+([[:space:]]*#*)(\n|$)/ ) ) {
+ } else if ( match( block, /^#{1,6}[ \t]*[^\n]+([ \t]*#*)(\n|$)/ ) ) {
len = RLENGTH;
hlvl = length( gensub( /^(#{1,6}).*$/, "\\1", "g", block ) );
- htxt = gensub( /[[:space:]]*#*$/, "", "1", gensub( /^#{1,6}[[:space:]]*([^\n]+)([[:space:]]*#*)\n.*$/, "\\1", "g", block ) )
- return "" inline( htxt ) "\n\n" \
+ htxt = gensub(/^#{1,6}[ \t]*(([^ \t\n]+|[ \t]+[^ \t\n#]|[ \t]+#+[^\n#])+)([ \t]*#*)(\n.*)?$/, "\\1", 1, block);
+ HL[hlvl]++; for ( n = hlvl + 1; n < 7; n++) { HL[n] = 0;}
+ hid = HL[1]; for ( n = 2; n <= hlvl; n++) { hid = hid "." HL[n] ; }
+ return "" inline( htxt ) "\n\n" \
_block( substr( block, len + 1) );
+ # Horizontal rule
+ } else if ( match( block, /(^|\n) ? ? ?((\* *){3,}|(- *){3,}|(_ *){3,})($|\n)/) ) {
+ len = RLENGTH; st = RSTART;
+ return _block(substr(block, 1, st - 1)) "
\n" _block(substr(block, st + len));
+
# Plain paragraph
} else {
match( block, /(^|\n)[[:space:]]*(\n|$)/ ) || match( block, /$/ );
@@ -396,6 +401,12 @@ function _list( block, last, LOCAL, p) {
sub( /<\/p>\n/, "", p );
}
sub( /\n$/, "", p );
+
+ # Task List (pandoc)
+ if ( p ~ /^\[ \].*/ ) { p = "" substr(p, 4); }
+ else if ( p ~ /^\[[xX]\].*/ ) { p = "" substr(p, 4); }
+ else if ( p ~ /^\[ \].*/ ) { p = "
" substr(p, 7); }
+ else if ( p ~ /^
\[[xX]\].*/ ) { p = "
" substr(p, 7); }
return "
" p "\n" _list( block, last );
}
@@ -403,9 +414,12 @@ BEGIN {
# Global Vars
file = ""; rl_href[""] = ""; rl_title[""] = "";
if (ENVIRON["MD_HTML"] == "true") { AllowHTML = "true"; }
+ HL[1] = 0; HL[2] = 0; HL[3] = 0; HL[4] = 0; HL[5] = 0; HL[6] = 0;
# Buffering of full file ist necessary, e.g. to find reference links
while (getline) { file = file $0 "\n"; }
+ # Clean up MS-DOS line breaks
+ gsub(/\r\n/, "\n", file);
# Fill array of reference links
f = file; rl_id;