例えば Markdown をコンバートした HTML など、HTML エスケープをせずに生の HTML をそのまま Leaf テンプレートに埋め込みたい場合。
Vapor 2.0 までは #raw()
というタグがあってそれを使うことで実現できたが、なくなっている。
結論
text
というのが HTML 文字列だったとして、
#(text)
ではなく
#get(text)
とすれば OK。XSS には気をつけましょう
蛇足
#get()
ってのがあると知らなくて (Vapor の Discord 見てて知った) 、今までわざわざカスタムタグとして作っちゃった…マジで無駄なことをしてた…
import Leaf
public final class RawTag: TagRenderer {
public func render(tag parsed: TagContext) throws -> Future<TemplateData> {
try parsed.requireParameterCount(1)
return Future.map(on: parsed.container) {
if let string = parsed.parameters[0].string {
return .string(string)
} else {
return .null
}
}
}
}