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