mn-spellcheck 1.0.0 → 1.1.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 CHANGED
@@ -1,32 +1,72 @@
1
1
  # mn-spellcheck
2
2
 
3
3
  [![npm version](https://img.shields.io/npm/v/mn-spellcheck.svg)](https://www.npmjs.com/package/mn-spellcheck)
4
- [![license](https://img.shields.io/npm/l/mn-spellcheck.svg)](https://github.com/user/mn-spellcheck/blob/main/LICENSE)
4
+ [![license](https://img.shields.io/npm/l/mn-spellcheck.svg)](https://github.com/Ankhb0ld/mn-spellcheck/blob/main/LICENSE)
5
5
 
6
- Монгол кирилл бичгийн алдаа шалгагч / Mongolian Cyrillic spell checker for Node.js and websites.
6
+ Монгол кирилл бичгийн алдаа шалгагч / Mongolian Cyrillic spell checker for Node.js, CLI, and websites.
7
7
 
8
8
  580,000+ root words, suffix analysis, compound word support — powered by [bataak/dict-mn](https://github.com/bataak/dict-mn).
9
9
 
10
- ## Боломжууд
10
+ ## Боломжууд
11
11
 
12
- - 🔍 **580,000+ root word** dictionary
13
- - 🧩 **Suffix stripping** — нөхцөл дагавартай үгсийг шалгах
14
- - 🔗 **Compound word** — нийлмэл үг шалгах
15
- - ✏️ **Common rules** — түгээмэл алдааны автомат засвар (ү/у, ө/о, -гүй/-гуй)
16
- - 🎯 **Suggestion engine** — REP дүрмүүд + edit distance
17
- - 📝 **Бүтэн текст шалгах** `checkText()` ашиглаж бүх алдааг олох
18
- - 🌐 **HTML шалгах** — `checkHTML()` ашиглаж website-ийн текстийг шалгах
19
- - 🎵 **Эгшиг зохицох ёс** vowel harmony шалгалт
20
- - 🖥️ **Node.js + Browser** дэмжих
21
- - 📘 **TypeScript** type definitions
12
+ - **580,000+ root word** dictionary
13
+ - **Suffix stripping** — нөхцөл дагавартай үгсийг шалгах
14
+ - **Compound word** — нийлмэл үг шалгах
15
+ - **Common rules** — түгээмэл алдааны автомат засвар (ү/у, ө/о, -гүй/-гуй)
16
+ - **Suggestion engine** — REP дүрмүүд болон edit distance ашиглан санал болгох
17
+ - **CLI хэрэгсэл** Терминалаас бүх файлыг шалгаж, автоматаар засах боломжтой
18
+ - **Бүтэн текст шалгах** — `checkText()` ашиглаж засах
19
+ - **HTML шалгах** `checkHTML()` ашиглаж website-ийн текстийг шалгах
20
+ - **Эгшиг зохицох ёс** vowel harmony шалгалт
21
+ - **Node.js, Browser** болон **TypeScript** дэмжинэ.
22
22
 
23
23
  ## Суулгах / Install
24
24
 
25
+ Төсөлд шууд суулгах:
26
+
25
27
  ```bash
26
28
  npm install mn-spellcheck
27
29
  ```
28
30
 
29
- ## Хэрэглэх / Usage
31
+ Шууд глобал эсвэл CLI байдлаар ашиглах:
32
+
33
+ ```bash
34
+ npm install -g mn-spellcheck
35
+ # эсвэл
36
+ npx mn-spellcheck --help
37
+ ```
38
+
39
+ ## CLI команд (Терминалаас ашиглах)
40
+
41
+ Төслийн бүх файлын алдааг терминалаас хялбархан шалгаж, автоматаар засах боломжтой.
42
+
43
+ ### Алдаа шалгах (Check)
44
+
45
+ Тухайн хавтас доторх бүх файлыг шалгаж, алдаатай үгс болон санал болгож буй хувилбаруудыг харуулна:
46
+
47
+ ```bash
48
+ npx mn-spellcheck check
49
+ npx mn-spellcheck check ./src
50
+ ```
51
+
52
+ ### Автоматаар засах (Fix)
53
+
54
+ Олдсон алдаануудыг болон нийтлэг дүрмийн алдаануудыг автоматаар файланд нь орж засна:
55
+
56
+ ```bash
57
+ npx mn-spellcheck fix
58
+ npx mn-spellcheck fix ./src
59
+ ```
60
+
61
+ ### Нэмэлт тохиргоо
62
+
63
+ Анхны тохиргоогоор `.html`, `.tsx`, `.jsx`, `.md`, `.txt` файлуудыг шалгана. Файлын өргөтгөлийг өөрчлөх бол `--ext` ашиглана:
64
+
65
+ ```bash
66
+ npx mn-spellcheck check ./src --ext .svelte,.vue,.ts
67
+ ```
68
+
69
+ ## Хөгжүүлэлтэд ашиглах (API)
30
70
 
31
71
  ### Үндсэн хэрэглээ
32
72
 
@@ -37,12 +77,10 @@ const checker = createSpellChecker();
37
77
 
38
78
  // Нэг үг шалгах
39
79
  checker.correct('сайн'); // true
40
- checker.correct('байна'); // true
41
80
  checker.correct('монгл'); // false
42
81
 
43
82
  // Suggestion авах
44
83
  checker.suggest('монгл'); // ['монгол']
45
- checker.suggest('сургуль'); // ['сургууль', ...]
46
84
 
47
85
  // Дэлгэрэнгүй шалгалт
48
86
  checker.check('монгл');
@@ -57,13 +95,12 @@ const result = checker.checkText('Би мэдэхгуй байна ,энэ бо
57
95
  console.log(result.corrected);
58
96
  // "Би мэдэхгүй байна, энэ болохгүй юм."
59
97
 
60
- console.log(result.errorCount); // 0 (common rules засварлав)
61
- console.log(result.errors); // алдаа бүрийн дэлгэрэнгүй
98
+ console.log(result.errorCount);
99
+ console.log(result.errors);
62
100
  ```
63
101
 
64
- ### 🌐 Website / HTML текст шалгах
102
+ ### Website / HTML текст шалгах
65
103
 
66
- Website-ийн HTML контентыг шалгахад `checkHTML()` функцийг ашиглана.
67
104
  HTML таг, script, style бүгдийг алгасаж зөвхөн текстийг шалгана.
68
105
 
69
106
  ```js
@@ -72,31 +109,6 @@ const result = checker.checkHTML(html);
72
109
 
73
110
  console.log(result.corrected);
74
111
  // "өнөөдөр сайхан өдөр хүмүүс олон байна"
75
-
76
- console.log(result.errorCount);
77
- console.log(result.errors);
78
- ```
79
-
80
- **Жишээ: Express middleware**
81
-
82
- ```js
83
- const express = require('express');
84
- const { createSpellChecker } = require('mn-spellcheck');
85
-
86
- const checker = createSpellChecker();
87
- const app = express();
88
-
89
- app.post('/api/spellcheck', express.json(), (req, res) => {
90
- const { text } = req.body;
91
- const result = checker.checkText(text);
92
- res.json(result);
93
- });
94
-
95
- app.post('/api/spellcheck-html', express.json(), (req, res) => {
96
- const { html } = req.body;
97
- const result = checker.checkHTML(html);
98
- res.json(result);
99
- });
100
112
  ```
101
113
 
102
114
  ### Нэмэлт үг нэмэх
@@ -106,7 +118,6 @@ const checker = createSpellChecker({
106
118
  customWords: ['клауд', 'энтерпрайз']
107
119
  });
108
120
 
109
- // Эсвэл дараа нь нэмэх
110
121
  checker.addWord('блокчейн');
111
122
  checker.addWords(['крипто', 'токен']);
112
123
  ```
@@ -121,52 +132,6 @@ const checker = createSpellChecker({
121
132
  });
122
133
  ```
123
134
 
124
- ## API
125
-
126
- ### `createSpellChecker(options?)`
127
- Шинэ spell checker үүсгэнэ.
128
-
129
- ### `checker.correct(word): boolean`
130
- Үг зөв эсэхийг шалгана.
131
-
132
- ### `checker.check(word): SpellResult`
133
- Үгийг шалгаж дэлгэрэнгүй үр дүн буцаана.
134
- ```ts
135
- interface SpellResult {
136
- word: string;
137
- correct: boolean;
138
- suggestions: string[];
139
- }
140
- ```
141
-
142
- ### `checker.suggest(word): string[]`
143
- Алдаатай үгэнд засвар санал болгоно.
144
-
145
- ### `checker.checkText(text): TextCheckResult`
146
- Бүтэн текстийг шалгана. Common rules + dictionary check.
147
- ```ts
148
- interface TextCheckResult {
149
- errorCount: number;
150
- errors: Suggestion[];
151
- corrected: string; // Автоматаар засарсан текст
152
- }
153
- ```
154
-
155
- ### `checker.checkHTML(html): TextCheckResult`
156
- HTML контентоос текстийг ялган авч шалгана. Script, style блокуудыг алгасна.
157
-
158
- ### `checker.addWord(word)` / `checker.addWords(words)`
159
- Dictionary-д шинэ үг нэмнэ.
160
-
161
- ### `checker.removeWord(word)`
162
- Dictionary-аас үг хасна.
163
-
164
- ### `checker.wordCount`
165
- Dictionary-д хэдэн root word байгааг буцаана.
166
-
167
- ### `checker.ready`
168
- Checker амжилттай ачаалагдсан эсэхийг шалгана.
169
-
170
135
  ## Common Rules (Автомат засвар)
171
136
 
172
137
  42 дүрэм бүхий автомат засвар. Дараах түгээмэл алдаануудыг засна:
@@ -196,7 +161,6 @@ Checker амжилттай ачаалагдсан эсэхийг шалгана.
196
161
  ## Browser дээр ашиглах
197
162
 
198
163
  ```js
199
- // .aff, .dic файлуудыг fetch хийж дамжуулна
200
164
  const affContent = await fetch('/dict/index.aff').then(r => r.text());
201
165
  const dicContent = await fetch('/dict/index.dic').then(r => r.text());
202
166
 
@@ -208,18 +172,13 @@ const checker = createSpellChecker({
208
172
  checker.correct('сайн'); // true
209
173
  ```
210
174
 
211
- ## Common Rules-ыг тусад нь ашиглах
175
+ ## Common Rules тусад нь ашиглах
212
176
 
213
177
  ```js
214
178
  const { applyCommonRules, COMMON_RULES } = require('mn-spellcheck');
215
179
 
216
- // Зөвхөн common rules ашиглах (dictionary ачаалахгүй — хурдан)
217
180
  const result = applyCommonRules('Би мэдэхгуй байна');
218
181
  console.log(result.corrected); // "Би мэдэхгүй байна"
219
- console.log(result.appliedRules); // ["-хгүй нөхцөл нь ү-тэй..."]
220
-
221
- // Нийт дүрмийн жагсаалт
222
- console.log(COMMON_RULES.length); // 42
223
182
  ```
224
183
 
225
184
  ## Лиценз / License
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,221 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const checker_1 = require("./checker");
40
+ const rules_1 = require("./rules");
41
+ const RED = '\x1b[31m';
42
+ const GREEN = '\x1b[32m';
43
+ const YELLOW = '\x1b[33m';
44
+ const BLUE = '\x1b[34m';
45
+ const GRAY = '\x1b[90m';
46
+ const RESET = '\x1b[0m';
47
+ function printHelp() {
48
+ console.log(`
49
+ Usage: mn-spellcheck [command] [options]
50
+
51
+ Commands:
52
+ check [path] Алдаатай үгсийг хайж, жагсааж харуулна
53
+ fix [path] Олдсон алдаануудыг автоматаар засна
54
+
55
+ Опционууд:
56
+ --ext <exts> Шалгах файлын өргөтгөлүүд (жишээ: .html,.md,.txt)
57
+ Үндсэн утга: .html,.tsx,.jsx,.md,.txt
58
+ -h, --help Тусламж харуулах
59
+
60
+ Жишээ:
61
+ mn-spellcheck check
62
+ mn-spellcheck check ./src
63
+ mn-spellcheck fix ./pages --ext .html,.txt
64
+ `);
65
+ }
66
+ function getExts(args) {
67
+ const extIndex = args.findIndex(a => a === '--ext');
68
+ if (extIndex >= 0 && args.length > extIndex + 1) {
69
+ return args[extIndex + 1].split(',').map(e => e.trim());
70
+ }
71
+ return ['.html', '.tsx', '.jsx', '.md', '.txt'];
72
+ }
73
+ function findFiles(dir, exts, fileList = []) {
74
+ if (!fs.existsSync(dir))
75
+ return fileList;
76
+ const stat = fs.statSync(dir);
77
+ if (stat.isFile()) {
78
+ if (exts.some(ext => dir.endsWith(ext))) {
79
+ fileList.push(dir);
80
+ }
81
+ return fileList;
82
+ }
83
+ const files = fs.readdirSync(dir);
84
+ for (const file of files) {
85
+ if (file === 'node_modules' || file === 'dist' || file === '.git')
86
+ continue;
87
+ const filePath = path.join(dir, file);
88
+ if (fs.statSync(filePath).isDirectory()) {
89
+ findFiles(filePath, exts, fileList);
90
+ }
91
+ else {
92
+ if (exts.some(ext => file.endsWith(ext))) {
93
+ fileList.push(filePath);
94
+ }
95
+ }
96
+ }
97
+ return fileList;
98
+ }
99
+ function extractCyrillicWords(text) {
100
+ const words = [];
101
+ const regex = /[а-яА-ЯөӨүҮёЁ-]+/g;
102
+ let match;
103
+ // Create an array mapping character index to line number for fast lookup
104
+ // We can just calculate line number on the fly
105
+ let currentLine = 1;
106
+ let lastIndex = 0;
107
+ while ((match = regex.exec(text)) !== null) {
108
+ if (match[0].length <= 1)
109
+ continue; // Ганц үсэг алгасах
110
+ // Count newlines between last match and this match
111
+ for (let i = lastIndex; i < match.index; i++) {
112
+ if (text[i] === '\n')
113
+ currentLine++;
114
+ }
115
+ lastIndex = match.index;
116
+ words.push({
117
+ word: match[0],
118
+ index: match.index,
119
+ line: currentLine
120
+ });
121
+ }
122
+ return words;
123
+ }
124
+ async function runDir(mode, targetPath, exts) {
125
+ const checker = new checker_1.MnSpellChecker();
126
+ const files = findFiles(targetPath, exts);
127
+ if (files.length === 0) {
128
+ console.log(`${YELLOW}Шалгах файл олдсонгүй: ${targetPath}${RESET}`);
129
+ return;
130
+ }
131
+ let totalErrors = 0;
132
+ let totalFixed = 0;
133
+ console.log(`${BLUE}Нийт ${files.length} файл шалгаж байна...${RESET}\n`);
134
+ for (const file of files) {
135
+ let content = fs.readFileSync(file, 'utf8');
136
+ const originalContent = content;
137
+ let fileErrors = 0;
138
+ const fixesMade = [];
139
+ // Auto-fix common rules first if in FIX mode
140
+ if (mode === 'fix') {
141
+ const ruleResult = (0, rules_1.applyCommonRules)(content);
142
+ if (ruleResult.appliedRules.length > 0) {
143
+ content = ruleResult.corrected;
144
+ fixesMade.push(`Нийтлэг дүрэм засварлагдсан (${ruleResult.appliedRules.length})`);
145
+ }
146
+ }
147
+ const words = extractCyrillicWords(content);
148
+ const errorsToFix = [];
149
+ for (const { word, line, index } of words) {
150
+ // Илүү нарийн шалгалт (Тоо болон латин үсэгтэй үгийг алгасах)
151
+ if (/^[a-zA-Z0-9]+$/.test(word))
152
+ continue;
153
+ if (!checker.correct(word)) {
154
+ const suggestions = checker.suggest(word);
155
+ fileErrors++;
156
+ totalErrors++;
157
+ if (mode === 'check') {
158
+ const suggStr = suggestions.length > 0 ? suggestions.slice(0, 3).join(', ') : 'Санал олдсонгүй';
159
+ console.log(` ${GRAY}${file}:${line}${RESET} - ${RED}${word}${RESET} -> ${GREEN}${suggStr}${RESET}`);
160
+ }
161
+ else if (mode === 'fix' && suggestions.length > 0) {
162
+ // Засах жагсаалтад нэмэх
163
+ errorsToFix.push({
164
+ index,
165
+ length: word.length,
166
+ replacement: suggestions[0]
167
+ });
168
+ fixesMade.push(`${word} -> ${suggestions[0]}`);
169
+ totalFixed++;
170
+ }
171
+ }
172
+ }
173
+ if (mode === 'fix' && (fixesMade.length > 0 || content !== originalContent)) {
174
+ // Ухрах чиглэлд засах (индекс зөрөхөөс сэргийлэх)
175
+ errorsToFix.sort((a, b) => b.index - a.index);
176
+ for (const fix of errorsToFix) {
177
+ content = content.substring(0, fix.index) + fix.replacement + content.substring(fix.index + fix.length);
178
+ }
179
+ fs.writeFileSync(file, content, 'utf8');
180
+ console.log(` ${GREEN}✓ Засагдсан: ${file}${RESET} (${fixesMade.length} алдаа)`);
181
+ }
182
+ else if (mode === 'check' && fileErrors > 0) {
183
+ console.log(`--> ${file} файлд нийт ${fileErrors} алдаа олдлоо.\n`);
184
+ }
185
+ }
186
+ console.log('\n=======================================');
187
+ if (mode === 'check') {
188
+ if (totalErrors === 0) {
189
+ console.log(`${GREEN}Ямар ч алдаа олдсонгүй. Гайхалтай!${RESET}`);
190
+ }
191
+ else {
192
+ console.log(`${RED}Нийт ${totalErrors} алдаа олдлоо.${RESET}`);
193
+ console.log(`Автоматаар засахыг хүсвэл: ${BLUE}npx mn-spellcheck fix${RESET}`);
194
+ }
195
+ }
196
+ else {
197
+ console.log(`${GREEN}Нийт ${totalFixed} алдааг амжилттай засаж хадгаллаа!${RESET}`);
198
+ }
199
+ }
200
+ async function main() {
201
+ const args = process.argv.slice(2);
202
+ if (args.length === 0 || args.includes('-h') || args.includes('--help')) {
203
+ printHelp();
204
+ return;
205
+ }
206
+ const command = args[0];
207
+ if (command !== 'check' && command !== 'fix') {
208
+ console.log(`${RED}Тодорхойгүй команд: ${command}${RESET}\n`);
209
+ printHelp();
210
+ process.exit(1);
211
+ }
212
+ let targetPath = args[1] && !args[1].startsWith('-') ? args[1] : '.';
213
+ targetPath = path.resolve(targetPath);
214
+ const exts = getExts(args);
215
+ await runDir(command, targetPath, exts);
216
+ }
217
+ main().catch(err => {
218
+ console.error(`${RED}Алдаа гарлаа:${RESET}`, err);
219
+ process.exit(1);
220
+ });
221
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,uCAAyB;AACzB,2CAA6B;AAC7B,uCAA2C;AAC3C,mCAA2C;AAE3C,MAAM,GAAG,GAAG,UAAU,CAAC;AACvB,MAAM,KAAK,GAAG,UAAU,CAAC;AACzB,MAAM,MAAM,GAAG,UAAU,CAAC;AAC1B,MAAM,IAAI,GAAG,UAAU,CAAC;AACxB,MAAM,IAAI,GAAG,UAAU,CAAC;AACxB,MAAM,KAAK,GAAG,SAAS,CAAC;AAExB,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;CAgBb,CAAC,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,IAAc;IAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC;IACpD,IAAI,QAAQ,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,QAAQ,GAAG,CAAC,EAAE,CAAC;QAChD,OAAO,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,SAAS,CAAC,GAAW,EAAE,IAAc,EAAE,WAAqB,EAAE;IACrE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,QAAQ,CAAC;IAEzC,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;QAClB,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACxC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAClC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,KAAK,cAAc,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,MAAM;YAAE,SAAS;QAC5E,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACtC,IAAI,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YACxC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QACtC,CAAC;aAAM,CAAC;YACN,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBACzC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAY;IACxC,MAAM,KAAK,GAAoD,EAAE,CAAC;IAClE,MAAM,KAAK,GAAG,mBAAmB,CAAC;IAClC,IAAI,KAAK,CAAC;IAEV,yEAAyE;IACzE,+CAA+C;IAC/C,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC3C,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC;YAAE,SAAS,CAAC,oBAAoB;QAExD,mDAAmD;QACnD,KAAK,IAAI,CAAC,GAAG,SAAS,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI;gBAAE,WAAW,EAAE,CAAC;QACtC,CAAC;QACD,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC;QAExB,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;YACd,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,IAAI,EAAE,WAAW;SAClB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,IAAqB,EAAE,UAAkB,EAAE,IAAc;IAC7E,MAAM,OAAO,GAAG,IAAI,wBAAc,EAAE,CAAC;IACrC,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAE1C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,0BAA0B,UAAU,GAAG,KAAK,EAAE,CAAC,CAAC;QACrE,OAAO;IACT,CAAC;IAED,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,QAAQ,KAAK,CAAC,MAAM,wBAAwB,KAAK,IAAI,CAAC,CAAC;IAE1E,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC5C,MAAM,eAAe,GAAG,OAAO,CAAC;QAChC,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,MAAM,SAAS,GAAa,EAAE,CAAC;QAE/B,6CAA6C;QAC7C,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YACnB,MAAM,UAAU,GAAG,IAAA,wBAAgB,EAAC,OAAO,CAAC,CAAC;YAC7C,IAAI,UAAU,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvC,OAAO,GAAG,UAAU,CAAC,SAAS,CAAC;gBAC/B,SAAS,CAAC,IAAI,CAAC,gCAAgC,UAAU,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;YACpF,CAAC;QACH,CAAC;QAED,MAAM,KAAK,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,WAAW,GAA6D,EAAE,CAAC;QAEjF,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,KAAK,EAAE,CAAC;YAC1C,8DAA8D;YAC9D,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,SAAS;YAE1C,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3B,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBAC1C,UAAU,EAAE,CAAC;gBACb,WAAW,EAAE,CAAC;gBAEd,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;oBACrB,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC;oBAChG,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,KAAK,MAAM,GAAG,GAAG,IAAI,GAAG,KAAK,OAAO,KAAK,GAAG,OAAO,GAAG,KAAK,EAAE,CAAC,CAAC;gBACxG,CAAC;qBAAM,IAAI,IAAI,KAAK,KAAK,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACpD,yBAAyB;oBACzB,WAAW,CAAC,IAAI,CAAC;wBACf,KAAK;wBACL,MAAM,EAAE,IAAI,CAAC,MAAM;wBACnB,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;qBAC5B,CAAC,CAAC;oBACH,SAAS,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBAC/C,UAAU,EAAE,CAAC;gBACf,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,IAAI,KAAK,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,KAAK,eAAe,CAAC,EAAE,CAAC;YAC5E,kDAAkD;YAClD,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;YAC9C,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;gBAC9B,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;YAC1G,CAAC;YAED,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,gBAAgB,IAAI,GAAG,KAAK,KAAK,SAAS,CAAC,MAAM,SAAS,CAAC,CAAC;QACpF,CAAC;aAAM,IAAI,IAAI,KAAK,OAAO,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YAC9C,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,eAAe,UAAU,kBAAkB,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;IACzD,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,qCAAqC,KAAK,EAAE,CAAC,CAAC;QACpE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,QAAQ,WAAW,iBAAiB,KAAK,EAAE,CAAC,CAAC;YAC/D,OAAO,CAAC,GAAG,CAAC,8BAA8B,IAAI,wBAAwB,KAAK,EAAE,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,QAAQ,UAAU,qCAAqC,KAAK,EAAE,CAAC,CAAC;IACtF,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEnC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxE,SAAS,EAAE,CAAC;QACZ,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,OAAO,KAAK,OAAO,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,uBAAuB,OAAO,GAAG,KAAK,IAAI,CAAC,CAAC;QAC9D,SAAS,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACrE,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAEtC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3B,MAAM,MAAM,CAAC,OAA0B,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;AAC7D,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;IACjB,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,gBAAgB,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC;IAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -3,6 +3,7 @@ export interface SuffixRule {
3
3
  strip: string;
4
4
  add: string;
5
5
  condition: RegExp;
6
+ continuationFlags: string[];
6
7
  }
7
8
  export interface DicEntry {
8
9
  word: string;
@@ -1 +1 @@
1
- {"version":3,"file":"suffix-engine.d.ts","sourceRoot":"","sources":["../src/suffix-engine.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG;IAC7C,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;IACvC,QAAQ,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAClC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;CAC5B,CA0DA;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAsBlG;AAuBD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAC9B,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,GACrC,OAAO,CAkCT"}
1
+ {"version":3,"file":"suffix-engine.d.ts","sourceRoot":"","sources":["../src/suffix-engine.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG;IAC7C,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;IACvC,QAAQ,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAClC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;CAC5B,CA2DA;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAsBlG;AAuBD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAC9B,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,GACrC,OAAO,CAiCT"}
@@ -42,6 +42,7 @@ function parseAffFile(content) {
42
42
  // add хэсэгт flag байж болно: "на/040870" -> зөвхөн "на" авна
43
43
  const addSlash = addRaw.indexOf('/');
44
44
  const add = addSlash >= 0 ? addRaw.substring(0, addSlash) : (addRaw === '0' ? '' : addRaw);
45
+ const continuationFlags = addSlash >= 0 ? splitFlags(addRaw.substring(addSlash + 1), flagMode) : [];
45
46
  const conditionStr = parts.length >= 5 ? parts[4] : '.';
46
47
  let condition;
47
48
  try {
@@ -53,7 +54,7 @@ function parseAffFile(content) {
53
54
  if (!suffixRules.has(flag)) {
54
55
  suffixRules.set(flag, []);
55
56
  }
56
- suffixRules.get(flag).push({ flag, strip, add, condition });
57
+ suffixRules.get(flag).push({ flag, strip, add, condition, continuationFlags });
57
58
  }
58
59
  }
59
60
  }
@@ -126,11 +127,10 @@ function checkWordWithSuffixes(word, entries, suffixRules) {
126
127
  if (entries.has(capitalized))
127
128
  return true;
128
129
  }
129
- // Suffix stripping
130
+ // Suffix stripping (starts with undefined continuation flag constraint, max depth 3)
130
131
  if (checkWithSuffixStripping(lower, entries, suffixRules))
131
132
  return true;
132
133
  // Compound word check: үгийг хоёр хэсэгт хуваагаад тус тусыг нь шалгах
133
- // Жишээ: "мэдэхгүй" = "мэдэх" + "гүй"
134
134
  if (lower.length >= 4) {
135
135
  for (let i = 2; i <= lower.length - 2; i++) {
136
136
  const left = lower.substring(0, i);
@@ -147,22 +147,31 @@ function checkWordWithSuffixes(word, entries, suffixRules) {
147
147
  }
148
148
  return false;
149
149
  }
150
- function checkWithSuffixStripping(word, entries, suffixRules) {
150
+ function checkWithSuffixStripping(word, entries, suffixRules, requiredContinuationFlag, depth = 0) {
151
+ if (depth > 3)
152
+ return false;
151
153
  for (const [flag, rules] of suffixRules) {
152
154
  for (const rule of rules) {
153
155
  if (!rule.add)
154
156
  continue;
157
+ // If we are recursing inwards, the inner suffix MUST have the outer suffix's flag in its continuationFlags
158
+ if (requiredContinuationFlag && !rule.continuationFlags.includes(requiredContinuationFlag)) {
159
+ continue;
160
+ }
155
161
  if (word.endsWith(rule.add)) {
156
162
  const base = word.substring(0, word.length - rule.add.length);
157
163
  const root = base + rule.strip;
158
164
  if (root.length === 0)
159
165
  continue;
166
+ const toCheck = rule.strip ? root : base;
167
+ if (!rule.condition.test(toCheck))
168
+ continue;
160
169
  const rootFlags = entries.get(root);
161
170
  if (rootFlags && rootFlags.includes(flag)) {
162
- const toCheck = rule.strip ? root : base;
163
- if (rule.condition.test(toCheck)) {
164
- return true;
165
- }
171
+ return true;
172
+ }
173
+ if (checkWithSuffixStripping(root, entries, suffixRules, flag, depth + 1)) {
174
+ return true;
166
175
  }
167
176
  }
168
177
  }
@@ -1 +1 @@
1
- {"version":3,"file":"suffix-engine.js","sourceRoot":"","sources":["../src/suffix-engine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"suffix-engine.js","sourceRoot":"","sources":["../src/suffix-engine.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,9 +1,12 @@
1
1
  {
2
2
  "name": "mn-spellcheck",
3
- "version": "1.0.0",
3
+ "version": "1.1.1",
4
4
  "description": "Монгол кирилл бичгийн алдаа шалгагч / Mongolian Cyrillic spell checker for websites and Node.js",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
+ "bin": {
8
+ "mn-spellcheck": "./dist/cli.js"
9
+ },
7
10
  "exports": {
8
11
  ".": {
9
12
  "types": "./dist/index.d.ts",