This commit is contained in:
parent
99edcd6d40
commit
93a91a4966
|
@ -19,6 +19,7 @@
|
||||||
package fetch
|
package fetch
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"io"
|
"io"
|
||||||
|
@ -30,6 +31,9 @@ import (
|
||||||
|
|
||||||
"rss"
|
"rss"
|
||||||
|
|
||||||
|
"golang.org/x/net/html"
|
||||||
|
"golang.org/x/net/html/atom"
|
||||||
|
|
||||||
"p83.nl/go/ekster/pkg/jf2"
|
"p83.nl/go/ekster/pkg/jf2"
|
||||||
"p83.nl/go/ekster/pkg/jsonfeed"
|
"p83.nl/go/ekster/pkg/jsonfeed"
|
||||||
"p83.nl/go/ekster/pkg/microsub"
|
"p83.nl/go/ekster/pkg/microsub"
|
||||||
|
@ -286,15 +290,17 @@ func FeedItems(fetcher Fetcher, fetchURL, contentType string, body io.Reader) ([
|
||||||
return items, err
|
return items, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
baseURL, _ := url.Parse(fetchURL)
|
||||||
|
|
||||||
for _, feedItem := range feed.Items {
|
for _, feedItem := range feed.Items {
|
||||||
var item microsub.Item
|
var item microsub.Item
|
||||||
item.Type = "entry"
|
item.Type = "entry"
|
||||||
item.Name = feedItem.Title
|
item.Name = feedItem.Title
|
||||||
item.Content = µsub.Content{}
|
item.Content = µsub.Content{}
|
||||||
if len(feedItem.Content) > 0 {
|
if len(feedItem.Content) > 0 {
|
||||||
item.Content.HTML = feedItem.Content
|
item.Content.HTML = expandHref(feedItem.Content, baseURL)
|
||||||
} else if len(feedItem.Summary) > 0 {
|
} else if len(feedItem.Summary) > 0 {
|
||||||
item.Content.HTML = feedItem.Summary
|
item.Content.HTML = expandHref(feedItem.Summary, baseURL)
|
||||||
}
|
}
|
||||||
item.URL = feedItem.Link
|
item.URL = feedItem.Link
|
||||||
if feedItem.ID == "" {
|
if feedItem.ID == "" {
|
||||||
|
@ -336,3 +342,70 @@ func FeedItems(fetcher Fetcher, fetchURL, contentType string, body io.Reader) ([
|
||||||
|
|
||||||
return items, nil
|
return items, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// expandHref expands relative URLs in a.href and img.src attributes to be absolute URLs.
|
||||||
|
func expandHref(s string, base *url.URL) string {
|
||||||
|
var buf bytes.Buffer
|
||||||
|
|
||||||
|
node, _ := html.Parse(strings.NewReader(s))
|
||||||
|
|
||||||
|
for c := node.FirstChild; c != nil; c = c.NextSibling {
|
||||||
|
expandHrefRec(c, base)
|
||||||
|
}
|
||||||
|
|
||||||
|
html.Render(&buf, node)
|
||||||
|
|
||||||
|
return buf.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
func getAttrPtr(node *html.Node, name string) *string {
|
||||||
|
if node == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
for i, attr := range node.Attr {
|
||||||
|
if strings.EqualFold(attr.Key, name) {
|
||||||
|
return &node.Attr[i].Val
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func isAtom(node *html.Node, atoms ...atom.Atom) bool {
|
||||||
|
if node == nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
for _, atom := range atoms {
|
||||||
|
if atom == node.DataAtom {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func expandHrefRec(node *html.Node, base *url.URL) {
|
||||||
|
if isAtom(node, atom.A) {
|
||||||
|
href := getAttrPtr(node, "href")
|
||||||
|
if href != nil {
|
||||||
|
if urlParsed, err := url.Parse(*href); err == nil {
|
||||||
|
urlParsed = base.ResolveReference(urlParsed)
|
||||||
|
*href = urlParsed.String()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if isAtom(node, atom.Img) {
|
||||||
|
href := getAttrPtr(node, "src")
|
||||||
|
if href != nil {
|
||||||
|
if urlParsed, err := url.Parse(*href); err == nil {
|
||||||
|
urlParsed = base.ResolveReference(urlParsed)
|
||||||
|
*href = urlParsed.String()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
for c := node.FirstChild; c != nil; c = c.NextSibling {
|
||||||
|
expandHrefRec(c, base)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user