gnu-social/vendor/embed/embed/src/Providers/Api/GoogleMaps.php

168 lines
4.6 KiB
PHP

<?php
namespace Embed\Providers\Api;
use Embed\Adapters\Adapter;
use Embed\Providers\Provider;
use Embed\Http\Url;
use Embed\Utils;
/**
* Provider to use the API of google.com
*/
class GoogleMaps extends Provider
{
protected $mode;
protected $config = [
'key' => null,
];
/**
* {@inheritdoc}
*/
public function __construct(Adapter $adapter)
{
parent::__construct($adapter);
$mode = $adapter->getResponse()->getUrl()->getDirectoryPosition(1);
// Default is view (if mode is not mentioned in the url)
$this->mode = 'view';
switch ($mode) {
case 'place':
case 'dir':
case 'search':
$this->mode = $mode;
break;
}
// check streetview mode
// simple check,- starts with @, ends with t
if ((substr($mode, 0, 1) === '@') && (substr($mode, -1) === 't')) {
$this->mode = 'streetview';
}
}
/**
* {@inheritdoc}
*/
public function getTitle()
{
$url = $this->adapter->getResponse()->getUrl();
if ($this->mode === 'place') {
return $url->getDirectoryPosition(2);
}
if ($this->mode === 'dir') {
return $url->getDirectoryPosition(2).' / '.$url->getDirectoryPosition(3);
}
}
/**
* {@inheritdoc}
*/
public function getProviderName()
{
return 'Google Maps';
}
/**
* {@inheritdoc}
*/
public function getCode()
{
$url = $this->adapter->getResponse()->getUrl();
$key = $this->adapter->getConfig('google[key]');
if (empty($key)) {
return;
}
switch ($this->mode) {
case 'view':
$pos = self::getPosition($this->mode, $url);
return Utils::iframe($url
->withPath('maps/embed/v1/'.$this->mode)
->withQueryParameters([
'center' => $pos['coordinates'],
'zoom' => $pos['zoom'],
'key' => $key,
]));
case 'streetview':
$pos = self::getPosition($this->mode, $url);
return Utils::iframe($url
->withPath('maps/embed/v1/'.$this->mode)
->withQueryParameters([
'location' => $pos['coordinates'],
'heading' => $pos['heading'],
'pitch' => $pos['pitch'],
'fov' => $pos['fov'],
'key' => $key,
]));
case 'place':
case 'search':
return Utils::iframe($url
->withPath('maps/embed/v1/'.$this->mode)
->withQueryParameters([
'q' => $url->getDirectoryPosition(2),
'key' => $key,
]));
case 'dir':
return Utils::iframe($url
->withPath('maps/embed/v1/directions')
->withQueryParameters([
'origin' => $url->getDirectoryPosition(2),
'destination' => $url->getDirectoryPosition(3),
'key' => $key,
]));
}
}
/**
* Returns parsed position data from url.
*
* @param string $mode The url mode
* @param Url $url
*
* @return array
*/
private static function getPosition($mode, Url $url)
{
// Set defaults
$position = [
'coordinates' => '',
'zoom' => '4',
'heading' => '0',
'pitch' => '0',
'fov' => '90'
];
if ($mode === 'view') {
$pos = explode(",", $url->getDirectoryPosition(1));
$position['coordinates'] = str_replace('@', '', $pos[0]).','.$pos[1];
$position['zoom'] = str_replace('z', "", $pos[2]);
}
if ($mode === 'streetview') {
$pos = explode(",", $url->getDirectoryPosition(1));
$position['coordinates'] = str_replace('@', '', $pos[0]).','.$pos[1];
$position['zoom'] = str_replace('a', '', $pos[2]); // seems not used by google (emulated by other params)
$position['heading'] = str_replace('h', '', $pos[4]);
$position['fov'] = str_replace('y', '', $pos[3]);
$pitch = str_replace('t', '', $pos[5]); // t is pitch but in 180% format
if (is_numeric($pitch)) {
$position['pitch'] = floatval($pitch) - 90;
}
}
return $position;
}
}