*/ if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../../').'/'); if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/'); require_once(DOKU_PLUGIN.'syntax.php'); // ---------- [ Settings ] ----------------------------------------- /** * All DokuWiki plugins to extend the parser/rendering mechanism * need to inherit from this class */ class syntax_plugin_googlemaps_googlemap extends DokuWiki_Syntax_Plugin { var $dflt = array( 'type' => 'map', 'width' => '', 'height' => '', 'lat' => -4.25, 'lon' => 55.833, 'zoom' => 8, 'controls' => 'on', 'kml' => 'off', ); function getInfo(){ return array( 'author' => 'Christopher Smith', 'email' => 'chris@jalakai.co.uk', 'date' => '2008-11-11', 'name' => 'Google Maps Plugin', 'desc' => 'Add maps to your wiki Syntax: overlaypoints', 'url' => 'http://www.dokuwiki.org/plugin:google_maps', ); } function getType() { return 'substition'; } function getPType() { return 'block'; } function getSort() { return 900; } function connectTo($mode) { $this->Lexer->addSpecialPattern('\n]*>.*?',$mode,'plugin_googlemaps_googlemap'); } function handle($match, $state, $pos, &$handler){ // break matched cdata into its components list($str_params,$str_points) = explode('>',substr($match,10,-12),2); $gmap = $this->_extract_params($str_params); $overlay = $this->_extract_points($str_points); // determine width and height (inline styles) for the map image if ($gmap['width'] || $gmap['height']) { $style = $gmap['width'] ? 'width: '.$gmap['width'].";" : ""; $style .= $gmap['height'] ? 'height: '.$gmap['height'].";" : ""; $style = "style='$style'"; } else { $style = ''; } // unset gmap values for width and height - they don't go into javascript unset($gmap['width'],$gmap['height']); // create a javascript parameter string for the map $param = ''; foreach ($gmap as $key => $val) { $param .= is_numeric($val) ? " $key : $val," : "$key : '".hsc($val)."',"; } if (!empty($param)) $param = substr($param,0,-1); // create a javascript serialisation of the point data $points = ''; if (!empty($overlay)) { foreach ($overlay as $data) { list($lat,$lon,$text) = $data; $points .= ",{lat:$lat,lon:$lon,txt:'$text'}"; } $points = ", overlay : [ ".substr($points,1)." ]"; } $js = "googlemap[googlemap.length] = {".$param.$points." };"; return array($style, $js); } function render($mode, &$renderer, $data) { static $initialised = false; // set to true after script initialisation if ($mode == 'xhtml') { list($style, $param) = $data; $script = ''; if (!$initialised) { $initialised = true; $script = $this->getConf('script').$this->getConf('key'); $script = ''; } $renderer->doc .= "
$script
"; } return false; } /** * extract parameters for the googlemap from the parameter string * * @param string $str_params string of key="value" pairs * @return array associative array of parameters key=>value */ function _extract_params($str_params) { $param = array(); preg_match_all('/(\w*)="(.*?)"/us',$str_params,$param,PREG_SET_ORDER); // parse match for instructions, break into key value pairs $gmap = $this->dflt; foreach($param as $kvpair) { list($match,$key,$val) = $kvpair; $key = strtolower($key); if (isset($gmap[$key])) $gmap[$key] = strtolower($val); } return $gmap; } /** * extract overlay points for the googlemap from the wiki syntax data * * @param string $str_points multi-line string of lat,lon,text triplets * @return array multi-dimensional array of lat,lon,text triplets */ function _extract_points($str_points) { $point = array(); preg_match_all('/^(.*?),(.*?),(.*)$/um',$str_points,$point,PREG_SET_ORDER); $overlay = array(); foreach ($point as $pt) { list($match,$lat,$lon,$text) = $pt; $lat = is_numeric($lat) ? $lat : 0; $lon = is_numeric($lon) ? $lon : 0; $text = addslashes(str_replace("\n","",p_render("xhtml",p_get_instructions($text),$info))); $overlay[] = array($lat,$lon,$text); } return $overlay; } }