X-Git-Url: https://git.plutz.net/?a=blobdiff_plain;f=md_macros.awk;h=88e662f7d913f3058120c405a065ea507537d77c;hb=116a9fbba5874eec7efb4f2253844e8158fffde9;hp=a1e6450f48a8136dc53ad17a9cbe5c1443ea6089;hpb=034bc176a19e32f920b422604762f5ab6fd21bc7;p=shellwiki diff --git a/md_macros.awk b/md_macros.awk index a1e6450..88e662f 100755 --- a/md_macros.awk +++ b/md_macros.awk @@ -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[""]; + } }