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