xref: /plugin/spatialhelper/action.php (revision 157ba6c07d354ca81725664a622b24b5f9350bc4) !
1bd120a73SMark C. Prins<?php
29fe665eaSgithub-actions[bot]
3bd120a73SMark C. Prins/*
4e48b49c1SMark Prins * Copyright (c) 2011-2020 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     *
36*157ba6c0Sgithub-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     *
81*157ba6c0Sgithub-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     *
99*157ba6c0Sgithub-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     *
134*157ba6c0Sgithub-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, '&amp;', 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     *
146*157ba6c0Sgithub-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     *
178*157ba6c0Sgithub-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     *
192*157ba6c0Sgithub-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'] . '&nbsp;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'] . '&nbsp;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     *
324*157ba6c0Sgithub-actions[bot]     * @param Event $event
325a9441f7dSMark C. Prins     */
32678ebf9c0SMark Prins    final  public function handleMediaUploaded(Event $event): void
327bdfa1066SMark Prins    {
3287c452997SMark C. Prins        // data[0] temporary file name (read from $_FILES)
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
3397c452997SMark C. Prins        if (substr_compare($event->data [3], 'image/jpeg', 0)) {
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.
351*157ba6c0Sgithub-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     *
370*157ba6c0Sgithub-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     *
387*157ba6c0Sgithub-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