(ns metabase.channel.template.handlebars (:require [clojure.walk :as walk] [metabase.channel.template.handlebars-helper :as handlebars-helper] [metabase.config :as config] [metabase.util :as u] [metabase.util.log :as log]) (:import (com.github.jknack.handlebars Handlebars Template) (com.github.jknack.handlebars.cache ConcurrentMapTemplateCache) (com.github.jknack.handlebars.io ClassPathTemplateLoader))) | |
(set! *warn-on-reflection* true) | |
Create a new Handlebars instance with a template loader. | (defn registry ^Handlebars [loader & {:keys [reload?]}] (u/prog1 (doto (Handlebars. loader) (.with (ConcurrentMapTemplateCache.))) (when reload? (.setReload (.getCache <>) true)))) |
Create a ClassPathTemplateLoader with a prefix and postfix. | (defn classpath-loader [prefix postfix] (ClassPathTemplateLoader. prefix postfix)) |
(defn- wrap-context [context] (walk/postwalk #(if (keyword? %) (u/qualified-name %) %) context)) | |
(def ^:private default-hbs (delay (u/prog1 (registry (classpath-loader "/" ) :reload? true) (handlebars-helper/register-helpers <> handlebars-helper/default-helpers)))) | |
(when config/is-dev? (add-watch #'handlebars-helper/default-helpers :reload-default-helpers! (fn [_ _ _ new-default-helpers] (try (log/debug "Reloading handlebars default helpers") (handlebars-helper/register-helpers @default-hbs new-default-helpers) (catch Exception e (log/warn e "Error reloading default helpers")))))) | |
Render a template with a context. | (defn render ([template-name context] (render @default-hbs template-name context)) ([^Handlebars req ^String template-name ctx] (let [template ^Template (.compile req template-name)] (.apply template (wrap-context ctx))))) |
Render a template string with a context. | (defn render-string ([template context] (render-string @default-hbs template context)) ([^Handlebars req ^String template ctx] (.apply ^Template (.compileInline req template) (wrap-context ctx)))) |
(comment (render-string "{{now}}" {}) (render-string "{{format-date (now) \"YYYY-dd-MM\" }}" {}) (render-string "{{format-date \"2000-01-02\" \"YYYY-dd-MM\" }}" {}) (render-string "Hello {{name}}" {:name "Ngoc"}) (render-string "Hello {{#unless hide_name}}{{name}}{{/unless}}" {:name "Ngoc" :hide_name false}) (render "/metabase/channel/email/_header.hbs" {})) | |