xref: /plugin/sortablejs/syntax.php (revision 274578ffeea535787fddcf6d57c322b9b3890c7d)
19d7cf522SOtto Vainio<?php
29d7cf522SOtto Vainio/**
39d7cf522SOtto Vainio * Sortablejs: Javascript for Sortable table
49d7cf522SOtto Vainio *
59d7cf522SOtto Vainio * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
69d7cf522SOtto Vainio * @author     Otto Vainio
79d7cf522SOtto Vainio * version 1.1 Fixed javascript error in sorttable js
89d7cf522SOtto Vainio * version 2.0 Added <div> to sort any table
99d7cf522SOtto Vainio * version 2.1 Changed script to allow multiple sortable tables in one page
109d7cf522SOtto Vainio * version 2.2 A table can now be sorted by one column by default.
119d7cf522SOtto Vainio * version 2.2a css+js compress broke this script. Now fixed some jslint complains.
129d7cf522SOtto Vainio * version 2.3 Added support for odt plugin. (Aurélien Bompard)
139d7cf522SOtto Vainio * version 2.3a Fixed default sort with aligned text (Andre Rauschenbach)
149d7cf522SOtto Vainio * version 2.4 Added options to set manual override options for column sort. (nosort, numeric, alpha, ddmm, mmdd)
159d7cf522SOtto Vainio * version 2.5 Fixed problems with secionediting, footnotes and edittable
169d7cf522SOtto Vainio * version 2.6 Added support for jQuery and dokuwiki Weatherwax ->
179d7cf522SOtto Vainio * version 2.7 Fixed problem with first row not getting sorted
189d7cf522SOtto Vainio * version 2.8 Fixed problem with first row not getting sorted in default sort. Added option "sumrow" to prevent sum line sort.
1912db27a4SOtto Vainio * version 2.9 fixed problem with header row being sorted in earlier versions of dokuwiki.
20a33dfbaeSOtto Vainio * version 2.10 fixed odt export (LarsGit223)
21e23d2af1SOtto Vainio * version 2.11 Added ip address sort. Thanks Chefkeks
2211e1031cSOtto Vainio * version 2.12 php 7 compatibility. Cahnged split -> explode
23*274578ffSFyiurAmron * @author     Vaxquis
24*274578ffSFyiurAmron * version 2.13 implemented https://github.com/oiv/sortablejs/pull/18/files for PHP 7 compatibility, minor style/pretty print changes
259d7cf522SOtto Vainio */
269d7cf522SOtto Vainio// must be run within Dokuwiki
27*274578ffSFyiurAmronif ( !defined( 'DOKU_INC' ) )
28*274578ffSFyiurAmron    die();
29*274578ffSFyiurAmronif ( !defined( 'DOKU_PLUGIN' ) )
30*274578ffSFyiurAmron    define( 'DOKU_PLUGIN', DOKU_INC.'lib/plugins/' );
319d7cf522SOtto Vainiorequire_once(DOKU_PLUGIN.'syntax.php');
32*274578ffSFyiurAmron//
339d7cf522SOtto Vainioclass syntax_plugin_sortablejs extends DokuWiki_Syntax_Plugin {
349d7cf522SOtto Vainio
35*274578ffSFyiurAmron    function getType() {
36*274578ffSFyiurAmron        return 'container';
37*274578ffSFyiurAmron    }
389d7cf522SOtto Vainio
39*274578ffSFyiurAmron    function getPType() {
40*274578ffSFyiurAmron        return 'block';
41*274578ffSFyiurAmron    }
42*274578ffSFyiurAmron
43*274578ffSFyiurAmron    function getSort() {
44*274578ffSFyiurAmron        return 371;
45*274578ffSFyiurAmron    }
46*274578ffSFyiurAmron
47*274578ffSFyiurAmron    function getAllowedTypes() {
48*274578ffSFyiurAmron        return array( 'container', 'formatting', 'substition' );
49*274578ffSFyiurAmron    }
50*274578ffSFyiurAmron
519d7cf522SOtto Vainio    function connectTo( $mode ) {
529d7cf522SOtto Vainio        $this->Lexer->addEntryPattern( '<sortable[^>]*>(?=.*?</sortable>)', $mode, 'plugin_sortablejs' );
539d7cf522SOtto Vainio//    $this->Lexer->addEntryPattern('\x3Csortable.*?\x3E',$mode,'plugin_sortablejs');
549d7cf522SOtto Vainio//    $this->Lexer->addEntryPattern('<sortable>',$mode,'plugin_sortablejs');
559d7cf522SOtto Vainio    }
56*274578ffSFyiurAmron
579d7cf522SOtto Vainio    function postConnect() {
589d7cf522SOtto Vainio        $this->Lexer->addExitPattern( '</sortable>', 'plugin_sortablejs' );
599d7cf522SOtto Vainio    }
60*274578ffSFyiurAmron
61*274578ffSFyiurAmron    function handle( $match, $state, $pos, Doku_Handler $handler ) {
629d7cf522SOtto Vainio
639d7cf522SOtto Vainio        switch ( $state ) {
649d7cf522SOtto Vainio            case DOKU_LEXER_ENTER :
659d7cf522SOtto Vainio                $match = substr( $match, 9, -1 );
669d7cf522SOtto Vainio                $match = trim( $match );
679d7cf522SOtto Vainio                $scl = "";
689d7cf522SOtto Vainio                if ( strlen( $match ) > 0 ) {
699d7cf522SOtto Vainio                    $scl = $this->__validateOptions( $match );
709d7cf522SOtto Vainio                }
719d7cf522SOtto Vainio                return array( $state, $scl );
729d7cf522SOtto Vainio            case DOKU_LEXER_UNMATCHED :
739d7cf522SOtto Vainio//        return p_render('xhtml',p_get_instructions($match),$info);
749d7cf522SOtto Vainio                return array( $state, $match );
759d7cf522SOtto Vainio            case DOKU_LEXER_EXIT :
769d7cf522SOtto Vainio//        return "</div>";
779d7cf522SOtto Vainio                return array( $state, "" );
789d7cf522SOtto Vainio        }
799d7cf522SOtto Vainio        return array();
809d7cf522SOtto Vainio    }
819d7cf522SOtto Vainio
82*274578ffSFyiurAmron    function render( $mode, Doku_Renderer $renderer, $data ) {
839d7cf522SOtto Vainio        list($state, $match) = $data;
849d7cf522SOtto Vainio        if ( $mode == 'xhtml' ) {
859d7cf522SOtto Vainio            switch ( $state ) {
869d7cf522SOtto Vainio                case DOKU_LEXER_ENTER :
879d7cf522SOtto Vainio                    $renderer->doc .= "<div class=\"sortable$match\">";
889d7cf522SOtto Vainio                    break;
899d7cf522SOtto Vainio                case DOKU_LEXER_UNMATCHED :
909d7cf522SOtto Vainio//          $dbgr = p_render('xhtml',p_get_instructions($match),$info);
919d7cf522SOtto Vainio//          $renderer->doc .= p_render('xhtml',p_get_instructions($match),$info);
929d7cf522SOtto Vainio//          $renderer->doc .= $match;
939d7cf522SOtto Vainio//          $instructions = array_slice(p_get_instructions($match), 1, -1);
949d7cf522SOtto Vainio                    $instructions = p_get_instructions( $match );
959d7cf522SOtto Vainio                    foreach( $instructions as $instruction ) {
969d7cf522SOtto Vainio                        call_user_func_array( array( &$renderer, $instruction[0] ), $instruction[1] );
979d7cf522SOtto Vainio                    }
989d7cf522SOtto Vainio
999d7cf522SOtto Vainio                    break;
1009d7cf522SOtto Vainio                case DOKU_LEXER_EXIT :
1019d7cf522SOtto Vainio                    $renderer->doc .= "</div>";
1029d7cf522SOtto Vainio                    break;
1039d7cf522SOtto Vainio            }
1049d7cf522SOtto Vainio            return true;
1059d7cf522SOtto Vainio        } else if ( $mode == 'odt' ) {
1069d7cf522SOtto Vainio            switch ( $state ) {
1079d7cf522SOtto Vainio                case DOKU_LEXER_ENTER :
1089d7cf522SOtto Vainio                    // In ODT, tables must not be inside a paragraph. Make sure we
1099d7cf522SOtto Vainio                    // closed any opened paragraph
1109d7cf522SOtto Vainio                    $renderer->p_close();
1119d7cf522SOtto Vainio                    break;
1129d7cf522SOtto Vainio                case DOKU_LEXER_UNMATCHED :
1139d7cf522SOtto Vainio                    $instructions = array_slice( p_get_instructions( $match ), 1, -1 );
1149d7cf522SOtto Vainio                    foreach( $instructions as $instruction ) {
1159d7cf522SOtto Vainio                        call_user_func_array( array( &$renderer, $instruction[0] ), $instruction[1] );
1169d7cf522SOtto Vainio                    }
1179d7cf522SOtto Vainio                    break;
1189d7cf522SOtto Vainio                case DOKU_LEXER_EXIT :
119d61cb45eSLarsDW223                    //$renderer->p_open();
120d61cb45eSLarsDW223                    // DO NOT re-open the paragraph, it would cause an error if the table is the last content on a page
1219d7cf522SOtto Vainio                    break;
1229d7cf522SOtto Vainio            }
1239d7cf522SOtto Vainio            return true;
1249d7cf522SOtto Vainio        }
1259d7cf522SOtto Vainio        return false;
1269d7cf522SOtto Vainio    }
1279d7cf522SOtto Vainio
1289d7cf522SOtto Vainio    function __validateOptions( $opts ) {
12911e1031cSOtto Vainio        $oa = explode( " ", $opts );
1309d7cf522SOtto Vainio        $ret = "";
1319d7cf522SOtto Vainio        foreach( $oa as $opt ) {
13211e1031cSOtto Vainio            list($c, $v) = explode( "=", $opt );
1339d7cf522SOtto Vainio            if ( $c == "sumrow" ) {
13412db27a4SOtto Vainio                $c = $v;
13512db27a4SOtto Vainio                $v = "sumrow";
13612db27a4SOtto Vainio                if ( $c == "" ) {
13712db27a4SOtto Vainio                    $c = "1";
13812db27a4SOtto Vainio                }
13912db27a4SOtto Vainio            } else if ( $c == "3phase" ) {
1409d7cf522SOtto Vainio                $v = $c;
1419d7cf522SOtto Vainio                $c = "";
1429d7cf522SOtto Vainio            }
1439d7cf522SOtto Vainio            if ( $v != null ) {
1449d7cf522SOtto Vainio                $cmpr = $v;
1459d7cf522SOtto Vainio            } else {
1469d7cf522SOtto Vainio                if ( preg_match( '/r?\d*/', $c, $matches ) ) {
1479d7cf522SOtto Vainio                    $cmpr = 'sort';
1489d7cf522SOtto Vainio                }
1499d7cf522SOtto Vainio            }
1509d7cf522SOtto Vainio            switch ( $cmpr ) {
15112db27a4SOtto Vainio                case '3phase':
15212db27a4SOtto Vainio                    $ret .= " threephase";
15312db27a4SOtto Vainio                    break;
1549d7cf522SOtto Vainio                case 'nosort':
1559d7cf522SOtto Vainio                    $ret .= " col_".$c."_nosort";
1569d7cf522SOtto Vainio                    break;
1579d7cf522SOtto Vainio                case 'numeric':
1589d7cf522SOtto Vainio                    $ret .= " col_".$c."_numeric";
1599d7cf522SOtto Vainio                    break;
1609d7cf522SOtto Vainio                case 'ddmm':
1619d7cf522SOtto Vainio                    $ret .= " col_".$c."_ddmm";
1629d7cf522SOtto Vainio                    break;
1639d7cf522SOtto Vainio                case 'mmdd':
1649d7cf522SOtto Vainio                    $ret .= " col_".$c."_mmdd";
1659d7cf522SOtto Vainio                    break;
1669d7cf522SOtto Vainio                case 'alpha':
1679d7cf522SOtto Vainio                case 'text':
1689d7cf522SOtto Vainio                    $ret .= " col_".$c."_alpha";
1699d7cf522SOtto Vainio                    break;
1709d7cf522SOtto Vainio                case 'sort':
17112db27a4SOtto Vainio                    $ret .= ' sort'.$opt;
1729d7cf522SOtto Vainio                    break;
1739d7cf522SOtto Vainio                case 'sumrow':
17412db27a4SOtto Vainio                    $ret .= ' sortbottom_'.$c;
17512db27a4SOtto Vainio                    //$ret = ' sortbottom' . $ret;
1769d7cf522SOtto Vainio                    break;
1779d7cf522SOtto Vainio            }
1789d7cf522SOtto Vainio        }
1799d7cf522SOtto Vainio        return $ret;
1809d7cf522SOtto Vainio    }
1819d7cf522SOtto Vainio}
182