11a52a777SAnna Dabrowska<?php 21a52a777SAnna Dabrowska 31a52a777SAnna Dabrowska// phpcs:disable: PSR1.Methods.CamelCapsMethodName.NotCamelCaps 41a52a777SAnna Dabrowska 51a52a777SAnna Dabrowskanamespace dokuwiki\plugin\dw2pdf\src; 61a52a777SAnna Dabrowska 71a52a777SAnna Dabrowskause Mpdf\Container\SimpleContainer; 81a52a777SAnna Dabrowskause Mpdf\Mpdf; 91a52a777SAnna Dabrowskause Mpdf\MpdfException; 10c2e1b45bSAnna Dabrowskause Mpdf\File\LocalContentLoader as MpdfContenLoader; 113c796bb4SAnna Dabrowskause Psr\Log\NullLogger; 121a52a777SAnna Dabrowska 131a52a777SAnna Dabrowska/** 141a52a777SAnna Dabrowska * Wrapper around the mpdf library class 151a52a777SAnna Dabrowska * 161a52a777SAnna Dabrowska * This class overrides some functions to make mpdf make use of DokuWiki' 171a52a777SAnna Dabrowska * standard tools instead of its own. 181a52a777SAnna Dabrowska * 191a52a777SAnna Dabrowska * @author Andreas Gohr <andi@splitbrain.org> 201a52a777SAnna Dabrowska */ 211a52a777SAnna Dabrowskaclass DokuMpdf extends Mpdf 221a52a777SAnna Dabrowska{ 231a52a777SAnna Dabrowska /** 241a52a777SAnna Dabrowska * DokuPDF constructor. 251a52a777SAnna Dabrowska * 261a52a777SAnna Dabrowska * @param Config $config 271a52a777SAnna Dabrowska * @param string $lang The language code to use for this document 281a52a777SAnna Dabrowska * @throws MpdfException 291a52a777SAnna Dabrowska */ 301a52a777SAnna Dabrowska public function __construct(Config $config, string $lang) 311a52a777SAnna Dabrowska { 321a52a777SAnna Dabrowska $initConfig = $config->getMPdfConfig(); 331a52a777SAnna Dabrowska $initConfig['mode'] = $this->lang2mode($lang); 341a52a777SAnna Dabrowska 353c796bb4SAnna Dabrowska $http = new HttpClient(); 363c796bb4SAnna Dabrowska 371a52a777SAnna Dabrowska $container = new SimpleContainer([ 383c796bb4SAnna Dabrowska 'httpClient' => $http, 39c2e1b45bSAnna Dabrowska 'assetFetcher' => new DokuAssetFetcher($this, new MpdfContenLoader(), $http, new NullLogger()) 401a52a777SAnna Dabrowska ]); 411a52a777SAnna Dabrowska 421a52a777SAnna Dabrowska parent::__construct($initConfig, $container); 431a52a777SAnna Dabrowska $this->SetDirectionality($this->lang2direction($lang)); 441a52a777SAnna Dabrowska 451a52a777SAnna Dabrowska // configure page numbering 461a52a777SAnna Dabrowska // https://mpdf.github.io/paging/page-numbering.html 471a52a777SAnna Dabrowska $this->PageNumSubstitutions[] = ['from' => 1, 'reset' => 0, 'type' => '1', 'suppress' => 'off']; 481a52a777SAnna Dabrowska // add watermark text if configured 493c796bb4SAnna Dabrowska $this->SetWatermarkText($config->getWatermarkText()); 501a52a777SAnna Dabrowska 511a52a777SAnna Dabrowska // let mpdf fix local links 521a52a777SAnna Dabrowska $self = parse_url(DOKU_URL); 531a52a777SAnna Dabrowska $url = $self['scheme'] . '://' . $self['host']; 541a52a777SAnna Dabrowska if (!empty($self['port'])) { 551a52a777SAnna Dabrowska $url .= ':' . $self['port']; 561a52a777SAnna Dabrowska } 571a52a777SAnna Dabrowska $this->SetBasePath($url); 581a52a777SAnna Dabrowska } 591a52a777SAnna Dabrowska 601a52a777SAnna Dabrowska /** 611a52a777SAnna Dabrowska * Decode all paths, since DokuWiki uses XHTML compliant URLs 621a52a777SAnna Dabrowska * 631a52a777SAnna Dabrowska * @inheritdoc 641a52a777SAnna Dabrowska */ 651a52a777SAnna Dabrowska public function GetFullPath(&$path, $basepath = '') 661a52a777SAnna Dabrowska { 671a52a777SAnna Dabrowska $path = htmlspecialchars_decode($path); 681a52a777SAnna Dabrowska parent::GetFullPath($path, $basepath); 691a52a777SAnna Dabrowska } 701a52a777SAnna Dabrowska 711a52a777SAnna Dabrowska /** 721a52a777SAnna Dabrowska * Get the mode to use based on the given language 731a52a777SAnna Dabrowska * 741a52a777SAnna Dabrowska * @link https://mpdf.github.io/reference/mpdf-functions/construct.html 751a52a777SAnna Dabrowska * @link https://mpdf.github.io/reference/mpdf-variables/useadobecjk.html 761a52a777SAnna Dabrowska * @todo it might be more sensible to pass a language string instead 771a52a777SAnna Dabrowska * @param string $lang 781a52a777SAnna Dabrowska * @return string 791a52a777SAnna Dabrowska */ 801a52a777SAnna Dabrowska protected function lang2mode(string $lang): string 811a52a777SAnna Dabrowska { 82*3ddddb3bSAndreas Gohr return match ($lang) { 83*3ddddb3bSAndreas Gohr 'zh', 'zh-tw', 'ja', 'ko' => '+aCJK', 84*3ddddb3bSAndreas Gohr default => 'UTF-8-s', 85*3ddddb3bSAndreas Gohr }; 861a52a777SAnna Dabrowska } 871a52a777SAnna Dabrowska 881a52a777SAnna Dabrowska /** 891a52a777SAnna Dabrowska * Return the writing direction based on the set language 901a52a777SAnna Dabrowska * 911a52a777SAnna Dabrowska * @param string $lang 921a52a777SAnna Dabrowska * @return string 931a52a777SAnna Dabrowska */ 941a52a777SAnna Dabrowska protected function lang2direction(string $lang): string 951a52a777SAnna Dabrowska { 96*3ddddb3bSAndreas Gohr return match ($lang) { 97*3ddddb3bSAndreas Gohr 'ar', 'he' => 'rtl', 98*3ddddb3bSAndreas Gohr default => 'ltr', 99*3ddddb3bSAndreas Gohr }; 1001a52a777SAnna Dabrowska } 1011a52a777SAnna Dabrowska} 102