fix(M01): 별칭 복사 gather — 사용자 변수가 별칭과 이름이 겹치면 조용히 안 바꾸고 저장 막음
- 교차 검증 어긋남 1건(사용자가 별칭과 같은 이름의 입력·중간·덧줄을 새로 만들면 되돌릴 때 그 이름이 조용히 찾기() 원문으로 바뀌던 것) — gather 에서 별칭 이름을 그 순간의 입력·중간·덧줄 이름(_taken)과 견줘 겹치면 FormulaError(400) · 자동 이름 바꾸기는 화면 개입 없이는 어느 쪽 식인지 못 가려 안전하지 않아 넣지 않음 - 재현 시험 추가 · 전체 로직 1,354줄 펴고 되돌리기 어긋남 0건 재확인 · resources/master_data/ref/_검증_별칭_복사.md 에 「고친 뒤」 덧붙임
This commit is contained in:
@@ -243,8 +243,15 @@ def _line(where: str, kind: str, at: int, one: dict, text) -> dict:
|
||||
|
||||
|
||||
def gather(shown: dict, marks: list[dict]) -> dict:
|
||||
"""별칭 꼴 식 묶음 → 저장할 로직 한 줄. 별칭 원문은 부르기 하나여야 함(아무 글이나 못 넣음)."""
|
||||
"""별칭 꼴 식 묶음 → 저장할 로직 한 줄. 별칭 원문은 부르기 하나여야 함(아무 글이나 못 넣음).
|
||||
|
||||
사용자가 편집 중 별칭과 같은 이름의 입력·중간·덧줄을 새로 만들면(예: `메쌓기인력 = 1`)
|
||||
그 뒤로는 식 글 속 그 이름이 사용자 것인지 별칭인지 가릴 수 없음(둘 다 같은 토큰) —
|
||||
자동으로 별칭 쪽만 다시 이름 지어 피하려 하면 사용자가 실제로 쓴 자리를 건드릴 위험이
|
||||
있어(화면 개입 없이는 안전하게 못 가림) 조용히 바꾸지 않고 저장을 막음.
|
||||
"""
|
||||
raw_of: dict[str, str] = {}
|
||||
taken = _taken(shown) # 지금 입력·중간·덧줄에 실제로 있는 이름(사용자 것이 우선)
|
||||
for one in marks or []:
|
||||
name, raw = str(one.get("이름") or ""), str(one.get("원문") or "")
|
||||
if not name or not raw:
|
||||
@@ -253,6 +260,11 @@ def gather(shown: dict, marks: list[dict]) -> dict:
|
||||
raise mf.FormulaError(f"별칭 「{name}」 의 원문이 찾기·로직 부르기가 아님 — 「{raw}」")
|
||||
if name in raw_of and raw_of[name] != raw:
|
||||
raise mf.FormulaError(f"별칭 「{name}」 이 두 가지 원문을 가리킴")
|
||||
if name in taken:
|
||||
raise mf.FormulaError(
|
||||
f"「{name}」 을 입력·중간·덧줄 이름으로도 쓰고 별칭으로도 씀 — "
|
||||
"어느 쪽 식이 그 이름을 가리키는지 가릴 수 없음 · 이름을 바꿀 것"
|
||||
)
|
||||
raw_of[name] = raw
|
||||
out = copy.deepcopy(shown)
|
||||
for _, _, _, col, box in slots(out):
|
||||
|
||||
Reference in New Issue
Block a user