app_paths.php
12.21 KB
<?php
if (!function_exists('wp_normalize_path')) {
function wp_normalize_path(string $path): string {
$path = '/' . ltrim(str_replace('\\', '/', $path), '/');
$path = preg_replace('#/+#', '/', $path) ?: '/';
if ($path !== '/' && substr($path, -1) === '/') {
$path = rtrim($path, '/');
}
return $path === '' ? '/' : $path;
}
}
if (!function_exists('wp_request_path')) {
function wp_request_path(): string {
$path = parse_url($_SERVER['REQUEST_URI'] ?? '/', PHP_URL_PATH);
$path = is_string($path) && $path !== '' ? $path : '/';
return wp_normalize_path($path);
}
}
if (!function_exists('wp_known_route_suffixes')) {
function wp_known_route_suffixes(): array {
static $suffixes = null;
if ($suffixes !== null) {
return $suffixes;
}
$suffixes = [
'/index.php',
'/dashboard',
'/clock',
'/calendar',
'/account',
'/profile',
'/settings',
'/login',
'/logout',
'/about',
'/password-change',
'/api/calendar',
'/api/changelog',
'/api/trutrak',
'/trutrak',
'/trutrak/map',
'/trutrak/assets',
'/trutrak/depots',
'/trutrak/geofences',
'/trutrak/waypoints',
'/trutrak/history',
'/admin',
'/admin/dashboard',
'/admin/dashbord',
'/admin/staff',
'/admin/calendar',
'/admin/trutrak',
'/admin/logs',
'/admin/maintenance',
'/admin/integrations',
'/admin/exports',
'/management',
'/management/index.php',
'/management/vehicles',
'/management/vehicals',
'/management/rota',
'/management/holidays',
'/management/incidents',
'/management/contacts',
'/management/alerts',
'/management/clock',
'/install',
'/pages/dashboard.php',
'/pages/clock.php',
'/pages/calendar.php',
'/pages/profile.php',
'/pages/settings.php',
'/pages/login.php',
'/pages/logout.php',
'/pages/about.php',
'/pages/password_change.php',
'/pages/calendar_api.php',
'/pages/changelog_api.php',
'/pages/trutrak_api.php',
'/pages/trutrak.php',
'/pages/trutrak/index.php',
'/pages/trutrak/map.php',
'/pages/trutrak/assets.php',
'/pages/trutrak/depots.php',
'/pages/trutrak/geofences.php',
'/pages/trutrak/waypoints.php',
'/pages/trutrak/history.php',
'/admin/index.php',
'/admin/dashboard.php',
'/admin/dashbord.php',
'/admin/staff_management.php',
'/admin/calendar_admin.php',
'/admin/trutrak.php',
'/admin/logs.php',
'/admin/maintenance.php',
'/admin/integrations.php',
'/admin/exports.php',
'/management/dashboard.php',
'/management/vehicles.php',
'/management/vehicals.php',
'/management/rota.php',
'/management/holidays.php',
'/management/incidents.php',
'/management/contacts.php',
'/management/alerts.php',
'/management/clock.php',
'/install/index.php',
];
$suffixes = array_values(array_unique(array_map('wp_normalize_path', $suffixes)));
usort($suffixes, static fn(string $a, string $b): int => strlen($b) <=> strlen($a));
return $suffixes;
}
}
if (!function_exists('app_base_path')) {
function app_base_path(): string {
static $base = null;
if ($base !== null) {
return $base;
}
$scriptName = wp_normalize_path((string)($_SERVER['SCRIPT_NAME'] ?? ''));
$scriptFile = (string)($_SERVER['SCRIPT_FILENAME'] ?? '');
$baseReal = realpath(defined('BASE_PATH') ? BASE_PATH : dirname(__DIR__));
$scriptReal = $scriptFile !== '' ? realpath($scriptFile) : false;
// Best source of truth: remove the currently executing PHP file path
// from SCRIPT_NAME. This works behind Apache rewrites and inside
// subfolders because clean URLs still execute a real PHP file.
if ($baseReal && $scriptReal && strpos($scriptReal, $baseReal) === 0) {
$relative = substr($scriptReal, strlen($baseReal));
$relative = wp_normalize_path($relative ?: '/index.php');
if ($relative !== '/' && substr($scriptName, -strlen($relative)) === $relative) {
$candidate = substr($scriptName, 0, -strlen($relative));
$base = rtrim(wp_normalize_path($candidate ?: '/'), '/');
if ($base === '/') $base = '';
return $base;
}
}
// Common rewrite fallback: SCRIPT_NAME points at index.php.
if (preg_match('#/index\.php$#i', $scriptName)) {
$base = rtrim(substr($scriptName, 0, -10), '/');
if ($base === '/') $base = '';
return $base;
}
// Last resort: strip a known application route suffix from REQUEST_URI.
$requestPath = wp_request_path();
foreach (wp_known_route_suffixes() as $suffix) {
if ($requestPath === $suffix) {
$base = '';
return $base;
}
if (substr($requestPath, -strlen($suffix)) === $suffix) {
$candidate = substr($requestPath, 0, -strlen($suffix));
$base = rtrim(wp_normalize_path($candidate ?: '/'), '/');
if ($base === '/') $base = '';
return $base;
}
}
$base = '';
return $base;
}
}
if (!function_exists('app_request_path')) {
function app_request_path(): string {
$requestPath = wp_request_path();
$base = app_base_path();
if ($base !== '' && strpos($requestPath, $base . '/') === 0) {
$requestPath = substr($requestPath, strlen($base));
} elseif ($base !== '' && $requestPath === $base) {
$requestPath = '/';
}
$requestPath = wp_normalize_path($requestPath);
static $aliases = [
'/index.php' => '/',
'/dashboard' => '/',
'/pages/dashboard.php' => '/',
'/pages/clock.php' => '/clock',
'/pages/calendar.php' => '/calendar',
'/pages/profile.php' => '/account',
'/profile' => '/account',
'/pages/settings.php' => '/settings',
'/pages/login.php' => '/login',
'/pages/logout.php' => '/logout',
'/pages/about.php' => '/about',
'/pages/password_change.php' => '/password-change',
'/pages/calendar_api.php' => '/api/calendar',
'/pages/changelog_api.php' => '/api/changelog',
'/pages/trutrak_api.php' => '/api/trutrak',
'/pages/trutrak.php' => '/trutrak',
'/pages/trutrak/index.php' => '/trutrak',
'/pages/trutrak/map.php' => '/trutrak/map',
'/pages/trutrak/assets.php' => '/trutrak/assets',
'/pages/trutrak/depots.php' => '/trutrak/depots',
'/pages/trutrak/geofences.php' => '/trutrak/geofences',
'/pages/trutrak/waypoints.php' => '/trutrak/waypoints',
'/pages/trutrak/history.php' => '/trutrak/history',
'/admin/index.php' => '/admin',
'/admin/dashboard.php' => '/admin',
'/admin/dashbord.php' => '/admin',
'/admin/staff_management.php' => '/admin/staff',
'/admin/calendar_admin.php' => '/admin/calendar',
'/admin/trutrak.php' => '/admin/trutrak',
'/admin/trutrak_mapping.php' => '/admin/trutrak',
'/admin/logs.php' => '/admin/logs',
'/admin/maintenance.php' => '/admin/maintenance',
'/admin/integrations.php' => '/admin/integrations',
'/admin/exports.php' => '/admin/exports',
'/admin/clock.php' => '/management/clock',
'/management/index.php' => '/management',
'/management/dashboard.php' => '/management',
'/management/staff.php' => '/admin/staff',
'/management/staff_profile.php' => '/admin/staff',
'/management/vehicles.php' => '/management/vehicles',
'/management/vehicals.php' => '/management/vehicles',
'/management/rota.php' => '/management/rota',
'/management/holidays.php' => '/management/holidays',
'/management/incidents.php' => '/management/incidents',
'/management/contacts.php' => '/management/contacts',
'/management/alerts.php' => '/management/alerts',
'/management/clock.php' => '/management/clock',
'/install/index.php' => '/install',
];
return $aliases[$requestPath] ?? $requestPath;
}
}
if (!function_exists('app_url')) {
function app_url(string $path = ''): string {
$base = app_base_path();
$path = trim($path);
if ($path === '' || $path === '/') {
return ($base !== '' ? $base : '') . '/';
}
return ($base !== '' ? $base : '') . '/' . ltrim($path, '/');
}
}
if (!function_exists('app_asset_url')) {
function app_asset_url(string $path = ''): string {
$path = ltrim($path, '/');
return app_url('assets' . ($path !== '' ? '/' . $path : ''));
}
}
if (!function_exists('app_api_url')) {
function app_api_url(string $path = ''): string {
$path = ltrim($path, '/');
return app_url('api' . ($path !== '' ? '/' . $path : ''));
}
}
if (!function_exists('app_redirect')) {
function app_redirect(string $path = '', int $status = 302): void {
header('Location: ' . app_url($path), true, $status);
exit;
}
}
if (!function_exists('wp_rewrite_output_paths')) {
function wp_rewrite_output_paths(string $buffer): string {
$base = app_base_path();
if ($base === '') {
return $buffer;
}
$buffer = preg_replace_callback(
'#\b(href|src|action|poster|data-url|data-href)=(["\'])/(?!/)([^"\']*)\2#i',
static function (array $m) use ($base): string {
$full = '/' . ltrim($m[3], '/');
if ($full === $base || strpos($full, $base . '/') === 0) {
return $m[0];
}
return $m[1] . '=' . $m[2] . $base . '/' . ltrim($m[3], '/') . $m[2];
},
$buffer
);
$buffer = preg_replace_callback(
'#url\((["\'])?/(?!/)([^)"\']+)(\1)?\)#i',
static function (array $m) use ($base): string {
$full = '/' . ltrim($m[2], '/');
if ($full === $base || strpos($full, $base . '/') === 0) {
return $m[0];
}
$q = $m[1] ?? '';
return 'url(' . $q . $base . '/' . ltrim($m[2], '/') . $q . ')';
},
$buffer
);
$root = app_url();
$buffer = str_replace(
['href="/"', "href='/'", 'src="/"', "src='/'", 'action="/"', "action='/'", 'content="/"', "content='/'"],
['href="' . $root . '"', "href='" . $root . "'", 'src="' . $root . '"', "src='" . $root . "'", 'action="' . $root . '"', "action='" . $root . "'", 'content="' . $root . '"', "content='" . $root . "'"],
$buffer
);
return $buffer;
}
}
if (!function_exists('app_boot_output_buffer')) {
function app_boot_output_buffer(): void {
static $started = false;
if ($started) {
return;
}
$started = true;
$requestPath = app_request_path();
$skip = [
'/api/calendar',
'/api/changelog',
'/api/trutrak',
'/pages/calendar_api.php',
'/pages/changelog_api.php',
'/pages/trutrak_api.php',
];
if (in_array($requestPath, $skip, true)) {
return;
}
ob_start('wp_rewrite_output_paths');
}
}