Vapor 3.0 で Leaf テンプレートの中で HTML をエスケープせず出力したい場合


例えば 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
            }
        }
    }
}