# 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.
Example:
``` 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, $employee.name.first$. $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
variable.
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.