|
|
@@ -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) {
|