--- MacroCheckBox
+++ MacroCheckBox
@@ -23,18 +23,18 @@
마크다운 표준(GFM)에서 체크박스는 `[ ]` / `[x]`로 표기한다.
[AhaMark]에서는 `[PageName]`이 페이지 링크 문법이므로 `[x]`를 그대로 쓰면 `x`라는 페이지로의 링크로 파싱된다.
이 충돌을 해결하기 위해 검토한 방안:
* `\[x]` (이스케이프): 체크박스가 아닌 리터럴 텍스트로만 표시됨 — 불가
* `` `[x]` `` (백틱): `<code>` 태그로 렌더링되어 체크박스 불가, 코드 표시 용도와 충돌 — 불가
* `[[CheckBox(x)]]` (매크로): 기존 `[[MacroName(argument)]]` 시스템에 그대로 통합 가능 — 채택
-빈 체크박스 `[ ]`는 어느 링크 대안에도 걸리지 않는다. 대상 자리가 `[^]\s]+` 인 것들은 공백을 못 먹고, 공백을 허용하는 `|` 대안(`[^]|]`)은 `|` 를 요구하는데 `[ ]` 에는 없다. 그래서 `[ ]` 를 체크박스로 가져가도 링크에서 빼앗는 것이 없다. 변환은 `InterpreterWiki.replaceLink` 가 링크를 처리하기 전에 먼저 한다.
+빈 체크박스 `[ ]`는 어느 링크 대안에도 걸리지 않는다. 대상 자리가 `[^]\s]+` 인 것들은 공백을 못 먹고, 공백을 허용하는 `|` 대안(`[^]|]`)은 `|` 를 요구하는데 `[ ]` 에는 없다. 2026-09-14 에 생긴, 괄호 안 전체를 이름으로 읽는 대안은 이름이 공백으로 시작하거나 끝나지 못하게 해 두었으니 공백 하나뿐인 `[ ]` 는 이름이 되지 못한다. 그래서 `[ ]` 를 체크박스로 가져가도 링크에서 빼앗는 것이 없다. 변환은 `InterpreterWiki.replaceLink` 가 링크를 처리하기 전에 먼저 한다.
'''`[x]` 와의 비대칭은 여기서 나온다.''' `[ ]` 는 링크 문법이 비워 둔 자리이고, `[x]` 는 이미 차지한 자리다. 문법 자체는 [InterpreterWiki] 의 Link 절과 `test/com/aha00a/logics/wikis/interpreters/InterpreterWikiLinkSpec.scala` 가 고정한다(후자는 `[ ]` 가 어떤 링크도 아님을 명시적으로 검사한다).
=== 구현
* `app/logics/wikis/macros/MacroCheckBox.scala` — 매크로 본체
* `app/logics/wikis/ExtractConvertInjectMacro.scala` — `CheckBox` 등록, `CB` 별칭 추가
* `app/logics/wikis/interpreters/InterpreterWiki.scala` — `[ ]` → 빈 체크박스 변환 (`replaceLink` 내)