Awesome
Tempered
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!)
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.