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