xref: /plugin/geotag/action.php (revision a9083e48479e4912377f66d3cb02328135edf2b9)
1c3b1bf17SMark C. Prins<?php
2c3b1bf17SMark C. Prins/*
3*a9083e48SMark Prins * Copyright (c) 2011 Mark C. Prins <mprins@users.sf.net>
4c3b1bf17SMark C. Prins *
5c3b1bf17SMark C. Prins * Permission to use, copy, modify, and distribute this software for any
6c3b1bf17SMark C. Prins * purpose with or without fee is hereby granted, provided that the above
7c3b1bf17SMark C. Prins * copyright notice and this permission notice appear in all copies.
8c3b1bf17SMark C. Prins *
9c3b1bf17SMark C. Prins * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10c3b1bf17SMark C. Prins * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11c3b1bf17SMark C. Prins * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12c3b1bf17SMark C. Prins * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13c3b1bf17SMark C. Prins * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14c3b1bf17SMark C. Prins * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15c3b1bf17SMark C. Prins * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16c3b1bf17SMark C. Prins */
17c3b1bf17SMark C. Prins
18c3b1bf17SMark C. Prins/**
19a42972efSMark C. Prins * DokuWiki Plugin geotag (Action Component).
20c3b1bf17SMark C. Prins *
2162d582daSMark C. Prins * @license BSD license
2230c0df9cSMark C. Prins * @author  Mark C. Prins <mprins@users.sf.net>
23c3b1bf17SMark C. Prins */
24*a9083e48SMark Prinsclass action_plugin_geotag extends DokuWiki_Action_Plugin
25*a9083e48SMark Prins{
26c3b1bf17SMark C. Prins
2781dae509SMark C. Prins    /**
2881dae509SMark C. Prins     * Register for events.
2981dae509SMark C. Prins     *
302b579309SMark C. Prins     * @param Doku_Event_Handler $controller
312b579309SMark C. Prins     *          DokuWiki's event controller object. Also available as global $EVENT_HANDLER
3281dae509SMark C. Prins     */
33*a9083e48SMark Prins    final public function register(Doku_Event_Handler $controller): void
34*a9083e48SMark Prins    {
352be1c2ecSMark Prins        $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'handleMetaheaderOutput');
3694769ee6SMark C. Prins        if ($this->getConf('toolbar_icon')) {
372be1c2ecSMark Prins            $controller->register_hook('TOOLBAR_DEFINE', 'AFTER', $this, 'insertButton', array());
3894769ee6SMark C. Prins        }
393dfca210SMark Prins        $controller->register_hook('PLUGIN_POPULARITY_DATA_SETUP', 'AFTER', $this, 'popularity');
40c3b1bf17SMark C. Prins    }
41c3b1bf17SMark C. Prins
4281dae509SMark C. Prins    /**
432b579309SMark C. Prins     * Retrieve metadata and add to the head of the page using appropriate meta tags.
442b579309SMark C. Prins     *
452b579309SMark C. Prins     * @param Doku_Event $event
462b579309SMark C. Prins     *          the DokuWiki event. $event->data is a two-dimensional
47a9539fccSMark C. Prins     *          array of all meta headers. The keys are meta, link and script.
48a42972efSMark C. Prins     *
492ca95f77SMark Prins     * @see https://www.dokuwiki.org/devel:event:tpl_metaheader_output
5081dae509SMark C. Prins     */
51*a9083e48SMark Prins    final public function handleMetaheaderOutput(Doku_Event $event): void
52*a9083e48SMark Prins    {
53c3b1bf17SMark C. Prins        global $ID;
542ca95f77SMark Prins        $title     = p_get_metadata($ID, 'title', METADATA_RENDER_USING_SIMPLE_CACHE);
552ca95f77SMark Prins        $geotags   = p_get_metadata($ID, 'geo', METADATA_RENDER_USING_SIMPLE_CACHE) ?? array();
56*a9083e48SMark Prins        $region    = $geotags ['region'] ?? null;
57*a9083e48SMark Prins        $lat       = $geotags ['lat'] ?? null;
58*a9083e48SMark Prins        $lon       = $geotags ['lon'] ?? null;
59*a9083e48SMark Prins        $alt       = $geotags ['alt'] ?? null;
60*a9083e48SMark Prins        $country   = $geotags ['country'] ?? null;
61*a9083e48SMark Prins        $placename = $geotags ['placename'] ?? null;
62*a9083e48SMark Prins        $geohash   = $geotags ['geohash'] ?? null;
63c3b1bf17SMark C. Prins
64a42972efSMark C. Prins        if (!empty ($region)) {
652b579309SMark C. Prins            $event->data ['meta'] [] = array(
662b579309SMark C. Prins                'name'    => 'geo.region',
672b579309SMark C. Prins                'content' => $region
682b579309SMark C. Prins            );
69a42972efSMark C. Prins        }
70a42972efSMark C. Prins        if (!empty ($placename)) {
712b579309SMark C. Prins            $event->data ['meta'] [] = array(
722b579309SMark C. Prins                'name'    => 'geo.placename',
732b579309SMark C. Prins                'content' => $placename
742b579309SMark C. Prins            );
75a42972efSMark C. Prins        }
76a42972efSMark C. Prins        if (!(empty ($lat) && empty ($lon))) {
772b579309SMark C. Prins            if (!empty ($alt)) {
782b579309SMark C. Prins                $event->data ['meta'] [] = array(
792b579309SMark C. Prins                    'name'    => 'geo.position',
802b579309SMark C. Prins                    'content' => $lat . ';' . $lon . ';' . $alt
812b579309SMark C. Prins                );
828eb104d9SMark C. Prins            } else {
838eb104d9SMark C. Prins                $event->data ['meta'] [] = array(
848eb104d9SMark C. Prins                    'name'    => 'geo.position',
858eb104d9SMark C. Prins                    'content' => $lat . ';' . $lon
868eb104d9SMark C. Prins                );
872b579309SMark C. Prins            }
88a42972efSMark C. Prins        }
89a42972efSMark C. Prins        if (!empty ($country)) {
902b579309SMark C. Prins            $event->data ['meta'] [] = array(
912b579309SMark C. Prins                'name'    => 'geo.country',
922b579309SMark C. Prins                'content' => $country
932b579309SMark C. Prins            );
94a42972efSMark C. Prins        }
95dfaf64a7SMark C. Prins        if (!(empty ($lat) && empty ($lon))) {
962b579309SMark C. Prins            $event->data ['meta'] [] = array(
972b579309SMark C. Prins                'name'    => "ICBM",
982b579309SMark C. Prins                'content' => $lat . ', ' . $lon
992b579309SMark C. Prins            );
10042b5f05aSMark C. Prins            // icbm is generally useless without a DC.title,
10142b5f05aSMark C. Prins            // so we copy that from title unless it's empty...
102a42972efSMark C. Prins            if (!(empty ($title))) {
103b7214539SMark C. Prins                /*
104b7214539SMark C. Prins                 * don't specify the DC namespace as this is incomplete; it should be done at the
105b7214539SMark C. Prins                 * template level as it also needs a 'profile' attribute on the head/container,
106*a9083e48SMark Prins                 * see: https://dublincore.org/documents/dc-html/#sect-3.1.1
1071fdb6e09SMark Prins                 * $event->data ['link'] [] = array ('rel' => 'schema.DC',
1081fdb6e09SMark Prins                 * 'href' => 'http://purl.org/dc/elements/1.1/');
109b7214539SMark C. Prins                 */
1102b579309SMark C. Prins                $event->data ['meta'] [] = array(
1112b579309SMark C. Prins                    'name'    => "DC.title",
1122b579309SMark C. Prins                    'content' => $title
1132b579309SMark C. Prins                );
114a42972efSMark C. Prins            }
115a42972efSMark C. Prins        }
116a42972efSMark C. Prins        if (!empty ($geohash)) {
1172b579309SMark C. Prins            $event->data ['meta'] [] = array(
1182b579309SMark C. Prins                'name'    => 'geo.geohash',
1192b579309SMark C. Prins                'content' => $geohash
1202b579309SMark C. Prins            );
121c3b1bf17SMark C. Prins        }
122dfaf64a7SMark C. Prins    }
123dfaf64a7SMark C. Prins
12481dae509SMark C. Prins    /**
12594769ee6SMark C. Prins     * Inserts the toolbar button.
126a42972efSMark C. Prins     *
1272b579309SMark C. Prins     * @param Doku_Event $event
1282b579309SMark C. Prins     *          the DokuWiki event
12994769ee6SMark C. Prins     */
130*a9083e48SMark Prins    final public function insertButton(Doku_Event $event, array $param): void
131*a9083e48SMark Prins    {
13294769ee6SMark C. Prins        $event->data [] = array(
13394769ee6SMark C. Prins            'type'   => 'format',
13494769ee6SMark C. Prins            'title'  => $this->getLang('toolbar_desc'),
13594769ee6SMark C. Prins            'icon'   => '../../plugins/geotag/images/geotag.png',
13694769ee6SMark C. Prins            'open'   => '{{geotag>lat:',
13794769ee6SMark C. Prins            'sample' => '52.2345',
1382b579309SMark C. Prins            'close'  => ', lon:7.521, alt: , placename: , country: , region: }}'
13994769ee6SMark C. Prins        );
14094769ee6SMark C. Prins    }
1413dfca210SMark Prins
1423dfca210SMark Prins    /**
1433dfca210SMark Prins     * Add geotag popularity data.
1443dfca210SMark Prins     *
1453dfca210SMark Prins     * @param Doku_Event $event
1463dfca210SMark Prins     *          the DokuWiki event
1473dfca210SMark Prins     */
148*a9083e48SMark Prins    final public function popularity(Doku_Event $event): void
149*a9083e48SMark Prins    {
1503dfca210SMark Prins        global $updateVersion;
1513dfca210SMark Prins        $plugin_info                              = $this->getInfo();
1523dfca210SMark Prins        $event->data['geotag']['version']         = $plugin_info['date'];
1533dfca210SMark Prins        $event->data['geotag']['dwversion']       = $updateVersion;
1543dfca210SMark Prins        $event->data['geotag']['combinedversion'] = $updateVersion . '_' . $plugin_info['date'];
1553dfca210SMark Prins    }
156c3b1bf17SMark C. Prins}
157