1<!-- 2Copyright © 1991-2024 Unicode, Inc. 3For terms of use, see http://www.unicode.org/copyright.html 4SPDX-License-Identifier: Unicode-3.0 5CLDR data files are interpreted according to the LDML specification (http://unicode.org/reports/tr35/) 6--> 7<!-- Note: This DTD is not compatible with prior versions of the keyboard data. 8 See ldmlKeyboard.dtd and CLDR v43 and prior. --> 9 10<!ELEMENT keyboard3 ( import*, locales?, version?, info, settings?, displays?, keys?, flicks?, forms?, layers*, variables?, transforms*, special* ) > 11<!ATTLIST keyboard3 locale CDATA #REQUIRED > 12 <!--@MATCH:validity/bcp47-wellformed--> 13<!ATTLIST keyboard3 conformsTo (45 | 46) #REQUIRED > 14 <!--@MATCH:version--> 15 <!--@METADATA--> 16<!ATTLIST keyboard3 xmlns CDATA #IMPLIED > 17 <!--@MATCH:any--> 18 <!--@METADATA--> 19 20<!ELEMENT import EMPTY > 21<!ATTLIST import path CDATA #REQUIRED > 22 <!--@MATCH:any--> 23<!ATTLIST import base (cldr) #IMPLIED > 24 25<!ELEMENT locales ( locale* ) > 26 27<!ELEMENT locale EMPTY > 28<!ATTLIST locale id CDATA #REQUIRED > 29 <!--@MATCH:validity/bcp47-wellformed--> 30 31<!ELEMENT version EMPTY > 32<!ATTLIST version number CDATA #IMPLIED > 33 <!--@MATCH:semver--> 34 <!--@VALUE--> 35<!ATTLIST version cldrVersion CDATA #FIXED "46" > 36 <!--@MATCH:version--> 37 <!--@METADATA--> 38 39<!ELEMENT info EMPTY > 40<!ATTLIST info name CDATA #REQUIRED > 41 <!--@MATCH:any--> 42 <!--@VALUE--> 43<!ATTLIST info author CDATA #IMPLIED > 44 <!--@MATCH:any--> 45 <!--@VALUE--> 46<!ATTLIST info layout CDATA #IMPLIED > 47 <!--@MATCH:any--> 48 <!--@VALUE--> 49<!ATTLIST info indicator CDATA #IMPLIED > 50 <!--@MATCH:any--> 51 <!--@VALUE--> 52 53<!ELEMENT settings EMPTY > 54 <!--@ORDERED--> 55<!ATTLIST settings normalization (disabled) #IMPLIED > 56 <!--@VALUE--> 57 58<!ELEMENT displays ( import*, display*, displayOptions*, special* ) > 59 60<!ELEMENT display EMPTY > 61<!ATTLIST display keyId NMTOKEN #IMPLIED > 62 <!--@MATCH:any--> 63<!ATTLIST display output CDATA #IMPLIED > 64 <!--@MATCH:any--> 65 <!--@ALLOWS_UESC--> 66<!ATTLIST display display CDATA #REQUIRED > 67 <!--@MATCH:any--> 68 <!--@VALUE--> 69 <!--@ALLOWS_UESC--> 70 71<!ELEMENT displayOptions EMPTY > 72<!ATTLIST displayOptions baseCharacter CDATA #IMPLIED > 73 <!--@MATCH:any--> 74 <!--@VALUE--> 75 <!--@ALLOWS_UESC--> 76 77<!ELEMENT special ANY > 78 79<!ELEMENT keys ( import*, key*, special* ) > 80 81<!ELEMENT key EMPTY > 82<!ATTLIST key id NMTOKEN #REQUIRED > 83 <!--@MATCH:any--> 84<!ATTLIST key flickId NMTOKEN #IMPLIED > 85 <!--@MATCH:any--> 86<!ATTLIST key gap (true) #IMPLIED > 87 <!--@VALUE--> 88<!ATTLIST key output CDATA #IMPLIED > 89 <!--@MATCH:any--> 90 <!--@VALUE--> 91 <!--@ALLOWS_UESC--> 92<!ATTLIST key longPressKeyIds NMTOKENS #IMPLIED > 93 <!--@MATCH:any--> 94 <!--@VALUE--> 95<!ATTLIST key longPressDefaultKeyId NMTOKEN #IMPLIED > 96 <!--@MATCH:any--> 97 <!--@VALUE--> 98<!ATTLIST key multiTapKeyIds NMTOKENS #IMPLIED > 99 <!--@MATCH:any--> 100 <!--@VALUE--> 101<!ATTLIST key stretch (true) #IMPLIED > 102 <!--@VALUE--> 103<!ATTLIST key layerId NMTOKEN #IMPLIED > 104 <!--@MATCH:any--> 105 <!--@VALUE--> 106<!ATTLIST key width CDATA #IMPLIED > 107 <!--@MATCH:range/0.01~100.0--> 108 <!--@VALUE--> 109 110<!ELEMENT flicks ( import*, flick*, special* ) > 111 112<!ELEMENT flick ( flickSegment+, special* ) > 113<!ATTLIST flick id NMTOKEN #REQUIRED > 114 <!--@MATCH:any--> 115 116<!ELEMENT flickSegment EMPTY > 117<!ATTLIST flickSegment directions NMTOKENS #REQUIRED > 118 <!--@MATCH:regex/(n|e|s|w|ne|nw|se|sw)([ ]+(n|e|s|w|ne|nw|se|sw))*--> 119<!ATTLIST flickSegment keyId NMTOKEN #REQUIRED > 120 <!--@MATCH:any--> 121 <!--@VALUE--> 122 123<!ELEMENT forms ( import*, form*, special* ) > 124 125<!ELEMENT form ( scanCodes+, special* ) > 126<!ATTLIST form id NMTOKEN #IMPLIED > 127 <!--@MATCH:regex/[A-Za-z0-9][A-Za-z0-9_-]*--> 128 129<!ELEMENT scanCodes EMPTY > 130<!ATTLIST scanCodes codes NMTOKENS #REQUIRED > 131 <!--@MATCH:regex/[0-9a-fA-F]{2}( [0-9a-fA-F]{2})*--> 132 <!--@VALUE--> 133 134<!ELEMENT layers ( import*, layer*, special* ) > 135<!ATTLIST layers formId NMTOKEN #REQUIRED > 136 <!--@MATCH:regex/[A-Za-z0-9][A-Za-z0-9_-]*--> 137<!ATTLIST layers minDeviceWidth CDATA #IMPLIED > 138 <!--@MATCH:range/1~999--> 139 140<!ELEMENT layer ( row+, special* ) > 141<!ATTLIST layer id NMTOKEN #IMPLIED > 142 <!--@MATCH:regex/[A-Za-z0-9][A-Za-z0-9_-]*--> 143<!ATTLIST layer modifiers NMTOKENS #IMPLIED > 144 <!--@MATCH:regex/(none|([A-Za-z0-9]+)( [A-Za-z0-9]+)*)--> 145 146<!ELEMENT row EMPTY > 147 <!--@ORDERED--> 148<!ATTLIST row keys NMTOKENS #REQUIRED > 149 <!--@MATCH:any--> 150 <!--@VALUE--> 151 152<!ELEMENT variables ( import*, string*, set*, uset*, special* ) > 153 154<!ELEMENT string EMPTY > 155<!ATTLIST string id NMTOKEN #REQUIRED > 156 <!--@MATCH:regex/[0-9A-Za-z_]{1,32}--> 157<!ATTLIST string value CDATA #REQUIRED > 158 <!--@MATCH:any--> 159 <!--@VALUE--> 160 <!--@ALLOWS_UESC--> 161 162<!ELEMENT set EMPTY > 163<!ATTLIST set id NMTOKEN #REQUIRED > 164 <!--@MATCH:regex/[0-9A-Za-z_]{1,32}--> 165<!ATTLIST set value CDATA #REQUIRED > 166 <!--@MATCH:any--> 167 <!--@VALUE--> 168 <!--@ALLOWS_UESC--> 169 170<!ELEMENT uset EMPTY > 171<!ATTLIST uset id NMTOKEN #REQUIRED > 172 <!--@MATCH:regex/[0-9A-Za-z_]{1,32}--> 173<!ATTLIST uset value CDATA #REQUIRED > 174 <!--@MATCH:any--> 175 <!--@VALUE--> 176 177<!ELEMENT transforms ( import*, transformGroup*, special* ) > 178<!ATTLIST transforms type (simple | backspace) #REQUIRED > 179 <!--@MATCH:literal/simple, backspace--> 180 181<!ELEMENT transformGroup ( import*, ( transform* | reorder* ), special* ) > 182 183<!ELEMENT transform EMPTY > 184 <!--@ORDERED--> 185<!ATTLIST transform from CDATA #REQUIRED > 186 <!--@MATCH:any--> 187 <!--@VALUE--> 188 <!--@ALLOWS_UESC--> 189<!ATTLIST transform to CDATA #IMPLIED > 190 <!--@MATCH:any--> 191 <!--@VALUE--> 192 <!--@ALLOWS_UESC--> 193 194<!ELEMENT reorder EMPTY > 195 <!--@ORDERED--> 196<!ATTLIST reorder before CDATA #IMPLIED > 197 <!--@MATCH:any--> 198 <!--@VALUE--> 199 <!--@ALLOWS_UESC--> 200<!ATTLIST reorder from CDATA #REQUIRED > 201 <!--@MATCH:any--> 202 <!--@VALUE--> 203 <!--@ALLOWS_UESC--> 204<!ATTLIST reorder order CDATA #IMPLIED > 205 <!--@MATCH:any--> 206 <!--@VALUE--> 207<!ATTLIST reorder tertiary CDATA #IMPLIED > 208 <!--@MATCH:any--> 209 <!--@VALUE--> 210<!ATTLIST reorder tertiaryBase CDATA #IMPLIED > 211 <!--@MATCH:any--> 212 <!--@VALUE--> 213<!ATTLIST reorder preBase CDATA #IMPLIED > 214 <!--@MATCH:any--> 215 <!--@VALUE--> 216