Skip to content

Commit

Permalink
Feature/ios deadkeys (#21)
Browse files Browse the repository at this point in the history
* cargo fix

* Fix more warnings

* Write deadkeys to KeyboardDefinitions.json

* Write transforms to KeyboardDefinitions.json on iOS

This makes deadkeys work

* Don't init vars unless used

* Add support for capslock deadkeys

* Revert "Fix more warnings"

This reverts commit 4c868bb.

* Revert "cargo fix"

This reverts commit 8f03e15.

* Clean comment

* Revert "Don't init vars unless used"

This reverts commit 705e99b.

* Rename var
  • Loading branch information
dylanhand authored Mar 14, 2024
1 parent fedf717 commit bfe0a53
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 11 deletions.
61 changes: 51 additions & 10 deletions src/build/ios/generate_ios.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@ use serde_json;
use crate::{
build::BuildStep,
bundle::{
layout::{ios::IOsKbdLayer, IOsPlatform},
layout::{ios::IOsKbdLayer, IOsPlatform, Transform},
KbdgenBundle,
},
util::split_keys,
util::{split_keys, TRANSFORM_ESCAPE},
};

const REPOSITORY: &str = "repo";
Expand Down Expand Up @@ -88,11 +88,11 @@ pub struct IosPlatform {

#[derive(Serialize, Deserialize)]
pub struct IosDeadKeys {
iphone: IndexMap<String, String>,
iphone: IndexMap<IOsKbdLayer, Vec<String>>,
#[serde(rename = "ipad-9in")]
i_pad_9in: IndexMap<String, String>,
i_pad_9in: IndexMap<IOsKbdLayer, Vec<String>>,
#[serde(rename = "ipad-12in")]
i_pad_12in: IndexMap<String, String>,
i_pad_12in: IndexMap<IOsKbdLayer, Vec<String>>,
}

#[derive(Serialize, Deserialize)]
Expand All @@ -103,7 +103,7 @@ pub struct IosKeyboardDefinitions {
longpress: IndexMap<String, Vec<String>>,
#[serde(rename = "deadKeys")]
dead_keys: IosDeadKeys,
transforms: serde_json::value::Value,
transforms: IndexMap<String, IndexMap<String, String>>,
iphone: IosPlatform,
#[serde(rename = "ipad-9in")]
i_pad_9in: IosPlatform,
Expand All @@ -115,6 +115,7 @@ pub fn ios_layer_name(layer: &IOsKbdLayer) -> String {
match layer {
IOsKbdLayer::Default => "normal",
IOsKbdLayer::Shift => "shifted",
IOsKbdLayer::Caps => "caps",
IOsKbdLayer::Alt => "alt",
IOsKbdLayer::AltAndShift => "alt+shift",
IOsKbdLayer::Symbols1 => "symbols-1",
Expand Down Expand Up @@ -150,6 +151,38 @@ pub fn generate_platform(platform: &IOsPlatform) -> IndexMap<String, Vec<Vec<Ios
layers
}

fn process_transforms(transforms: &IndexMap<String, Transform>) -> IndexMap<String, IndexMap<String, String>> {
let mut output_map: IndexMap<String, IndexMap<String, String>> = IndexMap::new();

for (dead_key, transform) in transforms {
let mut transforms_by_char: IndexMap<String, String> = IndexMap::new();
match transform {
Transform::End(character) => {
tracing::error!("Transform ended too soon for dead key {} - character {}", dead_key, character);
}
Transform::More(transforms) => {
for (next_char, transform) in transforms {
if next_char == TRANSFORM_ESCAPE {
transforms_by_char.insert(next_char.clone(), dead_key.clone());
}
match transform {
Transform::End(end_char) => {
transforms_by_char.insert(next_char.clone(), end_char.clone());
}
Transform::More(_transform) => {
todo!("Recursion required ahead");
}
}
}
}
}

output_map.insert(dead_key.clone(), transforms_by_char);
}

output_map
}

pub struct GenerateIos;

#[async_trait(?Send)]
Expand All @@ -167,6 +200,8 @@ impl BuildStep for GenerateIos {
let mut iphone_layers: IndexMap<String, Vec<Vec<IosKeyMapType>>> = IndexMap::new();
let mut i_pad_9in_layers: IndexMap<String, Vec<Vec<IosKeyMapType>>> = IndexMap::new();
let mut i_pad_12in_layers: IndexMap<String, Vec<Vec<IosKeyMapType>>> = IndexMap::new();
let mut dead_keys: IndexMap<IOsKbdLayer, Vec<String>> = IndexMap::new();
let mut transforms: IndexMap<String, Transform> = IndexMap::new();

if let Some(ios_target) = &layout.i_os {
tracing::debug!("Generating json for {}", &language_tag);
Expand All @@ -186,6 +221,12 @@ impl BuildStep for GenerateIos {
if let Some(i_pad_12in_platform) = &ios_target.i_pad_12in {
i_pad_12in_layers.extend(generate_platform(&i_pad_12in_platform));
}
if let Some(found_deadkeys) = &ios_target.dead_keys {
dead_keys = found_deadkeys.clone();
}
if let Some(found_transforms) = &layout.transforms {
transforms = found_transforms.clone();
}

if let Some(key_names) = &layout.key_names {
all_layouts.push(IosKeyboardDefinitions {
Expand All @@ -197,11 +238,11 @@ impl BuildStep for GenerateIos {
},
longpress: longpress,
dead_keys: IosDeadKeys {
iphone: IndexMap::new(),
i_pad_9in: IndexMap::new(),
i_pad_12in: IndexMap::new(),
iphone: dead_keys.clone(),
i_pad_9in: dead_keys.clone(),
i_pad_12in: dead_keys.clone(),
},
transforms: serde_json::value::Value::Null,
transforms: process_transforms(&transforms),
iphone: IosPlatform {
layer: iphone_layers,
},
Expand Down
1 change: 1 addition & 0 deletions src/bundle/layout/ios.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ use serde::{Deserialize, Serialize};
pub enum IOsKbdLayer {
Default,
Shift,
Caps,
Alt,
#[serde(rename = "alt+shift")]
AltAndShift,
Expand Down
4 changes: 3 additions & 1 deletion src/bundle/layout/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ pub mod ios;
pub mod macos;
pub mod windows;

#[derive(Debug, Serialize, Deserialize)]
#[derive(Debug, Serialize, Deserialize, Clone)]
pub enum Transform {
End(String),
More(IndexMap<String, Transform>),
Expand Down Expand Up @@ -112,6 +112,8 @@ pub struct IOsTarget {
pub i_pad_9in: Option<IOsPlatform>,
#[serde(rename = "iPad-12in")]
pub i_pad_12in: Option<IOsPlatform>,
#[serde(rename = "deadKeys")]
pub dead_keys: Option<IndexMap<IOsKbdLayer, Vec<String>>>,
}

#[derive(Debug, Serialize, Deserialize)]
Expand Down

0 comments on commit bfe0a53

Please sign in to comment.