xref: /plugin/openlayersmap/syntax/wmtslayer.php (revision bea711fe9bb2e1d14e26bfd0459f73e628995fe6)
1*bea711feSMark Prins<?php
2*bea711feSMark Prins/*
3*bea711feSMark Prins * Copyright (c) 2023 Mark C. Prins <mprins@users.sf.net>
4*bea711feSMark Prins *
5*bea711feSMark Prins * Permission to use, copy, modify, and distribute this software for any
6*bea711feSMark Prins * purpose with or without fee is hereby granted, provided that the above
7*bea711feSMark Prins * copyright notice and this permission notice appear in all copies.
8*bea711feSMark Prins *
9*bea711feSMark Prins * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10*bea711feSMark Prins * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11*bea711feSMark Prins * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12*bea711feSMark Prins * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13*bea711feSMark Prins * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14*bea711feSMark Prins * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15*bea711feSMark Prins * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16*bea711feSMark Prins *
17*bea711feSMark Prins * @phpcs:disable Squiz.Classes.ValidClassName.NotCamelCaps
18*bea711feSMark Prins */
19*bea711feSMark Prins
20*bea711feSMark Prins/**
21*bea711feSMark Prins * adds a WMTS 1.0.0 layer to your map.
22*bea711feSMark Prins */
23*bea711feSMark Prinsclass syntax_plugin_openlayersmap_wmtslayer extends DokuWiki_Syntax_Plugin
24*bea711feSMark Prins{
25*bea711feSMark Prins    private $dflt = array(
26*bea711feSMark Prins        'id' => 'olmap',
27*bea711feSMark Prins        'name' => '',
28*bea711feSMark Prins        'url' => '',
29*bea711feSMark Prins        'opacity' => 0.8,
30*bea711feSMark Prins        'attribution' => '',
31*bea711feSMark Prins        'visible' => false,
32*bea711feSMark Prins        'layer' => '',
33*bea711feSMark Prins        'matrixSet' => '',
34*bea711feSMark Prins        'transparent' => 'true',
35*bea711feSMark Prins        'baselayer' => 'false',
36*bea711feSMark Prins    );
37*bea711feSMark Prins
38*bea711feSMark Prins    /**
39*bea711feSMark Prins     * (non-PHPdoc)
40*bea711feSMark Prins     *
41*bea711feSMark Prins     * @see DokuWiki_Syntax_Plugin::getPType()
42*bea711feSMark Prins     */
43*bea711feSMark Prins    final public function getPType(): string
44*bea711feSMark Prins    {
45*bea711feSMark Prins        return 'block';
46*bea711feSMark Prins    }
47*bea711feSMark Prins
48*bea711feSMark Prins    /**
49*bea711feSMark Prins     * (non-PHPdoc)
50*bea711feSMark Prins     *
51*bea711feSMark Prins     * @see DokuWiki_Syntax_Plugin::getType()
52*bea711feSMark Prins     */
53*bea711feSMark Prins    final public function getType(): string
54*bea711feSMark Prins    {
55*bea711feSMark Prins        return 'baseonly';
56*bea711feSMark Prins    }
57*bea711feSMark Prins
58*bea711feSMark Prins    /**
59*bea711feSMark Prins     * (non-PHPdoc)
60*bea711feSMark Prins     *
61*bea711feSMark Prins     * @see Doku_Parser_Mode::getSort()
62*bea711feSMark Prins     */
63*bea711feSMark Prins    final public function getSort(): int
64*bea711feSMark Prins    {
65*bea711feSMark Prins        return 902;
66*bea711feSMark Prins    }
67*bea711feSMark Prins
68*bea711feSMark Prins    /**
69*bea711feSMark Prins     * Connect to our special pattern.
70*bea711feSMark Prins     *
71*bea711feSMark Prins     * @see Doku_Parser_Mode::connectTo()
72*bea711feSMark Prins     */
73*bea711feSMark Prins    final public function connectTo($mode): void
74*bea711feSMark Prins    {
75*bea711feSMark Prins        // look for: <olmap_wmstlayer id="olmap" name="geolandbasemap" url="https://mapsneu.wien.gv.at/basemapneu/1.0.0/WMTSCapabilities.xml"
76*bea711feSMark Prins        // attribution="basemap.at" visible="true" layer="geolandbasemap" matrixSet=google3857></olmap_wmtslayer>
77*bea711feSMark Prins        $this->Lexer->addSpecialPattern(
78*bea711feSMark Prins            '<olmap_wmtslayer ?[^>\n]*>.*?</olmap_wmtslayer>',
79*bea711feSMark Prins            $mode,
80*bea711feSMark Prins            'plugin_openlayersmap_wmtslayer'
81*bea711feSMark Prins        );
82*bea711feSMark Prins    }
83*bea711feSMark Prins
84*bea711feSMark Prins    /**
85*bea711feSMark Prins     * (non-PHPdoc)
86*bea711feSMark Prins     *
87*bea711feSMark Prins     * @see DokuWiki_Syntax_Plugin::handle()
88*bea711feSMark Prins     */
89*bea711feSMark Prins    final public function handle($match, $state, $pos, Doku_Handler $handler): array
90*bea711feSMark Prins    {
91*bea711feSMark Prins        $param = array();
92*bea711feSMark Prins        $data = $this->dflt;
93*bea711feSMark Prins
94*bea711feSMark Prins        preg_match_all('/(\w*)="(.*?)"/us', $match, $param, PREG_SET_ORDER);
95*bea711feSMark Prins
96*bea711feSMark Prins        foreach ($param as $kvpair) {
97*bea711feSMark Prins            list ($matched, $key, $val) = $kvpair;
98*bea711feSMark Prins            if (isset ($data [$key])) {
99*bea711feSMark Prins                $key = strtolower($key);
100*bea711feSMark Prins                $data [$key] = $val;
101*bea711feSMark Prins            }
102*bea711feSMark Prins        }
103*bea711feSMark Prins        return $data;
104*bea711feSMark Prins    }
105*bea711feSMark Prins
106*bea711feSMark Prins    /**
107*bea711feSMark Prins     * (non-PHPdoc)
108*bea711feSMark Prins     *
109*bea711feSMark Prins     * @see DokuWiki_Syntax_Plugin::render()
110*bea711feSMark Prins     */
111*bea711feSMark Prins    final public function render($format, Doku_Renderer $renderer, $data): bool
112*bea711feSMark Prins    {
113*bea711feSMark Prins        if ($format !== 'xhtml') {
114*bea711feSMark Prins            return false;
115*bea711feSMark Prins        }
116*bea711feSMark Prins
117*bea711feSMark Prins        // incremented for each olmap_wmtslayer tag in the page source
118*bea711feSMark Prins        static $overlaynumber = 0;
119*bea711feSMark Prins
120*bea711feSMark Prins        $renderer->doc .= DOKU_LF . '<script defer="defer" src="data:text/javascript;base64,';
121*bea711feSMark Prins        $str = '{';
122*bea711feSMark Prins        foreach ($data as $key => $val) {
123*bea711feSMark Prins            $str .= "'" . $key . "':'" . $val . "', ";
124*bea711feSMark Prins        }
125*bea711feSMark Prins        $str .= "'type':'wmts'}";
126*bea711feSMark Prins        $renderer->doc .= base64_encode("olMapOverlays['wmts" . $overlaynumber . "'] = " . $str . ";")
127*bea711feSMark Prins            . '"></script>';
128*bea711feSMark Prins        $overlaynumber++;
129*bea711feSMark Prins        return true;
130*bea711feSMark Prins    }
131*bea711feSMark Prins}