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 1780571ece2SScrutinizer Auto-Fixer if ( $hasSeenHeader ) { 1790571ece2SScrutinizer Auto-Fixer $this->finishSectionEdit($pos); 1800571ece2SScrutinizer Auto-Fixer } 1817d101cc1SGerry Weißbach 1827d101cc1SGerry Weißbach // write the header 1837d101cc1SGerry Weißbach $name = rand() . $level; 1847d101cc1SGerry Weißbach $this->doc .= DOKU_LF.'<a name="'. $this->startSectionEdit($pos, 'section_empty', $name) .'" class="' . $this->startSectionEdit($pos, 'section_empty', $name) . '" ></a>'.DOKU_LF; 1857d101cc1SGerry Weißbach } 1867d101cc1SGerry Weißbach 1877d101cc1SGerry Weißbach $hasSeenHeader = true; 1887d101cc1SGerry Weißbach } 1897d101cc1SGerry Weißbach 1907d101cc1SGerry Weißbach function section_open($level) { 1917d101cc1SGerry Weißbach $this->currentLevel = $level; 1920931afc2SGerry Weißbach parent::section_open($level); 1937d101cc1SGerry Weißbach } 1947d101cc1SGerry Weißbach 1957d101cc1SGerry Weißbach function p_open() { 1967d101cc1SGerry Weißbach $this->doc .= DOKU_LF . '<p class="level' . $this->currentLevel . '">' . DOKU_LF; 1977d101cc1SGerry Weißbach } 1987d101cc1SGerry Weißbach 1997d101cc1SGerry Weißbach function listu_open() { 2007d101cc1SGerry Weißbach $this->doc .= '<ul class="level' . $this->currentLevel . '">' . DOKU_LF; 2017d101cc1SGerry Weißbach } 2027d101cc1SGerry Weißbach 2037d101cc1SGerry Weißbach function listo_open() { 2047d101cc1SGerry Weißbach $this->doc .= '<ol class="level' . $this->currentLevel . '">' . DOKU_LF; 2057d101cc1SGerry Weißbach } 2067d101cc1SGerry Weißbach 2077d101cc1SGerry Weißbach public function finishSectionEdit($end = null) { 208caa704ffSGerry Weißbach return ''; 2097d101cc1SGerry Weißbach } 2107d101cc1SGerry Weißbach 2110571ece2SScrutinizer Auto-Fixer /** 2120571ece2SScrutinizer Auto-Fixer * @param string $type 2130571ece2SScrutinizer Auto-Fixer */ 2147d101cc1SGerry Weißbach public function startSectionEdit($start, $type, $title = null) { 21533645ffbSGerry Weißbach return ''; 2167d101cc1SGerry Weißbach } 2177d101cc1SGerry Weißbach 2186792d0cfSGerry Weißbach /** 2196792d0cfSGerry Weißbach * Wrap centered media in a div to center it 2206792d0cfSGerry Weißbach */ 2216792d0cfSGerry Weißbach function _media ($src, $title=NULL, $align=NULL, $width=NULL, 2226792d0cfSGerry Weißbach $height=NULL, $cache=NULL, $render = true) { 2236792d0cfSGerry Weißbach 2246792d0cfSGerry Weißbach $out = ''; 2256792d0cfSGerry Weißbach if($align == 'center'){ 2266792d0cfSGerry Weißbach $out .= '<div align="center" style="text-align: center">'; 2276792d0cfSGerry Weißbach } 2286792d0cfSGerry Weißbach 2296792d0cfSGerry Weißbach $out .= parent::_media ($src, $title, $align, $width, $height, $cache, $render); 2306792d0cfSGerry Weißbach 2316792d0cfSGerry Weißbach if($align == 'center'){ 2326792d0cfSGerry Weißbach $out .= '</div>'; 2336792d0cfSGerry Weißbach } 2346792d0cfSGerry Weißbach 2356792d0cfSGerry Weißbach return $out; 2366792d0cfSGerry Weißbach } 2376792d0cfSGerry Weißbach 2387d101cc1SGerry Weißbach function internalmedia ($src, $title=NULL, $align=NULL, $width=NULL, 2397d101cc1SGerry Weißbach $height=NULL, $cache=NULL, $linking=NULL) { 2407d101cc1SGerry Weißbach global $ID; 2417d101cc1SGerry Weißbach list($src,$hash) = explode('#',$src,2); 2427d101cc1SGerry Weißbach resolve_mediaid(getNS($ID),$src, $exists); 2437d101cc1SGerry Weißbach 2447d101cc1SGerry Weißbach $noLink = false; 2457d101cc1SGerry Weißbach $render = ($linking == 'linkonly') ? false : true; 2467d101cc1SGerry Weißbach $link = $this->_getMediaLinkConf($src, $title, $align, $width, $height, $cache, $render); 2477d101cc1SGerry Weißbach 2487d101cc1SGerry Weißbach list($ext,$mime,$dl) = mimetype($src); 2497d101cc1SGerry Weißbach if(substr($mime,0,5) == 'image' && $render){ 2507d101cc1SGerry Weißbach $link['url'] = ml($src,array('id'=>$ID,'cache'=>$cache),($linking=='direct')); 2517d101cc1SGerry Weißbach if ( substr($mime,0,5) == 'image' && $linking='details' ) { $noLink = true;} 2527d101cc1SGerry Weißbach } elseif($mime == 'application/x-shockwave-flash' && $render){ 2537d101cc1SGerry Weißbach // don't link flash movies 2547d101cc1SGerry Weißbach $noLink = true; 2557d101cc1SGerry Weißbach } else{ 2567d101cc1SGerry Weißbach // add file icons 2577d101cc1SGerry Weißbach $class = preg_replace('/[^_\-a-z0-9]+/i','_',$ext); 2587d101cc1SGerry Weißbach $link['class'] .= ' mediafile mf_'.$class; 2597d101cc1SGerry Weißbach $link['url'] = ml($src,array('id'=>$ID,'cache'=>$cache),true); 2607d101cc1SGerry Weißbach } 2617d101cc1SGerry Weißbach 2620571ece2SScrutinizer Auto-Fixer if($hash) { 2630571ece2SScrutinizer Auto-Fixer $link['url'] .= '#'.$hash; 2640571ece2SScrutinizer Auto-Fixer } 2657d101cc1SGerry Weißbach 2667d101cc1SGerry Weißbach //markup non existing files 2670571ece2SScrutinizer Auto-Fixer if (!$exists) { 2687d101cc1SGerry Weißbach $link['class'] .= ' wikilink2'; 2690571ece2SScrutinizer Auto-Fixer } 2707d101cc1SGerry Weißbach 2717d101cc1SGerry Weißbach //output formatted 2720571ece2SScrutinizer Auto-Fixer if ($linking == 'nolink' || $noLink) { 2730571ece2SScrutinizer Auto-Fixer $this->doc .= $link['name']; 2740571ece2SScrutinizer Auto-Fixer } else { 2750571ece2SScrutinizer Auto-Fixer $this->doc .= $this->_formatLink($link); 2760571ece2SScrutinizer Auto-Fixer } 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 3630571ece2SScrutinizer Auto-Fixer /** 3640571ece2SScrutinizer Auto-Fixer * @param string $string 3650571ece2SScrutinizer Auto-Fixer */ 3667d101cc1SGerry Weißbach function _xmlEntities($string) { 3677d101cc1SGerry Weißbach 3687d101cc1SGerry Weißbach $string = parent::_xmlEntities($string); 369d32fa46eSGerry Weißbach $string = htmlentities($string, 8, 'UTF-8'); 370d32fa46eSGerry Weißbach $string = $this->superentities($string); 3717d101cc1SGerry Weißbach 3727d101cc1SGerry Weißbach if ($this->info['scriptmode']) { 3737d101cc1SGerry Weißbach $string = str_replace(array("<%", "%>", "<?", "?>"), 3747d101cc1SGerry Weißbach array("<%", "%>", "<?", "?>"), 3757d101cc1SGerry Weißbach $string); 3767d101cc1SGerry Weißbach } 3777d101cc1SGerry Weißbach 3787d101cc1SGerry Weißbach return $string; 3797d101cc1SGerry Weißbach } 3804a82723bSGerry Weißbach 381d32fa46eSGerry Weißbach // Unicode-proof htmlentities. 382d32fa46eSGerry Weißbach // Returns 'normal' chars as chars and weirdos as numeric html entites. 3830571ece2SScrutinizer Auto-Fixer 3840571ece2SScrutinizer Auto-Fixer /** 3850571ece2SScrutinizer Auto-Fixer * @param string $str 3860571ece2SScrutinizer Auto-Fixer */ 387d32fa46eSGerry Weißbach function superentities( $str ){ 388d32fa46eSGerry Weißbach // get rid of existing entities else double-escape 389d32fa46eSGerry Weißbach $str2 = ''; 390d32fa46eSGerry Weißbach $str = html_entity_decode(stripslashes($str),ENT_QUOTES,'UTF-8'); 391d32fa46eSGerry Weißbach $ar = preg_split('/(?<!^)(?!$)(?!\n)/u', $str ); // return array of every multi-byte character 392d32fa46eSGerry Weißbach foreach ($ar as $c){ 393d32fa46eSGerry Weißbach $o = ord($c); 394d32fa46eSGerry Weißbach if ( // (strlen($c) > 1) || /* multi-byte [unicode] */ 395d32fa46eSGerry Weißbach ($o > 127) // || /* <- control / latin weirdos -> */ 396d32fa46eSGerry Weißbach // ($o <32 || $o > 126) || /* <- control / latin weirdos -> */ 397d32fa46eSGerry Weißbach // ($o >33 && $o < 40) ||/* quotes + ambersand */ 398d32fa46eSGerry Weißbach // ($o >59 && $o < 63) /* html */ 399d32fa46eSGerry Weißbach 400d32fa46eSGerry Weißbach ) { 401d32fa46eSGerry Weißbach // convert to numeric entity 402d32fa46eSGerry Weißbach $c = mb_encode_numericentity($c, array(0x0, 0xffff, 0, 0xffff), 'UTF-8'); 403d32fa46eSGerry Weißbach } 404d32fa46eSGerry Weißbach $str2 .= $c; 405d32fa46eSGerry Weißbach } 406d32fa46eSGerry Weißbach return $str2; 407d32fa46eSGerry Weißbach } 408d32fa46eSGerry Weißbach 4093fa4cc5fSGerry Weißbach function preformatted($text) { 4103fa4cc5fSGerry Weißbach $this->doc .= '<div class="pre">'; 4113fa4cc5fSGerry Weißbach parent::preformatted($text); 4123fa4cc5fSGerry Weißbach $this->doc .= '</div>'; 4133fa4cc5fSGerry Weißbach } 4143fa4cc5fSGerry Weißbach 4153fa4cc5fSGerry Weißbach function _highlight($type, $text, $language = null, $filename = null) { 4163fa4cc5fSGerry Weißbach $this->doc .= '<div class="pre">'; 4173fa4cc5fSGerry Weißbach parent::_highlight($type, $text, $language, $filename); 4183fa4cc5fSGerry Weißbach $this->doc .= '</div>'; 4193fa4cc5fSGerry Weißbach } 4203fa4cc5fSGerry Weißbach 4214a82723bSGerry Weißbach /** 4224a82723bSGerry Weißbach * API of the imagereference plugin 4234a82723bSGerry Weißbach * https://github.com/i-net-software/dokuwiki-plugin-imagereference 4244a82723bSGerry Weißbach * 4254a82723bSGerry Weißbach * Allows to specify special imagecaption tags that the renderer (mpdf) can use 4264a82723bSGerry Weißbach */ 4274a82723bSGerry Weißbach public function imageCaptionTags(&$imagereferenceplugin) 4284a82723bSGerry Weißbach { 4294a82723bSGerry Weißbach if ( !$imagereferenceplugin->accepts('table') ) { 4304a82723bSGerry Weißbach return array( '<figure id="%s" class="imgcaption%s">', // $captionStart 4314a82723bSGerry Weißbach '</figure>', // $captionEnd 4324a82723bSGerry Weißbach '<figcaption class="undercaption">', // $underCaptionStart 4334a82723bSGerry Weißbach '</figcaption>' // $underCaptionEnd 4344a82723bSGerry Weißbach ); 4354a82723bSGerry Weißbach } 4364a82723bSGerry Weißbach 4374a82723bSGerry Weißbach return null; 4384a82723bSGerry Weißbach } 439*c8795a3cSGerry Weißbach 440*c8795a3cSGerry Weißbach /** 441*c8795a3cSGerry Weißbach * Render a page local link 442*c8795a3cSGerry Weißbach * 443*c8795a3cSGerry Weißbach * @param string $hash hash link identifier 444*c8795a3cSGerry Weißbach * @param string $name name for the link 445*c8795a3cSGerry Weißbach * @param bool $returnonly whether to return html or write to doc attribute 446*c8795a3cSGerry Weißbach * @return void|string writes to doc attribute or returns html depends on $returnonly 447*c8795a3cSGerry Weißbach */ 448*c8795a3cSGerry Weißbach function locallink($hash, $name = null, $returnonly = false) { 449*c8795a3cSGerry Weißbach global $ID; 450*c8795a3cSGerry Weißbach $name = $this->_getLinkTitle($name, $hash, $isImage); 451*c8795a3cSGerry Weißbach $hash = $this->_headerToLink($hash); 452*c8795a3cSGerry Weißbach $title = $name; 453*c8795a3cSGerry Weißbach 454*c8795a3cSGerry Weißbach $doc = '<a href="#'.$hash.'" title="'.$title.'" class="wikilink1">'; 455*c8795a3cSGerry Weißbach $doc .= $name; 456*c8795a3cSGerry Weißbach $doc .= '</a>'; 457*c8795a3cSGerry Weißbach 458*c8795a3cSGerry Weißbach if($returnonly) { 459*c8795a3cSGerry Weißbach return $doc; 460*c8795a3cSGerry Weißbach } else { 461*c8795a3cSGerry Weißbach $this->doc .= $doc; 462*c8795a3cSGerry Weißbach } 463*c8795a3cSGerry Weißbach } 4647d101cc1SGerry Weißbach} 4657d101cc1SGerry Weißbach 4667d101cc1SGerry Weißbach//Setup VIM: ex: et ts=4 enc=utf-8 : 467