Skip to content

Commit 6d20dde

Browse files
authored
Merge pull request #338 from keymanapp/fix/keyman-touch-layout-spec-default-prop
fix(common): add missing `default` property to keyman-touch-layout.clean.spec.json
2 parents d5e0243 + 8f2340f commit 6d20dde

3 files changed

Lines changed: 332 additions & 0 deletions

File tree

Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
{
2+
"$schema": "http://json-schema.org/schema#",
3+
"$ref": "#/definitions/touch-layout",
4+
"$comment": "Version: 16.0",
5+
"description": "A Keyman Touch Layout file, per version 16.0, clean spec, no legacy data or types",
6+
7+
"definitions": {
8+
"touch-layout": {
9+
"type": "object",
10+
"properties": {
11+
"tablet": { "$ref": "#/definitions/platform" },
12+
"phone": { "$ref": "#/definitions/platform" },
13+
"desktop": { "$ref": "#/definitions/platform" }
14+
},
15+
"minProperties": 1,
16+
"additionalProperties": false
17+
},
18+
19+
"platform": {
20+
"type": "object",
21+
"properties": {
22+
"font": { "$ref": "#/definitions/font-spec" },
23+
"fontsize": { "$ref": "#/definitions/fontsize-spec" },
24+
"layer": { "$ref": "#/definitions/layers" },
25+
"displayUnderlying": { "type": "boolean" },
26+
"defaultHint": { "type": "string", "enum": ["none","dot","longpress","multitap","flick","flick-n","flick-ne","flick-e","flick-se","flick-s","flick-sw","flick-w","flick-nw"] }
27+
},
28+
"required": ["layer"],
29+
"additionalProperties": false
30+
},
31+
32+
"layers": {
33+
"type": "array",
34+
"items": { "$ref": "#/definitions/layer" },
35+
"minItems": 1
36+
},
37+
38+
"layer": {
39+
"type": "object",
40+
"properties": {
41+
"id": { "$ref": "#/definitions/layer-id" },
42+
"row": { "$ref": "#/definitions/rows" }
43+
},
44+
"required": ["id", "row"],
45+
"additionalProperties": false
46+
},
47+
48+
"layer-id": {
49+
"type": "string",
50+
"pattern": "^[a-zA-Z0-9_-]+$"
51+
},
52+
53+
"rows": {
54+
"type": "array",
55+
"items": { "$ref": "#/definitions/row" },
56+
"minItems": 1
57+
},
58+
59+
"row": {
60+
"type": "object",
61+
"properties": {
62+
"id": { "$ref": "#/definitions/row-id" },
63+
"key": { "$ref": "#/definitions/keys" }
64+
},
65+
"required": ["id", "key"],
66+
"additionalProperties": false
67+
},
68+
69+
"row-id": {
70+
"type": "integer",
71+
"minimum": 0,
72+
"maximum": 100
73+
},
74+
75+
"keys": {
76+
"type": "array",
77+
"items": { "$ref": "#/definitions/key" },
78+
"minItems": 1
79+
},
80+
81+
"key": {
82+
"type": "object",
83+
"properties": {
84+
"id": { "$ref": "#/definitions/key-id" },
85+
"text": { "type": "string" },
86+
"layer": { "$ref": "#/definitions/layer-id" },
87+
"nextlayer": { "$ref": "#/definitions/layer-id" },
88+
"fontsize": { "$ref": "#/definitions/fontsize-spec" },
89+
"font": { "$ref": "#/definitions/font-spec" },
90+
"sp": { "$ref" : "#/definitions/key-sp" },
91+
"pad": { "$ref" : "#/definitions/key-pad" },
92+
"width": { "$ref" : "#/definitions/key-width" },
93+
"sk": { "$ref": "#/definitions/subkeys" },
94+
"flick": { "$ref": "#/definitions/flick" },
95+
"multitap": { "$ref": "#/definitions/subkeys" },
96+
"hint": { "type": "string" }
97+
},
98+
"anyOf": [
99+
{"required": ["id"]},
100+
{"required": ["sp"]},
101+
{"required": ["sk"]},
102+
{"required": ["flick"]},
103+
{"required": ["multitap"]}
104+
],
105+
"additionalProperties": false
106+
},
107+
108+
"key-id": {
109+
"type": "string",
110+
"pattern": "^[TKUtku]_[a-zA-Z0-9_]+$"
111+
},
112+
113+
"key-sp": {
114+
"type": "integer",
115+
"enum": [0, 1, 2, 8, 9, 10]
116+
},
117+
118+
"key-pad": {
119+
"type": "number",
120+
"minimum": 0,
121+
"maximum": 100000
122+
},
123+
124+
"key-width": {
125+
"type": "number",
126+
"minimum": 0,
127+
"maximum": 100000
128+
},
129+
130+
"subkeys": {
131+
"type": "array",
132+
"items": { "$ref": "#/definitions/subkey" },
133+
"minItems": 1
134+
},
135+
136+
"subkey": {
137+
"type": "object",
138+
"properties": {
139+
"id": { "$ref": "#/definitions/key-id" },
140+
"text": { "type": "string" },
141+
"layer": { "$ref": "#/definitions/layer-id" },
142+
"nextlayer": { "$ref": "#/definitions/layer-id" },
143+
"sp": { "$ref" : "#/definitions/key-sp" },
144+
"pad": { "$ref" : "#/definitions/key-pad" },
145+
"width": { "$ref" : "#/definitions/key-width" },
146+
"fontsize": { "$ref": "#/definitions/fontsize-spec" },
147+
"font": { "$ref": "#/definitions/font-spec" },
148+
"default": { "type": "boolean" }
149+
},
150+
"required": ["id"],
151+
"additionalProperties": false
152+
},
153+
154+
"flick": {
155+
"type": "object",
156+
"patternProperties": {
157+
"^(n|s|e|w|ne|nw|se|sw)$": { "$ref": "#/definitions/subkey" }
158+
},
159+
"minProperties": 1,
160+
"additionalProperties": false
161+
},
162+
163+
"font-spec": {
164+
"type": "string"
165+
},
166+
167+
"fontsize-spec": {
168+
"type": "string"
169+
}
170+
}
171+
}
Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
{
2+
"$schema": "http://json-schema.org/schema#",
3+
"$ref": "#/definitions/touch-layout",
4+
"$comment": "Version: 16.0",
5+
"description": "A Keyman Touch Layout file, per version 16.0, loose specification that allows for legacy such as numbers as strings",
6+
7+
"definitions": {
8+
"touch-layout": {
9+
"type": "object",
10+
"properties": {
11+
"tablet": { "$ref": "#/definitions/platform" },
12+
"phone": { "$ref": "#/definitions/platform" },
13+
"desktop": { "$ref": "#/definitions/platform" }
14+
}
15+
},
16+
17+
"platform": {
18+
"type": "object",
19+
"properties": {
20+
"font": { "$ref": "#/definitions/font-spec" },
21+
"fontsize": { "$ref": "#/definitions/fontsize-spec" },
22+
"layer": { "$ref": "#/definitions/layers" },
23+
"displayUnderlying": { "type": "boolean" },
24+
"defaultHint": { "type": "string", "enum": ["none","dot","longpress","multitap","flick","flick-n","flick-ne","flick-e","flick-se","flick-s","flick-sw","flick-w","flick-nw"] }
25+
},
26+
"required": ["layer"],
27+
"additionalProperties": false
28+
},
29+
30+
"layers": {
31+
"type": "array",
32+
"items": { "$ref": "#/definitions/layer" }
33+
},
34+
35+
"layer": {
36+
"type": "object",
37+
"properties": {
38+
"id": { "$ref": "#/definitions/layer-id" },
39+
"row": { "$ref": "#/definitions/rows" }
40+
},
41+
"required": ["id", "row"],
42+
"additionalProperties": false
43+
},
44+
45+
"layer-id": {
46+
"type": "string",
47+
"pattern": "^[\\S]+$"
48+
},
49+
50+
"rows": {
51+
"type": "array",
52+
"items": { "$ref": "#/definitions/row" }
53+
},
54+
55+
"row": {
56+
"type": "object",
57+
"properties": {
58+
"id": { "$ref": "#/definitions/row-id" },
59+
"key": { "$ref": "#/definitions/keys" }
60+
},
61+
"required": ["id", "key"],
62+
"additionalProperties": false
63+
},
64+
65+
"row-id": {
66+
"oneOf": [
67+
{
68+
"type": "integer",
69+
"minimum": 0,
70+
"maximum": 100
71+
},
72+
{
73+
"type": "string",
74+
"pattern": "^[0-9]+$"
75+
}
76+
]
77+
},
78+
79+
"keys": {
80+
"type": "array",
81+
"items": { "$ref": "#/definitions/key" }
82+
},
83+
84+
"key": {
85+
"type": "object",
86+
"properties": {
87+
"id": { "$ref": "#/definitions/key-id" },
88+
"text": { "type": "string" },
89+
"layer": { "$ref": "#/definitions/layer-id" },
90+
"nextlayer": { "$ref": "#/definitions/layer-id" },
91+
"fontsize": { "$ref": "#/definitions/fontsize-spec" },
92+
"font": { "$ref": "#/definitions/font-spec" },
93+
"dk": { "type": "string" },
94+
"sp": { "$ref" : "#/definitions/numeric" },
95+
"pad": { "$ref" : "#/definitions/numeric" },
96+
"width": { "$ref" : "#/definitions/numeric" },
97+
"sk": { "$ref": "#/definitions/subkeys" },
98+
"flick": { "$ref": "#/definitions/flick" },
99+
"multitap": { "$ref": "#/definitions/subkeys" },
100+
"hint": { "type": "string" }
101+
},
102+
"additionalProperties": false
103+
},
104+
105+
"numeric": {
106+
"oneOf": [
107+
{ "type": "string", "pattern": "^[0-9]+(\\.?[0-9]*)$|^$" },
108+
{ "type": "number" }
109+
]
110+
},
111+
112+
"key-id": {
113+
"type": "string",
114+
"pattern": "^[TKUtku]_[a-zA-Z0-9_]+$|^$"
115+
},
116+
117+
"subkeys": {
118+
"type": "array",
119+
"items": { "$ref": "#/definitions/subkey" }
120+
},
121+
122+
"subkey": {
123+
"type": "object",
124+
"properties": {
125+
"id": { "$ref": "#/definitions/key-id" },
126+
"text": { "type": "string" },
127+
"layer": { "$ref": "#/definitions/layer-id" },
128+
"nextlayer": { "$ref": "#/definitions/layer-id" },
129+
"sp": { "$ref" : "#/definitions/numeric" },
130+
"pad": { "$ref" : "#/definitions/numeric" },
131+
"width": { "$ref" : "#/definitions/numeric" },
132+
"fontsize": { "$ref": "#/definitions/fontsize-spec" },
133+
"font": { "$ref": "#/definitions/font-spec" },
134+
"dk": { "type": "string" },
135+
"default": { "type": "boolean" }
136+
},
137+
"required": ["id"],
138+
"additionalProperties": false
139+
},
140+
141+
"flick": {
142+
"type": "object",
143+
"patternProperties": {
144+
"^(n|s|e|w|ne|nw|se|sw)$": { "$ref": "#/definitions/subkey" }
145+
},
146+
"additionalProperties": false
147+
},
148+
149+
"font-spec": {
150+
"type": "string"
151+
},
152+
153+
"fontsize-spec": {
154+
"type": "string"
155+
}
156+
}
157+
}

schemas/keyman-touch-layout/README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -457,6 +457,10 @@ string") into the appropriate spec format.
457457

458458
# .keyman-touch-layout version history
459459

460+
## 2026-03-26 2.1.2 stable
461+
* Add missing 'default' property for longpress (sk) keys to clean spec. No other
462+
changes.
463+
460464
## 2024-02-23 2.1.1 stable
461465
* Loosen `layer.id` requirements to any non-whitespace characters, recommend
462466
only alphanumeric, -, _. clean spec enforces this recommendation.

0 commit comments

Comments
 (0)