Skip to content

jjl/thyroid

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

30 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

The irresponsible clojure guild presents...

Thyroid

Clojars Project Jitpack Build Status

HTML5 templating made differently insane.

Usage

(require '[irresponsible.thyroid :as t])

(def resolver (t/template-resolver 
                {:type :file
                 :prefix "resources/templates/"
                 :suffix ".html"
                 :cache? false}))

(def engine (t/make-engine {:resolvers [resolver]}))

;; Render data to a string
(t/render engine "hello.html" {"title" "Hello World!"})

The template file is defined as

<!-- resources/templates/hello.html -->
<html>
    <head>
        <title th:text="${title}">No title set</title>
    </head>
    <body>
        <h1 th:text="${title}">fake title</h1>
    </body>
</html>

Template resolvers

You can define your own template resolvers like this

(import '(org.thymeleaf.templateresolver ITemplateResolver))

(defmethod t/template-resolver ::custom
  [options]
  (reify ITemplateResolver
    (getName [this] (:name options))
    (getOrder [this] (:order options))
    (resolveTemplate [this conf owner-template template resolution-attrs]
      ...)))

Dialects

Adding dialects is a more involved process, this example is a copy of that presented by the thymeleaf "Say Hello! Extending Thymeleaf in 5 minutes" guide.

Each dialect expects a handler that returns a set of processors that will be called when the dialect is being rendered.

(import '(org.unbescape.html.HtmlEscape))

(defn say-hello-processor
  [prefix]
  (t/process-by-attrs
    {:prefix prefix
     :attr-name "sayto"
     :handler (fn [ctx tag attr-name attr-val struct-handler]
                (.setBody struct-handler 
                  (str "Hello, " (HtmlEscape/escapeHtml attr-val) "!")))))

(def my-dialect 
  (t/dialect 
    {:name "Hello Dialect" 
     :prefix "hello" 
     :handler (fn [prefix] 
                #{(say-hello-processor prefix)})}))
                
;; Render string template
(def engine (t/make-engine 
              {:resolvers [(thyroid/template-resolver {:type :string})]}))
(t/render engine "<p hello:sayto="World">Hi ya!</p>") 

The above example will render <p>Hello, World!</p>

Contributors

Copyright and License

MIT License