xref: /plugin/dw2pdf/renderer.php (revision bb7717bcc4e44b06fc01aeb8ea52a07716f70085)
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
1260e59de7SGerrit Uitslag/**
1360e59de7SGerrit Uitslag * Render xhtml suitable as input for mpdf library
1460e59de7SGerrit Uitslag */
15a876b55bSAndreas Gohrclass renderer_plugin_dw2pdf extends Doku_Renderer_xhtml {
16a876b55bSAndreas Gohr
17*bb7717bcSGerrit Uitslag    private $lastHeaderLevel = -1;
18*bb7717bcSGerrit Uitslag    private $originalHeaderLevel = 0;
19*bb7717bcSGerrit Uitslag    private $difference = 0;
20*bb7717bcSGerrit Uitslag
2160e59de7SGerrit Uitslag    /**
2260e59de7SGerrit Uitslag     * Stores action instance
2360e59de7SGerrit Uitslag     *
2460e59de7SGerrit Uitslag     * @var action_plugin_dw2pdf
2560e59de7SGerrit Uitslag     */
2660e59de7SGerrit Uitslag    private $actioninstance = null;
2760e59de7SGerrit Uitslag
2860e59de7SGerrit Uitslag    /**
2960e59de7SGerrit Uitslag     * load action plugin instance
3060e59de7SGerrit Uitslag     */
3160e59de7SGerrit Uitslag    public function __construct() {
3260e59de7SGerrit Uitslag        $this->actioninstance = plugin_load('action', 'dw2pdf');
3360e59de7SGerrit Uitslag    }
3460e59de7SGerrit Uitslag
3560e59de7SGerrit Uitslag    public function document_start() {
3660e59de7SGerrit Uitslag        global $ID;
3760e59de7SGerrit Uitslag
3860e59de7SGerrit Uitslag        parent::document_start();
3960e59de7SGerrit Uitslag
4060e59de7SGerrit Uitslag        //ancher for rewritten links to included pages
4160e59de7SGerrit Uitslag        $check = false;
4260e59de7SGerrit Uitslag        $pid = sectionID($ID, $check);
4360e59de7SGerrit Uitslag
4460e59de7SGerrit Uitslag        $this->doc .= "<a name=\"{$pid}__\">";
4560e59de7SGerrit Uitslag        $this->doc .= "</a>";
4660e59de7SGerrit Uitslag    }
4783bac986SAndreas Gohr
48a876b55bSAndreas Gohr    /**
49a876b55bSAndreas Gohr     * Make available as XHTML replacement renderer
50236e9da2SGerrit Uitslag     *
51236e9da2SGerrit Uitslag     * @param $format
52236e9da2SGerrit Uitslag     * @return bool
53a876b55bSAndreas Gohr     */
54a876b55bSAndreas Gohr    public function canRender($format){
55a876b55bSAndreas Gohr        if($format == 'xhtml') return true;
56a876b55bSAndreas Gohr        return false;
57a876b55bSAndreas Gohr    }
58a876b55bSAndreas Gohr
59a876b55bSAndreas Gohr    /**
60a876b55bSAndreas Gohr     * Simplified header printing with PDF bookmarks
61236e9da2SGerrit Uitslag     *
62236e9da2SGerrit Uitslag     * @param string $text
63*bb7717bcSGerrit Uitslag     * @param int $level from 1 (highest) to 6 (lowest)
64236e9da2SGerrit Uitslag     * @param int $pos
65a876b55bSAndreas Gohr     */
66130c62eeSGerrit Uitslag    public function header($text, $level, $pos) {
67a876b55bSAndreas Gohr        if(!$text) return; //skip empty headlines
6860e59de7SGerrit Uitslag        global $ID;
69a876b55bSAndreas Gohr
70244aaa51SMichael Hamann        $hid = $this->_headerToLink($text, true);
7157a1b6f9SGerrit Uitslag
7257a1b6f9SGerrit Uitslag        //only add items within global configured levels (doesn't check the pdf toc settings)
7357a1b6f9SGerrit Uitslag        $this->toc_additem($hid, $text, $level);
7457a1b6f9SGerrit Uitslag
7560e59de7SGerrit Uitslag        $check = false;
7660e59de7SGerrit Uitslag        $pid = sectionID($ID, $check);
7760e59de7SGerrit Uitslag        $hid = $pid . '__' . $hid;
78244aaa51SMichael Hamann
79a876b55bSAndreas Gohr        // add PDF bookmark
807fa15500SAndreas Gohr        $bookmark = '';
81*bb7717bcSGerrit Uitslag        $maxbookmarklevel = $this->actioninstance->getExportConfig('maxbookmarks');
82*bb7717bcSGerrit Uitslag        // 0: off, 1-6: show down to this level
83*bb7717bcSGerrit Uitslag        if($maxbookmarklevel && $maxbookmarklevel >= $level) {
84*bb7717bcSGerrit Uitslag            $bookmarklevel = $this->calculateBookmarklevel($level);
85*bb7717bcSGerrit Uitslag            $bookmark = '<bookmark content="' . $this->_xmlEntities($text) . '" level="' . ($bookmarklevel) . '" />';
86a876b55bSAndreas Gohr        }
87a876b55bSAndreas Gohr
88a876b55bSAndreas Gohr        // print header
897fa15500SAndreas Gohr        $this->doc .= DOKU_LF . "<h$level>$bookmark";
90244aaa51SMichael Hamann        $this->doc .= "<a name=\"$hid\">";
91a876b55bSAndreas Gohr        $this->doc .= $this->_xmlEntities($text);
92244aaa51SMichael Hamann        $this->doc .= "</a>";
93a876b55bSAndreas Gohr        $this->doc .= "</h$level>" . DOKU_LF;
94a876b55bSAndreas Gohr    }
95a876b55bSAndreas Gohr
96aab792a5SAndreas Gohr    /**
97*bb7717bcSGerrit Uitslag     * Bookmark levels might increase maximal +1 per level.
98*bb7717bcSGerrit Uitslag     * (note: levels start at 1, bookmarklevels at 0)
99*bb7717bcSGerrit Uitslag     *
100*bb7717bcSGerrit Uitslag     * @param int $level 1 (highest) to 6 (lowest)
101*bb7717bcSGerrit Uitslag     * @return int
102*bb7717bcSGerrit Uitslag     */
103*bb7717bcSGerrit Uitslag    protected function calculateBookmarklevel($level) {
104*bb7717bcSGerrit Uitslag        if($this->lastHeaderLevel == -1) {
105*bb7717bcSGerrit Uitslag            $this->lastHeaderLevel = $level;
106*bb7717bcSGerrit Uitslag        }
107*bb7717bcSGerrit Uitslag        $step = $level - $this->lastHeaderLevel;
108*bb7717bcSGerrit Uitslag        if($step > 1) {
109*bb7717bcSGerrit Uitslag            $this->difference = $this->difference + ($step - 1);
110*bb7717bcSGerrit Uitslag        }
111*bb7717bcSGerrit Uitslag        if($step < 0 ) {
112*bb7717bcSGerrit Uitslag            $this->difference = min($this->difference, $level - $this->originalHeaderLevel);
113*bb7717bcSGerrit Uitslag            $this->difference = max($this->difference, 0);
114*bb7717bcSGerrit Uitslag        }
115*bb7717bcSGerrit Uitslag
116*bb7717bcSGerrit Uitslag        $bookmarklevel = $level - $this->difference;
117*bb7717bcSGerrit Uitslag
118*bb7717bcSGerrit Uitslag        if($step > 1) {
119*bb7717bcSGerrit Uitslag            $this->originalHeaderLevel = $bookmarklevel;
120*bb7717bcSGerrit Uitslag        }
121*bb7717bcSGerrit Uitslag
122*bb7717bcSGerrit Uitslag        $this->lastHeaderLevel = $level;
123*bb7717bcSGerrit Uitslag        return $bookmarklevel - 1; //zero indexed
124*bb7717bcSGerrit Uitslag    }
125*bb7717bcSGerrit Uitslag
126*bb7717bcSGerrit Uitslag    /**
12760e59de7SGerrit Uitslag     * Render a page local link
12860e59de7SGerrit Uitslag     *
129236e9da2SGerrit Uitslag     * // modified copy of parent function
130236e9da2SGerrit Uitslag     *
13160e59de7SGerrit Uitslag     * @param string $hash hash link identifier
13260e59de7SGerrit Uitslag     * @param string $name name for the link
133236e9da2SGerrit Uitslag     * @param bool $returnonly
134236e9da2SGerrit Uitslag     * @return string|void
13560e59de7SGerrit Uitslag     *
13660e59de7SGerrit Uitslag     * @see Doku_Renderer_xhtml::locallink
13760e59de7SGerrit Uitslag     */
138528811ffSAnael Mobilia    function locallink($hash, $name = null, $returnonly = false) {
13960e59de7SGerrit Uitslag        global $ID;
14060e59de7SGerrit Uitslag        $name  = $this->_getLinkTitle($name, $hash, $isImage);
14160e59de7SGerrit Uitslag        $hash  = $this->_headerToLink($hash);
14260e59de7SGerrit Uitslag        $title = $ID.' ↵';
14360e59de7SGerrit Uitslag
14460e59de7SGerrit Uitslag        $check = false;
14560e59de7SGerrit Uitslag        $pid = sectionID($ID, $check);
14660e59de7SGerrit Uitslag
14760e59de7SGerrit Uitslag        $this->doc .= '<a href="#'. $pid . '__' . $hash.'" title="'.$title.'" class="wikilink1">';
14860e59de7SGerrit Uitslag        $this->doc .= $name;
14960e59de7SGerrit Uitslag        $this->doc .= '</a>';
15060e59de7SGerrit Uitslag    }
15160e59de7SGerrit Uitslag
15260e59de7SGerrit Uitslag    /**
153aab792a5SAndreas Gohr     * Wrap centered media in a div to center it
154236e9da2SGerrit Uitslag     *
155236e9da2SGerrit Uitslag     * @param string $src       media ID
156236e9da2SGerrit Uitslag     * @param string $title     descriptive text
157236e9da2SGerrit Uitslag     * @param string $align     left|center|right
158236e9da2SGerrit Uitslag     * @param int    $width     width of media in pixel
159236e9da2SGerrit Uitslag     * @param int    $height    height of media in pixel
160236e9da2SGerrit Uitslag     * @param string $cache     cache|recache|nocache
161236e9da2SGerrit Uitslag     * @param bool   $render    should the media be embedded inline or just linked
162236e9da2SGerrit Uitslag     * @return string
163aab792a5SAndreas Gohr     */
164aab792a5SAndreas Gohr    function _media ($src, $title=NULL, $align=NULL, $width=NULL,
165aab792a5SAndreas Gohr                      $height=NULL, $cache=NULL, $render = true) {
166aab792a5SAndreas Gohr
167aab792a5SAndreas Gohr        $out = '';
168aab792a5SAndreas Gohr        if($align == 'center'){
169aab792a5SAndreas Gohr            $out .= '<div align="center" style="text-align: center">';
170aab792a5SAndreas Gohr        }
171aab792a5SAndreas Gohr
172aab792a5SAndreas Gohr        $out .= parent::_media ($src, $title, $align, $width, $height, $cache, $render);
173aab792a5SAndreas Gohr
174aab792a5SAndreas Gohr        if($align == 'center'){
175aab792a5SAndreas Gohr            $out .= '</div>';
176aab792a5SAndreas Gohr        }
177aab792a5SAndreas Gohr
178aab792a5SAndreas Gohr        return $out;
179aab792a5SAndreas Gohr    }
180aab792a5SAndreas Gohr
181551dd41eSAndreas Gohr    /**
182551dd41eSAndreas Gohr     * hover info makes no sense in PDFs, so drop acronyms
183236e9da2SGerrit Uitslag     *
184236e9da2SGerrit Uitslag     * @param string $acronym
185551dd41eSAndreas Gohr     */
186551dd41eSAndreas Gohr    function acronym($acronym) {
187551dd41eSAndreas Gohr        $this->doc .= $this->_xmlEntities($acronym);
188551dd41eSAndreas Gohr    }
189551dd41eSAndreas Gohr
1909eb4c81fSAndreas Gohr    /**
1919eb4c81fSAndreas Gohr     * reformat links if needed
192236e9da2SGerrit Uitslag     *
193236e9da2SGerrit Uitslag     * @param array $link
194236e9da2SGerrit Uitslag     * @return string
1959eb4c81fSAndreas Gohr     */
1969eb4c81fSAndreas Gohr    function _formatLink($link){
19760e59de7SGerrit Uitslag
19860e59de7SGerrit Uitslag        // for internal links contains the title the pageid
19960e59de7SGerrit Uitslag        if(in_array($link['title'], $this->actioninstance->getExportedPages())) {
20060e59de7SGerrit Uitslag            list(/* $url */, $hash) = explode('#', $link['url'], 2);
20160e59de7SGerrit Uitslag
20260e59de7SGerrit Uitslag            $check = false;
20360e59de7SGerrit Uitslag            $pid = sectionID($link['title'], $check);
20460e59de7SGerrit Uitslag            $link['url'] = "#" . $pid . '__' . $hash;
20560e59de7SGerrit Uitslag        }
20660e59de7SGerrit Uitslag
20760e59de7SGerrit Uitslag
2089eb4c81fSAndreas Gohr        // prefix interwiki links with interwiki icon
2099eb4c81fSAndreas Gohr        if($link['name'][0] != '<' && preg_match('/\binterwiki iw_(.\w+)\b/',$link['class'],$m)){
2109eb4c81fSAndreas Gohr            if(file_exists(DOKU_INC.'lib/images/interwiki/'.$m[1].'.png')){
2119eb4c81fSAndreas Gohr                $img = DOKU_BASE.'lib/images/interwiki/'.$m[1].'.png';
2129eb4c81fSAndreas Gohr            }elseif(file_exists(DOKU_INC.'lib/images/interwiki/'.$m[1].'.gif')){
2139eb4c81fSAndreas Gohr                $img = DOKU_BASE.'lib/images/interwiki/'.$m[1].'.gif';
2149eb4c81fSAndreas Gohr            }else{
2159eb4c81fSAndreas Gohr                $img = DOKU_BASE.'lib/images/interwiki.png';
2169eb4c81fSAndreas Gohr            }
2179eb4c81fSAndreas Gohr
21847b0d67bSAndreas Gohr            $link['name'] = '<img src="'.$img.'" width="16" height="16" style="vertical-align: center" class="'.$link['class'].'" />'.$link['name'];
2199eb4c81fSAndreas Gohr        }
2209eb4c81fSAndreas Gohr        return parent::_formatLink($link);
2219eb4c81fSAndreas Gohr    }
222ccdd3126SAndreas Gohr
223ccdd3126SAndreas Gohr    /**
224ccdd3126SAndreas Gohr     * no obfuscation for email addresses
225236e9da2SGerrit Uitslag     *
226236e9da2SGerrit Uitslag     * @param string $address
227236e9da2SGerrit Uitslag     * @param null $name
228236e9da2SGerrit Uitslag     * @param bool $returnonly
229236e9da2SGerrit Uitslag     * @return string|void
230ccdd3126SAndreas Gohr     */
2310a23c2bcSAnael Mobilia    function emaillink($address, $name = NULL, $returnonly = false) {
232ccdd3126SAndreas Gohr        global $conf;
233ccdd3126SAndreas Gohr        $old = $conf['mailguard'];
234ccdd3126SAndreas Gohr        $conf['mailguard'] = 'none';
2359e1a2ac6SAnael Mobilia        parent::emaillink($address, $name, $returnonly);
236ccdd3126SAndreas Gohr        $conf['mailguard'] = $old;
237ccdd3126SAndreas Gohr    }
238ccdd3126SAndreas Gohr
239a876b55bSAndreas Gohr}
240a876b55bSAndreas Gohr
241