Подтвердить что ты не робот

Можно ли преффицировать шаблоны 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. Это определенно раздражает.

Поток, кажется, говорит, что на данный момент нет возможности исправить это.

4b9b3361

Ответ 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()))
}