]> git.plutz.net Git - cgilite/blobdiff - markdown.awk
metadata blocks
[cgilite] / markdown.awk
index 27d40156a414ed45f6053a758b1a9fa2f6cc254c..b0647922efdcbf5859dac4d3cda72145035403ed 100755 (executable)
@@ -45,7 +45,7 @@
 # -  ?  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)
@@ -56,7 +56,8 @@
 # - [ ] Definition lists (php md, pandoc)
 # - [-] Numbered example lists (pandoc)
 # - [-] Metadata blocks (pandoc)
-# - [-] Fenced Divs (pandoc)
+# - [x] Metadata blocks (custom)
+# - [x] Fenced Divs (pandoc)
 #
 # Extensions - Inline elements:
 # ----------------------------
@@ -252,7 +253,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 == "" ) {
@@ -279,6 +280,12 @@ 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));
+
+  # Metadata (custom, block starting with %something)
+  # Metadata is ignored but can be interpreted externally
+  } else if ( match(block, /^%[a-zA-Z]+([[:space:]][^\n]*)?(\n|$)(%[a-zA-Z]+([[:space:]][^\n]*)?(\n|$)|%([[:space:]][^\n]*)?(\n|$)|[ \t]+[^\n[:space:]][^\n]*(\n|$))*/) ) {
+    len = RLENGTH; st = RSTART;
+    return  _block( substr( block, len + 1) );
  
   # Blockquote (leading >)
   } else if ( match( block, /^> /) ) {
@@ -306,13 +313,34 @@ function _block( block, LOCAL, st, len, hlvl, htxt, guard, code, indent ) {
     return "<pre><code>" HTML( code ) "</code></pre>\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 "<div class=\"" attrib "\">" _block( substr(code, 1, st - 1) ) "</div>\n" \
+             _block( substr( code, st + len ) );
+    } else {
+      match( block, /(^|\n)[[:space:]]*(\n|$)/ ) || match( block, /$/ );
+      len = RLENGTH; st = RSTART;
+      return "<p>" inline( substr(block, 1, st - 1) ) "</p>\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 "<pre><code>" HTML( substr(code, 1, st - 1) ) "</code></pre>\n" \
+      return "<pre><code class=\"" attrib "\">" HTML( substr(code, 1, st - 1) ) "</code></pre>\n" \
              _block( substr( code, st + len ) );
     } else {
       match( block, /(^|\n)[[:space:]]*(\n|$)/ ) || match( block, /$/ );
@@ -369,6 +397,12 @@ function _block( block, LOCAL, st, len, hlvl, htxt, guard, code, indent ) {
     return "<h" hlvl " id=\"" hid " - " HTML(htxt) "\">" inline( htxt ) "</h" hlvl ">\n\n" \
            _block( substr( block, len + 1) );
 
+  # Split paragraphs
+  } else if ( match( block, /(^|\n)[[:space:]]*(\n|$)/) ) {
+    len = RLENGTH; st = RSTART;
+    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;
@@ -376,10 +410,7 @@ function _block( block, LOCAL, st, len, hlvl, htxt, guard, code, indent ) {
 
   # Plain paragraph
   } else {
-    match( block, /(^|\n)[[:space:]]*(\n|$)/ ) || match( block, /$/ );
-    len = RLENGTH; st = RSTART;
-    return "<p>" inline( substr(block, 1, st - 1) ) "</p>\n" \
-           _block( substr(block, st + len) );
+    return "<p>" inline(block) "</p>\n";
   }
 }