mirror of
https://github.com/danog/gojekyll.git
synced 2024-11-26 19:34:52 +01:00
Move VariableMap -> new templates package
This commit is contained in:
parent
d18b8931d3
commit
6367a8d0e0
@ -13,6 +13,7 @@ import (
|
||||
|
||||
"github.com/osteele/gojekyll"
|
||||
"github.com/osteele/gojekyll/helpers"
|
||||
"github.com/osteele/gojekyll/templates"
|
||||
)
|
||||
|
||||
// main sets this
|
||||
@ -75,16 +76,16 @@ func varsCommand(site *gojekyll.Site) error {
|
||||
// (Actually it's circular, which the yaml package can't handle.)
|
||||
// Neuter it. This destroys it as Liquid data, but that's okay in this context.
|
||||
for _, c := range site.Collections {
|
||||
siteData[c.Name] = fmt.Sprintf("<elided page data for %d items>", len(siteData[c.Name].([]gojekyll.VariableMap)))
|
||||
siteData[c.Name] = fmt.Sprintf("<elided page data for %d items>", len(siteData[c.Name].([]templates.VariableMap)))
|
||||
}
|
||||
var data interface{} //gojekyll.VariableMap
|
||||
var data interface{} //templates.VariableMap
|
||||
switch {
|
||||
case *siteVariable:
|
||||
data = siteData
|
||||
case *dataVariable:
|
||||
data = siteData["data"].(gojekyll.VariableMap)
|
||||
data = siteData["data"].(templates.VariableMap)
|
||||
if *variablePath != "" {
|
||||
data = data.(gojekyll.VariableMap)[*variablePath]
|
||||
data = data.(templates.VariableMap)[*variablePath]
|
||||
}
|
||||
default:
|
||||
page, err := cliPage(site, *variablePath)
|
||||
@ -138,12 +139,12 @@ func cliPage(s *gojekyll.Site, path string) (gojekyll.Page, error) {
|
||||
path = "/"
|
||||
}
|
||||
switch {
|
||||
case strings.HasPrefix(path, "/"):
|
||||
page, found := s.URLPage(path)
|
||||
if !found {
|
||||
return nil, helpers.NewPathError("render", path, "the site does not include a file with this URL path")
|
||||
}
|
||||
return page, nil
|
||||
case strings.HasPrefix(path, "/"):
|
||||
page, found := s.URLPage(path)
|
||||
if !found {
|
||||
return nil, helpers.NewPathError("render", path, "the site does not include a file with this URL path")
|
||||
}
|
||||
return page, nil
|
||||
default:
|
||||
page, found := s.RelPathPage(path)
|
||||
if !found {
|
||||
|
@ -5,18 +5,20 @@ import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"github.com/osteele/gojekyll/templates"
|
||||
)
|
||||
|
||||
// Collection is a Jekyll collection.
|
||||
type Collection struct {
|
||||
Site *Site
|
||||
Name string
|
||||
Data VariableMap
|
||||
Data templates.VariableMap
|
||||
pages []Page
|
||||
}
|
||||
|
||||
// NewCollection creates a new Collection with defaults d
|
||||
func NewCollection(s *Site, name string, d VariableMap) *Collection {
|
||||
func NewCollection(s *Site, name string, d templates.VariableMap) *Collection {
|
||||
return &Collection{
|
||||
Site: s,
|
||||
Name: name,
|
||||
@ -28,7 +30,7 @@ func NewCollection(s *Site, name string, d VariableMap) *Collection {
|
||||
func (c *Collection) IsPosts() bool { return c.Name == "posts" }
|
||||
|
||||
// Output returns a bool indicating whether files in this collection should be written.
|
||||
func (c *Collection) Output() bool { return c.Data.Bool("output", false) }
|
||||
func (c *Collection) Output() bool { return c.Data.Bool("output", false) }
|
||||
|
||||
// PathPrefix returns the collection's directory prefix, e.g. "_posts/"
|
||||
func (c *Collection) PathPrefix() string { return filepath.FromSlash("_" + c.Name + "/") }
|
||||
@ -38,7 +40,7 @@ func (c *Collection) Source() string { return filepath.Join(c.Site.Source, "_"+c
|
||||
|
||||
// TemplateVariable returns an array of page objects, for use as the template variable
|
||||
// value of the collection.
|
||||
func (c *Collection) TemplateVariable() (d []VariableMap) {
|
||||
func (c *Collection) TemplateVariable() (d []templates.VariableMap) {
|
||||
for _, page := range c.Pages() {
|
||||
d = append(d, page.Variables())
|
||||
}
|
||||
@ -47,7 +49,7 @@ func (c *Collection) TemplateVariable() (d []VariableMap) {
|
||||
|
||||
// ReadPages scans the file system for collection pages, and adds them to c.Pages.
|
||||
func (c *Collection) ReadPages() error {
|
||||
collectionDefaults := MergeVariableMaps(c.Data, VariableMap{
|
||||
collectionDefaults := templates.MergeVariableMaps(c.Data, templates.VariableMap{
|
||||
"collection": c.Name,
|
||||
})
|
||||
|
||||
@ -71,7 +73,7 @@ func (c *Collection) ReadPages() error {
|
||||
case info.IsDir():
|
||||
return nil
|
||||
}
|
||||
defaults := MergeVariableMaps(c.Site.GetFrontMatterDefaults(relname, ""), collectionDefaults)
|
||||
defaults := templates.MergeVariableMaps(c.Site.GetFrontMatterDefaults(relname, ""), collectionDefaults)
|
||||
p, err := NewPageFromFile(c.Site, c, filename, relname, defaults)
|
||||
switch {
|
||||
case err != nil:
|
||||
|
@ -9,6 +9,7 @@ import (
|
||||
|
||||
"github.com/osteele/gojekyll/helpers"
|
||||
"github.com/osteele/gojekyll/liquid"
|
||||
"github.com/osteele/gojekyll/templates"
|
||||
"github.com/russross/blackfriday"
|
||||
|
||||
yaml "gopkg.in/yaml.v2"
|
||||
@ -34,14 +35,14 @@ func newDynamicPageFromFile(filename string, f pageFields) (*DynamicPage, error)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
f.frontMatter = MergeVariableMaps(f.frontMatter, frontMatter)
|
||||
f.frontMatter = templates.MergeVariableMaps(f.frontMatter, frontMatter)
|
||||
return &DynamicPage{
|
||||
pageFields: f,
|
||||
raw: b,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func readFrontMatter(sourcePtr *[]byte) (frontMatter VariableMap, err error) {
|
||||
func readFrontMatter(sourcePtr *[]byte) (frontMatter templates.VariableMap, err error) {
|
||||
var (
|
||||
source = *sourcePtr
|
||||
start = 0
|
||||
@ -65,7 +66,7 @@ func readFrontMatter(sourcePtr *[]byte) (frontMatter VariableMap, err error) {
|
||||
}
|
||||
|
||||
// Variables returns the attributes of the template page object.
|
||||
func (p *DynamicPage) Variables() VariableMap {
|
||||
func (p *DynamicPage) Variables() templates.VariableMap {
|
||||
var (
|
||||
relpath = p.relpath
|
||||
ext = filepath.Ext(relpath)
|
||||
@ -78,7 +79,7 @@ func (p *DynamicPage) Variables() VariableMap {
|
||||
content = &[]byte{}
|
||||
}
|
||||
|
||||
data := VariableMap{
|
||||
data := templates.VariableMap{
|
||||
"path": relpath,
|
||||
"url": p.Permalink(),
|
||||
"content": content,
|
||||
@ -122,8 +123,8 @@ func (p *DynamicPage) Variables() VariableMap {
|
||||
}
|
||||
|
||||
// TemplateContext returns the local variables for template evaluation
|
||||
func (p *DynamicPage) TemplateContext(ctx Context) VariableMap {
|
||||
return VariableMap{
|
||||
func (p *DynamicPage) TemplateContext(ctx Context) templates.VariableMap {
|
||||
return templates.VariableMap{
|
||||
"page": p.Variables(),
|
||||
"site": ctx.SiteVariables(),
|
||||
}
|
||||
@ -173,7 +174,7 @@ func (p *DynamicPage) Write(ctx Context, w io.Writer) error {
|
||||
return err
|
||||
}
|
||||
|
||||
func (p *DynamicPage) applyLayout(ctx Context, frontMatter VariableMap, body []byte) ([]byte, error) {
|
||||
func (p *DynamicPage) applyLayout(ctx Context, frontMatter templates.VariableMap, body []byte) ([]byte, error) {
|
||||
for {
|
||||
name := frontMatter.String("layout", "")
|
||||
if name == "" {
|
||||
@ -183,7 +184,7 @@ func (p *DynamicPage) applyLayout(ctx Context, frontMatter VariableMap, body []b
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
vars := MergeVariableMaps(p.TemplateContext(ctx), VariableMap{
|
||||
vars := templates.MergeVariableMaps(p.TemplateContext(ctx), templates.VariableMap{
|
||||
"content": string(body),
|
||||
"layout": frontMatter,
|
||||
})
|
||||
|
@ -8,10 +8,11 @@ import (
|
||||
"strings"
|
||||
|
||||
"github.com/osteele/gojekyll/liquid"
|
||||
"github.com/osteele/gojekyll/templates"
|
||||
)
|
||||
|
||||
// FindLayout returns a template for the named layout.
|
||||
func (s *Site) FindLayout(base string, fm *VariableMap) (t liquid.Template, err error) {
|
||||
func (s *Site) FindLayout(base string, fm *templates.VariableMap) (t liquid.Template, err error) {
|
||||
exts := []string{"", ".html"}
|
||||
for _, ext := range strings.SplitN(s.config.MarkdownExt, `,`, -1) {
|
||||
exts = append(exts, "."+ext)
|
||||
|
19
page.go
19
page.go
@ -13,6 +13,7 @@ import (
|
||||
|
||||
"github.com/osteele/gojekyll/helpers"
|
||||
"github.com/osteele/gojekyll/liquid"
|
||||
"github.com/osteele/gojekyll/templates"
|
||||
)
|
||||
|
||||
var (
|
||||
@ -34,7 +35,7 @@ type Page interface {
|
||||
Write(Context, io.Writer) error
|
||||
|
||||
// Variables
|
||||
Variables() VariableMap
|
||||
Variables() templates.VariableMap
|
||||
|
||||
// internal
|
||||
initPermalink() error
|
||||
@ -42,11 +43,11 @@ type Page interface {
|
||||
|
||||
// Context provides context information to a Page.
|
||||
type Context interface {
|
||||
FindLayout(relname string, frontMatter *VariableMap) (liquid.Template, error)
|
||||
FindLayout(relname string, frontMatter *templates.VariableMap) (liquid.Template, error)
|
||||
IsMarkdown(filename string) bool
|
||||
IsSassPath(filename string) bool
|
||||
SassIncludePaths() []string
|
||||
SiteVariables() VariableMap
|
||||
SiteVariables() templates.VariableMap
|
||||
SourceDir() string
|
||||
TemplateEngine() liquid.Engine
|
||||
WriteSass(io.Writer, []byte) error
|
||||
@ -66,7 +67,7 @@ type pageFields struct {
|
||||
outputExt string
|
||||
permalink string // cached permalink
|
||||
modTime time.Time
|
||||
frontMatter VariableMap // page front matter, merged with defaults
|
||||
frontMatter templates.VariableMap // page front matter, merged with defaults
|
||||
isMarkdown bool
|
||||
}
|
||||
|
||||
@ -82,7 +83,7 @@ func (p *pageFields) OutputExt() string { return p.outputExt }
|
||||
func (p *pageFields) SiteRelPath() string { return p.relpath }
|
||||
|
||||
// NewPageFromFile reads a Page from a file, using defaults as the default front matter.
|
||||
func NewPageFromFile(ctx Context, c Container, filename string, relpath string, defaults VariableMap) (Page, error) {
|
||||
func NewPageFromFile(ctx Context, c Container, filename string, relpath string, defaults templates.VariableMap) (Page, error) {
|
||||
magic, err := helpers.ReadFileMagic(filename)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@ -127,14 +128,14 @@ func NewPageFromFile(ctx Context, c Container, filename string, relpath string,
|
||||
|
||||
// Variables returns the attributes of the template page object.
|
||||
// See https://jekyllrb.com/docs/variables/#page-variables
|
||||
func (p *pageFields) Variables() VariableMap {
|
||||
func (p *pageFields) Variables() templates.VariableMap {
|
||||
var (
|
||||
relpath = "/" + filepath.ToSlash(p.relpath)
|
||||
base = path.Base(relpath)
|
||||
ext = path.Ext(relpath)
|
||||
)
|
||||
|
||||
return VariableMap{
|
||||
return templates.VariableMap{
|
||||
"path": relpath,
|
||||
"modified_time": p.modTime,
|
||||
"name": base,
|
||||
@ -152,8 +153,8 @@ type StaticPage struct {
|
||||
func (p *StaticPage) Static() bool { return true }
|
||||
|
||||
// Variables returns metadata for use in the representation of the page as a collection item
|
||||
func (p *StaticPage) Variables() VariableMap {
|
||||
return MergeVariableMaps(p.frontMatter, p.pageFields.Variables())
|
||||
func (p *StaticPage) Variables() templates.VariableMap {
|
||||
return templates.MergeVariableMaps(p.frontMatter, p.pageFields.Variables())
|
||||
}
|
||||
|
||||
func (p *StaticPage) Write(_ Context, w io.Writer) error {
|
||||
|
@ -3,6 +3,7 @@ package gojekyll
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/osteele/gojekyll/templates"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
@ -14,12 +15,12 @@ func (c containerMock) PathPrefix() string { return c.pathPrefix }
|
||||
func TestExpandPermalinkPattern(t *testing.T) {
|
||||
var (
|
||||
c = containerMock{}
|
||||
d = VariableMap{}
|
||||
d = templates.VariableMap{}
|
||||
path = "/a/b/base.html"
|
||||
)
|
||||
|
||||
testPermalinkPattern := func(pattern, path string, data VariableMap) (string, error) {
|
||||
vs := MergeVariableMaps(data, VariableMap{"permalink": pattern})
|
||||
testPermalinkPattern := func(pattern, path string, data templates.VariableMap) (string, error) {
|
||||
vs := templates.MergeVariableMaps(data, templates.VariableMap{"permalink": pattern})
|
||||
p := pageFields{container: c, relpath: path, frontMatter: vs}
|
||||
return p.expandPermalink()
|
||||
}
|
||||
|
7
site.go
7
site.go
@ -9,6 +9,7 @@ import (
|
||||
|
||||
"github.com/osteele/gojekyll/helpers"
|
||||
"github.com/osteele/gojekyll/liquid"
|
||||
"github.com/osteele/gojekyll/templates"
|
||||
)
|
||||
|
||||
// Site is a Jekyll site.
|
||||
@ -19,7 +20,7 @@ type Site struct {
|
||||
UseRemoteLiquidEngine bool
|
||||
|
||||
Collections []*Collection
|
||||
Variables VariableMap
|
||||
Variables templates.VariableMap
|
||||
Paths map[string]Page // URL path -> Page
|
||||
|
||||
config SiteConfig
|
||||
@ -274,13 +275,13 @@ func (s *Site) TemplateEngine() liquid.Engine {
|
||||
}
|
||||
|
||||
// GetFrontMatterDefaults implements https://jekyllrb.com/docs/configuration/#front-matter-defaults
|
||||
func (s *Site) GetFrontMatterDefaults(relpath, typename string) (m VariableMap) {
|
||||
func (s *Site) GetFrontMatterDefaults(relpath, typename string) (m templates.VariableMap) {
|
||||
for _, entry := range s.config.Defaults {
|
||||
scope := &entry.Scope
|
||||
hasPrefix := strings.HasPrefix(relpath, scope.Path)
|
||||
hasType := scope.Type == "" || scope.Type == typename
|
||||
if hasPrefix && hasType {
|
||||
m = MergeVariableMaps(m, entry.Values)
|
||||
m = templates.MergeVariableMaps(m, entry.Values)
|
||||
}
|
||||
}
|
||||
return
|
||||
|
@ -1,6 +1,9 @@
|
||||
package gojekyll
|
||||
|
||||
import yaml "gopkg.in/yaml.v2"
|
||||
import (
|
||||
"github.com/osteele/gojekyll/templates"
|
||||
yaml "gopkg.in/yaml.v2"
|
||||
)
|
||||
|
||||
// SiteConfig is the Jekyll site configuration, typically read from _config.yml.
|
||||
// See https://jekyllrb.com/docs/configuration/#default-configuration
|
||||
@ -9,9 +12,9 @@ type SiteConfig struct {
|
||||
Source string
|
||||
Destination string
|
||||
LayoutsDir string `yaml:"layouts_dir"`
|
||||
DataDir string `yaml:"data_dir"`
|
||||
DataDir string `yaml:"data_dir"`
|
||||
IncludesDir string `yaml:"includes_dir"`
|
||||
Collections map[string]VariableMap
|
||||
Collections map[string]templates.VariableMap
|
||||
|
||||
// Handling Reading
|
||||
Include []string
|
||||
@ -26,19 +29,19 @@ type SiteConfig struct {
|
||||
Path string
|
||||
Type string
|
||||
}
|
||||
Values VariableMap
|
||||
Values templates.VariableMap
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Site) readConfigBytes(bytes []byte) error {
|
||||
configVariables := VariableMap{}
|
||||
configVariables := templates.VariableMap{}
|
||||
if err := yaml.Unmarshal(bytes, &s.config); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := yaml.Unmarshal(bytes, &configVariables); err != nil {
|
||||
return err
|
||||
}
|
||||
s.Variables = MergeVariableMaps(s.Variables, configVariables)
|
||||
s.Variables = templates.MergeVariableMaps(s.Variables, configVariables)
|
||||
return nil
|
||||
}
|
||||
|
||||
|
@ -7,10 +7,11 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/osteele/gojekyll/helpers"
|
||||
"github.com/osteele/gojekyll/templates"
|
||||
)
|
||||
|
||||
// SiteVariables returns the site variable for template evaluation.
|
||||
func (s *Site) SiteVariables() VariableMap {
|
||||
func (s *Site) SiteVariables() templates.VariableMap {
|
||||
return s.Variables
|
||||
}
|
||||
|
||||
@ -19,7 +20,7 @@ func (s *Site) initSiteVariables() error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
s.Variables = MergeVariableMaps(s.Variables, VariableMap{
|
||||
s.Variables = templates.MergeVariableMaps(s.Variables, templates.VariableMap{
|
||||
"data": data,
|
||||
// TODO read time from _config, if it's available
|
||||
"time": time.Now(),
|
||||
@ -35,13 +36,13 @@ func (s *Site) updateCollectionVariables() {
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Site) readDataFiles() (VariableMap, error) {
|
||||
data := VariableMap{}
|
||||
func (s *Site) readDataFiles() (templates.VariableMap, error) {
|
||||
data := templates.VariableMap{}
|
||||
dataDir := filepath.Join(s.Source, s.config.DataDir)
|
||||
files, err := ioutil.ReadDir(dataDir)
|
||||
if err != nil {
|
||||
if os.IsNotExist(err) {
|
||||
return VariableMap{}, nil
|
||||
return templates.VariableMap{}, nil
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
package gojekyll
|
||||
package templates
|
||||
|
||||
// VariableMap is a map of strings to interface values, for use in template processing.
|
||||
type VariableMap map[string]interface{}
|
@ -1,4 +1,4 @@
|
||||
package gojekyll
|
||||
package templates
|
||||
|
||||
import (
|
||||
"testing"
|
Loading…
Reference in New Issue
Block a user