commit 3c353e4affdaef1b15dfe4b11f5b1cbe1b3dfb0a
parent ba21384fde0f252e0d3eb0205471942aa3291bd5
Author: Daniel Barlow <dan@telent.net>
Date: Sat, 10 Aug 2024 23:42:08 +0100
support json quoting in output-template
Diffstat:
3 files changed, 23 insertions(+), 0 deletions(-)
diff --git a/pkgs/output-template/example.ini b/pkgs/output-template/example.ini
@@ -1,2 +1,3 @@
wpa_passphrase={{ secret "colours/black" }}
think = {{ string.format("%q", secret("colours/blue")) }}
+argonaut = {{ json_quote "hello\ngoodbye\tnext\027" }}
diff --git a/pkgs/output-template/example.ini.expected b/pkgs/output-template/example.ini.expected
@@ -1,2 +1,3 @@
wpa_passphrase=000000
think = "0000ff"
+argonaut = "hello\ngoodbye\tnext\u001B"
diff --git a/pkgs/output-template/output-template.fnl b/pkgs/output-template/output-template.fnl
@@ -1,11 +1,32 @@
(local svc (require :anoia.svc))
+(fn json-escape [s]
+ ;; All Unicode characters may be placed within the quotation marks,
+ ;; except for the characters that MUST be escaped:
+ ;; quotation mark, reverse solidus, and the control characters (U+0000
+ ;; through U+001F). (RFC 8259)
+ (-> s
+ (string.gsub
+ "[\"\b\f\n\r\t]" {
+ "\b" "\\b"
+ "\"" "\\\""
+ "\f" "\\f"
+ "\n" "\\n"
+ "\r" "\\r"
+ "\t" "\\t"
+ })
+ (string.gsub
+ "([\x00-\x1b])"
+ (fn [x] (string.format "\\u%04X" (string.byte x))))))
+
+
(fn substitute [text service opening closing]
(let [delim (.. opening "(.-)" closing)
myenv {
: string
:secret (fn [x] (service:output x))
:lua_quote #(string.format "%q" %1)
+ :json_quote (fn [x] (.. "\"" (json-escape x) "\""))
}]
(string.gsub text delim
(fn [x]