wp-go/rss2/rss2.go

154 lines
3.9 KiB
Go
Raw Permalink Normal View History

2022-10-07 12:37:42 +00:00
package rss2
import (
"fmt"
2023-01-21 11:31:23 +00:00
"github.com/fthvgb1/wp-go/helper/slice"
2022-10-08 11:35:05 +00:00
"strconv"
2022-10-07 12:37:42 +00:00
"strings"
)
var template = `<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
>
<channel>
<title>{$title}</title>
<atom:link href="{$feedLink}" rel="self" type="application/rss+xml"/>
<link>{$link}</link>
<description>{$description}</description>
<lastBuildDate>{$lastBuildDate}</lastBuildDate>
<language>{$lang}</language>
<sy:updatePeriod>
{$updatePeriod}
</sy:updatePeriod>
<sy:updateFrequency>
{$updateFrequency}
</sy:updateFrequency>
<generator>{$generator}</generator>
{$items}
</channel>
</rss>
`
var templateItems = `
<item>
<title>{$title}</title>
2022-10-08 11:35:05 +00:00
{$link}
2022-10-07 12:37:42 +00:00
{$comments}
2022-10-08 11:35:05 +00:00
{$creator}
2022-10-07 12:37:42 +00:00
<pubDate>{$pubDate}</pubDate>
2022-10-07 14:27:34 +00:00
{$category}
2022-10-08 11:35:05 +00:00
{$guid}
2022-10-07 14:27:34 +00:00
{$description}
2022-10-07 12:37:42 +00:00
<content:encoded><![CDATA[{$content}]]></content:encoded>
{$commentRss}
{$commentNumber}
</item>
`
2022-10-08 11:35:05 +00:00
var templateReplace = map[string]string{
"{$category}": "<category><![CDATA[%s]]></category>",
"{$link}": "<link>%s</link>",
"{$creator}": "<dc:creator><![CDATA[%s]]></dc:creator>",
"{$description}": "<description><![CDATA[%s]]></description>",
"{$comments}": "<comments>%s</comments>",
"{$commentRss}": "<wfw:commentRss>%s</wfw:commentRss>",
"{$commentNumber}": "<slash:comments>%s</slash:comments>",
"{$guid}": "<guid isPermaLink=\"false\">%s</guid>",
}
2022-10-07 12:37:42 +00:00
type Rss2 struct {
Title string
AtomLink string
Link string
Description string
LastBuildDate string
Language string
UpdatePeriod string
UpdateFrequency int
Generator string
Items []Item
}
type Item struct {
Title string
Link string
CommentLink string
Creator string
PubDate string
Category string
Guid string
Description string
Content string
CommentRss string
SlashComments int
}
func (r Rss2) GetXML() (xml string) {
xml = template
for k, v := range map[string]string{
"{$title}": r.Title,
"{$link}": r.Link,
"{$feedLink}": r.AtomLink,
"{$description}": r.Description,
"{$lastBuildDate}": r.LastBuildDate,
"{$lang}": r.Language,
"{$updatePeriod}": r.UpdatePeriod,
"{$updateFrequency}": fmt.Sprintf("%d", r.UpdateFrequency),
"{$generator}": r.Generator,
2023-01-21 11:31:23 +00:00
"{$items}": strings.Join(slice.Map(r.Items, func(t Item) string {
2022-10-07 12:37:42 +00:00
return t.GetXml()
}), ""),
} {
xml = strings.Replace(xml, k, v, -1)
}
return
}
func (i Item) GetXml() (xml string) {
xml = templateItems
for k, v := range map[string]string{
2022-10-08 11:35:05 +00:00
"{$title}": i.Title,
"{$pubDate}": i.PubDate,
"{$content}": i.Content,
2022-10-07 12:37:42 +00:00
} {
xml = strings.Replace(xml, k, v, -1)
}
2022-10-08 11:35:05 +00:00
m := map[string]string{
"{$category}": i.Category,
"{$link}": i.Link,
"{$creator}": i.Creator,
"{$description}": i.Description,
"{$comments}": i.CommentLink,
"{$guid}": i.Guid,
"{$commentRss}": i.CommentRss,
2022-10-07 12:37:42 +00:00
}
2022-10-08 11:35:05 +00:00
if i.CommentRss != "" && i.SlashComments > 0 {
m["{$commentRss}"] = i.CommentRss
} else {
m["{$commentRss}"] = ""
2022-10-07 12:37:42 +00:00
}
if i.SlashComments > 0 {
2022-10-08 11:35:05 +00:00
m["{$commentNumber}"] = strconv.Itoa(i.SlashComments)
} else {
m["{$commentNumber}"] = ""
2022-10-07 12:37:42 +00:00
}
2022-10-08 11:35:05 +00:00
for k, v := range m {
t := ""
if v != "" {
t = fmt.Sprintf(templateReplace[k], v)
}
xml = strings.Replace(xml, k, t, -1)
}
2022-10-07 12:37:42 +00:00
return
}