59 lines
1.6 KiB
Python
59 lines
1.6 KiB
Python
"""从文本/Cursor 回复中解析本地截图路径。"""
|
||
|
||
from __future__ import annotations
|
||
|
||
import re
|
||
from pathlib import Path
|
||
|
||
import env_config
|
||
|
||
IMAGE_SUFFIXES = (".png", ".jpg", ".jpeg", ".webp")
|
||
|
||
|
||
def _project_cwd() -> Path:
|
||
raw = env_config.env("CURSOR_CWD", r"d:\LY\test\tech") or r"d:\LY\test\tech"
|
||
return Path(raw).resolve()
|
||
|
||
|
||
def _resolve_candidate(raw: str, cwd: Path) -> Path | None:
|
||
cleaned = raw.strip().strip("`\"'[]()")
|
||
if not cleaned or cleaned.startswith("http"):
|
||
return None
|
||
path = Path(cleaned)
|
||
if not path.is_absolute():
|
||
path = cwd / path
|
||
try:
|
||
resolved = path.resolve()
|
||
except OSError:
|
||
return None
|
||
if resolved.is_file() and resolved.suffix.lower() in IMAGE_SUFFIXES:
|
||
return resolved
|
||
return None
|
||
|
||
|
||
def find_image_paths(text: str) -> list[Path]:
|
||
cwd = _project_cwd()
|
||
seen: set[Path] = set()
|
||
found: list[Path] = []
|
||
|
||
patterns = [
|
||
r"(?:保存(?:至|到)|saved\s+to|screenshot\s*[::])\s*([^\s\n\]]+\.(?:png|jpe?g|webp))",
|
||
r"([A-Za-z]:\\[^\s\n\]]+\.(?:png|jpe?g|webp))",
|
||
r"([^\s\n\]]+\.(?:png|jpe?g|webp))",
|
||
]
|
||
|
||
for pattern in patterns:
|
||
for match in re.finditer(pattern, text, re.IGNORECASE):
|
||
path = _resolve_candidate(match.group(1), cwd)
|
||
if path and path not in seen:
|
||
seen.add(path)
|
||
found.append(path)
|
||
|
||
return found
|
||
|
||
|
||
def strip_fake_image_markdown(text: str) -> str:
|
||
text = re.sub(r"^\s*\[图片\]\s*$", "", text, flags=re.MULTILINE)
|
||
text = re.sub(r"\n{3,}", "\n\n", text)
|
||
return text.strip()
|