1c3b1bf17SMark C. Prins<?php 2c3b1bf17SMark C. Prins/* 3c3b1bf17SMark C. Prins * Copyright (c) 2011 Mark C. Prins <mc.prins@gmail.com> 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/** 19c3b1bf17SMark C. Prins * DokuWiki Plugin geotag (Action Component) 20c3b1bf17SMark C. Prins * 21c3b1bf17SMark C. Prins * @license BSD 22c3b1bf17SMark C. Prins * @author Mark C. Prins <mc.prins@gmail.com> 23c3b1bf17SMark C. Prins */ 24c3b1bf17SMark C. Prinsif (!defined('DOKU_INC')) die(); 25c3b1bf17SMark C. Prins 26c3b1bf17SMark C. Prinsif (!defined('DOKU_LF')) define('DOKU_LF', "\n"); 27c3b1bf17SMark C. Prinsif (!defined('DOKU_TAB')) define('DOKU_TAB', "\t"); 28c3b1bf17SMark C. Prinsif (!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/'); 29c3b1bf17SMark C. Prins 30c3b1bf17SMark C. Prinsrequire_once DOKU_PLUGIN.'action.php'; 31c3b1bf17SMark C. Prins 32c3b1bf17SMark C. Prinsclass action_plugin_geotag extends DokuWiki_Action_Plugin { 33c3b1bf17SMark C. Prins 3481dae509SMark C. Prins /** 3581dae509SMark C. Prins * Register for events. 3681dae509SMark C. Prins * 3781dae509SMark C. Prins * @param $controller DokuWiki's event controller object. Also available as global $EVENT_HANDLER 3881dae509SMark C. Prins */ 39c3b1bf17SMark C. Prins public function register(Doku_Event_Handler &$controller) { 40c3b1bf17SMark C. Prins $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'handle_metaheader_output'); 4181dae509SMark C. Prins $controller->register_hook('IO_WIKIPAGE_WRITE', 'BEFORE', $this, 'ping_geourl', array()); 42c3b1bf17SMark C. Prins } 43c3b1bf17SMark C. Prins 4481dae509SMark C. Prins /** 4581dae509SMark C. Prins * retrieve metadata and add to the head of the page using appropriate meta tags. 4681dae509SMark C. Prins * @param Doku_Event $event the DokuWiki event 4781dae509SMark C. Prins * @param unknown_type $param 4881dae509SMark C. Prins */ 49c3b1bf17SMark C. Prins public function handle_metaheader_output(Doku_Event &$event, $param) { 50e8ec65d2SMark C. Prins /* 51e8ec65d2SMark C. Prins * see: http://www.dokuwiki.org/devel:event:tpl_metaheader_output 52e8ec65d2SMark C. Prins * $data is a two-dimensional array of all meta headers. The keys are meta, link and script. 53e8ec65d2SMark C. Prins */ 54c3b1bf17SMark C. Prins global $ID; 5581dae509SMark C. Prins $title = p_get_metadata($ID,'title',true); 56c3b1bf17SMark C. Prins $geotags = p_get_metadata($ID,'geo',true); 57c3b1bf17SMark C. Prins $region=$geotags['region']; 58c3b1bf17SMark C. Prins $lat=$geotags['lat']; 59c3b1bf17SMark C. Prins $lon=$geotags['lon']; 60c3b1bf17SMark C. Prins $country=$geotags['country']; 61c3b1bf17SMark C. Prins $placename=$geotags['placename']; 62c3b1bf17SMark C. Prins 63c3b1bf17SMark C. Prins if (!empty($region)) {$event->data['meta'][] = array('name' => 'geo.region','content' => $region,);} 64c3b1bf17SMark C. Prins if (!empty($placename)) {$event->data['meta'][] = array('name' => 'geo.placename','content' => $placename,);} 65c3b1bf17SMark C. Prins if (!(empty($lat)&&empty($lon))) {$event->data['meta'][] = array('name' => 'geo.position','content' => $lat.';'.$lon,);} 66c3b1bf17SMark C. Prins if (!empty($country)) {$event->data['meta'][] = array('name' => 'geo.country','content' => $country,);} 67*dfaf64a7SMark C. Prins if (!(empty($lat)&&empty($lon))) { 68*dfaf64a7SMark C. Prins $event->data['meta'][] = array('name' => "ICBM",'content' => $lat.', '.$lon,); 69e8ec65d2SMark C. Prins // icbm is generally useless without a dc.title, so we copy that from title 7081dae509SMark C. Prins if (!(empty($title))) {$event->data['meta'][] = array('name' => "DC.title",'content' => $title);} 71c3b1bf17SMark C. Prins } 72c3b1bf17SMark C. Prins 73*dfaf64a7SMark C. Prins } 74*dfaf64a7SMark C. Prins 7581dae509SMark C. Prins /** 7681dae509SMark C. Prins * Ping the geourl webservice with th eurl of the for indexing. 7781dae509SMark C. Prins * @param Doku_Event $event the DokuWiki event 78e8ec65d2SMark C. Prins * @param array $param 7981dae509SMark C. Prins */ 8081dae509SMark C. Prins function ping_geourl(Doku_Event &$event, $param) { 81e8ec65d2SMark C. Prins /* 82e8ec65d2SMark C. Prins * see: http://www.dokuwiki.org/devel:event:io_wikipage_write 83e8ec65d2SMark C. Prins * $data[0] – The raw arguments for io_saveFile as an array. Do not change file path. 84e8ec65d2SMark C. Prins * $data[0][0] – the file path. 85e8ec65d2SMark C. Prins * $data[0][1] – the content to be saved, and may be modified. 86e8ec65d2SMark C. Prins * $data[1] – ns: The colon separated namespace path minus the trailing page name. (false if root ns) 87e8ec65d2SMark C. Prins * $data[2] – page_name: The wiki page name. 88e8ec65d2SMark C. Prins * $data[3] – rev: The page revision, false for current wiki pages. 89e8ec65d2SMark C. Prins */ 90c3b1bf17SMark C. Prins if (!$this->getConf('geotag_pinggeourl')) return false; // config says don't ping 91c3b1bf17SMark C. Prins if ($event->data[3]) return false; // old revision saved 92c3b1bf17SMark C. Prins if (@file_exists($event->data[0][0])) return false; // file not new 93c3b1bf17SMark C. Prins if (!$event->data[0][1]) return false; // file is empty 9481dae509SMark C. Prins if (p_get_metadata($ID,'geo',true)) return false; // no geo metadata available 95c3b1bf17SMark C. Prins 96c3b1bf17SMark C. Prins $request = 'p='.DOKU_URL; 97c3b1bf17SMark C. Prins $url = 'http://geourl.org/ping/'; 98c3b1bf17SMark C. Prins $header[] = 'Host: geourl.org'; 99c3b1bf17SMark C. Prins $header[] = 'Content-type: text/html'; 100c3b1bf17SMark C. Prins $header[] = 'Content-length: '.strlen($request); 101c3b1bf17SMark C. Prins 102c3b1bf17SMark C. Prins $http = new DokuHTTPClient(); 103c3b1bf17SMark C. Prins return $http->get($url, $request); 104c3b1bf17SMark C. Prins } 105c3b1bf17SMark C. Prins} 106