package plugins
import (
"fmt"
"html"
"github.com/osteele/liquid"
"github.com/osteele/liquid/render"
)
type jekyllFeedPlugin struct {
plugin
site Site
tpl *liquid.Template
}
func init() {
register("jekyll-feed", &jekyllFeedPlugin{})
}
func (p *jekyllFeedPlugin) AfterInitSite(s Site) error {
p.site = s
return nil
}
func (p *jekyllFeedPlugin) ConfigureTemplateEngine(e *liquid.Engine) error {
e.RegisterTag("feed_meta", p.feedMetaTag)
tpl, err := e.ParseTemplate([]byte(feedTemplateSource))
if err != nil {
panic(err)
}
p.tpl = tpl
return nil
}
func (p *jekyllFeedPlugin) PostReadSite(s Site) error {
path := "/feed.xml"
if cfg, ok := s.Config().Map("feed"); ok {
if pp, ok := cfg["path"].(string); ok {
path = "/" + pp
}
}
d := newTemplateDoc(s, path, feedTemplateSource)
s.AddDocument(d, true)
return nil
}
func (p *jekyllFeedPlugin) feedMetaTag(ctx render.Context) (string, error) {
cfg := p.site.Config()
title, _ := cfg.String("name")
if s, ok := cfg.String("title"); ok {
title = s
}
tag := fmt.Sprintf(``,
html.EscapeString(cfg.AbsoluteURL), html.EscapeString(title))
return tag, nil
}
// Taken verbatim from https://github.com/jekyll/jekyll-feed/
const feedTemplateSource = `
{% if page.xsl %}
{% endif %}
Jekyll
{{ site.time | date_to_xmlschema }}
{{ '/' | absolute_url | xml_escape }}
{% if site.title %}
{{ site.title | smartify | xml_escape }}
{% elsif site.name %}
{{ site.name | smartify | xml_escape }}
{% endif %}
{% if site.description %}
{{ site.description | xml_escape }}
{% endif %}
{% if site.author %}
{{ site.author.name | default: site.author | xml_escape }}
{% if site.author.email %}
{{ site.author.email | xml_escape }}
{% endif %}
{% if site.author.uri %}
{{ site.author.uri | xml_escape }}
{% endif %}
{% endif %}
{% assign posts = site.posts | where_exp: "post", "post.draft != true" %}
{% for post in posts limit: 10 %}
{{ post.title | smartify | strip_html | normalize_whitespace | xml_escape }}
{{ post.date | date_to_xmlschema }}
{{ post.last_modified_at | default: post.date | date_to_xmlschema }}
{{ post.id | absolute_url | xml_escape }}
{{ post.content | strip | xml_escape }}
{% assign post_author = post.author | default: post.authors[0] | default: site.author %}
{% assign post_author = site.data.authors[post_author] | default: post_author %}
{% assign post_author_email = post_author.email | default: nil %}
{% assign post_author_uri = post_author.uri | default: nil %}
{% assign post_author_name = post_author.name | default: post_author %}
{{ post_author_name | default: "" | xml_escape }}
{% if post_author_email %}
{{ post_author_email | xml_escape }}
{% endif %}
{% if post_author_uri %}
{{ post_author_uri | xml_escape }}
{% endif %}
{% if post.category %}
{% endif %}
{% for tag in post.tags %}
{% endfor %}
{% if post.excerpt and post.excerpt != empty %}
{{ post.excerpt | strip_html | normalize_whitespace | xml_escape }}
{% endif %}
{% assign post_image = post.image.path | default: post.image %}
{% if post_image %}
{% unless post_image contains "://" %}
{% assign post_image = post_image | absolute_url | xml_escape %}
{% endunless %}
{% endif %}
{% endfor %}
`