VulpesOS/gaia/apps/keyboard/js/imes/jskanji/dict/jcconv.py
OverSu b38dea0597 Publish Vulpes Preview 15 sources for desktop, Android and Tundra
Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
2026-09-30 23:13:03 +02:00

136 lines
5.9 KiB
Python
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# -*- coding: utf-8 -*-
__all__ = ['hira2kata', 'kata2hira', 'half2hira', 'hira2half', 'kata2half',
'half2kata', 'half2wide', 'wide2half', 'convert',
'check_hira', 'check_kata', 'check_half']
import re
# convert hiragana to katakana
def hira2kata(text, reserved=[]):
return convert(text, jcconv.HIRA, jcconv.KATA, reserved)
# convert katakana to hiragana
def kata2hira(text, reserved=[]):
return convert(text, jcconv.KATA, jcconv.HIRA, reserved)
# convert half-width kana to hiragana
def half2hira(text, reserved=[]):
return convert(text, jcconv.HALF, jcconv.HIRA, reserved)
# convert hiragana to half-width kana
def hira2half(text, reserved=[]):
return convert(text, jcconv.HIRA, jcconv.HALF, reserved)
# convert katakana to half-width kana
def kata2half(text, reserved=[]):
return convert(text, jcconv.KATA, jcconv.HALF, reserved)
# convert half-width kana to katakana
def half2kata(text, reserved=[]):
return convert(text, jcconv.HALF, jcconv.KATA, reserved)
# expand half width number and alphabet to wide width
def half2wide(text, reserved=[]):
text = convert(text, jcconv.HNUM, jcconv.WNUM, reserved)
text = convert(text, jcconv.HALP, jcconv.WALP, reserved)
return convert(text, jcconv.HSYM, jcconv.WSYM, reserved)
# shrink wide width number and alphabet to half width
def wide2half(text, reserved=[]):
text = convert(text, jcconv.WNUM, jcconv.HNUM, reserved)
text = convert(text, jcconv.WALP, jcconv.HALP, reserved)
return convert(text, jcconv.WSYM, jcconv.HSYM, reserved)
# check if 'text' consists of hiragana
def check_hira(text):
return check(text, jcconv.HIRA)
# check if 'text' consists of katakana
def check_kata(text):
return check(text, jcconv.KATA)
# check if 'text' consists of half-width kana
def check_half(text):
return check(text, jcconv.HALF)
# convert 'frm' charset to 'to' charset
# input text must be unicode or str(utf-8)
# 'frm' and 'to' can be specified with (HIRA, KATA, HALF, WNUM, HNUM, WALP, HALP, WSYM, HSYM)
__regex_storage = {}
def convert(text, frm, to, reserved=[]):
def _multiple_replace(text, dic):
key = '|'.join(map(re.escape, dic))
if key in __regex_storage:
rx = __regex_storage[key]
else:
rx = re.compile(key)
__regex_storage[key] = rx
def proc_one(match):
return dic[match.group(0)]
return rx.sub(proc_one, text)
uflag = isinstance(text, unicode)
f_set = jcconv.char_sets[frm]
t_set = jcconv.char_sets[to]
text = uflag and text or text.decode('utf-8')
if len(f_set[0].split(' ')) == len(t_set[0].split(' ')):
for i in range(len(f_set)):
conv_table = dict(zip(f_set[i].split(' '), t_set[i].split(' ')))
for r in reserved:
try:
del(conv_table[r])
except:
pass
text = _multiple_replace(text, conv_table)
return uflag and text or text.encode('utf-8')
else:
raise "Invalid Parameter"
def check(text, char_set_type):
uflag = isinstance(text, unicode)
text = uflag and text or text.decode('utf-8')
char_set = []
for set in jcconv.char_sets[char_set_type]:
char_set.extend(set.split(' '))
return all([text_char in char_set for text_char in text])
# define character sets used in japanese
class jcconv:
(HIRA, KATA, HALF, WNUM, HNUM, WALP, HALP, WSYM, HSYM) = (i for i in range(9))
hira = [u'が ぎ ぐ げ ご ざ じ ず ぜ ぞ だ ぢ づ で ど ば び ぶ べ ぼ ぱ ぴ ぷ ぺ ぽ',
u'あ い う え お か き く け こ さ し す せ そ た ち つ て と ' + \
u'な に ぬ ね の は ひ ふ へ ほ ま み む め も や ゆ よ ら り る れ ろ ' + \
u'わ を ん ぁ ぃ ぅ ぇ ぉ ゃ ゅ ょ っ']
kata = [u'ガ ギ グ ゲ ゴ ザ ジ ズ ゼ ゾ ダ ヂ ヅ デ ド バ ビ ブ ベ ボ パ ピ プ ペ ポ',
u'ア イ ウ エ オ カ キ ク ケ コ サ シ ス セ ソ タ チ ツ テ ト ' + \
u'ナ ニ ヌ ネ ノ ハ ヒ フ ヘ ホ マ ミ ム メ モ ヤ ユ ヨ ラ リ ル レ ロ ' + \
u'ワ ヲ ン ァ ィ ゥ ェ ォ ャ ュ ョ ッ']
half = [u'ガ ギ グ ゲ ゴ ザ ジ ズ ゼ ゾ ダ ヂ ヅ デ ド バ ビ ブ ベ ボ パ ピ プ ペ ポ',
u'ア イ ウ エ オ カ キ ク ケ コ サ シ ス セ ソ タ チ ツ テ ト ナ ニ ヌ ネ ノ ハ ヒ フ ヘ ホ マ ミ ム メ モ ヤ ユ ヨ ラ リ ル レ ロ ' + \
u'ワ ヲ ン ァ ィ ゥ ェ ォ ャ ュ ョ ッ']
wnum = [u'0 1 2 3 4 5 6 7 8 9']
hnum = [u'0 1 2 3 4 5 6 7 8 9']
walp = [u'a b c d e f g h i j k l m n o p q r s t u v w x y z ' + \
u'A B C D E F G H I J K L M N O P Q R S T U V W X Y Z']
halp = [u'a b c d e f g h i j k l m n o p q r s t u v w x y z ' + \
u'A B C D E F G H I J K L M N O P Q R S T U V W X Y Z']
wsym = [u'! ” # $ % & ’ ( ) * + 、 − . / : ; < = > ? @ 「 \ 」 ^ _ ` 『 | 』 〜']
hsym = [u'! \" # $ % & \' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~']
char_sets = [hira, kata, half, wnum, hnum, walp, halp, wsym, hsym]
if __name__ == '__main__':
import codecs, sys
sys.stdout = codecs.getwriter('utf_8')(sys.stdout)
print convert(u'あいうえお', jcconv.HIRA, jcconv.HALF, [u'う'])
print convert(u'ばいおりん', jcconv.HIRA, jcconv.HALF)
print convert(u'バイオリン', jcconv.HALF, jcconv.HIRA)
print convert(u'12345', jcconv.HNUM, jcconv.WNUM)
print check_hira(u'ひらがな')
print check_hira(u'カタカナ')
print check_kata(u'ひらがな')
print check_kata(u'カタカナ')