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 17475fd248SIvan Poliakov private $lastheadlevel = -1; 18475fd248SIvan Poliakov private $current_bookmark_level = 0; 1960e59de7SGerrit Uitslag /** 2060e59de7SGerrit Uitslag * Stores action instance 2160e59de7SGerrit Uitslag * 2260e59de7SGerrit Uitslag * @var action_plugin_dw2pdf 2360e59de7SGerrit Uitslag */ 2460e59de7SGerrit Uitslag private $actioninstance = null; 2560e59de7SGerrit Uitslag 2660e59de7SGerrit Uitslag /** 2760e59de7SGerrit Uitslag * load action plugin instance 2860e59de7SGerrit Uitslag */ 2960e59de7SGerrit Uitslag public function __construct() { 3060e59de7SGerrit Uitslag $this->actioninstance = plugin_load('action', 'dw2pdf'); 3160e59de7SGerrit Uitslag } 3260e59de7SGerrit Uitslag 3360e59de7SGerrit Uitslag public function document_start() { 3460e59de7SGerrit Uitslag global $ID; 3560e59de7SGerrit Uitslag 3660e59de7SGerrit Uitslag parent::document_start(); 3760e59de7SGerrit Uitslag 3860e59de7SGerrit Uitslag //ancher for rewritten links to included pages 3960e59de7SGerrit Uitslag $check = false; 4060e59de7SGerrit Uitslag $pid = sectionID($ID, $check); 4160e59de7SGerrit Uitslag 4260e59de7SGerrit Uitslag $this->doc .= "<a name=\"{$pid}__\">"; 4360e59de7SGerrit Uitslag $this->doc .= "</a>"; 4460e59de7SGerrit Uitslag } 4583bac986SAndreas Gohr 46a876b55bSAndreas Gohr /** 47a876b55bSAndreas Gohr * Make available as XHTML replacement renderer 48236e9da2SGerrit Uitslag * 49236e9da2SGerrit Uitslag * @param $format 50236e9da2SGerrit Uitslag * @return bool 51a876b55bSAndreas Gohr */ 52a876b55bSAndreas Gohr public function canRender($format){ 53a876b55bSAndreas Gohr if($format == 'xhtml') return true; 54a876b55bSAndreas Gohr return false; 55a876b55bSAndreas Gohr } 56a876b55bSAndreas Gohr 57a876b55bSAndreas Gohr /** 58a876b55bSAndreas Gohr * Simplified header printing with PDF bookmarks 59236e9da2SGerrit Uitslag * 60236e9da2SGerrit Uitslag * @param string $text 61236e9da2SGerrit Uitslag * @param int $level 62236e9da2SGerrit Uitslag * @param int $pos 63a876b55bSAndreas Gohr */ 64*130c62eeSGerrit Uitslag public function header($text, $level, $pos) { 65a876b55bSAndreas Gohr if(!$text) return; //skip empty headlines 6660e59de7SGerrit Uitslag global $ID; 67a876b55bSAndreas Gohr 68244aaa51SMichael Hamann $hid = $this->_headerToLink($text, true); 6957a1b6f9SGerrit Uitslag 7057a1b6f9SGerrit Uitslag //only add items within global configured levels (doesn't check the pdf toc settings) 7157a1b6f9SGerrit Uitslag $this->toc_additem($hid, $text, $level); 7257a1b6f9SGerrit Uitslag 7360e59de7SGerrit Uitslag $check = false; 7460e59de7SGerrit Uitslag $pid = sectionID($ID, $check); 7560e59de7SGerrit Uitslag $hid = $pid . '__' . $hid; 76244aaa51SMichael Hamann 77a876b55bSAndreas Gohr // add PDF bookmark 787fa15500SAndreas Gohr $bookmark = ''; 7902f9a447SGerrit Uitslag $bmlevel = $this->actioninstance->getExportConfig('maxbookmarks'); 80a876b55bSAndreas Gohr if($bmlevel && $bmlevel >= $level) { 8183bac986SAndreas Gohr // PDF readers choke on invalid nested levels 82475fd248SIvan Poliakov 83*130c62eeSGerrit Uitslag if($this->lastheadlevel == -1) { 8483bac986SAndreas Gohr $this->lastheadlevel = $level; 85*130c62eeSGerrit Uitslag } 8683bac986SAndreas Gohr 87475fd248SIvan Poliakov $step = $level - $this->lastheadlevel; 88475fd248SIvan Poliakov 89*130c62eeSGerrit Uitslag if($step > 0) { 90475fd248SIvan Poliakov $this->current_bookmark_level += 1; 91*130c62eeSGerrit Uitslag } elseif($step < 0) { 92475fd248SIvan Poliakov $this->current_bookmark_level -= 1; 93*130c62eeSGerrit Uitslag if($this->current_bookmark_level < 0) { 94475fd248SIvan Poliakov $this->current_bookmark_level = 0; 95475fd248SIvan Poliakov } 96*130c62eeSGerrit Uitslag } 97475fd248SIvan Poliakov 98475fd248SIvan Poliakov $this->lastheadlevel = $level; 99475fd248SIvan Poliakov 1007fa15500SAndreas Gohr $bookmark = '<bookmark content="' . $this->_xmlEntities($text) . '" level="' . ($this->current_bookmark_level) . '" />'; 101a876b55bSAndreas Gohr } 102a876b55bSAndreas Gohr 103a876b55bSAndreas Gohr // print header 1047fa15500SAndreas Gohr $this->doc .= DOKU_LF . "<h$level>$bookmark"; 105244aaa51SMichael Hamann $this->doc .= "<a name=\"$hid\">"; 106a876b55bSAndreas Gohr $this->doc .= $this->_xmlEntities($text); 107244aaa51SMichael Hamann $this->doc .= "</a>"; 108a876b55bSAndreas Gohr $this->doc .= "</h$level>" . DOKU_LF; 109a876b55bSAndreas Gohr } 110a876b55bSAndreas Gohr 111aab792a5SAndreas Gohr /** 11260e59de7SGerrit Uitslag * Render a page local link 11360e59de7SGerrit Uitslag * 114236e9da2SGerrit Uitslag * // modified copy of parent function 115236e9da2SGerrit Uitslag * 11660e59de7SGerrit Uitslag * @param string $hash hash link identifier 11760e59de7SGerrit Uitslag * @param string $name name for the link 118236e9da2SGerrit Uitslag * @param bool $returnonly 119236e9da2SGerrit Uitslag * @return string|void 12060e59de7SGerrit Uitslag * 12160e59de7SGerrit Uitslag * @see Doku_Renderer_xhtml::locallink 12260e59de7SGerrit Uitslag */ 123528811ffSAnael Mobilia function locallink($hash, $name = null, $returnonly = false) { 12460e59de7SGerrit Uitslag global $ID; 12560e59de7SGerrit Uitslag $name = $this->_getLinkTitle($name, $hash, $isImage); 12660e59de7SGerrit Uitslag $hash = $this->_headerToLink($hash); 12760e59de7SGerrit Uitslag $title = $ID.' ↵'; 12860e59de7SGerrit Uitslag 12960e59de7SGerrit Uitslag $check = false; 13060e59de7SGerrit Uitslag $pid = sectionID($ID, $check); 13160e59de7SGerrit Uitslag 13260e59de7SGerrit Uitslag $this->doc .= '<a href="#'. $pid . '__' . $hash.'" title="'.$title.'" class="wikilink1">'; 13360e59de7SGerrit Uitslag $this->doc .= $name; 13460e59de7SGerrit Uitslag $this->doc .= '</a>'; 13560e59de7SGerrit Uitslag } 13660e59de7SGerrit Uitslag 13760e59de7SGerrit Uitslag /** 138aab792a5SAndreas Gohr * Wrap centered media in a div to center it 139236e9da2SGerrit Uitslag * 140236e9da2SGerrit Uitslag * @param string $src media ID 141236e9da2SGerrit Uitslag * @param string $title descriptive text 142236e9da2SGerrit Uitslag * @param string $align left|center|right 143236e9da2SGerrit Uitslag * @param int $width width of media in pixel 144236e9da2SGerrit Uitslag * @param int $height height of media in pixel 145236e9da2SGerrit Uitslag * @param string $cache cache|recache|nocache 146236e9da2SGerrit Uitslag * @param bool $render should the media be embedded inline or just linked 147236e9da2SGerrit Uitslag * @return string 148aab792a5SAndreas Gohr */ 149aab792a5SAndreas Gohr function _media ($src, $title=NULL, $align=NULL, $width=NULL, 150aab792a5SAndreas Gohr $height=NULL, $cache=NULL, $render = true) { 151aab792a5SAndreas Gohr 152aab792a5SAndreas Gohr $out = ''; 153aab792a5SAndreas Gohr if($align == 'center'){ 154aab792a5SAndreas Gohr $out .= '<div align="center" style="text-align: center">'; 155aab792a5SAndreas Gohr } 156aab792a5SAndreas Gohr 157aab792a5SAndreas Gohr $out .= parent::_media ($src, $title, $align, $width, $height, $cache, $render); 158aab792a5SAndreas Gohr 159aab792a5SAndreas Gohr if($align == 'center'){ 160aab792a5SAndreas Gohr $out .= '</div>'; 161aab792a5SAndreas Gohr } 162aab792a5SAndreas Gohr 163aab792a5SAndreas Gohr return $out; 164aab792a5SAndreas Gohr } 165aab792a5SAndreas Gohr 166551dd41eSAndreas Gohr /** 167551dd41eSAndreas Gohr * hover info makes no sense in PDFs, so drop acronyms 168236e9da2SGerrit Uitslag * 169236e9da2SGerrit Uitslag * @param string $acronym 170551dd41eSAndreas Gohr */ 171551dd41eSAndreas Gohr function acronym($acronym) { 172551dd41eSAndreas Gohr $this->doc .= $this->_xmlEntities($acronym); 173551dd41eSAndreas Gohr } 174551dd41eSAndreas Gohr 1759eb4c81fSAndreas Gohr /** 1769eb4c81fSAndreas Gohr * reformat links if needed 177236e9da2SGerrit Uitslag * 178236e9da2SGerrit Uitslag * @param array $link 179236e9da2SGerrit Uitslag * @return string 1809eb4c81fSAndreas Gohr */ 1819eb4c81fSAndreas Gohr function _formatLink($link){ 18260e59de7SGerrit Uitslag 18360e59de7SGerrit Uitslag // for internal links contains the title the pageid 18460e59de7SGerrit Uitslag if(in_array($link['title'], $this->actioninstance->getExportedPages())) { 18560e59de7SGerrit Uitslag list(/* $url */, $hash) = explode('#', $link['url'], 2); 18660e59de7SGerrit Uitslag 18760e59de7SGerrit Uitslag $check = false; 18860e59de7SGerrit Uitslag $pid = sectionID($link['title'], $check); 18960e59de7SGerrit Uitslag $link['url'] = "#" . $pid . '__' . $hash; 19060e59de7SGerrit Uitslag } 19160e59de7SGerrit Uitslag 19260e59de7SGerrit Uitslag 1939eb4c81fSAndreas Gohr // prefix interwiki links with interwiki icon 1949eb4c81fSAndreas Gohr if($link['name'][0] != '<' && preg_match('/\binterwiki iw_(.\w+)\b/',$link['class'],$m)){ 1959eb4c81fSAndreas Gohr if(file_exists(DOKU_INC.'lib/images/interwiki/'.$m[1].'.png')){ 1969eb4c81fSAndreas Gohr $img = DOKU_BASE.'lib/images/interwiki/'.$m[1].'.png'; 1979eb4c81fSAndreas Gohr }elseif(file_exists(DOKU_INC.'lib/images/interwiki/'.$m[1].'.gif')){ 1989eb4c81fSAndreas Gohr $img = DOKU_BASE.'lib/images/interwiki/'.$m[1].'.gif'; 1999eb4c81fSAndreas Gohr }else{ 2009eb4c81fSAndreas Gohr $img = DOKU_BASE.'lib/images/interwiki.png'; 2019eb4c81fSAndreas Gohr } 2029eb4c81fSAndreas Gohr 20347b0d67bSAndreas Gohr $link['name'] = '<img src="'.$img.'" width="16" height="16" style="vertical-align: center" class="'.$link['class'].'" />'.$link['name']; 2049eb4c81fSAndreas Gohr } 2059eb4c81fSAndreas Gohr return parent::_formatLink($link); 2069eb4c81fSAndreas Gohr } 207ccdd3126SAndreas Gohr 208ccdd3126SAndreas Gohr /** 209ccdd3126SAndreas Gohr * no obfuscation for email addresses 210236e9da2SGerrit Uitslag * 211236e9da2SGerrit Uitslag * @param string $address 212236e9da2SGerrit Uitslag * @param null $name 213236e9da2SGerrit Uitslag * @param bool $returnonly 214236e9da2SGerrit Uitslag * @return string|void 215ccdd3126SAndreas Gohr */ 2160a23c2bcSAnael Mobilia function emaillink($address, $name = NULL, $returnonly = false) { 217ccdd3126SAndreas Gohr global $conf; 218ccdd3126SAndreas Gohr $old = $conf['mailguard']; 219ccdd3126SAndreas Gohr $conf['mailguard'] = 'none'; 2209e1a2ac6SAnael Mobilia parent::emaillink($address, $name, $returnonly); 221ccdd3126SAndreas Gohr $conf['mailguard'] = $old; 222ccdd3126SAndreas Gohr } 223ccdd3126SAndreas Gohr 224a876b55bSAndreas Gohr} 225a876b55bSAndreas Gohr 226