hanlint 0.0.17 → 0.0.19

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.
Files changed (136) hide show
  1. package/README.md +23 -20
  2. package/data/calqueFrame.json +60 -0
  3. package/data/cliches.json +39 -29
  4. package/data/collocationStops.txt +28 -0
  5. package/data/confusable.json +20 -20
  6. package/data/easyWords.json +12 -246
  7. package/data/exemplars.json +50 -29
  8. package/data/hiddenDeps.txt +11 -11
  9. package/data/japaneseLoan.json +27 -27
  10. package/data/koreanProse.txt +64 -0
  11. package/data/patterns.json +26 -26
  12. package/data/phraseRepeat.json +11 -0
  13. package/data/platformApis.txt +11 -11
  14. package/data/redundantPair.json +16 -16
  15. package/data/ruleCategories.json +2 -0
  16. package/data/ruleDocs.json +56 -54
  17. package/data/ruleMechanisms.json +2 -0
  18. package/data/screenNarration.json +10 -10
  19. package/data/screenSentence.json +60 -12
  20. package/data/screenTone.json +6 -6
  21. package/data/screenWord.json +70 -110
  22. package/data/spacing.json +12 -12
  23. package/data/spelling.json +29 -29
  24. package/data/translationese.json +23 -24
  25. package/data/usageCounts.report.json +1676 -0
  26. package/data/version.json +1 -1
  27. package/package.json +1 -1
  28. package/src/analysis/grammar/ending.js +1 -1
  29. package/src/analysis/grammar/hangul.js +4 -4
  30. package/src/analysis/grammar/josa.js +1 -1
  31. package/src/analysis/grammar/register.js +1 -1
  32. package/src/analysis/grammar/voice.js +1 -1
  33. package/src/analysis/index.js +3 -3
  34. package/src/analysis/josa.js +1 -1
  35. package/src/analysis/splitSentences.js +1 -1
  36. package/src/analysis/tokenize.js +41 -26
  37. package/src/baseline/store.js +8 -8
  38. package/src/cli/help.js +11 -10
  39. package/src/cli/main.js +332 -182
  40. package/src/cli/walk.js +2 -2
  41. package/src/cli/welcome.js +8 -8
  42. package/src/config/loadConfig.js +3 -3
  43. package/src/config/patch.js +6 -6
  44. package/src/config/readerContract.js +26 -26
  45. package/src/config/settings.js +44 -25
  46. package/src/config/toml.js +9 -9
  47. package/src/data/exemplars.js +21 -21
  48. package/src/data/load.js +6 -6
  49. package/src/data/operations.js +14 -14
  50. package/src/data/patches.js +10 -10
  51. package/src/data/patterns.js +5 -5
  52. package/src/data/profiles.js +6 -6
  53. package/src/data/prose.js +27 -0
  54. package/src/document/model.js +4 -4
  55. package/src/document/parseMarkdown.js +7 -7
  56. package/src/document/plainText.js +3 -3
  57. package/src/document/sourceText.js +117 -19
  58. package/src/edit/applyFixes.js +0 -0
  59. package/src/fingerprint/build.js +18 -9
  60. package/src/fingerprint/codeBlocks.js +3 -3
  61. package/src/fingerprint/codeMarkers.js +4 -4
  62. package/src/fingerprint/dictionaries.js +34 -7
  63. package/src/fingerprint/markers.js +27 -5
  64. package/src/fingerprint/readerState.js +9 -9
  65. package/src/fingerprint/sourceSentence.js +1 -1
  66. package/src/fingerprint/topics.js +1 -1
  67. package/src/guard/contract.js +6 -6
  68. package/src/guard/editLocality.js +1 -1
  69. package/src/guard/outline.js +1 -1
  70. package/src/guard/receipt.js +13 -13
  71. package/src/guard/surface.js +4 -4
  72. package/src/index.js +9 -7
  73. package/src/learn/edits.js +2 -2
  74. package/src/learn/operations.js +1 -1
  75. package/src/regex.js +2 -2
  76. package/src/report/compactReport.js +7 -3
  77. package/src/report/fingerprintJson.js +2 -2
  78. package/src/report/githubReport.js +1 -1
  79. package/src/report/jsonReport.js +3 -3
  80. package/src/report/registerMatch.js +2 -2
  81. package/src/report/sheet.js +0 -0
  82. package/src/report/textReport.js +35 -16
  83. package/src/report/writingSpec.js +17 -17
  84. package/src/rules/code/inputFileSource.js +1 -1
  85. package/src/rules/code/installImport.js +2 -2
  86. package/src/rules/code/platformApi.js +1 -1
  87. package/src/rules/document/countMismatch.js +2 -1
  88. package/src/rules/document/enoughOnce.js +2 -1
  89. package/src/rules/document/fieldEcho.js +10 -6
  90. package/src/rules/document/keywordHeading.js +1 -1
  91. package/src/rules/document/keywordMissing.js +1 -1
  92. package/src/rules/document/noQuestion.js +2 -2
  93. package/src/rules/document/promiseRecall.js +1 -1
  94. package/src/rules/document/tableOddCell.js +1 -1
  95. package/src/rules/finding.js +4 -4
  96. package/src/rules/paragraph/factListParagraph.js +1 -1
  97. package/src/rules/paragraph/paraFragment.js +1 -1
  98. package/src/rules/readerDebt.js +1 -1
  99. package/src/rules/registry.js +30 -26
  100. package/src/rules/screen/screenWord.js +2 -1
  101. package/src/rules/sentence/calqueFrame.js +11 -0
  102. package/src/rules/sentence/cliche.js +7 -3
  103. package/src/rules/sentence/connectorRepeat.js +2 -1
  104. package/src/rules/sentence/danglingDeixis.js +1 -1
  105. package/src/rules/sentence/dash.js +1 -1
  106. package/src/rules/sentence/deixis.js +1 -1
  107. package/src/rules/sentence/doubleNegative.js +2 -1
  108. package/src/rules/sentence/doublePassive.js +2 -1
  109. package/src/rules/sentence/draftHistory.js +2 -1
  110. package/src/rules/sentence/endingRepeat.js +3 -2
  111. package/src/rules/sentence/euiChain.js +1 -1
  112. package/src/rules/sentence/fillerOpener.js +1 -1
  113. package/src/rules/sentence/hardWord.js +6 -3
  114. package/src/rules/sentence/imperativePeriod.js +1 -1
  115. package/src/rules/sentence/japaneseLoan.js +7 -3
  116. package/src/rules/sentence/longSentence.js +1 -1
  117. package/src/rules/sentence/negationRedefine.js +1 -1
  118. package/src/rules/sentence/nounPile.js +10 -4
  119. package/src/rules/sentence/numberOrphan.js +1 -1
  120. package/src/rules/sentence/outsideProfile.js +8 -3
  121. package/src/rules/sentence/phraseRepeat.js +54 -0
  122. package/src/rules/sentence/redundantPair.js +7 -3
  123. package/src/rules/sentence/translationese.js +7 -3
  124. package/src/rules/shared/candidates.js +2 -2
  125. package/src/rules/shared/dictionaryRule.js +46 -8
  126. package/src/rules/shared/repeat.js +2 -2
  127. package/src/rules/structure/bridgeRepeat.js +3 -3
  128. package/src/rules/structure/emojiBullet.js +1 -1
  129. package/src/rules/structure/headingSkip.js +1 -1
  130. package/src/rules/structure/headingUniform.js +2 -1
  131. package/src/rules/structure/loneSubheading.js +1 -1
  132. package/src/rules/structure/moreLater.js +1 -1
  133. package/src/text.js +2 -2
  134. package/src/usage/counts.js +54 -0
  135. package/src/usage/index.js +8 -0
  136. package/src/usage/sentences.js +681 -0
@@ -3,295 +3,61 @@
3
3
  {
4
4
  "pattern": "(?<![가-힣])금일{조사}",
5
5
  "fix": "오늘",
6
- "why": "쉬운 말 오늘 이 있다",
7
- "source": "표준국어대사전 (금일 = 오늘)"
6
+ "why": "`오늘`로 바꿔 쓸 수 있다",
7
+ "source": "표준국어대사전 표제어 `금일`"
8
8
  },
9
9
  {
10
10
  "pattern": "(?<![가-힣])익월{조사}",
11
11
  "fix": "다음 달",
12
- "why": "쉬운 말 다음 달 이 있다",
12
+ "why": "`다음 달`로 바꿔 쓸 수 있다",
13
13
  "source": "국립국어원 다듬은 말"
14
14
  },
15
15
  {
16
16
  "pattern": "(?<![가-힣])익년{조사}",
17
17
  "fix": "다음 해",
18
- "why": "쉬운 말 다음 해 가 있다",
18
+ "why": "`다음 해`로 바꿔 쓸 수 있다",
19
19
  "source": "국립국어원 다듬은 말"
20
20
  },
21
21
  {
22
22
  "pattern": "(?<![가-힣])금번{조사}",
23
23
  "fix": "이번",
24
- "why": "쉬운 말 이번 이 있다",
25
- "source": "표준국어대사전 (금번 = 이번)"
24
+ "why": "`이번`으로 바꿔 쓸 수 있다",
25
+ "source": "표준국어대사전 표제어 `금번`"
26
26
  },
27
27
  {
28
28
  "pattern": "(?<![가-힣])금회{조사}",
29
29
  "fix": "이번",
30
- "why": "쉬운 말 이번 이 있다",
31
- "source": "국립국어원 다듬은 말"
32
- },
33
- {
34
- "pattern": "(?<![가-힣])차후{조사}",
35
- "fix": "앞으로",
36
- "why": "쉬운 말 앞으로 가 있다",
37
- "source": "국립국어원 다듬은 말"
38
- },
39
- {
40
- "pattern": "(?<![가-힣])상기 (?=[가-힣])",
41
- "fix": "위 ",
42
- "why": "위에서 말한 것은 위 라고 쓴다",
43
- "source": "국립국어원 다듬은 말"
44
- },
45
- {
46
- "pattern": "(?<![가-힣])소정의",
47
- "fix": "정해진",
48
- "why": "쉬운 말 정해진 이 있다",
49
- "source": "국립국어원 다듬은 말"
50
- },
51
- {
52
- "pattern": "(?<![가-힣])여타{조사}",
53
- "fix": "다른",
54
- "why": "쉬운 말 다른 이 있다",
55
- "source": "국립국어원 다듬은 말"
56
- },
57
- {
58
- "pattern": "(?<![가-힣])제반{조사}",
59
- "fix": "여러",
60
- "why": "쉬운 말 여러 가 있다",
61
- "source": "국립국어원 다듬은 말"
62
- },
63
- {
64
- "pattern": "(?<![가-힣])납득{조사}",
65
- "fix": "이해",
66
- "why": "쉬운 말 이해 가 있다",
67
- "source": "국립국어원 다듬은 말"
68
- },
69
- {
70
- "pattern": "(?<![가-힣])납득(?=하|했|합|한|할|해)",
71
- "fix": "이해",
72
- "why": "쉬운 말 이해하다 가 있다",
73
- "source": "국립국어원 다듬은 말"
74
- },
75
- {
76
- "pattern": "(?<![가-힣])수취인{조사}",
77
- "fix": "받는 사람",
78
- "why": "쉬운 말 받는 사람 이 있다",
30
+ "why": "`이번`으로 바꿔 쓸 수 있다",
79
31
  "source": "국립국어원 다듬은 말"
80
32
  },
81
33
  {
82
34
  "pattern": "(?<![가-힣])불입{조사}",
83
35
  "fix": "납입",
84
- "why": "일본어투 한자어라 납입 으로 다듬었다",
36
+ "why": "일본어투 한자어라 국립국어원이 `납입`으로 다듬었다",
85
37
  "source": "국립국어원 다듬은 말"
86
38
  },
87
39
  {
88
40
  "pattern": "(?<![가-힣])시건장치{조사}",
89
41
  "fix": "잠금장치",
90
- "why": "쉬운 말 잠금장치 가 있다",
91
- "source": "국립국어원 다듬은 말"
92
- },
93
- {
94
- "pattern": "(?<![가-힣])견본{조사}",
95
- "fix": "본보기",
96
- "why": "쉬운 말 본보기 가 있다",
97
- "source": "국립국어원 다듬은 말"
98
- },
99
- {
100
- "pattern": "(?<![가-힣])요망{조사}",
101
- "fix": "바람",
102
- "why": "협조 요망 은 협조 바람 이다",
42
+ "why": "`잠금장치`로 바꿔 쓸 수 있다",
103
43
  "source": "국립국어원 다듬은 말"
104
44
  },
105
45
  {
106
46
  "pattern": "(?<![가-힣])필히(?![가-힣])",
107
47
  "fix": "반드시",
108
- "why": "쉬운 말 반드시 가 있다",
109
- "source": "국립국어원 다듬은 말"
110
- },
111
- {
112
- "pattern": "(?<![가-힣])별첨{조사}",
113
- "fix": "따로 붙임",
114
- "why": "쉬운 말 따로 붙임 이 있다",
115
- "source": "국립국어원 다듬은 말"
116
- },
117
- {
118
- "pattern": "(?<![가-힣])회신{조사}",
119
- "fix": "답장",
120
- "why": "쉬운 말 답장 이 있다",
121
- "source": "국립국어원 다듬은 말"
122
- },
123
- {
124
- "pattern": "(?<![가-힣])잔여 (?=[가-힣])",
125
- "fix": "남은 ",
126
- "why": "쉬운 말 남은 이 있다",
48
+ "why": "`반드시`로 바꿔 쓸 수 있다",
127
49
  "source": "국립국어원 다듬은 말"
128
50
  },
129
51
  {
130
52
  "pattern": "(?<![가-힣])사료(?=됩|된|되)",
131
53
  "fix": "생각",
132
- "why": "사료됩니다 는 생각됩니다 다",
54
+ "why": "`생각`으로 바꿔 `생각됩니다`처럼 쓸 수 있다",
133
55
  "source": "국립국어원 다듬은 말"
134
56
  },
135
57
  {
136
58
  "pattern": "(?<![가-힣])응당(?![가-힣])",
137
59
  "fix": "마땅히",
138
- "why": "쉬운 말 마땅히 가 있다",
139
- "source": "국립국어원 다듬은 말"
140
- },
141
- {
142
- "pattern": "(?<![가-힣])노하우{조사}",
143
- "fix": "비법",
144
- "why": "쉬운 말 비법 이 있다",
145
- "source": "국립국어원 다듬은 말"
146
- },
147
- {
148
- "pattern": "(?<![가-힣])매뉴얼{조사}",
149
- "fix": "설명서",
150
- "why": "쉬운 말 설명서 가 있다",
151
- "source": "표준국어대사전 (매뉴얼 = 설명서)"
152
- },
153
- {
154
- "pattern": "(?<![가-힣])피드백{조사}",
155
- "fix": "의견",
156
- "why": "쉬운 말 의견 이 있다",
157
- "source": "국립국어원 다듬은 말"
158
- },
159
- {
160
- "pattern": "(?<![가-힣])니즈{조사}",
161
- "fix": "요구",
162
- "why": "쉬운 말 요구 가 있다",
163
- "source": "국립국어원 다듬은 말"
164
- },
165
- {
166
- "pattern": "(?<![가-힣])어젠다{조사}",
167
- "fix": "의제",
168
- "why": "쉬운 말 의제 가 있다",
169
- "source": "국립국어원 다듬은 말"
170
- },
171
- {
172
- "pattern": "(?<![가-힣])가이드라인{조사}",
173
- "fix": "지침",
174
- "why": "쉬운 말 지침 이 있다",
175
- "source": "국립국어원 다듬은 말"
176
- },
177
- {
178
- "pattern": "(?<![가-힣])로드맵{조사}",
179
- "fix": "단계별 계획",
180
- "why": "쉬운 말 단계별 계획 이 있다",
181
- "source": "국립국어원 다듬은 말"
182
- },
183
- {
184
- "pattern": "(?<![가-힣])마인드{조사}",
185
- "fix": "마음가짐",
186
- "why": "쉬운 말 마음가짐 이 있다",
187
- "source": "국립국어원 다듬은 말"
188
- },
189
- {
190
- "pattern": "(?<![가-힣])컨펌{조사}",
191
- "fix": "확인",
192
- "why": "쉬운 말 확인 이 있다",
193
- "source": "국립국어원 다듬은 말"
194
- },
195
- {
196
- "pattern": "(?<![가-힣])데드라인{조사}",
197
- "fix": "마감",
198
- "why": "쉬운 말 마감 이 있다",
199
- "source": "국립국어원 다듬은 말"
200
- },
201
- {
202
- "pattern": "(?<![가-힣])리뷰{조사}",
203
- "fix": "검토",
204
- "why": "쉬운 말 검토 가 있다",
205
- "source": "국립국어원 다듬은 말"
206
- },
207
- {
208
- "pattern": "(?<![가-힣])멘토{조사}",
209
- "fix": "조언자",
210
- "why": "쉬운 말 조언자 가 있다",
211
- "source": "국립국어원 다듬은 말"
212
- },
213
- {
214
- "pattern": "(?<![가-힣])인센티브{조사}",
215
- "fix": "성과급",
216
- "why": "쉬운 말 성과급 이 있다",
217
- "source": "국립국어원 다듬은 말"
218
- },
219
- {
220
- "pattern": "(?<![가-힣])바우처{조사}",
221
- "fix": "이용권",
222
- "why": "쉬운 말 이용권 이 있다",
223
- "source": "국립국어원 다듬은 말"
224
- },
225
- {
226
- "pattern": "(?<![가-힣])팝업{조사}",
227
- "fix": "알림창",
228
- "why": "쉬운 말 알림창 이 있다",
229
- "source": "국립국어원 다듬은 말"
230
- },
231
- {
232
- "pattern": "(?<![가-힣])언택트{조사}",
233
- "fix": "비대면",
234
- "why": "쉬운 말 비대면 이 있다",
235
- "source": "국립국어원 다듬은 말"
236
- },
237
- {
238
- "pattern": "(?<![가-힣])팬데믹{조사}",
239
- "fix": "감염병 대유행",
240
- "why": "쉬운 말 감염병 대유행 이 있다",
241
- "source": "국립국어원 다듬은 말"
242
- },
243
- {
244
- "pattern": "(?<![가-힣])컨소시엄{조사}",
245
- "fix": "연합체",
246
- "why": "쉬운 말 연합체 가 있다",
247
- "source": "국립국어원 다듬은 말"
248
- },
249
- {
250
- "pattern": "(?<![가-힣])마스터플랜{조사}",
251
- "fix": "종합 계획",
252
- "why": "쉬운 말 종합 계획 이 있다",
253
- "source": "국립국어원 다듬은 말"
254
- },
255
- {
256
- "pattern": "(?<![가-힣])킥오프{조사}",
257
- "fix": "시작 회의",
258
- "why": "쉬운 말 시작 회의 가 있다",
259
- "source": "국립국어원 다듬은 말"
260
- },
261
- {
262
- "pattern": "(?<![가-힣])벤치마킹{조사}",
263
- "fix": "본보기 삼기",
264
- "why": "쉬운 말 본보기 삼기 가 있다",
265
- "source": "국립국어원 다듬은 말"
266
- },
267
- {
268
- "pattern": "(?<![가-힣])레퍼런스{조사}",
269
- "fix": "참고 자료",
270
- "why": "쉬운 말 참고 자료 가 있다",
271
- "source": "국립국어원 다듬은 말"
272
- },
273
- {
274
- "pattern": "(?<![가-힣])워크숍{조사}",
275
- "fix": "연수회",
276
- "why": "쉬운 말 연수회 가 있다",
277
- "source": "국립국어원 다듬은 말"
278
- },
279
- {
280
- "pattern": "(?<![가-힣])리스크{조사}",
281
- "fix": "위험",
282
- "why": "쉬운 말 위험 이 있다",
283
- "source": "국립국어원 다듬은 말"
284
- },
285
- {
286
- "pattern": "(?<![가-힣])체크리스트{조사}",
287
- "fix": "점검표",
288
- "why": "쉬운 말 점검표 가 있다",
289
- "source": "국립국어원 다듬은 말"
290
- },
291
- {
292
- "pattern": "(?<![가-힣])필터링{조사}",
293
- "fix": "거르기",
294
- "why": "쉬운 말 거르기 가 있다",
60
+ "why": "`마땅히`로 바꿔 쓸 수 있다",
295
61
  "source": "국립국어원 다듬은 말"
296
62
  }
297
63
  ]
@@ -12,17 +12,23 @@
12
12
  "after": "## 파일 열기\n\n파일을 엽니다. 열린 파일은 아직 비어 있습니다.\n\n## 값은 어디에 넣나?\n\n값을 넣습니다. 넣은 값은 아직 표가 아닙니다.\n\n## 표가 만들어지는 자리\n\n표를 만듭니다. 만든 표는 아직 파일에 없습니다.\n\n## 저장\n\n저장합니다.\n",
13
13
  "moved": "절마다 되풀이되던 예고 대신 방금 만든 것을 이름으로 부르고 아직 못 하는 일을 적었다"
14
14
  },
15
+ {
16
+ "rule": "calqueFrame",
17
+ "before": "캐스팅 장갑은 아직 원투 글에 잇지 못했습니다.",
18
+ "after": "캐스팅 장갑은 아직 원투 글에 연결하지 못했습니다.",
19
+ "moved": "글과 상품을 묶는 말을 사람들이 쓰는 `연결하다`로 바꿨다"
20
+ },
15
21
  {
16
22
  "rule": "cliche",
17
23
  "before": "핵심은 속도입니다.",
18
- "after": "같은 질문에 pandas 는 3.7초, Polars 는 0.18초가 걸립니다.",
19
- "moved": "포장하는 말을 지우고 핵심이라던 것을 그 자리에 숫자로 썼다"
24
+ "after": "같은 질문에 pandas는 3.7초, Polars는 0.18초가 걸립니다.",
25
+ "moved": "결론을 꾸미는 말을 지우고 핵심이라던 것을 그 자리에 숫자로 썼다"
20
26
  },
21
27
  {
22
28
  "rule": "confusable",
23
29
  "before": "학생으로써 할 일을 합니다.",
24
30
  "after": "학생으로서 할 일을 합니다.",
25
- "moved": "자격은 로서, 수단은 로써다"
31
+ "moved": "수단을 나타내는 `로써`를 자격을 나타내는 `로서`로 바꿨다"
26
32
  },
27
33
  {
28
34
  "rule": "connectorRepeat",
@@ -30,6 +36,12 @@
30
36
  "after": "그런데 표가 큽니다. 필요한 열은 두 개뿐입니다.",
31
37
  "moved": "둘째 문장의 접속부사를 지우고 앞 문장이 만든 것을 이어받게 했다"
32
38
  },
39
+ {
40
+ "rule": "phraseRepeat",
41
+ "before": "물은 온도가 중요하다. 원두를 바꾸는 것이 아니라 온도를 맞추는 것이 먼저다. 갈기도 마찬가지다. 굵기를 바꾸는 것이 아니라 시간을 재는 것이 먼저다. 저울을 쓴다. 눈대중은 흔들린다. 같은 잔을 쓴다. 물을 먼저 붓는다.",
42
+ "after": "물은 온도가 중요하다. 원두를 바꾸는 것이 아니라 온도를 맞추는 것이 먼저다. 갈기도 마찬가지다. 굵기를 재어 둔다. 저울을 쓴다. 눈대중은 흔들린다. 같은 잔을 쓴다. 물을 먼저 붓는다.",
43
+ "moved": "되풀이된 둘 가운데 하나를 바로 말하는 문장으로 바꿔 한 번만 남겼다"
44
+ },
33
45
  {
34
46
  "rule": "countMismatch",
35
47
  "before": "여섯 가지를 소개합니다.\n\n## 절\n\n다섯 가지를 봤습니다.\n",
@@ -39,7 +51,7 @@
39
51
  {
40
52
  "rule": "danglingDeixis",
41
53
  "before": "터미널을 엽니다.\n\n이것을 실행합니다.\n",
42
- "after": "터미널을 엽니다.\n\n`[실제 파일 이름]` 을 실행합니다.\n",
54
+ "after": "터미널을 엽니다.\n\n`[실제 파일 이름]`을 실행합니다.\n",
43
55
  "moved": "지시어 자리에 글쓴이가 확인한 실제 이름을 쓴다. 대괄호 문구를 그대로 내보내지 않는다"
44
56
  },
45
57
  {
@@ -69,7 +81,7 @@
69
81
  {
70
82
  "rule": "draftHistory",
71
83
  "before": "이 코드가 그대로 도는 것을 확인했습니다.",
72
- "after": "이 코드는 `ibis-framework[duckdb]` 만 설치해도 돕니다.",
84
+ "after": "이 코드는 `ibis-framework[duckdb]`만 설치해도 돕니다.",
73
85
  "moved": "글쓴이가 확인한 과정을 지우고 알아낸 사실만 남겼다"
74
86
  },
75
87
  {
@@ -88,7 +100,7 @@
88
100
  "rule": "endingRepeat",
89
101
  "before": "파일을 엽니다. 값을 넣습니다. 표를 만듭니다. 화면을 봅니다.",
90
102
  "after": "파일을 엽니다. 값을 넣으면 표가 생깁니다. 그래서 화면에서 표를 확인합니다.",
91
- "moved": "네 문장을 조건과 인과로 이어 같은 사실을 세 문장에 담았다"
103
+ "moved": "네 문장을 조건과 까닭으로 이어 같은 사실을 세 문장에 담았다"
92
104
  },
93
105
  {
94
106
  "rule": "enoughOnce",
@@ -100,7 +112,7 @@
100
112
  "rule": "euiChain",
101
113
  "before": "회사의 팀의 결정의 근거를 봅니다.",
102
114
  "after": "그 팀이 왜 그렇게 정했는지 근거를 봅니다.",
103
- "moved": "관형격을 풀어 누가 무엇을 했는지 드러냈다"
115
+ "moved": "조사 `의`로 이어 붙인 말을 풀어 누가 무엇을 했는지 드러냈다"
104
116
  },
105
117
  {
106
118
  "rule": "factListParagraph",
@@ -111,14 +123,14 @@
111
123
  {
112
124
  "rule": "fieldEcho",
113
125
  "before": "---\nreaderTakeaway: 표를 언제 어느 도구로 고르나\n---\n\n엑셀이 멈춥니다.\n\n## 절\n\n설치 방법입니다.\n",
114
- "after": "---\nreaderTakeaway: 표를 언제 어느 도구로 고르나\n---\n\n엑셀이 멈춥니다.\n\n## 절\n\n표가 작으면 pandas 로 고르고 커지면 Polars 로 옮깁니다.\n",
126
+ "after": "---\nreaderTakeaway: 표를 언제 어느 도구로 고르나\n---\n\n엑셀이 멈춥니다.\n\n## 절\n\n표가 작으면 pandas로 고르고 커지면 Polars로 옮깁니다.\n",
115
127
  "moved": "미리보기가 약속한 것을 본문이 그 말로 답하게 했다"
116
128
  },
117
129
  {
118
130
  "rule": "fillerOpener",
119
131
  "before": "다음으로, 압축 파일을 풉니다.",
120
132
  "after": "압축 파일을 풉니다.",
121
- "moved": "순서 표지만 지우고 나머지 사실은 바꾸지 않았다"
133
+ "moved": "순서를 나타내는 말만 지우고 나머지 사실은 바꾸지 않았다"
122
134
  },
123
135
  {
124
136
  "rule": "firstResultDistance",
@@ -128,8 +140,8 @@
128
140
  },
129
141
  {
130
142
  "rule": "hardWord",
131
- "before": "금일 중으로 소정의 양식을 제출합니다.",
132
- "after": "오늘 안에 정해진 양식을 냅니다.",
143
+ "before": "금일 중으로 양식을 제출합니다.",
144
+ "after": "오늘 안에 양식을 냅니다.",
133
145
  "moved": "관청 말을 평소에 쓰는 말로 바꿨다"
134
146
  },
135
147
  {
@@ -159,7 +171,7 @@
159
171
  {
160
172
  "rule": "inputFileSource",
161
173
  "before": "```python\n표 = open(\"sales.xlsx\")\n```\n",
162
- "after": "앞 절의 make_sales.py 가 sales.xlsx 를 만듭니다.\n\n```python\n표 = open(\"sales.xlsx\")\n```\n",
174
+ "after": "앞 절의 make_sales.py가 sales.xlsx를 만듭니다.\n\n```python\n표 = open(\"sales.xlsx\")\n```\n",
163
175
  "moved": "읽는 파일을 만드는 자리를 앞에 두었다"
164
176
  },
165
177
  {
@@ -178,13 +190,13 @@
178
190
  "rule": "introLong",
179
191
  "before": "무엇을 먼저 볼까요? 여기서 시작합니다. 그래서 준비합니다.\n\n표를 엽니다. 값이 보입니다. 그래서 다음으로 넘어갑니다.\n\n표를 엽니다. 값이 보입니다. 그래서 다음으로 넘어갑니다.\n\n표를 엽니다. 값이 보입니다. 그래서 다음으로 넘어갑니다.\n\n표를 엽니다. 값이 보입니다. 그래서 다음으로 넘어갑니다.\n\n## 첫 절\n\n표를 엽니다. 값이 보입니다. 그래서 다음으로 넘어갑니다.\n\n표를 엽니다. 값이 보입니다. 그래서 다음으로 넘어갑니다.\n\n표를 엽니다. 값이 보입니다. 그래서 다음으로 넘어갑니다.\n\n## 둘째 절\n\n표를 엽니다. 값이 보입니다. 그래서 다음으로 넘어갑니다.\n\n표를 엽니다. 값이 보입니다. 그래서 다음으로 넘어갑니다.\n\n표를 엽니다. 값이 보입니다. 그래서 다음으로 넘어갑니다.\n\n",
180
192
  "after": "무엇을 먼저 볼까요? 여기서 시작합니다. 그래서 준비합니다.\n\n표를 엽니다. 값이 보입니다. 그래서 다음으로 넘어갑니다.\n\n## 첫 절\n\n표를 엽니다. 값이 보입니다. 그래서 다음으로 넘어갑니다.\n\n표를 엽니다. 값이 보입니다. 그래서 다음으로 넘어갑니다.\n\n표를 엽니다. 값이 보입니다. 그래서 다음으로 넘어갑니다.\n\n## 둘째 절\n\n표를 엽니다. 값이 보입니다. 그래서 다음으로 넘어갑니다.\n\n표를 엽니다. 값이 보입니다. 그래서 다음으로 넘어갑니다.\n\n표를 엽니다. 값이 보입니다. 그래서 다음으로 넘어갑니다.\n\n",
181
- "moved": "미룬 배경 설명을 걷고 도입을 네 문단 안으로 줄였다"
193
+ "moved": "미룬 배경 설명을 빼고 도입을 네 문단 안으로 줄였다"
182
194
  },
183
195
  {
184
196
  "rule": "japaneseLoan",
185
197
  "before": "구좌 잔고를 익일에 확인합니다.",
186
198
  "after": "계좌 잔액을 다음 날에 확인합니다.",
187
- "moved": "일본어투 낱말을 우리말로 바꿨다"
199
+ "moved": "일본어투 단어를 우리말로 바꿨다"
188
200
  },
189
201
  {
190
202
  "rule": "keywordMissing",
@@ -202,7 +214,7 @@
202
214
  "rule": "loneSubheading",
203
215
  "before": "## 파일 저장 자리\n\n첫 문단.\n\n### 파일 저장\n\n둘째 문단.\n\n## 다음 절\n\n끝.\n",
204
216
  "after": "## 파일 저장 자리\n\n첫 문단.\n\n둘째 문단.\n\n## 어디에 저장됐나?\n\n끝.\n",
205
- "moved": "새 말이 없는 외동 소제목을 지우고 본문을 절 제목 아래로 올렸다"
217
+ "moved": "새 내용이 없는 하나뿐인 소제목을 지우고 본문을 절 제목 아래로 올렸다"
206
218
  },
207
219
  {
208
220
  "rule": "longSentence",
@@ -212,8 +224,8 @@
212
224
  },
213
225
  {
214
226
  "rule": "moreLater",
215
- "before": "## 절\n\n본문.\n\n## 더 해 볼 것\n\n- DuckDB 도 엑셀 파일을 읽습니다. 확장을 한 번 설치하고 나면 함수 하나로 부릅니다. 다만 옛 확장자는 안 되고 새 확장자만 됩니다. 그래서 파일 확장자를 먼저 봅니다. 확장자가 다르면 엑셀에서 열어 새 확장자로 바꿔 저장한 뒤에 다시 부릅니다. 이 순서를 지키지 않으면 확장을 깔고도 파일을 못 엽니다.\n",
216
- "after": "## 엑셀은 어떻게 읽나?\n\n본문.\n\n## 더 해 볼 것\n\n- DuckDB 도 엑셀을 읽습니다. read_xlsx 한 줄이면 됩니다.\n",
227
+ "before": "## 절\n\n본문.\n\n## 더 해 볼 것\n\n- DuckDB도 엑셀 파일을 읽습니다. 확장을 한 번 설치하고 나면 함수 하나로 부릅니다. 다만 옛 확장자는 안 되고 새 확장자만 됩니다. 그래서 파일 확장자를 먼저 봅니다. 확장자가 다르면 엑셀에서 열어 새 확장자로 바꿔 저장한 뒤에 다시 부릅니다. 이 순서를 지키지 않으면 확장을 깔고도 파일을 못 엽니다.\n",
228
+ "after": "## 엑셀은 어떻게 읽나?\n\n본문.\n\n## 더 해 볼 것\n\n- DuckDB도 엑셀을 읽습니다. read_xlsx 한 줄이면 됩니다.\n",
217
229
  "moved": "미룬 항목을 한 줄과 코드 한 줄로 줄였다"
218
230
  },
219
231
  {
@@ -263,7 +275,7 @@
263
275
  "rule": "outsideProfile",
264
276
  "before": "파일을 열고 표를 확인한 다음 열 다섯 개의 이름을 하나씩 읽어 두고 값을 고친 뒤 저장하고 폴더를 만들고 파일을 옮기고 이름을 바꾸고 목록을 다시 보고 끝낸 다음 다시 처음부터 열어 표가 보이면 열의 순서를 적어 두고 값을 고친 뒤 저장하고 닫고 다시 열어 확인하고 이름을 바꾼 파일을 목록에서 찾아 열고 표를 확인하고 값을 고치고 저장한 다음 폴더를 정리하고 파일을 옮기고 목록을 다시 보고 끝냅니다.",
265
277
  "after": "파일을 열고 표를 확인합니다. 열 다섯 개의 이름을 읽어 두고 값을 고친 뒤 저장합니다. 폴더를 만들고 파일을 옮긴 뒤 이름을 바꿉니다. 목록을 다시 보고 끝냅니다.",
266
- "moved": "같은 종류 글의 99% 가 들어오는 길이 안으로 문장을 넷으로 나눴다"
278
+ "moved": "같은 종류 글의 99%가 들어오는 길이 안으로 문장을 넷으로 나눴다"
267
279
  },
268
280
  {
269
281
  "rule": "paraFragment",
@@ -275,13 +287,13 @@
275
287
  "rule": "platformApi",
276
288
  "before": "```python\nprint(process.memory_info().peak_wset)\n```\n",
277
289
  "after": "```python\nimport tracemalloc\ntracemalloc.start()\nprint(tracemalloc.get_traced_memory()[1])\n```\n",
278
- "moved": "한 운영체제에서만 도는 API 를 표준 라이브러리의 어디서나 도는 것으로 바꿨다"
290
+ "moved": "한 운영체제에서만 도는 API를 표준 라이브러리의 어디서나 도는 것으로 바꿨다"
279
291
  },
280
292
  {
281
293
  "rule": "promiseRecall",
282
294
  "before": "자세한 것은 뒤에서 다루겠습니다.\n\n## 절\n\n다른 이야기로 끝납니다.\n",
283
- "after": "자세한 것은 뒤에서 다루겠습니다.\n\n## 절\n\n앞에서 미룬 usecols 를 이제 봅니다.\n",
284
- "moved": "미룬 것을 앞에서 쓴 이름으로 다시 불러 회수했다"
295
+ "after": "자세한 것은 뒤에서 다루겠습니다.\n\n## 절\n\n앞에서 미룬 usecols를 이제 봅니다.\n",
296
+ "moved": "미룬 것을 앞에서 쓴 이름으로 다시 불러 다뤘다"
285
297
  },
286
298
  {
287
299
  "rule": "redundantPair",
@@ -299,7 +311,7 @@
299
311
  "rule": "spacing",
300
312
  "before": "할수 있다고 생각한지 두번째입니다.",
301
313
  "after": "할 수 있다고 생각한 지 두 번째입니다.",
302
- "moved": "의존명사와 단위 명사를 띄어 썼다"
314
+ "moved": "의존 명사와 단위 명사를 띄어 썼다"
303
315
  },
304
316
  {
305
317
  "rule": "spelling",
@@ -311,25 +323,25 @@
311
323
  "rule": "tableOddCell",
312
324
  "before": "| 이름 | 시간 |\n|---|---|\n| pandas | 3.72초 |\n| Polars | 0.18초 |\n| DuckDB | 0.13초 |\n| PyArrow | 직접 부르지 않음 |\n| Dask | 2.12초 |\n",
313
325
  "after": "| 이름 | 시간 |\n|---|---|\n| pandas | 3.72초 |\n| Polars | 0.18초 |\n| DuckDB | 0.13초 |\n| PyArrow | 0.02초 |\n| Dask | 2.12초 |\n",
314
- "moved": "열의 잣대를 하나로 맞췄다"
326
+ "moved": "글로 적힌 칸에 다른 칸과 같은 초 단위 값을 넣었다"
315
327
  },
316
328
  {
317
329
  "rule": "translationese",
318
330
  "before": "모든 분야에 있어서 기준이 필요합니다.",
319
331
  "after": "모든 분야에서 기준이 필요합니다.",
320
- "moved": "번역투를 우리말 어순으로 되돌렸다"
332
+ "moved": "`에 있어서`를 `에서`로 줄였다"
321
333
  },
322
334
  {
323
335
  "rule": "screenSentence",
324
336
  "before": "요청을 완료하지 못했습니다",
325
337
  "after": "요청 실패",
326
- "moved": "종결어미를 떼고 실패를 낱말로 적었다"
338
+ "moved": "종결어미를 떼고 실패를 단어로 적었다"
327
339
  },
328
340
  {
329
341
  "rule": "screenNarration",
330
342
  "before": "계약 신청이 도착하면 여기에 표시됩니다.",
331
343
  "after": "계약 없음",
332
- "moved": "예고 문장을 빈 상태의 낱말로 바꿨다"
344
+ "moved": "예고 문장을 빈 상태를 나타내는 단어로 바꿨다"
333
345
  },
334
346
  {
335
347
  "rule": "screenTone",
@@ -341,7 +353,7 @@
341
353
  "rule": "screenWord",
342
354
  "before": "계약 메타데이터",
343
355
  "after": "계약 정보",
344
- "moved": "개발 어휘를 사용자의 낱말로 바꿨다"
356
+ "moved": "개발 용어를 사용자가 쓰는 단어로 바꿨다"
345
357
  },
346
358
  {
347
359
  "rule": "dash",
@@ -350,7 +362,7 @@
350
362
  ],
351
363
  "before": "설정 {em} 저장",
352
364
  "after": "설정 저장",
353
- "moved": "긴 줄표를 지우고 낱말만 남겼다"
365
+ "moved": "긴 줄표를 지우고 단어만 남겼다"
354
366
  },
355
367
  {
356
368
  "rule": "spelling",
@@ -395,7 +407,7 @@
395
407
  ],
396
408
  "before": "잔고 조회",
397
409
  "after": "잔액 조회",
398
- "moved": "일본어투 낱말을 바꿨다"
410
+ "moved": "일본어투 단어를 바꿨다"
399
411
  },
400
412
  {
401
413
  "rule": "doublePassive",
@@ -423,6 +435,15 @@
423
435
  "before": "매 시간마다 확인",
424
436
  "after": "매시간 확인",
425
437
  "moved": "겹말을 하나로 줄였다"
438
+ },
439
+ {
440
+ "rule": "calqueFrame",
441
+ "presets": [
442
+ "screen"
443
+ ],
444
+ "before": "상품 잇기",
445
+ "after": "상품 연결",
446
+ "moved": "사람들이 쓰는 단어로 바꿨다"
426
447
  }
427
448
  ]
428
449
  }
@@ -1,11 +1,11 @@
1
- # 코드 한 줄이 조용히 요구하는 패키지. `정규식<TAB>패키지[extra]<TAB>왜`. 설치 줄에 없으면 installImport 가 notice 로 짚는다.
2
- # 실측: 004 가 ibis-framework[duckdb] 만 설치하고 ibis.sqlite.connect 를 썼고 사람 평가자가 집었다.
3
- ibis\.sqlite\.connect ibis-framework[sqlite] ibis 의 sqlite 백엔드는 extra 로 따로 받는다
4
- ibis\.duckdb\.connect ibis-framework[duckdb] ibis 의 duckdb 백엔드는 extra 로 따로 받는다
5
- ibis\.postgres\.connect ibis-framework[postgres] ibis 의 postgres 백엔드는 extra 로 따로 받는다
6
- dask\.dataframe dask[dataframe] dask 의 dataframe 은 extra 로 따로 받는다
7
- pd\.read_excel\(|\.to_excel\( openpyxl pandas 의 엑셀 읽기와 쓰기는 openpyxl 이 있어야 돈다
8
- pd\.read_parquet\(|\.to_parquet\( pyarrow pandas 의 parquet 은 pyarrow 가 있어야 돈다
9
- pl\.read_excel\( fastexcel polars 의 엑셀 읽기는 fastexcel 이 기본 엔진이다
10
- plt\.|import matplotlib matplotlib 그림을 그리려면 matplotlib 이 있어야 한다
11
- requests\.get\(|requests\.post\( requests requests 는 표준 라이브러리가 아니다
1
+ # 코드 한 줄이 요구하는데 설치 줄에 드러나지 않는 패키지. `정규식<TAB>패키지[extra]<TAB>왜`. 설치 줄에 없으면 installImport가 경고로 짚는다.
2
+ # 실측: 블로그 004가 ibis-framework[duckdb]만 설치하고 ibis.sqlite.connect를 썼고 사람 평가자가 짚었다.
3
+ ibis\.sqlite\.connect ibis-framework[sqlite] ibis의 sqlite 백엔드는 extra로 따로 받는다
4
+ ibis\.duckdb\.connect ibis-framework[duckdb] ibis의 duckdb 백엔드는 extra로 따로 받는다
5
+ ibis\.postgres\.connect ibis-framework[postgres] ibis의 postgres 백엔드는 extra로 따로 받는다
6
+ dask\.dataframe dask[dataframe] dask의 dataframe은 extra로 따로 받는다
7
+ pd\.read_excel\(|\.to_excel\( openpyxl pandas의 엑셀 읽기와 쓰기에는 openpyxl이 있어야 한다
8
+ pd\.read_parquet\(|\.to_parquet\( pyarrow pandas로 parquet을 읽고 쓰려면 pyarrow가 있어야 한다
9
+ pl\.read_excel\( fastexcel polars의 엑셀 읽기는 fastexcel을 기본 엔진으로 쓴다
10
+ plt\.|import matplotlib matplotlib 그림을 그리려면 matplotlib이 있어야 한다
11
+ requests\.get\(|requests\.post\( requests requests는 표준 라이브러리가 아니다