Finatra修改mustache模板默認的分隔符

mustache的默認分割符號爲 {{ }}html

固然也能夠在模板文件的第一行添加 {{=<% %>}}java

更多關於mustache的文檔: http://mustache.github.io/mustache.5.htmlgit

將默認的{{}}分隔符替換爲 <% %>github

假如你不喜歡每一個模板文件都添加這一行.咱們應該能夠修改默認的配置文件.web

直接貼代碼了.緩存

主要是覆蓋mustacheModule,重寫裏面的DefaultMustacheFactory中的compile與cacheide

package com.web_test.module

import com.github.mustachejava._
import com.google.common.cache.{CacheLoader, LoadingCache, CacheBuilder}
import com.google.inject.Provides
import com.twitter.finatra.annotations.Flag
import com.twitter.finatra.http.internal.marshalling.mustache.ScalaObjectHandler
import com.twitter.finatra.http.modules.{LocalFilesystemDefaultMustacheFactory, DocRootModule}
import com.twitter.finatra.http.modules.MustacheModule._
import com.twitter.finatra.http.routing.FileResolver
import com.twitter.inject.TwitterModule
import java.io._
import javax.inject.Singleton

import scala.collection.mutable


object myMustacheModule extends TwitterModule {

  private val templatesDir = flag("mustache.templates.dir", "templates", "templates resource directory")
  override def modules = Seq(DocRootModule)

  @Provides
  @Singleton
  def provideMustacheFactory(
                              resolver: FileResolver,
                              @Flag("local.doc.root") localDocRoot: String): MustacheFactory = {
    // templates are cached only if there is no local.doc.root
//    val cacheMustacheTemplates = localDocRoot.isEmpty
    val templatesDirectory = templatesDir()

    new DefaultMustacheFactory(templatesDirectory) {

      setObjectHandler(new ScalaObjectHandler)

      // 新建一個mp的mustache解析工具
      // 使用 mp 覆蓋 默認裏面的 mc, 由於mc沒法override,因此須要重寫一個.而且在下面使用mp替換掉
      val mp = new MustacheParser(this) {
        // 覆蓋
        override def compile(file: String): Mustache = {
          val reader: Reader = getReader(file)
          if (reader == null) {
            throw new MustacheNotFoundException(file)
          }
          compile(reader, file) // 調用下面的方法
        }
        // 自定義解析符號.
        // 主要是第三個參數與第四個參數,默認的是{{和}}
        override def compile( reader: Reader, file : String): Mustache = {
          super.compile(reader,file,"<%","%>")
        }
      }

      // scala.concurrent.
      val cachex = new mutable.HashMap[String,Mustache]()

      // 初始化cacheLoader
      protected class MustacheCacheLoader extends CacheLoader[String, Mustache] {
        @throws(classOf[Exception])
        override def load(key: String): Mustache = {
          mp.compile(key)
        }
      }

      // 爲了可以從入口進入,須要覆蓋 createMustacheCache
      // 裏面會有cacheLoader,可是須要使用mp來自定義的標籤.
      override def createMustacheCache: LoadingCache[String, Mustache] = {
        return CacheBuilder.newBuilder.build(new MustacheCacheLoader)
      }

      // 用於緩存cache的地方
      override def compilePartial (template: String) : Mustache = {
        // cache 獲取失敗,則使用mp的compile 編譯 ( 上面override裏裏面的自定義參數 )
        cachex.get(template) match {
          case Some(item) => item
          case _ => {
            // 解析結果,存放到cachex裏面
            val mustache = mp.compile(template)
            cachex ++= Map(template -> mustache )
            mustache.init
            mustache
          }
        }
      }
      // 便於調試代碼
      override def compile(name: String): Mustache = {
          super.compile(name)
      }
    }
  }
}
相關文章
相關標籤/搜索