1<?php 2/** 3 * DokuWiki Plugin dw2pdf (Renderer Component) 4 * 5 * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html 6 * @author Andreas Gohr <gohr@cosmocode.de> 7 */ 8 9// must be run within Dokuwiki 10if (!defined('DOKU_INC')) die(); 11 12if (!defined('DOKU_LF')) define('DOKU_LF', "\n"); 13if (!defined('DOKU_TAB')) define('DOKU_TAB', "\t"); 14require_once DOKU_INC.'inc/parser/xhtml.php'; 15 16class renderer_plugin_dw2pdf extends Doku_Renderer_xhtml { 17 18 private $lastheadlevel = 0; 19 20 /** 21 * Make available as XHTML replacement renderer 22 */ 23 public function canRender($format){ 24 if($format == 'xhtml') return true; 25 return false; 26 } 27 28 /** 29 * Simplified header printing with PDF bookmarks 30 */ 31 function header($text, $level, $pos) { 32 if(!$text) return; //skip empty headlines 33 34 $hid = $this->_headerToLink($text,true); 35 36 // add PDF bookmark 37 $bmlevel = $this->getConf('maxbookmarks'); 38 if($bmlevel && $bmlevel >= $level){ 39 // PDF readers choke on invalid nested levels 40 $step = $level - $this->lastheadlevel; 41 if($step > 1) $level = $this->lastheadlevel; 42 $this->lastheadlevel = $level; 43 44 $this->doc .= '<bookmark content="'.$this->_xmlEntities($text).'" level="'.($level-1).'" />'; 45 } 46 47 // print header 48 $this->doc .= DOKU_LF."<h$level>"; 49 $this->doc .= "<a name=\"$hid\">"; 50 $this->doc .= $this->_xmlEntities($text); 51 $this->doc .= "</a>"; 52 $this->doc .= "</h$level>".DOKU_LF; 53 } 54 55 /** 56 * Wrap centered media in a div to center it 57 */ 58 function _media ($src, $title=NULL, $align=NULL, $width=NULL, 59 $height=NULL, $cache=NULL, $render = true) { 60 61 $out = ''; 62 if($align == 'center'){ 63 $out .= '<div align="center" style="text-align: center">'; 64 } 65 66 $out .= parent::_media ($src, $title, $align, $width, $height, $cache, $render); 67 68 if($align == 'center'){ 69 $out .= '</div>'; 70 } 71 72 return $out; 73 } 74 75 /** 76 * hover info makes no sense in PDFs, so drop acronyms 77 */ 78 function acronym($acronym) { 79 $this->doc .= $this->_xmlEntities($acronym); 80 } 81 82 83 /** 84 * reformat links if needed 85 */ 86 87 function _formatLink($link){ 88 // prefix interwiki links with interwiki icon 89 if($link['name'][0] != '<' && preg_match('/\binterwiki iw_(.\w+)\b/',$link['class'],$m)){ 90 if(file_exists(DOKU_INC.'lib/images/interwiki/'.$m[1].'.png')){ 91 $img = DOKU_BASE.'lib/images/interwiki/'.$m[1].'.png'; 92 }elseif(file_exists(DOKU_INC.'lib/images/interwiki/'.$m[1].'.gif')){ 93 $img = DOKU_BASE.'lib/images/interwiki/'.$m[1].'.gif'; 94 }else{ 95 $img = DOKU_BASE.'lib/images/interwiki.png'; 96 } 97 98 $link['name'] = '<img src="'.$img.'" width="16" height="16" style="vertical-align: center" class="'.$link['class'].'" />'.$link['name']; 99 } 100 return parent::_formatLink($link); 101 } 102 103 /** 104 * no obfuscation for email addresses 105 */ 106 function emaillink($address, $name = NULL) { 107 global $conf; 108 $old = $conf['mailguard']; 109 $conf['mailguard'] = 'none'; 110 parent::emaillink($address, $name); 111 $conf['mailguard'] = $old; 112 } 113 114} 115 116