Skip to content

Commit cd9415c

Browse files
committed
add dublin core
1 parent 9f01e1e commit cd9415c

File tree

7 files changed

+188
-118
lines changed

7 files changed

+188
-118
lines changed
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import 'package:webfeed/util/helpers.dart';
2+
import 'package:xml/xml.dart';
3+
4+
class DublinCore {
5+
final String title;
6+
final String description;
7+
final String creator;
8+
final String subject;
9+
final String publisher;
10+
final String contributor;
11+
final String date;
12+
final String type;
13+
final String format;
14+
final String identifier;
15+
final String source;
16+
final String language;
17+
final String relation;
18+
final String coverage;
19+
final String rights;
20+
21+
DublinCore({
22+
this.title,
23+
this.description,
24+
this.creator,
25+
this.subject,
26+
this.publisher,
27+
this.contributor,
28+
this.date,
29+
this.type,
30+
this.format,
31+
this.identifier,
32+
this.source,
33+
this.language,
34+
this.relation,
35+
this.coverage,
36+
this.rights,
37+
});
38+
39+
factory DublinCore.parse(XmlElement element) {
40+
if (element == null) {
41+
return null;
42+
}
43+
return DublinCore(
44+
title: findElementOrNull(element, "dc:title")?.text,
45+
description: findElementOrNull(element, "dc:description")?.text,
46+
creator: findElementOrNull(element, "dc:creator")?.text,
47+
subject: findElementOrNull(element, "dc:subject")?.text,
48+
publisher: findElementOrNull(element, "dc:publisher")?.text,
49+
contributor: findElementOrNull(element, "dc:contributor")?.text,
50+
date: findElementOrNull(element, "dc:date")?.text,
51+
type: findElementOrNull(element, "dc:type")?.text,
52+
format: findElementOrNull(element, "dc:format")?.text,
53+
identifier: findElementOrNull(element, "dc:identifier")?.text,
54+
source: findElementOrNull(element, "dc:source")?.text,
55+
language: findElementOrNull(element, "dc:language")?.text,
56+
relation: findElementOrNull(element, "dc:relation")?.text,
57+
coverage: findElementOrNull(element, "dc:coverage")?.text,
58+
rights: findElementOrNull(element, "dc:rights")?.text,
59+
);
60+
}
61+
}

lib/domain/rss_cloud.dart

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import 'package:xml/xml.dart';
22

33
class RssCloud {
4-
String domain;
5-
String port;
6-
String path;
7-
String registerProcedure;
8-
String protocol;
4+
final String domain;
5+
final String port;
6+
final String path;
7+
final String registerProcedure;
8+
final String protocol;
99

1010
RssCloud(
1111
this.domain,
@@ -16,6 +16,9 @@ class RssCloud {
1616
);
1717

1818
factory RssCloud.parse(XmlElement node) {
19+
if (node == null) {
20+
return null;
21+
}
1922
var domain = node.getAttribute("domain");
2023
var port = node.getAttribute("port");
2124
var path = node.getAttribute("path");

lib/domain/rss_feed.dart

Lines changed: 35 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'dart:core';
22

3+
import 'package:webfeed/domain/dublin_core/dublin_core.dart';
34
import 'package:webfeed/domain/rss_category.dart';
45
import 'package:webfeed/domain/rss_cloud.dart';
56
import 'package:webfeed/domain/rss_image.dart';
@@ -27,6 +28,7 @@ class RssFeed {
2728
final String rating;
2829
final String webMaster;
2930
final int ttl;
31+
final DublinCore dc;
3032

3133
RssFeed({
3234
this.title,
@@ -47,6 +49,7 @@ class RssFeed {
4749
this.rating,
4850
this.webMaster,
4951
this.ttl,
52+
this.dc,
5053
});
5154

5255
factory RssFeed.parse(String xmlString) {
@@ -55,105 +58,41 @@ class RssFeed {
5558
try {
5659
channelElement = document.findAllElements("channel").first;
5760
} on StateError {
58-
throw new ArgumentError("channel not found");
61+
throw ArgumentError("channel not found");
5962
}
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);
6463

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) {
8779
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),
13396
);
13497
}
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-
}
15998
}

lib/domain/rss_image.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ class RssImage {
99
RssImage(this.title, this.url, this.link);
1010

1111
factory RssImage.parse(XmlElement element) {
12+
if (element == null) {
13+
return null;
14+
}
1215
var title = xmlGetString(element, "title", strict: false);
1316
var url = xmlGetString(element, "url", strict: false);
1417
var link = xmlGetString(element, "link", strict: false);

lib/domain/rss_item.dart

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import 'package:webfeed/domain/dublin_core/dublin_core.dart';
12
import 'package:webfeed/domain/media/media.dart';
23
import 'package:webfeed/domain/rss_category.dart';
34
import 'package:webfeed/domain/rss_content.dart';
@@ -21,6 +22,7 @@ class RssItem {
2122
final RssContent content;
2223
final Media media;
2324
final RssEnclosure enclosure;
25+
final DublinCore dc;
2426

2527
RssItem({
2628
this.title,
@@ -35,15 +37,16 @@ class RssItem {
3537
this.content,
3638
this.media,
3739
this.enclosure,
40+
this.dc,
3841
});
3942

4043
factory RssItem.parse(XmlElement element) {
41-
return new RssItem(
44+
return RssItem(
4245
title: findElementOrNull(element, "title")?.text,
4346
description: findElementOrNull(element, "description")?.text,
4447
link: findElementOrNull(element, "link")?.text,
4548
categories: element.findElements("category").map((element) {
46-
return new RssCategory.parse(element);
49+
return RssCategory.parse(element);
4750
}).toList(),
4851
guid: findElementOrNull(element, "guid")?.text,
4952
pubDate: findElementOrNull(element, "pubDate")?.text,
@@ -53,21 +56,7 @@ class RssItem {
5356
content: RssContent.parse(findElementOrNull(element, "content:encoded")),
5457
media: Media.parse(element),
5558
enclosure: RssEnclosure.parse(findElementOrNull(element, "enclosure")),
59+
dc: DublinCore.parse(element),
5660
);
5761
}
58-
59-
@override
60-
String toString() {
61-
return '''
62-
title: $title
63-
description: $description
64-
link: $link
65-
guid: $guid
66-
pubDate: $pubDate
67-
author: $author
68-
comments: $comments
69-
source: $source
70-
content: $content
71-
''';
72-
}
7362
}

test/rss_test.dart

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,4 +213,41 @@ void main() {
213213
expect(item.media.scenes.first.startTime, "00:15");
214214
expect(item.media.scenes.first.endTime, "00:45");
215215
});
216+
test("parse RSS-DC.xml", (){
217+
var xmlString = File("test/xml/RSS-DC.xml").readAsStringSync();
218+
219+
var feed = RssFeed.parse(xmlString);
220+
221+
expect(feed.dc.title, "title");
222+
expect(feed.dc.creator, "creator");
223+
expect(feed.dc.subject, "subject");
224+
expect(feed.dc.description, "description");
225+
expect(feed.dc.publisher, "publisher");
226+
expect(feed.dc.contributor, "contributor");
227+
expect(feed.dc.date, "2000-01-01T12:00+00:00");
228+
expect(feed.dc.type, "type");
229+
expect(feed.dc.format, "format");
230+
expect(feed.dc.identifier, "identifier");
231+
expect(feed.dc.source, "source");
232+
expect(feed.dc.language, "language");
233+
expect(feed.dc.relation, "relation");
234+
expect(feed.dc.coverage, "coverage");
235+
expect(feed.dc.rights, "rights");
236+
237+
expect(feed.items.first.dc.title, "title");
238+
expect(feed.items.first.dc.creator, "creator");
239+
expect(feed.items.first.dc.subject, "subject");
240+
expect(feed.items.first.dc.description, "description");
241+
expect(feed.items.first.dc.publisher, "publisher");
242+
expect(feed.items.first.dc.contributor, "contributor");
243+
expect(feed.items.first.dc.date, "2000-01-01T12:00+00:00");
244+
expect(feed.items.first.dc.type, "type");
245+
expect(feed.items.first.dc.format, "format");
246+
expect(feed.items.first.dc.identifier, "identifier");
247+
expect(feed.items.first.dc.source, "source");
248+
expect(feed.items.first.dc.language, "language");
249+
expect(feed.items.first.dc.relation, "relation");
250+
expect(feed.items.first.dc.coverage, "coverage");
251+
expect(feed.items.first.dc.rights, "rights");
252+
});
216253
}

test/xml/RSS-DC.xml

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<rss version="2.0"
3+
xmlns:dc="http://purl.org/dc/elements/1.1/">
4+
<channel>
5+
<dc:title>title</dc:title>
6+
<dc:creator>creator</dc:creator>
7+
<dc:subject>subject</dc:subject>
8+
<dc:description>description</dc:description>
9+
<dc:publisher>publisher</dc:publisher>
10+
<dc:contributor>contributor</dc:contributor>
11+
<dc:date>2000-01-01T12:00+00:00</dc:date>
12+
<dc:type>type</dc:type>
13+
<dc:format>format</dc:format>
14+
<dc:identifier>identifier</dc:identifier>
15+
<dc:source>source</dc:source>
16+
<dc:language>language</dc:language>
17+
<dc:relation>relation</dc:relation>
18+
<dc:coverage>coverage</dc:coverage>
19+
<dc:rights>rights</dc:rights>
20+
<item>
21+
<dc:title>title</dc:title>
22+
<dc:creator>creator</dc:creator>
23+
<dc:subject>subject</dc:subject>
24+
<dc:description>description</dc:description>
25+
<dc:publisher>publisher</dc:publisher>
26+
<dc:contributor>contributor</dc:contributor>
27+
<dc:date>2000-01-01T12:00+00:00</dc:date>
28+
<dc:type>type</dc:type>
29+
<dc:format>format</dc:format>
30+
<dc:identifier>identifier</dc:identifier>
31+
<dc:source>source</dc:source>
32+
<dc:language>language</dc:language>
33+
<dc:relation>relation</dc:relation>
34+
<dc:coverage>coverage</dc:coverage>
35+
<dc:rights>rights</dc:rights>
36+
</item>
37+
</channel>
38+
</rss>

0 commit comments

Comments
 (0)