1*7390889dSMark Prins<?php 2*7390889dSMark Prins/* 3*7390889dSMark Prins * Copyright (c) 2012-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 * Add OSM style layer to your map. 22*7390889dSMark Prins */ 23*7390889dSMark Prinsclass syntax_plugin_openlayersmap_osmlayer 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 'cors' => null 33*7390889dSMark Prins ); 34*7390889dSMark Prins 35*7390889dSMark Prins /** 36*7390889dSMark Prins * (non-PHPdoc) 37*7390889dSMark Prins * 38*7390889dSMark Prins * @see DokuWiki_Syntax_Plugin::getPType() 39*7390889dSMark Prins */ 40*7390889dSMark Prins public function getPType(): string 41*7390889dSMark Prins { 42*7390889dSMark Prins return 'block'; 43*7390889dSMark Prins } 44*7390889dSMark Prins 45*7390889dSMark Prins /** 46*7390889dSMark Prins * (non-PHPdoc) 47*7390889dSMark Prins * 48*7390889dSMark Prins * @see DokuWiki_Syntax_Plugin::getType() 49*7390889dSMark Prins */ 50*7390889dSMark Prins public function getType(): string 51*7390889dSMark Prins { 52*7390889dSMark Prins // return 'FIXME: container|baseonly|formatting|substition|protected|disabled|paragraphs'; 53*7390889dSMark Prins return 'baseonly'; 54*7390889dSMark Prins } 55*7390889dSMark Prins 56*7390889dSMark Prins /** 57*7390889dSMark Prins * (non-PHPdoc) 58*7390889dSMark Prins * 59*7390889dSMark Prins * @see Doku_Parser_Mode::getSort() 60*7390889dSMark Prins */ 61*7390889dSMark Prins public function getSort(): int 62*7390889dSMark Prins { 63*7390889dSMark Prins return 902; 64*7390889dSMark Prins } 65*7390889dSMark Prins 66*7390889dSMark Prins /** 67*7390889dSMark Prins * Connect to our special pattern. 68*7390889dSMark Prins * 69*7390889dSMark Prins * @see Doku_Parser_Mode::connectTo() 70*7390889dSMark Prins */ 71*7390889dSMark Prins public function connectTo($mode): void 72*7390889dSMark Prins { 73*7390889dSMark Prins // look for: <olmap_osmlayer id="olmap" name="sport" url="http://tiles.openseamap.org/sport/${z}/${x}/${y}.png" 74*7390889dSMark Prins // visible="false" opacity=0.6 attribution="Some attribution"></olmap_osmlayer> 75*7390889dSMark Prins $this->Lexer->addSpecialPattern( 76*7390889dSMark Prins '<olmap_osmlayer ?[^>\n]*>.*?</olmap_osmlayer>', 77*7390889dSMark Prins $mode, 78*7390889dSMark Prins 'plugin_openlayersmap_osmlayer' 79*7390889dSMark Prins ); 80*7390889dSMark Prins } 81*7390889dSMark Prins 82*7390889dSMark Prins /** 83*7390889dSMark Prins * (non-PHPdoc) 84*7390889dSMark Prins * 85*7390889dSMark Prins * @see DokuWiki_Syntax_Plugin::handle() 86*7390889dSMark Prins */ 87*7390889dSMark Prins public function handle($match, $state, $pos, Doku_Handler $handler): array 88*7390889dSMark Prins { 89*7390889dSMark Prins $param = array(); 90*7390889dSMark Prins $data = $this->dflt; 91*7390889dSMark Prins 92*7390889dSMark Prins preg_match_all('/(\w*)="(.*?)"/us', $match, $param, PREG_SET_ORDER); 93*7390889dSMark Prins 94*7390889dSMark Prins foreach ($param as $kvpair) { 95*7390889dSMark Prins list ($matched, $key, $val) = $kvpair; 96*7390889dSMark Prins if (isset ($data [$key])) { 97*7390889dSMark Prins $key = strtolower($key); 98*7390889dSMark Prins $data [$key] = $val; 99*7390889dSMark Prins } 100*7390889dSMark Prins } 101*7390889dSMark Prins // dbglog($data,'syntax_plugin_overlayer::handle: parsed data is:'); 102*7390889dSMark Prins return $data; 103*7390889dSMark Prins } 104*7390889dSMark Prins 105*7390889dSMark Prins /** 106*7390889dSMark Prins * (non-PHPdoc) 107*7390889dSMark Prins * 108*7390889dSMark Prins * @see DokuWiki_Syntax_Plugin::render() 109*7390889dSMark Prins */ 110*7390889dSMark Prins public function render($format, Doku_Renderer $renderer, $data): bool 111*7390889dSMark Prins { 112*7390889dSMark Prins if ($format !== 'xhtml') { 113*7390889dSMark Prins return false; 114*7390889dSMark Prins } 115*7390889dSMark Prins 116*7390889dSMark Prins // incremented for each olmap_osmlayer tag in the page source 117*7390889dSMark Prins static $overlaynumber = 0; 118*7390889dSMark Prins 119*7390889dSMark Prins list ($id, $url, $name, $visible) = $data; 120*7390889dSMark Prins $renderer->doc .= DOKU_LF . '<script defer="defer" src="data:text/javascript;base64,'; 121*7390889dSMark Prins $str = '{'; 122*7390889dSMark Prins foreach ($data as $key => $val) { 123*7390889dSMark Prins $str .= "'" . $key . "' : '" . $val . "',"; 124*7390889dSMark Prins } 125*7390889dSMark Prins $str .= '"type":"osm"}'; 126*7390889dSMark Prins $renderer->doc .= base64_encode("olMapOverlays['osm" . $overlaynumber . "'] = " . $str . ";") 127*7390889dSMark Prins . '"></script>'; 128*7390889dSMark Prins $overlaynumber++; 129*7390889dSMark Prins return true; 130*7390889dSMark Prins } 131*7390889dSMark Prins} 132