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.
- package/README.md +23 -20
- package/data/calqueFrame.json +60 -0
- package/data/cliches.json +39 -29
- package/data/collocationStops.txt +28 -0
- package/data/confusable.json +20 -20
- package/data/easyWords.json +12 -246
- package/data/exemplars.json +50 -29
- package/data/hiddenDeps.txt +11 -11
- package/data/japaneseLoan.json +27 -27
- package/data/koreanProse.txt +64 -0
- package/data/patterns.json +26 -26
- package/data/phraseRepeat.json +11 -0
- package/data/platformApis.txt +11 -11
- package/data/redundantPair.json +16 -16
- package/data/ruleCategories.json +2 -0
- package/data/ruleDocs.json +56 -54
- package/data/ruleMechanisms.json +2 -0
- package/data/screenNarration.json +10 -10
- package/data/screenSentence.json +60 -12
- package/data/screenTone.json +6 -6
- package/data/screenWord.json +70 -110
- package/data/spacing.json +12 -12
- package/data/spelling.json +29 -29
- package/data/translationese.json +23 -24
- package/data/usageCounts.report.json +1676 -0
- 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 +3 -3
- package/src/analysis/josa.js +1 -1
- package/src/analysis/splitSentences.js +1 -1
- package/src/analysis/tokenize.js +41 -26
- package/src/baseline/store.js +8 -8
- package/src/cli/help.js +11 -10
- package/src/cli/main.js +332 -182
- package/src/cli/walk.js +2 -2
- 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 +44 -25
- 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 +6 -6
- package/src/data/prose.js +27 -0
- 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 +117 -19
- package/src/edit/applyFixes.js +0 -0
- package/src/fingerprint/build.js +18 -9
- package/src/fingerprint/codeBlocks.js +3 -3
- package/src/fingerprint/codeMarkers.js +4 -4
- package/src/fingerprint/dictionaries.js +34 -7
- package/src/fingerprint/markers.js +27 -5
- 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 +9 -7
- 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 +7 -3
- package/src/report/fingerprintJson.js +2 -2
- package/src/report/githubReport.js +1 -1
- package/src/report/jsonReport.js +3 -3
- package/src/report/registerMatch.js +2 -2
- package/src/report/sheet.js +0 -0
- package/src/report/textReport.js +35 -16
- package/src/report/writingSpec.js +17 -17
- 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 +30 -26
- package/src/rules/screen/screenWord.js +2 -1
- package/src/rules/sentence/calqueFrame.js +11 -0
- package/src/rules/sentence/cliche.js +7 -3
- 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/hardWord.js +6 -3
- package/src/rules/sentence/imperativePeriod.js +1 -1
- package/src/rules/sentence/japaneseLoan.js +7 -3
- package/src/rules/sentence/longSentence.js +1 -1
- package/src/rules/sentence/negationRedefine.js +1 -1
- package/src/rules/sentence/nounPile.js +10 -4
- package/src/rules/sentence/numberOrphan.js +1 -1
- package/src/rules/sentence/outsideProfile.js +8 -3
- package/src/rules/sentence/phraseRepeat.js +54 -0
- package/src/rules/sentence/redundantPair.js +7 -3
- package/src/rules/sentence/translationese.js +7 -3
- package/src/rules/shared/candidates.js +2 -2
- package/src/rules/shared/dictionaryRule.js +46 -8
- 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 +54 -0
- package/src/usage/index.js +8 -0
- package/src/usage/sentences.js +681 -0
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
|
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# 한국어 산문 일곱 줄
|
|
2
|
+
|
|
3
|
+
한국어 글을 쓰기 전에 읽는다.
|
|
4
|
+
|
|
5
|
+
초보자용 설명에서도 표준 용어와 실제 UI 명칭을 유지한다. 쉬운 설명은 정의와 예시를 덧붙이는 일이다.
|
|
6
|
+
마우스는 클릭, 터치는 탭, 체크박스는 선택·해제, 키보드는 키 입력, 명령은 실행으로 동작을 구분한다.
|
|
7
|
+
`클릭`을 `누른다`로 바꾸거나 `필터`를 `거르개`로, `래핑`을 `감싸개`로 번역하지 않는다. 필터는 조건에 맞는 항목을
|
|
8
|
+
선택하는 기능이며, 래핑은 기존 기능을 다른 코드로 감싸 호출 방식이나 동작을 조정하는 기법처럼 설명한다.
|
|
9
|
+
Excel의 셀·행·열·시트도 이름을 유지한다. 파일 내용 수정, 설정 변경, 오류 해결처럼 작업 대상을 명시한다.
|
|
10
|
+
문맥을 판단해야 하는 제안은 오류 수를 줄이려고 적용하지 않는다. 검사 결과보다 사실과 용어의 정확성을 먼저 확인한다.
|
|
11
|
+
|
|
12
|
+
아래 일곱 항목 가운데 앞의 여섯은 사람이 쓴 한국어 155만 문장(백과사전, 지침, 토론, 보고서)과
|
|
13
|
+
기계가 쓴 360편을 비교해 찾은 표현이다. 붙은 수는 천 문장당 비율이다(긴 문장만 글 안의 비율).
|
|
14
|
+
사람 쪽은 장르 넷 가운데 가장 높은 값이다.
|
|
15
|
+
일곱째는 이 수치를 적용할 때 글의 뜻과 독자의 말을 지키는 원칙이다.
|
|
16
|
+
|
|
17
|
+
## 1. 긴 문장을 아예 안 쓰면 기계 글이다
|
|
18
|
+
|
|
19
|
+
사람은 서른 어절 넘는 문장을 스무 문장에 하나쯤 쓰는데(4.6~15.5%) 기계는 0.3%라서 15배 넘게 차이가 난다.
|
|
20
|
+
|
|
21
|
+
짧게 끊는 것이 미덕이라고 배웠겠지만, 사람 글의 리듬은 가끔 길게 이어지는 문장에서 나온다.
|
|
22
|
+
한 단락에 하나쯤은 숨을 길게 끌고 가는 문장을 두고, 조건과 이유와 결과를 한 문장 안에 엮는다.
|
|
23
|
+
|
|
24
|
+
## 2. `~하는 이유가 여기 있다`로 설명을 가리키지 않는다
|
|
25
|
+
|
|
26
|
+
사람 0.01, 기계 6.30. 630배다.
|
|
27
|
+
|
|
28
|
+
이 말은 이유를 이미 말해 놓고 그 이유를 다시 가리킨다. 이유를 말했으면 거기서 끝낸다.
|
|
29
|
+
`그래서 도마는 나무를 쓴다`로 끝내고 `도마를 나무로 쓰는 이유가 여기 있다`를 덧붙이지 않는다.
|
|
30
|
+
|
|
31
|
+
## 3. 산문 안에서 번호를 매기지 않는다
|
|
32
|
+
|
|
33
|
+
`그다음` 사람 0.06, 기계 6.93(116배). `첫 번째는 / 두 번째는` 사람 0.22, 기계 9.14(42배).
|
|
34
|
+
|
|
35
|
+
목록을 문장처럼 쓴 것이라 읽는 사람이 헤맨다. 진짜 목록이면 목록으로 쓰고,
|
|
36
|
+
산문이면 `먼저`, `그런데`, `대신` 같은 말로 잇거나 아무것도 붙이지 않고 그냥 다음 문장을 쓴다.
|
|
37
|
+
|
|
38
|
+
## 4. `~하는 편이 낫다`로 권고를 흐리지 않는다
|
|
39
|
+
|
|
40
|
+
사람 0.47, 기계 16.07. 34배다.
|
|
41
|
+
|
|
42
|
+
단정하지 않고 권하는 말이라 무엇을 하라는지가 흐려진다. 권하려면 바로 권하고(`아침에 달려라`),
|
|
43
|
+
정말 경우에 따라 답이 달라지는 문제면 무엇에 따라 달라지는지 말한다(`무릎이 아프면 걷고, 안 아프면 달려라`).
|
|
44
|
+
|
|
45
|
+
## 5. `~인 셈이다`, `~인 식이다`로 되짚지 않는다
|
|
46
|
+
|
|
47
|
+
사람 0.13, 기계 4.10. 32배다.
|
|
48
|
+
|
|
49
|
+
방금 한 말을 한 번 더 말하는 문장이다. 한 번 말했으면 됐다.
|
|
50
|
+
|
|
51
|
+
## 6. `X가 아니라 Y다`를 남발하지 않는다
|
|
52
|
+
|
|
53
|
+
사람 7.05, 기계 65.55. 9.3배다.
|
|
54
|
+
|
|
55
|
+
묻지 않은 오해를 먼저 세워 놓고 바로잡는 문형이다. 한 편에 한 번이면 힘이 있지만, 세 번 넘게 쓰면 글이 같은 소리로 읽힌다.
|
|
56
|
+
`Y다`라고 바로 말한다.
|
|
57
|
+
|
|
58
|
+
## 7. 앞의 여섯을 피하느라 글을 망치지 않는다
|
|
59
|
+
|
|
60
|
+
이 목록은 피할 것의 목록이지 쓸 것의 목록이 아니다. 그러니 하고 싶은 말을 먼저 정하고, 그 말을 돌려 말하지 않고
|
|
61
|
+
쓴 다음, 1번부터 6번까지가 습관으로 끼어들었는지만 본다.
|
|
62
|
+
|
|
63
|
+
용어는 사용자 원문과 분야 자료에 나온 이름을 먼저 확인하고 그 이름을 그대로 쓴다. 쉽게 풀어 쓰려고 새 번역어를
|
|
64
|
+
만들지 않고, 필요한 뜻이나 동작을 문장으로 설명한다.
|
package/data/patterns.json
CHANGED
|
@@ -3,68 +3,68 @@
|
|
|
3
3
|
{
|
|
4
4
|
"name": "행동과 결과",
|
|
5
5
|
"form": "{대상}을 {행동}하면 {결과}가 {어디}에 {생깁니다}",
|
|
6
|
-
"when": "독자에게 무엇을
|
|
7
|
-
"example": "`저장` 버튼을
|
|
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로
|
|
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
|
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"entry": [
|
|
3
|
+
{
|
|
4
|
+
"pattern": "[이가] 아니라[^.!?]{0,40}(?:이다|입니다|이에요|예요|이야|다\\.|요\\.)",
|
|
5
|
+
"share": 0.08,
|
|
6
|
+
"label": "X가 아니라 Y다",
|
|
7
|
+
"why": "묻지 않은 오해를 먼저 세워 놓고 바로잡는 문형이다. 한 편에 한 번이면 힘이 있지만 되풀이하면 글이 같은 소리로 읽힌다. `Y다`라고 바로 쓴다",
|
|
8
|
+
"source": "사람 글 4,021편의 99%는 7.1% 이하이고 기계 글 360편의 33%는 8%를 넘는다"
|
|
9
|
+
}
|
|
10
|
+
]
|
|
11
|
+
}
|
package/data/platformApis.txt
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
# 한 운영체제에서만 도는 API
|
|
2
|
-
# 실측: 004
|
|
3
|
-
peak_wset 윈도우 맥과 리눅스는 memory_info().rss
|
|
4
|
-
os\.startfile\( 윈도우 subprocess.run(["open", 경로])
|
|
1
|
+
# 한 운영체제에서만 도는 API와 경로. `정규식<TAB>플랫폼<TAB>대안`. platformApi가 코드 블록에서 경고로 짚는다.
|
|
2
|
+
# 실측: 블로그 004의 peak_wset은 윈도우에서만 나와 맥과 리눅스 독자가 AttributeError로 멈췄다(사람 평가자 지적).
|
|
3
|
+
peak_wset 윈도우 맥과 리눅스는 memory_info().rss나 resource.getrusage(...).ru_maxrss를 쓴다
|
|
4
|
+
os\.startfile\( 윈도우 subprocess.run(["open", 경로])나 xdg-open을 쓴다
|
|
5
5
|
\bwinreg\b 윈도우 레지스트리는 윈도우에만 있다
|
|
6
|
-
\bmsvcrt\b 윈도우 termios
|
|
7
|
-
\bwin32(?:api|con|gui|com)\b 윈도우 pywin32
|
|
8
|
-
\bosascript\b 맥 다른 운영체제에는 AppleScript
|
|
9
|
-
# /proc
|
|
6
|
+
\bmsvcrt\b 윈도우 termios나 다른 입력 방법을 쓴다
|
|
7
|
+
\bwin32(?:api|con|gui|com)\b 윈도우 pywin32는 윈도우 전용이다
|
|
8
|
+
\bosascript\b 맥 다른 운영체제에는 AppleScript가 없다
|
|
9
|
+
# /proc/는 뺐다. 코드에 박히는 API 호출이 아니라 셸 명령의 경로이고, 컨테이너 안에서는
|
|
10
10
|
# 리눅스가 기본 실행 환경이다. 실측: 기준 말뭉치의 지적 여덟 건이 전부 이 한 줄이었고 전부
|
|
11
|
-
# 쿠버네티스 안내서의 kubectl exec
|
|
12
|
-
\bfcntl\b 리눅스와 맥 윈도우에는 fcntl
|
|
11
|
+
# 쿠버네티스 안내서의 kubectl exec와 컨테이너 안 셸 기록이라 독자가 멈추지 않는다 (2026-08-31).
|
|
12
|
+
\bfcntl\b 리눅스와 맥 윈도우에는 fcntl이 없다
|
|
13
13
|
resource\.getrusage\( 리눅스와 맥 윈도우에는 resource 모듈이 없다
|
|
14
|
-
[A-Za-z]:\\\\ 윈도우 절대 경로 대신 상대 경로나 pathlib
|
|
14
|
+
[A-Za-z]:\\\\ 윈도우 절대 경로 대신 상대 경로나 pathlib을 쓴다
|
package/data/redundantPair.json
CHANGED
|
@@ -3,67 +3,67 @@
|
|
|
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
11
|
"fix": "그때",
|
|
12
|
-
"why": "
|
|
13
|
-
"source": "국립국어원 2005"
|
|
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": "
|
|
30
|
+
"why": "`판이하다`가 이미 아주 다르다는 뜻이다",
|
|
31
31
|
"source": "법조신문 넘쳐나는 겹말들"
|
|
32
32
|
},
|
|
33
33
|
{
|
|
34
34
|
"pattern": "결실을 맺",
|
|
35
35
|
"fix": "결실을 보",
|
|
36
|
-
"why": "
|
|
36
|
+
"why": "`결실(結實)`의 `결`이 이미 `맺다`라는 뜻이다",
|
|
37
37
|
"source": "법조신문 넘쳐나는 겹말들"
|
|
38
38
|
},
|
|
39
39
|
{
|
|
40
40
|
"pattern": "남은 여생",
|
|
41
41
|
"fix": "여생",
|
|
42
|
-
"why": "
|
|
42
|
+
"why": "`여생(餘生)`이 이미 남은 삶이라는 뜻이다",
|
|
43
43
|
"source": "법조신문 넘쳐나는 겹말들"
|
|
44
44
|
},
|
|
45
45
|
{
|
|
46
46
|
"pattern": "미리 예약",
|
|
47
47
|
"fix": "예약",
|
|
48
|
-
"why": "
|
|
48
|
+
"why": "`예약(豫約)`의 `예`가 이미 `미리`라는 뜻이다",
|
|
49
49
|
"source": "법조신문 넘쳐나는 겹말들"
|
|
50
50
|
},
|
|
51
51
|
{
|
|
52
|
-
"pattern": "(?:또)?다시 재(?!(?:력|주|산|물|화|벌|원|무|정|능|치|간|료|목|질|난|해|앙|고|판){조사})([가-힣]+)",
|
|
52
|
+
"pattern": "(?:또)?다시 재(?!(?:력|주|산|물|화|벌|원|무|정|능|치|간|료|목|질|난|해|앙|고|판){조사})(?!(?:거나|면|서|며|니|는|어|어서|었다|야|요|다|도|지)(?![가-힣]))([가-힣]+)",
|
|
53
53
|
"fix": "재$1",
|
|
54
|
-
"why": "
|
|
54
|
+
"why": "`재(再)`가 이미 `다시`라는 뜻이다",
|
|
55
55
|
"source": "법조신문 넘쳐나는 겹말들"
|
|
56
56
|
},
|
|
57
57
|
{
|
|
58
58
|
"pattern": "서로 상의",
|
|
59
59
|
"fix": "상의",
|
|
60
|
-
"why": "
|
|
60
|
+
"why": "`상의(相議)`의 `상`이 이미 `서로`라는 뜻이다",
|
|
61
61
|
"source": "법조신문 넘쳐나는 겹말들"
|
|
62
62
|
},
|
|
63
63
|
{
|
|
64
64
|
"pattern": "과반수 이상",
|
|
65
65
|
"fix": "과반수",
|
|
66
|
-
"why": "
|
|
66
|
+
"why": "`과반수`가 이미 절반이 넘는 수라는 뜻이다",
|
|
67
67
|
"source": "법조신문 넘쳐나는 겹말들"
|
|
68
68
|
}
|
|
69
69
|
]
|
package/data/ruleCategories.json
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"blockUnread": "structure",
|
|
3
3
|
"bridgeRepeat": "structure",
|
|
4
|
+
"calqueFrame": "sentence",
|
|
4
5
|
"cliche": "sentence",
|
|
5
6
|
"confusable": "orthography",
|
|
6
7
|
"connectorRepeat": "sentence",
|
|
@@ -41,6 +42,7 @@
|
|
|
41
42
|
"numberOrphan": "sentence",
|
|
42
43
|
"outsideProfile": "sentence",
|
|
43
44
|
"paraFragment": "paragraph",
|
|
45
|
+
"phraseRepeat": "sentence",
|
|
44
46
|
"platformApi": "code",
|
|
45
47
|
"promiseRecall": "document",
|
|
46
48
|
"redundantPair": "sentence",
|