From 4d83837205d0fd5c362b644bb98027c42a7777e7 Mon Sep 17 00:00:00 2001 From: Mishiro Shinohara Date: Fri, 24 Mar 2023 12:23:02 +0800 Subject: [PATCH 1/9] Create dongguk.js MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 推導《東國正韻》式漢字音 --- dongguk.js | 268 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 268 insertions(+) create mode 100644 dongguk.js diff --git a/dongguk.js b/dongguk.js new file mode 100644 index 0000000..ad73fd2 --- /dev/null +++ b/dongguk.js @@ -0,0 +1,268 @@ +/* 推導《東國正韻》式漢字音 + * + * 申叔舟, 崔恆, 成三問, et al, 1448(朝鮮正統十三年). 東國正韻[M/OL]. 漢城: [s.n.]. https://commons.wikimedia.org/wiki/Category:Dictionary_of_Korean_Pronunciation_of_Chinese_Letters. + * 申祐先, 2014. 韓國語漢字音歷史層次研究[D/OL]. 臺北: 國立臺灣大學. https://archive.org/details/woosun_shin_2014. + * 福井玲, 2015. 中世韓国語の「傍点」をめぐるいくつかの基本的な課題[J/OL]. 言語研究(148): 61-80. http://www.ls-japan.org/modules/documents/LSJpapers/journals/148_fukui.pdf. + * + * @author Mishiro + */ + +const is = (...x) => 音韻地位.屬於(...x); +const when = (...x) => 音韻地位.判斷(...x); + +if (!音韻地位) return [ + ['推導原書部分例外讀音', true], + ['推導現代讀音', false], +].concat(選項.推導現代讀音 ? [ + ['應用頭音法則', false], + ['標記長音', 選項.注音方案 !== '文觀部轉寫' ? false : null], + ['注音方案', [1, '諺文', '文觀部轉寫']], +] : [ + ['注音方案', [1, '諺文', '福井玲轉寫']], + ['標調方式', 選項.注音方案 === '福井玲轉寫' ? [2, '上標', '後綴'] : null], +]); + +const 例外 = 選項.推導原書部分例外讀音; +const 現代 = 選項.推導現代讀音; + +const 轉寫 = { + // 基於福井玲(2015),有增補 + '福井玲轉寫': { + ᄀ: 'k', ᄏ: 'kʰ', ᄁ: 'kk', ᅌ: 'ŋ', + ᄃ: 't', ᄐ: 'tʰ', ᄄ: 'tt', ᄂ: 'n', ᄅ: 'r', + ᄇ: 'p', ᄑ: 'pʰ', ᄈ: 'pp', ᄆ: 'm', + ᄌ: 'c', ᄎ: 'cʰ', ᄍ: 'cc', + ᄉ: 's',   ᄊ: 'ss', ᅀ: 'z', + ᅙ: 'q', ᄒ: 'h', ᅘ: 'hh', ᄋ: '’', + + ᆞ: 'ʌ', ᆡ: 'ʌi', + ᅳ: 'ɨ', ᅴ: 'ɨi', + ᅵ: 'i', + ᅩ: 'o', ᅬ: 'oi', ᅭ: 'jo', + ᅡ: 'a', ᅢ: 'ai', ᅣ: 'ja',   ᅪ: 'wa', ᅫ: 'wai', + ᅮ: 'u', ᅱ: 'ui', ᅲ: 'ju', ᆔ: 'jui', + ᅥ: 'e',   ᅧ: 'je', ᅨ: 'jei', ᅯ: 'we',   ᆑ: 'jwe', ᆒ: 'jwei', + + ᇰ: 'ŋ', ᆨ: 'k', ᆫ: 'n', ᇙ: 'rq', ᆷ: 'm', ᆸ: 'p', ᇢ: 'w', ᆼ: '’', + }, + + '文觀部轉寫': { + ᄀ: 'g', ᄂ: 'n', ᄃ: 'd', ᄅ: 'r', ᄆ: 'm', ᄇ: 'b', ᄉ: 's', ᄋ: '', ᄌ: 'j', ᄒ: 'h', + +   ᅡ: 'a', ᅢ: 'ae',   ᅣ: 'ya', +   ᅥ: 'eo', ᅦ: 'e',   ᅧ: 'yeo', ᅨ: 'ye', + ᅩ: 'o', ᅪ: 'wa', ᅫ: 'wae', ᅬ: 'oe', ᅭ: 'yo', + ᅮ: 'u', ᅯ: 'wo',   ᅱ: 'wi', ᅲ: 'yu', + ᅳ: 'eu',     ᅴ: 'ui', + ᅵ: 'i', + + ᆼ: 'ng', ᆨ: 'k', ᆫ: 'n', ᆯ: 'l', ᆷ: 'm', ᆸ: 'p', + }, +}; + +function 音變(音節) { + function 替換(key, rule, condition = true) { + if (condition) Object.entries(rule).forEach(([k, v]) => { + 音節[key] = 音節[key].replace(k, v); + }); + } + 替換('初聲', { + ᄏ: 'ᄀ', ᄐ: 'ᄃ', ᄑ: 'ᄇ', ᄎ: 'ᄌ', + ᄁ: 'ᄀ', ᄄ: 'ᄃ', ᄈ: 'ᄇ', ᄍ: 'ᄌ', ᄊ: 'ᄉ', ᅘ: 'ᄒ', + ᅌ: 'ᄋ', ᅙ: 'ᄋ', ᅀ: 'ᄋ', + }); + 替換('中聲', { ᆞ: 'ᅡ', ᆡ: 'ᅢ', ᆔ: 'ᅲ', ᆑ: 'ᅧ', ᆒ: 'ᅨ' }); + 替換('終聲', { ᇢ: '', ᆼ: '', ᇰ: 'ᆼ', ᇙ: 'ᆯ' }); + 替換('初聲', { ᄅ: 'ᄂ' }, 選項.應用頭音法則); + 替換('初聲', { ᄂ: 'ᄋ' }, 'ᅵᅭᅣᅲᅧᅨ'.includes(音節.中聲) && 選項.應用頭音法則); + 替換('初聲', { ᄃ: 'ᄌ' }, 'ᅵᅭᅣᅲᅧᅨ'.includes(音節.中聲)); + 替換('中聲', { ᅭ: 'ᅩ', ᅣ: 'ᅡ', ᅲ: 'ᅮ', ᅧ: 'ᅥ', ᅨ: 'ᅦ' }, 'ᄌᄉ'.includes(音節.初聲)); + 替換('中聲', { ᅳ: 'ᅮ' }, 'ᄇᄆ'.includes(音節.初聲)); + 替換('中聲', { ᅴ: 'ᅵ' }, !'ᄒᄋ'.includes(音節.初聲)); + 替換('中聲', { ᅪ: 'ᅡ', ᅫ: 'ᅢ' }, !'ᄀᄒᄋ'.includes(音節.初聲)); + 替換('中聲', { ᅱ: 'ᅮ' }, 音節.終聲); +} + +function 聲母() { + return when([ + [例外, [ + ['疑母', [ + ['齊韻 上聲 或 先韻 平上聲 或 蕭韻 去聲 或 青韻 入聲', 'ᅌ'], + ['耕韻 去聲', 'ᄋ'], + ]], + ['滂母 凡韻', 'ᄇ'], + ['崇母 (通效假宕攝 或 尤韻 平聲)', 'ᄊ'], + ['云母', [ + ['蒸韻', 'ᅙ'], + ['支脂之韻 仄聲 或 仙韻 開口 或 侵韻 入聲', 'ᄋ'], + ]], + ]], + + ['崇母 止攝', 'ᄊ'], + ['云母 通攝 舒聲', 'ᅘ'], + ['疑母 (四等 或 重紐A類 或 幽韻)', 'ᄋ'], + ['', { + // 牙音 + 見: 'ᄀ', 溪: 'ᄏ', 羣: 'ᄁ', 疑: 'ᅌ', + // 舌音 + 端: 'ᄃ', 透: 'ᄐ', 定: 'ᄄ', 泥: 'ᄂ', + 知: 'ᄃ', 徹: 'ᄐ', 澄: 'ᄄ', 孃: 'ᄂ', + // 脣音 + 幫: 'ᄇ', 滂: 'ᄑ', 並: 'ᄈ', 明: 'ᄆ', + // 齒音 + 精: 'ᄌ', 清: 'ᄎ', 從: 'ᄍ', 心: 'ᄉ', 邪: 'ᄊ', + 莊: 'ᄌ', 初: 'ᄎ', 崇: 'ᄍ', 生: 'ᄉ', 俟: 'ᄊ', + 章: 'ᄌ', 昌: 'ᄎ', 常: 'ᄊ', 書: 'ᄉ', 船: 'ᄊ', + // 喉音 + 影: 'ᅙ', 曉: 'ᄒ', 匣: 'ᅘ', 云: 'ᅌ', 以: 'ᄋ', + // 半舌音 + 來: 'ᄅ', + // 半齒音 + 日: 'ᅀ', + }[音韻地位.母]], + ], '無初聲規則', true); +} + +function 韻母(輸出) { + const 韻母字典 = { + 曾開: { 中聲: 'ᅵ ᅳ ᅳ ᅳ', 終聲: 'ᇰ' }, + 曾合: { 中聲: '〇 ᆑ 〇 ᅱ', 終聲: 'ᇰ' }, + 梗開: { 中聲: 'ᅧ ᅧ ᆡ 〇', 終聲: 'ᇰ' }, + 梗合: { 中聲: 'ᆑ ᆑ ᅬ 〇', 終聲: 'ᇰ' }, + 通開: { 中聲: 'ᅲ ᅮ ᅲ ᅩ', 終聲: 'ᇰ' }, // 東冬韻 + 通合: { 中聲: 'ᅭ ᅩ 〇 ᅩ', 終聲: 'ᇰ' }, // 鍾韻 + 宕開: { 中聲: 'ᅣ ᅣ ᅡ ᅡ', 終聲: 'ᇰ' }, // 江陽唐韻 + 宕合: { 中聲: '〇 ᅪ ᅪ ᅪ', 終聲: 'ᇰ' }, + + 臻開: { 中聲: 'ᅵ ᅳ ᅳ ᆞ', 終聲: 'ᆫ' }, + 臻合: { 中聲: 'ᅲ ᅮ ᅩ ᅩ', 終聲: 'ᆫ' }, + 山開: { 中聲: 'ᅧ ᅥ ᅡ ᅡ', 終聲: 'ᆫ' }, + 山合: { 中聲: 'ᆑ ᅯ ᅪ ᅪ', 終聲: 'ᆫ' }, + + 深開: { 中聲: 'ᅵ ᅳ ᆞ 〇', 終聲: 'ᆷ' }, + 咸開: { 中聲: 'ᅧ ᅥ ᅡ ᅡ', 終聲: 'ᆷ' }, + + 效開: { 中聲: 'ᅭ ᅭ ᅭ ᅩ', 終聲: 'ᇢ' }, + 流開: { 中聲: 'ᅲ ᅮ ᅮ ᅮ', 終聲: 'ᇢ' }, + + 止開: { 中聲: 'ᅵ ᅴ ᆞ ᆞ', 終聲: 'ᆼ' }, + 止合: { 中聲: 'ᆔ ᅱ ᆔ 〇', 終聲: 'ᆼ' }, + 蟹開: { 中聲: 'ᅨ ᅨ ᅢ ᆡ', 終聲: 'ᆼ' }, + 蟹合: { 中聲: 'ᆒ ᆒ ᅫ ᅬ', 終聲: 'ᆼ' }, + 遇開: { 中聲: 'ᅧ ᅥ ᅩ 〇', 終聲: 'ᆼ' }, // 魚韻 + 遇合: { 中聲: 'ᅲ ᅮ ᅮ ᅩ', 終聲: 'ᆼ' }, // 虞模韻 + 果開: { 中聲: 'ᅣ ᅣ ᅡ ᅡ', 終聲: 'ᆼ' }, // 歌麻韻 + 果合: { 中聲: 'ᅪ ᅪ ᅪ ᅪ', 終聲: 'ᆼ' }, + }; + + let 等 = when([ + ['精組 止攝 開口', '一'], + ['莊組', '二'], + ['非 三等', 音韻地位.等], + + ['幫組', [ + ['東鍾歌陽韻 非 重紐A類', '一'], + ['微廢韻', '四'], + ['重紐B類 非 侵韻 或 蒸幽韻', '四'], + ]], + ['銳音 或 重紐A類 或 麻幽韻 非 重紐B類', '四'], + ['', '三'], + ], '無等規則', true); + let 開合 = when([ + ['鍾虞模韻', '合'], + ['江韻 銳音', '合'], + ['文魂韻 幫組', '合'], + ['', 音韻地位.呼 ?? '開'], + ], '無開合規則', true); + + let 韻母 = 韻母字典[(is`江韻` ? '宕' : is`元韻` ? '山' : is`麻韻` ? '果' : 音韻地位.攝) + 開合]; + let 中聲 = when([ + [例外, [ + ['東韻 云曉母 三等 入聲', 'ᅲ'], + ['鍾韻', [ + ['孃母 平聲 或 書來母 入聲', 'ᅩ'], + ['羣母 入聲', 'ᅮ'], + ['澄曉母 舒聲', 'ᅲ'], + ]], + ['江韻 徹初母 入聲', 'ᅡ'], + ['脂韻 合口', [ + ['知母 去聲', 'ᅱ'], + ['云母 上聲', 'ᆔ'], + ]], + ['之韻 崇母 平聲', 'ᅵ'], + ['虞韻', [ + ['來母', 'ᅮ'], + ['生母 上聲', 'ᅲ'], + ]], + ['佳韻 匣母 合口 上聲', 'ᅢ'], + ['咍韻 (見組 或 泥母)', 'ᅢ'], + ['廢韻 昌母', 'ᆡ'], + ['眞韻', [ + ['開口 (影母 入聲 或 曉母 去聲)', 'ᅵ'], + ['合口 牙喉音 非 (見母 重紐B類)', 'ᅲ'], // 無重紐對立一律按四等讀 + ]], + ['元韻 影母 開口 平聲', 'ᅧ'], + ['痕韻 匣母', is`舒聲` ? 'ᅳ' : 'ᅩ'], + ['仙韻', [ + ['開口 (見母 或 溪母 去聲)', 'ᅥ'], + ['開口 (疑母 上聲 或 影曉母 平聲)', 'ᅧ'], + ['合口 來母 非 入聲', 'ᅯ'], + ]], + ['肴韻 崇母', 'ᅩ'], + ['歌韻 來母 去聲', 'ᅪ'], + ['陽韻 莊母 入聲', 'ᅣ'], + ['庚韻 開口 二等 (澄母 上聲 或 曉母)', 'ᅧ'], + ['耕韻 (見母 開口 或 疑母 去聲 或 明母 上聲)', 'ᅧ'], + ['青韻 曉母 開口 入聲', 'ᆑ'], + ['蒸韻', [ + ['精從來母 或 以母 舒聲', 'ᅳ'], + ['曉母 開口 入聲', 'ᅵ'], + ['生母', is`舒聲` ? 'ᅵ' : 'ᆡ'], + ['幫組 入聲', 'ᅧ'], + ]], + ['登韻 匣母 合口', 'ᅬ'], + ['流攝 三等 曉母', 'ᅲ'], + ['尤韻 滂母 平聲', 'ᅲ'], + ['侯韻 泥母', 'ᅲ'], + ['幽韻 羣母 上聲', 'ᅮ'], + ['侵韻', [ + ['重紐A類 或 以母', 'ᅳ'], + ['初母 上去聲', 'ᅵ'], + ]], + ['鹽韻 云母', 'ᅧ'], + ]], + + ['止攝 莊初母 開口', 'ᅴ'], + ['祭韻 合口 (重紐B類 或 云母)', 'ᅱ'], + ['泰韻 非 合口', 'ᅢ'], + ['肴韻 幫組', 'ᅩ'], + ['陽韻 見組 開口', 'ᅡ'], + ['', 韻母.中聲.split(' ')['四三二一'.indexOf(等)]], + ], '無中聲規則', true); + let 終聲 = is`舒聲` ? 韻母.終聲 : { ᆷ: 'ᆸ', ᆫ: 'ᇙ', ᇰ: 'ᆨ' }[韻母.終聲]; + + return { 中聲, 終聲 }; +} + +let 音節 = { + 初聲: 聲母(), + ...韻母() +}; +if (現代) 音變(音節); + +function 聲調() { + if (現代) return 選項.標記長音 && is`上去聲` ? 'ː' : ''; + return { + 諺文: { 平: '', 上: '〯', 去: '〮', 入: '〮' }, + 福井玲轉寫: 選項.標調方式 === '上標' ? + { 平: '̀', 上: '̌', 去: '́', 入: '́' } : + { 平: 'ᴸ', 上: 'ᴿ', 去: 'ᴴ', 入: 'ᴴ' }, + }[選項.注音方案][音韻地位.聲]; +} + +音節 = 音節.初聲 + 音節.中聲 + 音節.終聲; +if (選項.注音方案 !== '諺文') Object.entries(轉寫[選項.注音方案]).forEach(([k, v]) => { + 音節 = 音節.replace(k, v); +}); +if (選項.標調方式 === '上標') return 音節.replace(/.*[ʌɨoaue]|.*i/, "$&" + 聲調()); +return 音節 + 聲調(); From 59e62a2ed7bd5f2a354824354b5d895d8451dda0 Mon Sep 17 00:00:00 2001 From: Mishiro Shinohara Date: Fri, 24 Mar 2023 12:23:13 +0800 Subject: [PATCH 2/9] Update README.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add 推導《東國正韻》式漢字音 --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 375f26a..ebc45c2 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,7 @@ https://nk2028-1305783649.file.myqcloud.com/qieyun-examples/ - 推導上海話 (Extrapolated Shanghainese): `zaonhe.js` - 推導南京話 (Extrapolated Nankinese): `langjin.js` - 推導大埔話 (Extrapolated Taibu Hakka): `taibu.js` +- 推導《東國正韻》式漢字音 (Extrapolated Sino-Korean Pronunciation from _Dongguk Jeongun_): `dongguk.js` **人造音系 artificial phonological system** From bfca6284ca60b6d789f9ed71078a2fb2e28f1c59 Mon Sep 17 00:00:00 2001 From: Mishiro Shinohara Date: Fri, 24 Mar 2023 12:25:45 +0800 Subject: [PATCH 3/9] Update dongguk.js MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add 知乎 link --- dongguk.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dongguk.js b/dongguk.js index ad73fd2..17b9c89 100644 --- a/dongguk.js +++ b/dongguk.js @@ -1,4 +1,6 @@ /* 推導《東國正韻》式漢字音 + * + * https://zhuanlan.zhihu.com/p/616644846 * * 申叔舟, 崔恆, 成三問, et al, 1448(朝鮮正統十三年). 東國正韻[M/OL]. 漢城: [s.n.]. https://commons.wikimedia.org/wiki/Category:Dictionary_of_Korean_Pronunciation_of_Chinese_Letters. * 申祐先, 2014. 韓國語漢字音歷史層次研究[D/OL]. 臺北: 國立臺灣大學. https://archive.org/details/woosun_shin_2014. From 03687f03da0988c68a09505d18bf5214e83672bd Mon Sep 17 00:00:00 2001 From: unt Date: Fri, 24 Mar 2023 13:34:46 +0800 Subject: [PATCH 4/9] Update dongguk.js --- dongguk.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/dongguk.js b/dongguk.js index 17b9c89..8379ace 100644 --- a/dongguk.js +++ b/dongguk.js @@ -2,7 +2,7 @@ * * https://zhuanlan.zhihu.com/p/616644846 * - * 申叔舟, 崔恆, 成三問, et al, 1448(朝鮮正統十三年). 東國正韻[M/OL]. 漢城: [s.n.]. https://commons.wikimedia.org/wiki/Category:Dictionary_of_Korean_Pronunciation_of_Chinese_Letters. + * 申叔舟, 崔恆, 成三問, et al., 1448(朝鮮正統十三年). 東國正韻[M/OL]. 漢城: [s.n.]. https://commons.wikimedia.org/wiki/Category:Dictionary_of_Korean_Pronunciation_of_Chinese_Letters. * 申祐先, 2014. 韓國語漢字音歷史層次研究[D/OL]. 臺北: 國立臺灣大學. https://archive.org/details/woosun_shin_2014. * 福井玲, 2015. 中世韓国語の「傍点」をめぐるいくつかの基本的な課題[J/OL]. 言語研究(148): 61-80. http://www.ls-japan.org/modules/documents/LSJpapers/journals/148_fukui.pdf. * @@ -24,8 +24,8 @@ if (!音韻地位) return [ ['標調方式', 選項.注音方案 === '福井玲轉寫' ? [2, '上標', '後綴'] : null], ]); -const 例外 = 選項.推導原書部分例外讀音; -const 現代 = 選項.推導現代讀音; +const is推導例外 = 選項.推導原書部分例外讀音; +const is推導現代 = 選項.推導現代讀音; const 轉寫 = { // 基於福井玲(2015),有增補 @@ -35,7 +35,7 @@ const 轉寫 = { ᄇ: 'p', ᄑ: 'pʰ', ᄈ: 'pp', ᄆ: 'm', ᄌ: 'c', ᄎ: 'cʰ', ᄍ: 'cc', ᄉ: 's',   ᄊ: 'ss', ᅀ: 'z', - ᅙ: 'q', ᄒ: 'h', ᅘ: 'hh', ᄋ: '’', + ᅙ: 'q', ᄒ: 'h', ᅘ: 'hh', ᄋ: 'ʼ', ᆞ: 'ʌ', ᆡ: 'ʌi', ᅳ: 'ɨ', ᅴ: 'ɨi', @@ -45,7 +45,7 @@ const 轉寫 = { ᅮ: 'u', ᅱ: 'ui', ᅲ: 'ju', ᆔ: 'jui', ᅥ: 'e',   ᅧ: 'je', ᅨ: 'jei', ᅯ: 'we',   ᆑ: 'jwe', ᆒ: 'jwei', - ᇰ: 'ŋ', ᆨ: 'k', ᆫ: 'n', ᇙ: 'rq', ᆷ: 'm', ᆸ: 'p', ᇢ: 'w', ᆼ: '’', + ᇰ: 'ŋ', ᆨ: 'k', ᆫ: 'n', ᇙ: 'rq', ᆷ: 'm', ᆸ: 'p', ᇢ: 'w', ᆼ: 'ʼ', }, '文觀部轉寫': { @@ -87,7 +87,7 @@ function 音變(音節) { function 聲母() { return when([ - [例外, [ + [is推導例外, [ ['疑母', [ ['齊韻 上聲 或 先韻 平上聲 或 蕭韻 去聲 或 青韻 入聲', 'ᅌ'], ['耕韻 去聲', 'ᄋ'], @@ -179,7 +179,7 @@ function 韻母(輸出) { let 韻母 = 韻母字典[(is`江韻` ? '宕' : is`元韻` ? '山' : is`麻韻` ? '果' : 音韻地位.攝) + 開合]; let 中聲 = when([ - [例外, [ + [is推導例外, [ ['東韻 云曉母 三等 入聲', 'ᅲ'], ['鍾韻', [ ['孃母 平聲 或 書來母 入聲', 'ᅩ'], @@ -250,10 +250,10 @@ let 音節 = { 初聲: 聲母(), ...韻母() }; -if (現代) 音變(音節); +if (is推導現代) 音變(音節); function 聲調() { - if (現代) return 選項.標記長音 && is`上去聲` ? 'ː' : ''; + if (is推導現代) return 選項.標記長音 && is`上去聲` ? 'ː' : ''; return { 諺文: { 平: '', 上: '〯', 去: '〮', 入: '〮' }, 福井玲轉寫: 選項.標調方式 === '上標' ? From 3354b19c6aa3b357904dfbed6ccee16a5f2a2b5d Mon Sep 17 00:00:00 2001 From: unt Date: Fri, 24 Mar 2023 13:37:26 +0800 Subject: [PATCH 5/9] Update dongguk.js --- dongguk.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dongguk.js b/dongguk.js index 8379ace..1808b2a 100644 --- a/dongguk.js +++ b/dongguk.js @@ -257,8 +257,8 @@ function 聲調() { return { 諺文: { 平: '', 上: '〯', 去: '〮', 入: '〮' }, 福井玲轉寫: 選項.標調方式 === '上標' ? - { 平: '̀', 上: '̌', 去: '́', 入: '́' } : - { 平: 'ᴸ', 上: 'ᴿ', 去: 'ᴴ', 入: 'ᴴ' }, + { 平: '̀', 上: '̌', 去: '́', 入: '́' } : + { 平: 'ᴸ', 上: 'ᴿ', 去: 'ᴴ', 入: 'ᴴ' }, }[選項.注音方案][音韻地位.聲]; } From 386e7c6573a64c633aa18a0025640b14cdcae3fd Mon Sep 17 00:00:00 2001 From: unt Date: Fri, 24 Mar 2023 13:39:04 +0800 Subject: [PATCH 6/9] Update main.js --- test/main.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/main.js b/test/main.js index 61b5e78..1b89e1e 100644 --- a/test/main.js +++ b/test/main.js @@ -21,6 +21,7 @@ import { zaonhe, langjin, taibu, + dongguk, ayaka_v8, } from "../index.js"; @@ -53,6 +54,7 @@ assert_equal(gwongzau(音韻地位), "siu2"); assert_equal(zaonhe(音韻地位), "sɔ̄"); assert_equal(langjin(音韻地位), "shao³"); assert_equal(taibu(音韻地位), "shau3"); +assert_equal(dongguk(音韻地位), "쇼ᇢ〯"); assert_equal(ayaka_v8(音韻地位), "seu"); assert_equal( From f2e014e91def4ecb6286818b7d0f560ef9e5ace2 Mon Sep 17 00:00:00 2001 From: Mishiro Shinohara Date: Fri, 24 Mar 2023 14:50:45 +0800 Subject: [PATCH 7/9] Update dongguk.js Add Yale Romanization --- dongguk.js | 66 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 34 insertions(+), 32 deletions(-) diff --git a/dongguk.js b/dongguk.js index 1808b2a..464e3a0 100644 --- a/dongguk.js +++ b/dongguk.js @@ -4,7 +4,6 @@ * * 申叔舟, 崔恆, 成三問, et al., 1448(朝鮮正統十三年). 東國正韻[M/OL]. 漢城: [s.n.]. https://commons.wikimedia.org/wiki/Category:Dictionary_of_Korean_Pronunciation_of_Chinese_Letters. * 申祐先, 2014. 韓國語漢字音歷史層次研究[D/OL]. 臺北: 國立臺灣大學. https://archive.org/details/woosun_shin_2014. - * 福井玲, 2015. 中世韓国語の「傍点」をめぐるいくつかの基本的な課題[J/OL]. 言語研究(148): 61-80. http://www.ls-japan.org/modules/documents/LSJpapers/journals/148_fukui.pdf. * * @author Mishiro */ @@ -16,49 +15,48 @@ if (!音韻地位) return [ ['推導原書部分例外讀音', true], ['推導現代讀音', false], ].concat(選項.推導現代讀音 ? [ + ['使用激音表示次清聲母', true], ['應用頭音法則', false], ['標記長音', 選項.注音方案 !== '文觀部轉寫' ? false : null], - ['注音方案', [1, '諺文', '文觀部轉寫']], + ['注音方案', [1, '諺文', '耶魯轉寫', '文觀部轉寫']], ] : [ - ['注音方案', [1, '諺文', '福井玲轉寫']], - ['標調方式', 選項.注音方案 === '福井玲轉寫' ? [2, '上標', '後綴'] : null], + ['注音方案', [1, '諺文', '耶魯轉寫']], ]); const is推導例外 = 選項.推導原書部分例外讀音; const is推導現代 = 選項.推導現代讀音; const 轉寫 = { - // 基於福井玲(2015),有增補 - '福井玲轉寫': { - ᄀ: 'k', ᄏ: 'kʰ', ᄁ: 'kk', ᅌ: 'ŋ', - ᄃ: 't', ᄐ: 'tʰ', ᄄ: 'tt', ᄂ: 'n', ᄅ: 'r', - ᄇ: 'p', ᄑ: 'pʰ', ᄈ: 'pp', ᄆ: 'm', - ᄌ: 'c', ᄎ: 'cʰ', ᄍ: 'cc', - ᄉ: 's',   ᄊ: 'ss', ᅀ: 'z', - ᅙ: 'q', ᄒ: 'h', ᅘ: 'hh', ᄋ: 'ʼ', + '耶魯轉寫': { + ᄀ: 'k', ᄏ: 'kh', ᄁ: 'kk', ᅌ: 'ng', + ᄃ: 't', ᄐ: 'th', ᄄ: 'tt', ᄂ: 'n', ᄅ: 'l', + ᄇ: 'p', ᄑ: 'ph', ᄈ: 'pp', ᄆ: 'm', + ᄌ: 'c', ᄎ: 'ch', ᄍ: 'cc', + ᄉ: 's',   ᄊ: 'ss',   ᅀ: 'z', + ᅙ: 'q', ᄒ: 'h', ᅘ: 'hh',   ᄋ: '', - ᆞ: 'ʌ', ᆡ: 'ʌi', - ᅳ: 'ɨ', ᅴ: 'ɨi', + ᆞ: 'o', ᆡ: 'oy', ᅩ: 'wo', ᅬ: 'woy', ᅭ: 'yo', + ᅳ: 'u', ᅴ: 'uy', ᅮ: 'wu', ᅱ: 'wuy', ᅲ: 'yu', ᆔ: 'yuy', ᅵ: 'i', - ᅩ: 'o', ᅬ: 'oi', ᅭ: 'jo', - ᅡ: 'a', ᅢ: 'ai', ᅣ: 'ja',   ᅪ: 'wa', ᅫ: 'wai', - ᅮ: 'u', ᅱ: 'ui', ᅲ: 'ju', ᆔ: 'jui', - ᅥ: 'e',   ᅧ: 'je', ᅨ: 'jei', ᅯ: 'we',   ᆑ: 'jwe', ᆒ: 'jwei', + ᅡ: 'a', ᅢ: 'ay', ᅪ: 'wa', ᅫ: 'way', ᅣ: 'ya', ᅤ: 'yay', + ᅥ: 'e', ᅦ: 'ey', ᅯ: 'we', ᅰ: 'wey', ᅧ: 'ye', ᅨ: 'yey', ᆑ: 'yuye', ᆒ: 'yuyey', - ᇰ: 'ŋ', ᆨ: 'k', ᆫ: 'n', ᇙ: 'rq', ᆷ: 'm', ᆸ: 'p', ᇢ: 'w', ᆼ: 'ʼ', + ᇰ: 'ng', ᆨ: 'k', ᆼ: is推導現代 ? 'ng' : '', + ᆫ: 'n', ᇙ: 'lq', ᆯ: 'l', + ᆷ: 'm', ᆸ: 'p', ᇢ: 'w', }, '文觀部轉寫': { - ᄀ: 'g', ᄂ: 'n', ᄃ: 'd', ᄅ: 'r', ᄆ: 'm', ᄇ: 'b', ᄉ: 's', ᄋ: '', ᄌ: 'j', ᄒ: 'h', + ᄀ: 'g', ᄂ: 'n', ᄃ: 'd', ᄅ: 'r', ᄆ: 'm', ᄇ: 'b', ᄉ: 's', ᄋ: '', ᄌ: 'j', ᄎ: 'ch', ᄏ: 'k', ᄐ: 't', ᄑ: 'p', ᄒ: 'h', -   ᅡ: 'a', ᅢ: 'ae',   ᅣ: 'ya', +   ᅡ: 'a', ᅢ: 'ae',   ᅣ: 'ya', ᅤ: 'yae',   ᅥ: 'eo', ᅦ: 'e',   ᅧ: 'yeo', ᅨ: 'ye', ᅩ: 'o', ᅪ: 'wa', ᅫ: 'wae', ᅬ: 'oe', ᅭ: 'yo', - ᅮ: 'u', ᅯ: 'wo',   ᅱ: 'wi', ᅲ: 'yu', + ᅮ: 'u', ᅯ: 'wo', ᅰ: 'we', ᅱ: 'wi', ᅲ: 'yu', ᅳ: 'eu',     ᅴ: 'ui', ᅵ: 'i', - ᆼ: 'ng', ᆨ: 'k', ᆫ: 'n', ᆯ: 'l', ᆷ: 'm', ᆸ: 'p', + ᆨ: 'k', ᆫ: 'n', ᆯ: 'l', ᆷ: 'm', ᆸ: 'p', ᆼ: 'ng', }, }; @@ -68,8 +66,8 @@ function 音變(音節) { 音節[key] = 音節[key].replace(k, v); }); } + 替換('初聲', { ᄏ: 'ᄀ', ᄐ: 'ᄃ', ᄑ: 'ᄇ', ᄎ: 'ᄌ' }, !選項.使用激音表示次清聲母); 替換('初聲', { - ᄏ: 'ᄀ', ᄐ: 'ᄃ', ᄑ: 'ᄇ', ᄎ: 'ᄌ', ᄁ: 'ᄀ', ᄄ: 'ᄃ', ᄈ: 'ᄇ', ᄍ: 'ᄌ', ᄊ: 'ᄉ', ᅘ: 'ᄒ', ᅌ: 'ᄋ', ᅙ: 'ᄋ', ᅀ: 'ᄋ', }); @@ -77,11 +75,11 @@ function 音變(音節) { 替換('終聲', { ᇢ: '', ᆼ: '', ᇰ: 'ᆼ', ᇙ: 'ᆯ' }); 替換('初聲', { ᄅ: 'ᄂ' }, 選項.應用頭音法則); 替換('初聲', { ᄂ: 'ᄋ' }, 'ᅵᅭᅣᅲᅧᅨ'.includes(音節.中聲) && 選項.應用頭音法則); - 替換('初聲', { ᄃ: 'ᄌ' }, 'ᅵᅭᅣᅲᅧᅨ'.includes(音節.中聲)); - 替換('中聲', { ᅭ: 'ᅩ', ᅣ: 'ᅡ', ᅲ: 'ᅮ', ᅧ: 'ᅥ', ᅨ: 'ᅦ' }, 'ᄌᄉ'.includes(音節.初聲)); + 替換('初聲', { ᄃ: 'ᄌ', ᄐ: 'ᄎ' }, 'ᅵᅭᅣᅲᅧᅨ'.includes(音節.中聲)); + 替換('中聲', { ᅭ: 'ᅩ', ᅣ: 'ᅡ', ᅲ: 'ᅮ', ᅧ: 'ᅥ', ᅨ: 'ᅦ' }, 'ᄌᄎᄉ'.includes(音節.初聲)); 替換('中聲', { ᅳ: 'ᅮ' }, 'ᄇᄆ'.includes(音節.初聲)); 替換('中聲', { ᅴ: 'ᅵ' }, !'ᄒᄋ'.includes(音節.初聲)); - 替換('中聲', { ᅪ: 'ᅡ', ᅫ: 'ᅢ' }, !'ᄀᄒᄋ'.includes(音節.初聲)); + 替換('中聲', { ᅪ: 'ᅡ', ᅫ: 'ᅢ' }, !'ᄀᄏᄒᄋ'.includes(音節.初聲)); 替換('中聲', { ᅱ: 'ᅮ' }, 音節.終聲); } @@ -253,12 +251,16 @@ let 音節 = { if (is推導現代) 音變(音節); function 聲調() { - if (is推導現代) return 選項.標記長音 && is`上去聲` ? 'ː' : ''; + if (is推導現代) { + if (!選項.標記長音 || 選項.注音方案 === '文觀部轉寫') return ''; + return { + 諺文: { 平: '', 上: 'ː', 去: 'ː', 入: '' }, + 耶魯轉寫: { 平: '', 上: '̄', 去: '̄', 入: '' }, + }[選項.注音方案][音韻地位.聲]; + } return { 諺文: { 平: '', 上: '〯', 去: '〮', 入: '〮' }, - 福井玲轉寫: 選項.標調方式 === '上標' ? - { 平: '̀', 上: '̌', 去: '́', 入: '́' } : - { 平: 'ᴸ', 上: 'ᴿ', 去: 'ᴴ', 入: 'ᴴ' }, + 耶魯轉寫: { 平: '', 上: '̌', 去: '́', 入: '́' }, }[選項.注音方案][音韻地位.聲]; } @@ -266,5 +268,5 @@ function 聲調() { if (選項.注音方案 !== '諺文') Object.entries(轉寫[選項.注音方案]).forEach(([k, v]) => { 音節 = 音節.replace(k, v); }); -if (選項.標調方式 === '上標') return 音節.replace(/.*[ʌɨoaue]|.*i/, "$&" + 聲調()); +if (選項.注音方案 === '耶魯轉寫') return 音節.replace(/.*[aeiou]|.*/, "$&" + 聲調()); return 音節 + 聲調(); From 253ca82b1ee328e3d0f46dd7fc07bddc443694a1 Mon Sep 17 00:00:00 2001 From: Mishiro Shinohara Date: Fri, 24 Mar 2023 16:09:26 +0800 Subject: [PATCH 8/9] Update dongguk.js --- dongguk.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dongguk.js b/dongguk.js index 464e3a0..a6de008 100644 --- a/dongguk.js +++ b/dongguk.js @@ -194,12 +194,12 @@ function 韻母(輸出) { ['來母', 'ᅮ'], ['生母 上聲', 'ᅲ'], ]], - ['佳韻 匣母 合口 上聲', 'ᅢ'], + ['佳韻 匣母 上聲', 'ᅢ'], ['咍韻 (見組 或 泥母)', 'ᅢ'], ['廢韻 昌母', 'ᆡ'], ['眞韻', [ ['開口 (影母 入聲 或 曉母 去聲)', 'ᅵ'], - ['合口 牙喉音 非 (見母 重紐B類)', 'ᅲ'], // 無重紐對立一律按四等讀 + ['合口 (重紐B類 或 云母) 非 見母', 'ᅲ'], // 無重紐對立一律按四等讀 ]], ['元韻 影母 開口 平聲', 'ᅧ'], ['痕韻 匣母', is`舒聲` ? 'ᅳ' : 'ᅩ'], @@ -213,7 +213,7 @@ function 韻母(輸出) { ['陽韻 莊母 入聲', 'ᅣ'], ['庚韻 開口 二等 (澄母 上聲 或 曉母)', 'ᅧ'], ['耕韻 (見母 開口 或 疑母 去聲 或 明母 上聲)', 'ᅧ'], - ['青韻 曉母 開口 入聲', 'ᆑ'], + ['青韻 曉母 入聲', 'ᆑ'], ['蒸韻', [ ['精從來母 或 以母 舒聲', 'ᅳ'], ['曉母 開口 入聲', 'ᅵ'], @@ -268,5 +268,5 @@ function 聲調() { if (選項.注音方案 !== '諺文') Object.entries(轉寫[選項.注音方案]).forEach(([k, v]) => { 音節 = 音節.replace(k, v); }); -if (選項.注音方案 === '耶魯轉寫') return 音節.replace(/.*[aeiou]|.*/, "$&" + 聲調()); +if (選項.注音方案 === '耶魯轉寫') return 音節.replace(/.*[aeiou]/, "$&" + 聲調()); return 音節 + 聲調(); From 39797d39dcc132f7de187ceecf835bffcf9e7d9d Mon Sep 17 00:00:00 2001 From: Mishiro Shinohara Date: Sat, 25 Mar 2023 18:03:21 +0800 Subject: [PATCH 9/9] Update dongguk.js Fix Yale Romanization --- dongguk.js | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/dongguk.js b/dongguk.js index a6de008..4165da1 100644 --- a/dongguk.js +++ b/dongguk.js @@ -35,11 +35,11 @@ const 轉寫 = { ᄉ: 's',   ᄊ: 'ss',   ᅀ: 'z', ᅙ: 'q', ᄒ: 'h', ᅘ: 'hh',   ᄋ: '', - ᆞ: 'o', ᆡ: 'oy', ᅩ: 'wo', ᅬ: 'woy', ᅭ: 'yo', - ᅳ: 'u', ᅴ: 'uy', ᅮ: 'wu', ᅱ: 'wuy', ᅲ: 'yu', ᆔ: 'yuy', - ᅵ: 'i', - ᅡ: 'a', ᅢ: 'ay', ᅪ: 'wa', ᅫ: 'way', ᅣ: 'ya', ᅤ: 'yay', - ᅥ: 'e', ᅦ: 'ey', ᅯ: 'we', ᅰ: 'wey', ᅧ: 'ye', ᅨ: 'yey', ᆑ: 'yuye', ᆒ: 'yuyey', + ᆞ: 'o', ᆡ: 'oy',     ᅩ: 'wo', ᅬ: 'woy', ᅭ: 'ywo', + ᅳ: 'u', ᅴ: 'uy',     ᅮ: 'wu', ᅱ: 'wuy', ᅲ: 'ywu', ᆔ: 'ywuy', + ᅵ: 'i',       // ᅱ: 'wi', + ᅡ: 'a', ᅢ: 'ay', ᅣ: 'ya', ᅤ: 'yay', ᅪ: 'wa', ᅫ: 'way', + ᅥ: 'e', ᅦ: 'ey', ᅧ: 'ye', ᅨ: 'yey', ᅯ: 'we', ᅰ: 'wey', ᆑ: 'ywe', ᆒ: 'ywey', ᇰ: 'ng', ᆨ: 'k', ᆼ: is推導現代 ? 'ng' : '', ᆫ: 'n', ᇙ: 'lq', ᆯ: 'l', @@ -61,6 +61,7 @@ const 轉寫 = { }; function 音變(音節) { + const hasᅵ = 'ᅵᅭᅣᅲᅧᅨ'.includes(音節.中聲); function 替換(key, rule, condition = true) { if (condition) Object.entries(rule).forEach(([k, v]) => { 音節[key] = 音節[key].replace(k, v); @@ -74,8 +75,8 @@ function 音變(音節) { 替換('中聲', { ᆞ: 'ᅡ', ᆡ: 'ᅢ', ᆔ: 'ᅲ', ᆑ: 'ᅧ', ᆒ: 'ᅨ' }); 替換('終聲', { ᇢ: '', ᆼ: '', ᇰ: 'ᆼ', ᇙ: 'ᆯ' }); 替換('初聲', { ᄅ: 'ᄂ' }, 選項.應用頭音法則); - 替換('初聲', { ᄂ: 'ᄋ' }, 'ᅵᅭᅣᅲᅧᅨ'.includes(音節.中聲) && 選項.應用頭音法則); - 替換('初聲', { ᄃ: 'ᄌ', ᄐ: 'ᄎ' }, 'ᅵᅭᅣᅲᅧᅨ'.includes(音節.中聲)); + 替換('初聲', { ᄂ: 'ᄋ' }, hasᅵ && 選項.應用頭音法則); + 替換('初聲', { ᄃ: 'ᄌ', ᄐ: 'ᄎ' }, hasᅵ); 替換('中聲', { ᅭ: 'ᅩ', ᅣ: 'ᅡ', ᅲ: 'ᅮ', ᅧ: 'ᅥ', ᅨ: 'ᅦ' }, 'ᄌᄎᄉ'.includes(音節.初聲)); 替換('中聲', { ᅳ: 'ᅮ' }, 'ᄇᄆ'.includes(音節.初聲)); 替換('中聲', { ᅴ: 'ᅵ' }, !'ᄒᄋ'.includes(音節.初聲)); @@ -260,13 +261,18 @@ function 聲調() { } return { 諺文: { 平: '', 上: '〯', 去: '〮', 入: '〮' }, - 耶魯轉寫: { 平: '', 上: '̌', 去: '́', 入: '́' }, + 耶魯轉寫: { 平: '̀', 上: '̌', 去: '́', 入: '́' }, }[選項.注音方案][音韻地位.聲]; } 音節 = 音節.初聲 + 音節.中聲 + 音節.終聲; -if (選項.注音方案 !== '諺文') Object.entries(轉寫[選項.注音方案]).forEach(([k, v]) => { - 音節 = 音節.replace(k, v); -}); -if (選項.注音方案 === '耶魯轉寫') return 音節.replace(/.*[aeiou]/, "$&" + 聲調()); +if (選項.注音方案 !== '諺文') Object.entries(轉寫[選項.注音方案]).forEach(([k, v]) => { 音節 = 音節.replace(k, v); }); +if (選項.注音方案 === '耶魯轉寫') { + if (is推導現代) { + 音節 = 音節.replace('wo', 'o'); + if (is`脣音` || 音節.includes('ywu')) 音節 = 音節.replace('wu', 'u'); + 音節 = 音節.replace('wuy', 'wi'); + } + return 音節.replace(/.*[aeiou]/, "$&" + 聲調()); +} return 音節 + 聲調();