summaryrefslogtreecommitdiffstats
path: root/js/service
diff options
context:
space:
mode:
authorBernhard Posselt <dev@bernhard-posselt.com>2014-09-14 00:43:40 +0200
committerBernhard Posselt <dev@bernhard-posselt.com>2014-09-14 00:43:40 +0200
commit2647d14cf062c4771b3400721b336bd5857f84f8 (patch)
tree06b382a41257550d33719b4736ea190d06eb845a /js/service
parentc67f4bf6075844a558d137f9e4e926a4d5e53d0f (diff)
add parser for opml
Diffstat (limited to 'js/service')
-rw-r--r--js/service/OPMLParser.js72
1 files changed, 72 insertions, 0 deletions
diff --git a/js/service/OPMLParser.js b/js/service/OPMLParser.js
new file mode 100644
index 000000000..6a56a6217
--- /dev/null
+++ b/js/service/OPMLParser.js
@@ -0,0 +1,72 @@
+/**
+ * ownCloud - News
+ *
+ * This file is licensed under the Affero General Public License version 3 or
+ * later. See the COPYING file.
+ *
+ * @author Bernhard Posselt <dev@bernhard-posselt.com>
+ * @copyright Bernhard Posselt 2014
+ */
+app.service('OPMLParser', function () {
+ 'use strict';
+
+ var parseOutline = function (outline) {
+ var url = outline.attr('xmlUrl') || outline.attr('htmlUrl');
+ var name = outline.attr('title') || outline.attr('text') || url;
+
+ // folder
+ if (url === undefined) {
+ return {
+ type: 'folder',
+ name: name,
+ feeds: []
+ };
+
+ // feed
+ } else {
+ return {
+ type: 'feed',
+ name: name,
+ url: url
+ };
+ }
+ };
+
+ // there is only one level, so feeds in a folder in a folder should be
+ // attached to the root folder
+ var recursivelyParse = function (level, root, firstLevel) {
+ for (var i=0; i<level.length; i++) {
+ var outline = $(level[i]);
+
+ var entry = parseOutline(outline);
+
+ if (entry.type === 'feed') {
+ root.feeds.push(entry);
+ } else {
+
+ // only first level should append folders
+ if (firstLevel) {
+ recursivelyParse(outline.children('outline'), entry, false);
+ root.folders.push(entry);
+ } else {
+ recursivelyParse(outline.children('outline'), root, false);
+ }
+ }
+ };
+
+ return root;
+ };
+
+ this.parse = function (xml) {
+ xml = $.parseXML(xml);
+ var firstLevel = $(xml).find('body > outline');
+
+ var root = {
+ 'feeds': [],
+ 'folders': []
+ };
+
+ return recursivelyParse(firstLevel, root, true);
+ };
+
+}); \ No newline at end of file