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