VvebOIDC/system/import/rss.php

119 lines
2.6 KiB
PHP

<?php
/**
* Vvveb
*
* Copyright (C) 2022 Ziadin Givan
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
namespace Vvveb\System\Import;
#[\AllowDynamicProperties]
class Rss {
private $dom;
private $xpath;
private $rss;
private $importXMLOptions = LIBXML_NOBLANKS |
LIBXML_COMPACT |
LIBXML_NOCDATA |
LIBXML_PARSEHUGE |
LIBXML_NOWARNING;
// |
//LIBXML_BIGLINES;
function __construct($rss) {
$this->rss = $rss;
$this->dom = new \DOMDocument('1.0', 'utf-8');
$this->dom->formatOutput = false;
$this->dom->preserveWhiteSpace = false;
$this->dom->loadXML($this->rss, $this->importXMLOptions);
$this->dom->normalize();
$this->xpath = new \DOMXpath($this->dom);
}
function buildXPath($attributes = []) {
$list = '';
foreach ($attributes as $attribute) {
$name = key($attribute);
$value = current($attribute);
$operator = '=';
if (is_array($value)) {
$operator = $value[1];
$value = $value[0];
}
$list .= "[$name $operator '$value']";
}
$xpath = "//channel/item$list";
return $xpath;
}
function value($nodeName) {
$xpath = "//channel/$nodeName";
$item = $this->xpath->query($xpath);
if ($item && isset($item[0])) {
return $item[0]->nodeValue ?? false;
}
}
function count($attributes = []) {
$items = $this->xpath->query($this->buildXPath($attributes));
return $items->length ?? 0;
}
function get($start = 1, $limit = 10, $attributes = []) {
if ($start) {
$attributes[] = ['position()'=> [$start, '>=']];
}
if ($limit) {
$attributes[] = ['position()'=> [$limit, '<=']];
}
$items = $this->xpath->query($this->buildXPath($attributes));
$rows = [];
foreach ($items as $item) {
$columns = $item->childNodes;
foreach ($columns as $column) {
if ($column->nodeName == '#text') {
continue;
}
$columnName = $column->nodeName;
$columnValue = $column->nodeValue;
$row[$columnName] = $columnValue;
}
$rows[] = $row;
}
return $rows;
}
}