18

Play Framework 2を使用すると、レンダリングされたScalaHTMLテンプレートがインデント@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 answerを使用して、次の手順を実行しました。

プラグインとして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ます。

于 2013-01-08T09:54:51.987 に答える
8

Play2.1用のGoogleHTMLCompressorプラグインをリリースしました。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");

'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");
于 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 に答える