]> git.plutz.net Git - cgilite/blobdiff - markdown.awk
md: image embedding, completing support for basic markdown
[cgilite] / markdown.awk
index a5c2eb1f587d79f203df3858819d33da565236bf..98a3e8b2bda338bc58d531a4c074bcbbafaf498a 100755 (executable)
@@ -23,7 +23,7 @@
 # - [x] Blockquotes
 # - [x] Lists (ordered, unordered)
 # - [x] Code blocks (using indention)
-# - [ ] Horizontal rules
+# - [x] Horizontal rules
 #
 # Basic Markdown - Inline elements:
 # ---------------------------------
@@ -31,7 +31,7 @@
 # - [x] Reference style links
 # - [x] Emphasis *em*/**strong** (*Asterisk*, _Underscore_)
 # - [x] `code`, also ``code containing `backticks` ``
-# - [ ] Images / reference style images
+# - [x] Images / reference style images
 # - [x] <automatic links>
 # - [x] backslash escapes
 #
@@ -146,6 +146,32 @@ function inline( line, LOCAL, len, code, href, guard ) {
       return "" substr(line, 1, len) inline( substr(line, len + 1) );
     }
 
+  # inline images
+  } else if ( match(line, /^!\[([^]]+)\]\(([^"\)]+)([ \t]+"([^"]+)")?\)/) ) {
+    len = RLENGTH;
+    text  = gensub(/^!\[([^]]+)\]\(([^"\)]+)([ \t]+"([^"]+)")?\)/, "\\1", "g", line);
+    href  = gensub(/^!\[([^]]+)\]\(([^"\)]+)([ \t]+"([^"]+)")?\)/, "\\2", "g", line);
+    title = gensub(/^!\[([^]]+)\]\(([^"\)]+)([ \t]+"([^"]+)")?\)/, "\\4", "g", line);
+    if ( title ) {
+      return "<img src=\"" HTML(href) "\" alt=\"" HTML(text) "\" title=\"" HTML(title) "\" />" inline( substr( line, len + 1) );
+    } else {
+      return "<img src=\"" HTML(href) "\" alt=\"" HTML(text) "\" />" inline( substr( line, len + 1) );
+    }
+
+  # reference style images
+  } else if ( match(line, /^!\[([^]]+)\] ?\[([^]]*)\]/ ) ) {
+    len = RLENGTH;
+    text = gensub(/^!\[([^\n]+)\] ?\[([^\n]*)\].*/, "\\1", 1, line);
+      id = gensub(/^!\[([^\n]+)\] ?\[([^\n]*)\].*/, "\\2", 1, line);
+    if ( ! id ) id = text;
+    if ( rl_href[id] && rl_title[id] ) {
+      return "<img src=\"" rl_href[id] "\" alt=\"" HTML(text) "\" title=\"" rl_title[id] "\" />" inline( substr( line, len + 1) );
+    } else if ( rl_href[id] ) {
+      return "<img src=\"" rl_href[id] "\" alt=\"" HTML(text) "\" />" inline( substr( line, len + 1) );
+    } else {
+      return "" substr(line, 1, len) inline( substr(line, len + 1) );
+    }
+
   #  ~~strikeout~~ (pandoc)
   } else if ( match(line, /^~~([[:graph:]]|[[:graph:]]([^~]|~[^~])*[[:graph:]])~~/) ) {
     len = RLENGTH;
@@ -206,6 +232,11 @@ function _block( block, LOCAL, st, len, hlvl, htxt, guard, code, indent ) {
 
   if ( block == "" ) {
     return "";
+
+  # Horizontal rule
+  } else if ( match( block, /(^|\n) ? ? ?((\* *){3,}|(- *){3,}|(_ *){3,})($|\n)/) ) {
+    len = RLENGTH; st = RSTART;
+    return _block(substr(block, 1, st - 1)) "<hr />\n" _block(substr(block, st + len));
  
   # Blockquote (leading >)
   } else if ( match( block, /^> /) ) {