« macOS 版のアプリケーションメニューの日本語化 | トップページ | Ver.1.6.7 リリース »

2017年3月10日 (金)

言語依存データの外部ファイル化について考える その1

現在、物理キーボードとソフトウェア・キーボードの英語/日本語対応機能はソースコード(クラス内部)に 決め打ち(ハードコーディング)した情報を切り替えることで実現しています。

もともとソースコードレベルで日本語/英語を用意していたので、他の言語に対応しようとするとその言語用に 修正したソースコードを提供してもらい、ビルドし直す必要がありました。

この場合ソースコードの中身を理解しないと新しい言語に対応できませんし、気軽にテストも出来ません。 これを改善するため、現在決め打ちしている情報を外部テキストファイルとして用意し、特定のディレクトリに 配置すれば起動時に読み込むという感じにしようと思います。

#といっても日本語/英語以外が今必要なのか否か謎ですけど。

力技で外部ファイル解析出来ないことはないでしょうけど、後々のためflexとbisonで字句解析/構文解析 すればいいかなと思います。

(追記)

今の所flexでの字句解析までテスト用コードで確認しました。

==========================================================================================
[概要]
==========================================================================================

言語情報ファイルは以下の3つのフェーズからなる。

1. 言語情報フェーズ

 Qt Brynhildrが言語情報として識別するための情報群

2. 物理キーボード定義フェーズ

 Qt::Key_* と VK_* の対応情報、SHIFTキーの要/不要/関係なし, プラットフォーム指定 の情報

3. ソフトウェア・キーボード定義フェーズ

 ソフトウェアのキーとキートップ文字列の対応情報(通常時、SHIFTキー押下時、Fnキー押下時)

==========================================================================================
[詳細]
==========================================================================================

------------------------------------------------------------------------------------------
0. 全体について
------------------------------------------------------------------------------------------

 (1) '#'以降は改行までコメントとみなす。

 (2) 空白、タブは無視する。

 (3) 各情報はフェーズ名([General]/[Keys]/[SoftKeys])で区切る。

 (4) 文字コードはUTF-8Nを想定

 (5) 不明なKey_名, VK_名はエラーとする。ただしVK_NONE_00は0とみなす。

------------------------------------------------------------------------------------------
1. 言語情報 (内容は要検討)
------------------------------------------------------------------------------------------

言語名 :

作成者名 :

------------------------------------------------------------------------------------------
2. 物理キーボード定義フェーズ
------------------------------------------------------------------------------------------

一行に以下の3つの情報を','で区切って記述する。ここで定義されないQt::Key_*キーは無視される。
プラットフォーム指定が必要な場合は','で区切ってプラットフォーム名を追加する。

Qt::Key_名 : Qt namespace に示されている定数Key_*の文字列、Qt::は不要

VK_名      : windowsの仮想キーコード文字列

SHIFTKEY_INFO : "SHIFTKEY_NEED"    : SHIFTキーが押されている必要がある
                "SHIFTKEY_NONEED"  : SHIFTキーが押されていない必要がある
                "SHIFTKEY_THROUGHT": SHIFTキーの状態は関係しない

プラットフォーム指定 : 指定されたプラットフォーム上の時だけ指定が有効となる。
                       同じKeyに関する指定があった場合はより下の行の設定が優先となる。
                       Windows/macOS/Linux が指定可能

                       なし -> すべてのプラットフォームで有効
                       macOS -> macOSのみで有効

Key_Control,            VK_CONTROL,     SHIFTKEY_THROUGH
Key_Control,            VK_LWIN,        SHIFTKEY_THROUGH, macOS # override on macOS

コントロールキーに関する指定である上記の場合、macOS以外の場合はVK_CONTROLが送出されるが
macOSの時はVK_LWINが送出される。

ex.)

[Keys]
Key_Escape,     VK_ESCAPE,  SHIFTKEY_THROUGH
Key_Tab,        VK_TAB,     SHIFTKEY_THROUGH
Key_Backspace,  VK_BACK,    SHIFTKEY_THROUGH
Key_QuoteDbl,   VK_2,       SHIFTKEY_NEED # for JP keyboard

------------------------------------------------------------------------------------------
3. ソフトウェア・キーボード定義フェーズ
------------------------------------------------------------------------------------------

一行に以下の6つの情報を','で区切って記述する。


1,  キーID
2., "キートップ文字列(通常)"
3,  "キートップ文字列(シフトキー押下時)"
4, 仮想キーコード名、
5, "キートップ文字列(Fn押下時)"
6,  Fnキー押下時に送る仮想キーコード名

キーID                              : SoftwareKeyboardクラスで定義されるキーID

キートップ文字列(通常)              : 通常時に表示する文字列
キートップ文字列(シフトキー押下時)  : シフトキー押下時に表示する文字列
仮想キーコード名                    : 送出する仮想キーコード名

キートップ文字列(Fn押下時)          : Fn押下時に表示する文字列
Fn押下時に送る仮想キーコード名      : Fn押下時に送出する仮想キーコード名

すべてのソフトウェア・キーについて定義しなければならない。足りない場合はエラーとする。

ex.)

[SoftKeys]
1, "Esc",  "Esc",  VK_ESCAPE,      "Esc",  VK_ESCAPE
2, "1",    "!",    VK_1,           "F1",   VK_F1
3, "2",    "\"",   VK_2,           "F2",   VK_F2

日本語キーボードのサンプルを作ってみました。

============================ ここから ================================================
# japanese keyboard layout sample file
# Copyright (c) 2017 FunFun 
# spec version 0.0.1

[General]

[Keys]
Key_Escape,             VK_ESCAPE,      SHIFTKEY_THROUGH
Key_Tab,                VK_TAB,         SHIFTKEY_THROUGH
Key_Backspace,          VK_BACK,        SHIFTKEY_THROUGH
Key_Return,             VK_RETURN,      SHIFTKEY_THROUGH
Key_Enter,              VK_RETURN,      SHIFTKEY_THROUGH
Key_Insert,             VK_INSERT,      SHIFTKEY_THROUGH
Key_Delete,             VK_DELETE,      SHIFTKEY_THROUGH
Key_Pause,              VK_PAUSE,       SHIFTKEY_THROUGH
Key_Print,              VK_SNAPSHOT,    SHIFTKEY_THROUGH
Key_SysReq,             VK_SNAPSHOT,    SHIFTKEY_THROUGH
Key_Clear,              VK_CLEAR,       SHIFTKEY_THROUGH
Key_Home,               VK_HOME,        SHIFTKEY_THROUGH
Key_End,                VK_END,         SHIFTKEY_THROUGH
Key_Left,               VK_LEFT,        SHIFTKEY_THROUGH
Key_Up,                 VK_UP,          SHIFTKEY_THROUGH
Key_Right,              VK_RIGHT,       SHIFTKEY_THROUGH
Key_Down,               VK_DOWN,        SHIFTKEY_THROUGH
Key_PageUp,             VK_PRIOR,       SHIFTKEY_THROUGH
Key_PageDown,           VK_NEXT,        SHIFTKEY_THROUGH
Key_Shift,              VK_SHIFT,       SHIFTKEY_THROUGH
Key_Meta,               VK_LWIN,        SHIFTKEY_THROUGH
Key_Meta,               VK_CONTROL,     SHIFTKEY_THROUGH, macOS # override on macOS
Key_Control,            VK_CONTROL,     SHIFTKEY_THROUGH
Key_Control,            VK_LWIN,        SHIFTKEY_THROUGH, macOS # override on macOS
Key_Alt,                VK_MENU,        SHIFTKEY_THROUGH
Key_CapsLock,           VK_CAPITAL,     SHIFTKEY_THROUGH
Key_NumLock,            VK_NUMLOCK,     SHIFTKEY_THROUGH
Key_ScrollLock,         VK_SCROLL,      SHIFTKEY_THROUGH

Key_F1,                 VK_F1,          SHIFTKEY_THROUGH
Key_F2,                 VK_F2,          SHIFTKEY_THROUGH
Key_F3,                 VK_F3,          SHIFTKEY_THROUGH
Key_F4,                 VK_F4,          SHIFTKEY_THROUGH
Key_F5,                 VK_F5,          SHIFTKEY_THROUGH
Key_F6,                 VK_F6,          SHIFTKEY_THROUGH
Key_F7,                 VK_F7,          SHIFTKEY_THROUGH
Key_F8,                 VK_F8,          SHIFTKEY_THROUGH
Key_F9,                 VK_F9,          SHIFTKEY_THROUGH
Key_F10,                VK_F10,         SHIFTKEY_THROUGH
Key_F11,                VK_F11,         SHIFTKEY_THROUGH
Key_F12,                VK_F12,         SHIFTKEY_THROUGH
Key_F13,                VK_F13,         SHIFTKEY_THROUGH
Key_F14,                VK_F14,         SHIFTKEY_THROUGH
Key_F15,                VK_F15,         SHIFTKEY_THROUGH
Key_F16,                VK_F16,         SHIFTKEY_THROUGH
Key_F17,                VK_F17,         SHIFTKEY_THROUGH
Key_F18,                VK_F18,         SHIFTKEY_THROUGH
Key_F19,                VK_F19,         SHIFTKEY_THROUGH
Key_F20,                VK_F20,         SHIFTKEY_THROUGH
Key_F21,                VK_F21,         SHIFTKEY_THROUGH
Key_F22,                VK_F22,         SHIFTKEY_THROUGH
Key_F23,                VK_F23,         SHIFTKEY_THROUGH
Key_F24,                VK_F24,         SHIFTKEY_THROUGH

Key_0,                  VK_0,           SHIFTKEY_NONEED
Key_1,                  VK_1,           SHIFTKEY_NONEED
Key_2,                  VK_2,           SHIFTKEY_NONEED
Key_3,                  VK_3,           SHIFTKEY_NONEED
Key_4,                  VK_4,           SHIFTKEY_NONEED
Key_5,                  VK_5,           SHIFTKEY_NONEED
Key_6,                  VK_6,           SHIFTKEY_NONEED
Key_7,                  VK_7,           SHIFTKEY_NONEED
Key_8,                  VK_8,           SHIFTKEY_NONEED
Key_9,                  VK_9,           SHIFTKEY_NONEED

Key_A,                  VK_A,           SHIFTKEY_THROUGH
Key_B,                  VK_B,           SHIFTKEY_THROUGH
Key_C,                  VK_C,           SHIFTKEY_THROUGH
Key_D,                  VK_D,           SHIFTKEY_THROUGH
Key_E,                  VK_E,           SHIFTKEY_THROUGH
Key_F,                  VK_F,           SHIFTKEY_THROUGH
Key_G,                  VK_G,           SHIFTKEY_THROUGH
Key_H,                  VK_H,           SHIFTKEY_THROUGH
Key_I,                  VK_I,           SHIFTKEY_THROUGH
Key_J,                  VK_J,           SHIFTKEY_THROUGH
Key_K,                  VK_K,           SHIFTKEY_THROUGH
Key_L,                  VK_L,           SHIFTKEY_THROUGH
Key_M,                  VK_M,           SHIFTKEY_THROUGH
Key_N,                  VK_N,           SHIFTKEY_THROUGH
Key_O,                  VK_O,           SHIFTKEY_THROUGH
Key_P,                  VK_P,           SHIFTKEY_THROUGH
Key_Q,                  VK_Q,           SHIFTKEY_THROUGH
Key_R,                  VK_R,           SHIFTKEY_THROUGH
Key_S,                  VK_S,           SHIFTKEY_THROUGH
Key_T,                  VK_T,           SHIFTKEY_THROUGH
Key_U,                  VK_U,           SHIFTKEY_THROUGH
Key_V,                  VK_V,           SHIFTKEY_THROUGH
Key_W,                  VK_W,           SHIFTKEY_THROUGH
Key_X,                  VK_X,           SHIFTKEY_THROUGH
Key_Y,                  VK_Y,           SHIFTKEY_THROUGH
Key_Z,                  VK_Z,           SHIFTKEY_THROUGH

Key_Space,              VK_SPACE,       SHIFTKEY_THROUGH

Key_Exclam,             VK_1,           SHIFTKEY_NEED   # '!'
Key_QuoteDbl,           VK_2,           SHIFTKEY_NEED   # '"'
Key_NumberSign,         VK_3,           SHIFTKEY_NEED   # '#'
Key_Dollar,             VK_4,           SHIFTKEY_NEED   # '$'
Key_Percent,            VK_5,           SHIFTKEY_NEED   # '%'
Key_Ampersand,          VK_6,           SHIFTKEY_NEED   # '&'
Key_Apostrophe,         VK_7,           SHIFTKEY_NEED   # '''
Key_ParenLeft,          VK_8,           SHIFTKEY_NEED   # '('
Key_ParenRight,         VK_9,           SHIFTKEY_NEED   # ')'

Key_Asterisk,           VK_OEM_1,       SHIFTKEY_NEED   # '*'
Key_Plus,               VK_OEM_PLUS,    SHIFTKEY_NEED   # '+'
Key_Comma,              VK_OEM_COMMA,   SHIFTKEY_NONEED # ','
Key_Minus,              VK_OEM_MINUS,   SHIFTKEY_NONEED # '-'
Key_Period,             VK_OEM_PERIOD,  SHIFTKEY_NONEED # '.'
Key_Slash,              VK_OEM_2,       SHIFTKEY_NONEED # '/'

Key_Colon,              VK_OEM_1,       SHIFTKEY_NONEED # ':'
Key_Semicolon,          VK_OEM_PLUS,    SHIFTKEY_NONEED # ';'
Key_Less,               VK_OEM_COMMA,   SHIFTKEY_NEED   # '<'
Key_Equal,              VK_OEM_MINUS,   SHIFTKEY_NEED   # '='
Key_Greater,            VK_OEM_PERIOD,  SHIFTKEY_NEED   # '>'
Key_Question,           VK_OEM_2,       SHIFTKEY_NEED   # '?'
Key_At,                 VK_OEM_3,       SHIFTKEY_NONEED # '@'
Key_QuoteLeft,          VK_OEM_3,       SHIFTKEY_NEED   # '`'

Key_BracketLeft,        VK_OEM_4,       SHIFTKEY_NONEED # '['
Key_BraceLeft,          VK_OEM_4,       SHIFTKEY_NEED   # '{'
Key_Backslash,          VK_OEM_5,       SHIFTKEY_NONEED # '\'
Key_yen,                VK_OEM_5,       SHIFTKEY_NONEED # '\'
Key_Bar,                VK_OEM_5,       SHIFTKEY_NEED   # '|'
Key_Underscore,         VK_OEM_102,     SHIFTKEY_NEED   # '_'
Key_BracketRight,       VK_OEM_6,       SHIFTKEY_NONEED # ']'
Key_BraceRight,         VK_OEM_6,       SHIFTKEY_NEED   # '}'
Key_AsciiTilde,         VK_OEM_7,       SHIFTKEY_NEED   # '~'
Key_AsciiCircum,        VK_OEM_7,       SHIFTKEY_NONEED # '^'

Key_Henkan,             VK_CONVERT,     SHIFTKEY_THROUGH    # Convert
Key_Muhenkan,           VK_NONCONVERT,  SHIFTKEY_THROUGH    # NonConvert
Key_Zenkaku_Hankaku,    VK_KANJI,       SHIFTKEY_THROUGH    # Zenkaku_Hankaku

Key_Back,               VK_BROWSER_BACK,        SHIFTKEY_THROUGH
Key_Forward,            VK_BROWSER_FORWARD,     SHIFTKEY_THROUGH
Key_Refresh,            VK_BROWSER_REFRESH,     SHIFTKEY_THROUGH
Key_Stop,               VK_BROWSER_STOP,        SHIFTKEY_THROUGH
Key_Search,             VK_BROWSER_SEARCH,      SHIFTKEY_THROUGH
Key_Favorites,          VK_BROWSER_FAVORITES,   SHIFTKEY_THROUGH
Key_HomePage,           VK_BROWSER_HOME,        SHIFTKEY_THROUGH
Key_Forward,            VK_BROWSER_FORWARD,     SHIFTKEY_THROUGH
Key_VolumeMute,         VK_VOLUME_MUTE,         SHIFTKEY_THROUGH
Key_VolumeDown,         VK_VOLUME_DOWN,         SHIFTKEY_THROUGH
Key_VolumeUp,           VK_VOLUME_UP,           SHIFTKEY_THROUGH
Key_MediaNext,          VK_MEDIA_NEXT_TRACK,    SHIFTKEY_THROUGH
Key_MediaPrevious,      VK_MEDIA_PREV_TRACK,    SHIFTKEY_THROUGH
Key_MediaStop,          VK_MEDIA_STOP,          SHIFTKEY_THROUGH
Key_MediaTogglePlayPause,   VK_MEDIA_PLAY_PAUSE,    SHIFTKEY_THROUGH
Key_LaunchMail,         VK_LAUNCH_MAIL,         SHIFTKEY_THROUGH

[SoftKeys]
# 1st row
 1, "Esc",  "Esc",  VK_ESCAPE,      "Esc",  VK_ESCAPE
 2, "1",    "!",    VK_1,           "F1",   VK_F1
 3, "2",    "\"",   VK_2,           "F2",   VK_F2
 4, "3",    "#",    VK_3,           "F3",   VK_F3
 5, "4",    "$",    VK_4,           "F4",   VK_F4
 6, "5",    "%",    VK_5,           "F5",   VK_F5
 7, "6",    "&",    VK_6,           "F6",   VK_F6
 8, "7",    "'",    VK_7,           "F7",   VK_F7
 9, "8",    "(",    VK_8,           "F8",   VK_F8
10, "9",    ")",    VK_9,           "F9",   VK_F9
11, "0",    "",     VK_0,           "F10",  VK_F10
12, "-",    "=",    VK_OEM_MINUS,   "F11",  VK_F11
13, "^",    "~",    VK_OEM_7,       "F12",  VK_F12
14, "¥",    "|",   VK_OEM_5,       "Ins",  VK_INSERT
15, "BS",   "BS",   VK_BACK,        "Del",  VK_DELETE

# 2nd row
16, "Tab",  "Tab",  VK_TAB,         "Tab",  VK_TAB
17, "Q",    "Q",    VK_Q,           "Q",    VK_Q
18, "W",    "W",    VK_W,           "W",    VK_W
19, "E",    "E",    VK_E,           "E",    VK_E
20, "R",    "R",    VK_R,           "R",    VK_R
21, "T",    "T",    VK_T,           "T",    VK_T
22, "Y",    "Y",    VK_Y,           "Y",    VK_Y
23, "U",    "U",    VK_U,           "U",    VK_U
24, "I",    "I",    VK_I,           "I",    VK_I
25, "O",    "O",    VK_O,           "O",    VK_O
26, "P",    "P",    VK_P,           "P",    VK_P
27, "@",    "`",    VK_OEM_3,       "",     VK_NONE_00
28, "[",    "{",    VK_OEM_4,       "",     VK_NONE_00
29, "RET",  "RET",  VK_RETURN,      "RET",  VK_RETURN

# 3rd row
30, "Ctrl", "Ctrl", VK_LCONTROL,    "Ctrl", VK_LCONTROL
31, "A",    "A",    VK_A,           "A",    VK_A
32, "S",    "S",    VK_S,           "S",    VK_S
33, "D",    "D",    VK_D,           "D",    VK_D
34, "F",    "F",    VK_F,           "F",    VK_F
35, "G",    "G",    VK_G,           "G",    VK_G
36, "H",    "H",    VK_H,           "H",    VK_H
37, "J",    "J",    VK_J,           "J",    VK_J
38, "K",    "K",    VK_K,           "K",    VK_K
39, "L",    "L",    VK_L,           "L",    VK_L
40, ";",    "+",    VK_OEM_PLUS,    "",     VK_NONE_00
41, ":",    "*",    VK_OEM_1,       "Pause",VK_PAUSE
42, "]",    "}",    VK_OEM_6,       "PrtS", VK_SNAPSHOT

# 4th row
43, "Shift","Shift",VK_LSHIFT,      "Shift",VK_LSHIFT
44, "Z",    "Z",    VK_Z,           "Z",    VK_A
45, "X",    "X",    VK_X,           "X",    VK_Z
46, "C",    "C",    VK_C,           "C",    VK_C
47, "V",    "V",    VK_V,           "V",    VK_V
48, "B",    "B",    VK_B,           "B",    VK_B
49, "N",    "N",    VK_N,           "N",    VK_N
50, "M",    "M",    VK_M,           "M",    VK_M
51, ",",    "<",    VK_OEM_COMMA,   "",     VK_NONE_00
52, ".",    ">",    VK_OEM_PERIOD,  "",     VK_NONE_00
53, "/",    "?",    VK_OEM_2,       "",     VK_NONE_00
54, "¥",   "_",    VK_OEM_102,     "",     VK_NONE_00
55, "↑",   "↑",   VK_UP,          "PgU",  VK_PRIOR
56, "Shift","Shift",VK_RSHIFT,      "Shift",VK_RSHIFT

# 5th row
57, "Fn",   "Fn",   VK_NONE_00,     "Fn",   VK_NONE_00
58, "Alt",  "Alt",  VK_LMENU,       "Alt",  VK_LMENU
59, "Win",  "Win",  VK_LWIN,        "Win",  VK_LWIN
60, "JP",   "JP",   VK_KANJI,       "JP",   VK_KANJI
61, "Space","Space",VK_SPACE,       "Space",VK_SPACE
62, "Ctrl", "Ctrl", VK_RCONTROL,    "Ctrl", VK_RCONTROL
63, "Alt",  "Alt",  VK_RMENU,       "Alt",  VK_RMENU
64, "Fn",   "Fn",   VK_NONE_00,     "Fn",   VK_NONE_00
65, "←",   "←",   VK_LEFT,        "Home", VK_HOME
66, "↓",   "↓",   VK_DOWN,        "PgD",  VK_NEXT
67, "→",   "→",   VK_RIGHT,       "End",  VK_END


============================ ここまで ================================================

« macOS 版のアプリケーションメニューの日本語化 | トップページ | Ver.1.6.7 リリース »

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: 言語依存データの外部ファイル化について考える その1:

« macOS 版のアプリケーションメニューの日本語化 | トップページ | Ver.1.6.7 リリース »