]> git.plutz.net Git - shellwiki/blob - md_macros.awk
escape gallery URLs
[shellwiki] / md_macros.awk
1 #!/bin/awk -f
2 #!/opt/busybox/awk -f
3
4 # Copyright 2022 Paul Hänsch
5
6 # Permission to use, copy, modify, and/or distribute this software for any
7 # purpose with or without fee is hereby granted, provided that the above
8 # copyright notice and this permission notice appear in all copies.
9
10 # THE SOFTWARE IS PROVIDED “AS IS” AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
13 # SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
16 # IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17
18 function sh_escape(arg){
19   return "'" gensub(/'/, "'\"'\"'", "g", arg) "'";
20 }
21
22 function argsplit(line, args, LOCAL, c, n, ctx) {
23   ctx="space"; n=0;
24
25   while ( length(line) > 0 ) {
26     c = substr(line, 1, 1);
27     line = substr(line, 2);
28     if (ctx == "space" )
29            if (c ~ /[ \t]/) ctx = "space";
30       else if (c ~ /\\/) { n++; ctx = "escbare"; }
31       else if (c ~ /"/)  { n++; ctx = "dquot"; }
32       else if (c ~ /'/)  { n++; ctx = "squot"; }
33       else   { n++; args[n] = c; ctx = "bare"; }
34     else if (ctx == "bare")
35            if (c ~ /[ \t]/) ctx = "space";
36       else if (c ~ /\\/)  ctx = "escbare";
37       else if (c ~ /"/)   ctx = "dquot";
38       else if (c ~ /'/)   ctx = "squot";
39       else args[n] = args[n] c;
40     else if (ctx == "dquot")
41            if (c ~ /"/)  ctx = "bare";
42       else if (c ~ /\\/) ctx = "escdquot";
43       else args[n] = args[n] c;
44     else if (ctx == "squot")
45       if (c ~ /'/)  ctx = "bare";
46       else args[n] = args[n] c;
47     else if (ctx == "escbare") {
48       args[n] = args[n] c;
49       ctx = "bare";
50     }
51     else if (ctx == "escdquot") {
52       args[n] = args[n] c;
53       ctx = "dquot";
54     }
55   }
56
57
58 function macro(call, LOCAL, line, args) {
59   argsplit(call, args);
60   call="";
61
62   for (n = 1; n in args; n++) call = call sh_escape(args[n]) " ";
63
64   if (args[1] in MACROS) {
65     oldRS=RS; oldORS=ORS;
66     RS=""; ORS=""; line="";
67     "printf '%s' " sh_escape(file) " | " sh_escape(ENVIRON["MD_MACROS"]) "/" call | getline line;
68     RS=oldRS; ORS=oldORS;
69     return line;
70   } else {
71     return HTML("<<" call ">>");
72   }
73 }
74
75 BEGIN {
76   if (ENVIRON["MD_MACROS"]) {
77     AllowMacros = "true";
78     "cd " sh_escape(ENVIRON["MD_MACROS"]) "; printf '%s/' *" |getline macro_list;
79     split(macro_list, MACROS, "/");
80     for (n in MACROS) { MACROS[MACROS[n]] = ""; delete MACROS[n]; }
81     delete MACROS[""];
82   }
83 }