Skip to content

Commit

Permalink
Create langjin.js
Browse files Browse the repository at this point in the history
  • Loading branch information
uliloewi committed Oct 15, 2024
1 parent 533132d commit cdc3610
Showing 1 changed file with 309 additions and 0 deletions.
309 changes: 309 additions & 0 deletions langjin.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,309 @@
/* 推導南京話
*
* https://zhuanlan.zhihu.com/p/391166351
*
* 中古音與南京音的對應表:https://github.com/uliloewi/lang2jin1/blob/master/Guangyun_Langjin_pulish_Alphabetic.2.0.csv
* 南京音本是清末以前標準官話的基礎音系,和中古音有嚴格的對應關係,故有上表。本程序展示此對應關係。
* 南京話拼音方案:https://zh.wikipedia.org/wiki/%E5%8D%97%E4%BA%AC%E8%A9%B1%E6%8B%89%E4%B8%81%E5%8C%96%E6%96%B9%E6%A1%88#%E8%BC%B8%E5%85%A5%E6%B3%95%E6%96%B9%E6%A1%88
*
* @author uliloewi
*/


/** @type { 音韻地位['屬於'] } */
const is = (...x) => 音韻地位.屬於(...x);
/** @type { 音韻地位['判斷'] } */
const when = (...x) => 音韻地位.判斷(...x);

//const is更多選項 = 選項.更多選項 ?? false;

if (!音韻地位) return [
['標調方式', [1, '數字', '附標']],
];

const 次序標調 = {
'陰平': '¹',
'陽平': '²',
'上聲': '³',
'去聲': '⁴',
'入聲': '⁵',
};
const 附標標調 = {
'陰平': '̄',
'陽平': '́',
'上聲': '̌',
'去聲': '̀',
'入聲': '̂',
};

const 元音 = 'iuüaeoyär';
const 元音Re = new RegExp("[" + 元音 + "]");
const 元音附標 = '̃̈';

let 不顎化 = '一等 或 二等 合口 或 二等 庚耕韻 或 三等 合口 祭微陽支脂凡廢韻 舒聲 或 三等 通攝 舒聲 或 四等 合口 齊韻'; // 見溪羣曉匣母不顎化條件
const 聲母規則 = () => when([
['幫滂並母 C類', 'f'],
['幫母', 'b'],
['滂母', 'p'],
['並母', [['平聲', 'p'], ['', 'b']]],
['明母', [['C類 非 東尤韻', ''], ['', 'm']]],//'C類 非 鍾廢尤韻'

['端母', 'd'],
['透母', 't'],
['定母', [['平聲', 't'], ['', 'd']]],
['泥來孃母', 'l'],

['精母', 'z'],
['清母', 'c'],
['從母', [['二等', 'ch'], ['平聲', 'c'], ['', 'z']]],
['心母', 's'],
['邪母', [['平聲 尤之陽鹽侵魚韻', 'c'], ['', 's']]],

['知母', [['麻韻 三等', 'd'], ['庚耕韻', 'z'], ['', 'zh']]],
['徹母', [['庚耕韻', 'c'], ['', 'ch']]],
['澄母', [['庚耕韻', ['平聲', 'c'], ['', 'z']], ['平聲', 'ch'], ['', 'zh']]],

['莊母', [['宕假效江攝 或 止攝 合口 或 蟹咸山攝 二等', 'zh'], ['', 'z']]],
['初母', [['宕假效江攝 或 止攝 合口 或 蟹咸山攝 二等', 'ch'], ['', 'c']]],
['崇母', [['宕假效江攝 或 止攝 合口 或 蟹咸山攝 二等', ['平聲','ch'],['','zh']], ['之韻', 's'], ['平聲', 'c'], [, 'z']]],
['生母', [['宕假效江攝 或 止攝 合口 或 蟹咸山攝 二等', 'sh'], ['', 's']]],
['俟母', [['平聲', 'c'], ['', 's']]],

['章母', 'zh'],
['昌母', 'ch'],
['常母', [['曾攝 入聲', 'zh'], ['平聲 齊侵清仙鹽陽尤魚虞真蒸支鍾韻 或 一等', 'ch'], ['', 'sh']]],
['船書母', [['平聲 通攝 或 平聲 合口 山攝', 'ch'], ['', 'sh']]],
['日母', [['四等', 'l'], ['支之脂韻 開口 或 真侵韻 入聲', ''], ['', 'r']]],

['見母', [[不顎化, 'g'], ['', 'j']]],
['溪母', [['二等 皆韻 或 二等 江韻 入聲', 'k'], [不顎化, 'k'], ['', 'q']]],
['羣母', [['宵韻 重紐A類', 'q'], ['平聲', ['三等 合口 山陽脂韻','k'],['','q']], [不顎化, 'g'], ['', 'j']]],
['疑母', [['之韻 上聲', 'l'], ['一二等', ''], ['尤蒸齊韻 平聲 或 先仙陽庚韻 入聲', 'l'], ['', '']]],
['曉母', [['三等 開口 或 三等 通攝', 'x'], [不顎化, 'h'], ['', 'x']]],
['匣母', [['開口 耕韻 舒聲', 'x'], [不顎化, 'h'], ['', 'x']]],

['以母', [['合口 祭韻', 'r'], ['', '']]],
['影母', ''],
['云母', [['舒聲 通攝', 'x'], ['', '']]],
], '無聲母規則');

const 韻母規則 = () => when([
// 通攝
['通攝', [
['東韻 入聲', [['三等 見溪羣曉匣疑以影云母', 'ü'], ['', 'u']]],
['東韻 舒聲', [['三等 疑以影母', 'iong'], ['幫組', 'en'], ['', 'ong']]],
['冬韻', [['入聲', 'u'], ['幫組', 'en'], ['', 'ong']]],
['鍾韻 舒聲', [['疑以影母', 'iong'], ['幫組', 'en'], ['', 'ong']]],
['鍾韻 入聲', [['見溪羣曉匣疑以影云母', 'ü'], ['', 'u']]],
]],

// 江攝
['江韻', [
['入聲', [
['疑母', 'io'], ['', 'o']
]],
['徹澄崇初生知母', 'uang'],
['疑母', 'iang'],
['', 'ang'],
]],

// 止攝
['止攝', [
['支脂之韻 日母 開口', 'er'],
['支脂之韻 崇初從精清生俟邪心莊母 開口', 'y'], // 平舌音
['支脂之韻 昌常徹澄船書章知母 開口', 'r'], // 翹舌音
['支脂韻 莊組 合口', 'uä'],
['支韻 重紐B類 幫母', 'ei'],
['支韻 重紐B類 並母 上去聲', 'ei'],
['脂韻 重紐B類 並滂母', 'ei'],
['脂韻 重紐B類 幫母 平聲', 'ei'],
['脂韻 明母', 'ei'],
['微韻 幫並滂母', 'ei'],
['支脂之微韻 幫滂並母', 'i'],
['支韻 明母', 'i'],
['微韻 明母', 'uei'],
['支脂之微韻 開口', 'i'],
['支脂微韻 合口', 'uei'],
]],

// 遇攝
['模韻', [['明母', 'o'], ['', 'u']]],
['魚虞韻', [['從見精來孃清羣溪曉邪心疑以影云母', 'ü'], ['', 'u']]],

// 蟹攝
['齊韻', [['合口 或 常母', 'uei' ], ['', 'i']]],
['祭韻 明母', 'ei'],
['廢祭灰韻 合口', 'uei'],
['廢韻 幫組', 'ei'],
['祭韻 幫組', 'i'],
['廢祭韻 開口', [['章知組', 'r'], ['莊組', 'y' ], ['', 'i']]],
['佳韻 合口', [['見溪匣曉影母', 'ua' ], ['', 'uä']]],
['皆夬韻 合口', 'uä'],
['佳皆夬韻 幫組', 'ä'],
['佳皆夬韻 開口', [['疑母', 'iä' ], ['', 'ä']]],
['灰廢韻 幫組', 'ei'],
['灰韻 開口', [['以母', 'iä' ], ['', 'ä']]],
['咍韻', [['合口', 'uei'], ['以母', 'iä' ], ['', 'ä']]],
['泰韻 合口', 'uei'],
['泰韻 幫組', 'ei'],
['泰韻 開口', [['以母', 'iä' ], ['', 'ä']]],

// 臻攝
['文韻 入聲 幫組', 'u'],
['臻真殷文韻 入聲 合口', [['莊組', 'o'], ['知章組', 'u' ], ['', 'ü']]],
['臻真殷文韻 入聲 幫組', 'i'],
['臻真殷文韻 入聲 開口', [['莊組', 'ä'], ['章組 或 知徹澄日母', 'r' ], ['', 'i']]],
['臻真殷文韻 舒聲 開口', [['莊章組 或 日知徹澄母', 'en' ], ['', 'in']]],
['真韻 舒聲 幫組', 'in'],
['文韻 舒聲', [['明母', 'uen' ], ['來日書章知昌常徹澄船母 合口', 'uen' ], ['', 'üin']]],
['臻真殷文韻 舒聲 幫組', ['明母', 'uen' ], ['', 'en']],
['臻真殷韻 舒聲 合口', [['幫滂並母', 'en'], ['來明日書章知昌常徹澄船母', 'uen' ], ['', 'üin']]],
['魂痕韻 入聲', [['幫組 或 開口', 'o' ], ['', 'u']]],
['魂痕韻 舒聲 幫組', 'en'],
['魂痕韻 舒聲 開口', [['端組', 'uen' ], ['', 'en']]],
['魂痕韻 舒聲 合口', 'uen'],

// 山攝
['先韻 舒聲 合口', 'üän'],
['先韻 舒聲 開口 或 先韻 舒聲 幫組', [['崇母', 'uang'], ['見溪羣曉匣母', 'än' ], ['', 'iän']]],
['元韻 入聲 幫組', [['明母', 'ua' ], ['', 'a']]],
['元仙先韻 入聲 合口', [['日母 或 知莊章組', 'o' ], ['', 'üe']]],
['仙先韻 入聲 幫組', 'ie'],
['元仙先韻 入聲 開口', [['日母 或 知莊章組', 'ä'], ['見溪羣曉匣母', 'e' ], ['', 'ie']]],
['仙韻 舒聲 幫組', 'iän'],
['元韻 舒聲 幫組', [['明母', 'uang' ], ['', 'ang']]],
['元仙韻 舒聲 合口', [['日來母 或 知莊章組', 'uang' ], ['', 'üän']]],
['元仙韻 舒聲 開口', [['日知徹澄母 或 莊章組', 'ang'], ['見溪羣曉匣母', 'än' ], ['', 'iän']]],
['刪山韻 入聲', [['合口', 'ua'], ['疑影母', 'ia' ], ['', 'a']]],
['刪山韻 舒聲 幫組', 'ang'],
['刪山韻 舒聲 開口', [['影疑母', 'iän'], ['見溪羣曉匣母', 'än' ], ['', 'ang']]],
['刪山韻 舒聲 合口', 'uang'],
['寒韻 入聲 開口', [['見溪羣曉匣疑影母', 'o' ], ['', 'a']]],
['寒韻 入聲 幫組', 'o'],
['寒韻 入聲 合口', [['見組', 'uä' ], ['', 'o']]],
['寒韻 舒聲', [['開口 或 幫組', 'ang' ], ['', 'uang']]],

// 效攝
['蕭宵韻', [['見溪羣曉匣日母 或 知章組', 'ao' ], ['', 'iao']]],
['肴韻', [['疑母', 'iao' ], ['', 'ao']]],
['豪韻', 'ao'],

// 果攝
['歌韻', [['一等', 'o'], ['開口', 'e' ], ['', 'üe']]],

// 假攝
['麻韻 二等', [['合口', 'ua'], ['疑影母', 'ia' ], ['', 'a']]],
['麻韻 三等', [['日母 或 章組', 'e' ], ['', 'ie']]],

// 宕攝
['陽韻 入聲', [['心疑以影云來孃母 或 精組', 'io' ], ['', 'o']]],
['唐陽韻 舒聲 合口', 'uang'],
['唐陽韻 舒聲 幫滂並母', 'ang'],
['陽韻 舒聲 明母', 'uang'],
['陽韻 舒聲 開口', [['來孃疑以影母 或 精組', 'iang'], ['莊組', 'uang' ], ['', 'ang']]],
['唐韻 入聲', [['合口 見組', 'uä' ], ['', 'o']]],
['唐韻 舒聲 明母', 'ang'],
['唐韻 舒聲 開口', 'ang'],

// 梗攝
['庚韻 入聲 二等', [['合口', 'uä' ], ['', 'ä']]],
['庚韻 入聲 三等', [['莊組', 'ä'], ['合口', 'ü' ], ['', 'i']]],
['庚韻 舒聲 二等', [['合口', 'ong' ], ['', 'en']]]
['庚韻 舒聲 三等 合口', [['心以影母', 'in'], ['云影母', 'iong' ], ['', 'ong']]],
['庚韻 舒聲 三等 開口', [['知莊章組', 'en' ], ['', 'in']]],
['庚韻 舒聲 三等 幫組', 'in'],
['青韻 舒聲 合口', [['云影母', 'iong' ], ['', 'ong']]],
['青韻 舒聲 開口', 'in'],
['清青韻 入聲 幫組', 'i'],
['清青韻 入聲 合口', 'ü'],
['清青韻 入聲 開口', [['莊組', 'y'], ['知章組', 'r' ], ['', 'i']]],
['清韻 舒聲 合口 心以影母', 'in'],
['清韻 舒聲 合口 羣溪曉母', 'ong'],
['清韻 舒聲 合口 云影母', 'iong'],
['清青韻 舒聲 幫組', 'in'],
['清韻 舒聲 開口', [['知莊章組', 'en' ], ['', 'in']]],
['耕韻 入聲 合口', 'uä'],
['耕韻 入聲 開口 或 耕韻 入聲 幫組', 'ä'],
['耕韻 舒聲 幫組', 'en'],
['耕韻 舒聲 合口', 'ong' ],
['耕韻 舒聲 開口', [['匣影母', 'in' ], ['', 'en']]],

// 曾攝
['蒸韻 入聲 幫組', 'i'],
['蒸韻 入聲 合口', 'ü'],
['蒸韻 入聲 開口', [['莊組', 'ä'], ['知徹澄母 或 章組', 'r' ], ['', 'i']]],
['蒸韻 舒聲 幫組', 'in'],
['蒸韻 舒聲 開口', [['見組 或 來曉以影母', 'in' ], ['', 'en']]],
['登韻 入聲 幫組', 'ä'],
['登韻 入聲 合口', 'uä'],
['登韻 入聲 開口', 'ä'],
['登韻 舒聲 幫組', 'en'],
['登蒸韻 舒聲 合口', 'ong'],
['登韻 舒聲 開口', 'en'],

// 流攝
['幽韻', [['幫滂並母', 'iao'], ['見溪羣曉生母', 'ou' ], ['', 'iou']]],
['尤韻', [['幫滂並母', 'u'], ['精組 或 疑以影云孃來母', 'iou' ], ['', 'ou']]],
['侯韻', 'ou'],

// 深攝
['侵韻 入聲', [['莊組', 'ä'], ['章組 或 日知徹澄母', 'r' ], ['', 'i']]],
['侵韻 舒聲', [['章莊組 或 日知徹澄母', 'en' ], ['', 'in']]],

// 咸攝
['添韻 入聲', [['見溪羣曉匣母', 'e' ], ['', 'ie']]],
['添韻 舒聲', [['見溪羣曉匣母', 'än' ], ['', 'iän']]],
['鹽嚴凡韻 入聲 幫組', 'a'],
['鹽嚴凡韻 入聲 合口', [['徹孃母', 'ua' ], ['', 'a']]],
['鹽嚴凡韻 入聲 開口', [['莊章組 或 日知徹澄母', 'ä'], ['見溪羣曉匣母', 'e' ], ['', 'ie']]],
['鹽韻 舒聲 幫組', 'iän'],
['嚴凡韻 舒聲 幫組', [['明母', 'uang' ], ['', 'ang']]],
['鹽嚴凡韻 舒聲 合口', 'uang'],
['鹽嚴凡韻 舒聲 開口', [['日知徹澄母 或 莊章組', 'ang'], ['見溪羣曉匣母', 'än' ], ['', 'iän']]],
['咸銜韻 入聲', [['疑影母', 'ia' ], ['', 'a']]],
['咸銜韻 舒聲', [['來影疑母', 'iän'], ['見溪羣曉匣母', 'än' ], ['', 'ang']]],
['覃談韻 入聲', [['見組 或 匣曉影母', 'o' ], ['', 'a']]],
['覃談韻 舒聲', [['開口 或 幫組', 'ang' ], ['', 'uang'] ]],
], '無韻母規則');


function 聲調規則(音節) {
let 聲調 = when([
['清音', [
['平聲', '陰平'],
['上聲', '上聲'],
['去聲', '去聲'],
['入聲', '入聲'],
]],
['濁音', [
['平聲', '陽平'],
['上聲', [['全濁', '去聲'], ['次濁', '上聲']]],
['去聲', '去聲'],
['入聲', '入聲']],
],
], '無聲調規則');

if (選項.標調方式 === '附標') {
let 標調位置;
if (音節.match(元音Re)) {
let 第一個元音 = 音節.match(元音Re)[0];
標調位置 = 音節.indexOf(第一個元音);
if (元音.includes(音節[標調位置 + 1])) 標調位置 += 1; // 不要標在介音高頭
if (元音附標.includes(音節[標調位置 + 1])) 標調位置 += 1; // 不要標在附標下頭
if (音節.includes('a')) 標調位置 = 音節.indexOf('a');
else if (音節.includes('o')) 標調位置 = 音節.indexOf('o');
else if (音節.includes('e')) 標調位置 = 音節.indexOf('e');
} else {
標調位置 = 音節.indexOf('̩');
}
標調位置 += 1;
return 音節.slice(0, 標調位置) + 附標標調[聲調] + 音節.slice(標調位置);
}
else {
return 音節 + 次序標調[聲調];
}
}

let 聲母 = 聲母規則();
let 韻母 = 韻母規則();
return 聲調規則(聲母 + 韻母);

0 comments on commit cdc3610

Please sign in to comment.