Revision [20830]
This is an old revision of HighlightSearchWikka12 made by EmeraldIsland on 2009-09-06 11:08:14.
HighlightSearch Handler
See also :
Documentation : HighlightSearchHandlerInfoOther: SearchHighlighter
Works with :
Wikka 1.2This is the development page for the HighlightSearch handler version Wikka 1.2.
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 50) :
New textsearch.php source code (line 50) :
$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