Extension:Presort
This extension is currently not actively maintained! Although it may still work, any bug reports or feature requests will more than likely be ignored. |
This extension stores its source code on a wiki page. Please be aware that this code may be unreviewed or maliciously altered. They may contain security holes, outdated interfaces that are no longer compatible etc. Note: No localisation updates are provided for this extension by translatewiki.net . |
Presort Release status: unmaintained |
|
---|---|
Implementation | Tag |
Description | Allows to presort wikitables |
Author(s) | Matthias Blarr (Unsmackedtalk) |
Latest version | 1.0 (2013-07-23) |
MediaWiki | |
Database changes | No |
License | GNU General Public License 2.0 |
Download | See the code section |
<presort> |
|
The Presort extension adds a <presort> tag to the wiki markup. This tag can be used around sortable and non-sortable wikitables to presort the table without the need of an ordered wikitext.
Parameter
[edit]mode
[edit]- column
The table is presorted according to the values in a column.
- key
The table is presorted according to a key.
Default value is "column".
sortcolumn
[edit]defines the sortcolumn. Can only be used with "column" mode. Numbering starts with 1.
Default value is "1".
order
[edit]- asc
ascending order
- desc
descending order
Default value is "asc".
numberingcolumn
[edit]Allows to define a columnnumber, in which automated numbering is filled in. All existing content in this column is overwritten! Default value is -1, which means no numbering.
template
[edit]Allows to define the template used for the key definition. For example templates like dts, sort or hiddensort. Can only be used with "key" mode.
Default value is "dts".
Installation
[edit]- Download and place the file(s) in a directory called
Presort
in yourextensions/
folder. - Add the following code at the bottom of your LocalSettings.php file:
require_once "$IP/extensions/Presort/Presort.php";
- Done – Navigate to Special:Version on your wiki to verify that the extension is successfully installed.
Code
[edit]- Presort.php
<?php
/**
* Parser hook extension adds a <presort> tag to wiki markup
*
*
* @package MediaWiki
* @subpackage Extensions
* @author Matthias Blarr
* @copyright 2013 Matthias Blarr
* @license GNU General Public Licence 2.0
* @version 1.0
* thx to kaeptn00 for his extension sort2 where i got the idea from for this and also the skeleton extension code is from there.
*
*/
if( defined( 'MEDIAWIKI' ) ) {
$wgExtensionFunctions[] = 'presort';
$wgExtensionCredits['parserhook'][] = array(
'name' => 'Presort',
'version' => '1.0.0',
'author' => 'Matthias Blarr',
'description' => 'Adds a presort tag to presort (sortable) wikitables',
'url' => 'https://www.mediawiki.org/wiki/Extension:Presort'
);
function presort() {
$parser = MediaWiki\MediaWikiServices::getInstance()->getParser();
$parser->setHook( 'presort', 'presort2' );
}
function presort2( $input, $args, $parser ) {
$sorter2 = new PreSorter( $parser );
$sorter2->loadSettings( $args );
return $sorter2->read( $input );
}
class PreSorter {
var $parser;
var $order;
var $mode;
var $sortcolumn;
var $template;
var $numberingcolumn;
function read( $text) {
//cut end symbol and create line array
$pos_end=strpos($text,"\n|}");
$lines = explode( "\n|-", substr($text,0,$pos_end) );
$prepart = array();
$sortpart = array();
//divide lines into sortable and non-sortable part
foreach( $lines as $line ) {
//if( $this->GetSortKey( $line) == false)
if( $this->GetSortKey( $line) !== false) {break;}
$prepart[] = $line;
}
foreach( $lines as $line ) {
$sortkey = $this->GetSortKey( $line);
if( $sortkey !== false) {
$sortpart[$line] = $sortkey;
}}
//SORT
natsort($sortpart);
if($this->order == 'desc') {$sortpart=array_reverse($sortpart);}
//NUMBERING
if($this->numberingcolumn !==-1){
$i=0;
foreach( $sortpart as $key => $temp) {
$pos=stripos($key,"\n|")+2;
$text2=substr($key,$pos);
$cells = preg_split( "/(\n\||\|\|)/", $text2 );
$cells[$this->numberingcolumn-1]=$i+1;
$sortpart_temp[]="\n|".implode("\n|",$cells);
$i++;
}
$sortpart=array_flip($sortpart_temp);
}
//line array->wikitext
$part1=implode("\n|-", $prepart);
$part2=implode("\n|-", array_keys($sortpart));
$parsetext=$part1."\n|-".$part2."\n|}";
//PARSE wikitext
$html = $this->parse( $parsetext );
return $html;
}
function __construct( &$parser ) {
$this->parser = &$parser;
$this->order = 'asc';
$this->mode = 'column';
$this->sortcolumn = 1;
$this->template = 'dts';
$this->numberingcolumn=-1;
}
function GetSortKey ( $text) {
$sortkeyparsed = "0";
if($this->mode == 'column') {
if(stripos($text, "!") !== false||stripos($text,"wikitable")!==false){return false;} else
{
$pos=stripos($text,"\n|")+2;
$text2=substr($text,$pos);
$cells = preg_split( "/(\n\||\|\|)/", $text2 );
if(isset($cells[$this->sortcolumn-1])) {
$cell_sort=$cells[$this->sortcolumn-1];
} else {
$cell_sort=$cells[0];
}
$pipe_pos=stripos($cell_sort,'|');
if($pipe_pos!==false){$temp=trim(strtolower(substr($cell_sort,$pipe_pos+1)));return $temp;}else{
return trim(strtolower($cell_sort));}
}}
$str_start=stripos($text, $this->template);
if( $str_start !== false) {
$str_end=stripos($text, '}}', $str_start);
$length=$str_end+2-$str_start;
$sortkey = substr($text, $str_start, $length);
$sortkey_parsed = $this->parse( $sortkey );
return $sortkey_parsed;
}
return false;
}
function loadSettings( $settings ) {
if( isset( $settings['order'] ) ){
$o = strtolower( $settings['order'] );
if( $o == 'asc' || $o == 'desc')
$this->order = $o;
}
if( isset( $settings['mode'] ) ) {
$c = strtolower( $settings['mode'] );
if( $c == 'key' || $c == 'column' )
$this->mode = $c;
}
if( isset($settings['sortcolumn']) ){
$this->sortcolumn = $settings['sortcolumn'];
}
if( isset($settings['template']) ){
$this->template = $settings['template'];
}
if( isset($settings['numberingcolumn']) ){
$this->numberingcolumn = $settings['numberingcolumn'];
}
}
function parse( $text ) {
$title =& $this->parser->mTitle;
$options =& $this->parser->mOptions;
$output = $this->parser->parse( $text, $title, $options, true, false );
return $output->getText();
}
}
} else {
echo( "This file is an extension to the MediaWiki software and cannot be used standalone.\n" );
die( -1 );
}