xref: /plugin/siteexport/inc/mpdf.php (revision a8c17ab5b37308343f86651acb8c4a1b3f36f0ae)
17d101cc1SGerry Weißbach<?php
27d101cc1SGerry Weißbach/**
37d101cc1SGerry Weißbach * Site Export Plugin - mPDF Extension
47d101cc1SGerry Weißbach *
57d101cc1SGerry Weißbach * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
67d101cc1SGerry Weißbach * @author     i-net software <tools@inetsoftware.de>
77d101cc1SGerry Weißbach * @author     Gerry Weissbach <gweissbach@inetsoftware.de>
87d101cc1SGerry Weißbach */
97d101cc1SGerry Weißbach
10ed507305SGerry Weißbachif (file_exists(DOKU_PLUGIN . 'dw2pdf/mpdf/mpdf.php')) {
117d101cc1SGerry Weißbach
127d101cc1SGerry Weißbach    global $conf;
13*a8c17ab5Si-net /// software    if (!defined('_MPDF_TEMP_PATH')) {
14*a8c17ab5Si-net /// software        define('_MPDF_TEMP_PATH', $conf['tmpdir'] . '/dwpdf/' . rand(1, 1000) . '/');
15*a8c17ab5Si-net /// software    }
16*a8c17ab5Si-net /// software    if (!defined('_MPDF_TTFONTDATAPATH')) {
17*a8c17ab5Si-net /// software        define('_MPDF_TTFONTDATAPATH', $conf['cachedir'] . '/mpdf_ttf/');
18*a8c17ab5Si-net /// software    }
197d101cc1SGerry Weißbach
20ed507305SGerry Weißbach    require_once(DOKU_PLUGIN . 'dw2pdf/mpdf/mpdf.php');
217d101cc1SGerry Weißbach
22ed507305SGerry Weißbach    class siteexportPDF extends mpdf {
237d101cc1SGerry Weißbach
24*a8c17ab5Si-net /// software        private $debugObj = null;
257d101cc1SGerry Weißbach
26*a8c17ab5Si-net /// software        public function __construct($debug) {
277f6f0f99SGerry Weißbach            global $INPUT;
28ed507305SGerry Weißbach            global $conf;
29a4a5b91dSGerry Weißbach
30bca58ac1SGerry Weißbach            $dw2pdf = plugin_load('action', 'dw2pdf');
317f6f0f99SGerry Weißbach
327f6f0f99SGerry Weißbach            // decide on the paper setup from param or config
337f6f0f99SGerry Weißbach            $pagesize    = $INPUT->str('pagesize', $dw2pdf->getConf('pagesize'), true);
347f6f0f99SGerry Weißbach            $orientation = $INPUT->str('orientation', $dw2pdf->getConf('orientation'), true);
357f6f0f99SGerry Weißbach
36ed507305SGerry Weißbach            io_mkdir_p(_MPDF_TTFONTDATAPATH);
37ed507305SGerry Weißbach            io_mkdir_p(_MPDF_TEMP_PATH);
38ed507305SGerry Weißbach
39ed507305SGerry Weißbach            $format = $pagesize;
40*a8c17ab5Si-net /// software            if ($orientation == 'landscape') {
41*a8c17ab5Si-net /// software                $format .= '-L';
42*a8c17ab5Si-net /// software            }
43ed507305SGerry Weißbach
44ed507305SGerry Weißbach            switch ($conf['lang']) {
45ed507305SGerry Weißbach                case 'zh':
46ed507305SGerry Weißbach                case 'zh-tw':
47ed507305SGerry Weißbach                case 'ja':
48ed507305SGerry Weißbach                case 'ko':
49ed507305SGerry Weißbach                    $mode = '+aCJK';
50ed507305SGerry Weißbach                    break;
51ed507305SGerry Weißbach                default:
52ed507305SGerry Weißbach                    $mode = 'UTF-8-s';
53ed507305SGerry Weißbach
54ed507305SGerry Weißbach            }
55ed507305SGerry Weißbach
56ed507305SGerry Weißbach            // we're always UTF-8
57ed507305SGerry Weißbach            parent::__construct($mode, $format);
58ed507305SGerry Weißbach            $this->ignore_invalid_utf8 = true;
59ed507305SGerry Weißbach            $this->tabSpaces = 4;
607d101cc1SGerry Weißbach            $this->debugObj = $debug;
617f6f0f99SGerry Weißbach            $this->debug = $debug !== false;
627d101cc1SGerry Weißbach            $this->shrink_tables_to_fit = 1; // Does not shrink tables by default, only in emergency
637d101cc1SGerry Weißbach            $this->use_kwt = true; // avoids page-breaking in H1-H6 if a table follows directly
64d8d141cfSGerry Weißbach            $this->useSubstitutions = true;
657d101cc1SGerry Weißbach        }
667d101cc1SGerry Weißbach
67*a8c17ab5Si-net /// software        public function message($msg, $vars = null, $lvl = 1)
687d101cc1SGerry Weißbach        {
69*a8c17ab5Si-net /// software            if ($this->debugObj !== null) {
70a4a5b91dSGerry Weißbach                $this->debugObj->message($msg, $vars, $lvl);
717d101cc1SGerry Weißbach            }
727d101cc1SGerry Weißbach        }
737d101cc1SGerry Weißbach
74*a8c17ab5Si-net /// software        public function Error($msg)
757d101cc1SGerry Weißbach        {
76*a8c17ab5Si-net /// software            if ($this->debugObj !== null && method_exists($this->debugObj, 'runtimeException')) {
777f6f0f99SGerry Weißbach                $this->debugObj->runtimeException($msg);
787d101cc1SGerry Weißbach            } else {
797d101cc1SGerry Weißbach                parent::Error($msg);
807d101cc1SGerry Weißbach            }
817d101cc1SGerry Weißbach        }
827d101cc1SGerry Weißbach
83*a8c17ab5Si-net /// software        public function GetFullPath(&$path,$basepath='') {
84a4a5b91dSGerry Weißbach
85a4a5b91dSGerry Weißbach            // Full Path might return a doubled path like /~gamma/documentation/lib//~gamma/documentation/lib/tpl/clearreports/./_print-images/background-bottom.jpg
86a4a5b91dSGerry Weißbach
87a4a5b91dSGerry Weißbach            $path = str_replace("\\","/",$path); //If on Windows
88a4a5b91dSGerry Weißbach            $path = preg_replace('/^\/\//','http://',$path);    // mPDF 5.6.27
89a4a5b91dSGerry Weißbach            $regexp = '|^./|';    // Inadvertently corrects "./path/etc" and "//www.domain.com/etc"
90a4a5b91dSGerry Weißbach            $path = preg_replace($regexp,'',$path);
91a4a5b91dSGerry Weißbach
92a4a5b91dSGerry Weißbach            if ( preg_match("/^.+\/\.\.\//", $path) ) {
93a4a5b91dSGerry Weißbach                // ../ not at the beginning
94a4a5b91dSGerry Weißbach                $newpath = array();
95a4a5b91dSGerry Weißbach                $oldpath = explode('/', $path);
96a4a5b91dSGerry Weißbach
97a4a5b91dSGerry Weißbach                foreach( $oldpath as $slice ) {
98a4a5b91dSGerry Weißbach                    if ( $slice == ".." && count($newpath) > 0 ) {
99a4a5b91dSGerry Weißbach                        array_pop($newpath);
100a4a5b91dSGerry Weißbach                        continue;
101a4a5b91dSGerry Weißbach                    }
102a4a5b91dSGerry Weißbach
103a4a5b91dSGerry Weißbach                    $newpath[] = $slice;
104a4a5b91dSGerry Weißbach                }
105a4a5b91dSGerry Weißbach
106a4a5b91dSGerry Weißbach                $path = implode('/', $newpath);
107a4a5b91dSGerry Weißbach            }
108a4a5b91dSGerry Weißbach
109a4a5b91dSGerry Weißbach            parent::GetFullPath($path, $basepath);
110a4a5b91dSGerry Weißbach
11156923262SGerry Weißbach            $regex = "/^(". preg_quote(DOKU_BASE, '/') .".+)\\1/";
112a4a5b91dSGerry Weißbach            if ( preg_match($regex, $path, $matches) ) {
113a4a5b91dSGerry Weißbach                $path = preg_replace($regex, "\\1", $path);
114a4a5b91dSGerry Weißbach            }
11556923262SGerry Weißbach
116a4a5b91dSGerry Weißbach        }
117a4a5b91dSGerry Weißbach
118fff1dd3dSGerry Weißbach        /*
119fff1dd3dSGerry Weißbach          Only when the toc is being generated
120fff1dd3dSGerry Weißbach        */
121*a8c17ab5Si-net /// software        public function MovePages($target_page, $start_page, $end_page = -1) {
122fff1dd3dSGerry Weißbach            parent::MovePages($target_page, $start_page, $end_page);
123fff1dd3dSGerry Weißbach        }
124fff1dd3dSGerry Weißbach
125*a8c17ab5Si-net /// software        public function OpenTag($tag, $attr, &$ahtml, &$ihtml) {
1267d101cc1SGerry Weißbach            switch ($tag) {
1277d101cc1SGerry Weißbach                case 'BOOKMARK':
1287d101cc1SGerry Weißbach                case 'TOCENTRY':
1297d101cc1SGerry Weißbach                    if ($attr['CONTENT']) {
1307d101cc1SGerry Weißbach                        // resolve double encoding
1317d101cc1SGerry Weißbach                        $attr['CONTENT'] = htmlspecialchars_decode($attr['CONTENT'], ENT_QUOTES);
1327d101cc1SGerry Weißbach                    }
1337d101cc1SGerry Weißbach                    break;
1347d101cc1SGerry Weißbach            }
135876523d1SGerry Weißbach            return parent::OpenTag($tag, $attr, $ahtml, $ihtml);
1367d101cc1SGerry Weißbach        }
1377d101cc1SGerry Weißbach    }
138d10fa28aSGerry Weißbach
139d10fa28aSGerry Weißbach    if (file_exists(DOKU_PLUGIN . 'dw2pdf/mpdf/classes/cssmgr.php') && !class_exists('cssmgr', false)) {
140ed507305SGerry Weißbach//*
141d10fa28aSGerry Weißbach        require_once(DOKU_PLUGIN . 'siteexport/inc/patchCSSmgr.php');
142d10fa28aSGerry Weißbach        $objPatch = new CSSMgrPatch(DOKU_PLUGIN . 'dw2pdf/mpdf/classes/cssmgr.php');
143ed507305SGerry Weißbach        if ($objPatch->redefineFunction(file_get_contents(DOKU_PLUGIN . 'siteexport/inc/readCSS.patch'))) {
144d10fa28aSGerry Weißbach            eval($objPatch->getCode());
145d10fa28aSGerry Weißbach        }
146ed507305SGerry Weißbach/*/
147ed507305SGerry Weißbach//*/
148ed507305SGerry Weißbach    }
149d10fa28aSGerry Weißbach
1507d101cc1SGerry Weißbach}
151