Skip to content

Commit

Permalink
More
Browse files Browse the repository at this point in the history
  • Loading branch information
bep committed May 12, 2024
1 parent 51edc1b commit 0efb5bf
Show file tree
Hide file tree
Showing 10 changed files with 211 additions and 192 deletions.
8 changes: 4 additions & 4 deletions common/paths/pathparser.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,10 @@ import (
"github.com/gohugoio/hugo/identity"
)

var defaultPathParser PathParser = PathParser{
var DefaultPathParser = &PathParser{
IsContentExt: func(ext string) bool {
return false
// TODO1
return ext == "md"
},
}

Expand All @@ -44,9 +45,8 @@ type PathParser struct {
}

// Parse parses component c with path s into Path using the default path parser.
// Only used in tests. TODO1
func Parse(c, s string) *Path {
return defaultPathParser.Parse(c, s)
return DefaultPathParser.Parse(c, s)
}

// NormalizePathString returns a normalized path string using the very basic Hugo rules.
Expand Down
11 changes: 0 additions & 11 deletions hugofs/files/classifier_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,22 +14,11 @@
package files

import (
"path/filepath"
"testing"

qt "github.com/frankban/quicktest"
)

func TestIsContentFile(t *testing.T) {
c := qt.New(t)

c.Assert(IsContentFile(filepath.FromSlash("my/file.md")), qt.Equals, true)
c.Assert(IsContentFile(filepath.FromSlash("my/file.ad")), qt.Equals, true)
c.Assert(IsContentFile(filepath.FromSlash("textfile.txt")), qt.Equals, false)
c.Assert(IsContentExt("md"), qt.Equals, true)
c.Assert(IsContentExt("json"), qt.Equals, false)
}

func TestComponentFolders(t *testing.T) {
c := qt.New(t)

Expand Down
7 changes: 5 additions & 2 deletions hugofs/walk.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,10 @@ func NewWalkway(cfg WalkwayConfig) *Walkway {
panic("fs must be set")
}

if cfg.PathParser == nil {
cfg.PathParser = paths.DefaultPathParser
}

logger := cfg.Logger
if logger == nil {
logger = loggers.NewDefault()
Expand Down Expand Up @@ -161,8 +165,7 @@ func (w *Walkway) walk(path string, info FileMetaInfo, dirEntries []FileMetaInfo

dirEntries = DirEntriesToFileMetaInfos(fis)
for _, fi := range dirEntries {
if fi.Meta().PathInfo == nil && w.cfg.PathParser != nil {
// TODO1
if fi.Meta().PathInfo == nil {
fi.Meta().PathInfo = w.cfg.PathParser.Parse("", filepath.Join(pathRel, fi.Name()))
}
}
Expand Down
288 changes: 150 additions & 138 deletions hugolib/content_map.go
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ func (cfg contentMapConfig) getTaxonomyConfig(s string) (v viewName) {
return
}

func (m *pageMap) AddFi(fi hugofs.FileMetaInfo, whatChanged *whatChanged) (pageCount uint64, resourceCount uint64, addErr error) {
func (m *pageMap) AddFi(fi hugofs.FileMetaInfo, buildConfig *BuildCfg) (pageCount uint64, resourceCount uint64, addErr error) {
if fi.IsDir() {
return
}
Expand Down Expand Up @@ -227,147 +227,14 @@ func (m *pageMap) AddFi(fi hugofs.FileMetaInfo, whatChanged *whatChanged) (pageC
return
}
case paths.PathTypeContentData:
m.s.Log.Trace(logg.StringFunc(
func() string {
return fmt.Sprintf("insert pages from data file: %q", fi.Meta().Filename)
},
))

if !files.IsGoTmplExt(pi.Ext()) {
addErr = fmt.Errorf("unsupported data file extension %q", pi.Ext())
return
}
// TODO1 disabled languages.

s := m.s.h.resolveSite(fi.Meta().Lang)
f := source.NewFileInfo(fi)
h := s.h

// Make sure the layouts are initialized.
if _, err := h.init.layouts.Do(context.Background()); err != nil {
pc, rc, err := m.addPagesFromGoTmplFi(fi, buildConfig)
pageCount += pc
resourceCount += rc
if err != nil {
addErr = err
return
}
if err := func() error {
contentAdapter := s.pageMap.treePagesFromTemplateOptions.Get(pi.Base())
var rebuild bool
if contentAdapter != nil {
// Rebuild
contentAdapter = contentAdapter.CloneForGoTmpl(fi)
rebuild = true
} else {
contentAdapter = pagesfromdata.NewPagesFromTemplate(
pagesfromdata.PagesFromTemplateOptions{
GoTmplFi: fi,
Site: s,
DepsFromSite: func(s page.Site) pagesfromdata.PagesFromTemplateDeps {
ss := s.(*Site)
return pagesfromdata.PagesFromTemplateDeps{
TmplFinder: ss.TextTmpl(),
TmplExec: ss.Tmpl(),
}
},
DependencyManager: s.Conf.NewIdentityManager("pagesfromdata"),
Watching: s.Conf.Watching(),
HandlePage: func(pt *pagesfromdata.PagesFromTemplate, pc *pagemeta.PageConfig) error {
s := pt.Site.(*Site)
pc.Path = path.Join(pt.GoTmplFi.Meta().PathInfo.Base(), pc.Path)
if err := pc.Compile(true, "", s.conf.MediaTypes.Config); err != nil {
return err
}

ps, pi, err := h.newPage(
&pageMeta{
f: f,
s: s,
pageMetaParams: &pageMetaParams{
pageConfig: pc,
},
},
)
if err != nil {
return err
}

if ps == nil {
// Disabled page.
return nil
}

u, n, replaced := s.pageMap.treePages.InsertIntoValuesDimensionWithLock(pi.Base(), ps)

if h.isRebuild() {
if replaced {
pt.AddChange(n.GetIdentity())
} else {
pt.AddChange(u.GetIdentity())
}
}

return nil
},
HandleResource: func(pt *pagesfromdata.PagesFromTemplate, rc *pagemeta.ResourceConfig) error {
s := pt.Site.(*Site)
rc.Path = path.Join(pt.GoTmplFi.Meta().PathInfo.Base(), rc.Path)
if err := rc.Compile(s.Conf.PathParser()); err != nil {
return err
}
rs := &resourceSource{path: rc.PathInfo, rc: rc, opener: nil, fi: nil, langIndex: s.languagei}

_, n, replaced := s.pageMap.treeResources.InsertIntoValuesDimensionWithLock(rc.Path, rs)

if h.isRebuild() && replaced {
pt.AddChange(n.GetIdentity())
}
return nil
},
},
)

s.pageMap.treePagesFromTemplateOptions.Insert(pi.Base(), contentAdapter)

}

handleBuildInfo := func(s *Site, bi pagesfromdata.BuildInfo) {
resourceCount += bi.NumResourcesAdded
pageCount += bi.NumPagesAdded
s.handleContentAdapterChanges(bi, whatChanged)
}

// TODO1 do we need a mutex?
bi, err := contentAdapter.Execute(context.Background())
if err != nil {
return err
}
handleBuildInfo(s, bi)

if !rebuild && bi.EnableAllLanguages {
// Clone and insert the adapter for the other sites.
for _, ss := range s.h.Sites {
if s == ss {
continue
}

clone := contentAdapter.CloneForSite(ss)

// Make sure it gets executed for the first time.
bi, err := clone.Execute(context.Background())
if err != nil {
return err
}
handleBuildInfo(ss, bi)

// Insert into the correct language tree so it get rebuilt on changes.
ss.pageMap.treePagesFromTemplateOptions.Insert(pi.Base(), clone)

}
}

return nil
}(); err != nil {
addErr = err
return
}
default:
m.s.Log.Trace(logg.StringFunc(
func() string {
Expand Down Expand Up @@ -400,6 +267,151 @@ func (m *pageMap) AddFi(fi hugofs.FileMetaInfo, whatChanged *whatChanged) (pageC
return
}

func (m *pageMap) addPagesFromGoTmplFi(fi hugofs.FileMetaInfo, buildConfig *BuildCfg) (pageCount uint64, resourceCount uint64, addErr error) {
meta := fi.Meta()
pi := meta.PathInfo

m.s.Log.Trace(logg.StringFunc(
func() string {
return fmt.Sprintf("insert pages from data file: %q", fi.Meta().Filename)
},
))

if !files.IsGoTmplExt(pi.Ext()) {
addErr = fmt.Errorf("unsupported data file extension %q", pi.Ext())
return
}
// TODO1 disabled languages.

s := m.s.h.resolveSite(fi.Meta().Lang)
f := source.NewFileInfo(fi)
h := s.h

// Make sure the layouts are initialized.
if _, err := h.init.layouts.Do(context.Background()); err != nil {
addErr = err
return
}

contentAdapter := s.pageMap.treePagesFromTemplateOptions.Get(pi.Base())
var rebuild bool
if contentAdapter != nil {
// Rebuild
contentAdapter = contentAdapter.CloneForGoTmpl(fi)
rebuild = true
} else {
contentAdapter = pagesfromdata.NewPagesFromTemplate(
pagesfromdata.PagesFromTemplateOptions{
GoTmplFi: fi,
Site: s,
DepsFromSite: func(s page.Site) pagesfromdata.PagesFromTemplateDeps {
ss := s.(*Site)
return pagesfromdata.PagesFromTemplateDeps{
TmplFinder: ss.TextTmpl(),
TmplExec: ss.Tmpl(),
}
},
DependencyManager: s.Conf.NewIdentityManager("pagesfromdata"),
Watching: s.Conf.Watching(),
HandlePage: func(pt *pagesfromdata.PagesFromTemplate, pc *pagemeta.PageConfig) error {
s := pt.Site.(*Site)
pc.Path = path.Join(pt.GoTmplFi.Meta().PathInfo.Base(), pc.Path)
if err := pc.Compile(true, "", s.conf.MediaTypes.Config); err != nil {
return err
}

ps, pi, err := h.newPage(
&pageMeta{
f: f,
s: s,
pageMetaParams: &pageMetaParams{
pageConfig: pc,
},
},
)
if err != nil {
return err
}

if ps == nil {
// Disabled page.
return nil
}

u, n, replaced := s.pageMap.treePages.InsertIntoValuesDimensionWithLock(pi.Base(), ps)

if h.isRebuild() {
if replaced {
pt.AddChange(n.GetIdentity())
} else {
pt.AddChange(u.GetIdentity())
}
}

return nil
},
HandleResource: func(pt *pagesfromdata.PagesFromTemplate, rc *pagemeta.ResourceConfig) error {
s := pt.Site.(*Site)
rc.Path = path.Join(pt.GoTmplFi.Meta().PathInfo.Base(), rc.Path)
if err := rc.Compile(s.Conf.PathParser()); err != nil {
return err
}
rs := &resourceSource{path: rc.PathInfo, rc: rc, opener: nil, fi: nil, langIndex: s.languagei}

_, n, replaced := s.pageMap.treeResources.InsertIntoValuesDimensionWithLock(rc.Path, rs)

if h.isRebuild() && replaced {
pt.AddChange(n.GetIdentity())
}
return nil
},
},
)

s.pageMap.treePagesFromTemplateOptions.Insert(pi.Base(), contentAdapter)

}

handleBuildInfo := func(s *Site, bi pagesfromdata.BuildInfo) {
resourceCount += bi.NumResourcesAdded
pageCount += bi.NumPagesAdded
s.handleContentAdapterChanges(bi, buildConfig)
}

// TODO1 do we need a mutex?
bi, err := contentAdapter.Execute(context.Background())
if err != nil {
addErr = err
return
}
handleBuildInfo(s, bi)

if !rebuild && bi.EnableAllLanguages {
// Clone and insert the adapter for the other sites.
for _, ss := range s.h.Sites {
if s == ss {
continue
}

clone := contentAdapter.CloneForSite(ss)

// Make sure it gets executed for the first time.
bi, err := clone.Execute(context.Background())
if err != nil {
addErr = err
return
}
handleBuildInfo(ss, bi)

// Insert into the correct language tree so it get rebuilt on changes.
ss.pageMap.treePagesFromTemplateOptions.Insert(pi.Base(), clone)

}
}

return
}

// The home page is represented with the zero string.
// All other keys starts with a leading slash. No trailing slash.
// Slashes are Unix-style.
Expand Down
Loading

0 comments on commit 0efb5bf

Please sign in to comment.