@kimdayoun/hwpx-mcp 0.3.0 → 0.3.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +201 -0
- package/README.md +30 -49
- package/dist/HangingIndentCalculator.js +136 -166
- package/dist/HwpxDocument.d.ts +275 -12
- package/dist/HwpxDocument.js +1589 -627
- package/dist/HwpxParser.js +18 -2
- package/dist/XmlWellFormed.d.ts +5 -0
- package/dist/XmlWellFormed.js +52 -0
- package/dist/index.js +117 -62
- package/dist/types.d.ts +5 -0
- package/package.json +10 -2
|
@@ -13,175 +13,143 @@
|
|
|
13
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
14
|
exports.HangingIndentCalculator = void 0;
|
|
15
15
|
/**
|
|
16
|
-
* 문자 너비 테이블 (em
|
|
17
|
-
* 실제 한글 문서에서 자주 사용되는 마커 문자들의 상대적 너비
|
|
16
|
+
* 문자 너비 테이블 (em 단위).
|
|
18
17
|
*
|
|
19
|
-
*
|
|
18
|
+
* 값은 Windows 한/글이 함초롬바탕 10pt 로 그린 PDF 에서 **글자 전진폭**
|
|
19
|
+
* (다음 글자 x − 이 글자 x) 을 잰 것이다. 추정치가 아니다.
|
|
20
|
+
* 측정 원본: src/fixtures/hancom-marker-widths.json
|
|
21
|
+
*
|
|
22
|
+
* 이전 표는 전각 1.0em·공백 0.5em 에 폰트 보정 1.25 를 곱해, 한/글보다
|
|
23
|
+
* 평균 4.14pt(최대 6.30pt) 넓게 계산했다. 한/글은 전각 기호를 0.996em,
|
|
24
|
+
* 공백을 0.498em 로 그리므로 보정 계수는 1.0 이 맞다.
|
|
25
|
+
*
|
|
26
|
+
* 표에 없는 글자는 getCharWidth 의 범주별 기본값을 쓴다.
|
|
20
27
|
*/
|
|
21
28
|
const CHAR_WIDTH_TABLE = {
|
|
22
|
-
//
|
|
23
|
-
'○':
|
|
24
|
-
'●':
|
|
25
|
-
'
|
|
26
|
-
'
|
|
27
|
-
'
|
|
28
|
-
'
|
|
29
|
-
'
|
|
30
|
-
'
|
|
31
|
-
'
|
|
32
|
-
'
|
|
33
|
-
'
|
|
34
|
-
'
|
|
35
|
-
'
|
|
36
|
-
'
|
|
37
|
-
'
|
|
38
|
-
'
|
|
39
|
-
'
|
|
40
|
-
'
|
|
41
|
-
'
|
|
42
|
-
'
|
|
43
|
-
'
|
|
44
|
-
|
|
45
|
-
'
|
|
46
|
-
'
|
|
47
|
-
'
|
|
48
|
-
'
|
|
49
|
-
'
|
|
50
|
-
'
|
|
51
|
-
|
|
52
|
-
'
|
|
53
|
-
'
|
|
54
|
-
'
|
|
55
|
-
'
|
|
56
|
-
|
|
57
|
-
'
|
|
58
|
-
|
|
59
|
-
'
|
|
60
|
-
|
|
61
|
-
'
|
|
62
|
-
|
|
63
|
-
'
|
|
64
|
-
'
|
|
65
|
-
'
|
|
66
|
-
'
|
|
67
|
-
'
|
|
68
|
-
'
|
|
69
|
-
'
|
|
70
|
-
'
|
|
71
|
-
|
|
72
|
-
'
|
|
73
|
-
|
|
74
|
-
'
|
|
75
|
-
|
|
76
|
-
'
|
|
77
|
-
|
|
78
|
-
'
|
|
79
|
-
|
|
80
|
-
'
|
|
81
|
-
'
|
|
82
|
-
'
|
|
83
|
-
'바': 1.0,
|
|
84
|
-
'사': 1.0,
|
|
85
|
-
'아': 1.0,
|
|
86
|
-
'자': 1.0,
|
|
87
|
-
'차': 1.0,
|
|
88
|
-
'카': 1.0,
|
|
89
|
-
'타': 1.0,
|
|
90
|
-
'파': 1.0,
|
|
91
|
-
'하': 1.0,
|
|
92
|
-
// 원문자 (전각)
|
|
93
|
-
'①': 1.0,
|
|
94
|
-
'②': 1.0,
|
|
95
|
-
'③': 1.0,
|
|
96
|
-
'④': 1.0,
|
|
97
|
-
'⑤': 1.0,
|
|
98
|
-
'⑥': 1.0,
|
|
99
|
-
'⑦': 1.0,
|
|
100
|
-
'⑧': 1.0,
|
|
101
|
-
'⑨': 1.0,
|
|
102
|
-
'⑩': 1.0,
|
|
103
|
-
'⑪': 1.0,
|
|
104
|
-
'⑫': 1.0,
|
|
105
|
-
'⑬': 1.0,
|
|
106
|
-
'⑭': 1.0,
|
|
107
|
-
'⑮': 1.0,
|
|
108
|
-
'⑯': 1.0,
|
|
109
|
-
'⑰': 1.0,
|
|
110
|
-
'⑱': 1.0,
|
|
111
|
-
'⑲': 1.0,
|
|
112
|
-
'⑳': 1.0,
|
|
113
|
-
// 로마 숫자/알파벳 대문자 (반각이지만 한글 폰트에서 조금 넓음)
|
|
114
|
-
'I': 0.4,
|
|
115
|
-
'V': 0.7,
|
|
116
|
-
'X': 0.7,
|
|
29
|
+
// 전각 기호 (실측 0.996em: ○ ● □ ■ ▶ ①)
|
|
30
|
+
'○': 0.996,
|
|
31
|
+
'●': 0.996,
|
|
32
|
+
'◆': 0.996,
|
|
33
|
+
'◇': 0.996,
|
|
34
|
+
'■': 0.996,
|
|
35
|
+
'□': 0.996,
|
|
36
|
+
'★': 0.996,
|
|
37
|
+
'☆': 0.996,
|
|
38
|
+
'◎': 0.996,
|
|
39
|
+
'◉': 0.996,
|
|
40
|
+
'▶': 0.996,
|
|
41
|
+
'▷': 0.996,
|
|
42
|
+
'►': 0.996,
|
|
43
|
+
'➢': 0.996,
|
|
44
|
+
'➣': 0.996,
|
|
45
|
+
'➤': 0.996,
|
|
46
|
+
'→': 0.996,
|
|
47
|
+
'⇒': 0.996,
|
|
48
|
+
'▣': 0.996,
|
|
49
|
+
'▤': 0.996,
|
|
50
|
+
'▥': 0.996,
|
|
51
|
+
// 폭이 좁은 기호 (실측: ※ 0.756, • 0.456)
|
|
52
|
+
'※': 0.756,
|
|
53
|
+
'•': 0.456,
|
|
54
|
+
'▪': 0.456,
|
|
55
|
+
'▻': 0.456,
|
|
56
|
+
'▸': 0.456,
|
|
57
|
+
'▹': 0.456,
|
|
58
|
+
// 체크·별 기호 (실측 ✓ 0.996)
|
|
59
|
+
'✓': 0.996,
|
|
60
|
+
'✔': 0.996,
|
|
61
|
+
'✗': 0.996,
|
|
62
|
+
'✘': 0.996,
|
|
63
|
+
'✦': 0.996,
|
|
64
|
+
'✧': 0.996,
|
|
65
|
+
// 대시 (실측 - 0.834, — 0.852)
|
|
66
|
+
'-': 0.834,
|
|
67
|
+
'–': 0.834,
|
|
68
|
+
'—': 0.852,
|
|
69
|
+
// 숫자 (실측 1 0.576, 0 0.588)
|
|
70
|
+
'0': 0.588,
|
|
71
|
+
'1': 0.576,
|
|
72
|
+
'2': 0.588,
|
|
73
|
+
'3': 0.588,
|
|
74
|
+
'4': 0.588,
|
|
75
|
+
'5': 0.588,
|
|
76
|
+
'6': 0.588,
|
|
77
|
+
'7': 0.588,
|
|
78
|
+
'8': 0.588,
|
|
79
|
+
'9': 0.588,
|
|
80
|
+
// 구두점·공백 (실측 . 0.294, ( 0.498, ) 0.504, 공백 0.498)
|
|
81
|
+
'.': 0.294,
|
|
82
|
+
')': 0.504,
|
|
83
|
+
'(': 0.498,
|
|
84
|
+
':': 0.294,
|
|
85
|
+
' ': 0.498,
|
|
86
|
+
// 알파벳 (실측 A 0.744, B 0.66, I 0.372, a 0.492)
|
|
87
|
+
'I': 0.372,
|
|
88
|
+
'V': 0.744,
|
|
89
|
+
'X': 0.744,
|
|
117
90
|
'L': 0.6,
|
|
118
|
-
'C': 0.
|
|
119
|
-
'D': 0.
|
|
91
|
+
'C': 0.744,
|
|
92
|
+
'D': 0.744,
|
|
120
93
|
'M': 0.9,
|
|
121
|
-
'A': 0.
|
|
122
|
-
'B': 0.
|
|
123
|
-
'E': 0.
|
|
94
|
+
'A': 0.744,
|
|
95
|
+
'B': 0.66,
|
|
96
|
+
'E': 0.66,
|
|
124
97
|
'F': 0.6,
|
|
125
|
-
'G': 0.
|
|
126
|
-
'H': 0.
|
|
127
|
-
|
|
128
|
-
'
|
|
129
|
-
'
|
|
130
|
-
'
|
|
131
|
-
'
|
|
132
|
-
'e': 0.55,
|
|
98
|
+
'G': 0.744,
|
|
99
|
+
'H': 0.744,
|
|
100
|
+
'a': 0.492,
|
|
101
|
+
'b': 0.492,
|
|
102
|
+
'c': 0.492,
|
|
103
|
+
'd': 0.492,
|
|
104
|
+
'e': 0.492,
|
|
133
105
|
'f': 0.35,
|
|
134
|
-
'g': 0.
|
|
135
|
-
'h': 0.
|
|
136
|
-
// 콜론 (마커 뒤에 올 수 있음)
|
|
137
|
-
':': 0.35,
|
|
138
|
-
// 법률/공문서 한글 문자
|
|
139
|
-
'제': 1.0,
|
|
140
|
-
'조': 1.0,
|
|
141
|
-
'항': 1.0,
|
|
142
|
-
'호': 1.0,
|
|
143
|
-
'목': 1.0,
|
|
144
|
-
'의': 1.0,
|
|
106
|
+
'g': 0.492,
|
|
107
|
+
'h': 0.492,
|
|
145
108
|
};
|
|
109
|
+
/** 한글 음절 전진폭 (실측 가·본 0.972em). */
|
|
110
|
+
const HANGUL_SYLLABLE_WIDTH = 0.972;
|
|
111
|
+
/** 원문자·전각 기호 기본 전진폭 (실측 ① 0.996em). */
|
|
112
|
+
const FULL_WIDTH_SYMBOL = 0.996;
|
|
146
113
|
/**
|
|
147
|
-
*
|
|
148
|
-
*
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
*
|
|
153
|
-
* 실측 기반 값 (한글에서 실제 렌더링 너비 / em 값)
|
|
114
|
+
* 폰트별 보정 계수 — CHAR_WIDTH_TABLE(함초롬바탕 실측) 대비 배율.
|
|
115
|
+
*
|
|
116
|
+
* 함초롬 계열만 한/글에서 실측했다(1.0). 나머지는 측정하지 않았으므로
|
|
117
|
+
* 종전 표가 함초롬(1.25) 대비 두던 **상대 비율**만 옮겼다
|
|
118
|
+
* (예: 맑은 고딕 1.35/1.25 = 1.08). 새 폰트를 쓰는 양식이 생기면
|
|
119
|
+
* scripts 쪽 측정 문서로 다시 재서 이 값을 교체한다.
|
|
154
120
|
*/
|
|
155
121
|
const FONT_FACTOR_TABLE = {
|
|
156
|
-
// 기본값
|
|
157
|
-
'default': 1.
|
|
158
|
-
// 한컴 폰트
|
|
159
|
-
'함초롬바탕': 1.
|
|
160
|
-
'함초롬돋움': 1.
|
|
161
|
-
'
|
|
162
|
-
'
|
|
163
|
-
|
|
164
|
-
'
|
|
165
|
-
|
|
166
|
-
'
|
|
167
|
-
'
|
|
168
|
-
'
|
|
169
|
-
'
|
|
170
|
-
'
|
|
171
|
-
|
|
172
|
-
'
|
|
173
|
-
|
|
174
|
-
'
|
|
175
|
-
'
|
|
176
|
-
'
|
|
177
|
-
|
|
178
|
-
'
|
|
179
|
-
|
|
180
|
-
'
|
|
181
|
-
'
|
|
182
|
-
|
|
183
|
-
'
|
|
184
|
-
|
|
122
|
+
// 기본값 — 한/글 새 문서 기본 글꼴이 함초롬바탕이다
|
|
123
|
+
'default': 1.0,
|
|
124
|
+
// 한컴 폰트 (실측)
|
|
125
|
+
'함초롬바탕': 1.0,
|
|
126
|
+
'함초롬돋움': 1.0,
|
|
127
|
+
'HCR Batang': 1.0,
|
|
128
|
+
'HCR Dotum': 1.0,
|
|
129
|
+
'한컴바탕': 1.04,
|
|
130
|
+
'한컴돋움': 1.04,
|
|
131
|
+
// 마이크로소프트 폰트 (미측정, 종전 상대비)
|
|
132
|
+
'맑은 고딕': 1.08,
|
|
133
|
+
'맑은고딕': 1.08,
|
|
134
|
+
'Malgun Gothic': 1.08,
|
|
135
|
+
'바탕': 1.04,
|
|
136
|
+
'돋움': 1.04,
|
|
137
|
+
'굴림': 1.04,
|
|
138
|
+
'궁서': 1.08,
|
|
139
|
+
// 나눔 폰트 (미측정, 종전 상대비)
|
|
140
|
+
'나눔고딕': 1.04,
|
|
141
|
+
'나눔명조': 1.04,
|
|
142
|
+
'NanumGothic': 1.04,
|
|
143
|
+
'NanumMyeongjo': 1.04,
|
|
144
|
+
'나눔바른고딕': 1.024,
|
|
145
|
+
// Adobe 폰트 (미측정, 종전 상대비)
|
|
146
|
+
'본고딕': 1.0,
|
|
147
|
+
'본명조': 1.0,
|
|
148
|
+
'Noto Sans KR': 1.0,
|
|
149
|
+
'Noto Serif KR': 1.0,
|
|
150
|
+
// 영문 폰트 (미측정, 종전 상대비)
|
|
151
|
+
'Arial': 0.8,
|
|
152
|
+
'Times New Roman': 0.8,
|
|
185
153
|
};
|
|
186
154
|
/**
|
|
187
155
|
* 폰트 보정 계수 가져오기
|
|
@@ -247,17 +215,19 @@ class HangingIndentCalculator {
|
|
|
247
215
|
if (CHAR_WIDTH_TABLE[char] !== undefined) {
|
|
248
216
|
return CHAR_WIDTH_TABLE[char];
|
|
249
217
|
}
|
|
250
|
-
// 한글
|
|
218
|
+
// 한글 음절 (가-힣)
|
|
251
219
|
if (/[가-힣]/.test(char)) {
|
|
252
|
-
return
|
|
220
|
+
return HANGUL_SYLLABLE_WIDTH;
|
|
253
221
|
}
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
if (code >=
|
|
257
|
-
|
|
222
|
+
const code = char.codePointAt(0) ?? 0;
|
|
223
|
+
// 원문자 ①–⑳ 등 Enclosed Alphanumerics, 도형 기호 블록, 전각 형태
|
|
224
|
+
if ((code >= 0x2460 && code <= 0x24FF) ||
|
|
225
|
+
(code >= 0x25A0 && code <= 0x25FF) ||
|
|
226
|
+
(code >= 0xFF00 && code <= 0xFFEF)) {
|
|
227
|
+
return FULL_WIDTH_SYMBOL;
|
|
258
228
|
}
|
|
259
|
-
//
|
|
260
|
-
return 0.
|
|
229
|
+
// 표에 없는 반각 문자 — 실측한 소문자 폭을 쓴다
|
|
230
|
+
return 0.492;
|
|
261
231
|
}
|
|
262
232
|
/**
|
|
263
233
|
* 마커 문자열의 너비를 em 단위로 계산
|