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> 64b73700eSGerry Weißbach * @author Gerry Weissbach <gweissbach@inetsoftware.de> 77d101cc1SGerry Weißbach */ 87d101cc1SGerry Weißbach 97d101cc1SGerry Weißbachif(!defined('DOKU_INC')) die(); 107d101cc1SGerry Weißbachif(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/'); 117d101cc1SGerry Weißbach 127d101cc1SGerry Weißbachrequire_once DOKU_INC . 'inc/parser/xhtml.php'; 137d101cc1SGerry Weißbach 147d101cc1SGerry Weißbach/** 157d101cc1SGerry Weißbach * The Renderer 167d101cc1SGerry Weißbach */ 177d101cc1SGerry Weißbachclass renderer_plugin_siteexport_pdf extends Doku_Renderer_xhtml { 187d101cc1SGerry Weißbach 197d101cc1SGerry Weißbach var $acronymsExchanged = null; 207d101cc1SGerry Weißbach var $hasSeenHeader = false; 217d101cc1SGerry Weißbach var $scriptmode = false; 227d101cc1SGerry Weißbach 237d101cc1SGerry Weißbach var $currentLevel = 0; 247d101cc1SGerry Weißbach var $startlevel = 0; // level to start with numbered headings (default = 2) 257d101cc1SGerry Weißbach var $levels = array( '======'=>1, 267d101cc1SGerry Weißbach '====='=>2, 277d101cc1SGerry Weißbach '===='=>3, 287d101cc1SGerry Weißbach '==='=>4, 297d101cc1SGerry Weißbach '=='=>5); 307d101cc1SGerry Weißbach 317d101cc1SGerry Weißbach var $info = array( 327d101cc1SGerry Weißbach 'cache' => true, // may the rendered result cached? 337d101cc1SGerry Weißbach 'toc' => true, // render the TOC? 347d101cc1SGerry Weißbach 'forceTOC' => false, // shall I force the TOC? 357d101cc1SGerry Weißbach 'scriptmode' => false, // In scriptmode, some tags will not be encoded => '<%', '%>' 367d101cc1SGerry Weißbach ); 377d101cc1SGerry Weißbach 387d101cc1SGerry Weißbach var $headingCount = 397d101cc1SGerry Weißbach array( 1=>0, 407d101cc1SGerry Weißbach 2=>0, 417d101cc1SGerry Weißbach 3=>0, 427d101cc1SGerry Weißbach 4=>0, 437d101cc1SGerry Weißbach 5=>0); 447d101cc1SGerry Weißbach 457d101cc1SGerry Weißbach /** 467d101cc1SGerry Weißbach * return some info 477d101cc1SGerry Weißbach */ 487d101cc1SGerry Weißbach function getInfo(){ 497d101cc1SGerry Weißbach if ( method_exists(parent, 'getInfo')) { 507d101cc1SGerry Weißbach $info = parent::getInfo(); 517d101cc1SGerry Weißbach } 527d101cc1SGerry Weißbach return array_merge(is_array($info) ? $info : confToHash(dirname(__FILE__).'/../plugin.info.txt'), array( 537d101cc1SGerry Weißbach 547d101cc1SGerry Weißbach )); 557d101cc1SGerry Weißbach } 567d101cc1SGerry Weißbach 577d101cc1SGerry Weißbach function document_start() { 587d101cc1SGerry Weißbach global $TOC, $ID, $INFO; 597d101cc1SGerry Weißbach 607d101cc1SGerry Weißbach parent::document_start(); 617d101cc1SGerry Weißbach 627d101cc1SGerry Weißbach // Cheating in again 637d101cc1SGerry Weißbach $newMeta = p_get_metadata($ID, 'description tableofcontents', false); // 2010-10-23 This should be save to use 647d101cc1SGerry Weißbach if ( !empty( $newMeta ) && count($newMeta) > 1 ) { 657d101cc1SGerry Weißbach // $TOC = $this->toc = $newMeta; // 2010-08-23 doubled the TOC 667d101cc1SGerry Weißbach $TOC = $newMeta; 677d101cc1SGerry Weißbach } 687d101cc1SGerry Weißbach } 697d101cc1SGerry Weißbach 707d101cc1SGerry Weißbach function document_end() { 717d101cc1SGerry Weißbach 727d101cc1SGerry Weißbach parent::document_end(); 737d101cc1SGerry Weißbach 747d101cc1SGerry Weißbach // Prepare the TOC 757d101cc1SGerry Weißbach global $TOC, $ID; 767d101cc1SGerry Weißbach $meta = array(); 777d101cc1SGerry Weißbach 787d101cc1SGerry Weißbach // NOTOC, and no forceTOC 797d101cc1SGerry Weißbach if ( $this->info['toc'] === false && !($this->info['forceTOC'] || $this->meta['forceTOC']) ) { 807d101cc1SGerry Weißbach $TOC = $this->toc = array(); 817d101cc1SGerry Weißbach $meta['internal']['toc'] = false; 827d101cc1SGerry Weißbach $meta['description']['tableofcontents'] = array(); 837d101cc1SGerry Weißbach $meta['forceTOC'] = false; 847d101cc1SGerry Weißbach 857d101cc1SGerry Weißbach } else if ( $this->info['forceTOC'] || $this->meta['forceTOC'] || (utf8_strlen(strip_tags($this->doc)) >= $this->getConf('documentlengthfortoc') && count($this->toc) > 1 ) ) { 867d101cc1SGerry Weißbach $TOC = $this->toc; 877d101cc1SGerry Weißbach // This is a little bit like cheating ... but this will force the TOC into the metadata 887d101cc1SGerry Weißbach $meta = array(); 897d101cc1SGerry Weißbach $meta['internal']['toc'] = true; 907d101cc1SGerry Weißbach $meta['forceTOC'] = $this->info['forceTOC'] || $this->meta['forceTOC']; 917d101cc1SGerry Weißbach $meta['description']['tableofcontents'] = $TOC; 927d101cc1SGerry Weißbach } 937d101cc1SGerry Weißbach 947d101cc1SGerry Weißbach // allways write new metadata 957d101cc1SGerry Weißbach p_set_metadata($ID, $meta); 967d101cc1SGerry Weißbach $this->doc = preg_replace('#<p( class=".*?")?>\s*</p>#','',$this->doc); 977d101cc1SGerry Weißbach } 987d101cc1SGerry Weißbach 997d101cc1SGerry Weißbach function header($text, $level, $pos) { 1007d101cc1SGerry Weißbach global $conf; 1017d101cc1SGerry Weißbach global $ID; 1027d101cc1SGerry Weißbach global $INFO; 1037d101cc1SGerry Weißbach 1047d101cc1SGerry Weißbach if($text) 1057d101cc1SGerry Weißbach { 1067d101cc1SGerry Weißbach $hid = $this->_headerToLink($text,true); 1077d101cc1SGerry Weißbach 1087d101cc1SGerry Weißbach //only add items within configured levels 1097d101cc1SGerry Weißbach $this->toc_additem($hid, $text, $level); 1107d101cc1SGerry Weißbach 1117d101cc1SGerry Weißbach // adjust $node to reflect hierarchy of levels 1127d101cc1SGerry Weißbach $this->node[$level-1]++; 1137d101cc1SGerry Weißbach if ($level < $this->lastlevel) { 1147d101cc1SGerry Weißbach for ($i = 0; $i < $this->lastlevel-$level; $i++) { 1157d101cc1SGerry Weißbach $this->node[$this->lastlevel-$i-1] = 0; 1167d101cc1SGerry Weißbach } 1177d101cc1SGerry Weißbach } 1187d101cc1SGerry Weißbach $this->lastlevel = $level; 1197d101cc1SGerry Weißbach 1207d101cc1SGerry Weißbach 1217d101cc1SGerry Weißbach /* There should be no class for "sectioneditX" if there is no edit perm */ 1227d101cc1SGerry Weißbach if ($INFO['perm'] > AUTH_READ && 1237d101cc1SGerry Weißbach $level <= $conf['maxseclevel'] && 1247d101cc1SGerry Weißbach count($this->sectionedits) > 0 && 1257d101cc1SGerry Weißbach $this->sectionedits[count($this->sectionedits) - 1][2] === 'section') { 1267d101cc1SGerry Weißbach $this->finishSectionEdit($pos - 1); 1277d101cc1SGerry Weißbach } 1287d101cc1SGerry Weißbach 1297d101cc1SGerry Weißbach $headingNumber = ''; 1307d101cc1SGerry Weißbach $useNumbered = p_get_metadata($ID, 'usenumberedheading', true); // 2011-02-07 This should be save to use 1317d101cc1SGerry Weißbach if ( $this->getConf('usenumberedheading') || !empty($useNumbered) || !empty($INFO['meta']['usenumberedheading']) || isset($_REQUEST['usenumberedheading'])) { 1327d101cc1SGerry Weißbach 1337d101cc1SGerry Weißbach // increment the number of the heading 1347d101cc1SGerry Weißbach $this->headingCount[$level]++; 1357d101cc1SGerry Weißbach 1367d101cc1SGerry Weißbach // build the actual number 1377d101cc1SGerry Weißbach for ($i=1;$i<=5;$i++) { 1387d101cc1SGerry Weißbach 1397d101cc1SGerry Weißbach // reset the number of the subheadings 1407d101cc1SGerry Weißbach if ($i>$level) { 1417d101cc1SGerry Weißbach $this->headingCount[$i] = 0; 1427d101cc1SGerry Weißbach } 1437d101cc1SGerry Weißbach 1447d101cc1SGerry Weißbach // build the number of the heading 1457d101cc1SGerry Weißbach $headingNumber .= $this->headingCount[$i] . '.'; 1467d101cc1SGerry Weißbach } 1477d101cc1SGerry Weißbach 1487d101cc1SGerry Weißbach $headingNumber = preg_replace("/(\.0)+\.?$/", '', $headingNumber) . ' '; 1497d101cc1SGerry Weißbach } 1507d101cc1SGerry Weißbach 1517d101cc1SGerry Weißbach // write the header 1527d101cc1SGerry Weißbach $this->doc .= DOKU_LF.'<h'.$level; 1537ddc12e6SGerry Weißbach $class = array(); 1547d101cc1SGerry Weißbach if ($INFO['perm'] > AUTH_READ && 1557d101cc1SGerry Weißbach $level <= $conf['maxseclevel']) { 1567ddc12e6SGerry Weißbach $class[] = $this->startSectionEdit($pos, 'section', $text); 1577ddc12e6SGerry Weißbach } 1587ddc12e6SGerry Weißbach 1597ddc12e6SGerry Weißbach if ( !empty($headingNumber) ) { 1607ddc12e6SGerry Weißbach $class[] = 'level' . trim($headingNumber); 16127045e12SGerry Weißbach if ( intval($headingNumber) > 1 ) { 1627ddc12e6SGerry Weißbach $class[] = 'notfirst'; 1637ddc12e6SGerry Weißbach } else { 1647ddc12e6SGerry Weißbach $class[] = 'first'; 1657ddc12e6SGerry Weißbach } 1667ddc12e6SGerry Weißbach } 1677ddc12e6SGerry Weißbach 1687ddc12e6SGerry Weißbach if ( !empty($class) ) { 1697ddc12e6SGerry Weißbach $this->doc .= ' class="' . implode(' ', $class) . '"'; 1707d101cc1SGerry Weißbach } 1717d101cc1SGerry Weißbach 1727d101cc1SGerry Weißbach $this->doc .= '><a name="'.$hid.'" id="'.$hid.'">'; 1737d101cc1SGerry Weißbach $this->doc .= $this->_xmlEntities($headingNumber . $text); 1747d101cc1SGerry Weißbach $this->doc .= "</a></h$level>".DOKU_LF; 1757d101cc1SGerry Weißbach 1767d101cc1SGerry Weißbach } else if ( $INFO['perm'] > AUTH_READ ) { 1777d101cc1SGerry Weißbach 1787d101cc1SGerry Weißbach if ( $hasSeenHeader ) $this->finishSectionEdit($pos); 1797d101cc1SGerry Weißbach 1807d101cc1SGerry Weißbach // write the header 1817d101cc1SGerry Weißbach $name = rand() . $level; 1827d101cc1SGerry Weißbach $this->doc .= DOKU_LF.'<a name="'. $this->startSectionEdit($pos, 'section_empty', $name) .'" class="' . $this->startSectionEdit($pos, 'section_empty', $name) . '" ></a>'.DOKU_LF; 1837d101cc1SGerry Weißbach } 1847d101cc1SGerry Weißbach 1857d101cc1SGerry Weißbach $hasSeenHeader = true; 1867d101cc1SGerry Weißbach } 1877d101cc1SGerry Weißbach 1887d101cc1SGerry Weißbach function section_open($level) { 1897d101cc1SGerry Weißbach $this->currentLevel = $level; 1907d101cc1SGerry Weißbach } 1917d101cc1SGerry Weißbach 1927d101cc1SGerry Weißbach function section_close() {} 1937d101cc1SGerry Weißbach 1947d101cc1SGerry Weißbach function p_open() { 1957d101cc1SGerry Weißbach $this->doc .= DOKU_LF.'<p class="level' . $this->currentLevel . '">'.DOKU_LF; 1967d101cc1SGerry Weißbach } 1977d101cc1SGerry Weißbach 1987d101cc1SGerry Weißbach function listu_open() { 1997d101cc1SGerry Weißbach $this->doc .= '<ul class="level' . $this->currentLevel . '">'.DOKU_LF; 2007d101cc1SGerry Weißbach } 2017d101cc1SGerry Weißbach 2027d101cc1SGerry Weißbach function listo_open() { 2037d101cc1SGerry Weißbach $this->doc .= '<ol class="level' . $this->currentLevel . '">'.DOKU_LF; 2047d101cc1SGerry Weißbach } 2057d101cc1SGerry Weißbach 2067d101cc1SGerry Weißbach public function finishSectionEdit($end = null) { 2077d101cc1SGerry Weißbach global $INFO; 2087d101cc1SGerry Weißbach if ( $INFO['perm'] > AUTH_READ ) 2097d101cc1SGerry Weißbach { 2107d101cc1SGerry Weißbach return parent::finishSectionEdit($end); 2117d101cc1SGerry Weißbach } 2127d101cc1SGerry Weißbach } 2137d101cc1SGerry Weißbach 2147d101cc1SGerry Weißbach public function startSectionEdit($start, $type, $title = null) { 2157d101cc1SGerry Weißbach global $INFO; 2167d101cc1SGerry Weißbach if ( $INFO['perm'] > AUTH_READ ) 2177d101cc1SGerry Weißbach { 2187d101cc1SGerry Weißbach return parent::startSectionEdit($start, $type, $title); 2197d101cc1SGerry Weißbach } 2207d101cc1SGerry Weißbach 2217d101cc1SGerry Weißbach return ""; 2227d101cc1SGerry Weißbach } 2237d101cc1SGerry Weißbach 2246792d0cfSGerry Weißbach /** 2256792d0cfSGerry Weißbach * Wrap centered media in a div to center it 2266792d0cfSGerry Weißbach */ 2276792d0cfSGerry Weißbach function _media ($src, $title=NULL, $align=NULL, $width=NULL, 2286792d0cfSGerry Weißbach $height=NULL, $cache=NULL, $render = true) { 2296792d0cfSGerry Weißbach 2306792d0cfSGerry Weißbach $out = ''; 2316792d0cfSGerry Weißbach if($align == 'center'){ 2326792d0cfSGerry Weißbach $out .= '<div align="center" style="text-align: center">'; 2336792d0cfSGerry Weißbach } 2346792d0cfSGerry Weißbach 2356792d0cfSGerry Weißbach $out .= parent::_media ($src, $title, $align, $width, $height, $cache, $render); 2366792d0cfSGerry Weißbach 2376792d0cfSGerry Weißbach if($align == 'center'){ 2386792d0cfSGerry Weißbach $out .= '</div>'; 2396792d0cfSGerry Weißbach } 2406792d0cfSGerry Weißbach 2416792d0cfSGerry Weißbach return $out; 2426792d0cfSGerry Weißbach } 2436792d0cfSGerry Weißbach 2447d101cc1SGerry Weißbach function internalmedia ($src, $title=NULL, $align=NULL, $width=NULL, 2457d101cc1SGerry Weißbach $height=NULL, $cache=NULL, $linking=NULL) { 2467d101cc1SGerry Weißbach global $ID; 2477d101cc1SGerry Weißbach list($src,$hash) = explode('#',$src,2); 2487d101cc1SGerry Weißbach resolve_mediaid(getNS($ID),$src, $exists); 2497d101cc1SGerry Weißbach 2507d101cc1SGerry Weißbach $noLink = false; 2517d101cc1SGerry Weißbach $render = ($linking == 'linkonly') ? false : true; 2527d101cc1SGerry Weißbach $link = $this->_getMediaLinkConf($src, $title, $align, $width, $height, $cache, $render); 2537d101cc1SGerry Weißbach 2547d101cc1SGerry Weißbach list($ext,$mime,$dl) = mimetype($src); 2557d101cc1SGerry Weißbach if(substr($mime,0,5) == 'image' && $render){ 2567d101cc1SGerry Weißbach $link['url'] = ml($src,array('id'=>$ID,'cache'=>$cache),($linking=='direct')); 2577d101cc1SGerry Weißbach if ( substr($mime,0,5) == 'image' && $linking='details' ) { $noLink = true;} 2587d101cc1SGerry Weißbach }elseif($mime == 'application/x-shockwave-flash' && $render){ 2597d101cc1SGerry Weißbach // don't link flash movies 2607d101cc1SGerry Weißbach $noLink = true; 2617d101cc1SGerry Weißbach }else{ 2627d101cc1SGerry Weißbach // add file icons 2637d101cc1SGerry Weißbach $class = preg_replace('/[^_\-a-z0-9]+/i','_',$ext); 2647d101cc1SGerry Weißbach $link['class'] .= ' mediafile mf_'.$class; 2657d101cc1SGerry Weißbach $link['url'] = ml($src,array('id'=>$ID,'cache'=>$cache),true); 2667d101cc1SGerry Weißbach } 2677d101cc1SGerry Weißbach 2687d101cc1SGerry Weißbach if($hash) $link['url'] .= '#'.$hash; 2697d101cc1SGerry Weißbach 2707d101cc1SGerry Weißbach //markup non existing files 2717d101cc1SGerry Weißbach if (!$exists) 2727d101cc1SGerry Weißbach $link['class'] .= ' wikilink2'; 2737d101cc1SGerry Weißbach 2747d101cc1SGerry Weißbach //output formatted 2757d101cc1SGerry Weißbach if ($linking == 'nolink' || $noLink) $this->doc .= $link['name']; 2767d101cc1SGerry Weißbach else $this->doc .= $this->_formatLink($link); 2777d101cc1SGerry Weißbach } 2787d101cc1SGerry Weißbach 2797d101cc1SGerry Weißbach /** 2807d101cc1SGerry Weißbach * Render an internal Wiki Link 2817d101cc1SGerry Weißbach * 2827d101cc1SGerry Weißbach * $search,$returnonly & $linktype are not for the renderer but are used 2837d101cc1SGerry Weißbach * elsewhere - no need to implement them in other renderers 2847d101cc1SGerry Weißbach * 2857d101cc1SGerry Weißbach * @author Andreas Gohr <andi@splitbrain.org> 2867d101cc1SGerry Weißbach */ 2877d101cc1SGerry Weißbach function internallink($id, $name = NULL, $search=NULL,$returnonly=false,$linktype='content') { 2887d101cc1SGerry Weißbach global $conf; 2897d101cc1SGerry Weißbach global $ID; 2907d101cc1SGerry Weißbach // default name is based on $id as given 2917d101cc1SGerry Weißbach $default = $this->_simpleTitle($id); 2927d101cc1SGerry Weißbach 2937d101cc1SGerry Weißbach // now first resolve and clean up the $id 2947d101cc1SGerry Weißbach resolve_pageid(getNS($ID),$id,$exists); 2957d101cc1SGerry Weißbach $name = $this->_getLinkTitle($name, $default, $isImage, $id, $linktype); 2967d101cc1SGerry Weißbach if ( !$isImage ) { 2977d101cc1SGerry Weißbach if ( $exists ) { 2987d101cc1SGerry Weißbach $class='wikilink1'; 2997d101cc1SGerry Weißbach } else { 3007d101cc1SGerry Weißbach $class='wikilink2'; 3017d101cc1SGerry Weißbach $link['rel']='nofollow'; 3027d101cc1SGerry Weißbach } 3037d101cc1SGerry Weißbach } else { 3047d101cc1SGerry Weißbach $class='media'; 3057d101cc1SGerry Weißbach } 3067d101cc1SGerry Weißbach 3077d101cc1SGerry Weißbach //keep hash anchor 3087d101cc1SGerry Weißbach list($id,$hash) = explode('#',$id,2); 3097d101cc1SGerry Weißbach if(!empty($hash)) $hash = $this->_headerToLink($hash); 3107d101cc1SGerry Weißbach 3117d101cc1SGerry Weißbach //prepare for formating 3127d101cc1SGerry Weißbach $link['target'] = $conf['target']['wiki']; 3137d101cc1SGerry Weißbach $link['style'] = ''; 3147d101cc1SGerry Weißbach $link['pre'] = ''; 3157d101cc1SGerry Weißbach $link['suf'] = ''; 3167d101cc1SGerry Weißbach // highlight link to current page 3177d101cc1SGerry Weißbach if ($id == $ID) { 3187d101cc1SGerry Weißbach $link['pre'] = '<span class="curid">'; 3197d101cc1SGerry Weißbach $link['suf'] = '</span>'; 3207d101cc1SGerry Weißbach } 3217d101cc1SGerry Weißbach $link['more'] = ''; 3227d101cc1SGerry Weißbach $link['class'] = $class; 3237d101cc1SGerry Weißbach $link['url'] = wl($id); 3247d101cc1SGerry Weißbach $link['name'] = $name; 3257d101cc1SGerry Weißbach $link['title'] = $this->_getLinkTitle(null, $default, $isImage, $id, $linktype); 3267d101cc1SGerry Weißbach 3277d101cc1SGerry Weißbach //add search string 3287d101cc1SGerry Weißbach if($search){ 3297d101cc1SGerry Weißbach ($conf['userewrite']) ? $link['url'].='?' : $link['url'].='&'; 3307d101cc1SGerry Weißbach if(is_array($search)){ 3317d101cc1SGerry Weißbach $search = array_map('rawurlencode',$search); 3327d101cc1SGerry Weißbach $link['url'] .= 's[]='.join('&s[]=',$search); 3337d101cc1SGerry Weißbach }else{ 3347d101cc1SGerry Weißbach $link['url'] .= 's='.rawurlencode($search); 3357d101cc1SGerry Weißbach } 3367d101cc1SGerry Weißbach } 3377d101cc1SGerry Weißbach 3387d101cc1SGerry Weißbach //keep hash 3397d101cc1SGerry Weißbach if($hash) $link['url'].='#'.$hash; 3407d101cc1SGerry Weißbach 3417d101cc1SGerry Weißbach //output formatted 3427d101cc1SGerry Weißbach if($returnonly){ 3437d101cc1SGerry Weißbach return $this->_formatLink($link); 3447d101cc1SGerry Weißbach }else{ 3457d101cc1SGerry Weißbach $this->doc .= $this->_formatLink($link); 3467d101cc1SGerry Weißbach } 3477d101cc1SGerry Weißbach } 3487d101cc1SGerry Weißbach 3497d101cc1SGerry Weißbach function acronym($acronym) { 3507d101cc1SGerry Weißbach 3517d101cc1SGerry Weißbach if ( empty($this->acronymsExchanged) ) { 3527d101cc1SGerry Weißbach $this->acronymsExchanged = $this->acronyms; 3537d101cc1SGerry Weißbach $this->acronyms = array(); 3547d101cc1SGerry Weißbach 3557d101cc1SGerry Weißbach foreach( $this->acronymsExchanged as $key => $value ) { 3567d101cc1SGerry Weißbach $this->acronyms[str_replace('_', ' ', $key)] = $value; 3577d101cc1SGerry Weißbach } 3587d101cc1SGerry Weißbach } 3597d101cc1SGerry Weißbach 3607d101cc1SGerry Weißbach parent::acronym($acronym); 3617d101cc1SGerry Weißbach } 3627d101cc1SGerry Weißbach 3637d101cc1SGerry Weißbach function _xmlEntities($string) { 3647d101cc1SGerry Weißbach 3657d101cc1SGerry Weißbach $string = parent::_xmlEntities($string); 366*d32fa46eSGerry Weißbach $string = htmlentities($string, 8, 'UTF-8'); 367*d32fa46eSGerry Weißbach $string = $this->superentities($string); 3687d101cc1SGerry Weißbach 3697d101cc1SGerry Weißbach if ( $this->info['scriptmode'] ) { 3707d101cc1SGerry Weißbach $string = str_replace( array( "<%", "%>", "<?", "?>"), 3717d101cc1SGerry Weißbach array( "<%", "%>", "<?", "?>"), 3727d101cc1SGerry Weißbach $string); 3737d101cc1SGerry Weißbach } 3747d101cc1SGerry Weißbach 3757d101cc1SGerry Weißbach return $string; 3767d101cc1SGerry Weißbach } 3774a82723bSGerry Weißbach 378*d32fa46eSGerry Weißbach // Unicode-proof htmlentities. 379*d32fa46eSGerry Weißbach // Returns 'normal' chars as chars and weirdos as numeric html entites. 380*d32fa46eSGerry Weißbach function superentities( $str ){ 381*d32fa46eSGerry Weißbach // get rid of existing entities else double-escape 382*d32fa46eSGerry Weißbach $str2 = ''; 383*d32fa46eSGerry Weißbach $str = html_entity_decode(stripslashes($str),ENT_QUOTES,'UTF-8'); 384*d32fa46eSGerry Weißbach $ar = preg_split('/(?<!^)(?!$)(?!\n)/u', $str ); // return array of every multi-byte character 385*d32fa46eSGerry Weißbach foreach ($ar as $c){ 386*d32fa46eSGerry Weißbach $o = ord($c); 387*d32fa46eSGerry Weißbach if ( // (strlen($c) > 1) || /* multi-byte [unicode] */ 388*d32fa46eSGerry Weißbach ($o > 127) // || /* <- control / latin weirdos -> */ 389*d32fa46eSGerry Weißbach // ($o <32 || $o > 126) || /* <- control / latin weirdos -> */ 390*d32fa46eSGerry Weißbach // ($o >33 && $o < 40) ||/* quotes + ambersand */ 391*d32fa46eSGerry Weißbach // ($o >59 && $o < 63) /* html */ 392*d32fa46eSGerry Weißbach 393*d32fa46eSGerry Weißbach ) { 394*d32fa46eSGerry Weißbach // convert to numeric entity 395*d32fa46eSGerry Weißbach $c = mb_encode_numericentity($c,array (0x0, 0xffff, 0, 0xffff), 'UTF-8'); 396*d32fa46eSGerry Weißbach } 397*d32fa46eSGerry Weißbach $str2 .= $c; 398*d32fa46eSGerry Weißbach } 399*d32fa46eSGerry Weißbach return $str2; 400*d32fa46eSGerry Weißbach } 401*d32fa46eSGerry Weißbach 4023fa4cc5fSGerry Weißbach function preformatted($text) { 4033fa4cc5fSGerry Weißbach $this->doc .= '<div class="pre">'; 4043fa4cc5fSGerry Weißbach parent::preformatted($text); 4053fa4cc5fSGerry Weißbach $this->doc .= '</div>'; 4063fa4cc5fSGerry Weißbach } 4073fa4cc5fSGerry Weißbach 4083fa4cc5fSGerry Weißbach function _highlight($type, $text, $language = null, $filename = null) { 4093fa4cc5fSGerry Weißbach $this->doc .= '<div class="pre">'; 4103fa4cc5fSGerry Weißbach parent::_highlight($type, $text, $language, $filename); 4113fa4cc5fSGerry Weißbach $this->doc .= '</div>'; 4123fa4cc5fSGerry Weißbach } 4133fa4cc5fSGerry Weißbach 4144a82723bSGerry Weißbach /** 4154a82723bSGerry Weißbach * API of the imagereference plugin 4164a82723bSGerry Weißbach * https://github.com/i-net-software/dokuwiki-plugin-imagereference 4174a82723bSGerry Weißbach * 4184a82723bSGerry Weißbach * Allows to specify special imagecaption tags that the renderer (mpdf) can use 4194a82723bSGerry Weißbach */ 4204a82723bSGerry Weißbach public function imageCaptionTags(&$imagereferenceplugin) 4214a82723bSGerry Weißbach { 4224a82723bSGerry Weißbach if ( !$imagereferenceplugin->accepts('table') ) { 4234a82723bSGerry Weißbach return array( '<figure id="%s" class="imgcaption%s">', // $captionStart 4244a82723bSGerry Weißbach '</figure>', // $captionEnd 4254a82723bSGerry Weißbach '<figcaption class="undercaption">', // $underCaptionStart 4264a82723bSGerry Weißbach '</figcaption>' // $underCaptionEnd 4274a82723bSGerry Weißbach ); 4284a82723bSGerry Weißbach } 4294a82723bSGerry Weißbach 4304a82723bSGerry Weißbach return null; 4314a82723bSGerry Weißbach } 4327d101cc1SGerry Weißbach} 4337d101cc1SGerry Weißbach 4347d101cc1SGerry Weißbach//Setup VIM: ex: et ts=4 enc=utf-8 :