array( 'name' => 'Feed URL', 'type' => 'text', 'defaultValue' => 'https://lorem-rss.herokuapp.com/feed?unit=day', 'required' => true, ), 'filter' => array( 'name' => 'Filter (regular expression)', 'required' => false, ), 'filter_type' => array( 'name' => 'Filter type', 'type' => 'list', 'required' => false, 'values' => array( 'Keep matching items' => 'permit', 'Hide matching items' => 'block', ), 'defaultValue' => 'permit', ), 'case_insensitive' => array( 'name' => 'Case-insensitive filter', 'type' => 'checkbox', 'required' => false, ), 'fix_encoding' => array( 'name' => 'Attempt Latin1/UTF-8 fixes when evaluating filter', 'type' => 'checkbox', 'required' => false, ), 'target_title' => array( 'name' => 'Apply filter on title', 'type' => 'checkbox', 'required' => false, 'defaultValue' => 'checked' ), 'target_content' => array( 'name' => 'Apply filter on content', 'type' => 'checkbox', 'required' => false, ), 'target_author' => array( 'name' => 'Apply filter on author', 'type' => 'checkbox', 'required' => false, ), 'title_from_content' => array( 'name' => 'Generate title from content (overwrite existing title)', 'type' => 'checkbox', 'required' => false, ), 'length_limit' => array( 'name' => 'Max length analyzed by filter (-1: no limit)', 'type' => 'number', 'required' => false, 'defaultValue' => -1, ), )); protected function parseItem($newItem){ $item = parent::parseItem($newItem); // Generate title from first 50 characters of content? if($this->getInput('title_from_content') && array_key_exists('content', $item)) { $content = str_get_html($item['content']); $pos = strpos($item['content'], ' ', 50); $item['title'] = substr($content->plaintext, 0, $pos); if(strlen($content->plaintext) >= $pos) { $item['title'] .= '...'; } } // Build regular expression $regex = '/' . $this->getInput('filter') . '/'; if($this->getInput('case_insensitive')) { $regex .= 'i'; } // Retrieve fields to check $filter_fields = array(); if($this->getInput('target_title')) { $filter_fields[] = $item['title']; } if($this->getInput('target_content')) { $filter_fields[] = $item['content']; } if($this->getInput('target_author')) { $filter_fields[] = $item['author']; } // Apply filter on item $keep_item = false; $length_limit = intval($this->getInput('length_limit')); foreach($filter_fields as $field) { if($length_limit > 0) { $field = substr($field, 0, $length_limit); } $keep_item |= boolval(preg_match($regex, $field)); if($this->getInput('fix_encoding')) { $keep_item |= boolval(preg_match($regex, utf8_decode($field))); $keep_item |= boolval(preg_match($regex, utf8_encode($field))); } } // Reverse result? (keep everything but matching items) if($this->getInput('filter_type') === 'block') { $keep_item = !$keep_item; } return $keep_item ? $item : null; } public function getURI(){ $url = $this->getInput('url'); if(empty($url)) { $url = parent::getURI(); } return $url; } public function collectData(){ if($this->getInput('url') && substr($this->getInput('url'), 0, 4) !== 'http') { // just in case someone finds a way to access local files by playing with the url returnClientError('The url parameter must either refer to http or https protocol.'); } $this->collectExpandableDatas($this->getURI()); } }