dokuwiki-indexmenu-plugin – Blame information for rev 1

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 office 1 <?php
2 /**
3 * AJAX Backend for indexmenu
4 *
5 * @author Samuele Tognini <samuele@samuele.netsons.org>
6 * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
7 */
8  
9 //fix for Opera XMLHttpRequests
10 if(!count($_POST) && @$HTTP_RAW_POST_DATA) {
11 parse_str($HTTP_RAW_POST_DATA, $_POST);
12 }
13  
14 if(!defined('DOKU_INC')) define('DOKU_INC', realpath(dirname(__FILE__).'/../../../').'/');
15 if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN', DOKU_INC.'lib/plugins/');
16 require_once(DOKU_INC.'inc/init.php');
17 require_once(DOKU_INC.'inc/auth.php');
18 if(!defined('INDEXMENU_IMG_ABSDIR')) define('INDEXMENU_IMG_ABSDIR', DOKU_PLUGIN."indexmenu/images");
19 //close session
20 session_write_close();
21  
22 $ajax_indexmenu = new ajax_indexmenu_plugin;
23 $ajax_indexmenu->render();
24  
25 class ajax_indexmenu_plugin {
26 /**
27 * Output
28 *
29 * @author Samuele Tognini <samuele@samuele.netsons.org>
30 */
31  
32 function render() {
33 $req = $_REQUEST['req'];
34 $succ = false;
35 //send the zip
36 if($req == 'send' and isset($_REQUEST['t'])) {
37 include(DOKU_PLUGIN.'indexmenu/inc/repo.class.php');
38 $repo = new repo_indexmenu_plugin;
39 $succ = $repo->send_theme($_REQUEST['t']);
40 }
41 if($succ) return true;
42  
43 header('Content-Type: text/html; charset=utf-8');
44 header('Cache-Control: public, max-age=3600');
45 header('Pragma: public');
46 switch($req) {
47 case 'local': //required for admin.php
48 //list themes
49 print $this->local_themes();
50 break;
51 /*case 'toc':
52 //print toc preview
53 if(isset($_REQUEST['id'])) print $this->print_toc($_REQUEST['id']);
54 break;
55 case 'index':
56 //print index
57 if(isset($_REQUEST['idx'])) print $this->print_index($_REQUEST['idx']);
58 break; */
59 }
60 }
61  
62 /**
63 * Print a list of local themes
64 *
65 * @author Samuele Tognini <samuele@samuele.netsons.org>
66 */
67  
68 function local_themes() {
69 $list = 'indexmenu,'.DOKU_URL.",lib/plugins/indexmenu/images,";
70 $data = array();
71 $handle = @opendir(INDEXMENU_IMG_ABSDIR);
72 while(false !== ($file = readdir($handle))) {
73 if(is_dir(INDEXMENU_IMG_ABSDIR.'/'.$file)
74 && $file != "."
75 && $file != ".."
76 && $file != "repository"
77 && $file != "tmp"
78 && $file != ".svn"
79 ) {
80 $data[] = $file;
81 }
82 }
83 closedir($handle);
84 sort($data);
85 $list .= implode(",", $data);
86 return $list;
87 }
88  
89 /**
90 * Print a toc preview
91 *
92 * @author Samuele Tognini <samuele@samuele.netsons.org>
93 * @author Andreas Gohr <andi@splitbrain.org>
94 */
95 function print_toc($id) {
96 require_once(DOKU_INC.'inc/parser/xhtml.php');
97 $id = cleanID($id);
98 if(auth_quickaclcheck($id) < AUTH_READ) return '';
99 $meta = p_get_metadata($id);
100 $toc = $meta['description']['tableofcontents'];
101 $out = '<div class="tocheader toctoggle">'.DOKU_LF;
102 if(count($toc) > 1) {
103 $out .= $this->render_toc($toc);
104 } else {
105 $out .= '<a href="'.wl($id).'">';
106 $out .= ($meta['title']) ? htmlspecialchars($meta['title']) : htmlspecialchars(noNS($id));
107 $out .= '</a>'.DOKU_LF;
108 if($meta['description']['abstract']) {
109 $out .= '</div>'.DOKU_LF;
110 $out .= '<div class="indexmenu_toc_inside">'.DOKU_LF;
111 $out .= p_render('xhtml', p_get_instructions($meta['description']['abstract']), $info);
112 $out .= '</div>'.DOKU_LF;
113 }
114 }
115 $out .= '</div>'.DOKU_LF;
116 return $out;
117 }
118  
119 /**
120 * Return the TOC rendered to XHTML
121 *
122 * @author Andreas Gohr <andi@splitbrain.org>
123 */
124 function render_toc($toc) {
125 global $lang;
126 $r = new Doku_Renderer_xhtml;
127 $r->toc = $toc;
128  
129 $out = $lang['toc'];
130 $out .= '</div>'.DOKU_LF;
131 $out .= '<div class="indexmenu_toc_inside">'.DOKU_LF;
132 $out .= html_buildlist($r->toc, 'toc', array($this, '_tocitem'));
133 $out .= '</div>'.DOKU_LF;
134 return $out;
135 }
136  
137 /**
138 * Callback for html_buildlist
139 */
140 function _tocitem($item) {
141 $id = cleanID($_POST['id']);
142 return '<span class="li"><a href="'.wl($id, '#'.$item['hid'], false, '').'" class="toc">'.
143 htmlspecialchars($item['title']).'</a></span>';
144 }
145  
146 /**
147 * Print index nodes
148 *
149 * @author Samuele Tognini <samuele@samuele.netsons.org>
150 * @author Andreas Gohr <andi@splitbrain.org>
151 * @author Rene Hadler <rene.hadler@iteas.at>
152 */
153 function print_index($ns) {
154 require_once(DOKU_PLUGIN.'indexmenu/syntax/indexmenu.php');
155 global $conf;
156 $idxm = new syntax_plugin_indexmenu_indexmenu();
157 $ns=$idxm->_parse_ns(rawurldecode($ns));
158 $level = -1;
159 $max = 0;
160 $data = array();
161 $out = '';
162 if($_REQUEST['max'] > 0) {
163 $max = $_REQUEST['max'];
164 $level = $max;
165 }
166 $nss = ($_REQUEST['nss']) ? cleanID($_REQUEST['nss']) : '';
167 $idxm->sort = $_REQUEST['sort'];
168 $idxm->msort = $_REQUEST['msort'];
169 $idxm->rsort = $_REQUEST['rsort'];
170 $idxm->nsort = $_REQUEST['nsort'];
171 $idxm->hsort = $_REQUEST['hsort'];
172 $fsdir = "/".utf8_encodeFN(str_replace(':', '/', $ns));
173 $opts = array(
174 'level' => $level,
175 'nons' => $_REQUEST['nons'],
176 'nss' => array(array($nss, 1)),
177 'max' => $max,
178 'js' => false,
179 'nopg' => $_REQUEST['nopg'],
180 'skip_index' => $idxm->getConf('skip_index'),
181 'skip_file' => $idxm->getConf('skip_file'),
182 'headpage' => $idxm->getConf('headpage'),
183 'hide_headpage' => $idxm->getConf('hide_headpage')
184 );
185 if($idxm->sort || $idxm->msort || $idxm->rsort || $idxm->hsort) {
186 $idxm->_search($data, $conf['datadir'], array($idxm, '_search_index'), $opts, $fsdir);
187 } else {
188 search($data, $conf['datadir'], array($idxm, '_search_index'), $opts, $fsdir);
189 }
190 if($_REQUEST['nojs']) {
191 require_once(DOKU_INC.'inc/html.php');
192 $out_tmp = html_buildlist($data, 'idx', array($idxm, "_html_list_index"), "html_li_index");
193 $out .= preg_replace('/<ul class="idx">(.*)<\/ul>/s', "$1", $out_tmp);
194 } else {
195 $nodes = $idxm->_jsnodes($data, '', 0);
196 $out = "ajxnodes = [";
197 $out .= rtrim($nodes[0], ",");
198 $out .= "];";
199 }
200 return $out;
201 }
202 }