xref: /plugin/dw2pdf/renderer.php (revision 130c62ee062761d437fc7fe79f1ee96f9dd9d489)
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
17475fd248SIvan Poliakov    private $lastheadlevel = -1;
18475fd248SIvan Poliakov    private $current_bookmark_level = 0;
1960e59de7SGerrit Uitslag    /**
2060e59de7SGerrit Uitslag     * Stores action instance
2160e59de7SGerrit Uitslag     *
2260e59de7SGerrit Uitslag     * @var action_plugin_dw2pdf
2360e59de7SGerrit Uitslag     */
2460e59de7SGerrit Uitslag    private $actioninstance = null;
2560e59de7SGerrit Uitslag
2660e59de7SGerrit Uitslag    /**
2760e59de7SGerrit Uitslag     * load action plugin instance
2860e59de7SGerrit Uitslag     */
2960e59de7SGerrit Uitslag    public function __construct() {
3060e59de7SGerrit Uitslag        $this->actioninstance = plugin_load('action', 'dw2pdf');
3160e59de7SGerrit Uitslag    }
3260e59de7SGerrit Uitslag
3360e59de7SGerrit Uitslag    public function document_start() {
3460e59de7SGerrit Uitslag        global $ID;
3560e59de7SGerrit Uitslag
3660e59de7SGerrit Uitslag        parent::document_start();
3760e59de7SGerrit Uitslag
3860e59de7SGerrit Uitslag        //ancher for rewritten links to included pages
3960e59de7SGerrit Uitslag        $check = false;
4060e59de7SGerrit Uitslag        $pid = sectionID($ID, $check);
4160e59de7SGerrit Uitslag
4260e59de7SGerrit Uitslag        $this->doc .= "<a name=\"{$pid}__\">";
4360e59de7SGerrit Uitslag        $this->doc .= "</a>";
4460e59de7SGerrit Uitslag    }
4583bac986SAndreas Gohr
46a876b55bSAndreas Gohr    /**
47a876b55bSAndreas Gohr     * Make available as XHTML replacement renderer
48236e9da2SGerrit Uitslag     *
49236e9da2SGerrit Uitslag     * @param $format
50236e9da2SGerrit Uitslag     * @return bool
51a876b55bSAndreas Gohr     */
52a876b55bSAndreas Gohr    public function canRender($format){
53a876b55bSAndreas Gohr        if($format == 'xhtml') return true;
54a876b55bSAndreas Gohr        return false;
55a876b55bSAndreas Gohr    }
56a876b55bSAndreas Gohr
57a876b55bSAndreas Gohr    /**
58a876b55bSAndreas Gohr     * Simplified header printing with PDF bookmarks
59236e9da2SGerrit Uitslag     *
60236e9da2SGerrit Uitslag     * @param string $text
61236e9da2SGerrit Uitslag     * @param int $level
62236e9da2SGerrit Uitslag     * @param int $pos
63a876b55bSAndreas Gohr     */
64*130c62eeSGerrit Uitslag    public function header($text, $level, $pos) {
65a876b55bSAndreas Gohr        if(!$text) return; //skip empty headlines
6660e59de7SGerrit Uitslag        global $ID;
67a876b55bSAndreas Gohr
68244aaa51SMichael Hamann        $hid = $this->_headerToLink($text, true);
6957a1b6f9SGerrit Uitslag
7057a1b6f9SGerrit Uitslag        //only add items within global configured levels (doesn't check the pdf toc settings)
7157a1b6f9SGerrit Uitslag        $this->toc_additem($hid, $text, $level);
7257a1b6f9SGerrit Uitslag
7360e59de7SGerrit Uitslag        $check = false;
7460e59de7SGerrit Uitslag        $pid = sectionID($ID, $check);
7560e59de7SGerrit Uitslag        $hid = $pid . '__' . $hid;
76244aaa51SMichael Hamann
77a876b55bSAndreas Gohr        // add PDF bookmark
787fa15500SAndreas Gohr        $bookmark = '';
7902f9a447SGerrit Uitslag        $bmlevel = $this->actioninstance->getExportConfig('maxbookmarks');
80a876b55bSAndreas Gohr        if($bmlevel && $bmlevel >= $level) {
8183bac986SAndreas Gohr            // PDF readers choke on invalid nested levels
82475fd248SIvan Poliakov
83*130c62eeSGerrit Uitslag            if($this->lastheadlevel == -1) {
8483bac986SAndreas Gohr                $this->lastheadlevel = $level;
85*130c62eeSGerrit Uitslag            }
8683bac986SAndreas Gohr
87475fd248SIvan Poliakov            $step = $level - $this->lastheadlevel;
88475fd248SIvan Poliakov
89*130c62eeSGerrit Uitslag            if($step > 0) {
90475fd248SIvan Poliakov                $this->current_bookmark_level += 1;
91*130c62eeSGerrit Uitslag            } elseif($step < 0) {
92475fd248SIvan Poliakov                $this->current_bookmark_level -= 1;
93*130c62eeSGerrit Uitslag                if($this->current_bookmark_level < 0) {
94475fd248SIvan Poliakov                    $this->current_bookmark_level = 0;
95475fd248SIvan Poliakov                }
96*130c62eeSGerrit Uitslag            }
97475fd248SIvan Poliakov
98475fd248SIvan Poliakov            $this->lastheadlevel = $level;
99475fd248SIvan Poliakov
1007fa15500SAndreas Gohr            $bookmark = '<bookmark content="' . $this->_xmlEntities($text) . '" level="' . ($this->current_bookmark_level) . '" />';
101a876b55bSAndreas Gohr        }
102a876b55bSAndreas Gohr
103a876b55bSAndreas Gohr        // print header
1047fa15500SAndreas Gohr        $this->doc .= DOKU_LF . "<h$level>$bookmark";
105244aaa51SMichael Hamann        $this->doc .= "<a name=\"$hid\">";
106a876b55bSAndreas Gohr        $this->doc .= $this->_xmlEntities($text);
107244aaa51SMichael Hamann        $this->doc .= "</a>";
108a876b55bSAndreas Gohr        $this->doc .= "</h$level>" . DOKU_LF;
109a876b55bSAndreas Gohr    }
110a876b55bSAndreas Gohr
111aab792a5SAndreas Gohr    /**
11260e59de7SGerrit Uitslag     * Render a page local link
11360e59de7SGerrit Uitslag     *
114236e9da2SGerrit Uitslag     * // modified copy of parent function
115236e9da2SGerrit Uitslag     *
11660e59de7SGerrit Uitslag     * @param string $hash hash link identifier
11760e59de7SGerrit Uitslag     * @param string $name name for the link
118236e9da2SGerrit Uitslag     * @param bool $returnonly
119236e9da2SGerrit Uitslag     * @return string|void
12060e59de7SGerrit Uitslag     *
12160e59de7SGerrit Uitslag     * @see Doku_Renderer_xhtml::locallink
12260e59de7SGerrit Uitslag     */
123528811ffSAnael Mobilia    function locallink($hash, $name = null, $returnonly = false) {
12460e59de7SGerrit Uitslag        global $ID;
12560e59de7SGerrit Uitslag        $name  = $this->_getLinkTitle($name, $hash, $isImage);
12660e59de7SGerrit Uitslag        $hash  = $this->_headerToLink($hash);
12760e59de7SGerrit Uitslag        $title = $ID.' ↵';
12860e59de7SGerrit Uitslag
12960e59de7SGerrit Uitslag        $check = false;
13060e59de7SGerrit Uitslag        $pid = sectionID($ID, $check);
13160e59de7SGerrit Uitslag
13260e59de7SGerrit Uitslag        $this->doc .= '<a href="#'. $pid . '__' . $hash.'" title="'.$title.'" class="wikilink1">';
13360e59de7SGerrit Uitslag        $this->doc .= $name;
13460e59de7SGerrit Uitslag        $this->doc .= '</a>';
13560e59de7SGerrit Uitslag    }
13660e59de7SGerrit Uitslag
13760e59de7SGerrit Uitslag    /**
138aab792a5SAndreas Gohr     * Wrap centered media in a div to center it
139236e9da2SGerrit Uitslag     *
140236e9da2SGerrit Uitslag     * @param string $src       media ID
141236e9da2SGerrit Uitslag     * @param string $title     descriptive text
142236e9da2SGerrit Uitslag     * @param string $align     left|center|right
143236e9da2SGerrit Uitslag     * @param int    $width     width of media in pixel
144236e9da2SGerrit Uitslag     * @param int    $height    height of media in pixel
145236e9da2SGerrit Uitslag     * @param string $cache     cache|recache|nocache
146236e9da2SGerrit Uitslag     * @param bool   $render    should the media be embedded inline or just linked
147236e9da2SGerrit Uitslag     * @return string
148aab792a5SAndreas Gohr     */
149aab792a5SAndreas Gohr    function _media ($src, $title=NULL, $align=NULL, $width=NULL,
150aab792a5SAndreas Gohr                      $height=NULL, $cache=NULL, $render = true) {
151aab792a5SAndreas Gohr
152aab792a5SAndreas Gohr        $out = '';
153aab792a5SAndreas Gohr        if($align == 'center'){
154aab792a5SAndreas Gohr            $out .= '<div align="center" style="text-align: center">';
155aab792a5SAndreas Gohr        }
156aab792a5SAndreas Gohr
157aab792a5SAndreas Gohr        $out .= parent::_media ($src, $title, $align, $width, $height, $cache, $render);
158aab792a5SAndreas Gohr
159aab792a5SAndreas Gohr        if($align == 'center'){
160aab792a5SAndreas Gohr            $out .= '</div>';
161aab792a5SAndreas Gohr        }
162aab792a5SAndreas Gohr
163aab792a5SAndreas Gohr        return $out;
164aab792a5SAndreas Gohr    }
165aab792a5SAndreas Gohr
166551dd41eSAndreas Gohr    /**
167551dd41eSAndreas Gohr     * hover info makes no sense in PDFs, so drop acronyms
168236e9da2SGerrit Uitslag     *
169236e9da2SGerrit Uitslag     * @param string $acronym
170551dd41eSAndreas Gohr     */
171551dd41eSAndreas Gohr    function acronym($acronym) {
172551dd41eSAndreas Gohr        $this->doc .= $this->_xmlEntities($acronym);
173551dd41eSAndreas Gohr    }
174551dd41eSAndreas Gohr
1759eb4c81fSAndreas Gohr    /**
1769eb4c81fSAndreas Gohr     * reformat links if needed
177236e9da2SGerrit Uitslag     *
178236e9da2SGerrit Uitslag     * @param array $link
179236e9da2SGerrit Uitslag     * @return string
1809eb4c81fSAndreas Gohr     */
1819eb4c81fSAndreas Gohr    function _formatLink($link){
18260e59de7SGerrit Uitslag
18360e59de7SGerrit Uitslag        // for internal links contains the title the pageid
18460e59de7SGerrit Uitslag        if(in_array($link['title'], $this->actioninstance->getExportedPages())) {
18560e59de7SGerrit Uitslag            list(/* $url */, $hash) = explode('#', $link['url'], 2);
18660e59de7SGerrit Uitslag
18760e59de7SGerrit Uitslag            $check = false;
18860e59de7SGerrit Uitslag            $pid = sectionID($link['title'], $check);
18960e59de7SGerrit Uitslag            $link['url'] = "#" . $pid . '__' . $hash;
19060e59de7SGerrit Uitslag        }
19160e59de7SGerrit Uitslag
19260e59de7SGerrit Uitslag
1939eb4c81fSAndreas Gohr        // prefix interwiki links with interwiki icon
1949eb4c81fSAndreas Gohr        if($link['name'][0] != '<' && preg_match('/\binterwiki iw_(.\w+)\b/',$link['class'],$m)){
1959eb4c81fSAndreas Gohr            if(file_exists(DOKU_INC.'lib/images/interwiki/'.$m[1].'.png')){
1969eb4c81fSAndreas Gohr                $img = DOKU_BASE.'lib/images/interwiki/'.$m[1].'.png';
1979eb4c81fSAndreas Gohr            }elseif(file_exists(DOKU_INC.'lib/images/interwiki/'.$m[1].'.gif')){
1989eb4c81fSAndreas Gohr                $img = DOKU_BASE.'lib/images/interwiki/'.$m[1].'.gif';
1999eb4c81fSAndreas Gohr            }else{
2009eb4c81fSAndreas Gohr                $img = DOKU_BASE.'lib/images/interwiki.png';
2019eb4c81fSAndreas Gohr            }
2029eb4c81fSAndreas Gohr
20347b0d67bSAndreas Gohr            $link['name'] = '<img src="'.$img.'" width="16" height="16" style="vertical-align: center" class="'.$link['class'].'" />'.$link['name'];
2049eb4c81fSAndreas Gohr        }
2059eb4c81fSAndreas Gohr        return parent::_formatLink($link);
2069eb4c81fSAndreas Gohr    }
207ccdd3126SAndreas Gohr
208ccdd3126SAndreas Gohr    /**
209ccdd3126SAndreas Gohr     * no obfuscation for email addresses
210236e9da2SGerrit Uitslag     *
211236e9da2SGerrit Uitslag     * @param string $address
212236e9da2SGerrit Uitslag     * @param null $name
213236e9da2SGerrit Uitslag     * @param bool $returnonly
214236e9da2SGerrit Uitslag     * @return string|void
215ccdd3126SAndreas Gohr     */
2160a23c2bcSAnael Mobilia    function emaillink($address, $name = NULL, $returnonly = false) {
217ccdd3126SAndreas Gohr        global $conf;
218ccdd3126SAndreas Gohr        $old = $conf['mailguard'];
219ccdd3126SAndreas Gohr        $conf['mailguard'] = 'none';
2209e1a2ac6SAnael Mobilia        parent::emaillink($address, $name, $returnonly);
221ccdd3126SAndreas Gohr        $conf['mailguard'] = $old;
222ccdd3126SAndreas Gohr    }
223ccdd3126SAndreas Gohr
224a876b55bSAndreas Gohr}
225a876b55bSAndreas Gohr
226