diff --git a/playground/index.html b/playground/index.html index 419fe9d0..d45b2f3a 100644 --- a/playground/index.html +++ b/playground/index.html @@ -1057,7 +1057,8 @@

Sjsonnet Playground — Interactive Jsonnet Evaluator

["encodeUTF8", "(str)"], ["decodeUTF8", "(arr)"], ["escapeStringJson", "(str)"], ["escapeStringPython", "(str)"], ["escapeStringBash", "(str)"], ["escapeStringDollars", "(str)"], - ["escapeStringXML", "(str)"], ["equalsIgnoreCase", "(str1, str2)"], + ["escapeStringXml", "(str)"], ["escapeStringXML", "(str)"], + ["equalsIgnoreCase", "(str1, str2)"], ["format", "(str, vals)"], // Object functions ["objectHas", "(o, f)"], ["objectHasAll", "(o, f)"], ["objectHasEx", "(o, f, inc_hidden)"], diff --git a/sjsonnet/src/sjsonnet/stdlib/StringModule.scala b/sjsonnet/src/sjsonnet/stdlib/StringModule.scala index 316865fa..36c77f82 100644 --- a/sjsonnet/src/sjsonnet/stdlib/StringModule.scala +++ b/sjsonnet/src/sjsonnet/stdlib/StringModule.scala @@ -431,6 +431,23 @@ object StringModule extends AbstractFunctionModule { if (out == null) str else new String(out) } + private def escapeStringXmlString(string: String): String = { + val out = new java.io.StringWriter() + var i = 0 + while (i < string.length) { + string.charAt(i) match { + case '<' => out.write("<") + case '>' => out.write(">") + case '&' => out.write("&") + case '"' => out.write(""") + case '\'' => out.write("'") + case c => out.write(c) + } + i += 1 + } + out.toString + } + private object AsciiUpper extends Val.Builtin1("asciiUpper", "str") { def evalRhs(str: Eval, ev: EvalScope, pos: Position): Val = Val.Str(pos, asciiUpper(str.value.asString)) @@ -598,22 +615,11 @@ object StringModule extends AbstractFunctionModule { BaseRenderer.escape(out, stdToString(str)(ev), unicode = true) out.toString }, + builtin("escapeStringXml", "str") { (_, ev, str: Val) => + escapeStringXmlString(stdToString(str)(ev)) + }, builtin("escapeStringXML", "str") { (_, ev, str: Val) => - val string = stdToString(str)(ev) - val out = new java.io.StringWriter() - var i = 0 - while (i < string.length) { - string.charAt(i) match { - case '<' => out.write("<") - case '>' => out.write(">") - case '&' => out.write("&") - case '"' => out.write(""") - case '\'' => out.write("'") - case c => out.write(c) - } - i += 1 - } - out.toString + escapeStringXmlString(stdToString(str)(ev)) }, builtin("escapeStringBash", "str_") { (pos, ev, str: Val) => "'" + stdToString(str)(ev).replace("'", """'"'"'""") + "'" diff --git a/sjsonnet/test/src/sjsonnet/StdLibOfficialCompatibilityTests.scala b/sjsonnet/test/src/sjsonnet/StdLibOfficialCompatibilityTests.scala index 12fb7b2e..9a286089 100644 --- a/sjsonnet/test/src/sjsonnet/StdLibOfficialCompatibilityTests.scala +++ b/sjsonnet/test/src/sjsonnet/StdLibOfficialCompatibilityTests.scala @@ -47,6 +47,7 @@ object StdLibOfficialCompatibilityTests extends TestSuite { eval("""std.escapeStringBash(10)""") ==> ujson.Str("'10'") eval("""std.escapeStringDollars("$a")""") ==> ujson.Str("$$a") eval("""std.escapeStringDollars(10)""") ==> ujson.Str("10") + eval("""std.escapeStringXml(10)""") ==> ujson.Str("10") eval("""std.escapeStringXML(10)""") ==> ujson.Str("10") }