The Webfeed Flutter package for Appeto SDK.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

78 lines
2.3 KiB

  1. import 'package:webfeed/domain/atom_category.dart';
  2. import 'package:webfeed/domain/atom_generator.dart';
  3. import 'package:webfeed/domain/atom_item.dart';
  4. import 'package:webfeed/domain/atom_link.dart';
  5. import 'package:webfeed/domain/atom_person.dart';
  6. import 'package:webfeed/util/helpers.dart';
  7. import 'package:xml/xml.dart';
  8. class AtomFeed {
  9. final String id;
  10. final String title;
  11. final String updated;
  12. final List<AtomItem> items;
  13. final List<AtomLink> links;
  14. final List<AtomPerson> authors;
  15. final List<AtomPerson> contributors;
  16. final List<AtomCategory> categories;
  17. final AtomGenerator generator;
  18. final String icon;
  19. final String logo;
  20. final String rights;
  21. final String subtitle;
  22. AtomFeed({
  23. this.id,
  24. this.title,
  25. this.updated,
  26. this.items,
  27. this.links,
  28. this.authors,
  29. this.contributors,
  30. this.categories,
  31. this.generator,
  32. this.icon,
  33. this.logo,
  34. this.rights,
  35. this.subtitle,
  36. });
  37. factory AtomFeed.parse(String xmlString) {
  38. var document = parse(xmlString);
  39. XmlElement feedElement;
  40. try {
  41. feedElement = document.findElements("feed").first;
  42. } on StateError {
  43. throw new ArgumentError("feed not found");
  44. }
  45. return AtomFeed(
  46. id: findElementOrNull(feedElement, "id")?.text,
  47. title: findElementOrNull(feedElement, "title")?.text,
  48. updated: findElementOrNull(feedElement, "updated")?.text,
  49. items: feedElement.findElements("entry").map((element) {
  50. return AtomItem.parse(element);
  51. }).toList(),
  52. links: feedElement.findElements("link").map((element) {
  53. return AtomLink.parse(element);
  54. }).toList(),
  55. authors: feedElement.findElements("author").map((element) {
  56. return AtomPerson.parse(element);
  57. }).toList(),
  58. contributors: feedElement.findElements("contributor").map((element) {
  59. return AtomPerson.parse(element);
  60. }).toList(),
  61. categories: feedElement.findElements("category").map((element) {
  62. return AtomCategory.parse(element);
  63. }).toList(),
  64. generator:
  65. AtomGenerator.parse(findElementOrNull(feedElement, "generator")),
  66. icon: findElementOrNull(feedElement, "icon")?.text,
  67. logo: findElementOrNull(feedElement, "logo")?.text,
  68. rights: findElementOrNull(feedElement, "rights")?.text,
  69. subtitle: findElementOrNull(feedElement, "subtitle")?.text,
  70. );
  71. }
  72. }