Ich weiß, dass dies eine alte Frage ist, aber ich wollte trotzdem eine Antwort hinzufügen, die einen anderen Ansatz bietet.
Hauptantwort
Moustache unterstützt Lambdas ( siehe Dokumentation ), so dass man es so schreiben kann:
Vorlage:
{{#removeTrailingComma}}{{#items}}{{name}}, {{/items}}{{/removeTrailingComma}}
Hash:
{
"items": [
{"name": "red"},
{"name": "green"},
{"name": "blue"}
]
"removeTrailingComma": function() {
return function(text, render) {
var original = render(text);
return original.substring(0, original.length - 2);
}
}
}
Ausgabe:
rot grün blau
Kommentar
Persönlich mag ich diesen Ansatz gegenüber den anderen, da das Modell meiner Meinung nach nur angeben sollte, was gerendert wird und nicht, wie es gerendert wird. Technisch gesehen ist das Lambda Teil des Modells, aber die Absicht ist viel klarer.
Ich benutze diesen Ansatz, um meine eigenen OpenApi-Generatoren zu schreiben. Dort wird Moustache von Java umhüllt, aber die Funktionalität ist ziemlich gleich. So sieht es für mich aus, Lambdas zu kreieren: (in Kotlin)
override fun addMustacheLambdas(): ImmutableMap.Builder<String, Mustache.Lambda> =
super.addMustacheLambdas()
.put("lowerCase", Mustache.Lambda { fragment, writer ->
writer.write(fragment.execute().toLowerCase())
})
.put("removeLastComma", Mustache.Lambda { fragment, writer ->
writer.write(fragment.execute().removeSuffix(","))
})
.put("printContext", Mustache.Lambda { fragment, writer ->
val context = fragment.context()
println(context) // very useful for debugging if you are not the author of the model
writer.write(fragment.execute())
})