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