是否可以使用播放框架2来美化scala模板?

时间:2013-01-04 09:46:12

标签: playframework playframework-2.0 code-formatting scala-template

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

更新:

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

@(myParam: String)


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

将在生成的HTML之上添加3个额外的换行符。这肯定很烦人。

线程似乎表示目前没有选择来纠正这个问题。

5 个答案:

答案 0 :(得分:16)

因此,有关详细信息,我使用了@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

答案 1 :(得分:8)

我发布了适用于Play 2.1的Google HTML Compressor插件。您可以在GitHub上找到它。

答案 2 :(得分:4)

当然总有一些选项:),修剪正文并再次设置标题所以(因为对字符串进行操作后它将作为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");

答案 3 :(得分:1)

我期待的答案真的很好地解决了问题。 HTML输出,除了删除空行之外,还适当地缩进输出。但是,HtmlCompressor仅压缩输出,并且没有漂亮的打印逻辑。

我想出了一个解决方案,它在生产中使用prettify进行压缩,在开发过程中使用Jsoup进行漂亮打印。我并不关心明确调用// 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)) } } 转换,因此我的解决方案如下所示:

build.sbt

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

libraryDependencies += "org.jsoup" % "jsoup" % "1.10.2" libraryDependencies += "com.googlecode.htmlcompressor" % "htmlcompressor" % "1.5.2" 所需的更改为:

x[mask,2]

答案 4 :(得分:0)

回应bluenote10&#39的回答我创建了以下内容,它不需要第三方库依赖。很高兴将它集成到过滤器中,遗憾的是我今天不确定如何正确地做到这一点。

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()))
}