Swift Vapor Leaf доставляет html в переменную
Мне нужно создать сложную HTML-таблицу внутри приложения Swift Vapor.
Проблема в том, что Leaf, кажется, не поддерживает подсчет переменных типа #(somevar += 1) и конкатенацию строковых переменных, таких как #(somevar1 + somevar2)
Поэтому я решил создать свою сложную таблицу внутри приложения и перенести ее в шаблон html внутри переменной. (в php я привык делать это все время)
В шаблоне я бы назвал переменную как
#(table)
но оказывается, я получаю простой HTML-код, так как лист экранирует все переменные.
Но есть функция #raw() для вывода простого HTML как такового.
Так и делаю
<!DOCTYPE html>
<html lang="de">
<head><title>Server</title></head>
<body>
<..>
<form action="parameters" method="post">
// here is the thing: leaf gets a html table within the string 'table'.
// If I do it like that lead doesn't recognize #(table) as a leaf variable.
#raw( #(table) )
<button type="submit">Save</button>
</form>
</body>
</html>
только чтобы узнать, что #raw() не ищет переменные, а просто выводит неэкранированное, что находится между {}. Так что я все еще получаю на сайте "#(таблица)" вместо моей сложной HTML-таблицы.
Так что теперь я застрял. Как получить сгенерированный приложением HTML-код в шаблон в виде HTML?
Вероятно, я делаю все это неправильно. Как я могу получить HTML-код внутри листа шаблона вообще? Или я должен сам отправить всю страницу в виде http-потока с заголовком...?
Спасибо заранее, Том
3 ответа
Обновить
С тех пор как Vapor 3 #raw(<var>)
тег не был встроен по умолчанию в --template=web
при создании вашего проекта Vapor Leaf. Я должен был зарегистрировать это вручную в моем configure.swift
файл:
/// Leaf add tags
services.register { container -> LeafTagConfig in
var config = LeafTagConfig.default()
config.use(Raw(), as: "raw") // #raw(<myVar>) to print it as raw html in leaf vars
return config
}
https://docs.vapor.codes/3.0/leaf/custom-tags/
Также, если кто-то ищет полный список доступных тегов, вы можете поискать TagRenderer
в парах зависимостей, который является протоколом для соответствия, если вы хотите создать пользовательский тег:
Надеюсь, что это может помочь
Предполагая, что вы не принимаете пользовательский ввод для создания этой таблицы, вы должны использовать это:
#raw(table)
Это делает то же самое, что и #(table)
, но он не экранирует HTML, поэтому он будет правильно отображаться. Просто убедитесь, что вы не делаете себя уязвимыми для атак XSS, если вы делаете это.