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, если вы делаете это.

В паре 4 это:

#unsafeHTML(переменная)

Другие вопросы по тегам