diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index a2b342b..4b46699 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -10,10 +10,11 @@ on: jobs: build: - runs-on: windows-latest strategy: matrix: + os: [ windows-latest, ubuntu-latest ] python-version: ['3.10', '3.11', '3.12'] + runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v2 - name: Set up Python ${{ matrix.python-version }} @@ -25,6 +26,8 @@ jobs: python -m pip install -U pip pip install -r requirements.txt pip install build + - name: Test + run: python tests/test.py - name: Install package run: pip install . - name: Install PyTest diff --git a/README.md b/README.md index f037cbe..6e87771 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# qieyun-encoder-python +# Qieyun Encoder Python A Python library for the operating the basic structure of the Qieyun phonological system @@ -7,3 +7,12 @@ A Python library for the operating the basic structure of the Qieyun phonologica ```sh $ pip install qieyun-encoder ``` + +## Usage + +```python +import QieyunEncoder as QE +print(QE.音韻地位.from描述('幫三凡入').攝) # output: 咸 +``` + +For detailed usage, see [documentation](https://qieyun-encoder-python.readthedocs.io). diff --git a/docs/index.rst b/docs/index.rst index 35e151d..bb861d4 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -10,7 +10,9 @@ Qieyun Encoder Python 說明文件 :maxdepth: 1 常量 + 轉換 音韻地位 + 韻鏡位置 工具 @@ -56,7 +58,7 @@ Qieyun Encoder Python 說明文件 不要與中古後期三十六字母混淆。 - 中古後期三十六字母: + 中古後期三十六字母: .. raw:: html @@ -91,14 +93,14 @@ Qieyun Encoder Python 說明文件 韻與開合的關係如下: -- 開合皆有的韻:支脂微齊祭泰佳皆夬廢眞元寒刪山仙先歌麻陽唐庚耕清青蒸登 +- 開合兼備的韻:支脂微齊祭泰佳皆夬廢眞元寒刪山仙先歌麻陽唐庚耕清青蒸登 - 必爲開口的韻:咍痕欣嚴之魚臻蕭宵肴豪侯侵覃談鹽添咸銜 - 必爲合口的韻:灰魂文凡 - 開合中立的韻:東冬鍾江虞模尤幽 .. hint:: - 不要與韻圖的開合混淆。 + 不要與韻鏡的開合混淆。 以《韻鏡》爲例,開合有三種取值:開、合、開合。 @@ -124,9 +126,9 @@ Qieyun Encoder Python 說明文件 .. hint:: - 不要與韻圖的等混淆。 + 不要與韻鏡的等混淆。 - - 韻圖將重紐 A 類字置於四等,實際爲三等 + - 韻鏡將重紐 A 類字置於四等,實際爲三等 - 三等韻的莊組字列在二等 - 三等韻的精組字列在四等 - 三等的幽韻列在四等 @@ -151,10 +153,10 @@ Qieyun Encoder Python 說明文件 - 止攝:支脂之微 - 遇攝:魚虞模 - 蟹攝:齊佳皆灰咍祭泰夬廢 -- 臻攝:眞諄臻文欣元魂痕 -- 山攝:寒桓刪山先仙 +- 臻攝:真臻文殷魂痕 +- 山攝:元寒刪山先仙 - 效攝:蕭宵肴豪 -- 果攝:歌戈 +- 果攝:歌 - 假攝:麻 - 宕攝:唐陽 - 梗攝:庚耕清青 @@ -165,9 +167,9 @@ Qieyun Encoder Python 說明文件 .. hint:: - 元韻在臻攝而非山攝(註:下一版會改爲山攝)。 + 不使用諄桓戈韻,分別併入真寒歌韻。 - 《廣韻》沒有諄桓戈韻,分別併入眞寒歌韻。殷韻爲欣韻(註:下一版會改爲殷韻)。 + 使用殷韻的名稱,不使用欣韻;使用真韻的寫法,不使用眞韻。但構造函式及 ``from描述`` 方法具備容錯功能,會執行自動轉換。 聲 ^^ diff --git "a/docs/\345\270\270\351\207\217.rst" "b/docs/\345\270\270\351\207\217.rst" index f9ac9fb..fe688e5 100644 --- "a/docs/\345\270\270\351\207\217.rst" +++ "b/docs/\345\270\270\351\207\217.rst" @@ -1,6 +1,12 @@ QieyunEncoder.常量 ================== +.. raw:: html + + + .. automodule:: QieyunEncoder.常量 :members: :undoc-members: diff --git "a/docs/\350\275\211\346\217\233.rst" "b/docs/\350\275\211\346\217\233.rst" new file mode 100644 index 0000000..ebe5142 --- /dev/null +++ "b/docs/\350\275\211\346\217\233.rst" @@ -0,0 +1,8 @@ +QieyunEncoder.轉換 +================== + +.. automodule:: QieyunEncoder.轉換 + :imported-members: + :members: + :undoc-members: + :show-inheritance: diff --git "a/docs/\351\237\273\351\217\241\344\275\215\347\275\256.rst" "b/docs/\351\237\273\351\217\241\344\275\215\347\275\256.rst" new file mode 100644 index 0000000..cc836b0 --- /dev/null +++ "b/docs/\351\237\273\351\217\241\344\275\215\347\275\256.rst" @@ -0,0 +1,7 @@ +QieyunEncoder.韻鏡位置 +====================== + +.. automodule:: QieyunEncoder.韻鏡位置 + :members: + :undoc-members: + :show-inheritance: diff --git a/src/QieyunEncoder/__init__.py b/src/QieyunEncoder/__init__.py index 9f405fb..09feb9f 100644 --- a/src/QieyunEncoder/__init__.py +++ b/src/QieyunEncoder/__init__.py @@ -1,7 +1,9 @@ # -*- coding: utf-8 -*- from . import 常量 +from .工具 import * +from .轉換 import * from .音韻地位 import 音韻地位 -from .工具 import 反切, 正則化韻 +from .韻鏡位置 import 韻鏡位置 -__version__ = '0.4.3' +__version__ = '0.5.0' diff --git "a/src/QieyunEncoder/_\346\213\223\345\261\225\351\237\263\351\237\273\345\261\254\346\200\247.py" "b/src/QieyunEncoder/_\346\213\223\345\261\225\351\237\263\351\237\273\345\261\254\346\200\247.py" deleted file mode 100644 index 9bb7f46..0000000 --- "a/src/QieyunEncoder/_\346\213\223\345\261\225\351\237\263\351\237\273\345\261\254\346\200\247.py" +++ /dev/null @@ -1,106 +0,0 @@ -# -*- coding: utf-8 -*- - -母到清濁 = { - '幫': '全清', - '端': '全清', '知': '全清', - '精': '全清', '心': '全清', '莊': '全清', '生': '全清', '章': '全清', '書': '全清', - '見': '全清', '影': '全清', '曉': '全清', - '滂': '次清', - '透': '次清', '徹': '次清', - '清': '次清', '初': '次清', '昌': '次清', - '溪': '次清', - '並': '全濁', - '定': '全濁', '澄': '全濁', - '從': '全濁', '邪': '全濁', '崇': '全濁', '俟': '全濁', '常': '全濁', '船': '全濁', - '羣': '全濁', '匣': '全濁', - '明': '次濁', - '泥': '次濁', '孃': '次濁', '來': '次濁', '日': '次濁', - '疑': '次濁', '云': '次濁', '以': '次濁', -} - -母到音 = { - '幫': '脣', '滂': '脣', '並': '脣', '明': '脣', - '端': '舌', '透': '舌', '定': '舌', '泥': '舌', - '知': '舌', '徹': '舌', '澄': '舌', '孃': '舌', - '來': '舌', - '精': '齒', '清': '齒', '從': '齒', '心': '齒', '邪': '齒', - '莊': '齒', '初': '齒', '崇': '齒', '生': '齒', '俟': '齒', - '章': '齒', '昌': '齒', '常': '齒', '書': '齒', '船': '齒', - '日': '齒', - '見': '牙', '溪': '牙', '羣': '牙', '疑': '牙', - '影': '喉', '曉': '喉', '匣': '喉', '云': '喉', - '以': '喉', -} - -母到組 = { - '幫': '幫', '滂': '幫', '並': '幫', '明': '幫', - '端': '端', '透': '端', '定': '端', '泥': '端', - '知': '知', '徹': '知', '澄': '知', '孃': '知', - '精': '精', '清': '精', '從': '精', '心': '精', '邪': '精', - '莊': '莊', '初': '莊', '崇': '莊', '生': '莊', '俟': '莊', - '章': '章', '昌': '章', '船': '章', '書': '章', '常': '章', - '見': '見', '溪': '見', '羣': '見', '疑': '見', - '影': '影', '曉': '影', '匣': '影', '云': '影', - '來': None, '日': None, '以': None, -} - -韻到攝 = { - '東': '通', '冬': '通', '鍾': '通', - '江': '江', - '支': '止', '脂': '止', '之': '止', '微': '止', - '魚': '遇', '虞': '遇', '模': '遇', - '齊': '蟹', '佳': '蟹', '皆': '蟹', '灰': '蟹', '咍': '蟹', '祭': '蟹', '泰': '蟹', '夬': '蟹', '廢': '蟹', - '眞': '臻', '諄': '臻', '臻': '臻', '文': '臻', '欣': '臻', '元': '臻', '魂': '臻', '痕': '臻', - '寒': '山', '桓': '山', '刪': '山', '山': '山', '先': '山', '仙': '山', - '蕭': '效', '宵': '效', '肴': '效', '豪': '效', - '歌': '果', '戈': '果', - '麻': '假', - '唐': '宕', '陽': '宕', - '庚': '梗', '耕': '梗', '清': '梗', '青': '梗', - '登': '曾', '蒸': '曾', - '侯': '流', '尤': '流', '幽': '流', - '侵': '深', - '覃': '咸', '談': '咸', '鹽': '咸', '添': '咸', '咸': '咸', '銜': '咸', '嚴': '咸', '凡': '咸', -} - -# 實際可能超出此範圍,即「無音有字」 -母到標準等 = { - '幫': '一二三四', - '滂': '一二三四', - '並': '一二三四', - '明': '一二三四', - '端': '一四', - '透': '一四', - '定': '一四', - '泥': '一四', - '來': '一二三四', - '知': '二三', - '徹': '二三', - '澄': '二三', - '孃': '二三', - '精': '一三四', - '清': '一三四', - '從': '一三四', - '心': '一三四', - '邪': '三', - '莊': '二三', - '初': '二三', - '崇': '二三', - '生': '二三', - '俟': '三', - '章': '三', - '昌': '三', - '常': '三', - '書': '三', - '船': '三', - '日': '三', - '見': '一二三四', - '溪': '一二三四', - '羣': '三', - '疑': '一二三四', - '影': '一二三四', - '曉': '一二三四', - '匣': '一二四', - '云': '三', - '以': '三', -} diff --git "a/src/QieyunEncoder/_\346\257\215\345\260\215\346\207\211\347\232\204\346\250\231\346\272\226\347\255\211.py" "b/src/QieyunEncoder/_\346\257\215\345\260\215\346\207\211\347\232\204\346\250\231\346\272\226\347\255\211.py" new file mode 100644 index 0000000..2bfcc4c --- /dev/null +++ "b/src/QieyunEncoder/_\346\257\215\345\260\215\346\207\211\347\232\204\346\250\231\346\272\226\347\255\211.py" @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- + +# 實際可能超出此範圍,即「無音有字」 +母對應的標準等 = { + '幫': '一二三四', + '滂': '一二三四', + '並': '一二三四', + '明': '一二三四', + '端': '一四', + '透': '一四', + '定': '一四', + '泥': '一四', + '來': '一二三四', + '知': '二三', + '徹': '二三', + '澄': '二三', + '孃': '二三', + '精': '一三四', + '清': '一三四', + '從': '一三四', + '心': '一三四', + '邪': '三', + '莊': '二三', + '初': '二三', + '崇': '二三', + '生': '二三', + '俟': '三', + '章': '三', + '昌': '三', + '常': '三', + '書': '三', + '船': '三', + '日': '三', + '見': '一二三四', + '溪': '一二三四', + '羣': '三', + '疑': '一二三四', + '影': '一二三四', + '曉': '一二三四', + '匣': '一二四', + '云': '三', + '以': '三', +} diff --git "a/src/QieyunEncoder/\345\267\245\345\205\267/__init__.py" "b/src/QieyunEncoder/\345\267\245\345\205\267/__init__.py" index 9c3ed2b..95ea4d0 100644 --- "a/src/QieyunEncoder/\345\267\245\345\205\267/__init__.py" +++ "b/src/QieyunEncoder/\345\267\245\345\205\267/__init__.py" @@ -1,8 +1,6 @@ # -*- coding: utf-8 -*- -''' -與切韻音系相關的工具。 -''' - from .反切 import 反切 -from .正則化韻 import 正則化韻 +from .音韻地位到韻鏡位置 import 音韻地位到韻鏡位置 +from .音韻屬性到韻鏡位置們 import 音韻屬性到韻鏡位置們 +from .韻鏡位置到音韻地位 import 韻鏡位置到音韻地位 diff --git "a/src/QieyunEncoder/\345\267\245\345\205\267/\345\217\215\345\210\207.py" "b/src/QieyunEncoder/\345\267\245\345\205\267/\345\217\215\345\210\207.py" index d8b15b8..5250cbb 100644 --- "a/src/QieyunEncoder/\345\267\245\345\205\267/\345\217\215\345\210\207.py" +++ "b/src/QieyunEncoder/\345\267\245\345\205\267/\345\217\215\345\210\207.py" @@ -1,16 +1,10 @@ # -*- coding: utf-8 -*- -''' -根據反切規律自動完成反切過程。 -''' - -from typing import List from .. import 常量 +from .._母對應的標準等 import 母對應的標準等 from ..音韻地位 import 音韻地位 -from .._拓展音韻屬性 import 母到標準等 - -def _jointer(xs: List[str]): +def _jointer(xs: list[str]): ''' 將多個字串以頓號和「或」字連接。 @@ -25,7 +19,6 @@ def _jointer(xs: List[str]): ''' return ''.join(x + '、' for x in xs[:-2]) + '或'.join(xs[-2:]) - def 反切(上字音韻地位: 音韻地位, 下字音韻地位: 音韻地位, 顯示步驟=False, 類隔切=False): ''' 根據反切規律自動完成反切過程。 @@ -139,7 +132,7 @@ def 反切(上字音韻地位: 音韻地位, 下字音韻地位: 音韻地位, # 母對等的約束 - 標準等 = 母到標準等[母] + 標準等 = 母對應的標準等[母] if any(等1 not in 標準等 for 等1 in 等): 等 = ''.join(等1 for 等1 in 等 if 等1 in 標準等) 步驟.append(f'{母}母只能爲{標準等}等') diff --git "a/src/QieyunEncoder/\345\267\245\345\205\267/\346\255\243\345\211\207\345\214\226\351\237\273.py" "b/src/QieyunEncoder/\345\267\245\345\205\267/\346\255\243\345\211\207\345\214\226\351\237\273.py" deleted file mode 100644 index 811f996..0000000 --- "a/src/QieyunEncoder/\345\267\245\345\205\267/\346\255\243\345\211\207\345\214\226\351\237\273.py" +++ /dev/null @@ -1,85 +0,0 @@ -# -*- coding: utf-8 -*- - -''' -將切韻系韻書的韻目轉換爲韻。 -''' - -_非標準韻表 = [ - '東董蕫送屋', - '冬湩宋沃𣵽', - '鍾腫用燭', - '江講絳覺', - '支紙寘', - '脂旨至', - '之止志', - '微尾未', - '魚語御', - '虞麌噳遇', - '模姥暮莫', - '齊薺霽', - '佳蟹卦', - '皆駭怪', - '灰賄隊', - '咍海代', - '眞諄軫準震稕質術', - '臻𧤛櫬櫛', - '文吻問物勿', - '欣隱焮迄', - '元阮願月', - '魂混慁圂沒䰟', - '痕很恨麧', - '寒旱翰曷桓緩換末', - '桓緩換末', - '刪𠜂潸諫鎋舝', - '山產襇黠', - '先銑霰屑㞕', - '仙㒨獮𤣗線薛𧀼', - '蕭篠筱嘯', - '宵小笑霄𥬇', - '肴爻巧效', - '豪晧号', - '歌戈哿果箇過', - '麻馬禡', - '陽養漾藥', - '唐蕩宕鐸', - '庚梗映敬陌', - '耕耿諍麥', - '清靜勁昔㫺', - '青迥徑錫', - '蒸拯抍證職', - '登等嶝隥德', - '尤有宥', - '侯矦厚𠪀候𠊱', - '幽黝幼', - '侵寑沁緝寢', - '覃𧟹感勘合', - '談敢𠭖闞盍盇', - '鹽琰豔驗葉', - '添沾忝㮇栝怗帖', - '咸豏陷洽', - '銜檻鑑狎', - '嚴儼釅㽉業', - '凡范梵乏', - '祭', - '廢', - '泰', - '夬𡗒', -] - -_標準韻映射表 = {非標準韻: 非標準韻們[0] for 非標準韻們 in _非標準韻表 for 非標準韻 in 非標準韻們} - - -def 正則化韻(韻: str): - ''' - 將切韻系韻書的韻目轉換爲韻。 - - Examples: - - >>> 正則化韻('物') - '文' - >>> 正則化韻('敬') - '庚' - >>> 正則化韻('東') - '東' - ''' - return _標準韻映射表[韻] diff --git "a/src/QieyunEncoder/\345\267\245\345\205\267/\351\237\263\351\237\273\345\234\260\344\275\215\345\210\260\351\237\273\351\217\241\344\275\215\347\275\256.py" "b/src/QieyunEncoder/\345\267\245\345\205\267/\351\237\263\351\237\273\345\234\260\344\275\215\345\210\260\351\237\273\351\217\241\344\275\215\347\275\256.py" new file mode 100644 index 0000000..8ec36cb --- /dev/null +++ "b/src/QieyunEncoder/\345\267\245\345\205\267/\351\237\263\351\237\273\345\234\260\344\275\215\345\210\260\351\237\273\351\217\241\344\275\215\347\275\256.py" @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- + +from ..音韻地位 import 音韻地位 +from ..韻鏡位置 import 韻鏡位置 + +def 音韻地位到韻鏡位置(當前音韻地位: 音韻地位) -> 韻鏡位置: + ''' + 將音韻地位轉換爲韻鏡位置。 + ''' + raise NotImplementedError diff --git "a/src/QieyunEncoder/\345\267\245\345\205\267/\351\237\263\351\237\273\345\261\254\346\200\247\345\210\260\351\237\273\351\217\241\344\275\215\347\275\256\345\200\221.py" "b/src/QieyunEncoder/\345\267\245\345\205\267/\351\237\263\351\237\273\345\261\254\346\200\247\345\210\260\351\237\273\351\217\241\344\275\215\347\275\256\345\200\221.py" new file mode 100644 index 0000000..4b9eaa0 --- /dev/null +++ "b/src/QieyunEncoder/\345\267\245\345\205\267/\351\237\263\351\237\273\345\261\254\346\200\247\345\210\260\351\237\273\351\217\241\344\275\215\347\275\256\345\200\221.py" @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- + +from .. import 常量 +from ..轉換 import 韻目到韻, 母到組 +from ..韻鏡位置 import 韻鏡位置 + +def 音韻屬性到韻鏡位置們(母: str, 韻目: str, 聲: str): + ''' + 將音韻屬性轉換爲韻鏡位置。 + ''' + + 韻鏡母 = { + '幫': '幫非', '滂': '滂敷', '並': '並奉', '明': '明微', + '精': '精照', '清': '清穿', '從': '從牀', '心': '心審', '邪': '邪禪', + '莊': '精照', '初': '清穿', '崇': '從牀', '生': '心審', '俟': '邪禪', + '章': '精照', '昌': '清穿', '常': '從牀', '書': '心審', '船': '邪禪', + '云': '喻', '以': '喻' + }.get(母, 母) + + 韻 = 韻目到韻(韻目) + + # 開合分韻:戈果過 + 韻鏡開合們 = ('合' if 韻目 in '戈果過' else '開合') if 韻 in 常量.開合兼備的韻 else (None,) + + 組 = 母到組(母) + + # 切韻一等韻、二等韻、四等韻只排在韻鏡一等、二等、四等 + # 切韻三等韻中的幽韻也排在韻鏡四等 + if 韻 in 常量.一等韻: + 韻鏡等們 = '一' + elif 韻 in 常量.二等韻: + 韻鏡等們 = '二' + elif 韻 in 常量.四等韻 or 韻 == '幽': + 韻鏡等們 = '四' + + # 切韻三等韻(除幽韻)、一三等韻、二三等韻的情況 + else: + # 處理切韻音韻地位不取切韻三等的情況 + if 韻 in 常量.一三等韻: + 韻鏡等們 = '一' # 切韻一三等韻若取一等,則韻鏡排在一等 + elif 韻 in 常量.二三等韻: + 韻鏡等們 = '二' # 切韻二三等韻若取二等,則韻鏡排在二等 + else: + 韻鏡等們 = '' + + # 處理切韻音韻地位取切韻三等的情況 + if 組 == '精': + 韻鏡等們 += '四' # 切韻三等的精組字排在韻鏡四等 + elif 組 == '莊': + if 韻鏡等們 != '二': + 韻鏡等們 += '二' # 切韻三等的莊組字排在韻鏡二等 + elif 母 in 常量.重紐母 and 韻 in 常量.重紐韻: + 韻鏡等們 += '三四' # 重紐排在韻鏡三等或四等 + else: + 韻鏡等們 += '三' # 其餘情況排在三等 + + return [韻鏡位置(韻鏡母, 韻鏡開合, 韻鏡等, 韻, 聲) for 韻鏡開合 in 韻鏡開合們 for 韻鏡等 in 韻鏡等們] diff --git "a/src/QieyunEncoder/\345\267\245\345\205\267/\351\237\273\351\217\241\344\275\215\347\275\256\345\210\260\351\237\263\351\237\273\345\234\260\344\275\215.py" "b/src/QieyunEncoder/\345\267\245\345\205\267/\351\237\273\351\217\241\344\275\215\347\275\256\345\210\260\351\237\263\351\237\273\345\234\260\344\275\215.py" new file mode 100644 index 0000000..5a76da7 --- /dev/null +++ "b/src/QieyunEncoder/\345\267\245\345\205\267/\351\237\273\351\217\241\344\275\215\347\275\256\345\210\260\351\237\263\351\237\273\345\234\260\344\275\215.py" @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- + +from .. import 常量 +from ..音韻地位 import 音韻地位 +from ..韻鏡位置 import 韻鏡位置 + +def 韻鏡位置到音韻地位(當前韻鏡位置: 韻鏡位置) -> 音韻地位: + ''' + 將韻鏡位置轉換爲音韻地位。 + + Example: + + >>> 韻鏡位置到音韻地位(韻鏡位置('幫', None, '三', '凡', '入')) == 音韻地位.from描述('幫三凡入') + True + ''' + 韻鏡母號 = 當前韻鏡位置.韻鏡母號 + 韻鏡母 = 當前韻鏡位置.最簡韻鏡母 + 韻鏡開合 = 當前韻鏡位置.韻鏡開合 + 韻鏡等 = 當前韻鏡位置.韻鏡等 + 韻 = 當前韻鏡位置.韻 + 聲 = 當前韻鏡位置.聲 + + if 韻 in 常量.一三等韻: + 切韻等 = '一' if 韻鏡等 == '一' else '三' + elif 韻 in 常量.二三等韻: + 切韻等 = '二' if 韻鏡等 == '二' else '三' # TODO: 生 + else: + 切韻等 = None + + if 0 <= 韻鏡母號 < 4: # 幫非組 + 切韻母 = '幫滂並明'[韻鏡母號] + elif 12 <= 韻鏡母號 < 17: # 齒音 + if 韻鏡等 in '一四': + 切韻母 = '精清從心邪'[韻鏡母號 - 12] + elif 韻鏡等 in '三': + 切韻母 = '章昌船書常'[韻鏡母號 - 12] # TODO: 常船 + else: + 切韻母 = '莊初崇生俟'[韻鏡母號 - 12] + elif 韻鏡母號 == 20: # 喻母 + 切韻母 = '云' if 韻鏡等 == '三' else '以' + else: + 切韻母 = 韻鏡母 + + if 切韻母 in '幫滂並明': + 切韻開合 = None + else: + 切韻開合 = 韻鏡開合 + + if 切韻母 not in 常量.重紐母 or 韻 not in 常量.重紐韻: + 重紐 = '' + elif 韻鏡等 == '三': + 重紐 = 'B' + else: + 重紐 = 'A' + + 描述 = 切韻母 + (切韻開合 or '') + (切韻等 or '') + (重紐 or '') + 韻 + 聲 + return 音韻地位.from描述(描述) diff --git "a/src/QieyunEncoder/\345\270\270\351\207\217.py" "b/src/QieyunEncoder/\345\270\270\351\207\217.py" index 9ffddf4..21c0f10 100644 --- "a/src/QieyunEncoder/\345\270\270\351\207\217.py" +++ "b/src/QieyunEncoder/\345\270\270\351\207\217.py" @@ -1,19 +1,5 @@ # -*- coding: utf-8 -*- -''' -音韻學常用常量。 -''' - -# class 常量: - -# Examples: - -# >>> Qieyun.常量.重紐母 -# '幫滂並明見溪羣疑影曉' -# >>> '溪' in Qieyun.常量.重紐母 -# True -# ''' - 所有母 = '幫滂並明端透定泥來知徹澄孃精清從心邪莊初崇生俟章昌常書船日見溪羣疑影曉匣云以' '''str: 所有母''' @@ -26,7 +12,7 @@ 所有重紐 = 'AB' '''str: 所有重紐''' -所有韻 = '東冬鍾江支脂之微魚虞模齊祭泰佳皆夬灰咍廢眞臻文欣元魂痕寒刪山仙先蕭宵肴豪歌麻陽唐庚耕清青蒸登尤侯幽侵覃談鹽添咸銜嚴凡' +所有韻 = '東冬鍾江支脂之微魚虞模齊祭泰佳皆夬灰咍廢真臻文殷元魂痕寒刪山仙先蕭宵肴豪歌麻陽唐庚耕清青蒸登尤侯幽侵覃談鹽添咸銜嚴凡' '''str: 所有韻''' 所有聲 = '平上去入' @@ -36,14 +22,14 @@ 重紐母 = '幫滂並明見溪羣疑影曉' '''str: 重紐母''' -重紐韻 = '支脂祭眞仙宵清侵鹽' +重紐韻 = '支脂祭真仙宵清侵鹽' '''str: 重紐韻''' -開合皆有的韻 = '支脂微齊祭泰佳皆夬廢眞元寒刪山仙先歌麻陽唐庚耕清青蒸登' -'''str: 開合皆有的韻''' +開合兼備的韻 = '支脂微齊祭泰佳皆夬廢真元寒刪山仙先歌麻陽唐庚耕清青蒸登' +'''str: 開合兼備的韻''' -必爲開口的韻 = '咍痕欣嚴之魚臻蕭宵肴豪侯侵覃談鹽添咸銜' +必爲開口的韻 = '咍痕殷嚴之魚臻蕭宵肴豪侯侵覃談鹽添咸銜' '''str: 必爲開口的韻''' 必爲合口的韻 = '灰魂文凡' @@ -59,7 +45,7 @@ 二等韻 = '江佳皆夬刪山肴耕咸銜' '''str: 二等韻''' -三等韻 = '鍾支脂之微魚虞祭廢眞臻欣元文仙宵陽清蒸尤幽侵鹽嚴凡' +三等韻 = '鍾支脂之微魚虞祭廢真臻殷元文仙宵陽清蒸尤幽侵鹽嚴凡' '''str: 三等韻''' 四等韻 = '齊先蕭青添' @@ -72,10 +58,21 @@ '''str: 二三等韻''' +所有音 = '脣舌齒牙喉' +'''str: 所有音''' + +所有組 = '幫端知精莊章見影' +'''str: 所有組''' + +所有類 = '方博芳普符蒲武莫都他徒奴陟丑直女子作七倉疾昨息蘇徐側初士所俟之昌食式時居古去苦渠魚五於烏許呼胡于以力盧而' +'''str: 所有類''' + +所有攝 = '通江止遇蟹臻山效果假宕梗曾流深咸' +'''str: 所有攝''' + + 輕脣韻 = '東鍾微虞廢文元陽尤凡' '''str: 輕脣韻''' - 次入韻 = '祭泰夬廢' '''str: 次入韻''' - diff --git "a/src/QieyunEncoder/\350\275\211\346\217\233/__init__.py" "b/src/QieyunEncoder/\350\275\211\346\217\233/__init__.py" new file mode 100644 index 0000000..8e1e10a --- /dev/null +++ "b/src/QieyunEncoder/\350\275\211\346\217\233/__init__.py" @@ -0,0 +1,8 @@ +# -*- coding: utf-8 -*- + +from .母到清濁 import 母到清濁 +from .母到組 import 母到組 +from .母到音 import 母到音 +from .母與等到類 import 母與等到類 +from .韻到攝 import 韻到攝 +from .韻目到韻 import 韻目到韻 diff --git "a/src/QieyunEncoder/\350\275\211\346\217\233/\346\257\215\345\210\260\346\270\205\346\277\201.py" "b/src/QieyunEncoder/\350\275\211\346\217\233/\346\257\215\345\210\260\346\270\205\346\277\201.py" new file mode 100644 index 0000000..4b67599 --- /dev/null +++ "b/src/QieyunEncoder/\350\275\211\346\217\233/\346\257\215\345\210\260\346\270\205\346\277\201.py" @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- + +_清濁到母表 = ( + ('全清', '幫端知精心莊生章書見影曉'), + ('次清', '滂透徹清初昌溪'), + ('全濁', '並定澄從邪崇俟常船羣匣'), + ('次濁', '明泥孃來日疑云以'), +) + +_母到清濁映射表 = {母: 清濁 for 清濁, 母們 in _清濁到母表 for 母 in 母們} + +def 母到清濁(母: str) -> str: + ''' + 將母轉換爲清濁。 + + Examples: + + >>> 母到清濁('端') + '全清' + >>> 母到清濁('以') + '次濁' + ''' + return _母到清濁映射表[母] diff --git "a/src/QieyunEncoder/\350\275\211\346\217\233/\346\257\215\345\210\260\347\265\204.py" "b/src/QieyunEncoder/\350\275\211\346\217\233/\346\257\215\345\210\260\347\265\204.py" new file mode 100644 index 0000000..8c216a0 --- /dev/null +++ "b/src/QieyunEncoder/\350\275\211\346\217\233/\346\257\215\345\210\260\347\265\204.py" @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- + +_組到母表 = ( + ('幫', '幫滂並明'), + ('端', '端透定泥'), + ('知', '知徹澄孃'), + ('精', '精清從心邪'), + ('莊', '莊初崇生俟'), + ('章', '章昌船書常'), + ('見', '見溪羣疑'), + ('影', '影曉匣云'), + (None, '來日以'), +) + +_母到組映射表 = {母: 組 for 組, 母們 in _組到母表 for 母 in 母們} + +def 母到組(母: str) -> str | None: + ''' + 將母轉換爲組。 + + Examples: + + >>> 母到組('滂') + '幫' + >>> 母到組('云') + '影' + >>> 母到組('以') + None + ''' + return _母到組映射表[母] diff --git "a/src/QieyunEncoder/\350\275\211\346\217\233/\346\257\215\345\210\260\351\237\263.py" "b/src/QieyunEncoder/\350\275\211\346\217\233/\346\257\215\345\210\260\351\237\263.py" new file mode 100644 index 0000000..d011cdf --- /dev/null +++ "b/src/QieyunEncoder/\350\275\211\346\217\233/\346\257\215\345\210\260\351\237\263.py" @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- + +_音到母表 = ( + ('脣', '幫滂並明'), + ('舌', '端透定泥知徹澄孃來'), + ('齒', '精清從心邪莊初崇生俟章昌常書船日'), + ('牙', '見溪羣疑'), + ('喉', '影曉匣云以'), +) + +_母到音映射表 = {母: 音 for 音, 母們 in _音到母表 for 母 in 母們} + +def 母到音(母: str) -> str: + ''' + 將母轉換爲音。 + + Examples: + + >>> 母到音('並') + '脣' + >>> 母到音('羣') + '牙' + ''' + return _母到音映射表[母] diff --git "a/src/QieyunEncoder/\350\275\211\346\217\233/\346\257\215\350\210\207\347\255\211\345\210\260\351\241\236.py" "b/src/QieyunEncoder/\350\275\211\346\217\233/\346\257\215\350\210\207\347\255\211\345\210\260\351\241\236.py" new file mode 100644 index 0000000..29ee330 --- /dev/null +++ "b/src/QieyunEncoder/\350\275\211\346\217\233/\346\257\215\350\210\207\347\255\211\345\210\260\351\241\236.py" @@ -0,0 +1,79 @@ +# -*- coding: utf-8 -*- + +_五十一聲類映射表 = ( + ('方', '幫', '三'), + ('博', '幫', None), + ('芳', '滂', '三'), + ('普', '滂', None), + ('符', '並', '三'), + ('蒲', '並', None), + ('武', '明', '三'), + ('莫', '明', None), + ('都', '端', None), + ('他', '透', None), + ('徒', '定', None), + ('奴', '泥', None), + ('陟', '知', None), + ('丑', '徹', None), + ('直', '澄', None), + ('女', '孃', None), + ('子', '精', '三'), + ('作', '精', None), + ('七', '清', '三'), + ('倉', '清', None), + ('疾', '從', '三'), + ('昨', '從', None), + ('息', '心', '三'), + ('蘇', '心', None), + ('徐', '邪', None), # 僅三等 + ('側', '莊', None), + ('初', '初', None), + ('士', '崇', None), + ('所', '生', None), + ('俟', '俟', None), # 俟母獨立,故實為五十二個 + ('之', '章', None), + ('昌', '昌', None), + ('食', '船', None), + ('式', '書', None), + ('時', '常', None), + ('居', '見', '三'), + ('古', '見', None), + ('去', '溪', '三'), + ('苦', '溪', None), + ('渠', '羣', None), # 僅三等 + ('魚', '疑', '三'), + ('五', '疑', None), + ('於', '影', '三'), + ('烏', '影', None), + ('許', '曉', '三'), + ('呼', '曉', None), + ('胡', '匣', None), + ('于', '云', None), + ('以', '以', None), + ('力', '來', '二三'), # 來母二等字實際反切上字多為三等 + ('盧', '來', None), + ('而', '日', None), +) + +def 母與等到類(母: str, 等: str) -> str: + ''' + 由母與等確定五十一聲類。 + + 注意五十一聲類中俟母獨立,故實為五十二個。 + + :param 母: 聲母 + :type 母: str + :param 等: 等 + :type 等: str + + Example: + + >>> 母與等到類('見', '二') + '古' + >>> 母與等到類('並', '三') + '符' + ''' + for 聲類, 母條件, 等條件 in _五十一聲類映射表: + if 母 == 母條件 and (等條件 is None or 等 in 等條件): + return 聲類 + raise ValueError(f'無法確定五十一聲類:{母}母{等}等') diff --git "a/src/QieyunEncoder/\350\275\211\346\217\233/\351\237\273\345\210\260\346\224\235.py" "b/src/QieyunEncoder/\350\275\211\346\217\233/\351\237\273\345\210\260\346\224\235.py" new file mode 100644 index 0000000..452947b --- /dev/null +++ "b/src/QieyunEncoder/\350\275\211\346\217\233/\351\237\273\345\210\260\346\224\235.py" @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- + +_攝到韻表 = ( + ('通', '東冬鍾'), + ('江', '江'), + ('止', '支脂之微'), + ('遇', '魚虞模'), + ('蟹', '齊佳皆灰咍祭泰夬廢'), + ('臻', '真臻文殷魂痕'), + ('山', '元寒刪山先仙'), + ('效', '蕭宵肴豪'), + ('果', '歌'), + ('假', '麻'), + ('宕', '唐陽'), + ('梗', '庚耕清青'), + ('曾', '登蒸'), + ('流', '侯尤幽'), + ('深', '侵'), + ('咸', '覃談鹽添咸銜嚴凡'), +) + +_韻到攝映射表 = {韻: 攝 for 攝, 韻們 in _攝到韻表 for 韻 in 韻們} + +def 韻到攝(韻: str) -> str: + ''' + 將韻轉換爲攝。 + + Examples: + + >>> 韻到攝('冬') + '通' + >>> 韻到攝('侵') + '深' + ''' + return _韻到攝映射表[韻] diff --git "a/src/QieyunEncoder/\350\275\211\346\217\233/\351\237\273\347\233\256\345\210\260\351\237\273.py" "b/src/QieyunEncoder/\350\275\211\346\217\233/\351\237\273\347\233\256\345\210\260\351\237\273.py" new file mode 100644 index 0000000..916369f --- /dev/null +++ "b/src/QieyunEncoder/\350\275\211\346\217\233/\351\237\273\347\233\256\345\210\260\351\237\273.py" @@ -0,0 +1,95 @@ +# -*- coding: utf-8 -*- + +import warnings + +# 經典韻系 + +# 首字爲 `QieyunEncoder` 認定的標準韻,之後爲非標準韻 +# 非標準韻的情況: +# - 異體字(如眞→真) +# - 後世韻書更改韻目(如殷→欣) +# - 後世韻書拆分韻目(如真→真諄) +# +# 特例:王三有兩個嚴韻 +_非標準韻表 = ( + '東 董蕫 送 屋', + '冬 湩 宋 沃𣵽', + '鍾鐘 腫 用 燭', + '江 講 絳 覺', + '支 紙 寘', + '脂 旨 至', + '之 止 志', + '微 尾 未', + '魚 語 御', + '虞 麌噳 遇', + '模 姥 暮莫', + '齊 薺 霽', + '佳 蟹 卦', + '皆𣅜 駭 怪', + '灰 賄 隊', + '咍 海 代', + '真眞諄𧩽 軫準 震稕 質術', + '臻 𧤛 櫬 櫛', + '文 吻 問 物勿', + '殷欣 隱 焮 迄', + '元 阮 願 月', + '魂䰟 混 慁圂 沒', + '痕 很佷 恨𢙃 麧', + '寒桓 旱緩 翰換 曷末', + '刪𠜂 潸 諫 鎋舝', + '山 產産 襇襉 黠', + '先 銑 霰 屑㞕', + '仙㒨 獮𤣗 線 薛𧀼', + '蕭 篠筱 嘯', + '宵霄 小 笑𥬇', + '肴爻 巧 效', + '豪𩫚 晧 号', + '歌戈 哿果 箇過', + '麻 馬 禡', + '陽 養 漾 藥', + '唐 蕩 宕 鐸', + '庚 梗 映敬 陌', + '耕 耿 諍 麥', + '清淸 靜 勁 昔㫺', + '青靑 迥 徑 錫', + '蒸 拯抍 證 職', + '登 等 嶝隥 德', + '尤 有 宥', + '侯矦 厚𠪀 候𠊱𠋫', + '幽 黝 幼㓜', + '侵 寑寢 沁 緝', + '覃𧟹 感 勘 合', + '談 敢𠭖 闞 盍盇', + '鹽 琰 豔 葉', + '添沾 忝 㮇栝 怗帖', + '咸 豏 陷 洽', + '銜 檻 鑑㽉 狎', + '嚴 儼广 釅驗 業', + '凡 范 梵 乏', + '祭', + '廢', + '泰夳', + '夬𡗒', +) + +_標準韻映射表 = {非標準韻: 非標準韻們[0] for 非標準韻們 in _非標準韻表 for 非標準韻 in 非標準韻們.replace(' ', '')} + +def 韻目到韻(韻: str) -> str: + ''' + 將切韻系韻書的韻目轉換爲韻。 + + 此函式具有冪等性,即 ``韻目到韻(韻目到韻(韻目)) == 韻目到韻(韻目)`` 永遠成立。 + + Examples: + + >>> 韻目到韻('物') + '文' + >>> 韻目到韻('敬') + '庚' + >>> 韻目到韻('東') + '東' + ''' + if 韻 == '驗': + warning = "There is more confusion between 鹽B and 嚴 in 集韻, so '驗' (廣韻鹽B) becomes 嚴 in 集韻" + warnings.warn(warning) + return _標準韻映射表[韻] diff --git "a/src/QieyunEncoder/\351\237\263\351\237\273\345\234\260\344\275\215.py" "b/src/QieyunEncoder/\351\237\263\351\237\273\345\234\260\344\275\215.py" index e0d0512..cc65f39 100644 --- "a/src/QieyunEncoder/\351\237\263\351\237\273\345\234\260\344\275\215.py" +++ "b/src/QieyunEncoder/\351\237\263\351\237\273\345\234\260\344\275\215.py" @@ -3,12 +3,12 @@ import re from . import 常量 -from ._拓展音韻屬性 import 母到清濁, 母到音, 母到組, 韻到攝 +from ._母對應的標準等 import 母對應的標準等 +from .轉換 import 母到清濁, 母到音, 母到組, 韻到攝, 母與等到類 編碼表 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789' -韻順序表 = '東_冬鍾江支脂之微魚虞模齊祭泰佳皆夬灰咍廢眞臻文欣元魂痕寒刪山仙先蕭宵肴豪歌_麻_陽唐庚_耕清青蒸登尤侯幽侵覃談鹽添咸銜嚴凡' - -解析音韻描述 = re.compile(fr'([{常量.所有母}])([{常量.所有呼}]?)([{常量.所有等}]?)([{常量.所有重紐}]?)([{常量.所有韻}])([{常量.所有聲}])') +韻順序表 = '東_冬鍾江支脂之微魚虞模齊祭泰佳皆夬灰咍廢真臻文殷元魂痕寒刪山仙先蕭宵肴豪歌_麻_陽唐庚_耕清青蒸登尤侯幽侵覃談鹽添咸銜嚴凡' +解析音韻描述 = re.compile(fr'([{常量.所有母}])([{常量.所有呼}])?([{常量.所有等}])?([{常量.所有重紐}])?([{常量.所有韻}])([{常量.所有聲}])') class 音韻地位: ''' @@ -16,7 +16,7 @@ class 音韻地位: :param 母: 聲母 :type 母: str - :param 呼: 呼(開口呼/合口呼),可以爲 ``None`` + :param 呼: 呼(開/合),可以爲 ``None`` :type 呼: str, optional :param 等: 等 :type 等: str @@ -29,6 +29,8 @@ class 音韻地位: ''' def __init__(self, 母: str, 呼: str | None, 等: str, 重紐: str | None, 韻: str, 聲: str): + 韻 = 韻.replace('欣', '殷').replace('眞', '真') # 容錯 + 音韻地位.驗證(母, 呼, 等, 重紐, 韻, 聲) self.母 = 母 @@ -45,12 +47,12 @@ def 清濁(self) -> str: Examples: - >>> Qieyun.音韻地位.from描述('幫三凡入').清濁 + >>> QieyunEncoder.音韻地位.from描述('幫三凡入').清濁 '全清' - >>> Qieyun.音韻地位.from描述('羣開三A支平').清濁 + >>> QieyunEncoder.音韻地位.from描述('羣開三A支平').清濁 '全濁' ''' - return 母到清濁[self.母] + return 母到清濁(self.母) @property def 音(self) -> str: @@ -59,12 +61,12 @@ def 音(self) -> str: Examples: - >>> Qieyun.音韻地位.from描述('幫三凡入').音 + >>> QieyunEncoder.音韻地位.from描述('幫三凡入').音 '脣' - >>> Qieyun.音韻地位.from描述('羣開三A支平').音 + >>> QieyunEncoder.音韻地位.from描述('羣開三A支平').音 '牙' ''' - return 母到音[self.母] + return 母到音(self.母) @property def 組(self) -> str | None: @@ -73,12 +75,12 @@ def 組(self) -> str | None: Examples: - >>> Qieyun.音韻地位.from描述('幫三凡入').組 + >>> QieyunEncoder.音韻地位.from描述('幫三凡入').組 '幫' - >>> Qieyun.音韻地位.from描述('羣開三A支平').組 + >>> QieyunEncoder.音韻地位.from描述('羣開三A支平').組 '見' ''' - return 母到組[self.母] + return 母到組(self.母) @property def 攝(self) -> str: @@ -87,12 +89,28 @@ def 攝(self) -> str: Examples: - >>> Qieyun.音韻地位.from描述('幫三凡入').攝 + >>> QieyunEncoder.音韻地位.from描述('幫三凡入').攝 '咸' - >>> Qieyun.音韻地位.from描述('羣開三A支平').攝 + >>> QieyunEncoder.音韻地位.from描述('羣開三A支平').攝 '止' ''' - return 韻到攝[self.韻] + return 韻到攝(self.韻) + + @property + def 類(self) -> str: + ''' + 五十一聲類。 + + 注意五十一聲類中俟母獨立,故實為五十二個。 + + Examples: + + >>> QieyunEncoder.音韻地位.from描述('幫三凡入').類 + '方' + >>> QieyunEncoder.音韻地位.from描述('羣開三A支平').類 + '渠' + ''' + return 母與等到類(self.母, self.等) @property def 描述(self) -> str: @@ -101,9 +119,9 @@ def 描述(self) -> str: Examples: - >>> Qieyun.音韻地位.from描述('幫三凡入').描述 + >>> QieyunEncoder.音韻地位.from描述('幫三凡入').描述 '幫三凡入' - >>> Qieyun.音韻地位.from描述('羣開三A支平').描述 + >>> QieyunEncoder.音韻地位.from描述('羣開三A支平').描述 '羣開三A支平' ''' 母 = self.母 @@ -122,9 +140,9 @@ def 最簡描述(self) -> str: Examples: - >>> Qieyun.音韻地位.from描述('幫三凡入').最簡描述 + >>> QieyunEncoder.音韻地位.from描述('幫三凡入').最簡描述 '幫凡入' - >>> Qieyun.音韻地位.from描述('羣開三A支平').最簡描述 + >>> QieyunEncoder.音韻地位.from描述('羣開三A支平').最簡描述 '羣開A支平' ''' 母 = self.母 @@ -134,12 +152,14 @@ def 最簡描述(self) -> str: 韻 = self.韻 聲 = self.聲 - if 韻 not in 常量.開合皆有的韻: - 呼 = None + if 韻 not in 常量.開合兼備的韻: + 呼 = '' if 韻 not in 常量.一三等韻 and 韻 not in 常量.二三等韻: - 等 = None + 等 = '' + if 重紐 is None: + 重紐 = '' - return 母 + (呼 or '') + (等 or '') + (重紐 or '') + 韻 + 聲 + return f'{母}{呼}{等}{重紐}{韻}{聲}' @property def 表達式(self) -> str: @@ -148,9 +168,9 @@ def 表達式(self) -> str: Examples: - >>> Qieyun.音韻地位.from描述('幫三凡入').表達式 + >>> QieyunEncoder.音韻地位.from描述('幫三凡入').表達式 '幫母 三等 凡韻 入聲' - >>> Qieyun.音韻地位.from描述('羣開三A支平').表達式 + >>> QieyunEncoder.音韻地位.from描述('羣開三A支平').表達式 '羣母 開口 三等 重紐A類 支韻 平聲' ''' 母 = self.母 @@ -172,9 +192,9 @@ def 最簡表達式(self) -> str: Examples: - >>> Qieyun.音韻地位.from描述('幫三凡入').最簡表達式 + >>> QieyunEncoder.音韻地位.from描述('幫三凡入').最簡表達式 '幫母 凡韻 入聲' - >>> Qieyun.音韻地位.from描述('羣開三A支平').最簡表達式 + >>> QieyunEncoder.音韻地位.from描述('羣開三A支平').最簡表達式 '羣母 開口 重紐A類 支韻 平聲' ''' 母 = self.母 @@ -184,10 +204,10 @@ def 最簡表達式(self) -> str: 韻 = self.韻 聲 = self.聲 - if 韻 not in 常量.開合皆有的韻: + if 韻 not in 常量.開合兼備的韻: 呼 = None if 韻 not in 常量.一三等韻 and 韻 not in 常量.二三等韻: - 等 = None + 等 = '' 呼字段 = f'{呼}口 ' if 呼 else '' 等字段 = f'{等}等 ' if 等 else '' @@ -203,9 +223,9 @@ def 編碼(self) -> str: Examples: - >>> Qieyun.音韻地位.from描述('幫三凡入').編碼 + >>> QieyunEncoder.音韻地位.from描述('幫三凡入').編碼 'A9D' - >>> Qieyun.音韻地位.from描述('羣開三A支平').編碼 + >>> QieyunEncoder.音韻地位.from描述('羣開三A支平').編碼 'fFA' ''' 母 = self.母 @@ -234,11 +254,11 @@ def 屬於(self, 表達式: str) -> bool: Examples: - >>> Qieyun.音韻地位.from描述('幫三凡入').屬於('章母') + >>> QieyunEncoder.音韻地位.from描述('幫三凡入').屬於('章母') False - >>> Qieyun.音韻地位.from描述('幫三凡入').屬於('一四等') + >>> QieyunEncoder.音韻地位.from描述('幫三凡入').屬於('一四等') False - >>> Qieyun.音韻地位.from描述('幫三凡入').屬於('幫組 或 陽韻') + >>> QieyunEncoder.音韻地位.from描述('幫三凡入').屬於('幫組 或 陽韻') True ''' def inner(q: str): @@ -323,11 +343,6 @@ def equal聲(聲: str) -> bool: return any(all(inner(q) for q in p.split(' ')) for p in 表達式.split(' 或 ')) - def __eq__(self, that): - if not isinstance(that, 音韻地位): - return False - return self.描述 == that.描述 - @staticmethod def 驗證(母: str, 呼: str | None, 等: str, 重紐: str | None, 韻: str, 聲: str): ''' @@ -359,12 +374,10 @@ def 驗證(母: str, 呼: str | None, 等: str, 重紐: str | None, 韻: str, elif 韻 in 常量.必爲合口的韻: assert 呼 == '合' else: - assert 呼 is not None and len( - 呼) == 1 and 呼 in 常量.所有呼, 'Unexpected 呼: ' + repr(呼) + assert 呼 is not None and len(呼) == 1 and 呼 in 常量.所有呼, 'Unexpected 呼: ' + repr(呼) if 母 in 常量.重紐母 and 韻 in 常量.重紐韻: - assert 重紐 is not None and len( - 重紐) == 1 and 重紐 in 常量.所有重紐, 'Unexpected 重紐: ' + repr(重紐) + assert 重紐 is not None and len(重紐) == 1 and 重紐 in 常量.所有重紐, 'Unexpected 重紐: ' + repr(重紐) else: assert 重紐 is None, 'Unexpected 重紐: ' + repr(重紐) @@ -377,9 +390,9 @@ def 驗證(母: str, 呼: str | None, 等: str, 重紐: str | None, 韻: str, elif 韻 in 常量.四等韻: assert 等 == '四', 'Unexpected 等: ' + repr(等) elif 韻 in 常量.一三等韻: - assert 等 in ('一', '三'), 'Unexpected 等: ' + repr(等) + assert 等 in '一三', 'Unexpected 等: ' + repr(等) elif 韻 in 常量.二三等韻: - assert 等 in ('二', '三'), 'Unexpected 等: ' + repr(等) + assert 等 in '二三', 'Unexpected 等: ' + repr(等) @staticmethod def from編碼(編碼: str): @@ -397,44 +410,45 @@ def from編碼(編碼: str): 聲編碼 = 其他編碼 & 0b11 母 = 常量.所有母[母編碼] - 呼 = 常量.所有呼[呼編碼] - 重紐 = 常量.所有重紐[重紐編碼] + 呼: str | None = 常量.所有呼[呼編碼] + 重紐: str | None = 常量.所有重紐[重紐編碼] 聲 = 常量.所有聲[聲編碼] - if 韻編碼 == 0: - 韻 = '東' - 等 = '一' - elif 韻編碼 == 1: - 韻 = '東' - 等 = '三' - elif 韻編碼 == 37: - 韻 = '歌' - 等 = '一' - elif 韻編碼 == 38: - 韻 = '歌' - 等 = '三' - elif 韻編碼 == 39: - 韻 = '麻' - 等 = '二' - elif 韻編碼 == 40: - 韻 = '麻' - 等 = '三' - elif 韻編碼 == 43: - 韻 = '庚' - 等 = '二' - elif 韻編碼 == 44: - 韻 = '庚' - 等 = '三' - else: - 韻 = 韻順序表[韻編碼] - if 韻 in 常量.一等韻: + match 韻編碼: + case 0: + 韻 = '東' 等 = '一' - elif 韻 in 常量.二等韻: + case 1: + 韻 = '東' + 等 = '三' + case 37: + 韻 = '歌' + 等 = '一' + case 38: + 韻 = '歌' + 等 = '三' + case 39: + 韻 = '麻' 等 = '二' - elif 韻 in 常量.三等韻: + case 40: + 韻 = '麻' 等 = '三' - elif 韻 in 常量.四等韻: - 等 = '四' + case 43: + 韻 = '庚' + 等 = '二' + case 44: + 韻 = '庚' + 等 = '三' + case _: + 韻 = 韻順序表[韻編碼] + if 韻 in 常量.一等韻: + 等 = '一' + elif 韻 in 常量.二等韻: + 等 = '二' + elif 韻 in 常量.三等韻: + 等 = '三' + elif 韻 in 常量.四等韻: + 等 = '四' if 母 in '幫滂並明' or 韻 in 常量.開合中立的韻: assert 呼 == '開' @@ -455,15 +469,12 @@ def from描述(描述: str): ''' # TODO: 重寫解析器,支援更多格式 + 描述 = 描述.replace('欣', '殷').replace('眞', '真') # 容錯 + match = 解析音韻描述.fullmatch(描述) - assert match is not None + assert match is not None, 'Invalid 描述: ' + repr(描述) - 母 = match.group(1) - 呼 = match.group(2) or None - 等 = match.group(3) or None - 重紐 = match.group(4) or None - 韻 = match.group(5) - 聲 = match.group(6) + 母, 呼, 等, 重紐, 韻, 聲 = match.groups() if 呼 is None and 母 not in '幫滂並明': if 韻 in 常量.必爲開口的韻: @@ -480,10 +491,58 @@ def from描述(描述: str): 等 = '三' elif 韻 in 常量.四等韻: 等 = '四' + else: + raise ValueError(f'Unexpected 韻: {韻}') 音韻地位.驗證(母, 呼, 等, 重紐, 韻, 聲) return 音韻地位(母, 呼, 等, 重紐, 韻, 聲) - def __repr__(self): + def is_normal(self): + ''' + 是 normal 的音韻地位。 + + 例如,端母二等不是 normal 的音韻地位。 + ''' + return self.等 in 母對應的標準等[self.母] + + def __repr__(self) -> str: return '<音韻地位 ' + self.描述 + '>' + + def __eq__(self, that) -> bool: + if not isinstance(that, 音韻地位): + return False + return self.最簡描述 == that.最簡描述 + + def __lt__(self, that) -> bool: + if not isinstance(that, 音韻地位): + raise TypeError("'<' not supported between instances of '音韻地位' and " + type(that).__name__) + + def 母到編碼(母): + return 常量.所有母.index(母) + + def 呼到編碼(呼): + return [None, '開', '合'].index(呼) + + def 等到編碼(等): + return '一二三四'.index(等) + + def 重紐到編碼(重紐): + return [None, 'A', 'B'].index(重紐) + + def 韻到編碼(韻): + return 常量.所有韻.index(韻) + + def 聲到編碼(聲): + return 常量.所有聲.index(聲) + + return (聲到編碼(self.聲), 韻到編碼(self.韻), 重紐到編碼(self.重紐), 等到編碼(self.等), 呼到編碼(self.呼), 母到編碼(self.母)) \ + < (聲到編碼(that.聲), 韻到編碼(that.韻), 重紐到編碼(that.重紐), 等到編碼(that.等), 呼到編碼(that.呼), 母到編碼(that.母)) + + def __le__(self, that) -> bool: + if not isinstance(that, 音韻地位): + raise TypeError("'<' not supported between instances of '音韻地位' and " + type(that).__name__) + return self == that or self < that + + def __hash__(self) -> int: + return hash(self.最簡描述) diff --git "a/src/QieyunEncoder/\351\237\273\351\217\241\344\275\215\347\275\256.py" "b/src/QieyunEncoder/\351\237\273\351\217\241\344\275\215\347\275\256.py" new file mode 100644 index 0000000..b40fcc5 --- /dev/null +++ "b/src/QieyunEncoder/\351\237\273\351\217\241\344\275\215\347\275\256.py" @@ -0,0 +1,117 @@ +# -*- coding: utf-8 -*- + +import re + +from . import 常量 +from .轉換 import 韻目到韻 + +_韻鏡母位置表 = [ + '脣音第一位', '脣音第二位', '脣音第三位', '脣音第四位', + '舌音第一位', '舌音第二位', '舌音第三位', '舌音第四位', + '牙音第一位', '牙音第二位', '牙音第三位', '牙音第四位', + '齒音第一位', '齒音第二位', '齒音第三位', '齒音第四位', '齒音第五位', + '喉音第一位', '喉音第二位', '喉音第三位', '喉音第四位', + '舌齒音第一位', '舌齒音第二位', +] + +_韻鏡母位置到韻鏡母號映射表 = {韻鏡母位置: 韻鏡母號 for 韻鏡母號, 韻鏡母位置 in enumerate(_韻鏡母位置表)} + +_韻鏡母表 = [ + '幫非', '滂敷', '並奉', '明微', + '端知', '透徹', '定澄', '泥孃', + '見', '溪', '羣', '疑', + '精照', '清穿', '從牀', '心審', '邪禪', + '影', '曉', '匣', '喻', + '來', '日', +] + +_韻鏡母到韻鏡母號映射表 = {} + +for 韻鏡母號, 韻鏡母 in enumerate(_韻鏡母表): + _韻鏡母到韻鏡母號映射表[韻鏡母] = 韻鏡母號 + if len(韻鏡母) > 1: + for 韻鏡母單字 in 韻鏡母: + _韻鏡母到韻鏡母號映射表[韻鏡母單字] = 韻鏡母號 + +_韻鏡所有母 = ''.join(_韻鏡母表) + +解析韻鏡位置描述 = re.compile('([%s])([%s])?([%s])([%s])([%s])' % (_韻鏡所有母, 常量.所有呼, 常量.所有等, 常量.所有韻, 常量.所有聲)) + +class 韻鏡位置: + ''' + 韻鏡位置。 + ''' + + def __init__(self, 韻鏡母: str | int, 韻鏡開合: str | None, 韻鏡等: str, 韻: str, 聲: str) -> None: + # normalize 母 + # - 韻鏡母號(0-22,從右至左計數) + # - 韻鏡母位置(脣音第一位,etc) + # - 韻鏡母 + # - 精照,etc + # - 精,照,etc + 韻鏡母號 = _韻鏡母位置到韻鏡母號映射表.get(韻鏡母, _韻鏡母到韻鏡母號映射表.get(韻鏡母)) + if 韻鏡母號 is not None: + self.韻鏡母號 = 韻鏡母號 + else: + assert isinstance(韻鏡母, int), 'Unexpected 韻鏡母: ' + repr(韻鏡母) + self.韻鏡母號 = 韻鏡母 + + # normalize 開合 + # - 韻鏡轉號 + # - 韻鏡開合(開、合、None) + 韻1 = 韻目到韻(韻) + if 韻1 in 常量.必爲開口的韻: + 韻鏡開合 = '開' + elif 韻1 in 常量.必爲合口的韻: + 韻鏡開合 = '合' + elif 韻1 in 常量.開合兼備的韻: + assert 韻鏡開合 != None, 韻鏡開合 + elif 韻1 in 常量.開合中立的韻: + 韻鏡開合 = None + self.韻鏡開合 = 韻鏡開合 + + self.韻鏡等 = 韻鏡等 + + # normalize 韻 + self.韻 = 韻目到韻(韻) + + self.聲 = 聲 + + @property + def 韻鏡母(self) -> str: + return _韻鏡母表[self.韻鏡母號] + + @property + def 最簡韻鏡母(self) -> str: + 韻鏡母號 = self.韻鏡母號 + 韻鏡母 = self.韻鏡母 + + if 0 <= 韻鏡母號 < 4: # 幫非組 + return 韻鏡母[self.韻鏡等 == '三' and self.韻 in 常量.輕脣韻] + if 4 <= 韻鏡母號 < 8 or 12 <= 韻鏡母號 < 17: # 端知組、精照組 + return 韻鏡母[self.韻鏡等 in '二三'] + return 韻鏡母 + + @staticmethod + def from描述(描述: str): + match = 解析韻鏡位置描述.fullmatch(描述) + assert match is not None, 'Invalid 描述: ' + repr(描述) + + 母, 韻鏡開合, 韻鏡等, 韻, 聲 = match.groups() + + return 韻鏡位置(母, 韻鏡開合, 韻鏡等, 韻, 聲) + + @property + def 描述(self) -> str: + return self.最簡韻鏡母 + (self.韻鏡開合 or '') + self.韻鏡等 + self.韻 + self.聲 + + def __repr__(self) -> str: + return f'<韻鏡位置 {self.描述}>' + + def __eq__(self, that) -> bool: + if not isinstance(that, 韻鏡位置): + return False + return self.描述 == that.描述 + + def __hash__(self) -> int: + return hash(self.描述) diff --git "a/tests/QieyunEncoder/\345\270\270\351\207\217.py" "b/tests/QieyunEncoder/\345\270\270\351\207\217.py" new file mode 100644 index 0000000..62da7ed --- /dev/null +++ "b/tests/QieyunEncoder/\345\270\270\351\207\217.py" @@ -0,0 +1,52 @@ +from pathlib import Path; import sys; sys.path.append(str(Path(__file__).resolve().parent.parent.parent / 'src')) + +import QieyunEncoder as QE + +assert '來' in QE.常量.所有母 +assert '透' in QE.常量.所有母 +assert '合' in QE.常量.所有呼 +assert '開' in QE.常量.所有呼 +assert '三' in QE.常量.所有等 +assert '四' in QE.常量.所有等 +assert 'A' in QE.常量.所有重紐 +assert 'B' in QE.常量.所有重紐 +assert '魚' in QE.常量.所有韻 +assert '侯' in QE.常量.所有韻 +assert '去' in QE.常量.所有聲 +assert '入' in QE.常量.所有聲 +assert '幫' in QE.常量.重紐母 +assert '疑' in QE.常量.重紐母 +assert '鹽' in QE.常量.重紐韻 +assert '祭' in QE.常量.重紐韻 +assert '麻' in QE.常量.開合兼備的韻 +assert '支' in QE.常量.開合兼備的韻 +assert '嚴' in QE.常量.必爲開口的韻 +assert '痕' in QE.常量.必爲開口的韻 +assert '文' in QE.常量.必爲合口的韻 +assert '魂' in QE.常量.必爲合口的韻 +assert '東' in QE.常量.開合中立的韻 +assert '尤' in QE.常量.開合中立的韻 +assert '灰' in QE.常量.一等韻 +assert '豪' in QE.常量.一等韻 +assert '咸' in QE.常量.二等韻 +assert '刪' in QE.常量.二等韻 +assert '清' in QE.常量.三等韻 +assert '陽' in QE.常量.三等韻 +assert '蕭' in QE.常量.四等韻 +assert '青' in QE.常量.四等韻 +assert '歌' in QE.常量.一三等韻 +assert '東' in QE.常量.一三等韻 +assert '麻' in QE.常量.二三等韻 +assert '庚' in QE.常量.二三等韻 +assert '齒' in QE.常量.所有音 +assert '脣' in QE.常量.所有音 +assert '知' in QE.常量.所有組 +assert '端' in QE.常量.所有組 +assert '去' in QE.常量.所有類 +assert '古' in QE.常量.所有類 +assert '山' in QE.常量.所有攝 +assert '通' in QE.常量.所有攝 +assert '微' in QE.常量.輕脣韻 +assert '東' in QE.常量.輕脣韻 +assert '夬' in QE.常量.次入韻 +assert '泰' in QE.常量.次入韻 diff --git "a/tests/QieyunEncoder/\350\275\211\346\217\233.py" "b/tests/QieyunEncoder/\350\275\211\346\217\233.py" new file mode 100644 index 0000000..b361b7b --- /dev/null +++ "b/tests/QieyunEncoder/\350\275\211\346\217\233.py" @@ -0,0 +1,22 @@ +from pathlib import Path; import sys; sys.path.append(str(Path(__file__).resolve().parent.parent.parent / 'src')) + +import QieyunEncoder as QE + +def assert_equal(a, b): + if a != b: + raise ValueError(f'{a} and {b} are not equal!') + +assert_equal(QE.母到清濁('端'), '全清') +assert_equal(QE.母到清濁('以'), '次濁') +assert_equal(QE.母到組('滂'), '幫') +assert_equal(QE.母到組('云'), '影') +assert_equal(QE.母到組('以'), None) +assert_equal(QE.母到音('並'), '脣') +assert_equal(QE.母到音('羣'), '牙') +assert_equal(QE.母與等到類('見', '二'), '古') +assert_equal(QE.母與等到類('並', '三'), '符') +assert_equal(QE.韻到攝('冬'), '通') +assert_equal(QE.韻到攝('侵'), '深') +assert_equal(QE.韻目到韻('物'), '文') +assert_equal(QE.韻目到韻('敬'), '庚') +assert_equal(QE.韻目到韻('東'), '東') diff --git "a/tests/QieyunEncoder/\351\237\263\351\237\273\345\234\260\344\275\215.py" "b/tests/QieyunEncoder/\351\237\263\351\237\273\345\234\260\344\275\215.py" new file mode 100644 index 0000000..97d453b --- /dev/null +++ "b/tests/QieyunEncoder/\351\237\263\351\237\273\345\234\260\344\275\215.py" @@ -0,0 +1,45 @@ +from pathlib import Path; import sys; sys.path.append(str(Path(__file__).resolve().parent.parent.parent / 'src')) + +import QieyunEncoder as QE + +def assert_equal(a, b): + if a != b: + raise ValueError(f'{a} and {b} are not equal!') + +音韻地位1 = QE.音韻地位.from描述('幫三凡入') +assert_equal(音韻地位1.清濁, '全清') +assert_equal(音韻地位1.音, '脣') +assert_equal(音韻地位1.組, '幫') +assert_equal(音韻地位1.攝, '咸') +assert_equal(音韻地位1.類, '方') +assert_equal(音韻地位1.描述, '幫三凡入') +assert_equal(音韻地位1.最簡描述, '幫凡入') +assert_equal(音韻地位1.表達式, '幫母 三等 凡韻 入聲') +assert_equal(音韻地位1.最簡表達式, '幫母 凡韻 入聲') +assert_equal(音韻地位1.編碼, 'A9D') +assert_equal(音韻地位1.屬於('章母'), False) +assert_equal(音韻地位1.屬於('一四等'), False) +assert_equal(音韻地位1.屬於('幫組 或 陽韻'), True) + +音韻地位2 = QE.音韻地位.from描述('羣開三A支平') +assert_equal(音韻地位2.清濁, '全濁') +assert_equal(音韻地位2.音, '牙') +assert_equal(音韻地位2.組, '見') +assert_equal(音韻地位2.攝, '止') +assert_equal(音韻地位2.類, '渠') +assert_equal(音韻地位2.描述, '羣開三A支平') +assert_equal(音韻地位2.最簡描述, '羣開A支平') +assert_equal(音韻地位2.表達式, '羣母 開口 三等 重紐A類 支韻 平聲') +assert_equal(音韻地位2.最簡表達式, '羣母 開口 重紐A類 支韻 平聲') +assert_equal(音韻地位2.編碼, 'fFA') + +assert 音韻地位1 != 音韻地位2 +assert 音韻地位1 > 音韻地位2 + +音韻地位3 = QE.音韻地位.from描述('幫三凡入') +assert 音韻地位1 == 音韻地位3 +assert len({音韻地位1, 音韻地位3}) == 1 + +# 測試欣韻和眞韻的容錯 +assert QE.音韻地位.from描述('影開三A眞平').描述 == '影開三A真平' +assert QE.音韻地位.from描述('溪開三欣上').描述 == '溪開三殷上' diff --git a/tests/__init__.py b/tests/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/tests/examples.txt b/tests/examples.txt index d85ba5d..8d13125 100644 --- a/tests/examples.txt +++ b/tests/examples.txt @@ -393,57 +393,57 @@ 泥,開,一,,咍,平 端,開,一,,咍,平 昌,開,一,,咍,平 -章,開,三,,眞,平 -徹,開,三,,眞,平 -影,開,三,A,眞,平 -心,開,三,,眞,平 -常,開,三,,眞,平 -日,開,三,,眞,平 -船,開,三,,眞,平 -清,開,三,,眞,平 -云,開,三,,眞,平 -書,開,三,,眞,平 -幫,,三,A,眞,平 -來,開,三,,眞,平 -羣,開,三,B,眞,平 -知,開,三,,眞,平 -澄,開,三,,眞,平 -精,開,三,,眞,平 -昌,開,三,,眞,平 -從,開,三,,眞,平 -以,開,三,,眞,平 -孃,開,三,,眞,平 -滂,,三,A,眞,平 -並,,三,A,眞,平 -疑,開,三,B,眞,平 -見,開,三,B,眞,平 -見,合,三,B,眞,平 -云,合,三,,眞,平 -溪,合,三,B,眞,平 -明,,三,B,眞,平 -並,,三,B,眞,平 -影,開,三,B,眞,平 -影,合,三,B,眞,平 -幫,,三,B,眞,平 -明,,三,A,眞,平 -章,合,三,,眞,平 -徹,合,三,,眞,平 -澄,合,三,,眞,平 -心,合,三,,眞,平 -常,合,三,,眞,平 -日,合,三,,眞,平 -船,合,三,,眞,平 -來,合,三,,眞,平 -知,合,三,,眞,平 -清,合,三,,眞,平 -精,合,三,,眞,平 -昌,合,三,,眞,平 -從,合,三,,眞,平 -以,合,三,,眞,平 -邪,合,三,,眞,平 -見,合,三,A,眞,平 -羣,開,三,A,眞,平 -滂,,三,B,眞,平 +章,開,三,,真,平 +徹,開,三,,真,平 +影,開,三,A,真,平 +心,開,三,,真,平 +常,開,三,,真,平 +日,開,三,,真,平 +船,開,三,,真,平 +清,開,三,,真,平 +云,開,三,,真,平 +書,開,三,,真,平 +幫,,三,A,真,平 +來,開,三,,真,平 +羣,開,三,B,真,平 +知,開,三,,真,平 +澄,開,三,,真,平 +精,開,三,,真,平 +昌,開,三,,真,平 +從,開,三,,真,平 +以,開,三,,真,平 +孃,開,三,,真,平 +滂,,三,A,真,平 +並,,三,A,真,平 +疑,開,三,B,真,平 +見,開,三,B,真,平 +見,合,三,B,真,平 +云,合,三,,真,平 +溪,合,三,B,真,平 +明,,三,B,真,平 +並,,三,B,真,平 +影,開,三,B,真,平 +影,合,三,B,真,平 +幫,,三,B,真,平 +明,,三,A,真,平 +章,合,三,,真,平 +徹,合,三,,真,平 +澄,合,三,,真,平 +心,合,三,,真,平 +常,合,三,,真,平 +日,合,三,,真,平 +船,合,三,,真,平 +來,合,三,,真,平 +知,合,三,,真,平 +清,合,三,,真,平 +精,合,三,,真,平 +昌,合,三,,真,平 +從,合,三,,真,平 +以,合,三,,真,平 +邪,合,三,,真,平 +見,合,三,A,真,平 +羣,開,三,A,真,平 +滂,,三,B,真,平 莊,開,三,,臻,平 生,開,三,,臻,平 崇,開,三,,臻,平 @@ -456,11 +456,11 @@ 曉,合,三,,文,平 見,合,三,,文,平 滂,,三,,文,平 -曉,開,三,,欣,平 -影,開,三,,欣,平 -羣,開,三,,欣,平 -見,開,三,,欣,平 -疑,開,三,,欣,平 +曉,開,三,,殷,平 +影,開,三,,殷,平 +羣,開,三,,殷,平 +見,開,三,,殷,平 +疑,開,三,,殷,平 疑,合,三,,元,平 云,合,三,,元,平 並,,三,,元,平 @@ -1445,38 +1445,38 @@ 透,開,一,,咍,上 日,開,一,,咍,上 來,開,一,,咍,上 -章,開,三,,眞,上 -徹,開,三,,眞,上 -常,開,三,,眞,上 -日,開,三,,眞,上 -書,開,三,,眞,上 -來,開,三,,眞,上 -澄,開,三,,眞,上 -見,開,三,A,眞,上 -從,開,三,,眞,上 -精,開,三,,眞,上 -並,,三,A,眞,上 -疑,開,三,B,眞,上 -清,開,三,,眞,上 -羣,合,三,B,眞,上 -以,開,三,,眞,上 -明,,三,B,眞,上 -明,,三,A,眞,上 -云,合,三,,眞,上 -章,合,三,,眞,上 -以,合,三,,眞,上 -心,合,三,,眞,上 -日,合,三,,眞,上 -昌,合,三,,眞,上 -船,合,三,,眞,上 -徹,合,三,,眞,上 -來,合,三,,眞,上 -溪,合,三,B,眞,上 -溪,開,三,A,眞,上 -書,合,三,,眞,上 -曉,開,三,B,眞,上 -崇,開,三,,眞,上 -知,開,三,,眞,上 +章,開,三,,真,上 +徹,開,三,,真,上 +常,開,三,,真,上 +日,開,三,,真,上 +書,開,三,,真,上 +來,開,三,,真,上 +澄,開,三,,真,上 +見,開,三,A,真,上 +從,開,三,,真,上 +精,開,三,,真,上 +並,,三,A,真,上 +疑,開,三,B,真,上 +清,開,三,,真,上 +羣,合,三,B,真,上 +以,開,三,,真,上 +明,,三,B,真,上 +明,,三,A,真,上 +云,合,三,,真,上 +章,合,三,,真,上 +以,合,三,,真,上 +心,合,三,,真,上 +日,合,三,,真,上 +昌,合,三,,真,上 +船,合,三,,真,上 +徹,合,三,,真,上 +來,合,三,,真,上 +溪,合,三,B,真,上 +溪,開,三,A,真,上 +書,合,三,,真,上 +曉,開,三,B,真,上 +崇,開,三,,真,上 +知,開,三,,真,上 明,,三,,文,上 幫,,三,,文,上 並,,三,,文,上 @@ -1485,14 +1485,14 @@ 疑,合,三,,文,上 云,合,三,,文,上 溪,合,三,,文,上 -影,開,三,,欣,上 -見,開,三,,欣,上 -莊,開,三,,欣,上 -溪,開,三,,欣,上 -羣,開,三,,欣,上 -初,開,三,,欣,上 -疑,開,三,,欣,上 -曉,開,三,,欣,上 +影,開,三,,殷,上 +見,開,三,,殷,上 +莊,開,三,,殷,上 +溪,開,三,,殷,上 +羣,開,三,,殷,上 +初,開,三,,殷,上 +疑,開,三,,殷,上 +曉,開,三,,殷,上 疑,合,三,,元,上 云,合,三,,元,上 影,開,三,,元,上 @@ -2512,35 +2512,35 @@ 並,,三,,廢,去 羣,合,三,,廢,去 疑,開,三,,廢,去 -章,開,三,,眞,去 -心,開,三,,眞,去 -日,開,三,,眞,去 -以,開,三,,眞,去 -來,開,三,,眞,去 -幫,,三,A,眞,去 -澄,開,三,,眞,去 -常,開,三,,眞,去 -書,開,三,,眞,去 -溪,開,三,A,眞,去 -邪,開,三,,眞,去 -疑,開,三,B,眞,去 -精,開,三,,眞,去 -曉,開,三,B,眞,去 -知,開,三,,眞,去 -羣,開,三,B,眞,去 -初,開,三,,眞,去 -影,開,三,A,眞,去 -徹,開,三,,眞,去 -滂,,三,A,眞,去 -清,開,三,,眞,去 -見,合,三,A,眞,去 -章,合,三,,眞,去 -心,合,三,,眞,去 -邪,合,三,,眞,去 -精,合,三,,眞,去 -書,合,三,,眞,去 -日,合,三,,眞,去 -船,合,三,,眞,去 +章,開,三,,真,去 +心,開,三,,真,去 +日,開,三,,真,去 +以,開,三,,真,去 +來,開,三,,真,去 +幫,,三,A,真,去 +澄,開,三,,真,去 +常,開,三,,真,去 +書,開,三,,真,去 +溪,開,三,A,真,去 +邪,開,三,,真,去 +疑,開,三,B,真,去 +精,開,三,,真,去 +曉,開,三,B,真,去 +知,開,三,,真,去 +羣,開,三,B,真,去 +初,開,三,,真,去 +影,開,三,A,真,去 +徹,開,三,,真,去 +滂,,三,A,真,去 +清,開,三,,真,去 +見,合,三,A,真,去 +章,合,三,,真,去 +心,合,三,,真,去 +邪,合,三,,真,去 +精,合,三,,真,去 +書,合,三,,真,去 +日,合,三,,真,去 +船,合,三,,真,去 明,,三,,文,去 云,合,三,,文,去 曉,合,三,,文,去 @@ -2550,11 +2550,11 @@ 見,合,三,,文,去 羣,合,三,,文,去 並,,三,,文,去 -曉,開,三,,欣,去 -見,開,三,,欣,去 -羣,開,三,,欣,去 -影,開,三,,欣,去 -疑,開,三,,欣,去 +曉,開,三,,殷,去 +見,開,三,,殷,去 +羣,開,三,,殷,去 +影,開,三,,殷,去 +疑,開,三,,殷,去 疑,合,三,,元,去 影,合,三,,元,去 幫,,三,,元,去 @@ -3242,55 +3242,55 @@ 匣,,二,,江,入 曉,,二,,江,入 初,,二,,江,入 -章,開,三,,眞,入 -日,開,三,,眞,入 -船,開,三,,眞,入 -澄,開,三,,眞,入 -心,開,三,,眞,入 -影,開,三,A,眞,入 -清,開,三,,眞,入 -滂,,三,A,眞,入 -見,開,三,A,眞,入 -孃,開,三,,眞,入 -以,開,三,,眞,入 -溪,開,三,A,眞,入 -曉,開,三,A,眞,入 -徹,開,三,,眞,入 -來,開,三,,眞,入 -知,開,三,,眞,入 -從,開,三,,眞,入 -初,開,三,,眞,入 -書,開,三,,眞,入 -精,開,三,,眞,入 -明,,三,A,眞,入 -幫,,三,A,眞,入 -羣,開,三,B,眞,入 -並,,三,A,眞,入 -云,合,三,,眞,入 -生,合,三,,眞,入 -昌,開,三,,眞,入 -崇,開,三,,眞,入 -明,,三,B,眞,入 -並,,三,B,眞,入 -影,開,三,B,眞,入 -疑,開,三,B,眞,入 -幫,,三,B,眞,入 -知,合,三,,眞,入 -曉,開,三,B,眞,入 -見,開,三,B,眞,入 -曉,合,三,A,眞,入 -船,合,三,,眞,入 -見,合,三,A,眞,入 -從,合,三,,眞,入 -以,合,三,,眞,入 -精,合,三,,眞,入 -心,合,三,,眞,入 -來,合,三,,眞,入 -徹,合,三,,眞,入 -澄,合,三,,眞,入 -昌,合,三,,眞,入 -清,合,三,,眞,入 -莊,合,三,,眞,入 +章,開,三,,真,入 +日,開,三,,真,入 +船,開,三,,真,入 +澄,開,三,,真,入 +心,開,三,,真,入 +影,開,三,A,真,入 +清,開,三,,真,入 +滂,,三,A,真,入 +見,開,三,A,真,入 +孃,開,三,,真,入 +以,開,三,,真,入 +溪,開,三,A,真,入 +曉,開,三,A,真,入 +徹,開,三,,真,入 +來,開,三,,真,入 +知,開,三,,真,入 +從,開,三,,真,入 +初,開,三,,真,入 +書,開,三,,真,入 +精,開,三,,真,入 +明,,三,A,真,入 +幫,,三,A,真,入 +羣,開,三,B,真,入 +並,,三,A,真,入 +云,合,三,,真,入 +生,合,三,,真,入 +昌,開,三,,真,入 +崇,開,三,,真,入 +明,,三,B,真,入 +並,,三,B,真,入 +影,開,三,B,真,入 +疑,開,三,B,真,入 +幫,,三,B,真,入 +知,合,三,,真,入 +曉,開,三,B,真,入 +見,開,三,B,真,入 +曉,合,三,A,真,入 +船,合,三,,真,入 +見,合,三,A,真,入 +從,合,三,,真,入 +以,合,三,,真,入 +精,合,三,,真,入 +心,合,三,,真,入 +來,合,三,,真,入 +徹,合,三,,真,入 +澄,合,三,,真,入 +昌,合,三,,真,入 +清,合,三,,真,入 +莊,合,三,,真,入 莊,開,三,,臻,入 生,開,三,,臻,入 崇,開,三,,臻,入 @@ -3305,11 +3305,11 @@ 云,合,三,,文,入 滂,,三,,文,入 疑,合,三,,文,入 -曉,開,三,,欣,入 -見,開,三,,欣,入 -疑,開,三,,欣,入 -羣,開,三,,欣,入 -溪,開,三,,欣,入 +曉,開,三,,殷,入 +見,開,三,,殷,入 +疑,開,三,,殷,入 +羣,開,三,,殷,入 +溪,開,三,,殷,入 疑,合,三,,元,入 並,,三,,元,入 云,合,三,,元,入 diff --git a/tests/main.py b/tests/main.py index 3534b3d..8f03cde 100644 --- a/tests/main.py +++ b/tests/main.py @@ -38,12 +38,3 @@ def test1(): 重紐 = None roundtrip1(母, 呼, 等, 重紐, 韻, 聲) roundtrip2(母, 呼, 等, 重紐, 韻, 聲) - - -def test2(): - ''' - 測試正則化韻。 - ''' - assert QieyunEncoder.正則化韻('物') == '文' - assert QieyunEncoder.正則化韻('敬') == '庚' - assert QieyunEncoder.正則化韻('東') == '東' diff --git a/tests/test.py b/tests/test.py new file mode 100644 index 0000000..f620e69 --- /dev/null +++ b/tests/test.py @@ -0,0 +1,18 @@ +import os +import subprocess +import sys + +base_directory = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'QieyunEncoder') + +python_files = [] +for dirpath, dirnames, filenames in os.walk(base_directory): + for file in filenames: + if file.endswith('.py'): + full_path = os.path.join(dirpath, file) + python_files.append(full_path) + +for file in python_files: + process = subprocess.run([sys.executable, file]) + return_code = process.returncode + if return_code != 0: + exit(return_code)