Можно ли преффицировать шаблоны scala с помощью play framework 2?
Использование Play Framework 2 Я заметил, что созданные Scala HTML-шаблоны не любят отступать @if
или @for
.
Итак, например, что-то вроде этого:
<ul>
@for(test <- tests) {
<li>@test.name</li>
}
</ul>
Будут добавлены лишние ненужные пробелы. Чтобы исправить это, мне нужно сделать что-то вроде этого:
<ul>
@for(test <- tests) {
<li>@test.name</li>
}
</ul>
Что будет беспорядочно с дополнительными @defining
или другими операторами.
Итак, есть ли способ преффицировать/украсить рендеринг шаблонов Scala, чтобы избавиться от лишних пробелов?
UPDATE:
Чтение этот поток Я заметил, что дополнительные пробелы и разрывы строк добавляются также из-за параметров поверх шаблонов. Итак:
@(myParam: String)
<!DOCTYPE html>
<html>
<head></head>
<body></body>
</html>
добавит 3 дополнительных разрыва строки поверх полученного HTML. Это определенно раздражает.
Поток, кажется, говорит, что на данный момент нет возможности исправить это.
Ответы
Ответ 1
Итак, для более подробной информации я использовал ответ @biesor и прошел следующие шаги:
Добавить HtmlCompressor в качестве плагина
В Build.scala:
val appDependencies = Seq(
"com.googlecode.htmlcompressor" % "htmlcompressor" % "1.5.2"
)
PrettyController
public class PrettyController extends Controller {
public static Results.Status ok(Content content) {
return Results.ok(prettify(content)).as("text/html; charset=utf-8");
}
public static Results.Status badRequest(Content content) {
return Results.badRequest(prettify(content)).as("text/html; charset=utf-8");
}
public static Results.Status notFound(Content content) {
return Results.notFound(prettify(content)).as("text/html; charset=utf-8");
}
public static Results.Status forbidden(Content content) {
return Results.forbidden(prettify(content)).as("text/html; charset=utf-8");
}
public static Results.Status internalServerError(Content content) {
return Results.internalServerError(prettify(content)).as("text/html; charset=utf-8");
}
public static Results.Status unauthorized(Content content) {
return Results.unauthorized(prettify(content)).as("text/html; charset=utf-8");
}
private static String prettify(Content content) {
HtmlCompressor compressor = new HtmlCompressor();
String output = content.body().trim();
if (Play.isDev()) {
compressor.setPreserveLineBreaks(true);
}
output = compressor.compress(output);
return output;
}
}
Затем каждый контроллер должен расширять PrettyController
.
Ответ 2
Я выпустил плагин Google Compressor для Play 2.1. Вы можете найти его на GitHub.
Ответ 3
Конечно, всегда есть какой-то вариант:), обрезаем тело и снова устанавливаем заголовок (так как после операций над строкой он будет возвращен как text/plain
):
// instead of
return ok(index.render("some"));
// use
return ok(index.render("some").body().trim()).as("text/html; charset=utf-8");
для циклов 'beauty' или если вам нужно написать более компактный код
// instead of
@for(test <- tests) {
<li>@test.name</li>
}
// use
@for(test <- tests) {<li>@test.name</li>}
И, наконец, вы можете использовать некоторый компрессор (т.е. com.googlecode.htmlcompressor), чтобы... уменьшить всю страницу (в этом примере для только режим производства)
String output = index.render("some").body().trim();
if (Play.isProd()) output = compressor.compress(output);
return ok(output).as("text/html; charset=utf-8");
Ответ 4
Я ожидал ответов, которые действительно "превзошли" вывод HTML, в том смысле, что он правильно отпечатывает вывод в дополнение к удалению пустых строк. Однако HtmlCompressor
только сжимает вывод и не имеет симпатичной логики печати.
Я придумал решение, которое использует как HtmlCompressor
для сжатия в процессе производства, так и Jsoup для печати во время разработки. Мне не нужно явно вызывать преобразование prettify
, поэтому мое решение выглядит так:
// required extra imports
import play.twirl.api.Html
import com.googlecode.htmlcompressor.compressor.HtmlCompressor
import org.jsoup.Jsoup
import org.jsoup.parser.Parser
@Singleton
class MyController @Inject() (environment: Environment) extends Controller {
/** Helper to format Html */
def prettify(content: Html): Html = {
val rawString = content.body.trim()
val html = environment.mode match {
case Mode.Dev =>
val doc = Jsoup.parse(rawString, "", Parser.xmlParser())
doc.outputSettings().indentAmount(2)
Html(doc.toString())
case _ =>
val compressor = new HtmlCompressor()
compressor.setPreserveLineBreaks(true)
Html(compressor.compress(rawString))
}
html
}
/** example usage */
def index = Action {
Ok(prettify(views.html.index))
}
}
В режиме dev это создает хорошо отформатированный HTML.
Необходимыми изменениями в build.sbt
являются:
libraryDependencies += "org.jsoup" % "jsoup" % "1.10.2"
libraryDependencies += "com.googlecode.htmlcompressor" % "htmlcompressor" % "1.5.2"
Ответ 5
Повторяя ответ на bluenote10, я создал следующее: для него не требуются сторонние библиотеки. Было бы неплохо интегрировать его в фильтр, к сожалению, я не уверен, как правильно это сделать сегодня.
import play.twirl.api.Html
/** Helper to format Html */
def prettify(content: Html): Html = {
Html(content.body.trim().replaceAll("\\n\\s*\\n", "\n"))
}
def index = Action { implicit request =>
Ok(prettify(views.html.index()))
}