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