Extension:Presort
<translate> This extension is currently not actively maintained!</translate> <translate> Although it may still work, any bug reports or feature requests will more than likely be ignored.</translate> |
<translate> This extension stores its source code on a wiki page.</translate> <translate> Please be aware that this code may be unreviewed or maliciously altered.</translate> <translate> They may contain security holes, outdated interfaces that are no longer compatible etc.</translate> <translate> Note:</translate> <translate> No [[<tvar name=localisation>Special:MyLanguage/Localisation#Translation resources</tvar>|localisation]] updates are provided for this extension by <tvar name=twn>translatewiki.net </tvar>.</translate> |
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> |
|
Quarterly downloads | Lua error in Module:Extension at line 172: bad argument #1 to 'inNamespace' (unrecognized namespace name 'skin'). |
Public wikis using | Lua error in Module:Extension at line 172: bad argument #1 to 'inNamespace' (unrecognized namespace name 'skin'). |
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
mode
- 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
defines the sortcolumn. Can only be used with "column" mode. Numbering starts with 1.
Default value is "1".
order
- asc
ascending order
- desc
descending order
Default value is "asc".
numberingcolumn
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
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
- <translate> <tvar name=1>Download</tvar> and place the file(s) in a directory called <tvar name=name>
Presort
</tvar> in your <tvar name=ext>extensions/
</tvar> folder.</translate> - <translate> Add the following code at the bottom of your <tvar name=1>LocalSettings.php </tvar> file:</translate>
require_once "$IP/extensions/Presort/Presort.php";
- File:OOjs UI icon check-constructive.svg <translate> Done</translate> – <translate> Navigate to <tvar name=special>Special:Version</tvar> on your wiki to verify that the extension is successfully installed.</translate>
Code
- 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 );
}
- Pages with script errors
- Pages with broken file links
- Unmaintained extensions
- Extensions which host their code in-wiki
- Extensions without an image
- Tag extensions
- Extensions without a compatibility policy
- Extensions without MediaWiki version
- GPL licensed extensions
- All extensions
- Extensions not in ExtensionJson
- Extensions not using extension registration