xref: /plugin/sortablejs/syntax.php (revision fa94c836fb4e3d67d4af69947ac1efe81364eb3d)
19d7cf522SOtto Vainio<?php
29d7cf522SOtto Vainio/**
3400ff5a2SFyiurAmron Based on code from http://www.kryogenix.org/code/browser/sorttable/ by Stuart Langridge
4400ff5a2SFyiurAmron (distributed under the conditions of MIT licence from http://www.kryogenix.org/code/browser/licence.html).
5400ff5a2SFyiurAmron Includes open-source contributions from other people
6400ff5a2SFyiurAmron (see https://github.com/FyiurAmron/sortablejs/graphs/contributors for more details).
7400ff5a2SFyiurAmron Maintainers:
8400ff5a2SFyiurAmron 2007-2016 oiv (Otto Vainio at otto@valjakko.net)
9400ff5a2SFyiurAmron 2016-? vaxquis AKA FyiurAmron (spamove@gmail.com)
109d7cf522SOtto Vainio */
1164ffdda7SFyiurAmron
129d7cf522SOtto Vainio// must be run within Dokuwiki
13274578ffSFyiurAmronif ( !defined( 'DOKU_INC' ) )
14274578ffSFyiurAmron    die();
15274578ffSFyiurAmronif ( !defined( 'DOKU_PLUGIN' ) )
16274578ffSFyiurAmron    define( 'DOKU_PLUGIN', DOKU_INC.'lib/plugins/' );
179d7cf522SOtto Vainiorequire_once(DOKU_PLUGIN.'syntax.php');
18274578ffSFyiurAmron//
199d7cf522SOtto Vainioclass syntax_plugin_sortablejs extends DokuWiki_Syntax_Plugin {
209d7cf522SOtto Vainio
21274578ffSFyiurAmron    function getType() {
22274578ffSFyiurAmron        return 'container';
23274578ffSFyiurAmron    }
249d7cf522SOtto Vainio
25274578ffSFyiurAmron    function getPType() {
26274578ffSFyiurAmron        return 'block';
27274578ffSFyiurAmron    }
28274578ffSFyiurAmron
29274578ffSFyiurAmron    function getSort() {
30274578ffSFyiurAmron        return 371;
31274578ffSFyiurAmron    }
32274578ffSFyiurAmron
33274578ffSFyiurAmron    function getAllowedTypes() {
34274578ffSFyiurAmron        return array( 'container', 'formatting', 'substition' );
35274578ffSFyiurAmron    }
36274578ffSFyiurAmron
379d7cf522SOtto Vainio    function connectTo( $mode ) {
389d7cf522SOtto Vainio        $this->Lexer->addEntryPattern( '<sortable[^>]*>(?=.*?</sortable>)', $mode, 'plugin_sortablejs' );
399d7cf522SOtto Vainio    }
40274578ffSFyiurAmron
419d7cf522SOtto Vainio    function postConnect() {
429d7cf522SOtto Vainio        $this->Lexer->addExitPattern( '</sortable>', 'plugin_sortablejs' );
439d7cf522SOtto Vainio    }
44274578ffSFyiurAmron
45274578ffSFyiurAmron    function handle( $match, $state, $pos, Doku_Handler $handler ) {
469d7cf522SOtto Vainio
479d7cf522SOtto Vainio        switch ( $state ) {
489d7cf522SOtto Vainio            case DOKU_LEXER_ENTER :
499d7cf522SOtto Vainio                $match = substr( $match, 9, -1 );
509d7cf522SOtto Vainio                $match = trim( $match );
519d7cf522SOtto Vainio                $scl = "";
529d7cf522SOtto Vainio                if ( strlen( $match ) > 0 ) {
539d7cf522SOtto Vainio                    $scl = $this->__validateOptions( $match );
549d7cf522SOtto Vainio                }
559d7cf522SOtto Vainio                return array( $state, $scl );
569d7cf522SOtto Vainio            case DOKU_LEXER_UNMATCHED :
579d7cf522SOtto Vainio                return array( $state, $match );
589d7cf522SOtto Vainio            case DOKU_LEXER_EXIT :
599d7cf522SOtto Vainio                return array( $state, "" );
609d7cf522SOtto Vainio        }
619d7cf522SOtto Vainio        return array();
629d7cf522SOtto Vainio    }
639d7cf522SOtto Vainio
64274578ffSFyiurAmron    function render( $mode, Doku_Renderer $renderer, $data ) {
659d7cf522SOtto Vainio        list($state, $match) = $data;
669d7cf522SOtto Vainio        if ( $mode == 'xhtml' ) {
679d7cf522SOtto Vainio            switch ( $state ) {
689d7cf522SOtto Vainio                case DOKU_LEXER_ENTER :
699d7cf522SOtto Vainio                    $renderer->doc .= "<div class=\"sortable$match\">";
709d7cf522SOtto Vainio                    break;
719d7cf522SOtto Vainio                case DOKU_LEXER_UNMATCHED :
729d7cf522SOtto Vainio                    $instructions = p_get_instructions( $match );
739d7cf522SOtto Vainio                    foreach( $instructions as $instruction ) {
749d7cf522SOtto Vainio                        call_user_func_array( array( &$renderer, $instruction[0] ), $instruction[1] );
759d7cf522SOtto Vainio                    }
769d7cf522SOtto Vainio
779d7cf522SOtto Vainio                    break;
789d7cf522SOtto Vainio                case DOKU_LEXER_EXIT :
799d7cf522SOtto Vainio                    $renderer->doc .= "</div>";
809d7cf522SOtto Vainio                    break;
819d7cf522SOtto Vainio            }
829d7cf522SOtto Vainio            return true;
839d7cf522SOtto Vainio        } else if ( $mode == 'odt' ) {
849d7cf522SOtto Vainio            switch ( $state ) {
859d7cf522SOtto Vainio                case DOKU_LEXER_ENTER :
869d7cf522SOtto Vainio                    // In ODT, tables must not be inside a paragraph. Make sure we
879d7cf522SOtto Vainio                    // closed any opened paragraph
889d7cf522SOtto Vainio                    $renderer->p_close();
899d7cf522SOtto Vainio                    break;
909d7cf522SOtto Vainio                case DOKU_LEXER_UNMATCHED :
919d7cf522SOtto Vainio                    $instructions = array_slice( p_get_instructions( $match ), 1, -1 );
929d7cf522SOtto Vainio                    foreach( $instructions as $instruction ) {
939d7cf522SOtto Vainio                        call_user_func_array( array( &$renderer, $instruction[0] ), $instruction[1] );
949d7cf522SOtto Vainio                    }
959d7cf522SOtto Vainio                    break;
969d7cf522SOtto Vainio                case DOKU_LEXER_EXIT :
97d61cb45eSLarsDW223                    //$renderer->p_open();
98d61cb45eSLarsDW223                    // DO NOT re-open the paragraph, it would cause an error if the table is the last content on a page
999d7cf522SOtto Vainio                    break;
1009d7cf522SOtto Vainio            }
1019d7cf522SOtto Vainio            return true;
1029d7cf522SOtto Vainio        }
1039d7cf522SOtto Vainio        return false;
1049d7cf522SOtto Vainio    }
1059d7cf522SOtto Vainio
1069d7cf522SOtto Vainio    function __validateOptions( $opts ) {
107*fa94c836SFyiurAmron        if ( empty( $opts ) ) {
108*fa94c836SFyiurAmron        	return "";
109*fa94c836SFyiurAmron        }
1109d7cf522SOtto Vainio        $ret = "";
111*fa94c836SFyiurAmron        $oa = explode( " ", $opts );
1129d7cf522SOtto Vainio        foreach( $oa as $opt ) {
113*fa94c836SFyiurAmron            $explodedOption = explode( "=", $opt );
114*fa94c836SFyiurAmron            $c = $explodedOption[0];
115*fa94c836SFyiurAmron            $v = $explodedOption[1] ?? null;
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;
143f55787a9SFyiurAmron                case 'date':
144f55787a9SFyiurAmron                    $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;
1559d7cf522SOtto Vainio                    break;
1569d7cf522SOtto Vainio            }
1579d7cf522SOtto Vainio        }
1589d7cf522SOtto Vainio        return $ret;
1599d7cf522SOtto Vainio    }
1609d7cf522SOtto Vainio}
161