xref: /plugin/siteexport/inc/mpdf.php (revision ed50730582ed6baa071dc0d2c327c7b4a387d58b)
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
107d101cc1SGerry Weißbach// must be run within Dokuwiki
117d101cc1SGerry Weißbachif(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../../').'/');
127d101cc1SGerry Weißbachif(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
137d101cc1SGerry Weißbach
14*ed507305SGerry Weißbachif ( file_exists(DOKU_PLUGIN . 'dw2pdf/mpdf/mpdf.php') ) {
157d101cc1SGerry Weißbach
167d101cc1SGerry Weißbach    global $conf;
17*ed507305SGerry Weißbach    if(!defined('_MPDF_TEMP_PATH')) define('_MPDF_TEMP_PATH', $conf['tmpdir'].'/dwpdf/'.rand(1,1000).'/');
18*ed507305SGerry Weißbach    if(!defined('_MPDF_TTFONTDATAPATH')) define('_MPDF_TTFONTDATAPATH',$conf['cachedir'].'/mpdf_ttf/');
197d101cc1SGerry Weißbach
20*ed507305SGerry Weißbach    require_once(DOKU_PLUGIN . 'dw2pdf/mpdf/mpdf.php');
217d101cc1SGerry Weißbach
22*ed507305SGerry Weißbach    class siteexportPDF extends mpdf {
237d101cc1SGerry Weißbach
247f6f0f99SGerry Weißbach        private $debugObj = false;
257d101cc1SGerry Weißbach
267f6f0f99SGerry Weißbach		function __construct($debug) {
277f6f0f99SGerry Weißbach            global $INPUT;
28*ed507305SGerry 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
36*ed507305SGerry Weißbach            io_mkdir_p(_MPDF_TTFONTDATAPATH);
37*ed507305SGerry Weißbach            io_mkdir_p(_MPDF_TEMP_PATH);
38*ed507305SGerry Weißbach
39*ed507305SGerry Weißbach            $format = $pagesize;
40*ed507305SGerry Weißbach            if($orientation == 'landscape') $format .= '-L';
41*ed507305SGerry Weißbach
42*ed507305SGerry Weißbach            switch($conf['lang']) {
43*ed507305SGerry Weißbach                case 'zh':
44*ed507305SGerry Weißbach                case 'zh-tw':
45*ed507305SGerry Weißbach                case 'ja':
46*ed507305SGerry Weißbach                case 'ko':
47*ed507305SGerry Weißbach                    $mode = '+aCJK';
48*ed507305SGerry Weißbach                    break;
49*ed507305SGerry Weißbach                default:
50*ed507305SGerry Weißbach                    $mode = 'UTF-8-s';
51*ed507305SGerry Weißbach
52*ed507305SGerry Weißbach            }
53*ed507305SGerry Weißbach
54*ed507305SGerry Weißbach            // we're always UTF-8
55*ed507305SGerry Weißbach            parent::__construct($mode, $format);
56*ed507305SGerry Weißbach            $this->SetAutoFont(AUTOFONT_ALL);
57*ed507305SGerry Weißbach            $this->ignore_invalid_utf8 = true;
58*ed507305SGerry Weißbach            $this->tabSpaces = 4;
597d101cc1SGerry Weißbach            $this->debugObj = $debug;
607f6f0f99SGerry Weißbach            $this->debug = $debug !== false;
617d101cc1SGerry Weißbach            $this->shrink_tables_to_fit = 1; // Does not shrink tables by default, only in emergency
627d101cc1SGerry Weißbach            $this->use_kwt = true; // avoids page-breaking in H1-H6 if a table follows directly
637d101cc1SGerry Weißbach        }
647d101cc1SGerry Weißbach
657d101cc1SGerry Weißbach        function message($msg, $vars=null, $lvl=1)
667d101cc1SGerry Weißbach        {
677d101cc1SGerry Weißbach            if ( $this->debugObj !== false ) {
68a4a5b91dSGerry Weißbach                $this->debugObj->message($msg, $vars, $lvl);
697d101cc1SGerry Weißbach            }
707d101cc1SGerry Weißbach        }
717d101cc1SGerry Weißbach
727d101cc1SGerry Weißbach        function Error($msg)
737d101cc1SGerry Weißbach        {
747f6f0f99SGerry Weißbach            if ( $this->debugObj !== false && method_exists($this->debugObj, 'runtimeException') ) {
757f6f0f99SGerry Weißbach                $this->debugObj->runtimeException($msg);
767d101cc1SGerry Weißbach            } else {
777d101cc1SGerry Weißbach                parent::Error($msg);
787d101cc1SGerry Weißbach            }
797d101cc1SGerry Weißbach        }
807d101cc1SGerry Weißbach
81a4a5b91dSGerry Weißbach        function GetFullPath(&$path,$basepath='') {
82a4a5b91dSGerry Weißbach
83a4a5b91dSGerry Weißbach        	// Full Path might return a doubled path like /~gamma/documentation/lib//~gamma/documentation/lib/tpl/clearreports/./_print-images/background-bottom.jpg
84a4a5b91dSGerry Weißbach
85a4a5b91dSGerry Weißbach			$path = str_replace("\\","/",$path); //If on Windows
86a4a5b91dSGerry Weißbach			$path = preg_replace('/^\/\//','http://',$path);	// mPDF 5.6.27
87a4a5b91dSGerry Weißbach			$regexp = '|^./|';	// Inadvertently corrects "./path/etc" and "//www.domain.com/etc"
88a4a5b91dSGerry Weißbach			$path = preg_replace($regexp,'',$path);
89a4a5b91dSGerry Weißbach
90a4a5b91dSGerry Weißbach        	if ( preg_match("/^.+\/\.\.\//", $path) ) {
91a4a5b91dSGerry Weißbach        		// ../ not at the beginning
92a4a5b91dSGerry Weißbach	        	$newpath = array();
93a4a5b91dSGerry Weißbach	        	$oldpath = explode('/', $path);
94a4a5b91dSGerry Weißbach
95a4a5b91dSGerry Weißbach	        	foreach( $oldpath as $slice ) {
96a4a5b91dSGerry Weißbach		        	if ( $slice == ".." && count($newpath) > 0 ) {
97a4a5b91dSGerry Weißbach			        	array_pop($newpath);
98a4a5b91dSGerry Weißbach			        	continue;
99a4a5b91dSGerry Weißbach		        	}
100a4a5b91dSGerry Weißbach
101a4a5b91dSGerry Weißbach		        	$newpath[] = $slice;
102a4a5b91dSGerry Weißbach	        	}
103a4a5b91dSGerry Weißbach
104a4a5b91dSGerry Weißbach	        	$path = implode('/', $newpath);
105a4a5b91dSGerry Weißbach        	}
106a4a5b91dSGerry Weißbach
107a4a5b91dSGerry Weißbach        	parent::GetFullPath($path, $basepath);
108a4a5b91dSGerry Weißbach
10956923262SGerry Weißbach        	$regex = "/^(". preg_quote(DOKU_BASE, '/') .".+)\\1/";
110a4a5b91dSGerry Weißbach        	if ( preg_match($regex, $path, $matches) ) {
111a4a5b91dSGerry Weißbach        		$path = preg_replace($regex, "\\1", $path);
112a4a5b91dSGerry Weißbach        	}
11356923262SGerry Weißbach
114a4a5b91dSGerry Weißbach        }
115a4a5b91dSGerry Weißbach
1167d101cc1SGerry Weißbach        function OpenTag($tag, $attr) {
1177d101cc1SGerry Weißbach            switch($tag) {
1187d101cc1SGerry Weißbach                case 'BOOKMARK':
1197d101cc1SGerry Weißbach                case 'TOCENTRY':
1207d101cc1SGerry Weißbach                    if ( $attr['CONTENT'] ) {
1217d101cc1SGerry Weißbach                        // resolve double encoding
1227d101cc1SGerry Weißbach                        $attr['CONTENT'] = htmlspecialchars_decode($attr['CONTENT'], ENT_QUOTES);
1237d101cc1SGerry Weißbach                    }
1247d101cc1SGerry Weißbach                    break;
1257d101cc1SGerry Weißbach            }
1267d101cc1SGerry Weißbach            return parent::OpenTag($tag, $attr);
1277d101cc1SGerry Weißbach        }
1287d101cc1SGerry Weißbach    }
129d10fa28aSGerry Weißbach
130d10fa28aSGerry Weißbach    if ( file_exists(DOKU_PLUGIN . 'dw2pdf/mpdf/classes/cssmgr.php') && !class_exists('cssmgr', false)) {
131*ed507305SGerry Weißbach//*
132d10fa28aSGerry Weißbach        require_once(DOKU_PLUGIN . 'siteexport/inc/patchCSSmgr.php');
133d10fa28aSGerry Weißbach        $objPatch = new CSSMgrPatch(DOKU_PLUGIN . 'dw2pdf/mpdf/classes/cssmgr.php');
134*ed507305SGerry Weißbach        if ( $objPatch->redefineFunction(file_get_contents(DOKU_PLUGIN . 'siteexport/inc/readCSS.patch')) ) {
135d10fa28aSGerry Weißbach            eval($objPatch->getCode());
136d10fa28aSGerry Weißbach        }
137*ed507305SGerry Weißbach/*/
138*ed507305SGerry Weißbach//*/
139*ed507305SGerry Weißbach    }
140d10fa28aSGerry Weißbach
1417d101cc1SGerry Weißbach}
142