TemplateManager.kt

  1. package com.hexagontk.templates

  2. import com.hexagontk.core.Platform
  3. import com.hexagontk.core.localized
  4. import java.net.URL
  5. import java.time.LocalDateTime
  6. import java.util.Locale

  7. /**
  8.  * The TemplateManager handles multiple templates adapters.
  9.  */
  10. object TemplateManager {

  11.     var adapters: Map<Regex, TemplatePort> = emptyMap()

  12.     /**
  13.      * Render a template with a registered template engine.
  14.      *
  15.      * @param url Location of the template.
  16.      * @param context Data to use when the template is processed.
  17.      * @param locale Locale used to process the template. If not passed, system's locale is used.
  18.      *
  19.      * @throws IllegalStateException Thrown when no engine for URL was found.
  20.      */
  21.     fun render(url: URL, context: Map<String, *>, locale: Locale = Platform.locale): String {
  22.         val now = LocalDateTime.now()
  23.         val defaultProperties = mapOf("_template_" to url, "_now_" to now)
  24.         return findAdapter(url.localized(locale)).render(url, context + defaultProperties, locale)
  25.     }

  26.     private fun findAdapter(url: URL): TemplatePort =
  27.         adapters
  28.             .filter { it.key.matches(url.toString()) }
  29.             .firstNotNullOfOrNull { it.value  }
  30.             ?: error("No adapter found for resource: $url")
  31. }