Skip to content

Commit

Permalink
[XPathBridge] Allow multiple categories (#4038)
Browse files Browse the repository at this point in the history
* [XPathAbstract] allow multiple categories

* fix feed icons in two bridges

* fix warning

* fix linter errors
  • Loading branch information
Niehztog authored Mar 31, 2024
1 parent d23fd25 commit 1c3c85d
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 19 deletions.
7 changes: 7 additions & 0 deletions bridges/BlizzardNewsBridge.php
Original file line number Diff line number Diff line change
Expand Up @@ -57,4 +57,11 @@ protected function getSourceUrl()
}
return 'https://news.blizzard.com/' . $locale;
}

public function getIcon()
{
return <<<icon
https://blznews.akamaized.net/images/favicon-cb34a003c6f2f637ee8f4f7b406f3b9b120b918c04cabec7f03a760e708977ea9689a1c638f4396def8dce7b202cd007eae91946cc3c4a578aa8b5694226cfc6.ico
icon;
}
}
5 changes: 5 additions & 0 deletions bridges/NiusBridge.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,11 @@ class NiusBridge extends XPathAbstract
const XPATH_EXPRESSION_ITEM_CATEGORIES = './/div[@class="subtitle"]/text()';
const SETTING_FIX_ENCODING = false;

public function getIcon()
{
return 'https://www.nius.de/favicon.ico';
}

protected function formatItemTitle($value)
{
return strip_tags($value);
Expand Down
74 changes: 55 additions & 19 deletions lib/XPathAbstract.php
Original file line number Diff line number Diff line change
Expand Up @@ -439,7 +439,8 @@ public function collectData()
}

$isContent = $param === 'content';
$value = $this->getItemValueOrNodeValue($typedResult, $isContent, $isContent && !$this->getSettingUseRawItemContent());
$isCategories = 'categories' === $param;
$value = $this->getItemValueOrNodeValue($typedResult, $isContent, $isContent && !$this->getSettingUseRawItemContent(), $isCategories);
$item->__set($param, $this->formatParamValue($param, $value));
}

Expand All @@ -459,7 +460,7 @@ public function collectData()
*/
protected function formatParamValue($param, $value)
{
$value = $this->fixEncoding($value);
$value = is_array($value) ? array_map([$this, 'fixEncoding'], $value) : $this->fixEncoding($value);
switch ($param) {
case 'title':
return $this->formatItemTitle($value);
Expand Down Expand Up @@ -572,12 +573,12 @@ protected function formatItemEnclosures($value)
* formatted as array.
* Can be easily overwritten for in case the values need to be transformed into something
* else.
* @param string $value
* @param string|array $value
* @return array
*/
protected function formatItemCategories($value)
{
return [$value];
return is_array($value) ? $value : [$value];
}

/**
Expand All @@ -596,33 +597,68 @@ protected function cleanMediaUrl($mediaUrl)

/**
* @param $typedResult
* @return string
* @param bool $returnXML
* @param bool $escapeHtml
* @param bool $allowMultiple
* @return string|array
* @throws Exception
*/
protected function getItemValueOrNodeValue($typedResult, $returnXML = false, $escapeHtml = false)
protected function getItemValueOrNodeValue($typedResult, $returnXML = false, $escapeHtml = false, $allowMultiple = false)
{
if ($typedResult instanceof \DOMNodeList) {
if ($typedResult instanceof \DOMNodeList && !$allowMultiple) {
$item = $typedResult->item(0);
if ($item instanceof \DOMElement) {
// Don't escape XML
if ($returnXML) {
return ($item->ownerDocument ?? $item)->saveXML($item);
}
$text = $item->nodeValue;
} elseif ($item instanceof \DOMAttr) {
$text = $item->value;
} elseif ($item instanceof \DOMText) {
$text = $item->wholeText;
$text = $this->extractNodeListContent($item, $returnXML);
} elseif ($typedResult instanceof \DOMNodeList && $allowMultiple) {
$text = [];
foreach ($typedResult as $item) {
$text[] = $this->extractNodeListContent($item, $returnXML);
}
} elseif (is_string($typedResult) && strlen($typedResult) > 0) {
$text = $typedResult;
} else {
throw new \Exception('Unknown type of XPath expression result.');
}

if (is_array($text)) {
foreach ($text as &$element) {
$element = $this->cleanExtractedText($element, $escapeHtml, $returnXML);
}
} else {
$text = $this->cleanExtractedText($text, $escapeHtml, $returnXML);
}
return $text;
}

/**
* @param $item
* @param $returnXML
* @return false|string
* @throws Exception
*/
protected function extractNodeListContent($item, $returnXML)
{
if ($item instanceof \DOMElement) {
return $returnXML ? ($item->ownerDocument ?? $item)->saveXML($item) : $item->nodeValue;
} elseif ($item instanceof \DOMAttr) {
return $item->value;
} elseif ($item instanceof \DOMText) {
return $item->wholeText;
}
throw new \Exception('Unknown type of XPath expression result.');
}

/**
* @param $text
* @param $escapeHtml
* @param $returnXML
* @return string
*/
protected function cleanExtractedText($text, $escapeHtml, $returnXML)
{
$text = trim($text);

if ($escapeHtml) {
return htmlspecialchars($text);
if ($escapeHtml && !$returnXML) {
$text = htmlspecialchars($text);
}
return $text;
}
Expand Down

0 comments on commit 1c3c85d

Please sign in to comment.