source: subversion/applications/utils/wiki-extensions/SimpleMap.php @ 7597

Last change on this file since 7597 was 7597, checked in by harrywood, 11 years ago

trim params + remove duplicate validation logic + error message typos

File size: 5.2 KB
Line 
1<?php
2# OpenStreetMap Simple Map - MediaWiki extension
3#
4# This defines what happens when <map> tag is placed in the wikitext
5#
6# We show a map image based on the lat/lon/zoom data passed in. Usage example:
7# <map>lat=51.485|lon=-0.15|z=11|w=300|h=200|format=jpeg</map>
8#
9# This file should be placed in the mediawiki 'extensions' directory
10# and then it needs to be 'included' within LocalSettings.php
11
12$wgExtensionFunctions[] = "wfmap";
13
14$wgExtensionCredits['parserhook'][] = array(
15                'name' => 'OpenStreetMap Simple Map Image',
16                'author' =>'[http://harrywood.co.uk Harry Wood]', 
17                'url' => 'http://wiki.openstreetmap.org/index.php/Simple_image_MediaWiki_Extension', 
18                'description' => 'Allows the use of the &lt;map&gt; tag to display a map image in an article. Maps are from [http://openstreetmap.org openstreetmap.org]'
19);
20
21
22function wfmap() {
23        global $wgParser;
24        # register the extension with the WikiText parser
25        # the first parameter is the name of the new tag.
26        # In this case it defines the tag <map> ... </map>
27        # The second parameter is the callback function for
28        # processing the text between the tags
29        $wgParser->setHook( "map", "map" );
30}
31
32# The callback function for converting the input text to HTML output
33function map( $input ) {
34        global $wgMapOfServiceUrl;
35       
36        //Parse pipe separated name value pairs (e.g. 'aaa=bbb|ccc=ddd')
37        $paramStrings=explode('|',$input);
38        foreach ($paramStrings as $paramString) {
39                $paramString = trim($paramString);
40                $eqPos = strpos($paramString,"=");
41                if ($eqPos===false) {
42                        $params[$paramString] = "true";
43                } else {
44                        $params[substr($paramString,0,$eqPos)] = trim(htmlspecialchars(substr($paramString,$eqPos+1)));
45                }
46        }
47
48
49        $lat    = $params["lat"];
50        $lon    = $params["lon"];
51        $zoom   = $params["z"];
52        $width  = $params["w"];
53        $height = $params["h"];
54        $format = $params["format"];
55
56        $error="";
57       
58        //default values (meaning these parameters can be missed out)
59        if ($width=="")  $width ="300"; 
60        if ($height=="") $height="200"; 
61        if ($format=="") $format="jpeg"; 
62       
63        if ($zoom=="") $zoom = $params["zoom"]; //see if they used 'zoom' rather than 'z' (and allow it)
64       
65        //trim of the 'px' on the end of pixel measurement numbers (ignore if present)
66        if (substr($width,-2)=="px")  $width = substr($width,0,-2);
67        if (substr($height,-2)=="px") $height = substr($height,0,-2);
68
69       
70        //Check required parameters values are provided
71        if ($lat=='') $error .= "Missing lat value (for the lattitude). ";
72        if ($lon=='') $error .= "Missing lon value (for the longitude). ";
73        if ($zoom=='') $error .= "Missing z value (for the zoom level). ";
74        if ($params['long']!='') $error .= "Please use 'lon' instead of 'long' (parameter was renamed). ";
75
76        if ($error=='') {
77                //no errors so far. Now check the values       
78               
79                if (!is_numeric($width)) {
80                        $error = "width (w) value '$width' is not a valid integer";
81                } else if (!is_numeric($height)) {
82                        $error = "height (h) value '$height' is not a valid integer";
83                } else if (!is_numeric($zoom)) {
84                        $error = "zoom (z) value '$zoom' is not a valid integer";
85                } else if (!is_numeric($lat)) {
86                        $error = "lattitude (lat) value '$lat' is not a valid number";
87                } else if (!is_numeric($lon)) {
88                        $error = "logiditude (lon) value '$lon' is not a valid number";
89                } else if ($width>1000) {
90                        $error = "width (w) value cannot be greater than 1000";
91                } else if ($width<50) {
92                        $error = "width (w) value cannot be less than 50";
93                } else if ($height>1000) {
94                        $error = "height (h) value cannot be greater than 1000";
95                } else if ($height<50) {
96                        $error = "height (h) value cannot be less than 50";
97                } else if ($lat>90) {
98                        $error = "lattitude (lat) value cannot be greater than 90";
99                } else if ($lat<-90) {
100                        $error = "lattitude (lat) value cannot be less than -90";
101                } else if ($lon>180) {
102                        $error = "longitude (lon) value cannot be greater than 180";
103                } else if ($lon<-180) {
104                        $error = "longitude (lon) value cannot be less than -180";
105                } else if ($zoom<0) {
106                        $error = "zoom (z) value cannot be less than zero";
107                } else if ($zoom==18) {
108                        $error =        "zoom (z) value cannot be greater than 17. ".
109                                                "Note that this mediawiki extension hooks into the OpenStreetMap 'osmarender' layer ".
110                                                "which does not go beyond zoom level 17. The Mapnik layer available on ".
111                                                "openstreetmap.org, goes up to zoom level 18";
112                } else if ($zoom>17) {
113                        $error = "zoom (z) value cannot be greater than 17.";
114                }
115        }
116       
117        if ($error!="") {
118                //Something was wrong. Spew the error message and input text.
119                $output  = "";
120                $output .= "<FONT COLOR=\"RED\"><B>map error:</B> " . $error . "</FONT><BR>\n";
121                $output .= htmlspecialchars($input);
122        } else {
123                //HTML for the openstreetmap image and link:
124                $output  = "";
125                $output .= "<div class=\"map\">";
126                $output .= "<a href=\"http://www.openstreetmap.org/?lat=".$lat."&lon=".$lon."&zoom=".$zoom."\" title=\"See this map on OpenStreetMap.org\" style=\"text-decoration:none\">";
127                $output .= "<img src=\"".$wgMapOfServiceUrl."lat=".$lat."&long=".$lon."&z=".$zoom."&w=".$width."&h=".$height."&format=".$format."\" width=\"". $width."\" height=\"".$height."\" border=\"0\"><br/>";
128                $output .= "<span style=\"font-size:60%; background-color:white; position:relative; top:-15px; /*width:150px; margin-right:-150px;*/\">OpenStreetMap - CC-BY-SA-2.0</span>";
129                $output .= "</a>\n";
130                $output .= "</div>";
131        }
132        return $output;
133}
134?>
Note: See TracBrowser for help on using the repository browser.