19d7cf522SOtto Vainio<?php 29d7cf522SOtto Vainio/** 3*f55787a9SFyiurAmron based on code from http://www.kryogenix.org/code/browser/sorttable/ by Stuart Langridge 4*f55787a9SFyiurAmron (distributed under the condisions of MIT licence from http://www.kryogenix.org/code/browser/licence.html) 5*f55787a9SFyiurAmron see 6*f55787a9SFyiurAmron 2007-2016 by oiv (Otto Vainio at otto@valjakko.net) 7*f55787a9SFyiurAmron 2016-? by vaxquis AKA FyiurAmron (spamove@gmail.com) 89d7cf522SOtto Vainio */ 99d7cf522SOtto Vainio// must be run within Dokuwiki 10274578ffSFyiurAmronif ( !defined( 'DOKU_INC' ) ) 11274578ffSFyiurAmron die(); 12274578ffSFyiurAmronif ( !defined( 'DOKU_PLUGIN' ) ) 13274578ffSFyiurAmron define( 'DOKU_PLUGIN', DOKU_INC.'lib/plugins/' ); 149d7cf522SOtto Vainiorequire_once(DOKU_PLUGIN.'syntax.php'); 15274578ffSFyiurAmron// 169d7cf522SOtto Vainioclass syntax_plugin_sortablejs extends DokuWiki_Syntax_Plugin { 179d7cf522SOtto Vainio 18274578ffSFyiurAmron function getType() { 19274578ffSFyiurAmron return 'container'; 20274578ffSFyiurAmron } 219d7cf522SOtto Vainio 22274578ffSFyiurAmron function getPType() { 23274578ffSFyiurAmron return 'block'; 24274578ffSFyiurAmron } 25274578ffSFyiurAmron 26274578ffSFyiurAmron function getSort() { 27274578ffSFyiurAmron return 371; 28274578ffSFyiurAmron } 29274578ffSFyiurAmron 30274578ffSFyiurAmron function getAllowedTypes() { 31274578ffSFyiurAmron return array( 'container', 'formatting', 'substition' ); 32274578ffSFyiurAmron } 33274578ffSFyiurAmron 349d7cf522SOtto Vainio function connectTo( $mode ) { 359d7cf522SOtto Vainio $this->Lexer->addEntryPattern( '<sortable[^>]*>(?=.*?</sortable>)', $mode, 'plugin_sortablejs' ); 369d7cf522SOtto Vainio// $this->Lexer->addEntryPattern('\x3Csortable.*?\x3E',$mode,'plugin_sortablejs'); 379d7cf522SOtto Vainio// $this->Lexer->addEntryPattern('<sortable>',$mode,'plugin_sortablejs'); 389d7cf522SOtto Vainio } 39274578ffSFyiurAmron 409d7cf522SOtto Vainio function postConnect() { 419d7cf522SOtto Vainio $this->Lexer->addExitPattern( '</sortable>', 'plugin_sortablejs' ); 429d7cf522SOtto Vainio } 43274578ffSFyiurAmron 44274578ffSFyiurAmron function handle( $match, $state, $pos, Doku_Handler $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 case DOKU_LEXER_UNMATCHED : 569d7cf522SOtto Vainio// return p_render('xhtml',p_get_instructions($match),$info); 579d7cf522SOtto Vainio return array( $state, $match ); 589d7cf522SOtto Vainio case DOKU_LEXER_EXIT : 599d7cf522SOtto Vainio// return "</div>"; 609d7cf522SOtto Vainio return array( $state, "" ); 619d7cf522SOtto Vainio } 629d7cf522SOtto Vainio return array(); 639d7cf522SOtto Vainio } 649d7cf522SOtto Vainio 65274578ffSFyiurAmron function render( $mode, Doku_Renderer $renderer, $data ) { 669d7cf522SOtto Vainio list($state, $match) = $data; 679d7cf522SOtto Vainio if ( $mode == 'xhtml' ) { 689d7cf522SOtto Vainio switch ( $state ) { 699d7cf522SOtto Vainio case DOKU_LEXER_ENTER : 709d7cf522SOtto Vainio $renderer->doc .= "<div class=\"sortable$match\">"; 719d7cf522SOtto Vainio break; 729d7cf522SOtto Vainio case DOKU_LEXER_UNMATCHED : 739d7cf522SOtto Vainio// $dbgr = p_render('xhtml',p_get_instructions($match),$info); 749d7cf522SOtto Vainio// $renderer->doc .= p_render('xhtml',p_get_instructions($match),$info); 759d7cf522SOtto Vainio// $renderer->doc .= $match; 769d7cf522SOtto Vainio// $instructions = array_slice(p_get_instructions($match), 1, -1); 779d7cf522SOtto Vainio $instructions = p_get_instructions( $match ); 789d7cf522SOtto Vainio foreach( $instructions as $instruction ) { 799d7cf522SOtto Vainio call_user_func_array( array( &$renderer, $instruction[0] ), $instruction[1] ); 809d7cf522SOtto Vainio } 819d7cf522SOtto Vainio 829d7cf522SOtto Vainio break; 839d7cf522SOtto Vainio case DOKU_LEXER_EXIT : 849d7cf522SOtto Vainio $renderer->doc .= "</div>"; 859d7cf522SOtto Vainio break; 869d7cf522SOtto Vainio } 879d7cf522SOtto Vainio return true; 889d7cf522SOtto Vainio } else if ( $mode == 'odt' ) { 899d7cf522SOtto Vainio switch ( $state ) { 909d7cf522SOtto Vainio case DOKU_LEXER_ENTER : 919d7cf522SOtto Vainio // In ODT, tables must not be inside a paragraph. Make sure we 929d7cf522SOtto Vainio // closed any opened paragraph 939d7cf522SOtto Vainio $renderer->p_close(); 949d7cf522SOtto Vainio break; 959d7cf522SOtto Vainio case DOKU_LEXER_UNMATCHED : 969d7cf522SOtto Vainio $instructions = array_slice( p_get_instructions( $match ), 1, -1 ); 979d7cf522SOtto Vainio foreach( $instructions as $instruction ) { 989d7cf522SOtto Vainio call_user_func_array( array( &$renderer, $instruction[0] ), $instruction[1] ); 999d7cf522SOtto Vainio } 1009d7cf522SOtto Vainio break; 1019d7cf522SOtto Vainio case DOKU_LEXER_EXIT : 102d61cb45eSLarsDW223 //$renderer->p_open(); 103d61cb45eSLarsDW223 // DO NOT re-open the paragraph, it would cause an error if the table is the last content on a page 1049d7cf522SOtto Vainio break; 1059d7cf522SOtto Vainio } 1069d7cf522SOtto Vainio return true; 1079d7cf522SOtto Vainio } 1089d7cf522SOtto Vainio return false; 1099d7cf522SOtto Vainio } 1109d7cf522SOtto Vainio 1119d7cf522SOtto Vainio function __validateOptions( $opts ) { 11211e1031cSOtto Vainio $oa = explode( " ", $opts ); 1139d7cf522SOtto Vainio $ret = ""; 1149d7cf522SOtto Vainio foreach( $oa as $opt ) { 11511e1031cSOtto Vainio list($c, $v) = explode( "=", $opt ); 1169d7cf522SOtto Vainio if ( $c == "sumrow" ) { 11712db27a4SOtto Vainio $c = $v; 11812db27a4SOtto Vainio $v = "sumrow"; 11912db27a4SOtto Vainio if ( $c == "" ) { 12012db27a4SOtto Vainio $c = "1"; 12112db27a4SOtto Vainio } 12212db27a4SOtto Vainio } else if ( $c == "3phase" ) { 1239d7cf522SOtto Vainio $v = $c; 1249d7cf522SOtto Vainio $c = ""; 1259d7cf522SOtto Vainio } 1269d7cf522SOtto Vainio if ( $v != null ) { 1279d7cf522SOtto Vainio $cmpr = $v; 1289d7cf522SOtto Vainio } else { 1299d7cf522SOtto Vainio if ( preg_match( '/r?\d*/', $c, $matches ) ) { 1309d7cf522SOtto Vainio $cmpr = 'sort'; 1319d7cf522SOtto Vainio } 1329d7cf522SOtto Vainio } 1339d7cf522SOtto Vainio switch ( $cmpr ) { 13412db27a4SOtto Vainio case '3phase': 13512db27a4SOtto Vainio $ret .= " threephase"; 13612db27a4SOtto Vainio break; 1379d7cf522SOtto Vainio case 'nosort': 1389d7cf522SOtto Vainio $ret .= " col_".$c."_nosort"; 1399d7cf522SOtto Vainio break; 1409d7cf522SOtto Vainio case 'numeric': 1419d7cf522SOtto Vainio $ret .= " col_".$c."_numeric"; 1429d7cf522SOtto Vainio break; 143*f55787a9SFyiurAmron case 'date': 144*f55787a9SFyiurAmron $ret .= " col_".$c."_date"; 1459d7cf522SOtto Vainio break; 1469d7cf522SOtto Vainio case 'alpha': 1479d7cf522SOtto Vainio case 'text': 1489d7cf522SOtto Vainio $ret .= " col_".$c."_alpha"; 1499d7cf522SOtto Vainio break; 1509d7cf522SOtto Vainio case 'sort': 15112db27a4SOtto Vainio $ret .= ' sort'.$opt; 1529d7cf522SOtto Vainio break; 1539d7cf522SOtto Vainio case 'sumrow': 15412db27a4SOtto Vainio $ret .= ' sortbottom_'.$c; 15512db27a4SOtto Vainio //$ret = ' sortbottom' . $ret; 1569d7cf522SOtto Vainio break; 1579d7cf522SOtto Vainio } 1589d7cf522SOtto Vainio } 1599d7cf522SOtto Vainio return $ret; 1609d7cf522SOtto Vainio } 1619d7cf522SOtto Vainio} 162