rdf.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. // Copyright 2017 Frédéric Guillot. All rights reserved.
  2. // Use of this source code is governed by the Apache 2.0
  3. // license that can be found in the LICENSE file.
  4. package rdf
  5. import (
  6. "encoding/xml"
  7. "github.com/miniflux/miniflux2/helper"
  8. "github.com/miniflux/miniflux2/reader/processor"
  9. "github.com/miniflux/miniflux2/reader/sanitizer"
  10. "github.com/miniflux/miniflux2/model"
  11. )
  12. type rdfFeed struct {
  13. XMLName xml.Name `xml:"RDF"`
  14. Title string `xml:"channel>title"`
  15. Link string `xml:"channel>link"`
  16. Creator string `xml:"channel>creator"`
  17. Items []rdfItem `xml:"item"`
  18. }
  19. func (r *rdfFeed) Transform() *model.Feed {
  20. feed := new(model.Feed)
  21. feed.Title = sanitizer.StripTags(r.Title)
  22. feed.SiteURL = r.Link
  23. for _, item := range r.Items {
  24. entry := item.Transform()
  25. if entry.Author == "" && r.Creator != "" {
  26. entry.Author = sanitizer.StripTags(r.Creator)
  27. }
  28. if entry.URL == "" {
  29. entry.URL = feed.SiteURL
  30. }
  31. feed.Entries = append(feed.Entries, entry)
  32. }
  33. return feed
  34. }
  35. type rdfItem struct {
  36. Title string `xml:"title"`
  37. Link string `xml:"link"`
  38. Description string `xml:"description"`
  39. Creator string `xml:"creator"`
  40. }
  41. func (r *rdfItem) Transform() *model.Entry {
  42. entry := new(model.Entry)
  43. entry.Title = sanitizer.StripTags(r.Title)
  44. entry.Author = sanitizer.StripTags(r.Creator)
  45. entry.URL = r.Link
  46. entry.Content = processor.ItemContentProcessor(entry.URL, r.Description)
  47. entry.Hash = getHash(r)
  48. return entry
  49. }
  50. func getHash(r *rdfItem) string {
  51. value := r.Link
  52. if value == "" {
  53. value = r.Title + r.Description
  54. }
  55. return helper.Hash(value)
  56. }