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