to sort any table * version 2.1 Changed script to allow multiple sortable tables in one page * version 2.2 A table can now be sorted by one column by default. * version 2.2a css+js compress broke this script. Now fixed some jslint complains. * version 2.3 Added support for odt plugin. (Aurélien Bompard) * version 2.3a Fixed default sort with aligned text (Andre Rauschenbach) * version 2.4 Added options to set manual override options for column sort. (nosort, numeric, alpha, ddmm, mmdd) * version 2.5 Fixed problems with secionediting, footnotes and edittable * version 2.6 Added support for jQuery and dokuwiki Weatherwax -> * version 2.7 Fixed problem with first row not getting sorted * version 2.8 Fixed problem with first row not getting sorted in default sort. Added option "sumrow" to prevent sum line sort. * version 2.9 fixed problem with header row being sorted in earlier versions of dokuwiki. * version 2.10 fixed odt export (LarsGit223) * version 2.11 Added ip address sort. Thanks Chefkeks * version 2.12 php 7 compatibility. Cahnged split -> explode * @author Vaxquis * version 2.13 implemented https://github.com/oiv/sortablejs/pull/18/files for PHP 7 compatibility, minor style/pretty print changes */ // must be run within Dokuwiki if ( !defined( 'DOKU_INC' ) ) die(); if ( !defined( 'DOKU_PLUGIN' ) ) define( 'DOKU_PLUGIN', DOKU_INC.'lib/plugins/' ); require_once(DOKU_PLUGIN.'syntax.php'); // class syntax_plugin_sortablejs extends DokuWiki_Syntax_Plugin { function getType() { return 'container'; } function getPType() { return 'block'; } function getSort() { return 371; } function getAllowedTypes() { return array( 'container', 'formatting', 'substition' ); } function connectTo( $mode ) { $this->Lexer->addEntryPattern( ']*>(?=.*?)', $mode, 'plugin_sortablejs' ); // $this->Lexer->addEntryPattern('\x3Csortable.*?\x3E',$mode,'plugin_sortablejs'); // $this->Lexer->addEntryPattern('',$mode,'plugin_sortablejs'); } function postConnect() { $this->Lexer->addExitPattern( '', 'plugin_sortablejs' ); } function handle( $match, $state, $pos, Doku_Handler $handler ) { switch ( $state ) { case DOKU_LEXER_ENTER : $match = substr( $match, 9, -1 ); $match = trim( $match ); $scl = ""; if ( strlen( $match ) > 0 ) { $scl = $this->__validateOptions( $match ); } return array( $state, $scl ); case DOKU_LEXER_UNMATCHED : // return p_render('xhtml',p_get_instructions($match),$info); return array( $state, $match ); case DOKU_LEXER_EXIT : // return ""; return array( $state, "" ); } return array(); } function render( $mode, Doku_Renderer $renderer, $data ) { list($state, $match) = $data; if ( $mode == 'xhtml' ) { switch ( $state ) { case DOKU_LEXER_ENTER : $renderer->doc .= "
"; break; case DOKU_LEXER_UNMATCHED : // $dbgr = p_render('xhtml',p_get_instructions($match),$info); // $renderer->doc .= p_render('xhtml',p_get_instructions($match),$info); // $renderer->doc .= $match; // $instructions = array_slice(p_get_instructions($match), 1, -1); $instructions = p_get_instructions( $match ); foreach( $instructions as $instruction ) { call_user_func_array( array( &$renderer, $instruction[0] ), $instruction[1] ); } break; case DOKU_LEXER_EXIT : $renderer->doc .= "
"; break; } return true; } else if ( $mode == 'odt' ) { switch ( $state ) { case DOKU_LEXER_ENTER : // In ODT, tables must not be inside a paragraph. Make sure we // closed any opened paragraph $renderer->p_close(); break; case DOKU_LEXER_UNMATCHED : $instructions = array_slice( p_get_instructions( $match ), 1, -1 ); foreach( $instructions as $instruction ) { call_user_func_array( array( &$renderer, $instruction[0] ), $instruction[1] ); } break; case DOKU_LEXER_EXIT : //$renderer->p_open(); // DO NOT re-open the paragraph, it would cause an error if the table is the last content on a page break; } return true; } return false; } function __validateOptions( $opts ) { $oa = explode( " ", $opts ); $ret = ""; foreach( $oa as $opt ) { list($c, $v) = explode( "=", $opt ); if ( $c == "sumrow" ) { $c = $v; $v = "sumrow"; if ( $c == "" ) { $c = "1"; } } else if ( $c == "3phase" ) { $v = $c; $c = ""; } if ( $v != null ) { $cmpr = $v; } else { if ( preg_match( '/r?\d*/', $c, $matches ) ) { $cmpr = 'sort'; } } switch ( $cmpr ) { case '3phase': $ret .= " threephase"; break; case 'nosort': $ret .= " col_".$c."_nosort"; break; case 'numeric': $ret .= " col_".$c."_numeric"; break; case 'ddmm': $ret .= " col_".$c."_ddmm"; break; case 'mmdd': $ret .= " col_".$c."_mmdd"; break; case 'alpha': case 'text': $ret .= " col_".$c."_alpha"; break; case 'sort': $ret .= ' sort'.$opt; break; case 'sumrow': $ret .= ' sortbottom_'.$c; //$ret = ' sortbottom' . $ret; break; } } return $ret; } }