1
0
mirror of https://github.com/danog/gojekyll.git synced 2024-11-27 00:24:41 +01:00

Implement site.html_files, site.tags

This commit is contained in:
Oliver Steele 2017-07-09 14:05:46 -04:00
parent f93062aafd
commit 9f65abc280
4 changed files with 41 additions and 25 deletions

View File

@ -62,17 +62,17 @@ In addition to the limitations listed below, this software isn't robust. Jekyll,
### Current Limitations
Missing features:
- Themes
- Excerpts
- Pagination
- Math
- CSV and JSON data files
- Plugins. (Some plugins are emulated. See the [plugin board](https://github.com/osteele/gojekyll/projects/2) for their status.)
- `site-static_files`, `site.html_files`, and `site.tags`
- These Liquid filters: `group_by_exp`, `cgi_escape`, `uri_escape`, `scssify`, and `smartify`
- Template filters `group_by_exp`, `cgi_escape`, `uri_escape`, and `scssify`
- More Liquid tags and filters, listed [here](https://github.com/osteele/liquid#differences-from-liquid).
- Windows compatibility
- Markdown features: [attribute lists](https://kramdown.gettalong.org/syntax.html#attribute-list-definitions), [automatic ids](https://kramdown.gettalong.org/converter/html.html#auto-ids), [`markdown=1`](https://kramdown.gettalong.org/syntax.html#html-blocks).
- Windows compatibility
Also see the [detailed status](#feature-status) below.

View File

@ -10,8 +10,8 @@ import (
// ToLiquid returns the site variable for template evaluation.
func (s *Site) ToLiquid() interface{} {
// double-checked lock is okay here, since it's okay if this gets
// written twice
// double-checked lock is okay here, since it's okay if this is
// computed and set twice
if len(s.drop) == 0 {
s.Lock()
defer s.Unlock()
@ -32,12 +32,12 @@ func (s *Site) initializeDrop() {
vars := templates.MergeVariableMaps(s.config.Variables, map[string]interface{}{
"data": s.data,
"documents": s.docs,
"html_files": s.htmlFiles(),
"html_pages": s.htmlPages(),
"pages": s.Pages(),
"static_files": s.StaticFiles(),
"static_files": s.staticFiles(),
// TODO read time from _config, if it's available
"time": time.Now(),
// TODO static_files, html_files, tags.TAG
})
collections := []interface{}{}
for _, c := range s.Collections {
@ -59,6 +59,20 @@ func (s *Site) setPageContent() error {
return nil
}
// The following functions are only used in the drop, therefore they're
// non-public and they're listed here.
//
// Since the drop is cached, there's no effort to cache these too.
func (s *Site) htmlFiles() (out []*pages.StaticFile) {
for _, p := range s.staticFiles() {
if p.OutputExt() == ".html" {
out = append(out, p)
}
}
return
}
func (s *Site) htmlPages() (out []pages.Page) {
for _, p := range s.Pages() {
if p.OutputExt() == ".html" {
@ -67,3 +81,12 @@ func (s *Site) htmlPages() (out []pages.Page) {
}
return
}
func (s *Site) staticFiles() (out []*pages.StaticFile) {
for _, d := range s.docs {
if sd, ok := d.(*pages.StaticFile); ok {
out = append(out, sd)
}
}
return
}

View File

@ -20,15 +20,20 @@ func (s *Site) setPostVariables() {
return
}
var (
ps = c.Pages()
related = ps
categories = map[string][]pages.Page{}
tags = map[string][]pages.Page{}
ps = c.Pages()
related = ps
)
if len(related) > 10 {
related = related[:10]
}
for _, p := range ps {
s.drop["categories"] = s.groupPagesBy(func(p pages.Page) []string { return p.Categories() })
s.drop["tags"] = s.groupPagesBy(func(p pages.Page) []string { return p.Tags() })
s.drop["related_posts"] = related
}
func (s *Site) groupPagesBy(getter func(pages.Page) []string) map[string][]pages.Page {
categories := map[string][]pages.Page{}
for _, p := range s.Pages() {
for _, k := range p.Categories() {
ps, found := categories[k]
if !found {
@ -37,7 +42,5 @@ func (s *Site) setPostVariables() {
categories[k] = append(ps, p)
}
}
s.drop["categories"] = categories
s.drop["tags"] = tags
s.drop["related_posts"] = related
return categories
}

View File

@ -50,16 +50,6 @@ func (s *Site) OutputPages() []pages.Document {
return out
}
// StaticFiles returns a list of static files.
func (s *Site) StaticFiles() (out []*pages.StaticFile) {
for _, d := range s.docs {
if sd, ok := d.(*pages.StaticFile); ok {
out = append(out, sd)
}
}
return
}
// Pages returns all the pages, output or not.
func (s *Site) Pages() (out []pages.Page) {
for _, d := range s.docs {