xref: /plugin/sortablejs/syntax.php (revision 11e1031cee63225d5d8c9cd7fdfa89a2decbf97a)
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
22*11e1031cSOtto Vainio * version 2.12 php 7 compatibility. Cahnged split -> explode
239d7cf522SOtto Vainio */
249d7cf522SOtto Vainio// must be run within Dokuwiki
259d7cf522SOtto Vainioif (!defined('DOKU_INC')) die();
269d7cf522SOtto Vainioif (!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN', DOKU_INC.'lib/plugins/');
279d7cf522SOtto Vainiorequire_once(DOKU_PLUGIN.'syntax.php');
289d7cf522SOtto Vainio
299d7cf522SOtto Vainioclass syntax_plugin_sortablejs extends DokuWiki_Syntax_Plugin {
309d7cf522SOtto Vainio
319d7cf522SOtto Vainio
329d7cf522SOtto Vainio  function getType() { return 'container';}
339d7cf522SOtto Vainio  function getPType(){ return 'block';}
349d7cf522SOtto Vainio  function getSort() { return 371; }
359d7cf522SOtto Vainio  function getAllowedTypes() {return array('container','formatting','substition');}
369d7cf522SOtto Vainio	function connectTo($mode) {
379d7cf522SOtto Vainio    $this->Lexer->addEntryPattern('<sortable[^>]*>(?=.*?</sortable>)',$mode,'plugin_sortablejs');
389d7cf522SOtto Vainio//    $this->Lexer->addEntryPattern('\x3Csortable.*?\x3E',$mode,'plugin_sortablejs');
399d7cf522SOtto Vainio//    $this->Lexer->addEntryPattern('<sortable>',$mode,'plugin_sortablejs');
409d7cf522SOtto Vainio  }
419d7cf522SOtto Vainio  function postConnect() {
429d7cf522SOtto Vainio    $this->Lexer->addExitPattern('</sortable>','plugin_sortablejs');
439d7cf522SOtto Vainio  }
449d7cf522SOtto Vainio  function handle($match, $state, $pos, &$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        break;
569d7cf522SOtto Vainio      case DOKU_LEXER_UNMATCHED :
579d7cf522SOtto Vainio//        return p_render('xhtml',p_get_instructions($match),$info);
589d7cf522SOtto Vainio        return array($state, $match);
599d7cf522SOtto Vainio        break;
609d7cf522SOtto Vainio      case DOKU_LEXER_EXIT :
619d7cf522SOtto Vainio//        return "</div>";
629d7cf522SOtto Vainio        return array($state, "");
639d7cf522SOtto Vainio        break;
649d7cf522SOtto Vainio    }
659d7cf522SOtto Vainio    return array();
669d7cf522SOtto Vainio  }
679d7cf522SOtto Vainio
689d7cf522SOtto Vainio  function render($mode, &$renderer, $data) {
699d7cf522SOtto Vainio    list($state,$match) = $data;
709d7cf522SOtto Vainio    if ($mode == 'xhtml'){
719d7cf522SOtto Vainio      switch ($state) {
729d7cf522SOtto Vainio        case DOKU_LEXER_ENTER :
739d7cf522SOtto Vainio          $renderer->doc .= "<div class=\"sortable$match\">";
749d7cf522SOtto Vainio          break;
759d7cf522SOtto Vainio        case DOKU_LEXER_UNMATCHED :
769d7cf522SOtto Vainio//          $dbgr = p_render('xhtml',p_get_instructions($match),$info);
779d7cf522SOtto Vainio//          $renderer->doc .= p_render('xhtml',p_get_instructions($match),$info);
789d7cf522SOtto Vainio//          $renderer->doc .= $match;
799d7cf522SOtto Vainio//          $instructions = array_slice(p_get_instructions($match), 1, -1);
809d7cf522SOtto Vainio          $instructions = p_get_instructions($match);
819d7cf522SOtto Vainio          foreach ($instructions as $instruction) {
829d7cf522SOtto Vainio            call_user_func_array(array(&$renderer, $instruction[0]),$instruction[1]);
839d7cf522SOtto Vainio          }
849d7cf522SOtto Vainio
859d7cf522SOtto Vainio          break;
869d7cf522SOtto Vainio        case DOKU_LEXER_EXIT :
879d7cf522SOtto Vainio          $renderer->doc .=  "</div>";
889d7cf522SOtto Vainio          break;
899d7cf522SOtto Vainio      }
909d7cf522SOtto Vainio      return true;
919d7cf522SOtto Vainio    } else if($mode == 'odt'){
929d7cf522SOtto Vainio      switch ($state) {
939d7cf522SOtto Vainio        case DOKU_LEXER_ENTER :
949d7cf522SOtto Vainio          // In ODT, tables must not be inside a paragraph. Make sure we
959d7cf522SOtto Vainio          // closed any opened paragraph
969d7cf522SOtto Vainio          $renderer->p_close();
979d7cf522SOtto Vainio          break;
989d7cf522SOtto Vainio        case DOKU_LEXER_UNMATCHED :
999d7cf522SOtto Vainio          $instructions = array_slice(p_get_instructions($match), 1, -1);
1009d7cf522SOtto Vainio          foreach ($instructions as $instruction) {
1019d7cf522SOtto Vainio            call_user_func_array(array(&$renderer, $instruction[0]),$instruction[1]);
1029d7cf522SOtto Vainio          }
1039d7cf522SOtto Vainio          break;
1049d7cf522SOtto Vainio        case DOKU_LEXER_EXIT :
105d61cb45eSLarsDW223          //$renderer->p_open();
106d61cb45eSLarsDW223          // DO NOT re-open the paragraph, it would cause an error if the table is the last content on a page
1079d7cf522SOtto Vainio          break;
1089d7cf522SOtto Vainio      }
1099d7cf522SOtto Vainio      return true;
1109d7cf522SOtto Vainio    }
1119d7cf522SOtto Vainio    return false;
1129d7cf522SOtto Vainio  }
1139d7cf522SOtto Vainio
1149d7cf522SOtto Vainio  function __validateOptions($opts) {
115*11e1031cSOtto Vainio    $oa = explode(" ", $opts);
1169d7cf522SOtto Vainio    $ret = "";
1179d7cf522SOtto Vainio    foreach($oa as $opt) {
118*11e1031cSOtto Vainio      list($c,$v) = explode("=",$opt);
1199d7cf522SOtto Vainio      if ($c=="sumrow") {
12012db27a4SOtto Vainio        $c=$v;
12112db27a4SOtto Vainio        $v="sumrow";
12212db27a4SOtto Vainio        if ($c=="") {
12312db27a4SOtto Vainio          $c="1";
12412db27a4SOtto Vainio        }
12512db27a4SOtto Vainio      } else if ($c=="3phase") {
1269d7cf522SOtto Vainio        $v=$c;
1279d7cf522SOtto Vainio        $c="";
1289d7cf522SOtto Vainio      }
1299d7cf522SOtto Vainio      if ($v!=null) {
1309d7cf522SOtto Vainio        $cmpr=$v;
1319d7cf522SOtto Vainio      } else {
1329d7cf522SOtto Vainio        if (preg_match('/r?\d*/', $c, $matches)) {
1339d7cf522SOtto Vainio          $cmpr='sort';
1349d7cf522SOtto Vainio        }
1359d7cf522SOtto Vainio      }
1369d7cf522SOtto Vainio      switch ($cmpr) {
13712db27a4SOtto Vainio        case '3phase':
13812db27a4SOtto Vainio            $ret .= " threephase";
13912db27a4SOtto Vainio            break;
1409d7cf522SOtto Vainio        case 'nosort':
1419d7cf522SOtto Vainio            $ret .= " col_" . $c . "_nosort";
1429d7cf522SOtto Vainio            break;
1439d7cf522SOtto Vainio        case 'numeric':
1449d7cf522SOtto Vainio            $ret .= " col_" . $c . "_numeric";
1459d7cf522SOtto Vainio            break;
1469d7cf522SOtto Vainio        case 'ddmm':
1479d7cf522SOtto Vainio            $ret .= " col_" . $c . "_ddmm";
1489d7cf522SOtto Vainio            break;
1499d7cf522SOtto Vainio        case 'mmdd':
1509d7cf522SOtto Vainio            $ret .= " col_" . $c . "_mmdd";
1519d7cf522SOtto Vainio            break;
1529d7cf522SOtto Vainio        case 'alpha':
1539d7cf522SOtto Vainio        case 'text':
1549d7cf522SOtto Vainio            $ret .= " col_" . $c . "_alpha";
1559d7cf522SOtto Vainio            break;
1569d7cf522SOtto Vainio        case 'sort':
15712db27a4SOtto Vainio            $ret .= ' sort' . $opt;
1589d7cf522SOtto Vainio            break;
1599d7cf522SOtto Vainio        case 'sumrow':
16012db27a4SOtto Vainio            $ret .= ' sortbottom_' . $c;
16112db27a4SOtto Vainio            //$ret = ' sortbottom' . $ret;
1629d7cf522SOtto Vainio            break;
1639d7cf522SOtto Vainio      }
1649d7cf522SOtto Vainio    }
1659d7cf522SOtto Vainio    return $ret;
1669d7cf522SOtto Vainio  }
1679d7cf522SOtto Vainio
1689d7cf522SOtto Vainio}
1699d7cf522SOtto Vainio?>
170