xref: /plugin/dw2pdf/renderer.php (revision 83bac986bddb72b02aadf985b15cda083ada81cf)
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
18*83bac986SAndreas Gohr    private $lastheadlevel = 0;
19*83bac986SAndreas Gohr
20a876b55bSAndreas Gohr    /**
21a876b55bSAndreas Gohr     * Make available as XHTML replacement renderer
22a876b55bSAndreas Gohr     */
23a876b55bSAndreas Gohr    public function canRender($format){
24a876b55bSAndreas Gohr        if($format == 'xhtml') return true;
25a876b55bSAndreas Gohr        return false;
26a876b55bSAndreas Gohr    }
27a876b55bSAndreas Gohr
28a876b55bSAndreas Gohr    /**
29a876b55bSAndreas Gohr     * Simplified header printing with PDF bookmarks
30a876b55bSAndreas Gohr     */
31a876b55bSAndreas Gohr    function header($text, $level, $pos) {
32a876b55bSAndreas Gohr        if(!$text) return; //skip empty headlines
33a876b55bSAndreas Gohr
34a876b55bSAndreas Gohr        // add PDF bookmark
35a876b55bSAndreas Gohr        $bmlevel = $this->getConf('maxbookmarks');
36a876b55bSAndreas Gohr        if($bmlevel && $bmlevel >= $level){
37*83bac986SAndreas Gohr            // PDF readers choke on invalid nested levels
38*83bac986SAndreas Gohr            $step = $level - $this->lastheadlevel;
39*83bac986SAndreas Gohr            if($step > 1) $level = $this->lastheadlevel;
40*83bac986SAndreas Gohr            $this->lastheadlevel = $level;
41*83bac986SAndreas Gohr
42a876b55bSAndreas Gohr            $this->doc .= '<bookmark content="'.$this->_xmlEntities($text).'" level="'.($level-1).'" />';
43a876b55bSAndreas Gohr        }
44a876b55bSAndreas Gohr
45a876b55bSAndreas Gohr        // print header
46a876b55bSAndreas Gohr        $this->doc .= DOKU_LF."<h$level>";
47a876b55bSAndreas Gohr        $this->doc .= $this->_xmlEntities($text);
48a876b55bSAndreas Gohr        $this->doc .= "</h$level>".DOKU_LF;
49a876b55bSAndreas Gohr    }
50a876b55bSAndreas Gohr
51aab792a5SAndreas Gohr    /**
52aab792a5SAndreas Gohr     * Wrap centered media in a div to center it
53aab792a5SAndreas Gohr     */
54aab792a5SAndreas Gohr    function _media ($src, $title=NULL, $align=NULL, $width=NULL,
55aab792a5SAndreas Gohr                      $height=NULL, $cache=NULL, $render = true) {
56aab792a5SAndreas Gohr
57aab792a5SAndreas Gohr        $out = '';
58aab792a5SAndreas Gohr        if($align == 'center'){
59aab792a5SAndreas Gohr            $out .= '<div align="center" style="text-align: center">';
60aab792a5SAndreas Gohr        }
61aab792a5SAndreas Gohr
62aab792a5SAndreas Gohr        $out .= parent::_media ($src, $title, $align, $width, $height, $cache, $render);
63aab792a5SAndreas Gohr
64aab792a5SAndreas Gohr        if($align == 'center'){
65aab792a5SAndreas Gohr            $out .= '</div>';
66aab792a5SAndreas Gohr        }
67aab792a5SAndreas Gohr
68aab792a5SAndreas Gohr        return $out;
69aab792a5SAndreas Gohr    }
70aab792a5SAndreas Gohr
71551dd41eSAndreas Gohr    /**
72551dd41eSAndreas Gohr     * hover info makes no sense in PDFs, so drop acronyms
73551dd41eSAndreas Gohr     */
74551dd41eSAndreas Gohr    function acronym($acronym) {
75551dd41eSAndreas Gohr        $this->doc .= $this->_xmlEntities($acronym);
76551dd41eSAndreas Gohr    }
77551dd41eSAndreas Gohr
789eb4c81fSAndreas Gohr
799eb4c81fSAndreas Gohr    /**
809eb4c81fSAndreas Gohr     * reformat links if needed
819eb4c81fSAndreas Gohr     */
829eb4c81fSAndreas Gohr    function _formatLink($link){
839eb4c81fSAndreas Gohr        // prefix interwiki links with interwiki icon
849eb4c81fSAndreas Gohr        if($link['name'][0] != '<' && preg_match('/\binterwiki iw_(.\w+)\b/',$link['class'],$m)){
859eb4c81fSAndreas Gohr            if(file_exists(DOKU_INC.'lib/images/interwiki/'.$m[1].'.png')){
869eb4c81fSAndreas Gohr                $img = DOKU_BASE.'lib/images/interwiki/'.$m[1].'.png';
879eb4c81fSAndreas Gohr            }elseif(file_exists(DOKU_INC.'lib/images/interwiki/'.$m[1].'.gif')){
889eb4c81fSAndreas Gohr                $img = DOKU_BASE.'lib/images/interwiki/'.$m[1].'.gif';
899eb4c81fSAndreas Gohr            }else{
909eb4c81fSAndreas Gohr                $img = DOKU_BASE.'lib/images/interwiki.png';
919eb4c81fSAndreas Gohr            }
929eb4c81fSAndreas Gohr
939eb4c81fSAndreas Gohr            $link['name'] = '<img src="'.$img.'" width="16" height="16" style="vertical-align: center" />'.$link['name'];
949eb4c81fSAndreas Gohr        }
959eb4c81fSAndreas Gohr        return parent::_formatLink($link);
969eb4c81fSAndreas Gohr    }
97ccdd3126SAndreas Gohr
98ccdd3126SAndreas Gohr    /**
99ccdd3126SAndreas Gohr     * no obfuscation for email addresses
100ccdd3126SAndreas Gohr     */
101ccdd3126SAndreas Gohr    function emaillink($address, $name = NULL) {
102ccdd3126SAndreas Gohr        global $conf;
103ccdd3126SAndreas Gohr        $old = $conf['mailguard'];
104ccdd3126SAndreas Gohr        $conf['mailguard'] = 'none';
105ccdd3126SAndreas Gohr        parent::emaillink($address, $name);
106ccdd3126SAndreas Gohr        $conf['mailguard'] = $old;
107ccdd3126SAndreas Gohr    }
108ccdd3126SAndreas Gohr
109a876b55bSAndreas Gohr}
110a876b55bSAndreas Gohr
111