xref: /plugin/openlayersmap/syntax/agslayer.php (revision 7390889d9aa535aa9bdfffc90e2fe7f66d696221)
1*7390889dSMark Prins<?php
2*7390889dSMark Prins/*
3*7390889dSMark Prins * Copyright (c) 2017-2020 Mark C. Prins <mprins@users.sf.net>
4*7390889dSMark Prins *
5*7390889dSMark Prins * Permission to use, copy, modify, and distribute this software for any
6*7390889dSMark Prins * purpose with or without fee is hereby granted, provided that the above
7*7390889dSMark Prins * copyright notice and this permission notice appear in all copies.
8*7390889dSMark Prins *
9*7390889dSMark Prins * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10*7390889dSMark Prins * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11*7390889dSMark Prins * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12*7390889dSMark Prins * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13*7390889dSMark Prins * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14*7390889dSMark Prins * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15*7390889dSMark Prins * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16*7390889dSMark Prins *
17*7390889dSMark Prins * @phpcs:disable Squiz.Classes.ValidClassName.NotCamelCaps
18*7390889dSMark Prins */
19*7390889dSMark Prins
20*7390889dSMark Prins/**
21*7390889dSMark Prins * adds a AGS layer to your map.
22*7390889dSMark Prins */
23*7390889dSMark Prinsclass syntax_plugin_openlayersmap_agslayer extends DokuWiki_Syntax_Plugin
24*7390889dSMark Prins{
25*7390889dSMark Prins    private $dflt = array(
26*7390889dSMark Prins        'id'          => 'olmap',
27*7390889dSMark Prins        'name'        => '',
28*7390889dSMark Prins        'url'         => '',
29*7390889dSMark Prins        'opacity'     => 0.8,
30*7390889dSMark Prins        'attribution' => '',
31*7390889dSMark Prins        'visible'     => false,
32*7390889dSMark Prins        'layers'      => '',
33*7390889dSMark Prins        'format'      => 'png',
34*7390889dSMark Prins        'transparent' => 'true'
35*7390889dSMark Prins    );
36*7390889dSMark Prins
37*7390889dSMark Prins    /**
38*7390889dSMark Prins     * (non-PHPdoc)
39*7390889dSMark Prins     *
40*7390889dSMark Prins     * @see DokuWiki_Syntax_Plugin::getPType()
41*7390889dSMark Prins     */
42*7390889dSMark Prins    public function getPType(): string
43*7390889dSMark Prins    {
44*7390889dSMark Prins        return 'block';
45*7390889dSMark Prins    }
46*7390889dSMark Prins
47*7390889dSMark Prins    /**
48*7390889dSMark Prins     * (non-PHPdoc)
49*7390889dSMark Prins     *
50*7390889dSMark Prins     * @see DokuWiki_Syntax_Plugin::getType()
51*7390889dSMark Prins     */
52*7390889dSMark Prins    public function getType(): string
53*7390889dSMark Prins    {
54*7390889dSMark Prins        // return 'FIXME: container|baseonly|formatting|substition|protected|disabled|paragraphs';
55*7390889dSMark Prins        return 'baseonly';
56*7390889dSMark Prins    }
57*7390889dSMark Prins
58*7390889dSMark Prins    /**
59*7390889dSMark Prins     * (non-PHPdoc)
60*7390889dSMark Prins     *
61*7390889dSMark Prins     * @see Doku_Parser_Mode::getSort()
62*7390889dSMark Prins     */
63*7390889dSMark Prins    public function getSort(): int
64*7390889dSMark Prins    {
65*7390889dSMark Prins        return 904;
66*7390889dSMark Prins    }
67*7390889dSMark Prins
68*7390889dSMark Prins    /**
69*7390889dSMark Prins     * Connect to our special pattern.
70*7390889dSMark Prins     *
71*7390889dSMark Prins     * @see Doku_Parser_Mode::connectTo()
72*7390889dSMark Prins     */
73*7390889dSMark Prins    public function connectTo($mode): void
74*7390889dSMark Prins    {
75*7390889dSMark Prins        // look for: <olmap_agslayer id="olmap" name="cloud"
76*7390889dSMark Prins        // url="http://geoservices2.wallonie.be/arcgis/rest/services/APP_KAYAK/KAYAK/MapServer/export"
77*7390889dSMark Prins        // attribution="wallonie.be" visible="true" layers="show:0,1,2,3,4,7"></olmap_agslayer>
78*7390889dSMark Prins        // sample:
79*7390889dSMark Prins        // http://geoservices2.wallonie.be/arcgis/rest/services/APP_KAYAK/KAYAK/MapServer/export?LAYERS=show%3A0%2C1%2C2%2C3%2C4%2C7&TRANSPARENT=true&FORMAT=png&BBOX=643294.029959%2C6467184.088252%2C645740.014863%2C6469630.073157&SIZE=256%2C256&F=html&BBOXSR=3857&IMAGESR=3857
80*7390889dSMark Prins        $this->Lexer->addSpecialPattern(
81*7390889dSMark Prins            '<olmap_agslayer ?[^>\n]*>.*?</olmap_agslayer>',
82*7390889dSMark Prins            $mode,
83*7390889dSMark Prins            'plugin_openlayersmap_agslayer'
84*7390889dSMark Prins        );
85*7390889dSMark Prins    }
86*7390889dSMark Prins
87*7390889dSMark Prins    /**
88*7390889dSMark Prins     * (non-PHPdoc)
89*7390889dSMark Prins     *
90*7390889dSMark Prins     * @see DokuWiki_Syntax_Plugin::handle()
91*7390889dSMark Prins     */
92*7390889dSMark Prins    public function handle($match, $state, $pos, Doku_Handler $handler): array
93*7390889dSMark Prins    {
94*7390889dSMark Prins        $param = array();
95*7390889dSMark Prins        $data  = $this->dflt;
96*7390889dSMark Prins
97*7390889dSMark Prins        preg_match_all('/(\w*)="(.*?)"/us', $match, $param, PREG_SET_ORDER);
98*7390889dSMark Prins
99*7390889dSMark Prins        foreach ($param as $kvpair) {
100*7390889dSMark Prins            list ($matched, $key, $val) = $kvpair;
101*7390889dSMark Prins            if (isset ($data [$key])) {
102*7390889dSMark Prins                $key         = strtolower($key);
103*7390889dSMark Prins                $data [$key] = $val;
104*7390889dSMark Prins            }
105*7390889dSMark Prins        }
106*7390889dSMark Prins        return $data;
107*7390889dSMark Prins    }
108*7390889dSMark Prins
109*7390889dSMark Prins    /**
110*7390889dSMark Prins     * (non-PHPdoc)
111*7390889dSMark Prins     *
112*7390889dSMark Prins     * @see DokuWiki_Syntax_Plugin::render()
113*7390889dSMark Prins     */
114*7390889dSMark Prins    public function render($format, Doku_Renderer $renderer, $data): bool
115*7390889dSMark Prins    {
116*7390889dSMark Prins        if ($format !== 'xhtml') {
117*7390889dSMark Prins            return false;
118*7390889dSMark Prins        }
119*7390889dSMark Prins
120*7390889dSMark Prins        // incremented for each olmap_agslayer tag in the page source
121*7390889dSMark Prins        static $overlaynumber = 0;
122*7390889dSMark Prins
123*7390889dSMark Prins        list ($id, $url, $name, $visible) = $data;
124*7390889dSMark Prins        $renderer->doc .= DOKU_LF . '<script defer="defer" src="data:text/javascript;base64,';
125*7390889dSMark Prins        $str           = '{';
126*7390889dSMark Prins        foreach ($data as $key => $val) {
127*7390889dSMark Prins            $str .= "'" . $key . "' : '" . $val . "',";
128*7390889dSMark Prins        }
129*7390889dSMark Prins        $str           .= "'type':'ags'}";
130*7390889dSMark Prins        $renderer->doc .= base64_encode("olMapOverlays['ags" . $overlaynumber . "'] = " . $str . ";")
131*7390889dSMark Prins            . '"></script>';
132*7390889dSMark Prins        $overlaynumber++;
133*7390889dSMark Prins        return true;
134*7390889dSMark Prins    }
135*7390889dSMark Prins}
136