X-Git-Url: https://git.plutz.net/?a=blobdiff_plain;f=markdown.awk;h=63bb044e8a69c13a87c58c71194ecceaf9b381b8;hb=ffe17caf6f15242bc1c0e2681d4aa5f46e15f378;hp=69a2fa8e70af9215c4b1ef5586a32620ff98b576;hpb=e619859fa2c940c4ab4c31550717d233c145bfea;p=cgilite
diff --git a/markdown.awk b/markdown.awk
index 69a2fa8..63bb044 100755
--- a/markdown.awk
+++ b/markdown.awk
@@ -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)
@@ -84,6 +86,20 @@ function HTML ( text ) {
return text;
}
+function URL ( text ) {
+ gsub( /&/, "%26", text );
+ gsub( /"/, "%22", text );
+ gsub( /'/, "%27", text );
+ gsub( /\?/, "%3F", text );
+ gsub( /#/, "%23", text );
+ gsub( /\[/, "%5B", text );
+ gsub( /\]/, "%5D", text );
+ gsub( / /, "%20", text );
+ gsub( / /, "%09", text );
+ gsub( /\\/, "%5C", text );
+ return text;
+}
+
function inline( line, LOCAL, len, code, href, guard ) {
nu = "(\\\\\\\\|\\\\[^\\\\]|[^\\\\_]|_[[:alnum:]])*" # not underline (except when escaped)
na = "(\\\\\\\\|\\\\[^\\\\]|[^\\\\\\*])*" # not asterisk (except when escaped)
@@ -101,7 +117,7 @@ function inline( line, LOCAL, len, code, href, guard ) {
# hard brakes
} else if ( match(line, /^ \n/) ) {
- return "
\n" inline( substr(line, RLENGTH + 1) );
+ return "
\n" inline( substr(line, RLENGTH + 1) );
# ``code spans``
} else if ( match( line, /^`+/) ) {
@@ -117,16 +133,24 @@ 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;
- href = HTML( substr( line, 2, len - 2) );
+ href = URL( substr( line, 2, len - 2) );
return "" href "" inline( substr( line, len + 1) );
# quick link email
} else if ( match( line, /^<[a-zA-Z0-9.!#$%&'\''*+\/=?^_`{|}~-]+@[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*>/ ) ) {
len = RLENGTH;
- href = HTML( substr( line, 2, len - 2) );
+ href = URL( substr( line, 2, len - 2) );
return "" href "" inline( substr( line, len + 1) );
# inline links
@@ -136,9 +160,9 @@ function inline( line, LOCAL, len, code, href, guard ) {
href = gensub(/^\[([^]]+)\]\(([^"\)]+)([[:space:]]+"([^"]+)")?\)/, "\\2", 1, substr(line, 1, len) );
title = gensub(/^\[([^]]+)\]\(([^"\)]+)([[:space:]]+"([^"]+)")?\)/, "\\4", 1, substr(line, 1, len) );
if ( title ) {
- return "" inline( text ) "" inline( substr( line, len + 1) );
+ return "" inline( text ) "" inline( substr( line, len + 1) );
} else {
- return "" inline( text ) "" inline( substr( line, len + 1) );
+ return "" inline( text ) "" inline( substr( line, len + 1) );
}
# reference style links
@@ -148,23 +172,32 @@ function inline( line, LOCAL, len, code, href, guard ) {
id = gensub(/^\[([^\n]+)\] ?\[([^\n]*)\].*/, "\\2", 1, substr(line, 1, len) );
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 "" HTML(substr(line, 1, len)) inline( substr(line, len + 1) );
}
# 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 ) {
- return "" inline( substr( line, len + 1) );
+ 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) );
+ return "" \
+ inline( substr( line, len + 1) );
}
# reference style images
@@ -174,9 +207,11 @@ function inline( line, LOCAL, len, code, href, guard ) {
id = gensub(/^!\[([^\n]+)\] ?\[([^\n]*)\].*/, "\\2", 1, substr(line, 1, len) );
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 "" HTML(substr(line, 1, len)) inline( substr(line, len + 1) );
}
@@ -412,11 +447,11 @@ function _block( block, LOCAL, st, len, hlvl, htxt, guard, code, indent, attrib
gsub(/\n[[:space:]]+/, " ", code);
gsub(/\n\| /, "\n", code);
gsub(/^\| |\n$/, "", code);
- return "
\[ \].*/ ) { return "
" \ + } else if ( p ~ /^
\[ \].*/ ) { return "
" \ substr(p, 7) "
\[-\].*/ ) { return "
" \ + } else if ( p ~ /^
\[-\].*/ ) { return "
" \ substr(p, 7) "
\[\?\].*/ ) { return "
" \ + } else if ( p ~ /^
\[\?\].*/ ) { return "
" \ substr(p, 7) "
\[\/\].*/ ) { return "
" \ + } else if ( p ~ /^
\[\/\].*/ ) { return "
" \ substr(p, 7) "
\[[xX]\].*/ ) { return "
" \ + } else if ( p ~ /^
\[[xX]\].*/ ) { return "
" \ substr(p, 7) "