xref: /plugin/openlayersmap/syntax/agslayer.php (revision a760825c0aa6eee7ec491397b3516b6237e4ad78)
17390889dSMark Prins<?php
2*a760825cSgithub-actions[bot]
3*a760825cSgithub-actions[bot]use dokuwiki\Extension\SyntaxPlugin;
4*a760825cSgithub-actions[bot]
57390889dSMark Prins/*
67390889dSMark Prins * Copyright (c) 2017-2020 Mark C. Prins <mprins@users.sf.net>
77390889dSMark Prins *
87390889dSMark Prins * Permission to use, copy, modify, and distribute this software for any
97390889dSMark Prins * purpose with or without fee is hereby granted, provided that the above
107390889dSMark Prins * copyright notice and this permission notice appear in all copies.
117390889dSMark Prins *
127390889dSMark Prins * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
137390889dSMark Prins * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
147390889dSMark Prins * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
157390889dSMark Prins * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
167390889dSMark Prins * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
177390889dSMark Prins * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
187390889dSMark Prins * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
197390889dSMark Prins *
207390889dSMark Prins * @phpcs:disable Squiz.Classes.ValidClassName.NotCamelCaps
217390889dSMark Prins */
227390889dSMark Prins/**
237390889dSMark Prins * adds a AGS layer to your map.
247390889dSMark Prins */
25*a760825cSgithub-actions[bot]class syntax_plugin_openlayersmap_agslayer extends SyntaxPlugin
267390889dSMark Prins{
27*a760825cSgithub-actions[bot]    private $dflt = ['id'          => 'olmap', 'name'        => '', 'url'         => '', 'opacity'     => 0.8, 'attribution' => '', 'visible'     => false, 'layers'      => '', 'format'      => 'png', 'transparent' => 'true', 'baselayer'   => 'false'];
287390889dSMark Prins
297390889dSMark Prins    /**
307390889dSMark Prins     * (non-PHPdoc)
317390889dSMark Prins     *
327390889dSMark Prins     * @see DokuWiki_Syntax_Plugin::getPType()
337390889dSMark Prins     */
347390889dSMark Prins    public function getPType(): string
357390889dSMark Prins    {
367390889dSMark Prins        return 'block';
377390889dSMark Prins    }
387390889dSMark Prins
397390889dSMark Prins    /**
407390889dSMark Prins     * (non-PHPdoc)
417390889dSMark Prins     *
427390889dSMark Prins     * @see DokuWiki_Syntax_Plugin::getType()
437390889dSMark Prins     */
447390889dSMark Prins    public function getType(): string
457390889dSMark Prins    {
467390889dSMark Prins        // return 'FIXME: container|baseonly|formatting|substition|protected|disabled|paragraphs';
477390889dSMark Prins        return 'baseonly';
487390889dSMark Prins    }
497390889dSMark Prins
507390889dSMark Prins    /**
517390889dSMark Prins     * (non-PHPdoc)
527390889dSMark Prins     *
537390889dSMark Prins     * @see Doku_Parser_Mode::getSort()
547390889dSMark Prins     */
557390889dSMark Prins    public function getSort(): int
567390889dSMark Prins    {
577390889dSMark Prins        return 904;
587390889dSMark Prins    }
597390889dSMark Prins
607390889dSMark Prins    /**
617390889dSMark Prins     * Connect to our special pattern.
627390889dSMark Prins     *
637390889dSMark Prins     * @see Doku_Parser_Mode::connectTo()
647390889dSMark Prins     */
657390889dSMark Prins    public function connectTo($mode): void
667390889dSMark Prins    {
677390889dSMark Prins        // look for: <olmap_agslayer id="olmap" name="cloud"
687390889dSMark Prins        // url="http://geoservices2.wallonie.be/arcgis/rest/services/APP_KAYAK/KAYAK/MapServer/export"
697390889dSMark Prins        // attribution="wallonie.be" visible="true" layers="show:0,1,2,3,4,7"></olmap_agslayer>
707390889dSMark Prins        // sample:
717390889dSMark 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
727390889dSMark Prins        $this->Lexer->addSpecialPattern(
737390889dSMark Prins            '<olmap_agslayer ?[^>\n]*>.*?</olmap_agslayer>',
747390889dSMark Prins            $mode,
757390889dSMark Prins            'plugin_openlayersmap_agslayer'
767390889dSMark Prins        );
777390889dSMark Prins    }
787390889dSMark Prins
797390889dSMark Prins    /**
807390889dSMark Prins     * (non-PHPdoc)
817390889dSMark Prins     *
827390889dSMark Prins     * @see DokuWiki_Syntax_Plugin::handle()
837390889dSMark Prins     */
847390889dSMark Prins    public function handle($match, $state, $pos, Doku_Handler $handler): array
857390889dSMark Prins    {
86*a760825cSgithub-actions[bot]        $param = [];
877390889dSMark Prins        $data  = $this->dflt;
887390889dSMark Prins
897390889dSMark Prins        preg_match_all('/(\w*)="(.*?)"/us', $match, $param, PREG_SET_ORDER);
907390889dSMark Prins
917390889dSMark Prins        foreach ($param as $kvpair) {
92*a760825cSgithub-actions[bot]            [$matched, $key, $val] = $kvpair;
937390889dSMark Prins            if (isset($data [$key])) {
947390889dSMark Prins                $key         = strtolower($key);
957390889dSMark Prins                $data [$key] = $val;
967390889dSMark Prins            }
977390889dSMark Prins        }
987390889dSMark Prins        return $data;
997390889dSMark Prins    }
1007390889dSMark Prins
1017390889dSMark Prins    /**
1027390889dSMark Prins     * (non-PHPdoc)
1037390889dSMark Prins     *
1047390889dSMark Prins     * @see DokuWiki_Syntax_Plugin::render()
1057390889dSMark Prins     */
1067390889dSMark Prins    public function render($format, Doku_Renderer $renderer, $data): bool
1077390889dSMark Prins    {
1087390889dSMark Prins        if ($format !== 'xhtml') {
1097390889dSMark Prins            return false;
1107390889dSMark Prins        }
1117390889dSMark Prins
1127390889dSMark Prins        // incremented for each olmap_agslayer tag in the page source
1137390889dSMark Prins        static $overlaynumber = 0;
1147390889dSMark Prins
1157390889dSMark Prins        $renderer->doc .= DOKU_LF . '<script defer="defer" src="data:text/javascript;base64,';
1167390889dSMark Prins        $str           = '{';
1177390889dSMark Prins        foreach ($data as $key => $val) {
1187390889dSMark Prins            $str .= "'" . $key . "' : '" . $val . "',";
1197390889dSMark Prins        }
1207390889dSMark Prins        $str           .= "'type':'ags'}";
1217390889dSMark Prins        $renderer->doc .= base64_encode("olMapOverlays['ags" . $overlaynumber . "'] = " . $str . ";")
1227390889dSMark Prins            . '"></script>';
1237390889dSMark Prins        $overlaynumber++;
1247390889dSMark Prins        return true;
1257390889dSMark Prins    }
1267390889dSMark Prins}
127