Last active
March 2, 2024 00:51
-
-
Save AWtnb/1a63972caf274bfbbfb8543b753d1b9e to your computer and use it in GitHub Desktop.
CorvusSKK init.lua
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
--[[ | |
CorvusSKK Lua拡張スクリプト | |
Cから呼ばれるLuaの関数 | |
辞書検索 | |
lua_skk_search(key, okuri) | |
key : 見出し語 string | |
okuri : 送り仮名 string | |
戻り値 : "/<C1><;A1>/<C2><;A2>/.../<Cn><;An>/\n" or "" string | |
補完 | |
lua_skk_complement(key) | |
key : 見出し語 string | |
戻り値 : "/<K1>/<K2>/.../<Kn>/\n" or "" string | |
見出し語変換 | |
lua_skk_convert_key(key, okuri) | |
key : 見出し語 string | |
okuri : 送り仮名 string | |
戻り値 : 変換済み文字列 string | |
候補変換 | |
lua_skk_convert_candidate(key, candidate, okuri) | |
key : 見出し語 string | |
candidate : 候補 string | |
okuri : 送り仮名 string | |
戻り値 : 変換済み文字列 string | |
逆検索 | |
lua_skk_reverse(candidate) | |
candidate : 候補 string | |
戻り値 : 見出し語 string | |
辞書追加 | |
lua_skk_add(okuriari, key, candidate, annotation, okuri) | |
okuriari : boolean (送りあり:true/送りなし:false) | |
key : 見出し語 string | |
candidate : 候補 string | |
annotation : 注釈 string | |
okuri : 送り仮名 string | |
戻り値 : なし | |
辞書削除 | |
lua_skk_delete(okuriari, key, candidate) | |
okuriari : boolean (送りあり:true/送りなし:false) | |
key : 見出し語 string | |
candidate : 候補 string | |
戻り値 : なし | |
辞書保存 | |
lua_skk_save() | |
戻り値 : なし | |
Luaから呼ばれるCの関数 | |
ユーザー辞書検索 | |
crvmgr.search_user_dictionary(key, okuri) | |
key : 見出し語 string | |
okuri : 送り仮名 string | |
戻り値 : "/<C1><;A1>/<C2><;A2>/.../<Cn><;An>/\n" or "" string | |
SKK辞書検索 | |
crvmgr.search_skk_dictionary(key, okuri) | |
key : 見出し語 string | |
okuri : 送り仮名 string | |
戻り値 : "/<C1><;A1>/<C2><;A2>/.../<Cn><;An>/\n" or "" string | |
SKK辞書サーバー検索 | |
crvmgr.search_skk_server(key) | |
key : 見出し語 string | |
戻り値 : "/<C1><;A1>/<C2><;A2>/.../<Cn><;An>/\n" or "" string | |
SKK辞書サーバー情報検索 | |
crvmgr.search_skk_server_info() | |
戻り値 : SKK Serverプロトコル"2"の結果 バージョン番号 string | |
SKK Serverプロトコル"3"の結果 ホスト名 string | |
Unicodeコードポイント変換 | |
crvmgr.search_unicode(key) | |
key : 見出し語 string | |
戻り値 : "/<C1><;A1>/<C2><;A2>/.../<Cn><;An>/\n" or "" string | |
JIS X 0213面区点番号変換 | |
crvmgr.search_jisx0213(key) | |
key : 見出し語 string | |
戻り値 : "/<C1><;A1>/<C2><;A2>/.../<Cn><;An>/\n" or "" string | |
JIS X 0208区点番号変換 | |
crvmgr.search_jisx0208(key) | |
key : 見出し語 string | |
戻り値 : "/<C1><;A1>/<C2><;A2>/.../<Cn><;An>/\n" or "" string | |
文字コード表記変換 (ASCII, JIS X 0201(片仮名, 8bit), JIS X 0213 / Unicode) | |
crvmgr.search_character_code(key) | |
key : 見出し語 string | |
戻り値 : "/<C1><;A1>/<C2><;A2>/.../<Cn><;An>/\n" or "" string | |
補完 | |
crvmgr.complement(key) | |
key : 見出し語 string | |
戻り値 : "/<K1>/<K2>/.../<Kn>/\n" or "" string | |
逆検索 | |
crvmgr.reverse(candidate) | |
candidate : 候補 string | |
戻り値 : 見出し語 string | |
辞書追加 | |
crvmgr.add(okuriari, key, candidate, annotation, okuri) | |
okuriari : boolean (送りあり:true/送りなし:false) | |
key : 見出し語 string | |
candidate : 候補 string | |
annotation : 注釈 string | |
okuri : 送り仮名 string | |
戻り値 : なし | |
辞書削除 | |
crvmgr.delete(okuriari, key, candidate) | |
okuriari : boolean (送りあり:true/送りなし:false) | |
key : 見出し語 string | |
candidate : 候補 string | |
戻り値 : なし | |
辞書保存 | |
crvmgr.save() | |
戻り値 : なし | |
Cから定義される変数 | |
バージョン (skk-version)に使用 | |
SKK_VERSION | |
"CorvusSKK X.Y.Z" string | |
--]] | |
-- 数値変換 | |
enable_skk_convert_num = true | |
-- 実行変換 | |
enable_skk_convert_gadget = true | |
-- skk-ignore-dic-word | |
enable_skk_ignore_dic_word = false | |
-- skk-search-sagyo-henkaku (t:true/anything:false) | |
enable_skk_search_sagyo_only = true | |
-- 数値変換タイプ1 (全角数字) | |
local skk_num_type1_table = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"} | |
-- 数値変換タイプ2, 3 (漢数字) | |
local skk_num_type3_table = {"〇", "一", "二", "三", "四", "五", "六", "七", "八", "九"} | |
local skk_num_type3_1k_table = {"", "十", "百", "千"} | |
local skk_num_type3_10k_table = {"", "万", "億", "兆", "京", "垓", | |
"𥝱", "穣", "溝", "澗", "正", "載", "極", "恒河沙", "阿僧祇", "那由他", "不可思議", "無量大数"} | |
-- 数値変換タイプ5 (漢数字、大字) | |
local skk_num_type5_table = {"零", "壱", "弐", "参", "四", "五", "六", "七", "八", "九"} | |
local skk_num_type5_1k_table = {"", "拾", "百", "千"} | |
local skk_num_type5_10k_table = {"", "万", "億", "兆", "京", "垓", | |
"𥝱", "穣", "溝", "澗", "正", "載", "極", "恒河沙", "阿僧祇", "那由他", "不可思議", "無量大数"} | |
-- 数値変換タイプ6 (独自拡張、ローマ数字) | |
local skk_num_type6_table_I = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"} | |
local skk_num_type6_table_X = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"} | |
local skk_num_type6_table_C = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"} | |
local skk_num_type6_table_M = {"", "M", "MM", "MMM"} | |
-- 数値変換タイプ8 (桁区切り) | |
local skk_num_type8_sep = "," | |
local skk_num_type8_sepnum = 3 | |
-- 現在時刻 | |
local skk_gadget_time = 0 | |
-- skk-henkan-key | |
local skk_henkan_key = "" | |
-- skk-num-list | |
local skk_num_list = {} | |
-- おみくじ吉凶テーブル | |
local skk_gadget_omikuji_table = {"大吉", "吉", "中吉", "小吉", "末吉", "凶", "大凶"} | |
-- 元号テーブル | |
local skk_gadget_gengo_table = { | |
{{2019, 5, 1, 1}, "れいわ", {"令和", "R"}}, -- 2019/05/01 | |
{{1989, 1, 8, 1}, "へいせい", {"平成", "H"}}, -- 1989/01/08 | |
{{1926, 12, 25, 1}, "しょうわ", {"昭和", "S"}}, -- 1926/12/25 | |
{{1912, 7, 30, 1}, "たいしょう", {"大正", "T"}}, -- 1912/07/30 | |
{{1873, 1, 1, 6}, "めいじ", {"明治", "M"}}, -- 1873/01/01(グレゴリオ暦 明治6年) | |
} | |
-- 月テーブル | |
local skk_gadget_month_table = { | |
{"Jan", "1"}, {"Feb", "2"}, {"Mar", "3"}, {"Apr", "4"}, {"May", "5"}, {"Jun", "6"}, | |
{"Jul", "7"}, {"Aug", "8"}, {"Sep", "9"}, {"Oct", "10"}, {"Nov", "11"}, {"Dec", "12"} | |
} | |
-- 曜日テーブル | |
local skk_gadget_dayofweek_table = { | |
{"Sun", "日"}, {"Mon", "月"}, {"Tue", "火"}, {"Wed", "水"}, {"Thu", "木"}, {"Fri", "金"}, {"Sat", "土"} | |
} | |
-- 単位テーブル | |
local skk_gadget_unit_table_org = { | |
{"mile", {{"yard", 1760.0}, {"feet", 5280.0}, {"m", 1609.344}, {"km", 1.609344}}}, | |
{"yard", {{"feet", 3.0}, {"inch", 36.0}, {"m", 0.9144}, {"cm", 91.44}, {"mm", 914.4}}}, | |
{"feet", {{"inch", 12.0}, {"yard", (1.0 / 3.0)}, {"m", 0.3048}, {"cm", 30.48}, {"mm", 304.8}}}, | |
{"inch", {{"feet", (1.0 / 12.0)}, {"yard", (1.0 / 36.0)}, {"m", 0.0254}, {"cm", 2.54}, {"mm", 25.4}}}, | |
{"pound", {{"g", 453.59237}, {"ounce", 16.0}, {"grain", 7000.0}}}, | |
{"ounce", {{"g", 28.349523125}, {"pound", (1.0 / 16.0)}, {"grain", (7000.0 / 16.0)}}}, | |
{"grain", {{"mg", 64.79891}, {"g", 0.06479891}, {"pound", (1.0 / 7000.0)}, {"ounce", (16.0 / 7000.0)}}}, | |
{"寸", {{"mm", (1000 / 33)}, {"cm", (100 / 33)}}}, | |
{"尺", {{"mm", (10000 / 33)}, {"cm", (1000 / 33)}}}, | |
{"坪", {{"㎡", (400 / 121)}}}, | |
{"勺", {{"L", (2401 / 1331) / 100}, {"mL", (2401 / 1331) * 10}}}, | |
{"合", {{"L", (2401 / 1331) / 10}, {"mL", (2401 / 1331) * 100}}}, | |
{"升", {{"L", (2401 / 1331)}}}, | |
{"斗", {{"L", (2401 / 1331) * 10}}}, | |
} | |
local skk_gadget_unit_table = {} | |
for i, v in ipairs(skk_gadget_unit_table_org) do | |
local unit_to_table = {} | |
for j, vv in ipairs(v[2]) do | |
unit_to_table[vv[1]] = vv[2] | |
end | |
skk_gadget_unit_table[v[1]] = unit_to_table | |
end | |
-- 変数テーブル | |
local skk_gadget_variable_table_org = { | |
{"skk-henkan-key", function() return skk_henkan_key end}, | |
{"skk-num-list", function() return skk_num_list end}, | |
{"fill-column", "70"}, | |
{"comment-start", "/*"}, | |
{"comment-end", "*/"}, | |
} | |
local skk_gadget_variable_table = {} | |
for i, v in ipairs(skk_gadget_variable_table_org) do | |
skk_gadget_variable_table[v[1]] = v[2] | |
end | |
-- (window-width) | |
local window_width_value = "80" | |
-- (window-height) | |
local window_height_value = "23" | |
-- 文字コード表記変換プレフィックス | |
local charcode_conv_prefix = "?" | |
-- 数字を漢数字に変換 | |
local function skk_num_to_kanji(num, type_table, type_1k_table, type_10k_table) | |
local ret = "" | |
-- 0を付加して4の倍数の桁数にする | |
num = string.rep("0", 4 - string.len(num) % 4) .. num | |
local m = string.len(num) / 4 | |
for i = 1, m do | |
for j = 1, 4 do | |
local sj = string.sub(num, (i - 1) * 4 + j, (i - 1) * 4 + j) | |
if (sj ~= "0") then | |
-- 十の位と百の位の「一」は表記しない | |
if((sj ~= "1") or (j == 1) or (j == 4)) then | |
ret = ret .. type_table[tonumber(sj) + 1] | |
end | |
ret = ret .. type_1k_table[(4 - j) % 4 + 1] | |
end | |
end | |
if (string.sub(num, (i - 1) * 4 + 1, (i - 1) * 4 + 4) ~= "0000") then | |
ret = ret .. type_10k_table[m - i + 1] | |
end | |
end | |
-- 0のとき | |
if (ret == "") then | |
ret = type_table[1] | |
end | |
return ret | |
end | |
-- 数値変換タイプ未定義 | |
local function skk_num_type_n(num, len) | |
return num | |
end | |
-- 数値変換タイプ1 (全角数字) | |
local function skk_num_type_1(num, len) | |
local ret = "" | |
for i = 1, len do | |
ret = ret .. skk_num_type1_table[tonumber(string.sub(num, i, i)) + 1] | |
end | |
return ret | |
end | |
-- 数値変換タイプ2 (漢数字、位取りあり) | |
local function skk_num_type_2(num, len) | |
local ret = "" | |
for i = 1, len do | |
ret = ret .. skk_num_type3_table[tonumber(string.sub(num, i, i)) + 1] | |
end | |
return ret | |
end | |
-- 数値変換タイプ3 (漢数字、位取りなし) | |
local function skk_num_type_3(num, len) | |
local ret = "" | |
if (len > (#skk_num_type3_10k_table * 4)) then | |
ret = num | |
else | |
ret = skk_num_to_kanji(num, skk_num_type3_table, skk_num_type3_1k_table, skk_num_type3_10k_table) | |
end | |
return ret | |
end | |
-- 数値変換タイプ4 (数値再変換) | |
local function skk_num_type_4(num, len) | |
local ret = "" | |
-- ユーザー辞書検索 | |
ret = ret .. crvmgr.search_user_dictionary(num, "") | |
-- SKK辞書検索 | |
ret = ret .. crvmgr.search_skk_dictionary(num, "") | |
-- SKK辞書サーバー検索 | |
ret = ret .. crvmgr.search_skk_server(num) | |
-- 余計な"/\n"を削除 | |
ret = string.gsub(ret, "/\n/", "/") | |
-- 先頭の候補のみ | |
ret = string.match(ret, "^/([^;/]+)") | |
return ret | |
end | |
-- 数値変換タイプ5 (漢数字、大字) | |
local function skk_num_type_5(num, len) | |
local ret = "" | |
if (len > (#skk_num_type5_10k_table * 4)) then | |
ret = num | |
else | |
ret = skk_num_to_kanji(num, skk_num_type5_table, skk_num_type5_1k_table, skk_num_type5_10k_table) | |
end | |
return ret | |
end | |
-- 数値変換タイプ6 (独自拡張、ローマ数字) | |
local function skk_num_type_6(num, len) | |
local ret = "" | |
local n = tonumber(num) | |
if (n >= 1 and n <= 3999) then | |
ret = skk_num_type6_table_M[((n - (n % 1000)) / 1000) + 1] .. | |
skk_num_type6_table_C[(((n - (n % 100)) / 100) % 10) + 1] .. | |
skk_num_type6_table_X[(((n - (n % 10)) / 10) % 10) + 1] .. | |
skk_num_type6_table_I[(n % 10) + 1] | |
end | |
return ret | |
end | |
-- 数値変換タイプ8 (桁区切り) | |
local function skk_num_type_8(num, len) | |
local ret = "" | |
if (len % skk_num_type8_sepnum ~= 0) then | |
ret = ret .. string.sub(num, 1, len % skk_num_type8_sepnum) .. skk_num_type8_sep | |
end | |
for i = 0, (len - len % skk_num_type8_sepnum) / skk_num_type8_sepnum do | |
local sepi = len % skk_num_type8_sepnum + i * skk_num_type8_sepnum | |
ret = ret .. string.sub(num, sepi + 1, sepi + skk_num_type8_sepnum) .. skk_num_type8_sep | |
end | |
ret = string.sub(ret, 1, string.len(ret) - string.len(skk_num_type8_sep) - 1) | |
return ret | |
end | |
-- 数値変換タイプ9 | |
local function skk_num_type_9(num, len) | |
local ret = "" | |
if (len == 2) then | |
ret = skk_num_type1_table[tonumber(string.sub(num, 1, 1)) + 1] .. | |
skk_num_type3_table[tonumber(string.sub(num, 2, 2)) + 1] | |
else | |
ret = num | |
end | |
return ret | |
end | |
-- 数値変換タイプ関数テーブル | |
local skk_num_type_func_table = { | |
skk_num_type_1, | |
skk_num_type_2, | |
skk_num_type_3, | |
skk_num_type_4, | |
skk_num_type_5, | |
skk_num_type_6, | |
skk_num_type_n, | |
skk_num_type_8, | |
skk_num_type_9 | |
} | |
-- 数値変換 | |
local function skk_convert_num_type(num, type) | |
local ret = "" | |
local len = string.len(num) | |
local ntype = tonumber(type) | |
if ((1 <= ntype) and (ntype <= #skk_num_type_func_table)) then | |
ret = skk_num_type_func_table[ntype](num, len) | |
else | |
ret = num | |
end | |
return ret | |
end | |
-- concat | |
local function concat(t) | |
local ret = "" | |
for i, v in ipairs(t) do | |
ret = ret .. v | |
end | |
return ret | |
end | |
-- substring | |
local function substring(t) | |
local s = t[1] | |
local i = t[2] | |
local j = t[3] | |
return string.sub(s, i + 1, j) | |
end | |
-- make-string | |
local function make_string(t) | |
local ret = "" | |
local i = t[1] | |
local c = t[2] | |
if (string.sub(c, 1, 1) == "?") then | |
c = string.sub(c, 2, 2) | |
end | |
ret = string.rep(string.sub(c, 1, 1), tonumber(i)) | |
return ret | |
end | |
-- string-to-number | |
local function string_to_number(t) | |
return t[1] | |
end | |
-- string-to-char | |
local function string_to_char(t) | |
return string.sub(t[1], 1, 1) | |
end | |
-- number-to-string | |
local function number_to_string(t) | |
return t[1] | |
end | |
-- window-height | |
local function window_height(t) | |
return window_height_value | |
end | |
-- window-width | |
local function window_width(t) | |
return window_width_value | |
end | |
-- current-time | |
local function current_time(t) | |
return tostring(skk_gadget_time) | |
end | |
-- current-time-string | |
local function current_time_string(t) | |
local d = os.date("*t") | |
return string.format("%s %s %2d %02d:%02d:%02d %04d", | |
skk_gadget_dayofweek_table[d.wday][1], skk_gadget_month_table[d.month][1], d.day, | |
d.hour, d.min, d.sec, d.year) | |
end | |
-- format-time-string | |
local function format_time_string(t) | |
local format = t[1] | |
local time = tonumber(t[2]) | |
return os.date(format, time) | |
end | |
-- car | |
local function car(t) | |
if (#t > 0 and #t[1] > 0) then | |
return t[1][1] | |
end | |
return "" | |
end | |
-- cdr | |
local function cdr(t) | |
if (#t > 0 and #t[1] > 1) then | |
return {table.unpack(t[1], 2)} | |
end | |
return "" | |
end | |
-- convert float to integer (remove suffix ".0") | |
local function float_to_integer(value) | |
local ivalue = math.tointeger(value) | |
if ivalue then | |
return ivalue | |
end | |
return value | |
end | |
-- 1+ | |
local function plus_1(t) | |
local n1 = tonumber(t[1]) | |
if (not n1) then | |
return "" | |
end | |
return float_to_integer(n1 + 1) | |
end | |
-- 1- | |
local function minus_1(t) | |
local n1 = tonumber(t[1]) | |
if (not n1) then | |
return "" | |
end | |
return float_to_integer(n1 - 1) | |
end | |
-- + | |
local function plus(t) | |
local n = 0 | |
for i, v in ipairs(t) do | |
local n1 = tonumber(v) | |
if (not n1) then | |
return "" | |
end | |
n = n + n1 | |
end | |
return float_to_integer(n) | |
end | |
-- - | |
local function minus(t) | |
local n = 0 | |
if (#t == 1) then | |
local n1 = tonumber(t[1]) | |
if (not n1) then | |
return "" | |
end | |
n = -n1 | |
else | |
for i, v in ipairs(t) do | |
local n1 = tonumber(v) | |
if (not n1) then | |
return "" | |
end | |
if (i == 1) then | |
n = n1 | |
else | |
n = n - n1 | |
end | |
end | |
end | |
return float_to_integer(n) | |
end | |
-- skk-version | |
local function skk_version(t) | |
return SKK_VERSION | |
end | |
-- skk-server-version | |
local function skk_server_version(t) | |
local v, h = crvmgr.search_skk_server_info() | |
if (v == "" or h == "") then | |
return "" | |
end | |
return "SKK SERVER version " .. v .. "running on HOST " .. h | |
end | |
-- 西暦元号変換 | |
-- 引数 1:西暦文字列, 2:元号表記タイプ(1:漢字/2:英字頭文字), 3:変換タイプ([0-9]), | |
-- 4:区切り, 5:末尾, 6:NOT"元"年, 7:月, 8:日 | |
-- 戻り値 変換済み文字列 | |
local function conv_ad_to_gengo(num, gengotype, type, div, tail, not_gannen, month, day) | |
local ret = "" | |
local year = tonumber(num) | |
for i, v in ipairs(skk_gadget_gengo_table) do | |
if ((year >= v[1][1] and month == 0 and day == 0) or | |
(year > v[1][1]) or | |
(year == v[1][1] and month > v[1][2]) or | |
(year == v[1][1] and month == v[1][2] and day >= v[1][3])) then | |
ret = v[3][tonumber(gengotype)] .. div | |
local gengo_year = year - v[1][1] + v[1][4] | |
if ((gengo_year == 1) and (not not_gannen)) then | |
ret = ret .. "元" .. tail | |
else | |
ret = ret .. skk_convert_num_type(tostring(gengo_year), type) .. tail | |
end | |
break | |
end | |
end | |
return ret | |
end | |
-- skk-ad-to-gengo | |
local function skk_ad_to_gengo(t) | |
local ret = "" | |
local num = skk_num_list[1] | |
local gengotype = t[1] + 1 | |
local divider = t[2] | |
local tail = t[3] | |
local not_gannen = t[4] | |
if (divider == "nil") then | |
divider = "" | |
end | |
if (tail == "nil") then | |
tail = "" | |
end | |
if (not_gannen == "nil") then | |
not_gannen = nil | |
end | |
ret = conv_ad_to_gengo(num, gengotype, "0", divider, tail, not_gannen, 0, 0) | |
return ret | |
end | |
-- skk-gengo-to-ad | |
local function skk_gengo_to_ad(t) | |
local ret = "" | |
local num = skk_num_list[1] | |
local head = t[1] | |
local tail = t[2] | |
local year = tonumber(num) | |
for i, v in ipairs(skk_gadget_gengo_table) do | |
if (string.sub(skk_henkan_key, 1, string.len(v[2])) == v[2]) then | |
if (year >= v[1][4]) then | |
local ad_year = year + v[1][1] - v[1][4] | |
ret = head .. tostring(ad_year) .. tail | |
break | |
end | |
end | |
end | |
return ret | |
end | |
-- skk-default-current-date | |
local function skk_default_current_date(t) | |
local ret = "" | |
if (t == nil) then | |
local d = os.date("*t", skk_gadget_time) | |
ret = string.format("%s年%s月%s日(%s)", | |
conv_ad_to_gengo(tostring(d.year), "1", "1", "", "", false, d.month, d.day), | |
skk_convert_num_type(tostring(d.month), "1"), | |
skk_convert_num_type(tostring(d.day), "1"), | |
skk_gadget_dayofweek_table[d.wday][2]) | |
else | |
local d = os.date("*t", skk_gadget_time) | |
local format = t[2] | |
local num_type = t[3] | |
local gengo = t[4] | |
local gengo_index = t[5] | |
local month_index = t[6] | |
local dayofweek_index = t[7] | |
local and_time = t[8] | |
if (format == nil or format == "nil") then | |
if ((and_time == nil) or (and_time == "nil")) then | |
format = "%s年%s月%s日(%s)" | |
else | |
format = "%s年%s月%s日(%s)%s時%s分%s秒" | |
end | |
end | |
if (num_type == "nil") then | |
num_type = "0" | |
end | |
if (dayofweek_index == "nil") then | |
dayofweek_index = "-1" | |
end | |
local y = "" | |
if (gengo == "nil") then | |
y = tostring(d.year) | |
else | |
y = conv_ad_to_gengo(tostring(d.year), tostring(tonumber(gengo_index) + 1), | |
num_type, "", "", false, d.month, d.day) | |
end | |
if ((and_time == nil) or (and_time == "nil")) then | |
ret = string.format(format, y, | |
skk_convert_num_type(tostring(d.month), num_type), | |
skk_convert_num_type(tostring(d.day), num_type), | |
skk_gadget_dayofweek_table[d.wday][tonumber(dayofweek_index) + 2]) | |
else | |
ret = string.format(format, y, | |
skk_convert_num_type(tostring(d.month), num_type), | |
skk_convert_num_type(tostring(d.day), num_type), | |
skk_gadget_dayofweek_table[d.wday][tonumber(dayofweek_index) + 2], | |
skk_convert_num_type(string.format("%02d", d.hour), num_type), | |
skk_convert_num_type(string.format("%02d", d.min), num_type), | |
skk_convert_num_type(string.format("%02d", d.sec), num_type)) | |
end | |
end | |
return ret | |
end | |
-- skk-current-date | |
local function skk_current_date(t) | |
local ret = "" | |
local pp_function = t[1] | |
-- local format = [2] | |
-- local and_time = [3] | |
if (pp_function == nil) then | |
ret = skk_default_current_date(nil) | |
else | |
ret = eval_table(pp_function) | |
end | |
return ret | |
end | |
-- skk-relative-date | |
local function skk_relative_date(t) | |
local ret = "" | |
local pp_function = t[1] | |
-- local format = t[2] | |
-- local and_time = t[3] | |
local ymd = t[4] | |
local diff = t[5] | |
local d = os.date("*t", skk_gadget_time) | |
if (ymd == ":yy") then | |
d["year"] = d["year"] + tonumber(diff) | |
elseif (ymd == ":mm") then | |
d["month"] = d["month"] + tonumber(diff) | |
elseif (ymd == ":dd") then | |
d["day"] = d["day"] + tonumber(diff) | |
else | |
end | |
local skk_gadget_time_bak = skk_gadget_time | |
skk_gadget_time = os.time(d) | |
if (pp_function == "nil") then | |
ret = skk_default_current_date(nil) | |
else | |
ret = eval_table(pp_function) | |
end | |
skk_gadget_time = skk_gadget_time_bak | |
return ret | |
end | |
-- skk-gadget-units-conversion | |
local function skk_gadget_units_conversion(t) | |
local ret = "" | |
local unit_from = t[1] | |
local number = t[2] | |
local unit_to = t[3] | |
local value_from = skk_gadget_unit_table[unit_from] | |
if (value_from) then | |
local value_to = value_from[unit_to] | |
if (value_to) then | |
ret = tostring(float_to_integer(tonumber(number) * value_to)) .. unit_to | |
end | |
end | |
return ret | |
end | |
-- skk-omikuji | |
local function skk_omikuji(t) | |
return skk_gadget_omikuji_table[math.random(1, #skk_gadget_omikuji_table)] | |
end | |
-- skk-strftime | |
local function skk_strftime(t) | |
local format = t[1] | |
local unit = t[2] | |
local diff = t[3] | |
local skk_gadget_time_table = os.date('*t', skk_gadget_time) | |
if (unit and skk_gadget_time_table[unit] and diff) then | |
skk_gadget_time_table[unit] = skk_gadget_time_table[unit] + tonumber(diff) | |
end | |
return os.date(format, os.time(skk_gadget_time_table)) | |
end | |
--[[ | |
additional | |
]]-- | |
-- usage: (yymmdd-to-short-date #0) | |
local function yymmdd_to_short_date(t) | |
local ymd = t[1] | |
local yy, mm, dd = ymd:sub(1, 2), ymd:sub(3, 4), ymd:sub(5, 6) | |
local ww = os.date("%a", os.time({year=(2000+yy),month=mm,day=dd})) | |
return string.format("%d月%d日(%s)", mm, dd, ww) | |
end | |
-- usage: (yymmdd-to-minimal-date #0) | |
local function yymmdd_to_minimal_date(t) | |
local ymd = t[1] | |
local yy, mm, dd = ymd:sub(1, 2), ymd:sub(3, 4), ymd:sub(5, 6) | |
local ww = os.date("%a", os.time({year=(2000+yy),month=mm,day=dd})) | |
return string.format("%d日(%s)", dd, ww) | |
end | |
-- usage: (to-short-date-of-this-year #0 #0) | |
local function to_short_date_of_this_year(t) | |
local yy = os.date("%Y") | |
local mm = t[1] | |
local dd = t[2] | |
local ww = os.date("%a", os.time({year=yy,month=mm,day=dd})) | |
return string.format("%d月%d日(%s)", mm, dd, ww) | |
end | |
-- usage: (to-minimal-date-of-this-year #0 #0) | |
local function to_minimal_date_of_this_year(t) | |
local yy = os.date("%Y") | |
local mm = t[1] | |
local dd = t[2] | |
local ww = os.date("%a", os.time({year=yy,month=mm,day=dd})) | |
return string.format("%d日(%s)", dd, ww) | |
end | |
-- usage: (to-short-date-of-this-month #0) | |
local function to_short_date_of_this_month(t) | |
local yy = os.date("%Y") | |
local mm = os.date("%m") | |
local dd = t[1] | |
local ww = os.date("%a", os.time({year=yy,month=mm,day=dd})) | |
return string.format("%d月%d日(%s)", mm, dd, ww) | |
end | |
-- usage: (to-minimal-date-of-this-month #0) | |
local function to_minimal_date_of_this_month(t) | |
local yy = os.date("%Y") | |
local mm = os.date("%m") | |
local dd = t[1] | |
local ww = os.date("%a", os.time({year=yy,month=mm,day=dd})) | |
return string.format("%d日(%s)", dd, ww) | |
end | |
-- https://www.mathkuro.com/game-dev/lua-convert-number-to-currency-style-string/ | |
local function to_comma_separated(num, unit) | |
local str1 = tostring(num) | |
local str2 = "" | |
local i = 1 | |
str1 = string.reverse(str1) | |
while (i <= string.len(str1)) do | |
str2 = "," .. string.reverse(string.sub(str1, i, i + 2)) .. str2 | |
i = i + 3 | |
end | |
return string.sub(str2, 2) .. unit | |
end | |
-- usage: (to-comma-separated-yen #0) | |
local function to_comma_separated_yen(t) | |
local num = t[1] | |
return to_comma_separated(num, "円") | |
end | |
local function to_japanese_unit(num, unit) | |
local units = {"万", "億", "兆", "京", "垓", "𥝱", "穣"} | |
local str1 = tostring(num) | |
local str2 = "" | |
local i = 1 | |
local j = 1 | |
local u = "" | |
str1 = string.reverse(str1) | |
while (i <= string.len(str1)) do | |
if j <= #units then | |
u =units[j] | |
else | |
u = "〓" | |
end | |
str2 = u .. string.reverse(string.sub(str1, i, i + 3)) .. str2 | |
i = i + 4 | |
j = j + 1 | |
end | |
local offset = string.len(u) | |
return string.sub(str2, offset + 1) .. unit | |
end | |
-- usage: (to-japanese-unit-yen #0) | |
local function to_japanese_unit_yen(t) | |
local num = t[1] | |
return to_japanese_unit(num, "円") | |
end | |
-- usage: (skk-day-minus "%Y%m%d" #0) | |
local function skk_day_minus(t) | |
local fmt = t[1] | |
local diff = t[2] | |
local yy = os.date("%Y") | |
local mm = os.date("%m") | |
local dd = os.date("%d") - tonumber(diff) | |
return os.date(fmt, os.time({year=yy,month=mm,day=dd})) | |
end | |
-- usage: (skk-day-plus "%Y%m%d" #0) | |
local function skk_day_plus(t) | |
local fmt = t[1] | |
local diff = t[2] | |
local yy = os.date("%Y") | |
local mm = os.date("%m") | |
local dd = os.date("%d") + tonumber(diff) | |
return os.date(fmt, os.time({year=yy,month=mm,day=dd})) | |
end | |
-- 関数テーブル | |
local skk_gadget_func_table_org = { | |
{"concat", concat}, | |
{"substring", substring}, | |
{"make-string", make_string}, | |
{"string-to-number", string_to_number}, | |
{"string-to-char", string_to_char}, | |
{"number-to-string", number_to_string}, | |
{"window-width", window_width}, | |
{"window-height", window_height}, | |
{"current-time", current_time}, | |
{"current-time-string", current_time_string}, | |
{"format-time-string", format_time_string}, | |
{"car", car}, | |
{"cdr", cdr}, | |
{"1+", plus_1}, | |
{"1-", minus_1}, | |
{"+", plus}, | |
{"-", minus}, | |
{"skk-version", skk_version}, | |
{"skk-server-version", skk_server_version}, | |
{"skk-ad-to-gengo", skk_ad_to_gengo}, | |
{"skk-gengo-to-ad", skk_gengo_to_ad}, | |
{"skk-default-current-date", skk_default_current_date}, | |
{"skk-current-date", skk_current_date}, | |
{"skk-relative-date", skk_relative_date}, | |
{"skk-gadget-units-conversion", skk_gadget_units_conversion}, | |
{"skk-omikuji", skk_omikuji}, | |
{"skk-strftime", skk_strftime}, | |
{"yymmdd-to-short-date", yymmdd_to_short_date}, | |
{"yymmdd-to-minimal-date", yymmdd_to_minimal_date}, | |
{"to-short-date-of-this-year", to_short_date_of_this_year}, | |
{"to-minimal-date-of-this-year", to_minimal_date_of_this_year}, | |
{"to-short-date-of-this-month", to_short_date_of_this_month}, | |
{"to-minimal-date-of-this-month", to_minimal_date_of_this_month}, | |
{"to-comma-separated-yen", to_comma_separated_yen}, | |
{"to-japanese-unit-yen", to_japanese_unit_yen}, | |
{"skk-day-plus", skk_day_plus}, | |
{"skk-day-minus", skk_day_minus}, | |
} | |
local skk_gadget_func_table = { | |
} | |
for i, v in ipairs(skk_gadget_func_table_org) do | |
skk_gadget_func_table[v[1]] = v[2] | |
end | |
-- 文字列パース | |
local function parse_string(s) | |
local ret = "" | |
local bsrep = "\u{f05c}" | |
s = string.gsub(s, "^\"(.*)\"$", "%1") | |
-- バックスラッシュ | |
s = string.gsub(s, "\\\\", bsrep) | |
-- 二重引用符 | |
s = string.gsub(s, "\\\"", "\"") | |
-- 空白文字 | |
s = string.gsub(s, "\\s", "\x20") | |
-- 制御文字など | |
s = string.gsub(s, "\\[abtnvfred ]", "") | |
-- 8進数表記の文字 | |
s = string.gsub(s, "\\[0-3][0-7][0-7]", | |
function(n) | |
local c = | |
tonumber(string.sub(n, 2, 2)) * 64 + | |
tonumber(string.sub(n, 3, 3)) * 8 + | |
tonumber(string.sub(n, 4, 4)) | |
if (c >= 0x20 and c <= 0x7E) then | |
return string.char(c) | |
end | |
return "" | |
end) | |
-- 意味なしエスケープ | |
s = string.gsub(s, "\\", "") | |
-- バックスラッシュ | |
s = string.gsub(s, bsrep, "\\") | |
ret = s | |
return ret | |
end | |
-- S式をテーブル表記に変換 | |
function convert_s_to_table(s) | |
local ret = "" | |
local e = "" | |
local q = 0 | |
local d = 0 | |
local c = "" | |
local r = "" | |
for i = 1, string.len(s) do | |
c = string.sub(s, i, i) | |
r = string.sub(ret, -1) | |
if (c == "\"" and q == 0) then | |
q = 1 | |
elseif (c == "\"" and q == 1 and d == 0) then | |
q = 0 | |
end | |
if (q == 0) then | |
if (c == "(") then | |
if (ret ~= "") then | |
if (r ~= "{") then | |
ret = ret .. "," | |
end | |
end | |
ret = ret .. "{" | |
elseif (c == ")" or c == "\x20") then | |
if (e ~= "") then | |
if (r ~= "{") then | |
ret = ret .. "," | |
end | |
e = string.gsub(e, "\"", "\\\"") | |
ret = ret .. "\"" .. e .. "\"" | |
e = "" | |
end | |
else | |
e = e .. c | |
end | |
if (c == ")") then | |
ret = ret .. "}" | |
end | |
else | |
e = e .. c | |
if (c == "\\") then | |
e = e .. c | |
d = d ~ 1 | |
else | |
d = 0 | |
end | |
end | |
end | |
return ret | |
end | |
-- テーブル評価 | |
function eval_table(x) | |
local argtype = type(x) | |
if (argtype == "table" and #x > 0) then | |
if (x[1] == "lambda") then | |
if (#x >= 3 and x[3]) then | |
return x[3] | |
else | |
return "" | |
end | |
end | |
local func = skk_gadget_func_table[x[1]] | |
if (func) then | |
local arg = {table.unpack(x, 2)} | |
for i, v in ipairs(arg) do | |
local vv = skk_gadget_variable_table[v] | |
if (vv) then | |
v = vv | |
end | |
arg[i] = eval_table(v) | |
end | |
return func(arg) | |
end | |
elseif (argtype == "function") then | |
return x() | |
elseif (argtype == "string") then | |
return parse_string(x) | |
end | |
return "" | |
end | |
-- skk-ignore-dic-word | |
local function skk_ignore_dic_word(candidates) | |
local ret = "" | |
local sca = "" | |
local ignore_word_table = {} | |
for ca in string.gmatch(candidates, "([^/]+)") do | |
local c = string.gsub(ca, ";.+", "") | |
local word = string.gsub(c, "^%(%s*skk%-ignore%-dic%-word%s+\"(.+)\"%s*%)$", "%1") | |
if (word ~= c) then | |
ignore_word_table[word] = true | |
else | |
sca = sca .. "/" .. ca | |
end | |
end | |
if (sca == candidates) then | |
return candidates | |
end | |
for ca in string.gmatch(sca, "([^/]+)") do | |
local c = string.gsub(ca, ";.+", "") | |
if (not ignore_word_table[c]) then | |
ret = ret .. "/" .. ca | |
end | |
end | |
return ret | |
end | |
-- 候補全体を数値変換 | |
local function skk_convert_num(key, candidate) | |
local ret = "" | |
local keytemp = key | |
ret = string.gsub(candidate, "#%d+", | |
function(type) | |
local num = string.match(keytemp, "%d+") | |
keytemp = string.gsub(keytemp, "%d+", "#", 1) | |
if (num) then | |
return skk_convert_num_type(num, string.sub(type, 2)) | |
else | |
return type | |
end | |
end) | |
return ret | |
end | |
-- 実行変換 | |
local function skk_convert_gadget(key, candidate) | |
-- skk-henkan-key | |
skk_henkan_key = key | |
-- skk-num-list | |
skk_num_list = {} | |
string.gsub(key, "%d+", | |
function(n) | |
table.insert(skk_num_list, n) | |
end) | |
-- 日付時刻 | |
skk_gadget_time = os.time() | |
-- 乱数 | |
math.randomseed(skk_gadget_time) | |
local f = load("return " .. convert_s_to_table(candidate)) | |
if (not f) then | |
return candidate | |
end | |
return eval_table(f()) | |
end | |
-- 候補変換処理 | |
local function skk_convert_candidate(key, candidate, okuri) | |
local ret = "" | |
local temp = candidate | |
-- xtu/xtsuで「っ」を送り仮名にしたとき送りローマ字「t」を有効にする | |
if (okuri == "っ" and string.sub(key, string.len(key)) == "x") then | |
return candidate | |
end | |
-- 数値変換 | |
if (enable_skk_convert_num) then | |
if (string.find(key, "%d+") and string.find(temp, "#%d")) then | |
temp = skk_convert_num(key, temp) | |
ret = temp | |
end | |
end | |
-- 実行変換 | |
if (enable_skk_convert_gadget) then | |
if (string.match(temp, "^%(.+%)$")) then | |
temp = skk_convert_gadget(key, temp) | |
ret = temp | |
end | |
end | |
return ret | |
end | |
-- 見出し語変換処理 | |
local function skk_convert_key(key, okuri) | |
local ret = "" | |
-- xtu/xtsuで「っ」を送り仮名にしたとき送りローマ字を「t」に変換する | |
if (okuri == "っ" and string.sub(key, string.len(key)) == "x") then | |
return string.sub(key, 1, string.len(key) - 1) .. "t" | |
end | |
-- 文字コード表記変換のとき見出し語変換しない | |
local cccplen = string.len(charcode_conv_prefix) | |
if (cccplen < string.len(key) and string.sub(key, 1, cccplen) == charcode_conv_prefix) then | |
return "" | |
end | |
-- 数値変換 | |
if (enable_skk_convert_num) then | |
if (string.find(key, "%d+")) then | |
ret = string.gsub(key, "%d+", "#") | |
end | |
end | |
return ret | |
end | |
-- 辞書検索処理 | |
-- 検索結果のフォーマットはSKK辞書の候補部分と同じ | |
-- "/<C1><;A1>/<C2><;A2>/.../<Cn><;An>/\n" | |
local function skk_search(key, okuri) | |
local ret = "" | |
-- ユーザー辞書検索 | |
ret = ret .. crvmgr.search_user_dictionary(key, okuri) | |
-- SKK辞書検索 | |
ret = ret .. crvmgr.search_skk_dictionary(key, okuri) | |
-- SKK辞書サーバー検索 | |
ret = ret .. crvmgr.search_skk_server(key) | |
if (okuri == "") then | |
-- Unicodeコードポイント変換 | |
ret = ret .. crvmgr.search_unicode(key) | |
-- JIS X 0213面区点番号変換 | |
ret = ret .. crvmgr.search_jisx0213(key) | |
-- JIS X 0208区点番号変換 | |
ret = ret .. crvmgr.search_jisx0208(key) | |
local cccplen = string.len(charcode_conv_prefix) | |
if (cccplen < string.len(key) and string.sub(key, 1, cccplen) == charcode_conv_prefix) then | |
local subkey = string.sub(key, cccplen + 1) | |
-- 文字コード表記変換 | |
ret = ret .. crvmgr.search_character_code(subkey) | |
end | |
end | |
-- 余計な"/\n"を削除 | |
ret = string.gsub(ret, "/\n/", "/") | |
return ret | |
end | |
--[[ | |
C側から呼ばれる関数群 | |
--]] | |
-- 辞書検索 | |
function lua_skk_search(key, okuri) | |
-- skk-search-sagyo-henkaku (t:true/anything:false) | |
-- 「送りあり変換で送りなし候補も検索する」 → 送り仮名あり、送りローマ字なし | |
if (okuri ~= "" and string.match(string.sub(key, -1), "[a-z]") == nil) then | |
if (enable_skk_search_sagyo_only) then | |
if (string.find("さしすせ", okuri) ~= nil) then | |
okuri = "" | |
end | |
else | |
okuri = "" | |
end | |
end | |
local ret = skk_search(key, okuri) | |
-- skk-ignore-dic-word | |
if (enable_skk_ignore_dic_word) then | |
ret = skk_ignore_dic_word(ret) | |
end | |
return ret | |
end | |
-- 補完 | |
function lua_skk_complement(key) | |
return crvmgr.complement(key) | |
end | |
-- 見出し語変換 | |
function lua_skk_convert_key(key, okuri) | |
return skk_convert_key(key, okuri) | |
end | |
-- 候補変換 | |
function lua_skk_convert_candidate(key, candidate, okuri) | |
return skk_convert_candidate(key, candidate, okuri) | |
end | |
-- 逆検索 | |
function lua_skk_reverse(candidate) | |
return crvmgr.reverse(candidate) | |
end | |
-- 辞書追加 | |
function lua_skk_add(okuriari, key, candidate, annotation, okuri) | |
--[[ | |
-- 例) 送りありのときユーザー辞書に登録しない | |
if (okuriari) then | |
return | |
end | |
--]] | |
--[[ | |
-- 例) 送り仮名ブロックを登録しない | |
if (okuriari) then | |
okuri = "" | |
end | |
--]] | |
--[[ | |
-- 例) Unicodeコードポイント変換のときユーザー辞書に登録しない | |
if not (okuriari) then | |
if (string.match(key, "^U%+[0-9A-F]+$") or string.match(key, "^u[0-9a-f]+$")) then | |
if (string.match(key, "^U%+[0-9A-F][0-9A-F][0-9A-F][0-9A-F]$") or -- U+XXXX | |
string.match(key, "^U%+[0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F]$") or -- U+XXXXX | |
string.match(key, "^U%+10[0-9A-F][0-9A-F][0-9A-F][0-9A-F]$") or -- U+10XXXX | |
string.match(key, "^u[0-9a-f][0-9a-f][0-9a-f][0-9a-f]$") or -- uxxxx | |
string.match(key, "^u[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]$") or -- uxxxxx | |
string.match(key, "^u10[0-9a-f][0-9a-f][0-9a-f][0-9a-f]$")) then -- u10xxxx | |
return | |
end | |
end | |
end | |
--]] | |
--[[ | |
-- 例) JIS X 0213面区点番号変換のときユーザー辞書に登録しない | |
if not (okuriari) then | |
if (string.match(key, "^[12]%-[0-9][0-9]%-[0-9][0-9]$")) then | |
if (string.match(key, "^[12]%-0[1-9]%-0[1-9]$") or -- [12]-01-01 - [12]-09-94 | |
string.match(key, "^[12]%-0[1-9]%-[1-8][0-9]$") or -- 〃 | |
string.match(key, "^[12]%-0[1-9]%-9[0-4]$") or -- 〃 | |
string.match(key, "^[12]%-[1-8][0-9]%-0[1-9]$") or -- [12]-10-01 - [12]-89-94 | |
string.match(key, "^[12]%-[1-8][0-9]%-[1-8][0-9]$") or -- 〃 | |
string.match(key, "^[12]%-[1-8][0-9]%-9[0-4]$") or -- 〃 | |
string.match(key, "^[12]%-9[0-4]%-0[1-9]$") or -- [12]-90-01 - [12]-94-94 | |
string.match(key, "^[12]%-9[0-4]%-[1-8][0-9]$") or -- 〃 | |
string.match(key, "^[12]%-9[0-4]%-9[0-4]$")) then -- 〃 | |
return | |
end | |
end | |
end | |
--]] | |
--[[ | |
-- 例) JIS X 0208区点番号変換のときユーザー辞書に登録しない | |
if not (okuriari) then | |
if (string.match(key, "^[0-9][0-9]%-[0-9][0-9]$")) then | |
if (string.match(key, "^0[1-9]%-0[1-9]$") or -- 01-01 - 09-94 | |
string.match(key, "^0[1-9]%-[1-8][0-9]$") or -- 〃 | |
string.match(key, "^0[1-9]%-9[0-4]$") or -- 〃 | |
string.match(key, "^[1-8][0-9]%-0[1-9]$") or -- 10-01 - 89-94 | |
string.match(key, "^[1-8][0-9]%-[1-8][0-9]$") or -- 〃 | |
string.match(key, "^[1-8][0-9]%-9[0-4]$") or -- 〃 | |
string.match(key, "^9[0-4]%-0[1-9]$") or -- 90-01 - 94-94 | |
string.match(key, "^9[0-4]%-[1-8][0-9]$") or -- 〃 | |
string.match(key, "^9[0-4]%-9[0-4]$")) then -- 〃 | |
return | |
end | |
end | |
end | |
--]] | |
--[[ | |
-- 例) 文字コード表記変換のときユーザー辞書に登録しない | |
if not (okuriari) then | |
local cccplen = string.len(charcode_conv_prefix) | |
if (cccplen < string.len(key) and string.sub(key, 1, cccplen) == charcode_conv_prefix) then | |
return | |
end | |
end | |
--]] | |
crvmgr.add(okuriari, key, candidate, annotation, okuri) | |
end | |
-- 辞書削除 | |
function lua_skk_delete(okuriari, key, candidate) | |
crvmgr.delete(okuriari, key, candidate) | |
end | |
-- 辞書保存 | |
function lua_skk_save() | |
crvmgr.save() | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment