1
1
import 'dart:core' ;
2
2
3
+ import 'package:webfeed/domain/dublin_core/dublin_core.dart' ;
3
4
import 'package:webfeed/domain/rss_category.dart' ;
4
5
import 'package:webfeed/domain/rss_cloud.dart' ;
5
6
import 'package:webfeed/domain/rss_image.dart' ;
@@ -27,6 +28,7 @@ class RssFeed {
27
28
final String rating;
28
29
final String webMaster;
29
30
final int ttl;
31
+ final DublinCore dc;
30
32
31
33
RssFeed ({
32
34
this .title,
@@ -47,6 +49,7 @@ class RssFeed {
47
49
this .rating,
48
50
this .webMaster,
49
51
this .ttl,
52
+ this .dc,
50
53
});
51
54
52
55
factory RssFeed .parse (String xmlString) {
@@ -55,105 +58,41 @@ class RssFeed {
55
58
try {
56
59
channelElement = document.findAllElements ("channel" ).first;
57
60
} on StateError {
58
- throw new ArgumentError ("channel not found" );
61
+ throw ArgumentError ("channel not found" );
59
62
}
60
- var title = xmlGetString (channelElement, "title" , strict: false );
61
- var description =
62
- xmlGetString (channelElement, "description" , strict: false );
63
- var link = xmlGetString (channelElement, "link" , strict: false );
64
63
65
- var feeds = channelElement.findElements ("item" ).map ((element) {
66
- return new RssItem .parse (element);
67
- }).toList ();
68
-
69
- RssImage image;
70
- try {
71
- image = new RssImage .parse (channelElement.findElements ("image" ).first);
72
- } on StateError {}
73
-
74
- RssCloud cloud;
75
- try {
76
- cloud = new RssCloud .parse (channelElement.findElements ("cloud" ).first);
77
- } on StateError {}
78
-
79
- var categories = channelElement.findElements ("category" ).map ((element) {
80
- return new RssCategory .parse (element);
81
- }).toList ();
82
-
83
- var skipDays = new List <String >();
84
- var skipDaysNodes = channelElement.findElements ("skipDays" );
85
- if (skipDaysNodes.isNotEmpty) {
86
- skipDays = skipDaysNodes.first.findAllElements ("day" ).map ((element) {
64
+ return RssFeed (
65
+ title: findElementOrNull (channelElement, "title" )? .text,
66
+ description: findElementOrNull (channelElement, "description" )? .text,
67
+ link: findElementOrNull (channelElement, "link" )? .text,
68
+ items: channelElement.findElements ("item" ).map ((element) {
69
+ return RssItem .parse (element);
70
+ }).toList (),
71
+ image: RssImage .parse (findElementOrNull (channelElement, "image" )),
72
+ cloud: RssCloud .parse (findElementOrNull (channelElement, "cloud" )),
73
+ categories: channelElement.findElements ("category" ).map ((element) {
74
+ return RssCategory .parse (element);
75
+ }).toList (),
76
+ skipDays: findElementOrNull (channelElement, "skipDays" )
77
+ ? .findAllElements ("day" )
78
+ ? .map ((element) {
87
79
return element.text;
88
- }).toList ();
89
- }
90
- var skipHours = new List <int >();
91
- var skipHoursNodes = channelElement.findElements ("skipHours" );
92
- if (skipHoursNodes.isNotEmpty) {
93
- skipHours = skipHoursNodes.first.findAllElements ("hour" ).map ((element) {
94
- try {
95
- return int .parse (element.text);
96
- } on FormatException {
97
- return null ;
98
- }
99
- }).toList ();
100
- }
101
-
102
- var lastBuildDate =
103
- xmlGetString (channelElement, "lastBuildDate" , strict: false );
104
- var language = xmlGetString (channelElement, "language" , strict: false );
105
- var generator = xmlGetString (channelElement, "generator" , strict: false );
106
- var copyright = xmlGetString (channelElement, "copyright" , strict: false );
107
- var docs = xmlGetString (channelElement, "docs" , strict: false );
108
- var managingEditor =
109
- xmlGetString (channelElement, "managingEditor" , strict: false );
110
- var rating = xmlGetString (channelElement, "rating" , strict: false );
111
- var webMaster = xmlGetString (channelElement, "webMaster" , strict: false );
112
- var ttl = xmlGetInt (channelElement, "ttl" , strict: false );
113
-
114
- return new RssFeed (
115
- title: title,
116
- description: description,
117
- link: link,
118
- items: feeds,
119
- image: image,
120
- cloud: cloud,
121
- categories: categories,
122
- skipDays: skipDays,
123
- skipHours: skipHours,
124
- lastBuildDate: lastBuildDate,
125
- language: language,
126
- generator: generator,
127
- copyright: copyright,
128
- docs: docs,
129
- managingEditor: managingEditor,
130
- rating: rating,
131
- webMaster: webMaster,
132
- ttl: ttl,
80
+ })? .toList (),
81
+ skipHours: findElementOrNull (channelElement, "skipHours" )
82
+ ? .findAllElements ("hour" )
83
+ ? .map ((element) {
84
+ return int .tryParse (element.text ?? "0" );
85
+ })? .toList (),
86
+ lastBuildDate: findElementOrNull (channelElement, "lastBuildDate" )? .text,
87
+ language: findElementOrNull (channelElement, "language" )? .text,
88
+ generator: findElementOrNull (channelElement, "generator" )? .text,
89
+ copyright: findElementOrNull (channelElement, "copyright" )? .text,
90
+ docs: findElementOrNull (channelElement, "docs" )? .text,
91
+ managingEditor: findElementOrNull (channelElement, "managingEditor" )? .text,
92
+ rating: findElementOrNull (channelElement, "rating" )? .text,
93
+ webMaster: findElementOrNull (channelElement, "webMaster" )? .text,
94
+ ttl: int .tryParse (findElementOrNull (channelElement, "ttl" )? .text ?? "0" ),
95
+ dc: DublinCore .parse (channelElement),
133
96
);
134
97
}
135
-
136
- @override
137
- String toString () {
138
- return '''
139
- title: $title
140
- description: $description
141
- link: $link
142
- items: $items
143
- image: $image
144
- cloud: $cloud
145
- categories: $categories
146
- skipDays: $skipDays
147
- skipHours: $skipHours
148
- lastBuildDate: $lastBuildDate
149
- language: $language
150
- generator: $generator
151
- copyright: $copyright
152
- docs: $docs
153
- managingEditor: $managingEditor
154
- rating: $rating
155
- webMaster: $webMaster
156
- ttl: $ttl
157
- ''' ;
158
- }
159
98
}
0 commit comments