19d7cf522SOtto Vainio<?php 29d7cf522SOtto Vainio/** 39d7cf522SOtto Vainio * Sortablejs: Javascript for Sortable table 49d7cf522SOtto Vainio * 59d7cf522SOtto Vainio * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) 69d7cf522SOtto Vainio * @author Otto Vainio 79d7cf522SOtto Vainio * version 1.1 Fixed javascript error in sorttable js 89d7cf522SOtto Vainio * version 2.0 Added <div> to sort any table 99d7cf522SOtto Vainio * version 2.1 Changed script to allow multiple sortable tables in one page 109d7cf522SOtto Vainio * version 2.2 A table can now be sorted by one column by default. 119d7cf522SOtto Vainio * version 2.2a css+js compress broke this script. Now fixed some jslint complains. 129d7cf522SOtto Vainio * version 2.3 Added support for odt plugin. (Aurélien Bompard) 139d7cf522SOtto Vainio * version 2.3a Fixed default sort with aligned text (Andre Rauschenbach) 149d7cf522SOtto Vainio * version 2.4 Added options to set manual override options for column sort. (nosort, numeric, alpha, ddmm, mmdd) 159d7cf522SOtto Vainio * version 2.5 Fixed problems with secionediting, footnotes and edittable 169d7cf522SOtto Vainio * version 2.6 Added support for jQuery and dokuwiki Weatherwax -> 179d7cf522SOtto Vainio * version 2.7 Fixed problem with first row not getting sorted 189d7cf522SOtto Vainio * version 2.8 Fixed problem with first row not getting sorted in default sort. Added option "sumrow" to prevent sum line sort. 1912db27a4SOtto Vainio * version 2.9 fixed problem with header row being sorted in earlier versions of dokuwiki. 20a33dfbaeSOtto Vainio * version 2.10 fixed odt export (LarsGit223) 21e23d2af1SOtto Vainio * version 2.11 Added ip address sort. Thanks Chefkeks 22*11e1031cSOtto Vainio * version 2.12 php 7 compatibility. Cahnged split -> explode 239d7cf522SOtto Vainio */ 249d7cf522SOtto Vainio// must be run within Dokuwiki 259d7cf522SOtto Vainioif (!defined('DOKU_INC')) die(); 269d7cf522SOtto Vainioif (!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN', DOKU_INC.'lib/plugins/'); 279d7cf522SOtto Vainiorequire_once(DOKU_PLUGIN.'syntax.php'); 289d7cf522SOtto Vainio 299d7cf522SOtto Vainioclass syntax_plugin_sortablejs extends DokuWiki_Syntax_Plugin { 309d7cf522SOtto Vainio 319d7cf522SOtto Vainio 329d7cf522SOtto Vainio function getType() { return 'container';} 339d7cf522SOtto Vainio function getPType(){ return 'block';} 349d7cf522SOtto Vainio function getSort() { return 371; } 359d7cf522SOtto Vainio function getAllowedTypes() {return array('container','formatting','substition');} 369d7cf522SOtto Vainio function connectTo($mode) { 379d7cf522SOtto Vainio $this->Lexer->addEntryPattern('<sortable[^>]*>(?=.*?</sortable>)',$mode,'plugin_sortablejs'); 389d7cf522SOtto Vainio// $this->Lexer->addEntryPattern('\x3Csortable.*?\x3E',$mode,'plugin_sortablejs'); 399d7cf522SOtto Vainio// $this->Lexer->addEntryPattern('<sortable>',$mode,'plugin_sortablejs'); 409d7cf522SOtto Vainio } 419d7cf522SOtto Vainio function postConnect() { 429d7cf522SOtto Vainio $this->Lexer->addExitPattern('</sortable>','plugin_sortablejs'); 439d7cf522SOtto Vainio } 449d7cf522SOtto Vainio function handle($match, $state, $pos, &$handler){ 459d7cf522SOtto Vainio 469d7cf522SOtto Vainio switch ($state) { 479d7cf522SOtto Vainio case DOKU_LEXER_ENTER : 489d7cf522SOtto Vainio $match = substr($match,9,-1); 499d7cf522SOtto Vainio $match=trim($match); 509d7cf522SOtto Vainio $scl=""; 519d7cf522SOtto Vainio if (strlen($match)>0) { 529d7cf522SOtto Vainio $scl=$this->__validateOptions($match); 539d7cf522SOtto Vainio } 549d7cf522SOtto Vainio return array($state, $scl); 559d7cf522SOtto Vainio break; 569d7cf522SOtto Vainio case DOKU_LEXER_UNMATCHED : 579d7cf522SOtto Vainio// return p_render('xhtml',p_get_instructions($match),$info); 589d7cf522SOtto Vainio return array($state, $match); 599d7cf522SOtto Vainio break; 609d7cf522SOtto Vainio case DOKU_LEXER_EXIT : 619d7cf522SOtto Vainio// return "</div>"; 629d7cf522SOtto Vainio return array($state, ""); 639d7cf522SOtto Vainio break; 649d7cf522SOtto Vainio } 659d7cf522SOtto Vainio return array(); 669d7cf522SOtto Vainio } 679d7cf522SOtto Vainio 689d7cf522SOtto Vainio function render($mode, &$renderer, $data) { 699d7cf522SOtto Vainio list($state,$match) = $data; 709d7cf522SOtto Vainio if ($mode == 'xhtml'){ 719d7cf522SOtto Vainio switch ($state) { 729d7cf522SOtto Vainio case DOKU_LEXER_ENTER : 739d7cf522SOtto Vainio $renderer->doc .= "<div class=\"sortable$match\">"; 749d7cf522SOtto Vainio break; 759d7cf522SOtto Vainio case DOKU_LEXER_UNMATCHED : 769d7cf522SOtto Vainio// $dbgr = p_render('xhtml',p_get_instructions($match),$info); 779d7cf522SOtto Vainio// $renderer->doc .= p_render('xhtml',p_get_instructions($match),$info); 789d7cf522SOtto Vainio// $renderer->doc .= $match; 799d7cf522SOtto Vainio// $instructions = array_slice(p_get_instructions($match), 1, -1); 809d7cf522SOtto Vainio $instructions = p_get_instructions($match); 819d7cf522SOtto Vainio foreach ($instructions as $instruction) { 829d7cf522SOtto Vainio call_user_func_array(array(&$renderer, $instruction[0]),$instruction[1]); 839d7cf522SOtto Vainio } 849d7cf522SOtto Vainio 859d7cf522SOtto Vainio break; 869d7cf522SOtto Vainio case DOKU_LEXER_EXIT : 879d7cf522SOtto Vainio $renderer->doc .= "</div>"; 889d7cf522SOtto Vainio break; 899d7cf522SOtto Vainio } 909d7cf522SOtto Vainio return true; 919d7cf522SOtto Vainio } else if($mode == 'odt'){ 929d7cf522SOtto Vainio switch ($state) { 939d7cf522SOtto Vainio case DOKU_LEXER_ENTER : 949d7cf522SOtto Vainio // In ODT, tables must not be inside a paragraph. Make sure we 959d7cf522SOtto Vainio // closed any opened paragraph 969d7cf522SOtto Vainio $renderer->p_close(); 979d7cf522SOtto Vainio break; 989d7cf522SOtto Vainio case DOKU_LEXER_UNMATCHED : 999d7cf522SOtto Vainio $instructions = array_slice(p_get_instructions($match), 1, -1); 1009d7cf522SOtto Vainio foreach ($instructions as $instruction) { 1019d7cf522SOtto Vainio call_user_func_array(array(&$renderer, $instruction[0]),$instruction[1]); 1029d7cf522SOtto Vainio } 1039d7cf522SOtto Vainio break; 1049d7cf522SOtto Vainio case DOKU_LEXER_EXIT : 105d61cb45eSLarsDW223 //$renderer->p_open(); 106d61cb45eSLarsDW223 // DO NOT re-open the paragraph, it would cause an error if the table is the last content on a page 1079d7cf522SOtto Vainio break; 1089d7cf522SOtto Vainio } 1099d7cf522SOtto Vainio return true; 1109d7cf522SOtto Vainio } 1119d7cf522SOtto Vainio return false; 1129d7cf522SOtto Vainio } 1139d7cf522SOtto Vainio 1149d7cf522SOtto Vainio function __validateOptions($opts) { 115*11e1031cSOtto Vainio $oa = explode(" ", $opts); 1169d7cf522SOtto Vainio $ret = ""; 1179d7cf522SOtto Vainio foreach($oa as $opt) { 118*11e1031cSOtto Vainio list($c,$v) = explode("=",$opt); 1199d7cf522SOtto Vainio if ($c=="sumrow") { 12012db27a4SOtto Vainio $c=$v; 12112db27a4SOtto Vainio $v="sumrow"; 12212db27a4SOtto Vainio if ($c=="") { 12312db27a4SOtto Vainio $c="1"; 12412db27a4SOtto Vainio } 12512db27a4SOtto Vainio } else if ($c=="3phase") { 1269d7cf522SOtto Vainio $v=$c; 1279d7cf522SOtto Vainio $c=""; 1289d7cf522SOtto Vainio } 1299d7cf522SOtto Vainio if ($v!=null) { 1309d7cf522SOtto Vainio $cmpr=$v; 1319d7cf522SOtto Vainio } else { 1329d7cf522SOtto Vainio if (preg_match('/r?\d*/', $c, $matches)) { 1339d7cf522SOtto Vainio $cmpr='sort'; 1349d7cf522SOtto Vainio } 1359d7cf522SOtto Vainio } 1369d7cf522SOtto Vainio switch ($cmpr) { 13712db27a4SOtto Vainio case '3phase': 13812db27a4SOtto Vainio $ret .= " threephase"; 13912db27a4SOtto Vainio break; 1409d7cf522SOtto Vainio case 'nosort': 1419d7cf522SOtto Vainio $ret .= " col_" . $c . "_nosort"; 1429d7cf522SOtto Vainio break; 1439d7cf522SOtto Vainio case 'numeric': 1449d7cf522SOtto Vainio $ret .= " col_" . $c . "_numeric"; 1459d7cf522SOtto Vainio break; 1469d7cf522SOtto Vainio case 'ddmm': 1479d7cf522SOtto Vainio $ret .= " col_" . $c . "_ddmm"; 1489d7cf522SOtto Vainio break; 1499d7cf522SOtto Vainio case 'mmdd': 1509d7cf522SOtto Vainio $ret .= " col_" . $c . "_mmdd"; 1519d7cf522SOtto Vainio break; 1529d7cf522SOtto Vainio case 'alpha': 1539d7cf522SOtto Vainio case 'text': 1549d7cf522SOtto Vainio $ret .= " col_" . $c . "_alpha"; 1559d7cf522SOtto Vainio break; 1569d7cf522SOtto Vainio case 'sort': 15712db27a4SOtto Vainio $ret .= ' sort' . $opt; 1589d7cf522SOtto Vainio break; 1599d7cf522SOtto Vainio case 'sumrow': 16012db27a4SOtto Vainio $ret .= ' sortbottom_' . $c; 16112db27a4SOtto Vainio //$ret = ' sortbottom' . $ret; 1629d7cf522SOtto Vainio break; 1639d7cf522SOtto Vainio } 1649d7cf522SOtto Vainio } 1659d7cf522SOtto Vainio return $ret; 1669d7cf522SOtto Vainio } 1679d7cf522SOtto Vainio 1689d7cf522SOtto Vainio} 1699d7cf522SOtto Vainio?> 170