1c3b1bf17SMark C. Prins<?php 2c3b1bf17SMark C. Prins/* 3*a9083e48SMark Prins * Copyright (c) 2011 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 */ 17c3b1bf17SMark C. Prins 18c3b1bf17SMark C. Prins/** 19a42972efSMark C. Prins * DokuWiki Plugin geotag (Action Component). 20c3b1bf17SMark C. Prins * 2162d582daSMark C. Prins * @license BSD license 2230c0df9cSMark C. Prins * @author Mark C. Prins <mprins@users.sf.net> 23c3b1bf17SMark C. Prins */ 24*a9083e48SMark Prinsclass action_plugin_geotag extends DokuWiki_Action_Plugin 25*a9083e48SMark Prins{ 26c3b1bf17SMark C. Prins 2781dae509SMark C. Prins /** 2881dae509SMark C. Prins * Register for events. 2981dae509SMark C. Prins * 302b579309SMark C. Prins * @param Doku_Event_Handler $controller 312b579309SMark C. Prins * DokuWiki's event controller object. Also available as global $EVENT_HANDLER 3281dae509SMark C. Prins */ 33*a9083e48SMark Prins final public function register(Doku_Event_Handler $controller): void 34*a9083e48SMark Prins { 352be1c2ecSMark Prins $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'handleMetaheaderOutput'); 3694769ee6SMark C. Prins if ($this->getConf('toolbar_icon')) { 372be1c2ecSMark Prins $controller->register_hook('TOOLBAR_DEFINE', 'AFTER', $this, 'insertButton', array()); 3894769ee6SMark C. Prins } 393dfca210SMark Prins $controller->register_hook('PLUGIN_POPULARITY_DATA_SETUP', 'AFTER', $this, 'popularity'); 40c3b1bf17SMark C. Prins } 41c3b1bf17SMark C. Prins 4281dae509SMark C. Prins /** 432b579309SMark C. Prins * Retrieve metadata and add to the head of the page using appropriate meta tags. 442b579309SMark C. Prins * 452b579309SMark C. Prins * @param Doku_Event $event 462b579309SMark C. Prins * the DokuWiki event. $event->data is a two-dimensional 47a9539fccSMark C. Prins * array of all meta headers. The keys are meta, link and script. 48a42972efSMark C. Prins * 492ca95f77SMark Prins * @see https://www.dokuwiki.org/devel:event:tpl_metaheader_output 5081dae509SMark C. Prins */ 51*a9083e48SMark Prins final public function handleMetaheaderOutput(Doku_Event $event): void 52*a9083e48SMark Prins { 53c3b1bf17SMark C. Prins global $ID; 542ca95f77SMark Prins $title = p_get_metadata($ID, 'title', METADATA_RENDER_USING_SIMPLE_CACHE); 552ca95f77SMark Prins $geotags = p_get_metadata($ID, 'geo', METADATA_RENDER_USING_SIMPLE_CACHE) ?? array(); 56*a9083e48SMark Prins $region = $geotags ['region'] ?? null; 57*a9083e48SMark Prins $lat = $geotags ['lat'] ?? null; 58*a9083e48SMark Prins $lon = $geotags ['lon'] ?? null; 59*a9083e48SMark Prins $alt = $geotags ['alt'] ?? null; 60*a9083e48SMark Prins $country = $geotags ['country'] ?? null; 61*a9083e48SMark Prins $placename = $geotags ['placename'] ?? null; 62*a9083e48SMark Prins $geohash = $geotags ['geohash'] ?? null; 63c3b1bf17SMark C. Prins 64a42972efSMark C. Prins if (!empty ($region)) { 652b579309SMark C. Prins $event->data ['meta'] [] = array( 662b579309SMark C. Prins 'name' => 'geo.region', 672b579309SMark C. Prins 'content' => $region 682b579309SMark C. Prins ); 69a42972efSMark C. Prins } 70a42972efSMark C. Prins if (!empty ($placename)) { 712b579309SMark C. Prins $event->data ['meta'] [] = array( 722b579309SMark C. Prins 'name' => 'geo.placename', 732b579309SMark C. Prins 'content' => $placename 742b579309SMark C. Prins ); 75a42972efSMark C. Prins } 76a42972efSMark C. Prins if (!(empty ($lat) && empty ($lon))) { 772b579309SMark C. Prins if (!empty ($alt)) { 782b579309SMark C. Prins $event->data ['meta'] [] = array( 792b579309SMark C. Prins 'name' => 'geo.position', 802b579309SMark C. Prins 'content' => $lat . ';' . $lon . ';' . $alt 812b579309SMark C. Prins ); 828eb104d9SMark C. Prins } else { 838eb104d9SMark C. Prins $event->data ['meta'] [] = array( 848eb104d9SMark C. Prins 'name' => 'geo.position', 858eb104d9SMark C. Prins 'content' => $lat . ';' . $lon 868eb104d9SMark C. Prins ); 872b579309SMark C. Prins } 88a42972efSMark C. Prins } 89a42972efSMark C. Prins if (!empty ($country)) { 902b579309SMark C. Prins $event->data ['meta'] [] = array( 912b579309SMark C. Prins 'name' => 'geo.country', 922b579309SMark C. Prins 'content' => $country 932b579309SMark C. Prins ); 94a42972efSMark C. Prins } 95dfaf64a7SMark C. Prins if (!(empty ($lat) && empty ($lon))) { 962b579309SMark C. Prins $event->data ['meta'] [] = array( 972b579309SMark C. Prins 'name' => "ICBM", 982b579309SMark C. Prins 'content' => $lat . ', ' . $lon 992b579309SMark C. Prins ); 10042b5f05aSMark C. Prins // icbm is generally useless without a DC.title, 10142b5f05aSMark C. Prins // so we copy that from title unless it's empty... 102a42972efSMark C. Prins if (!(empty ($title))) { 103b7214539SMark C. Prins /* 104b7214539SMark C. Prins * don't specify the DC namespace as this is incomplete; it should be done at the 105b7214539SMark C. Prins * template level as it also needs a 'profile' attribute on the head/container, 106*a9083e48SMark Prins * see: https://dublincore.org/documents/dc-html/#sect-3.1.1 1071fdb6e09SMark Prins * $event->data ['link'] [] = array ('rel' => 'schema.DC', 1081fdb6e09SMark Prins * 'href' => 'http://purl.org/dc/elements/1.1/'); 109b7214539SMark C. Prins */ 1102b579309SMark C. Prins $event->data ['meta'] [] = array( 1112b579309SMark C. Prins 'name' => "DC.title", 1122b579309SMark C. Prins 'content' => $title 1132b579309SMark C. Prins ); 114a42972efSMark C. Prins } 115a42972efSMark C. Prins } 116a42972efSMark C. Prins if (!empty ($geohash)) { 1172b579309SMark C. Prins $event->data ['meta'] [] = array( 1182b579309SMark C. Prins 'name' => 'geo.geohash', 1192b579309SMark C. Prins 'content' => $geohash 1202b579309SMark C. Prins ); 121c3b1bf17SMark C. Prins } 122dfaf64a7SMark C. Prins } 123dfaf64a7SMark C. Prins 12481dae509SMark C. Prins /** 12594769ee6SMark C. Prins * Inserts the toolbar button. 126a42972efSMark C. Prins * 1272b579309SMark C. Prins * @param Doku_Event $event 1282b579309SMark C. Prins * the DokuWiki event 12994769ee6SMark C. Prins */ 130*a9083e48SMark Prins final public function insertButton(Doku_Event $event, array $param): void 131*a9083e48SMark Prins { 13294769ee6SMark C. Prins $event->data [] = array( 13394769ee6SMark C. Prins 'type' => 'format', 13494769ee6SMark C. Prins 'title' => $this->getLang('toolbar_desc'), 13594769ee6SMark C. Prins 'icon' => '../../plugins/geotag/images/geotag.png', 13694769ee6SMark C. Prins 'open' => '{{geotag>lat:', 13794769ee6SMark C. Prins 'sample' => '52.2345', 1382b579309SMark C. Prins 'close' => ', lon:7.521, alt: , placename: , country: , region: }}' 13994769ee6SMark C. Prins ); 14094769ee6SMark C. Prins } 1413dfca210SMark Prins 1423dfca210SMark Prins /** 1433dfca210SMark Prins * Add geotag popularity data. 1443dfca210SMark Prins * 1453dfca210SMark Prins * @param Doku_Event $event 1463dfca210SMark Prins * the DokuWiki event 1473dfca210SMark Prins */ 148*a9083e48SMark Prins final public function popularity(Doku_Event $event): void 149*a9083e48SMark Prins { 1503dfca210SMark Prins global $updateVersion; 1513dfca210SMark Prins $plugin_info = $this->getInfo(); 1523dfca210SMark Prins $event->data['geotag']['version'] = $plugin_info['date']; 1533dfca210SMark Prins $event->data['geotag']['dwversion'] = $updateVersion; 1543dfca210SMark Prins $event->data['geotag']['combinedversion'] = $updateVersion . '_' . $plugin_info['date']; 1553dfca210SMark Prins } 156c3b1bf17SMark C. Prins} 157