50 lines
1.4 KiB
Python
50 lines
1.4 KiB
Python
"""浏览器场景变量替换与 base URL 解析。"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import re
|
|
from urllib.parse import urlparse
|
|
|
|
import env_config
|
|
|
|
_VAR_PATTERN = re.compile(r"\{\{([A-Z0-9_]+)\}\}")
|
|
|
|
|
|
def interpolate(value: str) -> str:
|
|
def repl(match: re.Match[str]) -> str:
|
|
key = match.group(1)
|
|
resolved = env_config.env(key)
|
|
if resolved is None:
|
|
raise RuntimeError(f"场景变量未配置:{key}")
|
|
return resolved
|
|
|
|
return _VAR_PATTERN.sub(repl, value)
|
|
|
|
|
|
def default_base_url() -> str:
|
|
explicit = (env_config.env("PREVIEW_BASE_URL") or "").strip()
|
|
if explicit:
|
|
return interpolate(explicit.rstrip("/"))
|
|
|
|
preview = (env_config.env("PREVIEW_URL") or "").strip()
|
|
if preview:
|
|
parsed = urlparse(preview)
|
|
scheme = parsed.scheme or "http"
|
|
host = parsed.hostname or "127.0.0.1"
|
|
port = parsed.port
|
|
if port and port not in (80, 443):
|
|
return f"{scheme}://{host}:{port}"
|
|
return f"{scheme}://{host}"
|
|
|
|
port = env_config.env("PREVIEW_PORT", "5173") or "5173"
|
|
return f"http://127.0.0.1:{port}"
|
|
|
|
|
|
def resolve_url(base_url: str, target: str) -> str:
|
|
target = interpolate(target.strip())
|
|
if target.startswith("http://") or target.startswith("https://"):
|
|
return target
|
|
if not target.startswith("/"):
|
|
target = "/" + target
|
|
return base_url.rstrip("/") + target
|