aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Alexandre Alapetite <alexandre@alapetite.fr> 2016-08-11 22:44:42 +0200
committerGravatar Alexandre Alapetite <alexandre@alapetite.fr> 2016-08-11 22:44:42 +0200
commit29d79185880f361545cf08b9faa4c755206c296e (patch)
treea211f41d670ebafc32b58e61548527defe13333f
parent5e9152288177a0f4237fd1e4c40b09ce1838fb6a (diff)
Support for OPML 2.0 category attribute
https://github.com/FreshRSS/FreshRSS/issues/1202
-rw-r--r--CHANGELOG.md2
-rw-r--r--README.fr.md1
-rw-r--r--README.md1
-rw-r--r--lib/lib_opml.php31
4 files changed, 34 insertions, 1 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 601bc9d4b..017bd6e1a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -16,12 +16,14 @@
* Fixed scroll in log view [#1178](https://github.com/FreshRSS/FreshRSS/issues/1178)
* Fixed JavaScript bug when articles were not always marked as read [#1123](https://github.com/FreshRSS/FreshRSS/issues/1123)
* Fixed Apache Etag issue that prevented caching [#1199](https://github.com/FreshRSS/FreshRSS/pull/1199)
+ * Fixed OPML import of categories [#1202](https://github.com/FreshRSS/FreshRSS/issues/1202)
* UI
* Updated to jQuery 3.1.0 and several JavaScript fixes (e.g. drag & drop) [#1197](https://github.com/FreshRSS/FreshRSS/pull/1197)
* API
* Add API link in FreshRSS profile settings to ease set-up [#1186](https://github.com/FreshRSS/FreshRSS/pull/1186)
* Mics.
* JSHint of JavaScript code and better initialisation [#1196](https://github.com/FreshRSS/FreshRSS/pull/1196)
+ * Updated credits, and images in README [#1201](https://github.com/FreshRSS/FreshRSS/issues/1201)
## 2016-07-23 FreshRSS 1.4.0
diff --git a/README.fr.md b/README.fr.md
index a53653286..8324b9657 100644
--- a/README.fr.md
+++ b/README.fr.md
@@ -125,6 +125,7 @@ mysqldump -u utilisateur -p --databases freshrss > freshrss.sql
* [php-http-304](http://alexandre.alapetite.fr/doc-alex/php-http-304/)
* [jQuery](http://jquery.com/)
* [ArthurHoaro/favicon](https://github.com/ArthurHoaro/favicon)
+* [lib_opml](https://github.com/marienfressinaud/lib_opml)
* [keyboard_shortcuts](http://www.openjs.com/scripts/events/keyboard_shortcuts/)
* [flotr2](http://www.humblesoftware.com/flotr2)
diff --git a/README.md b/README.md
index 1c9f89c78..844967f4f 100644
--- a/README.md
+++ b/README.md
@@ -125,6 +125,7 @@ mysqldump -u user -p --databases freshrss > freshrss.sql
* [php-http-304](http://alexandre.alapetite.fr/doc-alex/php-http-304/)
* [jQuery](http://jquery.com/)
* [ArthurHoaro/favicon](https://github.com/ArthurHoaro/favicon)
+* [lib_opml](https://github.com/marienfressinaud/lib_opml)
* [keyboard_shortcuts](http://www.openjs.com/scripts/events/keyboard_shortcuts/)
* [flotr2](http://www.humblesoftware.com/flotr2)
diff --git a/lib/lib_opml.php b/lib/lib_opml.php
index 66b854313..0414868fb 100644
--- a/lib/lib_opml.php
+++ b/lib/lib_opml.php
@@ -12,7 +12,7 @@
*
* @author Marien Fressinaud <dev@marienfressinaud.fr>
* @link https://github.com/marienfressinaud/lib_opml
- * @version 0.2
+ * @version 0.2-FreshRSS~1.5.1
* @license public domain
*
* Usages:
@@ -123,6 +123,32 @@ function libopml_parse_outline($outline_xml, $strict = true) {
return $outline;
}
+/**
+ * Reformat the XML document as a hierarchy when
+ * the OPML 2.0 category attribute is used
+ */
+function preprocessing_categories($doc) {
+ $outline_categories = [];
+ $body = $doc->getElementsByTagName('body')->item(0);
+ $xpath = new DOMXpath($doc);
+ $outlines = $xpath->query("/opml/body/outline[@category]");
+ foreach ($outlines as $outline) {
+ $category = trim($outline->getAttribute('category'));
+ if ($category != '') {
+ $outline_categorie = null;
+ if (!isset($outline_categories[$category])) {
+ $outline_categorie = $doc->createElement('outline');
+ $outline_categorie->setAttribute('text', $category);
+ $body->insertBefore($outline_categorie, $body->firstChild);
+ $outline_categories[$category] = $outline_categorie;
+ } else {
+ $outline_categorie = $outline_categories[$category];
+ }
+ $outline->parentNode->removeChild($outline);
+ $outline_categorie->appendChild($outline);
+ }
+ }
+}
/**
* Parse a string as a XML one and returns the corresponding array
@@ -140,6 +166,9 @@ function libopml_parse_string($xml, $strict = true) {
$dom->loadXML($xml);
$dom->encoding = 'UTF-8';
+ //Partial compatibility with the category attribute of OPML 2.0
+ preprocessing_categories($dom);
+
$opml = simplexml_import_dom($dom);
if (!$opml) {