to _env.php and check the settings inside!"); } } else { if (DEBUG) { require_once __DIR__ . '/_env.php'; $root = json_encode(ESP_IP); } } define('JS_WEB_ROOT', $root); define('ESP_PROD', (bool)getenv('ESP_PROD')); define('ESP_DEMO', (bool)getenv('ESP_DEMO')); if (ESP_DEMO) { define('DEMO_APS', <<path; if (DEBUG) return "/index.php?page=$name"; if (ESP_DEMO) return "$name.html"; else return $_pages[$name]->path; } /** URL label for a button */ function label($name) { global $_pages; return $_pages[$name]->label; } function e($s) { return htmlspecialchars($s, ENT_HTML5 | ENT_QUOTES); } function je($s) { return htmlspecialchars(json_encode($s), ENT_HTML5); } function tr($key) { global $_messages, $_messages_fallback, $_messages_common; if (isset($_messages[$key])) { $str = $_messages[$key]; } else if (isset($_messages_fallback[$key])) { $str = $_messages_fallback[$key]; } else if (isset($_messages_common[$key])) { $str = $_messages_common[$key]; } else{ ob_end_clean(); die('??' . $key . '??'); } // allow tildes in translation $str = preg_replace('/(?<=[^ \\\\])~(?=[^ ])/', ' ', $str); $str = str_replace('\~', '~', $str); return $str; } /** Like eval, but allows */ function include_str($code) { $tmp = tmpfile(); $tmpf = stream_get_meta_data($tmp); $tmpf = $tmpf ['uri']; fwrite($tmp, $code); $ret = include($tmpf); fclose($tmp); return $ret; } if (!function_exists('utf8')) { function utf8($num) { if($num<=0x7F) return chr($num); if($num<=0x7FF) return chr(($num>>6)+192).chr(($num&63)+128); if($num<=0xFFFF) return chr(($num>>12)+224).chr((($num>>6)&63)+128).chr(($num&63)+128); if($num<=0x1FFFFF) return chr(($num>>18)+240).chr((($num>>12)&63)+128).chr((($num>>6)&63)+128).chr(($num&63)+128); return ''; } } if (!function_exists('load_esp_charsets')) { function load_esp_charsets() { $chsf = __DIR__ . '/../user/character_sets.h'; if (! file_exists($chsf)) { return [ '!! ERROR: `../user/character_sets.h` not found !!' => [ 'start' => 65, 'chars' => ['&'], ], ]; } $re_table = '/\/\/ %%BEGIN:(.)%%\s*(.*?)\s*\/\/ %%END:\1%%/s'; preg_match_all($re_table, file_get_contents($chsf), $m_tbl); $re_bounds = '/#define CODEPAGE_(.)_BEGIN\s+(\d+)\n#define CODEPAGE_\1_END\s+(\d+)/'; preg_match_all($re_bounds, file_get_contents($chsf), $m_bounds); $cps = []; foreach ($m_tbl[2] as $i => $str) { $name = $m_tbl[1][$i]; $start = intval($m_bounds[2][$i]); $table = []; $str = preg_replace('/,\s*\/\/[^\n]*/', '', $str); $rows = explode("\n", $str); $rows = array_map('trim', $rows); foreach($rows as $j => $v) { $literal = false; if (strpos($v, '0x') === 0) { // hexa codes $v = substr($v, 2); $v = hexdec($v); } else if (strpos($v, 'u\'\\0\'') === 0) { // zero $v = 0; } else if (strpos($v, 'u\'') === 0) { // utf8 literals $v = mb_substr($v, 2, 1, 'utf-8'); $literal = true; } else { $v = intval($v); } $ascii = $start+$j; $table[] = $literal ? $v : utf8($v==0? $ascii :$v); } $obj = [ 'start' => $start, 'chars' => $table, ]; $cps[$name] = $obj; } return $cps; } } if (!function_exists('tplSubs')) { function tplSubs($str, $reps) { return preg_replace_callback('/%(j:|js:|h:|html:)?([a-z0-9-_.]+)%/i', function ($m) use ($reps) { $key = $m[2]; if (array_key_exists($key, $reps)) { $val = $reps[$key]; } else { $val = ''; } switch ($m[1]) { case 'j:': case 'js:': $v = json_encode($val); return substr($v, 1, strlen($v) - 2); case 'h:': case 'html:': return htmlspecialchars($val); default: return $val; } }, $str); } }