diff --git a/json/howToMake.md b/json/howToMake.md
index 85bd77b..58419aa 100644
--- a/json/howToMake.md
+++ b/json/howToMake.md
@@ -98,6 +98,7 @@ azooKeyでは`"input"`の他にいくつかの動作を行うことができま
| complete | なし | 変換を確定します |
| replace_last_characters | table: {str: str} | カーソル文頭方向の文字列を引数のtableに基づいて置換します。例えばカーソル文頭方向の文字列が`"abcdef"`であり、テーブルに`"def":":="`が指定されている場合は`"abc:="`と置換されます。 |
| replace_default | なし | azooKeyが標準で用いている「濁点・半濁点・小書き・大文字・小文字」の切り替えアクションです。 |
+| transliterate | kana: str | 入力の仮名文字を全てhiragana/katakana/hankakukatakanaのいずれかで置き換えます。 |
| smart_delete | direction: str
targets: [str] | directionに`"forward"`または`"backward"`を指定します。targetsに指定した文字のいずれかがカーソル進行方向に現れるまで削除を繰り返します。例えば文頭方向の文字列が`"Yes, it is"`であり、`"direction": "backward", "targets": [","]`であった場合、この操作の実行後に`" it is"`が削除されます。 |
| smart_delete_default | なし | azooKeyが標準で用いている「文頭まで削除」のアクションです。 |
| smart_move_cursor | direction: str
targets: [str] | directionに`"forward"`または`"backward"`を指定します。targetsに指定した文字のいずれかがカーソル進行方向に現れるまでカーソルの移動を繰り返します。例えば文頭方向の文字列が`"Yes, it is"`であり、`"direction": "backward", "target": [","]`であった場合、この操作の実行後にカーソルが`"Yes,| it is"`まで移動します。 |
diff --git a/python/howToMake.md b/python/howToMake.md
index fcb299f..d250411 100644
--- a/python/howToMake.md
+++ b/python/howToMake.md
@@ -86,6 +86,7 @@ azooKeyでは`InputAction`の他にいくつかの動作を行うことができ
| CompleteAction | なし | 変換を確定します |
| ReplaceLastCharactersAction | table: {str: str} | カーソル文頭方向の文字列を引数のtableに基づいて置換します。例えばカーソル文頭方向の文字列が`"abcdef"`であり、テーブルに`"def":":="`が指定されている場合は`"abc:="`と置換されます。 |
| ReplaceDefaultAction | なし | azooKeyが標準で用いている「濁点・半濁点・小書き・大文字・小文字」の切り替えアクションです。 |
+| Transliterate | kana: str | 入力の仮名文字を全てhiragana/katakana/hankakukatakanaのいずれかで置き換えます。 |
| SmartDeleteAction | direction: ScanDirection
targets: list[str] | directionに`ScanDirection.forward`または`ScanDirection.backward`を指定します。targetsに指定した文字のいずれかがカーソル進行方向に現れるまで削除を繰り返します。例えば文頭方向の文字列が`"Yes, it is"`であり、`direction = ScanDirection.backward, target = [","]`であった場合、この操作の実行後に`" it is"`が削除されます。 |
| SmartDeleteDefaultAction | なし | azooKeyが標準で用いている「文頭まで削除」のアクションです。 |
| SmartMoveCursorAction | direction: ScanDirection
target: list[str] | directionに`ScanDirection.forward`または`ScanDirection.backward`を指定します。targetsに指定した文字のいずれかがカーソル進行方向に現れるまでカーソルの移動を繰り返します。例えば文頭方向の文字列が`"Yes, it is"`であり、`direction = ScanDirection.backward, target = [","]`であった場合、この操作の実行後にカーソルが`"Yes,| it is"`まで移動します。 |
diff --git a/python/source/actions.py b/python/source/actions.py
index dacf92f..de88cc2 100644
--- a/python/source/actions.py
+++ b/python/source/actions.py
@@ -69,6 +69,26 @@ class ReplaceDefaultAction(metaclass=ActionMeta):
type = "replace_default"
+@unique
+class KanaTransliteration(str, Enum):
+ katakana = "katakana"
+ hiragana = "hiragana"
+ hankakukatakana = "hankakukatakana"
+
+class TransliterateAction(metaclass=ActionMeta):
+ type = "transliterate"
+
+ def __init__(self, kana: KanaTransliteration):
+ """
+ 入力の文字種を変換するアクション
+ Parameters
+ ----------
+ kana: KanaTransliteration
+ カナ文字の変更先の文字種を指定する
+ """
+ self.kana = kana
+
+
@unique
class TabType(str, Enum):
system = "system"
diff --git a/python/test/test_actions.py b/python/test/test_actions.py
index b532168..2f427e5 100644
--- a/python/test/test_actions.py
+++ b/python/test/test_actions.py
@@ -32,6 +32,17 @@ def test_ReplaceLastCharactersAction(self):
}
self.assertEqual(expected_json, actual)
+ def test_TransliterateAction(self):
+ """test method for Transliterate
+ """
+ actual = to_json(TransliterateAction(
+ kana=KanaTransliteration.hiragana))
+ expected_json = {
+ "type": "transliterate",
+ "kana": "hiragana"
+ }
+ self.assertEqual(expected_json, actual)
+
def test_MoveTabAction(self):
"""test method for MoveTabAction
"""
diff --git a/swift/howToMake.md b/swift/howToMake.md
index bdbe6c7..695350b 100644
--- a/swift/howToMake.md
+++ b/swift/howToMake.md
@@ -78,6 +78,7 @@ azooKeyでは`input`の他にいくつかの動作を行うことができます
| .complete | なし | 変換を確定します |
| .replaceLastCharacters | [String: String] | カーソル文頭方向の文字列を引数に基づいて置換します。例えばカーソル文頭方向の文字列が`"abcdef"`であり、テーブルに`"def":":="`が指定されている場合は`"abc:="`と置換されます。 |
| .replaceDefault | なし | azooKeyが標準で用いている「濁点・半濁点・小書き・大文字・小文字」の切り替えアクションです。 |
+| .transliterate | TransliterationKeyValue | 入力の仮名文字を全てhiragana/katakana/hankakukatakanaのいずれかで置き換えます。 |
| .smartDelete | ScanItem | 引数で指定した方向に、指定した文字を見つけるまで削除を繰り返します。例えば文頭方向の文字列が`"Yes, it is"`であり、方向が`.backward`かつ文字の指定が` [","]`であった場合、この操作の実行後に`" it is"`が削除されます。 |
| .smartDeleteDefault | なし | azooKeyが標準で用いている「文頭まで削除」のアクションです。 |
| .smartMoveCursor | ScanItem | 引数で指定した方向に、指定した文字を見つけるまで移動を繰り返します。例えば文頭方向の文字列が`"Yes, it is"`であり、方向が`.backward`かつ文字の指定が` [","]`であった場合、この操作の実行後に`"Yes,| it is"`まで移動します。 |
diff --git a/swift/sources/CustardKit.swift b/swift/sources/CustardKit.swift
index 837ff69..d7157f2 100644
--- a/swift/sources/CustardKit.swift
+++ b/swift/sources/CustardKit.swift
@@ -1029,6 +1029,15 @@ public extension CandidateSelection {
}
}
+public struct TransliterationKeyValues: Codable, Equatable, Hashable, Sendable {
+ public enum KanaTrasnliteration: String, Codable, Equatable, Hashable, Sendable {
+ case katakana
+ case hiragana
+ case hankakukatakana
+ }
+ public var kana: KanaTrasnliteration
+}
+
/// - アクション
/// - actions done in key pressing
public enum CodableActionData: Codable, Hashable, Sendable {
@@ -1045,6 +1054,9 @@ public enum CodableActionData: Codable, Hashable, Sendable {
/// - replace string at the trailing of cursor following to specified table
case replaceLastCharacters([String: String])
+ /// - transliterate input to others
+ case transliterate(TransliterationKeyValues)
+
/// - delete action specified count of characters
case delete(Int)
@@ -1102,6 +1114,7 @@ public extension CodableActionData {
case direction, targets
case scheme_type, target
case selection
+ case kana
}
private enum ValueType: String, Codable {
@@ -1109,6 +1122,7 @@ public extension CodableActionData {
case paste
case replace_default
case replace_last_characters
+ case transliterate
case delete
case smart_delete
case smart_delete_default
@@ -1139,6 +1153,7 @@ public extension CodableActionData {
case .moveTab: return .move_tab
case .replaceDefault: return .replace_default
case .replaceLastCharacters: return .replace_last_characters
+ case .transliterate: return .transliterate
case .smartDelete: return .smart_delete
case .smartDeleteDefault: return .smart_delete_default
case .smartMoveCursor: return .smart_move_cursor
@@ -1205,6 +1220,8 @@ public extension CodableActionData {
try container.encode(value.target, forKey: .target)
case let .selectCandidate(value):
try container.encode(value, forKey: .selection)
+ case let .transliterate(value):
+ try container.encode(value.kana, forKey: .kana)
case let .moveTab(value):
try CodableTabArgument(tab: value).containerEncode(container: &container)
case .dismissKeyboard, .enableResizingMode, .toggleTabBar, .toggleCursorBar, .toggleCapsLockState, .complete, .smartDeleteDefault, .replaceDefault, .paste: break
@@ -1223,6 +1240,9 @@ public extension CodableActionData {
case .replace_last_characters:
let value = try container.decode([String: String].self, forKey: .table)
self = .replaceLastCharacters(value)
+ case .transliterate:
+ let kana = try container.decode(TransliterationKeyValues.KanaTrasnliteration.self, forKey: .kana)
+ self = .transliterate(.init(kana: kana))
case .delete:
let value = try container.decode(Int.self, forKey: .count)
self = .delete(value)
diff --git a/swift/tests/CustardKitTests/DecodeCodableActionTest.swift b/swift/tests/CustardKitTests/DecodeCodableActionTest.swift
index 5aaf40b..afaf0e1 100644
--- a/swift/tests/CustardKitTests/DecodeCodableActionTest.swift
+++ b/swift/tests/CustardKitTests/DecodeCodableActionTest.swift
@@ -58,6 +58,29 @@ final class DecodeCodableActionTest: XCTestCase {
}
}
+ func testDecodeTransliterate() {
+ do {
+ let target = """
+ {
+ "type": "transliterate",
+ "kana": "katakana"
+ }
+ """
+ let decoded = CodableActionData.quickDecode(target: target)
+ XCTAssertEqual(decoded, .transliterate(.init(kana: .katakana)))
+ }
+ do {
+ let target = """
+ {
+ "type": "transliterate",
+ "kana": "hiragana"
+ }
+ """
+ let decoded = CodableActionData.quickDecode(target: target)
+ XCTAssertEqual(decoded, .transliterate(.init(kana: .hiragana)))
+ }
+ }
+
func testDecodeDelete() {
do {
let target = """
diff --git a/swift/tests/CustardKitTests/EncodeCodableActionTest.swift b/swift/tests/CustardKitTests/EncodeCodableActionTest.swift
index e10d50d..4eae0c1 100644
--- a/swift/tests/CustardKitTests/EncodeCodableActionTest.swift
+++ b/swift/tests/CustardKitTests/EncodeCodableActionTest.swift
@@ -21,6 +21,12 @@ final class EncodeCodableActionTest: XCTestCase {
XCTAssertEqual(target.quickEncodeDecode(), target)
}
+ func testEncodeTransliterate() {
+ XCTAssertEqual(CodableActionData.transliterate(.init(kana: .hankakukatakana)).quickEncodeDecode(), .transliterate(.init(kana: .hankakukatakana)))
+ XCTAssertEqual(CodableActionData.transliterate(.init(kana: .hiragana)).quickEncodeDecode(), .transliterate(.init(kana: .hiragana)))
+ XCTAssertEqual(CodableActionData.transliterate(.init(kana: .katakana)).quickEncodeDecode(), .transliterate(.init(kana: .katakana)))
+ }
+
func testEncodeDelete() {
XCTAssertEqual(CodableActionData.delete(9).quickEncodeDecode(), .delete(9))
XCTAssertEqual(CodableActionData.delete(-1).quickEncodeDecode(), .delete(-1))