X-Git-Url: https://git.plutz.net/?a=blobdiff_plain;ds=sidebyside;f=markdown.awk;h=d28c7cfc760a2ed6c9fde6e040a2bf981c008b38;hb=e5e180a2c21f271b87e82a8e4894f63b5bf2af34;hp=24235f613bcc28666b635eb6b1c75d02481d8618;hpb=fa3afea3582cebca84678d4592ad739df6fd3e0d;p=cgilite
diff --git a/markdown.awk b/markdown.awk
index 24235f6..d28c7cf 100755
--- a/markdown.awk
+++ b/markdown.awk
@@ -43,8 +43,9 @@
# Extensions - Block elements:
# ----------------------------
# - ? Heading identifiers (php md, pandoc)
+# - [x] Automatic heading identifiers (custom)
# - [x] Fenced code blocks (php md, pandoc)
-# - [-] Fenced code attributes
+# - [x] Fenced code attributes
# - [ ] Tables
# - ? Simple table (pandoc)
# - ? Multiline table (pandoc)
@@ -55,7 +56,7 @@
# - [ ] Definition lists (php md, pandoc)
# - [-] Numbered example lists (pandoc)
# - [-] Metadata blocks (pandoc)
-# - [-] Fenced Divs (pandoc)
+# - [x] Fenced Divs (pandoc)
#
# Extensions - Inline elements:
# ----------------------------
@@ -144,11 +145,11 @@ function inline( line, LOCAL, len, code, href, guard ) {
id = gensub(/^\[([^\n]+)\] ?\[([^\n]*)\].*/, "\\2", 1, line);
if ( ! id ) id = text;
if ( rl_href[id] && rl_title[id] ) {
- return "" inline(text) "" inline( substr( line, len + 1) );
+ return "" inline(text) "" inline( substr( line, len + 1) );
} else if ( rl_href[id] ) {
- return "" inline(text) "" inline( substr( line, len + 1) );
+ return "" inline(text) "" inline( substr( line, len + 1) );
} else {
- return "" substr(line, 1, len) inline( substr(line, len + 1) );
+ return "" HTML(substr(line, 1, len)) inline( substr(line, len + 1) );
}
# inline images
@@ -170,11 +171,11 @@ function inline( line, LOCAL, len, code, href, guard ) {
id = gensub(/^!\[([^\n]+)\] ?\[([^\n]*)\].*/, "\\2", 1, line);
if ( ! id ) id = text;
if ( rl_href[id] && rl_title[id] ) {
- return "" inline( substr( line, len + 1) );
+ return "
" inline( substr( line, len + 1) );
} else if ( rl_href[id] ) {
- return "
" inline( substr( line, len + 1) );
+ return "
" inline( substr( line, len + 1) );
} else {
- return "" substr(line, 1, len) inline( substr(line, len + 1) );
+ return "" HTML(substr(line, 1, len)) inline( substr(line, len + 1) );
}
# ~~strikeout~~ (pandoc)
@@ -194,7 +195,7 @@ function inline( line, LOCAL, len, code, href, guard ) {
# ignore embedded underscores (pandoc, php md)
} else if ( match(line, "^[[:alnum:]](__|_)") ) {
- return substr( line, 1, RLENGTH) inline( substr(line, RLENGTH + 1) );
+ return HTML(substr( line, 1, RLENGTH)) inline( substr(line, RLENGTH + 1) );
# __strong__$
} else if ( match(line, "^__(([^_[:space:]]|" ieu ")|([^_[:space:]]|" ieu ")(" nu "|" ieu ")*([^_[:space:]]|" ieu "))__$") ) {
@@ -226,6 +227,11 @@ function inline( line, LOCAL, len, code, href, guard ) {
len = RLENGTH;
return "" inline( substr( line, 2, len - 2 ) ) "" inline( substr( line, len + 1 ) );
+ # Macros
+ } else if ( AllowMacros && match( line, /^<<([^>]|>[^>])+>>/) ) {
+ len = RLENGTH;
+ return macro( substr( line, 3, len - 4 ) ) inline(substr(line, len + 1));
+
# Verbatim inline HTML
} else if ( AllowHTML && match( line, /^(|<\?([^\?]|\?[^>])*\?>|]*>|])*\]\]>|<\/[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:]]*\/?>)/) ) {
len = RLENGTH;
@@ -246,7 +252,7 @@ function inline( line, LOCAL, len, code, href, guard ) {
}
}
-function _block( block, LOCAL, st, len, hlvl, htxt, guard, code, indent ) {
+function _block( block, LOCAL, st, len, hlvl, htxt, guard, code, indent, attrib ) {
gsub( /^\n+|\n+$/, "", block );
if ( block == "" ) {
@@ -273,11 +279,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)) "
" HTML( code ) "
\n" \
_block( substr( block, len + 1 ) );
+ # Fenced Divs (pandoc, custom)
+ } else if ( match( block, /^(:::+)/ ) ) {
+ guard = substr( block, 1, RLENGTH );
+ code = gensub(/^[^\n]+\n/, "", 1, block);
+ attrib = gensub(/^:::+[ \t]*\{?[ \t]*([^\}\n]*)\}?[ \t]*\n.*$/, "\\1", 1, block);
+ gsub(/[^a-zA-Z0-9_-]+/, " ", attrib);
+ gsub(/(^ | $)/, "", attrib);
+ if ( match(code, "(^|\n)" guard "+(\n|$)" ) ) {
+ len = RLENGTH; st = RSTART;
+ return "" inline( substr(block, 1, st - 1) ) "
\n" \ + _block( substr(block, st + len) ); + } + # Fenced Code Block (pandoc) } else if ( match( block, /^(~~~+|```+)/ ) ) { guard = substr( block, 1, RLENGTH ); code = gensub(/^[^\n]+\n/, "", 1, block); + attrib = gensub(/^:::+[ \t]*\{?[ \t]*([^\}\n]*)\}?[ \t]*\n.*$/, "\\1", 1, block); + gsub(/[^a-zA-Z0-9_-]+/, " ", attrib); + gsub(/(^ | $)/, "", attrib); if ( match(code, "(^|\n)" guard "+(\n|$)" ) ) { len = RLENGTH; st = RSTART; - return "" HTML( substr(code, 1, st - 1) ) "
\n" \
+ return "" HTML( substr(code, 1, st - 1) ) "
\n" \
_block( substr( code, st + len ) );
} else {
match( block, /(^|\n)[[:space:]]*(\n|$)/ ) || match( block, /$/ );
@@ -347,29 +369,41 @@ 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( substr(block, 1, st - 1) ) "
\n" \ + return _block( substr(block, 1, st - 1) ) "\n" \ _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)) "" inline(block) "
\n"; } } @@ -409,9 +443,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;