feat(800-2): 수식 변수 정의 영역 서버 — 정의 칸(안 탄 갈래 뺌 · 겹침 합침 · 열쇠 글 0) · 새 기호 연결 고침 · 후보 길

- 수식 응답 새 칸 정의 — 만약 탄 갈래 표지 걸림 그대로 · 같은 기호 한 줄 · 연결 사람 말 · 값 · 단위 · DB 열쇠 없음
- 고침 할일 연결(입력 · 표 · 요소 · 로직 · 상수) · 모르는 기호 까닭 · 후보 길 M01 · M02 equation/links
- 낡은 시험 test_796_1 「모르는 이름」 → 「모르는 기호」(까닭 문구 바뀜)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-07 16:46:39 +09:00
co-authored by Claude Sonnet 5.5
parent 972002417a
commit a262b43e83
10 changed files with 448 additions and 1 deletions
@@ -28,7 +28,9 @@ from pathlib import Path
import master_auto as ma
import master_cut as mcut
import master_equation_view as view
import master_formula as mf
import master_material as mm
from common_util.common_util_money import fmt
@@ -195,10 +197,18 @@ def _raw(node) -> str:
return me.raw_text(node)
def me_keyboard(ctx: _Ctx, node) -> str:
"""조건 식 마디 → 키보드 한 줄 글(변수 = 기호) — 정의 영역 「조건 규격 = 폼타이규격」."""
import master_equation_edit as me
return me.keyboard_of(_raw(node), ctx.row)
def _find(ctx: _Ctx, node, column: str) -> dict:
"""찾기(표, 조건).칸 → 찾기 변수 · 표 · 고른 행."""
raw = _raw(("field", node, column))
more = {"식": raw, "칸": column}
more["조건식"] = {k: me_keyboard(ctx, c) for k, c in node[2]}
try:
ref = mf.fill(node[1], ctx.env)
table_row = ctx.master.get(ref)
@@ -451,6 +461,11 @@ def export(master, key: str, given: dict | None = None, depth: int = 0) -> dict:
total = {k: cut.get(k) for k in mf.BUNDLE}
if depth == 0:
sub = {"소계": subtotals(row, cut, total)}
defs = (
{"정의": view.definitions(out_lines, row, table(row, master), _unused(row))}
if depth == 0
else {}
)
return _clean(
{
"열쇠": row.get("키"),
@@ -461,10 +476,18 @@ def export(master, key: str, given: dict | None = None, depth: int = 0) -> dict:
"변수표": table(row, master),
"합계": total,
**sub,
**defs,
}
)
def _unused(row: dict):
"""열쇠 → 어느 식에도 안 쓰이나(정의 영역 · 지울 수 있는 입력)."""
import master_equation_edit as me
return lambda key: key != mm.REGION and not me.uses(row, key)
def _item(ctx: _Ctx, at: int, item: dict, line: dict) -> dict:
"""호표 줄 = 「단가 × 수량식 = 금액」 · 로직 줄 단가 = 블록."""
name = str(item.get("이름") or "")