xref: /plugin/siteexport/syntax/toc.php (revision f3b6399273519478306b68585a3f0b607340b73b)
17d101cc1SGerry Weißbach<?php
27d101cc1SGerry Weißbach/**
37d101cc1SGerry Weißbach * Search with Scopes
47d101cc1SGerry Weißbach *
57d101cc1SGerry Weißbach * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
67d101cc1SGerry Weißbach * @author     i-net software <tools@inetsoftware.de>
77d101cc1SGerry Weißbach * @author     Gerry Weissbach <gweissbach@inetsoftware.de>
87d101cc1SGerry Weißbach */
97d101cc1SGerry Weißbach
107d101cc1SGerry Weißbach// must be run within Dokuwiki
117d101cc1SGerry Weißbachif(!defined('DOKU_INC')) die();
127d101cc1SGerry Weißbachif (!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
137d101cc1SGerry Weißbach
147d101cc1SGerry Weißbachrequire_once(DOKU_PLUGIN.'syntax.php');
157d101cc1SGerry Weißbach
167d101cc1SGerry Weißbachclass syntax_plugin_siteexport_toc extends DokuWiki_Syntax_Plugin {
177d101cc1SGerry Weißbach
187d101cc1SGerry Weißbach	var $insideToc = false;
197d101cc1SGerry Weißbach	var $savedToc = array();
207d101cc1SGerry Weißbach
217d101cc1SGerry Weißbach	var $mergedPages = array();
227d101cc1SGerry Weißbach	var $includedPages = array();
237d101cc1SGerry Weißbach
247d101cc1SGerry Weißbach	function getType() { return 'protected'; }
257d101cc1SGerry Weißbach	function getPType() { return 'block'; }
267d101cc1SGerry Weißbach	function getAllowedTypes() { return array('container'); }
277d101cc1SGerry Weißbach	function getSort() { return 100; }
287d101cc1SGerry Weißbach
297d101cc1SGerry Weißbach	/**
307d101cc1SGerry Weißbach	 * for backward compatability
317d101cc1SGerry Weißbach	 * @see inc/DokuWiki_Plugin#getInfo()
327d101cc1SGerry Weißbach	 */
337d101cc1SGerry Weißbach    function getInfo(){
347d101cc1SGerry Weißbach        if ( method_exists(parent, 'getInfo')) {
357d101cc1SGerry Weißbach            $info = parent::getInfo();
367d101cc1SGerry Weißbach        }
377d101cc1SGerry Weißbach        return is_array($info) ? $info : confToHash(dirname(__FILE__).'/../plugin.info.txt');
387d101cc1SGerry Weißbach    }
397d101cc1SGerry Weißbach
407d101cc1SGerry Weißbach	/**
417d101cc1SGerry Weißbach	 * Connect pattern to lexer
427d101cc1SGerry Weißbach	 */
437d101cc1SGerry Weißbach	function connectTo($mode) {
447d101cc1SGerry Weißbach		$this->Lexer->addEntryPattern('<toc>(?=.*?</toc>)',$mode,'plugin_siteexport_toc');
457d101cc1SGerry Weißbach		$this->Lexer->addEntryPattern('<toc .+?>(?=.*?</toc>)',$mode,'plugin_siteexport_toc');
467d101cc1SGerry Weißbach		$this->Lexer->addSpecialPattern("\[\[.+?\]\]",$mode,'plugin_siteexport_toc');
477d101cc1SGerry Weißbach	}
487d101cc1SGerry Weißbach
497d101cc1SGerry Weißbach	function postConnect() {
507d101cc1SGerry Weißbach		$this->Lexer->addExitPattern('</toc.*?>', 'plugin_siteexport_toc');
517d101cc1SGerry Weißbach	}
527d101cc1SGerry Weißbach
537d101cc1SGerry Weißbach	function handle($match, $state, $pos, &$handler) {
547d101cc1SGerry Weißbach		global $ID, $INFO;
557d101cc1SGerry Weißbach
567d101cc1SGerry Weißbach		switch ($state) {
577d101cc1SGerry Weißbach			case DOKU_LEXER_ENTER:
587d101cc1SGerry Weißbach
597d101cc1SGerry Weißbach				$this->insideToc = true;
607d101cc1SGerry Weißbach
617d101cc1SGerry Weißbach				$options = explode(' ', substr($match, 5, -1));
627d101cc1SGerry Weißbach				return array('start' => true, 'pos' => $pos, 'options' => $options);
637d101cc1SGerry Weißbach				break;
647d101cc1SGerry Weißbach
657d101cc1SGerry Weißbach			case DOKU_LEXER_SPECIAL:
667d101cc1SGerry Weißbach
677d101cc1SGerry Weißbach				if ( $this->insideToc ) {
687d101cc1SGerry Weißbach
697d101cc1SGerry Weißbach					$link = preg_replace(array('/^\[\[/','/\]\]$/u'),'',$match);
707d101cc1SGerry Weißbach					// Split title from URL
717d101cc1SGerry Weißbach					$link = explode('|',$link,2);
727d101cc1SGerry Weißbach					if ( !isset($link[1]) ) {
737d101cc1SGerry Weißbach						$link[1] = NULL;
747d101cc1SGerry Weißbach					} else if ( preg_match('/^\{\{[^\}]+\}\}$/',$link[1]) ) {
757d101cc1SGerry Weißbach						// If the title is an image, convert it to an array containing the image details
767d101cc1SGerry Weißbach						$link[1] = Doku_Handler_Parse_Media($link[1]);
777d101cc1SGerry Weißbach					}
787d101cc1SGerry Weißbach					$link[0] = trim($link[0]);
797d101cc1SGerry Weißbach
807d101cc1SGerry Weißbach					if ( ! (preg_match('/^[a-zA-Z0-9\.]+>{1}.*$/u',$link[0]) ||
817d101cc1SGerry Weißbach					preg_match('/^\\\\\\\\[\w.:?\-;,]+?\\\\/u',$link[0]) ||
827d101cc1SGerry Weißbach					preg_match('#^([a-z0-9\-\.+]+?)://#i',$link[0]) ||
837d101cc1SGerry Weißbach					preg_match('<'.PREG_PATTERN_VALID_EMAIL.'>',$link[0]) ||
847d101cc1SGerry Weißbach					preg_match('!^#.+!',$link[0]) )
857d101cc1SGerry Weißbach					) {
867d101cc1SGerry Weißbach
877d101cc1SGerry Weißbach						// Get current depth from call stack
887d101cc1SGerry Weißbach						$depth = 1;
897d101cc1SGerry Weißbach						if ( $handler->CallWriter instanceof Doku_Handler_List ) {
907d101cc1SGerry Weißbach
917d101cc1SGerry Weißbach							$calls = array_reverse($handler->CallWriter->calls);
927d101cc1SGerry Weißbach							$call = $calls[0];
937d101cc1SGerry Weißbach							foreach ( $calls as $item ) {
947d101cc1SGerry Weißbach								if ( in_array( $item[0], array( 'list_item', 'list_open') ) ) { $call = $item; break;}
957d101cc1SGerry Weißbach							}
967d101cc1SGerry Weißbach
977d101cc1SGerry Weißbach							$depth = $handler->CallWriter->interpretSyntax($call[1][0], $listType);
987d101cc1SGerry Weißbach
997d101cc1SGerry Weißbach						}
1007d101cc1SGerry Weißbach
1017d101cc1SGerry Weißbach						if ( empty( $link[0] ) ) { break; } // No empty elements. This would lead to problems
1027d101cc1SGerry Weißbach						return array($link[0], $link[1], $depth);
1037d101cc1SGerry Weißbach						break;
1047d101cc1SGerry Weißbach					} else {
1057d101cc1SGerry Weißbach						// use parser! - but with another p
1067d101cc1SGerry Weißbach						$handler->internallink($match, $state, $pos);
1077d101cc1SGerry Weißbach					}
1087d101cc1SGerry Weißbach				} else {
1097d101cc1SGerry Weißbach					// use parser!
1107d101cc1SGerry Weißbach					$handler->internallink($match, $state, $pos);
1117d101cc1SGerry Weißbach				}
1127d101cc1SGerry Weißbach
1137d101cc1SGerry Weißbach				return false;
1147d101cc1SGerry Weißbach			case DOKU_LEXER_UNMATCHED:
1157d101cc1SGerry Weißbach
1167d101cc1SGerry Weißbach				$handler->_addCall('cdata',array($match), $pos);
1177d101cc1SGerry Weißbach				return false;
1187d101cc1SGerry Weißbach				break;
1197d101cc1SGerry Weißbach			case DOKU_LEXER_EXIT:
1207d101cc1SGerry Weißbach
1217d101cc1SGerry Weißbach				$this->insideToc = false;
1227d101cc1SGerry Weißbach				return 'save__meta';
1237d101cc1SGerry Weißbach				break;
1247d101cc1SGerry Weißbach		}
1257d101cc1SGerry Weißbach		return false;
1267d101cc1SGerry Weißbach	}
1277d101cc1SGerry Weißbach
1287d101cc1SGerry Weißbach	function render($mode, &$renderer, $data) {
1297d101cc1SGerry Weißbach		global $ID, $lang, $INFO;
1307d101cc1SGerry Weißbach
1317d101cc1SGerry Weißbach		list( $SID, $NAME, $DEPTH ) = $data;
1327d101cc1SGerry Weißbach
1337d101cc1SGerry Weißbach		resolve_pageid(getNS($ID),$SID,$exists);
1347d101cc1SGerry Weißbach//		$SID = cleanID($SID); // hier kein cleanID, da sonst m�glicherweise der anker verloren geht
1357d101cc1SGerry Weißbach
1367d101cc1SGerry Weißbach        //    Render XHTML and ODT
1377d101cc1SGerry Weißbach		if ($mode == 'xhtml' || $mode == 'odt') {
1387d101cc1SGerry Weißbach
1397d101cc1SGerry Weißbach		    // TOC Title
140*f3b63992SGerry Weißbach			if ( isset($data['start']) ) {
1417d101cc1SGerry Weißbach
1427d101cc1SGerry Weißbach			    if ( is_Array($data['options']) ) {
1437d101cc1SGerry Weißbach                    foreach( $data['options'] as $opt ) {
1447d101cc1SGerry Weißbach    					switch( $opt ) {
1457d101cc1SGerry Weißbach    						case 'description' : $renderer->meta['sitetoc']['showDescription'] = true; break;
1467d101cc1SGerry Weißbach    						case 'notoc' : $renderer->meta['sitetoc']['noTOC'] = true; break;
1477d101cc1SGerry Weißbach    						case 'merge' : $renderer->meta['sitetoc']['mergeDoc'] = true; break;
1487d101cc1SGerry Weißbach    						case 'nohead' : $renderer->meta['sitetoc']['noTocHeader'] = true; break;
1497d101cc1SGerry Weißbach    					}
1507d101cc1SGerry Weißbach    				}
1517d101cc1SGerry Weißbach			    }
1527d101cc1SGerry Weißbach
1537d101cc1SGerry Weißbach				$renderer->section_open("1 sitetoc");
1547d101cc1SGerry Weißbach				if ( $renderer->meta['sitetoc']['noTocHeader'] === false ) {
1557d101cc1SGerry Weißbach					$renderer->header($lang['toc'], 1, $data['pos']);
1567d101cc1SGerry Weißbach				}
1577d101cc1SGerry Weißbach
1587d101cc1SGerry Weißbach				return true;
1597d101cc1SGerry Weißbach			}
1607d101cc1SGerry Weißbach
1617d101cc1SGerry Weißbach			// All Output has been done
1627d101cc1SGerry Weißbach			if ( !is_array($data) && $data == 'save__meta' ) {
1637d101cc1SGerry Weißbach
1647d101cc1SGerry Weißbach				// Close TOC
1657d101cc1SGerry Weißbach				$renderer->section_close();
1667d101cc1SGerry Weißbach
1677d101cc1SGerry Weißbach				if ( $renderer->meta['sitetoc']['noTOC'] === true ) {
1687d101cc1SGerry Weißbach					$renderer->doc = preg_replace("/<div.*?sitetoc.*?$/si", "", $renderer->doc);
1697d101cc1SGerry Weißbach				}
1707d101cc1SGerry Weißbach
1717d101cc1SGerry Weißbach				// If this is not set, we may have it as Metadata
1727d101cc1SGerry Weißbach				if ( !$this->mergedPages && $renderer->meta['sitetoc']['mergeDoc'] ) {
1737d101cc1SGerry Weißbach					$toc = $renderer->meta['sitetoc']['siteexportTOC'];
1747d101cc1SGerry Weißbach					if ( is_array($toc)) {
1757d101cc1SGerry Weißbach						foreach ($toc as $tocItem ) {
1767d101cc1SGerry Weißbach							$this->mergedPages[] = $tocItem['id'];
1777d101cc1SGerry Weißbach						}
1787d101cc1SGerry Weißbach					}
1797d101cc1SGerry Weißbach				}
1807d101cc1SGerry Weißbach
1817d101cc1SGerry Weißbach				// If there is some data to be merged
1827d101cc1SGerry Weißbach				if ( count($this->mergedPages) > 0) {
1837d101cc1SGerry Weißbach
1847d101cc1SGerry Weißbach					$renderer->section_open("1 mergedsite");
1857d101cc1SGerry Weißbach
1867d101cc1SGerry Weißbach					// Prepare lookup Array
1877d101cc1SGerry Weißbach					foreach ( $this->mergedPages as $tocItem ) {
1887d101cc1SGerry Weißbach						$this->includedPages[] = array_shift(explode('#', $tocItem));
1897d101cc1SGerry Weißbach					}
1907d101cc1SGerry Weißbach
1917d101cc1SGerry Weißbach					// Print merged pages
1927d101cc1SGerry Weißbach					foreach ( $this->mergedPages as $tocItem ) {
1937d101cc1SGerry Weißbach						$this->_render_output($renderer,$tocItem, $mode);
1947d101cc1SGerry Weißbach					}
1957d101cc1SGerry Weißbach
1967d101cc1SGerry Weißbach					$renderer->section_close();
1977d101cc1SGerry Weißbach				}
1987d101cc1SGerry Weißbach				return true;
1997d101cc1SGerry Weißbach			}
2007d101cc1SGerry Weißbach
2017d101cc1SGerry Weißbach			// Save the current ID
2027d101cc1SGerry Weißbach			$LNID = $SID;
2037d101cc1SGerry Weißbach
2047d101cc1SGerry Weißbach			// Add ID to flags['mergeDoc']
2057d101cc1SGerry Weißbach			if ( $renderer->meta['sitetoc']['mergeDoc'] === true ) { // || (count($renderer->meta['sitetoc']['siteexportTOC']) > 0 && $renderer->meta['sitetoc']['siteexportMergeDoc'] === true) ) {
2067d101cc1SGerry Weißbach				$this->mergedPages[] = $SID;
2077d101cc1SGerry Weißbach				$default = $renderer->_simpleTitle($SID); $isImage = false;
2087d101cc1SGerry Weißbach				resolve_pageid(getNS($ID),$SID,$exists);
2097d101cc1SGerry Weißbach
2107d101cc1SGerry Weißbach				$NAME = empty($NAME) ? p_get_first_heading($SID,true) : $NAME;
2117d101cc1SGerry Weißbach				$LNID = "$ID#" . sectionID($SID, $check);
2127d101cc1SGerry Weißbach			}
2137d101cc1SGerry Weißbach
2147d101cc1SGerry Weißbach			// Print normal internal link (XHTML odt)
2157d101cc1SGerry Weißbach			$renderer->internallink($LNID, $NAME, null);
2167d101cc1SGerry Weißbach
2177d101cc1SGerry Weißbach			// Display Description underneath
2187d101cc1SGerry Weißbach			if ( $renderer->meta['sitetoc']['showDescription'] === true ) {
2197d101cc1SGerry Weißbach				// $renderer->p_open();
2207d101cc1SGerry Weißbach				$renderer->cdata(p_get_metadata($SID, 'description abstract', true));
2217d101cc1SGerry Weißbach				// $renderer->p_close();
2227d101cc1SGerry Weißbach			}
2237d101cc1SGerry Weißbach
2247d101cc1SGerry Weißbach			// Render Metadata
2257d101cc1SGerry Weißbach		} else if ($mode == 'metadata') {
2267d101cc1SGerry Weißbach			if ( !is_array($data) && $data == 'save__meta' ) {
2277d101cc1SGerry Weißbach				$renderer->meta['sitetoc']['siteexportTOC'] = $this->savedToc;
2287d101cc1SGerry Weißbach
2297d101cc1SGerry Weißbach                foreach ($this->savedToc as $page) {
2307d101cc1SGerry Weißbach                    $renderer->meta['relation']['references'][$page['id']] = $page['exists'];
2317d101cc1SGerry Weißbach                }
2327d101cc1SGerry Weißbach
2337d101cc1SGerry Weißbach				$this->savedToc = array();
2347d101cc1SGerry Weißbach			} else if ( !isset($data['start']) && !isset($data['pos']) ) {
2357d101cc1SGerry Weißbach				$this->savedToc[] = $this->__addTocItem($SID, $NAME, $DEPTH, $renderer);
2367d101cc1SGerry Weißbach			}
2377d101cc1SGerry Weißbach		} else {
2387d101cc1SGerry Weißbach			return false;
2397d101cc1SGerry Weißbach		}
2407d101cc1SGerry Weißbach
2417d101cc1SGerry Weißbach		return true;
2427d101cc1SGerry Weißbach	}
2437d101cc1SGerry Weißbach
2447d101cc1SGerry Weißbach	/*
2457d101cc1SGerry Weißbach	 * pull apart the ID and create an Entry for the TOC
2467d101cc1SGerry Weißbach	 */
2477d101cc1SGerry Weißbach	function __addTocItem($id, $name, $depth, $renderer) {
2487d101cc1SGerry Weißbach		global $conf;
2497d101cc1SGerry Weißbach		global $ID;
2507d101cc1SGerry Weißbach
2517d101cc1SGerry Weißbach		// Render Title
2527d101cc1SGerry Weißbach		$default = $renderer->_simpleTitle($id);
2537d101cc1SGerry Weißbach		$exists = false; $isImage = false; $linktype = null;
2547d101cc1SGerry Weißbach		resolve_pageid(getNS($ID),$id,$exists);
2557d101cc1SGerry Weißbach		$name = $renderer->_getLinkTitle($name, $default, $isImage, $id, $linktype);
2567d101cc1SGerry Weißbach
2577d101cc1SGerry Weißbach		//keep hash anchor
2587d101cc1SGerry Weißbach		list($id,$hash) = explode('#',$id,2);
2597d101cc1SGerry Weißbach		if(!empty($hash)) $hash = $renderer->_headerToLink($hash);
2607d101cc1SGerry Weißbach
2617d101cc1SGerry Weißbach		// Build Sitetoc Item
2627d101cc1SGerry Weißbach		$item = array();
2637d101cc1SGerry Weißbach		$item['id'] = $id;
2647d101cc1SGerry Weißbach		$item['name'] = $name;
2657d101cc1SGerry Weißbach		$item['anchor'] = $hash;
2667d101cc1SGerry Weißbach		$item['depth'] = $depth;
2677d101cc1SGerry Weißbach		$item['exists'] = $exists;
2687d101cc1SGerry Weißbach		if(!$conf['skipacl'] && auth_quickaclcheck($item['id']) < AUTH_READ){
2697d101cc1SGerry Weißbach			return false;
2707d101cc1SGerry Weißbach		}
2717d101cc1SGerry Weißbach
2727d101cc1SGerry Weißbach		return $item;
2737d101cc1SGerry Weißbach	}
2747d101cc1SGerry Weißbach
2757d101cc1SGerry Weißbach	/*
2767d101cc1SGerry Weißbach	 * Render the output of one page
2777d101cc1SGerry Weißbach	 */
2787d101cc1SGerry Weißbach	function _render_output($renderer, $addID, $mode) {
2797d101cc1SGerry Weißbach		global $ID;
2807d101cc1SGerry Weißbach
2817d101cc1SGerry Weißbach		//get data(in instructions format) from $file (dont use cache: false)
2827d101cc1SGerry Weißbach		$file    = wikiFN($addID);
2837d101cc1SGerry Weißbach		$instr   = p_cached_instructions($file, false);
2847d101cc1SGerry Weißbach
2857d101cc1SGerry Weißbach		//page was empty
2867d101cc1SGerry Weißbach		if (empty($instr)) {
2877d101cc1SGerry Weißbach			return;
2887d101cc1SGerry Weißbach		}
2897d101cc1SGerry Weißbach
2907d101cc1SGerry Weißbach		// Convert Link instructions
2917d101cc1SGerry Weißbach		$instr   = $this->_convertInstructions($instr, $addID, $renderer);
2927d101cc1SGerry Weißbach
2937d101cc1SGerry Weißbach
2947d101cc1SGerry Weißbach		// Section IDs
2957d101cc1SGerry Weißbach		$check = null;
2967d101cc1SGerry Weißbach		$addID = sectionID($addID, $check);	//not possible to use a:b:c for id
2977d101cc1SGerry Weißbach
2987d101cc1SGerry Weißbach		if ( $mode == 'xhtml' ) {
2997d101cc1SGerry Weißbach			//--------RENDER
3007d101cc1SGerry Weißbach			//renderer information(TOC build / Cache used)
3017d101cc1SGerry Weißbach			$info = array();
3027d101cc1SGerry Weißbach			$content = p_render($mode, $instr, $info);
3037d101cc1SGerry Weißbach
3047d101cc1SGerry Weißbach			//Remove TOC`s, section edit buttons and tags
3057d101cc1SGerry Weißbach			$content = $this->_cleanXHTML($content);
3067d101cc1SGerry Weißbach
3077d101cc1SGerry Weißbach
3087d101cc1SGerry Weißbach			// embed the included page
3097d101cc1SGerry Weißbach			$renderer->doc .= '<div class="include">';
3107d101cc1SGerry Weißbach			//add an anchor to find start of a inserted page
3117d101cc1SGerry Weißbach			$renderer->doc .= "<a name='$addID' id='$addID'>";
3127d101cc1SGerry Weißbach			$renderer->doc .= $content;
3137d101cc1SGerry Weißbach			$renderer->doc .= '</div>';
3147d101cc1SGerry Weißbach		} else if ( $mode == 'odt') {
3157d101cc1SGerry Weißbach
3167d101cc1SGerry Weißbach			$renderer->doc .= '<text:bookmark text:name="'.$addID.'"/>';
3177d101cc1SGerry Weißbach
3187d101cc1SGerry Weißbach			// Loop through the instructions
3197d101cc1SGerry Weißbach			foreach ( $instr as $instruction ) {
3207d101cc1SGerry Weißbach				// Execute the callback against the Renderer
3217d101cc1SGerry Weißbach				call_user_func_array(array($renderer, $instruction[0]),$instruction[1]);
3227d101cc1SGerry Weißbach			}
3237d101cc1SGerry Weißbach		}
3247d101cc1SGerry Weißbach	}
3257d101cc1SGerry Weißbach
3267d101cc1SGerry Weißbach
3277d101cc1SGerry Weißbach	/*
3287d101cc1SGerry Weißbach	 * Corrects relative internal links and media and
3297d101cc1SGerry Weißbach	 * converts headers of included pages to subheaders of the current page
3307d101cc1SGerry Weißbach	 */
3317d101cc1SGerry Weißbach	function _convertInstructions($instr, $id, &$renderer) {
3327d101cc1SGerry Weißbach		global $ID;
3337d101cc1SGerry Weißbach		global $conf;
3347d101cc1SGerry Weißbach
3357d101cc1SGerry Weißbach		$n = count($instr);
3367d101cc1SGerry Weißbach
3377d101cc1SGerry Weißbach		for ($i = 0; $i < $n; $i++){
3387d101cc1SGerry Weißbach			//internal links(links inside this wiki) an relative links
3397d101cc1SGerry Weißbach			if((substr($instr[$i][0], 0, 12) == 'internallink')){
3407d101cc1SGerry Weißbach				$this->_convert_link($renderer,$instr[$i],$id);
3417d101cc1SGerry Weißbach			}
3427d101cc1SGerry Weißbach			else if((substr($instr[$i][0], 0, 13) == 'internalmedia')){
3437d101cc1SGerry Weißbach				$this->_convert_media($renderer,$instr[$i],$id);
3447d101cc1SGerry Weißbach			}
3457d101cc1SGerry Weißbach		}
3467d101cc1SGerry Weißbach
3477d101cc1SGerry Weißbach		//if its the document start, cut off the first element(document information)
3487d101cc1SGerry Weißbach		if ($instr[0][0] == 'document_start')
3497d101cc1SGerry Weißbach		return array_slice($instr, 1, -1);
3507d101cc1SGerry Weißbach		else
3517d101cc1SGerry Weißbach		return $instr;
3527d101cc1SGerry Weißbach	}
3537d101cc1SGerry Weißbach
3547d101cc1SGerry Weißbach
3557d101cc1SGerry Weißbach	/*
3567d101cc1SGerry Weißbach	 * Convert link of given instruction
3577d101cc1SGerry Weißbach	 */
3587d101cc1SGerry Weißbach	function _convert_link(&$renderer,&$instr,$id) {
3597d101cc1SGerry Weißbach		global $ID;
3607d101cc1SGerry Weißbach
3617d101cc1SGerry Weißbach		$exists = false;
3627d101cc1SGerry Weißbach
3637d101cc1SGerry Weißbach		resolve_pageid(getNS($id),$instr[1][0],$exists);
3647d101cc1SGerry Weißbach		list( $pageID, $pageReference ) = explode("#", $instr[1][0], 2);
3657d101cc1SGerry Weißbach
3667d101cc1SGerry Weißbach		if ( in_array($pageID, $this->includedPages) ) {
3677d101cc1SGerry Weißbach			// Crate new internal Links
3687d101cc1SGerry Weißbach			$check = null;
3697d101cc1SGerry Weißbach
3707d101cc1SGerry Weißbach			// Either get existing reference or create from first heading. If still not there take the alternate ID
3717d101cc1SGerry Weißbach			$pageNameLink = empty( $pageReference ) ? sectionID($pageID,$check) : $pageReference;
3727d101cc1SGerry Weißbach
3737d101cc1SGerry Weißbach			$instr[1][0] = $ID . "#" . $pageNameLink;
3747d101cc1SGerry Weißbach
3757d101cc1SGerry Weißbach		} else {
3767d101cc1SGerry Weißbach			// Convert external Links to plain Text
3777d101cc1SGerry Weißbach
3787d101cc1SGerry Weißbach			$instr = array(
3797d101cc1SGerry Weißbach						"cdata",
3807d101cc1SGerry Weißbach			array($instr[1][1]),
3817d101cc1SGerry Weißbach			$instr[2]
3827d101cc1SGerry Weißbach			);
3837d101cc1SGerry Weißbach		}
3847d101cc1SGerry Weißbach	}
3857d101cc1SGerry Weißbach
3867d101cc1SGerry Weißbach	/*
3877d101cc1SGerry Weißbach	 * Convert internalmedia of given instruction
3887d101cc1SGerry Weißbach	 */
3897d101cc1SGerry Weißbach	function _convert_media(&$renderer,&$instr,$id) {
3907d101cc1SGerry Weißbach		global $ID;
3917d101cc1SGerry Weißbach
3927d101cc1SGerry Weißbach		// Resolvemedia returns the absolute path to media by reference
3937d101cc1SGerry Weißbach		$exists = false;
3947d101cc1SGerry Weißbach		resolve_mediaid(getNS($id),$instr[1][0],$exists);
3957d101cc1SGerry Weißbach	}
3967d101cc1SGerry Weißbach
3977d101cc1SGerry Weißbach	/**
3987d101cc1SGerry Weißbach	 * Remove TOC, section edit buttons and tags
3997d101cc1SGerry Weißbach	 */
4007d101cc1SGerry Weißbach	function _cleanXHTML($xhtml){
4017d101cc1SGerry Weißbach		$replace  = array(
4027d101cc1SGerry Weißbach			'!<div class="toc">.*?(</div>\n</div>)!s' => '', // remove TOCs
4037d101cc1SGerry Weißbach			'#<!-- SECTION \[(\d*-\d*)\] -->#e'       => '', // remove section edit buttons
4047d101cc1SGerry Weißbach			'!<div id="tags">.*?(</div>)!s'           => ''  // remove category tags
4057d101cc1SGerry Weißbach		);
4067d101cc1SGerry Weißbach		$xhtml  = preg_replace(array_keys($replace), array_values($replace), $xhtml);
4077d101cc1SGerry Weißbach		return $xhtml;
4087d101cc1SGerry Weißbach	}
4097d101cc1SGerry Weißbach
4107d101cc1SGerry Weißbach
4117d101cc1SGerry Weißbach	/**
4127d101cc1SGerry Weißbach	 * Allow the plugin to prevent DokuWiki creating a second instance of itself
4137d101cc1SGerry Weißbach	 *
4147d101cc1SGerry Weißbach	 * @return bool   true if the plugin can not be instantiated more than once
4157d101cc1SGerry Weißbach	 */
4167d101cc1SGerry Weißbach	function isSingleton() {
4177d101cc1SGerry Weißbach		return true;
4187d101cc1SGerry Weißbach	}
4197d101cc1SGerry Weißbach}
4207d101cc1SGerry Weißbach// vim:ts=4:sw=4:et:enc=utf-8:
421