$matches[1], 'path' => str_replace('__', '/', $matches[2]), ]; } function raijuPageIsValidContentKey(string $contentPage): bool { return raijuPageParseContentKey($contentPage) !== null; } function raijuPageJsonPath(string $root, string $lang, string $path): string { $key = raijuPageContentKey($lang, $path); return $key === '' ? '' : rtrim($root, '/\\') . '/content/pages/' . $key . '.json'; } function raijuPageTemplatePath(string $root, string $lang, string $path): string { $path = raijuPageNormalizePath($path); if (!preg_match('/^[a-z]{2}$/', $lang) || $path === '') { return ''; } return rtrim($root, '/\\') . '/' . $lang . '/' . $path . '.php'; } /** * Relative browser path from a clean page URL back to the site root. */ function raijuPageBasePath(string $path, bool $languagePrefixed): string { $path = raijuPageNormalizePath($path); if ($path === '') return ''; $urlSegments = substr_count($path, '/') + 1 + ($languagePrefixed ? 1 : 0); $requestPath = (string)parse_url($_SERVER['REQUEST_URI'] ?? '', PHP_URL_PATH); $directoryUrl = str_ends_with($requestPath, '/'); return str_repeat('../', max(0, $urlSegments - ($directoryUrl ? 0 : 1))); } function raijuPageUrlPath(string $lang, string $path, ?string $defaultLang = null): string { $path = raijuPageNormalizePath($path); if ($path === '') return ''; $defaultLang = $defaultLang ?: (defined('SITE_LANG_DEFAULT') ? SITE_LANG_DEFAULT : 'en'); if ($path === 'home') { return $lang === $defaultLang ? '/' : '/' . $lang . '/'; } return $lang === $defaultLang ? '/' . $path : '/' . $lang . '/' . $path; }