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 14ed507305SGerry Weißbachif ( file_exists(DOKU_PLUGIN . 'dw2pdf/mpdf/mpdf.php') ) { 157d101cc1SGerry Weißbach 167d101cc1SGerry Weißbach global $conf; 17ed507305SGerry Weißbach if(!defined('_MPDF_TEMP_PATH')) define('_MPDF_TEMP_PATH', $conf['tmpdir'].'/dwpdf/'.rand(1,1000).'/'); 18ed507305SGerry Weißbach if(!defined('_MPDF_TTFONTDATAPATH')) define('_MPDF_TTFONTDATAPATH',$conf['cachedir'].'/mpdf_ttf/'); 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 247f6f0f99SGerry Weißbach private $debugObj = false; 257d101cc1SGerry Weißbach 267f6f0f99SGerry Weißbach 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; 40ed507305SGerry Weißbach if($orientation == 'landscape') $format .= '-L'; 41ed507305SGerry Weißbach 42ed507305SGerry Weißbach switch($conf['lang']) { 43ed507305SGerry Weißbach case 'zh': 44ed507305SGerry Weißbach case 'zh-tw': 45ed507305SGerry Weißbach case 'ja': 46ed507305SGerry Weißbach case 'ko': 47ed507305SGerry Weißbach $mode = '+aCJK'; 48ed507305SGerry Weißbach break; 49ed507305SGerry Weißbach default: 50ed507305SGerry Weißbach $mode = 'UTF-8-s'; 51ed507305SGerry Weißbach 52ed507305SGerry Weißbach } 53ed507305SGerry Weißbach 54ed507305SGerry Weißbach // we're always UTF-8 55ed507305SGerry Weißbach parent::__construct($mode, $format); 56ed507305SGerry Weißbach $this->ignore_invalid_utf8 = true; 57ed507305SGerry Weißbach $this->tabSpaces = 4; 587d101cc1SGerry Weißbach $this->debugObj = $debug; 597f6f0f99SGerry Weißbach $this->debug = $debug !== false; 607d101cc1SGerry Weißbach $this->shrink_tables_to_fit = 1; // Does not shrink tables by default, only in emergency 617d101cc1SGerry Weißbach $this->use_kwt = true; // avoids page-breaking in H1-H6 if a table follows directly 62*d8d141cfSGerry Weißbach $this->useSubstitutions = true; 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 81fff1dd3dSGerry Weißbach//* 82fff1dd3dSGerry Weißbach // Nothing 83fff1dd3dSGerry Weißbach/*/ 84fff1dd3dSGerry Weißbach var $previousPage = ''; 85fff1dd3dSGerry Weißbach var $currentPage = ''; 86fff1dd3dSGerry Weißbach var $skipAddPage = false; 87fff1dd3dSGerry Weißbach 88fff1dd3dSGerry Weißbach function Footer(){ 89fff1dd3dSGerry Weißbach 90fff1dd3dSGerry Weißbach $currentPage = $this->pages[count($this->pages)]; 91fff1dd3dSGerry Weißbach $this->skipAddPage = $this->previousPage && $this->pages[count($this->pages)] == $this->currentPage; 92fff1dd3dSGerry Weißbach 93fff1dd3dSGerry Weißbach if ( $this->skipAddPage ) { 94fff1dd3dSGerry Weißbach $this->message("HAS TO REMOVE PAGE:", count($this->pages)); 95fff1dd3dSGerry Weißbach } 96fff1dd3dSGerry Weißbach 97fff1dd3dSGerry Weißbach $this->currentPage = $currentPage; 98fff1dd3dSGerry Weißbach parent::Footer(); 99fff1dd3dSGerry Weißbach } 100fff1dd3dSGerry Weißbach function AddPage($orientation='',$condition='', $resetpagenum='', $pagenumstyle='', $suppress='',$mgl='',$mgr='',$mgt='',$mgb='',$mgh='',$mgf='',$ohname='',$ehname='',$ofname='',$efname='',$ohvalue=0,$ehvalue=0,$ofvalue=0,$efvalue=0,$pagesel='',$newformat='') 101fff1dd3dSGerry Weißbach { 102fff1dd3dSGerry Weißbach 103fff1dd3dSGerry Weißbach if ( $skipAddPage ) { return; } 104fff1dd3dSGerry Weißbach 105fff1dd3dSGerry Weißbach $count = count($this->pages); 106fff1dd3dSGerry Weißbach $stack = array(); 107fff1dd3dSGerry Weißbach $trace = debug_backtrace(); 108fff1dd3dSGerry Weißbach foreach( $trace as $entry ) { 109fff1dd3dSGerry Weißbach $vars = substr(implode(',', $entry['args']), 0, 20); 110fff1dd3dSGerry Weißbach $stack[] = "{$entry['function']}({$vars}) | {$entry['file']} | {$entry['line']}"; 111fff1dd3dSGerry Weißbach } 112fff1dd3dSGerry Weißbach 113e393d3ccSGerry Weißbach array_unshift($stack, "(({$this->y}+{$this->divheight}>{$this->PageBreakTrigger}) || ({$this->y}+h>{$this->PageBreakTrigger}) || 114e393d3ccSGerry Weißbach ({$this->y}+(h*2)+{$this->blk[$this->blklvl]['padding_bottom']}+{$this->blk[$this->blklvl]['margin_bottom']}>{$this->PageBreakTrigger} && {$this->blk[$this->blklvl]['page_break_after_avoid']})) and !{$this->InFooter} and AcceptPageBreak())"); 115e393d3ccSGerry Weißbach 116fff1dd3dSGerry Weißbach $this->message("Is Adding Page $count: $orientation,$condition, $resetpagenum, $pagenumstyle,$suppress,$mgl,$mgr,$mgt,$mgb,$mgh,$mgf,$ohname,$ehname,$ofname,$efname,$ohvalue,$ehvalue,$ofvalue,$efvalue,$pagesel,$newformat", $stack, 1); 117fff1dd3dSGerry Weißbach 118fff1dd3dSGerry Weißbach parent::AddPage($orientation,$condition, $resetpagenum, $pagenumstyle,$suppress,$mgl,$mgr,$mgt,$mgb,$mgh,$mgf,$ohname,$ehname,$ofname,$efname,$ohvalue,$ehvalue,$ofvalue,$efvalue,$pagesel,$newformat); 119fff1dd3dSGerry Weißbach } 120fff1dd3dSGerry Weißbach//*/ 121fff1dd3dSGerry Weißbach 122a4a5b91dSGerry Weißbach function GetFullPath(&$path,$basepath='') { 123a4a5b91dSGerry Weißbach 124a4a5b91dSGerry Weißbach // Full Path might return a doubled path like /~gamma/documentation/lib//~gamma/documentation/lib/tpl/clearreports/./_print-images/background-bottom.jpg 125a4a5b91dSGerry Weißbach 126a4a5b91dSGerry Weißbach $path = str_replace("\\","/",$path); //If on Windows 127a4a5b91dSGerry Weißbach $path = preg_replace('/^\/\//','http://',$path); // mPDF 5.6.27 128a4a5b91dSGerry Weißbach $regexp = '|^./|'; // Inadvertently corrects "./path/etc" and "//www.domain.com/etc" 129a4a5b91dSGerry Weißbach $path = preg_replace($regexp,'',$path); 130a4a5b91dSGerry Weißbach 131a4a5b91dSGerry Weißbach if ( preg_match("/^.+\/\.\.\//", $path) ) { 132a4a5b91dSGerry Weißbach // ../ not at the beginning 133a4a5b91dSGerry Weißbach $newpath = array(); 134a4a5b91dSGerry Weißbach $oldpath = explode('/', $path); 135a4a5b91dSGerry Weißbach 136a4a5b91dSGerry Weißbach foreach( $oldpath as $slice ) { 137a4a5b91dSGerry Weißbach if ( $slice == ".." && count($newpath) > 0 ) { 138a4a5b91dSGerry Weißbach array_pop($newpath); 139a4a5b91dSGerry Weißbach continue; 140a4a5b91dSGerry Weißbach } 141a4a5b91dSGerry Weißbach 142a4a5b91dSGerry Weißbach $newpath[] = $slice; 143a4a5b91dSGerry Weißbach } 144a4a5b91dSGerry Weißbach 145a4a5b91dSGerry Weißbach $path = implode('/', $newpath); 146a4a5b91dSGerry Weißbach } 147a4a5b91dSGerry Weißbach 148a4a5b91dSGerry Weißbach parent::GetFullPath($path, $basepath); 149a4a5b91dSGerry Weißbach 15056923262SGerry Weißbach $regex = "/^(". preg_quote(DOKU_BASE, '/') .".+)\\1/"; 151a4a5b91dSGerry Weißbach if ( preg_match($regex, $path, $matches) ) { 152a4a5b91dSGerry Weißbach $path = preg_replace($regex, "\\1", $path); 153a4a5b91dSGerry Weißbach } 15456923262SGerry Weißbach 155a4a5b91dSGerry Weißbach } 156a4a5b91dSGerry Weißbach 157fff1dd3dSGerry Weißbach /* 158fff1dd3dSGerry Weißbach Only when the toc is being generated 159fff1dd3dSGerry Weißbach */ 160fff1dd3dSGerry Weißbach function MovePages($target_page, $start_page, $end_page=-1) { 161fff1dd3dSGerry Weißbach parent::MovePages($target_page, $start_page, $end_page); 162fff1dd3dSGerry Weißbach } 163fff1dd3dSGerry Weißbach 164876523d1SGerry Weißbach function OpenTag($tag,$attr,&$ahtml,&$ihtml) { 1657d101cc1SGerry Weißbach switch($tag) { 1667d101cc1SGerry Weißbach case 'BOOKMARK': 1677d101cc1SGerry Weißbach case 'TOCENTRY': 1687d101cc1SGerry Weißbach if ( $attr['CONTENT'] ) { 1697d101cc1SGerry Weißbach // resolve double encoding 1707d101cc1SGerry Weißbach $attr['CONTENT'] = htmlspecialchars_decode($attr['CONTENT'], ENT_QUOTES); 1717d101cc1SGerry Weißbach } 1727d101cc1SGerry Weißbach break; 1737d101cc1SGerry Weißbach } 174876523d1SGerry Weißbach return parent::OpenTag($tag,$attr,$ahtml,$ihtml); 1757d101cc1SGerry Weißbach } 1767d101cc1SGerry Weißbach } 177d10fa28aSGerry Weißbach 178d10fa28aSGerry Weißbach if ( file_exists(DOKU_PLUGIN . 'dw2pdf/mpdf/classes/cssmgr.php') && !class_exists('cssmgr', false)) { 179ed507305SGerry Weißbach//* 180d10fa28aSGerry Weißbach require_once(DOKU_PLUGIN . 'siteexport/inc/patchCSSmgr.php'); 181d10fa28aSGerry Weißbach $objPatch = new CSSMgrPatch(DOKU_PLUGIN . 'dw2pdf/mpdf/classes/cssmgr.php'); 182ed507305SGerry Weißbach if ( $objPatch->redefineFunction(file_get_contents(DOKU_PLUGIN . 'siteexport/inc/readCSS.patch')) ) { 183d10fa28aSGerry Weißbach eval($objPatch->getCode()); 184d10fa28aSGerry Weißbach } 185ed507305SGerry Weißbach/*/ 186ed507305SGerry Weißbach//*/ 187ed507305SGerry Weißbach } 188d10fa28aSGerry Weißbach 1897d101cc1SGerry Weißbach} 190