1
0
mirror of https://github.com/danog/gojekyll.git synced 2024-11-27 14:44:43 +01:00
gojekyll/liquid/link_tag.go

77 lines
1.8 KiB
Go
Raw Normal View History

package liquid
import (
"fmt"
"io"
"strings"
"github.com/acstech/liquid"
"github.com/acstech/liquid/core"
)
func init() {
liquid.Tags["link"] = LinkFactory
}
// A FilePathURLGetter given an include tag file name returns a URL.
type FilePathURLGetter func(string) (string, bool)
var filePathURLGetter FilePathURLGetter
// SetFilePathURLGetter sets the function that resolves an include tag file name to a URL.
func SetFilePathURLGetter(getter FilePathURLGetter) {
filePathURLGetter = getter
}
// LinkFactory creates a link tag
func LinkFactory(p *core.Parser, config *core.Configuration) (core.Tag, error) {
start := p.Position
p.SkipPastTag()
end := p.Position - 2
2017-06-17 02:06:55 +02:00
name := strings.TrimSpace(string(p.Data[start:end]))
url, ok := filePathURLGetter(name)
if !ok {
2017-06-17 02:06:55 +02:00
return nil, fmt.Errorf("link tag: %s not found", name)
}
2017-06-13 14:49:44 +02:00
return &Link{url}, nil
}
// Link tag data, for passing information from the factory to Execute
type Link struct {
2017-06-13 14:49:44 +02:00
url string
}
// AddCode is equired by the Liquid tag interface
func (l *Link) AddCode(code core.Code) {
panic("AddCode should not have been called on a Link")
}
// AddSibling is required by the Liquid tag interface
func (l *Link) AddSibling(tag core.Tag) error {
panic("AddSibling should not have been called on a Link")
}
// LastSibling is required by the Liquid tag interface
func (l *Link) LastSibling() core.Tag {
return nil
}
// Execute is required by the Liquid tag interface
func (l *Link) Execute(writer io.Writer, data map[string]interface{}) core.ExecuteState {
2017-06-13 14:49:44 +02:00
if _, err := writer.Write([]byte(l.url)); err != nil {
2017-06-12 02:05:17 +02:00
panic(err)
}
return core.Normal
}
// Name is required by the Liquid tag interface
func (l *Link) Name() string {
return "link"
}
// Type is required by the Liquid tag interface
func (l *Link) Type() core.TagType {
return core.StandaloneTag
}