1*7d101cc1SGerry Weißbach<?php 2*7d101cc1SGerry Weißbach/** 3*7d101cc1SGerry Weißbach * Render Plugin for XHTML without details link for internal images. 4*7d101cc1SGerry Weißbach * 5*7d101cc1SGerry Weißbach * @author i-net software <tools@inetsoftware.de> 6*7d101cc1SGerry Weißbach */ 7*7d101cc1SGerry Weißbach 8*7d101cc1SGerry Weißbachif(!defined('DOKU_INC')) die(); 9*7d101cc1SGerry Weißbachif(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/'); 10*7d101cc1SGerry Weißbach 11*7d101cc1SGerry Weißbachrequire_once DOKU_INC . 'inc/parser/xhtml.php'; 12*7d101cc1SGerry Weißbach 13*7d101cc1SGerry Weißbach/** 14*7d101cc1SGerry Weißbach * The Renderer 15*7d101cc1SGerry Weißbach */ 16*7d101cc1SGerry Weißbachclass renderer_plugin_siteexport_pdf extends Doku_Renderer_xhtml { 17*7d101cc1SGerry Weißbach 18*7d101cc1SGerry Weißbach var $acronymsExchanged = null; 19*7d101cc1SGerry Weißbach var $hasSeenHeader = false; 20*7d101cc1SGerry Weißbach var $scriptmode = false; 21*7d101cc1SGerry Weißbach 22*7d101cc1SGerry Weißbach var $currentLevel = 0; 23*7d101cc1SGerry Weißbach var $startlevel = 0; // level to start with numbered headings (default = 2) 24*7d101cc1SGerry Weißbach var $levels = array( '======'=>1, 25*7d101cc1SGerry Weißbach '====='=>2, 26*7d101cc1SGerry Weißbach '===='=>3, 27*7d101cc1SGerry Weißbach '==='=>4, 28*7d101cc1SGerry Weißbach '=='=>5); 29*7d101cc1SGerry Weißbach 30*7d101cc1SGerry Weißbach var $info = array( 31*7d101cc1SGerry Weißbach 'cache' => true, // may the rendered result cached? 32*7d101cc1SGerry Weißbach 'toc' => true, // render the TOC? 33*7d101cc1SGerry Weißbach 'forceTOC' => false, // shall I force the TOC? 34*7d101cc1SGerry Weißbach 'scriptmode' => false, // In scriptmode, some tags will not be encoded => '<%', '%>' 35*7d101cc1SGerry Weißbach ); 36*7d101cc1SGerry Weißbach 37*7d101cc1SGerry Weißbach var $headingCount = 38*7d101cc1SGerry Weißbach array( 1=>0, 39*7d101cc1SGerry Weißbach 2=>0, 40*7d101cc1SGerry Weißbach 3=>0, 41*7d101cc1SGerry Weißbach 4=>0, 42*7d101cc1SGerry Weißbach 5=>0); 43*7d101cc1SGerry Weißbach 44*7d101cc1SGerry Weißbach /** 45*7d101cc1SGerry Weißbach * return some info 46*7d101cc1SGerry Weißbach */ 47*7d101cc1SGerry Weißbach function getInfo(){ 48*7d101cc1SGerry Weißbach if ( method_exists(parent, 'getInfo')) { 49*7d101cc1SGerry Weißbach $info = parent::getInfo(); 50*7d101cc1SGerry Weißbach } 51*7d101cc1SGerry Weißbach return array_merge(is_array($info) ? $info : confToHash(dirname(__FILE__).'/../plugin.info.txt'), array( 52*7d101cc1SGerry Weißbach 53*7d101cc1SGerry Weißbach )); 54*7d101cc1SGerry Weißbach } 55*7d101cc1SGerry Weißbach 56*7d101cc1SGerry Weißbach function document_start() { 57*7d101cc1SGerry Weißbach global $TOC, $ID, $INFO; 58*7d101cc1SGerry Weißbach 59*7d101cc1SGerry Weißbach parent::document_start(); 60*7d101cc1SGerry Weißbach 61*7d101cc1SGerry Weißbach // Cheating in again 62*7d101cc1SGerry Weißbach $newMeta = p_get_metadata($ID, 'description tableofcontents', false); // 2010-10-23 This should be save to use 63*7d101cc1SGerry Weißbach if ( !empty( $newMeta ) && count($newMeta) > 1 ) { 64*7d101cc1SGerry Weißbach // $TOC = $this->toc = $newMeta; // 2010-08-23 doubled the TOC 65*7d101cc1SGerry Weißbach $TOC = $newMeta; 66*7d101cc1SGerry Weißbach } 67*7d101cc1SGerry Weißbach } 68*7d101cc1SGerry Weißbach 69*7d101cc1SGerry Weißbach function document_end() { 70*7d101cc1SGerry Weißbach 71*7d101cc1SGerry Weißbach parent::document_end(); 72*7d101cc1SGerry Weißbach 73*7d101cc1SGerry Weißbach // Prepare the TOC 74*7d101cc1SGerry Weißbach global $TOC, $ID; 75*7d101cc1SGerry Weißbach $meta = array(); 76*7d101cc1SGerry Weißbach 77*7d101cc1SGerry Weißbach // NOTOC, and no forceTOC 78*7d101cc1SGerry Weißbach if ( $this->info['toc'] === false && !($this->info['forceTOC'] || $this->meta['forceTOC']) ) { 79*7d101cc1SGerry Weißbach $TOC = $this->toc = array(); 80*7d101cc1SGerry Weißbach $meta['internal']['toc'] = false; 81*7d101cc1SGerry Weißbach $meta['description']['tableofcontents'] = array(); 82*7d101cc1SGerry Weißbach $meta['forceTOC'] = false; 83*7d101cc1SGerry Weißbach 84*7d101cc1SGerry Weißbach } else if ( $this->info['forceTOC'] || $this->meta['forceTOC'] || (utf8_strlen(strip_tags($this->doc)) >= $this->getConf('documentlengthfortoc') && count($this->toc) > 1 ) ) { 85*7d101cc1SGerry Weißbach $TOC = $this->toc; 86*7d101cc1SGerry Weißbach // This is a little bit like cheating ... but this will force the TOC into the metadata 87*7d101cc1SGerry Weißbach $meta = array(); 88*7d101cc1SGerry Weißbach $meta['internal']['toc'] = true; 89*7d101cc1SGerry Weißbach $meta['forceTOC'] = $this->info['forceTOC'] || $this->meta['forceTOC']; 90*7d101cc1SGerry Weißbach $meta['description']['tableofcontents'] = $TOC; 91*7d101cc1SGerry Weißbach } 92*7d101cc1SGerry Weißbach 93*7d101cc1SGerry Weißbach // allways write new metadata 94*7d101cc1SGerry Weißbach p_set_metadata($ID, $meta); 95*7d101cc1SGerry Weißbach $this->doc = preg_replace('#<p( class=".*?")?>\s*</p>#','',$this->doc); 96*7d101cc1SGerry Weißbach } 97*7d101cc1SGerry Weißbach 98*7d101cc1SGerry Weißbach function header($text, $level, $pos) { 99*7d101cc1SGerry Weißbach global $conf; 100*7d101cc1SGerry Weißbach global $ID; 101*7d101cc1SGerry Weißbach global $INFO; 102*7d101cc1SGerry Weißbach 103*7d101cc1SGerry Weißbach if($text) 104*7d101cc1SGerry Weißbach { 105*7d101cc1SGerry Weißbach $hid = $this->_headerToLink($text,true); 106*7d101cc1SGerry Weißbach 107*7d101cc1SGerry Weißbach //only add items within configured levels 108*7d101cc1SGerry Weißbach $this->toc_additem($hid, $text, $level); 109*7d101cc1SGerry Weißbach 110*7d101cc1SGerry Weißbach // adjust $node to reflect hierarchy of levels 111*7d101cc1SGerry Weißbach $this->node[$level-1]++; 112*7d101cc1SGerry Weißbach if ($level < $this->lastlevel) { 113*7d101cc1SGerry Weißbach for ($i = 0; $i < $this->lastlevel-$level; $i++) { 114*7d101cc1SGerry Weißbach $this->node[$this->lastlevel-$i-1] = 0; 115*7d101cc1SGerry Weißbach } 116*7d101cc1SGerry Weißbach } 117*7d101cc1SGerry Weißbach $this->lastlevel = $level; 118*7d101cc1SGerry Weißbach 119*7d101cc1SGerry Weißbach 120*7d101cc1SGerry Weißbach /* There should be no class for "sectioneditX" if there is no edit perm */ 121*7d101cc1SGerry Weißbach if ($INFO['perm'] > AUTH_READ && 122*7d101cc1SGerry Weißbach $level <= $conf['maxseclevel'] && 123*7d101cc1SGerry Weißbach count($this->sectionedits) > 0 && 124*7d101cc1SGerry Weißbach $this->sectionedits[count($this->sectionedits) - 1][2] === 'section') { 125*7d101cc1SGerry Weißbach $this->finishSectionEdit($pos - 1); 126*7d101cc1SGerry Weißbach } 127*7d101cc1SGerry Weißbach 128*7d101cc1SGerry Weißbach $headingNumber = ''; 129*7d101cc1SGerry Weißbach $useNumbered = p_get_metadata($ID, 'usenumberedheading', true); // 2011-02-07 This should be save to use 130*7d101cc1SGerry Weißbach if ( $this->getConf('usenumberedheading') || !empty($useNumbered) || !empty($INFO['meta']['usenumberedheading']) || isset($_REQUEST['usenumberedheading'])) { 131*7d101cc1SGerry Weißbach 132*7d101cc1SGerry Weißbach // increment the number of the heading 133*7d101cc1SGerry Weißbach $this->headingCount[$level]++; 134*7d101cc1SGerry Weißbach 135*7d101cc1SGerry Weißbach // build the actual number 136*7d101cc1SGerry Weißbach for ($i=1;$i<=5;$i++) { 137*7d101cc1SGerry Weißbach 138*7d101cc1SGerry Weißbach // reset the number of the subheadings 139*7d101cc1SGerry Weißbach if ($i>$level) { 140*7d101cc1SGerry Weißbach $this->headingCount[$i] = 0; 141*7d101cc1SGerry Weißbach } 142*7d101cc1SGerry Weißbach 143*7d101cc1SGerry Weißbach // build the number of the heading 144*7d101cc1SGerry Weißbach $headingNumber .= $this->headingCount[$i] . '.'; 145*7d101cc1SGerry Weißbach } 146*7d101cc1SGerry Weißbach 147*7d101cc1SGerry Weißbach $headingNumber = preg_replace("/(\.0)+\.?$/", '', $headingNumber) . ' '; 148*7d101cc1SGerry Weißbach } 149*7d101cc1SGerry Weißbach 150*7d101cc1SGerry Weißbach // write the header 151*7d101cc1SGerry Weißbach $this->doc .= DOKU_LF.'<h'.$level; 152*7d101cc1SGerry Weißbach if ($INFO['perm'] > AUTH_READ && 153*7d101cc1SGerry Weißbach $level <= $conf['maxseclevel']) { 154*7d101cc1SGerry Weißbach $this->doc .= ' class="' . $this->startSectionEdit($pos, 'section', $text) . '"'; 155*7d101cc1SGerry Weißbach } 156*7d101cc1SGerry Weißbach 157*7d101cc1SGerry Weißbach $this->doc .= '><a name="'.$hid.'" id="'.$hid.'">'; 158*7d101cc1SGerry Weißbach $this->doc .= $this->_xmlEntities($headingNumber . $text); 159*7d101cc1SGerry Weißbach $this->doc .= "</a></h$level>".DOKU_LF; 160*7d101cc1SGerry Weißbach 161*7d101cc1SGerry Weißbach } else if ( $INFO['perm'] > AUTH_READ ) { 162*7d101cc1SGerry Weißbach 163*7d101cc1SGerry Weißbach if ( $hasSeenHeader ) $this->finishSectionEdit($pos); 164*7d101cc1SGerry Weißbach 165*7d101cc1SGerry Weißbach // write the header 166*7d101cc1SGerry Weißbach $name = rand() . $level; 167*7d101cc1SGerry Weißbach $this->doc .= DOKU_LF.'<a name="'. $this->startSectionEdit($pos, 'section_empty', $name) .'" class="' . $this->startSectionEdit($pos, 'section_empty', $name) . '" ></a>'.DOKU_LF; 168*7d101cc1SGerry Weißbach } 169*7d101cc1SGerry Weißbach 170*7d101cc1SGerry Weißbach $hasSeenHeader = true; 171*7d101cc1SGerry Weißbach } 172*7d101cc1SGerry Weißbach 173*7d101cc1SGerry Weißbach function section_open($level) { 174*7d101cc1SGerry Weißbach $this->currentLevel = $level; 175*7d101cc1SGerry Weißbach } 176*7d101cc1SGerry Weißbach 177*7d101cc1SGerry Weißbach function section_close() {} 178*7d101cc1SGerry Weißbach 179*7d101cc1SGerry Weißbach function p_open() { 180*7d101cc1SGerry Weißbach $this->doc .= DOKU_LF.'<p class="level' . $this->currentLevel . '">'.DOKU_LF; 181*7d101cc1SGerry Weißbach } 182*7d101cc1SGerry Weißbach 183*7d101cc1SGerry Weißbach function listu_open() { 184*7d101cc1SGerry Weißbach $this->doc .= '<ul class="level' . $this->currentLevel . '">'.DOKU_LF; 185*7d101cc1SGerry Weißbach } 186*7d101cc1SGerry Weißbach 187*7d101cc1SGerry Weißbach function listo_open() { 188*7d101cc1SGerry Weißbach $this->doc .= '<ol class="level' . $this->currentLevel . '">'.DOKU_LF; 189*7d101cc1SGerry Weißbach } 190*7d101cc1SGerry Weißbach 191*7d101cc1SGerry Weißbach public function finishSectionEdit($end = null) { 192*7d101cc1SGerry Weißbach global $INFO; 193*7d101cc1SGerry Weißbach if ( $INFO['perm'] > AUTH_READ ) 194*7d101cc1SGerry Weißbach { 195*7d101cc1SGerry Weißbach return parent::finishSectionEdit($end); 196*7d101cc1SGerry Weißbach } 197*7d101cc1SGerry Weißbach } 198*7d101cc1SGerry Weißbach 199*7d101cc1SGerry Weißbach public function startSectionEdit($start, $type, $title = null) { 200*7d101cc1SGerry Weißbach global $INFO; 201*7d101cc1SGerry Weißbach if ( $INFO['perm'] > AUTH_READ ) 202*7d101cc1SGerry Weißbach { 203*7d101cc1SGerry Weißbach return parent::startSectionEdit($start, $type, $title); 204*7d101cc1SGerry Weißbach } 205*7d101cc1SGerry Weißbach 206*7d101cc1SGerry Weißbach return ""; 207*7d101cc1SGerry Weißbach } 208*7d101cc1SGerry Weißbach 209*7d101cc1SGerry Weißbach function internalmedia ($src, $title=NULL, $align=NULL, $width=NULL, 210*7d101cc1SGerry Weißbach $height=NULL, $cache=NULL, $linking=NULL) { 211*7d101cc1SGerry Weißbach global $ID; 212*7d101cc1SGerry Weißbach list($src,$hash) = explode('#',$src,2); 213*7d101cc1SGerry Weißbach resolve_mediaid(getNS($ID),$src, $exists); 214*7d101cc1SGerry Weißbach 215*7d101cc1SGerry Weißbach $noLink = false; 216*7d101cc1SGerry Weißbach $render = ($linking == 'linkonly') ? false : true; 217*7d101cc1SGerry Weißbach $link = $this->_getMediaLinkConf($src, $title, $align, $width, $height, $cache, $render); 218*7d101cc1SGerry Weißbach 219*7d101cc1SGerry Weißbach list($ext,$mime,$dl) = mimetype($src); 220*7d101cc1SGerry Weißbach if(substr($mime,0,5) == 'image' && $render){ 221*7d101cc1SGerry Weißbach $link['url'] = ml($src,array('id'=>$ID,'cache'=>$cache),($linking=='direct')); 222*7d101cc1SGerry Weißbach if ( substr($mime,0,5) == 'image' && $linking='details' ) { $noLink = true;} 223*7d101cc1SGerry Weißbach }elseif($mime == 'application/x-shockwave-flash' && $render){ 224*7d101cc1SGerry Weißbach // don't link flash movies 225*7d101cc1SGerry Weißbach $noLink = true; 226*7d101cc1SGerry Weißbach }else{ 227*7d101cc1SGerry Weißbach // add file icons 228*7d101cc1SGerry Weißbach $class = preg_replace('/[^_\-a-z0-9]+/i','_',$ext); 229*7d101cc1SGerry Weißbach $link['class'] .= ' mediafile mf_'.$class; 230*7d101cc1SGerry Weißbach $link['url'] = ml($src,array('id'=>$ID,'cache'=>$cache),true); 231*7d101cc1SGerry Weißbach } 232*7d101cc1SGerry Weißbach 233*7d101cc1SGerry Weißbach if($hash) $link['url'] .= '#'.$hash; 234*7d101cc1SGerry Weißbach 235*7d101cc1SGerry Weißbach //markup non existing files 236*7d101cc1SGerry Weißbach if (!$exists) 237*7d101cc1SGerry Weißbach $link['class'] .= ' wikilink2'; 238*7d101cc1SGerry Weißbach 239*7d101cc1SGerry Weißbach //output formatted 240*7d101cc1SGerry Weißbach if ($linking == 'nolink' || $noLink) $this->doc .= $link['name']; 241*7d101cc1SGerry Weißbach else $this->doc .= $this->_formatLink($link); 242*7d101cc1SGerry Weißbach } 243*7d101cc1SGerry Weißbach 244*7d101cc1SGerry Weißbach /** 245*7d101cc1SGerry Weißbach * Render an internal Wiki Link 246*7d101cc1SGerry Weißbach * 247*7d101cc1SGerry Weißbach * $search,$returnonly & $linktype are not for the renderer but are used 248*7d101cc1SGerry Weißbach * elsewhere - no need to implement them in other renderers 249*7d101cc1SGerry Weißbach * 250*7d101cc1SGerry Weißbach * @author Andreas Gohr <andi@splitbrain.org> 251*7d101cc1SGerry Weißbach */ 252*7d101cc1SGerry Weißbach function internallink($id, $name = NULL, $search=NULL,$returnonly=false,$linktype='content') { 253*7d101cc1SGerry Weißbach global $conf; 254*7d101cc1SGerry Weißbach global $ID; 255*7d101cc1SGerry Weißbach // default name is based on $id as given 256*7d101cc1SGerry Weißbach $default = $this->_simpleTitle($id); 257*7d101cc1SGerry Weißbach 258*7d101cc1SGerry Weißbach // now first resolve and clean up the $id 259*7d101cc1SGerry Weißbach resolve_pageid(getNS($ID),$id,$exists); 260*7d101cc1SGerry Weißbach $name = $this->_getLinkTitle($name, $default, $isImage, $id, $linktype); 261*7d101cc1SGerry Weißbach if ( !$isImage ) { 262*7d101cc1SGerry Weißbach if ( $exists ) { 263*7d101cc1SGerry Weißbach $class='wikilink1'; 264*7d101cc1SGerry Weißbach } else { 265*7d101cc1SGerry Weißbach $class='wikilink2'; 266*7d101cc1SGerry Weißbach $link['rel']='nofollow'; 267*7d101cc1SGerry Weißbach } 268*7d101cc1SGerry Weißbach } else { 269*7d101cc1SGerry Weißbach $class='media'; 270*7d101cc1SGerry Weißbach } 271*7d101cc1SGerry Weißbach 272*7d101cc1SGerry Weißbach //keep hash anchor 273*7d101cc1SGerry Weißbach list($id,$hash) = explode('#',$id,2); 274*7d101cc1SGerry Weißbach if(!empty($hash)) $hash = $this->_headerToLink($hash); 275*7d101cc1SGerry Weißbach 276*7d101cc1SGerry Weißbach //prepare for formating 277*7d101cc1SGerry Weißbach $link['target'] = $conf['target']['wiki']; 278*7d101cc1SGerry Weißbach $link['style'] = ''; 279*7d101cc1SGerry Weißbach $link['pre'] = ''; 280*7d101cc1SGerry Weißbach $link['suf'] = ''; 281*7d101cc1SGerry Weißbach // highlight link to current page 282*7d101cc1SGerry Weißbach if ($id == $ID) { 283*7d101cc1SGerry Weißbach $link['pre'] = '<span class="curid">'; 284*7d101cc1SGerry Weißbach $link['suf'] = '</span>'; 285*7d101cc1SGerry Weißbach } 286*7d101cc1SGerry Weißbach $link['more'] = ''; 287*7d101cc1SGerry Weißbach $link['class'] = $class; 288*7d101cc1SGerry Weißbach $link['url'] = wl($id); 289*7d101cc1SGerry Weißbach $link['name'] = $name; 290*7d101cc1SGerry Weißbach $link['title'] = $this->_getLinkTitle(null, $default, $isImage, $id, $linktype); 291*7d101cc1SGerry Weißbach 292*7d101cc1SGerry Weißbach //add search string 293*7d101cc1SGerry Weißbach if($search){ 294*7d101cc1SGerry Weißbach ($conf['userewrite']) ? $link['url'].='?' : $link['url'].='&'; 295*7d101cc1SGerry Weißbach if(is_array($search)){ 296*7d101cc1SGerry Weißbach $search = array_map('rawurlencode',$search); 297*7d101cc1SGerry Weißbach $link['url'] .= 's[]='.join('&s[]=',$search); 298*7d101cc1SGerry Weißbach }else{ 299*7d101cc1SGerry Weißbach $link['url'] .= 's='.rawurlencode($search); 300*7d101cc1SGerry Weißbach } 301*7d101cc1SGerry Weißbach } 302*7d101cc1SGerry Weißbach 303*7d101cc1SGerry Weißbach //keep hash 304*7d101cc1SGerry Weißbach if($hash) $link['url'].='#'.$hash; 305*7d101cc1SGerry Weißbach 306*7d101cc1SGerry Weißbach //output formatted 307*7d101cc1SGerry Weißbach if($returnonly){ 308*7d101cc1SGerry Weißbach return $this->_formatLink($link); 309*7d101cc1SGerry Weißbach }else{ 310*7d101cc1SGerry Weißbach $this->doc .= $this->_formatLink($link); 311*7d101cc1SGerry Weißbach } 312*7d101cc1SGerry Weißbach } 313*7d101cc1SGerry Weißbach 314*7d101cc1SGerry Weißbach function acronym($acronym) { 315*7d101cc1SGerry Weißbach 316*7d101cc1SGerry Weißbach if ( empty($this->acronymsExchanged) ) { 317*7d101cc1SGerry Weißbach $this->acronymsExchanged = $this->acronyms; 318*7d101cc1SGerry Weißbach $this->acronyms = array(); 319*7d101cc1SGerry Weißbach 320*7d101cc1SGerry Weißbach foreach( $this->acronymsExchanged as $key => $value ) { 321*7d101cc1SGerry Weißbach $this->acronyms[str_replace('_', ' ', $key)] = $value; 322*7d101cc1SGerry Weißbach } 323*7d101cc1SGerry Weißbach } 324*7d101cc1SGerry Weißbach 325*7d101cc1SGerry Weißbach parent::acronym($acronym); 326*7d101cc1SGerry Weißbach } 327*7d101cc1SGerry Weißbach 328*7d101cc1SGerry Weißbach function _xmlEntities($string) { 329*7d101cc1SGerry Weißbach 330*7d101cc1SGerry Weißbach $string = parent::_xmlEntities($string); 331*7d101cc1SGerry Weißbach 332*7d101cc1SGerry Weißbach if ( $this->info['scriptmode'] ) { 333*7d101cc1SGerry Weißbach $string = str_replace( array( "<%", "%>", "<?", "?>"), 334*7d101cc1SGerry Weißbach array( "<%", "%>", "<?", "?>"), 335*7d101cc1SGerry Weißbach $string); 336*7d101cc1SGerry Weißbach } 337*7d101cc1SGerry Weißbach 338*7d101cc1SGerry Weißbach return $string; 339*7d101cc1SGerry Weißbach } 340*7d101cc1SGerry Weißbach} 341*7d101cc1SGerry Weißbach 342*7d101cc1SGerry Weißbach//Setup VIM: ex: et ts=4 enc=utf-8 :