BROOKO icon
BROOKO UK NETWORK
Where code meets creativity & adventure
File viewer

app_paths.php

Type
php
Size
12.21 KB
Modified
15 May
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');
    }
}