From d139258398de9285396db31c6d46795ee95eb01a Mon Sep 17 00:00:00 2001 From: Stefan Vukovic Date: Sun, 24 Mar 2024 12:36:53 +0100 Subject: [PATCH 1/7] prepare preprocessors --- .eslintrc.json | 1 + .../language/ko/korean-text-preprocessors.js | 26 +++++++++++++++++++ ext/js/language/language-descriptors.js | 9 +++++++ types/ext/language-descriptors.d.ts | 3 +++ 4 files changed, 39 insertions(+) create mode 100644 ext/js/language/ko/korean-text-preprocessors.js diff --git a/.eslintrc.json b/.eslintrc.json index faac16a81a..73f6b834b4 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -647,6 +647,7 @@ "ext/js/language/ja/japanese-transforms.js", "ext/js/language/ja/japanese-wanakana.js", "ext/js/language/ja/japanese.js", + "ext/js/language/ko/korean-text-preprocessors.js", "ext/js/language/la/latin-text-preprocessors.js", "ext/js/language/language-descriptors.js", "ext/js/language/language-transformer.js", diff --git a/ext/js/language/ko/korean-text-preprocessors.js b/ext/js/language/ko/korean-text-preprocessors.js new file mode 100644 index 0000000000..8fa2c18f9b --- /dev/null +++ b/ext/js/language/ko/korean-text-preprocessors.js @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2024 Yomitan Authors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** @type {import('language').TextPreprocessor} */ +export const disassembleHangul = { + name: 'Disassemble Hangul', + description: 'Disassemble Hangul characters into jamo.', + options: [true], + process: (str) => { + return str; // Import from hangul.js + } +}; diff --git a/ext/js/language/language-descriptors.js b/ext/js/language/language-descriptors.js index b4af2f8a05..8458249749 100644 --- a/ext/js/language/language-descriptors.js +++ b/ext/js/language/language-descriptors.js @@ -21,6 +21,7 @@ import {englishTransforms} from './en/english-transforms.js'; import {collapseEmphaticSequences, convertAlphabeticCharacters, convertHalfWidthCharacters, convertHiraganaToKatakana, convertNumericCharacters} from './ja/japanese-text-preprocessors.js'; import {japaneseTransforms} from './ja/japanese-transforms.js'; import {isStringPartiallyJapanese} from './ja/japanese.js'; +import {disassembleHangul} from './ko/korean-text-preprocessors.js'; import {removeLatinDiacritics} from './la/latin-text-preprocessors.js'; import {removeRussianDiacritics, yoToE} from './ru/russian-text-preprocessors.js'; import {albanianTransforms} from './sq/albanian-transforms.js'; @@ -136,6 +137,14 @@ const languageDescriptors = [ exampleText: 'អាន', textPreprocessors: {} }, + { + iso: 'ko', + name: 'Korean', + exampleText: '읽다', + textPreprocessors: { + disassembleHangul + } + }, { iso: 'pl', name: 'Polish', diff --git a/types/ext/language-descriptors.d.ts b/types/ext/language-descriptors.d.ts index dae586a251..5e4e912bec 100644 --- a/types/ext/language-descriptors.d.ts +++ b/types/ext/language-descriptors.d.ts @@ -83,6 +83,9 @@ type AllTextPreprocessors = { convertHiraganaToKatakana: BidirectionalConversionPreprocessor; collapseEmphaticSequences: TextPreprocessor<[collapseEmphatic: boolean, collapseEmphaticFull: boolean]>; }; + ko: { + disassembleHangul: TextPreprocessor; + }; km: Record; pl: CapitalizationPreprocessors; pt: CapitalizationPreprocessors; From 1e5871ae1b6ecc2447210d0fa41791e59431ab45 Mon Sep 17 00:00:00 2001 From: Stefan Vukovic Date: Sun, 24 Mar 2024 15:06:32 +0100 Subject: [PATCH 2/7] add postprocessors --- .eslintrc.json | 2 +- .../language/ar/arabic-text-preprocessors.js | 6 +- .../ja/japanese-text-preprocessors.js | 16 +- ...rocessors.js => korean-text-processors.js} | 14 +- .../language/la/latin-text-preprocessors.js | 6 +- ext/js/language/language-descriptors.js | 15 +- ext/js/language/languages.js | 20 ++- .../language/ru/russian-text-preprocessors.js | 10 +- ext/js/language/text-preprocessors.js | 12 +- ext/js/language/translator.js | 62 ++++---- types/ext/language-descriptors.d.ts | 142 ++++++++++++------ types/ext/language.d.ts | 25 +-- types/ext/translation-internal.d.ts | 12 +- 13 files changed, 220 insertions(+), 122 deletions(-) rename ext/js/language/ko/{korean-text-preprocessors.js => korean-text-processors.js} (63%) diff --git a/.eslintrc.json b/.eslintrc.json index 73f6b834b4..4e7503ad71 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -647,7 +647,7 @@ "ext/js/language/ja/japanese-transforms.js", "ext/js/language/ja/japanese-wanakana.js", "ext/js/language/ja/japanese.js", - "ext/js/language/ko/korean-text-preprocessors.js", + "ext/js/language/ko/korean-text-processors.js", "ext/js/language/la/latin-text-preprocessors.js", "ext/js/language/language-descriptors.js", "ext/js/language/language-transformer.js", diff --git a/ext/js/language/ar/arabic-text-preprocessors.js b/ext/js/language/ar/arabic-text-preprocessors.js index 6007d770af..d9e504235b 100644 --- a/ext/js/language/ar/arabic-text-preprocessors.js +++ b/ext/js/language/ar/arabic-text-preprocessors.js @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -import {basicTextPreprocessorOptions} from '../text-preprocessors.js'; +import {basicTextProcessorOptions} from '../text-preprocessors.js'; const optionalDiacritics = [ '\u0618', // Small Fatha @@ -38,11 +38,11 @@ const optionalDiacritics = [ const diacriticsRegex = new RegExp(`[${optionalDiacritics.join('')}]`, 'g'); -/** @type {import('language').TextPreprocessor} */ +/** @type {import('language').TextProcessor} */ export const removeArabicScriptDiacritics = { name: 'Remove diacritics', description: 'وَلَدَ ⬅️ ولد', - options: basicTextPreprocessorOptions, + options: basicTextProcessorOptions, process: (text, setting) => { return setting ? text.replace(diacriticsRegex, '') : text; } diff --git a/ext/js/language/ja/japanese-text-preprocessors.js b/ext/js/language/ja/japanese-text-preprocessors.js index 06f944c11f..a3a7c8353f 100644 --- a/ext/js/language/ja/japanese-text-preprocessors.js +++ b/ext/js/language/ja/japanese-text-preprocessors.js @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -import {basicTextPreprocessorOptions} from '../text-preprocessors.js'; +import {basicTextProcessorOptions} from '../text-preprocessors.js'; import {convertAlphabeticToKana} from './japanese-wanakana.js'; import { collapseEmphaticSequences as collapseEmphaticSequencesFunction, @@ -25,27 +25,27 @@ import { convertNumericToFullWidth } from './japanese.js'; -/** @type {import('language').TextPreprocessor} */ +/** @type {import('language').TextProcessor} */ export const convertHalfWidthCharacters = { name: 'Convert half width characters to full width', description: 'ヨミチャン → ヨミチャン', - options: basicTextPreprocessorOptions, + options: basicTextProcessorOptions, process: (str, setting, sourceMap) => (setting ? convertHalfWidthKanaToFullWidth(str, sourceMap) : str) }; -/** @type {import('language').TextPreprocessor} */ +/** @type {import('language').TextProcessor} */ export const convertNumericCharacters = { name: 'Convert numeric characters to full width', description: '1234 → 1234', - options: basicTextPreprocessorOptions, + options: basicTextProcessorOptions, process: (str, setting) => (setting ? convertNumericToFullWidth(str) : str) }; -/** @type {import('language').TextPreprocessor} */ +/** @type {import('language').TextProcessor} */ export const convertAlphabeticCharacters = { name: 'Convert alphabetic characters to hiragana', description: 'yomichan → よみちゃん', - options: basicTextPreprocessorOptions, + options: basicTextProcessorOptions, process: (str, setting, sourceMap) => (setting ? convertAlphabeticToKana(str, sourceMap) : str) }; @@ -66,7 +66,7 @@ export const convertHiraganaToKatakana = { } }; -/** @type {import('language').TextPreprocessor<[collapseEmphatic: boolean, collapseEmphaticFull: boolean]>} */ +/** @type {import('language').TextProcessor<[collapseEmphatic: boolean, collapseEmphaticFull: boolean]>} */ export const collapseEmphaticSequences = { name: 'Collapse emphatic character sequences', description: 'すっっごーーい → すっごーい / すごい', diff --git a/ext/js/language/ko/korean-text-preprocessors.js b/ext/js/language/ko/korean-text-processors.js similarity index 63% rename from ext/js/language/ko/korean-text-preprocessors.js rename to ext/js/language/ko/korean-text-processors.js index 8fa2c18f9b..859ddc80ae 100644 --- a/ext/js/language/ko/korean-text-preprocessors.js +++ b/ext/js/language/ko/korean-text-processors.js @@ -15,11 +15,21 @@ * along with this program. If not, see . */ -/** @type {import('language').TextPreprocessor} */ +/** @type {import('language').TextProcessor} */ export const disassembleHangul = { name: 'Disassemble Hangul', description: 'Disassemble Hangul characters into jamo.', - options: [true], + options: [true], // Could probably also be set to [false, true], but this way it is always on + process: (str) => { + return str; // Import from hangul.js + } +}; + +/** @type {import('language').TextProcessor} */ +export const reassembleHangul = { + name: 'Reassemble Hangul', + description: 'Reassemble Hangul characters from jamo.', + options: [true], // Could probably also be set to [false, true], but this way it is always on process: (str) => { return str; // Import from hangul.js } diff --git a/ext/js/language/la/latin-text-preprocessors.js b/ext/js/language/la/latin-text-preprocessors.js index ea6aae820d..e6ee3a2fdd 100644 --- a/ext/js/language/la/latin-text-preprocessors.js +++ b/ext/js/language/la/latin-text-preprocessors.js @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -import {basicTextPreprocessorOptions} from '../text-preprocessors.js'; +import {basicTextProcessorOptions} from '../text-preprocessors.js'; /** @type {Record} */ const diacriticMap = { @@ -45,11 +45,11 @@ const diacriticMap = { Ý: 'Y' }; -/** @type {import('language').TextPreprocessor} */ +/** @type {import('language').TextProcessor} */ export const removeLatinDiacritics = { name: 'Remove diacritics', description: 'āēīōūȳ → aeiouy, áéíóúý → aeiouy', - options: basicTextPreprocessorOptions, + options: basicTextProcessorOptions, process: (str, setting) => { return setting ? str.replace(/[āēīōūȳáéíóúýĀĒĪŌŪȲÁÉÍÓÚÝ]/g, (match) => diacriticMap[match] || match) : str; } diff --git a/ext/js/language/language-descriptors.js b/ext/js/language/language-descriptors.js index 8458249749..6782cd8088 100644 --- a/ext/js/language/language-descriptors.js +++ b/ext/js/language/language-descriptors.js @@ -21,7 +21,7 @@ import {englishTransforms} from './en/english-transforms.js'; import {collapseEmphaticSequences, convertAlphabeticCharacters, convertHalfWidthCharacters, convertHiraganaToKatakana, convertNumericCharacters} from './ja/japanese-text-preprocessors.js'; import {japaneseTransforms} from './ja/japanese-transforms.js'; import {isStringPartiallyJapanese} from './ja/japanese.js'; -import {disassembleHangul} from './ko/korean-text-preprocessors.js'; +import {disassembleHangul, reassembleHangul} from './ko/korean-text-processors.js'; import {removeLatinDiacritics} from './la/latin-text-preprocessors.js'; import {removeRussianDiacritics, yoToE} from './ru/russian-text-preprocessors.js'; import {albanianTransforms} from './sq/albanian-transforms.js'; @@ -134,8 +134,7 @@ const languageDescriptors = [ { iso: 'km', name: 'Khmer', - exampleText: 'អាន', - textPreprocessors: {} + exampleText: 'អាន' }, { iso: 'ko', @@ -143,7 +142,11 @@ const languageDescriptors = [ exampleText: '읽다', textPreprocessors: { disassembleHangul + }, + textPostprocessors: { + reassembleHangul } + // languageTransforms: koreanTransforms }, { iso: 'pl', @@ -195,8 +198,7 @@ const languageDescriptors = [ { iso: 'th', name: 'Thai', - exampleText: 'อ่าน', - textPreprocessors: {} + exampleText: 'อ่าน' }, { iso: 'tr', @@ -213,8 +215,7 @@ const languageDescriptors = [ { iso: 'zh', name: 'Chinese', - exampleText: '读', - textPreprocessors: {} + exampleText: '读' } ]; diff --git a/ext/js/language/languages.js b/ext/js/language/languages.js index 4b196c2cc5..b3890aa67f 100755 --- a/ext/js/language/languages.js +++ b/ext/js/language/languages.js @@ -29,21 +29,29 @@ export function getLanguageSummaries() { } /** - * @returns {import('language').LanguageAndPreprocessors[]} + * @returns {import('language').LanguageAndProcessors[]} * @throws {Error} */ -export function getAllLanguageTextPreprocessors() { +export function getAllLanguageTextProcessors() { const results = []; - for (const {iso, textPreprocessors} of languageDescriptorMap.values()) { - /** @type {import('language').TextPreprocessorWithId[]} */ + for (const {iso, textPreprocessors = {}, textPostprocessors = {}} of languageDescriptorMap.values()) { + /** @type {import('language').TextProcessorWithId[]} */ const textPreprocessorsArray = []; for (const [id, textPreprocessor] of Object.entries(textPreprocessors)) { textPreprocessorsArray.push({ id, - textPreprocessor: /** @type {import('language').TextPreprocessor} */ (textPreprocessor) + textProcessor: /** @type {import('language').TextProcessor} */ (textPreprocessor) }); } - results.push({iso, textPreprocessors: textPreprocessorsArray}); + /** @type {import('language').TextProcessorWithId[]} */ + const textPostprocessorsArray = []; + for (const [id, textPostprocessor] of Object.entries(textPostprocessors)) { + textPostprocessorsArray.push({ + id, + textProcessor: /** @type {import('language').TextProcessor} */ (textPostprocessor) + }); + } + results.push({iso, textPreprocessors: textPreprocessorsArray, textPostprocessors: textPostprocessorsArray}); } return results; } diff --git a/ext/js/language/ru/russian-text-preprocessors.js b/ext/js/language/ru/russian-text-preprocessors.js index fc4472e957..50bc5d9310 100644 --- a/ext/js/language/ru/russian-text-preprocessors.js +++ b/ext/js/language/ru/russian-text-preprocessors.js @@ -15,23 +15,23 @@ * along with this program. If not, see . */ -import {basicTextPreprocessorOptions} from '../text-preprocessors.js'; +import {basicTextProcessorOptions} from '../text-preprocessors.js'; -/** @type {import('language').TextPreprocessor} */ +/** @type {import('language').TextProcessor} */ export const removeRussianDiacritics = { name: 'Remove diacritics', description: 'A\u0301 → A, a\u0301 → a', - options: basicTextPreprocessorOptions, + options: basicTextProcessorOptions, process: (str, setting) => { return setting ? str.replace(/\u0301/g, '') : str; } }; -/** @type {import('language').TextPreprocessor} */ +/** @type {import('language').TextProcessor} */ export const yoToE = { name: 'Yo to E', description: 'ё → е, Ё → Е', - options: basicTextPreprocessorOptions, + options: basicTextProcessorOptions, process: (str, setting) => { return setting ? str.replace(/ё/g, 'е').replace(/Ё/g, 'Е') : str; } diff --git a/ext/js/language/text-preprocessors.js b/ext/js/language/text-preprocessors.js index 12b3d1b66d..88cbffdb01 100755 --- a/ext/js/language/text-preprocessors.js +++ b/ext/js/language/text-preprocessors.js @@ -15,21 +15,21 @@ * along with this program. If not, see . */ -/** @type {import('language').TextPreprocessorOptions} */ -export const basicTextPreprocessorOptions = [false, true]; +/** @type {import('language').TextProcessorOptions} */ +export const basicTextProcessorOptions = [false, true]; -/** @type {import('language').TextPreprocessor} */ +/** @type {import('language').TextProcessor} */ export const decapitalize = { name: 'Decapitalize text', description: 'CAPITALIZED TEXT → capitalized text', - options: basicTextPreprocessorOptions, + options: basicTextProcessorOptions, process: (str, setting) => (setting ? str.toLowerCase() : str) }; -/** @type {import('language').TextPreprocessor} */ +/** @type {import('language').TextProcessor} */ export const capitalizeFirstLetter = { name: 'Capitalize first letter', description: 'lowercase text → Lowercase text', - options: basicTextPreprocessorOptions, + options: basicTextProcessorOptions, process: (str, setting) => (setting ? str.charAt(0).toUpperCase() + str.slice(1) : str) }; diff --git a/ext/js/language/translator.js b/ext/js/language/translator.js index af275c07aa..bc53e2a625 100644 --- a/ext/js/language/translator.js +++ b/ext/js/language/translator.js @@ -20,7 +20,7 @@ import {applyTextReplacement} from '../general/regex-util.js'; import {TextSourceMap} from '../general/text-source-map.js'; import {isCodePointJapanese} from './ja/japanese.js'; import {LanguageTransformer} from './language-transformer.js'; -import {getAllLanguageTextPreprocessors} from './languages.js'; +import {getAllLanguageTextProcessors} from './languages.js'; import {MultiLanguageTransformer} from './multi-language-transformer.js'; /** @@ -41,7 +41,7 @@ export class Translator { this._stringComparer = new Intl.Collator('en-US'); // Invariant locale /** @type {RegExp} */ this._numberRegex = /[+-]?(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?/; - /** @type {Map[], optionSpace: import('translation-internal').PreprocessorOptionsSpace}>} */ + /** @type {import('translation-internal').TextPreprocessorMap} */ this._textPreprocessors = new Map(); } @@ -50,13 +50,19 @@ export class Translator { */ prepare() { this._multiLanguageTransformer.prepare(); - for (const {iso, textPreprocessors} of getAllLanguageTextPreprocessors()) { - /** @type {Map>} */ - const optionSpace = new Map(); - for (const {id, textPreprocessor} of textPreprocessors) { - optionSpace.set(id, textPreprocessor.options); + for (const {iso, textPreprocessors = [], textPostprocessors = []} of getAllLanguageTextProcessors()) { + /** @type {import('translation-internal').TextProcessorOptionsSpace}>} */ + const preprocessorOptionsSpace = new Map(); + /** @type {import('translation-internal').TextProcessorOptionsSpace}>} */ + const postprocessorOptionsSpace = new Map(); + + for (const {id, textProcessor} of textPreprocessors) { + preprocessorOptionsSpace.set(id, textProcessor.options); } - this._textPreprocessors.set(iso, {textPreprocessors, optionSpace}); + for (const {id, textProcessor} of textPostprocessors) { + postprocessorOptionsSpace.set(id, textProcessor.options); + } + this._textPreprocessors.set(iso, {textPreprocessors, preprocessorOptionsSpace, textPostprocessors, postprocessorOptionsSpace}); } } @@ -440,21 +446,17 @@ export class Translator { const {language} = options; const info = this._textPreprocessors.get(language); if (typeof info === 'undefined') { throw new Error(`Unsupported language: ${language}`); } - const {textPreprocessors, optionSpace: textPreprocessorOptionsSpace} = info; + const {textPreprocessors, preprocessorOptionsSpace, textPostprocessors, postprocessorOptionsSpace} = info; - /** @type {Map>} */ - const variantSpace = new Map(); - variantSpace.set('textReplacements', this._getTextReplacementsVariants(options)); - for (const [key, value] of textPreprocessorOptionsSpace) { - variantSpace.set(key, value); - } + const preprocessorVariantSpace = new Map(preprocessorOptionsSpace); + preprocessorVariantSpace.set('textReplacements', this._getTextReplacementsVariants(options)); /** @type {import('translation-internal').DatabaseDeinflection[]} */ const deinflections = []; const used = new Set(); - for (const arrayVariant of this._generateArrayVariants(variantSpace)) { - const textReplacements = /** @type {import('translation').FindTermsTextReplacement[] | null} */ (arrayVariant.get('textReplacements')); + for (const preprocessorVariant of this._generateArrayVariants(preprocessorVariantSpace)) { + const textReplacements = /** @type {import('translation').FindTermsTextReplacement[] | null} */ (preprocessorVariant.get('textReplacements')); let text2 = text; const sourceMap = new TextSourceMap(text2); @@ -464,9 +466,9 @@ export class Translator { } for (const preprocessor of textPreprocessors.values()) { - const {id, textPreprocessor} = preprocessor; - const setting = arrayVariant.get(id); - text2 = textPreprocessor.process(text2, setting, sourceMap); + const {id, textProcessor} = preprocessor; + const setting = preprocessorVariant.get(id); + text2 = textProcessor.process(text2, setting, sourceMap); } for ( @@ -479,12 +481,20 @@ export class Translator { used.add(source); const rawSource = sourceMap.source.substring(0, sourceMap.getSourceLength(i)); for (const {text: transformedText, conditions, trace} of this._multiLanguageTransformer.transform(language, source)) { - /** @type {import('dictionary').InflectionRuleChainCandidate} */ - const inflectionRuleChainCandidate = { - source: 'algorithm', - inflectionRules: trace.map((frame) => frame.transform) - }; - deinflections.push(this._createDeinflection(rawSource, source, transformedText, conditions, [inflectionRuleChainCandidate])); + for (const postprocessorVariant of this._generateArrayVariants(postprocessorOptionsSpace)) { + for (const postprocessor of textPostprocessors.values()) { + const {id, textProcessor} = postprocessor; + const setting = postprocessorVariant.get(id); + text2 = textProcessor.process(text2, setting, sourceMap); + } + + /** @type {import('dictionary').InflectionRuleChainCandidate} */ + const inflectionRuleChainCandidate = { + source: 'algorithm', + inflectionRules: trace.map((frame) => frame.transform) + }; + deinflections.push(this._createDeinflection(rawSource, source, transformedText, conditions, [inflectionRuleChainCandidate])); + } } } } diff --git a/types/ext/language-descriptors.d.ts b/types/ext/language-descriptors.d.ts index 5e4e912bec..4abbf6a66b 100644 --- a/types/ext/language-descriptors.d.ts +++ b/types/ext/language-descriptors.d.ts @@ -15,13 +15,17 @@ * along with this program. If not, see . */ -import type {TextPreprocessor, BidirectionalConversionPreprocessor} from './language'; +import type {TextProcessor, BidirectionalConversionPreprocessor} from './language'; import type {LanguageTransformDescriptor} from './language-transformer'; import type {SafeAny} from './core'; export type IsTextLookupWorthyFunction = (text: string) => boolean; -type LanguageDescriptor = { +type LanguageDescriptor< + TIso extends string, + TTextPreprocessorDescriptor extends TextProcessorDescriptor = Record, + TTextPostprocessorDescriptor extends TextProcessorDescriptor = Record, +> = { iso: TIso; name: string; exampleText: string; @@ -32,73 +36,127 @@ type LanguageDescriptor; +type TextProcessorDescriptor = { + [key: string]: TextProcessor; }; type LanguageDescriptorObjectMap = { - [key in keyof AllTextPreprocessors]: LanguageDescriptor; + [key in keyof AllTextProcessors]: LanguageDescriptor< + key, + AllTextProcessors[key] extends {pre: TextProcessorDescriptor} ? AllTextProcessors[key]['pre'] : Record, + AllTextProcessors[key] extends {post: TextProcessorDescriptor} ? AllTextProcessors[key]['post'] : Record + >; }; export type LanguageDescriptorAny = LanguageDescriptorObjectMap[keyof LanguageDescriptorObjectMap]; type CapitalizationPreprocessors = { - capitalizeFirstLetter: TextPreprocessor; - decapitalize: TextPreprocessor; + capitalizeFirstLetter: TextProcessor; + decapitalize: TextProcessor; }; /** - * This is a mapping of the iso tag to all of the preprocessors for that language. + * This is a mapping of the iso tag to all of the text processors for that language. * Any new language should be added to this object. */ -type AllTextPreprocessors = { +type AllTextProcessors = { ar: { - removeArabicScriptDiacritics: TextPreprocessor; + pre: { + removeArabicScriptDiacritics: TextProcessor; + }; }; - de: CapitalizationPreprocessors & { - eszettPreprocessor: BidirectionalConversionPreprocessor; + de: { + pre: CapitalizationPreprocessors & { + eszettPreprocessor: BidirectionalConversionPreprocessor; + }; + }; + el: { + pre: CapitalizationPreprocessors; + }; + en: { + pre: CapitalizationPreprocessors; + }; + es: { + pre: CapitalizationPreprocessors; }; - el: CapitalizationPreprocessors; - en: CapitalizationPreprocessors; - es: CapitalizationPreprocessors; fa: { - removeArabicScriptDiacritics: TextPreprocessor; + pre: { + removeArabicScriptDiacritics: TextProcessor; + }; + }; + fr: { + pre: CapitalizationPreprocessors; + }; + grc: { + pre: CapitalizationPreprocessors; }; - fr: CapitalizationPreprocessors; - grc: CapitalizationPreprocessors; - hu: CapitalizationPreprocessors; - id: CapitalizationPreprocessors; - it: CapitalizationPreprocessors; - la: CapitalizationPreprocessors & { - removeLatinDiacritics: TextPreprocessor; + hu: { + pre: CapitalizationPreprocessors; + }; + id: { + pre: CapitalizationPreprocessors; + }; + it: { + pre: CapitalizationPreprocessors; + }; + la: { + pre: CapitalizationPreprocessors & { + removeLatinDiacritics: TextProcessor; + }; }; ja: { - convertHalfWidthCharacters: TextPreprocessor; - convertNumericCharacters: TextPreprocessor; - convertAlphabeticCharacters: TextPreprocessor; - convertHiraganaToKatakana: BidirectionalConversionPreprocessor; - collapseEmphaticSequences: TextPreprocessor<[collapseEmphatic: boolean, collapseEmphaticFull: boolean]>; + pre: { + convertHalfWidthCharacters: TextProcessor; + convertNumericCharacters: TextProcessor; + convertAlphabeticCharacters: TextProcessor; + convertHiraganaToKatakana: BidirectionalConversionPreprocessor; + collapseEmphaticSequences: TextProcessor<[collapseEmphatic: boolean, collapseEmphaticFull: boolean]>; + }; }; ko: { - disassembleHangul: TextPreprocessor; + pre: { + disassembleHangul: TextProcessor; + }; + post: { + reassembleHangul: TextProcessor; + }; }; km: Record; - pl: CapitalizationPreprocessors; - pt: CapitalizationPreprocessors; - ro: CapitalizationPreprocessors; - ru: CapitalizationPreprocessors & { - yoToE: TextPreprocessor; - removeRussianDiacritics: TextPreprocessor; - }; - sh: CapitalizationPreprocessors; - sq: CapitalizationPreprocessors; - sv: CapitalizationPreprocessors; + pl: { + pre: CapitalizationPreprocessors; + }; + pt: { + pre: CapitalizationPreprocessors; + }; + ro: { + pre: CapitalizationPreprocessors; + }; + ru: { + pre: CapitalizationPreprocessors & { + yoToE: TextProcessor; + removeRussianDiacritics: TextProcessor; + }; + }; + sh: { + pre: CapitalizationPreprocessors; + }; + sq: { + pre: CapitalizationPreprocessors; + }; + sv: { + pre: CapitalizationPreprocessors; + }; th: Record; - tr: CapitalizationPreprocessors; - vi: CapitalizationPreprocessors; + tr: { + pre: CapitalizationPreprocessors; + }; + vi: { + pre: CapitalizationPreprocessors; + }; zh: Record; }; diff --git a/types/ext/language.d.ts b/types/ext/language.d.ts index 8fa6f0e7ac..252feff862 100644 --- a/types/ext/language.d.ts +++ b/types/ext/language.d.ts @@ -18,29 +18,30 @@ import type {TextSourceMap} from '../../ext/js/general/text-source-map.js'; import type {LanguageTransformDescriptor} from './language-transformer.js'; -export type TextPreprocessorOptions = T[]; +export type TextProcessorOptions = T[]; -export type TextPreprocessorFunction = (str: string, setting: T, sourceMap: TextSourceMap) => string; +export type TextProcessorFunction = (str: string, setting: T, sourceMap: TextSourceMap) => string; /** - * Text preprocessors are used during the translation process to create alternate versions of the input text to search for. + * Text pre- and post-processors are used during the translation process to create alternate versions of the input text to search for. * This is helpful when the input text doesn't exactly match the term or expression found in the database. - * When a language has multiple preprocessors, the translator will generate variants of the text by applying all combinations of the preprocessors. + * When a language has multiple processors, the translator will generate variants of the text by applying all combinations of the processors. */ -export type TextPreprocessor = { +export type TextProcessor = { name: string; description: string; - options: TextPreprocessorOptions; - process: TextPreprocessorFunction; + options: TextProcessorOptions; + process: TextProcessorFunction; }; export type BidirectionalPreprocessorOptions = 'off' | 'direct' | 'inverse'; -export type BidirectionalConversionPreprocessor = TextPreprocessor; +export type BidirectionalConversionPreprocessor = TextProcessor; -export type LanguageAndPreprocessors = { +export type LanguageAndProcessors = { iso: string; - textPreprocessors: TextPreprocessorWithId[]; + textPreprocessors?: TextProcessorWithId[]; + textPostprocessors?: TextProcessorWithId[]; }; export type LanguageAndTransforms = { @@ -48,9 +49,9 @@ export type LanguageAndTransforms = { languageTransforms: LanguageTransformDescriptor; }; -export type TextPreprocessorWithId = { +export type TextProcessorWithId = { id: string; - textPreprocessor: TextPreprocessor; + textProcessor: TextProcessor; }; export type LanguageSummary = { diff --git a/types/ext/translation-internal.d.ts b/types/ext/translation-internal.d.ts index 7006221ef1..a153e39683 100644 --- a/types/ext/translation-internal.d.ts +++ b/types/ext/translation-internal.d.ts @@ -49,4 +49,14 @@ export type DatabaseDeinflection = { databaseEntries: DictionaryDatabase.TermEntry[]; }; -export type PreprocessorOptionsSpace = Map>; +export type TextProcessorOptionsSpace = Map>; + +export type TextPreprocessorMap = Map< + string, + { + textPreprocessors: Language.TextProcessorWithId[]; + preprocessorOptionsSpace: TextProcessorOptionsSpace; + textPostprocessors: Language.TextProcessorWithId[]; + postprocessorOptionsSpace: TextProcessorOptionsSpace; + } +>; From 5f68ca87cda4ec84ae58f00c15e58bb54944481a Mon Sep 17 00:00:00 2001 From: Lyroxide <33834537+Lyroxide@users.noreply.github.com> Date: Mon, 25 Mar 2024 19:18:02 +0900 Subject: [PATCH 3/7] add hangul functions (#13) --- .eslintrc.json | 1 + ext/js/language/ko/korean-hangul.js | 586 +++++++++++++++++++ ext/js/language/ko/korean-text-processors.js | 6 +- 3 files changed, 591 insertions(+), 2 deletions(-) create mode 100644 ext/js/language/ko/korean-hangul.js diff --git a/.eslintrc.json b/.eslintrc.json index 4e7503ad71..6fdb8a14d6 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -647,6 +647,7 @@ "ext/js/language/ja/japanese-transforms.js", "ext/js/language/ja/japanese-wanakana.js", "ext/js/language/ja/japanese.js", + "ext/js/language/ko/korean-hangul.js", "ext/js/language/ko/korean-text-processors.js", "ext/js/language/la/latin-text-preprocessors.js", "ext/js/language/language-descriptors.js", diff --git a/ext/js/language/ko/korean-hangul.js b/ext/js/language/ko/korean-hangul.js new file mode 100644 index 0000000000..d9863af79a --- /dev/null +++ b/ext/js/language/ko/korean-hangul.js @@ -0,0 +1,586 @@ +/* + * Copyright (C) 2024 Yomitan Authors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const HANGUL_OFFSET = 0xAC00; + +const CHO = [ + 'ㄱ', + 'ㄲ', + 'ㄴ', + 'ㄷ', + 'ㄸ', + 'ㄹ', + 'ㅁ', + 'ㅂ', + 'ㅃ', + 'ㅅ', + 'ㅆ', + 'ㅇ', + 'ㅈ', + 'ㅉ', + 'ㅊ', + 'ㅋ', + 'ㅌ', + 'ㅍ', + 'ㅎ' +]; + +const JUNG = [ + 'ㅏ', + 'ㅐ', + 'ㅑ', + 'ㅒ', + 'ㅓ', + 'ㅔ', + 'ㅕ', + 'ㅖ', + 'ㅗ', + ['ㅗ', 'ㅏ'], + ['ㅗ', 'ㅐ'], + ['ㅗ', 'ㅣ'], + 'ㅛ', + 'ㅜ', + ['ㅜ', 'ㅓ'], + ['ㅜ', 'ㅔ'], + ['ㅜ', 'ㅣ'], + 'ㅠ', + 'ㅡ', + ['ㅡ', 'ㅣ'], + 'ㅣ' +]; + +const JONG = [ + '', + 'ㄱ', + 'ㄲ', + ['ㄱ', 'ㅅ'], + 'ㄴ', + ['ㄴ', 'ㅈ'], + ['ㄴ', 'ㅎ'], + 'ㄷ', + 'ㄹ', + ['ㄹ', 'ㄱ'], + ['ㄹ', 'ㅁ'], + ['ㄹ', 'ㅂ'], + ['ㄹ', 'ㅅ'], + ['ㄹ', 'ㅌ'], + ['ㄹ', 'ㅍ'], + ['ㄹ', 'ㅎ'], + 'ㅁ', + 'ㅂ', + ['ㅂ', 'ㅅ'], + 'ㅅ', + 'ㅆ', + 'ㅇ', + 'ㅈ', + 'ㅊ', + 'ㅋ', + 'ㅌ', + 'ㅍ', + 'ㅎ' +]; + +const CONSONANTS = [ + 'ㄱ', + 'ㄲ', + 'ㄳ', + 'ㄴ', + 'ㄵ', + 'ㄶ', + 'ㄷ', + 'ㄸ', + 'ㄹ', + 'ㄺ', + 'ㄻ', + 'ㄼ', + 'ㄽ', + 'ㄾ', + 'ㄿ', + 'ㅀ', + 'ㅁ', + 'ㅂ', + 'ㅃ', + 'ㅄ', + 'ㅅ', + 'ㅆ', + 'ㅇ', + 'ㅈ', + 'ㅉ', + 'ㅊ', + 'ㅋ', + 'ㅌ', + 'ㅍ', + 'ㅎ' +]; + +const COMPLETE_CHO = [ + 'ㄱ', + 'ㄲ', + 'ㄴ', + 'ㄷ', + 'ㄸ', + 'ㄹ', + 'ㅁ', + 'ㅂ', + 'ㅃ', + 'ㅅ', + 'ㅆ', + 'ㅇ', + 'ㅈ', + 'ㅉ', + 'ㅊ', + 'ㅋ', + 'ㅌ', + 'ㅍ', + 'ㅎ' +]; + +const COMPLETE_JUNG = [ + 'ㅏ', + 'ㅐ', + 'ㅑ', + 'ㅒ', + 'ㅓ', + 'ㅔ', + 'ㅕ', + 'ㅖ', + 'ㅗ', + 'ㅘ', + 'ㅙ', + 'ㅚ', + 'ㅛ', + 'ㅜ', + 'ㅝ', + 'ㅞ', + 'ㅟ', + 'ㅠ', + 'ㅡ', + 'ㅢ', + 'ㅣ' +]; + +const COMPLETE_JONG = [ + '', + 'ㄱ', + 'ㄲ', + 'ㄳ', + 'ㄴ', + 'ㄵ', + 'ㄶ', + 'ㄷ', + 'ㄹ', + 'ㄺ', + 'ㄻ', + 'ㄼ', + 'ㄽ', + 'ㄾ', + 'ㄿ', + 'ㅀ', + 'ㅁ', + 'ㅂ', + 'ㅄ', + 'ㅅ', + 'ㅆ', + 'ㅇ', + 'ㅈ', + 'ㅊ', + 'ㅋ', + 'ㅌ', + 'ㅍ', + 'ㅎ' +]; + +const COMPLEX_CONSONANTS = [ + ['ㄱ', 'ㅅ', 'ㄳ'], + ['ㄴ', 'ㅈ', 'ㄵ'], + ['ㄴ', 'ㅎ', 'ㄶ'], + ['ㄹ', 'ㄱ', 'ㄺ'], + ['ㄹ', 'ㅁ', 'ㄻ'], + ['ㄹ', 'ㅂ', 'ㄼ'], + ['ㄹ', 'ㅅ', 'ㄽ'], + ['ㄹ', 'ㅌ', 'ㄾ'], + ['ㄹ', 'ㅍ', 'ㄿ'], + ['ㄹ', 'ㅎ', 'ㅀ'], + ['ㅂ', 'ㅅ', 'ㅄ'] +]; + +const COMPLEX_VOWELS = [ + ['ㅗ', 'ㅏ', 'ㅘ'], + ['ㅗ', 'ㅐ', 'ㅙ'], + ['ㅗ', 'ㅣ', 'ㅚ'], + ['ㅜ', 'ㅓ', 'ㅝ'], + ['ㅜ', 'ㅔ', 'ㅞ'], + ['ㅜ', 'ㅣ', 'ㅟ'], + ['ㅡ', 'ㅣ', 'ㅢ'] +]; + +const makeHash = (array) => { + const hash = {0: 0}; + for (let i = 0; i < array.length; i++) { + if (array[i]) { + hash[array[i].charCodeAt(0)] = i; + } + } + return hash; +}; + +const CONSONANTS_HASH = makeHash(CONSONANTS); + +const CHO_HASH = makeHash(COMPLETE_CHO); + +const JUNG_HASH = makeHash(COMPLETE_JUNG); + +const JONG_HASH = makeHash(COMPLETE_JONG); + +const makeComplexHash = (array) => { + const hash = {}; + let code1, code2; + for (let i = 0; i < array.length; i++) { + code1 = array[i][0].charCodeAt(0); + code2 = array[i][1].charCodeAt(0); + if (typeof hash[code1] === 'undefined') { + hash[code1] = {}; + } + hash[code1][code2] = array[i][2].charCodeAt(0); + } + return hash; +}; + +const COMPLEX_CONSONANTS_HASH = makeComplexHash(COMPLEX_CONSONANTS); + +const COMPLEX_VOWELS_HASH = makeComplexHash(COMPLEX_VOWELS); + +/** + * Checks if the given character is a Korean consonant. + * @param {number} c The character to check. + * @returns {boolean} True if the character is a Korean consonant, false otherwise. + */ +function isConsonant(c) { + return typeof CONSONANTS_HASH[c] !== 'undefined'; +} + +/** + * Checks if the given character is a Korean initial consonant (cho). + * @param {number} c The character to check. + * @returns {boolean} True if the character is a Korean initial consonant, false otherwise. + */ +function isCho(c) { + return typeof CHO_HASH[c] !== 'undefined'; +} + +/** + * Checks if the given character is a Korean vowel (jung). + * @param {number} c The character to check. + * @returns {boolean} True if the character is a Korean vowel, false otherwise. + */ +function isJung(c) { + return typeof JUNG_HASH[c] !== 'undefined'; +} + +/** + * Checks if the given character is a Korean final consonant (jong). + * @param {number} c The character to check. + * @returns {boolean} True if the character is a Korean final consonant, false otherwise. + */ +function isJong(c) { + return typeof JONG_HASH[c] !== 'undefined'; +} + +/** + * Checks if the given character code represents a Hangul character. + * @param {number} charCode The character code to check. + * @returns {boolean} True if the character code represents a Hangul character, false otherwise. + */ +function isHangul(charCode) { + return HANGUL_OFFSET <= charCode && charCode <= 0xd7a3; +} + +/** + * Retrieves the indices of the initial consonant (cho), vowel (jung), and final consonant (jong) + * that make up the given Hangul character code. + * @param {number} charCode The character code of the Hangul character. + * @returns {object} An object containing the indices of cho, jung, and jong. + */ +function getHangulIndices(charCode) { + const baseCode = charCode - HANGUL_OFFSET; + return { + cho: Math.floor(baseCode / 588), + jung: Math.floor((baseCode % 588) / 28), + jong: baseCode % 28 + }; +} + +/** + * Checks if the given characters 'a' and 'b' can be combined to form a complex vowel. + * @param {number} a The character code of the first vowel. + * @param {number} b The character code of the second vowel. + * @returns {(number|boolean)} The character code of the combined complex vowel, or false if they cannot be combined. + */ +function isJungJoinable(a, b) { + return (COMPLEX_VOWELS_HASH[a] && COMPLEX_VOWELS_HASH[a][b]) ? COMPLEX_VOWELS_HASH[a][b] : false; +} + +/** + * Checks if the given characters 'a' and 'b' can be combined to form a complex final consonant. + * @param {number} a The character code of the first final consonant. + * @param {number} b The character code of the second final consonant. + * @returns {(number|boolean)} The character code of the combined complex final consonant, or false if they cannot be combined. + */ +function isJongJoinable(a, b) { + return COMPLEX_CONSONANTS_HASH[a] && COMPLEX_CONSONANTS_HASH[a][b] ? COMPLEX_CONSONANTS_HASH[a][b] : false; +} + +/** + * Disassembles a given string into an array of individual Hangul characters or character components. + * @param {string} string The string to be disassembled. + * @param {boolean} [grouped=false] Whether to group the components of each Hangul character. + * @returns {(string|string[])} An array of individual Hangul characters or character components, or a single string if `grouped` is false. + * @throws {Error} If the input string is null. + */ +export const disassemble = (string, grouped = false) => { + if (string === null) { + throw new Error('Arguments cannot be null'); + } + + string = Array.isArray(string) ? string.join('') : string; + + const result = []; + + for (const character of string) { + const charCode = character.charCodeAt(0); + + if (isHangul(charCode)) { + const {cho, jung, jong} = getHangulIndices(charCode); + + const disassembled = [CHO[cho]]; + + if (Array.isArray(JUNG[jung])) { + disassembled.push(JUNG[jung].join('')); // eslint-disable-line @typescript-eslint/no-unsafe-argument + } else { + disassembled.push(JUNG[jung]); + } + + if (JONG[jong]) { + if (Array.isArray(JONG[jong])) { + disassembled.push(JONG[jong].join('')); // eslint-disable-line @typescript-eslint/no-unsafe-argument + } else { + disassembled.push(JONG[jong]); + } + } + + if (grouped) { + result.push(disassembled); + } else { + result.push(...disassembled); + } + } else if (isConsonant(charCode)) { + if (isCho(charCode)) { + result.push(CHO[CHO_HASH[charCode]]); + } else { + if (Array.isArray(JONG[JONG_HASH[charCode]])) { + result.push(JONG[JONG_HASH[charCode]].join('')); + } else { + result.push(JONG[JONG_HASH[charCode]]); + } + } + } else if (isJung(charCode)) { + if (Array.isArray(JUNG[JUNG_HASH[charCode]])) { + result.push(JUNG[JUNG_HASH[charCode]].join('')); + } else { + result.push(JUNG[JUNG_HASH[charCode]]); + } + } else { + result.push(character); + } + } + return grouped ? result : result.join(''); +}; + +/** + * Assembles an array of individual Hangul characters or character components into a single string. + * @param {string} string The string containing individual Hangul characters or character components to be assembled. + * @returns {string} The assembled string. + * @throws {Error} If the input string is null. + */ +export const assemble = (string) => { + if (string === null) { + throw new Error('Arguments cannot be null'); + } + + const array = [...disassemble(string)]; + + const result = []; + + let complete_index = -1, + jong_joined = false; + + /** + * Helper function to combine jamo into hangul + * @param {number} index Index of a hangul + */ + function makeHangul(index) { + let cho, + jung1, + jung2, + jong1 = 0, + jong2, + hangul = ''; + + jong_joined = false; + + if (complete_index + 1 > index) { + return; + } + + for (let step = 1; ; step++) { + // eslint-disable-next-line unicorn/prefer-switch + if (step === 1) { + cho = array[complete_index + step].charCodeAt(0); + if (isJung(cho)) { + if (complete_index + step + 1 <= index && isJung(jung1 = array[complete_index + step + 1].charCodeAt(0))) { + result.push(String.fromCharCode(isJungJoinable(cho, jung1))); + complete_index = index; + return; + } else { + result.push(array[complete_index + step]); + complete_index = index; + return; + } + } else if (!isCho(cho)) { + result.push(array[complete_index + step]); + complete_index = index; + return; + } + hangul = array[complete_index + step]; + } else if (step === 2) { + jung1 = array[complete_index + step].charCodeAt(0); + if (isCho(jung1)) { + result.push(String.fromCharCode(isJongJoinable(cho, jung1))); + complete_index = index; + return; + } else { + hangul = String.fromCharCode((CHO_HASH[cho] * 21 + JUNG_HASH[jung1]) * 28 + HANGUL_OFFSET); + } + } else if (step === 3) { + jung2 = array[complete_index + step].charCodeAt(0); + if (isJungJoinable(jung1, jung2)) { + jung1 = isJungJoinable(jung1, jung2); + } else { + jong1 = jung2; + } + hangul = String.fromCharCode((CHO_HASH[cho] * 21 + JUNG_HASH[jung1]) * 28 + JONG_HASH[jong1] + HANGUL_OFFSET); // eslint-disable-line @typescript-eslint/no-unsafe-argument + } else if (step === 4) { + jong2 = array[complete_index + step].charCodeAt(0); + jong1 = isJongJoinable(jong1, jong2) ?? jong2; + hangul = String.fromCharCode((CHO_HASH[cho] * 21 + JUNG_HASH[jung1]) * 28 + JONG_HASH[jong1] + HANGUL_OFFSET); // eslint-disable-line @typescript-eslint/no-unsafe-argument + } else if (step === 5) { + jong2 = array[complete_index + step].charCodeAt(0); + jong1 = isJongJoinable(jong1, jong2); + hangul = String.fromCharCode((CHO_HASH[cho] * 21 + JUNG_HASH[jung1]) * 28 + JONG_HASH[jong1] + HANGUL_OFFSET); // eslint-disable-line @typescript-eslint/no-unsafe-argument + } + if (complete_index + step >= index) { + result.push(hangul); + complete_index = index; + return; + } + } + } + + let index, + stage = 0, + previousCharCode; + + for (index = 0; index < array.length; index++) { + const charCode = array[index].charCodeAt(0); + + if (!isCho(charCode) && !isJung(charCode) && !isJong(charCode)) { + makeHangul(index - 1); + makeHangul(index); + stage = 0; + continue; + } + + // eslint-disable-next-line unicorn/prefer-switch + if (stage === 0) { + if (isCho(charCode)) { + stage = 1; + } else if (isJung(charCode)) { + stage = 4; + } + } else if (stage === 1) { + if (isJung(charCode)) { + stage = 2; + } else { + if (isJongJoinable(previousCharCode, charCode)) { + stage = 5; + } else { + makeHangul(index - 1); + } + } + } else if (stage === 2) { + if (isJong(charCode)) { + stage = 3; + } else if (isJung(charCode)) { + if (!isJungJoinable(previousCharCode, charCode)) { + makeHangul(index - 1); + stage = 4; + } + } else { + makeHangul(index - 1); + stage = 1; + } + } else if (stage === 3) { + if (isJong(charCode)) { + if (!jong_joined && isJongJoinable(previousCharCode, charCode)) { + jong_joined = true; + } else { + makeHangul(index - 1); + stage = 1; + } + } else if (isCho(charCode)) { + makeHangul(index - 1); + stage = 1; + } else if (isJung(charCode)) { + makeHangul(index - 2); + stage = 2; + } + } else if (stage === 4) { + if (isJung(charCode)) { + if (isJungJoinable(previousCharCode, charCode)) { + makeHangul(index); + stage = 0; + } else { + makeHangul(index - 1); + } + } else { + makeHangul(index - 1); + stage = 1; + } + } else if (stage === 5) { + if (isJung(charCode)) { + makeHangul(index - 2); + stage = 2; + } else { + makeHangul(index - 1); + stage = 1; + } + } + previousCharCode = charCode; + } + makeHangul(index - 1); + return result.join(''); +}; diff --git a/ext/js/language/ko/korean-text-processors.js b/ext/js/language/ko/korean-text-processors.js index 859ddc80ae..b0df4b413e 100644 --- a/ext/js/language/ko/korean-text-processors.js +++ b/ext/js/language/ko/korean-text-processors.js @@ -15,13 +15,15 @@ * along with this program. If not, see . */ +import {assemble, disassemble} from './korean-hangul.js'; + /** @type {import('language').TextProcessor} */ export const disassembleHangul = { name: 'Disassemble Hangul', description: 'Disassemble Hangul characters into jamo.', options: [true], // Could probably also be set to [false, true], but this way it is always on process: (str) => { - return str; // Import from hangul.js + return disassemble(str); } }; @@ -31,6 +33,6 @@ export const reassembleHangul = { description: 'Reassemble Hangul characters from jamo.', options: [true], // Could probably also be set to [false, true], but this way it is always on process: (str) => { - return str; // Import from hangul.js + return assemble(str); } }; From 60eec122c0d4ca02269118780383103e76b74b62 Mon Sep 17 00:00:00 2001 From: Lyroxide <33834537+Lyroxide@users.noreply.github.com> Date: Tue, 26 Mar 2024 01:40:07 +0900 Subject: [PATCH 4/7] move hangul to lib, add test (#14) * add hangul functions * hangul lib * fix tests * test inputs * fix hangul disassemble, fix postprocessing * rename test * reset transformedText for multiple postprocessors * add credits * fix conflict --------- Co-authored-by: Stefan Vukovic --- .eslintrc.json | 2 +- README.md | 1 + dev/lib/hangul-js.js | 18 + ext/js/language/ko/korean-hangul.js | 586 ------------------ ext/js/language/ko/korean-text-processors.js | 6 +- ext/js/language/ko/korean-transforms.js | 83 +++ ext/js/language/language-descriptors.js | 5 +- ext/js/language/translator.js | 6 +- package-lock.json | 11 + package.json | 1 + test/data/anki-note-builder-test-results.json | 42 ++ test/data/database-test-cases.json | 6 +- .../valid-dictionary1/term_bank_1.json | 3 +- test/data/translator-test-inputs.json | 14 + .../translator-test-results-note-data1.json | 116 ++++ test/data/translator-test-results.json | 81 +++ 16 files changed, 383 insertions(+), 598 deletions(-) create mode 100644 dev/lib/hangul-js.js delete mode 100644 ext/js/language/ko/korean-hangul.js create mode 100644 ext/js/language/ko/korean-transforms.js diff --git a/.eslintrc.json b/.eslintrc.json index 6fdb8a14d6..0d60e4d709 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -647,8 +647,8 @@ "ext/js/language/ja/japanese-transforms.js", "ext/js/language/ja/japanese-wanakana.js", "ext/js/language/ja/japanese.js", - "ext/js/language/ko/korean-hangul.js", "ext/js/language/ko/korean-text-processors.js", + "ext/js/language/ko/korean-transforms.js", "ext/js/language/la/latin-text-preprocessors.js", "ext/js/language/language-descriptors.js", "ext/js/language/language-transformer.js", diff --git a/README.md b/README.md index c29c918bc2..0d3394cb8d 100644 --- a/README.md +++ b/README.md @@ -125,3 +125,4 @@ Yomitan uses several third-party libraries to function. | yomitan-handlebars | 1.0.0 | MIT | n/a | | parse5 | 7.1.2 | MIT | git://github.com/inikulin/parse5.git | | wanakana | 5.3.1 | MIT | git+ssh://git@github.com/WaniKani/WanaKana.git | +| hangul.js | 0.2.6 | MIT | git+https://github.com/e-/Hangul.js.git | diff --git a/dev/lib/hangul-js.js b/dev/lib/hangul-js.js new file mode 100644 index 0000000000..ed8df1dc3e --- /dev/null +++ b/dev/lib/hangul-js.js @@ -0,0 +1,18 @@ +/* + * Copyright (C) 2023-2024 Yomitan Authors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +export * as Hangul from 'hangul-js'; diff --git a/ext/js/language/ko/korean-hangul.js b/ext/js/language/ko/korean-hangul.js deleted file mode 100644 index d9863af79a..0000000000 --- a/ext/js/language/ko/korean-hangul.js +++ /dev/null @@ -1,586 +0,0 @@ -/* - * Copyright (C) 2024 Yomitan Authors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -const HANGUL_OFFSET = 0xAC00; - -const CHO = [ - 'ㄱ', - 'ㄲ', - 'ㄴ', - 'ㄷ', - 'ㄸ', - 'ㄹ', - 'ㅁ', - 'ㅂ', - 'ㅃ', - 'ㅅ', - 'ㅆ', - 'ㅇ', - 'ㅈ', - 'ㅉ', - 'ㅊ', - 'ㅋ', - 'ㅌ', - 'ㅍ', - 'ㅎ' -]; - -const JUNG = [ - 'ㅏ', - 'ㅐ', - 'ㅑ', - 'ㅒ', - 'ㅓ', - 'ㅔ', - 'ㅕ', - 'ㅖ', - 'ㅗ', - ['ㅗ', 'ㅏ'], - ['ㅗ', 'ㅐ'], - ['ㅗ', 'ㅣ'], - 'ㅛ', - 'ㅜ', - ['ㅜ', 'ㅓ'], - ['ㅜ', 'ㅔ'], - ['ㅜ', 'ㅣ'], - 'ㅠ', - 'ㅡ', - ['ㅡ', 'ㅣ'], - 'ㅣ' -]; - -const JONG = [ - '', - 'ㄱ', - 'ㄲ', - ['ㄱ', 'ㅅ'], - 'ㄴ', - ['ㄴ', 'ㅈ'], - ['ㄴ', 'ㅎ'], - 'ㄷ', - 'ㄹ', - ['ㄹ', 'ㄱ'], - ['ㄹ', 'ㅁ'], - ['ㄹ', 'ㅂ'], - ['ㄹ', 'ㅅ'], - ['ㄹ', 'ㅌ'], - ['ㄹ', 'ㅍ'], - ['ㄹ', 'ㅎ'], - 'ㅁ', - 'ㅂ', - ['ㅂ', 'ㅅ'], - 'ㅅ', - 'ㅆ', - 'ㅇ', - 'ㅈ', - 'ㅊ', - 'ㅋ', - 'ㅌ', - 'ㅍ', - 'ㅎ' -]; - -const CONSONANTS = [ - 'ㄱ', - 'ㄲ', - 'ㄳ', - 'ㄴ', - 'ㄵ', - 'ㄶ', - 'ㄷ', - 'ㄸ', - 'ㄹ', - 'ㄺ', - 'ㄻ', - 'ㄼ', - 'ㄽ', - 'ㄾ', - 'ㄿ', - 'ㅀ', - 'ㅁ', - 'ㅂ', - 'ㅃ', - 'ㅄ', - 'ㅅ', - 'ㅆ', - 'ㅇ', - 'ㅈ', - 'ㅉ', - 'ㅊ', - 'ㅋ', - 'ㅌ', - 'ㅍ', - 'ㅎ' -]; - -const COMPLETE_CHO = [ - 'ㄱ', - 'ㄲ', - 'ㄴ', - 'ㄷ', - 'ㄸ', - 'ㄹ', - 'ㅁ', - 'ㅂ', - 'ㅃ', - 'ㅅ', - 'ㅆ', - 'ㅇ', - 'ㅈ', - 'ㅉ', - 'ㅊ', - 'ㅋ', - 'ㅌ', - 'ㅍ', - 'ㅎ' -]; - -const COMPLETE_JUNG = [ - 'ㅏ', - 'ㅐ', - 'ㅑ', - 'ㅒ', - 'ㅓ', - 'ㅔ', - 'ㅕ', - 'ㅖ', - 'ㅗ', - 'ㅘ', - 'ㅙ', - 'ㅚ', - 'ㅛ', - 'ㅜ', - 'ㅝ', - 'ㅞ', - 'ㅟ', - 'ㅠ', - 'ㅡ', - 'ㅢ', - 'ㅣ' -]; - -const COMPLETE_JONG = [ - '', - 'ㄱ', - 'ㄲ', - 'ㄳ', - 'ㄴ', - 'ㄵ', - 'ㄶ', - 'ㄷ', - 'ㄹ', - 'ㄺ', - 'ㄻ', - 'ㄼ', - 'ㄽ', - 'ㄾ', - 'ㄿ', - 'ㅀ', - 'ㅁ', - 'ㅂ', - 'ㅄ', - 'ㅅ', - 'ㅆ', - 'ㅇ', - 'ㅈ', - 'ㅊ', - 'ㅋ', - 'ㅌ', - 'ㅍ', - 'ㅎ' -]; - -const COMPLEX_CONSONANTS = [ - ['ㄱ', 'ㅅ', 'ㄳ'], - ['ㄴ', 'ㅈ', 'ㄵ'], - ['ㄴ', 'ㅎ', 'ㄶ'], - ['ㄹ', 'ㄱ', 'ㄺ'], - ['ㄹ', 'ㅁ', 'ㄻ'], - ['ㄹ', 'ㅂ', 'ㄼ'], - ['ㄹ', 'ㅅ', 'ㄽ'], - ['ㄹ', 'ㅌ', 'ㄾ'], - ['ㄹ', 'ㅍ', 'ㄿ'], - ['ㄹ', 'ㅎ', 'ㅀ'], - ['ㅂ', 'ㅅ', 'ㅄ'] -]; - -const COMPLEX_VOWELS = [ - ['ㅗ', 'ㅏ', 'ㅘ'], - ['ㅗ', 'ㅐ', 'ㅙ'], - ['ㅗ', 'ㅣ', 'ㅚ'], - ['ㅜ', 'ㅓ', 'ㅝ'], - ['ㅜ', 'ㅔ', 'ㅞ'], - ['ㅜ', 'ㅣ', 'ㅟ'], - ['ㅡ', 'ㅣ', 'ㅢ'] -]; - -const makeHash = (array) => { - const hash = {0: 0}; - for (let i = 0; i < array.length; i++) { - if (array[i]) { - hash[array[i].charCodeAt(0)] = i; - } - } - return hash; -}; - -const CONSONANTS_HASH = makeHash(CONSONANTS); - -const CHO_HASH = makeHash(COMPLETE_CHO); - -const JUNG_HASH = makeHash(COMPLETE_JUNG); - -const JONG_HASH = makeHash(COMPLETE_JONG); - -const makeComplexHash = (array) => { - const hash = {}; - let code1, code2; - for (let i = 0; i < array.length; i++) { - code1 = array[i][0].charCodeAt(0); - code2 = array[i][1].charCodeAt(0); - if (typeof hash[code1] === 'undefined') { - hash[code1] = {}; - } - hash[code1][code2] = array[i][2].charCodeAt(0); - } - return hash; -}; - -const COMPLEX_CONSONANTS_HASH = makeComplexHash(COMPLEX_CONSONANTS); - -const COMPLEX_VOWELS_HASH = makeComplexHash(COMPLEX_VOWELS); - -/** - * Checks if the given character is a Korean consonant. - * @param {number} c The character to check. - * @returns {boolean} True if the character is a Korean consonant, false otherwise. - */ -function isConsonant(c) { - return typeof CONSONANTS_HASH[c] !== 'undefined'; -} - -/** - * Checks if the given character is a Korean initial consonant (cho). - * @param {number} c The character to check. - * @returns {boolean} True if the character is a Korean initial consonant, false otherwise. - */ -function isCho(c) { - return typeof CHO_HASH[c] !== 'undefined'; -} - -/** - * Checks if the given character is a Korean vowel (jung). - * @param {number} c The character to check. - * @returns {boolean} True if the character is a Korean vowel, false otherwise. - */ -function isJung(c) { - return typeof JUNG_HASH[c] !== 'undefined'; -} - -/** - * Checks if the given character is a Korean final consonant (jong). - * @param {number} c The character to check. - * @returns {boolean} True if the character is a Korean final consonant, false otherwise. - */ -function isJong(c) { - return typeof JONG_HASH[c] !== 'undefined'; -} - -/** - * Checks if the given character code represents a Hangul character. - * @param {number} charCode The character code to check. - * @returns {boolean} True if the character code represents a Hangul character, false otherwise. - */ -function isHangul(charCode) { - return HANGUL_OFFSET <= charCode && charCode <= 0xd7a3; -} - -/** - * Retrieves the indices of the initial consonant (cho), vowel (jung), and final consonant (jong) - * that make up the given Hangul character code. - * @param {number} charCode The character code of the Hangul character. - * @returns {object} An object containing the indices of cho, jung, and jong. - */ -function getHangulIndices(charCode) { - const baseCode = charCode - HANGUL_OFFSET; - return { - cho: Math.floor(baseCode / 588), - jung: Math.floor((baseCode % 588) / 28), - jong: baseCode % 28 - }; -} - -/** - * Checks if the given characters 'a' and 'b' can be combined to form a complex vowel. - * @param {number} a The character code of the first vowel. - * @param {number} b The character code of the second vowel. - * @returns {(number|boolean)} The character code of the combined complex vowel, or false if they cannot be combined. - */ -function isJungJoinable(a, b) { - return (COMPLEX_VOWELS_HASH[a] && COMPLEX_VOWELS_HASH[a][b]) ? COMPLEX_VOWELS_HASH[a][b] : false; -} - -/** - * Checks if the given characters 'a' and 'b' can be combined to form a complex final consonant. - * @param {number} a The character code of the first final consonant. - * @param {number} b The character code of the second final consonant. - * @returns {(number|boolean)} The character code of the combined complex final consonant, or false if they cannot be combined. - */ -function isJongJoinable(a, b) { - return COMPLEX_CONSONANTS_HASH[a] && COMPLEX_CONSONANTS_HASH[a][b] ? COMPLEX_CONSONANTS_HASH[a][b] : false; -} - -/** - * Disassembles a given string into an array of individual Hangul characters or character components. - * @param {string} string The string to be disassembled. - * @param {boolean} [grouped=false] Whether to group the components of each Hangul character. - * @returns {(string|string[])} An array of individual Hangul characters or character components, or a single string if `grouped` is false. - * @throws {Error} If the input string is null. - */ -export const disassemble = (string, grouped = false) => { - if (string === null) { - throw new Error('Arguments cannot be null'); - } - - string = Array.isArray(string) ? string.join('') : string; - - const result = []; - - for (const character of string) { - const charCode = character.charCodeAt(0); - - if (isHangul(charCode)) { - const {cho, jung, jong} = getHangulIndices(charCode); - - const disassembled = [CHO[cho]]; - - if (Array.isArray(JUNG[jung])) { - disassembled.push(JUNG[jung].join('')); // eslint-disable-line @typescript-eslint/no-unsafe-argument - } else { - disassembled.push(JUNG[jung]); - } - - if (JONG[jong]) { - if (Array.isArray(JONG[jong])) { - disassembled.push(JONG[jong].join('')); // eslint-disable-line @typescript-eslint/no-unsafe-argument - } else { - disassembled.push(JONG[jong]); - } - } - - if (grouped) { - result.push(disassembled); - } else { - result.push(...disassembled); - } - } else if (isConsonant(charCode)) { - if (isCho(charCode)) { - result.push(CHO[CHO_HASH[charCode]]); - } else { - if (Array.isArray(JONG[JONG_HASH[charCode]])) { - result.push(JONG[JONG_HASH[charCode]].join('')); - } else { - result.push(JONG[JONG_HASH[charCode]]); - } - } - } else if (isJung(charCode)) { - if (Array.isArray(JUNG[JUNG_HASH[charCode]])) { - result.push(JUNG[JUNG_HASH[charCode]].join('')); - } else { - result.push(JUNG[JUNG_HASH[charCode]]); - } - } else { - result.push(character); - } - } - return grouped ? result : result.join(''); -}; - -/** - * Assembles an array of individual Hangul characters or character components into a single string. - * @param {string} string The string containing individual Hangul characters or character components to be assembled. - * @returns {string} The assembled string. - * @throws {Error} If the input string is null. - */ -export const assemble = (string) => { - if (string === null) { - throw new Error('Arguments cannot be null'); - } - - const array = [...disassemble(string)]; - - const result = []; - - let complete_index = -1, - jong_joined = false; - - /** - * Helper function to combine jamo into hangul - * @param {number} index Index of a hangul - */ - function makeHangul(index) { - let cho, - jung1, - jung2, - jong1 = 0, - jong2, - hangul = ''; - - jong_joined = false; - - if (complete_index + 1 > index) { - return; - } - - for (let step = 1; ; step++) { - // eslint-disable-next-line unicorn/prefer-switch - if (step === 1) { - cho = array[complete_index + step].charCodeAt(0); - if (isJung(cho)) { - if (complete_index + step + 1 <= index && isJung(jung1 = array[complete_index + step + 1].charCodeAt(0))) { - result.push(String.fromCharCode(isJungJoinable(cho, jung1))); - complete_index = index; - return; - } else { - result.push(array[complete_index + step]); - complete_index = index; - return; - } - } else if (!isCho(cho)) { - result.push(array[complete_index + step]); - complete_index = index; - return; - } - hangul = array[complete_index + step]; - } else if (step === 2) { - jung1 = array[complete_index + step].charCodeAt(0); - if (isCho(jung1)) { - result.push(String.fromCharCode(isJongJoinable(cho, jung1))); - complete_index = index; - return; - } else { - hangul = String.fromCharCode((CHO_HASH[cho] * 21 + JUNG_HASH[jung1]) * 28 + HANGUL_OFFSET); - } - } else if (step === 3) { - jung2 = array[complete_index + step].charCodeAt(0); - if (isJungJoinable(jung1, jung2)) { - jung1 = isJungJoinable(jung1, jung2); - } else { - jong1 = jung2; - } - hangul = String.fromCharCode((CHO_HASH[cho] * 21 + JUNG_HASH[jung1]) * 28 + JONG_HASH[jong1] + HANGUL_OFFSET); // eslint-disable-line @typescript-eslint/no-unsafe-argument - } else if (step === 4) { - jong2 = array[complete_index + step].charCodeAt(0); - jong1 = isJongJoinable(jong1, jong2) ?? jong2; - hangul = String.fromCharCode((CHO_HASH[cho] * 21 + JUNG_HASH[jung1]) * 28 + JONG_HASH[jong1] + HANGUL_OFFSET); // eslint-disable-line @typescript-eslint/no-unsafe-argument - } else if (step === 5) { - jong2 = array[complete_index + step].charCodeAt(0); - jong1 = isJongJoinable(jong1, jong2); - hangul = String.fromCharCode((CHO_HASH[cho] * 21 + JUNG_HASH[jung1]) * 28 + JONG_HASH[jong1] + HANGUL_OFFSET); // eslint-disable-line @typescript-eslint/no-unsafe-argument - } - if (complete_index + step >= index) { - result.push(hangul); - complete_index = index; - return; - } - } - } - - let index, - stage = 0, - previousCharCode; - - for (index = 0; index < array.length; index++) { - const charCode = array[index].charCodeAt(0); - - if (!isCho(charCode) && !isJung(charCode) && !isJong(charCode)) { - makeHangul(index - 1); - makeHangul(index); - stage = 0; - continue; - } - - // eslint-disable-next-line unicorn/prefer-switch - if (stage === 0) { - if (isCho(charCode)) { - stage = 1; - } else if (isJung(charCode)) { - stage = 4; - } - } else if (stage === 1) { - if (isJung(charCode)) { - stage = 2; - } else { - if (isJongJoinable(previousCharCode, charCode)) { - stage = 5; - } else { - makeHangul(index - 1); - } - } - } else if (stage === 2) { - if (isJong(charCode)) { - stage = 3; - } else if (isJung(charCode)) { - if (!isJungJoinable(previousCharCode, charCode)) { - makeHangul(index - 1); - stage = 4; - } - } else { - makeHangul(index - 1); - stage = 1; - } - } else if (stage === 3) { - if (isJong(charCode)) { - if (!jong_joined && isJongJoinable(previousCharCode, charCode)) { - jong_joined = true; - } else { - makeHangul(index - 1); - stage = 1; - } - } else if (isCho(charCode)) { - makeHangul(index - 1); - stage = 1; - } else if (isJung(charCode)) { - makeHangul(index - 2); - stage = 2; - } - } else if (stage === 4) { - if (isJung(charCode)) { - if (isJungJoinable(previousCharCode, charCode)) { - makeHangul(index); - stage = 0; - } else { - makeHangul(index - 1); - } - } else { - makeHangul(index - 1); - stage = 1; - } - } else if (stage === 5) { - if (isJung(charCode)) { - makeHangul(index - 2); - stage = 2; - } else { - makeHangul(index - 1); - stage = 1; - } - } - previousCharCode = charCode; - } - makeHangul(index - 1); - return result.join(''); -}; diff --git a/ext/js/language/ko/korean-text-processors.js b/ext/js/language/ko/korean-text-processors.js index b0df4b413e..c77510c255 100644 --- a/ext/js/language/ko/korean-text-processors.js +++ b/ext/js/language/ko/korean-text-processors.js @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -import {assemble, disassemble} from './korean-hangul.js'; +import {Hangul} from '../../../lib/hangul-js.js'; /** @type {import('language').TextProcessor} */ export const disassembleHangul = { @@ -23,7 +23,7 @@ export const disassembleHangul = { description: 'Disassemble Hangul characters into jamo.', options: [true], // Could probably also be set to [false, true], but this way it is always on process: (str) => { - return disassemble(str); + return Hangul.disassemble(str, false).join(''); } }; @@ -33,6 +33,6 @@ export const reassembleHangul = { description: 'Reassemble Hangul characters from jamo.', options: [true], // Could probably also be set to [false, true], but this way it is always on process: (str) => { - return assemble(str); + return Hangul.assemble(str); } }; diff --git a/ext/js/language/ko/korean-transforms.js b/ext/js/language/ko/korean-transforms.js new file mode 100644 index 0000000000..5ec619125f --- /dev/null +++ b/ext/js/language/ko/korean-transforms.js @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2024 Yomitan Authors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +import {suffixInflection} from '../language-transforms.js'; + +/** @type {import('language-transformer').LanguageTransformDescriptor} */ +export const koreanTransforms = { + language: 'ko', + conditions: { + v: { + name: 'Verb or Auxiliary Verb', + isDictionaryForm: true, + i18n: [ + { + language: 'ko', + name: '동사 / 보조 동사' + } + ] + }, + adj: { + name: 'Adjective or Auxiliary Adjective', + isDictionaryForm: true, + i18n: [ + { + language: 'ko', + name: '형용사 / 보조 형용사' + } + ] + }, + p: { + name: 'Intermediate past tense ending', + isDictionaryForm: false + }, + f: { + name: 'Intermediate future tense ending', + isDictionaryForm: false + }, + eusi: { + name: 'Intermediate formal ending', + isDictionaryForm: false + }, + euob: { + name: 'Intermediate formal ending', + isDictionaryForm: false + }, + sao: { + name: 'Intermediate formal ending', + isDictionaryForm: false + }, + saob: { + name: 'Intermediate formal ending', + isDictionaryForm: false + }, + sab: { + name: 'Intermediate formal ending', + isDictionaryForm: false + } + }, + transforms: [ + { + name: '거나', + rules: [ + suffixInflection('ㄱㅓㄴㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄱㅓㄴㅏ', '', [], ['p', 'f', 'euob', 'eusi']), + suffixInflection('ㅇㅣㄱㅓㄴㅏ', 'ㅇㅣㄷㅏ', [], []) + ] + } + ] +}; diff --git a/ext/js/language/language-descriptors.js b/ext/js/language/language-descriptors.js index 6782cd8088..09fde3029e 100644 --- a/ext/js/language/language-descriptors.js +++ b/ext/js/language/language-descriptors.js @@ -22,6 +22,7 @@ import {collapseEmphaticSequences, convertAlphabeticCharacters, convertHalfWidth import {japaneseTransforms} from './ja/japanese-transforms.js'; import {isStringPartiallyJapanese} from './ja/japanese.js'; import {disassembleHangul, reassembleHangul} from './ko/korean-text-processors.js'; +import {koreanTransforms} from './ko/korean-transforms.js'; import {removeLatinDiacritics} from './la/latin-text-preprocessors.js'; import {removeRussianDiacritics, yoToE} from './ru/russian-text-preprocessors.js'; import {albanianTransforms} from './sq/albanian-transforms.js'; @@ -145,8 +146,8 @@ const languageDescriptors = [ }, textPostprocessors: { reassembleHangul - } - // languageTransforms: koreanTransforms + }, + languageTransforms: koreanTransforms }, { iso: 'pl', diff --git a/ext/js/language/translator.js b/ext/js/language/translator.js index bc53e2a625..b7960f8128 100644 --- a/ext/js/language/translator.js +++ b/ext/js/language/translator.js @@ -480,12 +480,14 @@ export class Translator { if (used.has(source)) { break; } used.add(source); const rawSource = sourceMap.source.substring(0, sourceMap.getSourceLength(i)); - for (const {text: transformedText, conditions, trace} of this._multiLanguageTransformer.transform(language, source)) { + for (const deinflection of this._multiLanguageTransformer.transform(language, source)) { + const {trace, conditions} = deinflection; for (const postprocessorVariant of this._generateArrayVariants(postprocessorOptionsSpace)) { + let {text: transformedText} = deinflection; for (const postprocessor of textPostprocessors.values()) { const {id, textProcessor} = postprocessor; const setting = postprocessorVariant.get(id); - text2 = textProcessor.process(text2, setting, sourceMap); + transformedText = textProcessor.process(transformedText, setting, sourceMap); } /** @type {import('dictionary').InflectionRuleChainCandidate} */ diff --git a/package-lock.json b/package-lock.json index 5016c50d0e..e0ac7bf4b3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "@zip.js/zip.js": "^2.7.36", "dexie": "^3.2.5", "dexie-export-import": "^4.1.1", + "hangul-js": "^0.2.6", "parse5": "^7.1.2", "wanakana": "^5.3.1", "yomitan-handlebars": "git+https://github.com/themoeway/yomitan-handlebars.git#12aff5e3550954d7d3a98a5917ff7d579f3cce25" @@ -5156,6 +5157,11 @@ "uglify-js": "^3.1.4" } }, + "node_modules/hangul-js": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/hangul-js/-/hangul-js-0.2.6.tgz", + "integrity": "sha512-48axU8LgjCD30FEs66Xc04/8knxMwCMQw0f67l67rlttW7VXT3qRJgQeHmhiuGwWXGvSbk6YM0fhQlcjE1JFQA==" + }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -14019,6 +14025,11 @@ "wordwrap": "^1.0.0" } }, + "hangul-js": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/hangul-js/-/hangul-js-0.2.6.tgz", + "integrity": "sha512-48axU8LgjCD30FEs66Xc04/8knxMwCMQw0f67l67rlttW7VXT3qRJgQeHmhiuGwWXGvSbk6YM0fhQlcjE1JFQA==" + }, "has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", diff --git a/package.json b/package.json index 1ef6cc496c..ec99f83605 100644 --- a/package.json +++ b/package.json @@ -107,6 +107,7 @@ "@zip.js/zip.js": "^2.7.36", "dexie": "^3.2.5", "dexie-export-import": "^4.1.1", + "hangul-js": "^0.2.6", "parse5": "^7.1.2", "wanakana": "^5.3.1", "yomitan-handlebars": "git+https://github.com/themoeway/yomitan-handlebars.git#12aff5e3550954d7d3a98a5917ff7d579f3cce25" diff --git a/test/data/anki-note-builder-test-results.json b/test/data/anki-note-builder-test-results.json index 1d84712dea..4eeb9f8e46 100644 --- a/test/data/anki-note-builder-test-results.json +++ b/test/data/anki-note-builder-test-results.json @@ -3919,5 +3919,47 @@ "url": "url:" } ] + }, + { + "name": "Test text postprocessing", + "results": [ + { + "audio": "", + "clipboard-image": "", + "clipboard-text": "", + "cloze-body": "마시거나", + "cloze-body-kana": "마시거나", + "cloze-prefix": "cloze-prefix", + "cloze-suffix": "cloze-suffix", + "conjugation": "거나", + "dictionary": "Test Dictionary 2", + "document-title": "title", + "expression": "마시다", + "frequencies": "", + "frequency-harmonic-rank": "9999999", + "frequency-harmonic-occurrence": "0", + "frequency-average-rank": "9999999", + "frequency-average-occurrence": "0", + "furigana": "마시다", + "furigana-plain": "마시다", + "glossary": "
(v, Test Dictionary 2) masida definition
", + "glossary-brief": "
masida definition
", + "glossary-no-dictionary": "
(v) masida definition
", + "part-of-speech": "v", + "pitch-accents": "No pitch accent data", + "pitch-accent-graphs": "No pitch accent data", + "pitch-accent-positions": "No pitch accent data", + "pitch-accent-categories": "", + "phonetic-transcriptions": "", + "reading": "마시다", + "screenshot": "", + "search-query": "fullQuery", + "selection-text": "", + "sentence": "cloze-prefix마시거나cloze-suffix", + "sentence-furigana": "cloze-prefix마시거나cloze-suffix", + "tags": "v", + "url": "url:" + } + ] } ] diff --git a/test/data/database-test-cases.json b/test/data/database-test-cases.json index 5747f59ef0..054ede34bc 100644 --- a/test/data/database-test-cases.json +++ b/test/data/database-test-cases.json @@ -27,7 +27,7 @@ "ipa": 1 }, "terms": { - "total": 29 + "total": 30 } } }, @@ -36,7 +36,7 @@ { "kanji": 2, "kanjiMeta": 6, - "terms": 29, + "terms": 30, "termMeta": 39, "tagMeta": 15, "media": 6 @@ -45,7 +45,7 @@ "total": { "kanji": 2, "kanjiMeta": 6, - "terms": 29, + "terms": 30, "termMeta": 39, "tagMeta": 15, "media": 6 diff --git a/test/data/dictionaries/valid-dictionary1/term_bank_1.json b/test/data/dictionaries/valid-dictionary1/term_bank_1.json index e7fb015cad..a362de2339 100644 --- a/test/data/dictionaries/valid-dictionary1/term_bank_1.json +++ b/test/data/dictionaries/valid-dictionary1/term_bank_1.json @@ -343,5 +343,6 @@ ["39", "さんきゅう", "", "", 1, ["sankyuu definition"], 17, ""], ["凄い", "すごい", "adj-i", "adj-i", 1, ["sugoi definition"], 18, ""], ["English", "", "n", "n", 1, ["English definition"], 19, ""], - ["language", "", "n", "n", 1, ["language definition"], 20, ""] + ["language", "", "n", "n", 1, ["language definition"], 20, ""], + ["마시다", "", "v", "v", 1, ["masida definition"], 21, ""] ] diff --git a/test/data/translator-test-inputs.json b/test/data/translator-test-inputs.json index c904771684..cad84f0ade 100644 --- a/test/data/translator-test-inputs.json +++ b/test/data/translator-test-inputs.json @@ -456,6 +456,20 @@ "removeNonJapaneseCharacters": false } ] + }, + { + "name": "Test text postprocessing", + "func": "findTerms", + "mode": "split", + "text": "마시거나", + "options": [ + "default", + { + "type": "terms", + "language": "ko", + "removeNonJapaneseCharacters": false + } + ] } ] } diff --git a/test/data/translator-test-results-note-data1.json b/test/data/translator-test-results-note-data1.json index f580ac53bc..06613c95c6 100644 --- a/test/data/translator-test-results-note-data1.json +++ b/test/data/translator-test-results-note-data1.json @@ -32940,5 +32940,121 @@ "media": {} } ] + }, + { + "name": "Test text postprocessing", + "noteDataList": [ + { + "marker": "{marker}", + "definition": { + "type": "term", + "id": 29, + "source": "ㅁㅏㅅㅣㄱㅓㄴㅏ", + "rawSource": "마시거나", + "sourceTerm": "마시다", + "inflectionRuleChainCandidates": [ + { + "source": "algorithm", + "inflectionRules": [ + "거나" + ] + } + ], + "score": 1, + "isPrimary": true, + "sequence": 21, + "dictionary": "Test Dictionary 2", + "dictionaryOrder": { + "index": 0, + "priority": 0 + }, + "dictionaryNames": [ + "Test Dictionary 2" + ], + "expression": "마시다", + "reading": "마시다", + "expressions": [ + { + "sourceTerm": "마시다", + "expression": "마시다", + "reading": "마시다", + "termTags": [], + "frequencies": [], + "pitches": [], + "furiganaSegments": [ + { + "text": "마시다", + "furigana": "" + } + ], + "termFrequency": "normal", + "wordClasses": [ + "v" + ] + } + ], + "glossary": [ + "masida definition" + ], + "definitionTags": [ + { + "name": "v", + "category": "default", + "notes": "", + "order": 0, + "score": 0, + "dictionary": "Test Dictionary 2", + "redundant": false + } + ], + "termTags": [], + "frequencies": [], + "frequencyHarmonic": -1, + "frequencyAverage": -1, + "pitches": [], + "phoneticTranscriptions": [], + "sourceTermExactMatchCount": 1, + "url": "url:", + "cloze": { + "sentence": "", + "prefix": "", + "body": "", + "bodyKana": "", + "suffix": "" + }, + "furiganaSegments": [ + { + "text": "마시다", + "furigana": "" + } + ] + }, + "glossaryLayoutMode": "default", + "compactTags": false, + "group": false, + "merge": false, + "modeTermKanji": false, + "modeTermKana": false, + "modeKanji": false, + "compactGlossaries": false, + "uniqueExpressions": [ + "마시다" + ], + "uniqueReadings": [ + "마시다" + ], + "pitches": [], + "pitchCount": 0, + "phoneticTranscriptions": [], + "context": { + "query": "query", + "fullQuery": "fullQuery", + "document": { + "title": "title" + } + }, + "media": {} + } + ] } ] diff --git a/test/data/translator-test-results.json b/test/data/translator-test-results.json index cd3f7ab6c0..ba7b17d0f3 100644 --- a/test/data/translator-test-results.json +++ b/test/data/translator-test-results.json @@ -18604,5 +18604,86 @@ "frequencies": [] } ] + }, + { + "name": "Test text postprocessing", + "originalTextLength": 4, + "dictionaryEntries": [ + { + "type": "term", + "isPrimary": true, + "inflectionRuleChainCandidates": [ + { + "source": "algorithm", + "inflectionRules": [ + "거나" + ] + } + ], + "score": 1, + "frequencyOrder": 0, + "dictionaryIndex": 0, + "dictionaryPriority": 0, + "sourceTermExactMatchCount": 1, + "maxTransformedTextLength": 8, + "headwords": [ + { + "index": 0, + "term": "마시다", + "reading": "마시다", + "sources": [ + { + "originalText": "마시거나", + "transformedText": "ㅁㅏㅅㅣㄱㅓㄴㅏ", + "deinflectedText": "마시다", + "matchType": "exact", + "matchSource": "term", + "isPrimary": true + } + ], + "tags": [], + "wordClasses": [ + "v" + ] + } + ], + "definitions": [ + { + "index": 0, + "headwordIndices": [ + 0 + ], + "dictionary": "Test Dictionary 2", + "dictionaryIndex": 0, + "dictionaryPriority": 0, + "id": 29, + "score": 1, + "frequencyOrder": 0, + "sequences": [ + 21 + ], + "isPrimary": true, + "tags": [ + { + "name": "v", + "category": "default", + "order": 0, + "score": 0, + "content": [], + "dictionaries": [ + "Test Dictionary 2" + ], + "redundant": false + } + ], + "entries": [ + "masida definition" + ] + } + ], + "pronunciations": [], + "frequencies": [] + } + ] } ] From 62aa87ddccf6fcd02ffe83131c8848a7aeda9cd7 Mon Sep 17 00:00:00 2001 From: Lyroxide <33834537+Lyroxide@users.noreply.github.com> Date: Sun, 12 May 2024 21:04:14 +0800 Subject: [PATCH 5/7] Vetting done (#16) * add hangul functions * hangul lib * fix tests * test inputs * fix hangul disassemble, fix postprocessing * rename test * reset transformedText for multiple postprocessors * add credits * fix conflict * add transforms * move substring * textprocessing function * mostly fixed * delete comment * mostly fixed (cherry picked from commit 268c8968ec64bf9d1fbd7d448a96d590399265c4) * prepare preprocessors (cherry picked from commit d139258398de9285396db31c6d46795ee95eb01a) * (reset) remove textSourceMap * rawSource before textreplacements * update tests * fix transforms * fix transforms * 100% vetted * add link to dict --------- Co-authored-by: Stefan Vukovic --- .eslintrc.json | 1 - dev/lib/hangul-js.js | 2 +- docs/dictionaries.md | 1 + ext/js/general/regex-util.js | 12 +- .../ja/japanese-text-preprocessors.js | 8 +- ext/js/language/ja/japanese-wanakana.js | 52 +- ext/js/language/ja/japanese.js | 15 +- ext/js/language/ko/korean-transforms.js | 4869 ++++++++++++++++- ext/js/language/language-descriptors.js | 2 +- ext/js/language/translator.js | 46 +- test/data/anki-note-builder-test-results.json | 66 +- .../translator-test-results-note-data1.json | 18 +- test/data/translator-test-results.json | 18 +- test/japanese-util.test.js | 136 +- types/ext/language.d.ts | 3 +- 15 files changed, 5014 insertions(+), 235 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 0d60e4d709..8f0311b4b4 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -639,7 +639,6 @@ "ext/js/general/cache-map.js", "ext/js/general/object-property-accessor.js", "ext/js/general/regex-util.js", - "ext/js/general/text-source-map.js", "ext/js/language/ar/arabic-text-preprocessors.js", "ext/js/language/de/german-text-preprocessors.js", "ext/js/language/en/english-transforms.js", diff --git a/dev/lib/hangul-js.js b/dev/lib/hangul-js.js index ed8df1dc3e..d1f29481b2 100644 --- a/dev/lib/hangul-js.js +++ b/dev/lib/hangul-js.js @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023-2024 Yomitan Authors + * Copyright (C) 2024 Yomitan Authors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/docs/dictionaries.md b/docs/dictionaries.md index df62435f3b..1c610aae43 100644 --- a/docs/dictionaries.md +++ b/docs/dictionaries.md @@ -16,6 +16,7 @@ Be aware that non-English dictionaries generally contain fewer entries than thei #### Other Languages - [KTY](https://github.com/themoeway/kaikki-to-yomitan) - Wiktionaries in various languages converted to Yomitan format. +- [KRDICT/STDICT](https://github.com/Lyroxide/yomitan-ko-dic/releases) - Korean dictionaries for Yomitan. #### EPWING Dictionaries diff --git a/ext/js/general/regex-util.js b/ext/js/general/regex-util.js index e09821542e..c633ec06be 100644 --- a/ext/js/general/regex-util.js +++ b/ext/js/general/regex-util.js @@ -23,13 +23,12 @@ const matchReplacementPattern = /\$(?:\$|&|`|'|(\d\d?)|<([^>]*)>)/g; * Applies string.replace using a regular expression and replacement string as arguments. * A source map of the changes is also maintained. * @param {string} text A string of the text to replace. - * @param {import('./text-source-map.js').TextSourceMap} sourceMap An instance of `TextSourceMap` which corresponds to `text`. * @param {RegExp} pattern A regular expression to use as the replacement. * @param {string} replacement A replacement string that follows the format of the standard * JavaScript regular expression replacement string. * @returns {string} A new string with the pattern replacements applied and the source map updated. */ -export function applyTextReplacement(text, sourceMap, pattern, replacement) { +export function applyTextReplacement(text, pattern, replacement) { const isGlobal = pattern.global; if (isGlobal) { pattern.lastIndex = 0; } for (let loop = true; loop; loop = isGlobal) { @@ -44,15 +43,6 @@ export function applyTextReplacement(text, sourceMap, pattern, replacement) { text = `${text.substring(0, index)}${actualReplacement}${text.substring(index + matchText.length)}`; pattern.lastIndex += delta; - - if (actualReplacementLength > 0) { - /** @type {number[]} */ - const zeroes = new Array(actualReplacementLength).fill(0); - sourceMap.insert(index, ...zeroes); - sourceMap.combine(index - 1 + actualReplacementLength, matchText.length); - } else { - sourceMap.combine(index, matchText.length); - } } return text; } diff --git a/ext/js/language/ja/japanese-text-preprocessors.js b/ext/js/language/ja/japanese-text-preprocessors.js index a3a7c8353f..6a9cc6576d 100644 --- a/ext/js/language/ja/japanese-text-preprocessors.js +++ b/ext/js/language/ja/japanese-text-preprocessors.js @@ -30,7 +30,7 @@ export const convertHalfWidthCharacters = { name: 'Convert half width characters to full width', description: 'ヨミチャン → ヨミチャン', options: basicTextProcessorOptions, - process: (str, setting, sourceMap) => (setting ? convertHalfWidthKanaToFullWidth(str, sourceMap) : str) + process: (str, setting) => (setting ? convertHalfWidthKanaToFullWidth(str) : str) }; /** @type {import('language').TextProcessor} */ @@ -46,7 +46,7 @@ export const convertAlphabeticCharacters = { name: 'Convert alphabetic characters to hiragana', description: 'yomichan → よみちゃん', options: basicTextProcessorOptions, - process: (str, setting, sourceMap) => (setting ? convertAlphabeticToKana(str, sourceMap) : str) + process: (str, setting) => (setting ? convertAlphabeticToKana(str) : str) }; /** @type {import('language').BidirectionalConversionPreprocessor} */ @@ -71,10 +71,10 @@ export const collapseEmphaticSequences = { name: 'Collapse emphatic character sequences', description: 'すっっごーーい → すっごーい / すごい', options: [[false, false], [true, false], [true, true]], - process: (str, setting, sourceMap) => { + process: (str, setting) => { const [collapseEmphatic, collapseEmphaticFull] = setting; if (collapseEmphatic) { - str = collapseEmphaticSequencesFunction(str, collapseEmphaticFull, sourceMap); + str = collapseEmphaticSequencesFunction(str, collapseEmphaticFull); } return str; } diff --git a/ext/js/language/ja/japanese-wanakana.js b/ext/js/language/ja/japanese-wanakana.js index 3226048977..a87db6b780 100644 --- a/ext/js/language/ja/japanese-wanakana.js +++ b/ext/js/language/ja/japanese-wanakana.js @@ -19,51 +19,10 @@ import * as wanakana from '../../../lib/wanakana.js'; /** * @param {string} text - * @param {?import('../../general/text-source-map.js').TextSourceMap} sourceMap - * @param {number} sourceMapStart * @returns {string} */ -function convertAlphabeticPartToKana(text, sourceMap, sourceMapStart) { - const result = wanakana.toHiragana(text); - - // Generate source mapping - if (sourceMap !== null) { - let i = 0; - let resultPos = 0; - const ii = text.length; - while (i < ii) { - // Find smallest matching substring - let iNext = i + 1; - let resultPosNext = result.length; - while (iNext < ii) { - const t = wanakana.toHiragana(text.substring(0, iNext)); - if (t === result.substring(0, t.length)) { - resultPosNext = t.length; - break; - } - ++iNext; - } - - // Merge characters - const removals = iNext - i - 1; - if (removals > 0) { - sourceMap.combine(sourceMapStart, removals); - } - ++sourceMapStart; - - // Empty elements - const additions = resultPosNext - resultPos - 1; - for (let j = 0; j < additions; ++j) { - sourceMap.insert(sourceMapStart, 0); - ++sourceMapStart; - } - - i = iNext; - resultPos = resultPosNext; - } - } - - return result; +function convertAlphabeticPartToKana(text) { + return wanakana.toHiragana(text); } /** @@ -84,10 +43,9 @@ export function convertToRomaji(text) { /** * @param {string} text - * @param {?import('../../general/text-source-map.js').TextSourceMap} sourceMap * @returns {string} */ -export function convertAlphabeticToKana(text, sourceMap = null) { +export function convertAlphabeticToKana(text) { let part = ''; let result = ''; @@ -106,7 +64,7 @@ export function convertAlphabeticToKana(text, sourceMap = null) { c = 0x2d; // '-' } else { if (part.length > 0) { - result += convertAlphabeticPartToKana(part, sourceMap, result.length); + result += convertAlphabeticPartToKana(part); part = ''; } result += char; @@ -116,7 +74,7 @@ export function convertAlphabeticToKana(text, sourceMap = null) { } if (part.length > 0) { - result += convertAlphabeticPartToKana(part, sourceMap, result.length); + result += convertAlphabeticPartToKana(part); } return result; } diff --git a/ext/js/language/ja/japanese.js b/ext/js/language/ja/japanese.js index 2c9a1f7f71..3507e5df1b 100644 --- a/ext/js/language/ja/japanese.js +++ b/ext/js/language/ja/japanese.js @@ -539,10 +539,9 @@ export function convertNumericToFullWidth(text) { /** * @param {string} text - * @param {?import('../../general/text-source-map.js').TextSourceMap} [sourceMap] * @returns {string} */ -export function convertHalfWidthKanaToFullWidth(text, sourceMap = null) { +export function convertHalfWidthKanaToFullWidth(text) { let result = ''; // This function is safe to use charCodeAt instead of codePointAt, since all @@ -575,9 +574,6 @@ export function convertHalfWidthKanaToFullWidth(text, sourceMap = null) { } } - if (sourceMap !== null && index > 0) { - sourceMap.combine(result.length, 1); - } result += c2; } @@ -705,13 +701,11 @@ export function distributeFuriganaInflected(term, reading, source) { /** * @param {string} text * @param {boolean} fullCollapse - * @param {?import('../../general/text-source-map.js').TextSourceMap} [sourceMap] * @returns {string} */ -export function collapseEmphaticSequences(text, fullCollapse, sourceMap = null) { +export function collapseEmphaticSequences(text, fullCollapse) { let result = ''; let collapseCodePoint = -1; - const hasSourceMap = (sourceMap !== null); for (const char of text) { const c = char.codePointAt(0); if ( @@ -729,11 +723,6 @@ export function collapseEmphaticSequences(text, fullCollapse, sourceMap = null) } else { collapseCodePoint = -1; result += char; - continue; - } - - if (hasSourceMap) { - sourceMap.combine(Math.max(0, result.length - 1), 1); } } return result; diff --git a/ext/js/language/ko/korean-transforms.js b/ext/js/language/ko/korean-transforms.js index 5ec619125f..5fdd3dbda8 100644 --- a/ext/js/language/ko/korean-transforms.js +++ b/ext/js/language/ko/korean-transforms.js @@ -41,6 +41,16 @@ export const koreanTransforms = { } ] }, + ida: { + name: 'Postpositional particle ida', + isDictionaryForm: true, + i18n: [ + { + language: 'ko', + name: '조사 이다' + } + ] + }, p: { name: 'Intermediate past tense ending', isDictionaryForm: false @@ -57,6 +67,10 @@ export const koreanTransforms = { name: 'Intermediate formal ending', isDictionaryForm: false }, + euo: { + name: 'Intermediate formal ending', + isDictionaryForm: false + }, sao: { name: 'Intermediate formal ending', isDictionaryForm: false @@ -68,15 +82,4862 @@ export const koreanTransforms = { sab: { name: 'Intermediate formal ending', isDictionaryForm: false + }, + jaob: { + name: 'Intermediate formal ending', + isDictionaryForm: false + }, + jao: { + name: 'Intermediate formal ending', + isDictionaryForm: false + }, + jab: { + name: 'Intermediate formal ending', + isDictionaryForm: false + }, + do: { + name: 'Intermediate ending', + isDictionaryForm: false } }, transforms: [ { - name: '거나', + name: '어간', + description: 'Stem', + rules: [ + suffixInflection('ㅂ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅃ', 'ㅃㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅈ', 'ㅈㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅉ', 'ㅉㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄷ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄸ', 'ㄸㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄱ', 'ㄱㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄲ', 'ㄲㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅅ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅆ', 'ㅆㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅁ', 'ㅁㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄴ', 'ㄴㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇ', 'ㅇㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅎ', 'ㅎㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅋ', 'ㅋㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅌ', 'ㅌㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅊ', 'ㅊㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅍ', 'ㅍㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅛ', 'ㅛㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅕ', 'ㅕㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅑ', 'ㅑㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅐ', 'ㅐㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅒ', 'ㅒㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅔ', 'ㅔㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅖ', 'ㅖㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅗ', 'ㅗㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅓ', 'ㅓㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅏ', 'ㅏㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅣ', 'ㅣㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅠ', 'ㅠㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅜ', 'ㅜㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅡ', 'ㅡㄷㅏ', [], ['v', 'adj']) + ] + }, + { + name: '-거나', + rules: [ + suffixInflection('ㄱㅓㄴㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄱㅓㄴㅏ', '', [], ['p', 'f', 'euob', 'eusi']) + ] + }, + { + name: '-거늘', + rules: [ + suffixInflection('ㄱㅓㄴㅡㄹ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄱㅓㄴㅡㄹ', '', [], ['p', 'f', 'euob', 'eusi']) + ] + }, + { + name: '-거니', + rules: [ + suffixInflection('ㄱㅓㄴㅣ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄱㅓㄴㅣ', '', [], ['p', 'f', 'euob', 'eusi']) + ] + }, + { + name: '-거니와', + rules: [ + suffixInflection('ㄱㅓㄴㅣㅇㅗㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄱㅓㄴㅣㅇㅗㅏ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-거던', + rules: [ + suffixInflection('ㄱㅓㄷㅓㄴ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄱㅓㄷㅓㄴ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-거드면', + rules: [ + suffixInflection('ㄱㅓㄷㅡㅁㅕㄴ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄱㅓㄷㅡㅁㅕㄴ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-거든', + rules: [ + suffixInflection('ㄱㅓㄷㅡㄴ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄱㅓㄷㅡㄴ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-거들랑', + rules: [ + suffixInflection('ㄱㅓㄷㅡㄹㄹㅏㅇ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄱㅓㄷㅡㄹㄹㅏㅇ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-거라', + rules: [ + suffixInflection('ㄱㅓㄹㅏ', 'ㄷㅏ', [], ['v']) + ] + }, + { + name: '-건', + rules: [ + suffixInflection('ㄱㅓㄴ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄱㅓㄴ', '', [], ['p', 'f', 'euob', 'eusi']) + ] + }, + { + name: '-건대', + rules: [ + suffixInflection('ㄱㅓㄴㄷㅐ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄱㅓㄴㄷㅐ', '', [], ['p', 'eusi', 'jaob']) + ] + }, + { + name: '-건마는', + rules: [ + suffixInflection('ㄱㅓㄴㅁㅏㄴㅡㄴ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄱㅓㄴㅁㅏㄴㅡㄴ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-건만', + rules: [ + suffixInflection('ㄱㅓㄴㅁㅏㄴ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄱㅓㄴㅁㅏㄴ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-걸랑', + rules: [ + suffixInflection('ㄱㅓㄹㄹㅏㅇ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄱㅓㄹㄹㅏㅇ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-것다', + rules: [ + suffixInflection('ㄱㅓㅅㄷㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄱㅓㅅㄷㅏ', '', [], ['p', 'eusi']) + ] + }, + { + name: '-것마는', + rules: [ + suffixInflection('ㄱㅓㅅㅁㅏㄴㅡㄴ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄱㅓㅅㅁㅏㄴㅡㄴ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-게', + rules: [ + suffixInflection('ㄱㅔ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄱㅔ', '', [], ['p', 'eusi']) + ] + }, + { + name: '-게끔', + rules: [ + suffixInflection('ㄱㅔㄲㅡㅁ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄱㅔㄲㅡㅁ', '', [], ['eusi']) + ] + }, + { + name: '-게나', + rules: [ + suffixInflection('ㄱㅔㄴㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄱㅔㄴㅏ', '', [], ['eusi']) + ] + }, + { + name: '-게시리', + rules: [ + suffixInflection('ㄱㅔㅅㅣㄹㅣ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄱㅔㅅㅣㄹㅣ', '', [], ['eusi']) + ] + }, + { + name: '-겠', + rules: [ + suffixInflection('ㄱㅔㅆ', 'ㄷㅏ', ['f'], ['v', 'adj', 'ida']), + suffixInflection('ㄱㅔㅆ', '', ['f'], ['p', 'eusi']) + ] + }, + { + name: '-고', + rules: [ + suffixInflection('ㄱㅗ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄱㅗ', '', [], ['p', 'f', 'eusi', 'saob', 'euob', 'euo', 'sab', 'jaob', 'jab']) + ] + }, + { + name: '-고는 하다', + rules: [ + suffixInflection('ㄱㅗㄴㅡㄴ ㅎㅏㄷㅏ', 'ㄷㅏ', ['v'], ['v']), + suffixInflection('ㄱㅗㄴㅡㄴ ㅎㅏㄷㅏ', '', ['v'], ['eusi']) + ] + }, + { + name: '-곤 하다', + rules: [ + suffixInflection('ㄱㅗㄴ ㅎㅏㄷㅏ', 'ㄷㅏ', ['v'], ['v']), + suffixInflection('ㄱㅗㄴ ㅎㅏㄷㅏ', '', ['v'], ['eusi']) + ] + }, + { + name: '-고는', + rules: [ + suffixInflection('ㄱㅗㄴㅡㄴ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄱㅗㄴㅡㄴ', '', [], ['eusi']) + ] + }, + { + name: '-곤', + rules: [ + suffixInflection('ㄱㅗㄴ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄱㅗㄴ', '', [], ['eusi']) + ] + }, + { + name: '-고도', + rules: [ + suffixInflection('ㄱㅗㄷㅗ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄱㅗㄷㅗ', '', [], ['eusi']) + ] + }, + { + name: '-고말고', + rules: [ + suffixInflection('ㄱㅗㅁㅏㄹㄱㅗ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄱㅗㅁㅏㄹㄱㅗ', '', [], ['p', 'eusi']) + ] + }, + { + name: '-고서', + rules: [ + suffixInflection('ㄱㅗㅅㅓ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄱㅗㅅㅓ', '', [], ['eusi']), + suffixInflection('ㅇㅏㄴㅣㄱㅗㅅㅓ', 'ㅇㅏㄴㅣㄷㅏ', [], ['adj']) + ] + }, + { + name: '-고야', + rules: [ + suffixInflection('ㄱㅗㅇㅑ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄱㅗㅇㅑ', '', [], ['eusi']) + ] + }, + { + name: '-고자', + rules: [ + suffixInflection('ㄱㅗㅈㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄱㅗㅈㅏ', '', [], ['eusi']), + suffixInflection('ㅇㅣㅆㄱㅗㅈㅏ', '있다', [], []), + suffixInflection('ㅇㅓㅂㅅㄱㅗㅈㅏ', '없다', [], []) + ] + }, + { + name: '-고저', + rules: [ + suffixInflection('ㄱㅗㅈㅓ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄱㅗㅈㅓ', '', [], ['eusi']), + suffixInflection('ㅇㅣㅆㄱㅗㅈㅓ', '있다', [], []), + suffixInflection('ㅇㅓㅂㅅㄱㅗㅈㅓ', '없다', [], []) + ] + }, + { + name: '-관데', + rules: [ + suffixInflection('ㄱㅗㅏㄴㄷㅔ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄱㅗㅏㄴㄷㅔ', '', [], ['p', 'eusi']) + ] + }, + { + name: '-구나', + rules: [ + suffixInflection('ㄱㅜㄴㅏ', 'ㄷㅏ', [], ['adj', 'ida']), + suffixInflection('ㄱㅜㄴㅏ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-구려', + rules: [ + suffixInflection('ㄱㅜㄹㅕ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄱㅜㄹㅕ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-구료', + rules: [ + suffixInflection('ㄱㅜㄹㅛ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄱㅜㄹㅛ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-구만', + rules: [ + suffixInflection('ㄱㅜㅁㅏㄴ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄱㅜㅁㅏㄴ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-구먼', + rules: [ + suffixInflection('ㄱㅜㅁㅓㄴ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄱㅜㅁㅓㄴ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-구면', + rules: [ + suffixInflection('ㄱㅜㅁㅕㄴ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄱㅜㅁㅕㄴ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-군', + rules: [ + suffixInflection('ㄱㅜㄴ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄱㅜㄴ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-기', + rules: [ + suffixInflection('ㄱㅣ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄱㅣ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-기로', + rules: [ + suffixInflection('ㄱㅣㄹㅗ', 'ㄷㅏ', [], ['v', 'adj', 'ida']) + ] + }, + { + name: '-기로니', + rules: [ + suffixInflection('ㄱㅣㄹㅗㄴㅣ', 'ㄷㅏ', [], ['v', 'adj', 'ida']) + ] + }, + { + name: '-기로서', + rules: [ + suffixInflection('ㄱㅣㄹㅗㅅㅓ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄱㅣㄹㅗㅅㅓ', '', [], ['p']) + ] + }, + { + name: '-기로서니', + rules: [ + suffixInflection('ㄱㅣㄹㅗㅅㅓㄴㅣ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄱㅣㄹㅗㅅㅓㄴㅣ', '', [], ['p']) + ] + }, + { + name: '-기로선들', + rules: [ + suffixInflection('ㄱㅣㄹㅗㅅㅓㄴㄷㅡㄹ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄱㅣㄹㅗㅅㅓㄴㄷㅡㄹ', '', [], ['p']) + ] + }, + { + name: '-기에', + rules: [ + suffixInflection('ㄱㅣㅇㅔ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄱㅣㅇㅔ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-길래', + rules: [ + suffixInflection('ㄱㅣㄹㄹㅐ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄱㅣㄹㄹㅐ', '', [], ['p', 'eusi']) + ] + }, + { + name: '-(으)ㄹ', + rules: [ + suffixInflection('ㄹ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹ', '', [], ['p']) + ] + }, + { + name: '-(으)ㄹ거나', + rules: [ + suffixInflection('ㄹㄱㅓㄴㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄱㅓㄴㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㄱㅓㄴㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㄱㅓㄴㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㄱㅓㄴㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄱㅓㄴㅏ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㄱㅓㄴㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄱㅓㄴㅏ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㄱㅓㄴㅏ', '', [], ['p', 'f']) + ] + }, + { + name: '-(으)ㄹ걸', + rules: [ + suffixInflection('ㄹㄱㅓㄹ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㄱㅓㄹ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㄱㅓㄹ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㄱㅓㄹ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㄱㅓㄹ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄱㅓㄹ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㄱㅓㄹ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄱㅓㄹ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㄱㅓㄹ', '', [], ['p']) + ] + }, + { + name: '-(으)ㄹ게', + rules: [ + suffixInflection('ㄹㄱㅔ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄹㄱㅔ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㄱㅔ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㄹㄱㅔ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㄱㅔ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㄹㄱㅔ', 'ㄷㄷㅏ', [], ['v']) + ] + }, + { + name: '-(으)ㄹ 거야', + rules: [ + suffixInflection('ㄹ ㄱㅓㅇㅑ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹ ㄱㅓㅇㅑ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹ ㄱㅓㅇㅑ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹ ㄱㅓㅇㅑ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹ ㄱㅓㅇㅑ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹ ㄱㅓㅇㅑ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹ ㄱㅓㅇㅑ', 'ㄷㄷㅏ', [], ['v', 'adj']) + ] + }, + { + name: '-(으)ㄹ 거예요', + rules: [ + suffixInflection('ㄹ ㄱㅓㅇㅖㅇㅛ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹ ㄱㅓㅇㅖㅇㅛ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹ ㄱㅓㅇㅖㅇㅛ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹ ㄱㅓㅇㅖㅇㅛ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹ ㄱㅓㅇㅖㅇㅛ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹ ㄱㅓㅇㅖㅇㅛ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹ ㄱㅓㅇㅖㅇㅛ', 'ㄷㄷㅏ', [], ['v', 'adj']) + ] + }, + { + name: '-(으)ㄹ 것이다', + rules: [ + suffixInflection('ㄹ ㄱㅓㅅㅇㅣㄷㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹ ㄱㅓㅅㅇㅣㄷㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹ ㄱㅓㅅㅇㅣㄷㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹ ㄱㅓㅅㅇㅣㄷㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹ ㄱㅓㅅㅇㅣㄷㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹ ㄱㅓㅅㅇㅣㄷㅏ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹ ㄱㅓㅅㅇㅣㄷㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']) + ] + }, + { + name: '-(으)ㄹ 것입니다', + rules: [ + suffixInflection('ㄹ ㄱㅓㅅㅇㅣㅂㄴㅣㄷㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹ ㄱㅓㅅㅇㅣㅂㄴㅣㄷㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹ ㄱㅓㅅㅇㅣㅂㄴㅣㄷㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹ ㄱㅓㅅㅇㅣㅂㄴㅣㄷㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹ ㄱㅓㅅㅇㅣㅂㄴㅣㄷㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹ ㄱㅓㅅㅇㅣㅂㄴㅣㄷㅏ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹ ㄱㅓㅅㅇㅣㅂㄴㅣㄷㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']) + ] + }, + { + name: '-(으)ㄹ 거다', + rules: [ + suffixInflection('ㄹ ㄱㅓㄷㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹ ㄱㅓㄷㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹ ㄱㅓㄷㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹ ㄱㅓㄷㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹ ㄱㅓㄷㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹ ㄱㅓㄷㅏ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹ ㄱㅓㄷㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']) + ] + }, + { + name: '-(으)ㄹ 겁니다', + rules: [ + suffixInflection('ㄹ ㄱㅓㅂㄴㅣㄷㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹ ㄱㅓㅂㄴㅣㄷㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹ ㄱㅓㅂㄴㅣㄷㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹ ㄱㅓㅂㄴㅣㄷㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹ ㄱㅓㅂㄴㅣㄷㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹ ㄱㅓㅂㄴㅣㄷㅏ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹ ㄱㅓㅂㄴㅣㄷㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']) + ] + }, + { + name: '-(으)ㄹ께', + rules: [ + suffixInflection('ㄹㄲㅔ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄲㅔ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㄲㅔ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㄲㅔ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㄲㅔ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄲㅔ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㄲㅔ', 'ㄷㄷㅏ', [], ['v', 'adj']) + ] + }, + { + name: '-(으)나', + rules: [ + suffixInflection('ㄴㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄴㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄴㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄴㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄴㅏ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄴㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅇㅡㄴㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄴㅏ', '', [], ['p', 'f']), + suffixInflection('ㄴㅏ', '', [], ['p', 'f', 'eusi', 'sao']) + ] + }, + { + name: '-나니', + rules: [ + suffixInflection('ㄴㅏㄴㅣ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㅏㄴㅣ', '', [], ['p', 'f', 'eusi', 'sab', 'euob']) + ] + }, + { + name: '-(으)나마', + rules: [ + suffixInflection('ㄴㅏㅁㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅇㅡㄴㅏㅁㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄴㅏㅁㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄴㅏㅁㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄴㅏㅁㅏ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄴㅏㅁㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅇㅡㄴㅏㅁㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄴㅏㅁㅏ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄴㅏㅁㅏ', '', [], ['p', 'f']) + ] + }, + { + name: '-나이까', + rules: [ + suffixInflection('ㄴㅏㅇㅣㄲㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄴㅏㅇㅣㄲㅏ', '', [], ['p', 'f', 'eusi', 'saob', 'euob']) + ] + }, + { + name: '-나이다', + rules: [ + suffixInflection('ㄴㅏㅇㅣㄷㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄴㅏㅇㅣㄷㅏ', '', [], ['p', 'f', 'eusi', 'saob', 'jaob', 'jab', 'euob']) + ] + }, + { + name: '-남', + rules: [ + suffixInflection('ㄴㅏㅁ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㅏㅁ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-(으)냐', + rules: [ + suffixInflection('ㄴㅑ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅇㅡㄴㅑ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄴㅑ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄴㅑ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄴㅑ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄴㅑ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅇㅡㄴㅑ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄴㅑ', '', [], ['p', 'f', 'eusi']), + suffixInflection('ㅇㅡㄴㅑ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-(으)냐고', + rules: [ + suffixInflection('ㄴㅑㄱㅗ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅇㅡㄴㅑㄱㅗ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄴㅑㄱㅗ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄴㅑㄱㅗ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄴㅑㄱㅗ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄴㅑㄱㅗ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅇㅡㄴㅑㄱㅗ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄴㅑㄱㅗ', '', [], ['p', 'f', 'eusi']), + suffixInflection('ㅇㅡㄴㅑㄱㅗ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-너라', + rules: [ + suffixInflection('ㄴㅓㄹㅏ', 'ㄷㅏ', [], ['v']) + ] + }, + { + name: '-네', + rules: [ + suffixInflection('ㄴㅔ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄴㅔ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄴㅔ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-노니', + rules: [ + suffixInflection('ㄴㅗㄴㅣ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㅗㄴㅣ', '', [], ['p', 'f', 'eusi', 'sab', 'euob']) + ] + }, + { + name: '-노라', + rules: [ + suffixInflection('ㄴㅗㄹㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㅗㄹㅏ', '', [], ['p', 'f']) + ] + }, + { + name: '-노라고', + rules: [ + suffixInflection('ㄴㅗㄹㅏㄱㅗ', 'ㄷㅏ', [], ['v']) + ] + }, + { + name: '-노라니', + rules: [ + suffixInflection('ㄴㅗㄹㅏㄴㅣ', 'ㄷㅏ', [], ['v', 'adj']) + ] + }, + { + name: '-노라니까', + rules: [ + suffixInflection('ㄴㅗㄹㅏㄴㅣㄲㅏ', 'ㄷㅏ', [], ['v', 'adj']) + ] + }, + { + name: '-노라면', + rules: [ + suffixInflection('ㄴㅗㄹㅏㅁㅕㄴ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㅗㄹㅏㅁㅕㄴ', '', [], ['eusi']), + suffixInflection('ㅇㅣㅆㄴㅗㄹㅏㅁㅕㄴ', '있다', [], []), + suffixInflection('ㅇㅓㅂㅅㄴㅗㄹㅏㅁㅕㄴ', '없다', [], []) + ] + }, + { + name: '-(으)뇨', + rules: [ + suffixInflection('ㄴㅛ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅇㅡㄴㅛ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄴㅛ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄴㅛ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄴㅛ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄴㅛ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅇㅡㄴㅛ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄴㅛ', '', [], ['eusi']) + ] + }, + { + name: '-누', + rules: [ + suffixInflection('ㄴㅜ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄴㅜ', '', [], ['p', 'f']) + ] + }, + { + name: '-누나', + rules: [ + suffixInflection('ㄴㅜㄴㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㅜㄴㅏ', '', [], ['eusi']) + ] + }, + { + name: '-누만', + rules: [ + suffixInflection('ㄴㅜㅁㅏㄴ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㅜㅁㅏㄴ', '', [], ['eusi']) + ] + }, + { + name: '-누먼', + rules: [ + suffixInflection('ㄴㅜㅁㅓㄴ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㅜㅁㅓㄴ', '', [], ['eusi']) + ] + }, + { + name: '-느냐', + rules: [ + suffixInflection('ㄴㅡㄴㅑ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄴㅡㄴㅑ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-느냐고', + rules: [ + suffixInflection('ㄴㅡㄴㅑㄱㅗ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄴㅡㄴㅑㄱㅗ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-느뇨', + rules: [ + suffixInflection('ㄴㅡㄴㅛ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄴㅡㄴㅛ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-느니', + rules: [ + suffixInflection('ㄴㅡㄴㅣ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄴㅡㄴㅣ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-느니만', + rules: [ + suffixInflection('ㄴㅡㄴㅣㅁㅏㄴ ㅁㅗㅅㅎㅏㄷㅏ', 'ㄷㅏ', ['v'], ['v', 'adj']) + ] + }, + { + name: '-느라', + rules: [ + suffixInflection('ㄴㅡㄹㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㅡㄹㅏ', '', [], ['eusi']) + ] + }, + { + name: '-느라고', + rules: [ + suffixInflection('ㄴㅡㄹㅏㄱㅗ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㅡㄹㅏㄱㅗ', '', [], ['eusi']) + ] + }, + { + name: '-는', + rules: [ + suffixInflection('ㄴㅡㄴ', 'ㄷㅏ', [], ['v', 'ida']), + suffixInflection('ㄴㅡㄴ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㄴㅡㄴ', '', [], ['eusi', 'f']), + suffixInflection('ㅇㅓㅂㅅㄴㅡㄴ', '없다', [], ['adj']) + ] + }, + { + name: '-(으)ㄴ', + rules: [ + suffixInflection('ㄴ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄴ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄴ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄴ', '', [], ['eusi', 'f']) + ] + }, + { + name: '-(으/느)ㄴ가', + rules: [ + suffixInflection('ㄴㄱㅏ', 'ㄷㅏ', [], ['adj', 'ida']), + suffixInflection('ㄴㄱㅏ', 'ㄹㄷㅏ', [], ['adj']), + suffixInflection('ㄴㅡㄴㄱㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄴㄱㅏ', 'ㄷㅏ', [], ['adj']), + suffixInflection('ㅇㅡㄴㄱㅏ', 'ㄹㄷㅏ', [], ['adj']), + suffixInflection('ㄴㄱㅏ', '', [], ['eusi']), + suffixInflection('ㄴㅡㄴㄱㅏ', '', [], ['p', 'f', 'eusi']), + suffixInflection('ㅇㅓㅂㅅㄴㅡㄴㄱㅏ', '없다', [], []) + ] + }, + { + name: '-(으/느)ㄴ감', + rules: [ + suffixInflection('ㄴㄱㅏㅁ', 'ㄷㅏ', [], ['adj', 'ida']), + suffixInflection('ㄴㄱㅏㅁ', 'ㄹㄷㅏ', [], ['adj']), + suffixInflection('ㄴㅡㄴㄱㅏㅁ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄴㄱㅏㅁ', 'ㄷㅏ', [], ['adj']), + suffixInflection('ㅇㅡㄴㄱㅏㅁ', 'ㄹㄷㅏ', [], ['adj']), + suffixInflection('ㄴㄱㅏㅁ', '', [], ['eusi']), + suffixInflection('ㄴㅡㄴㄱㅏㅁ', '', [], ['p', 'f', 'eusi']), + suffixInflection('ㅇㅓㅂㅅㄴㅡㄴㄱㅏㅁ', '없다', [], []) + ] + }, + { + name: '-(으/느)ㄴ걸', + rules: [ + suffixInflection('ㄴㄱㅓㄹ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄴㄱㅓㄹ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄴㅡㄴㄱㅓㄹ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄴㄱㅓㄹ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄴㄱㅓㄹ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄴㄱㅓㄹ', '', [], ['eusi']), + suffixInflection('ㄴㅡㄴㄱㅓㄹ', '', [], ['p', 'f', 'eusi']), + suffixInflection('ㅇㅓㅂㅅㄴㅡㄴㄱㅓㄹ', '없다', [], []) + ] + }, + { + name: '-(으/느)ㄴ고', + rules: [ + suffixInflection('ㄴㄱㅗ', 'ㄷㅏ', [], ['adj', 'ida']), + suffixInflection('ㄴㄱㅗ', 'ㄹㄷㅏ', [], ['adj']), + suffixInflection('ㄴㅡㄴㄱㅗ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄴㄱㅗ', 'ㄷㅏ', [], ['adj']), + suffixInflection('ㅇㅡㄴㄱㅗ', 'ㄹㄷㅏ', [], ['adj']), + suffixInflection('ㄴㄱㅗ', '', [], ['eusi']), + suffixInflection('ㄴㅡㄴㄱㅗ', '', [], ['p', 'f', 'eusi']), + suffixInflection('ㅇㅓㅂㅅㄴㅡㄴㄱㅗ', '없다', [], []) + ] + }, + { + name: '-는구나', + rules: [ + suffixInflection('ㄴㅡㄴㄱㅜㄴㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㅡㄴㄱㅜㄴㅏ', '', [], ['eusi']) + ] + }, + { + name: '-는구려', + rules: [ + suffixInflection('ㄴㅡㄴㄱㅜㄹㅕ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㅡㄴㄱㅜㄹㅕ', '', [], ['eusi']) + ] + }, + { + name: '-는구료', + rules: [ + suffixInflection('ㄴㅡㄴㄱㅜㄹㅛ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㅡㄴㄱㅜㄹㅛ', '', [], ['eusi']) + ] + }, + { + name: '-는구만', + rules: [ + suffixInflection('ㄴㅡㄴㄱㅜㅁㅏㄴ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㅡㄴㄱㅜㅁㅏㄴ', '', [], ['eusi']) + ] + }, + { + name: '-는구먼', + rules: [ + suffixInflection('ㄴㅡㄴㄱㅜㅁㅓㄴ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㅡㄴㄱㅜㅁㅓㄴ', '', [], ['eusi']) + ] + }, + { + name: '-는구면', + rules: [ + suffixInflection('ㄴㅡㄴㄱㅜㅁㅕㄴ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㅡㄴㄱㅜㅁㅕㄴ', '', [], ['eusi']) + ] + }, + { + name: '-는군', + rules: [ + suffixInflection('ㄴㅡㄴㄱㅜㄴ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㅡㄴㄱㅜㄴ', '', [], ['eusi']) + ] + }, + { + name: '-는궈니', + rules: [ + suffixInflection('ㄴㅡㄴㄱㅜㅓㄴㅣ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㅡㄴㄱㅜㅓㄴㅣ', '', [], ['p', 'f', 'eusi']), + suffixInflection('ㅇㅣㅆㄴㅡㄴㄱㅜㅓㄴㅣ', '있다', [], []), + suffixInflection('ㅇㅓㅂㅅㄴㅡㄴㄱㅜㅓㄴㅣ', '없다', [], []) + ] + }, + { + name: '-는과니', + rules: [ + suffixInflection('ㄴㅡㄴㄱㅗㅏㄴㅣ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㅡㄴㄱㅗㅏㄴㅣ', '', [], ['p', 'f', 'eusi']), + suffixInflection('ㅇㅣㅆㄴㅡㄴㄱㅗㅏㄴㅣ', '있다', [], []), + suffixInflection('ㅇㅓㅂㅅㄴㅡㄴㄱㅗㅏㄴㅣ', '없다', [], []) + ] + }, + { + name: '-(느)ㄴ다', + rules: [ + suffixInflection('ㄴㄷㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㅡㄴㄷㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㄷㅏ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㄴㄷㅏ', '', [], ['eusi']) + ] + }, + { + name: '-((느)ㄴ)다고', + rules: [ + suffixInflection('ㄴㄷㅏㄱㅗ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㅡㄴㄷㅏㄱㅗ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㄷㅏㄱㅗ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㄴㄷㅏㄱㅗ', '', [], ['eusi']), + suffixInflection('ㄷㅏㄱㅗ', 'ㄷㅏ', [], ['adj']), + suffixInflection('ㄷㅏㄱㅗ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-((느)ㄴ)다나', + rules: [ + suffixInflection('ㄴㄷㅏㄴㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㅡㄴㄷㅏㄴㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㄷㅏㄴㅏ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㄴㄷㅏㄴㅏ', '', [], ['eusi']), + suffixInflection('ㄷㅏㄴㅏ', 'ㄷㅏ', [], ['adj']), + suffixInflection('ㄷㅏㄴㅏ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-((느)ㄴ)다네', + rules: [ + suffixInflection('ㄴㄷㅏㄴㅔ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㅡㄴㄷㅏㄴㅔ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㄷㅏㄴㅔ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㄴㄷㅏㄴㅔ', '', [], ['eusi']), + suffixInflection('ㄷㅏㄴㅔ', 'ㄷㅏ', [], ['adj']), + suffixInflection('ㄷㅏㄴㅔ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-((느)ㄴ)다느니', + rules: [ + suffixInflection('ㄴㄷㅏㄴㅡㄴㅣ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㅡㄴㄷㅏㄴㅡㄴㅣ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㄷㅏㄴㅡㄴㅣ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㄴㄷㅏㄴㅡㄴㅣ', '', [], ['eusi']), + suffixInflection('ㄷㅏㄴㅡㄴㅣ', 'ㄷㅏ', [], ['adj']), + suffixInflection('ㄷㅏㄴㅡㄴㅣ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-((느)ㄴ)다니', + rules: [ + suffixInflection('ㄴㄷㅏㄴㅣ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㅡㄴㄷㅏㄴㅣ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㄷㅏㄴㅣ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㄴㄷㅏㄴㅣ', '', [], ['eusi']), + suffixInflection('ㄷㅏㄴㅣ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄷㅏㄴㅣ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-((느)ㄴ)다니까', + rules: [ + suffixInflection('ㄴㄷㅏㄴㅣㄲㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㅡㄴㄷㅏㄴㅣㄲㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㄷㅏㄴㅣㄲㅏ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㄴㄷㅏㄴㅣㄲㅏ', '', [], ['eusi']), + suffixInflection('ㄷㅏㄴㅣㄲㅏ', 'ㄷㅏ', [], ['adj']), + suffixInflection('ㄷㅏㄴㅣㄲㅏ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-((느)ㄴ)다더라', + rules: [ + suffixInflection('ㄴㄷㅏㄷㅓㄹㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㅡㄴㄷㅏㄷㅓㄹㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㄷㅏㄷㅓㄹㅏ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㄴㄷㅏㄷㅓㄹㅏ', '', [], ['eusi']), + suffixInflection('ㄷㅏㄷㅓㄹㅏ', 'ㄷㅏ', [], ['adj']), + suffixInflection('ㄷㅏㄷㅓㄹㅏ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-((느)ㄴ)다마는', + rules: [ + suffixInflection('ㄴㄷㅏㅁㅏㄴㅡㄴ', 'ㄷㅏ', [], ['v', 'ida']), + suffixInflection('ㄴㅡㄴㄷㅏㅁㅏㄴㅡㄴ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㄷㅏㅁㅏㄴㅡㄴ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㄴㄷㅏㅁㅏㄴㅡㄴ', '', [], ['eusi']), + suffixInflection('ㄷㅏㅁㅏㄴㅡㄴ', 'ㄷㅏ', [], ['adj']), + suffixInflection('ㄷㅏㅁㅏㄴㅡㄴ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-((느)ㄴ)다만', + rules: [ + suffixInflection('ㄴㄷㅏㅁㅏㄴ', 'ㄷㅏ', [], ['v', 'ida']), + suffixInflection('ㄴㅡㄴㄷㅏㅁㅏㄴ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㄷㅏㅁㅏㄴ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㄴㄷㅏㅁㅏㄴ', '', [], ['eusi']), + suffixInflection('ㄷㅏㅁㅏㄴ', 'ㄷㅏ', [], ['adj']), + suffixInflection('ㄷㅏㅁㅏㄴ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-((느)ㄴ)다며', + rules: [ + suffixInflection('ㄴㄷㅏㅁㅕ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㅡㄴㄷㅏㅁㅕ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㄷㅏㅁㅕ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㄴㄷㅏㅁㅕ', '', [], ['eusi']), + suffixInflection('ㄷㅏㅁㅕ', 'ㄷㅏ', [], ['adj']), + suffixInflection('ㄷㅏㅁㅕ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-((느)ㄴ)다면', + rules: [ + suffixInflection('ㄴㄷㅏㅁㅕㄴ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㅡㄴㄷㅏㅁㅕㄴ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㄷㅏㅁㅕㄴ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㄴㄷㅏㅁㅕㄴ', '', [], ['eusi']), + suffixInflection('ㄷㅏㅁㅕㄴ', 'ㄷㅏ', [], ['adj']), + suffixInflection('ㄷㅏㅁㅕㄴ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-((느)ㄴ)다면서', + rules: [ + suffixInflection('ㄴㄷㅏㅁㅕㄴㅅㅓ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㅡㄴㄷㅏㅁㅕㄴㅅㅓ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㄷㅏㅁㅕㄴㅅㅓ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㄴㄷㅏㅁㅕㄴㅅㅓ', '', [], ['eusi']), + suffixInflection('ㄷㅏㅁㅕㄴㅅㅓ', 'ㄷㅏ', [], ['adj']), + suffixInflection('ㄷㅏㅁㅕㄴㅅㅓ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-((느)ㄴ)다손', + rules: [ + suffixInflection('ㄴㄷㅏㅅㅗㄴ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㅡㄴㄷㅏㅅㅗㄴ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㄷㅏㅅㅗㄴ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㄴㄷㅏㅅㅗㄴ', '', [], ['eusi']), + suffixInflection('ㄷㅏㅁㅕㄴㅅㅗㄴ', 'ㄷㅏ', [], ['adj']), + suffixInflection('ㄷㅏㅁㅕㄴㅅㅗㄴ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-((느)ㄴ)다오', + rules: [ + suffixInflection('ㄴㄷㅏㅇㅗ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㅡㄴㄷㅏㅇㅗ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㄷㅏㅇㅗ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㄴㄷㅏㅇㅗ', '', [], ['eusi']), + suffixInflection('ㄷㅏㅇㅗ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄷㅏㅇㅗ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-((느)ㄴ)다지', + rules: [ + suffixInflection('ㄴㄷㅏㅈㅣ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㅡㄴㄷㅏㅈㅣ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㄷㅏㅈㅣ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㄴㄷㅏㅈㅣ', '', [], ['eusi']), + suffixInflection('ㄷㅏㅈㅣ', 'ㄷㅏ', [], ['adj']), + suffixInflection('ㄷㅏㅈㅣ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-((느)ㄴ)단다', + rules: [ + suffixInflection('ㄴㄷㅏㄴㄷㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㅡㄴㄷㅏㄴㄷㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㄷㅏㄴㄷㅏ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㄴㄷㅏㄴㄷㅏ', '', [], ['eusi']), + suffixInflection('ㄷㅏㄴㄷㅏ', 'ㄷㅏ', [], ['adj']), + suffixInflection('ㄷㅏㄴㄷㅏ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-((느)ㄴ)담', + rules: [ + suffixInflection('ㄴㄷㅏㅁ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㅡㄴㄷㅏㅁ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㄷㅏㅁ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㄴㄷㅏㅁ', '', [], ['eusi']), + suffixInflection('ㄷㅏㅁ', 'ㄷㅏ', [], ['adj']), + suffixInflection('ㄷㅏㅁ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-((느)ㄴ)답니까', + rules: [ + suffixInflection('ㄴㄷㅏㅂㄴㅣㄲㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㅡㄴㄷㅏㅂㄴㅣㄲㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㄷㅏㅂㄴㅣㄲㅏ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㄴㄷㅏㅂㄴㅣㄲㅏ', '', [], ['eusi']), + suffixInflection('ㄷㅏㅂㄴㅣㄲㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄷㅏㅂㄴㅣㄲㅏ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-((느)ㄴ)답니다', + rules: [ + suffixInflection('ㄴㄷㅏㅂㄴㅣㄷㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㅡㄴㄷㅏㅂㄴㅣㄷㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㄷㅏㅂㄴㅣㄷㅏ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㄴㄷㅏㅂㄴㅣㄷㅏ', '', [], ['eusi']), + suffixInflection('ㄷㅏㅂㄴㅣㄷㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄷㅏㅂㄴㅣㄷㅏ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-((느)ㄴ)답시고', + rules: [ + suffixInflection('ㄴㄷㅏㅂㅅㅣㄱㅗ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㅡㄴㄷㅏㅂㅅㅣㄱㅗ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㄷㅏㅂㅅㅣㄱㅗ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㄴㅡㄴㄷㅏㅂㅅㅣㄱㅗ', '', [], ['eusi']), + suffixInflection('ㄷㅏㅂㅅㅣㄱㅗ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄷㅏㅂㅅㅣㄱㅗ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-((느)ㄴ)대', + rules: [ + suffixInflection('ㄴㄷㅐ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㅡㄴㄷㅐ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㄷㅐ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㄴㄷㅐ', '', [], ['eusi']), + suffixInflection('ㄷㅐ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄷㅐ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-((느)ㄴ)대요', + rules: [ + suffixInflection('ㄴㄷㅐㅇㅛ', 'ㄷㅏ', [], ['v', 'ida']), + suffixInflection('ㄴㅡㄴㄷㅐㅇㅛ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㄷㅐㅇㅛ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㄴㄷㅐㅇㅛ', '', [], ['eusi']), + suffixInflection('ㄷㅐㅇㅛ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄷㅐㅇㅛ', '', [], ['p', 'f', 'eusi']), + suffixInflection('ㅇㅣㅆㄴㅡㄴㄷㅐㅇㅛ', '있다', [], []), + suffixInflection('ㅇㅓㅂㅅㄴㅡㄴㄷㅐㅇㅛ', '없다', [], []) + ] + }, + { + name: '-((느)ㄴ)댄다', + rules: [ + suffixInflection('ㄴㄷㅐㄴㄷㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㅡㄴㄷㅐㄴㄷㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄴㄷㅐㄴㄷㅏ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㄴㄷㅐㄴㄷㅏ', '', [], ['eusi']), + suffixInflection('ㄷㅐㄴㄷㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄷㅐㄴㄷㅏ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-(으/느)ㄴ데', + rules: [ + suffixInflection('ㄴㄷㅔ', 'ㄷㅏ', [], ['adj', 'ida']), + suffixInflection('ㄴㄷㅔ', 'ㄹㄷㅏ', [], ['adj']), + suffixInflection('ㄴㅡㄴㄷㅔ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄴㄷㅔ', 'ㄷㅏ', [], ['adj']), + suffixInflection('ㄴㄷㅔ', '', [], ['eusi', 'sao']), + suffixInflection('ㄴㅡㄴㄷㅔ', '', [], ['p', 'f', 'eusi']), + suffixInflection('ㅇㅣㅆㄴㅡㄴㄷㅔ', '있다', [], []), + suffixInflection('ㅇㅓㅂㅅㄴㅡㄴㄷㅔ', '없다', [], []) + ] + }, + { + name: '-(으/느)ㄴ뎁쇼', + rules: [ + suffixInflection('ㄴㄷㅔㅂㅅㅛ', 'ㄷㅏ', [], ['adj', 'ida']), + suffixInflection('ㄴㄷㅔㅂㅅㅛ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㄴㅡㄴㄷㅔㅂㅅㅛ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄴㄷㅔㅂㅅㅛ', 'ㄷㅏ', [], ['adj']), + suffixInflection('ㄴㄷㅔㅂㅅㅛ', '', [], ['eusi']), + suffixInflection('ㄴㅡㄴㄷㅔㅂㅅㅛ', '', [], ['p', 'f', 'eusi']), + suffixInflection('ㅇㅣㅆㄴㅡㄴㄷㅔㅂㅅㅛ', '', [], []), + suffixInflection('ㅇㅓㅂㅅㄴㅡㄴㄷㅔㅂㅅㅛ', '', [], []) + ] + }, + { + name: '-는도다', + rules: [ + suffixInflection('ㄴㅡㄴㄷㅗㄷㅏ', 'ㄷㅏ', [], ['v']) + ] + }, + { + name: '-(으/느)ㄴ바', + rules: [ + suffixInflection('ㄴㅂㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄴㅂㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄴㅡㄴㅂㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄴㅂㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄴㅂㅏ', '', [], ['eusi']), + suffixInflection('ㄴㅡㄴㅂㅏ', '', [], ['p', 'f', 'eusi']), + suffixInflection('ㅇㅡㄴㅂㅏ', '', [], ['eusi']), + suffixInflection('ㅇㅣㅆㄴㅡㄴㅂㅏ', '있다', [], []), + suffixInflection('ㅇㅓㅂㅅㄴㅡㄴㅂㅏ', '없다', [], []) + ] + }, + { + name: '-(으/느)ㄴ지', + rules: [ + suffixInflection('ㄴㅈㅣ', 'ㄷㅏ', [], ['adj', 'ida']), + suffixInflection('ㄴㅈㅣ', 'ㄹㄷㅏ', [], ['adj']), + suffixInflection('ㄴㅡㄴㅈㅣ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄴㅈㅣ', 'ㄷㅏ', [], ['adj']), + suffixInflection('ㄴㅈㅣ', '', [], ['eusi']), + suffixInflection('ㄴㅡㄴㅈㅣ', '', [], ['p', 'f', 'eusi']), + suffixInflection('ㅇㅣㅆㄴㅡㄴㅈㅣ', '있다', [], []), + suffixInflection('ㅇㅓㅂㅅㄴㅡㄴㅈㅣ', '없다', [], []) + ] + }, + { + name: '-(으/느)ㄴ지고', + rules: [ + suffixInflection('ㄴㅈㅣㄱㅗ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄴㅈㅣㄱㅗ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄴㅡㄴㅈㅣㄱㅗ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄴㅈㅣㄱㅗ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄴㅈㅣㄱㅗ', '', [], ['eusi']), + suffixInflection('ㄴㅡㄴㅈㅣㄱㅗ', '', [], ['p', 'f', 'eusi']), + suffixInflection('ㅇㅣㅆㄴㅡㄴㅈㅣㄱㅗ', '있다', [], []), + suffixInflection('ㅇㅓㅂㅅㄴㅡㄴㅈㅣㄱㅗ', '없다', [], []) + ] + }, + { + name: '-(으/느)ㄴ지라', + rules: [ + suffixInflection('ㄴㅈㅣㄹㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄴㅈㅣㄹㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄴㅡㄴㅈㅣㄹㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄴㅈㅣㄹㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄴㅈㅣㄹㅏ', '', [], ['eusi']), + suffixInflection('ㄴㅡㄴㅈㅣㄹㅏ', '', [], ['p', 'f', 'eusi']), + suffixInflection('ㅇㅣㅆㄴㅡㄴㅈㅣㄹㅏ', '있다', [], []), + suffixInflection('ㅇㅓㅂㅅㄴㅡㄴㅈㅣㄹㅏ', '없다', [], []) + ] + }, + { + name: '-(으)니', + rules: [ + suffixInflection('ㄴㅣ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅇㅡㄴㅣ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄴㅣ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄴㅣ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄴㅣ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄴㅣ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅇㅡㄴㅣ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄴㅣ', '', [], ['p', 'f', 'eusi', 'euo', 'sao', 'jao']) + ] + }, + { + name: '-(으)니까', + rules: [ + suffixInflection('ㄴㅣㄲㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅇㅡㄴㅣㄲㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄴㅣㄲㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄴㅣㄲㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄴㅣㄲㅏ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄴㅣㄲㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅇㅡㄴㅣㄲㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄴㅣㄲㅏ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄴㅣㄲㅏ', '', [], ['p', 'f']) + ] + }, + { + name: '-(으)니까느루', + rules: [ + suffixInflection('ㄴㅣㄲㅏㄴㅡㄹㅜ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅇㅡㄴㅣㄲㅏㄴㅡㄹㅜ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄴㅣㄲㅏㄴㅡㄹㅜ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄴㅣㄲㅏㄴㅡㄹㅜ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄴㅣㄲㅏㄴㅡㄹㅜ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄴㅣㄲㅏㄴㅡㄹㅜ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅇㅡㄴㅣㄲㅏㄴㅡㄹㅜ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄴㅣㄲㅏㄴㅡㄹㅜ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄴㅣㄲㅏㄴㅡㄹㅜ', '', [], ['p', 'f']) + ] + }, + { + name: '-(으)니까는', + rules: [ + suffixInflection('ㄴㅣㄲㅏㄴㅡㄴ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅇㅡㄴㅣㄲㅏㄴㅡㄴ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄴㅣㄲㅏㄴㅡㄴ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄴㅣㄲㅏㄴㅡㄴ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄴㅣㄲㅏㄴㅡㄴ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄴㅣㄲㅏㄴㅡㄴ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅇㅡㄴㅣㄲㅏㄴㅡㄴ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄴㅣㄲㅏㄴㅡㄴ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄴㅣㄲㅏㄴㅡㄴ', '', [], ['p', 'f']) + ] + }, + { + name: '-(으)니깐', + rules: [ + suffixInflection('ㄴㅣㄲㅏㄴ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅇㅡㄴㅣㄲㅏㄴ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄴㅣㄲㅏㄴ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄴㅣㄲㅏㄴ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄴㅣㄲㅏㄴ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄴㅣㄲㅏㄴ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅇㅡㄴㅣㄲㅏㄴ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄴㅣㄲㅏㄴ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄴㅣㄲㅏㄴ', '', [], ['p', 'f']) + ] + }, + { + name: '-(으/느)니라', + rules: [ + suffixInflection('ㄴㅣㄹㅏ', 'ㄷㅏ', [], ['adj', 'ida']), + suffixInflection('ㄴㅣㄹㅏ', 'ㄹㄷㅏ', [], ['adj']), + suffixInflection('ㄴㅡㄴㅣㄹㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄴㅣㄹㅏ', 'ㄷㅏ', [], ['adj']), + suffixInflection('ㄴㅣㄹㅏ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄴㅣㄹㅏ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-(으/느)니만치', + rules: [ + suffixInflection('ㄴㅣㅁㅏㄴㅊㅣ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄴㅣㅁㅏㄴㅊㅣ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄴㅡㄴㅣㅁㅏㄴㅊㅣ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄴㅣㅁㅏㄴㅊㅣ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄴㅣㅁㅏㄴㅊㅣ', '', [], ['eusi']), + suffixInflection('ㄴㅡㄴㅣㅁㅏㄴㅊㅣ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄴㅣㅁㅏㄴㅊㅣ', '', [], ['p', 'f']) + ] + }, + { + name: '-(으/느)니만큼', + rules: [ + suffixInflection('ㄴㅣㅁㅏㄴㅋㅡㅁ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄴㅣㅁㅏㄴㅋㅡㅁ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄴㅡㄴㅣㅁㅏㄴㅋㅡㅁ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄴㅣㅁㅏㄴㅋㅡㅁ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄴㅣㅁㅏㄴㅋㅡㅁ', '', [], ['eusi']), + suffixInflection('ㄴㅡㄴㅣㅁㅏㄴㅋㅡㅁ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄴㅣㅁㅏㄴㅋㅡㅁ', '', [], ['p', 'f']) + ] + }, + { + name: '-다', + rules: [ + suffixInflection('ㄷㅏ', '', [], ['p', 'f', 'eusi', 'ida']) + ] + }, + { + name: '-다가', + rules: [ + suffixInflection('ㄷㅏㄱㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄷㅏㄱㅏ', '', [], ['p', 'eusi']) + ] + }, + { + name: '-다가는', + rules: [ + suffixInflection('ㄷㅏㄱㅏㄴㅡㄴ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅏㄱㅏㄴㅡㄴ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-다간', + rules: [ + suffixInflection('ㄷㅏㄱㅏㄴ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄷㅏㄱㅏㄴ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-다마다', + rules: [ + suffixInflection('ㄷㅏㅁㅏㄷㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅏㅁㅏㄷㅏ', '', [], ['p', 'eusi']) + ] + }, + { + name: '-다시피', + rules: [ + suffixInflection('ㄷㅏㅅㅣㅍㅣ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄷㅏㅅㅣㅍㅣ', '', [], ['p', 'f']), + suffixInflection('ㅇㅣㅆㄷㅏㅅㅣㅍㅣ', '있다', [], []), + suffixInflection('ㅇㅓㅂㅅㄷㅏㅅㅣㅍㅣ', '없다', [], []) + ] + }, + { + name: '-단', + rules: [ + suffixInflection('ㄷㅏㄴ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅏㄴ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-더', + rules: [ + suffixInflection('ㄷㅓ', 'ㄷㅏ', ['do'], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅓ', '', ['do'], ['p', 'f', 'eusi']) + ] + }, + { + name: '-더구나', + rules: [ + suffixInflection('ㄷㅓㄱㅜㄴㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅓㄱㅜㄴㅏ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-더구려', + rules: [ + suffixInflection('ㄷㅓㄱㅜㄹㅕ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅓㄱㅜㄹㅕ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-더구료', + rules: [ + suffixInflection('ㄷㅓㄱㅜㄹㅛ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅓㄱㅜㄹㅛ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-더구만', + rules: [ + suffixInflection('ㄷㅓㄱㅜㅁㅏㄴ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅓㄱㅜㅁㅏㄴ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-더구먼', + rules: [ + suffixInflection('ㄷㅓㄱㅜㅁㅓㄴ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅓㄱㅜㅁㅓㄴ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-더구면', + rules: [ + suffixInflection('ㄷㅓㄱㅜㅁㅕㄴ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅓㄱㅜㅁㅕㄴ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-더군', + rules: [ + suffixInflection('ㄷㅓㄱㅜㄴ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅓㄱㅜㄴ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-더냐', + rules: [ + suffixInflection('ㄷㅓㄴㅑ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅓㄴㅑ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-더뇨', + rules: [ + suffixInflection('ㄷㅓㄴㅛ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅓㄴㅛ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-더니', + rules: [ + suffixInflection('ㄷㅓㄴㅣ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅓㄴㅣ', '', [], ['p', 'f', 'eusi', 'euob', 'euo', 'sab']) + ] + }, + { + name: '-더니라', + rules: [ + suffixInflection('ㄷㅓㄴㅣㄹㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅓㄴㅣㄹㅏ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-더니마는', + rules: [ + suffixInflection('ㄷㅓㄴㅣㅁㅏㄴㅡㄴ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅓㄴㅣㅁㅏㄴㅡㄴ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-더니만', + rules: [ + suffixInflection('ㄷㅓㄴㅣㅁㅏㄴ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅓㄴㅣㅁㅏㄴ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-더니이까', + rules: [ + suffixInflection('ㄷㅓㄴㅣㅇㅣㄲㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅓㄴㅣㅇㅣㄲㅏ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-더니이다', + rules: [ + suffixInflection('ㄷㅓㄴㅣㅇㅣㄷㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅓㄴㅣㅇㅣㄷㅏ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-더라도', + rules: [ + suffixInflection('ㄷㅓㄹㅏㄷㅗ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅓㄹㅏㄷㅗ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-더이까', + rules: [ + suffixInflection('ㄷㅓㅇㅣㄲㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅓㅇㅣㄲㅏ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-더이다', + rules: [ + suffixInflection('ㄷㅓㅇㅣㄷㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅓㅇㅣㄷㅏ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-던', + rules: [ + suffixInflection('ㄷㅓㄴ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅓㄴ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-던가', + rules: [ + suffixInflection('ㄷㅓㄴㄱㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅓㄴㄱㅏ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-던감', + rules: [ + suffixInflection('ㄷㅓㄴㄱㅏㅁ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅓㄴㄱㅏㅁ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-던걸', + rules: [ + suffixInflection('ㄷㅓㄴㄱㅓㄹ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅓㄴㄱㅓㄹ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-던고', + rules: [ + suffixInflection('ㄷㅓㄴㄱㅗ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅓㄴㄱㅗ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-던데', + rules: [ + suffixInflection('ㄷㅓㄴㄷㅔ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅓㄴㄷㅔ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-던들', + rules: [ + suffixInflection('ㄷㅓㄴㄷㅡㄹ', '', [], ['p']) + ] + }, + { + name: '-던바', + rules: [ + suffixInflection('ㄷㅓㄴㅂㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅓㄴㅂㅏ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-던지', + rules: [ + suffixInflection('ㄷㅓㄴㅈㅣ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅓㄴㅈㅣ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-데', + rules: [ + suffixInflection('ㄷㅔ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅔ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-데요', + rules: [ + suffixInflection('ㄷㅔㅇㅛ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅔㅇㅛ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-도다', + rules: [ + suffixInflection('ㄷㅗㄷㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅗㄷㅏ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-도록', + rules: [ + suffixInflection('ㄷㅗㄹㅗㄱ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄷㅗㄹㅗㄱ', '', [], ['eusi']) + ] + }, + { + name: '-(으)되', + rules: [ + suffixInflection('ㄷㅗㅣ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅇㅡㄷㅗㅣ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄷㅗㅣ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄷㅗㅣ', '', [], ['p', 'f']) + ] + }, + { + name: '-드구나', + rules: [ + suffixInflection('ㄷㅡㄱㅜㄴㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅡㄱㅜㄴㅏ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-드구료', + rules: [ + suffixInflection('ㄷㅡㄱㅜㄹㅛ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅡㄱㅜㄹㅛ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-드구면', + rules: [ + suffixInflection('ㄷㅡㄱㅜㅁㅕㄴ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅡㄱㅜㅁㅕㄴ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-드군', + rules: [ + suffixInflection('ㄷㅡㄱㅜㄴ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅡㄱㅜㄴ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-드냐', + rules: [ + suffixInflection('ㄷㅡㄴㅑ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅡㄴㅑ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-드니', + rules: [ + suffixInflection('ㄷㅡㄴㅣ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅡㄴㅣ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-드니라', + rules: [ + suffixInflection('ㄷㅡㄴㅣㄹㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅡㄴㅣㄹㅏ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-드라', + rules: [ + suffixInflection('ㄷㅡㄹㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅡㄹㅏ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-드라도', + rules: [ + suffixInflection('ㄷㅡㄹㅏㄷㅗ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅡㄹㅏㄷㅗ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-드라면', + rules: [ + suffixInflection('ㄷㅡㄹㅏㅁㅕㄴ', '', [], ['p']) + ] + }, + { + name: '-드래도', + rules: [ + suffixInflection('ㄷㅡㄹㅐㄷㅗ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅡㄹㅐㄷㅗ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-든', + rules: [ + suffixInflection('ㄷㅡㄴ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅡㄴ', '', [], ['p', 'eusi']) + ] + }, + { + name: '-든가', + rules: [ + suffixInflection('ㄷㅡㄴㄱㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅡㄴㄱㅏ', '', [], ['p', 'eusi']) + ] + }, + { + name: '-든걸', + rules: [ + suffixInflection('ㄷㅡㄴㄱㅓㄹ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅡㄴㄱㅓㄹ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-든고', + rules: [ + suffixInflection('ㄷㅡㄴㄱㅗ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅡㄴㄱㅗ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-든데', + rules: [ + suffixInflection('ㄷㅡㄴㄷㅔ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅡㄴㄷㅔ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-든들', + rules: [ + suffixInflection('ㄷㅡㄴㄷㅡㄹ', '', [], ['p']) + ] + }, + { + name: '-든지', + rules: [ + suffixInflection('ㄷㅡㄴㅈㅣ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅡㄴㅈㅣ', '', [], ['p', 'eusi']) + ] + }, + { + name: '-듯', + rules: [ + suffixInflection('ㄷㅡㅅ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅡㅅ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-듯이', + rules: [ + suffixInflection('ㄷㅡㅅㅇㅣ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅡㅅㅇㅣ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-디', + rules: [ + suffixInflection('ㄷㅣ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄷㅣ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-(으)라', + rules: [ + suffixInflection('ㄹㅏ', 'ㄷㅏ', [], ['v', 'ida']), + suffixInflection('ㄹㅏ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㄹㅏ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅏ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㄹㅏ', 'ㄷㄷㅏ', [], ['v']), + suffixInflection('ㅇㅏㄴㅣㄹㅏ', '아니다', [], ['adj']), + suffixInflection('ㄹㅏ', '', [], ['eusi', 'do']) + ] + }, + { + name: '-(으)라고', + rules: [ + suffixInflection('ㄹㅏㄱㅗ', 'ㄷㅏ', [], ['v', 'ida']), + suffixInflection('ㄹㅏㄱㅗ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅏㄱㅗ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㄹㅏㄱㅗ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅏㄱㅗ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㄹㅏㄱㅗ', 'ㄷㄷㅏ', [], ['v']), + suffixInflection('ㅇㅏㄴㅣㄹㅏㄱㅗ', '아니다', [], ['adj']), + suffixInflection('ㄹㅏㄱㅗ', '', [], ['eusi', 'do']) + ] + }, + { + name: '-(으)라구', + rules: [ + suffixInflection('ㄹㅏㄱㅜ', 'ㄷㅏ', [], ['v', 'ida']), + suffixInflection('ㄹㅏㄱㅜ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅏㄱㅜ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㄹㅏㄱㅜ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅏㄱㅜ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㄹㅏㄱㅜ', 'ㄷㄷㅏ', [], ['v']), + suffixInflection('ㅇㅏㄴㅣㄹㅏㄱㅜ', '아니다', [], ['adj']), + suffixInflection('ㄹㅏㄱㅜ', '', [], ['eusi', 'do']) + ] + }, + { + name: '-(으)라나', + rules: [ + suffixInflection('ㄹㅏㄴㅏ', 'ㄷㅏ', [], ['v', 'ida']), + suffixInflection('ㄹㅏㄴㅏ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅏㄴㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㄹㅏㄴㅏ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅏㄴㅏ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㄹㅏㄴㅏ', 'ㄷㄷㅏ', [], ['v']), + suffixInflection('ㅇㅏㄴㅣㄹㅏㄴㅏ', '아니다', [], ['adj']), + suffixInflection('ㄹㅏㄴㅏ', '', [], ['eusi', 'do']) + ] + }, + { + name: '-(으)라네', + rules: [ + suffixInflection('ㄹㅏㄴㅔ', 'ㄷㅏ', [], ['v', 'ida']), + suffixInflection('ㄹㅏㄴㅔ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅏㄴㅔ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㄹㅏㄴㅔ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅏㄴㅔ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㄹㅏㄴㅔ', 'ㄷㄷㅏ', [], ['v']), + suffixInflection('ㅇㅏㄴㅣㄹㅏㄴㅔ', '아니다', [], ['adj']), + suffixInflection('ㄹㅏㄴㅔ', '', [], ['eusi', 'do']) + ] + }, + { + name: '-(으)라느니', + rules: [ + suffixInflection('ㄹㅏㄴㅡㄴㅣ', 'ㄷㅏ', [], ['v', 'ida']), + suffixInflection('ㄹㅏㄴㅡㄴㅣ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅏㄴㅡㄴㅣ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㄹㅏㄴㅡㄴㅣ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅏㄴㅡㄴㅣ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㄹㅏㄴㅡㄴㅣ', 'ㄷㄷㅏ', [], ['v']), + suffixInflection('ㅇㅏㄴㅣㄹㅏㄴㅡㄴㅣ', '아니다', [], ['adj']), + suffixInflection('ㄹㅏㄴㅡㄴㅣ', '', [], ['eusi', 'do']) + ] + }, + { + name: '-(으)라니', + rules: [ + suffixInflection('ㄹㅏㄴㅣ', 'ㄷㅏ', [], ['v', 'ida']), + suffixInflection('ㄹㅏㄴㅣ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅏㄴㅣ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㄹㅏㄴㅣ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅏㄴㅣ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㄹㅏㄴㅣ', 'ㄷㄷㅏ', [], ['v']), + suffixInflection('ㅇㅏㄴㅣㄹㅏㄴㅣ', '아니다', [], ['adj']), + suffixInflection('ㄹㅏㄴㅣ', '', [], ['eusi', 'do']) + ] + }, + { + name: '-(으)라니까', + rules: [ + suffixInflection('ㄹㅏㄴㅣㄲㅏ', 'ㄷㅏ', [], ['v', 'ida']), + suffixInflection('ㄹㅏㄴㅣㄲㅏ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅏㄴㅣㄲㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㄹㅏㄴㅣㄲㅏ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅏㄴㅣㄲㅏ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㄹㅏㄴㅣㄲㅏ', 'ㄷㄷㅏ', [], ['v']), + suffixInflection('ㅇㅏㄴㅣㄹㅏㄴㅣㄲㅏ', '아니다', [], ['adj']), + suffixInflection('ㄹㅏㄴㅣㄲㅏ', '', [], ['eusi', 'do']) + ] + }, + { + name: '-라도', + rules: [ + suffixInflection('ㅇㅏㄴㅣㄹㅏㄷㅗ', '아니다', [], ['adj']), + suffixInflection('ㄹㅏㄷㅗ', 'ㄷㅏ', [], ['ida']) + ] + }, + { + name: '-(으)라며', + rules: [ + suffixInflection('ㄹㅏㅁㅕ', 'ㄷㅏ', [], ['v', 'ida']), + suffixInflection('ㄹㅏㅁㅕ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅏㅁㅕ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㄹㅏㅁㅕ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅏㅁㅕ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㄹㅏㅁㅕ', 'ㄷㄷㅏ', [], ['v']), + suffixInflection('ㅇㅏㄴㅣㄹㅏㅁㅕ', '아니다', [], ['adj']), + suffixInflection('ㄹㅏㅁㅕ', '', [], ['eusi', 'do']) + ] + }, + { + name: '-(으)라면', + rules: [ + suffixInflection('ㄹㅏㅁㅕㄴ', 'ㄷㅏ', [], ['v', 'ida']), + suffixInflection('ㄹㅏㅁㅕㄴ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅏㅁㅕㄴ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㄹㅏㅁㅕㄴ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅏㅁㅕㄴ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㄹㅏㅁㅕㄴ', 'ㄷㄷㅏ', [], ['v']), + suffixInflection('ㅇㅏㄴㅣㄹㅏㅁㅕㄴ', '아니다', [], ['adj']), + suffixInflection('ㄹㅏㅁㅕㄴ', '', [], ['eusi', 'do']) + ] + }, + { + name: '-(으)라면서', + rules: [ + suffixInflection('ㄹㅏㅁㅕㄴㅅㅓ', 'ㄷㅏ', [], ['v', 'ida']), + suffixInflection('ㄹㅏㅁㅕㄴㅅㅓ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅏㅁㅕㄴㅅㅓ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㄹㅏㅁㅕㄴㅅㅓ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅏㅁㅕㄴㅅㅓ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㄹㅏㅁㅕㄴㅅㅓ', 'ㄷㄷㅏ', [], ['v']), + suffixInflection('ㅇㅏㄴㅣㄹㅏㅁㅕㄴㅅㅓ', '아니다', [], ['adj']), + suffixInflection('ㄹㅏㅁㅕㄴㅅㅓ', '', [], ['eusi', 'do']) + ] + }, + { + name: '-라서', + rules: [ + suffixInflection('ㅇㅏㄴㅣㄹㅏㅅㅓ', '아니다', [], ['adj']), + suffixInflection('ㄹㅏㅅㅓ', '다', [], ['ida']), + suffixInflection('ㄹㅏㅅㅓ', '', [], ['eusi']) + ] + }, + { + name: '-(으)라손', + rules: [ + suffixInflection('ㄹㅏㅅㅗㄴ', 'ㄷㅏ', [], ['v', 'ida']), + suffixInflection('ㄹㅏㅅㅗㄴ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅏㅅㅗㄴ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㄹㅏㅅㅗㄴ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅏㅅㅗㄴ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㄹㅏㅅㅗㄴ', 'ㄷㄷㅏ', [], ['v']), + suffixInflection('ㅇㅏㄴㅣㄹㅏㅅㅗㄴ', '아니다', [], ['adj']), + suffixInflection('ㄹㅏㅅㅗㄴ', '', [], ['eusi', 'do']) + ] + }, + { + name: '-라야', + rules: [ + suffixInflection('ㅇㅏㄴㅣㄹㅏㅇㅑ', '아니다', [], ['adj']), + suffixInflection('ㄹㅏㅇㅑ', '다', [], ['ida']), + suffixInflection('ㄹㅏㅇㅑ', '', [], ['eusi']) + ] + }, + { + name: '-라야만', + rules: [ + suffixInflection('ㅇㅏㄴㅣㄹㅏㅇㅑㅁㅏㄴ', '아니다', [], ['adj']), + suffixInflection('ㄹㅏㅇㅑㅁㅏㄴ', '다', [], ['ida']), + suffixInflection('ㄹㅏㅇㅑㅁㅏㄴ', '', [], ['eusi']) + ] + }, + { + name: '-(으)라오', + rules: [ + suffixInflection('ㄹㅏㅇㅗ', 'ㄷㅏ', [], ['v', 'ida']), + suffixInflection('ㄹㅏㅇㅗ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅏㅇㅗ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㄹㅏㅇㅗ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅏㅇㅗ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㄹㅏㅇㅗ', 'ㄷㄷㅏ', [], ['v']), + suffixInflection('ㅇㅏㄴㅣㄹㅏㅇㅗ', '아니다', [], ['adj']), + suffixInflection('ㄹㅏㅇㅗ', '', [], ['eusi', 'do']) + ] + }, + { + name: '-(으)라지', + rules: [ + suffixInflection('ㄹㅏㅈㅣ', 'ㄷㅏ', [], ['v', 'ida']), + suffixInflection('ㄹㅏㅈㅣ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅏㅈㅣ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㄹㅏㅈㅣ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅏㅈㅣ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㄹㅏㅈㅣ', 'ㄷㄷㅏ', [], ['v']), + suffixInflection('ㅇㅏㄴㅣㄹㅏㅈㅣ', '아니다', [], ['adj']), + suffixInflection('ㄹㅏㅈㅣ', '', [], ['eusi', 'do']) + ] + }, + { + name: '-(으)락', + rules: [ + suffixInflection('ㄹㅏㄱ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅏㄱ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅏㄱ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㅏㄱ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅏㄱ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅏㄱ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㅏㄱ', 'ㄷㄷㅏ', [], ['v', 'adj']) + ] + }, + { + name: '-(으)란', + rules: [ + suffixInflection('ㄹㅏㄴ', 'ㄷㅏ', [], ['v', 'ida']), + suffixInflection('ㄹㅏㄴ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅏㄴ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㄹㅏㄴ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅏㄴ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㄹㅏㄴ', 'ㄷㄷㅏ', [], ['v']), + suffixInflection('ㅇㅏㄴㅣㄹㅏㄴ', '아니다', [], ['adj']), + suffixInflection('ㄹㅏㄴ', '', [], ['eusi', 'do']) + ] + }, + { + name: '-(으)란다', + rules: [ + suffixInflection('ㄹㅏㄴㄷㅏ', 'ㄷㅏ', [], ['v', 'ida']), + suffixInflection('ㄹㅏㄴㄷㅏ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅏㄴㄷㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㄹㅏㄴㄷㅏ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅏㄴㄷㅏ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㄹㅏㄴㄷㅏ', 'ㄷㄷㅏ', [], ['v']), + suffixInflection('ㅇㅏㄴㅣㄹㅏㄴㄷㅏ', '아니다', [], ['adj']), + suffixInflection('ㄹㅏㄴㄷㅏ', '', [], ['eusi', 'do']) + ] + }, + { + name: '-(으)람', + rules: [ + suffixInflection('ㄹㅏㅁ', 'ㄷㅏ', [], ['v', 'ida']), + suffixInflection('ㄹㅏㅁ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅏㅁ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㄹㅏㅁ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅏㅁ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㄹㅏ', 'ㄷㄷㅏ', [], ['v']), + suffixInflection('ㅇㅏㄴㅣㄹㅏㅁ', '아니다', [], ['adj']), + suffixInflection('ㄹㅏㅁ', '', [], ['eusi', 'do']) + ] + }, + { + name: '-(으)랍니까', + rules: [ + suffixInflection('ㄹㅏㅂㄴㅣㄲㅏ', 'ㄷㅏ', [], ['v', 'ida']), + suffixInflection('ㄹㅏㅂㄴㅣㄲㅏ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅏㅂㄴㅣㄲㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㄹㅏㅂㄴㅣㄲㅏ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅏㅂㄴㅣㄲㅏ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㄹㅏㅂㄴㅣㄲㅏ', 'ㄷㄷㅏ', [], ['v']), + suffixInflection('ㅇㅏㄴㅣㄹㅏㅂㄴㅣㄲㅏ', '아니다', [], ['adj']), + suffixInflection('ㄹㅏㅂㄴㅣㄲㅏ', '', [], ['eusi', 'do']) + ] + }, + { + name: '-(으)랍니다', + rules: [ + suffixInflection('ㄹㅏㅂㄴㅣㄷㅏ', 'ㄷㅏ', [], ['v', 'ida']), + suffixInflection('ㄹㅏㅂㄴㅣㄷㅏ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅏㅂㄴㅣㄷㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㄹㅏㅂㄴㅣㄷㅏ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅏㅂㄴㅣㄷㅏ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㄹㅏㅂㄴㅣㄷㅏ', 'ㄷㄷㅏ', [], ['v']), + suffixInflection('ㅇㅏㄴㅣㄹㅏㅂㄴㅣㄷㅏ', '아니다', [], ['adj']), + suffixInflection('ㄹㅏㅂㄴㅣㄷㅏ', '', [], ['eusi']) + ] + }, + { + name: '-랍시고', + rules: [ + suffixInflection('ㅇㅏㄴㅣㄹㅏㅂㅅㅣㄱㅗ', '아니다', [], ['adj']), + suffixInflection('ㄹㅏㅂㅅㅣㄱㅗ', '다', [], ['ida']), + suffixInflection('ㄹㅏㅂㅅㅣㄱㅗ', '', [], ['eusi']) + ] + }, + { + name: '-(으)래', + rules: [ + suffixInflection('ㄹㅐ', 'ㄷㅏ', [], ['v', 'ida']), + suffixInflection('ㄹㅐ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅐ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㄹㅐ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅐ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㄹㅐ', 'ㄷㄷㅏ', [], ['v']), + suffixInflection('ㅇㅏㄴㅣㄹㅐ', '아니다', [], ['adj']), + suffixInflection('ㄹㅐ', '', [], ['eusi']) + ] + }, + { + name: '-(으)래요', + rules: [ + suffixInflection('ㄹㅐㅇㅛ', 'ㄷㅏ', [], ['v', 'ida']), + suffixInflection('ㄹㅐㅇㅛ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅐㅇㅛ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㄹㅐㅇㅛ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅐㅇㅛ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㄹㅐㅇㅛ', 'ㄷㄷㅏ', [], ['v']), + suffixInflection('ㅇㅏㄴㅣㄹㅐㅇㅛ', '아니다', [], ['adj']), + suffixInflection('ㄹㅐㅇㅛ', '', [], ['eusi']) + ] + }, + { + name: '-(으)랴', + rules: [ + suffixInflection('ㄹㅑ', 'ㄷㅏ', [], ['v', 'ida']), + suffixInflection('ㄹㅑ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅑ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㄹㅑ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅑ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㄹㅑ', 'ㄷㄷㅏ', [], ['v']), + suffixInflection('ㄹㅑ', '', [], ['eusi']) + ] + }, + { + name: '-(으)러', + rules: [ + suffixInflection('ㄹㅓ', 'ㄷㅏ', [], ['v', 'ida']), + suffixInflection('ㄹㅓ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅓ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㄹㅓ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅓ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㄹㅓ', 'ㄷㄷㅏ', [], ['v']), + suffixInflection('ㄹㅓ', '', [], ['eusi']) + ] + }, + { + name: '-러니', + rules: [ + suffixInflection('ㅇㅏㄴㅣㄹㅓㄴㅣ', '아니다', [], ['adj']), + suffixInflection('ㄹㅓㄴㅣ', '다', [], ['ida']), + suffixInflection('ㄹㅓㄴㅣ', '', [], ['eusi']) + ] + }, + { + name: '-러니라', + rules: [ + suffixInflection('ㅇㅏㄴㅣㄹㅓㄴㅣㄹㅏ', '아니다', [], ['adj']), + suffixInflection('ㄹㅓㄴㅣㄹㅏ', '다', [], ['ida']), + suffixInflection('ㄹㅓㄴㅣㄹㅏ', '', [], ['eusi']) + ] + }, + { + name: '-러니이까', + rules: [ + suffixInflection('ㅇㅏㄴㅣㄹㅓㄴㅣㅇㅣㄲㅏ', '아니다', [], ['adj']), + suffixInflection('ㄹㅓㄴㅣㅇㅣㄲㅏ', '다', [], ['ida']), + suffixInflection('ㄹㅓㄴㅣㅇㅣㄲㅏ', '', [], ['eusi']) + ] + }, + { + name: '-러니이다', + rules: [ + suffixInflection('ㅇㅏㄴㅣㄹㅓㄴㅣㅇㅣㄷㅏ', '아니다', [], ['adj']), + suffixInflection('ㄹㅓㄴㅣㅇㅣㄷㅏ', '다', [], ['ida']), + suffixInflection('ㄹㅓㄴㅣㅇㅣㄷㅏ', '', [], ['eusi']) + ] + }, + { + name: '-러라', + rules: [ + suffixInflection('ㅇㅏㄴㅣㄹㅓㄹㅏ', '아니다', [], ['adj']), + suffixInflection('ㄹㅓㄹㅏ', '다', [], ['ida']), + suffixInflection('ㄹㅓㄹㅏ', '', [], ['eusi']) + ] + }, + { + name: '-러이까', + rules: [ + suffixInflection('ㅇㅏㄴㅣㄹㅓㅇㅣㄲㅏ', '아니다', [], ['adj']), + suffixInflection('ㄹㅓㅇㅣㄲㅏ', '다', [], ['ida']), + suffixInflection('ㄹㅓㅇㅣㄲㅏ', '', [], ['eusi']) + ] + }, + { + name: '-러이다', + rules: [ + suffixInflection('ㅇㅏㄴㅣㄹㅓㅇㅣㄷㅏ', '아니다', [], ['adj']), + suffixInflection('ㄹㅓㅇㅣㄷㅏ', '다', [], ['ida']), + suffixInflection('ㄹㅓㅇㅣㄷㅏ', '', [], ['eusi']) + ] + }, + { + name: '-런가', + rules: [ + suffixInflection('ㅇㅏㄴㅣㄹㅓㄴㄱㅏ', '아니다', [], ['adj']), + suffixInflection('ㄹㅓㄴㄱㅏ', '다', [], ['ida']), + suffixInflection('ㄹㅓㄴㄱㅏ', '', [], ['eusi']) + ] + }, + { + name: '-런들', + rules: [ + suffixInflection('ㅇㅏㄴㅣㄹㅓㄴㄷㅡㄹ', '아니다', [], ['adj']), + suffixInflection('ㄹㅓㄴㄷㅡㄹ', '다', [], ['ida']), + suffixInflection('ㄹㅓㄴㄷㅡㄹ', '', [], ['eusi']) + ] + }, + { + name: '-(으)려', + rules: [ + suffixInflection('ㄹㅕ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄹㅕ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅕ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㄹㅕ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅕ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㄹㅕ', 'ㄷㄷㅏ', [], ['v']), + suffixInflection('ㄹㅕ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㅕ', '', [], ['p']) + ] + }, + { + name: '-(으)려거든', + rules: [ + suffixInflection('ㄹㅕㄱㅓㄷㅡㄴ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄹㅕㄱㅓㄷㅡㄴ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅕㄱㅓㄷㅡㄴ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㄹㅕㄱㅓㄷㅡㄴ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅕㄱㅓㄷㅡㄴ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㄹㅕㄱㅓㄷㅡㄴ', 'ㄷㄷㅏ', [], ['v']), + suffixInflection('ㄹㅕㄱㅓㄷㅡㄴ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㅕㄱㅓㄷㅡㄴ', '', [], ['p']) + ] + }, + { + name: '-(으)려고', + rules: [ + suffixInflection('ㄹㅕㄱㅗ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅕㄱㅗ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅕㄱㅗ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㅕㄱㅗ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅕㄱㅗ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅇㅡㄹㅕㄱㅗ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅕㄱㅗ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㅕㄱㅗ', '', [], ['p']) + ] + }, + { + name: '-(으)려나', + rules: [ + suffixInflection('ㄹㅕㄴㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㅕㄴㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅕㄴㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㅕㄴㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅕㄴㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅕㄴㅏ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㅕㄴㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅕㄴㅏ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㅕㄴㅏ', '', [], ['p']) + ] + }, + { + name: '-(으)려니', + rules: [ + suffixInflection('ㄹㅕㄴㅣ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㅕㄴㅣ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅕㄴㅣ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㅕㄴㅣ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅕㄴㅣ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅕㄴㅣ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㅕㄴㅣ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅕㄴㅣ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㅕㄴㅣ', '', [], ['p']) + ] + }, + { + name: '-(으)려니와', + rules: [ + suffixInflection('ㄹㅕㄴㅣㅇㅗㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㅕㄴㅣㅇㅗㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅕㄴㅣㅇㅗㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㅕㄴㅣㅇㅗㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅕㄴㅣㅇㅗㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅕㄴㅣㅇㅗㅏ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㅕㄴㅣㅇㅗㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅕㄴㅣㅇㅗㅏ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㅕㄴㅣㅇㅗㅏ', '', [], ['p']) + ] + }, + { + name: '-(으)려든', + rules: [ + suffixInflection('ㄹㅕㄷㅡㄴ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄹㅕㄷㅡㄴ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅕㄷㅡㄴ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㄹㅕㄷㅡㄴ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅕㄷㅡㄴ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㄹㅕㄷㅡㄴ', 'ㄷㄷㅏ', [], ['v']), + suffixInflection('ㄹㅕㄷㅡㄴ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㅕㄷㅡㄴ', '', [], ['p']) + ] + }, + { + name: '-(으)려마', + rules: [ + suffixInflection('ㄹㅕㅁㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄹㅕㅁㅏ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅕㅁㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㄹㅕㅁㅏ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅕㅁㅏ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㄹㅕㅁㅏ', 'ㄷㄷㅏ', [], ['v']), + suffixInflection('ㄹㅕㅁㅏ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㅕㅁㅏ', '', [], ['p']) + ] + }, + { + name: '-(으)려면', + rules: [ + suffixInflection('ㄹㅕㅁㅕㄴ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㅕㅁㅕㄴ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅕㅁㅕㄴ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㅕㅁㅕㄴ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅕㅁㅕㄴ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅕㅁㅕㄴ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㅕㅁㅕㄴ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅕㅁㅕㄴ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㅕㅁㅕㄴ', '', [], ['p']) + ] + }, + { + name: '-(으)려무나', + rules: [ + suffixInflection('ㄹㅕㅁㅜㄴㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄹㅕㅁㅜㄴㅏ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅕㅁㅜㄴㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㄹㅕㅁㅜㄴㅏ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅕㅁㅜㄴㅏ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㄹㅕㅁㅜㄴㅏ', 'ㄷㄷㅏ', [], ['v']), + suffixInflection('ㄹㅕㅁㅜㄴㅏ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㅕㅁㅜㄴㅏ', '', [], ['p']) + ] + }, + { + name: '-(으)련', + rules: [ + suffixInflection('ㄹㅕㄴ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄹㅕㄴ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅕㄴ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㄹㅕㄴ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅕㄴ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㄹㅕㄴ', 'ㄷㄷㅏ', [], ['v']), + suffixInflection('ㄹㅕㄴ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㅕㄴ', '', [], ['p']) + ] + }, + { + name: '-(으)련마는', + rules: [ + suffixInflection('ㄹㅕㄴㅁㅏㄴㅡㄴ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㅕㄴㅁㅏㄴㅡㄴ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅕㄴㅁㅏㄴㅡㄴ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㅕㄴㅁㅏㄴㅡㄴ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅕㄴㅁㅏㄴㅡㄴ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅕㄴㅁㅏㄴㅡㄴ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㅕㄴㅁㅏㄴㅡㄴ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅕㄴㅁㅏㄴㅡㄴ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㅕㄴㅁㅏㄴㅡㄴ', '', [], ['p']) + ] + }, + { + name: '-(으)련만', + rules: [ + suffixInflection('ㄹㅕㄴㅁㅏㄴ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㅕㄴㅁㅏㄴ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅕㄴㅁㅏㄴ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㅕㄴㅁㅏㄴ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅕㄴㅁㅏㄴ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅕㄴㅁㅏㄴ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㅕㄴㅁㅏㄴ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅕㄴㅁㅏㄴ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㅕㄴㅁㅏㄴ', '', [], ['p']) + ] + }, + { + name: '-(으)렴', + rules: [ + suffixInflection('ㄹㅕㅁ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄹㅕㅁ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅕㅁ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㄹㅕㅁ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅕㅁ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㄹㅕㅁ', 'ㄷㄷㅏ', [], ['v']), + suffixInflection('ㄹㅕㅁ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㅕㅁ', '', [], ['p']) + ] + }, + { + name: '-(으)렵니까', + rules: [ + suffixInflection('ㄹㅕㅂㄴㅣㄲㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄹㅕㅂㄴㅣㄲㅏ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅕㅂㄴㅣㄲㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㄹㅕㅂㄴㅣㄲㅏ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅕㅂㄴㅣㄲㅏ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㄹㅕㅂㄴㅣㄲㅏ', 'ㄷㄷㅏ', [], ['v']), + suffixInflection('ㄹㅕㅂㄴㅣㄲㅏ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㅕㅂㄴㅣㄲㅏ', '', [], ['p']) + ] + }, + { + name: '-(으)렵니다', + rules: [ + suffixInflection('ㄹㅕㅂㄴㅣㄷㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄹㅕㅂㄴㅣㄷㅏ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅕㅂㄴㅣㄷㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㄹㅕㅂㄴㅣㄷㅏ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅕㅂㄴㅣㄷㅏ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㄹㅕㅂㄴㅣㄷㅏ', 'ㄷㄷㅏ', [], ['v']), + suffixInflection('ㄹㅕㅂㄴㅣㄷㅏ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㅕㅂㄴㅣㄷㅏ', '', [], ['p']) + ] + }, + { + name: '-(으)렷다', + rules: [ + suffixInflection('ㄹㅕㅅㄷㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㅕㅅㄷㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅕㅅㄷㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㅕㅅㄷㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅕㅅㄷㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅕㅅㄷㅏ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㅕㅅㄷㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅕㅅㄷㅏ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㅕㅅㄷㅏ', '', [], ['p']) + ] + }, + { + name: '-로고', + rules: [ + suffixInflection('ㅇㅏㄴㅣㄹㅗㄱㅗ', '아니다', [], ['adj']), + suffixInflection('ㄹㅗㄱㅗ', '다', [], ['ida']), + suffixInflection('ㄹㅗㄱㅗ', '', [], ['eusi']) + ] + }, + { + name: '-로고나', + rules: [ + suffixInflection('ㅇㅏㄴㅣㄹㅗㄱㅗㄴㅏ', '아니다', [], ['adj']), + suffixInflection('ㄹㅗㄱㅗㄴㅏ', '다', [], ['ida']), + suffixInflection('ㄹㅗㄱㅗㄴㅏ', '', [], ['eusi']) + ] + }, + { + name: '-로구나', + rules: [ + suffixInflection('ㅇㅏㄴㅣㄹㅗㄱㅜㄴㅏ', '아니다', [], ['adj']), + suffixInflection('ㄹㅗㄱㅜㄴㅏ', '다', [], ['ida']), + suffixInflection('ㄹㅗㄱㅜㄴㅏ', '', [], ['eusi']) + ] + }, + { + name: '-로구려', + rules: [ + suffixInflection('ㅇㅏㄴㅣㄹㅗㄱㅜㄹㅕ', '아니다', [], ['adj']), + suffixInflection('ㄹㅗㄱㅜㄹㅕ', '다', [], ['ida']), + suffixInflection('ㄹㅗㄱㅜㄹㅕ', '', [], ['eusi']) + ] + }, + { + name: '-로구료', + rules: [ + suffixInflection('ㅇㅏㄴㅣㄹㅗㄱㅜㄹㅛ', '아니다', [], ['adj']), + suffixInflection('ㄹㅗㄱㅜㄹㅛ', '다', [], ['ida']), + suffixInflection('ㄹㅗㄱㅜㄹㅛ', '', [], ['eusi']) + ] + }, + { + name: '-로구만', + rules: [ + suffixInflection('ㅇㅏㄴㅣㄹㅗㄱㅜㅁㅏㄴ', '아니다', [], ['adj']), + suffixInflection('ㄹㅗㄱㅜㅁㅏㄴ', '다', [], ['ida']), + suffixInflection('ㄹㅗㄱㅜㅁㅏㄴ', '', [], ['eusi']) + ] + }, + { + name: '-로구먼', + rules: [ + suffixInflection('ㅇㅏㄴㅣㄹㅗㄱㅜㅁㅓㄴ', '아니다', [], ['adj']), + suffixInflection('ㄹㅗㄱㅜㅁㅓㄴ', '다', [], ['ida']), + suffixInflection('ㄹㅗㄱㅜㅁㅓㄴ', '', [], ['eusi']) + ] + }, + { + name: '-로구면', + rules: [ + suffixInflection('ㅇㅏㄴㅣㄹㅗㄱㅜㅁㅕㄴ', '아니다', [], ['adj']), + suffixInflection('ㄹㅗㄱㅜㅁㅕㄴ', '다', [], ['ida']), + suffixInflection('ㄹㅗㄱㅜㅁㅕㄴ', '', [], ['eusi']) + ] + }, + { + name: '-로군', + rules: [ + suffixInflection('ㅇㅏㄴㅣㄹㅗㄱㅜㄴ', '아니다', [], ['adj']), + suffixInflection('ㄹㅗㄱㅜㄴ', '다', [], ['ida']), + suffixInflection('ㄹㅗㄱㅜㄴ', '', [], ['eusi']) + ] + }, + { + name: '-로다', + rules: [ + suffixInflection('ㅇㅏㄴㅣㄹㅗㄷㅏ', '아니다', [], ['adj']), + suffixInflection('ㄹㅗㄷㅏ', '다', [], ['ida']), + suffixInflection('ㄹㅗㄷㅏ', '', [], ['eusi']) + ] + }, + { + name: '-로되', + rules: [ + suffixInflection('ㅇㅏㄴㅣㄹㅗㄷㅗㅣ', '아니다', [], ['adj']), + suffixInflection('ㄹㅗㄷㅗㅣ', '다', [], ['ida']), + suffixInflection('ㄹㅗㄷㅗㅣ', '', [], ['eusi']) + ] + }, + { + name: '-로라', + rules: [ + suffixInflection('ㅇㅏㄴㅣㄹㅗㄹㅏ', '아니다', [], ['adj']), + suffixInflection('ㄹㅗㄹㅏ', '다', [], ['ida']), + suffixInflection('', '다', [], ['ida']) + ] + }, + { + name: '-로서니', + rules: [ + suffixInflection('ㅇㅏㄴㅣㄹㅗㅅㅓㄴㅣ', '아니다', [], ['adj']), + suffixInflection('ㄹㅗㅅㅓㄴㅣ', '다', [], ['ida']), + suffixInflection('ㄹㅗㅅㅓㄴㅣ', '다', [], ['ida']) + ] + }, + { + name: '-로세', + rules: [ + suffixInflection('ㅇㅏㄴㅣㄹㅗㅅㅔ', '아니다', [], ['adj']), + suffixInflection('ㄹㅗㅅㅔ', '다', [], ['ida']), + suffixInflection('ㄹㅗㅅㅔ', '', [], ['eusi']) + ] + }, + { + name: '-(으)리', + rules: [ + suffixInflection('ㄹㅣ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㅣ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅣ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㅣ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅣ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅣ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㅣ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅣ', '', [], ['eusi', 'euo']), + suffixInflection('ㅇㅡㄹㅣ', '', [], ['p']) + ] + }, + { + name: '-(으)리까', + rules: [ + suffixInflection('ㄹㅣㄲㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㅣㄲㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅣㄲㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㅣㄲㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅣㄲㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅣㄲㅏ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㅣㄲㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅣㄲㅏ', '', [], ['eusi', 'euo']), + suffixInflection('ㅇㅡㄹㅣㄲㅏ', '', [], ['p']) + ] + }, + { + name: '-(으)리니', + rules: [ + suffixInflection('ㄹㅣㄴㅣ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㅣㄴㅣ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅣㄴㅣ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㅣㄴㅣ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅣㄴㅣ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅣㄴㅣ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㅣㄴㅣ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅣㄴㅣ', '', [], ['eusi', 'euo']), + suffixInflection('ㅇㅡㄹㅣㄴㅣ', '', [], ['p']) + ] + }, + { + name: '-(으)리니라', + rules: [ + suffixInflection('ㄹㅣㄴㅣㄹㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㅣㄴㅣㄹㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅣㄴㅣㄹㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㅣㄴㅣㄹㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅣㄴㅣㄹㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅣㄴㅣㄹㅏ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㅣㄴㅣㄹㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅣㄴㅣㄹㅏ', '', [], ['eusi', 'euo']), + suffixInflection('ㅇㅡㄹㅣㄴㅣㄹㅏ', '', [], ['p']) + ] + }, + { + name: '-(으)리다', + rules: [ + suffixInflection('ㄹㅣㄷㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㅣㄷㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅣㄷㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㅣㄷㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅣㄷㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅣㄷㅏ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㅣㄷㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅣㄷㅏ', '', [], ['eusi', 'euo']), + suffixInflection('ㅇㅡㄹㅣㄷㅏ', '', [], ['p']) + ] + }, + { + name: '-(으)리라', + rules: [ + suffixInflection('ㄹㅣㄹㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㅣㄹㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅣㄹㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㅣㄹㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅣㄹㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅣㄹㅏ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㅣㄹㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅣㄹㅏ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㅣㄹㅏ', '', [], ['p']) + ] + }, + { + name: '-(으)리로다', + rules: [ + suffixInflection('ㄹㅣㄹㅗㄷㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㅣㄹㅗㄷㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅣㄹㅗㄷㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㅣㄹㅗㄷㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅣㄹㅗㄷㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅣㄹㅗㄷㅏ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㅣㄹㅗㄷㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅣㄹㅗㄷㅏ', '', [], ['eusi', 'euo']), + suffixInflection('ㅇㅡㄹㅣㄹㅗㄷㅏ', '', [], ['p']) + ] + }, + { + name: '-(으)리만치', + rules: [ + suffixInflection('ㄹㅣㅁㅏㄴㅊㅣ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㅣㅁㅏㄴㅊㅣ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅣㅁㅏㄴㅊㅣ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㅣㅁㅏㄴㅊㅣ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅣㅁㅏㄴㅊㅣ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅣㅁㅏㄴㅊㅣ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㅣㅁㅏㄴㅊㅣ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅣㅁㅏㄴㅊㅣ', '', [], ['eusi', 'euo']), + suffixInflection('ㅇㅡㄹㅣㅁㅏㄴㅊㅣ', '', [], ['p']) + ] + }, + { + name: '-(으)리만큼', + rules: [ + suffixInflection('ㄹㅣㅁㅏㄴㅋㅡㅁ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㅣㅁㅏㄴㅋㅡㅁ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅣㅁㅏㄴㅋㅡㅁ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㅣㅁㅏㄴㅋㅡㅁ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅣㅁㅏㄴㅋㅡㅁ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅣㅁㅏㄴㅋㅡㅁ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㅣㅁㅏㄴㅋㅡㅁ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅣㅁㅏㄴㅋㅡㅁ', '', [], ['eusi', 'euo']), + suffixInflection('ㅇㅡㄹㅣㅁㅏㄴㅋㅡㅁ', '', [], ['p']) + ] + }, + { + name: '-(으)리오', + rules: [ + suffixInflection('ㄹㅣㅇㅗ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㅣㅇㅗ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅣㅇㅗ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㅣㅇㅗ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅣㅇㅗ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅣㅇㅗ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㅣㅇㅗ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅣㅇㅗ', '', [], ['eusi', 'euo']), + suffixInflection('ㅇㅡㄹㅣㅇㅗ', '', [], ['p']) + ] + }, + { + name: '-(으)마', + rules: [ + suffixInflection('ㅁㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅁㅏ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㅁㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㅁㅏ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㅁㅏ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㅁㅏ', 'ㄷㄷㅏ', [], ['v']) + ] + }, + { + name: '-(으)매', + rules: [ + suffixInflection('ㅁㅐ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅁㅐ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㅁㅐ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㅁㅐ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㅁㅐ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅁㅐ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㅁㅐ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅁㅐ', '', [], ['eusi']), + suffixInflection('ㅇㅡㅁㅐ', '', [], ['p', 'f']) + ] + }, + { + name: '-(으)며', + rules: [ + suffixInflection('ㅁㅕ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅁㅕ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㅁㅕ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㅁㅕ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㅁㅕ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅁㅕ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅁㅕ', '', [], ['eusi']), + suffixInflection('ㅇㅡㅁㅕ', '', [], ['p', 'f']) + ] + }, + { + name: '-(으)면', + rules: [ + suffixInflection('ㅁㅕㄴ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅁㅕㄴ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㅁㅕㄴ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㅁㅕㄴ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㅁㅕㄴ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅁㅕㄴ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅁㅕㄴ', '', [], ['eusi', 'euo', 'jao']), + suffixInflection('ㅇㅡㅁㅕㄴ', '', [], ['p', 'f']) + ] + }, + { + name: '-(으)면서', + rules: [ + suffixInflection('ㅁㅕㄴㅅㅓ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅁㅕㄴㅅㅓ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㅁㅕㄴㅅㅓ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㅁㅕㄴㅅㅓ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㅁㅕㄴㅅㅓ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅁㅕㄴㅅㅓ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅁㅕㄴㅅㅓ', '', [], ['eusi']), + suffixInflection('ㅇㅡㅁㅕㄴㅅㅓ', '', [], ['p', 'f']) + ] + }, + { + name: '-(으)므로', + rules: [ + suffixInflection('ㅁㅡㄹㅗ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅁㅡㄹㅗ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㅁㅡㄹㅗ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㅁㅡㄹㅗ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㅁㅡㄹㅗ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅁㅡㄹㅗ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅁㅡㄹㅗ', '', [], ['eusi']), + suffixInflection('ㅇㅡㅁㅡㄹㅗ', '', [], ['p', 'f']) + ] + }, + { + name: '-(으)사', + rules: [ + suffixInflection('ㅅㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅅㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㅅㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㅅㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㅅㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅅㅏ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡ', 'ㄷㄷㅏ', [], ['v', 'adj']) + ] + }, + { + name: '-사오-', + rules: [ + suffixInflection('ㅅㅏㅇㅗ', 'ㄷㅏ', ['sao'], ['v', 'adj']), + suffixInflection('ㅅㅏㅇㅗ', '', ['sao'], ['p', 'f']) + ] + }, + { + name: '-사오니까', + rules: [ + suffixInflection('ㅅㅏㅇㅗㄴㅣㄲㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅅㅏㅇㅗㄴㅣㄲㅏ', '', [], ['p', 'f']) + ] + }, + { + name: '-사오리까', + rules: [ + suffixInflection('ㅅㅏㅇㅗㄹㅣㄲㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅅㅏㅇㅗㄹㅣㄲㅏ', '', [], ['p', 'f']) + ] + }, + { + name: '-사오리다', + rules: [ + suffixInflection('ㅅㅏㅇㅗㄹㅣㄷㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅅㅏㅇㅗㄹㅣㄷㅏ', '', [], ['p', 'f']) + ] + }, + { + name: '-사오리이까', + rules: [ + suffixInflection('ㅅㅏㅇㅗㄹㅣㅇㅣㄲㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅅㅏㅇㅗㄹㅣㅇㅣㄲㅏ', '', [], ['p', 'f']) + ] + }, + { + name: '-사오리이다', + rules: [ + suffixInflection('ㅅㅏㅇㅗㄹㅣㅇㅣㄷㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅅㅏㅇㅗㄹㅣㅇㅣㄷㅏ', '', [], ['p', 'f']) + ] + }, + { + name: '-사오이다', + rules: [ + suffixInflection('ㅅㅏㅇㅗㅇㅣㄷㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅅㅏㅇㅗㅇㅣㄷㅏ', '', [], ['p', 'f']) + ] + }, + { + name: '-사옵-', + rules: [ + suffixInflection('ㅅㅏㅇㅗㅂ', 'ㄷㅏ', ['saob'], ['v', 'adj']), + suffixInflection('ㅅㅏㅇㅗㅂ', '', ['saob'], ['p', 'f']) + ] + }, + { + name: '-사옵니까', + rules: [ + suffixInflection('ㅅㅏㅇㅗㅂㄴㅣㄲㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅅㅏㅇㅗㅂㄴㅣㄲㅏ', '', [], ['p', 'f']) + ] + }, + { + name: '-사옵니다', + rules: [ + suffixInflection('ㅅㅏㅇㅗㅂㄴㅣㄷㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅅㅏㅇㅗㅂㄴㅣㄷㅏ', '', [], ['p', 'f']) + ] + }, + { + name: '-사옵디까', + rules: [ + suffixInflection('ㅅㅏㅇㅗㅂㄷㅣㄲㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅅㅏㅇㅗㅂㄷㅣㄲㅏ', '', [], ['p', 'f']) + ] + }, + { + name: '-사옵디다', + rules: [ + suffixInflection('ㅅㅏㅇㅗㅂㄷㅣㄷㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅅㅏㅇㅗㅂㄷㅣㄷㅏ', '', [], ['p', 'f']) + ] + }, + { + name: '-사와', + rules: [ + suffixInflection('ㅅㅏㅇㅗㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅅㅏㅇㅗㅏ', '', [], ['p', 'f']) + ] + }, + { + name: '-사외다', + rules: [ + suffixInflection('ㅅㅏㅇㅗㅣㄷㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅅㅏㅇㅗㅣㄷㅏ', '', [], ['p', 'f']) + ] + }, + { + name: '-(으)사이다', + rules: [ + suffixInflection('ㅅㅏㅇㅣㄷㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅅㅏㅇㅣㄷㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㅅㅏㅇㅣㄷㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㅅㅏㅇㅣㄷㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㅅㅏㅇㅣㄷㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅅㅏㅇㅣㄷㅏ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㅅㅏㅇㅣㄷㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']) + ] + }, + { + name: '-삽-', + rules: [ + suffixInflection('ㅅㅏㅂ', 'ㄷㅏ', ['sab'], ['v', 'adj']), + suffixInflection('ㅅㅏㅂ', '', ['sab'], ['p', 'f']) + ] + }, + { + name: '-(으)세', + rules: [ + suffixInflection('ㅅㅔ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㅅㅔ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㅅㅔ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㅅㅔ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㅅㅔ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㅅㅔ', 'ㄷㄷㅏ', [], ['v']) + ] + }, + { + name: '-세나', + rules: [ + suffixInflection('ㅅㅔㄴㅏ', 'ㄷㅏ', [], ['v']) + ] + }, + { + name: '-(으)세요', + rules: [ + suffixInflection('ㅅㅔㅇㅛ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅇㅡㅅㅔㅇㅛ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㅅㅔㅇㅛ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㅅㅔㅇㅛ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅅㅔㅇㅛ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅅㅔㅇㅛ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅇㅡㅅㅔㅇㅛ', 'ㄷㄷㅏ', [], ['v', 'adj']) + ] + }, + { + name: '-(으)셔요', + rules: [ + suffixInflection('ㅅㅕㅇㅛ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅇㅡㅅㅕㅇㅛ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㅅㅕㅇㅛ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㅅㅕㅇㅛ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅅㅕㅇㅛ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅅㅕㅇㅛ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅇㅡㅅㅕㅇㅛ', 'ㄷㄷㅏ', [], ['v', 'adj']) + ] + }, + { + name: '-소', + rules: [ + suffixInflection('ㅅㅗ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅅㅗ', '', [], ['p', 'f']) + ] + }, + { + name: '-소다', + rules: [ + suffixInflection('ㅅㅗㄷㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅅㅗㄷㅏ', '', [], ['p', 'f']) + ] + }, + { + name: '-(으)소서', + rules: [ + suffixInflection('ㅅㅗㅅㅓ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㅅㅗㅅㅓ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㅅㅗㅅㅓ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㅅㅗㅅㅓ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅅㅗㅅㅓ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅅㅗㅅㅓ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅇㅡㅅㅗㅅㅓ', 'ㄷㄷㅏ', [], ['v', 'adj']) + ] + }, + { + name: '-소이까', + rules: [ + suffixInflection('ㅅㅗㅇㅣㄲㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅅㅗㅇㅣㄲㅏ', '', [], ['p', 'f']) + ] + }, + { + name: '-소이다', + rules: [ + suffixInflection('ㅅㅗㅇㅣㄷㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅅㅗㅇㅣㄷㅏ', '', [], ['p', 'f']) + ] + }, + { + name: '-쇠다', + rules: [ + suffixInflection('ㅅㅗㅣㄷㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅅㅗㅣㄷㅏ', '', [], ['p', 'f']) + ] + }, + { + name: '-(스)ㅂ네', + rules: [ + suffixInflection('ㅂㄴㅔ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅂㄴㅔ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅅㅡㅂㄴㅔ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅅㅡㅂㄴㅔ', '', [], ['p', 'f']), + suffixInflection('ㅂㄴㅔ', '', [], ['eusi']) + ] + }, + { + name: '-(스)ㅂ늰다', + rules: [ + suffixInflection('ㅂㄴㅡㅣㄴㄷㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅂㄴㅡㅣㄴㄷㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅅㅡㅂㄴㅡㅣㄴㄷㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅅㅡㅂㄴㅡㅣㄴㄷㅏ', '', [], ['p', 'f']), + suffixInflection('ㅂㄴㅡㅣㄴㄷㅏ', '', [], ['eusi']) + ] + }, + { + name: '-(스)ㅂ니까', + rules: [ + suffixInflection('ㅂㄴㅣㄲㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅂㄴㅣㄲㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅅㅡㅂㄴㅣㄲㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅅㅡㅂㄴㅣㄲㅏ', '', [], ['p', 'f']), + suffixInflection('ㅂㄴㅣㄲㅏ', '', [], ['eusi']) + ] + }, + { + name: '-(스)ㅂ니다', + rules: [ + suffixInflection('ㅂㄴㅣㄷㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅂㄴㅣㄷㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅅㅡㅂㄴㅣㄷㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅅㅡㅂㄴㅣㄷㅏ', '', [], ['p', 'f']), + suffixInflection('ㅂㄴㅣㄷㅏ', '', [], ['eusi']) + ] + }, + { + name: '-(스)ㅂ디까', + rules: [ + suffixInflection('ㅂㄷㅣㄲㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅂㄷㅣㄲㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅅㅡㅂㄷㅣㄲㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅅㅡㅂㄷㅣㄲㅏ', '', [], ['p', 'f']), + suffixInflection('ㅂㄷㅣㄲㅏ', '', [], ['eusi']) + ] + }, + { + name: '-(스)ㅂ디다', + rules: [ + suffixInflection('ㅂㄷㅣㄷㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅂㄷㅣㄷㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅅㅡㅂㄷㅣㄷㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅅㅡㅂㄷㅣㄷㅏ', '', [], ['p', 'f']), + suffixInflection('ㅂㄷㅣㄷㅏ', '', [], ['eusi']) + ] + }, + { + name: '-(스)ㅂ딘다', + rules: [ + suffixInflection('ㅂㄷㅣㄴㄷㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅂㄷㅣㄴㄷㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅅㅡㅂㄷㅣㄴㄷㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅅㅡㅂㄷㅣㄴㄷㅏ', '', [], ['p', 'f']), + suffixInflection('ㅂㄷㅣㄴㄷㅏ', '', [], ['eusi']) + ] + }, + { + name: '-(스)ㅂ죠', + rules: [ + suffixInflection('ㅂㅈㅛ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅂㅈㅛ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅅㅡㅂㅈㅛ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅅㅡㅂㅈㅛ', '', [], ['p', 'f']), + suffixInflection('ㅂㅈㅛ', '', [], ['eusi']) + ] + }, + { + name: '-(스)ㅂ지요', + rules: [ + suffixInflection('ㅂㅈㅣㅇㅛ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅂㅈㅣㅇㅛ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅅㅡㅂㅈㅣㅇㅛ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅅㅡㅂㅈㅣㅇㅛ', '', [], ['p', 'f']), + suffixInflection('ㅂㅈㅣㅇㅛ', '', [], ['eusi']) + ] + }, + { + name: '-(으)시-', + rules: [ + suffixInflection('ㅅㅣ', 'ㄷㅏ', ['eusi'], ['v', 'adj', 'ida']), + suffixInflection('ㅇㅡㅅㅣ', 'ㄷㅏ', ['eusi'], ['v', 'adj']), + suffixInflection('ㅇㅜㅅㅣ', 'ㅂㄷㅏ', ['eusi'], ['v', 'adj']), + suffixInflection('ㅇㅡㅅㅣ', 'ㅅㄷㅏ', ['eusi'], ['v', 'adj']), + suffixInflection('ㅅㅣ', 'ㅎㄷㅏ', ['eusi'], ['adj']), + suffixInflection('ㅅㅣ', 'ㄹㄷㅏ', ['eusi'], ['v', 'adj']), + suffixInflection('ㄹㅇㅡㅅㅣ', 'ㄷㄷㅏ', ['eusi'], ['v', 'adj']), + suffixInflection('ㅅㅣ', '', ['eusi'], ['saob', 'euob', 'jaob']) + ] + }, + { + name: '-(으)시압', + rules: [ + suffixInflection('ㅅㅣㅇㅏㅂ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅅㅣㅇㅏㅂ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㅅㅣㅇㅏㅂ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㅅㅣㅇㅏㅂ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㅅㅣㅇㅏㅂ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㅅㅣㅇㅏㅂ', 'ㄷㄷㅏ', [], ['v']) + ] + }, + { + name: '-(으)시어요', + rules: [ + suffixInflection('ㅅㅣㅇㅓㅇㅛ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅇㅡㅅㅣㅇㅓㅇㅛ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㅅㅣㅇㅓㅇㅛ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㅅㅣㅇㅓㅇㅛ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅅㅣㅇㅓㅇㅛ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅅㅣㅇㅓㅇㅛ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅇㅡㅅㅣㅇㅓㅇㅛ', 'ㄷㄷㅏ', [], ['v', 'adj']) + ] + }, + { + name: '-(으)십사', + rules: [ + suffixInflection('ㅅㅣㅂㅅㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅅㅣㅂㅅㅏ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㅅㅣㅂㅅㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㅅㅣㅂㅅㅏ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㅅㅣㅂㅅㅏ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㅅㅣㅂㅅㅏ', 'ㄷㄷㅏ', [], ['v']) + ] + }, + { + name: '-(으)십시다', + rules: [ + suffixInflection('ㅅㅣㅂㅅㅣㄷㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅅㅣㅂㅅㅣㄷㅏ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㅅㅣㅂㅅㅣㄷㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㅅㅣㅂㅅㅣㄷㅏ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㅅㅣㅂㅅㅣㄷㅏ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㅅㅣㅂㅅㅣㄷㅏ', 'ㄷㄷㅏ', [], ['v']) + ] + }, + { + name: '-(으)십시오', + rules: [ + suffixInflection('ㅅㅣㅂㅅㅣㅇㅗ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅅㅣㅂㅅㅣㅇㅗ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㅅㅣㅂㅅㅣㅇㅗ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㅅㅣㅂㅅㅣㅇㅗ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㅅㅣㅂㅅㅣㅇㅗ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㅅㅣㅂㅅㅣㅇㅗ', 'ㄷㄷㅏ', [], ['v']) + ] + }, + { + name: '-아/어', + rules: [ + suffixInflection('ㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅓ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅓ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅕ', 'ㅣㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅕ', 'ㅇㅣㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅐ', 'ㅏㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅎㅏㅇㅕ', 'ㅎㅏㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅗㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㅓ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅓ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅐ', 'ㅏㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅐ', 'ㅓㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅖ', 'ㅕㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅒ', 'ㅑㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅇㅓ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄹㅏ', 'ㄹㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄹㅓ', 'ㄹㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅡㄹㅓ', 'ㄹㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅏ', 'ㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅓ', 'ㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅏ', 'ㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅓ', 'ㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅓ', '', [], ['p', 'f']) + ] + }, + { + name: '-아/어다', + rules: [ + suffixInflection('ㅏㄷㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅓㄷㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅏㄷㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅓㄷㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅕㄷㅏ', 'ㅣㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅕㄷㅏ', 'ㅇㅣㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅐㄷㅏ', 'ㅏㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅎㅏㅇㅕㄷㅏ', 'ㅎㅏㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅗㅏㄷㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㅓㄷㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅏㄷㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅓㄷㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅐㄷㅏ', 'ㅏㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅐㄷㅏ', 'ㅓㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅖㄷㅏ', 'ㅕㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅒㄷㅏ', 'ㅑㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅏㄷㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅇㅓㄷㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄹㅏㄷㅏ', 'ㄹㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄹㅓㄷㅏ', 'ㄹㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅡㄹㅓㄷㅏ', 'ㄹㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅏㄷㅏ', 'ㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅓㄷㅏ', 'ㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅏㄷㅏ', 'ㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅓㄷㅏ', 'ㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅓㄷㅏ', '', [], ['p', 'f']) + ] + }, + { + name: '-아/어다가', + rules: [ + suffixInflection('ㅏㄷㅏㄱㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅓㄷㅏㄱㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅏㄷㅏㄱㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅓㄷㅏㄱㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄷㅏㄱㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅏㄷㅏㄱㅏ', 'ㅏㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅓㄷㅏㄱㅏ', 'ㅓㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅕㄷㅏㄱㅏ', 'ㅣㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅕㄷㅏㄱㅏ', 'ㅇㅣㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅐㄷㅏㄱㅏ', 'ㅏㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅎㅏㅇㅕㄷㅏㄱㅏ', 'ㅎㅏㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅗㅏㄷㅏㄱㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㅓㄷㅏㄱㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅏㄷㅏㄱㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅓㄷㅏㄱㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅐㄷㅏㄱㅏ', 'ㅏㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅐㄷㅏㄱㅏ', 'ㅓㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅖㄷㅏㄱㅏ', 'ㅕㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅒㄷㅏㄱㅏ', 'ㅑㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅏㄷㅏㄱㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅇㅓㄷㅏㄱㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄹㅏㄷㅏㄱㅏ', 'ㄹㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄹㅓㄷㅏㄱㅏ', 'ㄹㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅡㄹㅓㄷㅏㄱㅏ', 'ㄹㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅏㄷㅏㄱㅏ', 'ㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅓㄷㅏㄱㅏ', 'ㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅏㄷㅏㄱㅏ', 'ㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅓㄷㅏㄱㅏ', 'ㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅓㄷㅏㄱㅏ', '', [], ['p', 'f']) + ] + }, + { + name: '-아/어도', + rules: [ + suffixInflection('ㅏㄷㅗ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅓㄷㅗ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅏㄷㅗ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅓㄷㅗ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅏㄷㅗ', 'ㅏㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅓㄷㅗ', 'ㅓㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄷㅗ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅕㄷㅗ', 'ㅣㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅕㄷㅗ', 'ㅇㅣㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅐㄷㅗ', 'ㅏㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅎㅏㅇㅕㄷㅗ', 'ㅎㅏㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅗㅏㄷㅗ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㅓㄷㅗ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅏㄷㅗ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅓㄷㅗ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅐㄷㅗ', 'ㅏㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅐㄷㅗ', 'ㅓㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅖㄷㅗ', 'ㅕㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅒㄷㅗ', 'ㅑㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅏㄷㅗ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅇㅓㄷㅗ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄹㅏㄷㅗ', 'ㄹㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄹㅓㄷㅗ', 'ㄹㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅡㄹㅓㄷㅗ', 'ㄹㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅏㄷㅗ', 'ㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅓㄷㅗ', 'ㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅏㄷㅗ', 'ㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅓㄷㅗ', 'ㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅓㄷㅗ', '', [], ['p', 'f']) + ] + }, + { + name: '-아/어라', + rules: [ + suffixInflection('ㅏㄹㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅓㄹㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅏㄹㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅓㄹㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅏㄹㅏ', 'ㅏㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅓㄹㅏ', 'ㅓㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅕㄹㅏ', 'ㅣㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅕㄹㅏ', 'ㅇㅣㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅐㄹㅏ', 'ㅏㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅎㅏㅇㅕㄹㅏ', 'ㅎㅏㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅗㅏㄹㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㅓㄹㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅏㄹㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅓㄹㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅐㄹㅏ', 'ㅏㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅐㄹㅏ', 'ㅓㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅖㄹㅏ', 'ㅕㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅒㄹㅏ', 'ㅑㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅏㄹㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅇㅓㄹㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄹㅏㄹㅏ', 'ㄹㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄹㅓㄹㅏ', 'ㄹㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅡㄹㅓㄹㅏ', 'ㄹㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅏㄹㅏ', 'ㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅓㄹㅏ', 'ㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅏㄹㅏ', 'ㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅓㄹㅏ', 'ㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅓㄹㅏ', '', [], ['p', 'f']) + ] + }, + { + name: '-아/아서', + rules: [ + suffixInflection('ㅏㅅㅓ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅓㅅㅓ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅏㅅㅓ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅓㅅㅓ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅏㅅㅓ', 'ㅏㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅓㅅㅓ', 'ㅓㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅅㅓ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅕㅅㅓ', 'ㅣㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅕㅅㅓ', 'ㅇㅣㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅐㅅㅓ', 'ㅏㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅎㅏㅇㅕㅅㅓ', 'ㅎㅏㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅗㅏㅅㅓ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㅓㅅㅓ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅏㅅㅓ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅓㅅㅓ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅐㅅㅓ', 'ㅏㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅐㅅㅓ', 'ㅓㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅖㅅㅓ', 'ㅕㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅒㅅㅓ', 'ㅑㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅏㅅㅓ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅇㅓㅅㅓ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄹㅏㅅㅓ', 'ㄹㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄹㅓㅅㅓ', 'ㄹㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅡㄹㅓㅅㅓ', 'ㄹㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅏㅅㅓ', 'ㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅓㅅㅓ', 'ㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅏㅅㅓ', 'ㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅓㅅㅓ', 'ㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅓㅅㅓ', '', [], ['p', 'f']) + ] + }, + { + name: '-아/어야', + rules: [ + suffixInflection('ㅏㅇㅑ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅓㅇㅑ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅏㅇㅑ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅓㅇㅑ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅏㅇㅑ', 'ㅏㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅓㅇㅑ', 'ㅓㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅑ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅕㅇㅑ', 'ㅣㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅕㅇㅑ', 'ㅇㅣㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅐㅇㅑ', 'ㅏㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅎㅏㅇㅕㅇㅑ', 'ㅎㅏㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅗㅏㅇㅑ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㅓㅇㅑ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅏㅇㅑ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅓㅇㅑ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅐㅇㅑ', 'ㅏㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅐㅇㅑ', 'ㅓㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅖㅇㅑ', 'ㅕㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅒㅇㅑ', 'ㅑㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅏㅇㅑ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅇㅓㅇㅑ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄹㅏㅇㅑ', 'ㄹㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄹㅓㅇㅑ', 'ㄹㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅡㄹㅓㅇㅑ', 'ㄹㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅏㅇㅑ', 'ㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅓㅇㅑ', 'ㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅏㅇㅑ', 'ㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅓㅇㅑ', 'ㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅓㅇㅑ', '', [], ['p', 'f']) + ] + }, + { + name: '-아/어야겠', + rules: [ + suffixInflection('ㅏㅇㅑㄱㅔㅆ', 'ㄷㅏ', ['f'], ['v', 'adj']), + suffixInflection('ㅓㅇㅑㄱㅔㅆ', 'ㄷㅏ', ['f'], ['v', 'adj']), + suffixInflection('ㅇㅏㅇㅑㄱㅔㅆ', 'ㄷㅏ', ['f'], ['v', 'adj']), + suffixInflection('ㅇㅓㅇㅑㄱㅔㅆ', 'ㄷㅏ', ['f'], ['v', 'adj']), + suffixInflection('ㅏㅇㅑㄱㅔㅆ', 'ㅏㄷㅏ', ['f'], ['v', 'adj']), + suffixInflection('ㅓㅇㅑㄱㅔㅆ', 'ㅓㄷㅏ', ['f'], ['v', 'adj']), + suffixInflection('ㅇㅑㄱㅔㅆ', 'ㄷㅏ', ['f'], ['v', 'adj', 'ida']), + suffixInflection('ㅕㅇㅑㄱㅔㅆ', 'ㅣㄷㅏ', ['f'], ['v', 'adj']), + suffixInflection('ㅇㅕㅇㅑㄱㅔㅆ', 'ㅇㅣㄷㅏ', ['f'], ['v', 'adj']), + suffixInflection('ㅐㅇㅑㄱㅔㅆ', 'ㅏㄷㅏ', ['f'], ['v', 'adj']), + suffixInflection('ㅎㅏㅇㅕㅇㅑㄱㅔㅆ', 'ㅎㅏㄷㅏ', ['f'], ['v', 'adj']), + suffixInflection('ㅇㅗㅏㅇㅑㄱㅔㅆ', 'ㅂㄷㅏ', ['f'], ['v', 'adj']), + suffixInflection('ㅇㅜㅓㅇㅑㄱㅔㅆ', 'ㅂㄷㅏ', ['f'], ['v', 'adj']), + suffixInflection('ㅇㅏㅇㅑㄱㅔㅆ', 'ㅅㄷㅏ', ['f'], ['v', 'adj']), + suffixInflection('ㅇㅓㅇㅑㄱㅔㅆ', 'ㅅㄷㅏ', ['f'], ['v', 'adj']), + suffixInflection('ㅐㅇㅑㄱㅔㅆ', 'ㅏㅎㄷㅏ', ['f'], ['adj']), + suffixInflection('ㅐㅇㅑㄱㅔㅆ', 'ㅓㅎㄷㅏ', ['f'], ['adj']), + suffixInflection('ㅖㅇㅑㄱㅔㅆ', 'ㅕㅎㄷㅏ', ['f'], ['adj']), + suffixInflection('ㅒㅇㅑㄱㅔㅆ', 'ㅑㅎㄷㅏ', ['f'], ['adj']), + suffixInflection('ㄹㅇㅏㅇㅑㄱㅔㅆ', 'ㄷㄷㅏ', ['f'], ['v', 'adj']), + suffixInflection('ㄹㅇㅓㅇㅑㄱㅔㅆ', 'ㄷㄷㅏ', ['f'], ['v', 'adj']), + suffixInflection('ㄹㄹㅏㅇㅑㄱㅔㅆ', 'ㄹㅡㄷㅏ', ['f'], ['v', 'adj']), + suffixInflection('ㄹㄹㅓㅇㅑㄱㅔㅆ', 'ㄹㅡㄷㅏ', ['f'], ['v', 'adj']), + suffixInflection('ㄹㅡㄹㅓㅇㅑㄱㅔㅆ', 'ㄹㅡㄷㅏ', ['f'], ['v', 'adj']), + suffixInflection('ㅏㅇㅑㄱㅔㅆ', 'ㅡㄷㅏ', ['f'], ['v', 'adj']), + suffixInflection('ㅓㅇㅑㄱㅔㅆ', 'ㅡㄷㅏ', ['f'], ['v', 'adj']), + suffixInflection('ㅏㅇㅑㄱㅔㅆ', 'ㅡㄷㅏ', ['f'], ['v', 'adj']), + suffixInflection('ㅓㅇㅑㄱㅔㅆ', 'ㅡㄷㅏ', ['f'], ['v', 'adj']) + ] + }, + { + name: '-아/어야만', + rules: [ + suffixInflection('ㅏㅇㅑㅁㅏㄴ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅓㅇㅑㅁㅏㄴ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅏㅇㅑㅁㅏㄴ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅓㅇㅑㅁㅏㄴ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅏㅇㅑㅁㅏㄴ', 'ㅏㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅓㅇㅑㅁㅏㄴ', 'ㅓㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅑㅁㅏㄴ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅕㅇㅑㅁㅏㄴ', 'ㅣㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅕㅇㅑㅁㅏㄴ', 'ㅇㅣㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅐㅇㅑㅁㅏㄴ', 'ㅏㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅎㅏㅇㅕㅇㅑㅁㅏㄴ', 'ㅎㅏㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅗㅏㅇㅑㅁㅏㄴ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㅓㅇㅑㅁㅏㄴ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅏㅇㅑㅁㅏㄴ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅓㅇㅑㅁㅏㄴ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅐㅇㅑㅁㅏㄴ', 'ㅏㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅐㅇㅑㅁㅏㄴ', 'ㅓㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅖㅇㅑㅁㅏㄴ', 'ㅕㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅒㅇㅑㅁㅏㄴ', 'ㅑㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅏㅇㅑㅁㅏㄴ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅇㅓㅇㅑㅁㅏㄴ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄹㅏㅇㅑㅁㅏㄴ', 'ㄹㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄹㅓㅇㅑㅁㅏㄴ', 'ㄹㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅡㄹㅓㅇㅑㅁㅏㄴ', 'ㄹㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅏㅇㅑㅁㅏㄴ', 'ㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅓㅇㅑㅁㅏㄴ', 'ㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅏㅇㅑㅁㅏㄴ', 'ㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅓㅇㅑㅁㅏㄴ', 'ㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅓㅇㅑㅁㅏㄴ', '', [], ['p', 'f']) + ] + }, + { + name: '-아/어야지', + rules: [ + suffixInflection('ㅏㅇㅑㅈㅣ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅓㅇㅑㅈㅣ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅏㅇㅑㅈㅣ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅓㅇㅑㅈㅣ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅏㅇㅑㅈㅣ', 'ㅏㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅓㅇㅑㅈㅣ', 'ㅓㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅑㅈㅣ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅕㅇㅑㅈㅣ', 'ㅣㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅕㅇㅑㅈㅣ', 'ㅇㅣㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅐㅇㅑㅈㅣ', 'ㅏㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅎㅏㅇㅕㅇㅑㅈㅣ', 'ㅎㅏㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅗㅏㅇㅑㅈㅣ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㅓㅇㅑㅈㅣ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅏㅇㅑㅈㅣ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅓㅇㅑㅈㅣ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅐㅇㅑㅈㅣ', 'ㅏㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅐㅇㅑㅈㅣ', 'ㅓㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅖㅇㅑㅈㅣ', 'ㅕㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅒㅇㅑㅈㅣ', 'ㅑㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅏㅇㅑㅈㅣ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅇㅓㅇㅑㅈㅣ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄹㅏㅇㅑㅈㅣ', 'ㄹㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄹㅓㅇㅑㅈㅣ', 'ㄹㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅡㄹㅓㅇㅑㅈㅣ', 'ㄹㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅏㅇㅑㅈㅣ', 'ㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅓㅇㅑㅈㅣ', 'ㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅏㅇㅑㅈㅣ', 'ㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅓㅇㅑㅈㅣ', 'ㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅓㅇㅑㅈㅣ', '', [], ['p', 'f']) + ] + }, + { + name: '-아/어요', + rules: [ + suffixInflection('ㅏㅇㅛ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅓㅇㅛ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅏㅇㅛ', 'ㅏㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅓㅇㅛ', 'ㅓㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅏㅇㅛ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅓㅇㅛ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅛ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅕㅇㅛ', 'ㅣㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅕㅇㅛ', 'ㅇㅣㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅐㅇㅛ', 'ㅏㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅎㅏㅇㅕㅇㅛ', 'ㅎㅏㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅗㅏㅇㅛ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㅓㅇㅛ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅏㅇㅛ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅓㅇㅛ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅐㅇㅛ', 'ㅏㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅐㅇㅛ', 'ㅓㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅖㅇㅛ', 'ㅕㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅒㅇㅛ', 'ㅑㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅏㅇㅛ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅇㅓㅇㅛ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄹㅏㅇㅛ', 'ㄹㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄹㅓㅇㅛ', 'ㄹㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅡㄹㅓㅇㅛ', 'ㄹㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅏㅇㅛ', 'ㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅓㅇㅛ', 'ㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅏㅇㅛ', 'ㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅓㅇㅛ', 'ㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅔㅇㅛ', 'ㄷㅏ', [], ['adj', 'ida']), + suffixInflection('ㅇㅓㅇㅛ', '', [], ['p', 'f']) + ] + }, + { + name: '-아/어지이다', + rules: [ + suffixInflection('ㅏㅈㅣㅇㅣㄷㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅓㅈㅣㅇㅣㄷㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅏㅈㅣㅇㅣㄷㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅓㅈㅣㅇㅣㄷㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅏㅈㅣㅇㅣㄷㅏ', 'ㅏㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅓㅈㅣㅇㅣㄷㅏ', 'ㅓㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅕㅈㅣㅇㅣㄷㅏ', 'ㅣㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅕㅈㅣㅇㅣㄷㅏ', 'ㅇㅣㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅐㅈㅣㅇㅣㄷㅏ', 'ㅏㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅎㅏㅇㅕㅈㅣㅇㅣㄷㅏ', 'ㅎㅏㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅗㅏㅈㅣㅇㅣㄷㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㅓㅈㅣㅇㅣㄷㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅏㅈㅣㅇㅣㄷㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅓㅈㅣㅇㅣㄷㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅐㅈㅣㅇㅣㄷㅏ', 'ㅏㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅐㅈㅣㅇㅣㄷㅏ', 'ㅓㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅖㅈㅣㅇㅣㄷㅏ', 'ㅕㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅒㅈㅣㅇㅣㄷㅏ', 'ㅑㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅏㅈㅣㅇㅣㄷㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅇㅓㅈㅣㅇㅣㄷㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄹㅏㅈㅣㅇㅣㄷㅏ', 'ㄹㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄹㅓㅈㅣㅇㅣㄷㅏ', 'ㄹㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅡㄹㅓㅈㅣㅇㅣㄷㅏ', 'ㄹㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅏㅈㅣㅇㅣㄷㅏ', 'ㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅓㅈㅣㅇㅣㄷㅏ', 'ㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅏㅈㅣㅇㅣㄷㅏ', 'ㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅓㅈㅣㅇㅣㄷㅏ', 'ㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅓㅈㅣㅇㅣㄷㅏ', '', [], ['p', 'f']) + ] + }, + { + name: '-았/었', + rules: [ + suffixInflection('ㅆ', 'ㄷㅏ', ['p'], ['v', 'adj']), + suffixInflection('ㅏㅆ', 'ㄷㅏ', ['p'], ['v', 'adj']), + suffixInflection('ㅇㅏㅆ', 'ㄷㅏ', ['p'], ['v', 'adj']), + suffixInflection('ㅏㅆ', 'ㅏㄷㅏ', ['p'], ['v', 'adj']), + suffixInflection('ㅓㅆ', 'ㄷㅏ', ['p'], ['v', 'adj']), + suffixInflection('ㅇㅓㅆ', 'ㄷㅏ', ['p'], ['v', 'adj', 'ida']), + suffixInflection('ㅓㅆ', 'ㅓㄷㅏ', ['p'], ['v', 'adj']), + suffixInflection('ㅕㅆ', 'ㅣㄷㅏ', ['p'], ['v', 'adj']), + suffixInflection('ㅇㅕㅆ', 'ㅇㅣㄷㅏ', ['p'], ['v', 'adj', 'ida']), + suffixInflection('ㅐㅆ', 'ㅏㄷㅏ', ['p'], ['v', 'adj']), + suffixInflection('ㅎㅏㅇㅕㅆ', 'ㅎㅏㄷㅏ', ['p'], ['v', 'adj']), + suffixInflection('ㅇㅗㅏㅆ', 'ㅂㄷㅏ', ['p'], ['v', 'adj']), + suffixInflection('ㅇㅜㅓㅆ', 'ㅂㄷㅏ', ['p'], ['v', 'adj']), + suffixInflection('ㅇㅏㅆ', 'ㅅㄷㅏ', ['p'], ['v', 'adj']), + suffixInflection('ㅇㅓㅆ', 'ㅅㄷㅏ', ['p'], ['v', 'adj']), + suffixInflection('ㅐㅆ', 'ㅏㅎㄷㅏ', ['p'], ['adj']), + suffixInflection('ㅐㅆ', 'ㅓㅎㄷㅏ', ['p'], ['adj']), + suffixInflection('ㅖㅆ', 'ㅕㅎㄷㅏ', ['p'], ['adj']), + suffixInflection('ㅒㅆ', 'ㅑㅎㄷㅏ', ['p'], ['adj']), + suffixInflection('ㄹㅇㅏㅆ', 'ㄷㄷㅏ', ['p'], ['v', 'adj']), + suffixInflection('ㄹㅇㅓㅆ', 'ㄷㄷㅏ', ['p'], ['v', 'adj']), + suffixInflection('ㄹㄹㅏㅆ', 'ㄹㅡㄷㅏ', ['p'], ['v', 'adj']), + suffixInflection('ㄹㄹㅓㅆ', 'ㄹㅡㄷㅏ', ['p'], ['v', 'adj']), + suffixInflection('ㄹㅡㄹㅓㅆ', 'ㄹㅡㄷㅏ', ['p'], ['v', 'adj']), + suffixInflection('ㅏㅆ', 'ㅡㄷㅏ', ['p'], ['v', 'adj']), + suffixInflection('ㅓㅆ', 'ㅡㄷㅏ', ['p'], ['v', 'adj']), + suffixInflection('ㅏㅆ', 'ㅡㄷㅏ', ['p'], ['v', 'adj']), + suffixInflection('ㅓㅆ', 'ㅡㄷㅏ', ['p'], ['v', 'adj']), + suffixInflection('ㅅㅕㅆ', 'ㅅㅣ', ['p'], ['eusi']), + suffixInflection('ㅅㅣㅇㅓㅆ', 'ㅅㅣ', ['p'], ['eusi']) + ] + }, + { + name: '-았/었었', + rules: [ + suffixInflection('ㅏㅆㅇㅓㅆ', 'ㄷㅏ', ['p'], ['v', 'adj']), + suffixInflection('ㅆㅇㅓㅆ', 'ㄷㅏ', ['p'], ['v', 'adj']), + suffixInflection('ㅇㅏㅆㅇㅓㅆ', 'ㄷㅏ', ['p'], ['v', 'adj']), + suffixInflection('ㅏㅆㅇㅓㅆ', 'ㅏㄷㅏ', ['p'], ['v', 'adj']), + suffixInflection('ㅓㅆㅇㅓㅆ', 'ㄷㅏ', ['p'], ['v', 'adj']), + suffixInflection('ㅇㅓㅆㅇㅓㅆ', 'ㄷㅏ', ['p'], ['v', 'adj']), + suffixInflection('ㅓㅆㅇㅓㅆ', 'ㅓㄷㅏ', ['p'], ['v', 'adj']), + suffixInflection('ㅕㅆㅇㅓㅆ', 'ㅣㄷㅏ', ['p'], ['v', 'adj']), + suffixInflection('ㅇㅕㅆㅇㅓㅆ', 'ㅇㅣㄷㅏ', ['p'], ['v', 'adj']), + suffixInflection('ㅐㅆㅇㅓㅆ', 'ㅏㄷㅏ', ['p'], ['v', 'adj']), + suffixInflection('ㅎㅏㅇㅕㅆㅇㅓㅆ', 'ㅎㅏㄷㅏ', ['p'], ['v', 'adj']), + suffixInflection('ㅇㅗㅏㅆㅇㅓㅆ', 'ㅂㄷㅏ', ['p'], ['v', 'adj']), + suffixInflection('ㅇㅜㅓㅆㅇㅓㅆ', 'ㅂㄷㅏ', ['p'], ['v', 'adj']), + suffixInflection('ㅇㅏㅆㅇㅓㅆ', 'ㅅㄷㅏ', ['p'], ['v', 'adj']), + suffixInflection('ㅇㅓㅆㅇㅓㅆ', 'ㅅㄷㅏ', ['p'], ['v', 'adj']), + suffixInflection('ㅐㅆㅇㅓㅆ', 'ㅏㅎㄷㅏ', ['p'], ['adj']), + suffixInflection('ㅐㅆㅇㅓㅆ', 'ㅓㅎㄷㅏ', ['p'], ['adj']), + suffixInflection('ㅖㅆㅇㅓㅆ', 'ㅕㅎㄷㅏ', ['p'], ['adj']), + suffixInflection('ㅒㅆㅇㅓㅆ', 'ㅑㅎㄷㅏ', ['p'], ['adj']), + suffixInflection('ㄹㅇㅏㅆㅇㅓㅆ', 'ㄷㄷㅏ', ['p'], ['v', 'adj']), + suffixInflection('ㄹㅇㅓㅆㅇㅓㅆ', 'ㄷㄷㅏ', ['p'], ['v', 'adj']), + suffixInflection('ㄹㄹㅏㅆㅇㅓㅆ', 'ㄹㅡㄷㅏ', ['p'], ['v', 'adj']), + suffixInflection('ㄹㄹㅓㅆㅇㅓㅆ', 'ㄹㅡㄷㅏ', ['p'], ['v', 'adj']), + suffixInflection('ㄹㅡㄹㅓㅆㅇㅓㅆ', 'ㄹㅡㄷㅏ', ['p'], ['v', 'adj']), + suffixInflection('ㅏㅆㅇㅓㅆ', 'ㅡㄷㅏ', ['p'], ['v', 'adj']), + suffixInflection('ㅓㅆㅇㅓㅆ', 'ㅡㄷㅏ', ['p'], ['v', 'adj']), + suffixInflection('ㅏㅆㅇㅓㅆ', 'ㅡㄷㅏ', ['p'], ['v', 'adj']), + suffixInflection('ㅓㅆㅇㅓㅆ', 'ㅡㄷㅏ', ['p'], ['v', 'adj']) + ] + }, + { + name: '-았/었자', + rules: [ + suffixInflection('ㅏㅆㅈㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅆㅈㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅏㅆㅈㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅏㅆㅈㅏ', 'ㅏㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅓㅆㅈㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅓㅆㅈㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅓㅆㅈㅏ', 'ㅓㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅕㅆㅈㅏ', 'ㅣㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅕㅆㅈㅏ', 'ㅇㅣㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅐㅆㅈㅏ', 'ㅏㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅎㅏㅇㅕㅆㅈㅏ', 'ㅎㅏㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅗㅏㅆㅈㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㅓㅆㅈㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅏㅆㅈㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅓㅆㅈㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅐㅆㅈㅏ', 'ㅏㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅐㅆㅈㅏ', 'ㅓㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅖㅆㅈㅏ', 'ㅕㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅒㅆㅈㅏ', 'ㅑㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅏㅆㅈㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅇㅓㅆㅈㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄹㅏㅆㅈㅏ', 'ㄹㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄹㅓㅆㅈㅏ', 'ㄹㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅡㄹㅓㅈㅏ', 'ㄹㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅏㅆㅈㅏ', 'ㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅓㅆㅈㅏ', 'ㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅏㅆㅈㅏ', 'ㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅓㅆㅈㅏ', 'ㅡㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅅㅕㅆㅈㅏ', 'ㅅㅣ', [], ['eusi']) + ] + }, + { + name: '-야', + rules: [ + suffixInflection('ㅇㅏㄴㅣㅇㅑ', '아니다', [], ['adj']), + suffixInflection('ㅇㅣㅇㅑ', '이다', [], ['ida']) + ] + }, + { + name: '-언마는', + rules: [ + suffixInflection('ㅇㅓㄴㅁㅏㄴㅡㄴ', '아니다', [], ['adj']), + suffixInflection('ㅇㅓㄴㅁㅏㄴㅡㄴ', '이다', [], ['ida']), + suffixInflection('ㅇㅓㄴㅁㅏㄴㅡㄴ', '', [], ['eusi']) + ] + }, + { + name: '-언만', + rules: [ + suffixInflection('ㅇㅓㄴㅁㅏㄴ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅇㅓㄴㅁㅏㄴ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-언정', + rules: [ + suffixInflection('ㅇㅓㄴㅈㅓㅇ', '아니다', [], ['adj']), + suffixInflection('ㅇㅓㄴㅈㅓㅇ', '이다', [], ['ida']), + suffixInflection('ㅇㅓㄴㅈㅓㅇ', '', [], ['eusi']) + ] + }, + { + name: '-에라', + rules: [ + suffixInflection('ㅇㅔㄹㅏ', '', [], ['p']) + ] + }, + { + name: '-(으)오-', + rules: [ + suffixInflection('ㅇㅗ', 'ㄷㅏ', ['euo'], ['v', 'adj']), + suffixInflection('ㅇㅡㅇㅗ', 'ㄷㅏ', ['euo'], ['v', 'adj']), + suffixInflection('ㅇㅜㅇㅗ', 'ㅂㄷㅏ', ['euo'], ['v', 'adj']), + suffixInflection('ㅇㅡㅇㅗ', 'ㅅㄷㅏ', ['euo'], ['v', 'adj']), + suffixInflection('ㅇㅗ', 'ㅎㄷㅏ', ['euo'], ['adj']), + suffixInflection('ㅇㅗ', 'ㄹㄷㅏ', ['euo'], ['v', 'adj']), + suffixInflection('ㄹㅇㅡㅇㅗ', 'ㄷㄷㅏ', ['euo'], ['v', 'adj']), + suffixInflection('ㅇㅗ', '', ['euo'], ['eusi']), + suffixInflection('ㅇㅡㅇㅗ', '', ['euo'], ['p', 'f']) + ] + }, + { + name: '-(으)오니까', + rules: [ + suffixInflection('ㅇㅗㄴㅣㄲㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㅇㅗㄴㅣㄲㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㅇㅗㄴㅣㄲㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㅇㅗㄴㅣㄲㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅗㄴㅣㄲㅏ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅇㅗㄴㅣㄲㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅇㅡㅇㅗㄴㅣㄲㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅗㄴㅣㄲㅏ', '', [], ['eusi']), + suffixInflection('ㅇㅡㅇㅗㄴㅣㄲㅏ', '', [], ['p', 'f']) + ] + }, + { + name: '-(으)오리이까', + rules: [ + suffixInflection('ㅇㅗㄹㅣㅇㅣㄲㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㅇㅗㄹㅣㅇㅣㄲㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㅇㅗㄹㅣㅇㅣㄲㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㅇㅗㄹㅣㅇㅣㄲㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅗㄹㅣㅇㅣㄲㅏ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅇㅗㄹㅣㅇㅣㄲㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅇㅡㅇㅗㄹㅣㅇㅣㄲㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅗㄹㅣㅇㅣㄲㅏ', '', [], ['eusi']) + ] + }, + { + name: '-(으)오리이다', + rules: [ + suffixInflection('ㅇㅗㄹㅣㅇㅣㄷㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㅇㅗㄹㅣㅇㅣㄷㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㅇㅗㄹㅣㅇㅣㄷㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㅇㅗㄹㅣㅇㅣㄷㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅗㄹㅣㅇㅣㄷㅏ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅇㅗㄹㅣㅇㅣㄷㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅇㅡㅇㅗㄹㅣㅇㅣㄷㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅗㄹㅣㅇㅣㄷㅏ', '', [], ['eusi']) + ] + }, + { + name: '-오이까', + rules: [ + suffixInflection('ㅇㅗㅇㅣㄲㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅇㅗㅇㅣㄲㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅗㅇㅣㄲㅏ', '', [], ['eusi']) + ] + }, + { + name: '-(으)오이다', + rules: [ + suffixInflection('ㅇㅗㅇㅣㄷㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㅇㅗㅇㅣㄷㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㅇㅗㅇㅣㄷㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㅇㅗㅇㅣㄷㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅗㅇㅣㄷㅏ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅇㅗㅇㅣㄷㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅇㅡㅇㅗㅇㅣㄷㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅗㅇㅣㄷㅏ', '', [], ['eusi']), + suffixInflection('ㅇㅡㅇㅗㅇㅣㄷㅏ', '', [], ['p', 'f']) + ] + }, + { + name: '-올습니다', + rules: [ + suffixInflection('ㅇㅏㄴㅣㅇㅗㄹㅅㅡㅂㄴㅣㄷㅏ', '아니다', [], ['adj']), + suffixInflection('ㅇㅣㅇㅗㄹㅅㅡㅂㄴㅣㄷㅏ', '이다', [], ['ida']) + ] + }, + { + name: '-올시다', + rules: [ + suffixInflection('ㅇㅏㄴㅣㅇㅗㄹㅅㅣㄷㅏ', '아니다', [], ['adj']), + suffixInflection('ㅇㅣㅇㅗㄹㅅㅣㄷㅏ', '이다', [], ['ida']) + ] + }, + { + name: '-(으)옵-', + rules: [ + suffixInflection('ㅇㅗㅂ', 'ㄷㅏ', ['euob'], ['v', 'adj', 'ida']), + suffixInflection('ㅇㅡㅇㅗㅂ', 'ㄷㅏ', ['euob'], ['v', 'adj']), + suffixInflection('ㅇㅜㅇㅗㅂ', 'ㅂㄷㅏ', ['euob'], ['v', 'adj']), + suffixInflection('ㅇㅡㅇㅗㅂ', 'ㅅㄷㅏ', ['euob'], ['v', 'adj']), + suffixInflection('ㅇㅗㅂ', 'ㅎㄷㅏ', ['euob'], ['adj']), + suffixInflection('ㅇㅗㅂ', 'ㄹㄷㅏ', ['euob'], ['v', 'adj']), + suffixInflection('ㄹㅇㅡㅇㅗㅂ', 'ㄷㄷㅏ', ['euob'], ['v', 'adj']), + suffixInflection('ㅇㅗㅂ', '', ['euob'], ['eusi']), + suffixInflection('ㅇㅡㅇㅗㅂ', '', ['euob'], ['p', 'f']) + ] + }, + { + name: '-(으)옵니까', + rules: [ + suffixInflection('ㅇㅗㅂㄴㅣㄲㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅇㅡㅇㅗㅂㄴㅣㄲㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㅇㅗㅂㄴㅣㄲㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㅇㅗㅂㄴㅣㄲㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅗㅂㄴㅣㄲㅏ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅇㅗㅂㄴㅣㄲㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅇㅡㅇㅗㅂㄴㅣㄲㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅗㅂㄴㅣㄲㅏ', '', [], ['eusi']), + suffixInflection('ㅇㅡㅇㅗㅂㄴㅣㄲㅏ', '', [], ['p', 'f']) + ] + }, + { + name: '-(으)옵니다', + rules: [ + suffixInflection('ㅇㅗㅂㄴㅣㄷㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅇㅡㅇㅗㅂㄴㅣㄷㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㅇㅗㅂㄴㅣㄷㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㅇㅗㅂㄴㅣㄷㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅗㅂㄴㅣㄷㅏ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅇㅗㅂㄴㅣㄷㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅇㅡㅇㅗㅂㄴㅣㄷㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅗㅂㄴㅣㄷㅏ', '', [], ['eusi']), + suffixInflection('ㅇㅡㅇㅗㅂㄴㅣㄷㅏ', '', [], ['p', 'f']) + ] + }, + { + name: '-(으)옵디까', + rules: [ + suffixInflection('ㅇㅗㅂㄷㅣㄲㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅇㅡㅇㅗㅂㄷㅣㄲㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㅇㅗㅂㄷㅣㄲㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㅇㅗㅂㄷㅣㄲㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅗㅂㄷㅣㄲㅏ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅇㅗㅂㄷㅣㄲㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅇㅡㅇㅗㅂㄷㅣㄲㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅗㅂㄷㅣㄲㅏ', '', [], ['eusi']), + suffixInflection('ㅇㅡㅇㅗㅂㄷㅣㄲㅏ', '', [], ['p', 'f']) + ] + }, + { + name: '-(으)옵디다', + rules: [ + suffixInflection('ㅇㅗㅂㄷㅣㄷㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅇㅡㅇㅗㅂㄷㅣㄷㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㅇㅗㅂㄷㅣㄷㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㅇㅗㅂㄷㅣㄷㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅗㅂㄷㅣㄷㅏ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅇㅗㅂㄷㅣㄷㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅇㅡㅇㅗㅂㄷㅣㄷㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅗㅂㄷㅣㄷㅏ', '', [], ['eusi']), + suffixInflection('ㅇㅡㅇㅗㅂㄷㅣㄷㅏ', '', [], ['p', 'f']) + ] + }, + { + name: '-(으)옵소서', + rules: [ + suffixInflection('ㅇㅗㅂㅅㅗㅅㅓ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅇㅡㅇㅗㅂㅅㅗㅅㅓ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㅇㅗㅂㅅㅗㅅㅓ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㅇㅗㅂㅅㅗㅅㅓ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅗㅂㅅㅗㅅㅓ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅇㅗㅂㅅㅗㅅㅓ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅇㅡㅇㅗㅂㅅㅗㅅㅓ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅗㅂㅅㅗㅅㅓ', '', [], ['eusi']), + suffixInflection('ㅇㅡㅇㅗㅂㅅㅗㅅㅓ', '', [], ['p', 'f']) + ] + }, + { + name: '-(으)와', + rules: [ + suffixInflection('ㅇㅗㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅇㅡㅇㅗㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㅇㅗㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㅇㅗㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅗㅏ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅇㅗㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅇㅡㅇㅗㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅗㅏ', '', [], ['eusi', 'euo', 'jao']), + suffixInflection('ㅇㅡㅇㅗㅏ', '', [], ['p', 'f']) + ] + }, + { + name: '-(으)외다', + rules: [ + suffixInflection('ㅇㅗㅣㄷㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅇㅡㅇㅗㅣㄷㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㅇㅗㅣㄷㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㅇㅗㅣㄷㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅗㅣㄷㅏ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅇㅗㅣㄷㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅇㅡㅇㅗㅣㄷㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅗㅣㄷㅏ', '', [], ['eusi']), + suffixInflection('ㅇㅡㅇㅗㅣㄷㅏ', '', [], ['p', 'f']) + ] + }, + { + name: '-요', + rules: [ + suffixInflection('ㅇㅏㄴㅣㅇㅛ', '아니다', [], ['ida']), + suffixInflection('ㅇㅛ', 'ㄷㅏ', [], ['ida']) + ] + }, + { + name: '-(으)우', + rules: [ + suffixInflection('ㅇㅜ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅇㅡㅇㅜ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㅇㅜ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㅇㅜ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㅇㅜ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅇㅡㅇㅜ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜ', '', [], ['eusi']), + suffixInflection('ㅇㅡㅇㅜ', '', [], ['p', 'f']) + ] + }, + { + name: '-(으)이', + rules: [ + suffixInflection('ㅇㅣ', 'ㄷㅏ', [], ['adj']), + suffixInflection('ㅇㅣ', 'ㄹㄷㅏ', [], ['adj']), + suffixInflection('ㅇㅡㅇㅣ', 'ㄷㅏ', [], ['adj']), + suffixInflection('ㅇㅡㅣ', 'ㄷㅏ', [], ['adj']) + ] + }, + { + name: '-(으)ㄴ들', + rules: [ + suffixInflection('ㄴㄷㅡㄹ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅇㅡㄴㄷㅡㄹ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄴㄷㅡㄹ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄴㄷㅡㄹ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄴㄷㅡㄹ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄴㄷㅡㄹ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅇㅡㄴㄷㅡㄹ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄴㄷㅡㄹ', '', [], ['eusi']) + ] + }, + { + name: '-(으)ㄴ즉', + rules: [ + suffixInflection('ㄴㅈㅡㄱ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅇㅡㄴㅈㅡㄱ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄴㅈㅡㄱ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄴㅈㅡㄱ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄴㅈㅡㄱ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄴㅈㅡㄱ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅇㅡㄴㅈㅡㄱ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄴㅈㅡㄱ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄴㅈㅡㄱ', '', [], ['p']) + ] + }, + { + name: '-(으)ㄴ즉슨', + rules: [ + suffixInflection('ㄴㅈㅡㄱㅅㅡㄴ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅇㅡㄴㅈㅡㄱㅅㅡㄴ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄴㅈㅡㄱㅅㅡㄴ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄴㅈㅡㄱㅅㅡㄴ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄴㅈㅡㄱㅅㅡㄴ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄴㅈㅡㄱㅅㅡㄴ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅇㅡㄴㅈㅡㄱㅅㅡㄴ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄴㅈㅡㄱㅅㅡㄴ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄴㅈㅡㄱㅅㅡㄴ', '', [], ['p']) + ] + }, + { + name: '-(으)ㄹ까', + rules: [ + suffixInflection('ㄹㄲㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㄲㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㄲㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㄲㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㄲㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄲㅏ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㄲㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄲㅏ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㄲㅏ', '', [], ['p']) + ] + }, + { + name: '-(으)ㄹ깝쇼', + rules: [ + suffixInflection('ㄹㄲㅏㅂㅅㅛ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㄲㅏㅂㅅㅛ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㄲㅏㅂㅅㅛ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㄲㅏㅂㅅㅛ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㄲㅏㅂㅅㅛ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄲㅏㅂㅅㅛ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㄲㅏㅂㅅㅛ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄲㅏㅂㅅㅛ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㄲㅏㅂㅅㅛ', '', [], ['p']) + ] + }, + { + name: '-(으)ㄹ꼬', + rules: [ + suffixInflection('ㄹㄲㅗ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㄲㅗ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㄲㅗ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㄲㅗ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㄲㅗ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄲㅗ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㄲㅗ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄲㅗ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㄲㅗ', '', [], ['p']) + ] + }, + { + name: '-(으)ㄹ는지', + rules: [ + suffixInflection('ㄹㄴㅡㄴㅈㅣ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㄴㅡㄴㅈㅣ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㄴㅡㄴㅈㅣ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㄴㅡㄴㅈㅣ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㄴㅡㄴㅈㅣ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄴㅡㄴㅈㅣ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㄴㅡㄴㅈㅣ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄴㅡㄴㅈㅣ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㄴㅡㄴㅈㅣ', '', [], ['p']) + ] + }, + { + name: '-(으)ㄹ데라니', + rules: [ + suffixInflection('ㄹㄷㅔㄹㅏㄴㅣ', 'ㄷㅏ', [], ['adj']), + suffixInflection('ㄹㄷㅔㄹㅏㄴㅣ', 'ㄹㄷㅏ', [], ['adj']), + suffixInflection('ㅇㅡㄹㄷㅔㄹㅏㄴㅣ', 'ㄷㅏ', [], ['adj']), + suffixInflection('ㅇㅜㄹㄷㅔㄹㅏㄴㅣ', 'ㅂㄷㅏ', [], ['adj']), + suffixInflection('ㅇㅡㄹㄷㅔㄹㅏㄴㅣ', 'ㅅㄷㅏ', [], ['adj']), + suffixInflection('ㄹㄷㅔㄹㅏㄴㅣ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㄷㅔㄹㅏㄴㅣ', 'ㄷㄷㅏ', [], ['adj']), + suffixInflection('ㄹㄷㅔㄹㅏㄴㅣ', '', [], ['eusi']) + ] + }, + { + name: '-(으)ㄹ라', + rules: [ + suffixInflection('ㄹㄹㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㄹㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㄹㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㄹㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㄹㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄹㅏ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㄹㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄹㅏ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㄹㅏ', '', [], ['p']) + ] + }, + { + name: '-(으)ㄹ라고', + rules: [ + suffixInflection('ㄹㄹㅏㄱㅗ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㄹㅏㄱㅗ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㄹㅏㄱㅗ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㄹㅏㄱㅗ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㄹㅏㄱㅗ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄹㅏㄱㅗ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㄹㅏㄱㅗ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄹㅏㄱㅗ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㄹㅏㄱㅗ', '', [], ['p']) + ] + }, + { + name: '-(으)ㄹ라치면', + rules: [ + suffixInflection('ㄹㄹㅏㅊㅣㅁㅕㄴ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄹㄹㅏㅊㅣㅁㅕㄴ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㄹㅏㅊㅣㅁㅕㄴ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㄹㄹㅏㅊㅣㅁㅕㄴ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㄹㅏㅊㅣㅁㅕㄴ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㄹㄹㅏㅊㅣㅁㅕㄴ', 'ㄷㄷㅏ', [], ['v']), + suffixInflection('ㄹㄹㅏㅊㅣㅁㅕㄴ', '', [], ['eusi']) + ] + }, + { + name: '-(으)ㄹ락', + rules: [ + suffixInflection('ㄹㄹㅏㄱ ㅁㅏㄹㄹㅏㄱ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄹㄹㅏㄱ ㅁㅏㄹㄹㅏㄱ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㄹㅏㄱ ㅁㅏㄹㄹㅏㄱ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㄹㄹㅏㄱ ㅁㅏㄹㄹㅏㄱ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㄹㅏㄱ ㅁㅏㄹㄹㅏㄱ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㄹㄹㅏㄱ ㅁㅏㄹㄹㅏㄱ', 'ㄷㄷㅏ', [], ['v']), + suffixInflection('ㄹㄹㅏㄱ ㅁㅏㄹㄹㅏㄱ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㄹㅏㄱ ㅁㅏㄹㄹㅏㄱ', '', [], ['p']) + ] + }, + { + name: '-(으)ㄹ래', + rules: [ + suffixInflection('ㄹㄹㅐ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄹㄹㅐ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㄹㅐ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㄹㄹㅐ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㄹㅐ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㄹㄹㅐ', 'ㄷㄷㅏ', [], ['v']), + suffixInflection('ㄹㄹㅐ', '', [], ['eusi']) + ] + }, + { + name: '-(으)ㄹ러니', + rules: [ + suffixInflection('ㄹㄹㅓㄴㅣ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㄹㅓㄴㅣ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㄹㅓㄴㅣ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㄹㅓㄴㅣ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㄹㅓㄴㅣ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄹㅓㄴㅣ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㄹㅓㄴㅣ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄹㅓㄴㅣ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㄹㅓㄴㅣ', '', [], ['p']) + ] + }, + { + name: '-(으)ㄹ러라', + rules: [ + suffixInflection('ㄹㄹㅓㄹㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㄹㅓㄹㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㄹㅓㄹㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㄹㅓㄹㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㄹㅓㄹㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄹㅓㄹㅏ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㄹㅓㄹㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄹㅓㄹㅏ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㄹㅓㄹㅏ', '', [], ['p']) + ] + }, + { + name: '-(으)ㄹ런가', + rules: [ + suffixInflection('ㄹㄹㅓㄴㄱㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㄹㅓㄴㄱㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㄹㅓㄴㄱㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㄹㅓㄴㄱㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㄹㅓㄴㄱㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄹㅓㄴㄱㅏ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㄹㅓㄴㄱㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄹㅓㄴㄱㅏ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㄹㅓㄴㄱㅏ', '', [], ['p']) + ] + }, + { + name: '-(으)ㄹ런고', + rules: [ + suffixInflection('ㄹㄹㅓㄴㄱㅗ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㄹㅓㄴㄱㅗ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㄹㅓㄴㄱㅗ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㄹㅓㄴㄱㅗ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㄹㅓㄴㄱㅗ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄹㅓㄴㄱㅗ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㄹㅓㄴㄱㅗ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄹㅓㄴㄱㅗ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㄹㅓㄴㄱㅗ', '', [], ['p']) + ] + }, + { + name: '-(으)ㄹ런지', + rules: [ + suffixInflection('ㄹㄹㅓㄴㅈㅣ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㄹㅓㄴㅈㅣ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㄹㅓㄴㅈㅣ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㄹㅓㄴㅈㅣ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㄹㅓㄴㅈㅣ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄹㅓㄴㅈㅣ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㄹㅓㄴㅈㅣ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄹㅓㄴㅈㅣ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㄹㅓㄴㅈㅣ', '', [], ['p']) + ] + }, + { + name: '-(으)ㄹ레', + rules: [ + suffixInflection('ㄹㄹㅔ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㄹㅔ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㄹㅔ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㄹㅔ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㄹㅔ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄹㅔ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㄹㅔ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄹㅔ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㄹㅔ', '', [], ['p']) + ] + }, + { + name: '-(으)ㄹ레라', + rules: [ + suffixInflection('ㄹㄹㅔㄹㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㄹㅔㄹㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㄹㅔㄹㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㄹㅔㄹㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㄹㅔㄹㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄹㅔㄹㅏ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㄹㅔㄹㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㄹㅔㄹㅏ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㄹㅔㄹㅏ', '', [], ['p']) + ] + }, + { + name: '-(으)ㄹ려고', + rules: [ + suffixInflection('ㄹㄹㅕㄱㅗ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄹㄹㅕㄱㅗ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㄹㅕㄱㅗ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㄹㄹㅕㄱㅗ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㄹㅕㄱㅗ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㄹㄹㅕㄱㅗ', 'ㄷㄷㅏ', [], ['v']), + suffixInflection('ㄹㄹㅕㄱㅗ', '', [], ['eusi']) + ] + }, + { + name: '-(으)ㄹ망정', + rules: [ + suffixInflection('ㄹㅁㅏㅇㅈㅓㅇ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㅁㅏㅇㅈㅓㅇ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅁㅏㅇㅈㅓㅇ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㅁㅏㅇㅈㅓㅇ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅁㅏㅇㅈㅓㅇ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅁㅏㅇㅈㅓㅇ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㅁㅏㅇㅈㅓㅇ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅁㅏㅇㅈㅓㅇ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㅁㅏㅇㅈㅓㅇ', '', [], ['p']) + ] + }, + { + name: '-(으)ㄹ밖에', + rules: [ + suffixInflection('ㄹㅂㅏㄲㅇㅔ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㅂㅏㄲㅇㅔ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅂㅏㄲㅇㅔ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㅂㅏㄲㅇㅔ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅂㅏㄲㅇㅔ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅂㅏㄲㅇㅔ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㅂㅏㄲㅇㅔ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅂㅏㄲㅇㅔ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㅂㅏㄲㅇㅔ', '', [], ['p']) + ] + }, + { + name: '-(으)ㄹ뿐더러', + rules: [ + suffixInflection('ㄹㅃㅜㄴㄷㅓㄹㅓ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㅃㅜㄴㄷㅓㄹㅓ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅃㅜㄴㄷㅓㄹㅓ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㅃㅜㄴㄷㅓㄹㅓ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅃㅜㄴㄷㅓㄹㅓ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅃㅜㄴㄷㅓㄹㅓ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㅃㅜㄴㄷㅓㄹㅓ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅃㅜㄴㄷㅓㄹㅓ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㅃㅜㄴㄷㅓㄹㅓ', '', [], ['p']) + ] + }, + { + name: '-(으)ㄹ사', + rules: [ + suffixInflection('ㄹㅅㅏ', 'ㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅅㅏ', 'ㄹㄷㅏ', [], ['adj']), + suffixInflection('ㅇㅡㄹㅅㅏ', 'ㄷㅏ', [], ['adj']), + suffixInflection('ㅇㅜㄹㅅㅏ', 'ㅂㄷㅏ', [], ['adj']), + suffixInflection('ㅇㅡㄹㅅㅏ', 'ㅅㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅅㅏ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㅅㅏ', 'ㄷㄷㅏ', [], ['adj']) + ] + }, + { + name: '-(으)ㄹ새', + rules: [ + suffixInflection('ㄹㅅㅐ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㅅㅐ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅅㅐ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㅅㅐ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅅㅐ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅅㅐ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㅅㅐ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅅㅐ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㅅㅐ', '', [], ['p']) + ] + }, + { + name: '-(으)ㄹ세', + rules: [ + suffixInflection('ㄹㅅㅔ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㅅㅔ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅅㅔ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㅅㅔ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅅㅔ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅅㅔ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㅅㅔ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅅㅔ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㅅㅔ', '', [], ['p']) + ] + }, + { + name: '-(으)ㄹ세라', + rules: [ + suffixInflection('ㄹㅅㅔㄹㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㅅㅔㄹㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅅㅔㄹㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㅅㅔㄹㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅅㅔㄹㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅅㅔㄹㅏ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㅅㅔㄹㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅅㅔㄹㅏ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㅅㅔㄹㅏ', '', [], ['p']) + ] + }, + { + name: '-(으)ㄹ세말이지', + rules: [ + suffixInflection('ㄹㅅㅔㅁㅏㄹㅇㅣㅈㅣ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㅅㅔㅁㅏㄹㅇㅣㅈㅣ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅅㅔㅁㅏㄹㅇㅣㅈㅣ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㅅㅔㅁㅏㄹㅇㅣㅈㅣ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅅㅔㅁㅏㄹㅇㅣㅈㅣ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅅㅔㅁㅏㄹㅇㅣㅈㅣ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㅅㅔㅁㅏㄹㅇㅣㅈㅣ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅅㅔㅁㅏㄹㅇㅣㅈㅣ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㅅㅔㅁㅏㄹㅇㅣㅈㅣ', '', [], ['p']) + ] + }, + { + name: '-(으)ㄹ소냐', + rules: [ + suffixInflection('ㄹㅅㅗㄴㅑ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㅅㅗㄴㅑ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅅㅗㄴㅑ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㅅㅗㄴㅑ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅅㅗㄴㅑ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅅㅗㄴㅑ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㅅㅗㄴㅑ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅅㅗㄴㅑ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㅅㅗㄴㅑ', '', [], ['p']) + ] + }, + { + name: '-(으)ㄹ손가', + rules: [ + suffixInflection('ㄹㅅㅗㄴㄱㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㅅㅗㄴㄱㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅅㅗㄴㄱㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㅅㅗㄴㄱㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅅㅗㄴㄱㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅅㅗㄴㄱㅏ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㅅㅗㄴㄱㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅅㅗㄴㄱㅏ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㅅㅗㄴㄱㅏ', '', [], ['p']) + ] + }, + { + name: '-(으)ㄹ수록', + rules: [ + suffixInflection('ㄹㅅㅜㄹㅗㄱ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㅅㅜㄹㅗㄱ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅅㅜㄹㅗㄱ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㅅㅜㄹㅗㄱ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅅㅜㄹㅗㄱ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅅㅜㄹㅗㄱ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㅅㅜㄹㅗㄱ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅅㅜㄹㅗㄱ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㅅㅜㄹㅗㄱ', '', [], ['p']) + ] + }, + { + name: '-(으)ㄹ시', + rules: [ + suffixInflection('ㄹㅅㅣ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㅅㅣ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅅㅣ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㅅㅣ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅅㅣ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅅㅣ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㅅㅣ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅅㅣ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㅅㅣ', '', [], ['p']) + ] + }, + { + name: '-(으)ㄹ시고', + rules: [ + suffixInflection('ㄹㅅㅣㄱㅗ', 'ㄷㅏ', [], ['adj', 'ida']), + suffixInflection('ㄹㅅㅣㄱㅗ', 'ㄹㄷㅏ', [], ['adj']), + suffixInflection('ㅇㅡㄹㅅㅣㄱㅗ', 'ㄷㅏ', [], ['adj']), + suffixInflection('ㅇㅜㄹㅅㅣㄱㅗ', 'ㅂㄷㅏ', [], ['adj']), + suffixInflection('ㅇㅡㄹㅅㅣㄱㅗ', 'ㅅㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅅㅣㄱㅗ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㅅㅣㄱㅗ', 'ㄷㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅅㅣㄱㅗ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㅅㅣㄱㅗ', '', [], ['p']) + ] + }, + { + name: '-(으)ㄹ싸록', + rules: [ + suffixInflection('ㄹㅆㅏㄹㅗㄱ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㅆㅏㄹㅗㄱ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅆㅏㄹㅗㄱ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㅆㅏㄹㅗㄱ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅆㅏㄹㅗㄱ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅆㅏㄹㅗㄱ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㅆㅏㄹㅗㄱ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅆㅏㄹㅗㄱ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㅆㅏㄹㅗㄱ', '', [], ['p']) + ] + }, + { + name: '-(으)ㄹ쏘냐', + rules: [ + suffixInflection('ㄹㅆㅗㄴㅑ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㅆㅗㄴㅑ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅆㅗㄴㅑ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㅆㅗㄴㅑ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅆㅗㄴㅑ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅆㅗㄴㅑ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㅆㅗㄴㅑ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅆㅗㄴㅑ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㅆㅗㄴㅑ', '', [], ['p']) + ] + }, + { + name: '-(으)ㄹ쏜가', + rules: [ + suffixInflection('ㄹㅆㅗㄴㄱㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㅆㅗㄴㄱㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅆㅗㄴㄱㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㅆㅗㄴㄱㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅆㅗㄴㄱㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅆㅗㄴㄱㅏ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㅆㅗㄴㄱㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅆㅗㄴㄱㅏ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㅆㅗㄴㄱㅏ', '', [], ['p']) + ] + }, + { + name: '-(으)ㄹ이만큼', + rules: [ + suffixInflection('ㄹㅇㅣㅁㅏㄴㅋㅡㅁ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㅇㅣㅁㅏㄴㅋㅡㅁ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅇㅣㅁㅏㄴㅋㅡㅁ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㅇㅣㅁㅏㄴㅋㅡㅁ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅇㅣㅁㅏㄴㅋㅡㅁ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅇㅣㅁㅏㄴㅋㅡㅁ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㅇㅣㅁㅏㄴㅋㅡㅁ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅇㅣㅁㅏㄴㅋㅡㅁ', '', [], ['eusi', 'euo']), + suffixInflection('ㅇㅡㄹㅇㅣㅁㅏㄴㅋㅡㅁ', '', [], ['p']) + ] + }, + { + name: '-(으)ㄹ작시면', + rules: [ + suffixInflection('ㄹㅈㅏㄱㅅㅣㅁㅕㄴ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄹㅈㅏㄱㅅㅣㅁㅕㄴ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅈㅏㄱㅅㅣㅁㅕㄴ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㄹㅈㅏㄱㅅㅣㅁㅕㄴ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅈㅏㄱㅅㅣㅁㅕㄴ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㄹㅈㅏㄱㅅㅣㅁㅕㄴ', 'ㄷㄷㅏ', [], ['v']), + suffixInflection('ㄹㅈㅏㄱㅅㅣㅁㅕㄴ', '', [], ['eusi']) + ] + }, + { + name: '-(으)ㄹ지', + rules: [ + suffixInflection('ㄹㅈㅣ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㅈㅣ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅈㅣ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㅈㅣ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅈㅣ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅈㅣ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㅈㅣ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅈㅣ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㅈㅣ', '', [], ['p']) + ] + }, + { + name: '-(으)ㄹ지나', + rules: [ + suffixInflection('ㄹㅈㅣㄴㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㅈㅣㄴㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅈㅣㄴㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㅈㅣㄴㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅈㅣㄴㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅈㅣㄴㅏ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㅈㅣㄴㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅈㅣㄴㅏ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㅈㅣㄴㅏ', '', [], ['p']) + ] + }, + { + name: '-(으)ㄹ지니', + rules: [ + suffixInflection('ㄹㅈㅣㄴㅣ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㅈㅣㄴㅣ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅈㅣㄴㅣ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㅈㅣㄴㅣ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅈㅣㄴㅣ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅈㅣㄴㅣ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㅈㅣㄴㅣ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅈㅣㄴㅣ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㅈㅣㄴㅣ', '', [], ['p']) + ] + }, + { + name: '-(으)ㄹ지니라', + rules: [ + suffixInflection('ㄹㅈㅣㄴㅣㄹㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㅈㅣㄴㅣㄹㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅈㅣㄴㅣㄹㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㅈㅣㄴㅣㄹㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅈㅣㄴㅣㄹㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅈㅣㄴㅣㄹㅏ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㅈㅣㄴㅣㄹㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅈㅣㄴㅣㄹㅏ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㅈㅣㄴㅣㄹㅏ', '', [], ['p']) + ] + }, + { + name: '-(으)ㄹ지라', + rules: [ + suffixInflection('ㄹㅈㅣㄹㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㅈㅣㄹㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅈㅣㄹㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㅈㅣㄹㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅈㅣㄹㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅈㅣㄹㅏ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㅈㅣㄹㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅈㅣㄹㅏ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㅈㅣㄹㅏ', '', [], ['p']) + ] + }, + { + name: '-(으)ㄹ지라도', + rules: [ + suffixInflection('ㄹㅈㅣㄹㅏㄷㅗ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㅈㅣㄹㅏㄷㅗ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅈㅣㄹㅏㄷㅗ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㅈㅣㄹㅏㄷㅗ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅈㅣㄹㅏㄷㅗ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅈㅣㄹㅏㄷㅗ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㅈㅣㄹㅏㄷㅗ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅈㅣㄹㅏㄷㅗ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㅈㅣㄹㅏㄷㅗ', '', [], ['p']) + ] + }, + { + name: '-(으)ㄹ지로다', + rules: [ + suffixInflection('ㄹㅈㅣㄹㅗㄷㅏ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㅈㅣㄹㅗㄷㅏ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅈㅣㄹㅗㄷㅏ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㅈㅣㄹㅗㄷㅏ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅈㅣㄹㅗㄷㅏ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅈㅣㄹㅗㄷㅏ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㅈㅣㄹㅗㄷㅏ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅈㅣㄹㅗㄷㅏ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㅈㅣㄹㅗㄷㅏ', '', [], ['p']) + ] + }, + { + name: '-(으)ㄹ지며', + rules: [ + suffixInflection('ㄹㅈㅣㅁㅕ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㅈㅣㅁㅕ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅈㅣㅁㅕ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㅈㅣㅁㅕ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅈㅣㅁㅕ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅈㅣㅁㅕ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㅈㅣㅁㅕ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅈㅣㅁㅕ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㅈㅣㅁㅕ', '', [], ['p']) + ] + }, + { + name: '-(으)ㄹ지어다', + rules: [ + suffixInflection('ㄹㅈㅣㅇㅓㄷㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄹㅈㅣㅇㅓㄷㅏ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅈㅣㅇㅓㄷㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㄹㅈㅣㅇㅓㄷㅏ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㄹㅈㅣㅇㅓㄷㅏ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㄹㅈㅣㅇㅓㄷㅏ', 'ㄷㄷㅏ', [], ['v']), + suffixInflection('ㄹㅈㅣㅇㅓㄷㅏ', '', [], ['eusi']) + ] + }, + { + name: '-(으)ㄹ지언정', + rules: [ + suffixInflection('ㄹㅈㅣㅇㅓㄴㅈㅓㅇ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㅈㅣㅇㅓㄴㅈㅓㅇ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅈㅣㅇㅓㄴㅈㅓㅇ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㅈㅣㅇㅓㄴㅈㅓㅇ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅈㅣㅇㅓㄴㅈㅓㅇ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅈㅣㅇㅓㄴㅈㅓㅇ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㅈㅣㅇㅓㄴㅈㅓㅇ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅈㅣㅇㅓㄴㅈㅓㅇ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㅈㅣㅇㅓㄴㅈㅓㅇ', '', [], ['p']) + ] + }, + { + name: '-(으)ㄹ진대', + rules: [ + suffixInflection('ㄹㅈㅣㄴㄷㅐ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㅈㅣㄴㄷㅐ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅈㅣㄴㄷㅐ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㅈㅣㄴㄷㅐ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅈㅣㄴㄷㅐ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅈㅣㄴㄷㅐ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㅈㅣㄴㄷㅐ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅈㅣㄴㄷㅐ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㅈㅣㄴㄷㅐ', '', [], ['p']) + ] + }, + { + name: '-(으)ㄹ진대는', + rules: [ + suffixInflection('ㄹㅈㅣㄴㄷㅐㄴㅡㄴ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㅈㅣㄴㄷㅐㄴㅡㄴ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅈㅣㄴㄷㅐㄴㅡㄴ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㅈㅣㄴㄷㅐㄴㅡㄴ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅈㅣㄴㄷㅐㄴㅡㄴ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅈㅣㄴㄷㅐㄴㅡㄴ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㅈㅣㄴㄷㅐㄴㅡㄴ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅈㅣㄴㄷㅐㄴㅡㄴ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㅈㅣㄴㄷㅐㄴㅡㄴ', '', [], ['p']) + ] + }, + { + name: '-(으)ㄹ진댄', + rules: [ + suffixInflection('ㄹㅈㅣㄴㄷㅐㄴ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㅈㅣㄴㄷㅐㄴ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅈㅣㄴㄷㅐㄴ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㅈㅣㄴㄷㅐㄴ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅈㅣㄴㄷㅐㄴ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅈㅣㄴㄷㅐㄴ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㅈㅣㄴㄷㅐㄴ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅈㅣㄴㄷㅐㄴ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㅈㅣㄴㄷㅐㄴ', '', [], ['p']) + ] + }, + { + name: '-(으)ㄹ진저', + rules: [ + suffixInflection('ㄹㅈㅣㄴㅈㅓ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㅈㅣㄴㅈㅓ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅈㅣㄴㅈㅓ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㄹㅈㅣㄴㅈㅓ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㄹㅈㅣㄴㅈㅓ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅈㅣㄴㅈㅓ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㄹㅈㅣㄴㅈㅓ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㄹㅈㅣㄴㅈㅓ', '', [], ['eusi']), + suffixInflection('ㅇㅡㄹㅈㅣㄴㅈㅓ', '', [], ['p']) + ] + }, + { + name: '-(으)ㅁ', + rules: [ + suffixInflection('ㅁ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㅁ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㅁ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㅁ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㅁ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅁ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㅁ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅁ', '', [], ['eusi']), + suffixInflection('ㅇㅡㅁ', '', [], ['p', 'f']) + ] + }, + { + name: '-(으)ㅁ세', + rules: [ + suffixInflection('ㅁㅅㅔ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㄹㅁㅅㅔ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㅁㅅㅔ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㅁㅅㅔ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㅁㅅㅔ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㅁㅅㅔ', 'ㄷㄷㅏ', [], ['v']) + ] + }, + { + name: '-(으)ㅁ도', + rules: [ + suffixInflection('ㅁㄷㅗ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㅁㄷㅗ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㅁㄷㅗ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㅁㄷㅗ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㅁㄷㅗ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅁㄷㅗ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㅁㄷㅗ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅁㄷㅗ', '', [], ['eusi']), + suffixInflection('ㅇㅡㅁㄷㅗ', '', [], ['p', 'f']) + ] + }, + { + name: '-(으)ㅁ에랴', + rules: [ + suffixInflection('ㅁㅇㅔㄹㅑ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㄹㅁㅇㅔㄹㅑ', 'ㄹㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㅁㅇㅔㄹㅑ', 'ㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅜㅁㅇㅔㄹㅑ', 'ㅂㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅇㅡㅁㅇㅔㄹㅑ', 'ㅅㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅁㅇㅔㄹㅑ', 'ㅎㄷㅏ', [], ['adj']), + suffixInflection('ㄹㅇㅡㅁㅇㅔㄹㅑ', 'ㄷㄷㅏ', [], ['v', 'adj']), + suffixInflection('ㅁㅇㅔㄹㅑ', '', [], ['eusi']), + suffixInflection('ㅇㅡㅁㅇㅔㄹㅑ', '', [], ['p', 'f']) + ] + }, + { + name: '-(으)ㅂ쇼', + rules: [ + suffixInflection('ㅂㅅㅛ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅂㅅㅛ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㅂㅅㅛ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㅂㅅㅛ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㅂㅅㅛ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㅂㅅㅛ', 'ㄷㄷㅏ', [], ['v']) + ] + }, + { + name: '-(으)ㅂ시다', + rules: [ + suffixInflection('ㅂㅅㅣㄷㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅂㅅㅣㄷㅏ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㅂㅅㅣㄷㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㅂㅅㅣㄷㅏ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㅂㅅㅣㄷㅏ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㅂㅅㅣㄷㅏ', 'ㄷㄷㅏ', [], ['v']) + ] + }, + { + name: '-(으)ㅂ시다', + rules: [ + suffixInflection('ㅂㅅㅣㅅㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅂㅅㅣㅅㅏ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㅂㅅㅣㅅㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㅂㅅㅣㅅㅏ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㅂㅅㅣㅅㅏ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㅂㅅㅣㅅㅏ', 'ㄷㄷㅏ', [], ['v']), + suffixInflection('ㅂㅅㅣㅅㅏ', '', [], ['eusi']) + ] + }, + { + name: '-(으)ㅂ시오', + rules: [ + suffixInflection('ㅂㅅㅣㅇㅗ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅂㅅㅣㅇㅗ', 'ㄹㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㅂㅅㅣㅇㅗ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅇㅜㅂㅅㅣㅇㅗ', 'ㅂㄷㅏ', [], ['v']), + suffixInflection('ㅇㅡㅂㅅㅣㅇㅗ', 'ㅅㄷㅏ', [], ['v']), + suffixInflection('ㄹㅇㅡㅂㅅㅣㅇㅗ', 'ㄷㄷㅏ', [], ['v']) + ] + }, + { + name: '-자', + rules: [ + suffixInflection('ㅈㅏ', 'ㄷㅏ', [], ['v', 'ida']) + ] + }, + { + name: '-자고', + rules: [ + suffixInflection('ㅈㅏㄱㅗ', 'ㄷㅏ', [], ['v']) + ] + }, + { + name: '-자구', + rules: [ + suffixInflection('ㅈㅏㄱㅜ', 'ㄷㅏ', [], ['v']) + ] + }, + { + name: '-자꾸나', + rules: [ + suffixInflection('ㅈㅏㄲㅜㄴㅏ', 'ㄷㅏ', [], ['v']) + ] + }, + { + name: '-자느니', + rules: [ + suffixInflection('ㅈㅏㄴㅡㄴㅣ', 'ㄷㅏ', [], ['v']) + ] + }, + { + name: '-자니까', + rules: [ + suffixInflection('ㅈㅏㄴㅣㄲㅏ', 'ㄷㅏ', [], ['v']) + ] + }, + { + name: '-자마자', + rules: [ + suffixInflection('ㅈㅏㅁㅏㅈㅏ', 'ㄷㅏ', [], ['v']), + suffixInflection('ㅈㅏㅁㅏㅈㅏ', '', [], ['eusi']) + ] + }, + { + name: '-자며', + rules: [ + suffixInflection('ㅈㅏㅁㅕ', 'ㄷㅏ', [], ['v']) + ] + }, + { + name: '-자면', + rules: [ + suffixInflection('ㅈㅏㅁㅕㄴ', 'ㄷㅏ', [], ['v']) + ] + }, + { + name: '-자면서', + rules: [ + suffixInflection('ㅈㅏㅁㅕㄴㅅㅓ', 'ㄷㅏ', [], ['v']) + ] + }, + { + name: '-자손', + rules: [ + suffixInflection('ㅈㅏㅅㅗㄴ', 'ㄷㅏ', [], ['v']) + ] + }, + { + name: '-자오-', + rules: [ + suffixInflection('ㅈㅏㅇㅗ', 'ㄷㅏ', ['jao'], ['v']) + ] + }, + { + name: '-자옵-', + rules: [ + suffixInflection('ㅈㅏㅇㅗㅂ', 'ㄷㅏ', ['jaob'], ['v']) + ] + }, + { + name: '-잡-', + rules: [ + suffixInflection('ㅈㅏㅂ', 'ㄷㅏ', ['jab'], ['v']) + ] + }, + { + name: '-죠', + rules: [ + suffixInflection('ㅈㅛ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅈㅛ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-지', + rules: [ + suffixInflection('ㅈㅣ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅈㅣ', '', [], ['p', 'f', 'eusi']) + ] + }, + { + name: '-지마는', + rules: [ + suffixInflection('ㅈㅣㅁㅏㄴㅡㄴ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅈㅣㅁㅏㄴㅡㄴ', '', [], ['p', 'f']) + ] + }, + { + name: '-지만', + rules: [ + suffixInflection('ㅈㅣㅁㅏㄴ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅈㅣㅁㅏㄴ', '', [], ['p', 'f', 'euo', 'euob']) + ] + }, + { + name: '-지만서도', + rules: [ + suffixInflection('ㅈㅣㅁㅏㄴㅅㅓㄷㅗ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅈㅣㅁㅏㄴㅅㅓㄷㅗ', '', [], ['p', 'f']) + ] + }, + { + name: '-지요', rules: [ - suffixInflection('ㄱㅓㄴㅏ', 'ㄷㅏ', [], ['v', 'adj']), - suffixInflection('ㄱㅓㄴㅏ', '', [], ['p', 'f', 'euob', 'eusi']), - suffixInflection('ㅇㅣㄱㅓㄴㅏ', 'ㅇㅣㄷㅏ', [], []) + suffixInflection('ㅈㅣㅇㅛ', 'ㄷㅏ', [], ['v', 'adj', 'ida']), + suffixInflection('ㅈㅣㅇㅛ', '', [], ['p', 'f', 'eusi']) ] } ] diff --git a/ext/js/language/language-descriptors.js b/ext/js/language/language-descriptors.js index 09fde3029e..339b654c84 100644 --- a/ext/js/language/language-descriptors.js +++ b/ext/js/language/language-descriptors.js @@ -140,7 +140,7 @@ const languageDescriptors = [ { iso: 'ko', name: 'Korean', - exampleText: '읽다', + exampleText: '읽어', textPreprocessors: { disassembleHangul }, diff --git a/ext/js/language/translator.js b/ext/js/language/translator.js index b7960f8128..2204808c3c 100644 --- a/ext/js/language/translator.js +++ b/ext/js/language/translator.js @@ -17,7 +17,6 @@ */ import {applyTextReplacement} from '../general/regex-util.js'; -import {TextSourceMap} from '../general/text-source-map.js'; import {isCodePointJapanese} from './ja/japanese.js'; import {LanguageTransformer} from './language-transformer.js'; import {getAllLanguageTextProcessors} from './languages.js'; @@ -455,31 +454,29 @@ export class Translator { const deinflections = []; const used = new Set(); - for (const preprocessorVariant of this._generateArrayVariants(preprocessorVariantSpace)) { - const textReplacements = /** @type {import('translation').FindTermsTextReplacement[] | null} */ (preprocessorVariant.get('textReplacements')); + for ( + let source = text, i = text.length; + i > 0; + i = this._getNextSubstringLength(options.searchResolution, i, source) + ) { + for (const preprocessorVariant of this._generateArrayVariants(preprocessorVariantSpace)) { + source = text.substring(0, i); - let text2 = text; - const sourceMap = new TextSourceMap(text2); + const rawSource = source; - if (textReplacements !== null) { - text2 = this._applyTextReplacements(text2, sourceMap, textReplacements); - } + const textReplacements = /** @type {import('translation').FindTermsTextReplacement[] | null} */ (preprocessorVariant.get('textReplacements')); + if (textReplacements !== null) { + source = this._applyTextReplacements(source, textReplacements); + } - for (const preprocessor of textPreprocessors.values()) { - const {id, textProcessor} = preprocessor; - const setting = preprocessorVariant.get(id); - text2 = textProcessor.process(text2, setting, sourceMap); - } + for (const preprocessor of textPreprocessors.values()) { + const {id, textProcessor} = preprocessor; + const setting = preprocessorVariant.get(id); + source = textProcessor.process(source, setting); + } - for ( - let source = text2, i = text2.length; - i > 0; - i = this._getNextSubstringLength(options.searchResolution, i, source) - ) { - source = text2.substring(0, i); - if (used.has(source)) { break; } + if (used.has(source)) { continue; } used.add(source); - const rawSource = sourceMap.source.substring(0, sourceMap.getSourceLength(i)); for (const deinflection of this._multiLanguageTransformer.transform(language, source)) { const {trace, conditions} = deinflection; for (const postprocessorVariant of this._generateArrayVariants(postprocessorOptionsSpace)) { @@ -487,7 +484,7 @@ export class Translator { for (const postprocessor of textPostprocessors.values()) { const {id, textProcessor} = postprocessor; const setting = postprocessorVariant.get(id); - transformedText = textProcessor.process(transformedText, setting, sourceMap); + transformedText = textProcessor.process(transformedText, setting); } /** @type {import('dictionary').InflectionRuleChainCandidate} */ @@ -519,13 +516,12 @@ export class Translator { /** * @param {string} text - * @param {TextSourceMap} sourceMap * @param {import('translation').FindTermsTextReplacement[]} replacements * @returns {string} */ - _applyTextReplacements(text, sourceMap, replacements) { + _applyTextReplacements(text, replacements) { for (const {pattern, replacement} of replacements) { - text = applyTextReplacement(text, sourceMap, pattern, replacement); + text = applyTextReplacement(text, pattern, replacement); } return text; } diff --git a/test/data/anki-note-builder-test-results.json b/test/data/anki-note-builder-test-results.json index 4eeb9f8e46..601f5fd9c4 100644 --- a/test/data/anki-note-builder-test-results.json +++ b/test/data/anki-note-builder-test-results.json @@ -2485,8 +2485,8 @@ "audio": "", "clipboard-image": "", "clipboard-text": "", - "cloze-body": "打", - "cloze-body-kana": "だ", + "cloze-body": "打(う)", + "cloze-body-kana": "だ(う)", "cloze-prefix": "cloze-prefix", "cloze-suffix": "cloze-suffix", "conjugation": "", @@ -2513,8 +2513,8 @@ "screenshot": "", "search-query": "fullQuery", "selection-text": "", - "sentence": "cloze-prefix打cloze-suffix", - "sentence-furigana": "cloze-prefix打cloze-suffix", + "sentence": "cloze-prefix打(う)cloze-suffix", + "sentence-furigana": "cloze-prefix打(う)cloze-suffix", "tags": "n", "url": "url:" }, @@ -2522,8 +2522,8 @@ "audio": "", "clipboard-image": "", "clipboard-text": "", - "cloze-body": "打", - "cloze-body-kana": "ダース", + "cloze-body": "打(う)", + "cloze-body-kana": "ダース(う)", "cloze-prefix": "cloze-prefix", "cloze-suffix": "cloze-suffix", "conjugation": "", @@ -2550,8 +2550,8 @@ "screenshot": "", "search-query": "fullQuery", "selection-text": "", - "sentence": "cloze-prefix打cloze-suffix", - "sentence-furigana": "cloze-prefix打cloze-suffix", + "sentence": "cloze-prefix打(う)cloze-suffix", + "sentence-furigana": "cloze-prefix打(う)cloze-suffix", "tags": "abbr, n", "url": "url:" } @@ -2712,8 +2712,8 @@ "audio": "", "clipboard-image": "", "clipboard-text": "", - "cloze-body": "(打)(ち)", - "cloze-body-kana": "(打)(ち)", + "cloze-body": "(打)(ち)(", + "cloze-body-kana": "(打)(ち)(", "cloze-prefix": "cloze-prefix", "cloze-suffix": "cloze-suffix", "conjugation": "masu stem", @@ -2740,8 +2740,8 @@ "screenshot": "", "search-query": "fullQuery", "selection-text": "", - "sentence": "cloze-prefix(打)(ち)cloze-suffix", - "sentence-furigana": "cloze-prefix(打)(ち)cloze-suffix", + "sentence": "cloze-prefix(打)(ち)(cloze-suffix", + "sentence-furigana": "cloze-prefix(打)(ち)(cloze-suffix", "tags": "vt", "url": "url:" }, @@ -2749,8 +2749,8 @@ "audio": "", "clipboard-image": "", "clipboard-text": "", - "cloze-body": "(打)(ち)", - "cloze-body-kana": "(打)(ち)", + "cloze-body": "(打)(ち)(", + "cloze-body-kana": "(打)(ち)(", "cloze-prefix": "cloze-prefix", "cloze-suffix": "cloze-suffix", "conjugation": "masu stem", @@ -2777,8 +2777,8 @@ "screenshot": "", "search-query": "fullQuery", "selection-text": "", - "sentence": "cloze-prefix(打)(ち)cloze-suffix", - "sentence-furigana": "cloze-prefix(打)(ち)cloze-suffix", + "sentence": "cloze-prefix(打)(ち)(cloze-suffix", + "sentence-furigana": "cloze-prefix(打)(ち)(cloze-suffix", "tags": "vt", "url": "url:" }, @@ -2786,8 +2786,8 @@ "audio": "", "clipboard-image": "", "clipboard-text": "", - "cloze-body": "(打)(ち)", - "cloze-body-kana": "(打)(ち)", + "cloze-body": "(打)(ち)(", + "cloze-body-kana": "(打)(ち)(", "cloze-prefix": "cloze-prefix", "cloze-suffix": "cloze-suffix", "conjugation": "masu stem", @@ -2814,8 +2814,8 @@ "screenshot": "", "search-query": "fullQuery", "selection-text": "", - "sentence": "cloze-prefix(打)(ち)cloze-suffix", - "sentence-furigana": "cloze-prefix(打)(ち)cloze-suffix", + "sentence": "cloze-prefix(打)(ち)(cloze-suffix", + "sentence-furigana": "cloze-prefix(打)(ち)(cloze-suffix", "tags": "vt", "url": "url:" }, @@ -2823,8 +2823,8 @@ "audio": "", "clipboard-image": "", "clipboard-text": "", - "cloze-body": "(打)(ち)", - "cloze-body-kana": "(打)(ち)", + "cloze-body": "(打)(ち)(", + "cloze-body-kana": "(打)(ち)(", "cloze-prefix": "cloze-prefix", "cloze-suffix": "cloze-suffix", "conjugation": "masu stem", @@ -2851,8 +2851,8 @@ "screenshot": "", "search-query": "fullQuery", "selection-text": "", - "sentence": "cloze-prefix(打)(ち)cloze-suffix", - "sentence-furigana": "cloze-prefix(打)(ち)cloze-suffix", + "sentence": "cloze-prefix(打)(ち)(cloze-suffix", + "sentence-furigana": "cloze-prefix(打)(ち)(cloze-suffix", "tags": "vt", "url": "url:" }, @@ -2860,8 +2860,8 @@ "audio": "", "clipboard-image": "", "clipboard-text": "", - "cloze-body": "(打)", - "cloze-body-kana": "(打)", + "cloze-body": "(打)(", + "cloze-body-kana": "(打)(", "cloze-prefix": "cloze-prefix", "cloze-suffix": "cloze-suffix", "conjugation": "", @@ -2888,8 +2888,8 @@ "screenshot": "", "search-query": "fullQuery", "selection-text": "", - "sentence": "cloze-prefix(打)cloze-suffix", - "sentence-furigana": "cloze-prefix(打)cloze-suffix", + "sentence": "cloze-prefix(打)(cloze-suffix", + "sentence-furigana": "cloze-prefix(打)(cloze-suffix", "tags": "n", "url": "url:" }, @@ -2897,8 +2897,8 @@ "audio": "", "clipboard-image": "", "clipboard-text": "", - "cloze-body": "(打)", - "cloze-body-kana": "(打)", + "cloze-body": "(打)(", + "cloze-body-kana": "(打)(", "cloze-prefix": "cloze-prefix", "cloze-suffix": "cloze-suffix", "conjugation": "", @@ -2925,8 +2925,8 @@ "screenshot": "", "search-query": "fullQuery", "selection-text": "", - "sentence": "cloze-prefix(打)cloze-suffix", - "sentence-furigana": "cloze-prefix(打)cloze-suffix", + "sentence": "cloze-prefix(打)(cloze-suffix", + "sentence-furigana": "cloze-prefix(打)(cloze-suffix", "tags": "abbr, n", "url": "url:" } @@ -3931,7 +3931,7 @@ "cloze-body-kana": "마시거나", "cloze-prefix": "cloze-prefix", "cloze-suffix": "cloze-suffix", - "conjugation": "거나", + "conjugation": "-거나", "dictionary": "Test Dictionary 2", "document-title": "title", "expression": "마시다", diff --git a/test/data/translator-test-results-note-data1.json b/test/data/translator-test-results-note-data1.json index 06613c95c6..5abc31122c 100644 --- a/test/data/translator-test-results-note-data1.json +++ b/test/data/translator-test-results-note-data1.json @@ -22773,7 +22773,7 @@ "type": "term", "id": 1, "source": "打", - "rawSource": "打", + "rawSource": "打(う)", "sourceTerm": "打", "inflectionRuleChainCandidates": [ { @@ -23087,7 +23087,7 @@ "type": "term", "id": 2, "source": "打", - "rawSource": "打", + "rawSource": "打(う)", "sourceTerm": "打", "inflectionRuleChainCandidates": [ { @@ -25103,7 +25103,7 @@ "type": "term", "id": 3, "source": "打ち", - "rawSource": "(打)(ち)", + "rawSource": "(打)(ち)(", "sourceTerm": "打つ", "inflectionRuleChainCandidates": [ { @@ -25419,7 +25419,7 @@ "type": "term", "id": 5, "source": "打ち", - "rawSource": "(打)(ち)", + "rawSource": "(打)(ち)(", "sourceTerm": "打つ", "inflectionRuleChainCandidates": [ { @@ -25735,7 +25735,7 @@ "type": "term", "id": 4, "source": "打ち", - "rawSource": "(打)(ち)", + "rawSource": "(打)(ち)(", "sourceTerm": "打つ", "inflectionRuleChainCandidates": [ { @@ -26051,7 +26051,7 @@ "type": "term", "id": 6, "source": "打ち", - "rawSource": "(打)(ち)", + "rawSource": "(打)(ち)(", "sourceTerm": "打つ", "inflectionRuleChainCandidates": [ { @@ -26367,7 +26367,7 @@ "type": "term", "id": 1, "source": "打", - "rawSource": "(打)", + "rawSource": "(打)(", "sourceTerm": "打", "inflectionRuleChainCandidates": [ { @@ -26681,7 +26681,7 @@ "type": "term", "id": 2, "source": "打", - "rawSource": "(打)", + "rawSource": "(打)(", "sourceTerm": "打", "inflectionRuleChainCandidates": [ { @@ -32956,7 +32956,7 @@ { "source": "algorithm", "inflectionRules": [ - "거나" + "-거나" ] } ], diff --git a/test/data/translator-test-results.json b/test/data/translator-test-results.json index ba7b17d0f3..ef32a9519a 100644 --- a/test/data/translator-test-results.json +++ b/test/data/translator-test-results.json @@ -12912,7 +12912,7 @@ "reading": "だ", "sources": [ { - "originalText": "打", + "originalText": "打(う)", "transformedText": "打", "deinflectedText": "打", "matchType": "exact", @@ -13080,7 +13080,7 @@ "reading": "ダース", "sources": [ { - "originalText": "打", + "originalText": "打(う)", "transformedText": "打", "deinflectedText": "打", "matchType": "exact", @@ -14045,7 +14045,7 @@ "reading": "うつ", "sources": [ { - "originalText": "(打)(ち)", + "originalText": "(打)(ち)(", "transformedText": "打ち", "deinflectedText": "打つ", "matchType": "exact", @@ -14217,7 +14217,7 @@ "reading": "ぶつ", "sources": [ { - "originalText": "(打)(ち)", + "originalText": "(打)(ち)(", "transformedText": "打ち", "deinflectedText": "打つ", "matchType": "exact", @@ -14389,7 +14389,7 @@ "reading": "うつ", "sources": [ { - "originalText": "(打)(ち)", + "originalText": "(打)(ち)(", "transformedText": "打ち", "deinflectedText": "打つ", "matchType": "exact", @@ -14561,7 +14561,7 @@ "reading": "ぶつ", "sources": [ { - "originalText": "(打)(ち)", + "originalText": "(打)(ち)(", "transformedText": "打ち", "deinflectedText": "打つ", "matchType": "exact", @@ -14731,7 +14731,7 @@ "reading": "だ", "sources": [ { - "originalText": "(打)", + "originalText": "(打)(", "transformedText": "打", "deinflectedText": "打", "matchType": "exact", @@ -14899,7 +14899,7 @@ "reading": "ダース", "sources": [ { - "originalText": "(打)", + "originalText": "(打)(", "transformedText": "打", "deinflectedText": "打", "matchType": "exact", @@ -18616,7 +18616,7 @@ { "source": "algorithm", "inflectionRules": [ - "거나" + "-거나" ] } ], diff --git a/test/japanese-util.test.js b/test/japanese-util.test.js index 5f64a71479..bff51f85ad 100644 --- a/test/japanese-util.test.js +++ b/test/japanese-util.test.js @@ -17,7 +17,6 @@ */ import {describe, expect, test} from 'vitest'; -import {TextSourceMap} from '../ext/js/general/text-source-map.js'; import * as jpw from '../ext/js/language/ja/japanese-wanakana.js'; import * as jp from '../ext/js/language/ja/japanese.js'; @@ -194,54 +193,46 @@ describe('Japanese utility functions', () => { }); describe('convertHalfWidthKanaToFullWidth', () => { - /** @type {[string: string, expected: string, expectedSourceMapping?: number[]][]} */ + /** @type {[string: string, expected: string][]} */ const data = [ ['0123456789', '0123456789'], ['abcdefghij', 'abcdefghij'], ['カタカナ', 'カタカナ'], ['ひらがな', 'ひらがな'], - ['カキ', 'カキ', [1, 1]], - ['ガキ', 'ガキ', [2, 1]], - ['ニホン', 'ニホン', [1, 1, 1]], - ['ニッポン', 'ニッポン', [1, 1, 2, 1]] + ['カキ', 'カキ'], + ['ガキ', 'ガキ'], + ['ニホン', 'ニホン'], + ['ニッポン', 'ニッポン'] ]; - for (const [string, expected, expectedSourceMapping] of data) { - test(`${string} -> ${expected}${typeof expectedSourceMapping !== 'undefined' ? ', ' + JSON.stringify(expectedSourceMapping) : ''}`, () => { - const sourceMap = new TextSourceMap(string); - const actual1 = jp.convertHalfWidthKanaToFullWidth(string, null); - const actual2 = jp.convertHalfWidthKanaToFullWidth(string, sourceMap); + for (const [string, expected] of data) { + test(`${string} -> ${expected}`, () => { + const actual1 = jp.convertHalfWidthKanaToFullWidth(string); + const actual2 = jp.convertHalfWidthKanaToFullWidth(string); expect(actual1).toStrictEqual(expected); expect(actual2).toStrictEqual(expected); - if (typeof expectedSourceMapping !== 'undefined') { - expect(sourceMap.equals(new TextSourceMap(string, expectedSourceMapping))).toBe(true); - } }); } }); describe('convertAlphabeticToKana', () => { - /** @type {[string: string, expected: string, expectedSourceMapping?: number[]][]} */ + /** @type {[string: string, expected: string][]} */ const data = [ ['0123456789', '0123456789'], - ['abcdefghij', 'あbcでfgひj', [1, 1, 1, 2, 1, 1, 2, 1]], - ['ABCDEFGHIJ', 'あbcでfgひj', [1, 1, 1, 2, 1, 1, 2, 1]], // wanakana.toHiragana converts text to lower case + ['abcdefghij', 'あbcでfgひj'], + ['ABCDEFGHIJ', 'あbcでfgひj'], // wanakana.toHiragana converts text to lower case ['カタカナ', 'カタカナ'], ['ひらがな', 'ひらがな'], - ['chikara', 'ちから', [3, 2, 2]], - ['CHIKARA', 'ちから', [3, 2, 2]] + ['chikara', 'ちから'], + ['CHIKARA', 'ちから'] ]; - for (const [string, expected, expectedSourceMapping] of data) { - test(`${string} -> ${string}${typeof expectedSourceMapping !== 'undefined' ? ', ' + JSON.stringify(expectedSourceMapping) : ''}`, () => { - const sourceMap = new TextSourceMap(string); - const actual1 = jpw.convertAlphabeticToKana(string, null); - const actual2 = jpw.convertAlphabeticToKana(string, sourceMap); + for (const [string, expected] of data) { + test(`${string} -> ${string}`, () => { + const actual1 = jpw.convertAlphabeticToKana(string); + const actual2 = jpw.convertAlphabeticToKana(string); expect(actual1).toStrictEqual(expected); expect(actual2).toStrictEqual(expected); - if (typeof expectedSourceMapping !== 'undefined') { - expect(sourceMap.equals(new TextSourceMap(string, expectedSourceMapping))).toBe(true); - } }); } }); @@ -765,59 +756,54 @@ describe('Japanese utility functions', () => { }); describe('collapseEmphaticSequences', () => { - /** @type {[input: [text: string, fullCollapse: boolean], output: [expected: string, expectedSourceMapping: number[]]][]} */ + /** @type {[input: [text: string, fullCollapse: boolean], output: string][]} */ const data = [ - [['かこい', false], ['かこい', [1, 1, 1]]], - [['かこい', true], ['かこい', [1, 1, 1]]], - [['かっこい', false], ['かっこい', [1, 1, 1, 1]]], - [['かっこい', true], ['かこい', [2, 1, 1]]], - [['かっっこい', false], ['かっこい', [1, 2, 1, 1]]], - [['かっっこい', true], ['かこい', [3, 1, 1]]], - [['かっっっこい', false], ['かっこい', [1, 3, 1, 1]]], - [['かっっっこい', true], ['かこい', [4, 1, 1]]], - - [['こい', false], ['こい', [1, 1]]], - [['こい', true], ['こい', [1, 1]]], - [['っこい', false], ['っこい', [1, 1, 1]]], - [['っこい', true], ['こい', [2, 1]]], - [['っっこい', false], ['っこい', [2, 1, 1]]], - [['っっこい', true], ['こい', [3, 1]]], - [['っっっこい', false], ['っこい', [3, 1, 1]]], - [['っっっこい', true], ['こい', [4, 1]]], - - [['すごい', false], ['すごい', [1, 1, 1]]], - [['すごい', true], ['すごい', [1, 1, 1]]], - [['すごーい', false], ['すごーい', [1, 1, 1, 1]]], - [['すごーい', true], ['すごい', [1, 2, 1]]], - [['すごーーい', false], ['すごーい', [1, 1, 2, 1]]], - [['すごーーい', true], ['すごい', [1, 3, 1]]], - [['すっごーい', false], ['すっごーい', [1, 1, 1, 1, 1]]], - [['すっごーい', true], ['すごい', [2, 2, 1]]], - [['すっっごーーい', false], ['すっごーい', [1, 2, 1, 2, 1]]], - [['すっっごーーい', true], ['すごい', [3, 3, 1]]], - - [['', false], ['', []]], - [['', true], ['', []]], - [['っ', false], ['っ', [1]]], - [['っ', true], ['', [1]]], - [['っっ', false], ['っ', [2]]], - [['っっ', true], ['', [2]]], - [['っっっ', false], ['っ', [3]]], - [['っっっ', true], ['', [3]]] + [['かこい', false], 'かこい'], + [['かこい', true], 'かこい'], + [['かっこい', false], 'かっこい'], + [['かっこい', true], 'かこい'], + [['かっっこい', false], 'かっこい'], + [['かっっこい', true], 'かこい'], + [['かっっっこい', false], 'かっこい'], + [['かっっっこい', true], 'かこい'], + + [['こい', false], 'こい'], + [['こい', true], 'こい'], + [['っこい', false], 'っこい'], + [['っこい', true], 'こい'], + [['っっこい', false], 'っこい'], + [['っっこい', true], 'こい'], + [['っっっこい', false], 'っこい'], + [['っっっこい', true], 'こい'], + + [['すごい', false], 'すごい'], + [['すごい', true], 'すごい'], + [['すごーい', false], 'すごーい'], + [['すごーい', true], 'すごい'], + [['すごーーい', false], 'すごーい'], + [['すごーーい', true], 'すごい'], + [['すっごーい', false], 'すっごーい'], + [['すっごーい', true], 'すごい'], + [['すっっごーーい', false], 'すっごーい'], + [['すっっごーーい', true], 'すごい'], + + [['', false], ''], + [['', true], ''], + [['っ', false], 'っ'], + [['っ', true], ''], + [['っっ', false], 'っ'], + [['っっ', true], ''], + [['っっっ', false], 'っ'], + [['っっっ', true], ''] ]; test.each(data)('%o -> %o', (input, output) => { const [text, fullCollapse] = input; - const [expected, expectedSourceMapping] = output; - - const sourceMap = new TextSourceMap(text); - const actual1 = jp.collapseEmphaticSequences(text, fullCollapse, null); - const actual2 = jp.collapseEmphaticSequences(text, fullCollapse, sourceMap); - expect(actual1).toStrictEqual(expected); - expect(actual2).toStrictEqual(expected); - if (typeof expectedSourceMapping !== 'undefined') { - expect(sourceMap.equals(new TextSourceMap(text, expectedSourceMapping))).toBe(true); - } + + const actual1 = jp.collapseEmphaticSequences(text, fullCollapse); + const actual2 = jp.collapseEmphaticSequences(text, fullCollapse); + expect(actual1).toStrictEqual(output); + expect(actual2).toStrictEqual(output); }); }); diff --git a/types/ext/language.d.ts b/types/ext/language.d.ts index 252feff862..c708f6e775 100644 --- a/types/ext/language.d.ts +++ b/types/ext/language.d.ts @@ -15,12 +15,11 @@ * along with this program. If not, see . */ -import type {TextSourceMap} from '../../ext/js/general/text-source-map.js'; import type {LanguageTransformDescriptor} from './language-transformer.js'; export type TextProcessorOptions = T[]; -export type TextProcessorFunction = (str: string, setting: T, sourceMap: TextSourceMap) => string; +export type TextProcessorFunction = (str: string, setting: T) => string; /** * Text pre- and post-processors are used during the translation process to create alternate versions of the input text to search for. From 8789c2e02201ddfd589c2356da5a9ab1ab5ef33f Mon Sep 17 00:00:00 2001 From: Stefan Vukovic Date: Sun, 12 May 2024 15:32:50 +0200 Subject: [PATCH 6/7] update unit tests --- test/data/anki-note-builder-test-results.json | 49 ++++++++++--------- .../translator-test-results-note-data1.json | 12 ++--- test/data/translator-test-results.json | 14 +++--- 3 files changed, 38 insertions(+), 37 deletions(-) diff --git a/test/data/anki-note-builder-test-results.json b/test/data/anki-note-builder-test-results.json index f89a6e6f42..4514d61fd7 100644 --- a/test/data/anki-note-builder-test-results.json +++ b/test/data/anki-note-builder-test-results.json @@ -2781,8 +2781,8 @@ "audio": "", "clipboard-image": "", "clipboard-text": "", - "cloze-body": "(打)(ち)(", - "cloze-body-kana": "(打)(ち)(", + "cloze-body": "(打)(ち)", + "cloze-body-kana": "(打)(ち)", "cloze-prefix": "cloze-prefix", "cloze-suffix": "cloze-suffix", "conjugation": "masu stem", @@ -2810,8 +2810,8 @@ "screenshot": "", "search-query": "fullQuery", "selection-text": "", - "sentence": "cloze-prefix(打)(ち)(cloze-suffix", - "sentence-furigana": "cloze-prefix(打)(ち)(cloze-suffix", + "sentence": "cloze-prefix(打)(ち)cloze-suffix", + "sentence-furigana": "cloze-prefix(打)(ち)cloze-suffix", "tags": "vt", "url": "url:" }, @@ -2819,8 +2819,8 @@ "audio": "", "clipboard-image": "", "clipboard-text": "", - "cloze-body": "(打)(ち)(", - "cloze-body-kana": "(打)(ち)(", + "cloze-body": "(打)(ち)", + "cloze-body-kana": "(打)(ち)", "cloze-prefix": "cloze-prefix", "cloze-suffix": "cloze-suffix", "conjugation": "masu stem", @@ -2848,8 +2848,8 @@ "screenshot": "", "search-query": "fullQuery", "selection-text": "", - "sentence": "cloze-prefix(打)(ち)(cloze-suffix", - "sentence-furigana": "cloze-prefix(打)(ち)(cloze-suffix", + "sentence": "cloze-prefix(打)(ち)cloze-suffix", + "sentence-furigana": "cloze-prefix(打)(ち)cloze-suffix", "tags": "vt", "url": "url:" }, @@ -2857,8 +2857,8 @@ "audio": "", "clipboard-image": "", "clipboard-text": "", - "cloze-body": "(打)(ち)(", - "cloze-body-kana": "(打)(ち)(", + "cloze-body": "(打)(ち)", + "cloze-body-kana": "(打)(ち)", "cloze-prefix": "cloze-prefix", "cloze-suffix": "cloze-suffix", "conjugation": "masu stem", @@ -2886,8 +2886,8 @@ "screenshot": "", "search-query": "fullQuery", "selection-text": "", - "sentence": "cloze-prefix(打)(ち)(cloze-suffix", - "sentence-furigana": "cloze-prefix(打)(ち)(cloze-suffix", + "sentence": "cloze-prefix(打)(ち)cloze-suffix", + "sentence-furigana": "cloze-prefix(打)(ち)cloze-suffix", "tags": "vt", "url": "url:" }, @@ -2895,8 +2895,8 @@ "audio": "", "clipboard-image": "", "clipboard-text": "", - "cloze-body": "(打)(ち)(", - "cloze-body-kana": "(打)(ち)(", + "cloze-body": "(打)(ち)", + "cloze-body-kana": "(打)(ち)", "cloze-prefix": "cloze-prefix", "cloze-suffix": "cloze-suffix", "conjugation": "masu stem", @@ -2924,8 +2924,8 @@ "screenshot": "", "search-query": "fullQuery", "selection-text": "", - "sentence": "cloze-prefix(打)(ち)(cloze-suffix", - "sentence-furigana": "cloze-prefix(打)(ち)(cloze-suffix", + "sentence": "cloze-prefix(打)(ち)cloze-suffix", + "sentence-furigana": "cloze-prefix(打)(ち)cloze-suffix", "tags": "vt", "url": "url:" }, @@ -2933,8 +2933,8 @@ "audio": "", "clipboard-image": "", "clipboard-text": "", - "cloze-body": "(打)(", - "cloze-body-kana": "(打)(", + "cloze-body": "(打)", + "cloze-body-kana": "(打)", "cloze-prefix": "cloze-prefix", "cloze-suffix": "cloze-suffix", "conjugation": "", @@ -2962,8 +2962,8 @@ "screenshot": "", "search-query": "fullQuery", "selection-text": "", - "sentence": "cloze-prefix(打)(cloze-suffix", - "sentence-furigana": "cloze-prefix(打)(cloze-suffix", + "sentence": "cloze-prefix(打)cloze-suffix", + "sentence-furigana": "cloze-prefix(打)cloze-suffix", "tags": "n", "url": "url:" }, @@ -2971,8 +2971,8 @@ "audio": "", "clipboard-image": "", "clipboard-text": "", - "cloze-body": "(打)(", - "cloze-body-kana": "(打)(", + "cloze-body": "(打)", + "cloze-body-kana": "(打)", "cloze-prefix": "cloze-prefix", "cloze-suffix": "cloze-suffix", "conjugation": "", @@ -3000,8 +3000,8 @@ "screenshot": "", "search-query": "fullQuery", "selection-text": "", - "sentence": "cloze-prefix(打)(cloze-suffix", - "sentence-furigana": "cloze-prefix(打)(cloze-suffix", + "sentence": "cloze-prefix(打)cloze-suffix", + "sentence-furigana": "cloze-prefix(打)cloze-suffix", "tags": "abbr, n", "url": "url:" } @@ -4047,6 +4047,7 @@ "part-of-speech": "v", "pitch-accents": "No pitch accent data", "pitch-accent-graphs": "No pitch accent data", + "pitch-accent-graphs-jj": "No pitch accent data", "pitch-accent-positions": "No pitch accent data", "pitch-accent-categories": "", "phonetic-transcriptions": "", diff --git a/test/data/translator-test-results-note-data1.json b/test/data/translator-test-results-note-data1.json index 5abc31122c..eeb348afb7 100644 --- a/test/data/translator-test-results-note-data1.json +++ b/test/data/translator-test-results-note-data1.json @@ -25103,7 +25103,7 @@ "type": "term", "id": 3, "source": "打ち", - "rawSource": "(打)(ち)(", + "rawSource": "(打)(ち)", "sourceTerm": "打つ", "inflectionRuleChainCandidates": [ { @@ -25419,7 +25419,7 @@ "type": "term", "id": 5, "source": "打ち", - "rawSource": "(打)(ち)(", + "rawSource": "(打)(ち)", "sourceTerm": "打つ", "inflectionRuleChainCandidates": [ { @@ -25735,7 +25735,7 @@ "type": "term", "id": 4, "source": "打ち", - "rawSource": "(打)(ち)(", + "rawSource": "(打)(ち)", "sourceTerm": "打つ", "inflectionRuleChainCandidates": [ { @@ -26051,7 +26051,7 @@ "type": "term", "id": 6, "source": "打ち", - "rawSource": "(打)(ち)(", + "rawSource": "(打)(ち)", "sourceTerm": "打つ", "inflectionRuleChainCandidates": [ { @@ -26367,7 +26367,7 @@ "type": "term", "id": 1, "source": "打", - "rawSource": "(打)(", + "rawSource": "(打)", "sourceTerm": "打", "inflectionRuleChainCandidates": [ { @@ -26681,7 +26681,7 @@ "type": "term", "id": 2, "source": "打", - "rawSource": "(打)(", + "rawSource": "(打)", "sourceTerm": "打", "inflectionRuleChainCandidates": [ { diff --git a/test/data/translator-test-results.json b/test/data/translator-test-results.json index f21e480c55..af5ceff711 100644 --- a/test/data/translator-test-results.json +++ b/test/data/translator-test-results.json @@ -14045,7 +14045,7 @@ "reading": "うつ", "sources": [ { - "originalText": "(打)(ち)(", + "originalText": "(打)(ち)", "transformedText": "打ち", "deinflectedText": "打つ", "matchType": "exact", @@ -14217,7 +14217,7 @@ "reading": "ぶつ", "sources": [ { - "originalText": "(打)(ち)(", + "originalText": "(打)(ち)", "transformedText": "打ち", "deinflectedText": "打つ", "matchType": "exact", @@ -14389,7 +14389,7 @@ "reading": "うつ", "sources": [ { - "originalText": "(打)(ち)(", + "originalText": "(打)(ち)", "transformedText": "打ち", "deinflectedText": "打つ", "matchType": "exact", @@ -14561,7 +14561,7 @@ "reading": "ぶつ", "sources": [ { - "originalText": "(打)(ち)(", + "originalText": "(打)(ち)", "transformedText": "打ち", "deinflectedText": "打つ", "matchType": "exact", @@ -14731,7 +14731,7 @@ "reading": "だ", "sources": [ { - "originalText": "(打)(", + "originalText": "(打)", "transformedText": "打", "deinflectedText": "打", "matchType": "exact", @@ -14899,7 +14899,7 @@ "reading": "ダース", "sources": [ { - "originalText": "(打)(", + "originalText": "(打)", "transformedText": "打", "deinflectedText": "打", "matchType": "exact", @@ -18625,7 +18625,7 @@ "dictionaryIndex": 0, "dictionaryPriority": 0, "sourceTermExactMatchCount": 1, - "maxTransformedTextLength": 8, + "maxOriginalTextLength": 4, "headwords": [ { "index": 0, From e52522ee94fd7c32d7bb96d6dce4fc606ae3a4d8 Mon Sep 17 00:00:00 2001 From: Stefan Vukovic Date: Tue, 14 May 2024 10:56:36 +0200 Subject: [PATCH 7/7] update test --- test/data/anki-note-builder-test-results.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/data/anki-note-builder-test-results.json b/test/data/anki-note-builder-test-results.json index 23d1735c52..0e51b4aabd 100644 --- a/test/data/anki-note-builder-test-results.json +++ b/test/data/anki-note-builder-test-results.json @@ -4341,6 +4341,9 @@ "glossary": "
(v, Test Dictionary 2) masida definition
", "glossary-brief": "
masida definition
", "glossary-no-dictionary": "
(v) masida definition
", + "glossary-first": "
(v, Test Dictionary 2) masida definition
", + "glossary-first-brief": "
masida definition
", + "glossary-first-no-dictionary": "
(v) masida definition
", "part-of-speech": "v", "pitch-accents": "No pitch accent data", "pitch-accent-graphs": "No pitch accent data",