1c3b1bf17SMark C. Prins<?php 2c3b1bf17SMark C. Prins/* 342b5f05aSMark C. Prins * Copyright (c) 2011-2014 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 */ 172b579309SMark C. Prinsif (! defined ( 'DOKU_INC' )) 182b579309SMark C. Prins die (); 1962d582daSMark C. Prins 202b579309SMark C. Prinsif (! defined ( 'DOKU_PLUGIN' )) 212b579309SMark C. Prins define ( 'DOKU_PLUGIN', DOKU_INC . 'lib/plugins/' ); 2262d582daSMark C. Prinsrequire_once (DOKU_PLUGIN . 'action.php'); 23c3b1bf17SMark C. Prins 24c3b1bf17SMark C. Prins/** 25a42972efSMark C. Prins * DokuWiki Plugin geotag (Action Component). 26c3b1bf17SMark C. Prins * 2762d582daSMark C. Prins * @license BSD license 2830c0df9cSMark C. Prins * @author Mark C. Prins <mprins@users.sf.net> 29c3b1bf17SMark C. Prins */ 30c3b1bf17SMark C. Prinsclass action_plugin_geotag extends DokuWiki_Action_Plugin { 31c3b1bf17SMark C. Prins 3281dae509SMark C. Prins /** 3381dae509SMark C. Prins * Register for events. 3481dae509SMark C. Prins * 352b579309SMark C. Prins * @param Doku_Event_Handler $controller 362b579309SMark C. Prins * DokuWiki's event controller object. Also available as global $EVENT_HANDLER 3781dae509SMark C. Prins */ 382b579309SMark C. Prins public function register(Doku_Event_Handler $controller) { 39c3b1bf17SMark C. Prins $controller->register_hook ( 'TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'handle_metaheader_output' ); 4081dae509SMark C. Prins $controller->register_hook ( 'IO_WIKIPAGE_WRITE', 'BEFORE', $this, 'ping_geourl', array () ); 4194769ee6SMark C. Prins if ($this->getConf ( 'toolbar_icon' )) { 4294769ee6SMark C. Prins $controller->register_hook ( 'TOOLBAR_DEFINE', 'AFTER', $this, 'insert_button', array () ); 4394769ee6SMark C. Prins } 44c3b1bf17SMark C. Prins } 45c3b1bf17SMark C. Prins 4681dae509SMark C. Prins /** 472b579309SMark C. Prins * Retrieve metadata and add to the head of the page using appropriate meta tags. 482b579309SMark C. Prins * 492b579309SMark C. Prins * @param Doku_Event $event 502b579309SMark C. Prins * the DokuWiki event. $event->data is a two-dimensional 51a9539fccSMark C. Prins * array of all meta headers. The keys are meta, link and script. 5281dae509SMark C. Prins * @param unknown_type $param 53a42972efSMark C. Prins * 54a42972efSMark C. Prins * @see http://www.dokuwiki.org/devel:event:tpl_metaheader_output 5581dae509SMark C. Prins */ 56c3b1bf17SMark C. Prins public function handle_metaheader_output(Doku_Event &$event, $param) { 57c3b1bf17SMark C. Prins global $ID; 5881dae509SMark C. Prins $title = p_get_metadata ( $ID, 'title', true ); 59c3b1bf17SMark C. Prins $geotags = p_get_metadata ( $ID, 'geo', true ); 60c3b1bf17SMark C. Prins $region = $geotags ['region']; 61c3b1bf17SMark C. Prins $lat = $geotags ['lat']; 62c3b1bf17SMark C. Prins $lon = $geotags ['lon']; 632b579309SMark C. Prins $alt = $geotags ['alt']; 64c3b1bf17SMark C. Prins $country = $geotags ['country']; 65c3b1bf17SMark C. Prins $placename = $geotags ['placename']; 66a42972efSMark C. Prins $geohash = $geotags ['geohash']; 67c3b1bf17SMark C. Prins 68a42972efSMark C. Prins if (! empty ( $region )) { 692b579309SMark C. Prins $event->data ['meta'] [] = array ( 702b579309SMark C. Prins 'name' => 'geo.region', 712b579309SMark C. Prins 'content' => $region 722b579309SMark C. Prins ); 73a42972efSMark C. Prins } 74a42972efSMark C. Prins if (! empty ( $placename )) { 752b579309SMark C. Prins $event->data ['meta'] [] = array ( 762b579309SMark C. Prins 'name' => 'geo.placename', 772b579309SMark C. Prins 'content' => $placename 782b579309SMark C. Prins ); 79a42972efSMark C. Prins } 80a42972efSMark C. Prins if (! (empty ( $lat ) && empty ( $lon ))) { 812b579309SMark C. Prins if (! empty ( $alt )) { 822b579309SMark C. Prins $event->data ['meta'] [] = array ( 832b579309SMark C. Prins 'name' => 'geo.position', 842b579309SMark C. Prins 'content' => $lat . ';' . $lon . ';' . $alt 852b579309SMark C. Prins ); 868eb104d9SMark C. Prins } else { 878eb104d9SMark C. Prins $event->data ['meta'] [] = array ( 888eb104d9SMark C. Prins 'name' => 'geo.position', 898eb104d9SMark C. Prins 'content' => $lat . ';' . $lon 908eb104d9SMark C. Prins ); 912b579309SMark C. Prins } 92a42972efSMark C. Prins } 93a42972efSMark C. Prins if (! empty ( $country )) { 942b579309SMark C. Prins $event->data ['meta'] [] = array ( 952b579309SMark C. Prins 'name' => 'geo.country', 962b579309SMark C. Prins 'content' => $country 972b579309SMark C. Prins ); 98a42972efSMark C. Prins } 99dfaf64a7SMark C. Prins if (! (empty ( $lat ) && empty ( $lon ))) { 1002b579309SMark C. Prins $event->data ['meta'] [] = array ( 1012b579309SMark C. Prins 'name' => "ICBM", 1022b579309SMark C. Prins 'content' => $lat . ', ' . $lon 1032b579309SMark C. Prins ); 10442b5f05aSMark C. Prins // icbm is generally useless without a DC.title, 10542b5f05aSMark C. Prins // so we copy that from title unless it's empty... 106a42972efSMark C. Prins if (! (empty ( $title ))) { 107*b7214539SMark C. Prins /* 108*b7214539SMark C. Prins * don't specify the DC namespace as this is incomplete; it should be done at the 109*b7214539SMark C. Prins * template level as it also needs a 'profile' attribute on the head/container, 110*b7214539SMark C. Prins * see: http://dublincore.org/documents/dc-html/#sect-3.1.1 111*b7214539SMark C. Prins */ 112*b7214539SMark C. Prins // $event->data ['link'] [] = array ( 113*b7214539SMark C. Prins // 'rel' => 'schema.DC', 114*b7214539SMark C. Prins // 'href' => 'http://purl.org/dc/elements/1.1/' 115*b7214539SMark C. Prins // ); 1162b579309SMark C. Prins $event->data ['meta'] [] = array ( 1172b579309SMark C. Prins 'name' => "DC.title", 1182b579309SMark C. Prins 'content' => $title 1192b579309SMark C. Prins ); 120a42972efSMark C. Prins } 121a42972efSMark C. Prins } 122a42972efSMark C. Prins if (! empty ( $geohash )) { 1232b579309SMark C. Prins $event->data ['meta'] [] = array ( 1242b579309SMark C. Prins 'name' => 'geo.geohash', 1252b579309SMark C. Prins 'content' => $geohash 1262b579309SMark C. Prins ); 127c3b1bf17SMark C. Prins } 128dfaf64a7SMark C. Prins } 129dfaf64a7SMark C. Prins 13081dae509SMark C. Prins /** 13162d582daSMark C. Prins * Ping the geourl webservice with the url of the for indexing, only if the page is new. 132a42972efSMark C. Prins * 1332b579309SMark C. Prins * @param Doku_Event $event 1342b579309SMark C. Prins * the DokuWiki event 1352b579309SMark C. Prins * @param mixed $param 1362b579309SMark C. Prins * not used 13781dae509SMark C. Prins */ 13881dae509SMark C. Prins function ping_geourl(Doku_Event &$event, $param) { 13995b11af8SMark C. Prins global $ID; 14042b5f05aSMark C. Prins // see: http://www.dokuwiki.org/devel:event:io_wikipage_write event data: 14142b5f05aSMark C. Prins // $data[0] – The raw arguments for io_saveFile as an array. Do not change file path. 14242b5f05aSMark C. Prins // $data[0][0] – the file path. 14342b5f05aSMark C. Prins // $data[0][1] – the content to be saved, and may be modified. 14442b5f05aSMark C. Prins // $data[1] – ns: The colon separated namespace path minus the trailing page name. (false if root ns) 14542b5f05aSMark C. Prins // $data[2] – page_name: The wiki page name. 14642b5f05aSMark C. Prins // $data[3] – rev: The page revision, false for current wiki pages. 1472b579309SMark C. Prins if (! $this->getConf ( 'geotag_pinggeourl' )) 1482b579309SMark C. Prins return false; // config says don't ping 1492b579309SMark C. Prins if ($event->data [3]) 1502b579309SMark C. Prins return false; // old revision saved 1512b579309SMark C. Prins if (! $event->data [0] [1]) 1522b579309SMark C. Prins return false; // file is empty 15342b5f05aSMark C. Prins if (@file_exists ( $event->data [0] [0] )) 15442b5f05aSMark C. Prins return false; // file not new 1552b579309SMark C. Prins if (p_get_metadata ( $ID, 'geo', true )) 1562b579309SMark C. Prins return false; // no geo metadata available, ping is useless 157c3b1bf17SMark C. Prins 15862d582daSMark C. Prins $url = 'http://geourl.org/ping/?p=' . wl ( $ID, '', true ); 159c3b1bf17SMark C. Prins $http = new DokuHTTPClient (); 16095b11af8SMark C. Prins $result = $http->get ( $url ); 16142b5f05aSMark C. Prins // dbglog ( $result, "GeoURL Ping response for $url" ); 16295b11af8SMark C. Prins return $result; 163c3b1bf17SMark C. Prins } 16494769ee6SMark C. Prins 16594769ee6SMark C. Prins /** 16694769ee6SMark C. Prins * Inserts the toolbar button. 167a42972efSMark C. Prins * 1682b579309SMark C. Prins * @param Doku_Event $event 1692b579309SMark C. Prins * the DokuWiki event 17094769ee6SMark C. Prins */ 17194769ee6SMark C. Prins function insert_button(Doku_Event &$event, $param) { 17294769ee6SMark C. Prins $event->data [] = array ( 17394769ee6SMark C. Prins 'type' => 'format', 17494769ee6SMark C. Prins 'title' => $this->getLang ( 'toolbar_desc' ), 17594769ee6SMark C. Prins 'icon' => '../../plugins/geotag/images/geotag.png', 17694769ee6SMark C. Prins 'open' => '{{geotag>lat:', 17794769ee6SMark C. Prins 'sample' => '52.2345', 1782b579309SMark C. Prins 'close' => ', lon:7.521, alt: , placename: , country: , region: }}' 17994769ee6SMark C. Prins ); 18094769ee6SMark C. Prins } 181c3b1bf17SMark C. Prins} 182