206 lines
3.9 KiB
Markdown
206 lines
3.9 KiB
Markdown
Tempered
|
|
======
|
|
|
|
[](https://hackage.haskell.org/package/tempered)
|
|
|
|
A dead-simple templating utility for simple shell interpolation.
|
|
Use at your own risk and only on trusted templates.
|
|
|
|
```bash
|
|
$ 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:
|
|
|
|
```md
|
|
{{ # 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' }}
|
|
```
|
|
|
|
```md
|
|
{{ # 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 }}
|
|
```
|
|
|
|
```bash
|
|
$ 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**](https://github.com/ChrisPenner/tempered/tree/master/examples)
|
|
|
|
Installation
|
|
============
|
|
|
|
Mac and Linux binaries are provided [HERE](https://github.com/ChrisPenner/tempered/releases/latest);
|
|
|
|
### 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.
|
|
|
|
```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
|
|
```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:
|
|
```bash
|
|
{{ 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!
|
|
|
|
```python
|
|
# 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.
|