Skip to content

Commit

Permalink
integrate RSS builder, adapt to generate good xml
Browse files Browse the repository at this point in the history
  • Loading branch information
mna committed Jul 13, 2013
1 parent a204f7b commit 7c0f31d
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 74 deletions.
2 changes: 1 addition & 1 deletion example/public/rss
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"><channel><title>Ø value</title><description></description><link>http://localhost</link><lastBuildDate>13 Jul 13 15:08 -0400</lastBuildDate><generator>gbt</generator><item><title>Expérimentations sur l&#39;injection de dépendance avec node.js</title><link>http://localhost/006-dependency-injection</link><description>L&#39;injection de dépendance permet de découpler les différentes composantes d&#39;une application pour en faciliter l&#39;entretien, la testabilité, circonscrire l&#39;impact des changements, mais aussi pour imposer une façon d&#39;aborder la création de l&#39;application en une aggrégation de pièces simples, à la responsabilité ciblée, et à l&#39;API bien défini.</description><author>Martin Angers</author><category></category><pubDate>13 Jul 13 15:08 -0400</pubDate></item><item><title>Structurer une application Web avec Express et Node.js</title><link>http://localhost/005-structurer-express</link><description>La façon d&#39;organiser son code, en divers répertoires et fichiers, est en bonne partie une question de préférence personnelle. Le cadre d&#39;application Web Express n&#39;impose aucune structure particulière, laissant le développeur totalement libre d&#39;arranger le tout selon son inspiration du moment. Cette liberté peut parfois donner le vertige et provoquer un effet pervers: le syndrome de la page blanche.</description><author>Martin Angers</author><category></category><pubDate>13 Jul 13 15:08 -0400</pubDate></item><item><title>npm shrinkwrap: Comment contrôler ses dépendances</title><link>http://localhost/004-npm-packages</link><description>Utiliser une librairie existante permet d&#39;ajouter rapidement des fonctionnalités à une application, et de concentrer ses efforts sur les nouveautés, les spécificités de son projet, plutôt qu&#39;à réinventer la roue. Cependant, chaque librairie utilisée devient une dépendance, et une dépendance est un risque. Un risque car notre code dépend maintenant de ce corps étranger sur lequel on a généralement peu ou pas de contrôle. Les meilleures pratiques pour limiter ce risque ont évolué rapidement sur la plateforme node.js ces derniers mois.</description><author>Martin Angers</author><category></category><pubDate>13 Jul 13 15:08 -0400</pubDate></item><item><title>npm: la base essentielle pour débuter avec node.js</title><link>http://localhost/003-dependances</link><description>La plateforme node.js est volontairement limitée, en son coeur, aux fonctionnalités les plus fondamentales. Elle mise donc sur les contributions de sa communauté pour enrichir le noyau et repousser les limites du possible. Avec près de 8000 librairies à ce jour, il y a sérieux danger de chaos. Et si on y retrouve plutôt quelque chose comme une belle organisation, c&#39;est en bonne partie grâce au gestionnaire de librairies npm.</description><author>Martin Angers</author><category></category><pubDate>13 Jul 13 15:08 -0400</pubDate></item><item><title>Méta-billet: un mot sur le Calepin!</title><link>http://localhost/002-meta-billet</link><description>Il existe de nombreux moteurs de blogue gratuits sur internet. Pourquoi avoir jeté l&#39;ancre sur ce discret et modeste Calepin?</description><author>Martin Angers</author><category></category><pubDate>13 Jul 13 15:08 -0400</pubDate></item></channel></rss>
<rss version="2.0"><channel><title>Ø value</title><description></description><link>http://localhost</link><lastBuildDate>13 Jul 13 16:57 -0400</lastBuildDate><generator>trofaf</generator><item><title>Méta-billet: un mot sur le Calepin!</title><link>http://localhost/002-meta-billet</link><description>Il existe de nombreux moteurs de blogue gratuits sur internet. Pourquoi avoir jeté l&#39;ancre sur ce discret et modeste Calepin?</description><author>Martin Angers</author><category></category><pubDate>29 Feb 12 00:00 +0000</pubDate></item><item><title>npm: la base essentielle pour débuter avec node.js</title><link>http://localhost/003-dependances</link><description>La plateforme node.js est volontairement limitée, en son coeur, aux fonctionnalités les plus fondamentales. Elle mise donc sur les contributions de sa communauté pour enrichir le noyau et repousser les limites du possible. Avec près de 8000 librairies à ce jour, il y a sérieux danger de chaos. Et si on y retrouve plutôt quelque chose comme une belle organisation, c&#39;est en bonne partie grâce au gestionnaire de librairies npm.</description><author>Martin Angers</author><category></category><pubDate>05 Mar 12 00:00 +0000</pubDate></item><item><title>npm shrinkwrap: Comment contrôler ses dépendances</title><link>http://localhost/004-npm-packages</link><description>Utiliser une librairie existante permet d&#39;ajouter rapidement des fonctionnalités à une application, et de concentrer ses efforts sur les nouveautés, les spécificités de son projet, plutôt qu&#39;à réinventer la roue. Cependant, chaque librairie utilisée devient une dépendance, et une dépendance est un risque. Un risque car notre code dépend maintenant de ce corps étranger sur lequel on a généralement peu ou pas de contrôle. Les meilleures pratiques pour limiter ce risque ont évolué rapidement sur la plateforme node.js ces derniers mois.</description><author>Martin Angers</author><category></category><pubDate>12 Mar 12 00:00 +0000</pubDate></item><item><title>Structurer une application Web avec Express et Node.js</title><link>http://localhost/005-structurer-express</link><description>La façon d&#39;organiser son code, en divers répertoires et fichiers, est en bonne partie une question de préférence personnelle. Le cadre d&#39;application Web Express n&#39;impose aucune structure particulière, laissant le développeur totalement libre d&#39;arranger le tout selon son inspiration du moment. Cette liberté peut parfois donner le vertige et provoquer un effet pervers: le syndrome de la page blanche.</description><author>Martin Angers</author><category></category><pubDate>19 Mar 12 00:00 +0000</pubDate></item><item><title>Expérimentations sur l&#39;injection de dépendance avec node.js</title><link>http://localhost/006-dependency-injection</link><description>L&#39;injection de dépendance permet de découpler les différentes composantes d&#39;une application pour en faciliter l&#39;entretien, la testabilité, circonscrire l&#39;impact des changements, mais aussi pour imposer une façon d&#39;aborder la création de l&#39;application en une aggrégation de pièces simples, à la responsabilité ciblée, et à l&#39;API bien défini.</description><author>Martin Angers</author><category></category><pubDate>27 Mar 12 00:00 +0000</pubDate></item></channel></rss>
5 changes: 2 additions & 3 deletions gen.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import (
"sort"

"github.com/eknkc/amber"
"github.com/krautchan/gbt/module/api/rss"
)

// TODO : All fatal errors should be non-stopping errors when generating the site. Allows
Expand Down Expand Up @@ -109,7 +108,7 @@ func generateSite() {
}

func generateRss(td *TemplateData) error {
r := rss.New(td.SiteName, "", Options.BaseURL)
r := NewRss(td.SiteName, "", Options.BaseURL)
base, err := url.Parse(Options.BaseURL)
if err != nil {
return err
Expand All @@ -119,7 +118,7 @@ func generateRss(td *TemplateData) error {
if err != nil {
return err
}
r.AddItem(p.Title, u.String(), p.Description, p.Author, "")
r.Channels[0].AppendItem(NewRssItem(p.Title, u.String(), p.Description, p.Author, "", p.PubTime))
}
return r.WriteToFile(filepath.Join(PublicDir, "rss"))
}
Expand Down
114 changes: 44 additions & 70 deletions rss.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package main

// rss_api.go
// Adapted from https://github.com/krautchan/gbt
//
// "THE PIZZA-WARE LICENSE" (derived from "THE BEER-WARE LICENCE"):
// <whoami@dev-urandom.eu> wrote these files. As long as you retain this notice
Expand All @@ -13,26 +13,24 @@ Package to parse and create RSS-Feeds

import (
"encoding/xml"
"io"
"net/http"
"os"
"time"
)

type Rss struct {
XMLName xml.Name `xml:"rss"`
Version string `xml:"version,attr"`
Channel []Channel `xml:"channel"`
XMLName xml.Name `xml:"rss"`
Version string `xml:"version,attr"`
Channels []*Channel `xml:"channel"`
}

type Channel struct {
Title string `xml:"title"`
Description string `xml:"description"`
Link string `xml:"link"`
LastBuildDate string `xml:"lastBuildDate"`
Generator string `xml:"generator"`
Image []Image `xml:"image"`
Item []Item `xml:"item"`
Title string `xml:"title"`
Description string `xml:"description"`
Link string `xml:"link"`
LastBuildDate string `xml:"lastBuildDate"`
Generator string `xml:"generator"`
Image []*Image `xml:"image"`
Item []*Item `xml:"item"`
}

type Image struct {
Expand All @@ -42,85 +40,61 @@ type Image struct {
}

type Item struct {
Title string `xml:"title"`
Link string `xml:"link"`
Description string `xml:"description"`
Author string `xml:"author"`
Category string `xml:"category"`
PupDate string `xml:"pubDate"`
Image []Image `xml:"image"`
Title string `xml:"title"`
Link string `xml:"link"`
Description string `xml:"description"`
Author string `xml:"author"`
Category string `xml:"category"`
PubDate string `xml:"pubDate"`
Image []*Image `xml:"image"`
}

func ParseFromFile(filename string) (*Rss, error) {
file, err := os.Open(filename)
if err != nil {
return nil, err
}
defer file.Close()

return ParseFromReader(file)
}

func ParseFromUrl(url string) (*Rss, error) {
resp, err := http.Get(url)
if err != nil {
return nil, err
}
defer resp.Body.Close()

return ParseFromReader(resp.Body)
}

func ParseFromReader(reader io.Reader) (*Rss, error) {
var rss Rss
dec := xml.NewDecoder(reader)
err := dec.Decode(&rss)
if err != nil {
return nil, err
}
return &rss, nil
}

func New(title string, description string, link string) *Rss {
func NewRss(title string, description string, link string) *Rss {
rss := &Rss{Version: "2.0",
Channel: []Channel{Channel{
Title: title,
Description: description,
Link: link,
Generator: "gbt",
Image: make([]Image, 0),
Item: make([]Item, 0)}}}
Channels: []*Channel{
&Channel{
Title: title,
Description: description,
Link: link,
Generator: "trofaf",
Image: make([]*Image, 0),
Item: make([]*Item, 0),
},
},
}

return rss
}

// Add a new Item to the feed
func (rss *Rss) AddItem(title string, link string, description string, author string, category string) {
item := Item{
func NewRssItem(title, link, description, author, category string, pubTime time.Time) *Item {
return &Item{
Title: title,
Link: link,
Description: description,
Author: author,
Category: category,
PupDate: time.Now().Format(time.RFC822Z),
Image: make([]Image, 0)}
PubDate: pubTime.Format(time.RFC822Z),
Image: make([]*Image, 0),
}
}

//prepend s = append(s, T{}); copy(s[1:], s); s[0] = prefix
rss.Channel[0].Item = append(rss.Channel[0].Item, Item{})
copy(rss.Channel[0].Item[1:], rss.Channel[0].Item)
rss.Channel[0].Item[0] = item
// Add a new Item to the feed
func (ch *Channel) AppendItem(i *Item) {
ch.Item = append(ch.Item, i)
}

// Writes the data in RSS 2.0 format to a given file
func (rss *Rss) WriteToFile(path string) error {
rss.Channel[0].LastBuildDate = time.Now().Format(time.RFC822Z)
rss.Channels[0].LastBuildDate = time.Now().Format(time.RFC822Z)
file, err := os.Create(path)
if err != nil {
return err
}
defer file.Close()

_, err = file.WriteString(xml.Header)
if err != nil {
return err
}
enc := xml.NewEncoder(file)

return enc.Encode(rss)
}

0 comments on commit 7c0f31d

Please sign in to comment.