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. */ // 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, &$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); break; case DOKU_LEXER_UNMATCHED : // return p_render('xhtml',p_get_instructions($match),$info); return array($state, $match); break; case DOKU_LEXER_EXIT : // return ""; return array($state, ""); break; } return array(); } function render($mode, &$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(); // re-open the paragraph break; } return true; } return false; } function __validateOptions($opts) { $oa = split(" ", $opts); $ret = ""; foreach($oa as $opt) { list($c,$v) = split("=",$opt); if ($c=="sumrow") { $v=$c; $c=""; } if ($v!=null) { $cmpr=$v; } else { if (preg_match('/r?\d*/', $c, $matches)) { $cmpr='sort'; } } switch ($cmpr) { 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 . $ret; break; case 'sumrow': $ret = ' sortbottom' . $c . $ret; break; } } return $ret; } } ?>