1<?php
2/**
3 * DataTables Action Plugin
4 *
5 * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
6 * @author     Giuseppe Di Terlizzi <giuseppe.diterlizzi@gmail.com>
7 * @copyright  (C) 2015-2020, Giuseppe Di Terlizzi
8 */
9
10// must be run within Dokuwiki
11if (!defined('DOKU_INC')) {
12    die();
13}
14
15/**
16 * Class DataTables Plugin
17 *
18 * Add DataTables support to DokuWiki
19 */
20class action_plugin_datatables extends DokuWiki_Action_Plugin
21{
22
23    public $i18n = array(
24        'da'          => 'Danish',
25        'fr'          => 'French',
26        'nl'          => 'Dutch',
27        'hi'          => 'Hindi',
28        'fo'          => 'Faroese',
29        'el'          => 'Greek',
30        'bg'          => 'Bulgarian',
31        'pt-br'       => 'Brazilian',
32        'ml'          => 'Malayalam',
33        'cs'          => 'Czech',
34        'hu'          => 'Hungarian',
35        'sk'          => 'Slovak',
36        'fi'          => 'Finnish',
37        'de'          => 'German',
38        'ja'          => 'Japanese',
39        'lt'          => 'Lithuanian',
40        'km'          => 'Khmer',
41        'no'          => 'Norwegian',
42        'sl'          => 'Slovenian',
43        'ru'          => 'Russian',
44        'lb'          => 'Luxembourgish',
45        'pl'          => 'Polish',
46        'af'          => 'Afrikaans',
47        'th'          => 'Thai',
48        'eo'          => 'Esperanto',
49        'ka'          => 'Georgian',
50        'et'          => 'Estonian',
51        'it'          => 'Italian',
52        'is'          => 'Icelandic',
53        'ro'          => 'Romanian',
54        'ta'          => 'Tamil',
55        'ms'          => 'Malaysian',
56        'az'          => 'Azerbaijani',
57        'vi'          => 'Vietnamese',
58        'lv'          => 'Latvian',
59        'uk'          => 'Ukrainian',
60        'cy'          => 'Welsh/UK',
61        'id'          => 'Indonesian',
62        'kk'          => 'Kazakh',
63        'sv'          => 'Swedish',
64        'de-informal' => 'German',
65        'he'          => 'Hebrew',
66        'zh-tw'       => 'Chinese',
67        'zh'          => 'Chinese',
68        'pt'          => 'Portuguese',
69        'ko'          => 'Korean',
70        'tr'          => 'Turkish',
71        'sq'          => 'Albanian',
72    );
73
74    /**
75     * Register events
76     *
77     * @param  Doku_Event_Handler  $controller
78     */
79    public function register(Doku_Event_Handler $controller)
80    {
81        $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'datatables');
82        $controller->register_hook('DOKUWIKI_STARTED', 'AFTER', $this, 'jsinfo');
83    }
84
85    public function jsinfo(Doku_Event &$event, $param)
86    {
87
88        global $JSINFO;
89        global $conf;
90
91        $datatables_config = array();
92
93        // DataTables global configuration
94        $datatables_config['config'] = array();
95
96        // Plugin configuration
97        $datatables_config['enableForAllTables'] = $this->getConf('enableForAllTables');
98
99        $asset_path = dirname(__FILE__) . '/assets/datatables.net-plugins/i18n';
100
101        $datatables_lang = sprintf('%s/%s.lang', $asset_path, $this->i18n[$conf['lang']]);
102
103        if (file_exists($datatables_lang)) {
104            $datatables_config['config']['language'] = json_decode(
105                preg_replace("#(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|([\s\t]//.*)|(^//.*)#", '',
106                    file_get_contents($datatables_lang)));
107        }
108
109        $JSINFO['plugin']['datatables'] = $datatables_config;
110
111    }
112
113    /**
114     * Add DataTables scripts and styles
115     *
116     * @param  Doku_Event  &$event
117     */
118    public function datatables(Doku_Event &$event, $param)
119    {
120
121        global $ID;
122        global $conf;
123        global $JSINFO;
124
125        $excluded_pages = $this->getConf('excludedPages');
126
127        if (!empty($excluded_pages) && (bool) preg_match("/$excluded_pages/", $ID)) {
128            return false;
129        }
130
131        $base_url = DOKU_BASE . 'lib/plugins/datatables/assets';
132
133        $dt_scripts[] = "$base_url/datatables.net/js/jquery.dataTables.min.js";
134
135        $dt_scripts[] = "$base_url/datatables.net-fixedheader-dt/js/fixedHeader.dataTables.min.js";
136        $dt_styles[]  = "$base_url/datatables.net-fixedheader-dt/css/fixedHeader.dataTables.min.css";
137
138        $dt_scripts[] = "$base_url/datatables.net-fixedcolumns-dt/js/fixedColumns.dataTables.min.js";
139        $dt_styles[]  = "$base_url/datatables.net-fixedcolumns-dt/css/fixedColumns.dataTables.min.css";
140
141        $dt_scripts[] = "$base_url/datatables.net-buttons/js/dataTables.buttons.min.js";
142        $dt_scripts[] = "$base_url/datatables.net-buttons/js/buttons.html5.min.js";
143        $dt_scripts[] = "$base_url/datatables.net-buttons/js/buttons.print.min.js";
144
145        $dt_scripts[] = "$base_url/jszip/dist/jszip.min.js";
146        $dt_scripts[] = "$base_url/pdfmake/build/pdfmake.min.js";
147        $dt_scripts[] = "$base_url/pdfmake/build/vfs_fonts.js";
148
149        switch ($conf['template']) {
150
151            case 'bootstrap3':
152
153                $dt_scripts[] = "$base_url/datatables.net-bs/js/dataTables.bootstrap.min.js";
154                $dt_styles[]  = "$base_url/datatables.net-bs/css/dataTables.bootstrap.min.css";
155
156                //$dt_scripts[] = "$base_url/datatables.net-responsive-bs/js/responsive.bootstrap.min.js";
157                //$dt_syles[] = "$base_url/datatables.net-responsive-bs/css/responsive.bootstrap.min.css";
158
159                $dt_scripts[] = "$base_url/datatables.net-buttons-bs/js/buttons.bootstrap.min.js";
160                $dt_styes[]   = "$base_url/datatables.net-buttons-bs/css/buttons.bootstrap.min.css";
161
162                break;
163
164            default:
165                //$dt_scripts[] = "$base_url/datatables.net-responsive/js/dataTables.responsive.min.js";
166        }
167
168        foreach ($dt_scripts as $script) {
169            $event->data['script'][] = array(
170                'type'  => 'text/javascript',
171                'src'   => $script,
172                'defer' => 'defer',
173                '_data' => null,
174            );
175        }
176
177        foreach ($dt_styles as $style) {
178            $event->data['link'][] = array(
179                'type' => 'text/css',
180                'rel'  => 'stylesheet',
181                'href' => $style,
182            );
183        }
184    }
185}
186