Skip to content


Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Clojure library for Google Closure Templates
branch: master
Failed to load latest commit information.
doc One day of progress
src depend on clojure 1.3.0; globals feature
templates Initial commit
test depend on clojure 1.3.0; globals feature
.#scratch.clj Lots of work after pairing session
.gitignore Initial commit
project.clj depend on clojure 1.3.0; globals feature


A library for using Google's Closure Templates in Clojure. For information on Closure Templates, see Google's project page


To get started, just reference the clj-soy artifact in the dependencies section of your project.clj file: [clj-soy/clj-soy "0.3.0"]
Then, you can write a template in a *.soy file. For documentation on Soy templates, see Google's documentation. They look like this:

{namespace clj_soy.example}

* Says hello
* @param? greeting A word to use for greeting
* @param name A name
{template .helloWorld}
  {if not $greeting}
    Hello, {$name}!
    {$greeting}, {$name}!

Note that the namespace and documenting comment are both required.

Then, you can easily use your template in Clojure using the functions in the clj-soy/template namspace.


build compiles a template from *.soy files. You can pass it as single *.soy file, a seq of files, or a directory containing *.soy files (which will be recursively loaded). Files can be provided either as strings or objects.


render combines a compiled template and data, and returns it. Data can be either be a pre-built data structure genarated by prepare-data, or a simple Clojure map. Using pre-built data is faster. Keywords as map keys are automatically converted to strings before calling the template rendering engine.


prepare-data pre-parses a Clojure map into Closure Template's native format. It's called automatically if you pass a map to render, but can also be called independently to pre-position data that will be used multiple times. Converts keyword keys into string keys.

An example:

(ns clj-soy.example
  (:require [clj-soy.template :as soy]))

(defn example []
  (let [tpl (soy/build "")]
    (soy/render tpl
            {:name "Luke"
             :greeting "Bonjour"})))


  • Add some higher-order convenience functions
  • Provide Clojure-level support for internationalization
  • Provide Clojure-level support for precompiled javascript template generation


Copyright (C) 2011 Luke VanderHart

Distributed under the Eclipse Public License, the same as Clojure.

Something went wrong with that request. Please try again.