Files
dokuwiki-plugins/lib/plugins/sortablejs/syntax.php

162 lines
5.5 KiB
PHP
Raw Normal View History

2025-10-09 15:04:29 +11:00
<?php
/**
based on code from http://www.kryogenix.org/code/browser/sorttable/ by Stuart Langridge
(distributed under the condisions of MIT licence from http://www.kryogenix.org/code/browser/licence.html)
see
2007-2016 by oiv (Otto Vainio at otto@valjakko.net)
2016-? by vaxquis AKA FyiurAmron (spamove@gmail.com)
*/
// 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( '<sortable[^>]*>(?=.*?</sortable>)', $mode, 'plugin_sortablejs' );
// $this->Lexer->addEntryPattern('\x3Csortable.*?\x3E',$mode,'plugin_sortablejs');
// $this->Lexer->addEntryPattern('<sortable>',$mode,'plugin_sortablejs');
}
function postConnect() {
$this->Lexer->addExitPattern( '</sortable>', '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 "</div>";
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 .= "<div class=\"sortable$match\">";
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 .= "</div>";
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 'date':
$ret .= " col_".$c."_date";
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;
}
}