]> git.plutz.net Git - shellwiki/blob - md_macros.awk
introduce css pragma as separate handler
[shellwiki] / md_macros.awk
1 #!/bin/awk -f
2 #!/opt/busybox/awk -f
3
4 function sh_escape(arg){
5   return "'" gensub(/'/, "'\"'\"'", "g", arg) "'";
6 }
7
8 function argsplit(line, args, LOCAL, c, n, ctx) {
9   ctx="space"; n=0;
10
11   while ( length(line) > 0 ) {
12     c = substr(line, 1, 1);
13     line = substr(line, 2);
14     if (ctx == "space" )
15            if (c ~ /[ \t]/) ctx = "space";
16       else if (c ~ /\\/) { n++; ctx = "escbare"; }
17       else if (c ~ /"/)  { n++; ctx = "dquot"; }
18       else if (c ~ /'/)  { n++; ctx = "squot"; }
19       else   { n++; args[n] = c; ctx = "bare"; }
20     else if (ctx == "bare")
21            if (c ~ /[ \t]/) ctx = "space";
22       else if (c ~ /\\/)  ctx = "escbare";
23       else if (c ~ /"/)   ctx = "dquot";
24       else if (c ~ /'/)   ctx = "squot";
25       else args[n] = args[n] c;
26     else if (ctx == "dquot")
27            if (c ~ /"/)  ctx = "bare";
28       else if (c ~ /\\/) ctx = "escdquot";
29       else args[n] = args[n] c;
30     else if (ctx == "squot")
31       if (c ~ /'/)  ctx = "bare";
32       else args[n] = args[n] c;
33     else if (ctx == "escbare") {
34       args[n] = args[n] c;
35       ctx = "bare";
36     }
37     else if (ctx == "escdquot") {
38       args[n] = args[n] c;
39       ctx = "dquot";
40     }
41   }
42
43
44 function macro(call, LOCAL, line, args) {
45   argsplit(call, args);
46   call="";
47
48   for (n = 1; n in args; n++) call = call sh_escape(args[n]) " ";
49
50   if (args[1] in MACROS) {
51     oldRS=RS; oldORS=ORS;
52     RS=""; ORS=""; line="";
53     "printf '%s' " sh_escape(file) " | " sh_escape(ENVIRON["MD_MACROS"]) "/" call | getline line;
54     RS=oldRS; ORS=oldORS;
55     return line;
56   } else {
57     return HTML("<<" call ">>");
58   }
59 }
60
61 BEGIN {
62   if (ENVIRON["MD_MACROS"]) {
63     AllowMacros = "true";
64     "cd " sh_escape(ENVIRON["MD_MACROS"]) "; printf '%s/' *" |getline macro_list;
65     split(macro_list, MACROS, "/");
66     for (n in MACROS) { MACROS[MACROS[n]] = ""; delete MACROS[n]; }
67     delete MACROS[""];
68   }
69 }