HighlightSearch Handler
See also :
Documentation : HighlightSearchHandlerInfoOther: SearchHighlighter, HighlightSearch, HighlightSearchWikka12
Works with :
Wikka 1.2This is the development page for the HighlightSearch handler version Wikka 1.2.
For Wikka version 1.3.1 go here.
For Wikka version 1.3.2 go here.
Previous version for Wikka version < 1.2 is also available.
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 here.
Installation
- Save the code block below as /plugins/handlers/page/highlightsearch.php- Give it the same file permissions as the other php files in that directory
Code
1. New /plugins/handlers/page/highlightsearch.php file<?php
/**
* Display a page if the user has read access or is an admin.
*
* This is the default page handler used by Wikka when no other handler is specified.
* Depending on user privileges, it displays the page body or an error message. It also
* displays footer comments and a form to post comments, depending on ACL and general
* config settings.
*
* @package Handlers
* @subpackage Page
* @version $Id$
* @license http://www.gnu.org/copyleft/gpl.html GNU General Public License
* @filesource
*
* @uses Wakka::Format()
* @uses Wakka::FormClose()
* @uses Wakka::FormOpen()
* @uses Wakka::GetConfigValue()
* @uses Wakka::GetPageTag()
* @uses Wakka::GetUser()
* @uses Wakka::GetUserName()
* @uses Wakka::HasAccess()
* @uses Wakka::Href()
* @uses Wakka::htmlspecialchars_ent()
* @uses Wakka::LoadComments()
* @uses Wakka::LoadPage()
* @uses Wakka::LoadUser()
* @uses Wakka::UserIsOwner()
* @uses Config::$anony_delete_own_comments
* @uses Config::$hide_comments
*
* @todo move <div> to template;
* necessary) - #312
*/
//constants
define('SHOW_OLD_REVISION_SOURCE', 0); # if set to 1 shows by default the source of an old revision instead of the rendered version
//validate URL parameters
$raw = (!empty($_GET['raw']))? (int) $this->GetSafeVar('raw', 'get') : SHOW_OLD_REVISION_SOURCE;
?>
<!-- BEGIN PAGE CONTENT -->
<?php
echo '<div id="content"';
echo (($user = $this->GetUser()) && ($user['doubleclickedit'] == 'N') || !$this->HasAccess('write')) ? '' : ' ondblclick="document.location=\''.$this->Href('edit', '', 'id='.$this->page['id']).'\';" '; #268
echo '>'."\n"; //TODO: move to templating class
if (!$this->HasAccess('read'))
{
echo '<p><em class="error">You aren\'t allowed to read this page.</em></p>';
echo "\n".'</div><!--closing page content-->'."\n"; //TODO: move to templating class
}
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>';
echo '</div><!--closing page content-->'."\n"; //TODO: move to templating class
}
else
{
if ($this->page['latest'] == 'N')
{
echo '<div class="revisioninfo">'."\n";
echo '<h4>Revision ['.$this->page['id'].']</h4>'."\n";
echo 'This is an <a href="'.$this->Href('revisions').'">old revision</a> of <a href="'.$this->Href().'">'.$this->GetPageTag().'</a> made by '.$this->page['user'].' on <span class="datetime">'.$this->page['time'].'</span>.'."\n";
?>
<br />
<?php echo $this->FormOpen('show', '', 'GET', '', 'left') ?>
<fieldset>
<input type="hidden" name="time" value="<?php echo $this->GetSafeVar('time', 'get') ?>" />
<input type="hidden" name="raw" value="<?php echo ($raw == 1)? '0' :'1' ?>" />
<button type="submit" value="<?php echo ($raw == 1)? 'Show formatted' : 'Show source' ?>"><?php echo ($raw == 1)? 'Show formatted' : 'Show source' ?></button>
</fieldset>
<?php echo $this->FormClose(); ?>
<?php
// if this is an old revision, display some buttons
if ($this->HasAccess('write'))
{
// added if encapsulation : in case where some pages were brutally deleted from database
if ($latest = $this->LoadPage($this->tag))
{
?>
<?php echo $this->FormOpen('edit') ?>
<fieldset>
<input type="hidden" name="previous" value="<?php echo $latest['id'] ?>" />
<input type="hidden" name="body" value="<?php echo $this->htmlspecialchars_ent($this->page['body']) ?>" />
<button type="submit" value="Re-edit this old revision">Re-edit this old revision</button>
</fieldset>
<?php echo $this->FormClose(); ?>
<?php
}
}
echo '<div class="clear"></div></div>'."\n";
}
// display page
//EMERALDISLAND
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 if ($raw == 1)
{
echo '<div class="wikisource">'.nl2br($this->htmlspecialchars_ent($this->page["body"], ENT_QUOTES)).'</div>';
}
else
{
echo $this->Format($this->page['body'], 'wakka', 'page');
}
// EMERALDISLAND
?>
<div style="clear: both"></div>
</div><!-- END PAGE CONTENT -->
<?php
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($_GET['show_comments'])) #312
{
switch($_GET['show_comments']) #312
{
case "0":
$_SESSION['show_comments'][$tag] = 0;
break;
case "1":
$_SESSION['show_comments'][$tag] = 1;
break;
}
}
?>
<!-- BEGIN COMMENT BLOCK -->
<div id="comments">
<?php
if ($_SESSION['show_comments'][$tag])
{
?>
<div id="commentheader">
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();
echo '<div id="commentlist">'."\n";
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");
?>
<fieldset>
<input type="hidden" name="comment_id" value="<?php echo $comment['id'] ?>" />
<input type="submit" value="Delete Comment" />
</fieldset>
<?php
echo $this->FormClose();
}
echo "\n\t".'</div>'."\n";
echo '</div>'."\n";
}
echo '</div>'."\n";
}
// display comment form
echo '<div id="commentform">'."\n";
if ($this->HasAccess('comment'))
{?>
<?php echo $this->FormOpen('addcomment'); ?>
<fieldset>
<label for="commentbox">Add a comment to this page:<br />
<textarea id="commentbox" name="body" rows="6" cols="78"></textarea><br />
<button type="submit" value="Add Comment" accesskey="s">Add Comment</button>
</label>
</fieldset>
<?php echo $this->FormClose(); ?>
<?php
}
echo '</div>'."\n";
}
else
{
?>
<div id="commentheader">
<p>
<?php
switch (count($comments))
{
case 0:
echo 'There are no comments on this page. ';
$showcomments_text = 'Add comment';
break;
case 1:
echo 'There is one comment on this page. ';
$showcomments_text = 'Display comment';
break;
default:
echo '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>]</p>
</div>
<?php
}
?>
</div>
<!-- END COMMENT BLOCK -->
<?php
}
}
}
?>
/**
* Display a page if the user has read access or is an admin.
*
* This is the default page handler used by Wikka when no other handler is specified.
* Depending on user privileges, it displays the page body or an error message. It also
* displays footer comments and a form to post comments, depending on ACL and general
* config settings.
*
* @package Handlers
* @subpackage Page
* @version $Id$
* @license http://www.gnu.org/copyleft/gpl.html GNU General Public License
* @filesource
*
* @uses Wakka::Format()
* @uses Wakka::FormClose()
* @uses Wakka::FormOpen()
* @uses Wakka::GetConfigValue()
* @uses Wakka::GetPageTag()
* @uses Wakka::GetUser()
* @uses Wakka::GetUserName()
* @uses Wakka::HasAccess()
* @uses Wakka::Href()
* @uses Wakka::htmlspecialchars_ent()
* @uses Wakka::LoadComments()
* @uses Wakka::LoadPage()
* @uses Wakka::LoadUser()
* @uses Wakka::UserIsOwner()
* @uses Config::$anony_delete_own_comments
* @uses Config::$hide_comments
*
* @todo move <div> to template;
* necessary) - #312
*/
//constants
define('SHOW_OLD_REVISION_SOURCE', 0); # if set to 1 shows by default the source of an old revision instead of the rendered version
//validate URL parameters
$raw = (!empty($_GET['raw']))? (int) $this->GetSafeVar('raw', 'get') : SHOW_OLD_REVISION_SOURCE;
?>
<!-- BEGIN PAGE CONTENT -->
<?php
echo '<div id="content"';
echo (($user = $this->GetUser()) && ($user['doubleclickedit'] == 'N') || !$this->HasAccess('write')) ? '' : ' ondblclick="document.location=\''.$this->Href('edit', '', 'id='.$this->page['id']).'\';" '; #268
echo '>'."\n"; //TODO: move to templating class
if (!$this->HasAccess('read'))
{
echo '<p><em class="error">You aren\'t allowed to read this page.</em></p>';
echo "\n".'</div><!--closing page content-->'."\n"; //TODO: move to templating class
}
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>';
echo '</div><!--closing page content-->'."\n"; //TODO: move to templating class
}
else
{
if ($this->page['latest'] == 'N')
{
echo '<div class="revisioninfo">'."\n";
echo '<h4>Revision ['.$this->page['id'].']</h4>'."\n";
echo 'This is an <a href="'.$this->Href('revisions').'">old revision</a> of <a href="'.$this->Href().'">'.$this->GetPageTag().'</a> made by '.$this->page['user'].' on <span class="datetime">'.$this->page['time'].'</span>.'."\n";
?>
<br />
<?php echo $this->FormOpen('show', '', 'GET', '', 'left') ?>
<fieldset>
<input type="hidden" name="time" value="<?php echo $this->GetSafeVar('time', 'get') ?>" />
<input type="hidden" name="raw" value="<?php echo ($raw == 1)? '0' :'1' ?>" />
<button type="submit" value="<?php echo ($raw == 1)? 'Show formatted' : 'Show source' ?>"><?php echo ($raw == 1)? 'Show formatted' : 'Show source' ?></button>
</fieldset>
<?php echo $this->FormClose(); ?>
<?php
// if this is an old revision, display some buttons
if ($this->HasAccess('write'))
{
// added if encapsulation : in case where some pages were brutally deleted from database
if ($latest = $this->LoadPage($this->tag))
{
?>
<?php echo $this->FormOpen('edit') ?>
<fieldset>
<input type="hidden" name="previous" value="<?php echo $latest['id'] ?>" />
<input type="hidden" name="body" value="<?php echo $this->htmlspecialchars_ent($this->page['body']) ?>" />
<button type="submit" value="Re-edit this old revision">Re-edit this old revision</button>
</fieldset>
<?php echo $this->FormClose(); ?>
<?php
}
}
echo '<div class="clear"></div></div>'."\n";
}
// display page
//EMERALDISLAND
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 if ($raw == 1)
{
echo '<div class="wikisource">'.nl2br($this->htmlspecialchars_ent($this->page["body"], ENT_QUOTES)).'</div>';
}
else
{
echo $this->Format($this->page['body'], 'wakka', 'page');
}
// EMERALDISLAND
?>
<div style="clear: both"></div>
</div><!-- END PAGE CONTENT -->
<?php
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($_GET['show_comments'])) #312
{
switch($_GET['show_comments']) #312
{
case "0":
$_SESSION['show_comments'][$tag] = 0;
break;
case "1":
$_SESSION['show_comments'][$tag] = 1;
break;
}
}
?>
<!-- BEGIN COMMENT BLOCK -->
<div id="comments">
<?php
if ($_SESSION['show_comments'][$tag])
{
?>
<div id="commentheader">
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();
echo '<div id="commentlist">'."\n";
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");
?>
<fieldset>
<input type="hidden" name="comment_id" value="<?php echo $comment['id'] ?>" />
<input type="submit" value="Delete Comment" />
</fieldset>
<?php
echo $this->FormClose();
}
echo "\n\t".'</div>'."\n";
echo '</div>'."\n";
}
echo '</div>'."\n";
}
// display comment form
echo '<div id="commentform">'."\n";
if ($this->HasAccess('comment'))
{?>
<?php echo $this->FormOpen('addcomment'); ?>
<fieldset>
<label for="commentbox">Add a comment to this page:<br />
<textarea id="commentbox" name="body" rows="6" cols="78"></textarea><br />
<button type="submit" value="Add Comment" accesskey="s">Add Comment</button>
</label>
</fieldset>
<?php echo $this->FormClose(); ?>
<?php
}
echo '</div>'."\n";
}
else
{
?>
<div id="commentheader">
<p>
<?php
switch (count($comments))
{
case 0:
echo 'There are no comments on this page. ';
$showcomments_text = 'Add comment';
break;
case 1:
echo 'There is one comment on this page. ';
$showcomments_text = 'Display comment';
break;
default:
echo '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>]</p>
</div>
<?php
}
?>
</div>
<!-- END COMMENT BLOCK -->
<?php
}
}
}
?>
2. In textsearch.php action, change only one line :
Old textsearch.php source code (line 85) :
New textsearch.php source code (line 85) :
$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
- copy and rename plugins/handlers/page/highlightsearch.php in handlers/page/show.php
- change 'highlightsearch' by 'show' in actions/textsearch.php (step 2. above)
CategoryUserContributions - CategoryDevelopmentHandlers