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 Wikka 1.2 and Wikka 1.3

This is the development page for the HighlightSearch handler.
 

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 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
/* 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">&nbsp;</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) :
$result_page_list .= ($i+1).". ".$this->Link($page["tag"],"<br />\n";

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
- rename handlers/page/highlightsearch.php in handlers/page/show.php
- change 'highlightsearch' by 'show' in textsearch.php (step 2. above)

CategoryUserContributions - CategoryDevelopmentHandlers
There are no comments on this page.
Valid XHTML :: Valid CSS: :: Powered by WikkaWiki