Documentation ¶
Overview ¶
Package liquid is a pure Go implementation of Shopify Liquid templates, developed for use in https://github.com/osteele/gojekyll.
See the project README https://github.com/osteele/liquid for additional information and implementation status.
The liquid package itself is versioned in gopkg.in. Subpackages have no compatibility guarantees. Except where specifically documented, the “public” entities of subpackages are intended only for use by the liquid package and its subpackages.
Example ¶
engine := NewEngine() source := `<h1>{{ page.title }}</h1>` bindings := map[string]interface{}{ "page": map[string]string{ "title": "Introduction", }, } out, err := engine.ParseAndRenderString(source, bindings) if err != nil { log.Fatalln(err) } fmt.Println(out)
Output: <h1>Introduction</h1>
Index ¶
- func FromDrop(object interface{}) interface{}
- func IterationKeyedMap(m map[string]interface{}) tags.IterationKeyedMap
- type Bindings
- type Drop
- type Engine
- func (e *Engine) Delims(objectLeft, objectRight, tagLeft, tagRight string) *Engine
- func (e *Engine) ParseAndRender(source []byte, b Bindings) ([]byte, SourceError)
- func (e *Engine) ParseAndRenderString(source string, b Bindings) (string, SourceError)
- func (e *Engine) ParseString(source string) (*Template, SourceError)
- func (e *Engine) ParseTemplate(source []byte) (*Template, SourceError)
- func (e *Engine) ParseTemplateLocation(source []byte, path string, line int) (*Template, SourceError)
- func (e *Engine) RegisterBlock(name string, td Renderer)
- func (e *Engine) RegisterFilter(name string, fn interface{})
- func (e *Engine) RegisterTag(name string, td Renderer)
- type Renderer
- type SourceError
- type Template
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func FromDrop ¶ added in v0.1.1
func FromDrop(object interface{}) interface{}
FromDrop returns returns object.ToLiquid() if object's type implement this function; else the object itself.
func IterationKeyedMap ¶ added in v0.1.1
func IterationKeyedMap(m map[string]interface{}) tags.IterationKeyedMap
IterationKeyedMap returns a map whose {% for %} tag iteration values are its keys, instead of [key, value] pairs. Use this to create a Go map with the semantics of a Ruby struct drop.
Example ¶
vars := map[string]interface{}{ "map": map[string]interface{}{"a": 1}, "keyed_map": IterationKeyedMap(map[string]interface{}{"a": 1}), } engine := NewEngine() out, err := engine.ParseAndRenderString( `{% for k in map %}{{ k[0] }}={{ k[1] }}.{% endfor %}`, vars) if err != nil { log.Fatal(err) } fmt.Println(out) out, err = engine.ParseAndRenderString( `{% for k in keyed_map %}{{ k }}={{ keyed_map[k] }}.{% endfor %}`, vars) if err != nil { log.Fatal(err) } fmt.Println(out)
Output: a=1. a=1.
Types ¶
type Bindings ¶
type Bindings map[string]interface{}
Bindings is a map of variable names to values.
Clients need not use this type. It is used solely for documentation. Callers can use instances of map[string]interface{} itself as argument values to functions declared with this parameter type.
type Drop ¶
type Drop interface {
ToLiquid() interface{}
}
Drop indicates that the object will present to templates as its ToLiquid value.
Example (Map) ¶
// type redConvertible struct{} // // func (c redConvertible) ToLiquid() interface{} { // return map[string]interface{}{ // "color": "red", // } // } engine := NewEngine() bindings := map[string]interface{}{ "car": redConvertible{}, } template := `{{ car.color }}` out, err := engine.ParseAndRenderString(template, bindings) if err != nil { log.Fatalln(err) } fmt.Println(out)
Output: red
Example (Struct) ¶
// type car struct{ color, model string } // // func (c car) ToLiquid() interface{} { // return carDrop{c.model, c.color} // } // // type carDrop struct { // Model string // Color string `liquid:"color"` // } // // func (c carDrop) Drive() string { // return "AWD" // } engine := NewEngine() bindings := map[string]interface{}{ "car": car{"blue", "S85"}, } template := `{{ car.color }} {{ car.Drive }} Model {{ car.Model }}` out, err := engine.ParseAndRenderString(template, bindings) if err != nil { log.Fatalln(err) } fmt.Println(out)
Output: blue AWD Model S85
type Engine ¶
type Engine struct {
// contains filtered or unexported fields
}
An Engine parses template source into renderable text.
An engine can be configured with additional filters and tags.
func (*Engine) Delims ¶ added in v0.1.1
Delims sets the action delimiters to the specified strings, to be used in subsequent calls to ParseTemplate, ParseTemplateLocation, ParseAndRender, or ParseAndRenderString. An empty delimiter stands for the corresponding default: objectLeft = {{, objectRight = }}, tagLeft = {% , tagRight = %}
func (*Engine) ParseAndRender ¶
func (e *Engine) ParseAndRender(source []byte, b Bindings) ([]byte, SourceError)
ParseAndRender parses and then renders the template.
func (*Engine) ParseAndRenderString ¶
func (e *Engine) ParseAndRenderString(source string, b Bindings) (string, SourceError)
ParseAndRenderString is a convenience wrapper for ParseAndRender, that takes string input and returns a string.
Example ¶
engine := NewEngine() source := `{{ hello | capitalize | append: " Mundo" }}` bindings := map[string]interface{}{"hello": "hola"} out, err := engine.ParseAndRenderString(source, bindings) if err != nil { log.Fatalln(err) } fmt.Println(out)
Output: Hola Mundo
func (*Engine) ParseString ¶ added in v0.1.1
func (e *Engine) ParseString(source string) (*Template, SourceError)
ParseString creates a new Template using the engine configuration.
func (*Engine) ParseTemplate ¶
func (e *Engine) ParseTemplate(source []byte) (*Template, SourceError)
ParseTemplate creates a new Template using the engine configuration.
Example ¶
engine := NewEngine() source := `{{ hello | capitalize | append: " Mundo" }}` bindings := map[string]interface{}{"hello": "hola"} tpl, err := engine.ParseString(source) if err != nil { log.Fatalln(err) } out, err := tpl.RenderString(bindings) if err != nil { log.Fatalln(err) } fmt.Println(out)
Output: Hola Mundo
func (*Engine) ParseTemplateLocation ¶ added in v0.1.1
func (e *Engine) ParseTemplateLocation(source []byte, path string, line int) (*Template, SourceError)
ParseTemplateLocation is the same as ParseTemplate, except that the source location is used for error reporting and for the {% include %} tag.
The path and line number are used for error reporting. The path is also the reference for relative pathnames in the {% include %} tag.
func (*Engine) RegisterBlock ¶
RegisterBlock defines a block e.g. {% tag %}…{% endtag %}.
Example ¶
engine := NewEngine() engine.RegisterBlock("length", func(c render.Context) (string, error) { s, err := c.InnerString() if err != nil { return "", err } n := len(s) return fmt.Sprint(n), nil }) template := `{% length %}abc{% endlength %}` out, err := engine.ParseAndRenderString(template, emptyBindings) if err != nil { log.Fatalln(err) } fmt.Println(out)
Output: 3
func (*Engine) RegisterFilter ¶
RegisterFilter defines a Liquid filter, for use as `{{ value | my_filter }}` or `{{ value | my_filter: arg }}`.
A filter is a function that takes at least one input, and returns one or two outputs. If it returns two outputs, the second must have type error.
Examples:
* https://github.com/osteele/liquid/blob/master/filters/filters.go
* https://github.com/osteele/gojekyll/blob/master/filters/filters.go
Example ¶
engine := NewEngine() engine.RegisterFilter("has_prefix", strings.HasPrefix) template := `{{ title | has_prefix: "Intro" }}` bindings := map[string]interface{}{ "title": "Introduction", } out, err := engine.ParseAndRenderString(template, bindings) if err != nil { log.Fatalln(err) } fmt.Println(out)
Output: true
Example (Optional_argument) ¶
engine := NewEngine() // func(a, b int) int) would default the second argument to zero. // Then we can't tell the difference between {{ n | inc }} and // {{ n | inc: 0 }}. A function in the parameter list has a special // meaning as a default parameter. engine.RegisterFilter("inc", func(a int, b func(int) int) int { return a + b(1) }) template := `10 + 1 = {{ m | inc }}; 20 + 5 = {{ n | inc: 5 }}` bindings := map[string]interface{}{ "m": 10, "n": "20", } out, err := engine.ParseAndRenderString(template, bindings) if err != nil { log.Fatalln(err) } fmt.Println(out)
Output: 10 + 1 = 11; 20 + 5 = 25
func (*Engine) RegisterTag ¶
RegisterTag defines a tag e.g. {% tag %}.
Further examples are in https://github.com/osteele/gojekyll/blob/master/tags/tags.go
Example ¶
engine := NewEngine() engine.RegisterTag("echo", func(c render.Context) (string, error) { return c.TagArgs(), nil }) template := `{% echo hello world %}` out, err := engine.ParseAndRenderString(template, emptyBindings) if err != nil { log.Fatalln(err) } fmt.Println(out)
Output: hello world
type Renderer ¶
A Renderer returns the rendered string for a block. This is the type of a tag definition.
See the examples at Engine.RegisterTag and Engine.RegisterBlock.
type SourceError ¶ added in v0.1.1
SourceError records an error with a source location and optional cause.
SourceError does not depend on, but is compatible with, the causer interface of https://github.com/pkg/errors.
type Template ¶
type Template struct {
// contains filtered or unexported fields
}
A Template is a compiled Liquid template. It knows how to evaluate itself within a variable binding environment, to create a rendered byte slice.
Use Engine.ParseTemplate to create a template.
func (*Template) Render ¶
func (t *Template) Render(vars Bindings) ([]byte, SourceError)
Render executes the template with the specified variable bindings.
func (*Template) RenderString ¶
func (t *Template) RenderString(b Bindings) (string, SourceError)
RenderString is a convenience wrapper for Render, that has string input and output.
Directories ¶
Path | Synopsis |
---|---|
cmd
|
|
liquid
Package main defines a command-line interface to the Liquid engine.
|
Package main defines a command-line interface to the Liquid engine. |
Package evaluator is an interim internal package that forwards to package values.
|
Package evaluator is an interim internal package that forwards to package values. |
Package expressions is an internal package that parses and evaluates the expression language.
|
Package expressions is an internal package that parses and evaluates the expression language. |
Package filters is an internal package that defines the standard Liquid filters.
|
Package filters is an internal package that defines the standard Liquid filters. |
Package parser is an internal package that parses template source into an abstract syntax tree.
|
Package parser is an internal package that parses template source into an abstract syntax tree. |
Package render is an internal package that renders a compiled template parse tree.
|
Package render is an internal package that renders a compiled template parse tree. |
Package tags is an internal package that defines the standard Liquid tags.
|
Package tags is an internal package that defines the standard Liquid tags. |
Package values is an internal package that defines methods such as sorting, comparison, and type conversion, that apply to interface types.
|
Package values is an internal package that defines methods such as sorting, comparison, and type conversion, that apply to interface types. |