xref: /plugin/sortablejs/syntax.php (revision 9d7cf522d7fd0dbc29b7ffcd0ef9444c5aa2e61a)
1*9d7cf522SOtto Vainio<?php
2*9d7cf522SOtto Vainio/**
3*9d7cf522SOtto Vainio * Sortablejs: Javascript for Sortable table
4*9d7cf522SOtto Vainio *
5*9d7cf522SOtto Vainio * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
6*9d7cf522SOtto Vainio * @author     Otto Vainio
7*9d7cf522SOtto Vainio * version 1.1 Fixed javascript error in sorttable js
8*9d7cf522SOtto Vainio * version 2.0 Added <div> to sort any table
9*9d7cf522SOtto Vainio * version 2.1 Changed script to allow multiple sortable tables in one page
10*9d7cf522SOtto Vainio * version 2.2 A table can now be sorted by one column by default.
11*9d7cf522SOtto Vainio * version 2.2a css+js compress broke this script. Now fixed some jslint complains.
12*9d7cf522SOtto Vainio * version 2.3 Added support for odt plugin. (Aurélien Bompard)
13*9d7cf522SOtto Vainio * version 2.3a Fixed default sort with aligned text (Andre Rauschenbach)
14*9d7cf522SOtto Vainio * version 2.4 Added options to set manual override options for column sort. (nosort, numeric, alpha, ddmm, mmdd)
15*9d7cf522SOtto Vainio * version 2.5 Fixed problems with secionediting, footnotes and edittable
16*9d7cf522SOtto Vainio * version 2.6 Added support for jQuery and dokuwiki Weatherwax ->
17*9d7cf522SOtto Vainio * version 2.7 Fixed problem with first row not getting sorted
18*9d7cf522SOtto Vainio * version 2.8 Fixed problem with first row not getting sorted in default sort. Added option "sumrow" to prevent sum line sort.
19*9d7cf522SOtto Vainio */
20*9d7cf522SOtto Vainio// must be run within Dokuwiki
21*9d7cf522SOtto Vainioif (!defined('DOKU_INC')) die();
22*9d7cf522SOtto Vainioif (!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN', DOKU_INC.'lib/plugins/');
23*9d7cf522SOtto Vainiorequire_once(DOKU_PLUGIN.'syntax.php');
24*9d7cf522SOtto Vainio
25*9d7cf522SOtto Vainioclass syntax_plugin_sortablejs extends DokuWiki_Syntax_Plugin {
26*9d7cf522SOtto Vainio
27*9d7cf522SOtto Vainio
28*9d7cf522SOtto Vainio  function getType() { return 'container';}
29*9d7cf522SOtto Vainio  function getPType(){ return 'block';}
30*9d7cf522SOtto Vainio  function getSort() { return 371; }
31*9d7cf522SOtto Vainio  function getAllowedTypes() {return array('container','formatting','substition');}
32*9d7cf522SOtto Vainio	function connectTo($mode) {
33*9d7cf522SOtto Vainio    $this->Lexer->addEntryPattern('<sortable[^>]*>(?=.*?</sortable>)',$mode,'plugin_sortablejs');
34*9d7cf522SOtto Vainio//    $this->Lexer->addEntryPattern('\x3Csortable.*?\x3E',$mode,'plugin_sortablejs');
35*9d7cf522SOtto Vainio//    $this->Lexer->addEntryPattern('<sortable>',$mode,'plugin_sortablejs');
36*9d7cf522SOtto Vainio  }
37*9d7cf522SOtto Vainio  function postConnect() {
38*9d7cf522SOtto Vainio    $this->Lexer->addExitPattern('</sortable>','plugin_sortablejs');
39*9d7cf522SOtto Vainio  }
40*9d7cf522SOtto Vainio  function handle($match, $state, $pos, &$handler){
41*9d7cf522SOtto Vainio
42*9d7cf522SOtto Vainio    switch ($state) {
43*9d7cf522SOtto Vainio      case DOKU_LEXER_ENTER :
44*9d7cf522SOtto Vainio        $match = substr($match,9,-1);
45*9d7cf522SOtto Vainio        $match=trim($match);
46*9d7cf522SOtto Vainio        $scl="";
47*9d7cf522SOtto Vainio        if (strlen($match)>0) {
48*9d7cf522SOtto Vainio          $scl=$this->__validateOptions($match);
49*9d7cf522SOtto Vainio        }
50*9d7cf522SOtto Vainio        return array($state, $scl);
51*9d7cf522SOtto Vainio        break;
52*9d7cf522SOtto Vainio      case DOKU_LEXER_UNMATCHED :
53*9d7cf522SOtto Vainio//        return p_render('xhtml',p_get_instructions($match),$info);
54*9d7cf522SOtto Vainio        return array($state, $match);
55*9d7cf522SOtto Vainio        break;
56*9d7cf522SOtto Vainio      case DOKU_LEXER_EXIT :
57*9d7cf522SOtto Vainio//        return "</div>";
58*9d7cf522SOtto Vainio        return array($state, "");
59*9d7cf522SOtto Vainio        break;
60*9d7cf522SOtto Vainio    }
61*9d7cf522SOtto Vainio    return array();
62*9d7cf522SOtto Vainio  }
63*9d7cf522SOtto Vainio
64*9d7cf522SOtto Vainio  function render($mode, &$renderer, $data) {
65*9d7cf522SOtto Vainio    list($state,$match) = $data;
66*9d7cf522SOtto Vainio    if ($mode == 'xhtml'){
67*9d7cf522SOtto Vainio      switch ($state) {
68*9d7cf522SOtto Vainio        case DOKU_LEXER_ENTER :
69*9d7cf522SOtto Vainio          $renderer->doc .= "<div class=\"sortable$match\">";
70*9d7cf522SOtto Vainio          break;
71*9d7cf522SOtto Vainio        case DOKU_LEXER_UNMATCHED :
72*9d7cf522SOtto Vainio//          $dbgr = p_render('xhtml',p_get_instructions($match),$info);
73*9d7cf522SOtto Vainio//          $renderer->doc .= p_render('xhtml',p_get_instructions($match),$info);
74*9d7cf522SOtto Vainio//          $renderer->doc .= $match;
75*9d7cf522SOtto Vainio//          $instructions = array_slice(p_get_instructions($match), 1, -1);
76*9d7cf522SOtto Vainio          $instructions = p_get_instructions($match);
77*9d7cf522SOtto Vainio          foreach ($instructions as $instruction) {
78*9d7cf522SOtto Vainio            call_user_func_array(array(&$renderer, $instruction[0]),$instruction[1]);
79*9d7cf522SOtto Vainio          }
80*9d7cf522SOtto Vainio
81*9d7cf522SOtto Vainio          break;
82*9d7cf522SOtto Vainio        case DOKU_LEXER_EXIT :
83*9d7cf522SOtto Vainio          $renderer->doc .=  "</div>";
84*9d7cf522SOtto Vainio          break;
85*9d7cf522SOtto Vainio      }
86*9d7cf522SOtto Vainio      return true;
87*9d7cf522SOtto Vainio    } else if($mode == 'odt'){
88*9d7cf522SOtto Vainio      switch ($state) {
89*9d7cf522SOtto Vainio        case DOKU_LEXER_ENTER :
90*9d7cf522SOtto Vainio          // In ODT, tables must not be inside a paragraph. Make sure we
91*9d7cf522SOtto Vainio          // closed any opened paragraph
92*9d7cf522SOtto Vainio          $renderer->p_close();
93*9d7cf522SOtto Vainio          break;
94*9d7cf522SOtto Vainio        case DOKU_LEXER_UNMATCHED :
95*9d7cf522SOtto Vainio          $instructions = array_slice(p_get_instructions($match), 1, -1);
96*9d7cf522SOtto Vainio          foreach ($instructions as $instruction) {
97*9d7cf522SOtto Vainio            call_user_func_array(array(&$renderer, $instruction[0]),$instruction[1]);
98*9d7cf522SOtto Vainio          }
99*9d7cf522SOtto Vainio          break;
100*9d7cf522SOtto Vainio        case DOKU_LEXER_EXIT :
101*9d7cf522SOtto Vainio          $renderer->p_open(); // re-open the paragraph
102*9d7cf522SOtto Vainio          break;
103*9d7cf522SOtto Vainio      }
104*9d7cf522SOtto Vainio      return true;
105*9d7cf522SOtto Vainio    }
106*9d7cf522SOtto Vainio    return false;
107*9d7cf522SOtto Vainio  }
108*9d7cf522SOtto Vainio
109*9d7cf522SOtto Vainio  function __validateOptions($opts) {
110*9d7cf522SOtto Vainio    $oa = split(" ", $opts);
111*9d7cf522SOtto Vainio    $ret = "";
112*9d7cf522SOtto Vainio    foreach($oa as $opt) {
113*9d7cf522SOtto Vainio      list($c,$v) = split("=",$opt);
114*9d7cf522SOtto Vainio      if ($c=="sumrow") {
115*9d7cf522SOtto Vainio        $v=$c;
116*9d7cf522SOtto Vainio        $c="";
117*9d7cf522SOtto Vainio      }
118*9d7cf522SOtto Vainio      if ($v!=null) {
119*9d7cf522SOtto Vainio        $cmpr=$v;
120*9d7cf522SOtto Vainio      } else {
121*9d7cf522SOtto Vainio        if (preg_match('/r?\d*/', $c, $matches)) {
122*9d7cf522SOtto Vainio          $cmpr='sort';
123*9d7cf522SOtto Vainio        }
124*9d7cf522SOtto Vainio      }
125*9d7cf522SOtto Vainio      switch ($cmpr) {
126*9d7cf522SOtto Vainio        case 'nosort':
127*9d7cf522SOtto Vainio            $ret .= " col_" . $c . "_nosort";
128*9d7cf522SOtto Vainio            break;
129*9d7cf522SOtto Vainio        case 'numeric':
130*9d7cf522SOtto Vainio            $ret .= " col_" . $c . "_numeric";
131*9d7cf522SOtto Vainio            break;
132*9d7cf522SOtto Vainio        case 'ddmm':
133*9d7cf522SOtto Vainio            $ret .= " col_" . $c . "_ddmm";
134*9d7cf522SOtto Vainio            break;
135*9d7cf522SOtto Vainio        case 'mmdd':
136*9d7cf522SOtto Vainio            $ret .= " col_" . $c . "_mmdd";
137*9d7cf522SOtto Vainio            break;
138*9d7cf522SOtto Vainio        case 'alpha':
139*9d7cf522SOtto Vainio        case 'text':
140*9d7cf522SOtto Vainio            $ret .= " col_" . $c . "_alpha";
141*9d7cf522SOtto Vainio            break;
142*9d7cf522SOtto Vainio        case 'sort':
143*9d7cf522SOtto Vainio            $ret = ' sort' . $opt . $ret;
144*9d7cf522SOtto Vainio            break;
145*9d7cf522SOtto Vainio        case 'sumrow':
146*9d7cf522SOtto Vainio            $ret = ' sortbottom' . $c . $ret;
147*9d7cf522SOtto Vainio            break;
148*9d7cf522SOtto Vainio      }
149*9d7cf522SOtto Vainio    }
150*9d7cf522SOtto Vainio    return $ret;
151*9d7cf522SOtto Vainio  }
152*9d7cf522SOtto Vainio
153*9d7cf522SOtto Vainio}
154*9d7cf522SOtto Vainio?>
155