aboutsummaryrefslogtreecommitdiffstats
path: root/docs/design
diff options
context:
space:
mode:
Diffstat (limited to 'docs/design')
-rw-r--r--docs/design/004-text.md21
1 files changed, 13 insertions, 8 deletions
diff --git a/docs/design/004-text.md b/docs/design/004-text.md
index 2f629cb..b9727ae 100644
--- a/docs/design/004-text.md
+++ b/docs/design/004-text.md
@@ -37,7 +37,7 @@
U+3008·3009의 정준 동치, 바뀐 괄호 뒤의 결합 부호), 중립(N1–N2), 암시적 수준(I1–I2), 그리고 한 줄로서의 L1과 보이는
순서(L2)다. 성질은 UCD에서 만든 표다(양방향 클래스는 두 단계 표 37 KiB, 괄호 128개, 거울 글자 428개).
-유니코드 15.1의 적합성 시험을 모두 통과한다. `BidiTest.txt`의 770,241 경우(클래스 열마다 비트 집합이 가리키는 문단 방향)와
+유니코드 16.0(처음에는 15.1)의 적합성 시험을 모두 통과한다. `BidiTest.txt`의 770,241 경우(클래스 열마다 비트 집합이 가리키는 문단 방향)와
`BidiCharacterTest.txt`의 91,707 경우(코드 포인트, 괄호 포함)에서 수준과 보이는 순서가 하나도 틀리지 않는다. Pi 5에서 전체가
0.74초다. 처음 짠 것은 148 경우가 틀렸다. 앞선 격리 실행 열의 암시적 수준(I1–I2)이 바꾼 수준으로 다음 열의 sos를 정했기
때문이다(sos와 eos는 명시적 수준으로 정해야 한다).
@@ -55,20 +55,25 @@ NFC이자 NFD라는 것을 모두 지킨다. 적합성 시험 셋을 합쳐 Pi 5
글줄을 채우려면 어디서 줄을 바꿀 수 있는지(UAX #14)가 필요하다. 커서와 선택, 읽어 주기에는 자소 묶음, 낱말, 문장의
경계(UAX #29)가 필요하다. 모두 성질 표(Line_Break, Grapheme_Cluster_Break와 Indic_Conjunct_Break, Word_Break,
-Sentence_Break, 동아시아 폭이 F·W·H인 여는·닫는 괄호)와 규칙을 순서대로 적용하는 코드다. 각 경계는 규칙 가운데 그것을 처음으로
+Sentence_Break, 동아시아 폭 F·W·H)와 규칙을 순서대로 적용하는 코드다. 각 경계는 규칙 가운데 그것을 처음으로
정하는 것이 정한다.
-- [text/linebreak.c](../../text/linebreak.c): LB1–LB31. 결합 부호를 앞 글자에 붙이고(LB9), 공백을 건너 뒤를 보는
- 규칙(LB8, LB14, LB15a, LB16, LB17), 숫자 규칙(LB25는 유니코드의 시험처럼 8.2절 예 7로 맞춘 것), 브라흐미 계열
- 음절(LB28a), 지역 표시 짝(LB30a)을 한 번 앞에서 뒤로 훑어 만든 배열로 본다.
+- [text/linebreak.c](../../text/linebreak.c): LB1–LB31, UAX #14 16.0판(53차). 결합 부호를 앞 글자에 붙이고(LB9), 공백을
+ 건너 뒤를 보는 규칙(LB8, LB14, LB15a, LB16, LB17), 숫자 규칙(LB25), 따옴표 규칙(동아시아 문자에 둘러싸이지 않으면 양쪽을
+ 붙이는 LB19a), 낱말 첫 하이픈(LB20a), 브라흐미 계열 음절(LB28a), 지역 표시 짝(LB30a)을 한 번 앞에서 뒤로 훑어 만든 배열로
+ 본다.
- [text/grapheme.c](../../text/grapheme.c): GB1–GB999. 인도계 결합 자음(GB9c), 이모지 ZWJ 열(GB11), 지역 표시 짝(GB12–13)은
훑으며 상태 셋으로 본다.
- [text/word.c](../../text/word.c): WB1–WB999. 확장·서식·ZWJ를 앞 글자에 접고(WB4), 앞뒤로 한 단위씩 더 본다.
- [text/sentence.c](../../text/sentence.c): SB1–SB998. 문장 끝 뒤의 닫는 부호와 공백은 훑으며 기억하고, SB8의 앞보기는
뒤에서 앞으로 한 번 훑어 위치마다 미리 구한다. 모두 선형 시간이다.
-유니코드 15.1의 적합성 시험을 모두 통과한다. `LineBreakTest.txt` 10,274 경우, `GraphemeBreakTest.txt` 1,187 경우,
-`WordBreakTest.txt` 1,826 경우, `SentenceBreakTest.txt` 512 경우에서 틀린 경계가 하나도 없다.
+유니코드 16.0의 적합성 시험을 모두 통과한다. `LineBreakTest.txt` 16,672 경우, `GraphemeBreakTest.txt` 1,093 경우,
+`WordBreakTest.txt` 1,826 경우, `SentenceBreakTest.txt` 512 경우에서 틀린 경계가 하나도 없다. 15.1에서 16.0으로 올릴 때
+UCD만 바꾸자 줄 바꿈에서 49 경우가 틀렸다. 16.0판이 LB13의 `× IS`를 LB15c(`SP ÷ IS NU`, 'subtract .5')와 LB15d로 나누고,
+8.2절 예 7의 숫자 규칙을 LB25에 들이고(`IS × NU`, `PR × OP IS NU`가 새로 생겼다), LB19를 쪼개 동아시아 문자 사이의 따옴표에서는
+끊을 수 있게 하고(LB19a), 낱말 첫 하이픈 뒤를 붙이고(LB20a), LB21a를 히브리+하이픈+히브리 아닌 것으로 좁혔기 때문이다.
+그 규칙들을 들이자 모두 맞는다. 나머지 시험(양방향, 정규화, 자소, 낱말, 문장)은 규칙을 바꾸지 않고도 맞았다.
## 셰이핑
@@ -147,7 +152,7 @@ reph를 옮기고, 기본 기능(nukt, akhn, rphf, rkrf, pref, blwf, abvf, half,
NFA, DFA를 만들고 최소화한다. Ragel 스캐너의 뜻(각 위치에서 가장 긴 일치, 같으면 먼저 적은 패턴)을 따른다. 같은 문법으로
Ragel이 만든 HarfBuzz의 기계(`hb-ot-shaper-*-machine.hh`)를 해석해 무작위 범주열 10만 개씩 대 보면 세 기계 모두 음절 경계와
종류가 하나도 다르지 않다(`--check`). 문자마다의 범주와 자리는 HarfBuzz 10.2의 `hb-ot-shaper-indic-table.cc`를 칸마다 읽는다
- (유니코드 16 기준이라 여기의 15.1 UCD에서 만들지 않는다).
+ (HarfBuzz 10.2의 표는 유니코드 16 기준이다. Vega의 성질 표도 16.0이므로 둘이 같은 유니코드를 본다).
- 실행: 모음 제약(다른 모음처럼 읽히는 모음 연쇄에 점선 원), 인도계 분해·합성(몇 글자는 분해하지 않고, 쪼갠 모음 부호는 다시
합치지 않는다), 음절 찾기, 초기 재배치(기저 찾기, 자리순 안정 정렬, 마스크), 깨진 음절의 점선 원, 음절 안에서만 맞추는
조회(`F_PER_SYLLABLE`), 최종 재배치(pref가 만든 기저, 말라얄람의 아래 형태, 모음 부호와 reph와 pref 자음의 자리, 단어