【问题标题】:Is it possible to prettify scala templates using play framework 2?是否可以使用 play framework 2 美化 scala 模板?
【发布时间】:2013-01-04 09:46:11
【问题描述】:

使用 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 个额外的换行符。这肯定很烦人。

帖子似乎说目前没有更正的选项。

【问题讨论】:

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


    【解决方案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

    【讨论】:

    • 我喜欢这个,避免违反 DRY,也许你可以在 Github 上为其他人创建示例应用程序?
    • 我想知道这是否可以在编译时完成,所以漂亮的版本是嵌入在结果类中的,而不是必须在每个请求上美化它。
    【解决方案2】:

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

    【讨论】:

    • 这对我很有效,谢谢。我贡献了对 Play 2.2.1 的升级。
    • 非常棒的插件。易于配置,可与 GZIP 过滤器配合使用。
    【解决方案3】:

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

    【讨论】:

    • 很有趣,你会如何为每次通话做这件事?更改每个控制器的每个请求?
    • 在 play 2.1 中,有一个过滤器 (github.com/playframework/Play20/blob/master/framework/src/play/…) 机制,这将是执行此操作的完美解决方案。但它非常复杂,您必须使用 Iteratee API 而不是 String...我几天前尝试过,但对我来说太复杂了!
    • @RomainPiel 是的,但这是问题吗?在现有项目中,它是从剪贴板粘贴的。您有多少返回 HTML 的操作? 20? 30、5 分钟的工作。
    • @RomainPiel 你可以使用辅助方法,或者覆盖Ok
    【解决方案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))
      }
    
    }  
    

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

    build.sbt 所需的更改是:

    libraryDependencies += "org.jsoup" % "jsoup" % "1.10.2"
    libraryDependencies += "com.googlecode.htmlcompressor" % "htmlcompressor" % "1.5.2"
    

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多