1bd120a73SMark C. Prins<?php 29fe665eaSgithub-actions[bot] 3bd120a73SMark C. Prins/* 4*639d6e38SMark Prins * Copyright (c) 2011-2024 Mark C. Prins <mprins@users.sf.net> 5bd120a73SMark C. Prins * 6bd120a73SMark C. Prins * Permission to use, copy, modify, and distribute this software for any 7bd120a73SMark C. Prins * purpose with or without fee is hereby granted, provided that the above 8bd120a73SMark C. Prins * copyright notice and this permission notice appear in all copies. 9bd120a73SMark C. Prins * 10bd120a73SMark C. Prins * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11bd120a73SMark C. Prins * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12bd120a73SMark C. Prins * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13bd120a73SMark C. Prins * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14bd120a73SMark C. Prins * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15bd120a73SMark C. Prins * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16bd120a73SMark C. Prins * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17bd120a73SMark C. Prins */ 1878ebf9c0SMark Prins 199fe665eaSgithub-actions[bot]use dokuwiki\Extension\ActionPlugin; 209fe665eaSgithub-actions[bot]use dokuwiki\Extension\Event; 2178ebf9c0SMark Prinsuse dokuwiki\Extension\EventHandler; 2278ebf9c0SMark Prinsuse dokuwiki\Logger; 23e48b49c1SMark Prinsuse dokuwiki\Sitemap\Item; 24bd120a73SMark C. Prins 25a9441f7dSMark C. Prins/** 26a9441f7dSMark C. Prins * DokuWiki Plugin dokuwikispatial (Action Component). 27a9441f7dSMark C. Prins * 28a9441f7dSMark C. Prins * @license BSD license 29a9441f7dSMark C. Prins * @author Mark C. Prins <mprins@users.sf.net> 30a9441f7dSMark C. Prins */ 319fe665eaSgithub-actions[bot]class action_plugin_spatialhelper extends ActionPlugin 32bdfa1066SMark Prins{ 33bd120a73SMark C. Prins /** 34bd120a73SMark C. Prins * Register for events. 35bd120a73SMark C. Prins * 36157ba6c0Sgithub-actions[bot] * @param EventHandler $controller 3778ebf9c0SMark Prins * DokuWiki's event controller object. 38bd120a73SMark C. Prins */ 3978ebf9c0SMark Prins final public function register(EventHandler $controller): void 40bdfa1066SMark Prins { 417c452997SMark C. Prins // listen for page add / delete events 42bd120a73SMark C. Prins // http://www.dokuwiki.org/devel:event:indexer_page_add 43817f8be5SMark Prins $controller->register_hook('INDEXER_PAGE_ADD', 'BEFORE', $this, 'handleIndexerPageAdd'); 44817f8be5SMark Prins $controller->register_hook('IO_WIKIPAGE_WRITE', 'BEFORE', $this, 'removeFromIndex'); 45a9441f7dSMark C. Prins 46bd120a73SMark C. Prins // http://www.dokuwiki.org/devel:event:sitemap_generate 47817f8be5SMark Prins $controller->register_hook('SITEMAP_GENERATE', 'BEFORE', $this, 'handleSitemapGenerateBefore'); 487c452997SMark C. Prins // using after will only trigger us if a sitemap was actually created 49817f8be5SMark Prins $controller->register_hook('SITEMAP_GENERATE', 'AFTER', $this, 'handleSitemapGenerateAfter'); 507c452997SMark C. Prins 51a9441f7dSMark C. Prins // handle actions we know of 529fe665eaSgithub-actions[bot] $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handleActionActPreprocess', []); 53f8fde0daSMark C. Prins // handle HTML eg. /dokuwiki/doku.php?id=start&do=findnearby&geohash=u15vk4 5437f78197SMark Prins $controller->register_hook( 559fe665eaSgithub-actions[bot] 'TPL_ACT_UNKNOWN', 569fe665eaSgithub-actions[bot] 'BEFORE', 579fe665eaSgithub-actions[bot] $this, 589fe665eaSgithub-actions[bot] 'findnearby', 599fe665eaSgithub-actions[bot] ['format' => 'HTML'] 6037f78197SMark Prins ); 61f8fde0daSMark C. Prins // handles AJAX/json eg: jQuery.post("/dokuwiki/lib/exe/ajax.php?id=start&call=findnearby&geohash=u15vk4"); 6237f78197SMark Prins $controller->register_hook( 639fe665eaSgithub-actions[bot] 'AJAX_CALL_UNKNOWN', 649fe665eaSgithub-actions[bot] 'BEFORE', 659fe665eaSgithub-actions[bot] $this, 669fe665eaSgithub-actions[bot] 'findnearby', 679fe665eaSgithub-actions[bot] ['format' => 'JSON'] 6837f78197SMark Prins ); 697c452997SMark C. Prins 70a9441f7dSMark C. Prins // listen for media uploads and deletes 719fe665eaSgithub-actions[bot] $controller->register_hook('MEDIA_UPLOAD_FINISH', 'BEFORE', $this, 'handleMediaUploaded', []); 729fe665eaSgithub-actions[bot] $controller->register_hook('MEDIA_DELETE_FILE', 'BEFORE', $this, 'handleMediaDeleted', []); 7302c45c98SMark C. Prins 74817f8be5SMark Prins $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'handleMetaheaderOutput'); 754c9ad1fbSMark Prins $controller->register_hook('PLUGIN_POPULARITY_DATA_SETUP', 'AFTER', $this, 'popularity'); 76bd120a73SMark C. Prins } 77bd120a73SMark C. Prins 78bd120a73SMark C. Prins /** 79bd120a73SMark C. Prins * Update the spatial index for the page. 80a9441f7dSMark C. Prins * 81157ba6c0Sgithub-actions[bot] * @param Event $event 824ad8b75bSMark Prins * event object 83bd120a73SMark C. Prins */ 8478ebf9c0SMark Prins final public function handleIndexerPageAdd(Event $event): void 85bdfa1066SMark Prins { 867c452997SMark C. Prins // $event→data['page'] – the page id 877c452997SMark C. Prins // $event→data['body'] – empty, can be filled by additional content to index by your plugin 88817f8be5SMark Prins // $event→data['metadata'] – the metadata that shall be indexed. This is an array where the keys are the 89817f8be5SMark Prins // metadata indexes and the value a string or an array of strings with the values. 90817f8be5SMark Prins // title and relation_references will already be set. 919af1cdd4SMark C. Prins $id = $event->data ['page']; 924ad8b75bSMark Prins $indexer = plugin_load('helper', 'spatialhelper_index'); 939fe665eaSgithub-actions[bot] $indexer->updateSpatialIndex($id); 94bd120a73SMark C. Prins } 95bd120a73SMark C. Prins 96bd120a73SMark C. Prins /** 9734fb1e15SMark C. Prins * Update the spatial index, removing the page. 98a9441f7dSMark C. Prins * 99157ba6c0Sgithub-actions[bot] * @param Event $event 1004ad8b75bSMark Prins * event object 10134fb1e15SMark C. Prins */ 10278ebf9c0SMark Prins final public function removeFromIndex(Event $event): void 103bdfa1066SMark Prins { 1047c452997SMark C. Prins // event data: 1057c452997SMark C. Prins // $data[0] – The raw arguments for io_saveFile as an array. Do not change file path. 1067c452997SMark C. Prins // $data[0][0] – the file path. 1077c452997SMark C. Prins // $data[0][1] – the content to be saved, and may be modified. 1087c452997SMark C. Prins // $data[1] – ns: The colon separated namespace path minus the trailing page name. (false if root ns) 1097c452997SMark C. Prins // $data[2] – page_name: The wiki page name. 1107c452997SMark C. Prins // $data[3] – rev: The page revision, false for current wiki pages. 1117c452997SMark C. Prins 11278ebf9c0SMark Prins Logger::debug("Event data in removeFromIndex.", $event->data); 11334fb1e15SMark C. Prins if (@file_exists($event->data [0] [0])) { 11434fb1e15SMark C. Prins // file not new 11534fb1e15SMark C. Prins if (!$event->data [0] [1]) { 11634fb1e15SMark C. Prins // file is empty, page is being deleted 11734fb1e15SMark C. Prins if (empty($event->data [1])) { 11834fb1e15SMark C. Prins // root namespace 11934fb1e15SMark C. Prins $id = $event->data [2]; 12034fb1e15SMark C. Prins } else { 12134fb1e15SMark C. Prins $id = $event->data [1] . ":" . $event->data [2]; 12234fb1e15SMark C. Prins } 1234ad8b75bSMark Prins $indexer = plugin_load('helper', 'spatialhelper_index'); 1249fe665eaSgithub-actions[bot] if ($indexer !== null) { 12534fb1e15SMark C. Prins $indexer->deleteFromIndex($id); 12634fb1e15SMark C. Prins } 12734fb1e15SMark C. Prins } 12834fb1e15SMark C. Prins } 12934fb1e15SMark C. Prins } 13034fb1e15SMark C. Prins 13134fb1e15SMark C. Prins /** 13202c45c98SMark C. Prins * Add a new SitemapItem object that points to the KML of public geocoded pages. 13302c45c98SMark C. Prins * 134157ba6c0Sgithub-actions[bot] * @param Event $event 13502c45c98SMark C. Prins */ 13678ebf9c0SMark Prins final public function handleSitemapGenerateBefore(Event $event): void 137bdfa1066SMark Prins { 13800e20e07SMark C. Prins $path = mediaFN($this->getConf('media_kml')); 13902c45c98SMark C. Prins $lastmod = @filemtime($path); 140e48b49c1SMark Prins $event->data ['items'] [] = new Item(ml($this->getConf('media_kml'), '', true, '&', true), $lastmod); 14102c45c98SMark C. Prins } 14202c45c98SMark C. Prins 14302c45c98SMark C. Prins /** 144a9441f7dSMark C. Prins * Create a spatial sitemap or attach the geo/kml map to the sitemap. 145a9441f7dSMark C. Prins * 146157ba6c0Sgithub-actions[bot] * @param Event $event 1474ad8b75bSMark Prins * event object, not used 148bd120a73SMark C. Prins */ 14978ebf9c0SMark Prins final public function handleSitemapGenerateAfter(Event $event): bool 150bdfa1066SMark Prins { 151817f8be5SMark Prins // $event→data['items']: Array of SitemapItem instances, the array of sitemap items that already 152817f8be5SMark Prins // contains all public pages of the wiki 1537c452997SMark C. Prins // $event→data['sitemap']: The path of the file the sitemap will be saved to. 1549fe665eaSgithub-actions[bot] if (($helper = plugin_load('helper', 'spatialhelper_sitemap')) !== null) { 155f2601b07SMark C. Prins $kml = $helper->createKMLSitemap($this->getConf('media_kml')); 156f2601b07SMark C. Prins $rss = $helper->createGeoRSSSitemap($this->getConf('media_georss')); 15702c45c98SMark C. Prins 15896c9e758SMark Prins if (!empty($this->getConf('sitemap_namespaces'))) { 15996c9e758SMark Prins $namespaces = array_map('trim', explode("\n", $this->getConf('sitemap_namespaces'))); 16096c9e758SMark Prins foreach ($namespaces as $namespace) { 16196c9e758SMark Prins $kmlN = $helper->createKMLSitemap($namespace . $this->getConf('media_kml')); 16296c9e758SMark Prins $rssN = $helper->createGeoRSSSitemap($namespace . $this->getConf('media_georss')); 16378ebf9c0SMark Prins Logger::debug( 16478ebf9c0SMark Prins "handleSitemapGenerateAfter, created KML / GeoRSS sitemap in $namespace, succes: ", 16578ebf9c0SMark Prins $kmlN && $rssN 166817f8be5SMark Prins ); 16796c9e758SMark Prins } 16896c9e758SMark Prins } 16902c45c98SMark C. Prins return $kml && $rss; 17002c45c98SMark C. Prins } 17178ebf9c0SMark Prins return false; 1729af1cdd4SMark C. Prins } 1739af1cdd4SMark C. Prins 1749af1cdd4SMark C. Prins /** 1759af1cdd4SMark C. Prins * trap findnearby action. 17678ebf9c0SMark Prins * This additional handler is required as described at: https://www.dokuwiki.org/devel:event:tpl_act_unknown 177a9441f7dSMark C. Prins * 178157ba6c0Sgithub-actions[bot] * @param Event $event 1794ad8b75bSMark Prins * event object 1809af1cdd4SMark C. Prins */ 18178ebf9c0SMark Prins final public function handleActionActPreprocess(Event $event): void 182bdfa1066SMark Prins { 1834ad8b75bSMark Prins if ($event->data !== 'findnearby') { 184a9441f7dSMark C. Prins return; 1855fe9bc3cSScrutinizer Auto-Fixer } 1869af1cdd4SMark C. Prins $event->preventDefault(); 1879af1cdd4SMark C. Prins } 1889af1cdd4SMark C. Prins 1899af1cdd4SMark C. Prins /** 1909af1cdd4SMark C. Prins * handle findnearby action. 191a9441f7dSMark C. Prins * 192157ba6c0Sgithub-actions[bot] * @param Event $event 1934ad8b75bSMark Prins * event object 19478ebf9c0SMark Prins * @param array $param 195e4020312SMark C. Prins * associative array with keys 1969bb9b388SMark C. Prins * 'format'=> HTML | JSON 19778ebf9c0SMark Prins * @throws JsonException if anything goes wrong with JSON encoding 1989af1cdd4SMark C. Prins */ 19978ebf9c0SMark Prins final public function findnearby(Event $event, array $param): void 200bdfa1066SMark Prins { 2014ad8b75bSMark Prins if ($event->data !== 'findnearby') { 202a9441f7dSMark C. Prins return; 2035fe9bc3cSScrutinizer Auto-Fixer } 2049af1cdd4SMark C. Prins $event->preventDefault(); 2059fe665eaSgithub-actions[bot] $results = []; 2067c452997SMark C. Prins global $INPUT; 2079fe665eaSgithub-actions[bot] if (($helper = plugin_load('helper', 'spatialhelper_search')) !== null) { 208fd140697SMark C. Prins if ($INPUT->has('lat') && $INPUT->has('lon')) { 2097c452997SMark C. Prins $results = $helper->findNearbyLatLon($INPUT->param('lat'), $INPUT->param('lon')); 210fd140697SMark C. Prins } elseif ($INPUT->has('geohash')) { 211fd140697SMark C. Prins $results = $helper->findNearby($INPUT->str('geohash')); 2127c452997SMark C. Prins } else { 2139fe665eaSgithub-actions[bot] $results = ['error' => hsc($this->getLang('invalidinput'))]; 2149af1cdd4SMark C. Prins } 2159af1cdd4SMark C. Prins } 2169af1cdd4SMark C. Prins 2173e83b370SMark C. Prins $showMedia = $INPUT->bool('showMedia', true); 2183e83b370SMark C. Prins 219f8fde0daSMark C. Prins switch ($param['format']) { 2203e83b370SMark C. Prins case 'JSON': 2213e83b370SMark C. Prins $this->printJSON($results); 2223e83b370SMark C. Prins break; 2233e83b370SMark C. Prins case 'HTML': 2249892789dSMark C. Prins // fall through to default 2253e83b370SMark C. Prins default: 2263e83b370SMark C. Prins $this->printHTML($results, $showMedia); 2273e83b370SMark C. Prins break; 2283e83b370SMark C. Prins } 2293e83b370SMark C. Prins } 2303e83b370SMark C. Prins 2313e83b370SMark C. Prins /** 2323e83b370SMark C. Prins * Print seachresults as HTML lists. 2333e83b370SMark C. Prins * 2343e83b370SMark C. Prins * @param array $searchresults 23578ebf9c0SMark Prins * @throws JsonException if anything goes wrong with JSON encoding 2363e83b370SMark C. Prins */ 237bdfa1066SMark Prins private function printJSON(array $searchresults): void 238bdfa1066SMark Prins { 2393e83b370SMark C. Prins header('Content-Type: application/json'); 24078ebf9c0SMark Prins echo json_encode($searchresults, JSON_THROW_ON_ERROR | JSON_PRETTY_PRINT); 2413e83b370SMark C. Prins } 2423e83b370SMark C. Prins 2433e83b370SMark C. Prins /** 2443e83b370SMark C. Prins * Print seachresults as HTML lists. 2453e83b370SMark C. Prins * 2463e83b370SMark C. Prins * @param array $searchresults 2474ad8b75bSMark Prins * @param bool $showMedia 2483e83b370SMark C. Prins */ 249bdfa1066SMark Prins private function printHTML(array $searchresults, bool $showMedia = true): void 250bdfa1066SMark Prins { 2513e83b370SMark C. Prins $pages = (array)($searchresults ['pages']); 2523e83b370SMark C. Prins $media = (array)$searchresults ['media']; 253594a0ef1SMark C. Prins $lat = (float)$searchresults ['lat']; 254594a0ef1SMark C. Prins $lon = (float)$searchresults ['lon']; 2553e83b370SMark C. Prins $geohash = (string)$searchresults ['geohash']; 2563e83b370SMark C. Prins 2573e83b370SMark C. Prins if (isset($searchresults ['error'])) { 2589fe665eaSgithub-actions[bot] echo '<div class="level1"><p>' . hsc($searchresults ['error']) . '</p></div>'; 2593e83b370SMark C. Prins return; 2603e83b370SMark C. Prins } 2613e83b370SMark C. Prins 2623e83b370SMark C. Prins // print a HTML list 2639fe665eaSgithub-actions[bot] echo '<h1>' . $this->getLang('results_header') . '</h1>' . DOKU_LF; 2649fe665eaSgithub-actions[bot] echo '<div class="level1">' . DOKU_LF; 2659fe665eaSgithub-actions[bot] if ($pages !== []) { 2667c452997SMark C. Prins $pagelist = '<ol>' . DOKU_LF; 2677c452997SMark C. Prins foreach ($pages as $page) { 26837f78197SMark Prins $pagelist .= '<li>' . html_wikilink( 2699fe665eaSgithub-actions[bot] ':' . $page ['id'], 2709fe665eaSgithub-actions[bot] useHeading('navigation') ? null : 27137f78197SMark Prins noNS($page ['id']) 27237f78197SMark Prins ) . ' (' . $this->getLang('results_distance_prefix') 273817f8be5SMark Prins . $page ['distance'] . ' m) ' . $page ['description'] . '</li>' . DOKU_LF; 2747c452997SMark C. Prins } 2757c452997SMark C. Prins $pagelist .= '</ol>' . DOKU_LF; 2767c452997SMark C. Prins 2779fe665eaSgithub-actions[bot] echo '<h2>' . $this->getLang('results_pages') . hsc( 27837f78197SMark Prins ' lat;lon: ' . $lat . ';' . $lon 27937f78197SMark Prins . ' (geohash: ' . $geohash . ')' 28037f78197SMark Prins ) . '</h2>'; 2819fe665eaSgithub-actions[bot] echo '<div class="level2">' . DOKU_LF; 2829fe665eaSgithub-actions[bot] echo $pagelist; 2839fe665eaSgithub-actions[bot] echo '</div>' . DOKU_LF; 2849af1cdd4SMark C. Prins } else { 2859fe665eaSgithub-actions[bot] echo '<p>' . hsc($this->getLang('nothingfound')) . '</p>'; 2869af1cdd4SMark C. Prins } 287e4020312SMark C. Prins 2889fe665eaSgithub-actions[bot] if ($media !== [] && $showMedia) { 2897c452997SMark C. Prins $pagelist = '<ol>' . DOKU_LF; 2907c452997SMark C. Prins foreach ($media as $m) { 2919fe665eaSgithub-actions[bot] $opts = []; 29278ebf9c0SMark Prins $link = ml($m ['id'], $opts, false); 2939bb9b388SMark C. Prins $opts ['w'] = '100'; 2947c452997SMark C. Prins $src = ml($m ['id'], $opts); 29578ebf9c0SMark Prins $pagelist .= '<li><a href="' . $link . '"><img src="' . $src . '" alt=""></a> (' 29678ebf9c0SMark Prins . $this->getLang('results_distance_prefix') . $m ['distance'] . ' m) ' 297817f8be5SMark Prins . '</li>' . DOKU_LF; 298bd120a73SMark C. Prins } 2997c452997SMark C. Prins $pagelist .= '</ol>' . DOKU_LF; 3007c452997SMark C. Prins 3019fe665eaSgithub-actions[bot] echo '<h2>' . $this->getLang('results_media') . hsc( 30237f78197SMark Prins ' lat;lon: ' . $lat . ';' . $lon 30337f78197SMark Prins . ' (geohash: ' . $geohash . ')' 30437f78197SMark Prins ) . '</h2>' . DOKU_LF; 3059fe665eaSgithub-actions[bot] echo '<div class="level2">' . DOKU_LF; 3069fe665eaSgithub-actions[bot] echo $pagelist; 3079fe665eaSgithub-actions[bot] echo '</div>' . DOKU_LF; 3087c452997SMark C. Prins } 3099fe665eaSgithub-actions[bot] echo '<p>' . $this->getLang('results_precision') . $searchresults ['precision'] . ' m. '; 310594a0ef1SMark C. Prins if (strlen($geohash) > 1) { 31137f78197SMark Prins $url = wl( 3129fe665eaSgithub-actions[bot] getID(), 3139fe665eaSgithub-actions[bot] ['do' => 'findnearby', 'geohash' => substr($geohash, 0, -1)] 31437f78197SMark Prins ); 3159fe665eaSgithub-actions[bot] echo '<a href="' . $url . '" class="findnearby">' . $this->getLang('search_largerarea') . '</a>.</p>' 316817f8be5SMark Prins . DOKU_LF; 317594a0ef1SMark C. Prins } 3189fe665eaSgithub-actions[bot] echo '</div>' . DOKU_LF; 3197c452997SMark C. Prins } 3203e83b370SMark C. Prins 3217c452997SMark C. Prins /** 3227c452997SMark C. Prins * add media to spatial index. 3237c452997SMark C. Prins * 324157ba6c0Sgithub-actions[bot] * @param Event $event 325a9441f7dSMark C. Prins */ 32678ebf9c0SMark Prins final public function handleMediaUploaded(Event $event): void 327bdfa1066SMark Prins { 328*639d6e38SMark Prins //data[0] path/to/new/media.file (normally read from $_FILES, potentially could come from elsewhere) 3297c452997SMark C. Prins //data[1] file name of the file being uploaded 3307c452997SMark C. Prins //data[2] future directory id of the file being uploaded 3317c452997SMark C. Prins //data[3] the mime type of the file being uploaded 3327c452997SMark C. Prins //data[4] true if the uploaded file exists already 3337c452997SMark C. Prins //data[5] (since 2011-02-06) the PHP function used to move the file to the correct location 33402c45c98SMark C. Prins 33578ebf9c0SMark Prins Logger::debug("handleMediaUploaded::event data", $event->data); 336a9441f7dSMark C. Prins 337a9441f7dSMark C. Prins // check the list of mimetypes 338a9441f7dSMark C. Prins // if it's a supported type call appropriate index function 339*639d6e38SMark Prins if (str_contains($event->data [3], 'image/jpeg')) { 340a9441f7dSMark C. Prins $indexer = plugin_load('helper', 'spatialhelper_index'); 3419fe665eaSgithub-actions[bot] if ($indexer !== null) { 34204e54d1aSMark Prins $indexer->indexImage($event->data [2]); 343a9441f7dSMark C. Prins } 344a9441f7dSMark C. Prins } 3457c452997SMark C. Prins // TODO add image/tiff 346a9441f7dSMark C. Prins // TODO kml, gpx, geojson... 347a9441f7dSMark C. Prins } 348a9441f7dSMark C. Prins 349a9441f7dSMark C. Prins /** 350a9441f7dSMark C. Prins * removes the media from the index. 351157ba6c0Sgithub-actions[bot] * @param Event $event event object with data 352a9441f7dSMark C. Prins */ 35378ebf9c0SMark Prins final public function handleMediaDeleted(Event $event): void 354bdfa1066SMark Prins { 3557c452997SMark C. Prins // data['id'] ID data['unl'] unlink return code 3567c452997SMark C. Prins // data['del'] Namespace directory unlink return code 3577c452997SMark C. Prins // data['name'] file name data['path'] full path to the file 3587c452997SMark C. Prins // data['size'] file size 35902c45c98SMark C. Prins 3607c452997SMark C. Prins // remove the media id from the index 3614ad8b75bSMark Prins $indexer = plugin_load('helper', 'spatialhelper_index'); 3629fe665eaSgithub-actions[bot] if ($indexer !== null) { 3637c452997SMark C. Prins $indexer->deleteFromIndex('media__' . $event->data ['id']); 364a9441f7dSMark C. Prins } 365a9441f7dSMark C. Prins } 3667c452997SMark C. Prins 3677c452997SMark C. Prins /** 36802c45c98SMark C. Prins * add a link to the spatial sitemap files in the header. 36902c45c98SMark C. Prins * 370157ba6c0Sgithub-actions[bot] * @param Event $event the DokuWiki event. $event->data is a two-dimensional array of all meta headers. 37178ebf9c0SMark Prins * The keys are meta, link and script. 37202c45c98SMark C. Prins * 37302c45c98SMark C. Prins * @see http://www.dokuwiki.org/devel:event:tpl_metaheader_output 37402c45c98SMark C. Prins */ 37578ebf9c0SMark Prins final public function handleMetaheaderOutput(Event $event): void 376bdfa1066SMark Prins { 37702c45c98SMark C. Prins // TODO maybe test for exist 37878ebf9c0SMark Prins $event->data ["link"] [] = ["type" => "application/atom+xml", "rel" => "alternate", 37978ebf9c0SMark Prins "href" => ml($this->getConf('media_georss')), "title" => "Spatial ATOM Feed"]; 38078ebf9c0SMark Prins $event->data ["link"] [] = ["type" => "application/vnd.google-earth.kml+xml", "rel" => "alternate", 38178ebf9c0SMark Prins "href" => ml($this->getConf('media_kml')), "title" => "KML Sitemap"]; 38202c45c98SMark C. Prins } 38302c45c98SMark C. Prins 38402c45c98SMark C. Prins /** 3854c9ad1fbSMark Prins * Add spatialhelper popularity data. 3864c9ad1fbSMark Prins * 387157ba6c0Sgithub-actions[bot] * @param Event $event 3884c9ad1fbSMark Prins * the DokuWiki event 3894c9ad1fbSMark Prins */ 3909fe665eaSgithub-actions[bot] final public function popularity(Event $event): void 391bdfa1066SMark Prins { 392e2534c81SMark Prins $versionInfo = getVersionData(); 3934c9ad1fbSMark Prins $plugin_info = $this->getInfo(); 3944c9ad1fbSMark Prins $event->data['spatialhelper']['version'] = $plugin_info['date']; 395e2534c81SMark Prins $event->data['spatialhelper']['dwversion'] = $versionInfo['date']; 396e2534c81SMark Prins $event->data['spatialhelper']['combinedversion'] = $versionInfo['date'] . '_' . $plugin_info['date']; 3974c9ad1fbSMark Prins } 398bd120a73SMark C. Prins} 399