all repos

rss-tools @ 65589dece188d9ac7262e1b2dab64bf5f4109c4b

get rss feed from sources that(i need and) dont provide one

rss-tools/app/atom/text.go (view raw)

Oleksandr Smirnov Oleksandr Smirnov
olexsmir@gmail.com
refactor atom feed builder, 14 days ago
1
package atom
2
3
import (
4
	"encoding/xml"
5
	"fmt"
6
	"io"
7
	"strings"
8
)
9
10
func (t Text) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
11
	contentType := strings.TrimSpace(t.Type)
12
	if contentType == "" {
13
		contentType = "text"
14
	}
15
16
	start.Attr = append(start.Attr, xml.Attr{
17
		Name:  xml.Name{Local: "type"},
18
		Value: contentType,
19
	})
20
21
	if err := e.EncodeToken(start); err != nil {
22
		return err
23
	}
24
25
	if contentType == "xhtml" {
26
		if err := validateXHTMLFragment(t.Body); err != nil {
27
			return err
28
		}
29
		if err := e.Encode(xhtmlDiv{
30
			XMLNS: xhtmlNamespace,
31
			Inner: t.Body,
32
		}); err != nil {
33
			return err
34
		}
35
	} else {
36
		if err := e.EncodeToken(xml.CharData([]byte(t.Body))); err != nil {
37
			return err
38
		}
39
	}
40
41
	if err := e.EncodeToken(start.End()); err != nil {
42
		return err
43
	}
44
	return e.Flush()
45
}
46
47
type xhtmlDiv struct {
48
	XMLName xml.Name `xml:"div"`
49
	XMLNS   string   `xml:"xmlns,attr"`
50
	Inner   string   `xml:",innerxml"`
51
}
52
53
func validateXHTMLFragment(fragment string) error {
54
	wrapped := fmt.Sprintf(`<div xmlns="%s">%s</div>`, xhtmlNamespace, fragment)
55
	dec := xml.NewDecoder(strings.NewReader(wrapped))
56
	for {
57
		_, err := dec.Token()
58
		if err == io.EOF {
59
			return nil
60
		}
61
		if err != nil {
62
			return fmt.Errorf("invalid xhtml content: %w", err)
63
		}
64
	}
65
}