1
0
mirror of https://github.com/danog/liquid.git synced 2024-11-27 02:34:39 +01:00
Go to file
2017-07-01 23:52:38 -04:00
chunks Lint 2017-07-01 23:52:23 -04:00
expressions Lint 2017-07-01 23:52:23 -04:00
filters Lint 2017-07-01 23:52:23 -04:00
generics Lint 2017-07-01 23:52:23 -04:00
tags Simplify external tag interface 2017-07-01 10:36:47 -04:00
.gitignore Makefile default target is ci 2017-06-27 18:10:12 -04:00
.travis.yml Add a Travis file 2017-06-26 10:16:02 -04:00
context.go New top-level Context wrapper 2017-07-01 23:52:38 -04:00
engine.go New top-level Context wrapper 2017-07-01 23:52:38 -04:00
interface.go New top-level Context wrapper 2017-07-01 23:52:38 -04:00
LICENSE Create LICENSE 2017-06-26 15:36:29 -04:00
liquid_test.go New top-level Context wrapper 2017-07-01 23:52:38 -04:00
Makefile Add more dependencies to credits 2017-06-29 11:15:13 -04:00
README.md Lint 2017-07-01 23:52:23 -04:00
template.go New top-level Context wrapper 2017-07-01 23:52:38 -04:00
test.html Implement forloop variables 2017-06-28 20:49:38 -04:00

Go Liquid Template Parser

Build Status Go Report Card GoDoc

liquid is a pure Go implementation of Shopify Liquid templates, for use in gojekyll.

It supports a functional API for defining tags and filters. On the one hand, this isn't idiomatic Go. On the other hand, this made it possibly to quickly implement a boatload of Liquid and Jekyll filters that would otherwise have been onerous. The jury is still out…

Status

This library is in its early days. IMO it's not sufficiently mature to be worth snapping off a versioned URL. In particular, the tag and filter extension API is likely to change.

  • Basics
    • Literals
      • String Escapes
    • Variables
    • Operators (partial)
    • Arrays
    • Whitespace Control
  • Tags
    • Comment
    • Control Flow
      • if/else/elsif
      • unless
      • case
        • when
        • else
    • Iteration
      • modifiers (limit, reversed, offset)
      • range
      • break, continue
      • loop variables
      • tablerow
      • cycle
    • Raw
    • Variables
      • Assign
      • Capture
  • Filters
    • sort_natural, uniq, escape, truncatewords, url_decode, url_encode
    • everything else

Install

go get -u github.com/osteele/goliquid

Contribute

Setup

make setup

Workflow

go test ./...

Test just the scanner:

cd expressions
ragel -Z scanner.rl && go test

Preview the documentation:

godoc -http=:6060&
open http://localhost:6060/pkg/github.com/osteele/liquid/

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.

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:

go generate ./...

References

Attribution

Package Author Description License
gopkg.in/yaml.v2 Canonical YAML support (for printing parse trees) Apache License 2.0
jeffjen/datefmt Jeffrey Jen Go bindings to GNU strftime and strptime MIT
Ragel Adrian Thurston scanning expressions MIT

Michael Hamrah's Lexing with Ragel and Parsing with Yacc using Go was essential to understanding go yacc.

The original Liquid engine, 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.

Other Implementations

Go

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.

Other Languages

See Shopify's ports of Liquid to other environments.

License

MIT License