From 1742fb65c53a2a6cd6a310d225add25ee20c14b6 Mon Sep 17 00:00:00 2001 From: wn_ Date: Tue, 10 Dec 2024 18:58:17 +0000 Subject: Use the spread operator instead of 'array_merge' in more places. PHP 8.1 introduced support for merging string-key arrays (last array with a wins). --- classes/PluginHost.php | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) (limited to 'classes/PluginHost.php') diff --git a/classes/PluginHost.php b/classes/PluginHost.php index cc81bc9c0..9a8fa32c2 100644 --- a/classes/PluginHost.php +++ b/classes/PluginHost.php @@ -851,14 +851,12 @@ class PluginHost { */ function get_method_url(Plugin $sender, string $method, array $params = []): string { return Config::get_self_url() . "/backend.php?" . - http_build_query( - array_merge( - [ - "op" => "pluginhandler", - "plugin" => strtolower(get_class($sender)), - "method" => $method - ], - $params)); + http_build_query([ + 'op' => 'pluginhandler', + 'plugin' => strtolower(get_class($sender)), + 'method' => $method, + ...$params, + ]); } // shortcut syntax (disabled for now) @@ -880,12 +878,10 @@ class PluginHost { function get_public_method_url(Plugin $sender, string $method, array $params = []): ?string { if ($sender->is_public_method($method)) { return Config::get_self_url() . "/public.php?" . - http_build_query( - array_merge( - [ - "op" => strtolower(get_class($sender) . self::PUBLIC_METHOD_DELIMITER . $method), - ], - $params)); + http_build_query([ + 'op' => strtolower(get_class($sender) . self::PUBLIC_METHOD_DELIMITER . $method), + ...$params, + ]); } user_error("get_public_method_url: requested method '$method' of '" . get_class($sender) . "' is private."); return null; -- cgit v1.2.3-54-g00ecf From 57dd754e07ecc7a4cf551568f0b2c4448c246b84 Mon Sep 17 00:00:00 2001 From: wn_ Date: Tue, 10 Dec 2024 20:42:38 +0000 Subject: Use a native DNF type for 'PluginHost->get_feed_handler()'. --- classes/PluginHost.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'classes/PluginHost.php') diff --git a/classes/PluginHost.php b/classes/PluginHost.php index 9a8fa32c2..e40cf86ad 100644 --- a/classes/PluginHost.php +++ b/classes/PluginHost.php @@ -784,10 +784,8 @@ class PluginHost { /** * convert feed_id (e.g. -129) to pfeed_id first - * - * @return (Plugin&IVirtualFeed)|null */ - function get_feed_handler(int $pfeed_id): ?Plugin { + function get_feed_handler(int $pfeed_id): (Plugin&IVirtualFeed)|null { foreach ($this->feeds as $cat) { foreach ($cat as $feed) { if ($feed['id'] == $pfeed_id) { -- cgit v1.2.3-54-g00ecf From 18b17cbc839026ecb99c2b044e401c2032626df7 Mon Sep 17 00:00:00 2001 From: wn_ Date: Sun, 15 Dec 2024 13:39:54 +0000 Subject: Revert some stuff based upon feedback --- classes/FeedEnclosure.php | 14 +++++------- classes/FeedItem_Atom.php | 9 ++++---- classes/FeedItem_Common.php | 53 ++++++++++++++++++++++++--------------------- classes/FeedItem_RSS.php | 15 +++++++------ classes/PluginHost.php | 3 ++- 5 files changed, 48 insertions(+), 46 deletions(-) (limited to 'classes/PluginHost.php') diff --git a/classes/FeedEnclosure.php b/classes/FeedEnclosure.php index 6ef9bca5e..1e53de2e8 100644 --- a/classes/FeedEnclosure.php +++ b/classes/FeedEnclosure.php @@ -1,11 +1,9 @@ xpath->evaluate("string(ancestor-or-self::*[@xml:base][1]/@xml:base)", $link); if ($link->getAttribute("rel") == "enclosure") { - $enc = new FeedEnclosure( - type: clean($link->getAttribute('type')), - length: clean($link->getAttribute('length')), - link: clean($link->getAttribute('href')), - ); + $enc = new FeedEnclosure(); + $enc->type = clean($link->getAttribute('type')); + $enc->length = clean($link->getAttribute('length')); + $enc->link = clean($link->getAttribute('href')); if (!empty($base)) { $enc->link = UrlHelper::rewrite_relative($base, $enc->link); diff --git a/classes/FeedItem_Common.php b/classes/FeedItem_Common.php index 5b30ab20c..5ec958699 100644 --- a/classes/FeedItem_Common.php +++ b/classes/FeedItem_Common.php @@ -1,10 +1,14 @@ elem = $elem; + $this->doc = $doc; + $this->xpath = $xpath; + try { $source = $elem->getElementsByTagName("source")->item(0); @@ -88,13 +92,12 @@ abstract class FeedItem_Common extends FeedItem { $enclosures = $this->xpath->query("media:content", $this->elem); foreach ($enclosures as $enclosure) { - $enc = new FeedEnclosure( - type: clean($enclosure->getAttribute('type')), - link: clean($enclosure->getAttribute('url')), - length: clean($enclosure->getAttribute('length')), - height: clean($enclosure->getAttribute('height')), - width: clean($enclosure->getAttribute('width')), - ); + $enc = new FeedEnclosure(); + $enc->type = clean($enclosure->getAttribute('type')); + $enc->link = clean($enclosure->getAttribute('url')); + $enc->length = clean($enclosure->getAttribute('length')); + $enc->height = clean($enclosure->getAttribute('height')); + $enc->width = clean($enclosure->getAttribute('width')); $medium = clean($enclosure->getAttribute("medium")); if (!$enc->type && $medium) { @@ -114,13 +117,12 @@ abstract class FeedItem_Common extends FeedItem { $content = $this->xpath->query("media:content", $enclosure)->item(0); if ($content) { - $enc = new FeedEnclosure( - type: clean($content->getAttribute('type')), - link: clean($content->getAttribute('url')), - length: clean($content->getAttribute('length')), - height: clean($content->getAttribute('height')), - width: clean($content->getAttribute('width')), - ); + $enc = new FeedEnclosure(); + $enc->type = clean($content->getAttribute('type')); + $enc->link = clean($content->getAttribute('url')); + $enc->length = clean($content->getAttribute('length')); + $enc->height = clean($content->getAttribute('height')); + $enc->width = clean($content->getAttribute('width')); $medium = clean($content->getAttribute("medium")); if (!$enc->type && $medium) { @@ -142,12 +144,13 @@ abstract class FeedItem_Common extends FeedItem { $enclosures = $this->xpath->query("media:thumbnail", $this->elem); foreach ($enclosures as $enclosure) { - $encs[] = new FeedEnclosure( - type: 'image/generic', - link: clean($enclosure->getAttribute('url')), - height: clean($enclosure->getAttribute('height')), - width: clean($enclosure->getAttribute('width')), - ); + $enc = new FeedEnclosure(); + $enc->type = 'image/generic'; + $enc->link = clean($enclosure->getAttribute('url')); + $enc->height = clean($enclosure->getAttribute('height')); + $enc->width = clean($enclosure->getAttribute('width')); + + array_push($encs, $enc); } return $encs; diff --git a/classes/FeedItem_RSS.php b/classes/FeedItem_RSS.php index 2970e43bd..6e1435310 100644 --- a/classes/FeedItem_RSS.php +++ b/classes/FeedItem_RSS.php @@ -141,13 +141,14 @@ class FeedItem_RSS extends FeedItem_Common { $encs = array(); foreach ($enclosures as $enclosure) { - $encs[] = new FeedEnclosure( - type: clean($enclosure->getAttribute('type')), - link: clean($enclosure->getAttribute('url')), - length: clean($enclosure->getAttribute('length')), - height: clean($enclosure->getAttribute('height')), - width: clean($enclosure->getAttribute('width')), - ); + $enc = new FeedEnclosure(); + $enc->type = clean($enclosure->getAttribute('type')); + $enc->link = clean($enclosure->getAttribute('url')); + $enc->length = clean($enclosure->getAttribute('length')); + $enc->height = clean($enclosure->getAttribute('height')); + $enc->width = clean($enclosure->getAttribute('width')); + + array_push($encs, $enc); } array_push($encs, ...parent::get_enclosures()); diff --git a/classes/PluginHost.php b/classes/PluginHost.php index e40cf86ad..97d0c45c7 100644 --- a/classes/PluginHost.php +++ b/classes/PluginHost.php @@ -784,8 +784,9 @@ class PluginHost { /** * convert feed_id (e.g. -129) to pfeed_id first + * @return (Plugin&IVirtualFeed)|null */ - function get_feed_handler(int $pfeed_id): (Plugin&IVirtualFeed)|null { + function get_feed_handler(int $pfeed_id): ?Plugin { foreach ($this->feeds as $cat) { foreach ($cat as $feed) { if ($feed['id'] == $pfeed_id) { -- cgit v1.2.3-54-g00ecf From cfbbb9d714d7b5d59d3fb3e326b80f6cc88fbe23 Mon Sep 17 00:00:00 2001 From: wn_ Date: Sun, 15 Dec 2024 16:09:40 +0000 Subject: Clean up some virtual feed stuff in PluginHost. Among other things, this makes 'PluginHost->add_feed()' return false if the feed was not added. --- classes/PluginHost.php | 57 ++++++++++++++++++++++++++++---------------------- 1 file changed, 32 insertions(+), 25 deletions(-) (limited to 'classes/PluginHost.php') diff --git a/classes/PluginHost.php b/classes/PluginHost.php index 97d0c45c7..bccf2ecc8 100644 --- a/classes/PluginHost.php +++ b/classes/PluginHost.php @@ -23,8 +23,8 @@ class PluginHost { /** @var array> plugin name -> (potential profile array) -> key -> value */ private array $storage = []; - /** @var array> */ - private array $feeds = []; + /** @var array */ + private array $special_feeds = []; /** @var array API method name, Plugin sender */ private array $api_methods = []; @@ -759,44 +759,51 @@ class PluginHost { } } - // Plugin feed functions are *EXPERIMENTAL*! - - // cat_id: only -1 (Feeds::CATEGORY_SPECIAL) is supported (Special) - function add_feed(int $cat_id, string $title, string $icon, Plugin $sender): int { - - if (empty($this->feeds[$cat_id])) - $this->feeds[$cat_id] = []; + /** + * Add a special (plugin-provided) feed + * + * @param int $cat_id only -1 (Feeds::CATEGORY_SPECIAL) is supported + * @return false|positive-int false if $cat_id was not -1 (Feeds::CATEGORY_SPECIAL), + * otherwise a positive integer ID that might change between executions + */ + function add_feed(int $cat_id, string $title, string $icon, Plugin $sender): false|int { + if ($cat_id !== Feeds::CATEGORY_SPECIAL) + return false; - $id = count($this->feeds[$cat_id]); + $id = count($this->special_feeds); - array_push($this->feeds[$cat_id], - ['id' => $id, 'title' => $title, 'sender' => $sender, 'icon' => $icon]); + $this->special_feeds[] = [ + 'id' => $id, + 'title' => $title, + 'sender' => $sender, + 'icon' => $icon, + ]; return $id; } /** + * Get special (plugin-provided) feeds + * + * @param int $cat_id only -1 (Feeds::CATEGORY_SPECIAL) is supported * @return array */ function get_feeds(int $cat_id) { - return $this->feeds[$cat_id] ?? []; + return $cat_id === Feeds::CATEGORY_SPECIAL ? $this->special_feeds : []; } /** - * convert feed_id (e.g. -129) to pfeed_id first - * @return (Plugin&IVirtualFeed)|null + * Get the Plugin handling a specific virtual feed. + * + * Convert feed_id (e.g. -129) to pfeed_id first. + * + * @return (Plugin&IVirtualFeed)|null a Plugin that implements IVirtualFeed, otherwise null */ function get_feed_handler(int $pfeed_id): ?Plugin { - foreach ($this->feeds as $cat) { - foreach ($cat as $feed) { - if ($feed['id'] == $pfeed_id) { - if (implements_interface($feed['sender'], 'IVirtualFeed')) { - /** @var Plugin&IVirtualFeed $feed['sender'] */ - return $feed['sender']; - } else { - return null; - } - } + foreach ($this->special_feeds as $feed) { + if ($feed['id'] == $pfeed_id) { + /** @var Plugin&IVirtualFeed $feed['sender'] */ + return implements_interface($feed['sender'], 'IVirtualFeed') ? $feed['sender'] : null; } } return null; -- cgit v1.2.3-54-g00ecf From 6f8f1b30d508dc3d2c3a067ca7fe2d161963ef5f Mon Sep 17 00:00:00 2001 From: wn_ Date: Sun, 15 Dec 2024 16:41:45 +0000 Subject: minor PHPDoc cleanup in PluginHost --- classes/PluginHost.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'classes/PluginHost.php') diff --git a/classes/PluginHost.php b/classes/PluginHost.php index bccf2ecc8..5f1d97f53 100644 --- a/classes/PluginHost.php +++ b/classes/PluginHost.php @@ -763,8 +763,8 @@ class PluginHost { * Add a special (plugin-provided) feed * * @param int $cat_id only -1 (Feeds::CATEGORY_SPECIAL) is supported - * @return false|positive-int false if $cat_id was not -1 (Feeds::CATEGORY_SPECIAL), - * otherwise a positive integer ID that might change between executions + * @return false|int false if the feed wasn't added (e.g. $cat_id wasn't Feeds::CATEGORY_SPECIAL), + * otherwise an integer "feed ID" that might change between executions */ function add_feed(int $cat_id, string $title, string $icon, Plugin $sender): false|int { if ($cat_id !== Feeds::CATEGORY_SPECIAL) -- cgit v1.2.3-54-g00ecf