Oyayubi Shift of Quick implementation (日本語)

はじめに

日本語入力方式の一つである『親指シフト (NICOLA)』の簡易実装例です。 日本で広く使われている『JIS Rかな』や『旧JIS かな』よりも負荷が少なくて作業効率が良く、 作家や翻訳家、法務家など大量の文章の執筆・作成を行う職業で熱心な利用者がいることでも有名な入力方式です。

このスニペットはゲーム内で親指シフト入力を使用したいときに、英語圏などでも日本語学習者の興味を満たしたり Colemak を実装したいときに参考になると思います。

なお、これにテーブル操作を使用したラインエディタ、単文節変換を実装すれば、かな漢字変換システムや日本語ワードプロセッサを構築できます。夏休みの自由研究にいかがでしょうか?

-- 親指シフト入力 for LOVE2D (簡易実装版)
-- by. GreenWing

-- TODO:
-- タイマー判定の実装
-- 命名規則など色々と書き直し

local utf8 = require("utf8")

-- 1: スキャンコード
-- 2: 単打
-- 3: 親指左 / 無変換
-- 4: 親指右 / 変換
-- 5: Shift (Left/Right) / 半濁音 / シフト


LayoutPointer = {
	IndexSC = 1,
	None = 2,

	Shift = {
		Left = 2,
		Right = 3,
	},

	Tumb = {
		Left = 3,
		Right = 4,
	}
}


text = ""
bank = 2


-- 日本語 106 キー用の定義。 (OASYS 40AP/AS 互換マップ)
Key106toNICOLA = {
	{'1', "1", "?", "?", "1"	},
	{'2', "2", "/", "/", "2"	},
	{'3', "3", "~", "~", "3"	},
	{'4', "4", "「", "「", "4"	},
	{'5', "5", "」", "」", "5"	},
	{'6', "6", "〔", "〔", "6"	},
	{'7', "7", "〕", "〕", "7"	},
	{'8', "8", "(", "(", "8"	},
	{'9', "9", ")", ")", "9"	},
	{'0', "0", "『", "『", "0"	},
	{'-', "―", "』", "』", "―"	},
	{'^', "|", "¥", "¥", "|"	},
	{'\\',  "",   "",   "",   ""	},

	{'q', "。", "ぁ",  "", "。"		},
	{'w', "か", "え", "が", "【画】"},
	{'e', "た", "り", "だ", "た"	},
	{'r', "こ", "ゃ", "ご", "こ"	},
	{'t', "さ", "れ", "ざ", "さ"	},
	{'y', "ら", "ぱ", "よ", "ら"	},
	{'u', "ち", "ぢ", "に", "ち"	},
	{'i', "く", "ぐ", "る", "【区】"},
	{'o', "つ", "づ", "ま", "つ"	},
	{'p', ",", "ぴ", "ぇ", ","	},
	{'@', "、",   "", "-", "、"	},
	{'[', "", "", "", ""			},

	{'a', "う", "を", "う゛", "う"		},
	{'s', "し", "あ", "じ"  , "し"		},
	{'d', "て", "な", "で"  , "て"		},
	{'f', "け", "ゅ", "げ"  , "【部】"	},
	{'g', "せ", "も", "ぜ"  , "せ"		},
	{'h', "は", "ば", "み"  , "ぱ"		},
	{'j', "と", "ど", "お"  , "と"		},
	{'k', "き", "ぎ", "の"  , "き"		},
	{'l', "い", "ぽ", "ょ"  , "い"		},
	{';', "ん",   "", "っ"  , "ん"		},
	{':',   "",   "", ""    , ""		},
	{']',   "",   "", ""    , ""		},

	{'z', ".", "ぅ",  "",  "."	},
	{'x', "ひ", "ー", "び", "ぴ"	},
	{'c', "す", "ろ", "ず", "す"	},
	{'v', "ふ", "や", "ぶ", "ぷ"	},
	{'b', "へ", "ぃ", "べ", "ぺ"	},
	{'n', "め", "ぷ", "ぬ", "め"	},
	{'m', "そ", "ぞ", "ゆ", "そ"	},
	{',', "ね", "ぺ", "む", "ね"	},
	{'.', "ほ", "ぼ", "わ", "ぽ"	},
	{'/', "・",   "", "ぉ", "・"	}
}

function love.load()
	mainFont = love.graphics.newFont("ipaexg.ttf", 24);
	love.graphics.setFont(mainFont);
	love.keyboard.setKeyRepeat(true)
end


function love.draw()
		love.graphics.print(text, 0, 0)
end


function love.keypressed(key)

	isDownLeftShift = love.keyboard.isDown('lshift', 'rshift')
	isDownHenkanKey =  love.keyboard.isScancodeDown('international4')
	isDownMuHenkanKey = love.keyboard.isScancodeDown('international5')

	if isDownLeftShift == true then
		bank = 5

	elseif isDownHenkanKey == true then
		bank = 4

	elseif isDownMuHenkanKey == true then
		bank = 3

	else
		bank = 2
	end


	for i = 1, table.maxn(Key106toNICOLA), 1 do

		if key == Key106toNICOLA[i][1]	then 
			text = text .. Key106toNICOLA[i][bank]
		end
	end


-- strolen from love2d.org
    if key == ":" then		--	後退キー (Backspace)
        -- 文字列にある最後のUTF-8 文字のバイト・オフセット。
        local byteoffset = utf8.offset(text, -1)
 
        if byteoffset then
            -- 最後の UTF-8 文字を削除。
            -- string.sub は UTF-8 文字ではなくバイトで操作を行うため、 string.sub(text, 1, -2) を使うことはできません。
            text = string.sub(text, 1, byteoffset - 1)
        end
    end


    if key == "]" then		--	取消キー (Backspace)
		text = ""
	end

    if key == "escape" then
		love.event.quit()
	end

end


注意

  • タイマー (love.timer / love.update) によるキー入力判定を使用してませんので OASYS 実機、各種エミュレーターと挙動が異なります。
  • ライセンスに関しては utf8 のサンプルコードから一部拝借しておりますので GFDL です。コードは Lua らしい記述方法ではありませんし、ライセンス、挙動に違和感がある気になるようでしたら、書き直しをお勧めします。
  • このコードは試作・実験用に製作されたものであり、製品としての品質は保証されていません。このコードを使用した結果に関しての一切の責任は負いません。
  • 使用には IPAex フォントが必要です。

関連