diff --git a/bridges/ModifyBridge.php b/bridges/ModifyBridge.php new file mode 100644 index 00000000..bf9fa262 --- /dev/null +++ b/bridges/ModifyBridge.php @@ -0,0 +1,181 @@ + [ + 'name' => 'Feed URL', + 'type' => 'text', + 'exampleValue' => 'https://lorem-rss.herokuapp.com/feed?unit=day', + 'required' => true, + ], + 'title_pattern' => [ + 'name' => 'Title find pattern (regular expression!)', + 'type' => 'text', + 'exampleValue' => 'Unwanted part in title', + 'required' => false, + ], + 'title_replacement' => [ + 'name' => 'Title replacement for the find pattern', + 'type' => 'text', + 'exampleValue' => '${0}', + 'required' => false, + ], + 'author_pattern' => [ + 'name' => 'Author find pattern (regular expression!)', + 'type' => 'text', + 'exampleValue' => '^(author)\s*|\s*publisher$', + 'required' => false, + ], + 'author_replacement' => [ + 'name' => 'Author replacement for the find pattern', + 'type' => 'text', + 'exampleValue' => '${1}', + 'required' => false, + ], + 'content_pattern' => [ + 'name' => 'Content find pattern (regular expression!)', + 'type' => 'text', + 'exampleValue' => '(content)\s+advertisement\s+(content)', + 'required' => false, + ], + 'content_replacement' => [ + 'name' => 'Content replacement for the find pattern', + 'type' => 'text', + 'exampleValue' => '${1} ${2}', + 'required' => false, + ], + 'uri_pattern' => [ + 'name' => 'URI/URL find pattern (regular expression!)', + 'type' => 'text', + 'exampleValue' => '^https?://(.*)/(.*)$', + 'required' => false, + ], + 'uri_replacement' => [ + 'name' => 'URI/URL replacement for the find pattern', + 'type' => 'text', + 'exampleValue' => 'https://${1}/foo/${2}', + 'required' => false, + ], + 'enclosure_pattern' => [ + 'name' => 'Enclosure URI/URL find pattern (regular expression!)', + 'type' => 'text', + 'exampleValue' => '^https?://(.*)/(.*)$', + 'required' => false, + ], + 'enclosure_replacement' => [ + 'name' => 'Enclosure URI/URL replacement for the find pattern', + 'type' => 'text', + 'exampleValue' => 'https://${1}/foo/${2}', + 'required' => false, + ], + 'case_insensitive' => [ + 'name' => 'Case-insensitive find patterns', + 'type' => 'checkbox', + 'required' => false, + ], + ]]; + + public function collectData() + { + $url = $this->getInput('url'); + if (!Url::validate($url)) { + throw new \Exception('The url parameter must either refer to http or https protocol.'); + } + $this->collectExpandableDatas($this->getURI()); + } + + protected function parseItem(array $item) + { + // Title + $pattern = $this->buildPattern($this->getInput('title_pattern')); + $replacement = $this->getInput('title_replacement'); + $res = preg_replace($pattern, $replacement, $item['title']); + if ($res !== null) { + $item['title'] = $res; + } + + // Author + $pattern = $this->buildPattern($this->getInput('author_pattern')); + $replacement = $this->getInput('author_replacement'); + $res = preg_replace($pattern, $replacement, $item['author']); + if ($res !== null) { + $item['author'] = $res; + } + + // Content + $pattern = $this->buildPattern($this->getInput('content_pattern')); + $replacement = $this->getInput('content_replacement'); + $res = preg_replace($pattern, $replacement, $item['content']); + if ($res !== null) { + $item['content'] = $res; + } + + // URI + $pattern = $this->buildPattern($this->getInput('uri_pattern')); + $replacement = $this->getInput('uri_replacement'); + $res = preg_replace($pattern, $replacement, $item['uri']); + if ($res !== null) { + $item['uri'] = $res; + } + + // Enclosures + if (array_key_exists('enclosures', $item)) { + $pattern = $this->buildPattern($this->getInput('enclosure_pattern')); + $replacement = $this->getInput('enclosure_replacement'); + foreach ($item['enclosures'] as $key => $val) { + $res = preg_replace($pattern, $replacement, $val); + if ($res !== null) { + $item['enclosures'][$key] = $res; + } + } + } + if (array_key_exists('enclosure', $item)) { + $pattern = $this->buildPattern($this->getInput('enclosure_pattern')); + $replacement = $this->getInput('enclosure_replacement'); + $res = preg_replace($pattern, $replacement, $item['enclosure']['url']); + if ($res !== null) { + $item['enclosure']['url'] = $res; + } + } + + return $item; + } + + private function buildPattern($pattern) + { + if (! str_contains($pattern, '#')) { + $delimiter = '#'; + } elseif (! str_contains($pattern, '/')) { + $delimiter = '/'; + } else { + throw new \Exception('Cannot use both / and # inside filter'); + } + + $regex = $delimiter . $pattern . $delimiter; + if ($this->getInput('case_insensitive')) { + $regex .= 'i'; + } + return $regex; + } + + public function getURI() + { + $url = $this->getInput('url'); + if ($url) { + return $url; + } + return parent::getURI(); + } + + public function getName() + { + return parent::getName(); + } +}