hanlint 0.0.18 → 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.
- package/README.md +17 -16
- package/data/calqueFrame.json +20 -20
- package/data/cliches.json +33 -33
- package/data/confusable.json +20 -20
- package/data/easyWords.json +12 -12
- package/data/exemplars.json +30 -30
- package/data/hiddenDeps.txt +11 -11
- package/data/japaneseLoan.json +27 -27
- package/data/koreanProse.txt +31 -31
- package/data/patterns.json +26 -26
- package/data/phraseRepeat.json +2 -2
- package/data/platformApis.txt +11 -11
- package/data/redundantPair.json +16 -16
- package/data/ruleDocs.json +56 -56
- package/data/screenNarration.json +10 -10
- package/data/screenSentence.json +12 -12
- package/data/screenTone.json +6 -6
- package/data/screenWord.json +70 -70
- package/data/spacing.json +11 -11
- package/data/spelling.json +29 -29
- package/data/translationese.json +23 -24
- package/data/usageCounts.report.json +2 -2
- package/data/version.json +1 -1
- package/package.json +1 -1
- package/src/analysis/grammar/ending.js +1 -1
- package/src/analysis/grammar/hangul.js +4 -4
- package/src/analysis/grammar/josa.js +1 -1
- package/src/analysis/grammar/register.js +1 -1
- package/src/analysis/grammar/voice.js +1 -1
- package/src/analysis/index.js +2 -2
- package/src/analysis/josa.js +1 -1
- package/src/analysis/splitSentences.js +1 -1
- package/src/analysis/tokenize.js +13 -13
- package/src/baseline/store.js +8 -8
- package/src/cli/help.js +11 -11
- package/src/cli/main.js +135 -124
- package/src/cli/walk.js +1 -1
- package/src/cli/welcome.js +8 -8
- package/src/config/loadConfig.js +3 -3
- package/src/config/patch.js +6 -6
- package/src/config/readerContract.js +26 -26
- package/src/config/settings.js +30 -28
- package/src/config/toml.js +9 -9
- package/src/data/exemplars.js +21 -21
- package/src/data/load.js +6 -6
- package/src/data/operations.js +14 -14
- package/src/data/patches.js +10 -10
- package/src/data/patterns.js +5 -5
- package/src/data/profiles.js +5 -5
- package/src/data/prose.js +5 -5
- package/src/document/model.js +4 -4
- package/src/document/parseMarkdown.js +7 -7
- package/src/document/plainText.js +3 -3
- package/src/document/sourceText.js +24 -24
- package/src/edit/applyFixes.js +0 -0
- package/src/fingerprint/build.js +6 -6
- package/src/fingerprint/codeBlocks.js +3 -3
- package/src/fingerprint/codeMarkers.js +4 -4
- package/src/fingerprint/dictionaries.js +7 -7
- package/src/fingerprint/markers.js +7 -7
- package/src/fingerprint/readerState.js +9 -9
- package/src/fingerprint/sourceSentence.js +1 -1
- package/src/fingerprint/topics.js +1 -1
- package/src/guard/contract.js +6 -6
- package/src/guard/editLocality.js +1 -1
- package/src/guard/outline.js +1 -1
- package/src/guard/receipt.js +13 -13
- package/src/guard/surface.js +4 -4
- package/src/index.js +6 -6
- package/src/learn/edits.js +2 -2
- package/src/learn/operations.js +1 -1
- package/src/regex.js +2 -2
- package/src/report/compactReport.js +3 -3
- package/src/report/fingerprintJson.js +2 -2
- package/src/report/githubReport.js +1 -1
- package/src/report/jsonReport.js +2 -2
- package/src/report/registerMatch.js +2 -2
- package/src/report/sheet.js +16 -16
- package/src/report/textReport.js +12 -12
- package/src/report/writingSpec.js +15 -15
- package/src/rules/code/inputFileSource.js +1 -1
- package/src/rules/code/installImport.js +2 -2
- package/src/rules/code/platformApi.js +1 -1
- package/src/rules/document/countMismatch.js +2 -1
- package/src/rules/document/enoughOnce.js +2 -1
- package/src/rules/document/fieldEcho.js +10 -6
- package/src/rules/document/keywordHeading.js +1 -1
- package/src/rules/document/keywordMissing.js +1 -1
- package/src/rules/document/noQuestion.js +2 -2
- package/src/rules/document/promiseRecall.js +1 -1
- package/src/rules/document/tableOddCell.js +1 -1
- package/src/rules/finding.js +4 -4
- package/src/rules/paragraph/factListParagraph.js +1 -1
- package/src/rules/paragraph/paraFragment.js +1 -1
- package/src/rules/readerDebt.js +1 -1
- package/src/rules/registry.js +26 -26
- package/src/rules/sentence/connectorRepeat.js +2 -1
- package/src/rules/sentence/danglingDeixis.js +1 -1
- package/src/rules/sentence/dash.js +1 -1
- package/src/rules/sentence/deixis.js +1 -1
- package/src/rules/sentence/doubleNegative.js +2 -1
- package/src/rules/sentence/doublePassive.js +2 -1
- package/src/rules/sentence/draftHistory.js +2 -1
- package/src/rules/sentence/endingRepeat.js +3 -2
- package/src/rules/sentence/euiChain.js +1 -1
- package/src/rules/sentence/fillerOpener.js +1 -1
- package/src/rules/sentence/imperativePeriod.js +1 -1
- package/src/rules/sentence/longSentence.js +1 -1
- package/src/rules/sentence/negationRedefine.js +1 -1
- package/src/rules/sentence/numberOrphan.js +1 -1
- package/src/rules/sentence/outsideProfile.js +8 -3
- package/src/rules/sentence/phraseRepeat.js +2 -1
- package/src/rules/shared/candidates.js +2 -2
- package/src/rules/shared/dictionaryRule.js +9 -2
- package/src/rules/shared/repeat.js +2 -2
- package/src/rules/structure/bridgeRepeat.js +3 -3
- package/src/rules/structure/emojiBullet.js +1 -1
- package/src/rules/structure/headingSkip.js +1 -1
- package/src/rules/structure/headingUniform.js +2 -1
- package/src/rules/structure/loneSubheading.js +1 -1
- package/src/rules/structure/moreLater.js +1 -1
- package/src/text.js +2 -2
- package/src/usage/counts.js +3 -3
- package/src/usage/index.js +3 -3
- package/src/usage/sentences.js +17 -17
package/data/exemplars.json
CHANGED
|
@@ -16,19 +16,19 @@
|
|
|
16
16
|
"rule": "calqueFrame",
|
|
17
17
|
"before": "캐스팅 장갑은 아직 원투 글에 잇지 못했습니다.",
|
|
18
18
|
"after": "캐스팅 장갑은 아직 원투 글에 연결하지 못했습니다.",
|
|
19
|
-
"moved": "글과 상품을 묶는 말을 사람들이 쓰는
|
|
19
|
+
"moved": "글과 상품을 묶는 말을 사람들이 쓰는 `연결하다`로 바꿨다"
|
|
20
20
|
},
|
|
21
21
|
{
|
|
22
22
|
"rule": "cliche",
|
|
23
23
|
"before": "핵심은 속도입니다.",
|
|
24
|
-
"after": "같은 질문에 pandas
|
|
25
|
-
"moved": "
|
|
24
|
+
"after": "같은 질문에 pandas는 3.7초, Polars는 0.18초가 걸립니다.",
|
|
25
|
+
"moved": "결론을 꾸미는 말을 지우고 핵심이라던 것을 그 자리에 숫자로 썼다"
|
|
26
26
|
},
|
|
27
27
|
{
|
|
28
28
|
"rule": "confusable",
|
|
29
29
|
"before": "학생으로써 할 일을 합니다.",
|
|
30
30
|
"after": "학생으로서 할 일을 합니다.",
|
|
31
|
-
"moved": "
|
|
31
|
+
"moved": "수단을 나타내는 `로써`를 자격을 나타내는 `로서`로 바꿨다"
|
|
32
32
|
},
|
|
33
33
|
{
|
|
34
34
|
"rule": "connectorRepeat",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"rule": "phraseRepeat",
|
|
41
41
|
"before": "물은 온도가 중요하다. 원두를 바꾸는 것이 아니라 온도를 맞추는 것이 먼저다. 갈기도 마찬가지다. 굵기를 바꾸는 것이 아니라 시간을 재는 것이 먼저다. 저울을 쓴다. 눈대중은 흔들린다. 같은 잔을 쓴다. 물을 먼저 붓는다.",
|
|
42
42
|
"after": "물은 온도가 중요하다. 원두를 바꾸는 것이 아니라 온도를 맞추는 것이 먼저다. 갈기도 마찬가지다. 굵기를 재어 둔다. 저울을 쓴다. 눈대중은 흔들린다. 같은 잔을 쓴다. 물을 먼저 붓는다.",
|
|
43
|
-
"moved": "되풀이된 둘 가운데 하나를
|
|
43
|
+
"moved": "되풀이된 둘 가운데 하나를 바로 말하는 문장으로 바꿔 한 번만 남겼다"
|
|
44
44
|
},
|
|
45
45
|
{
|
|
46
46
|
"rule": "countMismatch",
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
{
|
|
52
52
|
"rule": "danglingDeixis",
|
|
53
53
|
"before": "터미널을 엽니다.\n\n이것을 실행합니다.\n",
|
|
54
|
-
"after": "터미널을 엽니다.\n\n`[실제 파일 이름]
|
|
54
|
+
"after": "터미널을 엽니다.\n\n`[실제 파일 이름]`을 실행합니다.\n",
|
|
55
55
|
"moved": "지시어 자리에 글쓴이가 확인한 실제 이름을 쓴다. 대괄호 문구를 그대로 내보내지 않는다"
|
|
56
56
|
},
|
|
57
57
|
{
|
|
@@ -81,7 +81,7 @@
|
|
|
81
81
|
{
|
|
82
82
|
"rule": "draftHistory",
|
|
83
83
|
"before": "이 코드가 그대로 도는 것을 확인했습니다.",
|
|
84
|
-
"after": "이 코드는 `ibis-framework[duckdb]
|
|
84
|
+
"after": "이 코드는 `ibis-framework[duckdb]`만 설치해도 돕니다.",
|
|
85
85
|
"moved": "글쓴이가 확인한 과정을 지우고 알아낸 사실만 남겼다"
|
|
86
86
|
},
|
|
87
87
|
{
|
|
@@ -100,7 +100,7 @@
|
|
|
100
100
|
"rule": "endingRepeat",
|
|
101
101
|
"before": "파일을 엽니다. 값을 넣습니다. 표를 만듭니다. 화면을 봅니다.",
|
|
102
102
|
"after": "파일을 엽니다. 값을 넣으면 표가 생깁니다. 그래서 화면에서 표를 확인합니다.",
|
|
103
|
-
"moved": "네 문장을 조건과
|
|
103
|
+
"moved": "네 문장을 조건과 까닭으로 이어 같은 사실을 세 문장에 담았다"
|
|
104
104
|
},
|
|
105
105
|
{
|
|
106
106
|
"rule": "enoughOnce",
|
|
@@ -112,7 +112,7 @@
|
|
|
112
112
|
"rule": "euiChain",
|
|
113
113
|
"before": "회사의 팀의 결정의 근거를 봅니다.",
|
|
114
114
|
"after": "그 팀이 왜 그렇게 정했는지 근거를 봅니다.",
|
|
115
|
-
"moved": "
|
|
115
|
+
"moved": "조사 `의`로 이어 붙인 말을 풀어 누가 무엇을 했는지 드러냈다"
|
|
116
116
|
},
|
|
117
117
|
{
|
|
118
118
|
"rule": "factListParagraph",
|
|
@@ -123,14 +123,14 @@
|
|
|
123
123
|
{
|
|
124
124
|
"rule": "fieldEcho",
|
|
125
125
|
"before": "---\nreaderTakeaway: 표를 언제 어느 도구로 고르나\n---\n\n엑셀이 멈춥니다.\n\n## 절\n\n설치 방법입니다.\n",
|
|
126
|
-
"after": "---\nreaderTakeaway: 표를 언제 어느 도구로 고르나\n---\n\n엑셀이 멈춥니다.\n\n## 절\n\n표가 작으면 pandas
|
|
126
|
+
"after": "---\nreaderTakeaway: 표를 언제 어느 도구로 고르나\n---\n\n엑셀이 멈춥니다.\n\n## 절\n\n표가 작으면 pandas로 고르고 커지면 Polars로 옮깁니다.\n",
|
|
127
127
|
"moved": "미리보기가 약속한 것을 본문이 그 말로 답하게 했다"
|
|
128
128
|
},
|
|
129
129
|
{
|
|
130
130
|
"rule": "fillerOpener",
|
|
131
131
|
"before": "다음으로, 압축 파일을 풉니다.",
|
|
132
132
|
"after": "압축 파일을 풉니다.",
|
|
133
|
-
"moved": "
|
|
133
|
+
"moved": "순서를 나타내는 말만 지우고 나머지 사실은 바꾸지 않았다"
|
|
134
134
|
},
|
|
135
135
|
{
|
|
136
136
|
"rule": "firstResultDistance",
|
|
@@ -171,7 +171,7 @@
|
|
|
171
171
|
{
|
|
172
172
|
"rule": "inputFileSource",
|
|
173
173
|
"before": "```python\n표 = open(\"sales.xlsx\")\n```\n",
|
|
174
|
-
"after": "앞 절의 make_sales.py
|
|
174
|
+
"after": "앞 절의 make_sales.py가 sales.xlsx를 만듭니다.\n\n```python\n표 = open(\"sales.xlsx\")\n```\n",
|
|
175
175
|
"moved": "읽는 파일을 만드는 자리를 앞에 두었다"
|
|
176
176
|
},
|
|
177
177
|
{
|
|
@@ -190,13 +190,13 @@
|
|
|
190
190
|
"rule": "introLong",
|
|
191
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",
|
|
192
192
|
"after": "무엇을 먼저 볼까요? 여기서 시작합니다. 그래서 준비합니다.\n\n표를 엽니다. 값이 보입니다. 그래서 다음으로 넘어갑니다.\n\n## 첫 절\n\n표를 엽니다. 값이 보입니다. 그래서 다음으로 넘어갑니다.\n\n표를 엽니다. 값이 보입니다. 그래서 다음으로 넘어갑니다.\n\n표를 엽니다. 값이 보입니다. 그래서 다음으로 넘어갑니다.\n\n## 둘째 절\n\n표를 엽니다. 값이 보입니다. 그래서 다음으로 넘어갑니다.\n\n표를 엽니다. 값이 보입니다. 그래서 다음으로 넘어갑니다.\n\n표를 엽니다. 값이 보입니다. 그래서 다음으로 넘어갑니다.\n\n",
|
|
193
|
-
"moved": "미룬 배경 설명을
|
|
193
|
+
"moved": "미룬 배경 설명을 빼고 도입을 네 문단 안으로 줄였다"
|
|
194
194
|
},
|
|
195
195
|
{
|
|
196
196
|
"rule": "japaneseLoan",
|
|
197
197
|
"before": "구좌 잔고를 익일에 확인합니다.",
|
|
198
198
|
"after": "계좌 잔액을 다음 날에 확인합니다.",
|
|
199
|
-
"moved": "일본어투
|
|
199
|
+
"moved": "일본어투 단어를 우리말로 바꿨다"
|
|
200
200
|
},
|
|
201
201
|
{
|
|
202
202
|
"rule": "keywordMissing",
|
|
@@ -214,7 +214,7 @@
|
|
|
214
214
|
"rule": "loneSubheading",
|
|
215
215
|
"before": "## 파일 저장 자리\n\n첫 문단.\n\n### 파일 저장\n\n둘째 문단.\n\n## 다음 절\n\n끝.\n",
|
|
216
216
|
"after": "## 파일 저장 자리\n\n첫 문단.\n\n둘째 문단.\n\n## 어디에 저장됐나?\n\n끝.\n",
|
|
217
|
-
"moved": "새
|
|
217
|
+
"moved": "새 내용이 없는 하나뿐인 소제목을 지우고 본문을 절 제목 아래로 올렸다"
|
|
218
218
|
},
|
|
219
219
|
{
|
|
220
220
|
"rule": "longSentence",
|
|
@@ -224,8 +224,8 @@
|
|
|
224
224
|
},
|
|
225
225
|
{
|
|
226
226
|
"rule": "moreLater",
|
|
227
|
-
"before": "## 절\n\n본문.\n\n## 더 해 볼 것\n\n- DuckDB
|
|
228
|
-
"after": "## 엑셀은 어떻게 읽나?\n\n본문.\n\n## 더 해 볼 것\n\n- DuckDB
|
|
227
|
+
"before": "## 절\n\n본문.\n\n## 더 해 볼 것\n\n- DuckDB도 엑셀 파일을 읽습니다. 확장을 한 번 설치하고 나면 함수 하나로 부릅니다. 다만 옛 확장자는 안 되고 새 확장자만 됩니다. 그래서 파일 확장자를 먼저 봅니다. 확장자가 다르면 엑셀에서 열어 새 확장자로 바꿔 저장한 뒤에 다시 부릅니다. 이 순서를 지키지 않으면 확장을 깔고도 파일을 못 엽니다.\n",
|
|
228
|
+
"after": "## 엑셀은 어떻게 읽나?\n\n본문.\n\n## 더 해 볼 것\n\n- DuckDB도 엑셀을 읽습니다. read_xlsx 한 줄이면 됩니다.\n",
|
|
229
229
|
"moved": "미룬 항목을 한 줄과 코드 한 줄로 줄였다"
|
|
230
230
|
},
|
|
231
231
|
{
|
|
@@ -275,7 +275,7 @@
|
|
|
275
275
|
"rule": "outsideProfile",
|
|
276
276
|
"before": "파일을 열고 표를 확인한 다음 열 다섯 개의 이름을 하나씩 읽어 두고 값을 고친 뒤 저장하고 폴더를 만들고 파일을 옮기고 이름을 바꾸고 목록을 다시 보고 끝낸 다음 다시 처음부터 열어 표가 보이면 열의 순서를 적어 두고 값을 고친 뒤 저장하고 닫고 다시 열어 확인하고 이름을 바꾼 파일을 목록에서 찾아 열고 표를 확인하고 값을 고치고 저장한 다음 폴더를 정리하고 파일을 옮기고 목록을 다시 보고 끝냅니다.",
|
|
277
277
|
"after": "파일을 열고 표를 확인합니다. 열 다섯 개의 이름을 읽어 두고 값을 고친 뒤 저장합니다. 폴더를 만들고 파일을 옮긴 뒤 이름을 바꿉니다. 목록을 다시 보고 끝냅니다.",
|
|
278
|
-
"moved": "같은 종류 글의 99
|
|
278
|
+
"moved": "같은 종류 글의 99%가 들어오는 길이 안으로 문장을 넷으로 나눴다"
|
|
279
279
|
},
|
|
280
280
|
{
|
|
281
281
|
"rule": "paraFragment",
|
|
@@ -287,13 +287,13 @@
|
|
|
287
287
|
"rule": "platformApi",
|
|
288
288
|
"before": "```python\nprint(process.memory_info().peak_wset)\n```\n",
|
|
289
289
|
"after": "```python\nimport tracemalloc\ntracemalloc.start()\nprint(tracemalloc.get_traced_memory()[1])\n```\n",
|
|
290
|
-
"moved": "한 운영체제에서만 도는 API
|
|
290
|
+
"moved": "한 운영체제에서만 도는 API를 표준 라이브러리의 어디서나 도는 것으로 바꿨다"
|
|
291
291
|
},
|
|
292
292
|
{
|
|
293
293
|
"rule": "promiseRecall",
|
|
294
294
|
"before": "자세한 것은 뒤에서 다루겠습니다.\n\n## 절\n\n다른 이야기로 끝납니다.\n",
|
|
295
|
-
"after": "자세한 것은 뒤에서 다루겠습니다.\n\n## 절\n\n앞에서 미룬 usecols
|
|
296
|
-
"moved": "미룬 것을 앞에서 쓴 이름으로 다시 불러
|
|
295
|
+
"after": "자세한 것은 뒤에서 다루겠습니다.\n\n## 절\n\n앞에서 미룬 usecols를 이제 봅니다.\n",
|
|
296
|
+
"moved": "미룬 것을 앞에서 쓴 이름으로 다시 불러 다뤘다"
|
|
297
297
|
},
|
|
298
298
|
{
|
|
299
299
|
"rule": "redundantPair",
|
|
@@ -311,7 +311,7 @@
|
|
|
311
311
|
"rule": "spacing",
|
|
312
312
|
"before": "할수 있다고 생각한지 두번째입니다.",
|
|
313
313
|
"after": "할 수 있다고 생각한 지 두 번째입니다.",
|
|
314
|
-
"moved": "
|
|
314
|
+
"moved": "의존 명사와 단위 명사를 띄어 썼다"
|
|
315
315
|
},
|
|
316
316
|
{
|
|
317
317
|
"rule": "spelling",
|
|
@@ -323,25 +323,25 @@
|
|
|
323
323
|
"rule": "tableOddCell",
|
|
324
324
|
"before": "| 이름 | 시간 |\n|---|---|\n| pandas | 3.72초 |\n| Polars | 0.18초 |\n| DuckDB | 0.13초 |\n| PyArrow | 직접 부르지 않음 |\n| Dask | 2.12초 |\n",
|
|
325
325
|
"after": "| 이름 | 시간 |\n|---|---|\n| pandas | 3.72초 |\n| Polars | 0.18초 |\n| DuckDB | 0.13초 |\n| PyArrow | 0.02초 |\n| Dask | 2.12초 |\n",
|
|
326
|
-
"moved": "
|
|
326
|
+
"moved": "글로 적힌 칸에 다른 칸과 같은 초 단위 값을 넣었다"
|
|
327
327
|
},
|
|
328
328
|
{
|
|
329
329
|
"rule": "translationese",
|
|
330
330
|
"before": "모든 분야에 있어서 기준이 필요합니다.",
|
|
331
331
|
"after": "모든 분야에서 기준이 필요합니다.",
|
|
332
|
-
"moved": "
|
|
332
|
+
"moved": "`에 있어서`를 `에서`로 줄였다"
|
|
333
333
|
},
|
|
334
334
|
{
|
|
335
335
|
"rule": "screenSentence",
|
|
336
336
|
"before": "요청을 완료하지 못했습니다",
|
|
337
337
|
"after": "요청 실패",
|
|
338
|
-
"moved": "종결어미를 떼고 실패를
|
|
338
|
+
"moved": "종결어미를 떼고 실패를 단어로 적었다"
|
|
339
339
|
},
|
|
340
340
|
{
|
|
341
341
|
"rule": "screenNarration",
|
|
342
342
|
"before": "계약 신청이 도착하면 여기에 표시됩니다.",
|
|
343
343
|
"after": "계약 없음",
|
|
344
|
-
"moved": "예고 문장을 빈
|
|
344
|
+
"moved": "예고 문장을 빈 상태를 나타내는 단어로 바꿨다"
|
|
345
345
|
},
|
|
346
346
|
{
|
|
347
347
|
"rule": "screenTone",
|
|
@@ -353,7 +353,7 @@
|
|
|
353
353
|
"rule": "screenWord",
|
|
354
354
|
"before": "계약 메타데이터",
|
|
355
355
|
"after": "계약 정보",
|
|
356
|
-
"moved": "개발
|
|
356
|
+
"moved": "개발 용어를 사용자가 쓰는 단어로 바꿨다"
|
|
357
357
|
},
|
|
358
358
|
{
|
|
359
359
|
"rule": "dash",
|
|
@@ -362,7 +362,7 @@
|
|
|
362
362
|
],
|
|
363
363
|
"before": "설정 {em} 저장",
|
|
364
364
|
"after": "설정 저장",
|
|
365
|
-
"moved": "긴 줄표를 지우고
|
|
365
|
+
"moved": "긴 줄표를 지우고 단어만 남겼다"
|
|
366
366
|
},
|
|
367
367
|
{
|
|
368
368
|
"rule": "spelling",
|
|
@@ -407,7 +407,7 @@
|
|
|
407
407
|
],
|
|
408
408
|
"before": "잔고 조회",
|
|
409
409
|
"after": "잔액 조회",
|
|
410
|
-
"moved": "일본어투
|
|
410
|
+
"moved": "일본어투 단어를 바꿨다"
|
|
411
411
|
},
|
|
412
412
|
{
|
|
413
413
|
"rule": "doublePassive",
|
|
@@ -443,7 +443,7 @@
|
|
|
443
443
|
],
|
|
444
444
|
"before": "상품 잇기",
|
|
445
445
|
"after": "상품 연결",
|
|
446
|
-
"moved": "사람들이 쓰는
|
|
446
|
+
"moved": "사람들이 쓰는 단어로 바꿨다"
|
|
447
447
|
}
|
|
448
448
|
]
|
|
449
449
|
}
|
package/data/hiddenDeps.txt
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
# 코드 한 줄이
|
|
2
|
-
# 실측: 004
|
|
3
|
-
ibis\.sqlite\.connect ibis-framework[sqlite] ibis
|
|
4
|
-
ibis\.duckdb\.connect ibis-framework[duckdb] ibis
|
|
5
|
-
ibis\.postgres\.connect ibis-framework[postgres] ibis
|
|
6
|
-
dask\.dataframe dask[dataframe] dask
|
|
7
|
-
pd\.read_excel\(|\.to_excel\( openpyxl pandas
|
|
8
|
-
pd\.read_parquet\(|\.to_parquet\( pyarrow pandas
|
|
9
|
-
pl\.read_excel\( fastexcel polars
|
|
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는 표준 라이브러리가 아니다
|
package/data/japaneseLoan.json
CHANGED
|
@@ -3,80 +3,80 @@
|
|
|
3
3
|
{
|
|
4
4
|
"pattern": "(?<![가-힣])구좌",
|
|
5
5
|
"fix": "계좌",
|
|
6
|
-
"why": "일본어투
|
|
7
|
-
"source": "국립국어원 2005"
|
|
6
|
+
"why": "일본어투 한자어다. `계좌`로 쓴다",
|
|
7
|
+
"source": "국립국어원 일본어 투 용어 순화 자료집 2005"
|
|
8
8
|
},
|
|
9
9
|
{
|
|
10
10
|
"pattern": "(?<![가-힣])익일",
|
|
11
|
-
"fix": "
|
|
12
|
-
"why": "일본어투
|
|
13
|
-
"source": "국립국어원 2005"
|
|
11
|
+
"fix": "다음 날",
|
|
12
|
+
"why": "일본어투 한자어다. `다음 날`로 쓴다",
|
|
13
|
+
"source": "국립국어원 일본어 투 용어 순화 자료집 2005"
|
|
14
14
|
},
|
|
15
15
|
{
|
|
16
16
|
"pattern": "(?<![가-힣])잔고",
|
|
17
17
|
"fix": "잔액",
|
|
18
|
-
"why": "일본어투
|
|
19
|
-
"source": "국립국어원 2005"
|
|
18
|
+
"why": "일본어투 한자어다. `잔액`으로 쓴다",
|
|
19
|
+
"source": "국립국어원 일본어 투 용어 순화 자료집 2005"
|
|
20
20
|
},
|
|
21
21
|
{
|
|
22
22
|
"pattern": "(?<![가-힣])고참",
|
|
23
23
|
"fix": "선임",
|
|
24
|
-
"why": "일본어투
|
|
25
|
-
"source": "국립국어원 2005"
|
|
24
|
+
"why": "일본어투 한자어다. `선임`으로 쓴다",
|
|
25
|
+
"source": "국립국어원 일본어 투 용어 순화 자료집 2005"
|
|
26
26
|
},
|
|
27
27
|
{
|
|
28
28
|
"pattern": "(?<![가-힣])망년회",
|
|
29
29
|
"fix": "송년회",
|
|
30
|
-
"why": "일본어투
|
|
31
|
-
"source": "국립국어원 2005"
|
|
30
|
+
"why": "일본어투 한자어다. `송년회`로 쓴다",
|
|
31
|
+
"source": "국립국어원 일본어 투 용어 순화 자료집 2005"
|
|
32
32
|
},
|
|
33
33
|
{
|
|
34
34
|
"pattern": "(?<![가-힣])종지부",
|
|
35
35
|
"fix": "마침표",
|
|
36
|
-
"why": "일본어투
|
|
37
|
-
"source": "국립국어원 2005"
|
|
36
|
+
"why": "일본어투 한자어다. `마침표`로 쓴다",
|
|
37
|
+
"source": "국립국어원 일본어 투 용어 순화 자료집 2005"
|
|
38
38
|
},
|
|
39
39
|
{
|
|
40
40
|
"pattern": "(?<![가-힣])나와바리",
|
|
41
41
|
"fix": "구역",
|
|
42
|
-
"why": "일본어
|
|
43
|
-
"source": "국립국어원 2019"
|
|
42
|
+
"why": "일본어 음차어다. `구역`으로 쓴다",
|
|
43
|
+
"source": "국립국어원 일본어 투 용어 50개 2019"
|
|
44
44
|
},
|
|
45
45
|
{
|
|
46
46
|
"pattern": "(?<![가-힣])단도리",
|
|
47
47
|
"fix": "채비",
|
|
48
|
-
"why": "일본어
|
|
49
|
-
"source": "국립국어원 2019"
|
|
48
|
+
"why": "일본어 음차어다. `채비`로 쓴다",
|
|
49
|
+
"source": "국립국어원 일본어 투 용어 50개 2019"
|
|
50
50
|
},
|
|
51
51
|
{
|
|
52
52
|
"pattern": "(?<![가-힣])무데뽀",
|
|
53
53
|
"fix": "막무가내",
|
|
54
|
-
"why": "일본어
|
|
55
|
-
"source": "국립국어원 2019"
|
|
54
|
+
"why": "일본어 음차어다. `막무가내`로 쓴다",
|
|
55
|
+
"source": "국립국어원 일본어 투 용어 50개 2019"
|
|
56
56
|
},
|
|
57
57
|
{
|
|
58
58
|
"pattern": "(?<![가-힣])분빠이",
|
|
59
59
|
"fix": "각자 내기",
|
|
60
|
-
"why": "일본어
|
|
61
|
-
"source": "국립국어원 2019"
|
|
60
|
+
"why": "일본어 음차어다. `각자 내기`로 쓴다",
|
|
61
|
+
"source": "국립국어원 일본어 투 용어 50개 2019"
|
|
62
62
|
},
|
|
63
63
|
{
|
|
64
64
|
"pattern": "(?<![가-힣])기스",
|
|
65
65
|
"fix": "흠집",
|
|
66
|
-
"why": "일본어
|
|
67
|
-
"source": "국립국어원 2019"
|
|
66
|
+
"why": "일본어 음차어다. `흠집`으로 쓴다",
|
|
67
|
+
"source": "국립국어원 일본어 투 용어 50개 2019"
|
|
68
68
|
},
|
|
69
69
|
{
|
|
70
70
|
"pattern": "(?<![가-힣])곤색",
|
|
71
71
|
"fix": "감색",
|
|
72
|
-
"why": "일본어
|
|
73
|
-
"source": "국립국어원 2019"
|
|
72
|
+
"why": "일본어 음차어다. `감색`으로 쓴다",
|
|
73
|
+
"source": "국립국어원 일본어 투 용어 50개 2019"
|
|
74
74
|
},
|
|
75
75
|
{
|
|
76
76
|
"pattern": "(?<![가-힣])노가다",
|
|
77
77
|
"fix": "막일",
|
|
78
|
-
"why": "일본어
|
|
79
|
-
"source": "국립국어원 2019"
|
|
78
|
+
"why": "일본어 음차어다. `막일`로 쓴다",
|
|
79
|
+
"source": "국립국어원 일본어 투 용어 50개 2019"
|
|
80
80
|
}
|
|
81
81
|
]
|
|
82
82
|
}
|
package/data/koreanProse.txt
CHANGED
|
@@ -4,61 +4,61 @@
|
|
|
4
4
|
|
|
5
5
|
초보자용 설명에서도 표준 용어와 실제 UI 명칭을 유지한다. 쉬운 설명은 정의와 예시를 덧붙이는 일이다.
|
|
6
6
|
마우스는 클릭, 터치는 탭, 체크박스는 선택·해제, 키보드는 키 입력, 명령은 실행으로 동작을 구분한다.
|
|
7
|
-
|
|
7
|
+
`클릭`을 `누른다`로 바꾸거나 `필터`를 `거르개`로, `래핑`을 `감싸개`로 번역하지 않는다. 필터는 조건에 맞는 항목을
|
|
8
8
|
선택하는 기능이며, 래핑은 기존 기능을 다른 코드로 감싸 호출 방식이나 동작을 조정하는 기법처럼 설명한다.
|
|
9
9
|
Excel의 셀·행·열·시트도 이름을 유지한다. 파일 내용 수정, 설정 변경, 오류 해결처럼 작업 대상을 명시한다.
|
|
10
10
|
문맥을 판단해야 하는 제안은 오류 수를 줄이려고 적용하지 않는다. 검사 결과보다 사실과 용어의 정확성을 먼저 확인한다.
|
|
11
11
|
|
|
12
|
-
아래 일곱 항목
|
|
13
|
-
기계가 쓴 360편을
|
|
14
|
-
사람 쪽은 장르 넷 가운데
|
|
12
|
+
아래 일곱 항목 가운데 앞의 여섯은 사람이 쓴 한국어 155만 문장(백과사전, 지침, 토론, 보고서)과
|
|
13
|
+
기계가 쓴 360편을 비교해 찾은 표현이다. 붙은 수는 천 문장당 비율이다(긴 문장만 글 안의 비율).
|
|
14
|
+
사람 쪽은 장르 넷 가운데 가장 높은 값이다.
|
|
15
15
|
일곱째는 이 수치를 적용할 때 글의 뜻과 독자의 말을 지키는 원칙이다.
|
|
16
16
|
|
|
17
17
|
## 1. 긴 문장을 아예 안 쓰면 기계 글이다
|
|
18
18
|
|
|
19
|
-
사람은 서른 어절 넘는 문장을 스무 문장에
|
|
19
|
+
사람은 서른 어절 넘는 문장을 스무 문장에 하나쯤 쓰는데(4.6~15.5%) 기계는 0.3%라서 15배 넘게 차이가 난다.
|
|
20
20
|
|
|
21
|
-
짧게 끊는 것이 미덕이라고 배웠겠지만, 사람 글의 리듬은
|
|
22
|
-
한 단락에 하나쯤은 숨을 길게 끌고 가는 문장을 두고, 조건과 이유와 결과를 한 문장 안에
|
|
21
|
+
짧게 끊는 것이 미덕이라고 배웠겠지만, 사람 글의 리듬은 가끔 길게 이어지는 문장에서 나온다.
|
|
22
|
+
한 단락에 하나쯤은 숨을 길게 끌고 가는 문장을 두고, 조건과 이유와 결과를 한 문장 안에 엮는다.
|
|
23
23
|
|
|
24
|
-
## 2. `~하는 이유가 여기
|
|
24
|
+
## 2. `~하는 이유가 여기 있다`로 설명을 가리키지 않는다
|
|
25
25
|
|
|
26
|
-
사람 0.01, 기계 6.30.
|
|
26
|
+
사람 0.01, 기계 6.30. 630배다.
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
`그래서 도마는 나무를
|
|
28
|
+
이 말은 이유를 이미 말해 놓고 그 이유를 다시 가리킨다. 이유를 말했으면 거기서 끝낸다.
|
|
29
|
+
`그래서 도마는 나무를 쓴다`로 끝내고 `도마를 나무로 쓰는 이유가 여기 있다`를 덧붙이지 않는다.
|
|
30
30
|
|
|
31
|
-
## 3. 산문 안에서 번호를 매기지
|
|
31
|
+
## 3. 산문 안에서 번호를 매기지 않는다
|
|
32
32
|
|
|
33
|
-
`그다음` 사람 0.06, 기계 6.93
|
|
33
|
+
`그다음` 사람 0.06, 기계 6.93(116배). `첫 번째는 / 두 번째는` 사람 0.22, 기계 9.14(42배).
|
|
34
34
|
|
|
35
|
-
목록을
|
|
36
|
-
산문이면 `먼저`, `그런데`, `대신` 같은 말로
|
|
35
|
+
목록을 문장처럼 쓴 것이라 읽는 사람이 헤맨다. 진짜 목록이면 목록으로 쓰고,
|
|
36
|
+
산문이면 `먼저`, `그런데`, `대신` 같은 말로 잇거나 아무것도 붙이지 않고 그냥 다음 문장을 쓴다.
|
|
37
37
|
|
|
38
|
-
## 4. `~하는 편이
|
|
38
|
+
## 4. `~하는 편이 낫다`로 권고를 흐리지 않는다
|
|
39
39
|
|
|
40
|
-
사람 0.47, 기계 16.07.
|
|
40
|
+
사람 0.47, 기계 16.07. 34배다.
|
|
41
41
|
|
|
42
|
-
|
|
43
|
-
무엇에 따라
|
|
42
|
+
단정하지 않고 권하는 말이라 무엇을 하라는지가 흐려진다. 권하려면 바로 권하고(`아침에 달려라`),
|
|
43
|
+
정말 경우에 따라 답이 달라지는 문제면 무엇에 따라 달라지는지 말한다(`무릎이 아프면 걷고, 안 아프면 달려라`).
|
|
44
44
|
|
|
45
|
-
## 5. `~인 셈이다`, `~인
|
|
45
|
+
## 5. `~인 셈이다`, `~인 식이다`로 되짚지 않는다
|
|
46
46
|
|
|
47
|
-
사람 0.13, 기계 4.10.
|
|
47
|
+
사람 0.13, 기계 4.10. 32배다.
|
|
48
48
|
|
|
49
|
-
방금 한 말을 한 번 더 말하는
|
|
49
|
+
방금 한 말을 한 번 더 말하는 문장이다. 한 번 말했으면 됐다.
|
|
50
50
|
|
|
51
|
-
## 6. `X가 아니라 Y
|
|
51
|
+
## 6. `X가 아니라 Y다`를 남발하지 않는다
|
|
52
52
|
|
|
53
|
-
사람 7.05, 기계 65.55.
|
|
53
|
+
사람 7.05, 기계 65.55. 9.3배다.
|
|
54
54
|
|
|
55
|
-
|
|
56
|
-
`Y
|
|
55
|
+
묻지 않은 오해를 먼저 세워 놓고 바로잡는 문형이다. 한 편에 한 번이면 힘이 있지만, 세 번 넘게 쓰면 글이 같은 소리로 읽힌다.
|
|
56
|
+
`Y다`라고 바로 말한다.
|
|
57
57
|
|
|
58
|
-
## 7. 앞의 여섯을 피하느라 글을 망치지
|
|
58
|
+
## 7. 앞의 여섯을 피하느라 글을 망치지 않는다
|
|
59
59
|
|
|
60
|
-
이 목록은 피할 것의 목록이지 쓸 것의 목록이 아니다. 그러니 하고 싶은 말을 먼저 정하고, 그 말을
|
|
61
|
-
쓴 다음, 1번부터 6번까지가 습관으로 끼어들었는지만
|
|
60
|
+
이 목록은 피할 것의 목록이지 쓸 것의 목록이 아니다. 그러니 하고 싶은 말을 먼저 정하고, 그 말을 돌려 말하지 않고
|
|
61
|
+
쓴 다음, 1번부터 6번까지가 습관으로 끼어들었는지만 본다.
|
|
62
62
|
|
|
63
|
-
사용자 원문과 분야 자료에 나온
|
|
64
|
-
|
|
63
|
+
용어는 사용자 원문과 분야 자료에 나온 이름을 먼저 확인하고 그 이름을 그대로 쓴다. 쉽게 풀어 쓰려고 새 번역어를
|
|
64
|
+
만들지 않고, 필요한 뜻이나 동작을 문장으로 설명한다.
|
package/data/patterns.json
CHANGED
|
@@ -3,68 +3,68 @@
|
|
|
3
3
|
{
|
|
4
4
|
"name": "행동과 결과",
|
|
5
5
|
"form": "{대상}을 {행동}하면 {결과}가 {어디}에 {생깁니다}",
|
|
6
|
-
"when": "독자에게 무엇을
|
|
7
|
-
"example": "`저장` 버튼을 클릭하면 `report.csv
|
|
6
|
+
"when": "독자에게 무엇을 하라고 할 때. 할 수 있다고만 말하지 않고, 독자가 할 일과 그 뒤에 보일 것을 한 문장에 담는다",
|
|
7
|
+
"example": "`저장` 버튼을 클릭하면 `report.csv`가 그 폴더에 만들어집니다.",
|
|
8
8
|
"instead": "이 기능을 통해 파일 생성이 가능합니다.",
|
|
9
9
|
"avoids": [
|
|
10
10
|
"translationese"
|
|
11
11
|
],
|
|
12
|
-
"source": "
|
|
12
|
+
"source": "배상복 문장기술: 주어와 서술어를 붙여 쓴다"
|
|
13
13
|
},
|
|
14
14
|
{
|
|
15
15
|
"name": "확인",
|
|
16
16
|
"form": "{무엇}이 {어떤지} 확인합니다. {그 값}이 보이면 된 것입니다",
|
|
17
|
-
"when": "절을
|
|
18
|
-
"example": "폴더에 `link.png
|
|
17
|
+
"when": "절을 마칠 때. 독자가 자기 화면에서 결과를 확인할 수 있게 한다",
|
|
18
|
+
"example": "폴더에 `link.png`가 생겼는지 확인합니다. 파일이 보이면 된 것입니다.",
|
|
19
19
|
"instead": "결과가 저장되어집니다.",
|
|
20
20
|
"avoids": [
|
|
21
21
|
"doublePassive"
|
|
22
22
|
],
|
|
23
|
-
"source": "글쓰기
|
|
23
|
+
"source": "글쓰기 원칙: 한 절을 다 읽으면 결과 하나가 남는다"
|
|
24
24
|
},
|
|
25
25
|
{
|
|
26
26
|
"name": "인과 잇기",
|
|
27
27
|
"form": "{앞 사실}입니다. 그래서 {뒤 사실}입니다",
|
|
28
|
-
"when": "
|
|
28
|
+
"when": "사실 둘 이상을 나란히 놓을 때. 두 사실의 관계를 독자가 짐작하게 두지 않는다",
|
|
29
29
|
"example": "병합 셀은 첫 칸에만 값이 들어 있습니다. 그래서 그대로 정렬하면 빈 칸이 값과 떨어져 순서가 깨집니다.",
|
|
30
30
|
"instead": "값이 있습니다. 칸은 빕니다. 순서가 깨집니다.",
|
|
31
31
|
"avoids": [
|
|
32
32
|
"factListParagraph"
|
|
33
33
|
],
|
|
34
|
-
"source": "
|
|
34
|
+
"source": "이수열: 문장은 이어져야 한다"
|
|
35
35
|
},
|
|
36
36
|
{
|
|
37
37
|
"name": "이름으로 이어받기",
|
|
38
38
|
"form": "{앞에서 만든 것}은 {상태}입니다. {아직 못 하는 일}입니다",
|
|
39
|
-
"when": "새 문단이나 새 절을
|
|
40
|
-
"example": "`link.png
|
|
39
|
+
"when": "새 문단이나 새 절을 시작할 때. 지시어 대신 앞에서 만든 것의 이름을 쓴다",
|
|
40
|
+
"example": "`link.png`는 33픽셀입니다. 명함에 넣기에는 너무 작습니다.",
|
|
41
41
|
"instead": "터미널을 엽니다. 이것을 실행합니다.",
|
|
42
42
|
"avoids": [
|
|
43
43
|
"danglingDeixis"
|
|
44
44
|
],
|
|
45
|
-
"source": "
|
|
45
|
+
"source": "김정선 내 문장이 그렇게 이상한가요: `것`을 이름으로 바꾼다"
|
|
46
46
|
},
|
|
47
47
|
{
|
|
48
48
|
"name": "독자에게 묻기",
|
|
49
49
|
"form": "그럼 {무엇}은 {어디}에 {있을까요}? {답}",
|
|
50
|
-
"when": "독자가 품을
|
|
50
|
+
"when": "독자가 의문을 품을 만한 곳. 글이 대신 묻고 다음 문장에서 답한다",
|
|
51
51
|
"example": "## 절\n\n파일을 만듭니다.\n\n## 다음 절\n\n그럼 파일은 어디에 생겼을까요? 방금 명령을 실행한 그 폴더에 있습니다.\n",
|
|
52
52
|
"instead": "## 절\n\n파일을 만듭니다.\n\n## 다음 절\n\n파일이 만들어집니다.\n",
|
|
53
53
|
"avoids": [
|
|
54
54
|
"noQuestion"
|
|
55
55
|
],
|
|
56
|
-
"source": "글쓰기
|
|
56
|
+
"source": "글쓰기 원칙: 사실만 늘어놓지 않고 독자에게 말을 건다"
|
|
57
57
|
},
|
|
58
58
|
{
|
|
59
59
|
"name": "값 소개",
|
|
60
60
|
"form": "{값}은 {무엇}입니다. {왜 그 값인지}. {지금 무엇을 하면 되는지}",
|
|
61
|
-
"when": "새 숫자나 옵션이 처음 나올 때. 셋
|
|
62
|
-
"example": "`border
|
|
61
|
+
"when": "새 숫자나 옵션이 처음 나올 때. 셋 가운데 하나라도 적지 못하면 그 값을 아직 넣을 때가 아니다",
|
|
62
|
+
"example": "`border`는 그림 바깥에 남기는 빈 칸의 수입니다. 빈 자리가 없으면 카메라가 그림의 끝을 못 찾습니다. 그래서 기본값 4를 그대로 둡니다.",
|
|
63
63
|
"instead": "메모리 최대치는 453MB에서 700MB로 올라갔습니다.",
|
|
64
64
|
"avoids": [
|
|
65
65
|
"numberOrphan"
|
|
66
66
|
],
|
|
67
|
-
"source": "글쓰기
|
|
67
|
+
"source": "글쓰기 원칙: 새로 나온 값과 옵션은 세 가지를 그 자리에서 알려 준다"
|
|
68
68
|
},
|
|
69
69
|
{
|
|
70
70
|
"name": "동사로 되돌리기",
|
|
@@ -75,29 +75,29 @@
|
|
|
75
75
|
"avoids": [
|
|
76
76
|
"nounPile"
|
|
77
77
|
],
|
|
78
|
-
"source": "이오덕 우리글
|
|
78
|
+
"source": "이오덕 우리글 바로쓰기: 명사문을 동사문으로 바꾼다"
|
|
79
79
|
},
|
|
80
80
|
{
|
|
81
|
-
"name": "
|
|
82
|
-
"form": "{독자가 지금 하려는 일}입니다. {왜 지금 방법으로는 안 되는지}. 끝까지 읽으면 {
|
|
83
|
-
"when": "글의 첫 문단. 정의로 시작하지 않고 독자가 막힌
|
|
84
|
-
"example": "거래 기록을 CSV로 다운로드했더니 5백만 줄입니다. 엑셀로 열면 1,048,576줄에서 잘립니다. 끝까지 읽으면 그 표를
|
|
81
|
+
"name": "독자가 막힌 데서 시작하는 도입",
|
|
82
|
+
"form": "{독자가 지금 하려는 일}입니다. {왜 지금 방법으로는 안 되는지}. 끝까지 읽으면 {무엇}을 {할 수 있습니다}",
|
|
83
|
+
"when": "글의 첫 문단. 정의로 시작하지 않고 독자가 막힌 곳에서 시작한다",
|
|
84
|
+
"example": "거래 기록을 CSV로 다운로드했더니 5백만 줄입니다. 엑셀로 열면 1,048,576줄에서 잘립니다. 끝까지 읽으면 그 표를 코드로 열 수 있습니다.",
|
|
85
85
|
"instead": "핵심은 속도입니다.",
|
|
86
86
|
"avoids": [
|
|
87
87
|
"cliche"
|
|
88
88
|
],
|
|
89
|
-
"source": "
|
|
89
|
+
"source": "이태준 문장강화: 첫머리"
|
|
90
90
|
},
|
|
91
91
|
{
|
|
92
|
-
"name": "미룬
|
|
92
|
+
"name": "미룬 이야기 다시 다루기",
|
|
93
93
|
"form": "앞에서 미룬 {이름}을 이제 봅니다",
|
|
94
|
-
"when": "뒤에서 다루겠다고
|
|
95
|
-
"example": "앞에서 미룬 `usecols
|
|
94
|
+
"when": "뒤에서 다루겠다고 미뤄 둔 것을 실제로 다룰 때. 미뤘다는 사실을 밝히고 그 이름을 다시 쓴다",
|
|
95
|
+
"example": "앞에서 미룬 `usecols`를 이제 봅니다.",
|
|
96
96
|
"instead": "다음으로 크기를 바꿉니다.",
|
|
97
97
|
"avoids": [
|
|
98
98
|
"fillerOpener"
|
|
99
99
|
],
|
|
100
|
-
"source": "글쓰기
|
|
100
|
+
"source": "글쓰기 원칙: 미룬 이야기는 같은 글 안에서 다시 다룬다"
|
|
101
101
|
}
|
|
102
102
|
]
|
|
103
103
|
}
|
package/data/phraseRepeat.json
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
"pattern": "[이가] 아니라[^.!?]{0,40}(?:이다|입니다|이에요|예요|이야|다\\.|요\\.)",
|
|
5
5
|
"share": 0.08,
|
|
6
6
|
"label": "X가 아니라 Y다",
|
|
7
|
-
"why": "
|
|
8
|
-
"source": "사람 4,021편의 99
|
|
7
|
+
"why": "묻지 않은 오해를 먼저 세워 놓고 바로잡는 문형이다. 한 편에 한 번이면 힘이 있지만 되풀이하면 글이 같은 소리로 읽힌다. `Y다`라고 바로 쓴다",
|
|
8
|
+
"source": "사람 글 4,021편의 99%는 7.1% 이하이고 기계 글 360편의 33%는 8%를 넘는다"
|
|
9
9
|
}
|
|
10
10
|
]
|
|
11
11
|
}
|