1*9d7cf522SOtto Vainio<?php 2*9d7cf522SOtto Vainio/** 3*9d7cf522SOtto Vainio * Sortablejs: Javascript for Sortable table 4*9d7cf522SOtto Vainio * 5*9d7cf522SOtto Vainio * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) 6*9d7cf522SOtto Vainio * @author Otto Vainio 7*9d7cf522SOtto Vainio * version 1.1 Fixed javascript error in sorttable js 8*9d7cf522SOtto Vainio * version 2.0 Added <div> to sort any table 9*9d7cf522SOtto Vainio * version 2.1 Changed script to allow multiple sortable tables in one page 10*9d7cf522SOtto Vainio * version 2.2 A table can now be sorted by one column by default. 11*9d7cf522SOtto Vainio * version 2.2a css+js compress broke this script. Now fixed some jslint complains. 12*9d7cf522SOtto Vainio * version 2.3 Added support for odt plugin. (Aurélien Bompard) 13*9d7cf522SOtto Vainio * version 2.3a Fixed default sort with aligned text (Andre Rauschenbach) 14*9d7cf522SOtto Vainio * version 2.4 Added options to set manual override options for column sort. (nosort, numeric, alpha, ddmm, mmdd) 15*9d7cf522SOtto Vainio * version 2.5 Fixed problems with secionediting, footnotes and edittable 16*9d7cf522SOtto Vainio * version 2.6 Added support for jQuery and dokuwiki Weatherwax -> 17*9d7cf522SOtto Vainio * version 2.7 Fixed problem with first row not getting sorted 18*9d7cf522SOtto Vainio * version 2.8 Fixed problem with first row not getting sorted in default sort. Added option "sumrow" to prevent sum line sort. 19*9d7cf522SOtto Vainio */ 20*9d7cf522SOtto Vainio// must be run within Dokuwiki 21*9d7cf522SOtto Vainioif (!defined('DOKU_INC')) die(); 22*9d7cf522SOtto Vainioif (!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN', DOKU_INC.'lib/plugins/'); 23*9d7cf522SOtto Vainiorequire_once(DOKU_PLUGIN.'syntax.php'); 24*9d7cf522SOtto Vainio 25*9d7cf522SOtto Vainioclass syntax_plugin_sortablejs extends DokuWiki_Syntax_Plugin { 26*9d7cf522SOtto Vainio 27*9d7cf522SOtto Vainio 28*9d7cf522SOtto Vainio function getType() { return 'container';} 29*9d7cf522SOtto Vainio function getPType(){ return 'block';} 30*9d7cf522SOtto Vainio function getSort() { return 371; } 31*9d7cf522SOtto Vainio function getAllowedTypes() {return array('container','formatting','substition');} 32*9d7cf522SOtto Vainio function connectTo($mode) { 33*9d7cf522SOtto Vainio $this->Lexer->addEntryPattern('<sortable[^>]*>(?=.*?</sortable>)',$mode,'plugin_sortablejs'); 34*9d7cf522SOtto Vainio// $this->Lexer->addEntryPattern('\x3Csortable.*?\x3E',$mode,'plugin_sortablejs'); 35*9d7cf522SOtto Vainio// $this->Lexer->addEntryPattern('<sortable>',$mode,'plugin_sortablejs'); 36*9d7cf522SOtto Vainio } 37*9d7cf522SOtto Vainio function postConnect() { 38*9d7cf522SOtto Vainio $this->Lexer->addExitPattern('</sortable>','plugin_sortablejs'); 39*9d7cf522SOtto Vainio } 40*9d7cf522SOtto Vainio function handle($match, $state, $pos, &$handler){ 41*9d7cf522SOtto Vainio 42*9d7cf522SOtto Vainio switch ($state) { 43*9d7cf522SOtto Vainio case DOKU_LEXER_ENTER : 44*9d7cf522SOtto Vainio $match = substr($match,9,-1); 45*9d7cf522SOtto Vainio $match=trim($match); 46*9d7cf522SOtto Vainio $scl=""; 47*9d7cf522SOtto Vainio if (strlen($match)>0) { 48*9d7cf522SOtto Vainio $scl=$this->__validateOptions($match); 49*9d7cf522SOtto Vainio } 50*9d7cf522SOtto Vainio return array($state, $scl); 51*9d7cf522SOtto Vainio break; 52*9d7cf522SOtto Vainio case DOKU_LEXER_UNMATCHED : 53*9d7cf522SOtto Vainio// return p_render('xhtml',p_get_instructions($match),$info); 54*9d7cf522SOtto Vainio return array($state, $match); 55*9d7cf522SOtto Vainio break; 56*9d7cf522SOtto Vainio case DOKU_LEXER_EXIT : 57*9d7cf522SOtto Vainio// return "</div>"; 58*9d7cf522SOtto Vainio return array($state, ""); 59*9d7cf522SOtto Vainio break; 60*9d7cf522SOtto Vainio } 61*9d7cf522SOtto Vainio return array(); 62*9d7cf522SOtto Vainio } 63*9d7cf522SOtto Vainio 64*9d7cf522SOtto Vainio function render($mode, &$renderer, $data) { 65*9d7cf522SOtto Vainio list($state,$match) = $data; 66*9d7cf522SOtto Vainio if ($mode == 'xhtml'){ 67*9d7cf522SOtto Vainio switch ($state) { 68*9d7cf522SOtto Vainio case DOKU_LEXER_ENTER : 69*9d7cf522SOtto Vainio $renderer->doc .= "<div class=\"sortable$match\">"; 70*9d7cf522SOtto Vainio break; 71*9d7cf522SOtto Vainio case DOKU_LEXER_UNMATCHED : 72*9d7cf522SOtto Vainio// $dbgr = p_render('xhtml',p_get_instructions($match),$info); 73*9d7cf522SOtto Vainio// $renderer->doc .= p_render('xhtml',p_get_instructions($match),$info); 74*9d7cf522SOtto Vainio// $renderer->doc .= $match; 75*9d7cf522SOtto Vainio// $instructions = array_slice(p_get_instructions($match), 1, -1); 76*9d7cf522SOtto Vainio $instructions = p_get_instructions($match); 77*9d7cf522SOtto Vainio foreach ($instructions as $instruction) { 78*9d7cf522SOtto Vainio call_user_func_array(array(&$renderer, $instruction[0]),$instruction[1]); 79*9d7cf522SOtto Vainio } 80*9d7cf522SOtto Vainio 81*9d7cf522SOtto Vainio break; 82*9d7cf522SOtto Vainio case DOKU_LEXER_EXIT : 83*9d7cf522SOtto Vainio $renderer->doc .= "</div>"; 84*9d7cf522SOtto Vainio break; 85*9d7cf522SOtto Vainio } 86*9d7cf522SOtto Vainio return true; 87*9d7cf522SOtto Vainio } else if($mode == 'odt'){ 88*9d7cf522SOtto Vainio switch ($state) { 89*9d7cf522SOtto Vainio case DOKU_LEXER_ENTER : 90*9d7cf522SOtto Vainio // In ODT, tables must not be inside a paragraph. Make sure we 91*9d7cf522SOtto Vainio // closed any opened paragraph 92*9d7cf522SOtto Vainio $renderer->p_close(); 93*9d7cf522SOtto Vainio break; 94*9d7cf522SOtto Vainio case DOKU_LEXER_UNMATCHED : 95*9d7cf522SOtto Vainio $instructions = array_slice(p_get_instructions($match), 1, -1); 96*9d7cf522SOtto Vainio foreach ($instructions as $instruction) { 97*9d7cf522SOtto Vainio call_user_func_array(array(&$renderer, $instruction[0]),$instruction[1]); 98*9d7cf522SOtto Vainio } 99*9d7cf522SOtto Vainio break; 100*9d7cf522SOtto Vainio case DOKU_LEXER_EXIT : 101*9d7cf522SOtto Vainio $renderer->p_open(); // re-open the paragraph 102*9d7cf522SOtto Vainio break; 103*9d7cf522SOtto Vainio } 104*9d7cf522SOtto Vainio return true; 105*9d7cf522SOtto Vainio } 106*9d7cf522SOtto Vainio return false; 107*9d7cf522SOtto Vainio } 108*9d7cf522SOtto Vainio 109*9d7cf522SOtto Vainio function __validateOptions($opts) { 110*9d7cf522SOtto Vainio $oa = split(" ", $opts); 111*9d7cf522SOtto Vainio $ret = ""; 112*9d7cf522SOtto Vainio foreach($oa as $opt) { 113*9d7cf522SOtto Vainio list($c,$v) = split("=",$opt); 114*9d7cf522SOtto Vainio if ($c=="sumrow") { 115*9d7cf522SOtto Vainio $v=$c; 116*9d7cf522SOtto Vainio $c=""; 117*9d7cf522SOtto Vainio } 118*9d7cf522SOtto Vainio if ($v!=null) { 119*9d7cf522SOtto Vainio $cmpr=$v; 120*9d7cf522SOtto Vainio } else { 121*9d7cf522SOtto Vainio if (preg_match('/r?\d*/', $c, $matches)) { 122*9d7cf522SOtto Vainio $cmpr='sort'; 123*9d7cf522SOtto Vainio } 124*9d7cf522SOtto Vainio } 125*9d7cf522SOtto Vainio switch ($cmpr) { 126*9d7cf522SOtto Vainio case 'nosort': 127*9d7cf522SOtto Vainio $ret .= " col_" . $c . "_nosort"; 128*9d7cf522SOtto Vainio break; 129*9d7cf522SOtto Vainio case 'numeric': 130*9d7cf522SOtto Vainio $ret .= " col_" . $c . "_numeric"; 131*9d7cf522SOtto Vainio break; 132*9d7cf522SOtto Vainio case 'ddmm': 133*9d7cf522SOtto Vainio $ret .= " col_" . $c . "_ddmm"; 134*9d7cf522SOtto Vainio break; 135*9d7cf522SOtto Vainio case 'mmdd': 136*9d7cf522SOtto Vainio $ret .= " col_" . $c . "_mmdd"; 137*9d7cf522SOtto Vainio break; 138*9d7cf522SOtto Vainio case 'alpha': 139*9d7cf522SOtto Vainio case 'text': 140*9d7cf522SOtto Vainio $ret .= " col_" . $c . "_alpha"; 141*9d7cf522SOtto Vainio break; 142*9d7cf522SOtto Vainio case 'sort': 143*9d7cf522SOtto Vainio $ret = ' sort' . $opt . $ret; 144*9d7cf522SOtto Vainio break; 145*9d7cf522SOtto Vainio case 'sumrow': 146*9d7cf522SOtto Vainio $ret = ' sortbottom' . $c . $ret; 147*9d7cf522SOtto Vainio break; 148*9d7cf522SOtto Vainio } 149*9d7cf522SOtto Vainio } 150*9d7cf522SOtto Vainio return $ret; 151*9d7cf522SOtto Vainio } 152*9d7cf522SOtto Vainio 153*9d7cf522SOtto Vainio} 154*9d7cf522SOtto Vainio?> 155