All Downloads are FREE. Search and download functionalities are using the official Maven repository.

skinny.controller.feature.ThymeleafTemplateEngineFeature.scala Maven / Gradle / Ivy

The newest version!
package skinny.controller.feature

import skinny._
import org.thymeleaf._
import org.thymeleaf.context.WebContext
import org.thymeleaf.dialect.IDialect
import org.thymeleaf.templateresolver._
import nz.net.ultraq.thymeleaf.LayoutDialect
import skinny.micro.context.SkinnyContext

/**
 * Thymeleaf template engine support.
 *
 * @see http://www.thymeleaf.org/
 */
trait ThymeleafTemplateEngineFeature extends TemplateEngineFeature {

  /**
   * Set as cacheable if true.
   */
  lazy val thymeleafCacheable: Boolean = !isDevelopment()

  /**
   * Default template mode.
   */
  lazy val thymeleafResolverTemplateMode: String = "LEGACYHTML5"

  /**
   * Resolver template prefix.
   */
  lazy val thymeleafResolverPrefix: String = {
    if (SkinnyEnv.isTest()) "WEB-INF/views/"
    else "/WEB-INF/views/"
  }

  /**
   * Resolver template suffix.
   */
  lazy val thymeleafResolverSuffix: String = ".html"

  /**
   * Template cache ttl milliseconds.
   */
  lazy val thymeleafResolverCacheTTLMs: Long = 3600000L

  /**
   * Dialects for this Thymeleaf Template Engine.
   */
  lazy val thymeleafDialects: Set[_ <: IDialect] = Set(new LayoutDialect)

  /**
   * Resolver.
   */
  lazy val thymeleafResolver: TemplateResolver = {
    val resolver: TemplateResolver = {
      if (SkinnyEnv.isTest()) new ClassLoaderTemplateResolver
      else new ServletContextTemplateResolver
    }
    resolver.setCacheable(thymeleafCacheable)
    resolver.setTemplateMode(thymeleafResolverTemplateMode)
    resolver.setPrefix(thymeleafResolverPrefix)
    resolver.setSuffix(thymeleafResolverSuffix)
    resolver.setCharacterEncoding(charset.getOrElse("UTF-8"))
    resolver.setCacheTTLMs(thymeleafResolverCacheTTLMs)
    resolver
  }

  /**
   * Template engine.
   */
  lazy val thymeleafTemplateEngine: TemplateEngine = {
    val engine = new TemplateEngine
    engine.setTemplateResolver(thymeleafResolver)
    thymeleafDialects.foreach(engine.addDialect)
    engine
  }

  override protected def templatePaths(path: String)(implicit format: Format = Format.HTML): List[String] = {
    List(templatePath(path))
  }

  protected def templatePath(path: String)(implicit format: Format = Format.HTML): String = {
    s"${path}".replaceAll("//", "/").replaceFirst("^/", "")
  }

  override protected def templateExists(path: String)(implicit format: Format = Format.HTML): Boolean = {
    // only HTML template is supported
    format == Format.HTML
  }

  override protected def renderWithTemplate(path: String)(
    implicit
    ctx: SkinnyContext, format: Format = Format.HTML
  ): String = {
    val context = new WebContext(ctx.request, ctx.response, ctx.servletContext)
    requestScope(ctx).foreach {
      case (key, value) => context.setVariable(key, value)
    }
    thymeleafTemplateEngine.process(templatePath(path), context)
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy