1
0
mirror of https://github.com/danog/liquid.git synced 2024-12-03 13:17:45 +01:00
liquid/README.md

151 lines
6.0 KiB
Markdown
Raw Normal View History

2017-06-25 17:23:20 +02:00
# Go Liquid Template Parser
2017-07-02 14:47:10 +02:00
2017-07-02 02:24:27 +02:00
[![Build Status](https://travis-ci.org/osteele/liquid.svg?branch=master)](https://travis-ci.org/osteele/liquid)
[![Go Report Card](https://goreportcard.com/badge/github.com/osteele/liquid)](https://goreportcard.com/report/github.com/osteele/liquid)
2017-06-28 15:45:20 +02:00
[![GoDoc](https://godoc.org/github.com/osteele/liquid?status.svg)](http://godoc.org/github.com/osteele/liquid)
2017-07-02 14:47:10 +02:00
[![Coverage Status](https://coveralls.io/repos/github/osteele/liquid/badge.svg?branch=master)](https://coveralls.io/github/osteele/liquid?branch=master)
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
`liquid` ports [Shopify Liquid templates](https://shopify.github.io/liquid) to Go. It was developed for use in [gojekyll](https://github.com/osteele/gojekyll).
`liquid` provides a functional API for defining tags and filters. See examples [here](https://github.com/osteele/liquid/blob/master/filters/filters.go), [here](https://github.com/osteele/gojekyll/blob/master/filters/filters.go), and [here](https://github.com/osteele/gojekyll/blob/master/tags/tags.go). On the one hand, this isn't idiomatic Go. On the other hand, this made it possible to implement a boatload of Liquid and Jekyll filters without an onerous amount of boilerplate in some cases, simply by passing a reference to a function from the standard library.
2017-07-02 02:24:27 +02:00
<!-- TOC -->
- [Go Liquid Template Parser](#go-liquid-template-parser)
- [Status](#status)
- [Install](#install)
- [Contribute](#contribute)
- [Setup](#setup)
- [Workflow](#workflow)
2017-07-02 05:52:23 +02:00
- [Style Guide](#style-guide)
2017-07-02 02:24:27 +02:00
- [Working on the Parser and Lexer](#working-on-the-parser-and-lexer)
- [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
## Status
2017-07-02 02:24:27 +02:00
This library is in its early days. IMO it's not sufficiently mature to be worth snapping off a [versioned URL](http://labix.org/gopkg.in). In particular, the tag and filter extension API is likely to change.
2017-06-25 17:23:20 +02:00
- [ ] Basics
2017-06-26 21:36:05 +02:00
- [x] Literals
- [ ] String Escapes
2017-06-26 04:59:33 +02:00
- [x] Variables
2017-06-28 15:45:20 +02:00
- [ ] Operators (partial)
2017-06-26 21:36:05 +02:00
- [x] Arrays
2017-06-25 17:23:20 +02:00
- [ ] Whitespace Control
- [ ] Tags
2017-06-27 19:47:14 +02:00
- [x] Comment
2017-06-25 17:23:20 +02:00
- [ ] Control Flow
- [x] `if`/`else`/`elsif`
- [x] `unless`
2017-07-02 02:24:27 +02:00
- [x] `case`
2017-06-28 22:43:18 +02:00
- [x] `when`
- [ ] `else`
2017-06-25 17:23:20 +02:00
- [ ] Iteration
2017-06-28 22:18:32 +02:00
- [x] modifiers (`limit`, `reversed`, `offset`)
- [ ] `range`
2017-06-29 18:20:16 +02:00
- [x] `break`, `continue`
2017-06-29 02:49:38 +02:00
- [x] loop variables
- [ ] `tablerow`
- [ ] `cycle`
2017-06-27 23:40:15 +02:00
- [x] Raw
2017-06-28 22:43:18 +02:00
- [x] Variables
2017-06-26 21:36:05 +02:00
- [x] Assign
2017-06-28 19:47:49 +02:00
- [x] Capture
2017-06-28 22:43:18 +02:00
- [ ] Filters
- [ ] `sort_natural`, `uniq`, `escape`, `truncatewords`, `url_decode`, `url_encode`
- [x] everything else
2017-06-25 17:23:20 +02:00
## Install
`go get -u github.com/osteele/goliquid`
2017-06-25 18:36:28 +02:00
## Contribute
### Setup
2017-06-25 17:23:20 +02:00
```bash
2017-07-02 14:01:12 +02:00
make install-dev-tools
2017-06-25 17:23:20 +02:00
```
2017-06-25 18:36:28 +02:00
### Workflow
2017-06-25 17:23:20 +02:00
```bash
2017-06-26 21:36:05 +02:00
go test ./...
2017-06-25 17:23:20 +02:00
```
2017-06-25 18:36:28 +02:00
Test just the scanner:
```bash
2017-06-26 21:36:05 +02:00
cd expressions
ragel -Z scanner.rl && go test
2017-06-25 22:21:31 +02:00
```
2017-06-29 19:08:25 +02:00
Preview the documentation:
```bash
godoc -http=:6060&
open http://localhost:6060/pkg/github.com/osteele/liquid/
```
2017-07-02 05:52:23 +02:00
### Style Guide
`make test` and `make lint` should pass.
The cyclomatic complexity checks on generated functions, hand-written parsers, and some of the generic interpreter functions, have been disabled (via `nolint: gocyclo`). IMO this check isn't appropriate for those classes of functions. This isn't a license to disable cyclomatic complexity or lint in general willy nilly.
2017-07-02 02:24:27 +02:00
### Working on the Parser and Lexer
To work on the lexer, install Ragel. On macOS: `brew install ragel`.
Do this after editing `scanner.rl` or `expressions.y`:
2017-06-28 00:06:26 +02:00
2017-07-02 02:24:27 +02:00
```bash
go generate ./...
```
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-02 02:24:27 +02:00
* [Shopify.github.io/liquid](https://shopify.github.io/liquid) is the definitive reference.
* [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.
* Shopify's [Liquid for Designers](https://github.com/Shopify/liquid/wiki/Liquid-for-Designers) is another take.
2017-06-28 00:06:26 +02:00
2017-06-25 22:21:31 +02:00
## Attribution
2017-07-02 02:24:27 +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 |
| [jeffjen/datefmt](https://github.com/jeffjen/datefmt) | Jeffrey Jen | Go bindings to GNU `strftime` and `strptime` | MIT |
| [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-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.
* [acstech/liquid](https://github.com/acstech/liquid) is a more active fork of Karl Seguin's implementation. I submitted a couple of pull requests there.
* [hownowstephen/go-liquid](https://github.com/hownowstephen/go-liquid) is a more recent entry.
After trying each of these, and looking at how to extend them, I concluded that I wasn't going to get very far without a parser generator. I also wanted an easy API for writing filters.
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
## License
MIT License