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")
}