X-Git-Url: https://git.plutz.net/?a=blobdiff_plain;ds=inline;f=cgilite%2Fmarkdown.awk;h=ffa225b477f6e8ff3dd1b157bc0f6e715df0a494;hb=2ad6da3df5555069e13d2c5c6f39b5d3a4d8071d;hp=ccd4cde125a238cb8ddb07e7293d00347f0dbecc;hpb=1b8f9a660793917c33769e345500814f5b5cdd60;p=shellwiki
diff --git a/cgilite/markdown.awk b/cgilite/markdown.awk
index ccd4cde..ffa225b 100755
--- a/cgilite/markdown.awk
+++ b/cgilite/markdown.awk
@@ -38,15 +38,20 @@
#
# Extensions - Block elements:
# ----------------------------
+# - [x] Automatic -wrapping (custom)
# - ? Heading identifiers (php md, pandoc)
+# - [x] Heading attributes (custom)
# - [x] Automatic heading identifiers (custom)
# - [x] Fenced code blocks (php md, pandoc)
# - [x] Fenced code attributes
+# - [x] Images (as block elements, ":""); }
+ HL[hlvl]++; for ( n = hlvl + 1; n <= 6; n++) { HL[n] = 0;}
+ hid = ""; for ( n = 2; n <= blvl; n++) { hid = hid BL[n] "/"; }
+ hid = hid HL[1]; for ( n = 2; n <= hlvl; n++) { hid = hid "." HL[n] ; }
+ hid = hid ":" URL(htxt, 1);
+
+ hstack = gensub( /^(.* )?([0-9]+( [0-9]+){5})$/, "\\1" ,"1", hstack) \
+ HL[1] " " HL[2] " " HL[3] " " HL[4] " " HL[5] " " HL[6];
+
+ return sec "" \
+ "" inline( htxt ) \
+ "" \
+ "\n\n";
+}
+
+# Nested Block, resets heading counters
+function _nblock( block, LOCAL, hlsav, sec, n ) {
+ hlsav = hstack;
+ hstack = hstack " 0 0 0 0 0 0";
+
+ # Block Level
+ blvl++; BL[blvl]++;
+ for ( n = blvl + 1; n in BL; n++) { delete BL[n]; }
+
+ block = _block( block );
+ split( gensub( /^(.* )?([0-9]+( [0-9]+){5})$/, "\\2" ,"1", hstack), HL);
+ sec = ""; for ( n = 1; n <= 6; n++ ) { sec = sec (HL[n]?"":""); }
+ hstack = hlsav; blvl--;
+ return block sec;
+}
+
+function _block( block, LOCAL, st, len, hlvl, htxt, sec, guard, code, indent, attrib ) {
gsub( /^\n+|\n+$/, "", block );
if ( block == "" ) {
@@ -293,7 +380,7 @@ function _block( block, LOCAL, st, len, hlvl, htxt, guard, code, indent, attrib
} else if ( match( block, /^> /) ) {
match( block, /(^|\n)[[:space:]]*(\n|$)/ ) || match(block, /$/);
len = RLENGTH; st = RSTART;
- return "
\n" _block( gensub( /(^|\n)> /, "\n", "g", substr(block, 1, st - 1) ) ) "
\n\n" \
+ return "" gensub( /^\n|\n$/, "", "g", _nblock( gensub( /(^|\n)> /, "\n", "g", substr(block, 1, st - 1) ) ) ) "
\n\n" \
_block( substr(block, st + len) );
# Pipe Tables (pandoc / php md / gfm )
@@ -344,46 +431,65 @@ function _block( block, LOCAL, st, len, hlvl, htxt, guard, code, indent, attrib
return "\n" _block(block);
# Grid Tables (pandoc)
- } else if ( match(block, "^\\+(-+\\+)+\n" \
- "(\\|([^\n]+\\|)+\n)+" \
- "\\+(:?=+:?\\+)+\n" \
- "((\\|([^\n]+\\|)+\n)+" \
- "\\+(-+\\+)+(\n|$))+" \
- ) ) {
+ # (with, and without header)
+ } else if ( match( block, "^\\+(-+\\+)+\n" \
+ "(\\|([^\n]+\\|)+\n)+" \
+ "(\\+(:?=+:?\\+)+)\n" \
+ "((\\|([^\n]+\\|)+\n)+" \
+ "\\+(-+\\+)+(\n|$))+" \
+ ) || \
+ match( block, "^()()()" \
+ "(\\+(:?-+:?\\+)+)\n" \
+ "((\\|([^\n]+\\|)+\n)+" \
+ "\\+(-+\\+)+(\n|$))+" \
+ ) ) {
len = RLENGTH; st = RSTART;
#initialize empty arrays
split("", talign); split("", tarray); split("", tread);
cols = 0; cnt=0; ttext = "";
- # table header and alignment
- block = substr(block, match(block, /(\n|$)/) + 1 );
- while ( match(block, "^\\|([^\n]+\\|)+\n") ) {
- cols = split( gensub( /(^\||\|$)/, "", "g", \
- gensub( /(^|[^\\])\\\|/, "\\1\\|", "g", \
- substr(block, 1, match(block, /(\n|$)/)) \
- )), tread, /\|/);
- block = substr(block, match(block, /(\n|$)/) + 1 );
- for (cnt = 1; cnt < cols; cnt++)
- tarray[cnt] = tarray[cnt] "\n" tread[cnt];
- }
+ # Column Count
+ cols = split( gensub( "^(\\+(:?-+:?\\+)+)(\n.*)*$", "\\1", 1, block), tread, /\+/) - 2;
+ # debug(" Cols: " gensub( "^(\\+(:?-+:?\\+)+)(\n.*)*$", "\\1", 1, block ));
- cols = split( \
- gensub( /(^\+|\+$)/, "", "g", \
- substr(block, 1, match(block, /(\n|$)/)) \
- ), talign, /\+/);
- block = substr(block, match(block, /(\n|$)/) + 1 );
+ # table alignment
+ split( gensub( "^(.*\n)?\\+((:?=+:?\\+|(:-+|-+:|:-+:)\\+)+)(\n.*)$", "\\2", "g", block ), talign, /\+/ );
+ # debug("Align: " gensub( "^(.*\n)?\\+((:?=+:?\\+|(:-+|-+:|:-+:)\\+)+)(\n.*)$", "\\2", "g", block ));
- for (cnt = 1; cnt < cols; cnt++) {
- if (match(talign[cnt], /:=+:/)) talign[cnt]="center";
- else if (match(talign[cnt], /=+:/)) talign[cnt]="right";
- else if (match(talign[cnt], /:=+/ )) talign[cnt]="left";
+ for (cnt = 1; cnt <= cols; cnt++) {
+ if (match(talign[cnt], /:(-+|=+):/)) talign[cnt]="center";
+ else if (match(talign[cnt], /(-+|=+):/)) talign[cnt]="right";
+ else if (match(talign[cnt], /:(-+|=+)/ )) talign[cnt]="left";
else talign[cnt]="";
}
- ttext = "\n"
- for (cnt = 1; cnt < cols; cnt++)
- ttext = ttext "" _block(tarray[cnt]) " | "
- ttext = ttext "
\n\n"
+ if ( match(block, "^\\+(-+\\+)+\n" \
+ "(\\|([^\n]+\\|)+\n)+" \
+ "\\+(:?=+:?\\+)+\n" \
+ "((\\|([^\n]+\\|)+\n)+" \
+ "\\+(-+\\+)+(\n|$))+" \
+ ) ) {
+ # table header
+ block = substr(block, match(block, /(\n|$)/) + 1 );
+ while ( match(block, "^\\|([^\n]+\\|)+\n") ) {
+ split( gensub( /(^\||\|$)/, "", "g", \
+ gensub( /(^|[^\\])\\\|/, "\\1\\|", "g", \
+ substr(block, 1, match(block, /(\n|$)/)) \
+ )), tread, /\|/);
+ block = substr(block, match(block, /(\n|$)/) + 1 );
+ for (cnt = 1; cnt <= cols; cnt++)
+ tarray[cnt] = tarray[cnt] "\n" tread[cnt];
+ }
+
+ ttext = "\n"
+ for (cnt = 1; cnt <= cols; cnt++)
+ ttext = ttext "" _nblock(tarray[cnt]) " | "
+ ttext = ttext "
\n"
+ }
+
+ # table body
+ block = substr(block, match(block, /(\n|$)/) + 1 );
+ ttext = ttext "\n"
while ( match(block, /^((\|([^\n]+\|)+\n)+\+(-+\+)+(\n|$))+/ ) ){
split("", tarray);
@@ -393,17 +499,17 @@ function _block( block, LOCAL, st, len, hlvl, htxt, guard, code, indent, attrib
substr(block, 1, match(block, /(\n|$)/)) \
)), tread, /\|/);
block = substr(block, match(block, /(\n|$)/) + 1 );
- for (cnt = 1; cnt < cols; cnt++)
+ for (cnt = 1; cnt <= cols; cnt++)
tarray[cnt] = tarray[cnt] "\n" tread[cnt];
}
block = substr(block, match(block, /(\n|$)/) + 1 );
ttext = ttext ""
- for (cnt = 1; cnt < cols; cnt++)
- ttext = ttext "" _block(tarray[cnt]) " | "
+ for (cnt = 1; cnt <= cols; cnt++)
+ ttext = ttext "" _nblock(tarray[cnt]) " | "
ttext = ttext "
\n"
}
- return "\n" _block(block);
+ return "\n" _nblock(block);
# Line Blocks (pandoc)
} else if ( match(block, /^\| [^\n]*(\n|$)(\| [^\n]*(\n|$)|[ \t]+[^\n[:space:]][^\n]*(\n|$))*/) ) {
@@ -412,7 +518,7 @@ function _block( block, LOCAL, st, len, hlvl, htxt, guard, code, indent, attrib
gsub(/\n[[:space:]]+/, " ", code);
gsub(/\n\| /, "\n", code);
gsub(/^\| |\n$/, "", code);
- return "" gensub(/\n/, "
\n", "g", inline( code )) "
\n" \
+ return "" gensub(/\n/, "
\n", "g", inline( code )) "
\n" \
_block( substr( block, len + 1) );
# Indented Code Block
@@ -433,7 +539,7 @@ function _block( block, LOCAL, st, len, hlvl, htxt, guard, code, indent, attrib
gsub(/(^ | $)/, "", attrib);
if ( match(code, "(^|\n)" guard "+(\n|$)" ) ) {
len = RLENGTH; st = RSTART;
- return "" _block( substr(code, 1, st - 1) ) "
\n" \
+ return "" _nblock( substr(code, 1, st - 1) ) "
\n" \
_block( substr( code, st + len ) );
} else {
match( block, /(^|\n)[[:space:]]*(\n|$)/ ) || match( block, /$/ );
@@ -484,37 +590,120 @@ function _block( block, LOCAL, st, len, hlvl, htxt, guard, code, indent, attrib
gsub("(^|\n) {0," indent "}", "\n", list);
return "\n\n" _list( substr(list, 2) ) "
\n" _block( block );
- # First Order Heading
- } else if ( match( block, /^[^\n]+\n===+(\n|$)/ ) ) {
+ # First Order Heading H1 + Attrib
+ } else if ( match( block, /^([^\n]+)([ \t]*\{([^\}\n]+)\})\n===+(\n|$)/ ) ) {
len = RLENGTH;
- 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" \
+ text = gensub(/^([^\n]+)([ \t]*\{([^\}\n]+)\})\n===+(\n.*)?$/, "\\1", 1, block)
+ attrib = gensub(/^([^\n]+)([ \t]*\{([^\}\n]+)\})\n===+(\n.*)?$/, "\\3", 1, block)
+ gsub(/[^a-zA-Z0-9_-]+/, " ", attrib); gsub(/(^ | $)/, "", attrib);
+
+ return headline(1, text, attrib) \
_block( substr( block, len + 1 ) );
- # Second Order Heading
- } else if ( match( block, /^[^\n]+\n---+(\n|$)/ ) ) {
+ # First Order Heading H1
+ } else if ( match( block, /^([^\n]+)\n===+(\n|$)/ ) ) {
+ len = RLENGTH;
+ text = gensub(/^([^\n]+)\n===+(\n.*)?$/, "\\1", 1, block)
+
+ return headline(1, text, 0) \
+ _block( substr( block, len + 1 ) );
+
+ # Second Order Heading H2 + Attrib
+ } else if ( match( block, /^([^\n]+)([ \t]*\{([^\}\n]+)\})\n---+(\n|$)/ ) ) {
+ len = RLENGTH;
+ text = gensub(/^([^\n]+)([ \t]*\{([^\}\n]+)\})\n---+(\n.*)?$/, "\\1", 1, block)
+ attrib = gensub(/^([^\n]+)([ \t]*\{([^\}\n]+)\})\n---+(\n.*)?$/, "\\3", 1, block)
+ gsub(/[^a-zA-Z0-9_-]+/, " ", attrib); gsub(/(^ | $)/, "", attrib);
+
+ return headline(2, text, attrib) \
+ _block( substr( block, len + 1) );
+
+ # Second Order Heading H2
+ } else if ( match( block, /^([^\n]+)\n---+(\n|$)/ ) ) {
+ len = RLENGTH;
+ text = gensub(/^([^\n]+)\n---+(\n.*)?$/, "\\1", 1, block)
+
+ return headline(2, text, 0) \
+ _block( substr( block, len + 1) );
+
+ # Nth Order Heading H1 H2 H3 H4 H5 H6 + Attrib
+ } else if ( match( block, /^(#{1,6})[ \t]*(([^ \t\n]+|[ \t]+[^ \t\n#]|[ \t]+#+[ \t]*[^ \t\n#])+)[ \t]*#*([ \t]*\{([a-zA-Z \t-]*)\})(\n|$)/ ) ) {
len = RLENGTH;
- HL[2]++; HL[3] = 0; HL[4] = 0; HL[5] = 0; HL[6] = 0;
- return "" \
- inline( gensub( /\n.*$/, "", "g", block ) ) \
- "
\n\n" \
+ n = gensub(/^(#{1,6})[ \t]*(([^ \t\n]+|[ \t]+[^ \t\n#]|[ \t]+#+[ \t]*[^ \t\n#])+)[ \t]*#*([ \t]*\{([a-zA-Z \t-]*)\})(\n.*)?$/, "\\1", 1, block);
+ text = gensub(/^(#{1,6})[ \t]*(([^ \t\n]+|[ \t]+[^ \t\n#]|[ \t]+#+[ \t]*[^ \t\n#])+)[ \t]*#*([ \t]*\{([a-zA-Z \t-]*)\})(\n.*)?$/, "\\2", 1, block);
+ attrib = gensub(/^(#{1,6})[ \t]*(([^ \t\n]+|[ \t]+[^ \t\n#]|[ \t]+#+[ \t]*[^ \t\n#])+)[ \t]*#*([ \t]*\{([a-zA-Z \t-]*)\})(\n.*)?$/, "\\5", 1, block);
+ gsub(/[^a-zA-Z0-9_-]+/, " ", attrib); gsub(/(^ | $)/, "", attrib);
+
+ return headline( length(n), text, attrib ) \
_block( substr( block, len + 1) );
- # Nth Order Heading
- } else if ( match( block, /^#{1,6}[ \t]*[^\n]+([ \t]*#*)(\n|$)/ ) ) {
+ # Nth Order Heading H1 H2 H3 H4 H5 H6
+ } else if ( match( block, /^(#{1,6})[ \t]*(([^ \t\n]+|[ \t]+[^ \t\n#]|[ \t]+#+[ \t]*[^ \t\n#])+)[ \t]*#*(\n|$)/ ) ) {
len = RLENGTH;
- hlvl = length( gensub( /^(#{1,6}).*$/, "\\1", "g", block ) );
- 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" \
+ n = gensub(/^(#{1,6})[ \t]*(([^ \t\n]+|[ \t]+[^ \t\n#]|[ \t]+#+[ \t]*[^ \t\n#])+)[ \t]*#*(\n.*)?$/, "\\1", 1, block);
+ text = gensub(/^(#{1,6})[ \t]*(([^ \t\n]+|[ \t]+[^ \t\n#]|[ \t]+#+[ \t]*[^ \t\n#])+)[ \t]*#*(\n.*)?$/, "\\2", 1, block);
+
+ return headline( length(n), text, 0 ) \
_block( substr( block, len + 1) );
+ # block images (wrapped in