1a876b55bSAndreas Gohr<?php 2a876b55bSAndreas Gohr/** 3a876b55bSAndreas Gohr * DokuWiki Plugin dw2pdf (Renderer Component) 4a876b55bSAndreas Gohr * 5a876b55bSAndreas Gohr * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html 6a876b55bSAndreas Gohr * @author Andreas Gohr <gohr@cosmocode.de> 7a876b55bSAndreas Gohr */ 8a876b55bSAndreas Gohr 9a876b55bSAndreas Gohr// must be run within Dokuwiki 10a876b55bSAndreas Gohrif (!defined('DOKU_INC')) die(); 11a876b55bSAndreas Gohr 1260e59de7SGerrit Uitslag/** 1360e59de7SGerrit Uitslag * Render xhtml suitable as input for mpdf library 1460e59de7SGerrit Uitslag */ 15a876b55bSAndreas Gohrclass renderer_plugin_dw2pdf extends Doku_Renderer_xhtml { 16a876b55bSAndreas Gohr 17*bb7717bcSGerrit Uitslag private $lastHeaderLevel = -1; 18*bb7717bcSGerrit Uitslag private $originalHeaderLevel = 0; 19*bb7717bcSGerrit Uitslag private $difference = 0; 20*bb7717bcSGerrit Uitslag 2160e59de7SGerrit Uitslag /** 2260e59de7SGerrit Uitslag * Stores action instance 2360e59de7SGerrit Uitslag * 2460e59de7SGerrit Uitslag * @var action_plugin_dw2pdf 2560e59de7SGerrit Uitslag */ 2660e59de7SGerrit Uitslag private $actioninstance = null; 2760e59de7SGerrit Uitslag 2860e59de7SGerrit Uitslag /** 2960e59de7SGerrit Uitslag * load action plugin instance 3060e59de7SGerrit Uitslag */ 3160e59de7SGerrit Uitslag public function __construct() { 3260e59de7SGerrit Uitslag $this->actioninstance = plugin_load('action', 'dw2pdf'); 3360e59de7SGerrit Uitslag } 3460e59de7SGerrit Uitslag 3560e59de7SGerrit Uitslag public function document_start() { 3660e59de7SGerrit Uitslag global $ID; 3760e59de7SGerrit Uitslag 3860e59de7SGerrit Uitslag parent::document_start(); 3960e59de7SGerrit Uitslag 4060e59de7SGerrit Uitslag //ancher for rewritten links to included pages 4160e59de7SGerrit Uitslag $check = false; 4260e59de7SGerrit Uitslag $pid = sectionID($ID, $check); 4360e59de7SGerrit Uitslag 4460e59de7SGerrit Uitslag $this->doc .= "<a name=\"{$pid}__\">"; 4560e59de7SGerrit Uitslag $this->doc .= "</a>"; 4660e59de7SGerrit Uitslag } 4783bac986SAndreas Gohr 48a876b55bSAndreas Gohr /** 49a876b55bSAndreas Gohr * Make available as XHTML replacement renderer 50236e9da2SGerrit Uitslag * 51236e9da2SGerrit Uitslag * @param $format 52236e9da2SGerrit Uitslag * @return bool 53a876b55bSAndreas Gohr */ 54a876b55bSAndreas Gohr public function canRender($format){ 55a876b55bSAndreas Gohr if($format == 'xhtml') return true; 56a876b55bSAndreas Gohr return false; 57a876b55bSAndreas Gohr } 58a876b55bSAndreas Gohr 59a876b55bSAndreas Gohr /** 60a876b55bSAndreas Gohr * Simplified header printing with PDF bookmarks 61236e9da2SGerrit Uitslag * 62236e9da2SGerrit Uitslag * @param string $text 63*bb7717bcSGerrit Uitslag * @param int $level from 1 (highest) to 6 (lowest) 64236e9da2SGerrit Uitslag * @param int $pos 65a876b55bSAndreas Gohr */ 66130c62eeSGerrit Uitslag public function header($text, $level, $pos) { 67a876b55bSAndreas Gohr if(!$text) return; //skip empty headlines 6860e59de7SGerrit Uitslag global $ID; 69a876b55bSAndreas Gohr 70244aaa51SMichael Hamann $hid = $this->_headerToLink($text, true); 7157a1b6f9SGerrit Uitslag 7257a1b6f9SGerrit Uitslag //only add items within global configured levels (doesn't check the pdf toc settings) 7357a1b6f9SGerrit Uitslag $this->toc_additem($hid, $text, $level); 7457a1b6f9SGerrit Uitslag 7560e59de7SGerrit Uitslag $check = false; 7660e59de7SGerrit Uitslag $pid = sectionID($ID, $check); 7760e59de7SGerrit Uitslag $hid = $pid . '__' . $hid; 78244aaa51SMichael Hamann 79a876b55bSAndreas Gohr // add PDF bookmark 807fa15500SAndreas Gohr $bookmark = ''; 81*bb7717bcSGerrit Uitslag $maxbookmarklevel = $this->actioninstance->getExportConfig('maxbookmarks'); 82*bb7717bcSGerrit Uitslag // 0: off, 1-6: show down to this level 83*bb7717bcSGerrit Uitslag if($maxbookmarklevel && $maxbookmarklevel >= $level) { 84*bb7717bcSGerrit Uitslag $bookmarklevel = $this->calculateBookmarklevel($level); 85*bb7717bcSGerrit Uitslag $bookmark = '<bookmark content="' . $this->_xmlEntities($text) . '" level="' . ($bookmarklevel) . '" />'; 86a876b55bSAndreas Gohr } 87a876b55bSAndreas Gohr 88a876b55bSAndreas Gohr // print header 897fa15500SAndreas Gohr $this->doc .= DOKU_LF . "<h$level>$bookmark"; 90244aaa51SMichael Hamann $this->doc .= "<a name=\"$hid\">"; 91a876b55bSAndreas Gohr $this->doc .= $this->_xmlEntities($text); 92244aaa51SMichael Hamann $this->doc .= "</a>"; 93a876b55bSAndreas Gohr $this->doc .= "</h$level>" . DOKU_LF; 94a876b55bSAndreas Gohr } 95a876b55bSAndreas Gohr 96aab792a5SAndreas Gohr /** 97*bb7717bcSGerrit Uitslag * Bookmark levels might increase maximal +1 per level. 98*bb7717bcSGerrit Uitslag * (note: levels start at 1, bookmarklevels at 0) 99*bb7717bcSGerrit Uitslag * 100*bb7717bcSGerrit Uitslag * @param int $level 1 (highest) to 6 (lowest) 101*bb7717bcSGerrit Uitslag * @return int 102*bb7717bcSGerrit Uitslag */ 103*bb7717bcSGerrit Uitslag protected function calculateBookmarklevel($level) { 104*bb7717bcSGerrit Uitslag if($this->lastHeaderLevel == -1) { 105*bb7717bcSGerrit Uitslag $this->lastHeaderLevel = $level; 106*bb7717bcSGerrit Uitslag } 107*bb7717bcSGerrit Uitslag $step = $level - $this->lastHeaderLevel; 108*bb7717bcSGerrit Uitslag if($step > 1) { 109*bb7717bcSGerrit Uitslag $this->difference = $this->difference + ($step - 1); 110*bb7717bcSGerrit Uitslag } 111*bb7717bcSGerrit Uitslag if($step < 0 ) { 112*bb7717bcSGerrit Uitslag $this->difference = min($this->difference, $level - $this->originalHeaderLevel); 113*bb7717bcSGerrit Uitslag $this->difference = max($this->difference, 0); 114*bb7717bcSGerrit Uitslag } 115*bb7717bcSGerrit Uitslag 116*bb7717bcSGerrit Uitslag $bookmarklevel = $level - $this->difference; 117*bb7717bcSGerrit Uitslag 118*bb7717bcSGerrit Uitslag if($step > 1) { 119*bb7717bcSGerrit Uitslag $this->originalHeaderLevel = $bookmarklevel; 120*bb7717bcSGerrit Uitslag } 121*bb7717bcSGerrit Uitslag 122*bb7717bcSGerrit Uitslag $this->lastHeaderLevel = $level; 123*bb7717bcSGerrit Uitslag return $bookmarklevel - 1; //zero indexed 124*bb7717bcSGerrit Uitslag } 125*bb7717bcSGerrit Uitslag 126*bb7717bcSGerrit Uitslag /** 12760e59de7SGerrit Uitslag * Render a page local link 12860e59de7SGerrit Uitslag * 129236e9da2SGerrit Uitslag * // modified copy of parent function 130236e9da2SGerrit Uitslag * 13160e59de7SGerrit Uitslag * @param string $hash hash link identifier 13260e59de7SGerrit Uitslag * @param string $name name for the link 133236e9da2SGerrit Uitslag * @param bool $returnonly 134236e9da2SGerrit Uitslag * @return string|void 13560e59de7SGerrit Uitslag * 13660e59de7SGerrit Uitslag * @see Doku_Renderer_xhtml::locallink 13760e59de7SGerrit Uitslag */ 138528811ffSAnael Mobilia function locallink($hash, $name = null, $returnonly = false) { 13960e59de7SGerrit Uitslag global $ID; 14060e59de7SGerrit Uitslag $name = $this->_getLinkTitle($name, $hash, $isImage); 14160e59de7SGerrit Uitslag $hash = $this->_headerToLink($hash); 14260e59de7SGerrit Uitslag $title = $ID.' ↵'; 14360e59de7SGerrit Uitslag 14460e59de7SGerrit Uitslag $check = false; 14560e59de7SGerrit Uitslag $pid = sectionID($ID, $check); 14660e59de7SGerrit Uitslag 14760e59de7SGerrit Uitslag $this->doc .= '<a href="#'. $pid . '__' . $hash.'" title="'.$title.'" class="wikilink1">'; 14860e59de7SGerrit Uitslag $this->doc .= $name; 14960e59de7SGerrit Uitslag $this->doc .= '</a>'; 15060e59de7SGerrit Uitslag } 15160e59de7SGerrit Uitslag 15260e59de7SGerrit Uitslag /** 153aab792a5SAndreas Gohr * Wrap centered media in a div to center it 154236e9da2SGerrit Uitslag * 155236e9da2SGerrit Uitslag * @param string $src media ID 156236e9da2SGerrit Uitslag * @param string $title descriptive text 157236e9da2SGerrit Uitslag * @param string $align left|center|right 158236e9da2SGerrit Uitslag * @param int $width width of media in pixel 159236e9da2SGerrit Uitslag * @param int $height height of media in pixel 160236e9da2SGerrit Uitslag * @param string $cache cache|recache|nocache 161236e9da2SGerrit Uitslag * @param bool $render should the media be embedded inline or just linked 162236e9da2SGerrit Uitslag * @return string 163aab792a5SAndreas Gohr */ 164aab792a5SAndreas Gohr function _media ($src, $title=NULL, $align=NULL, $width=NULL, 165aab792a5SAndreas Gohr $height=NULL, $cache=NULL, $render = true) { 166aab792a5SAndreas Gohr 167aab792a5SAndreas Gohr $out = ''; 168aab792a5SAndreas Gohr if($align == 'center'){ 169aab792a5SAndreas Gohr $out .= '<div align="center" style="text-align: center">'; 170aab792a5SAndreas Gohr } 171aab792a5SAndreas Gohr 172aab792a5SAndreas Gohr $out .= parent::_media ($src, $title, $align, $width, $height, $cache, $render); 173aab792a5SAndreas Gohr 174aab792a5SAndreas Gohr if($align == 'center'){ 175aab792a5SAndreas Gohr $out .= '</div>'; 176aab792a5SAndreas Gohr } 177aab792a5SAndreas Gohr 178aab792a5SAndreas Gohr return $out; 179aab792a5SAndreas Gohr } 180aab792a5SAndreas Gohr 181551dd41eSAndreas Gohr /** 182551dd41eSAndreas Gohr * hover info makes no sense in PDFs, so drop acronyms 183236e9da2SGerrit Uitslag * 184236e9da2SGerrit Uitslag * @param string $acronym 185551dd41eSAndreas Gohr */ 186551dd41eSAndreas Gohr function acronym($acronym) { 187551dd41eSAndreas Gohr $this->doc .= $this->_xmlEntities($acronym); 188551dd41eSAndreas Gohr } 189551dd41eSAndreas Gohr 1909eb4c81fSAndreas Gohr /** 1919eb4c81fSAndreas Gohr * reformat links if needed 192236e9da2SGerrit Uitslag * 193236e9da2SGerrit Uitslag * @param array $link 194236e9da2SGerrit Uitslag * @return string 1959eb4c81fSAndreas Gohr */ 1969eb4c81fSAndreas Gohr function _formatLink($link){ 19760e59de7SGerrit Uitslag 19860e59de7SGerrit Uitslag // for internal links contains the title the pageid 19960e59de7SGerrit Uitslag if(in_array($link['title'], $this->actioninstance->getExportedPages())) { 20060e59de7SGerrit Uitslag list(/* $url */, $hash) = explode('#', $link['url'], 2); 20160e59de7SGerrit Uitslag 20260e59de7SGerrit Uitslag $check = false; 20360e59de7SGerrit Uitslag $pid = sectionID($link['title'], $check); 20460e59de7SGerrit Uitslag $link['url'] = "#" . $pid . '__' . $hash; 20560e59de7SGerrit Uitslag } 20660e59de7SGerrit Uitslag 20760e59de7SGerrit Uitslag 2089eb4c81fSAndreas Gohr // prefix interwiki links with interwiki icon 2099eb4c81fSAndreas Gohr if($link['name'][0] != '<' && preg_match('/\binterwiki iw_(.\w+)\b/',$link['class'],$m)){ 2109eb4c81fSAndreas Gohr if(file_exists(DOKU_INC.'lib/images/interwiki/'.$m[1].'.png')){ 2119eb4c81fSAndreas Gohr $img = DOKU_BASE.'lib/images/interwiki/'.$m[1].'.png'; 2129eb4c81fSAndreas Gohr }elseif(file_exists(DOKU_INC.'lib/images/interwiki/'.$m[1].'.gif')){ 2139eb4c81fSAndreas Gohr $img = DOKU_BASE.'lib/images/interwiki/'.$m[1].'.gif'; 2149eb4c81fSAndreas Gohr }else{ 2159eb4c81fSAndreas Gohr $img = DOKU_BASE.'lib/images/interwiki.png'; 2169eb4c81fSAndreas Gohr } 2179eb4c81fSAndreas Gohr 21847b0d67bSAndreas Gohr $link['name'] = '<img src="'.$img.'" width="16" height="16" style="vertical-align: center" class="'.$link['class'].'" />'.$link['name']; 2199eb4c81fSAndreas Gohr } 2209eb4c81fSAndreas Gohr return parent::_formatLink($link); 2219eb4c81fSAndreas Gohr } 222ccdd3126SAndreas Gohr 223ccdd3126SAndreas Gohr /** 224ccdd3126SAndreas Gohr * no obfuscation for email addresses 225236e9da2SGerrit Uitslag * 226236e9da2SGerrit Uitslag * @param string $address 227236e9da2SGerrit Uitslag * @param null $name 228236e9da2SGerrit Uitslag * @param bool $returnonly 229236e9da2SGerrit Uitslag * @return string|void 230ccdd3126SAndreas Gohr */ 2310a23c2bcSAnael Mobilia function emaillink($address, $name = NULL, $returnonly = false) { 232ccdd3126SAndreas Gohr global $conf; 233ccdd3126SAndreas Gohr $old = $conf['mailguard']; 234ccdd3126SAndreas Gohr $conf['mailguard'] = 'none'; 2359e1a2ac6SAnael Mobilia parent::emaillink($address, $name, $returnonly); 236ccdd3126SAndreas Gohr $conf['mailguard'] = $old; 237ccdd3126SAndreas Gohr } 238ccdd3126SAndreas Gohr 239a876b55bSAndreas Gohr} 240a876b55bSAndreas Gohr 241