2017-06-25 17:23:20 +02:00
# Go Liquid Template Parser
2017-07-02 14:47:10 +02:00
2017-07-07 11:41:37 +02:00
[![][travis-svg]][travis-url] [![][coveralls-svg]][coveralls-url] [![][go-report-card-svg]][go-report-card-url] [![][godoc-svg]][godoc-url] [![][license-svg]][license-url]
2017-06-25 17:23:20 +02:00
2017-07-02 14:47:10 +02:00
> “Any sufficiently complicated C or Fortran program contains an ad-hoc, informally-specified, bug-ridden, slow implementation of half of Common Lisp.” – Philip Greenspun
2017-07-02 02:24:27 +02:00
2017-07-02 06:10:54 +02:00
`liquid` ports [Shopify Liquid templates ](https://shopify.github.io/liquid ) to Go. It was developed for use in [gojekyll ](https://github.com/osteele/gojekyll ).
2017-07-02 02:24:27 +02:00
<!-- TOC -->
- [Go Liquid Template Parser ](#go-liquid-template-parser )
2017-07-10 18:05:11 +02:00
- [Differences from Liquid ](#differences-from-liquid )
2017-07-10 20:33:29 +02:00
- [Stability Guarantees ](#stability-guarantees )
2017-07-02 02:24:27 +02:00
- [Install ](#install )
2017-07-10 05:15:05 +02:00
- [Usage ](#usage )
- [Command-Line tool ](#command-line-tool )
2017-07-05 15:51:00 +02:00
- [Contributing ](#contributing )
2017-07-02 02:24:27 +02:00
- [References ](#references )
- [Attribution ](#attribution )
- [Other Implementations ](#other-implementations )
- [Go ](#go )
- [Other Languages ](#other-languages )
- [License ](#license )
<!-- /TOC -->
2017-06-25 17:23:20 +02:00
2017-07-10 18:05:11 +02:00
### Differences from Liquid
2017-07-07 15:35:47 +02:00
2017-07-10 18:05:11 +02:00
Refer to the [feature parity board ](https://github.com/osteele/liquid/projects/1 ) for a list of differences from Liquid.
2017-07-07 15:35:47 +02:00
2017-07-10 18:05:11 +02:00
In brief, these aren't implemented:
2017-07-07 15:35:47 +02:00
2017-07-10 18:05:11 +02:00
- The `cycle` and `tablerow` tags
- `{% case %}…{% else %}` and `{% when a or b %}`
2017-07-10 22:47:11 +02:00
- The `sort_natural` , `url_decode` , and `url_encode` filters
2017-07-10 18:05:11 +02:00
- Loop ranges `{% for a in 1...10 %}`
- Error modes
- Whitespace control
2017-07-05 19:56:19 +02:00
2017-07-10 22:47:11 +02:00
These are opinionated differences that unlikely to change:
- The expression parser accepts parentheses in more locations
- The `truncatewords` filter leaves whitespace prior to the truncation point unchanged.
2017-07-10 20:33:29 +02:00
## Stability Guarantees
This library is at an early stage of development.
It has been mostly used by its author.
2017-07-10 22:47:11 +02:00
Until it reaches 1.0, breaking changes will accompanied by a bump in the minor version, not the major version. For example, tag `v0.2` is incompatible with `v0.1` and (hypothetical) `v0.1.1` . ([gopkg.in](http://gopkg.in) doesn't work this way, so you won't can't use `gopkg.in/osteele/liquid.v0.1` to specify version 0.1.)
2017-07-10 20:33:29 +02:00
2017-07-10 22:47:11 +02:00
Even within these parameters, only the liquid package itself, and the sub-package APIs that it documents, are guaranteed stable. For example, `render.Context` is documented as the parameter type for tag definitions; it therefore has the same stability guarantees as `liquid.Engine` and `liquid.Template` . Other "public" definitions in `render` and in other sub-packages are intended only for use in other packages in this repo; they are not generally stable between even sub-minor releases.
2017-07-10 20:33:29 +02:00
2017-06-25 17:23:20 +02:00
## Install
2017-07-10 20:33:29 +02:00
`go get gopkg.in/osteele/liquid.v0.2` -- latest snapshot
2017-07-10 05:15:05 +02:00
`go get -u github.com/osteele/goliquid` -- development version
## Usage
2017-06-25 17:23:20 +02:00
2017-07-10 05:15:05 +02:00
```go
engine := NewEngine()
template := `<h1>{{ page.title }}</h1>`
bindings := map[string]interface{}{
"page": map[string]string{
"title": "Introduction",
},
}
out, err := engine.ParseAndRenderString(template, bindings)
if err != nil { log.Fatalln(err) }
fmt.Println(out)
// Output: < h1 > Introduction< / h1 >
```
### Command-Line tool
`go install gopkg.in/osteele/liquid.v0/cmd/liquid` installs a command-line `liquid` program in your GO bin.
2017-07-05 19:46:30 +02:00
This is intended to make it easier to create test cases for bug reports.
2017-07-10 05:15:05 +02:00
```bash
$ liquid --help
usage: liquid [FILE]
$ echo '{{ "Hello World" | downcase | split: " " | first | append: "!"}}' | liquid
hello!
```
2017-07-05 19:46:30 +02:00
2017-07-05 15:51:00 +02:00
## Contributing
2017-06-25 18:36:28 +02:00
2017-07-05 15:51:00 +02:00
Bug reports, test cases, and code contributions are more than welcome.
Please refer to the [contribution guidelines ](./CONTRIBUTING.md ).
2017-06-28 00:06:26 +02:00
2017-07-02 02:24:27 +02:00
## References
2017-06-28 00:06:26 +02:00
2017-07-05 16:37:46 +02:00
* [Shopify.github.io/liquid ](https://shopify.github.io/liquid )
* [Liquid for Designers ](https://github.com/Shopify/liquid/wiki/Liquid-for-Designers )
* [Liquid for Programmers ](https://github.com/Shopify/liquid/wiki/Liquid-for-Programmers )
2017-07-02 02:24:27 +02:00
* [Help.shopify.com ](https://help.shopify.com/themes/liquid ) goes into more detail, but includes features that aren't present in core Liquid as used by Jekyll.
2017-06-28 00:06:26 +02:00
2017-06-25 22:21:31 +02:00
## Attribution
2017-07-11 03:13:13 +02:00
| Package | Author | Description | License |
|-----------------------------------------------------|-----------------|-----------------------------------------|--------------------|
| [gopkg.in/yaml.v2 ](https://github.com/go-yaml/yaml ) | Canonical | YAML support (for printing parse trees) | Apache License 2.0 |
| [Ragel ](http://www.colm.net/open-source/ragel/ ) | Adrian Thurston | scanning expressions | MIT |
2017-06-28 00:06:26 +02:00
2017-06-25 22:21:31 +02:00
Michael Hamrah's [Lexing with Ragel and Parsing with Yacc using Go ](https://medium.com/@mhamrah/lexing-with-ragel-and-parsing-with-yacc-using-go-81e50475f88f ) was essential to understanding `go yacc` .
2017-06-26 14:23:50 +02:00
2017-06-28 22:43:18 +02:00
The [original Liquid engine ](https://shopify.github.io/liquid ), of course, for the design and documentation of the Liquid template language. Many of the tag and filter test cases are taken directly from the Liquid documentation.
2017-06-28 00:06:26 +02:00
2017-06-28 15:45:20 +02:00
## Other Implementations
2017-07-02 02:24:27 +02:00
### Go
* [karlseguin/liquid ](https://github.com/karlseguin/liquid ) is a dormant implementation that inspired a lot of forks.
2017-07-05 15:51:00 +02:00
* [acstech/liquid ](https://github.com/acstech/liquid ) is a more active fork of Karl Seguin's implementation.
* [hownowstephen/go-liquid ](https://github.com/hownowstephen/go-liquid )
2017-06-28 15:45:20 +02:00
2017-07-02 02:24:27 +02:00
### Other Languages
2017-06-28 15:45:20 +02:00
2017-07-02 02:24:27 +02:00
See Shopify's [ports of Liquid to other environments ](https://github.com/Shopify/liquid/wiki/Ports-of-Liquid-to-other-environments ).
2017-06-28 15:45:20 +02:00
2017-06-26 14:23:50 +02:00
## License
MIT License
2017-07-07 11:41:37 +02:00
[coveralls-url]: https://coveralls.io/r/osteele/liquid?branch=master
[coveralls-svg]: https://img.shields.io/coveralls/osteele/liquid.svg?branch=master
[godoc-url]: https://godoc.org/github.com/osteele/liquid
[godoc-svg]: https://godoc.org/github.com/osteele/liquid?status.svg
[license-url]: https://github.com/osteele/liquid/blob/master/LICENSE
[license-svg]: https://img.shields.io/badge/license-MIT-blue.svg
[go-report-card-url]: https://goreportcard.com/report/github.com/osteele/liquid
[go-report-card-svg]: https://goreportcard.com/badge/github.com/osteele/liquid
[travis-url]: https://travis-ci.org/osteele/liquid
[travis-svg]: https://img.shields.io/travis/osteele/liquid.svg?branch=master