diff --git a/lib/Feed.php b/lib/Feed.php index da01d2f0..6d68ea8f 100644 --- a/lib/Feed.php +++ b/lib/Feed.php @@ -7,6 +7,7 @@ declare(strict_types=1); namespace JKingWeb\Arsse; use JKingWeb\Arsse\Misc\Date; +use JKingWeb\Arsse\Rule\Rule; use PicoFeed\PicoFeedException; use PicoFeed\Config\Config; use PicoFeed\Client\Client; @@ -25,6 +26,7 @@ class Feed { public $nextFetch; public $newItems = []; public $changedItems = []; + public $filteredItems = []; public static function discover(string $url, string $username = '', string $password = ''): string { // fetch the candidate feed @@ -452,14 +454,16 @@ class Feed { } protected function computeFilterRules(int $feedID): void { - return; $rules = Arsse::$db->feedRulesGet($feedID); foreach ($rules as $r) { - $keep = ""; - $block = ""; - if (strlen($r['keep'])) { - + $stats = ['new' => [], 'changed' => []]; + foreach ($this->newItems as $index => $item) { + $stats['new'][$index] = Rule::apply($r['keep'], $r['block'], $item->title, $item->categories); } + foreach ($this->changedItems as $index => $item) { + $stats['changed'][$index] = Rule::apply($r['keep'], $r['block'], $item->title, $item->categories); + } + $this->filteredItems[$r['owner']] = $stats; } } } diff --git a/lib/Rule/Rule.php b/lib/Rule/Rule.php index 5f387f1d..451d360f 100644 --- a/lib/Rule/Rule.php +++ b/lib/Rule/Rule.php @@ -45,8 +45,10 @@ abstract class Rule { public static function apply(string $keepRule, string $blockRule, string $title, array $categories = []): bool { // if neither rule is processed we should keep $keep = true; - // add the title to the front of the category array - array_unshift($categories, $title); + // merge and clean the data to match + $data = array_map(function($str) { + return preg_replace('/\s+/', " ", $str); + }, array_merge([$title], $categories)); // process the keep rule if it exists if (strlen($keepRule)) { try { @@ -56,7 +58,7 @@ abstract class Rule { } // if a keep rule is specified the default state is now not to keep $keep = false; - foreach ($categories as $str) { + foreach ($data as $str) { if (is_string($str)) { if (preg_match($rule, $str)) { // keep if the keep-rule matches one of the strings @@ -73,7 +75,7 @@ abstract class Rule { } catch (Exception $e) { return true; } - foreach ($categories as $str) { + foreach ($data as $str) { if (is_string($str)) { if (preg_match($rule, $str)) { // do not keep if the block-rule matches one of the strings diff --git a/tests/cases/Feed/TestFeed.php b/tests/cases/Feed/TestFeed.php index f9a422e4..b5ce6653 100644 --- a/tests/cases/Feed/TestFeed.php +++ b/tests/cases/Feed/TestFeed.php @@ -95,6 +95,7 @@ class TestFeed extends \JKingWeb\Arsse\Test\AbstractTest { self::clearData(); self::setConf(); Arsse::$db = \Phake::mock(Database::class); + \Phake::when(Arsse::$db)->feedRulesGet->thenReturn(new Result([])); } public function testParseAFeed(): void { diff --git a/tests/cases/Misc/TestRule.php b/tests/cases/Misc/TestRule.php index 9df68380..8652aa45 100644 --- a/tests/cases/Misc/TestRule.php +++ b/tests/cases/Misc/TestRule.php @@ -35,16 +35,18 @@ class TestRule extends \JKingWeb\Arsse\Test\AbstractTest { public function provideApplications(): iterable { return [ - ["", "", "Title", ["Dummy", "Category"], true], - ["^Title$", "", "Title", ["Dummy", "Category"], true], - ["^Category$", "", "Title", ["Dummy", "Category"], true], - ["^Naught$", "", "Title", ["Dummy", "Category"], false], - ["", "^Title$", "Title", ["Dummy", "Category"], false], - ["", "^Category$", "Title", ["Dummy", "Category"], false], - ["", "^Naught$", "Title", ["Dummy", "Category"], true], - ["^Category$", "^Category$", "Title", ["Dummy", "Category"], false], - ["[", "", "Title", ["Dummy", "Category"], true], - ["", "[", "Title", ["Dummy", "Category"], true], + ["", "", "Title", ["Dummy", "Category"], true], + ["^Title$", "", "Title", ["Dummy", "Category"], true], + ["^Category$", "", "Title", ["Dummy", "Category"], true], + ["^Naught$", "", "Title", ["Dummy", "Category"], false], + ["", "^Title$", "Title", ["Dummy", "Category"], false], + ["", "^Category$", "Title", ["Dummy", "Category"], false], + ["", "^Naught$", "Title", ["Dummy", "Category"], true], + ["^Category$", "^Category$", "Title", ["Dummy", "Category"], false], + ["[", "", "Title", ["Dummy", "Category"], true], + ["", "[", "Title", ["Dummy", "Category"], true], + ["", "^A B C$", "A B\nC", ["X\n Y \t \r Z"], false], + ["", "^X Y Z$", "A B\nC", ["X\n Y \t \r Z"], false], ]; } }