X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=actions%2Fnoticesearch.php;h=c257ecec56ebf23b4b9dda4c357824a2f192790a;hb=ea40dabb392aec3d7b9da666285969bb296a94e2;hp=7f645dbc237694bccec7c7899c3b41d24fce31e9;hpb=3c76c89fcc7caaf4865cced9344820e69d71ece8;p=quix0rs-gnu-social.git diff --git a/actions/noticesearch.php b/actions/noticesearch.php index 7f645dbc23..c257ecec56 100644 --- a/actions/noticesearch.php +++ b/actions/noticesearch.php @@ -19,65 +19,23 @@ if (!defined('LACONICA')) { exit(1); } -define(NOTICES_PER_PAGE, 20); +require_once(INSTALLDIR.'/lib/searchaction.php'); +define('NOTICES_PER_PAGE', 20); # XXX common parent for people and content search? -class NoticesearchAction extends Action { - - function handle($args) { - parent::handle($args); - $this->show_form(); - } +class NoticesearchAction extends SearchAction { function get_instructions() { - return _t('Search for notices on %%site.name%% by their contents. ' . - 'Separate search terms by spaces; they must be 3 characters or more.'); + return _('Search for notices on %%site.name%% by their contents. Separate search terms by spaces; they must be 3 characters or more.'); } - - function show_top($error=NULL) { - if ($error) { - common_element('p', 'error', $error); - } else { - $instr = $this->get_instructions(); - $output = common_markup_to_html($instr); - common_element_start('div', 'instructions'); - common_raw($output); - common_element_end('div'); - } - } - - function show_form($error=NULL) { - $q = $this->trimmed('q'); - $page = $this->trimmed('page', 1); - - common_show_header(_t('Find notices'), NULL, $error, array($this, 'show_top')); - common_element_start('form', array('method' => 'post', - 'id' => 'login', - 'action' => common_local_url('noticesearch'))); - common_element_start('p'); - common_element('input', array('name' => 'q', - 'id' => 'q', - 'type' => 'text', - 'class' => 'input_text', - 'value' => ($q) ? $q : '')); - common_text(' '); - common_element('input', array('type' => 'submit', - 'id' => 'search', - 'name' => 'search', - 'class' => 'submit', - 'value' => _t('Search'))); - - common_element_end('p'); - common_element_end('form'); - if ($q) { - $this->show_results($q, $page); - } - common_show_footer(); + + function get_title() { + return _('Text search'); } - + function show_results($q, $page) { - + $notice = new Notice(); # lcase it for comparison @@ -85,14 +43,14 @@ class NoticesearchAction extends Action { $notice->whereAdd('MATCH(content) against (\''.addslashes($q).'\')'); # Ask for an extra to see if there's more. - + $notice->limit((($page-1)*NOTICES_PER_PAGE), NOTICES_PER_PAGE + 1); $cnt = $notice->find(); if ($cnt > 0) { $terms = preg_split('/[\s,]+/', $q); - common_element_start('ul', array('id' => 'notice')); + common_element_start('ul', array('id' => 'notices')); for ($i = 0; $i < min($cnt, NOTICES_PER_PAGE); $i++) { if ($notice->fetch()) { $this->show_notice($notice, $terms); @@ -103,17 +61,34 @@ class NoticesearchAction extends Action { } common_element_end('ul'); } else { - common_element('p', 'error', _t('No results')); + common_element('p', 'error', _('No results')); } - + common_pagination($page > 1, $cnt > NOTICES_PER_PAGE, $page, 'noticesearch', array('q' => $q)); } + function show_header($arr) { + if ($arr) { + $q = $arr[0]; + } + if ($q) { + common_element('link', array('rel' => 'alternate', + 'href' => common_local_url('noticesearchrss', + array('q' => $q)), + 'type' => 'application/rss+xml', + 'title' => _('Search Stream Feed'))); + } + } + # XXX: refactor and combine with StreamAction::show_notice() - + function show_notice($notice, $terms) { $profile = $notice->getProfile(); + if (!$profile) { + common_log_db_error($notice, 'SELECT', __FILE__); + return; + } # XXX: RDFa common_element_start('li', array('class' => 'notice_single', 'id' => 'notice-' . $notice->id)); @@ -133,12 +108,12 @@ class NoticesearchAction extends Action { # FIXME: URL, image, video, audio common_element_start('p', array('class' => 'content')); if ($notice->rendered) { - common_raw($this->highlight($notice->rendered)); + common_raw($this->highlight($notice->rendered, $terms)); } else { # XXX: may be some uncooked notices in the DB, # we cook them right now. This should probably disappear in future # versions (>> 0.4.x) - common_raw($this->highlight(common_render_content($notice->content, $notice))); + common_raw($this->highlight(common_render_content($notice->content, $notice), $terms)); } common_element_end('p'); $noticeurl = common_local_url('shownotice', array('notice' => $notice->id)); @@ -152,14 +127,14 @@ class NoticesearchAction extends Action { common_text(' ('); common_element('a', array('class' => 'inreplyto', 'href' => $replyurl), - _t('in reply to...')); + _('in reply to...')); common_text(')'); } - common_element_start('a', + common_element_start('a', array('href' => common_local_url('newnotice', array('replyto' => $profile->nickname)), 'onclick' => 'doreply("'.$profile->nickname.'"); return false', - 'title' => _t('reply'), + 'title' => _('reply'), 'class' => 'replybutton')); common_raw('→'); common_element_end('a'); @@ -168,8 +143,15 @@ class NoticesearchAction extends Action { } function highlight($text, $terms) { + /* Highligh serach terms */ $pattern = '/('.implode('|',array_map('htmlspecialchars', $terms)).')/i'; $result = preg_replace($pattern, '\\1', $text); + + /* Remove highlighting from inside links, loop incase multiple highlights in links */ + $pattern = '/(href="[^"]*)('.implode('|',array_map('htmlspecialchars', $terms)).')<\/strong>([^"]*")/iU'; + do { + $result = preg_replace($pattern, '\\1\\2\\3', $result, -1, $count); + } while ($count); return $result; } }