]> git.plutz.net Git - shellwiki/blobdiff - md_macros.awk
css: clear gallery from floating elements
[shellwiki] / md_macros.awk
index a1e6450f48a8136dc53ad17a9cbe5c1443ea6089..88e662f7d913f3058120c405a065ea507537d77c 100755 (executable)
@@ -1,18 +1,57 @@
 #!/bin/awk -f
 #!/opt/busybox/awk -f
 
-function macro(call, LOCAL, line, files, n, exec) {
-  "cd " ENVIRON["MD_MACROS"] "; printf '%s/' *" |getline line;
-  split(line, files, "/");
-  for (n in files) { files[files[n]] = ""; delete files[n]; }
-  delete files[""];
+function sh_escape(arg){
+  return "'" gensub(/'/, "'\"'\"'", "g", arg) "'";
+}
+
+function argsplit(line, args, LOCAL, c, n, ctx) {
+  ctx="space"; n=0;
+
+  while ( length(line) > 0 ) {
+    c = substr(line, 1, 1);
+    line = substr(line, 2);
+    if (ctx == "space" )
+           if (c ~ /[ \t]/) ctx = "space";
+      else if (c ~ /\\/) { n++; ctx = "escbare"; }
+      else if (c ~ /"/)  { n++; ctx = "dquot"; }
+      else if (c ~ /'/)  { n++; ctx = "squot"; }
+      else   { n++; args[n] = c; ctx = "bare"; }
+    else if (ctx == "bare")
+           if (c ~ /[ \t]/) ctx = "space";
+      else if (c ~ /\\/)  ctx = "escbare";
+      else if (c ~ /"/)   ctx = "dquot";
+      else if (c ~ /'/)   ctx = "squot";
+      else args[n] = args[n] c;
+    else if (ctx == "dquot")
+           if (c ~ /"/)  ctx = "bare";
+      else if (c ~ /\\/) ctx = "escdquot";
+      else args[n] = args[n] c;
+    else if (ctx == "squot")
+      if (c ~ /'/)  ctx = "bare";
+      else args[n] = args[n] c;
+    else if (ctx == "escbare") {
+      args[n] = args[n] c;
+      ctx = "bare";
+    }
+    else if (ctx == "escdquot") {
+      args[n] = args[n] c;
+      ctx = "dquot";
+    }
+  }
+} 
+
+function macro(call, LOCAL, line, args) {
+  argsplit(call, args);
+  call="";
 
-  split(call, exec);
+  for (n = 1; n in args; n++) call = call sh_escape(args[n]) " ";
 
-  if (exec[1] in files) {
+  if (args[1] in MACROS) {
+    oldRS=RS; oldORS=ORS;
     RS=""; ORS=""; line="";
-    # TODO: proper shell-exec function with argument array
-    "printf '%s' " line " | " ENVIRON["MD_MACROS"] "/" call | getline line;
+    "printf '%s' " sh_escape(file) " | " sh_escape(ENVIRON["MD_MACROS"]) "/" call | getline line;
+    RS=oldRS; ORS=oldORS;
     return line;
   } else {
     return HTML("<<" call ">>");
@@ -20,5 +59,11 @@ function macro(call, LOCAL, line, files, n, exec) {
 }
 
 BEGIN {
-  if (ENVIRON["MD_MACROS"]) { AllowMacros = "true"; }
+  if (ENVIRON["MD_MACROS"]) {
+    AllowMacros = "true";
+    "cd " sh_escape(ENVIRON["MD_MACROS"]) "; printf '%s/' *" |getline macro_list;
+    split(macro_list, MACROS, "/");
+    for (n in MACROS) { MACROS[MACROS[n]] = ""; delete MACROS[n]; }
+    delete MACROS[""];
+  }
 }