Wiki source for HighlightSearch


Show raw source

=====HighlightSearch Handler=====
>>==See also :==
Documentation : ""HighlightSearchHandlerInfo""
Other: [[SearchHighlighter]], HighlightSearchWikka12, HighlightSearchWikka13
==Works with :==
Wikka 1.1.6.2 - 1.1.6.6>>//NOT included in any Wikka version//

Handler also available for [[HighlightSearchWikka12 | Wikka 1.2 ]] and [[HighlightSearchWikka13 | Wikka 1.3]]

This is the development page for the HighlightSearch handler.
::c::
RolandStens did [[SearchHighlighter]] based on Javascript. Here is my contribution in PHP. The work is based on show.php handler and a small part of textsearchexpanded.php action. You can see this new handler in action [[http://emeraldisland.free.fr/wikka/wikka.php?wakka=HighlightSearch/highlightsearch&search=highlight | here]].

==Installation==
- Save the code block below as ##handlers/page/highlightsearch.php##
- Give it the same file permissions as the other php files in that directory

==Code==
1. New handlers/page/highlightsearch.php file

%%(php)<?php
/* HighlightSearch:
* tagname/highlightsearch&search=wanted_string
* Highlight the string passed in argument. Use it with textSearch action
*
* EMERALDISLAND november 2006
* source code based on show handler and textsearchexpanded action
*/
?>
<div class="page" <?php echo (($user = $this->GetUser()) && ($user['doubleclickedit'] == 'N')) ? '' : 'ondblclick="document.location=\''.$this->href('edit').'\';" ' ?>>
<?php
if (!$this->HasAccess('read'))
{
echo '<p><em class="error">You aren\'t allowed to read this page.</em></p></div>';
}
else
{
if (!$this->page)
{
echo '<p>This page doesn\'t exist yet. Maybe you want to <a href="'.$this->Href('edit').'">create</a> it?</p></div>';
}
else
{
if ($this->page['latest'] == 'N')
{
echo '<div class="revisioninfo">This is an old revision of <a href="'.$this->Href().'">'.$this->GetPageTag().'</a> from '.$this->page['time'].'.</div>';
}
if (isset($_REQUEST['search']) && ($search = $_REQUEST['search'])) {
$search_re = stripslashes(trim($search));
if ($search_re) {
// display page with highlighted string
$txt_stripped = $this->Format($this->page['body'], 'wakka');
// The evil REGEXP
$pattern = '/('.$this->htmlspecialchars_ent($search_re).')(?![^<]*?>)/i';
$highlightMatch = preg_replace($pattern,'<<$1>>',$txt_stripped,-1);
$matchText = str_replace(array('<<', '>>'), array('<span class="tse_keywords">', '</span>'), $highlightMatch);
echo $matchText;
}
} else { echo $this->Format($this->page['body'], 'wakka'); }
// if this is an old revision, display some buttons
if ($this->page['latest'] == 'N' && $this->HasAccess('write'))
{
// added if encapsulation : in case where some pages were brutally deleted from database
if ($latest = $this->LoadPage($this->tag))
{
?>
<br />
<?php echo $this->FormOpen('edit') ?>
<input type="hidden" name="previous" value="<?php echo $latest['id'] ?>" />
<input type="hidden" name="body" value="<?php echo $this->htmlspecialchars_ent($this->page['body']) ?>" />
<input type="submit" value="Re-edit this old revision" />
<?php echo $this->FormClose(); ?>
<?php
}
}
echo '</div>'."\n";

if ($this->GetConfigValue('hide_comments') != 1)
{
// load comments for this page
$comments = $this->LoadComments($this->tag);

// store comments display in session
$tag = $this->GetPageTag();
if (!isset($_SESSION['show_comments'][$tag]))
$_SESSION['show_comments'][$tag] = ($this->UserWantsComments() ? '1' : '0');
if (isset($_REQUEST['show_comments'])){
switch($_REQUEST['show_comments'])
{
case "0":
$_SESSION['show_comments'][$tag] = 0;
break;
case "1":
$_SESSION['show_comments'][$tag] = 1;
break;
}
}
// display comments!
if ($_SESSION['show_comments'][$tag])
{
// display comments header
?>
<div class="commentsheader">
<span id="comments"> </span>Comments [<a href="<?php echo $this->Href('', '', 'show_comments=0') ?>">Hide comments/form</a>]
</div>
<?php
// display comments themselves
if ($comments)
{
$current_user = $this->GetUserName();
foreach ($comments as $comment)
{
echo '<div class="comment">'."\n".
'<span id="comment_'.$comment['id'].'"></span>'.$comment['comment']."\n".
"\t".'<div class="commentinfo">'."\n-- ";
echo ($this->LoadUser($comment['user']))? $this->Format($comment['user']) : $comment['user']; // #84
echo ' ('.$comment['time'].')'."\n";
$current_user = $this->GetUserName();
if ($this->UserIsOwner() || $current_user == $comment['user'] || ($this->config['anony_delete_own_comments'] && $current_user == $comment['user']) )
{
echo $this->FormOpen("delcomment");
?>
<input type="hidden" name="comment_id" value="<?php echo $comment['id'] ?>" />
<input type="submit" value="Delete Comment" />
<?php
echo $this->FormClose();
}
echo "\n\t".'</div>'."\n";
echo '</div>'."\n";
}
}
// display comment form
echo '<div class="commentform">'."\n";
if ($this->HasAccess('comment'))
{?>
<?php echo $this->FormOpen('addcomment'); ?>
<label for="commentbox">Add a comment to this page:<br />
<textarea class="commentbox" id="commentbox" name="body"></textarea><br />
<input type="submit" value="Add Comment" accesskey="s" />
</label>
<?php echo $this->FormClose(); ?>
<?php
}
echo '</div>'."\n";
}
else
{
?>
<div class="commentsheader">
<?php
switch (count($comments))
{
case 0:
echo '<div>There are no comments on this page. ';
$showcomments_text = 'Add comment';
break;
case 1:
echo '<div>There is one comment on this page. ';
$showcomments_text = 'Display comment';
break;
default:
echo '<div>There are '.count($comments).' comments on this page. ';
$showcomments_text = 'Display comments';
}
?>
[<a href="<?php echo $this->Href('', '', 'show_comments=1#comments'); ?>"><?php echo $showcomments_text; ?></a>]</div>
</div>
<?php
}
}
}
}
?>
%%
2. In textsearch.php action, change only one line :
Old textsearch.php source code (line 50) :
%%(php)$result_page_list .= ($i+1).". ".$this->Link($page["tag"],"<br />\n";%%
New textsearch.php source code (line 50) :
%%(php)$result_page_list .= ($i+1).". ".$this->Link($page["tag"],'highlightsearch&search='.$phrase)."<br />\n";%%
3. That's all !

==Remark :==
For a better integration in your wiki, you can also replace 'show' handler.
- rename or save handlers/page/show.php in handlers/page/show_ref.php
- rename handlers/page/highlightsearch.php in handlers/page/show.php
- change 'highlightsearch' by 'show' in textsearch.php (step 2. above)
----
CategoryUserContributions - CategoryDevelopmentHandlers
Valid XHTML :: Valid CSS: :: Powered by WikkaWiki