18

使用 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 模板渲染以消除额外的空白?

更新:

阅读此线程时,我注意到由于模板顶部的参数,还添加了额外的空格和换行符。所以这:

@(myParam: String)


<!DOCTYPE html>
<html>
   <head></head>
   <body></body>
</html>

将在生成的 HTML 之上添加 3 个额外的换行符。这绝对是烦人的。

该线程似乎说目前没有选项可以纠正它。

4

5 回答 5

17

因此,有关更多详细信息,我使用了@biesor 答案并完成了以下步骤:

添加 HtmlCompressor 作为插件

在 Build.scala 中:

val appDependencies = Seq(
    "com.googlecode.htmlcompressor" % "htmlcompressor" % "1.5.2"
)

漂亮控制器

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.

于 2013-01-08T09:54:51.987 回答
8

我已经为 Play 2.1 发布了一个 Google HTML Compressor 插件。你可以在GitHub 上找到它。

于 2013-06-29T17:13:31.280 回答
4

当然总有一些选项:),修剪正文并再次设置标题(因为在对字符串进行操作后,它将返回为text/plain):

// instead of
return ok(index.render("some"));

// use
return ok(index.render("some").body().trim()).as("text/html; charset=utf-8");

对于“美”循环或如果您需要编写更紧凑的代码

// 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");
于 2013-01-04T11:24:37.620 回答
1

我期待着真正“美化”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))
  }

}  

在开发模式下,这会产生一些格式良好的 HTML。

所需的更改build.sbt是:

libraryDependencies += "org.jsoup" % "jsoup" % "1.10.2"
libraryDependencies += "com.googlecode.htmlcompressor" % "htmlcompressor" % "1.5.2"
于 2017-04-14T17:02:02.397 回答
0

与 bluenote10 的回答相呼应,我创建了以下内容,它不需要第三方 libraryDependecies。将它集成到过滤器中会很好,不幸的是我不确定今天如何正确地做到这一点。

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()))
}
于 2017-09-07T21:08:33.437 回答