Skip to content

Commit bb129b7

Browse files
committed
feat: alternative geometry zones
1 parent d73858f commit bb129b7

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+258
-119
lines changed

docs/translations_report.md

+67-48
Large diffs are not rendered by default.

packages/keybr-intl/lib/messages/ar.json

+1-1
Large diffs are not rendered by default.

packages/keybr-intl/lib/messages/bg.json

+1-1
Large diffs are not rendered by default.

packages/keybr-intl/lib/messages/ca.json

+1-1
Large diffs are not rendered by default.

packages/keybr-intl/lib/messages/cs.json

+1-1
Large diffs are not rendered by default.

packages/keybr-intl/lib/messages/da.json

+1-1
Large diffs are not rendered by default.

packages/keybr-intl/lib/messages/de.json

+1-1
Large diffs are not rendered by default.

packages/keybr-intl/lib/messages/el.json

+1-1
Large diffs are not rendered by default.

packages/keybr-intl/lib/messages/en.json

+1-1
Large diffs are not rendered by default.

packages/keybr-intl/lib/messages/eo.json

+1-1
Large diffs are not rendered by default.

packages/keybr-intl/lib/messages/es.json

+1-1
Large diffs are not rendered by default.

packages/keybr-intl/lib/messages/et.json

+1-1
Large diffs are not rendered by default.

packages/keybr-intl/lib/messages/fa.json

+1-1
Large diffs are not rendered by default.

packages/keybr-intl/lib/messages/fr.json

+1-1
Large diffs are not rendered by default.

packages/keybr-intl/lib/messages/he.json

+1-1
Large diffs are not rendered by default.

packages/keybr-intl/lib/messages/hr.json

+1-1
Large diffs are not rendered by default.

packages/keybr-intl/lib/messages/hu.json

+1-1
Large diffs are not rendered by default.

packages/keybr-intl/lib/messages/id.json

+1-1
Large diffs are not rendered by default.

packages/keybr-intl/lib/messages/it.json

+1-1
Large diffs are not rendered by default.

packages/keybr-intl/lib/messages/ja.json

+1-1
Large diffs are not rendered by default.

packages/keybr-intl/lib/messages/ko.json

+1-1
Large diffs are not rendered by default.

packages/keybr-intl/lib/messages/ne.json

+1-1
Large diffs are not rendered by default.

packages/keybr-intl/lib/messages/nl.json

+1-1
Large diffs are not rendered by default.

packages/keybr-intl/lib/messages/pl.json

+1-1
Large diffs are not rendered by default.

packages/keybr-intl/lib/messages/pt-br.json

+1-1
Large diffs are not rendered by default.

packages/keybr-intl/lib/messages/pt-pt.json

+1-1
Large diffs are not rendered by default.

packages/keybr-intl/lib/messages/ro.json

+1-1
Large diffs are not rendered by default.

packages/keybr-intl/lib/messages/ru.json

+1-1
Large diffs are not rendered by default.

packages/keybr-intl/lib/messages/sv.json

+1-1
Large diffs are not rendered by default.

packages/keybr-intl/lib/messages/th.json

+1-1
Large diffs are not rendered by default.

packages/keybr-intl/lib/messages/tr.json

+1-1
Large diffs are not rendered by default.

packages/keybr-intl/lib/messages/uk.json

+1-1
Large diffs are not rendered by default.

packages/keybr-intl/lib/messages/vi.json

+1-1
Large diffs are not rendered by default.

packages/keybr-intl/lib/messages/zh-hans.json

+1-1
Large diffs are not rendered by default.

packages/keybr-intl/lib/messages/zh-hant.json

+1-1
Large diffs are not rendered by default.

packages/keybr-intl/translations/en.json

+1
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@
9191
"keyboard.geometry.label": "Geometry:",
9292
"keyboard.language.label": "Language:",
9393
"keyboard.layout.label": "Layout:",
94+
"keyboard.zones.label": "Zones:",
9495
"layouts.stats.bottomRowKeys.description": "The percentage of keys typed on the Shift row, the less the better.",
9596
"layouts.stats.bottomRowKeys.name": "Keys on the bottom row:",
9697
"layouts.stats.homeRowKeys.description": "The percentage of keys typed without leaving the Caps Lock row, the more the better.",

packages/keybr-keyboard/lib/geometry.ts

+53-12
Original file line numberDiff line numberDiff line change
@@ -1,79 +1,119 @@
11
import { Enum, type EnumItem } from "@keybr/lang";
2+
import {
3+
STANDARD_MOD,
4+
SYMMETRIC_MOD,
5+
type ZoneModDict,
6+
} from "./geometry/mod.ts";
7+
8+
export class ZoneMod implements EnumItem {
9+
static readonly STANDARD = new ZoneMod(
10+
"standard", //
11+
"Standard",
12+
STANDARD_MOD,
13+
);
14+
static readonly SYMMETRIC = new ZoneMod(
15+
"symmetric",
16+
"Symmetric",
17+
SYMMETRIC_MOD,
18+
);
19+
20+
static readonly ALL = new Enum<ZoneMod>(
21+
ZoneMod.STANDARD, //
22+
ZoneMod.SYMMETRIC,
23+
);
24+
25+
static first(items: Iterable<ZoneMod>): ZoneMod {
26+
return items[Symbol.iterator]().next().value ?? ZoneMod.STANDARD;
27+
}
28+
29+
private constructor(
30+
readonly id: string,
31+
readonly name: string,
32+
readonly mod: ZoneModDict,
33+
) {}
34+
35+
toString() {
36+
return this.id;
37+
}
38+
39+
toJSON() {
40+
return this.id;
41+
}
42+
}
243

344
export class Geometry implements EnumItem {
445
static readonly ANSI_101 = new Geometry(
546
"ansi101", //
647
"ANSI 101",
748
"staggered",
49+
ZoneMod.ALL,
850
);
951
static readonly ANSI_101_FULL = new Geometry(
1052
"ansi101full", //
1153
"ANSI 101 (Full)",
1254
"staggered",
55+
ZoneMod.ALL,
1356
);
1457
static readonly ISO_102 = new Geometry(
1558
"iso102", //
1659
"ISO 102",
1760
"staggered",
61+
ZoneMod.ALL,
1862
);
1963
static readonly ISO_102_FULL = new Geometry(
2064
"iso102full", //
2165
"ISO 102 (Full)",
2266
"staggered",
23-
);
24-
static readonly ISO_102_SYMMETRIC = new Geometry(
25-
"iso102symmetric", //
26-
"ISO 102 (Symmetric)",
27-
"staggered",
28-
);
29-
static readonly ISO_102_FULL_SYMMETRIC = new Geometry(
30-
"iso102fullsymmetric", //
31-
"ISO 102 (Full, Symmetric)",
32-
"staggered",
67+
ZoneMod.ALL,
3368
);
3469
static readonly KOREAN_103 = new Geometry(
3570
"kr103", //
3671
"Korean 103",
3772
"staggered",
73+
ZoneMod.ALL,
3874
);
3975
static readonly KOREAN_103_FULL = new Geometry(
4076
"kr103full", //
4177
"Korean 103 (Full)",
4278
"staggered",
79+
ZoneMod.ALL,
4380
);
4481
static readonly BRAZILIAN_104 = new Geometry(
4582
"br104", //
4683
"Brazilian 104",
4784
"staggered",
85+
ZoneMod.ALL,
4886
);
4987
static readonly BRAZILIAN_104_FULL = new Geometry(
5088
"br104full", //
5189
"Brazilian 104 (Full)",
5290
"staggered",
91+
ZoneMod.ALL,
5392
);
5493
static readonly JAPANESE_106 = new Geometry(
5594
"jp106", //
5695
"Japanese 106",
5796
"staggered",
97+
ZoneMod.ALL,
5898
);
5999
static readonly JAPANESE_106_FULL = new Geometry(
60100
"jp106full", //
61101
"Japanese 106 (Full)",
62102
"staggered",
103+
ZoneMod.ALL,
63104
);
64105
static readonly MATRIX = new Geometry(
65106
"matrix", //
66107
"Matrix/Ergonomic",
67108
"matrix",
109+
new Enum(),
68110
);
69111

70112
static readonly ALL = new Enum<Geometry>(
71113
Geometry.ANSI_101,
72114
Geometry.ANSI_101_FULL,
73115
Geometry.ISO_102,
74116
Geometry.ISO_102_FULL,
75-
Geometry.ISO_102_SYMMETRIC,
76-
Geometry.ISO_102_FULL_SYMMETRIC,
77117
Geometry.KOREAN_103,
78118
Geometry.KOREAN_103_FULL,
79119
Geometry.BRAZILIAN_104,
@@ -91,6 +131,7 @@ export class Geometry implements EnumItem {
91131
readonly id: string,
92132
readonly name: string,
93133
readonly form: "staggered" | "matrix",
134+
readonly zones: Enum<ZoneMod>,
94135
) {}
95136

96137
toString() {

packages/keybr-keyboard/lib/layout.ts

-10
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@ export class Layout implements XEnumItem {
1616
Geometry.ANSI_101_FULL,
1717
Geometry.ISO_102,
1818
Geometry.ISO_102_FULL,
19-
Geometry.ISO_102_SYMMETRIC,
20-
Geometry.ISO_102_FULL_SYMMETRIC,
2119
Geometry.MATRIX,
2220
),
2321
);
@@ -33,8 +31,6 @@ export class Layout implements XEnumItem {
3331
Geometry.ANSI_101_FULL,
3432
Geometry.ISO_102,
3533
Geometry.ISO_102_FULL,
36-
Geometry.ISO_102_SYMMETRIC,
37-
Geometry.ISO_102_FULL_SYMMETRIC,
3834
Geometry.MATRIX,
3935
),
4036
);
@@ -50,8 +46,6 @@ export class Layout implements XEnumItem {
5046
Geometry.ANSI_101_FULL,
5147
Geometry.ISO_102,
5248
Geometry.ISO_102_FULL,
53-
Geometry.ISO_102_SYMMETRIC,
54-
Geometry.ISO_102_FULL_SYMMETRIC,
5549
Geometry.MATRIX,
5650
),
5751
);
@@ -147,8 +141,6 @@ export class Layout implements XEnumItem {
147141
Geometry.ANSI_101_FULL,
148142
Geometry.ISO_102,
149143
Geometry.ISO_102_FULL,
150-
Geometry.ISO_102_SYMMETRIC,
151-
Geometry.ISO_102_FULL_SYMMETRIC,
152144
Geometry.MATRIX,
153145
),
154146
);
@@ -162,8 +154,6 @@ export class Layout implements XEnumItem {
162154
/* geometries= */ new Enum(
163155
Geometry.ISO_102,
164156
Geometry.ISO_102_FULL,
165-
Geometry.ISO_102_SYMMETRIC,
166-
Geometry.ISO_102_FULL_SYMMETRIC,
167157
Geometry.ANSI_101,
168158
Geometry.ANSI_101_FULL,
169159
Geometry.MATRIX,

packages/keybr-keyboard/lib/load.ts

+7-6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Geometry } from "./geometry.ts";
1+
import { Geometry, ZoneMod } from "./geometry.ts";
22
import { ANSI_101 } from "./geometry/ansi_101.ts";
33
import { ANSI_101_FULL } from "./geometry/ansi_101_full.ts";
44
import { BRAZILIAN_104 } from "./geometry/brazilian_104.ts";
@@ -10,7 +10,6 @@ import { JAPANESE_106_FULL } from "./geometry/japanese_106_full.ts";
1010
import { KOREAN_103 } from "./geometry/korean_103.ts";
1111
import { KOREAN_103_FULL } from "./geometry/korean_103_full.ts";
1212
import { MATRIX } from "./geometry/matrix.ts";
13-
import { SYMMETRIC_MOD } from "./geometry/mod.ts";
1413
import { Keyboard } from "./keyboard.ts";
1514
import { Layout } from "./layout.ts";
1615
import { LAYOUT_AR_SA } from "./layout/ar_sa.ts";
@@ -81,7 +80,7 @@ import { LAYOUT_TH_TH_PAT } from "./layout/th_th_pat.ts";
8180
import { LAYOUT_TR_TR_F } from "./layout/tr_tr_f.ts";
8281
import { LAYOUT_TR_TR_Q } from "./layout/tr_tr_q.ts";
8382
import { LAYOUT_UK_UA } from "./layout/uk_ua.ts";
84-
import { remapZones } from "./mod.ts";
83+
import { nullMod, remapZones } from "./mod.ts";
8584
import { KeyboardOptions } from "./settings.ts";
8685
import { type CharacterDict, type GeometryDict } from "./types.ts";
8786

@@ -163,8 +162,6 @@ const geometries = new Map<Geometry, GeometryDict>([
163162
[Geometry.BRAZILIAN_104_FULL, BRAZILIAN_104_FULL],
164163
[Geometry.ISO_102, ISO_102],
165164
[Geometry.ISO_102_FULL, ISO_102_FULL],
166-
[Geometry.ISO_102_SYMMETRIC, remapZones(ISO_102, SYMMETRIC_MOD)],
167-
[Geometry.ISO_102_FULL_SYMMETRIC, remapZones(ISO_102_FULL, SYMMETRIC_MOD)],
168165
[Geometry.JAPANESE_106, JAPANESE_106],
169166
[Geometry.JAPANESE_106_FULL, JAPANESE_106_FULL],
170167
[Geometry.KOREAN_103, KOREAN_103],
@@ -179,7 +176,7 @@ export function loadKeyboard(...args: any[]): Keyboard {
179176
const { length } = args;
180177
let options: KeyboardOptions;
181178
if (length === 1 && (options = args[0]) instanceof KeyboardOptions) {
182-
return loadImpl(options.layout, options.geometry);
179+
return loadImpl(options.layout, options.geometry, options.zones);
183180
}
184181
let layout: Layout;
185182
if (length === 1 && (layout = args[0]) instanceof Layout) {
@@ -199,8 +196,12 @@ export function loadKeyboard(...args: any[]): Keyboard {
199196
function loadImpl(
200197
layout: Layout,
201198
geometry: Geometry = Geometry.first(layout.geometries),
199+
zones: ZoneMod = ZoneMod.first(geometry.zones),
202200
): Keyboard {
203201
let characterDict = layouts.get(layout)!;
204202
let geometryDict = geometries.get(geometry)!;
203+
if (layout.mod === nullMod && zones !== ZoneMod.STANDARD) {
204+
geometryDict = remapZones(geometryDict, zones.mod);
205+
}
205206
return new Keyboard(layout, geometry, characterDict, geometryDict);
206207
}

packages/keybr-keyboard/lib/settings.test.ts

+25-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Settings } from "@keybr/settings";
22
import test from "ava";
3-
import { Geometry } from "./geometry.ts";
3+
import { Geometry, ZoneMod } from "./geometry.ts";
44
import { Language } from "./language.ts";
55
import { Layout } from "./layout.ts";
66
import { KeyboardOptions, keyboardProps } from "./settings.ts";
@@ -11,6 +11,7 @@ test("defaults", (t) => {
1111
t.is(options.language, Language.EN);
1212
t.is(options.layout, Layout.EN_US);
1313
t.is(options.geometry, Geometry.ANSI_101);
14+
t.is(options.zones, ZoneMod.STANDARD);
1415
});
1516

1617
test("from user settings", (t) => {
@@ -20,30 +21,35 @@ test("from user settings", (t) => {
2021
t.is(options.language, Language.EN);
2122
t.is(options.layout, Layout.EN_US);
2223
t.is(options.geometry, Geometry.ANSI_101);
24+
t.is(options.zones, ZoneMod.STANDARD);
2325
}
2426

2527
{
2628
const options = KeyboardOptions.from(
2729
new Settings()
2830
.set(keyboardProps.layout, Layout.EN_US)
29-
.set(keyboardProps.geometry, Geometry.ISO_102),
31+
.set(keyboardProps.geometry, Geometry.ISO_102)
32+
.set(keyboardProps.zones, ZoneMod.STANDARD),
3033
);
3134

3235
t.is(options.language, Language.EN);
3336
t.is(options.layout, Layout.EN_US);
3437
t.is(options.geometry, Geometry.ISO_102);
38+
t.is(options.zones, ZoneMod.STANDARD);
3539
}
3640

3741
{
3842
const options = KeyboardOptions.from(
3943
new Settings()
4044
.set(keyboardProps.layout, Layout.EN_JP)
41-
.set(keyboardProps.geometry, Geometry.ANSI_101),
45+
.set(keyboardProps.geometry, Geometry.ANSI_101)
46+
.set(keyboardProps.zones, ZoneMod.SYMMETRIC),
4247
);
4348

4449
t.is(options.language, Language.EN);
4550
t.is(options.layout, Layout.EN_JP);
4651
t.is(options.geometry, Geometry.JAPANESE_106);
52+
t.is(options.zones, ZoneMod.SYMMETRIC);
4753
}
4854
});
4955

@@ -54,6 +60,7 @@ test("update properties", (t) => {
5460
t.is(options.language, Language.FR);
5561
t.is(options.layout, Layout.FR_FR);
5662
t.is(options.geometry, Geometry.ISO_102);
63+
t.is(options.zones, ZoneMod.STANDARD);
5764
}
5865

5966
{
@@ -64,6 +71,7 @@ test("update properties", (t) => {
6471
t.is(options.language, Language.FR);
6572
t.is(options.layout, Layout.FR_CA);
6673
t.is(options.geometry, Geometry.ISO_102);
74+
t.is(options.zones, ZoneMod.STANDARD);
6775
}
6876

6977
{
@@ -75,5 +83,19 @@ test("update properties", (t) => {
7583
t.is(options.language, Language.FR);
7684
t.is(options.layout, Layout.FR_CA);
7785
t.is(options.geometry, Geometry.ANSI_101);
86+
t.is(options.zones, ZoneMod.STANDARD);
87+
}
88+
89+
{
90+
const options = KeyboardOptions.default()
91+
.withLanguage(Language.FR)
92+
.withLayout(Layout.FR_CA)
93+
.withGeometry(Geometry.ANSI_101)
94+
.withZones(ZoneMod.SYMMETRIC);
95+
96+
t.is(options.language, Language.FR);
97+
t.is(options.layout, Layout.FR_CA);
98+
t.is(options.geometry, Geometry.ANSI_101);
99+
t.is(options.zones, ZoneMod.SYMMETRIC);
78100
}
79101
});

0 commit comments

Comments
 (0)