summaryrefslogtreecommitdiffstats
path: root/js-old/service/OPMLParser.js
diff options
context:
space:
mode:
Diffstat (limited to 'js-old/service/OPMLParser.js')
-rw-r--r--js-old/service/OPMLParser.js90
1 files changed, 90 insertions, 0 deletions
diff --git a/js-old/service/OPMLParser.js b/js-old/service/OPMLParser.js
new file mode 100644
index 000000000..6752e1d1e
--- /dev/null
+++ b/js-old/service/OPMLParser.js
@@ -0,0 +1,90 @@
+/**
+ * Nextcloud - 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 += 1) {
+ 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 (fileContent) {
+ var xml = $.parseXML(fileContent);
+ var firstLevel = $(xml).find('body > outline');
+
+ var root = {
+ 'feeds': [],
+ 'folders': []
+ };
+
+ var parsedResult = recursivelyParse(firstLevel, root, true);
+
+ // merge folders with duplicate names
+ var folders = {};
+ parsedResult.folders.forEach(function (folder) {
+ if (folders[folder.name] === undefined) {
+ folders[folder.name] = folder;
+ } else {
+ folders[folder.name].feeds = folders[folder.name]
+ .feeds.concat(folder.feeds);
+ }
+ });
+
+ return {
+ 'feeds': parsedResult.feeds,
+ 'folders': Object.keys(folders).map(function (key) {
+ return folders[key];
+ })
+ };
+
+ };
+
+}); \ No newline at end of file