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 627d101cc1SGerry Weißbach } 637d101cc1SGerry Weißbach 647d101cc1SGerry Weißbach function message($msg, $vars=null, $lvl=1) 657d101cc1SGerry Weißbach { 667d101cc1SGerry Weißbach if ( $this->debugObj !== false ) { 67a4a5b91dSGerry Weißbach $this->debugObj->message($msg, $vars, $lvl); 687d101cc1SGerry Weißbach } 697d101cc1SGerry Weißbach } 707d101cc1SGerry Weißbach 717d101cc1SGerry Weißbach function Error($msg) 727d101cc1SGerry Weißbach { 737f6f0f99SGerry Weißbach if ( $this->debugObj !== false && method_exists($this->debugObj, 'runtimeException') ) { 747f6f0f99SGerry Weißbach $this->debugObj->runtimeException($msg); 757d101cc1SGerry Weißbach } else { 767d101cc1SGerry Weißbach parent::Error($msg); 777d101cc1SGerry Weißbach } 787d101cc1SGerry Weißbach } 797d101cc1SGerry Weißbach 80fff1dd3dSGerry Weißbach//* 81fff1dd3dSGerry Weißbach // Nothing 82fff1dd3dSGerry Weißbach/*/ 83fff1dd3dSGerry Weißbach var $previousPage = ''; 84fff1dd3dSGerry Weißbach var $currentPage = ''; 85fff1dd3dSGerry Weißbach var $skipAddPage = false; 86fff1dd3dSGerry Weißbach 87fff1dd3dSGerry Weißbach function Footer(){ 88fff1dd3dSGerry Weißbach 89fff1dd3dSGerry Weißbach $currentPage = $this->pages[count($this->pages)]; 90fff1dd3dSGerry Weißbach $this->skipAddPage = $this->previousPage && $this->pages[count($this->pages)] == $this->currentPage; 91fff1dd3dSGerry Weißbach 92fff1dd3dSGerry Weißbach if ( $this->skipAddPage ) { 93fff1dd3dSGerry Weißbach $this->message("HAS TO REMOVE PAGE:", count($this->pages)); 94fff1dd3dSGerry Weißbach } 95fff1dd3dSGerry Weißbach 96fff1dd3dSGerry Weißbach $this->currentPage = $currentPage; 97fff1dd3dSGerry Weißbach parent::Footer(); 98fff1dd3dSGerry Weißbach } 99fff1dd3dSGerry 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='') 100fff1dd3dSGerry Weißbach { 101fff1dd3dSGerry Weißbach 102fff1dd3dSGerry Weißbach if ( $skipAddPage ) { return; } 103fff1dd3dSGerry Weißbach 104fff1dd3dSGerry Weißbach $count = count($this->pages); 105fff1dd3dSGerry Weißbach $stack = array(); 106fff1dd3dSGerry Weißbach $trace = debug_backtrace(); 107fff1dd3dSGerry Weißbach foreach( $trace as $entry ) { 108fff1dd3dSGerry Weißbach $vars = substr(implode(',', $entry['args']), 0, 20); 109fff1dd3dSGerry Weißbach $stack[] = "{$entry['function']}({$vars}) | {$entry['file']} | {$entry['line']}"; 110fff1dd3dSGerry Weißbach } 111fff1dd3dSGerry Weißbach 112e393d3ccSGerry Weißbach array_unshift($stack, "(({$this->y}+{$this->divheight}>{$this->PageBreakTrigger}) || ({$this->y}+h>{$this->PageBreakTrigger}) || 113e393d3ccSGerry 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())"); 114e393d3ccSGerry Weißbach 115fff1dd3dSGerry 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); 116fff1dd3dSGerry Weißbach 117fff1dd3dSGerry 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); 118fff1dd3dSGerry Weißbach } 119fff1dd3dSGerry Weißbach//*/ 120fff1dd3dSGerry Weißbach 121a4a5b91dSGerry Weißbach function GetFullPath(&$path,$basepath='') { 122a4a5b91dSGerry Weißbach 123a4a5b91dSGerry Weißbach // Full Path might return a doubled path like /~gamma/documentation/lib//~gamma/documentation/lib/tpl/clearreports/./_print-images/background-bottom.jpg 124a4a5b91dSGerry Weißbach 125a4a5b91dSGerry Weißbach $path = str_replace("\\","/",$path); //If on Windows 126a4a5b91dSGerry Weißbach $path = preg_replace('/^\/\//','http://',$path); // mPDF 5.6.27 127a4a5b91dSGerry Weißbach $regexp = '|^./|'; // Inadvertently corrects "./path/etc" and "//www.domain.com/etc" 128a4a5b91dSGerry Weißbach $path = preg_replace($regexp,'',$path); 129a4a5b91dSGerry Weißbach 130a4a5b91dSGerry Weißbach if ( preg_match("/^.+\/\.\.\//", $path) ) { 131a4a5b91dSGerry Weißbach // ../ not at the beginning 132a4a5b91dSGerry Weißbach $newpath = array(); 133a4a5b91dSGerry Weißbach $oldpath = explode('/', $path); 134a4a5b91dSGerry Weißbach 135a4a5b91dSGerry Weißbach foreach( $oldpath as $slice ) { 136a4a5b91dSGerry Weißbach if ( $slice == ".." && count($newpath) > 0 ) { 137a4a5b91dSGerry Weißbach array_pop($newpath); 138a4a5b91dSGerry Weißbach continue; 139a4a5b91dSGerry Weißbach } 140a4a5b91dSGerry Weißbach 141a4a5b91dSGerry Weißbach $newpath[] = $slice; 142a4a5b91dSGerry Weißbach } 143a4a5b91dSGerry Weißbach 144a4a5b91dSGerry Weißbach $path = implode('/', $newpath); 145a4a5b91dSGerry Weißbach } 146a4a5b91dSGerry Weißbach 147a4a5b91dSGerry Weißbach parent::GetFullPath($path, $basepath); 148a4a5b91dSGerry Weißbach 14956923262SGerry Weißbach $regex = "/^(". preg_quote(DOKU_BASE, '/') .".+)\\1/"; 150a4a5b91dSGerry Weißbach if ( preg_match($regex, $path, $matches) ) { 151a4a5b91dSGerry Weißbach $path = preg_replace($regex, "\\1", $path); 152a4a5b91dSGerry Weißbach } 15356923262SGerry Weißbach 154a4a5b91dSGerry Weißbach } 155a4a5b91dSGerry Weißbach 156fff1dd3dSGerry Weißbach /* 157fff1dd3dSGerry Weißbach Only when the toc is being generated 158fff1dd3dSGerry Weißbach */ 159fff1dd3dSGerry Weißbach function MovePages($target_page, $start_page, $end_page=-1) { 160fff1dd3dSGerry Weißbach parent::MovePages($target_page, $start_page, $end_page); 161fff1dd3dSGerry Weißbach } 162fff1dd3dSGerry Weißbach 163*876523d1SGerry Weißbach function OpenTag($tag,$attr,&$ahtml,&$ihtml) { 1647d101cc1SGerry Weißbach switch($tag) { 1657d101cc1SGerry Weißbach case 'BOOKMARK': 1667d101cc1SGerry Weißbach case 'TOCENTRY': 1677d101cc1SGerry Weißbach if ( $attr['CONTENT'] ) { 1687d101cc1SGerry Weißbach // resolve double encoding 1697d101cc1SGerry Weißbach $attr['CONTENT'] = htmlspecialchars_decode($attr['CONTENT'], ENT_QUOTES); 1707d101cc1SGerry Weißbach } 1717d101cc1SGerry Weißbach break; 1727d101cc1SGerry Weißbach } 173*876523d1SGerry Weißbach return parent::OpenTag($tag,$attr,$ahtml,$ihtml); 1747d101cc1SGerry Weißbach } 1757d101cc1SGerry Weißbach } 176d10fa28aSGerry Weißbach 177d10fa28aSGerry Weißbach if ( file_exists(DOKU_PLUGIN . 'dw2pdf/mpdf/classes/cssmgr.php') && !class_exists('cssmgr', false)) { 178ed507305SGerry Weißbach//* 179d10fa28aSGerry Weißbach require_once(DOKU_PLUGIN . 'siteexport/inc/patchCSSmgr.php'); 180d10fa28aSGerry Weißbach $objPatch = new CSSMgrPatch(DOKU_PLUGIN . 'dw2pdf/mpdf/classes/cssmgr.php'); 181ed507305SGerry Weißbach if ( $objPatch->redefineFunction(file_get_contents(DOKU_PLUGIN . 'siteexport/inc/readCSS.patch')) ) { 182d10fa28aSGerry Weißbach eval($objPatch->getCode()); 183d10fa28aSGerry Weißbach } 184ed507305SGerry Weißbach/*/ 185ed507305SGerry Weißbach//*/ 186ed507305SGerry Weißbach } 187d10fa28aSGerry Weißbach 1887d101cc1SGerry Weißbach} 189