xref: /plugin/dw2pdf/renderer.php (revision 244aaa51b1fff64d60559813fd6036a947e263e7)
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