xref: /plugin/dw2pdf/renderer.php (revision 60e59de7d6295c0b3cfb1268109a5e4457ac4705)
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
12*60e59de7SGerrit Uitslag/**
13*60e59de7SGerrit Uitslag * Render xhtml suitable as input for mpdf library
14*60e59de7SGerrit Uitslag */
15a876b55bSAndreas Gohrclass renderer_plugin_dw2pdf extends Doku_Renderer_xhtml {
16a876b55bSAndreas Gohr
17475fd248SIvan Poliakov    private $lastheadlevel = -1;
18475fd248SIvan Poliakov    private $current_bookmark_level = 0;
19*60e59de7SGerrit Uitslag    /**
20*60e59de7SGerrit Uitslag     * Stores action instance
21*60e59de7SGerrit Uitslag     *
22*60e59de7SGerrit Uitslag     * @var action_plugin_dw2pdf
23*60e59de7SGerrit Uitslag     */
24*60e59de7SGerrit Uitslag    private $actioninstance = null;
25*60e59de7SGerrit Uitslag
26*60e59de7SGerrit Uitslag    /**
27*60e59de7SGerrit Uitslag     * load action plugin instance
28*60e59de7SGerrit Uitslag     */
29*60e59de7SGerrit Uitslag    public function __construct() {
30*60e59de7SGerrit Uitslag        $this->actioninstance = plugin_load('action', 'dw2pdf');
31*60e59de7SGerrit Uitslag    }
32*60e59de7SGerrit Uitslag
33*60e59de7SGerrit Uitslag    public function document_start() {
34*60e59de7SGerrit Uitslag        global $ID;
35*60e59de7SGerrit Uitslag
36*60e59de7SGerrit Uitslag        parent::document_start();
37*60e59de7SGerrit Uitslag
38*60e59de7SGerrit Uitslag        //ancher for rewritten links to included pages
39*60e59de7SGerrit Uitslag        $check = false;
40*60e59de7SGerrit Uitslag        $pid = sectionID($ID, $check);
41*60e59de7SGerrit Uitslag
42*60e59de7SGerrit Uitslag        $this->doc .= "<a name=\"{$pid}__\">";
43*60e59de7SGerrit Uitslag        $this->doc .= "</a>";
44*60e59de7SGerrit Uitslag    }
4583bac986SAndreas Gohr
46a876b55bSAndreas Gohr    /**
47a876b55bSAndreas Gohr     * Make available as XHTML replacement renderer
48a876b55bSAndreas Gohr     */
49a876b55bSAndreas Gohr    public function canRender($format){
50a876b55bSAndreas Gohr        if($format == 'xhtml') return true;
51a876b55bSAndreas Gohr        return false;
52a876b55bSAndreas Gohr    }
53a876b55bSAndreas Gohr
54a876b55bSAndreas Gohr    /**
55a876b55bSAndreas Gohr     * Simplified header printing with PDF bookmarks
56a876b55bSAndreas Gohr     */
57a876b55bSAndreas Gohr    function header($text, $level, $pos) {
58a876b55bSAndreas Gohr        if(!$text) return; //skip empty headlines
59*60e59de7SGerrit Uitslag        global $ID;
60a876b55bSAndreas Gohr
61244aaa51SMichael Hamann        $hid = $this->_headerToLink($text, true);
62*60e59de7SGerrit Uitslag        $check = false;
63*60e59de7SGerrit Uitslag        $pid = sectionID($ID, $check);
64*60e59de7SGerrit Uitslag        $hid = $pid . '__' . $hid;
65244aaa51SMichael Hamann
66a876b55bSAndreas Gohr            // add PDF bookmark
677fa15500SAndreas Gohr        $bookmark = '';
68a876b55bSAndreas Gohr        $bmlevel = $this->getConf('maxbookmarks');
69a876b55bSAndreas Gohr        if($bmlevel && $bmlevel >= $level){
7083bac986SAndreas Gohr            // PDF readers choke on invalid nested levels
71475fd248SIvan Poliakov
72475fd248SIvan Poliakov            if ($this->lastheadlevel == -1)
7383bac986SAndreas Gohr            	$this->lastheadlevel = $level;
7483bac986SAndreas Gohr
75475fd248SIvan Poliakov            $step = $level - $this->lastheadlevel;
76475fd248SIvan Poliakov
77475fd248SIvan Poliakov            if ($step > 0)
78475fd248SIvan Poliakov            	$this->current_bookmark_level += 1;
79475fd248SIvan Poliakov            else if ($step <0)  {
80475fd248SIvan Poliakov            	$this->current_bookmark_level -= 1;
81475fd248SIvan Poliakov                if ($this->current_bookmark_level < 0)
82475fd248SIvan Poliakov                    $this->current_bookmark_level = 0;
83475fd248SIvan Poliakov            }
84475fd248SIvan Poliakov
85475fd248SIvan Poliakov            $this->lastheadlevel = $level;
86475fd248SIvan Poliakov
877fa15500SAndreas Gohr            $bookmark = '<bookmark content="'.$this->_xmlEntities($text).'" level="'.($this->current_bookmark_level).'" />';
88a876b55bSAndreas Gohr        }
89a876b55bSAndreas Gohr
90a876b55bSAndreas Gohr        // print header
917fa15500SAndreas Gohr        $this->doc .= DOKU_LF."<h$level>$bookmark";
92244aaa51SMichael Hamann        $this->doc .= "<a name=\"$hid\">";
93a876b55bSAndreas Gohr        $this->doc .= $this->_xmlEntities($text);
94244aaa51SMichael Hamann        $this->doc .= "</a>";
95a876b55bSAndreas Gohr        $this->doc .= "</h$level>".DOKU_LF;
96a876b55bSAndreas Gohr    }
97a876b55bSAndreas Gohr
98aab792a5SAndreas Gohr    /**
99*60e59de7SGerrit Uitslag     * Render a page local link
100*60e59de7SGerrit Uitslag     *
101*60e59de7SGerrit Uitslag     * @param string $hash hash link identifier
102*60e59de7SGerrit Uitslag     * @param string $name name for the link
103*60e59de7SGerrit Uitslag     *
104*60e59de7SGerrit Uitslag     * // modified copy of parent function
105*60e59de7SGerrit Uitslag     * @see Doku_Renderer_xhtml::locallink
106*60e59de7SGerrit Uitslag     */
107*60e59de7SGerrit Uitslag    function locallink($hash, $name = null) {
108*60e59de7SGerrit Uitslag        global $ID;
109*60e59de7SGerrit Uitslag        $name  = $this->_getLinkTitle($name, $hash, $isImage);
110*60e59de7SGerrit Uitslag        $hash  = $this->_headerToLink($hash);
111*60e59de7SGerrit Uitslag        $title = $ID.' ↵';
112*60e59de7SGerrit Uitslag
113*60e59de7SGerrit Uitslag        $check = false;
114*60e59de7SGerrit Uitslag        $pid = sectionID($ID, $check);
115*60e59de7SGerrit Uitslag
116*60e59de7SGerrit Uitslag        $this->doc .= '<a href="#'. $pid . '__' . $hash.'" title="'.$title.'" class="wikilink1">';
117*60e59de7SGerrit Uitslag        $this->doc .= $name;
118*60e59de7SGerrit Uitslag        $this->doc .= '</a>';
119*60e59de7SGerrit Uitslag    }
120*60e59de7SGerrit Uitslag
121*60e59de7SGerrit Uitslag    /**
122aab792a5SAndreas Gohr     * Wrap centered media in a div to center it
123aab792a5SAndreas Gohr     */
124aab792a5SAndreas Gohr    function _media ($src, $title=NULL, $align=NULL, $width=NULL,
125aab792a5SAndreas Gohr                      $height=NULL, $cache=NULL, $render = true) {
126aab792a5SAndreas Gohr
127aab792a5SAndreas Gohr        $out = '';
128aab792a5SAndreas Gohr        if($align == 'center'){
129aab792a5SAndreas Gohr            $out .= '<div align="center" style="text-align: center">';
130aab792a5SAndreas Gohr        }
131aab792a5SAndreas Gohr
132aab792a5SAndreas Gohr        $out .= parent::_media ($src, $title, $align, $width, $height, $cache, $render);
133aab792a5SAndreas Gohr
134aab792a5SAndreas Gohr        if($align == 'center'){
135aab792a5SAndreas Gohr            $out .= '</div>';
136aab792a5SAndreas Gohr        }
137aab792a5SAndreas Gohr
138aab792a5SAndreas Gohr        return $out;
139aab792a5SAndreas Gohr    }
140aab792a5SAndreas Gohr
141551dd41eSAndreas Gohr    /**
142551dd41eSAndreas Gohr     * hover info makes no sense in PDFs, so drop acronyms
143551dd41eSAndreas Gohr     */
144551dd41eSAndreas Gohr    function acronym($acronym) {
145551dd41eSAndreas Gohr        $this->doc .= $this->_xmlEntities($acronym);
146551dd41eSAndreas Gohr    }
147551dd41eSAndreas Gohr
1489eb4c81fSAndreas Gohr
1499eb4c81fSAndreas Gohr    /**
1509eb4c81fSAndreas Gohr     * reformat links if needed
1519eb4c81fSAndreas Gohr     */
15247b0d67bSAndreas Gohr
1539eb4c81fSAndreas Gohr    function _formatLink($link){
154*60e59de7SGerrit Uitslag
155*60e59de7SGerrit Uitslag        // for internal links contains the title the pageid
156*60e59de7SGerrit Uitslag        if(in_array($link['title'], $this->actioninstance->getExportedPages())) {
157*60e59de7SGerrit Uitslag            list(/* $url */, $hash) = explode('#', $link['url'], 2);
158*60e59de7SGerrit Uitslag
159*60e59de7SGerrit Uitslag            $check = false;
160*60e59de7SGerrit Uitslag            $pid = sectionID($link['title'], $check);
161*60e59de7SGerrit Uitslag            $link['url'] = "#" . $pid . '__' . $hash;
162*60e59de7SGerrit Uitslag        }
163*60e59de7SGerrit Uitslag
164*60e59de7SGerrit Uitslag
1659eb4c81fSAndreas Gohr        // prefix interwiki links with interwiki icon
1669eb4c81fSAndreas Gohr        if($link['name'][0] != '<' && preg_match('/\binterwiki iw_(.\w+)\b/',$link['class'],$m)){
1679eb4c81fSAndreas Gohr            if(file_exists(DOKU_INC.'lib/images/interwiki/'.$m[1].'.png')){
1689eb4c81fSAndreas Gohr                $img = DOKU_BASE.'lib/images/interwiki/'.$m[1].'.png';
1699eb4c81fSAndreas Gohr            }elseif(file_exists(DOKU_INC.'lib/images/interwiki/'.$m[1].'.gif')){
1709eb4c81fSAndreas Gohr                $img = DOKU_BASE.'lib/images/interwiki/'.$m[1].'.gif';
1719eb4c81fSAndreas Gohr            }else{
1729eb4c81fSAndreas Gohr                $img = DOKU_BASE.'lib/images/interwiki.png';
1739eb4c81fSAndreas Gohr            }
1749eb4c81fSAndreas Gohr
17547b0d67bSAndreas Gohr            $link['name'] = '<img src="'.$img.'" width="16" height="16" style="vertical-align: center" class="'.$link['class'].'" />'.$link['name'];
1769eb4c81fSAndreas Gohr        }
1779eb4c81fSAndreas Gohr        return parent::_formatLink($link);
1789eb4c81fSAndreas Gohr    }
179ccdd3126SAndreas Gohr
180ccdd3126SAndreas Gohr    /**
181ccdd3126SAndreas Gohr     * no obfuscation for email addresses
182ccdd3126SAndreas Gohr     */
183ccdd3126SAndreas Gohr    function emaillink($address, $name = NULL) {
184ccdd3126SAndreas Gohr        global $conf;
185ccdd3126SAndreas Gohr        $old = $conf['mailguard'];
186ccdd3126SAndreas Gohr        $conf['mailguard'] = 'none';
187ccdd3126SAndreas Gohr        parent::emaillink($address, $name);
188ccdd3126SAndreas Gohr        $conf['mailguard'] = $old;
189ccdd3126SAndreas Gohr    }
190ccdd3126SAndreas Gohr
191a876b55bSAndreas Gohr}
192a876b55bSAndreas Gohr
193