xref: /plugin/geotag/action.php (revision dfaf64a782c8d4a1bc7f6bf37c9dce9629e2b25a) !
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