xref: /plugin/geotag/action.php (revision 2be1c2ec3f4a86c4a206b8225db776d9b8371f30)
1c3b1bf17SMark C. Prins<?php
2c3b1bf17SMark C. Prins/*
331a26af0SMark C. Prins * Copyright (c) 2011-2016 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 */
24c3b1bf17SMark C. Prinsclass action_plugin_geotag extends DokuWiki_Action_Plugin {
25c3b1bf17SMark C. Prins
2681dae509SMark C. Prins    /**
2781dae509SMark C. Prins     * Register for events.
2881dae509SMark C. Prins     *
292b579309SMark C. Prins     * @param Doku_Event_Handler $controller
302b579309SMark C. Prins     *          DokuWiki's event controller object. Also available as global $EVENT_HANDLER
3181dae509SMark C. Prins     */
322b579309SMark C. Prins    public function register(Doku_Event_Handler $controller) {
33*2be1c2ecSMark Prins        $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'handleMetaheaderOutput');
3481dae509SMark C. Prins        $controller->register_hook('IO_WIKIPAGE_WRITE', 'BEFORE', $this, 'ping_geourl', array());
3594769ee6SMark C. Prins        if ($this->getConf('toolbar_icon')) {
36*2be1c2ecSMark Prins            $controller->register_hook('TOOLBAR_DEFINE', 'AFTER', $this, 'insertButton', array());
3794769ee6SMark C. Prins        }
38c3b1bf17SMark C. Prins    }
39c3b1bf17SMark C. Prins
4081dae509SMark C. Prins    /**
412b579309SMark C. Prins     * Retrieve metadata and add to the head of the page using appropriate meta tags.
422b579309SMark C. Prins     *
432b579309SMark C. Prins     * @param Doku_Event $event
442b579309SMark C. Prins     *          the DokuWiki event. $event->data is a two-dimensional
45a9539fccSMark C. Prins     *          array of all meta headers. The keys are meta, link and script.
4681dae509SMark C. Prins     * @param unknown_type $param
47a42972efSMark C. Prins     *
48a42972efSMark C. Prins     * @see http://www.dokuwiki.org/devel:event:tpl_metaheader_output
4981dae509SMark C. Prins     */
50*2be1c2ecSMark Prins    public function handleMetaheaderOutput(Doku_Event $event, $param) {
51c3b1bf17SMark C. Prins        global $ID;
5281dae509SMark C. Prins        $title = p_get_metadata($ID, 'title', true);
53c3b1bf17SMark C. Prins        $geotags = p_get_metadata($ID, 'geo', true);
54c3b1bf17SMark C. Prins        $region = $geotags ['region'];
55c3b1bf17SMark C. Prins        $lat = $geotags ['lat'];
56c3b1bf17SMark C. Prins        $lon = $geotags ['lon'];
572b579309SMark C. Prins        $alt = $geotags ['alt'];
58c3b1bf17SMark C. Prins        $country = $geotags ['country'];
59c3b1bf17SMark C. Prins        $placename = $geotags ['placename'];
60a42972efSMark C. Prins        $geohash = $geotags ['geohash'];
61c3b1bf17SMark C. Prins
62a42972efSMark C. Prins        if (!empty ($region)) {
632b579309SMark C. Prins            $event->data ['meta'] [] = array(
642b579309SMark C. Prins                    'name' => 'geo.region',
652b579309SMark C. Prins                    'content' => $region
662b579309SMark C. Prins            );
67a42972efSMark C. Prins        }
68a42972efSMark C. Prins        if (!empty ($placename)) {
692b579309SMark C. Prins            $event->data ['meta'] [] = array(
702b579309SMark C. Prins                    'name' => 'geo.placename',
712b579309SMark C. Prins                    'content' => $placename
722b579309SMark C. Prins            );
73a42972efSMark C. Prins        }
74a42972efSMark C. Prins        if (!(empty ($lat) && empty ($lon))) {
752b579309SMark C. Prins            if (!empty ($alt)) {
762b579309SMark C. Prins                $event->data ['meta'] [] = array(
772b579309SMark C. Prins                        'name' => 'geo.position',
782b579309SMark C. Prins                        'content' => $lat . ';' . $lon . ';' . $alt
792b579309SMark C. Prins                );
808eb104d9SMark C. Prins            } else {
818eb104d9SMark C. Prins                $event->data ['meta'] [] = array(
828eb104d9SMark C. Prins                        'name' => 'geo.position',
838eb104d9SMark C. Prins                        'content' => $lat . ';' . $lon
848eb104d9SMark C. Prins                );
852b579309SMark C. Prins            }
86a42972efSMark C. Prins        }
87a42972efSMark C. Prins        if (!empty ($country)) {
882b579309SMark C. Prins            $event->data ['meta'] [] = array(
892b579309SMark C. Prins                    'name' => 'geo.country',
902b579309SMark C. Prins                    'content' => $country
912b579309SMark C. Prins            );
92a42972efSMark C. Prins        }
93dfaf64a7SMark C. Prins        if (!(empty ($lat) && empty ($lon))) {
942b579309SMark C. Prins            $event->data ['meta'] [] = array(
952b579309SMark C. Prins                    'name' => "ICBM",
962b579309SMark C. Prins                    'content' => $lat . ', ' . $lon
972b579309SMark C. Prins            );
9842b5f05aSMark C. Prins            // icbm is generally useless without a DC.title,
9942b5f05aSMark C. Prins            // so we copy that from title unless it's empty...
100a42972efSMark C. Prins            if (!(empty ($title))) {
101b7214539SMark C. Prins                /*
102b7214539SMark C. Prins                 * don't specify the DC namespace as this is incomplete; it should be done at the
103b7214539SMark C. Prins                 * template level as it also needs a 'profile' attribute on the head/container,
104b7214539SMark C. Prins                 * see: http://dublincore.org/documents/dc-html/#sect-3.1.1
1051fdb6e09SMark Prins                 * $event->data ['link'] [] = array ('rel' => 'schema.DC',
1061fdb6e09SMark Prins                 * 'href' => 'http://purl.org/dc/elements/1.1/');
107b7214539SMark C. Prins                 */
1082b579309SMark C. Prins                $event->data ['meta'] [] = array(
1092b579309SMark C. Prins                        'name' => "DC.title",
1102b579309SMark C. Prins                        'content' => $title
1112b579309SMark C. Prins                );
112a42972efSMark C. Prins            }
113a42972efSMark C. Prins        }
114a42972efSMark C. Prins        if (!empty ($geohash)) {
1152b579309SMark C. Prins            $event->data ['meta'] [] = array(
1162b579309SMark C. Prins                    'name' => 'geo.geohash',
1172b579309SMark C. Prins                    'content' => $geohash
1182b579309SMark C. Prins            );
119c3b1bf17SMark C. Prins        }
120dfaf64a7SMark C. Prins    }
121dfaf64a7SMark C. Prins
12281dae509SMark C. Prins    /**
12362d582daSMark C. Prins     * Ping the geourl webservice with the url of the for indexing, only if the page is new.
124a42972efSMark C. Prins     *
1252b579309SMark C. Prins     * @param Doku_Event $event
1262b579309SMark C. Prins     *          the DokuWiki event
1272b579309SMark C. Prins     * @param mixed $param
1282b579309SMark C. Prins     *          not used
12981dae509SMark C. Prins     */
1301fdb6e09SMark Prins    public function ping_geourl(Doku_Event $event, $param) {
13195b11af8SMark C. Prins        global $ID;
13242b5f05aSMark C. Prins        // see: http://www.dokuwiki.org/devel:event:io_wikipage_write event data:
1331fdb6e09SMark Prins        if (!$this->getConf('geotag_pinggeourl')) {
1341fdb6e09SMark Prins            // config says don't ping
1351fdb6e09SMark Prins            return false;
1361fdb6e09SMark Prins        }
1371fdb6e09SMark Prins        if ($event->data [3]) {
1381fdb6e09SMark Prins            // old revision saved
1391fdb6e09SMark Prins            return false;
1401fdb6e09SMark Prins        }
1411fdb6e09SMark Prins        if (!$event->data [0] [1]) {
1421fdb6e09SMark Prins            // file/block is empty
1431fdb6e09SMark Prins            return false;
1441fdb6e09SMark Prins        }
1451fdb6e09SMark Prins        if (@file_exists($event->data [0] [0])) {
1461fdb6e09SMark Prins            // file not new
1471fdb6e09SMark Prins            return false;
1481fdb6e09SMark Prins        }
1491fdb6e09SMark Prins        if (p_get_metadata($ID, 'geo', true)) {
1501fdb6e09SMark Prins            // no geo metadata available, ping is useless
1511fdb6e09SMark Prins            return false;
1521fdb6e09SMark Prins        }
153c3b1bf17SMark C. Prins
15462d582daSMark C. Prins        $url = 'http://geourl.org/ping/?p=' . wl($ID, '', true);
155c3b1bf17SMark C. Prins        $http = new DokuHTTPClient();
15695b11af8SMark C. Prins        $result = $http->get($url);
1571fdb6e09SMark Prins        dbglog($result, "GeoURL Ping response for $url");
15895b11af8SMark C. Prins        return $result;
159c3b1bf17SMark C. Prins    }
16094769ee6SMark C. Prins
16194769ee6SMark C. Prins    /**
16294769ee6SMark C. Prins     * Inserts the toolbar button.
163a42972efSMark C. Prins     *
1642b579309SMark C. Prins     * @param Doku_Event $event
1652b579309SMark C. Prins     *          the DokuWiki event
16694769ee6SMark C. Prins     */
167*2be1c2ecSMark Prins    public function insertButton(Doku_Event $event, $param) {
16894769ee6SMark C. Prins        $event->data [] = array(
16994769ee6SMark C. Prins                'type' => 'format',
17094769ee6SMark C. Prins                'title' => $this->getLang('toolbar_desc'),
17194769ee6SMark C. Prins                'icon' => '../../plugins/geotag/images/geotag.png',
17294769ee6SMark C. Prins                'open' => '{{geotag>lat:',
17394769ee6SMark C. Prins                'sample' => '52.2345',
1742b579309SMark C. Prins                'close' => ', lon:7.521, alt: , placename: , country: , region: }}'
17594769ee6SMark C. Prins        );
17694769ee6SMark C. Prins    }
177c3b1bf17SMark C. Prins}
178