Home

Awesome

Tempered

Hackage

A dead-simple templating utility for simple shell interpolation. Use at your own risk and only on trusted templates.

$ tempered --help
Tempered - Templating engine based on shell interpolation

Usage: tempered [templates]
  Interpolate templates to stdout

Available options:
  templates                The templates to interpolate
  -h,--help                Show this help text

Here's a simple use-case:

{{ # inside "post.md" }}
# My Blog Post

by {{ echo $AUTHOR }}
Published on {{ date +'%B %d, %Y' }}

Here's my blog post!

---
{{ cat ./footer.md | tr 'a-z' 'A-Z' }}
{{ # inside "footer.md" }}
Copyright 2017 Chris Penner
Check me out on twitter @chrislpenner!
See you next time!

Then we can render the template with

tempered ./post.md

# OR

cat ./post.md | tempered

to get:

# My Blog Post

by Chris Penner
Published on April 22, 2017

Here's my blog post!

---
COPYRIGHT 2017 CHRIS PENNER
CHECK ME OUT ON TWITTER @CHRISLPENNER!
SEE YOU NEXT TIME!

If you want you can add a shebang to the top of your template and just run it as an executable, tempered will strip the shebang for you automagically:

test.txt

#!/path/to/tempered
interpolate {{ echo $THIS }}
$ chmod +x test.txt
$ export THIS="that"
$ ./test.txt
interpolate that

Shell not powerful enough for you? No problem! Use all your favourite languages and tools; See the FAQ or examples to see how to integrate with scripts (spoilers, just call them like you do in bash!)

Examples Here

Installation

Mac and Linux binaries are provided HERE;

Homebrew On Mac

brew update
brew install ChrisPenner/tools/tempered

Stack

If you're familiar with Haskell Stack:

stack update && stack install tempered

FAQ

There's really not much to it; parses the file and runs anything inside {{ }} as a shell expression and pipes stdout into its spot. If you're clever you can do pretty much anything you want with this.

Variables?

Sure; It's bash.

Hello, my name is {{echo $USER}}

You can set up environment overrides in env.yaml, tempered looks up through the file-system to find an env.yaml from the cwd NOT the template location.

Here's an example env.yaml; we can do simple strings or commands here; just make sure to quote any entries that start with {{ or the YAML parser gets mad.

env.yaml

PROJECT: Tempered
DATE: "{{ date +'%B %d, %Y' }}"

Then you can use them just like normal variables.

For Loops?

It's bash; go for it:

{{ for i in 99 98 97 ; do
    cat <<EOF
$i bottles of beer on the wall
EOF
done }}

output:

99 bottles of beer on the wall
98 bottles of beer on the wall
97 bottles of beer on the wall

Other Scripts/Tools?

Duh! Interpolation works like a shell, just call the scripts or binaries you want! Here we'll use a simple python script to spice things up!

# favourites.py
import sys

print(" and ".join(sys.argv[1:]) + ",")
print("These are a few of my favourite things")
# My Favourite Things

{{ python favourites.py Gumdrops Roses Whiskers Kittens }}

When the dog bites
When the bee stings
When I'm feeling sad
I simply remember my favourite things
And then I don't feel so bad

Output:

# My Favourite Things

Gumdrops and Roses and Whiskers and Kittens,
These are a few of my favourite things

When the dog bites
When the bee stings
When I'm feeling sad
I simply remember my favourite things
And then I don't feel so bad

__: command not found?

Chances are you're forgetting to echo an env-var; {{ $TITLE }} will try to run the contents of $TITLE as a command, you want {{ echo "$TITLE" }}.

Isn't this whole thing a security risk?

Probably.