You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

218 lines
6.0 KiB

<?php
// Default timezone
date_default_timezone_set('UTC');
ORM::configure('mysql:host=' . Config::$dbHost . ';dbname=' . Config::$dbName);
ORM::configure('username', Config::$dbUsername);
ORM::configure('password', Config::$dbPassword);
function friendly_url($url) {
return preg_replace(['/https?:\/\//','/\/$/'],'',$url);
}
function friendly_date($date_string, $tz_offset) {
if(!$date_string)
return '';
$date = new DateTime($date_string);
if($tz_offset > 0)
$date->add(new DateInterval('PT'.$tz_offset.'S'));
elseif($tz_offset < 0)
$date->sub(new DateInterval('PT'.abs($tz_offset).'S'));
$tz = ($tz_offset < 0 ? '-' : '+') . sprintf('%02d:%02d', abs($tz_offset/60/60), ($tz_offset/60)%60);
return $date->format('F j, Y H:i:s') . ' ' . $tz;
}
function format_date($date_string, $tz_offset) {
if(!$date_string)
return '';
$date = new DateTime($date_string);
if($tz_offset > 0)
$date->add(new DateInterval('PT'.$tz_offset.'S'));
elseif($tz_offset < 0)
$date->sub(new DateInterval('PT'.abs($tz_offset).'S'));
$tz = ($tz_offset < 0 ? '-' : '+') . sprintf('%02d:%02d', abs($tz_offset/60/60), ($tz_offset/60)%60);
return $date->format('Y-m-d H:i:s') . ' ' . $tz;
}
function build_url($parsed_url) {
$scheme = isset($parsed_url['scheme']) ? $parsed_url['scheme'] . '://' : '';
$host = isset($parsed_url['host']) ? $parsed_url['host'] : '';
$port = isset($parsed_url['port']) ? ':' . $parsed_url['port'] : '';
$user = isset($parsed_url['user']) ? $parsed_url['user'] : '';
$pass = isset($parsed_url['pass']) ? ':' . $parsed_url['pass'] : '';
$pass = ($user || $pass) ? "$pass@" : '';
$path = isset($parsed_url['path']) ? $parsed_url['path'] : '';
$query = isset($parsed_url['query']) ? '?' . $parsed_url['query'] : '';
$fragment = isset($parsed_url['fragment']) ? '#' . $parsed_url['fragment'] : '';
return "$scheme$user$pass$host$port$path$query$fragment";
}
// Input: Any URL or string like "aaronparecki.com"
// Output: Normlized URL (default to http if no scheme, force "/" path)
// or return false if not a valid URL
function normalize_url($url) {
$me = parse_url($url);
if(array_key_exists('path', $me) && $me['path'] == '')
return false;
// parse_url returns just "path" for naked domains
if(count($me) == 1 && array_key_exists('path', $me)) {
$me['host'] = $me['path'];
unset($me['path']);
}
if(!array_key_exists('scheme', $me))
$me['scheme'] = 'http';
if(!array_key_exists('path', $me))
$me['path'] = '/';
// Invalid scheme
if(!in_array($me['scheme'], array('http','https')))
return false;
return build_url($me);
}
// Checks if a string is a valid URL that we recognize as a PuSH topic or callback.
// Must be http or https
// If there is no path, '/' is assumed
function is_valid_push_url($url) {
$url = parse_url($url);
if(!array_key_exists('scheme', $url))
return false;
if(!in_array($url['scheme'], ['http','https']))
return false;
if(!array_key_exists('path', $url))
$url['path'] = '/';
return build_url($url);
}
function render($page, $data) {
global $app;
ob_start();
$app->render('layout.php', array_merge($data, array('page' => $page)));
return ob_get_clean();
};
function partial($template, $data=array(), $debug=false) {
global $app;
if($debug) {
$tpl = new Savant3(\Slim\Extras\Views\Savant::$savantOptions);
echo '<pre>' . $tpl->fetch($template . '.php') . '</pre>';
return '';
}
ob_start();
$tpl = new Savant3(\Slim\Extras\Views\Savant::$savantOptions);
foreach($data as $k=>$v) {
$tpl->{$k} = $v;
}
$tpl->display($template . '.php');
return ob_get_clean();
}
function json_response(&$app, $response) {
$app->response()['Content-Type'] = 'application/json';
$app->response()->body(json_encode($response));
}
function session($key) {
if(array_key_exists($key, $_SESSION))
return $_SESSION[$key];
else
return null;
}
function k($a, $k, $default=null) {
if(is_array($k)) {
$result = true;
foreach($k as $key) {
$result = $result && array_key_exists($key, $a);
}
return $result;
} else {
if(is_array($a) && array_key_exists($k, $a) && $a[$k])
return $a[$k];
elseif(is_object($a) && property_exists($a, $k) && $a->$k)
return $a->$k;
else
return $default;
}
}
function get_timezone($lat, $lng) {
try {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://timezone-api.geoloqi.com/timezone/'.$lat.'/'.$lng);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$tz = @json_decode($response);
if($tz)
return new DateTimeZone($tz->timezone);
} catch(Exception $e) {
return null;
}
return null;
}
function micropub_post($endpoint, $params, $access_token, $h='entry') {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $endpoint);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Authorization: Bearer ' . $access_token
));
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array_merge(array(
'h' => $h
), $params)));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);
$response = curl_exec($ch);
$error = curl_error($ch);
return array(
'response' => $response,
'error' => $error,
'curlinfo' => curl_getinfo($ch),
'status' => curl_getinfo($ch, CURLINFO_HTTP_CODE)
);
}
function relative_time($date) {
static $rel;
if(!isset($rel)) {
$config = array(
'language' => '\RelativeTime\Languages\English',
'separator' => ', ',
'suffix' => true,
'truncate' => 1,
);
$rel = new \RelativeTime\RelativeTime($config);
}
return $rel->timeAgo($date);
}
function bs()
{
static $pheanstalk;
if(!isset($pheanstalk)) {
$pheanstalk = new Pheanstalk\Pheanstalk(Config::$beanstalkServer, Config::$beanstalkPort);
}
return $pheanstalk;
}
function pluralize($word, $num) {
if($num == 1) {
return $word;
} else {
return $word . 's';
}
}