Extension:SectionLinkToTop

From MediaWiki.org
Jump to: navigation, search
MediaWiki extensions manual - list
Crystal Clear action run.png
SectionLinkToTop

Release status: beta

Implementation Tag
Description Allows you to add a link next to the edit section link to return to the top of a page.
Author(s) Coban Holmes (Cobantalk)
Last version 1.0 (2009-09-17)
MediaWiki Tested on 1.15.1
Database changes no
License GPL
Download The source is available on this page
Hooks used
DoEditSectionLink

MagicWordwgVariableIDs
MagicWordMagicWords
LanguageGetMagic
ParserAfterStrip
ParserAfterTidy

Check usage and version matrix

Description [edit]

This extension creates a new magic word __SECTIONLINKTOTOP__ which will add a link to the top of the page next to the edit section link.

Installation [edit]

  1. Copy the code below and paste it into a new file called "SectionLinkToTop/SectionLinkToTop.php" in your extensions directory
  2. Append the following line to the end of your LocalSettings.php file:
    require_once( "$IP/extensions/SectionLinkToTop/SectionLinkToTop.php" );
    

Source code [edit]

<?php
 
/**
 * Copyright (C) 2009 Coban Holmes <coban.holmes@gmail.com>
 * http://www.mediawiki.org/
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 * http://www.gnu.org/copyleft/gpl.html
 *
 * This extension implements a new MagicWord __SECTIONLINKTOTOP__.
 * If an article contains this MagicWord, a link to the top of the page will be added next to the edit link.
 * 
 * How to use:
 * * include this extension in LocalSettings.php: 
 *   require_once($IP.'/extensions/SectionLinkToTop/SectionLinkToTop.php');
 * * Add "__SECTIONLINKTOTOP__" to any article of your choice.
 * 
 * @author Coban Holmes
 * @version 1.0
 */
 
 
 
if (!defined('MEDIAWIKI')) {
        die("This requires the MediaWiki enviroment.");
}
 
$wgExtensionCredits['parserhook'][] = array(
        'name' => 'SectionLinkToTop',
        'version' => '1.0',
        'author' => 'Coban Holmes',
        'url' => 'http://www.mediawiki.org/wiki/Extension:SectionLinkToTop',
        'description' => 'Add MagicWord "&#95;&#95;SECTIONLINKTOTOP&#95;&#95;".',
);
 
$sectionLinkToTop = new SectionLinkToTop();
 
$wgHooks['MagicWordMagicWords'][] = array($sectionLinkToTop, 'addMagicWord');
$wgHooks['MagicWordwgVariableIDs'][] = array($sectionLinkToTop, 'addMagicWordId');
$wgHooks['LanguageGetMagic'][] = array($sectionLinkToTop, 'languageGetMagic');
$wgHooks['DoEditSectionLink'][] = array($sectionLinkToTop, 'doEditSectionLink');
$wgHooks['ParserAfterStrip'][] = array($sectionLinkToTop, 'checkForMagicWord');
$wgHooks['ParserAfterTidy'][] = array($sectionLinkToTop, 'parserAfterTidy');
 
class SectionLinkToTop
{
        //$linkToTopEnabled will be set to true when the magic word is found on a page
        private $linkToTopEnabled = false;
        //$isHooked will be set to true if we are able to add the link in the DoEditSectionLink hook
        private $isHooked = false;
        //The text for the link
        private $linkToTopText = '<span class="editsection sectionlinktotop">[<a href="#top" title="Return to the top of the page">top</a>]</span>';
 
        //constructor - empty
        function SectionLinkToTop() {}
 
        //register the new magic word with the system
        function addMagicWord(&$magicWords) {
                $magicWords[] = 'MAG_SECTIONLINKTOTOP';
                return true;
        }
 
        //add the id
        function addMagicWordId(&$magicWords) {
                $magicWords[] = MAG_SECTIONLINKTOTOP;
                return true;
        }
 
        //Find the magic word on the page, remove it and enable the extension
        function checkForMagicWord(&$parser, &$text, &$strip_state) {
                if (MagicWord::get(MAG_SECTIONLINKTOTOP)->matchAndRemove( $text )){
                        $this->linkToTopEnabled = true;
                }
                return true;
        }
 
        function languageGetMagic(&$magicWords, $langCode) {
                $magicWords['MAG_SECTIONLINKTOTOP'] = array( 0, '__SECTIONLINKTOTOP__' );
                return true;
        }
 
        //This hook only gets run if the user has edit rights
        function doEditSectionLink($skin, $title, $section, $tooltip, $result ) {
        if ($this->linkToTopEnabled){
                        $result = $result.$this->linkToTopText;
                        $this->isHooked = true;
        }
        return true;
        }
 
        //We will have to add the link here if we couldn't in doEditSectionLink
        function parserAfterTidy( &$parser, &$text ) {
                if (!$this->isHooked && $this->linkToTopEnabled){
                        $pattern = '#(<h[2-6]>)( <span.*</h[2-6]>)#i';
                        $replace = '\1'.$this->linkToTopText.'\2';
                        $text = preg_replace($pattern, $replace, $text);
                }
                return true;
        }
}