X-Git-Url: https://git.plutz.net/?a=blobdiff_plain;ds=inline;f=cgilite%2Fmarkdown.awk;h=44d4e0d7d16aa8aaab7638da20debc775f9770c3;hb=7defc340d721f26e33c0fa1df0e233c69b53c54a;hp=e63541bebfa78ffc70053ca23a1d94ff6b586c66;hpb=78a94a774fa0f9317b469995a9389551e0501a75;p=shellwiki
diff --git a/cgilite/markdown.awk b/cgilite/markdown.awk
index e63541b..44d4e0d 100755
--- a/cgilite/markdown.awk
+++ b/cgilite/markdown.awk
@@ -42,13 +42,13 @@
# - [x] Automatic heading identifiers (custom)
# - [x] Fenced code blocks (php md, pandoc)
# - [x] Fenced code attributes
-# - [ ] Tables
+# - [/] Tables
# - ? Simple table (pandoc)
# - ? Multiline table (pandoc)
-# - ? Grid table (pandoc)
-# - ? Pipe table (php md pandoc)
+# - [x] Grid table (pandoc)
+# - [x] Pipe table (php md pandoc)
# - [x] Line blocks (pandoc)
-# - [x] Task lists (pandoc)
+# - [x] Task lists (pandoc, custom)
# - [ ] Definition lists (php md, pandoc)
# - [-] Numbered example lists (pandoc)
# - [-] Metadata blocks (pandoc)
@@ -62,6 +62,8 @@
# - [x] ^Superscript^ ~Subscript~ (pandoc)
# - [-] Bracketed spans (pandoc)
# - [-] Inline attributes (pandoc)
+# - [x] Image attributes (custom, pandoc inspired, inline only)
+# - [x] Wiki style links [[PageName]] / [[PageName|Link Text]]
# - [-] TEX-Math (pandoc)
# - ? Footnotes (php md)
# - ? Abbreviations (php md)
@@ -117,6 +119,14 @@ function inline( line, LOCAL, len, code, href, guard ) {
return "" code "
" inline( substr( line, len + 1 ) )
}
+ # Wiki style links
+ } else if ( match( line, /^\[\[([^\]\|]+)(\|([^\]]+))?\]\]/) ) {
+ len = RLENGTH;
+ href = gensub(/^\[\[([^\]\|]+)(\|([^\]]+))?\]\]/, "\\1", 1, substr(line, 1, len) );
+ text = gensub(/^\[\[([^\]\|]+)(\|([^\]]+))?\]\]/, "\\3", 1, substr(line, 1, len) );
+ if ( ! text ) text = href;
+ return "" HTML(text) "" inline( substr( line, len + 1) );
+
# quick links ("automatic links" in md doc)
} else if ( match( line, /^<[a-zA-Z]+:\/\/([-\.[:alnum:]]+)(:[0-9]*)?(\/[^>]*)?>/ ) ) {
len = RLENGTH;
@@ -156,13 +166,18 @@ function inline( line, LOCAL, len, code, href, guard ) {
}
# inline images
- } else if ( match(line, /^!\[([^]]+)\]\(([^"\)]+)([ \t]+"([^"]+)")?\)/) ) {
+ } else if ( match(line, /^!\[([^]]+)\]\(([^"\)]+)([ \t]+"([^"]+)")?\)(\{([a-zA-Z \t-]*)\})?/) ) {
len = RLENGTH;
- text = gensub(/^!\[([^]]+)\]\(([^"\)]+)([ \t]+"([^"]+)")?\)/, "\\1", "g", substr(line, 1, len) );
- href = gensub(/^!\[([^]]+)\]\(([^"\)]+)([ \t]+"([^"]+)")?\)/, "\\2", "g", substr(line, 1, len) );
- title = gensub(/^!\[([^]]+)\]\(([^"\)]+)([ \t]+"([^"]+)")?\)/, "\\4", "g", substr(line, 1, len) );
- if ( title ) {
+ text = gensub(/^!\[([^]]+)\]\(([^"\)]+)([ \t]+"([^"]+)")?\)(\{([a-zA-Z \t-]*)\})?/, "\\1", "g", substr(line, 1, len) );
+ href = gensub(/^!\[([^]]+)\]\(([^"\)]+)([ \t]+"([^"]+)")?\)(\{([a-zA-Z \t-]*)\})?/, "\\2", "g", substr(line, 1, len) );
+ title = gensub(/^!\[([^]]+)\]\(([^"\)]+)([ \t]+"([^"]+)")?\)(\{([a-zA-Z \t-]*)\})?/, "\\4", "g", substr(line, 1, len) );
+ attrib = gensub(/^!\[([^]]+)\]\(([^"\)]+)([ \t]+"([^"]+)")?\)(\{([a-zA-Z \t-]*)\})?/, "\\6", "g", substr(line, 1, len) );
+ if ( title && attrib ) {
+ return "" inline( substr( line, len + 1) );
+ } else if ( title ) {
return "" inline( substr( line, len + 1) );
+ } else if ( attrib ) {
+ return "" inline( substr( line, len + 1) );
} else {
return "" inline( substr( line, len + 1) );
}
@@ -296,6 +311,115 @@ function _block( block, LOCAL, st, len, hlvl, htxt, guard, code, indent, attrib
return "
\n" _block( gensub( /(^|\n)> /, "\n", "g", substr(block, 1, st - 1) ) ) "
\n\n" \
_block( substr(block, st + len) );
+ # Pipe Tables (pandoc / php md / gfm )
+ } else if ( match(block, "^((\\|)?([^\n]+\\|)+[^\n]+(\\|)?)\n" \
+ "((\\|)?:?(-+:?[\\|+])+:?-+:?(\\|)?)\n" \
+ "((\\|)?([^\n]+\\|)+[^\n]+(\\|)?(\n|$))+" ) ) {
+ len = RLENGTH; st = RSTART;
+ #initialize empty arrays
+ split("", talign); split("", tarray);
+ cols = 0; cnt=0; ttext = "";
+
+ # table header and alignment
+ split( gensub( /(^\||\|$)/, "", "g", \
+ gensub( /(^|[^\\])\\\|/, "\\1\\|", "g", \
+ substr(block, 1, match(block, /(\n|$)/)) \
+ )), tarray, /\|/);
+ block = substr(block, match(block, /(\n|$)/) + 1 );
+ cols = split( \
+ gensub( /(^\||\|$)/, "", "g", \
+ substr(block, 1, match(block, /(\n|$)/)) \
+ ), talign, /[+\|]/);
+ block = substr(block, match(block, /(\n|$)/) + 1 );
+
+ 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 "" inline(tarray[cnt]) " | "
+ ttext = ttext "
\n\n"
+
+ while ( match(block, "^((\\|)?([^\n]+\\|)+[^\n]+(\\|)?(\n|$))+" ) ){
+ split( gensub( /(^\||\|$)/, "", "g", \
+ gensub( /(^|[^\\])\\\|/, "\\1\\|", "g", \
+ substr(block, 1, match(block, /(\n|$)/)) \
+ )), tarray, /\|/);
+ block = substr(block, match(block, /(\n|$)/) + 1 );
+
+ ttext = ttext ""
+ for (cnt = 1; cnt < cols; cnt++)
+ ttext = ttext "" inline(tarray[cnt]) " | "
+ ttext = ttext "
\n"
+ }
+ return "\n" _block(block);
+
+ # Grid Tables (pandoc)
+ } else if ( match(block, "^\\+(-+\\+)+\n" \
+ "(\\|([^\n]+\\|)+\n)+" \
+ "\\+(:?=+:?\\+)+\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];
+ }
+
+ cols = split( \
+ gensub( /(^\+|\+$)/, "", "g", \
+ substr(block, 1, match(block, /(\n|$)/)) \
+ ), talign, /\+/);
+ block = substr(block, match(block, /(\n|$)/) + 1 );
+
+ 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"
+
+ while ( match(block, /^((\|([^\n]+\|)+\n)+\+(-+\+)+(\n|$))+/ ) ){
+ split("", tarray);
+ 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];
+ }
+ block = substr(block, match(block, /(\n|$)/) + 1 );
+
+ ttext = ttext ""
+ for (cnt = 1; cnt < cols; cnt++)
+ ttext = ttext "" _block(tarray[cnt]) " | "
+ ttext = ttext "
\n"
+ }
+ return "\n" _block(block);
+
# Line Blocks (pandoc)
} else if ( match(block, /^\| [^\n]*(\n|$)(\| [^\n]*(\n|$)|[ \t]+[^\n[:space:]][^\n]*(\n|$))*/) ) {
len = RLENGTH; st = RSTART;
@@ -307,7 +431,7 @@ function _block( block, LOCAL, st, len, hlvl, htxt, guard, code, indent, attrib
_block( substr( block, len + 1) );
# Indented Code Block
- } else if ( match(block, /^( |\t)[^\n]+(\n|$)(( |\t)[^\n]+(\n|$)|[ \t]*(\n|$))*/) ) {
+ } else if ( match(block, /^( |\t)( *\t*[^ \t\n]+ *\t*)+(\n|$)(( |\t)[^\n]+(\n|$)|[ \t]*(\n|$))*/) ) {
len = RLENGTH; st = RSTART;
code = substr(block, 1, len);
gsub(/(^|\n)( |\t)/, "\n", code);
@@ -337,7 +461,7 @@ function _block( block, LOCAL, st, len, hlvl, htxt, guard, code, indent, attrib
} 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);
+ attrib = gensub(/^(~~~+|```+)[ \t]*\{?[ \t]*([^\}\n]*)\}?[ \t]*\n.*$/, "\\2", 1, block);
gsub(/[^a-zA-Z0-9_-]+/, " ", attrib);
gsub(/(^ | $)/, "", attrib);
if ( match(code, "(^|\n)" guard "+(\n|$)" ) ) {
@@ -379,14 +503,20 @@ function _block( block, LOCAL, st, len, hlvl, htxt, guard, code, indent, attrib
} else if ( match( block, /^[^\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" \
+ 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;
HL[2]++; HL[3] = 0; HL[4] = 0; HL[5] = 0; HL[6] = 0;
- return "" inline( gensub( /\n.*$/, "", "g", block ) ) "
\n\n" \
+ return "" \
+ inline( gensub( /\n.*$/, "", "g", block ) ) \
+ "
\n\n" \
_block( substr( block, len + 1) );
# Nth Order Heading
@@ -396,7 +526,8 @@ function _block( block, LOCAL, st, len, hlvl, htxt, guard, code, indent, attrib
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" \
+ return "" inline( htxt ) \
+ "\n\n" \
_block( substr( block, len + 1) );
# Split paragraphs
@@ -440,12 +571,28 @@ function _list( block, last, LOCAL, 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 );
+ # Task List (pandoc, custom)
+ if ( p ~ /^\[ \].*/ ) { return "" \
+ substr(p, 4) "\n" _list( block, last );
+ } else if ( p ~ /^\[-\].*/ ) { return "" \
+ substr(p, 4) "\n" _list( block, last );
+ } else if ( p ~ /^\[\?\].*/ ) { return "" \
+ substr(p, 4) "\n" _list( block, last );
+ } else if ( p ~ /^\[\/\].*/ ) { return "" \
+ substr(p, 4) "\n" _list( block, last );
+ } else if ( p ~ /^\[[xX]\].*/ ) { return "" \
+ substr(p, 4) "\n" _list( block, last );
+ } else if ( p ~ /^\[ \].*/ ) { return "
" \
+ substr(p, 7) "
\n" _list( block, last );
+ } else if ( p ~ /^\[-\].*/ ) { return "
" \
+ substr(p, 7) "
\n" _list( block, last );
+ } else if ( p ~ /^\[\?\].*/ ) { return "
" \
+ substr(p, 7) "
\n" _list( block, last );
+ } else if ( p ~ /^\[\/\].*/ ) { return "
" \
+ substr(p, 7) "
\n" _list( block, last );
+ } else if ( p ~ /^\[[xX]\].*/ ) { return "
" \
+ substr(p, 7) "
\n" _list( block, last );
+ } else { return "" p "\n" _list( block, last ); }
}
BEGIN {