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 2211e1031cSOtto Vainio * version 2.12 php 7 compatibility. Cahnged split -> explode 23*274578ffSFyiurAmron * @author Vaxquis 24*274578ffSFyiurAmron * version 2.13 implemented https://github.com/oiv/sortablejs/pull/18/files for PHP 7 compatibility, minor style/pretty print changes 259d7cf522SOtto Vainio */ 269d7cf522SOtto Vainio// must be run within Dokuwiki 27*274578ffSFyiurAmronif ( !defined( 'DOKU_INC' ) ) 28*274578ffSFyiurAmron die(); 29*274578ffSFyiurAmronif ( !defined( 'DOKU_PLUGIN' ) ) 30*274578ffSFyiurAmron define( 'DOKU_PLUGIN', DOKU_INC.'lib/plugins/' ); 319d7cf522SOtto Vainiorequire_once(DOKU_PLUGIN.'syntax.php'); 32*274578ffSFyiurAmron// 339d7cf522SOtto Vainioclass syntax_plugin_sortablejs extends DokuWiki_Syntax_Plugin { 349d7cf522SOtto Vainio 35*274578ffSFyiurAmron function getType() { 36*274578ffSFyiurAmron return 'container'; 37*274578ffSFyiurAmron } 389d7cf522SOtto Vainio 39*274578ffSFyiurAmron function getPType() { 40*274578ffSFyiurAmron return 'block'; 41*274578ffSFyiurAmron } 42*274578ffSFyiurAmron 43*274578ffSFyiurAmron function getSort() { 44*274578ffSFyiurAmron return 371; 45*274578ffSFyiurAmron } 46*274578ffSFyiurAmron 47*274578ffSFyiurAmron function getAllowedTypes() { 48*274578ffSFyiurAmron return array( 'container', 'formatting', 'substition' ); 49*274578ffSFyiurAmron } 50*274578ffSFyiurAmron 519d7cf522SOtto Vainio function connectTo( $mode ) { 529d7cf522SOtto Vainio $this->Lexer->addEntryPattern( '<sortable[^>]*>(?=.*?</sortable>)', $mode, 'plugin_sortablejs' ); 539d7cf522SOtto Vainio// $this->Lexer->addEntryPattern('\x3Csortable.*?\x3E',$mode,'plugin_sortablejs'); 549d7cf522SOtto Vainio// $this->Lexer->addEntryPattern('<sortable>',$mode,'plugin_sortablejs'); 559d7cf522SOtto Vainio } 56*274578ffSFyiurAmron 579d7cf522SOtto Vainio function postConnect() { 589d7cf522SOtto Vainio $this->Lexer->addExitPattern( '</sortable>', 'plugin_sortablejs' ); 599d7cf522SOtto Vainio } 60*274578ffSFyiurAmron 61*274578ffSFyiurAmron function handle( $match, $state, $pos, Doku_Handler $handler ) { 629d7cf522SOtto Vainio 639d7cf522SOtto Vainio switch ( $state ) { 649d7cf522SOtto Vainio case DOKU_LEXER_ENTER : 659d7cf522SOtto Vainio $match = substr( $match, 9, -1 ); 669d7cf522SOtto Vainio $match = trim( $match ); 679d7cf522SOtto Vainio $scl = ""; 689d7cf522SOtto Vainio if ( strlen( $match ) > 0 ) { 699d7cf522SOtto Vainio $scl = $this->__validateOptions( $match ); 709d7cf522SOtto Vainio } 719d7cf522SOtto Vainio return array( $state, $scl ); 729d7cf522SOtto Vainio case DOKU_LEXER_UNMATCHED : 739d7cf522SOtto Vainio// return p_render('xhtml',p_get_instructions($match),$info); 749d7cf522SOtto Vainio return array( $state, $match ); 759d7cf522SOtto Vainio case DOKU_LEXER_EXIT : 769d7cf522SOtto Vainio// return "</div>"; 779d7cf522SOtto Vainio return array( $state, "" ); 789d7cf522SOtto Vainio } 799d7cf522SOtto Vainio return array(); 809d7cf522SOtto Vainio } 819d7cf522SOtto Vainio 82*274578ffSFyiurAmron function render( $mode, Doku_Renderer $renderer, $data ) { 839d7cf522SOtto Vainio list($state, $match) = $data; 849d7cf522SOtto Vainio if ( $mode == 'xhtml' ) { 859d7cf522SOtto Vainio switch ( $state ) { 869d7cf522SOtto Vainio case DOKU_LEXER_ENTER : 879d7cf522SOtto Vainio $renderer->doc .= "<div class=\"sortable$match\">"; 889d7cf522SOtto Vainio break; 899d7cf522SOtto Vainio case DOKU_LEXER_UNMATCHED : 909d7cf522SOtto Vainio// $dbgr = p_render('xhtml',p_get_instructions($match),$info); 919d7cf522SOtto Vainio// $renderer->doc .= p_render('xhtml',p_get_instructions($match),$info); 929d7cf522SOtto Vainio// $renderer->doc .= $match; 939d7cf522SOtto Vainio// $instructions = array_slice(p_get_instructions($match), 1, -1); 949d7cf522SOtto Vainio $instructions = p_get_instructions( $match ); 959d7cf522SOtto Vainio foreach( $instructions as $instruction ) { 969d7cf522SOtto Vainio call_user_func_array( array( &$renderer, $instruction[0] ), $instruction[1] ); 979d7cf522SOtto Vainio } 989d7cf522SOtto Vainio 999d7cf522SOtto Vainio break; 1009d7cf522SOtto Vainio case DOKU_LEXER_EXIT : 1019d7cf522SOtto Vainio $renderer->doc .= "</div>"; 1029d7cf522SOtto Vainio break; 1039d7cf522SOtto Vainio } 1049d7cf522SOtto Vainio return true; 1059d7cf522SOtto Vainio } else if ( $mode == 'odt' ) { 1069d7cf522SOtto Vainio switch ( $state ) { 1079d7cf522SOtto Vainio case DOKU_LEXER_ENTER : 1089d7cf522SOtto Vainio // In ODT, tables must not be inside a paragraph. Make sure we 1099d7cf522SOtto Vainio // closed any opened paragraph 1109d7cf522SOtto Vainio $renderer->p_close(); 1119d7cf522SOtto Vainio break; 1129d7cf522SOtto Vainio case DOKU_LEXER_UNMATCHED : 1139d7cf522SOtto Vainio $instructions = array_slice( p_get_instructions( $match ), 1, -1 ); 1149d7cf522SOtto Vainio foreach( $instructions as $instruction ) { 1159d7cf522SOtto Vainio call_user_func_array( array( &$renderer, $instruction[0] ), $instruction[1] ); 1169d7cf522SOtto Vainio } 1179d7cf522SOtto Vainio break; 1189d7cf522SOtto Vainio case DOKU_LEXER_EXIT : 119d61cb45eSLarsDW223 //$renderer->p_open(); 120d61cb45eSLarsDW223 // DO NOT re-open the paragraph, it would cause an error if the table is the last content on a page 1219d7cf522SOtto Vainio break; 1229d7cf522SOtto Vainio } 1239d7cf522SOtto Vainio return true; 1249d7cf522SOtto Vainio } 1259d7cf522SOtto Vainio return false; 1269d7cf522SOtto Vainio } 1279d7cf522SOtto Vainio 1289d7cf522SOtto Vainio function __validateOptions( $opts ) { 12911e1031cSOtto Vainio $oa = explode( " ", $opts ); 1309d7cf522SOtto Vainio $ret = ""; 1319d7cf522SOtto Vainio foreach( $oa as $opt ) { 13211e1031cSOtto Vainio list($c, $v) = explode( "=", $opt ); 1339d7cf522SOtto Vainio if ( $c == "sumrow" ) { 13412db27a4SOtto Vainio $c = $v; 13512db27a4SOtto Vainio $v = "sumrow"; 13612db27a4SOtto Vainio if ( $c == "" ) { 13712db27a4SOtto Vainio $c = "1"; 13812db27a4SOtto Vainio } 13912db27a4SOtto Vainio } else if ( $c == "3phase" ) { 1409d7cf522SOtto Vainio $v = $c; 1419d7cf522SOtto Vainio $c = ""; 1429d7cf522SOtto Vainio } 1439d7cf522SOtto Vainio if ( $v != null ) { 1449d7cf522SOtto Vainio $cmpr = $v; 1459d7cf522SOtto Vainio } else { 1469d7cf522SOtto Vainio if ( preg_match( '/r?\d*/', $c, $matches ) ) { 1479d7cf522SOtto Vainio $cmpr = 'sort'; 1489d7cf522SOtto Vainio } 1499d7cf522SOtto Vainio } 1509d7cf522SOtto Vainio switch ( $cmpr ) { 15112db27a4SOtto Vainio case '3phase': 15212db27a4SOtto Vainio $ret .= " threephase"; 15312db27a4SOtto Vainio break; 1549d7cf522SOtto Vainio case 'nosort': 1559d7cf522SOtto Vainio $ret .= " col_".$c."_nosort"; 1569d7cf522SOtto Vainio break; 1579d7cf522SOtto Vainio case 'numeric': 1589d7cf522SOtto Vainio $ret .= " col_".$c."_numeric"; 1599d7cf522SOtto Vainio break; 1609d7cf522SOtto Vainio case 'ddmm': 1619d7cf522SOtto Vainio $ret .= " col_".$c."_ddmm"; 1629d7cf522SOtto Vainio break; 1639d7cf522SOtto Vainio case 'mmdd': 1649d7cf522SOtto Vainio $ret .= " col_".$c."_mmdd"; 1659d7cf522SOtto Vainio break; 1669d7cf522SOtto Vainio case 'alpha': 1679d7cf522SOtto Vainio case 'text': 1689d7cf522SOtto Vainio $ret .= " col_".$c."_alpha"; 1699d7cf522SOtto Vainio break; 1709d7cf522SOtto Vainio case 'sort': 17112db27a4SOtto Vainio $ret .= ' sort'.$opt; 1729d7cf522SOtto Vainio break; 1739d7cf522SOtto Vainio case 'sumrow': 17412db27a4SOtto Vainio $ret .= ' sortbottom_'.$c; 17512db27a4SOtto Vainio //$ret = ' sortbottom' . $ret; 1769d7cf522SOtto Vainio break; 1779d7cf522SOtto Vainio } 1789d7cf522SOtto Vainio } 1799d7cf522SOtto Vainio return $ret; 1809d7cf522SOtto Vainio } 1819d7cf522SOtto Vainio} 182