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 12a876b55bSAndreas Gohrif (!defined('DOKU_LF')) define('DOKU_LF', "\n"); 13a876b55bSAndreas Gohrif (!defined('DOKU_TAB')) define('DOKU_TAB', "\t"); 14a876b55bSAndreas Gohrrequire_once DOKU_INC.'inc/parser/xhtml.php'; 15a876b55bSAndreas Gohr 16a876b55bSAndreas Gohrclass renderer_plugin_dw2pdf extends Doku_Renderer_xhtml { 17a876b55bSAndreas Gohr 18475fd248SIvan Poliakov private $lastheadlevel = -1; 19475fd248SIvan Poliakov private $current_bookmark_level = 0; 2083bac986SAndreas Gohr 21a876b55bSAndreas Gohr /** 22a876b55bSAndreas Gohr * Make available as XHTML replacement renderer 23a876b55bSAndreas Gohr */ 24a876b55bSAndreas Gohr public function canRender($format){ 25a876b55bSAndreas Gohr if($format == 'xhtml') return true; 26a876b55bSAndreas Gohr return false; 27a876b55bSAndreas Gohr } 28a876b55bSAndreas Gohr 29a876b55bSAndreas Gohr /** 30a876b55bSAndreas Gohr * Simplified header printing with PDF bookmarks 31a876b55bSAndreas Gohr */ 32a876b55bSAndreas Gohr function header($text, $level, $pos) { 33a876b55bSAndreas Gohr if(!$text) return; //skip empty headlines 34a876b55bSAndreas Gohr 35244aaa51SMichael Hamann $hid = $this->_headerToLink($text,true); 36244aaa51SMichael Hamann 37a876b55bSAndreas Gohr // add PDF bookmark 38*7fa15500SAndreas Gohr $bookmark = ''; 39a876b55bSAndreas Gohr $bmlevel = $this->getConf('maxbookmarks'); 40a876b55bSAndreas Gohr if($bmlevel && $bmlevel >= $level){ 4183bac986SAndreas Gohr // PDF readers choke on invalid nested levels 42475fd248SIvan Poliakov 43475fd248SIvan Poliakov if ($this->lastheadlevel == -1) 4483bac986SAndreas Gohr $this->lastheadlevel = $level; 4583bac986SAndreas Gohr 46475fd248SIvan Poliakov $step = $level - $this->lastheadlevel; 47475fd248SIvan Poliakov 48475fd248SIvan Poliakov if ($step > 0) 49475fd248SIvan Poliakov $this->current_bookmark_level += 1; 50475fd248SIvan Poliakov else if ($step <0) { 51475fd248SIvan Poliakov $this->current_bookmark_level -= 1; 52475fd248SIvan Poliakov if ($this->current_bookmark_level < 0) 53475fd248SIvan Poliakov $this->current_bookmark_level = 0; 54475fd248SIvan Poliakov } 55475fd248SIvan Poliakov 56475fd248SIvan Poliakov $this->lastheadlevel = $level; 57475fd248SIvan Poliakov 58*7fa15500SAndreas Gohr $bookmark = '<bookmark content="'.$this->_xmlEntities($text).'" level="'.($this->current_bookmark_level).'" />'; 59a876b55bSAndreas Gohr } 60a876b55bSAndreas Gohr 61a876b55bSAndreas Gohr // print header 62*7fa15500SAndreas Gohr $this->doc .= DOKU_LF."<h$level>$bookmark"; 63244aaa51SMichael Hamann $this->doc .= "<a name=\"$hid\">"; 64a876b55bSAndreas Gohr $this->doc .= $this->_xmlEntities($text); 65244aaa51SMichael Hamann $this->doc .= "</a>"; 66a876b55bSAndreas Gohr $this->doc .= "</h$level>".DOKU_LF; 67a876b55bSAndreas Gohr } 68a876b55bSAndreas Gohr 69aab792a5SAndreas Gohr /** 70aab792a5SAndreas Gohr * Wrap centered media in a div to center it 71aab792a5SAndreas Gohr */ 72aab792a5SAndreas Gohr function _media ($src, $title=NULL, $align=NULL, $width=NULL, 73aab792a5SAndreas Gohr $height=NULL, $cache=NULL, $render = true) { 74aab792a5SAndreas Gohr 75aab792a5SAndreas Gohr $out = ''; 76aab792a5SAndreas Gohr if($align == 'center'){ 77aab792a5SAndreas Gohr $out .= '<div align="center" style="text-align: center">'; 78aab792a5SAndreas Gohr } 79aab792a5SAndreas Gohr 80aab792a5SAndreas Gohr $out .= parent::_media ($src, $title, $align, $width, $height, $cache, $render); 81aab792a5SAndreas Gohr 82aab792a5SAndreas Gohr if($align == 'center'){ 83aab792a5SAndreas Gohr $out .= '</div>'; 84aab792a5SAndreas Gohr } 85aab792a5SAndreas Gohr 86aab792a5SAndreas Gohr return $out; 87aab792a5SAndreas Gohr } 88aab792a5SAndreas Gohr 89551dd41eSAndreas Gohr /** 90551dd41eSAndreas Gohr * hover info makes no sense in PDFs, so drop acronyms 91551dd41eSAndreas Gohr */ 92551dd41eSAndreas Gohr function acronym($acronym) { 93551dd41eSAndreas Gohr $this->doc .= $this->_xmlEntities($acronym); 94551dd41eSAndreas Gohr } 95551dd41eSAndreas Gohr 969eb4c81fSAndreas Gohr 979eb4c81fSAndreas Gohr /** 989eb4c81fSAndreas Gohr * reformat links if needed 999eb4c81fSAndreas Gohr */ 10047b0d67bSAndreas Gohr 1019eb4c81fSAndreas Gohr function _formatLink($link){ 1029eb4c81fSAndreas Gohr // prefix interwiki links with interwiki icon 1039eb4c81fSAndreas Gohr if($link['name'][0] != '<' && preg_match('/\binterwiki iw_(.\w+)\b/',$link['class'],$m)){ 1049eb4c81fSAndreas Gohr if(file_exists(DOKU_INC.'lib/images/interwiki/'.$m[1].'.png')){ 1059eb4c81fSAndreas Gohr $img = DOKU_BASE.'lib/images/interwiki/'.$m[1].'.png'; 1069eb4c81fSAndreas Gohr }elseif(file_exists(DOKU_INC.'lib/images/interwiki/'.$m[1].'.gif')){ 1079eb4c81fSAndreas Gohr $img = DOKU_BASE.'lib/images/interwiki/'.$m[1].'.gif'; 1089eb4c81fSAndreas Gohr }else{ 1099eb4c81fSAndreas Gohr $img = DOKU_BASE.'lib/images/interwiki.png'; 1109eb4c81fSAndreas Gohr } 1119eb4c81fSAndreas Gohr 11247b0d67bSAndreas Gohr $link['name'] = '<img src="'.$img.'" width="16" height="16" style="vertical-align: center" class="'.$link['class'].'" />'.$link['name']; 1139eb4c81fSAndreas Gohr } 1149eb4c81fSAndreas Gohr return parent::_formatLink($link); 1159eb4c81fSAndreas Gohr } 116ccdd3126SAndreas Gohr 117ccdd3126SAndreas Gohr /** 118ccdd3126SAndreas Gohr * no obfuscation for email addresses 119ccdd3126SAndreas Gohr */ 120ccdd3126SAndreas Gohr function emaillink($address, $name = NULL) { 121ccdd3126SAndreas Gohr global $conf; 122ccdd3126SAndreas Gohr $old = $conf['mailguard']; 123ccdd3126SAndreas Gohr $conf['mailguard'] = 'none'; 124ccdd3126SAndreas Gohr parent::emaillink($address, $name); 125ccdd3126SAndreas Gohr $conf['mailguard'] = $old; 126ccdd3126SAndreas Gohr } 127ccdd3126SAndreas Gohr 128a876b55bSAndreas Gohr} 129a876b55bSAndreas Gohr 130