xref: /plugin/geotag/action.php (revision 94769ee6aa9a55fed6c2a1008e87029c359f62b7)
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 */
1762d582daSMark C. Prinsif (!defined('DOKU_INC')) die();
1862d582daSMark C. Prins
1962d582daSMark C. Prinsif (!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
2062d582daSMark C. Prinsrequire_once(DOKU_PLUGIN.'action.php');
21c3b1bf17SMark C. Prins
22c3b1bf17SMark C. Prins/**
23c3b1bf17SMark C. Prins * DokuWiki Plugin geotag (Action Component)
24c3b1bf17SMark C. Prins *
2562d582daSMark C. Prins * @license BSD license
26c3b1bf17SMark C. Prins * @author  Mark C. Prins <mc.prins@gmail.com>
27c3b1bf17SMark C. Prins */
28c3b1bf17SMark C. Prinsclass action_plugin_geotag extends DokuWiki_Action_Plugin {
29c3b1bf17SMark C. Prins
3081dae509SMark C. Prins	/**
3181dae509SMark C. Prins	 * Register for events.
3281dae509SMark C. Prins	 *
3381dae509SMark C. Prins	 * @param $controller DokuWiki's event controller object. Also available as global $EVENT_HANDLER
3481dae509SMark C. Prins	 */
35c3b1bf17SMark C. Prins	public function register(Doku_Event_Handler &$controller) {
36c3b1bf17SMark C. Prins		$controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'handle_metaheader_output');
3781dae509SMark C. Prins		$controller->register_hook('IO_WIKIPAGE_WRITE', 'BEFORE', $this, 'ping_geourl', array());
38*94769ee6SMark C. Prins		if($this->getConf('toolbar_icon')) {
39*94769ee6SMark C. Prins			$controller->register_hook('TOOLBAR_DEFINE', 'AFTER', $this, 'insert_button', array ());
40*94769ee6SMark C. Prins		}
41c3b1bf17SMark C. Prins	}
42c3b1bf17SMark C. Prins
4381dae509SMark C. Prins	/**
4481dae509SMark C. Prins	 * retrieve metadata and add to the head of the page using appropriate meta tags.
45a9539fccSMark C. Prins	 * @param Doku_Event $event the DokuWiki event. $event->data is a two-dimensional
46a9539fccSMark C. Prins	 * 	array of all meta headers. The keys are meta, link and script.
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,);}
67dfaf64a7SMark C. Prins		if (!(empty($lat)&&empty($lon))) {
68dfaf64a7SMark C. Prins			$event->data['meta'][] = array('name' => "ICBM",'content' => $lat.', '.$lon,);
697bc3879dSMark C. Prins			// icbm is generally useless without a dc.title, so we copy that from title unless empty
7081dae509SMark C. Prins			if (!(empty($title))) {$event->data['meta'][] = array('name' => "DC.title",'content' => $title);}
71c3b1bf17SMark C. Prins		}
72dfaf64a7SMark C. Prins	}
73dfaf64a7SMark C. Prins
7481dae509SMark C. Prins	/**
7562d582daSMark C. Prins	 * Ping the geourl webservice with the url of the for indexing, only if the page is new.
7681dae509SMark C. Prins	 * @param Doku_Event $event the DokuWiki event
777bc3879dSMark C. Prins	 * @param mixed $param not used
7881dae509SMark C. Prins	 */
7981dae509SMark C. Prins	function ping_geourl(Doku_Event &$event, $param) {
8095b11af8SMark C. Prins		global $ID;
81e8ec65d2SMark C. Prins		/*
82e8ec65d2SMark C. Prins		 * see: http://www.dokuwiki.org/devel:event:io_wikipage_write
837bc3879dSMark C. Prins		 * event data:
84e8ec65d2SMark C. Prins		 * $data[0] – The raw arguments for io_saveFile as an array. Do not change file path.
85e8ec65d2SMark C. Prins		 * $data[0][0] – the file path.
86e8ec65d2SMark C. Prins		 * $data[0][1] – the content to be saved, and may be modified.
87e8ec65d2SMark C. Prins		 * $data[1] – ns: The colon separated namespace path minus the trailing page name. (false if root ns)
88e8ec65d2SMark C. Prins		 * $data[2] – page_name: The wiki page name.
89e8ec65d2SMark C. Prins		 * $data[3] – rev: The page revision, false for current wiki pages.
90e8ec65d2SMark C. Prins		 */
91c3b1bf17SMark C. Prins		if (!$this->getConf('geotag_pinggeourl')) return false; // config says don't ping
92c3b1bf17SMark C. Prins		if ($event->data[3]) return false;                   // old revision saved
93c3b1bf17SMark C. Prins		if (@file_exists($event->data[0][0])) return false;  // file not new
94c3b1bf17SMark C. Prins		if (!$event->data[0][1]) return false;               // file is empty
9595b11af8SMark C. Prins		if (p_get_metadata($ID,'geo',true)) return false; // no geo metadata available, ping is useless
96c3b1bf17SMark C. Prins
9762d582daSMark C. Prins		$url = 'http://geourl.org/ping/?p='.wl($ID,'',true);
98c3b1bf17SMark C. Prins		$http = new DokuHTTPClient();
9995b11af8SMark C. Prins		$result = $http->get($url);
10062d582daSMark C. Prins		dbglog($result,"GeoURL Ping response for $url");
10195b11af8SMark C. Prins		return $result;
102c3b1bf17SMark C. Prins	}
103*94769ee6SMark C. Prins
104*94769ee6SMark C. Prins	/**
105*94769ee6SMark C. Prins	 * Inserts the toolbar button.
106*94769ee6SMark C. Prins	 * @param Doku_Event $event the DokuWiki event
107*94769ee6SMark C. Prins	 */
108*94769ee6SMark C. Prins	function insert_button(Doku_Event &$event, $param) {
109*94769ee6SMark C. Prins		$event->data[] = array (
110*94769ee6SMark C. Prins	        'type' => 'format',
111*94769ee6SMark C. Prins	        'title' => $this->getLang('toolbar_desc'),
112*94769ee6SMark C. Prins	        'icon' => '../../plugins/geotag/images/geotag.png',
113*94769ee6SMark C. Prins	        'open' => '{{geotag>lat:',
114*94769ee6SMark C. Prins			'sample' => '52.2345',
115*94769ee6SMark C. Prins	    	'close' => ', lon: , placename: , country: , region: }}'
116*94769ee6SMark C. Prins	    	);
117*94769ee6SMark C. Prins	}
118c3b1bf17SMark C. Prins}
119