Blob Blame History Raw
# doctemplates

This is the templating system used by pandoc.  It was formerly
be a module in pandoc. It has been split off to make it easier
to use independently.


``` haskell
{-# LANGUAGE OverloadedStrings #-}
import Data.Text
import Data.Aeson
import Text.DocTemplates

data Employee = Employee { firstName :: String
                         , lastName  :: String
                         , salary    :: Maybe Int }
instance ToJSON Employee where
  toJSON e = object [ "name" .= object [ "first" .= firstName e
                                       , "last"  .= lastName e ]
                    , "salary" .= salary e ]

template :: Text
template = "$for(employee)$Hi, $$. $if(employee.salary)$You make $employee.salary$.$else$No salary data.$endif$$sep$\n$endfor$"

main = case compileTemplate template of
         Left e    -> error e
         Right t   -> putStrLn $ renderTemplate t $ object
                        ["employee" .=
                          [ Employee "John" "Doe" Nothing
                          , Employee "Omar" "Smith" (Just 30000)
                          , Employee "Sara" "Chen" (Just 60000) ]

A slot for an interpolated variable is a variable name surrounded
by dollar signs.  To include a literal `$` in your template, use
`$$`.  Variable names must begin with a letter and can contain letters,
numbers, `_`, `-`, and `.`.

The values of variables are determined by a JSON object that is
passed as a parameter to `renderTemplate`.  So, for example,
`title` will return the value of the `title` field, and
`employee.salary` will return the value of the `salary` field
of the object that is the value of the `employee` field.

The value of a variable will be indented to the same level as the

A conditional begins with `$if(variable_name)$` and ends with `$endif$`.
It may optionally contain an `$else$` section.  The if section is
used if `variable_name` has a non-null value, otherwise the else section
is used.

Conditional keywords should not be indented, or unexpected spacing
problems may occur.

The `$for$` keyword can be used to iterate over an array.  If
the value of the associated variable is not an array, a single
iteration will be performed on its value.

You may optionally specify separators using `$sep$`, as in the
example above.

Anything between the sequence `$--` and the end of the line
will be treated as a comment.