hanlint 0.0.1
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 +27 -0
- package/bin/hanlint.js +4 -0
- package/data/causalMarkers.txt +25 -0
- package/data/cliches.json +99 -0
- package/data/confusable.json +76 -0
- package/data/connectors.txt +18 -0
- package/data/countUnits.txt +6 -0
- package/data/coverageTypes.txt +7 -0
- package/data/deixis.txt +8 -0
- package/data/easyWords.json +340 -0
- package/data/emphasisWords.txt +11 -0
- package/data/endings.txt +9 -0
- package/data/euiNouns.txt +40 -0
- package/data/hedges.txt +15 -0
- package/data/hiddenDeps.txt +11 -0
- package/data/holeKinds.json +145 -0
- package/data/japaneseLoan.json +82 -0
- package/data/josa.txt +54 -0
- package/data/koreanNumbers.txt +22 -0
- package/data/passiveStems.txt +53 -0
- package/data/platformApis.txt +12 -0
- package/data/promiseMarkers.txt +7 -0
- package/data/pythonPackages.txt +35 -0
- package/data/pythonStdlib.txt +193 -0
- package/data/readerCalls.txt +14 -0
- package/data/recallMarkers.txt +6 -0
- package/data/redundantPair.json +70 -0
- package/data/ruleDocs.json +44 -0
- package/data/spacing.json +76 -0
- package/data/spelling.json +166 -0
- package/data/stopwords.txt +33 -0
- package/data/translationese.json +104 -0
- package/data/verbTails.txt +56 -0
- package/data/version.json +1 -0
- package/package.json +39 -0
- package/src/analysis/index.js +34 -0
- package/src/analysis/surface/splitSentences.js +36 -0
- package/src/analysis/surface/tokenize.js +162 -0
- package/src/cli/main.js +376 -0
- package/src/config/loadConfig.js +51 -0
- package/src/config/settings.js +80 -0
- package/src/config/toml.js +239 -0
- package/src/data/load.js +63 -0
- package/src/document/model.js +55 -0
- package/src/document/parseMarkdown.js +183 -0
- package/src/document/plainText.js +43 -0
- package/src/edit/applyFixes.js +0 -0
- package/src/fingerprint/build.js +284 -0
- package/src/fingerprint/dictionaries.js +118 -0
- package/src/fingerprint/markers.js +175 -0
- package/src/fingerprint/topics.js +42 -0
- package/src/index.js +68 -0
- package/src/regex.js +47 -0
- package/src/report/compactReport.js +9 -0
- package/src/report/fingerprintJson.js +126 -0
- package/src/report/githubReport.js +13 -0
- package/src/report/jsonReport.js +16 -0
- package/src/report/textReport.js +19 -0
- package/src/rules/code/duplicateBlock.js +48 -0
- package/src/rules/code/firstResultDistance.js +23 -0
- package/src/rules/code/inputFileSource.js +103 -0
- package/src/rules/code/installImport.js +126 -0
- package/src/rules/code/platformApi.js +36 -0
- package/src/rules/document/countMismatch.js +42 -0
- package/src/rules/document/keywordMissing.js +21 -0
- package/src/rules/document/noQuestion.js +11 -0
- package/src/rules/document/promiseRecall.js +12 -0
- package/src/rules/document/readerAbsent.js +11 -0
- package/src/rules/finding.js +53 -0
- package/src/rules/orthography/confusable.js +9 -0
- package/src/rules/orthography/spacing.js +9 -0
- package/src/rules/orthography/spelling.js +9 -0
- package/src/rules/paragraph/factListParagraph.js +27 -0
- package/src/rules/paragraph/paraFragment.js +29 -0
- package/src/rules/paragraph/topicBreak.js +25 -0
- package/src/rules/registry.js +147 -0
- package/src/rules/sentence/cliche.js +9 -0
- package/src/rules/sentence/connectorRepeat.js +23 -0
- package/src/rules/sentence/danglingDeixis.js +19 -0
- package/src/rules/sentence/dash.js +21 -0
- package/src/rules/sentence/deixis.js +19 -0
- package/src/rules/sentence/doubleNegative.js +28 -0
- package/src/rules/sentence/doublePassive.js +17 -0
- package/src/rules/sentence/ellipsis.js +17 -0
- package/src/rules/sentence/endingRepeat.js +25 -0
- package/src/rules/sentence/euiChain.js +18 -0
- package/src/rules/sentence/fillerOpener.js +18 -0
- package/src/rules/sentence/hardWord.js +10 -0
- package/src/rules/sentence/imperativePeriod.js +20 -0
- package/src/rules/sentence/japaneseLoan.js +9 -0
- package/src/rules/sentence/longSentence.js +20 -0
- package/src/rules/sentence/negationRedefine.js +22 -0
- package/src/rules/sentence/nounPile.js +20 -0
- package/src/rules/sentence/redundantPair.js +9 -0
- package/src/rules/sentence/translationese.js +9 -0
- package/src/rules/shared/codeBlocks.js +44 -0
- package/src/rules/shared/dictionaryRule.js +35 -0
- package/src/rules/shared/runs.js +22 -0
- package/src/rules/structure/emojiBullet.js +34 -0
- package/src/rules/structure/headingSentence.js +17 -0
- package/src/rules/structure/headingSkip.js +18 -0
- package/src/rules/structure/headingUniform.js +36 -0
- package/src/rules/structure/introLong.js +20 -0
- package/src/rules/structure/sectionNoProse.js +16 -0
- package/src/rules/structure/sectionResult.js +37 -0
- package/src/text.js +63 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
{
|
|
2
|
+
"entry": [
|
|
3
|
+
{
|
|
4
|
+
"pattern": "역전 ?앞",
|
|
5
|
+
"fix": "역 앞",
|
|
6
|
+
"why": "역전 (驛前) 이 이미 역 앞이다",
|
|
7
|
+
"source": "국립국어원 2005"
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"pattern": "그때 당시",
|
|
11
|
+
"fix": "그때",
|
|
12
|
+
"why": "그때와 당시가 같은 뜻이다",
|
|
13
|
+
"source": "국립국어원 2005"
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"pattern": "매 ?시간마다",
|
|
17
|
+
"fix": "매시간",
|
|
18
|
+
"why": "매와 마다가 같은 뜻이다",
|
|
19
|
+
"source": "국립국어원 2005"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"pattern": "해변가",
|
|
23
|
+
"fix": "해변",
|
|
24
|
+
"why": "해변 (海邊) 의 변이 이미 가다",
|
|
25
|
+
"source": "국립국어원 2005"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"pattern": "판이하게 다(?=[르른릅])",
|
|
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": "재$1",
|
|
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
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cliche": "핵심은, 결국 중요한 것은, 단순히 A 를 넘어, 살펴보겠습니다 같은 상투어.\n\n왜: 문장이 하는 일 없이 매끈하기만 한 표현이다. 독자는 그 자리에서 정보를 받지 못하고 광고를 읽는\n 기분이 든다. 살펴보겠습니다 뒤에 실제 행동이 없으면 문장째 지운다.\n어디서: 글쓰기 스킬의 AI 표현 제거 단계. AI 문체 신호 조사 (Wikipedia Signs of AI writing, gist 패턴4).\n 사전은 data/cliches.toml 이고 설정의 dictionary.cliches 로 더한다.\n고치기: 그 표현이 맡은 일이 있으면 그 일을 직접 쓴다. 핵심은 X 다 는 X 다 로, 살펴보겠습니다 는\n 살펴본 결과로.\n안 잡는 것: 사전에 없는 표현. 사전이 없어도 목적어가 흐린 문장은 나쁘지만 그것은 사람 평가자 몫이다.",
|
|
3
|
+
"confusable": "학생으로써, 정답을 맞추다, 나와 틀리다, 감기가 낳다 처럼 뜻이 다른 말을 바꿔 쓴 자리.\n\n왜: 로서/로써, 맞히다/맞추다, 다르다/틀리다, 낫다/낳다 는 소리가 같거나 비슷해 뜻이 바뀐 줄 모르고 쓴다.\n 독자는 뜻으로 읽다가 걸린다.\n어디서: 국립국어원 한글 맞춤법 제57항 (구별하여 적는 말), 온라인가나다 298340, 표준국어대사전 뜻풀이.\n 앞뒤 낱말로 뜻이 확정되는 자리만 사전에 뒀다 (data/confusable.toml).\n고치기: 항목마다 바른 말을 fix 로 낸다. 활용이 바뀌는 것 (틀려→달라, 낳은→나은) 은 활용까지 바꾼다.\n안 잡는 것: 앞뒤 낱말로 확정되지 않는 자리. 이로써, 그것과 다르다 처럼 이미 맞는 것. 백틱과 따옴표 안의 인용.",
|
|
4
|
+
"connectorRepeat": "같은 접속부사로 시작하는 문장이 한 문단 안에 연달아 오는 자리.\n\n왜: 그리고, 그래서 를 연달아 붙이면 문장 사이의 관계가 전부 같은 것으로 읽히고 리듬이 죽는다.\n어디서: 글쓰기 스킬의 사실과 목소리 (같은 접속사를 연달아 쓰지 않는다). 이태준 문장강화, 유시민\n 글쓰기 특강. 접속부사 목록은 data/connectors.txt.\n고치기: 앞 문장에서 만든 파일이나 값의 이름을 다시 불러 잇는다. 접속사는 그렇게 이어지지 않을 때만.\n안 잡는 것: 문단이 바뀌면 다시 센다. 다른 접속사가 이어지는 것은 잡지 않는다.",
|
|
5
|
+
"countMismatch": "같은 단위로 서로 다른 수를 약속하는 글. 여섯 가지를 소개한다고 열고 다섯 가지라고 닫는 것.\n\n왜: 독자는 어느 쪽을 믿어야 할지 모른다. 약속과 이행이 어긋난 글은 나머지도 의심받는다.\n어디서: 실측. 블로그 004 가 도입에서 여섯 방식을 약속하고 결말에서 다섯 가지라고 적었고 사람 평가자가\n 네 라운드 내내 집었다. 이런 검사를 하는 선행 도구가 없다 (조사 결과). 단위 목록은 data/countUnits.txt.\n고치기: 수를 맞추거나, 서로 다른 것을 세는 문장이면 무엇을 세는지 이름을 붙인다.\n안 잡는 것: 단위가 다른 수 (여섯 가지 와 다섯 열). 같은 수의 반복. 서로 다른 본문 절에 있는 수 (둘째 절의\n 두 가지 와 넷째 절의 네 가지 는 다른 목록이다. 실측: 002). 같은 절 안이거나 도입과 마지막 절 사이만\n 견준다. `3단계` 처럼 숫자가 붙은 단계는 서수라 세지 않는다.",
|
|
6
|
+
"danglingDeixis": "지시어가 있는데 바로 앞 문장과 화제어가 하나도 겹치지 않는 자리.\n\n왜: 이것 이 가리킬 것이 앞 문장에 없다. 독자는 되돌아가도 못 찾는다. 지시어 가운데 가장 나쁜 꼴이다.\n어디서: 지문 계층이 처음 가능하게 한 규칙이다. 앞 문장 화제어 집합과의 자카드 중첩이 0 이면 짚는다.\n 블로그 004 실측에서 사람 평가자가 네 라운드 내내 지시어를 집었다.\n고치기: 가리키는 대상의 이름을 쓴다. 앞 문장에 그 이름이 없다면 앞 문장에 먼저 세운다.\n안 잡는 것: 앞 문장과 화제어가 겹치는 지시어는 deixis 가 짚는다. 글의 첫 문장은 앞이 없으므로 여기서\n 잡는다.",
|
|
7
|
+
"dash": "em 대시 (U+2014) 와 en 대시 (U+2013). 코드 블록까지 글 전체를 본다.\n\n왜: AI 가 매끄럽게 고친다면서 새로 넣는 대표적인 부호다. 한국어 문장 부호가 아니라 독자가 멈춘다.\n GPT-4.1 이 인간 대비 3.28배 쓴다는 조사가 있다.\n어디서: 글쓰기 스킬의 사실과 목소리. Wikipedia Signs of AI writing 4.6. Freeburg 조사.\n고치기: 부연은 마침표로 끊거나 괄호로, 범위는 물결표로 쓴다. 2020~2024.\n안 잡는 것: 하이픈 (-) 과 물결표. 코드 안의 대시도 잡는다. 코드가 대시를 정말 필요로 하면 그 파일에서\n 이 규칙을 끈다.",
|
|
8
|
+
"deixis": "이것, 해당 값, 위의 코드, 이러한 같은 지시어. 앞 문장에 가리킬 것이 있는 경우.\n\n왜: 독자가 스크롤을 되돌려 무엇을 가리키는지 찾아야 한다. 되돌리는 자리는 전부 이탈 지점이다.\n어디서: 글쓰기 스킬의 설명을 풀어 쓰기. 목록은 data/deixis.txt.\n고치기: 가리키는 파일, 값, 코드의 이름을 쓴다. 이것으로 파일이 만들어집니다 는 save 로 link.png 가\n 만들어집니다 로.\n안 잡는 것: 앞 문장과 화제어가 하나도 겹치지 않는 지시어. 그것은 danglingDeixis 가 따로 짚는다.\n 앞서 말한 X 처럼 이름을 다시 부르는 회수 표지.",
|
|
9
|
+
"doubleNegative": "하지 않으면 안 된다, 하지 않을 수 없다 같은 이중 부정.\n\n왜: 부정을 두 번 겹쳐 긍정을 만들면 독자가 한 번 더 뒤집어 읽는다. 일본어 직역에서 온 꼴이다.\n어디서: urimal.org 김민지 2020 번역 투, 나무위키 이중 부정.\n고치기: 긍정으로 쓴다. 노력하지 않으면 안 된다 는 노력해야 한다, 잊지 않을 수 없다 는 잊는다.\n 하다 동사는 기계가 fix 로 낸다.\n안 잡는 것: 뜻을 일부러 약하게 하는 이중 부정 (나쁘지 않다). 그것은 다른 구문이다.",
|
|
10
|
+
"doublePassive": "되어지다, 보여지다, 잊혀지다 처럼 피동에 어지다 를 또 붙인 이중 피동.\n\n왜: 피동이 두 번 겹치면 누가 하는지 한 번 더 흐려진다. 독자는 주어를 찾아 되돌아간다.\n어디서: 국립국어원 어문 규범. im-not-ai A-8 (오경순 2010, 김은일 2015, 서보현 2018). 피동 어간 사전은\n data/passiveStems.txt. Kiwi 태그열 실측은 PRD 부록 A.\n고치기: 하나만 남긴다. 되어진다 는 된다, 보여진다 는 보인다, 잊혀진 은 잊힌.\n안 잡는 것: 만들어진다 같은 단순 피동. 어간이 피동사가 아니면 지적하지 않는다.",
|
|
11
|
+
"duplicateBlock": "앞선 코드나 출력 블록과 거의 같은 블록.\n\n왜: 서른 줄 가운데 한 줄만 다른 블록을 두 번 읽으면 독자는 다른 한 줄을 찾느라 표를 훑는다. 다른 줄만 보이거나\n 앞 블록을 가리키는 것이 낫다.\n어디서: 실측. 블로그 004 에서 두 엔진의 출력 서른 줄 가운데 다른 것은 한 줄이었고 사람 평가자가 집었다.\n 임계는 config.duplicateBlockRatio, 최소 줄 수는 넷.\n고치기: 다른 줄만 남기고 나머지는 앞 블록을 가리킨다. 정말 둘 다 필요하면 무엇이 다른지 산문에서 먼저 말한다.\n안 잡는 것: 넉 줄 미만 블록. 종류가 다른 블록 (코드와 출력). 임계 아래. notice 로만 낸다.",
|
|
12
|
+
"ellipsis": "말줄임표.\n\n왜: 말끝을 흐리면 독자가 결론을 받아 가지 못한다. 설명글의 독자는 답을 찾으러 왔다.\n어디서: 글쓰기 스킬의 사실과 목소리.\n고치기: 문장을 끝까지 쓴다. 모르면 모른다고 쓴다.\n안 잡는 것: 코드 블록 안의 점 셋. 괄호 안의 점 셋 (인라인 코드의 생략 표기). 산문만 본다.",
|
|
13
|
+
"emojiBullet": "이모지로 시작하는 목록 항목.\n\n왜: 불릿마다 이모지를 달면 장식이 정보를 가리고 AI 가 쓴 홍보 글처럼 읽힌다.\n어디서: Wikipedia Signs of AI writing 4.7 (Emoji as formatting), Bloomberg 2026-01 (LinkedIn AI 게시물).\n고치기: 이모지를 지우고 항목의 첫 낱말이 내용을 말하게 한다.\n안 잡는 것: 본문 문장 안의 이모지. 목록 항목의 첫 자리만 본다.",
|
|
14
|
+
"endingRepeat": "같은 종결어미로 끝나는 문장이 한 절 안에 endingRun 개 이상 이어지는 자리.\n\n왜: 습니다 가 네 번 이어지면 리듬이 죽고 AI 가 쓴 글처럼 읽힌다. 짧은 문장과 긴 문장, 평서와 질문을\n 섞으라는 규칙의 기계 판이다.\n어디서: AI 문체 신호 조사 (im-not-ai E-2 동일 종결어미 4문장 이상, gist 패턴35), 경희대 글쓰기 교육의\n 것이다 반복. 임계는 config.endingRun.\n고치기: 하나를 질문으로 바꾸거나, 두 문장을 인과로 잇거나, 독자가 할 행동을 동사로 끝낸다.\n안 잡는 것: 명령형과 의문형의 연속. 종결어미를 못 정한 문장 (없음) 은 연속을 끊는다. 글쓰기 규칙의\n 위반이 아니라 리듬 신호라 notice 로 낸다. 참고 문서는 다 로 끝나는 것이 정상이다.",
|
|
15
|
+
"euiChain": "한 문장에 관형격 조사 의 가 셋 이상이거나, 의 로 끝나는 어절 둘이 붙어 있다 (회사의 팀의 결정).\n\n왜: 명사를 의 로 쌓으면 무엇이 무엇의 목적어인지 표시되지 않아 독자가 조사를 머릿속에서 끼워 넣는다.\n어디서: 글쓰기 스킬의 설명을 풀어 쓰기 (의 가 이어지면 문장으로 편다). 쿠버네티스 한국어 현지화 가이드\n (일본어 の 직역).\n고치기: 동사로 편다. 회사의 팀의 결정 은 회사에서 팀이 정한 것.\n안 잡는 것: 낱말 안의 의 (의미, 의사) 와 의 로 끝나는 낱말 (정의, 회의. 목록은 data/euiNouns.txt). 떨어져 있는\n 의 둘 (글쓰기 규칙의 정본은 사용자 저장소의 스킬이다) 은 자연스러운 한국어라 잡지 않는다. 실측: 문서에서\n 둘 기준이 오탐 4건을 냈다. surface 분석기는 의 뒤에 공백이 올 때만 세고 kiwi 는 JKG 태그를 센다.",
|
|
16
|
+
"factListParagraph": "짧은 평서문 셋 이상이 잇는 말 없이 이어지는 문단.\n\n왜: 쉬운 낱말을 골라도 사실만 나란히 놓으면 읽히지 않는다. 독자는 낱말이 아니라 문장 사이의 이유를\n 못 따라가서 멈춘다. 병합 셀은 첫 칸에만 값이 있습니다. 나머지 칸은 빈값입니다. 정렬하면 순서가\n 깨집니다 는 세 문장의 관계를 독자가 세워야 한다.\n어디서: 글쓰기 스킬의 설명을 풀어 쓰기. 지문 계층이 처음 가능하게 한 규칙이다. 인과 표지 목록은\n data/causalMarkers.txt, 문두 접속사는 data/connectors.txt. 최소 문장 수는 config.factListMinSentences,\n 평균 어절 상한은 config.factListMaxMeanLength.\n고치기: 문장 사이에 그래서, 때문에, 그러면 을 넣어 잇는다. 풀어 쓰면 원고는 길어지는 것이 정상이다.\n안 잡는 것: 두 문장 이하 문단. 인과 표지, 하지만, 그런데 같은 문두 접속사, 질문, 독자 호출이 하나라도\n 든 문단. 평균 어절이 상한을 넘는 문단 (긴 문장은 조건과 이유를 안에 품고 있다). 실측: 004 에서\n 표지만 보면 문단의 40% 가 잡혔고 읽어 보니 대부분 긴 설명문이었다. 짧고 끊기는 꼴만 남겼다. 그래도\n 나열이 아닐 수 있어 notice 로만 낸다.",
|
|
17
|
+
"fillerOpener": "다음으로, 이어서, 마지막에는 으로만 잇는 문장.\n\n왜: 앞에서 무엇을 만들었는지 부르지 않고 순서 표지만 붙이면 독자는 무엇을 이어받는지 모른 채 다음\n 행동을 읽는다.\n어디서: 글쓰기 스킬의 쉬운 말로 바로 쓰기.\n고치기: 앞 절에서 만든 파일이나 확인한 값을 이름으로 다시 부르고 다음 행동을 붙인다. link.png 는\n 33픽셀입니다. 명함에 넣기에는 너무 작습니다.\n안 잡는 것: 문장 중간의 이어서. 목록 항목.",
|
|
18
|
+
"firstResultDistance": "첫 코드나 표나 그림이 나오기 전의 산문 문단이 firstResultMaxParagraphs 를 넘는 글.\n\n왜: 따라 하러 온 독자는 실행할 것이 나올 때까지 배경을 읽는다. 문단 넷이 넘으면 이탈한다.\n어디서: 실측. 블로그 004 의 셋째 문단까지 숫자가 하나도 없어 사람 평가자가 집었다. 글쓰기 스킬의 도입은\n 결핍부터 (첫 코드 블록이 도입 안에 온다). 임계는 config.firstResultMaxParagraphs.\n고치기: 첫 실행할 것을 앞으로 당기거나 그 앞의 문단을 뒤로 보낸다.\n안 잡는 것: 코드도 표도 그림도 없는 글 (참고 문서). introLong 이 도입만 보는 것과 달리 절 경계를 넘어 센다.\n notice 로만 낸다.",
|
|
19
|
+
"hardWord": "금일, 익월, 상기, 소정의, 노하우, 인프라, 피드백 처럼 쉬운 말이 있는 어려운 한자어와 외래어.\n\n왜: 평소에 쓰지 않는 말은 독자가 머릿속에서 한 번 번역한다. 같은 뜻이면 더 자주 쓰는 말로 바로 쓴다.\n 글쓰기 스킬의 쉬운 말로 바로 쓰기 다.\n어디서: 국립국어원 다듬은 말 (korean.go.kr 개선 > 다듬은 말) 과 표준국어대사전의 동의어 정보. 사전은\n data/easyWords.toml 이고 항목마다 출처가 있다. 사용자는 설정의 dictionary.easyWords 로 더한다.\n고치기: 항목마다 쉬운 말을 fix 로 제안한다. 문맥에 따라 다른 말이 맞을 수 있어 hanlint fix 는 적용하지\n 않고 사람이 고른다.\n안 잡는 것: 사전에 없는 말. 고유명사와 제품 이름. 백틱과 따옴표 안의 인용. 전문 용어가 정확해서 꼭\n 필요한 자리 (그때는 이 규칙을 끄거나 인라인 제어로 그 문단만 끈다). 제안이라 notice 로만 낸다.",
|
|
20
|
+
"headingSentence": "본문 문장을 그대로 복사한 절 제목.\n\n왜: 절 제목은 간단명료하게 쓴다. 합니다, 하세요 로 끝나는 제목은 목차에서 대상이 안 보이고 본문과\n 같은 문장이 두 번 읽힌다.\n어디서: 운영자 규칙 (섹션 타이틀은 간단명료하게). 글쓰기 스킬의 절 제목 규칙.\n고치기: 대상이나 질문을 짧게 쓴다. 파일을 엽니다 는 파일 열기, 왜 파일이 열리지 않을까.\n안 잡는 것: 물음표로 끝나는 질문 제목. 명사로 끝나는 제목.",
|
|
21
|
+
"headingSkip": "제목 수준을 건너뛴 자리. H2 다음에 H4 가 오거나 글이 H3 으로 시작하는 것.\n\n왜: 목차가 계층을 잃는다. 화면 낭독기와 목차 생성기가 건너뛴 수준에서 길을 잃고, 독자는 어느 절\n 아래인지 모른다.\n어디서: markdownlint 계열의 헤딩 레벨 검사. Wikipedia Signs of AI writing 4.10 (헤더 남용).\n고치기: 한 수준씩 내려간다. frontmatter 의 title 이 H1 이므로 본문은 H2 부터 시작한다.\n안 잡는 것: 올라가는 것 (H4 다음 H2). 절이 끝나고 새 절이 시작하는 정상 흐름이다.",
|
|
22
|
+
"headingUniform": "H2 셋 이상 가운데 headingUniformRatio 넘게 같은 글자로 끝나는 목차.\n\n왜: 목차 전체가 기 로 끝나면 순서가 있는 과정이 아니라 같은 항목의 나열로 읽힌다.\n어디서: 실측. 블로그 004 의 H2 여덟 개 중 일곱 개가 기 로 끝났고 목차가 한 박자로만 읽혔다. 글쓰기\n 스킬의 절 제목 규칙 (예시의 어미를 규칙으로 삼지 않는다). 임계는 config.headingUniformRatio.\n고치기: 형태를 섞는다. 오류 원인 찾기, 왜 파일이 열리지 않을까, pandas 가 멈추는 자리.\n안 잡는 것: H2 가 둘 이하인 글. H3 이하.",
|
|
23
|
+
"imperativePeriod": "명령형과 청유형 뒤의 마침표.\n\n왜: 마침표는 평서형 종결에만 쓴다. 세요, 십시오, 합시다, 해라 는 마침표 없이 끝낸다. 한 글 안에서\n 기준이 갈리면 독자가 부호를 읽느라 멈춘다.\n어디서: 글쓰기 스킬의 사실과 목소리. eddmpython 의 발행 게이트가 같은 규칙을 정규식으로 막는다.\n고치기: 마침표를 지운다. 기계가 fix 로 낸다.\n안 잡는 것: 평서형 뒤의 마침표. 따옴표 안의 명령문은 문장 부호 규칙이 달라 보지 않는다.",
|
|
24
|
+
"inputFileSource": "코드가 읽는 파일과 쓰는 폴더가 글 어디에서도 만들어지지 않은 자리.\n\n왜: 위에서 아래로 따라 하는 독자는 그 줄에서 파일 없음 오류로 멈춘다. 글쓴이 컴퓨터에는 있어서 글쓴이는 모른다.\n어디서: 실측. 블로그 004 에서 read_excel(\"sales_small.xlsx\") 의 파일을 만드는 코드가 없었고 data 폴더가 어디에서도\n 만들어지지 않았다. 사람 평가자가 두 라운드에 걸쳐 집었다. 읽기와 쓰기 함수 목록은 이 파일 위의 정규식이다.\n고치기: 파일을 만드는 코드 블록을 앞에 두거나, 산문에서 그 파일을 어떻게 준비하는지 이름을 불러 말한다.\n안 잡는 것: 앞선 코드가 쓴 파일. 앞선 산문이 이름을 부른 파일 (독자가 준비하는 것으로 본다). 별표와 URL 과\n 서식 자리표시자가 든 경로. 폴더는 error 가 아니라 notice 다.",
|
|
25
|
+
"installImport": "설치 줄에 없는 패키지를 import 하는 코드. 그리고 코드 한 줄이 조용히 요구하는 숨은 의존성.\n\n왜: 독자는 글이 시킨 설치 줄만 실행한다. 목록에 없는 패키지는 ModuleNotFoundError 로 끝나고 extra 가 빠진\n 백엔드는 실행 중에 멈춘다.\n어디서: 실측. 블로그 004 가 ibis-framework[duckdb] 만 설치하고 sqlite 엔진에 붙었고 사람 평가자가 집었다.\n 모듈과 패키지 이름의 대응은 data/pythonPackages.txt, 표준 라이브러리는 data/pythonStdlib.txt, 숨은\n 의존성은 data/hiddenDeps.txt.\n고치기: 설치 줄에 그 패키지 (필요하면 extra 까지) 를 더한다.\n안 잡는 것: 설치 줄이 하나도 없는 글 (판단할 수 없다). 표준 라이브러리. 글이 만드는 .py 파일. 상대 import.\n 숨은 의존성은 notice 로 낸다.",
|
|
26
|
+
"introLong": "첫 H2 앞의 산문 문단이 introMaxParagraphs 를 넘는 도입.\n\n왜: 도입은 문단 넷과 이미지 한 장을 넘지 않는다. 첫 코드 블록이나 실행할 수 있는 것이 그 안에 와야\n 한다. 결핍 문단이 길어지면 그것 자체가 미룬 배경 설명이 된다.\n어디서: 글쓰기 스킬의 도입은 결핍부터. 임계는 config.introMaxParagraphs.\n고치기: 넘치는 문단을 첫 절로 내리거나 지운다. 정의 문단이면 지운다. 검색해 들어온 독자는 그것이\n 무엇인지 이미 안다.\n안 잡는 것: H2 가 없는 글. 전체가 도입이라 셀 수 없다.",
|
|
27
|
+
"japaneseLoan": "구좌, 익일, 잔고, 고참, 망년회 같은 일본어투 낱말.\n\n왜: 순화어가 이미 자리 잡아 일본어투가 낡고 딱딱하게 읽힌다.\n어디서: 국립국어원 일본어 투 용어 순화 자료집 2005, 꼭 가려 써야 할 일본어 투 용어 50개 2019.\n 사전은 data/japaneseLoan.toml.\n고치기: 순화어로 바꾼다. 구좌 는 계좌, 익일 은 다음날.\n안 잡는 것: 앞뒤에 한글이 붙은 자리. 익일 은 잡지만 익일이라는 은 다른 낱말일 수 있어 두지 않고\n 경계를 본다. 굳어진 한자어 (견적 등) 는 사전에 넣지 않았다.",
|
|
28
|
+
"keywordMissing": "대표 검색어가 제목에도 첫 문단에도 없는 글.\n\n왜: 검색해서 들어온 독자는 자기가 검색창에 친 이름을 첫 화면에서 찾는다. 그 이름이 안 보이면 본문을\n 읽기 전에 뒤로 간다.\n어디서: 글쓰기 스킬의 검색 독자 역할 (독자가 검색창에 친 이름과 이 글이 쓰는 이름이 다르면 첫 문단에서\n 처리한다). 필드 이름은 config.keywordField.\n고치기: 제목이나 첫 문단에 그 이름을 그대로 쓴다. 이름이 다르면 첫 문단에서 그 차이를 한 문장으로.\n안 잡는 것: keywordField 를 설정하지 않은 글. 그 필드가 비어 있는 글.",
|
|
29
|
+
"longSentence": "어절 수가 longSentenceMax 를 넘는 문장.\n\n왜: 문장이 길면 독자가 주어와 서술어를 잇느라 되돌아간다. 짧은 문장과 긴 문장을 섞으라는 규칙의 상한이다.\n어디서: 실측. 블로그 다섯 편의 최장 문장이 23, 33, 23, 26, 45 어절이었고 30 을 넘는 둘은 읽어 보니 한 문장에\n 목록 넷을 넣은 것이었다. 임계는 config.longSentenceMax.\n고치기: 마침표로 끊는다. 나열이면 목록으로 꺼낸다.\n안 잡는 것: 임계 아래 문장. 코드와 표. 글쓰기 규칙의 위반이 아니라 신호라 notice 로 낸다.",
|
|
30
|
+
"negationRedefine": "단순한 X 가 아닙니다 뒤에 Y 입니다 로 다시 정의하는 두 문장 공식.\n\n왜: 부정하고 재정의하는 대구는 AI 가 즐겨 쓰는 수사다. 독자는 X 가 아니라는 말에서 정보를 얻지 못하고\n Y 만 읽으면 된다.\n어디서: AI 문체 신호 조사 (gist 패턴7 부정 후 재정의, im-not-ai C-8 대칭 대구).\n고치기: 앞 문장을 지우고 Y 를 바로 쓴다. 필요하면 Y 가 무엇을 하는지 한 문장을 더한다.\n안 잡는 것: 뒤 문장이 정의문이 아닌 경우. 단순한 도구가 아닙니다. 그래서 설치가 어렵습니다 는 잡지\n 않는다.",
|
|
31
|
+
"noQuestion": "절이 둘 이상인데 물음표가 한 번도 없는 글.\n\n왜: 물음표가 한 번도 나오지 않는 글은 독자에게 한 번도 말을 걸지 않은 글이다. 독자가 품을 의문을\n 대신 묻고 다음 문장에서 답하는 자리가 있어야 읽힌다.\n어디서: 글쓰기 스킬의 사실과 목소리.\n고치기: 독자가 막힐 자리에서 한 번 묻는다. 그럼 파일은 어디에 생겼을까요? 다음 문장이 그 답이다.\n안 잡는 것: 절이 하나뿐인 짧은 참고 문서. 제목의 물음표도 센다.",
|
|
32
|
+
"nounPile": "명사가 조사 없이 nounPileMin 개 이상 이어진 자리.\n\n왜: 가상환경 생성 후 패키지 설치 확인 은 무엇이 무엇의 목적어인지 표시되어 있지 않다. 독자가 조사를\n 끼워 넣어야 읽힌다.\n어디서: 글쓰기 스킬의 설명을 풀어 쓰기 (명사를 쌓지 말고 동사로 되돌린다). im-not-ai A-13, F-4.\n 임계는 config.nounPileMin. 파이썬 데이터프레임 라이브러리 가 넷이라 다섯부터 짚는다 (PRD 부록 A).\n고치기: 동사로 되돌린다. 가상환경을 만든 뒤 패키지가 설치됐는지 확인한다.\n안 잡는 것: 쉼표로 나열한 고유명사 (pandas, Polars, DuckDB). 쉼표가 연속을 끊는다. 임계 아래의 복합어.",
|
|
33
|
+
"paraFragment": "한두 문장짜리 산문 문단이 fragmentRun 개 이상 연달아 오는 자리.\n\n왜: 설명글에 줄바꿈을 마구 넣으면 이유로 이어야 할 문장 사이가 전부 끊긴다. 독자는 조각 사이의\n 관계를 다시 세워야 한다.\n어디서: 운영자 규칙 (설명글은 줄바꿈을 막 쳐넣지 않는다). 글쓰기 스킬의 설명을 풀어 쓰기. 임계는\n config.fragmentRun.\n고치기: 화제가 같으면 한 문단으로 묶는다. 줄바꿈은 화제가 바뀌는 자리에만 둔다.\n안 잡는 것: 사이에 코드 블록이나 표가 끼면 줄을 다시 센다. 코드 앞뒤에 한 문장씩 놓는 것은 조각남이\n 아니라 설명이다. 목록은 세지 않는다.",
|
|
34
|
+
"platformApi": "한 운영체제에서만 도는 API 나 경로를 쓴 코드.\n\n왜: 다른 운영체제 독자는 답까지 다 구해 놓고 그 줄에서 AttributeError 로 멈춘다. 글쓴이 컴퓨터에서는 돌아서\n 글쓴이는 모른다.\n어디서: 실측. 블로그 004 의 peak_wset 이 윈도우에서만 나와 사람 평가자가 집었다. 목록은 data/platformApis.txt.\n고치기: 그 줄이 어느 운영체제 전용인지 적고 대안을 준다. 또는 이식 가능한 API 로 바꾼다.\n안 잡는 것: 목록에 없는 API. 산문 안의 언급. notice 로만 낸다.",
|
|
35
|
+
"promiseRecall": "뒤에서 다루겠습니다 라고 미뤄 놓고 앞에서 미룬 것을 부르는 표지가 글 어디에도 없는 것.\n\n왜: 뒤에서 다루겠습니다 를 써 놓고 끝까지 안 나오면 정보 배분이 아니라 누락이다. 회수할 때는 미뤘다는\n 사실을 밝히고 앞에서 쓴 이름을 다시 부른다.\n어디서: 글쓰기 스킬의 무엇을 빼는가 (미룬 것은 같은 글 안에서 회수한다). 이런 검사를 하는 선행 도구가\n 없다 (조사 결과). 표지 목록은 data/promiseMarkers.txt 와 recallMarkers.txt.\n고치기: 뒤 절에서 앞에서 미룬 X 로 부르며 다룬다. 회수하지 못할 것은 애초에 미루지 말고 지운다.\n안 잡는 것: 회수 표지가 하나라도 있는 글. 어느 약속을 어느 회수가 갚았는지는 대조하지 않는다.\n 표지 근사라 notice 로만 낸다.",
|
|
36
|
+
"readerAbsent": "의문문도 독자를 부르는 문장도 하나 없는 글.\n\n왜: 독자가 있는 글에는 독자를 부르는 자리가 있다. 열어 봅니다, 확인해 보세요 처럼 다음 손을 지시하는\n 문장과 대신 묻는 질문이 전부 없으면 정확해도 읽히지 않는다.\n어디서: 글쓰기 스킬의 사실과 목소리 (직접 시킨다). 지문의 독자 호출 표지는 data/readerCalls.txt 와\n 명령형 종결.\n고치기: 독자가 할 행동을 동사로 끝낸다. 할 수 있습니다 대신 열어 봅니다.\n안 잡는 것: 절이 하나뿐인 글. 표지 목록이 거칠어 notice 로만 낸다.",
|
|
37
|
+
"redundantPair": "역전 앞, 그때 당시, 매 시간마다 같은 겹말.\n\n왜: 뜻이 같은 두 말을 겹쳐 쓴 것이라 한 쪽이 군더더기다.\n어디서: 국립국어원 새국어생활 2005 한규희 겹말은 가능한 한 줄이자, 법조신문 넘쳐나는 겹말들.\n 사전은 data/redundantPair.toml.\n고치기: 하나만 남긴다. 역전 앞 은 역 앞, 그때 당시 는 그때.\n안 잡는 것: 뜻을 강조하려고 일부러 겹친 말. 사전에 없는 겹말.",
|
|
38
|
+
"sectionNoProse": "설명글 없이 코드, 표, 이미지만 있는 절.\n\n왜: 절은 제목, 시각 자료, 설명글, 그리고 설명을 보조하는 예시로 짠다. 코드와 표만 쌓인 절은 독자가\n 무엇을 보는지 모른다.\n어디서: 운영자 규칙 (섹션은 타이틀, 서브타이틀, 시각, 설명글, 예시). 글쓰기 스킬의 절의 짜임.\n고치기: 코드가 하는 일을 한 문장으로 먼저 말하고 그다음에 이름을 하나씩 푼다.\n안 잡는 것: 목록만 있는 절 (더 해 볼 것). 설명이 목록 안에 있다. 빈 절.",
|
|
39
|
+
"sectionResult": "산문만 있고 눈으로 볼 결과 (코드, 표, 그림, 파일 이름, 출력 문장) 가 없는 본문 절.\n\n왜: 따라 하는 독자는 한 절을 다 읽으면 자기 화면에서 확인할 것 하나를 기대한다. 확인할 것이 없는 절은\n 과정이 아니라 참고 자료다. 글쓰기 스킬의 한 절을 다 읽으면 결과 하나가 남는다.\n어디서: 글쓰기 스킬의 절은 앞 절이 못 한 일에서 시작한다. sectionShapeMinParagraphs 문단을 넘는 절만 본다\n (설치, 계정 만들기 같은 짧은 구간은 뺀다).\n고치기: 그 절에서 독자가 만들거나 확인할 것을 하나 넣는다. 파일 하나, 화면 한 줄이면 된다.\n안 잡는 것: 도입과 마지막 절 (결말은 확인으로 닫는다). 짧은 절. 코드나 표나 그림이 있는 절. 파일 이름이나\n 출력을 말하는 문장이 있는 절. 참고 문서라 결과가 원래 없으면 이 규칙을 끈다. notice 로만 낸다.",
|
|
40
|
+
"spacing": "할수 있다, 것같다, 떠난지 3년, 한번도, 두번, 수 밖에, 뿐만아니라 처럼 자주 틀리는 띄어쓰기.\n\n왜: 의존 명사와 단위 명사는 띄고 조사는 붙인다는 규칙이 가장 자주 무너지는 자리다. 틀리면 독자가\n 낱말 경계를 다시 세운다.\n어디서: 국립국어원 한글 맞춤법 제5장 띄어쓰기 (제41항 조사, 제42항 의존 명사, 제43항 단위 명사).\n 항목마다 근거가 붙어 있다 (data/spacing.toml). 관형형 ㄹ 뒤의 의존 명사는 받침 부류 {ㄹ} 로 잡는다.\n고치기: 항목마다 띄거나 붙인 꼴을 fix 로 낸다. hanlint fix 가 적용한다.\n안 잡는 것: 뿐, 만큼, 대로 (체언 뒤 조사와 관형형 뒤 의존 명사를 표층으로 가르지 못한다). 못하다/못 하다,\n 안되다/안 되다 (뜻이 갈린다). 실수, 술수 처럼 ㄹ 받침 명사 뒤의 수. 백틱과 따옴표 안의 인용.",
|
|
41
|
+
"spelling": "됬, 돼고, 않 해, 왠일, 몇일, 금새, 오랫만, 어떻해, 할께, 바램 처럼 자주 틀리는 표기.\n\n왜: 틀린 표기는 독자가 먼저 알아채고 그 순간 글보다 글쓴이를 본다. 사람 작가가 가장 자주 지적받는\n 자리이고 전부 결정적으로 잡힌다.\n어디서: 국립국어원 한글 맞춤법 (제27항 붙임 2 며칠, 제35항 붙임 2 되어→돼, 제53항 -ㄹ게, 제56항 -든지),\n 온라인가나다 답변, 표준국어대사전 표제어. 항목마다 근거가 붙어 있다 (data/spelling.toml).\n고치기: 항목마다 고친 표기를 fix 로 낸다. hanlint fix 가 적용한다.\n안 잡는 것: 뜻에 따라 둘 다 맞는 자리 (데/대, 이따가/있다가, 못하다/못 하다, 한번/한 번, 안되다/안 되다).\n 백틱과 따옴표 안의 인용. 사전에 없는 표기.",
|
|
42
|
+
"topicBreak": "같은 절 안에서 앞 문단과 화제어가 하나도 겹치지 않는 문단.\n\n왜: 앞 문단과의 관계를 새 문단 첫 문장에 드러내라는 규칙의 기계 판이다. 화제어가 전혀 안 겹치면 독자는\n 어디로 넘어왔는지 모른다.\n어디서: 글쓰기 스킬의 사실과 목소리. TextTiling (Hearst 1997) 의 인접 블록 어휘 중첩을 임베딩 없이\n 자카드로 잰다. 지문 계층이 가능하게 한 규칙이다. 최소 문장 수는 config.topicBreakMinSentences.\n고치기: 앞 문단에서 만든 파일이나 값의 이름을 새 문단 첫 문장에서 다시 부른다.\n안 잡는 것: 절이 바뀌는 자리 (절 경계는 화제가 바뀌는 것이 정상). 한 문장짜리 문단 (중첩이 원래 작다).\n 화제어 근사가 거칠어 notice 로만 낸다.",
|
|
43
|
+
"translationese": "~에 있어서, ~에 의해, ~을 통해, ~로부터, ~에도 불구하고 같은 번역투.\n\n왜: 영어와 일본어 구문을 그대로 옮긴 꼴이라 한국어로 읽을 때 한 박자 늦다. 독자가 머릿속에서\n 다시 번역한다.\n어디서: 국립국어원 새국어생활 1990 과 2012, urimal.org 김민지 2020, egowriting 번역투 고치기,\n kubernetes.io 한국어 현지화 가이드. 사전은 data/translationese.toml.\n고치기: 항목마다 고친 예가 있다. 에 있어서 는 에서, 로부터 는 에게, 음에도 불구하고 는 지만.\n 기계가 바꿀 수 있는 것은 fix 로 준다.\n안 잡는 것: 사전에 없는 번역투. 무생물 주어 타동사 구문처럼 구문 분석이 필요한 것은 잡지 않는다."
|
|
44
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
{
|
|
2
|
+
"entry": [
|
|
3
|
+
{
|
|
4
|
+
"pattern": "(?![실술])({ㄹ})수 ?(있|없)",
|
|
5
|
+
"fix": "$1 수 $2",
|
|
6
|
+
"why": "수 는 의존 명사라 앞말과 띄어 쓴다. 할 수 있다",
|
|
7
|
+
"source": "한글 맞춤법 제42항"
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"pattern": "(?![실술])({ㄹ})수밖에",
|
|
11
|
+
"fix": "$1 수밖에",
|
|
12
|
+
"why": "수 는 의존 명사라 띄어 쓰고 조사 밖에 는 붙여 쓴다. 할 수밖에",
|
|
13
|
+
"source": "한글 맞춤법 제41항, 제42항"
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"pattern": "수 밖에(?![가-힣])",
|
|
17
|
+
"fix": "수밖에",
|
|
18
|
+
"why": "밖에 는 조사라 앞말에 붙여 쓴다",
|
|
19
|
+
"source": "한글 맞춤법 제41항"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"pattern": "(것|거)같(?=[다아은을지네습])",
|
|
23
|
+
"fix": "$1 같",
|
|
24
|
+
"why": "것 과 같다 는 다른 낱말이라 띄어 쓴다. 것 같다",
|
|
25
|
+
"source": "한글 맞춤법 제42항"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"pattern": "뿐만아니라",
|
|
29
|
+
"fix": "뿐만 아니라",
|
|
30
|
+
"why": "아니라 는 용언이라 앞말과 띄어 쓴다",
|
|
31
|
+
"source": "한글 맞춤법 제2항 (문장의 각 단어는 띄어 쓴다)"
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"pattern": "그럼에도불구하고",
|
|
35
|
+
"fix": "그럼에도 불구하고",
|
|
36
|
+
"why": "불구하고 는 용언이라 앞말과 띄어 쓴다",
|
|
37
|
+
"source": "한글 맞춤법 제2항"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"pattern": "(?![인는])({ㄴ})지 (?=\\d|한|두|세|네|몇|오래|얼마|며칠|하루|이틀|사흘|일주일|한참|십|이십|백|반년|일 년|한 달)",
|
|
41
|
+
"fix": "$1 지 ",
|
|
42
|
+
"why": "지난 시간을 뜻하는 지 는 의존 명사라 띄어 쓴다. 떠난 지 3년",
|
|
43
|
+
"source": "한글 맞춤법 제42항"
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"pattern": "한번도(?![가-힣])",
|
|
47
|
+
"fix": "한 번도",
|
|
48
|
+
"why": "횟수를 세는 번 은 단위 명사라 띄어 쓴다. 한번 은 시도나 강조일 때만 붙인다",
|
|
49
|
+
"source": "한글 맞춤법 제43항"
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"pattern": "(두|세|네|다섯|여섯|일곱|여덟|아홉|열)번(?![가-힣])",
|
|
53
|
+
"fix": "$1 번",
|
|
54
|
+
"why": "횟수를 세는 번 은 단위 명사라 띄어 쓴다",
|
|
55
|
+
"source": "한글 맞춤법 제43항"
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"pattern": "({ㄹ})것(?=이|을|은|도|과|와|의|인|처럼|만|\\s|[.,!?)]|$)",
|
|
59
|
+
"fix": "$1 것",
|
|
60
|
+
"why": "것 은 의존 명사라 앞말과 띄어 쓴다. 할 것이다",
|
|
61
|
+
"source": "한글 맞춤법 제42항"
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"pattern": "({ㄹ})줄 (?=알|모르|아는|모르는|압|몰)",
|
|
65
|
+
"fix": "$1 줄 ",
|
|
66
|
+
"why": "방법이나 셈을 뜻하는 줄 은 의존 명사라 띄어 쓴다. 할 줄 안다",
|
|
67
|
+
"source": "한글 맞춤법 제42항"
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"pattern": "({ㄹ})때(?=[가는도마다에의]?(?![가-힣]))",
|
|
71
|
+
"fix": "$1 때",
|
|
72
|
+
"why": "때 는 명사라 관형형 뒤에서 띄어 쓴다. 할 때",
|
|
73
|
+
"source": "한글 맞춤법 제2항"
|
|
74
|
+
}
|
|
75
|
+
]
|
|
76
|
+
}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
{
|
|
2
|
+
"entry": [
|
|
3
|
+
{
|
|
4
|
+
"pattern": "됬",
|
|
5
|
+
"fix": "됐",
|
|
6
|
+
"why": "되었 의 준말은 됐 이다. ㅚ 뒤에 -어, -었- 이 어울려 ㅙ, ㅙㅆ 으로 줄면 준 대로 적는다",
|
|
7
|
+
"source": "한글 맞춤법 제35항 붙임 2, 온라인가나다 306230"
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"pattern": "돼(고|면|니|다|므로|든|기)(?![가-힣])",
|
|
11
|
+
"fix": "되$1",
|
|
12
|
+
"why": "-어 가 붙지 않는 자리는 되- 다. 돼 는 되어 의 준말에만 쓴다",
|
|
13
|
+
"source": "한글 맞춤법 제35항 붙임 2, 온라인가나다 306432"
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"pattern": "(?<![가-힣])되(요|서)(?![가-힣])",
|
|
17
|
+
"fix": "돼$1",
|
|
18
|
+
"why": "되어요, 되어서 의 준말이라 돼요, 돼서 다",
|
|
19
|
+
"source": "한글 맞춤법 제35항 붙임 2, 온라인가나다 306432"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"pattern": "안되(요|서)(?![가-힣])",
|
|
23
|
+
"fix": "안 돼$1",
|
|
24
|
+
"why": "부사 안 은 띄어 쓰고 되어 의 준말은 돼 다",
|
|
25
|
+
"source": "한글 맞춤법 제35항 붙임 2, 상담 사례 5649"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"pattern": "안돼(고|면|니|다)(?![가-힣])",
|
|
29
|
+
"fix": "안 되$1",
|
|
30
|
+
"why": "부사 안 은 띄어 쓰고 -어 가 붙지 않는 자리는 되- 다",
|
|
31
|
+
"source": "한글 맞춤법 제35항 붙임 2, 상담 사례 5649"
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"pattern": "(?<![가-힣])않(?=\\s)",
|
|
35
|
+
"fix": "안",
|
|
36
|
+
"why": "홀로 서는 부정 부사는 안 (아니 의 준말) 이다. 않- 은 않다 의 어간이라 어미와 붙어서만 쓴다",
|
|
37
|
+
"source": "국립국어원 상담 사례 5649"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"pattern": "(?<![가-힣])않(?=[해한할합함하됐되돼된될됩])",
|
|
41
|
+
"fix": "안 ",
|
|
42
|
+
"why": "용언 앞의 부정은 부사 안 이고 띄어 쓴다. 않- 은 -지 뒤에만 온다",
|
|
43
|
+
"source": "국립국어원 상담 사례 5649"
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"pattern": "지 안(?=(?:다|습니다|는다|았|을|고|지만|아요|은|으면)(?![가-힣]))",
|
|
47
|
+
"fix": "지 않",
|
|
48
|
+
"why": "-지 뒤의 부정은 아니하다 의 준말 않다 다",
|
|
49
|
+
"source": "국립국어원 상담 사례 5649"
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"pattern": "웬지",
|
|
53
|
+
"fix": "왠지",
|
|
54
|
+
"why": "왜인지 의 준말이라 왠지 다",
|
|
55
|
+
"source": "온라인가나다 314344"
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"pattern": "왠(?!지)(?=[가-힣\\s])",
|
|
59
|
+
"fix": "웬",
|
|
60
|
+
"why": "어찌 된, 어떠한 의 뜻은 웬 이다. 왠 은 왠지 에만 쓴다",
|
|
61
|
+
"source": "온라인가나다 314344"
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"pattern": "몇 ?일(?![가-힣])",
|
|
65
|
+
"fix": "며칠",
|
|
66
|
+
"why": "어원이 분명하지 않은 말은 소리 나는 대로 며칠 로 적는다. 몇 일 은 쓰지 않는다",
|
|
67
|
+
"source": "한글 맞춤법 제27항 붙임 2, 온라인가나다 320310"
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"pattern": "금새(?![가-힣])",
|
|
71
|
+
"fix": "금세",
|
|
72
|
+
"why": "금시에 의 준말이라 금세 다",
|
|
73
|
+
"source": "국립국어원 상담 사례 5901"
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"pattern": "오랫만",
|
|
77
|
+
"fix": "오랜만",
|
|
78
|
+
"why": "오래간만 의 준말이라 오랜만 이다",
|
|
79
|
+
"source": "온라인가나다 321987"
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"pattern": "오랜동안",
|
|
83
|
+
"fix": "오랫동안",
|
|
84
|
+
"why": "오랫동안 은 오래 와 동안 이 사이시옷으로 붙은 말이다",
|
|
85
|
+
"source": "온라인가나다 321987"
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
"pattern": "어떻해",
|
|
89
|
+
"fix": "어떡해",
|
|
90
|
+
"why": "어떻게 해 의 준말은 어떡해 다",
|
|
91
|
+
"source": "온라인가나다 308683"
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"pattern": "어떡게",
|
|
95
|
+
"fix": "어떻게",
|
|
96
|
+
"why": "어떠하게 는 어떻게 다. 어떡- 은 어떡해 에만 쓴다",
|
|
97
|
+
"source": "온라인가나다 308683"
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"pattern": "역활",
|
|
101
|
+
"fix": "역할",
|
|
102
|
+
"why": "역활 은 역할 의 잘못이다",
|
|
103
|
+
"source": "표준국어대사전 표제어 역활"
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
"pattern": "설겆이",
|
|
107
|
+
"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": "뵈어요 의 준말이라 봬요 다",
|
|
127
|
+
"source": "온라인가나다 309576"
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
"pattern": "({ㄹ})께(요)?(?![가-힣])",
|
|
131
|
+
"fix": "$1게$2",
|
|
132
|
+
"why": "ㄹ 뒤에서 된소리로 나는 어미는 예사소리로 적는다. 할께 가 아니라 할게 다",
|
|
133
|
+
"source": "한글 맞춤법 제53항, 온라인가나다 323762"
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
"pattern": "({ㄹ})껄(?![가-힣])",
|
|
137
|
+
"fix": "$1걸",
|
|
138
|
+
"why": "ㄹ 뒤에서 된소리로 나는 어미는 예사소리로 적는다. 할껄 이 아니라 할걸 이다",
|
|
139
|
+
"source": "한글 맞춤법 제53항"
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
"pattern": "({ㄹ})꺼(야|예요|에요|다|지|라고|니까)?(?![가-힣])",
|
|
143
|
+
"fix": "$1 거$2",
|
|
144
|
+
"why": "거 는 것 의 구어형 의존 명사라 띄어 쓰고 예사소리로 적는다. 할꺼야 가 아니라 할 거야 다",
|
|
145
|
+
"source": "한글 맞춤법 제42항, 제53항"
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
"pattern": "바램{조사}",
|
|
149
|
+
"fix": "바람",
|
|
150
|
+
"why": "바라다 의 명사형은 바람 이다. 바램 은 바람 의 잘못이다",
|
|
151
|
+
"source": "표준국어대사전 표제어 바램"
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
"pattern": "던지 말던지",
|
|
155
|
+
"fix": "든지 말든지",
|
|
156
|
+
"why": "가리지 않는 뜻의 어미는 -든지 다. -던 은 지난 일에만 쓴다",
|
|
157
|
+
"source": "한글 맞춤법 제56항"
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
"pattern": "(뭐|무엇이|누구|어디|언제|아무)던(지)?(?![가-힣])",
|
|
161
|
+
"fix": "$1든$2",
|
|
162
|
+
"why": "가리지 않는 뜻의 조사와 어미는 (-)든지 다. -던 은 지난 일에만 쓴다",
|
|
163
|
+
"source": "한글 맞춤법 제56항"
|
|
164
|
+
}
|
|
165
|
+
]
|
|
166
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
{
|
|
2
|
+
"entry": [
|
|
3
|
+
{
|
|
4
|
+
"pattern": "에 있어서",
|
|
5
|
+
"fix": "에서",
|
|
6
|
+
"why": "번역투다. `분야에 있어서` 는 `분야에서` 다",
|
|
7
|
+
"source": "urimal.org 김민지 2020"
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"pattern": "에 위치해 있",
|
|
11
|
+
"fix": "에 있",
|
|
12
|
+
"why": "번역투다. `서울에 위치해 있다` 는 `서울에 있다` 다",
|
|
13
|
+
"source": "egowriting 번역투 고치기"
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"pattern": "에 위치하",
|
|
17
|
+
"fix": "에 있",
|
|
18
|
+
"why": "번역투다. `평창에 위치하고 있습니다` 는 `평창에 있습니다` 다",
|
|
19
|
+
"source": "egowriting 번역투 고치기"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"pattern": "([가-힣])로부터",
|
|
23
|
+
"fix": "$1에게",
|
|
24
|
+
"why": "번역투다. `상사로부터 인정받다` 는 `상사에게 인정받다` 다. 출발점이 장소면 `에서` 다",
|
|
25
|
+
"source": "egowriting 번역투 고치기"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"pattern": "음에도 불구하고",
|
|
29
|
+
"fix": "지만",
|
|
30
|
+
"why": "번역투다. `늦었음에도 불구하고` 는 `늦었지만` 이다",
|
|
31
|
+
"source": "egowriting 번역투 고치기"
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"pattern": "에도 불구하고",
|
|
35
|
+
"why": "번역투다. `지만` 이나 `는데도` 로 푼다",
|
|
36
|
+
"source": "egowriting 번역투 고치기"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"pattern": "([가-힣])(?:을|를) 통해(?:서)?",
|
|
40
|
+
"why": "through 의 직역이다. `밤샘 공부를 통해` 는 `밤샘 공부로` 다. 수단이면 `로`, 경로면 `거쳐` 다",
|
|
41
|
+
"source": "한빛미디어 번역투 TOP 12, im-not-ai A-2"
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"pattern": "에 의(?:해|하여|해서)",
|
|
45
|
+
"why": "by 피동의 직역이다. 한 것을 주어로 세워 능동으로 쓴다. `보육원에 의해 보호되었다` 는 `보육원이 보호했다` 다",
|
|
46
|
+
"source": "urimal.org 김민지 2020"
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"pattern": "(?:으)?로 인(?:해|하여)",
|
|
50
|
+
"why": "번역투다. `국민투표로 인하여 결정` 은 `국민투표로 결정` 이다. 원인이면 `때문에` 다",
|
|
51
|
+
"source": "urimal.org 김민지 2020"
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"pattern": "에 대(?:해|하여|해서)",
|
|
55
|
+
"why": "번역투다. `물음에 대해 답하다` 는 `물음에 답하다` 다. 목적어로 되돌린다",
|
|
56
|
+
"source": "urimal.org 김민지 2020"
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"pattern": "에 관(?:해|하여|해서)",
|
|
60
|
+
"why": "번역투다. 목적어나 `~은` 으로 되돌린다",
|
|
61
|
+
"source": "urimal.org 김민지 2020"
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"pattern": "(?:을|를) 위(?:해|하여|해서)",
|
|
65
|
+
"why": "번역투다. `여행을 가기 위해` 는 `여행 가려고` 다",
|
|
66
|
+
"source": "urimal.org 김민지 2020"
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"pattern": "(?:을|를) 필요로 하",
|
|
70
|
+
"why": "번역투다. `사회가 필요로 하는 것` 은 `사회가 필요한 것` 이다",
|
|
71
|
+
"source": "서울신문 바른 말글 2018"
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"pattern": "하는 중(?:이다|입니다|이었다)",
|
|
75
|
+
"why": "진행형 직역이다. `도착하는 중입니다` 는 `도착합니다` 다",
|
|
76
|
+
"source": "egowriting 번역투 고치기"
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
"pattern": "(?!서로의|따로의|별로의)[가-힣](?:로의|에의) ",
|
|
80
|
+
"why": "전치사구를 명사화한 번역투다. `풍요로의 길` 은 `풍요에 이르는 길` 이다",
|
|
81
|
+
"source": "국립국어원 새국어생활 1990"
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"pattern": "에 다름 아니",
|
|
85
|
+
"why": "일본어 직역이다. `바로 ~이다` 로 쓴다",
|
|
86
|
+
"source": "부산일보 바른말 광 2018"
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"pattern": "(?:이|가) 가능(?:하다|합니다|해진다)",
|
|
90
|
+
"why": "possible 의 직역이다. `스킵이 가능하다` 는 `스킵할 수 있다` 다",
|
|
91
|
+
"source": "나무위키 번역체 문장"
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"pattern": "하게 만들(?:었|었습|었다|다)",
|
|
95
|
+
"why": "make 사동의 직역이다. `나를 행복하게 만들었다` 는 `난 그 일로 행복했다` 다",
|
|
96
|
+
"source": "hanmal 번역투 정리 2011"
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
"pattern": "(?:을|를) 가지고 있",
|
|
100
|
+
"why": "have 의 직역이다. `목소리를 가지고 있다` 는 `목소리가 좋다`, `책을 가지고 있다` 는 `책이 있다` 다",
|
|
101
|
+
"source": "김순영 2012 (이근희 2005 재인용)"
|
|
102
|
+
}
|
|
103
|
+
]
|
|
104
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# 용언 어미와 활용 꼬리. 어절이 이것으로 끝나면 명사 어절로 세지 않는다.
|
|
2
|
+
습니다
|
|
3
|
+
입니다
|
|
4
|
+
됩니다
|
|
5
|
+
합니다
|
|
6
|
+
니다
|
|
7
|
+
십시오
|
|
8
|
+
합시다
|
|
9
|
+
봅시다
|
|
10
|
+
세요
|
|
11
|
+
어요
|
|
12
|
+
아요
|
|
13
|
+
해요
|
|
14
|
+
지요
|
|
15
|
+
까요
|
|
16
|
+
나요
|
|
17
|
+
였다
|
|
18
|
+
이다
|
|
19
|
+
었다
|
|
20
|
+
았다
|
|
21
|
+
한다
|
|
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
|
+
돼
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version": "0.0.1"}
|
package/package.json
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "hanlint",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "한국어 글에서 AI 와 사람이 반복해서 어기는 결함을 결정적으로 잡는 린터. 의존성 0",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"hanlint": "bin/hanlint.js"
|
|
8
|
+
},
|
|
9
|
+
"main": "src/index.js",
|
|
10
|
+
"exports": {
|
|
11
|
+
".": "./src/index.js"
|
|
12
|
+
},
|
|
13
|
+
"files": [
|
|
14
|
+
"bin",
|
|
15
|
+
"src",
|
|
16
|
+
"data",
|
|
17
|
+
"README.md"
|
|
18
|
+
],
|
|
19
|
+
"engines": {
|
|
20
|
+
"node": ">=18"
|
|
21
|
+
},
|
|
22
|
+
"scripts": {
|
|
23
|
+
"test": "node --test test/"
|
|
24
|
+
},
|
|
25
|
+
"keywords": [
|
|
26
|
+
"korean",
|
|
27
|
+
"lint",
|
|
28
|
+
"writing",
|
|
29
|
+
"readability",
|
|
30
|
+
"markdown"
|
|
31
|
+
],
|
|
32
|
+
"license": "MIT",
|
|
33
|
+
"repository": {
|
|
34
|
+
"type": "git",
|
|
35
|
+
"url": "git+https://github.com/eddmpython/hanlint.git",
|
|
36
|
+
"directory": "npm"
|
|
37
|
+
},
|
|
38
|
+
"homepage": "https://github.com/eddmpython/hanlint#readme"
|
|
39
|
+
}
|