xref: /plugin/siteexport/syntax/toc.php (revision 7d101cc131696cb3a0de345d8044a69fb2ef70e9)
1*7d101cc1SGerry Weißbach<?php
2*7d101cc1SGerry Weißbach/**
3*7d101cc1SGerry Weißbach * Search with Scopes
4*7d101cc1SGerry Weißbach *
5*7d101cc1SGerry Weißbach * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
6*7d101cc1SGerry Weißbach * @author     i-net software <tools@inetsoftware.de>
7*7d101cc1SGerry Weißbach * @author     Gerry Weissbach <gweissbach@inetsoftware.de>
8*7d101cc1SGerry Weißbach */
9*7d101cc1SGerry Weißbach
10*7d101cc1SGerry Weißbach// must be run within Dokuwiki
11*7d101cc1SGerry Weißbachif(!defined('DOKU_INC')) die();
12*7d101cc1SGerry Weißbachif (!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
13*7d101cc1SGerry Weißbach
14*7d101cc1SGerry Weißbachrequire_once(DOKU_PLUGIN.'syntax.php');
15*7d101cc1SGerry Weißbach
16*7d101cc1SGerry Weißbachclass syntax_plugin_siteexport_toc extends DokuWiki_Syntax_Plugin {
17*7d101cc1SGerry Weißbach
18*7d101cc1SGerry Weißbach	var $insideToc = false;
19*7d101cc1SGerry Weißbach	var $savedToc = array();
20*7d101cc1SGerry Weißbach
21*7d101cc1SGerry Weißbach	var $mergedPages = array();
22*7d101cc1SGerry Weißbach	var $includedPages = array();
23*7d101cc1SGerry Weißbach
24*7d101cc1SGerry Weißbach	function getType() { return 'protected'; }
25*7d101cc1SGerry Weißbach	function getPType() { return 'block'; }
26*7d101cc1SGerry Weißbach	function getAllowedTypes() { return array('container'); }
27*7d101cc1SGerry Weißbach	function getSort() { return 100; }
28*7d101cc1SGerry Weißbach
29*7d101cc1SGerry Weißbach	/**
30*7d101cc1SGerry Weißbach	 * for backward compatability
31*7d101cc1SGerry Weißbach	 * @see inc/DokuWiki_Plugin#getInfo()
32*7d101cc1SGerry Weißbach	 */
33*7d101cc1SGerry Weißbach    function getInfo(){
34*7d101cc1SGerry Weißbach        if ( method_exists(parent, 'getInfo')) {
35*7d101cc1SGerry Weißbach            $info = parent::getInfo();
36*7d101cc1SGerry Weißbach        }
37*7d101cc1SGerry Weißbach        return is_array($info) ? $info : confToHash(dirname(__FILE__).'/../plugin.info.txt');
38*7d101cc1SGerry Weißbach    }
39*7d101cc1SGerry Weißbach
40*7d101cc1SGerry Weißbach	/**
41*7d101cc1SGerry Weißbach	 * Connect pattern to lexer
42*7d101cc1SGerry Weißbach	 */
43*7d101cc1SGerry Weißbach	function connectTo($mode) {
44*7d101cc1SGerry Weißbach		$this->Lexer->addEntryPattern('<toc>(?=.*?</toc>)',$mode,'plugin_siteexport_toc');
45*7d101cc1SGerry Weißbach		$this->Lexer->addEntryPattern('<toc .+?>(?=.*?</toc>)',$mode,'plugin_siteexport_toc');
46*7d101cc1SGerry Weißbach		$this->Lexer->addSpecialPattern("\[\[.+?\]\]",$mode,'plugin_siteexport_toc');
47*7d101cc1SGerry Weißbach	}
48*7d101cc1SGerry Weißbach
49*7d101cc1SGerry Weißbach	function postConnect() {
50*7d101cc1SGerry Weißbach		$this->Lexer->addExitPattern('</toc.*?>', 'plugin_siteexport_toc');
51*7d101cc1SGerry Weißbach	}
52*7d101cc1SGerry Weißbach
53*7d101cc1SGerry Weißbach	function handle($match, $state, $pos, &$handler) {
54*7d101cc1SGerry Weißbach		global $ID, $INFO;
55*7d101cc1SGerry Weißbach
56*7d101cc1SGerry Weißbach		switch ($state) {
57*7d101cc1SGerry Weißbach			case DOKU_LEXER_ENTER:
58*7d101cc1SGerry Weißbach
59*7d101cc1SGerry Weißbach				$this->insideToc = true;
60*7d101cc1SGerry Weißbach
61*7d101cc1SGerry Weißbach				$options = explode(' ', substr($match, 5, -1));
62*7d101cc1SGerry Weißbach				return array('start' => true, 'pos' => $pos, 'options' => $options);
63*7d101cc1SGerry Weißbach				break;
64*7d101cc1SGerry Weißbach
65*7d101cc1SGerry Weißbach			case DOKU_LEXER_SPECIAL:
66*7d101cc1SGerry Weißbach
67*7d101cc1SGerry Weißbach				if ( $this->insideToc ) {
68*7d101cc1SGerry Weißbach
69*7d101cc1SGerry Weißbach					$link = preg_replace(array('/^\[\[/','/\]\]$/u'),'',$match);
70*7d101cc1SGerry Weißbach					// Split title from URL
71*7d101cc1SGerry Weißbach					$link = explode('|',$link,2);
72*7d101cc1SGerry Weißbach					if ( !isset($link[1]) ) {
73*7d101cc1SGerry Weißbach						$link[1] = NULL;
74*7d101cc1SGerry Weißbach					} else if ( preg_match('/^\{\{[^\}]+\}\}$/',$link[1]) ) {
75*7d101cc1SGerry Weißbach						// If the title is an image, convert it to an array containing the image details
76*7d101cc1SGerry Weißbach						$link[1] = Doku_Handler_Parse_Media($link[1]);
77*7d101cc1SGerry Weißbach					}
78*7d101cc1SGerry Weißbach					$link[0] = trim($link[0]);
79*7d101cc1SGerry Weißbach
80*7d101cc1SGerry Weißbach					if ( ! (preg_match('/^[a-zA-Z0-9\.]+>{1}.*$/u',$link[0]) ||
81*7d101cc1SGerry Weißbach					preg_match('/^\\\\\\\\[\w.:?\-;,]+?\\\\/u',$link[0]) ||
82*7d101cc1SGerry Weißbach					preg_match('#^([a-z0-9\-\.+]+?)://#i',$link[0]) ||
83*7d101cc1SGerry Weißbach					preg_match('<'.PREG_PATTERN_VALID_EMAIL.'>',$link[0]) ||
84*7d101cc1SGerry Weißbach					preg_match('!^#.+!',$link[0]) )
85*7d101cc1SGerry Weißbach					) {
86*7d101cc1SGerry Weißbach
87*7d101cc1SGerry Weißbach						// Get current depth from call stack
88*7d101cc1SGerry Weißbach						$depth = 1;
89*7d101cc1SGerry Weißbach						if ( $handler->CallWriter instanceof Doku_Handler_List ) {
90*7d101cc1SGerry Weißbach
91*7d101cc1SGerry Weißbach							$calls = array_reverse($handler->CallWriter->calls);
92*7d101cc1SGerry Weißbach							$call = $calls[0];
93*7d101cc1SGerry Weißbach							foreach ( $calls as $item ) {
94*7d101cc1SGerry Weißbach								if ( in_array( $item[0], array( 'list_item', 'list_open') ) ) { $call = $item; break;}
95*7d101cc1SGerry Weißbach							}
96*7d101cc1SGerry Weißbach
97*7d101cc1SGerry Weißbach							$depth = $handler->CallWriter->interpretSyntax($call[1][0], $listType);
98*7d101cc1SGerry Weißbach
99*7d101cc1SGerry Weißbach						}
100*7d101cc1SGerry Weißbach
101*7d101cc1SGerry Weißbach						if ( empty( $link[0] ) ) { break; } // No empty elements. This would lead to problems
102*7d101cc1SGerry Weißbach						return array($link[0], $link[1], $depth);
103*7d101cc1SGerry Weißbach						break;
104*7d101cc1SGerry Weißbach					} else {
105*7d101cc1SGerry Weißbach						// use parser! - but with another p
106*7d101cc1SGerry Weißbach						$handler->internallink($match, $state, $pos);
107*7d101cc1SGerry Weißbach					}
108*7d101cc1SGerry Weißbach				} else {
109*7d101cc1SGerry Weißbach					// use parser!
110*7d101cc1SGerry Weißbach					$handler->internallink($match, $state, $pos);
111*7d101cc1SGerry Weißbach				}
112*7d101cc1SGerry Weißbach
113*7d101cc1SGerry Weißbach				return false;
114*7d101cc1SGerry Weißbach			case DOKU_LEXER_UNMATCHED:
115*7d101cc1SGerry Weißbach
116*7d101cc1SGerry Weißbach				$handler->_addCall('cdata',array($match), $pos);
117*7d101cc1SGerry Weißbach				return false;
118*7d101cc1SGerry Weißbach				break;
119*7d101cc1SGerry Weißbach			case DOKU_LEXER_EXIT:
120*7d101cc1SGerry Weißbach
121*7d101cc1SGerry Weißbach				$this->insideToc = false;
122*7d101cc1SGerry Weißbach				return 'save__meta';
123*7d101cc1SGerry Weißbach				break;
124*7d101cc1SGerry Weißbach		}
125*7d101cc1SGerry Weißbach		return false;
126*7d101cc1SGerry Weißbach	}
127*7d101cc1SGerry Weißbach
128*7d101cc1SGerry Weißbach	function render($mode, &$renderer, $data) {
129*7d101cc1SGerry Weißbach		global $ID, $lang, $INFO;
130*7d101cc1SGerry Weißbach
131*7d101cc1SGerry Weißbach		list( $SID, $NAME, $DEPTH ) = $data;
132*7d101cc1SGerry Weißbach
133*7d101cc1SGerry Weißbach		resolve_pageid(getNS($ID),$SID,$exists);
134*7d101cc1SGerry Weißbach//		$SID = cleanID($SID); // hier kein cleanID, da sonst m�glicherweise der anker verloren geht
135*7d101cc1SGerry Weißbach
136*7d101cc1SGerry Weißbach        //    Render XHTML and ODT
137*7d101cc1SGerry Weißbach		if ($mode == 'xhtml' || $mode == 'odt') {
138*7d101cc1SGerry Weißbach
139*7d101cc1SGerry Weißbach		    // TOC Title
140*7d101cc1SGerry Weißbach			if ( $data['start'] === true ) {
141*7d101cc1SGerry Weißbach
142*7d101cc1SGerry Weißbach			    if ( is_Array($data['options']) ) {
143*7d101cc1SGerry Weißbach                    foreach( $data['options'] as $opt ) {
144*7d101cc1SGerry Weißbach    					switch( $opt ) {
145*7d101cc1SGerry Weißbach    						case 'description' : $renderer->meta['sitetoc']['showDescription'] = true; break;
146*7d101cc1SGerry Weißbach    						case 'notoc' : $renderer->meta['sitetoc']['noTOC'] = true; break;
147*7d101cc1SGerry Weißbach    						case 'merge' : $renderer->meta['sitetoc']['mergeDoc'] = true; break;
148*7d101cc1SGerry Weißbach    						case 'nohead' : $renderer->meta['sitetoc']['noTocHeader'] = true; break;
149*7d101cc1SGerry Weißbach    					}
150*7d101cc1SGerry Weißbach    				}
151*7d101cc1SGerry Weißbach			    }
152*7d101cc1SGerry Weißbach
153*7d101cc1SGerry Weißbach				$renderer->section_open("1 sitetoc");
154*7d101cc1SGerry Weißbach				if ( $renderer->meta['sitetoc']['noTocHeader'] === false ) {
155*7d101cc1SGerry Weißbach					$renderer->header($lang['toc'], 1, $data['pos']);
156*7d101cc1SGerry Weißbach				}
157*7d101cc1SGerry Weißbach
158*7d101cc1SGerry Weißbach				return true;
159*7d101cc1SGerry Weißbach			}
160*7d101cc1SGerry Weißbach
161*7d101cc1SGerry Weißbach			// All Output has been done
162*7d101cc1SGerry Weißbach			if ( !is_array($data) && $data == 'save__meta' ) {
163*7d101cc1SGerry Weißbach
164*7d101cc1SGerry Weißbach				// Close TOC
165*7d101cc1SGerry Weißbach				$renderer->section_close();
166*7d101cc1SGerry Weißbach
167*7d101cc1SGerry Weißbach				if ( $renderer->meta['sitetoc']['noTOC'] === true ) {
168*7d101cc1SGerry Weißbach					$renderer->doc = preg_replace("/<div.*?sitetoc.*?$/si", "", $renderer->doc);
169*7d101cc1SGerry Weißbach				}
170*7d101cc1SGerry Weißbach
171*7d101cc1SGerry Weißbach				// If this is not set, we may have it as Metadata
172*7d101cc1SGerry Weißbach				if ( !$this->mergedPages && $renderer->meta['sitetoc']['mergeDoc'] ) {
173*7d101cc1SGerry Weißbach					$toc = $renderer->meta['sitetoc']['siteexportTOC'];
174*7d101cc1SGerry Weißbach					if ( is_array($toc)) {
175*7d101cc1SGerry Weißbach						foreach ($toc as $tocItem ) {
176*7d101cc1SGerry Weißbach							$this->mergedPages[] = $tocItem['id'];
177*7d101cc1SGerry Weißbach						}
178*7d101cc1SGerry Weißbach					}
179*7d101cc1SGerry Weißbach				}
180*7d101cc1SGerry Weißbach
181*7d101cc1SGerry Weißbach				// If there is some data to be merged
182*7d101cc1SGerry Weißbach				if ( count($this->mergedPages) > 0) {
183*7d101cc1SGerry Weißbach
184*7d101cc1SGerry Weißbach					$renderer->section_open("1 mergedsite");
185*7d101cc1SGerry Weißbach
186*7d101cc1SGerry Weißbach					// Prepare lookup Array
187*7d101cc1SGerry Weißbach					foreach ( $this->mergedPages as $tocItem ) {
188*7d101cc1SGerry Weißbach						$this->includedPages[] = array_shift(explode('#', $tocItem));
189*7d101cc1SGerry Weißbach					}
190*7d101cc1SGerry Weißbach
191*7d101cc1SGerry Weißbach					// Print merged pages
192*7d101cc1SGerry Weißbach					foreach ( $this->mergedPages as $tocItem ) {
193*7d101cc1SGerry Weißbach						$this->_render_output($renderer,$tocItem, $mode);
194*7d101cc1SGerry Weißbach					}
195*7d101cc1SGerry Weißbach
196*7d101cc1SGerry Weißbach					$renderer->section_close();
197*7d101cc1SGerry Weißbach				}
198*7d101cc1SGerry Weißbach				return true;
199*7d101cc1SGerry Weißbach			}
200*7d101cc1SGerry Weißbach
201*7d101cc1SGerry Weißbach			// Save the current ID
202*7d101cc1SGerry Weißbach			$LNID = $SID;
203*7d101cc1SGerry Weißbach
204*7d101cc1SGerry Weißbach			// Add ID to flags['mergeDoc']
205*7d101cc1SGerry Weißbach			if ( $renderer->meta['sitetoc']['mergeDoc'] === true ) { // || (count($renderer->meta['sitetoc']['siteexportTOC']) > 0 && $renderer->meta['sitetoc']['siteexportMergeDoc'] === true) ) {
206*7d101cc1SGerry Weißbach				$this->mergedPages[] = $SID;
207*7d101cc1SGerry Weißbach				$default = $renderer->_simpleTitle($SID); $isImage = false;
208*7d101cc1SGerry Weißbach				resolve_pageid(getNS($ID),$SID,$exists);
209*7d101cc1SGerry Weißbach
210*7d101cc1SGerry Weißbach				$NAME = empty($NAME) ? p_get_first_heading($SID,true) : $NAME;
211*7d101cc1SGerry Weißbach				$LNID = "$ID#" . sectionID($SID, $check);
212*7d101cc1SGerry Weißbach			}
213*7d101cc1SGerry Weißbach
214*7d101cc1SGerry Weißbach			// Print normal internal link (XHTML odt)
215*7d101cc1SGerry Weißbach			$renderer->internallink($LNID, $NAME, null);
216*7d101cc1SGerry Weißbach
217*7d101cc1SGerry Weißbach			// Display Description underneath
218*7d101cc1SGerry Weißbach			if ( $renderer->meta['sitetoc']['showDescription'] === true ) {
219*7d101cc1SGerry Weißbach				// $renderer->p_open();
220*7d101cc1SGerry Weißbach				$renderer->cdata(p_get_metadata($SID, 'description abstract', true));
221*7d101cc1SGerry Weißbach				// $renderer->p_close();
222*7d101cc1SGerry Weißbach			}
223*7d101cc1SGerry Weißbach
224*7d101cc1SGerry Weißbach			// Render Metadata
225*7d101cc1SGerry Weißbach		} else if ($mode == 'metadata') {
226*7d101cc1SGerry Weißbach			if ( !is_array($data) && $data == 'save__meta' ) {
227*7d101cc1SGerry Weißbach				$renderer->meta['sitetoc']['siteexportTOC'] = $this->savedToc;
228*7d101cc1SGerry Weißbach
229*7d101cc1SGerry Weißbach                foreach ($this->savedToc as $page) {
230*7d101cc1SGerry Weißbach                    $renderer->meta['relation']['references'][$page['id']] = $page['exists'];
231*7d101cc1SGerry Weißbach                }
232*7d101cc1SGerry Weißbach
233*7d101cc1SGerry Weißbach				$this->savedToc = array();
234*7d101cc1SGerry Weißbach			} else if ( !isset($data['start']) && !isset($data['pos']) ) {
235*7d101cc1SGerry Weißbach				$this->savedToc[] = $this->__addTocItem($SID, $NAME, $DEPTH, $renderer);
236*7d101cc1SGerry Weißbach			}
237*7d101cc1SGerry Weißbach		} else {
238*7d101cc1SGerry Weißbach			return false;
239*7d101cc1SGerry Weißbach		}
240*7d101cc1SGerry Weißbach
241*7d101cc1SGerry Weißbach		return true;
242*7d101cc1SGerry Weißbach	}
243*7d101cc1SGerry Weißbach
244*7d101cc1SGerry Weißbach	/*
245*7d101cc1SGerry Weißbach	 * pull apart the ID and create an Entry for the TOC
246*7d101cc1SGerry Weißbach	 */
247*7d101cc1SGerry Weißbach	function __addTocItem($id, $name, $depth, $renderer) {
248*7d101cc1SGerry Weißbach		global $conf;
249*7d101cc1SGerry Weißbach		global $ID;
250*7d101cc1SGerry Weißbach
251*7d101cc1SGerry Weißbach		// Render Title
252*7d101cc1SGerry Weißbach		$default = $renderer->_simpleTitle($id);
253*7d101cc1SGerry Weißbach		$exists = false; $isImage = false; $linktype = null;
254*7d101cc1SGerry Weißbach		resolve_pageid(getNS($ID),$id,$exists);
255*7d101cc1SGerry Weißbach		$name = $renderer->_getLinkTitle($name, $default, $isImage, $id, $linktype);
256*7d101cc1SGerry Weißbach
257*7d101cc1SGerry Weißbach		//keep hash anchor
258*7d101cc1SGerry Weißbach		list($id,$hash) = explode('#',$id,2);
259*7d101cc1SGerry Weißbach		if(!empty($hash)) $hash = $renderer->_headerToLink($hash);
260*7d101cc1SGerry Weißbach
261*7d101cc1SGerry Weißbach		// Build Sitetoc Item
262*7d101cc1SGerry Weißbach		$item = array();
263*7d101cc1SGerry Weißbach		$item['id'] = $id;
264*7d101cc1SGerry Weißbach		$item['name'] = $name;
265*7d101cc1SGerry Weißbach		$item['anchor'] = $hash;
266*7d101cc1SGerry Weißbach		$item['depth'] = $depth;
267*7d101cc1SGerry Weißbach		$item['exists'] = $exists;
268*7d101cc1SGerry Weißbach		if(!$conf['skipacl'] && auth_quickaclcheck($item['id']) < AUTH_READ){
269*7d101cc1SGerry Weißbach			return false;
270*7d101cc1SGerry Weißbach		}
271*7d101cc1SGerry Weißbach
272*7d101cc1SGerry Weißbach		return $item;
273*7d101cc1SGerry Weißbach	}
274*7d101cc1SGerry Weißbach
275*7d101cc1SGerry Weißbach	/*
276*7d101cc1SGerry Weißbach	 * Render the output of one page
277*7d101cc1SGerry Weißbach	 */
278*7d101cc1SGerry Weißbach	function _render_output($renderer, $addID, $mode) {
279*7d101cc1SGerry Weißbach		global $ID;
280*7d101cc1SGerry Weißbach
281*7d101cc1SGerry Weißbach		//get data(in instructions format) from $file (dont use cache: false)
282*7d101cc1SGerry Weißbach		$file    = wikiFN($addID);
283*7d101cc1SGerry Weißbach		$instr   = p_cached_instructions($file, false);
284*7d101cc1SGerry Weißbach
285*7d101cc1SGerry Weißbach		//page was empty
286*7d101cc1SGerry Weißbach		if (empty($instr)) {
287*7d101cc1SGerry Weißbach			return;
288*7d101cc1SGerry Weißbach		}
289*7d101cc1SGerry Weißbach
290*7d101cc1SGerry Weißbach		// Convert Link instructions
291*7d101cc1SGerry Weißbach		$instr   = $this->_convertInstructions($instr, $addID, $renderer);
292*7d101cc1SGerry Weißbach
293*7d101cc1SGerry Weißbach
294*7d101cc1SGerry Weißbach		// Section IDs
295*7d101cc1SGerry Weißbach		$check = null;
296*7d101cc1SGerry Weißbach		$addID = sectionID($addID, $check);	//not possible to use a:b:c for id
297*7d101cc1SGerry Weißbach
298*7d101cc1SGerry Weißbach		if ( $mode == 'xhtml' ) {
299*7d101cc1SGerry Weißbach			//--------RENDER
300*7d101cc1SGerry Weißbach			//renderer information(TOC build / Cache used)
301*7d101cc1SGerry Weißbach			$info = array();
302*7d101cc1SGerry Weißbach			$content = p_render($mode, $instr, $info);
303*7d101cc1SGerry Weißbach
304*7d101cc1SGerry Weißbach			//Remove TOC`s, section edit buttons and tags
305*7d101cc1SGerry Weißbach			$content = $this->_cleanXHTML($content);
306*7d101cc1SGerry Weißbach
307*7d101cc1SGerry Weißbach
308*7d101cc1SGerry Weißbach			// embed the included page
309*7d101cc1SGerry Weißbach			$renderer->doc .= '<div class="include">';
310*7d101cc1SGerry Weißbach			//add an anchor to find start of a inserted page
311*7d101cc1SGerry Weißbach			$renderer->doc .= "<a name='$addID' id='$addID'>";
312*7d101cc1SGerry Weißbach			$renderer->doc .= $content;
313*7d101cc1SGerry Weißbach			$renderer->doc .= '</div>';
314*7d101cc1SGerry Weißbach		} else if ( $mode == 'odt') {
315*7d101cc1SGerry Weißbach
316*7d101cc1SGerry Weißbach			$renderer->doc .= '<text:bookmark text:name="'.$addID.'"/>';
317*7d101cc1SGerry Weißbach
318*7d101cc1SGerry Weißbach			// Loop through the instructions
319*7d101cc1SGerry Weißbach			foreach ( $instr as $instruction ) {
320*7d101cc1SGerry Weißbach				// Execute the callback against the Renderer
321*7d101cc1SGerry Weißbach				call_user_func_array(array($renderer, $instruction[0]),$instruction[1]);
322*7d101cc1SGerry Weißbach			}
323*7d101cc1SGerry Weißbach		}
324*7d101cc1SGerry Weißbach	}
325*7d101cc1SGerry Weißbach
326*7d101cc1SGerry Weißbach
327*7d101cc1SGerry Weißbach	/*
328*7d101cc1SGerry Weißbach	 * Corrects relative internal links and media and
329*7d101cc1SGerry Weißbach	 * converts headers of included pages to subheaders of the current page
330*7d101cc1SGerry Weißbach	 */
331*7d101cc1SGerry Weißbach	function _convertInstructions($instr, $id, &$renderer) {
332*7d101cc1SGerry Weißbach		global $ID;
333*7d101cc1SGerry Weißbach		global $conf;
334*7d101cc1SGerry Weißbach
335*7d101cc1SGerry Weißbach		$n = count($instr);
336*7d101cc1SGerry Weißbach
337*7d101cc1SGerry Weißbach		for ($i = 0; $i < $n; $i++){
338*7d101cc1SGerry Weißbach			//internal links(links inside this wiki) an relative links
339*7d101cc1SGerry Weißbach			if((substr($instr[$i][0], 0, 12) == 'internallink')){
340*7d101cc1SGerry Weißbach				$this->_convert_link($renderer,$instr[$i],$id);
341*7d101cc1SGerry Weißbach			}
342*7d101cc1SGerry Weißbach			else if((substr($instr[$i][0], 0, 13) == 'internalmedia')){
343*7d101cc1SGerry Weißbach				$this->_convert_media($renderer,$instr[$i],$id);
344*7d101cc1SGerry Weißbach			}
345*7d101cc1SGerry Weißbach		}
346*7d101cc1SGerry Weißbach
347*7d101cc1SGerry Weißbach		//if its the document start, cut off the first element(document information)
348*7d101cc1SGerry Weißbach		if ($instr[0][0] == 'document_start')
349*7d101cc1SGerry Weißbach		return array_slice($instr, 1, -1);
350*7d101cc1SGerry Weißbach		else
351*7d101cc1SGerry Weißbach		return $instr;
352*7d101cc1SGerry Weißbach	}
353*7d101cc1SGerry Weißbach
354*7d101cc1SGerry Weißbach
355*7d101cc1SGerry Weißbach	/*
356*7d101cc1SGerry Weißbach	 * Convert link of given instruction
357*7d101cc1SGerry Weißbach	 */
358*7d101cc1SGerry Weißbach	function _convert_link(&$renderer,&$instr,$id) {
359*7d101cc1SGerry Weißbach		global $ID;
360*7d101cc1SGerry Weißbach
361*7d101cc1SGerry Weißbach		$exists = false;
362*7d101cc1SGerry Weißbach
363*7d101cc1SGerry Weißbach		resolve_pageid(getNS($id),$instr[1][0],$exists);
364*7d101cc1SGerry Weißbach		list( $pageID, $pageReference ) = explode("#", $instr[1][0], 2);
365*7d101cc1SGerry Weißbach
366*7d101cc1SGerry Weißbach		if ( in_array($pageID, $this->includedPages) ) {
367*7d101cc1SGerry Weißbach			// Crate new internal Links
368*7d101cc1SGerry Weißbach			$check = null;
369*7d101cc1SGerry Weißbach
370*7d101cc1SGerry Weißbach			// Either get existing reference or create from first heading. If still not there take the alternate ID
371*7d101cc1SGerry Weißbach			$pageNameLink = empty( $pageReference ) ? sectionID($pageID,$check) : $pageReference;
372*7d101cc1SGerry Weißbach
373*7d101cc1SGerry Weißbach			$instr[1][0] = $ID . "#" . $pageNameLink;
374*7d101cc1SGerry Weißbach
375*7d101cc1SGerry Weißbach		} else {
376*7d101cc1SGerry Weißbach			// Convert external Links to plain Text
377*7d101cc1SGerry Weißbach
378*7d101cc1SGerry Weißbach			$instr = array(
379*7d101cc1SGerry Weißbach						"cdata",
380*7d101cc1SGerry Weißbach			array($instr[1][1]),
381*7d101cc1SGerry Weißbach			$instr[2]
382*7d101cc1SGerry Weißbach			);
383*7d101cc1SGerry Weißbach		}
384*7d101cc1SGerry Weißbach	}
385*7d101cc1SGerry Weißbach
386*7d101cc1SGerry Weißbach	/*
387*7d101cc1SGerry Weißbach	 * Convert internalmedia of given instruction
388*7d101cc1SGerry Weißbach	 */
389*7d101cc1SGerry Weißbach	function _convert_media(&$renderer,&$instr,$id) {
390*7d101cc1SGerry Weißbach		global $ID;
391*7d101cc1SGerry Weißbach
392*7d101cc1SGerry Weißbach		// Resolvemedia returns the absolute path to media by reference
393*7d101cc1SGerry Weißbach		$exists = false;
394*7d101cc1SGerry Weißbach		resolve_mediaid(getNS($id),$instr[1][0],$exists);
395*7d101cc1SGerry Weißbach	}
396*7d101cc1SGerry Weißbach
397*7d101cc1SGerry Weißbach	/**
398*7d101cc1SGerry Weißbach	 * Remove TOC, section edit buttons and tags
399*7d101cc1SGerry Weißbach	 */
400*7d101cc1SGerry Weißbach	function _cleanXHTML($xhtml){
401*7d101cc1SGerry Weißbach		$replace  = array(
402*7d101cc1SGerry Weißbach			'!<div class="toc">.*?(</div>\n</div>)!s' => '', // remove TOCs
403*7d101cc1SGerry Weißbach			'#<!-- SECTION \[(\d*-\d*)\] -->#e'       => '', // remove section edit buttons
404*7d101cc1SGerry Weißbach			'!<div id="tags">.*?(</div>)!s'           => ''  // remove category tags
405*7d101cc1SGerry Weißbach		);
406*7d101cc1SGerry Weißbach		$xhtml  = preg_replace(array_keys($replace), array_values($replace), $xhtml);
407*7d101cc1SGerry Weißbach		return $xhtml;
408*7d101cc1SGerry Weißbach	}
409*7d101cc1SGerry Weißbach
410*7d101cc1SGerry Weißbach
411*7d101cc1SGerry Weißbach	/**
412*7d101cc1SGerry Weißbach	 * Allow the plugin to prevent DokuWiki creating a second instance of itself
413*7d101cc1SGerry Weißbach	 *
414*7d101cc1SGerry Weißbach	 * @return bool   true if the plugin can not be instantiated more than once
415*7d101cc1SGerry Weißbach	 */
416*7d101cc1SGerry Weißbach	function isSingleton() {
417*7d101cc1SGerry Weißbach		return true;
418*7d101cc1SGerry Weißbach	}
419*7d101cc1SGerry Weißbach}
420*7d101cc1SGerry Weißbach// vim:ts=4:sw=4:et:enc=utf-8:
421