From 26446d5e6b4af869d6efc3a80f4ceb8af2c16228 Mon Sep 17 00:00:00 2001 From: ksj09406 Date: Fri, 11 Sep 2026 16:01:58 +0900 Subject: [PATCH] =?UTF-8?q?5=EC=B0=A8=20B-1:=20XAML=20=ED=83=9C=EA=B7=B8?= =?UTF-8?q?=C2=B7=EC=86=8D=EC=84=B1=C2=B7=EA=B0=92=EC=9D=84=20=EA=B0=88?= =?UTF-8?q?=EB=9D=BC=20=EC=B9=A0=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 실제 소스에 XAML 이 400개 42,477줄인데 여태 주석과 따옴표만 알아봐서 사실상 평문이었다. 마크업 전용 토크나이저를 따로 뒀다. 기존 토크나이저에 못 얹은 까닭은 규칙이 다르기 때문이다. 그쪽은 낱말을 읽어 예약어 표와 맞춰 보는데, 마크업은 같은 Content 가 꺾쇠 안에서는 속성 이름이고 밖에서는 그냥 글자다. 낱말이 무엇이냐가 아니라 어디에 있느냐로 갈린다. 줄 넘김 상태를 bool 하나에서 깃발 묶음(CarryOver)으로 넓혔다. XAML 은 여는 태그가 여러 줄에 걸치는 것이 보통이라 - 시험에 쓴 실제 파일은 첫 태그 하나가 14줄이다 - "지금 꺾쇠 안이다"를 안 넘기면 이어지는 줄의 속성이 그냥 글자로 보인다. 부르는 자리 다섯을 모두 바꿨다. 색은 새로 만들지 않고 이미 있는 갈래에 얹었다. 태그는 예약어 색, 속성 이름은 메서드 색, 값은 문자열 색, 앞가지는 타입 색이다. 태그 밖의 본문은 일부러 안 칠한다. 붙이는 중에 파일 비교 화면이 통째로 비어서 뜨는 일이 있었다. 의존 속성 타입을 bool 에서 CarryOver 로 바꾸면서 기본값 false 를 같이 안 고쳤다. 빌드도 통과하고 로그에도 안 남는다. 같은 주의를 코드 옆에 적어 뒀다. 실제 저장소 XAML 사본(638줄)으로 화면 확인. C# 색칠은 그대로. MarkupTest 65건. 전체 688건 통과(하네스 20벌). 경고 0 · 오류 0. Co-Authored-By: Claude Opus 5 --- doc/history/2026-09-11-5차.md | 96 +++++++++ doc/history/changelog.md | 1 + doc/진행상황.md | 2 +- src/MergeHub/Models/MergeLine.cs | 8 +- src/MergeHub/Services/CarryOver.cs | 34 ++++ src/MergeHub/Services/CodeSanityChecker.cs | 8 +- src/MergeHub/Services/CodeTokenizer.cs | 22 ++- src/MergeHub/Services/FolderComparer.cs | 4 +- src/MergeHub/Services/LanguageProfile.cs | 12 +- src/MergeHub/Services/MarkupTokenizer.cs | 198 +++++++++++++++++++ src/MergeHub/ViewModels/HomeViewModel.cs | 7 +- src/MergeHub/Views/Controls/CodeTextBlock.cs | 19 +- 12 files changed, 384 insertions(+), 27 deletions(-) create mode 100644 src/MergeHub/Services/CarryOver.cs create mode 100644 src/MergeHub/Services/MarkupTokenizer.cs diff --git a/doc/history/2026-09-11-5차.md b/doc/history/2026-09-11-5차.md index 72e801f..399a5b0 100644 --- a/doc/history/2026-09-11-5차.md +++ b/doc/history/2026-09-11-5차.md @@ -153,3 +153,99 @@ if (HasChanges && !threeWay && string.Equals(localText, _originalLocalText, Stri 검사를 `GitOpTest` 36건으로 고쳤다. 전체 **623건 통과**(하네스 19벌) · 빌드 경고 0 · 오류 0. **실제 저장소는 건드리지 않았다** — 데모 저장소(`mergehub-demo`) 사본으로만 했다. + + +--- + +## B-1. XAML 색칠이 사실상 없다 (2026-09-11, 완료) + +### 무엇이 문제였나 + +실제 소스에 XAML 이 400개 · 42,477줄이다. C# 다음으로 많다. +그런데 지금까지 XAML 은 `LanguageProfile.Markup` 으로 열렸고, 그것이 아는 것은 **주석과 따옴표뿐**이었다. +태그 이름 · 속성 이름 · 속성 값이 전부 같은 색이라 사실상 평문이었다. + +### 왜 기존 토크나이저에 못 얹었나 + +`CodeTokenizer` 는 **낱말을 읽어 예약어 표와 맞춰 보는** 방식이다. 마크업은 규칙이 다르다. +같은 `Content` 가 꺾쇠 안에서는 속성 이름이고 밖에서는 그냥 글자다. +낱말이 무엇이냐가 아니라 **어디에 있느냐**로 갈린다. 그래서 마크업만 따로 뒀다(`MarkupTokenizer`). + +### 줄을 넘어가는 상태를 넓혀야 했다 + +토크나이저는 한 줄씩 따로 훑는다. 앞 줄에서 넘어오는 것은 여태 `bool inBlockComment` 하나였다. +그런데 XAML 은 **여는 태그가 여러 줄에 걸치는 것이 예외가 아니라 보통**이다. +시험에 쓴 실제 파일(`UCManualRCCOperation.xaml`)은 **첫 태그 하나가 14줄**이다. + +```xml +