xref: /plugin/openlayersmap/syntax/osmlayer.php (revision f204b8ca21a3ff1a5b655b65aceab085168cc9d8)
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) 2012-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 * Add OSM style layer to your map.
247390889dSMark Prins */
25*a760825cSgithub-actions[bot]class syntax_plugin_openlayersmap_osmlayer extends SyntaxPlugin
267390889dSMark Prins{
27*a760825cSgithub-actions[bot]    private $dflt = ['id'          => 'olmap', 'name'        => '', 'url'         => '', 'opacity'     => 0.8, 'attribution' => '', 'visible'     => false, 'cors'        => null, '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 902;
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_osmlayer id="olmap" name="sport" url="http://tiles.openseamap.org/sport/${z}/${x}/${y}.png"
687390889dSMark Prins        // visible="false" opacity=0.6 attribution="Some attribution"></olmap_osmlayer>
697390889dSMark Prins        $this->Lexer->addSpecialPattern(
707390889dSMark Prins            '<olmap_osmlayer ?[^>\n]*>.*?</olmap_osmlayer>',
717390889dSMark Prins            $mode,
727390889dSMark Prins            'plugin_openlayersmap_osmlayer'
737390889dSMark Prins        );
747390889dSMark Prins    }
757390889dSMark Prins
767390889dSMark Prins    /**
777390889dSMark Prins     * (non-PHPdoc)
787390889dSMark Prins     *
797390889dSMark Prins     * @see DokuWiki_Syntax_Plugin::handle()
807390889dSMark Prins     */
817390889dSMark Prins    public function handle($match, $state, $pos, Doku_Handler $handler): array
827390889dSMark Prins    {
83*a760825cSgithub-actions[bot]        $param = [];
847390889dSMark Prins        $data  = $this->dflt;
857390889dSMark Prins
867390889dSMark Prins        preg_match_all('/(\w*)="(.*?)"/us', $match, $param, PREG_SET_ORDER);
877390889dSMark Prins
887390889dSMark Prins        foreach ($param as $kvpair) {
89*a760825cSgithub-actions[bot]            [$matched, $key, $val] = $kvpair;
907390889dSMark Prins            if (isset($data [$key])) {
917390889dSMark Prins                $key         = strtolower($key);
927390889dSMark Prins                $data [$key] = $val;
937390889dSMark Prins            }
947390889dSMark Prins        }
957390889dSMark Prins        return $data;
967390889dSMark Prins    }
977390889dSMark Prins
987390889dSMark Prins    /**
997390889dSMark Prins     * (non-PHPdoc)
1007390889dSMark Prins     *
1017390889dSMark Prins     * @see DokuWiki_Syntax_Plugin::render()
1027390889dSMark Prins     */
1037390889dSMark Prins    public function render($format, Doku_Renderer $renderer, $data): bool
1047390889dSMark Prins    {
1057390889dSMark Prins        if ($format !== 'xhtml') {
1067390889dSMark Prins            return false;
1077390889dSMark Prins        }
1087390889dSMark Prins
1097390889dSMark Prins        // incremented for each olmap_osmlayer tag in the page source
1107390889dSMark Prins        static $overlaynumber = 0;
1117390889dSMark Prins
1127390889dSMark Prins        $renderer->doc .= DOKU_LF . '<script defer="defer" src="data:text/javascript;base64,';
1137390889dSMark Prins        $str           = '{';
1147390889dSMark Prins        foreach ($data as $key => $val) {
1157390889dSMark Prins            $str .= "'" . $key . "' : '" . $val . "',";
1167390889dSMark Prins        }
1177390889dSMark Prins        $str           .= '"type":"osm"}';
1187390889dSMark Prins        $renderer->doc .= base64_encode("olMapOverlays['osm" . $overlaynumber . "'] = " . $str . ";")
1197390889dSMark Prins            . '"></script>';
1207390889dSMark Prins        $overlaynumber++;
1217390889dSMark Prins        return true;
1227390889dSMark Prins    }
1237390889dSMark Prins}
124