define('NL',"\n");
class O
{
public function __construct($a=null)
{
if(!$a)return;
$this->__load($a);
}
public function __load(&$a)
{
if(!is_array($a) && !is_object($a))
thr('Object passed to O is not iterable: '.var_export($a,1));
foreach($a AS $k => $v)$this->$k = $v;
return $this;
}
public function __get($n)
{
return null;
}
public function __toString()
{
return json_encode($this,JSON_UNESCAPED_UNICODE);
}
}
function g(&$a,$k,$def=null)
{
if(is_array($a) && isset($a[$k]))
return $a[$k];
if(is_object($a) && isset($a->$k))
return $a->$k;
return $def;
}
function post($n)
{
return g($_POST,$n);
}
function upart($n,$def='')
{
global $uparts;
if(empty($uparts))$uparts = explode(
'/',
preg_replace('/(^\/+|\/$|[\?\#].*)/','',trim(g($_GET,'__uri')))
);
return g($uparts,$n,$def);
}
function o($a=null){
$o = new O();
return $a ? $o->__load($a) : $o;
}
function thr($e)
{
throw new Exception($e);
}
function pr($a1,$a2=null)
{
if(!is_null($a2))
echo $a1.': ';
else $a2 =& $a1;
if(is_scalar($a2))
echo $a2.NL;
else print_r($a2);
}
function cl($a1,$a2=null,$color='#d70')
{
$data = $a1;
$caption = '';
if(!is_null($a2))
{
$caption = $a1;
$data = $a2;
}
$json = toJSON($data);
echo '';
}
function err($msg)
{
cl('ERROR',$msg,'#a00');
}
function db()
{
return DB::$DB;
}
function &fget($fname)
{
$s = file_get_contents($fname);
return $s;
}
function toJSON($obj,$pretty=false)
{
$flags = JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES;
if($pretty)$flags |= JSON_PRETTY_PRINT;
return json_encode($obj,$flags);
}
function readJSON($fname)
{
return o(json_decode(file_get_contents($fname)));
}
function assign(&$trg,&$src,$onlyKeys=null,$exceptKeys=null)
{
$tobj = is_object($trg);
foreach($src AS $k => $v)
{
if(($onlyKeys && !in_array($k, $onlyKeys))
|| ($exceptKeys && in_array($k, $exceptKeys)))
continue;
if($tobj)$trg->$k = $v;
else $trg[$k] = $v;
}
return $trg;
}
function isAssoc($arr)
{
if(is_object($arr))return true;
if (array() === $arr) return false;
return array_keys($arr) !== range(0, count($arr) - 1);
}
function initPath($path,$isFile=false){
if(file_exists($path))return $path;
if($isFile)
initPath(dirname($path));
else mkdir($path,0777,true);
return $path;
}
function filterKeys($arr,$keys)
{
normlist($keys);
$out = [];
foreach($keys AS $k)
if(isset($arr[$k]))
$out[$k] = $arr[$k];
return $out;
}
function normlist(&$list)
{
if(!is_array($list))
$list = explode(',',$list);
}
function isExternalURL($url)
{
return $url[0] != '/';
}
function getFileByURI($uri)
{
$file = WWW.$uri;
if(!file_exists($file))
thr('Resource not found: '.$uri);
return $file;
}
function signURI($uri)
{
if(isExternalURL($uri))return $uri;
return $uri.'?'.filemtime(getFileByURI($uri));
}
function css($uri,$inline=false)
{
if($inline)return css_inline($uri);
echo '';
}
function js($uri,$inline=false)
{
if($inline)return js_inline($uri);
echo '';
}
function js_inline($uri)
{
if(isExternalURL($uri))return js($uri);
echo '';
}
function css_inline($uri)
{
if(isExternalURL($uri))return js($uri);
echo '';
}
function jsvar($name,$obj)
{
echo '';
}
function initJsApp($t)
{
$data = o([
'pagename' => $t->pagename,
'modname' => $t->modname,
'modPath' => $t->modPath,
'jsPath' => $t->jsPath,
'mainJS' => $t->mainJS,
'release' => $t->release
]);
assign($data,$t->jsvars);
foreach($t->jsVarNames AS $n)
$data->$n = $t->$n;
jsvar('App',$data);
}
function svgSymbol($name)
{
return '';
}
function svgSymbols($dirname)
{
$sym = [];
foreach(scandir($dirname) AS $f)
{
if(substr($f,-4)!='.svg')continue;
$s =& fget($dirname.'/'.$f);
if(!preg_match('/