xref: /plugin/dw2pdf/src/DokuMpdf.php (revision 3ddddb3b2485c18a6aa6809af789c7abb6977134)
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