17d101cc1SGerry Weißbach<?php 27d101cc1SGerry Weißbach/** 37d101cc1SGerry Weißbach * Render Plugin for XHTML without details link for internal images. 47d101cc1SGerry Weißbach * 57d101cc1SGerry Weißbach * @author i-net software <tools@inetsoftware.de> 67d101cc1SGerry Weißbach */ 77d101cc1SGerry Weißbach 87d101cc1SGerry Weißbachif(!defined('DOKU_INC')) die(); 97d101cc1SGerry Weißbachif(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/'); 107d101cc1SGerry Weißbach 117d101cc1SGerry Weißbachrequire_once DOKU_INC . 'inc/parser/xhtml.php'; 127d101cc1SGerry Weißbach 137d101cc1SGerry Weißbach/** 147d101cc1SGerry Weißbach * The Renderer 157d101cc1SGerry Weißbach */ 167d101cc1SGerry Weißbachclass renderer_plugin_siteexport_pdf extends Doku_Renderer_xhtml { 177d101cc1SGerry Weißbach 187d101cc1SGerry Weißbach var $acronymsExchanged = null; 197d101cc1SGerry Weißbach var $hasSeenHeader = false; 207d101cc1SGerry Weißbach var $scriptmode = false; 217d101cc1SGerry Weißbach 227d101cc1SGerry Weißbach var $currentLevel = 0; 237d101cc1SGerry Weißbach var $startlevel = 0; // level to start with numbered headings (default = 2) 247d101cc1SGerry Weißbach var $levels = array( '======'=>1, 257d101cc1SGerry Weißbach '====='=>2, 267d101cc1SGerry Weißbach '===='=>3, 277d101cc1SGerry Weißbach '==='=>4, 287d101cc1SGerry Weißbach '=='=>5); 297d101cc1SGerry Weißbach 307d101cc1SGerry Weißbach var $info = array( 317d101cc1SGerry Weißbach 'cache' => true, // may the rendered result cached? 327d101cc1SGerry Weißbach 'toc' => true, // render the TOC? 337d101cc1SGerry Weißbach 'forceTOC' => false, // shall I force the TOC? 347d101cc1SGerry Weißbach 'scriptmode' => false, // In scriptmode, some tags will not be encoded => '<%', '%>' 357d101cc1SGerry Weißbach ); 367d101cc1SGerry Weißbach 377d101cc1SGerry Weißbach var $headingCount = 387d101cc1SGerry Weißbach array( 1=>0, 397d101cc1SGerry Weißbach 2=>0, 407d101cc1SGerry Weißbach 3=>0, 417d101cc1SGerry Weißbach 4=>0, 427d101cc1SGerry Weißbach 5=>0); 437d101cc1SGerry Weißbach 447d101cc1SGerry Weißbach /** 457d101cc1SGerry Weißbach * return some info 467d101cc1SGerry Weißbach */ 477d101cc1SGerry Weißbach function getInfo(){ 487d101cc1SGerry Weißbach if ( method_exists(parent, 'getInfo')) { 497d101cc1SGerry Weißbach $info = parent::getInfo(); 507d101cc1SGerry Weißbach } 517d101cc1SGerry Weißbach return array_merge(is_array($info) ? $info : confToHash(dirname(__FILE__).'/../plugin.info.txt'), array( 527d101cc1SGerry Weißbach 537d101cc1SGerry Weißbach )); 547d101cc1SGerry Weißbach } 557d101cc1SGerry Weißbach 567d101cc1SGerry Weißbach function document_start() { 577d101cc1SGerry Weißbach global $TOC, $ID, $INFO; 587d101cc1SGerry Weißbach 597d101cc1SGerry Weißbach parent::document_start(); 607d101cc1SGerry Weißbach 617d101cc1SGerry Weißbach // Cheating in again 627d101cc1SGerry Weißbach $newMeta = p_get_metadata($ID, 'description tableofcontents', false); // 2010-10-23 This should be save to use 637d101cc1SGerry Weißbach if ( !empty( $newMeta ) && count($newMeta) > 1 ) { 647d101cc1SGerry Weißbach // $TOC = $this->toc = $newMeta; // 2010-08-23 doubled the TOC 657d101cc1SGerry Weißbach $TOC = $newMeta; 667d101cc1SGerry Weißbach } 677d101cc1SGerry Weißbach } 687d101cc1SGerry Weißbach 697d101cc1SGerry Weißbach function document_end() { 707d101cc1SGerry Weißbach 717d101cc1SGerry Weißbach parent::document_end(); 727d101cc1SGerry Weißbach 737d101cc1SGerry Weißbach // Prepare the TOC 747d101cc1SGerry Weißbach global $TOC, $ID; 757d101cc1SGerry Weißbach $meta = array(); 767d101cc1SGerry Weißbach 777d101cc1SGerry Weißbach // NOTOC, and no forceTOC 787d101cc1SGerry Weißbach if ( $this->info['toc'] === false && !($this->info['forceTOC'] || $this->meta['forceTOC']) ) { 797d101cc1SGerry Weißbach $TOC = $this->toc = array(); 807d101cc1SGerry Weißbach $meta['internal']['toc'] = false; 817d101cc1SGerry Weißbach $meta['description']['tableofcontents'] = array(); 827d101cc1SGerry Weißbach $meta['forceTOC'] = false; 837d101cc1SGerry Weißbach 847d101cc1SGerry Weißbach } else if ( $this->info['forceTOC'] || $this->meta['forceTOC'] || (utf8_strlen(strip_tags($this->doc)) >= $this->getConf('documentlengthfortoc') && count($this->toc) > 1 ) ) { 857d101cc1SGerry Weißbach $TOC = $this->toc; 867d101cc1SGerry Weißbach // This is a little bit like cheating ... but this will force the TOC into the metadata 877d101cc1SGerry Weißbach $meta = array(); 887d101cc1SGerry Weißbach $meta['internal']['toc'] = true; 897d101cc1SGerry Weißbach $meta['forceTOC'] = $this->info['forceTOC'] || $this->meta['forceTOC']; 907d101cc1SGerry Weißbach $meta['description']['tableofcontents'] = $TOC; 917d101cc1SGerry Weißbach } 927d101cc1SGerry Weißbach 937d101cc1SGerry Weißbach // allways write new metadata 947d101cc1SGerry Weißbach p_set_metadata($ID, $meta); 957d101cc1SGerry Weißbach $this->doc = preg_replace('#<p( class=".*?")?>\s*</p>#','',$this->doc); 967d101cc1SGerry Weißbach } 977d101cc1SGerry Weißbach 987d101cc1SGerry Weißbach function header($text, $level, $pos) { 997d101cc1SGerry Weißbach global $conf; 1007d101cc1SGerry Weißbach global $ID; 1017d101cc1SGerry Weißbach global $INFO; 1027d101cc1SGerry Weißbach 1037d101cc1SGerry Weißbach if($text) 1047d101cc1SGerry Weißbach { 1057d101cc1SGerry Weißbach $hid = $this->_headerToLink($text,true); 1067d101cc1SGerry Weißbach 1077d101cc1SGerry Weißbach //only add items within configured levels 1087d101cc1SGerry Weißbach $this->toc_additem($hid, $text, $level); 1097d101cc1SGerry Weißbach 1107d101cc1SGerry Weißbach // adjust $node to reflect hierarchy of levels 1117d101cc1SGerry Weißbach $this->node[$level-1]++; 1127d101cc1SGerry Weißbach if ($level < $this->lastlevel) { 1137d101cc1SGerry Weißbach for ($i = 0; $i < $this->lastlevel-$level; $i++) { 1147d101cc1SGerry Weißbach $this->node[$this->lastlevel-$i-1] = 0; 1157d101cc1SGerry Weißbach } 1167d101cc1SGerry Weißbach } 1177d101cc1SGerry Weißbach $this->lastlevel = $level; 1187d101cc1SGerry Weißbach 1197d101cc1SGerry Weißbach 1207d101cc1SGerry Weißbach /* There should be no class for "sectioneditX" if there is no edit perm */ 1217d101cc1SGerry Weißbach if ($INFO['perm'] > AUTH_READ && 1227d101cc1SGerry Weißbach $level <= $conf['maxseclevel'] && 1237d101cc1SGerry Weißbach count($this->sectionedits) > 0 && 1247d101cc1SGerry Weißbach $this->sectionedits[count($this->sectionedits) - 1][2] === 'section') { 1257d101cc1SGerry Weißbach $this->finishSectionEdit($pos - 1); 1267d101cc1SGerry Weißbach } 1277d101cc1SGerry Weißbach 1287d101cc1SGerry Weißbach $headingNumber = ''; 1297d101cc1SGerry Weißbach $useNumbered = p_get_metadata($ID, 'usenumberedheading', true); // 2011-02-07 This should be save to use 1307d101cc1SGerry Weißbach if ( $this->getConf('usenumberedheading') || !empty($useNumbered) || !empty($INFO['meta']['usenumberedheading']) || isset($_REQUEST['usenumberedheading'])) { 1317d101cc1SGerry Weißbach 1327d101cc1SGerry Weißbach // increment the number of the heading 1337d101cc1SGerry Weißbach $this->headingCount[$level]++; 1347d101cc1SGerry Weißbach 1357d101cc1SGerry Weißbach // build the actual number 1367d101cc1SGerry Weißbach for ($i=1;$i<=5;$i++) { 1377d101cc1SGerry Weißbach 1387d101cc1SGerry Weißbach // reset the number of the subheadings 1397d101cc1SGerry Weißbach if ($i>$level) { 1407d101cc1SGerry Weißbach $this->headingCount[$i] = 0; 1417d101cc1SGerry Weißbach } 1427d101cc1SGerry Weißbach 1437d101cc1SGerry Weißbach // build the number of the heading 1447d101cc1SGerry Weißbach $headingNumber .= $this->headingCount[$i] . '.'; 1457d101cc1SGerry Weißbach } 1467d101cc1SGerry Weißbach 1477d101cc1SGerry Weißbach $headingNumber = preg_replace("/(\.0)+\.?$/", '', $headingNumber) . ' '; 1487d101cc1SGerry Weißbach } 1497d101cc1SGerry Weißbach 1507d101cc1SGerry Weißbach // write the header 1517d101cc1SGerry Weißbach $this->doc .= DOKU_LF.'<h'.$level; 152*7ddc12e6SGerry Weißbach $class = array(); 1537d101cc1SGerry Weißbach if ($INFO['perm'] > AUTH_READ && 1547d101cc1SGerry Weißbach $level <= $conf['maxseclevel']) { 155*7ddc12e6SGerry Weißbach $class[] = $this->startSectionEdit($pos, 'section', $text); 156*7ddc12e6SGerry Weißbach } 157*7ddc12e6SGerry Weißbach 158*7ddc12e6SGerry Weißbach if ( !empty($headingNumber) ) { 159*7ddc12e6SGerry Weißbach $class[] = 'level' . trim($headingNumber); 160*7ddc12e6SGerry Weißbach if ( $headingNumber[0] != '1' ) { 161*7ddc12e6SGerry Weißbach $class[] = 'notfirst'; 162*7ddc12e6SGerry Weißbach } else { 163*7ddc12e6SGerry Weißbach $class[] = 'first'; 164*7ddc12e6SGerry Weißbach } 165*7ddc12e6SGerry Weißbach } 166*7ddc12e6SGerry Weißbach 167*7ddc12e6SGerry Weißbach if ( !empty($class) ) { 168*7ddc12e6SGerry Weißbach $this->doc .= ' class="' . implode(' ', $class) . '"'; 1697d101cc1SGerry Weißbach } 1707d101cc1SGerry Weißbach 1717d101cc1SGerry Weißbach $this->doc .= '><a name="'.$hid.'" id="'.$hid.'">'; 1727d101cc1SGerry Weißbach $this->doc .= $this->_xmlEntities($headingNumber . $text); 1737d101cc1SGerry Weißbach $this->doc .= "</a></h$level>".DOKU_LF; 1747d101cc1SGerry Weißbach 1757d101cc1SGerry Weißbach } else if ( $INFO['perm'] > AUTH_READ ) { 1767d101cc1SGerry Weißbach 1777d101cc1SGerry Weißbach if ( $hasSeenHeader ) $this->finishSectionEdit($pos); 1787d101cc1SGerry Weißbach 1797d101cc1SGerry Weißbach // write the header 1807d101cc1SGerry Weißbach $name = rand() . $level; 1817d101cc1SGerry Weißbach $this->doc .= DOKU_LF.'<a name="'. $this->startSectionEdit($pos, 'section_empty', $name) .'" class="' . $this->startSectionEdit($pos, 'section_empty', $name) . '" ></a>'.DOKU_LF; 1827d101cc1SGerry Weißbach } 1837d101cc1SGerry Weißbach 1847d101cc1SGerry Weißbach $hasSeenHeader = true; 1857d101cc1SGerry Weißbach } 1867d101cc1SGerry Weißbach 1877d101cc1SGerry Weißbach function section_open($level) { 1887d101cc1SGerry Weißbach $this->currentLevel = $level; 1897d101cc1SGerry Weißbach } 1907d101cc1SGerry Weißbach 1917d101cc1SGerry Weißbach function section_close() {} 1927d101cc1SGerry Weißbach 1937d101cc1SGerry Weißbach function p_open() { 1947d101cc1SGerry Weißbach $this->doc .= DOKU_LF.'<p class="level' . $this->currentLevel . '">'.DOKU_LF; 1957d101cc1SGerry Weißbach } 1967d101cc1SGerry Weißbach 1977d101cc1SGerry Weißbach function listu_open() { 1987d101cc1SGerry Weißbach $this->doc .= '<ul class="level' . $this->currentLevel . '">'.DOKU_LF; 1997d101cc1SGerry Weißbach } 2007d101cc1SGerry Weißbach 2017d101cc1SGerry Weißbach function listo_open() { 2027d101cc1SGerry Weißbach $this->doc .= '<ol class="level' . $this->currentLevel . '">'.DOKU_LF; 2037d101cc1SGerry Weißbach } 2047d101cc1SGerry Weißbach 2057d101cc1SGerry Weißbach public function finishSectionEdit($end = null) { 2067d101cc1SGerry Weißbach global $INFO; 2077d101cc1SGerry Weißbach if ( $INFO['perm'] > AUTH_READ ) 2087d101cc1SGerry Weißbach { 2097d101cc1SGerry Weißbach return parent::finishSectionEdit($end); 2107d101cc1SGerry Weißbach } 2117d101cc1SGerry Weißbach } 2127d101cc1SGerry Weißbach 2137d101cc1SGerry Weißbach public function startSectionEdit($start, $type, $title = null) { 2147d101cc1SGerry Weißbach global $INFO; 2157d101cc1SGerry Weißbach if ( $INFO['perm'] > AUTH_READ ) 2167d101cc1SGerry Weißbach { 2177d101cc1SGerry Weißbach return parent::startSectionEdit($start, $type, $title); 2187d101cc1SGerry Weißbach } 2197d101cc1SGerry Weißbach 2207d101cc1SGerry Weißbach return ""; 2217d101cc1SGerry Weißbach } 2227d101cc1SGerry Weißbach 2237d101cc1SGerry Weißbach function internalmedia ($src, $title=NULL, $align=NULL, $width=NULL, 2247d101cc1SGerry Weißbach $height=NULL, $cache=NULL, $linking=NULL) { 2257d101cc1SGerry Weißbach global $ID; 2267d101cc1SGerry Weißbach list($src,$hash) = explode('#',$src,2); 2277d101cc1SGerry Weißbach resolve_mediaid(getNS($ID),$src, $exists); 2287d101cc1SGerry Weißbach 2297d101cc1SGerry Weißbach $noLink = false; 2307d101cc1SGerry Weißbach $render = ($linking == 'linkonly') ? false : true; 2317d101cc1SGerry Weißbach $link = $this->_getMediaLinkConf($src, $title, $align, $width, $height, $cache, $render); 2327d101cc1SGerry Weißbach 2337d101cc1SGerry Weißbach list($ext,$mime,$dl) = mimetype($src); 2347d101cc1SGerry Weißbach if(substr($mime,0,5) == 'image' && $render){ 2357d101cc1SGerry Weißbach $link['url'] = ml($src,array('id'=>$ID,'cache'=>$cache),($linking=='direct')); 2367d101cc1SGerry Weißbach if ( substr($mime,0,5) == 'image' && $linking='details' ) { $noLink = true;} 2377d101cc1SGerry Weißbach }elseif($mime == 'application/x-shockwave-flash' && $render){ 2387d101cc1SGerry Weißbach // don't link flash movies 2397d101cc1SGerry Weißbach $noLink = true; 2407d101cc1SGerry Weißbach }else{ 2417d101cc1SGerry Weißbach // add file icons 2427d101cc1SGerry Weißbach $class = preg_replace('/[^_\-a-z0-9]+/i','_',$ext); 2437d101cc1SGerry Weißbach $link['class'] .= ' mediafile mf_'.$class; 2447d101cc1SGerry Weißbach $link['url'] = ml($src,array('id'=>$ID,'cache'=>$cache),true); 2457d101cc1SGerry Weißbach } 2467d101cc1SGerry Weißbach 2477d101cc1SGerry Weißbach if($hash) $link['url'] .= '#'.$hash; 2487d101cc1SGerry Weißbach 2497d101cc1SGerry Weißbach //markup non existing files 2507d101cc1SGerry Weißbach if (!$exists) 2517d101cc1SGerry Weißbach $link['class'] .= ' wikilink2'; 2527d101cc1SGerry Weißbach 2537d101cc1SGerry Weißbach //output formatted 2547d101cc1SGerry Weißbach if ($linking == 'nolink' || $noLink) $this->doc .= $link['name']; 2557d101cc1SGerry Weißbach else $this->doc .= $this->_formatLink($link); 2567d101cc1SGerry Weißbach } 2577d101cc1SGerry Weißbach 2587d101cc1SGerry Weißbach /** 2597d101cc1SGerry Weißbach * Render an internal Wiki Link 2607d101cc1SGerry Weißbach * 2617d101cc1SGerry Weißbach * $search,$returnonly & $linktype are not for the renderer but are used 2627d101cc1SGerry Weißbach * elsewhere - no need to implement them in other renderers 2637d101cc1SGerry Weißbach * 2647d101cc1SGerry Weißbach * @author Andreas Gohr <andi@splitbrain.org> 2657d101cc1SGerry Weißbach */ 2667d101cc1SGerry Weißbach function internallink($id, $name = NULL, $search=NULL,$returnonly=false,$linktype='content') { 2677d101cc1SGerry Weißbach global $conf; 2687d101cc1SGerry Weißbach global $ID; 2697d101cc1SGerry Weißbach // default name is based on $id as given 2707d101cc1SGerry Weißbach $default = $this->_simpleTitle($id); 2717d101cc1SGerry Weißbach 2727d101cc1SGerry Weißbach // now first resolve and clean up the $id 2737d101cc1SGerry Weißbach resolve_pageid(getNS($ID),$id,$exists); 2747d101cc1SGerry Weißbach $name = $this->_getLinkTitle($name, $default, $isImage, $id, $linktype); 2757d101cc1SGerry Weißbach if ( !$isImage ) { 2767d101cc1SGerry Weißbach if ( $exists ) { 2777d101cc1SGerry Weißbach $class='wikilink1'; 2787d101cc1SGerry Weißbach } else { 2797d101cc1SGerry Weißbach $class='wikilink2'; 2807d101cc1SGerry Weißbach $link['rel']='nofollow'; 2817d101cc1SGerry Weißbach } 2827d101cc1SGerry Weißbach } else { 2837d101cc1SGerry Weißbach $class='media'; 2847d101cc1SGerry Weißbach } 2857d101cc1SGerry Weißbach 2867d101cc1SGerry Weißbach //keep hash anchor 2877d101cc1SGerry Weißbach list($id,$hash) = explode('#',$id,2); 2887d101cc1SGerry Weißbach if(!empty($hash)) $hash = $this->_headerToLink($hash); 2897d101cc1SGerry Weißbach 2907d101cc1SGerry Weißbach //prepare for formating 2917d101cc1SGerry Weißbach $link['target'] = $conf['target']['wiki']; 2927d101cc1SGerry Weißbach $link['style'] = ''; 2937d101cc1SGerry Weißbach $link['pre'] = ''; 2947d101cc1SGerry Weißbach $link['suf'] = ''; 2957d101cc1SGerry Weißbach // highlight link to current page 2967d101cc1SGerry Weißbach if ($id == $ID) { 2977d101cc1SGerry Weißbach $link['pre'] = '<span class="curid">'; 2987d101cc1SGerry Weißbach $link['suf'] = '</span>'; 2997d101cc1SGerry Weißbach } 3007d101cc1SGerry Weißbach $link['more'] = ''; 3017d101cc1SGerry Weißbach $link['class'] = $class; 3027d101cc1SGerry Weißbach $link['url'] = wl($id); 3037d101cc1SGerry Weißbach $link['name'] = $name; 3047d101cc1SGerry Weißbach $link['title'] = $this->_getLinkTitle(null, $default, $isImage, $id, $linktype); 3057d101cc1SGerry Weißbach 3067d101cc1SGerry Weißbach //add search string 3077d101cc1SGerry Weißbach if($search){ 3087d101cc1SGerry Weißbach ($conf['userewrite']) ? $link['url'].='?' : $link['url'].='&'; 3097d101cc1SGerry Weißbach if(is_array($search)){ 3107d101cc1SGerry Weißbach $search = array_map('rawurlencode',$search); 3117d101cc1SGerry Weißbach $link['url'] .= 's[]='.join('&s[]=',$search); 3127d101cc1SGerry Weißbach }else{ 3137d101cc1SGerry Weißbach $link['url'] .= 's='.rawurlencode($search); 3147d101cc1SGerry Weißbach } 3157d101cc1SGerry Weißbach } 3167d101cc1SGerry Weißbach 3177d101cc1SGerry Weißbach //keep hash 3187d101cc1SGerry Weißbach if($hash) $link['url'].='#'.$hash; 3197d101cc1SGerry Weißbach 3207d101cc1SGerry Weißbach //output formatted 3217d101cc1SGerry Weißbach if($returnonly){ 3227d101cc1SGerry Weißbach return $this->_formatLink($link); 3237d101cc1SGerry Weißbach }else{ 3247d101cc1SGerry Weißbach $this->doc .= $this->_formatLink($link); 3257d101cc1SGerry Weißbach } 3267d101cc1SGerry Weißbach } 3277d101cc1SGerry Weißbach 3287d101cc1SGerry Weißbach function acronym($acronym) { 3297d101cc1SGerry Weißbach 3307d101cc1SGerry Weißbach if ( empty($this->acronymsExchanged) ) { 3317d101cc1SGerry Weißbach $this->acronymsExchanged = $this->acronyms; 3327d101cc1SGerry Weißbach $this->acronyms = array(); 3337d101cc1SGerry Weißbach 3347d101cc1SGerry Weißbach foreach( $this->acronymsExchanged as $key => $value ) { 3357d101cc1SGerry Weißbach $this->acronyms[str_replace('_', ' ', $key)] = $value; 3367d101cc1SGerry Weißbach } 3377d101cc1SGerry Weißbach } 3387d101cc1SGerry Weißbach 3397d101cc1SGerry Weißbach parent::acronym($acronym); 3407d101cc1SGerry Weißbach } 3417d101cc1SGerry Weißbach 3427d101cc1SGerry Weißbach function _xmlEntities($string) { 3437d101cc1SGerry Weißbach 3447d101cc1SGerry Weißbach $string = parent::_xmlEntities($string); 3457d101cc1SGerry Weißbach 3467d101cc1SGerry Weißbach if ( $this->info['scriptmode'] ) { 3477d101cc1SGerry Weißbach $string = str_replace( array( "<%", "%>", "<?", "?>"), 3487d101cc1SGerry Weißbach array( "<%", "%>", "<?", "?>"), 3497d101cc1SGerry Weißbach $string); 3507d101cc1SGerry Weißbach } 3517d101cc1SGerry Weißbach 3527d101cc1SGerry Weißbach return $string; 3537d101cc1SGerry Weißbach } 3547d101cc1SGerry Weißbach} 3557d101cc1SGerry Weißbach 3567d101cc1SGerry Weißbach//Setup VIM: ex: et ts=4 enc=utf-8 :