From 9e1d2619002c0b73281837bcb15c5aaf30d086c4 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Sat, 5 Jul 2025 09:51:32 -0500 Subject: [PATCH 01/15] =?UTF-8?q?feat:=20ldml-docs:=20more=20updates=20to?= =?UTF-8?q?=20overview=20=E2=9C=8D=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #13836 --- developer/ldml/guide/choosing-locale.md | 14 ++++ developer/ldml/guide/overview.md | 93 ++++++++++++++++++++++++- 2 files changed, 105 insertions(+), 2 deletions(-) create mode 100644 developer/ldml/guide/choosing-locale.md diff --git a/developer/ldml/guide/choosing-locale.md b/developer/ldml/guide/choosing-locale.md new file mode 100644 index 000000000..e7a4f0282 --- /dev/null +++ b/developer/ldml/guide/choosing-locale.md @@ -0,0 +1,14 @@ +--- +title: Choosing a locale +--- + +As part of your keyboard development, you must choose one or more [BCP 47] locale codes to +associate with the keyboard. + +The primary locale id is stored in the `locale` attribute of the [`keyboard3`][keyboard3] +(outer) element, while any additional locale ids are stored in the optional [`locales`][locales] +element. + +[BCP 47]: ../../current-version/reference/bcp-47 +[keyboard3]: ../reference/keyboard3 +[locales]: ../reference/locales diff --git a/developer/ldml/guide/overview.md b/developer/ldml/guide/overview.md index d4ad6f6d2..ab59504b4 100644 --- a/developer/ldml/guide/overview.md +++ b/developer/ldml/guide/overview.md @@ -2,6 +2,95 @@ title: LDML overview --- -The LDML format …. Source files have the **.xml** extension and are text files. +LDML is the Locale Data Markup Language. It it an XML-based format +specified as the Unicode Consortium’s specification [UTS#35 Part 7], +maintained by the [Common Locale Data Repository (CLDR)][CLDR] +Technical Commitee. -… +LDML itself has several parts which describe diferent aspects of locale data. This document describes the part pertaining to keyboards, part 7. + +## File Structure + +Source files have the **.xml** extension and are [XML] (text) files. Any +text editor can be used. An editor which understands XML and can highlight +syntax is preferred, such as that built into Keyman Developer. + +### Attributes and Escaping + +The LDML structure does not use any "element text", all text is in attributes. +Attributes are opened and closed with double quotes `"`. + +Many attributes support escaping. That is, if you need to use a double quote +within an attribute, the double quote must be escaped. +For example, for a string variable with the value `I said, "yes"` it could be accomplished as shown: + +```xml + +``` + +This notation is described in [Unicode UTS #18 section 1.1][UTS18escaping] and +consists of `\u{` followed by 1-6 hex digits and closed with `}`. +`\u{1E8CA}` and `\u{1e8CA}` and `\u{1e8Ca}` all refer to +U+1E8CA 𞣊 "MENDE KIKAKUI DIGIT FOUR". Upper and lower case does not matter. + +Escaping is not allowed everywhere. +A double quote is not valid as the id of a key, for example, so the ` + +``` + +You can use comments to temporarily remove an element from processing. +The following "key" element is commented out, and so is not a part of +the keyboard. + +```xml + +``` + +### XML Prologue + +As an XML file, the XML prologue is needed. +The prologue should be exactly as shown. +(A DTD not used.) + +```xml + +``` + +### Outer `keyboard3` Element + +The root element of a keyboard file is the [`keyboard3`][keyboard3] element. + +Note the `xmlns` and `conformsTo` elements both refer to a version of CLDR, +in this case v47. For compatibility, you should set these to the earliest possible +version number. + + +The `locale` attribute is the _primary_ [BCP 47] locale for the keyboard. +See [choosing a locale](choosing-locale) for more information about choosing +locale id(s) for your keyboard. + +```xml + + … + +``` + +[CLDR]: https://cldr.unicode.org +[UTS#35 Part 7]: https://www.unicode.org/reports/tr35/tr35-keyboards.html +[BCP 47]: ../../current-version/reference/bcp-47 +[keyboard3]: ../reference/keyboard3 +[UTS18escaping]: https://www.unicode.org/reports/tr18/#Hex_notation +[XML]: https://www.w3.org/XML/ From 836ecd0e3abc691209573b77d19334149fccabe4 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Sat, 5 Jul 2025 09:52:39 -0500 Subject: [PATCH 02/15] =?UTF-8?q?feat:=20ldml-docs:=20skeletal=20guide=20T?= =?UTF-8?q?oC=20=E2=9C=8D=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #13836 --- developer/ldml/guide/index.md | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/developer/ldml/guide/index.md b/developer/ldml/guide/index.md index 69cf0b463..e28c598ed 100644 --- a/developer/ldml/guide/index.md +++ b/developer/ldml/guide/index.md @@ -2,7 +2,22 @@ title: LDML Guide --- -## Language elements +## Getting Started * [LDML Language Overview](overview) * [Glossary](glossary) +* Planning your Keyboard + +## Jumping in + +* Repertoire +* Keybag +* Displays + +## Going further + +* Settings, Options +* Variables +* Transforms +* Markers +* Reorders From cb2453290b971f14aa0f342a3a93dd958aa9b633 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Sat, 5 Jul 2025 14:29:47 -0500 Subject: [PATCH 03/15] =?UTF-8?q?feat:=20ldml-docs:=20update=20guide=20ToC?= =?UTF-8?q?=20=E2=9C=8D=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - add planning section #13836 --- developer/ldml/guide/index.md | 4 ++-- developer/ldml/guide/planning.md | 33 ++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 developer/ldml/guide/planning.md diff --git a/developer/ldml/guide/index.md b/developer/ldml/guide/index.md index e28c598ed..ed3cc9591 100644 --- a/developer/ldml/guide/index.md +++ b/developer/ldml/guide/index.md @@ -6,13 +6,13 @@ title: LDML Guide * [LDML Language Overview](overview) * [Glossary](glossary) -* Planning your Keyboard +* [Planning](planning) your Keyboard ## Jumping in -* Repertoire * Keybag * Displays +* Layout ## Going further diff --git a/developer/ldml/guide/planning.md b/developer/ldml/guide/planning.md new file mode 100644 index 000000000..2118e5d1e --- /dev/null +++ b/developer/ldml/guide/planning.md @@ -0,0 +1,33 @@ +--- +title: Planning your Keyboard +--- + +Whether you are building an entirely novel keyboard from zero, or implmenting one that already exists in another environment, planning is important. +Make sure you have all of the important information at hand so that you can begin down this journey. + +## Questions + +To aid you in the planning, here are a series of questions that can be asked: + +### Identity + +- What are the languages that are served by this keyboard? +- What script or scripts will be involved in these languages? +- Which language, if any, can be considered the primary language? +- What is the name of the keyboard? + +### Form and Function + +- Will this be a hardware-only or touch-only keyboard? +(It is recommended to work on the hardware format first, as a +hardware keyboard can be used in touch but not vice versa.) +- What is the base physical type for hardware, such as US or ISO? +- Does the keyboard follow an existing organization of keys, such as QWERTY, AZERTY, QWERTZ etc? +- Which width(s) will you start with for the touch layout? +- What gestures will you make use of, such as long press, flicks, and multitap? + +### Repertoire + +- What are the "characters" that will be covered by this keyboard for this language? This may go beyond the usual Unicode definition of characters, on to characters as the users will perceive them. For example, your language might use `ch` as a single letter. +- Which characters are the most important to access? That is, those that would be right on the keyboard or on a shift layer, versus others that might be reached via a gesture or multiple key combination. + From f4d5704c9cd7e8537380bdea2f5ef31b86e23455 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Sat, 5 Jul 2025 17:00:03 -0500 Subject: [PATCH 04/15] =?UTF-8?q?feat:=20ldml-docs:=20update=20guide=20ToC?= =?UTF-8?q?=20=E2=9C=8D=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - add a few initial sections, mostly blank #13836 --- developer/ldml/guide/displays.md | 4 ++++ developer/ldml/guide/index.md | 14 +++++++------- developer/ldml/guide/keybag.md | 7 +++++++ developer/ldml/guide/layouts.md | 4 ++++ developer/ldml/guide/markers.md | 4 ++++ developer/ldml/guide/reorders.md | 4 ++++ developer/ldml/guide/transforms.md | 4 ++++ developer/ldml/guide/variables.md | 4 ++++ 8 files changed, 38 insertions(+), 7 deletions(-) create mode 100644 developer/ldml/guide/displays.md create mode 100644 developer/ldml/guide/keybag.md create mode 100644 developer/ldml/guide/layouts.md create mode 100644 developer/ldml/guide/markers.md create mode 100644 developer/ldml/guide/reorders.md create mode 100644 developer/ldml/guide/transforms.md create mode 100644 developer/ldml/guide/variables.md diff --git a/developer/ldml/guide/displays.md b/developer/ldml/guide/displays.md new file mode 100644 index 000000000..3373f7230 --- /dev/null +++ b/developer/ldml/guide/displays.md @@ -0,0 +1,4 @@ +--- +title: Customizing Keytop Displays +--- + diff --git a/developer/ldml/guide/index.md b/developer/ldml/guide/index.md index ed3cc9591..79b339ccd 100644 --- a/developer/ldml/guide/index.md +++ b/developer/ldml/guide/index.md @@ -10,14 +10,14 @@ title: LDML Guide ## Jumping in -* Keybag -* Displays -* Layout +* [Keybag](keybag) +* [Displays](displays) +* [Layouts](layouts) ## Going further * Settings, Options -* Variables -* Transforms -* Markers -* Reorders +* [Variables](variables) +* [Transforms](transforms) +* [Markers](markers) +* [Reorders](reorders) diff --git a/developer/ldml/guide/keybag.md b/developer/ldml/guide/keybag.md new file mode 100644 index 000000000..fac1b8968 --- /dev/null +++ b/developer/ldml/guide/keybag.md @@ -0,0 +1,7 @@ +--- +title: The Keybag +--- + +The first major part of authoring your keyboard consists in setting up the keybag. + +Think of the keybag as if it were a literal "bag of keys" from which you can bring out a key and place it into the right spot in your design. diff --git a/developer/ldml/guide/layouts.md b/developer/ldml/guide/layouts.md new file mode 100644 index 000000000..06ab7f804 --- /dev/null +++ b/developer/ldml/guide/layouts.md @@ -0,0 +1,4 @@ +--- +title: Defining Layouts +--- + diff --git a/developer/ldml/guide/markers.md b/developer/ldml/guide/markers.md new file mode 100644 index 000000000..7776c2074 --- /dev/null +++ b/developer/ldml/guide/markers.md @@ -0,0 +1,4 @@ +--- +title: Markers +--- + diff --git a/developer/ldml/guide/reorders.md b/developer/ldml/guide/reorders.md new file mode 100644 index 000000000..1a9a443fc --- /dev/null +++ b/developer/ldml/guide/reorders.md @@ -0,0 +1,4 @@ +--- +title: Reorders +--- + diff --git a/developer/ldml/guide/transforms.md b/developer/ldml/guide/transforms.md new file mode 100644 index 000000000..95253cdb9 --- /dev/null +++ b/developer/ldml/guide/transforms.md @@ -0,0 +1,4 @@ +--- +title: Transforms +--- + diff --git a/developer/ldml/guide/variables.md b/developer/ldml/guide/variables.md new file mode 100644 index 000000000..1895dc1ed --- /dev/null +++ b/developer/ldml/guide/variables.md @@ -0,0 +1,4 @@ +--- +title: Variables +--- + From 2fcda1111c9e2f8f38f4dc6da2af2ab635ab80f4 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Tue, 15 Jul 2025 12:29:59 -0500 Subject: [PATCH 05/15] =?UTF-8?q?feat:=20ldml-docs:=20update=20guide=20ToC?= =?UTF-8?q?=20=E2=9C=8D=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - updates across sections #13836 --- developer/ldml/guide/displays.md | 4 ++++ developer/ldml/guide/glossary.md | 1 + developer/ldml/guide/index.md | 12 ++++++++---- developer/ldml/guide/keybag.md | 14 +++++++++++++- developer/ldml/guide/overview.md | 4 ++++ developer/ldml/guide/planning.md | 1 + 6 files changed, 31 insertions(+), 5 deletions(-) diff --git a/developer/ldml/guide/displays.md b/developer/ldml/guide/displays.md index 3373f7230..da046e173 100644 --- a/developer/ldml/guide/displays.md +++ b/developer/ldml/guide/displays.md @@ -2,3 +2,7 @@ title: Customizing Keytop Displays --- +… + +With the key display customized, it's time now to arrange the keys into [layouts](./layouts). + diff --git a/developer/ldml/guide/glossary.md b/developer/ldml/guide/glossary.md index 88cadf3e0..b7bd4d9aa 100644 --- a/developer/ldml/guide/glossary.md +++ b/developer/ldml/guide/glossary.md @@ -16,3 +16,4 @@ There are many possible subtags, but only three types are currently used in most More information about BCP 47 language tag and full details on [how they are used in Keyman Developer](../../current-version/reference/bcp-47). +Now, go on to begin [planning](./planning) your LDML keyboard. diff --git a/developer/ldml/guide/index.md b/developer/ldml/guide/index.md index 79b339ccd..73b3050e6 100644 --- a/developer/ldml/guide/index.md +++ b/developer/ldml/guide/index.md @@ -2,17 +2,21 @@ title: LDML Guide --- +This guide will take you through the concepts, planning process, and structure needed to successfully author an LDML Keyboard used with Keyman. + +Start with the [glossary](./glossary) and read these in order, or skip around as suits your interest. The [reference](../reference/) is useful for details of a particular XML Element. + ## Getting Started -* [LDML Language Overview](overview) * [Glossary](glossary) * [Planning](planning) your Keyboard ## Jumping in -* [Keybag](keybag) -* [Displays](displays) -* [Layouts](layouts) +* [Overview](overview) of the LDML format +* The [Keybag](keybag) +* Customizing key [Displays](displays) +* Defining [Layouts](layouts) ## Going further diff --git a/developer/ldml/guide/keybag.md b/developer/ldml/guide/keybag.md index fac1b8968..1a71841dd 100644 --- a/developer/ldml/guide/keybag.md +++ b/developer/ldml/guide/keybag.md @@ -4,4 +4,16 @@ title: The Keybag The first major part of authoring your keyboard consists in setting up the keybag. -Think of the keybag as if it were a literal "bag of keys" from which you can bring out a key and place it into the right spot in your design. +You can think of the keybag as if it were a literal "bag of keys" from which you can bring out a key and place it into the right spot in your layout. + +The keybag is not one-for-one with the [repertoire], due to the following reasons: + +- There may be text which is of the repertoire which are not typed by the user directly at all, but are accessed via transforms. For example, suppose `œ` were part of the repertoire, but accessed by the user by typing `o` + `e`. There might not be an `œ` key, though it is in the repertoire. + +- There may also be more than one key which produces the same output, but has a distinct identity as a key. For example, there might be a key producing `a` which is used on a hardware layer, but also another key also producing `a` on one of the touch layers which has gestures attached to it such as a long press yielding `à`, `á`, `â` etc. The two `a` keys have diferent identities (`id=` attribute) and differ in other properties. + +… + +Next, we will learn about customizing key [displays](./displays). + +[repertoire]: ./planning#repertoire diff --git a/developer/ldml/guide/overview.md b/developer/ldml/guide/overview.md index ab59504b4..6359222b0 100644 --- a/developer/ldml/guide/overview.md +++ b/developer/ldml/guide/overview.md @@ -73,6 +73,7 @@ The root element of a keyboard file is the [`keyboard3`][keyboard3] element. Note the `xmlns` and `conformsTo` elements both refer to a version of CLDR, in this case v47. For compatibility, you should set these to the earliest possible version number. + The `locale` attribute is the _primary_ [BCP 47] locale for the keyboard. @@ -88,9 +89,12 @@ locale id(s) for your keyboard. ``` +Now that you have the outer structure in place, it's time to fill the [keybag]. + [CLDR]: https://cldr.unicode.org [UTS#35 Part 7]: https://www.unicode.org/reports/tr35/tr35-keyboards.html [BCP 47]: ../../current-version/reference/bcp-47 [keyboard3]: ../reference/keyboard3 [UTS18escaping]: https://www.unicode.org/reports/tr18/#Hex_notation [XML]: https://www.w3.org/XML/ +[keybag]: ./keybag diff --git a/developer/ldml/guide/planning.md b/developer/ldml/guide/planning.md index 2118e5d1e..39b8a3677 100644 --- a/developer/ldml/guide/planning.md +++ b/developer/ldml/guide/planning.md @@ -31,3 +31,4 @@ hardware keyboard can be used in touch but not vice versa.) - What are the "characters" that will be covered by this keyboard for this language? This may go beyond the usual Unicode definition of characters, on to characters as the users will perceive them. For example, your language might use `ch` as a single letter. - Which characters are the most important to access? That is, those that would be right on the keyboard or on a shift layer, versus others that might be reached via a gesture or multiple key combination. +Next, let's take a look at an [overview](./overview) of the LDML format. From af14e3afd253eb3a4bd30545e35ca774a1879c19 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Wed, 16 Jul 2025 17:12:53 -0500 Subject: [PATCH 06/15] =?UTF-8?q?feat:=20ldml-docs:=20update=20guide=20ToC?= =?UTF-8?q?=20=E2=9C=8D=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - updated displays and keybag #13836 --- developer/ldml/guide/displays.md | 3 +-- developer/ldml/guide/keybag.md | 32 ++++++++++++++++++++++++++++++-- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/developer/ldml/guide/displays.md b/developer/ldml/guide/displays.md index da046e173..796ac7895 100644 --- a/developer/ldml/guide/displays.md +++ b/developer/ldml/guide/displays.md @@ -2,7 +2,6 @@ title: Customizing Keytop Displays --- -… +Nor With the key display customized, it's time now to arrange the keys into [layouts](./layouts). - diff --git a/developer/ldml/guide/keybag.md b/developer/ldml/guide/keybag.md index 1a71841dd..667bf648d 100644 --- a/developer/ldml/guide/keybag.md +++ b/developer/ldml/guide/keybag.md @@ -4,6 +4,8 @@ title: The Keybag The first major part of authoring your keyboard consists in setting up the keybag. +## What's in the Keybag? + You can think of the keybag as if it were a literal "bag of keys" from which you can bring out a key and place it into the right spot in your layout. The keybag is not one-for-one with the [repertoire], due to the following reasons: @@ -12,8 +14,34 @@ The keybag is not one-for-one with the [repertoire], due to the following reason - There may also be more than one key which produces the same output, but has a distinct identity as a key. For example, there might be a key producing `a` which is used on a hardware layer, but also another key also producing `a` on one of the touch layers which has gestures attached to it such as a long press yielding `à`, `á`, `â` etc. The two `a` keys have diferent identities (`id=` attribute) and differ in other properties. -… +- Rarer, but it may be possible that a key producing the same output intentionally has a different keycap display in two different contexts. Keys are identified by a unique identifier, so unique keys can have unique key [displays]. + +## Defining keys in the Keybag + +Keys are defined by the [key] element within the [keys] element, as seen in a simple example: + +```xml + + + + + + + +``` + +Note that the identifier doesn't have to be plain ASCII. + +In the following sections we will discuss more advanced uses of keys. + +## Gap + +## Marker key + +## Key width + -Next, we will learn about customizing key [displays](./displays). +Next, we will learn about customizing key [displays]. [repertoire]: ./planning#repertoire +[displays]: ./displays From 0fc5a1e51d7a4d089ab6d7af83e8821a899e0b2c Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Thu, 17 Jul 2025 18:08:27 -0500 Subject: [PATCH 07/15] =?UTF-8?q?feat:=20ldml-docs:=20update=20guide=20ToC?= =?UTF-8?q?=20=E2=9C=8D=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - updated displays, keybag, layouts #13836 --- developer/ldml/guide/displays.md | 24 +++++++++++++++++++++++- developer/ldml/guide/keybag.md | 4 ++-- developer/ldml/guide/layouts.md | 1 + 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/developer/ldml/guide/displays.md b/developer/ldml/guide/displays.md index 796ac7895..b22db1425 100644 --- a/developer/ldml/guide/displays.md +++ b/developer/ldml/guide/displays.md @@ -2,6 +2,28 @@ title: Customizing Keytop Displays --- -Nor +## Why customize the display + +Normally, the display of a keytop, whether in a touch enironment or the on-screen display of a hardware keyboard, simply matches the characrer output. So, a key that outputs `a` will have a keytop that looks like `a`. + +However, there are some situations where it is desireable to customize the display of a key. This is where the [display] element is useful. This is an optional element. + +Some situations where you might want to customize the display are as follows. This isn't an exhaustive list and there may be more situations where the display feature is useful. + +- Invisible characters: A key may output invisible text of some sort, such as a space, control, or a keyboard [marker](./markers.md). Such keys can have a customized keycap that displays something helpful for the users. For example, `sp` for a space key. + +- Non-output keys: A key which switches layers, such as one that changes to a shift or alternate layer. + +- Visible characters with challenging display: doubled combining marks or combining marks without a base character might need special handling, such as choosing a different base character. A combining circumflex U+0302 could be represented by a caret `^` or perhaps by use of U+25CC followed by the combining character: `◌̂` + +## displayOptions + + + +## Example displays element + + With the key display customized, it's time now to arrange the keys into [layouts](./layouts). + +[display]: ../reference/display diff --git a/developer/ldml/guide/keybag.md b/developer/ldml/guide/keybag.md index 667bf648d..fb44515f5 100644 --- a/developer/ldml/guide/keybag.md +++ b/developer/ldml/guide/keybag.md @@ -24,13 +24,13 @@ Keys are defined by the [key] element within the [keys] element, as seen in a si - + ``` -Note that the identifier doesn't have to be plain ASCII. +Note that the identifier doesn't have to be plain ASCII, as in the last key. In the following sections we will discuss more advanced uses of keys. diff --git a/developer/ldml/guide/layouts.md b/developer/ldml/guide/layouts.md index 06ab7f804..2eacf4205 100644 --- a/developer/ldml/guide/layouts.md +++ b/developer/ldml/guide/layouts.md @@ -2,3 +2,4 @@ title: Defining Layouts --- +Layouts are how keys are arranged From a2e6b9d0f91de1246a051396c1ebaf9eacc77d14 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Wed, 23 Jul 2025 18:24:55 -0500 Subject: [PATCH 08/15] =?UTF-8?q?feat:=20ldml-docs:=20update=20guide=20ToC?= =?UTF-8?q?=20=E2=9C=8D=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - update keybags and displays #13836 --- developer/ldml/guide/displays.md | 25 +++++++++++++++++-- developer/ldml/guide/keybag.md | 42 ++++++++++++++++++++++++++++++-- 2 files changed, 63 insertions(+), 4 deletions(-) diff --git a/developer/ldml/guide/displays.md b/developer/ldml/guide/displays.md index b22db1425..8f4d282dd 100644 --- a/developer/ldml/guide/displays.md +++ b/developer/ldml/guide/displays.md @@ -12,16 +12,37 @@ Some situations where you might want to customize the display are as follows. T - Invisible characters: A key may output invisible text of some sort, such as a space, control, or a keyboard [marker](./markers.md). Such keys can have a customized keycap that displays something helpful for the users. For example, `sp` for a space key. -- Non-output keys: A key which switches layers, such as one that changes to a shift or alternate layer. +- Switch keys: A key which switches layers, such as one that changes to a shift or alternate layer. - Visible characters with challenging display: doubled combining marks or combining marks without a base character might need special handling, such as choosing a different base character. A combining circumflex U+0302 could be represented by a caret `^` or perhaps by use of U+25CC followed by the combining character: `◌̂` +## Example displays element + +```xml + + + + + + + + +``` + ## displayOptions +The `displayOptions` has a single configurable option at present, the baseCharacter. +In Lao for example, it's sometimes preferred to use `x` as the base for showing combining marks, rather than the dotted circle ◌. -## Example displays element +This is a hint for platforms to suggest using an alternative character. It doesn't require any specific behavior. +```xml + + + + +``` With the key display customized, it's time now to arrange the keys into [layouts](./layouts). diff --git a/developer/ldml/guide/keybag.md b/developer/ldml/guide/keybag.md index fb44515f5..c4ca2ceaa 100644 --- a/developer/ldml/guide/keybag.md +++ b/developer/ldml/guide/keybag.md @@ -34,12 +34,50 @@ Note that the identifier doesn't have to be plain ASCII, as in the last key. In the following sections we will discuss more advanced uses of keys. -## Gap +## Key Geometry + +### Width + +Keys are normally the same width (width="1" or width="1.0"). In some cases, a key is given a larger width for layout reasons. +The Khmer letter naa "ណ" is a little wider, so the key could be made wider to match. Widths are in tenths of a key width. + +```xml + +``` + +### Gap + +Sometimes on a key layout, it's useful to have a space where there aren't any keys. +This can be used with the layout to represent, for example, a place where one layer has a key but another doesn't. + +There's a pre-defined key named `gap` that has the gap attribute set. It's possible to add +additional gap keys if desired. The following defines `gap` as its normal definition, and then defines a 3-key wide gap. + +```xml + + +``` + +### Stretch + +The stretch attribute defines a key that expands to fill all available horizontal space. +This is used with the spacebar. + +```xml + +``` ## Marker key -## Key width +Markers are discussed in more detail [markers](./markers) and [transforms](./transforms). +For this discussion, it's used with a key that doesn't generate any actual output, but represents an invisible +non-text data item that is used for later processing. + +```xml + +``` +The marker's id here is `grave`. Next, we will learn about customizing key [displays]. From 5dc70268373edcfbce4646a891cfd0658a21b7c6 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Thu, 31 Jul 2025 16:56:13 -0500 Subject: [PATCH 09/15] =?UTF-8?q?feat:=20ldml-docs:=20update=20guide=20ToC?= =?UTF-8?q?=20=E2=9C=8D=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - layouts to layers (!) and add image #13836 --- cdn/dev/img/developer/ldml/layers.png | Bin 0 -> 129959 bytes cdn/dev/img/developer/ldml/layers.svg | 1136 +++++++++++++++++++++++++ developer/ldml/guide/displays.md | 2 +- developer/ldml/guide/index.md | 2 +- developer/ldml/guide/layers.md | 36 + developer/ldml/guide/layouts.md | 5 - 6 files changed, 1174 insertions(+), 7 deletions(-) create mode 100644 cdn/dev/img/developer/ldml/layers.png create mode 100644 cdn/dev/img/developer/ldml/layers.svg create mode 100644 developer/ldml/guide/layers.md delete mode 100644 developer/ldml/guide/layouts.md diff --git a/cdn/dev/img/developer/ldml/layers.png b/cdn/dev/img/developer/ldml/layers.png new file mode 100644 index 0000000000000000000000000000000000000000..bc199f955b7ed660547b2abdd8e0331914538e63 GIT binary patch literal 129959 zcmb@uby!>7vnY(aLvb%sT-u_+OK~a1-2$b!6P!YkQrz83TbyFSrAUHHNujvA1os>I zzQ1$MJ>UKFOP>AgwO3}z$eJ}XYj&bE)fMn@sBw^xknoihUuhvBA)g{4q2Xg;AZp6o zn{E*|WOpqES)|Gl+HJ%`Do|g^MokTg6H&%OLPsV+LVW~5e36i;k>$X#LOK+uNJh&dJ{0%EAT6>+EKWs7K95{_ipJ zQU22&`7|H(KV>w01RPSetqecnhV7zg;Eseu-~D(YJB@itA|avh*=g&0=&PxUSvfoM zT39<<0(pHLT^?H@0er*|MMt2A1*4CngOj_Mj|B5y2r)$Yv6_#W@h^yny#%wqnkJ*1 zvm206h?k$2pIH)zk&zMLW^E&;_3HJ%%@I!$%6Y63onx1O3m+z!i7(Om!I$d)yTun=D(-+f3^#cQCs1j|F$~(8cFwtn25MI z^wgB1A?@KJXQo9Qu<*xZn&)so7x!>@sAALqV*l*qeSS1%oRHsUocmkjbZfg+ zdMd`ob+j&uW=f-q35A80QJ=0$UK)YqI*Itvc2Gi|arAa<)yll@g~z~qhMpvjGs`qM z7pPfw5k;z^y;tAr$v;v}*gd$a@R!(VoTzb6o%4KPooMuChj0ueZKZDwy!u%zgoYRL zI!@Y7>D$k~UPU{*Z>`teX>K!MLTL4yw)Isdcj~r-FXpTA`F&xgeVgk8F10kMBylN} zcXCm&g0g&={pxtga*X9f&!R92tjalKK9rc+`2P$`31j=rRDFmwl|E*XefUJ=56`mH zP#|kF+V+O`A}&ibKVn!6`QW~YSRF?9yNG4z2c|JfqOSr4n1)+up+V2y-1a~1;6_j? zn29JH%f-X(X|i~DK{{I^Q?&-x)ORyljAn{C*SuFXLkI|StSLeip;x~MN2ZnUm^I77 zOnIBtK!XLU1qIUwWeJcf})Rb zvBY1GseK&>{P38|M9fCfnlzlhTpXOr|M!!NmRLA;! zQmS_`H@~_&`#nai>`%k`^S>Q&Fpn*TsryFt;IoWVUg4JLe^RLtU#O8zzra#b0Y-GP z{uVG|l&|M?buy0>{Wp&%2*_L>?N~q+YLjNAmAV+ z>w=M}Zd1Fj;yBOIf&f=#bIL4wDFW&`o)NMcjT^m%F~4Yp2Af|Ru|6%z@Hm(@1l6KJ z-v|rIQ5A|Bjl18yrp>G}2dLqm%g=mLzOq&($q)|y|Oz{23?vRLOp{-lwzg4f*@S$PghhdKz+W1L5vB( zFWw<1C6g9ieg$^v)R^|KW~SO9J7^nzKYrss1duhzC``1BiaX!2q)Oyr;Osi_kH@Pp zH+{|@b9_o3hQm@ZwZ&r4(j8?fGbn7;gP8xPYgb{%BPW2(#D>BHswpD zfn!bUz6Cb?^Jc)r0+Q%s=lB-p++n~HO;MR(!x5!C+oN!nh>Y5juN}qm^QRIsy?C3u zZS3cRpd|mR9y8!&zNr>%sKTMvRc)tlq=rCyP&!yOmD@O){idEw9T0xD&(!kCos~GO zoi6FaX725)@WVyYiC#tQNJ&Y8rUHiFdb~uND{p1*YDibIp*I?yYn<=`}B^9y|-5|=!%o0?_|ZOaX2|FOeCYx`Xh$SR%yimej+=%ER-s@786MWt+C_?!E+wd7>G-O-!Fx%yPo`+>UtV_@&pK>WT*y1! z;LXV4IIzH0)p}G?C*5wPPFpfsRa&pgyx1C0%56}GG1?fXQw9e5Ht+F5ljK#V6;Vzd zCwbrgv6bL4{IXm^Bwy>U5X&O0694-*{GtE+WYTwf@YAs_xD#>@yYHZ6F?vDYRWPhD=$N>m*D z@!gY3lQtd6EO=4f?wGM@z_AMW^m|c>!i5+7-e?h$R~4kYQRSyyCi?!NV_^RxmzBcU zx7c579Ww)Y*JYsk0DfL(HW=JxvbKf&RC)#d2&J`Xnpx>?5+XHF!ycy%54J5n?NKVbLJ7TNTn<-Rk9pjGz2L4%3B_|N&MR@ z8#J?@J}E<$lBWeK)+^_Y%2LE_r`jNT;|E_c;8Wdu!{@d=9-bFFUpx!d6xR@0hw)%Q&)k&$&*@9%;*_<7G`VgCH zlHUL`%jM(?zI3|k0lS@IKLt*Et1Rh6rYtUad|KOhvXyxOU8ms(QbI*jM|GUqb z#RhMt-L0QZeZ?R+t*NO=WP$t^N#W*j+5EDSO;hKF0|!oIP0Gx=z&>nkGpl#M=1qmX zPvGtE`VescO`}G)MRR_D?(H8evrrKSZ9-2wK9g2;-*Y=Y27k}87ol8PAqRVl#z7xW z564V+=53T*HzsL!>wP+>_S)Yu6HAsrH-(X|KJx5*p;0>7zFiB|82JQ~}avrqDioaek`E*EB~h`S`HZ1aP;N z*+0Tgg@SKWkYwHz;;5&dTh47-O4Cv6y#XzZDPw)ICQsjX)m&;}B30f}EZnKZjjXiK zJ*>kY9%`hnlErFsr7HX zEJvPX9gga%oCm{u`=y}L`llYFQukvwa3iDK&$tR?2wmq4zbIJV-TECx>ekAS7?H$)W (2HY71*Z*VbK3-KlHIiUeNa3 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 literal 0 HcmV?d00001 diff --git a/cdn/dev/img/developer/ldml/layers.svg b/cdn/dev/img/developer/ldml/layers.svg new file mode 100644 index 000000000..321cb926f --- /dev/null +++ b/cdn/dev/img/developer/ldml/layers.svg @@ -0,0 +1,1136 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Q + W + E + A + S + D + layer id="upper" modifiers="shift" + + + + + + + + + + q + w + e + a + s + d + layer id="base" modifiers="none" + + layers formId="iso" + + + + + + + + + + + + q + w + e + a + s + d + layer id="base" + layers formId="touch" minDeviceWidth="100" + + + + 1 + 2 + 3 + + + + z + x + c + + 12e + 123 + + + + + + + + + + + q + w + e + a + s + d + layer id="base" + layers formId="touch" + + + + z + x + c + + 123 + + + Layer Group for hardware + Layer Group for touch - mobile <100mm + Layer Group for touch - tablet ≥100mm + + diff --git a/developer/ldml/guide/displays.md b/developer/ldml/guide/displays.md index 8f4d282dd..c73ea3ab0 100644 --- a/developer/ldml/guide/displays.md +++ b/developer/ldml/guide/displays.md @@ -45,6 +45,6 @@ This is a hint for platforms to suggest using an alternative character. It doesn ``` -With the key display customized, it's time now to arrange the keys into [layouts](./layouts). +With the key display customized, it's time now to arrange the keys into [layers](./layers). [display]: ../reference/display diff --git a/developer/ldml/guide/index.md b/developer/ldml/guide/index.md index 73b3050e6..8aec6d8e8 100644 --- a/developer/ldml/guide/index.md +++ b/developer/ldml/guide/index.md @@ -16,7 +16,7 @@ Start with the [glossary](./glossary) and read these in order, or skip around as * [Overview](overview) of the LDML format * The [Keybag](keybag) * Customizing key [Displays](displays) -* Defining [Layouts](layouts) +* Defining [Layers](layers) ## Going further diff --git a/developer/ldml/guide/layers.md b/developer/ldml/guide/layers.md new file mode 100644 index 000000000..ed96f7eba --- /dev/null +++ b/developer/ldml/guide/layers.md @@ -0,0 +1,36 @@ +--- +title: Defining Layers +--- + +A layer defines are how keys are arranged for display and use. +For hardware layouts, a layer determines which hardware key connects to which key from the keybag. +For touch layouts, or hardware keyboards in an on-screen visual presentation, the layer controls how the keys are displayed on the screen for interaction with the finger or mouse. + +## Layer Groups (`layers`) + +A layer group or [`layers`](../reference/layers) element occurs one or more times in the keyboard file. +There may be at most one layer group for the hardware keyboard, and then one or more layer group for different widths (sizes) of touch layouts, such as for a phone versus a tablet. As noted, a hardware layout can be used for on-screen/touch, but a touch layout cannot be used for hardware, so we recommend starting with a hardware layout. + +### Hardware Layer Groups + +The hardware layer group has a `formId=` attribute referencing the physical layout of the keys, such as `iso` or `us` for the European 102 key layout (with a key between the shift and Z key) and the US 101 key layout (with no key between the shift and Z) respectively. Other layouts supported include `abnt2`, `jis`, and `ks`. + +### Touch Layer Groups + +Touch layer groups always have the attribute `formId="touch"`, and are distinguished from each other by the `minDeviceWidth=` attribute, which specifies a minimum width, in millimeters, that the layout group must have. + +## Defining a Layer + +Now we come to discuss the actual [`layer`](../reference/layer) element. + +Each layer has an optional id, and a required modifier set. The id is used to distinguish layers when using keys that switch layers. Also, the layer with the id of `base` is the default layer for touch keyboards. + +### Modifiers + +Each layer has a set of modifiers defined. For hardware keyboards, this specifies which layer will be selected based on the modifiers in the hardware keyboards. + +## Overview of Layers and Layer Groups + +Here is a reference image to help you understand layers and layer groups. + +![Image showing three layer groups. First, a layer group for hardware, with a base and shifted layer. Then, a layer group for touch or mobile devices, that is less than (in this example) 100 millimeters wide, having a "123" key to switch to numbers. Finally, a layer group for wider or tablet devices, that is a width of 100 or greater millimeters, having a separate number row above the keyboard.](/cdn/dev/img/developer/ldml/layers.png) diff --git a/developer/ldml/guide/layouts.md b/developer/ldml/guide/layouts.md deleted file mode 100644 index 2eacf4205..000000000 --- a/developer/ldml/guide/layouts.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Defining Layouts ---- - -Layouts are how keys are arranged From 756b62c4d643e2a6c4f272db9428ff79ab70e485 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Thu, 31 Jul 2025 19:59:52 -0500 Subject: [PATCH 10/15] =?UTF-8?q?feat:=20ldml-docs:=20update=20guide=20ToC?= =?UTF-8?q?=20=E2=9C=8D=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - finish the layers section, also update keybag and displays #13836 --- developer/ldml/guide/displays.md | 4 ++-- developer/ldml/guide/keybag.md | 10 +++++++++ developer/ldml/guide/layers.md | 36 ++++++++++++++++++++++++++++++-- 3 files changed, 46 insertions(+), 4 deletions(-) diff --git a/developer/ldml/guide/displays.md b/developer/ldml/guide/displays.md index c73ea3ab0..647843215 100644 --- a/developer/ldml/guide/displays.md +++ b/developer/ldml/guide/displays.md @@ -24,8 +24,8 @@ Some situations where you might want to customize the display are as follows. T - - + + ``` diff --git a/developer/ldml/guide/keybag.md b/developer/ldml/guide/keybag.md index c4ca2ceaa..9adceae8e 100644 --- a/developer/ldml/guide/keybag.md +++ b/developer/ldml/guide/keybag.md @@ -34,6 +34,16 @@ Note that the identifier doesn't have to be plain ASCII, as in the last key. In the following sections we will discuss more advanced uses of keys. +## Switch Keys + +A key within a touch layout can switch to a different [layer](./layers) by use of the `layerId` attribute, which names another layer. For example, this key switches to the "numbers" layer: + +```xml + +``` + +Such a key would otherwise have a blank keycap (because it doesn't produce any output), so it is recommended to use a [`display`](./displays) element to give it an identifiable appearance. + ## Key Geometry ### Width diff --git a/developer/ldml/guide/layers.md b/developer/ldml/guide/layers.md index ed96f7eba..0a77a669c 100644 --- a/developer/ldml/guide/layers.md +++ b/developer/ldml/guide/layers.md @@ -23,14 +23,46 @@ Touch layer groups always have the attribute `formId="touch"`, and are distingui Now we come to discuss the actual [`layer`](../reference/layer) element. -Each layer has an optional id, and a required modifier set. The id is used to distinguish layers when using keys that switch layers. Also, the layer with the id of `base` is the default layer for touch keyboards. +### Layer ID + +The ID is required for touch layers, but is optional for hardware layers. The layer with the ID of `base` is the starting layer. + +Keys can switch layers by referencing this layer in their `layerId` attribute. ### Modifiers -Each layer has a set of modifiers defined. For hardware keyboards, this specifies which layer will be selected based on the modifiers in the hardware keyboards. +The modifiers are required for hardware layers, but are optional for touch layers. + +Each layer has a set of modifiers defined. For hardware keyboards, this specifies which layer will be selected based on the modifiers held down. `none` is used for the layer with no modifiers. + +For example, `modifiers="none"` or `modifiers="shift"`. See [`layer`](../reference/layer) for further details. + +### Rows + +Each layer contains one or more [`row`](../reference/row) elements, in order from top to bottom. + +For example, most hardware keyboards have five rows including the space bar. +Note that for hardware layouts, only the "alphanumeric" keys, that is, the keys which produce a character or space, are included. Shift, Control, and any other device-specific hardware keys are not included. + +For touch keyboards, the number of rows is completely up to the keyboard author. Different layers or layer groups do not have to have the same number of rows. + +The `keys` attribute of each `row` is a space-separated list of key IDs. + +Example: + +```xml + + + + + + + +``` ## Overview of Layers and Layer Groups Here is a reference image to help you understand layers and layer groups. ![Image showing three layer groups. First, a layer group for hardware, with a base and shifted layer. Then, a layer group for touch or mobile devices, that is less than (in this example) 100 millimeters wide, having a "123" key to switch to numbers. Finally, a layer group for wider or tablet devices, that is a width of 100 or greater millimeters, having a separate number row above the keyboard.](/cdn/dev/img/developer/ldml/layers.png) + From b6c4345a33e115fd7b1141c231b55794cc643859 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Sat, 9 Aug 2025 00:04:05 +0000 Subject: [PATCH 11/15] update per review --- developer/ldml/guide/index.md | 1 + developer/ldml/guide/keybag.md | 11 ++++++----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/developer/ldml/guide/index.md b/developer/ldml/guide/index.md index 8aec6d8e8..6da4f1179 100644 --- a/developer/ldml/guide/index.md +++ b/developer/ldml/guide/index.md @@ -14,6 +14,7 @@ Start with the [glossary](./glossary) and read these in order, or skip around as ## Jumping in * [Overview](overview) of the LDML format + * [Choosing a Locale](choosing-locale) * The [Keybag](keybag) * Customizing key [Displays](displays) * Defining [Layers](layers) diff --git a/developer/ldml/guide/keybag.md b/developer/ldml/guide/keybag.md index 9adceae8e..0d2e33d6f 100644 --- a/developer/ldml/guide/keybag.md +++ b/developer/ldml/guide/keybag.md @@ -30,7 +30,7 @@ Keys are defined by the [key] element within the [keys] element, as seen in a si ``` -Note that the identifier doesn't have to be plain ASCII, as in the last key. +Note that the identifier doesn't have to be plain ASCII, as in the last key shown above, which has the ID of `ক`. In the following sections we will discuss more advanced uses of keys. @@ -42,7 +42,7 @@ A key within a touch layout can switch to a different [layer](./layers) by use o ``` -Such a key would otherwise have a blank keycap (because it doesn't produce any output), so it is recommended to use a [`display`](./displays) element to give it an identifiable appearance. +Such a key would otherwise have a blank keycap (because it doesn't produce any output), so it is recommended to use a [`display`](./displays) element to give it an identifiable appearance. See the [displays](./displays#example-displays-element) section for an example. ## Key Geometry @@ -57,10 +57,9 @@ The Khmer letter naa "ណ" is a little wider, so the key could be made wider to ### Gap -Sometimes on a key layout, it's useful to have a space where there aren't any keys. -This can be used with the layout to represent, for example, a place where one layer has a key but another doesn't. +Sometimes on a key layout, it can be useful to have a blank area without any keys. For example, a shifted layer may not have a shifted key defined for each base key. The `gap="true"` attribute indicates that a key is a gap and has no output and no key cap display. -There's a pre-defined key named `gap` that has the gap attribute set. It's possible to add +There is a pre-defined key named `gap` that has the gap attribute set. It is possible to add additional gap keys if desired. The following defines `gap` as its normal definition, and then defines a 3-key wide gap. ```xml @@ -93,3 +92,5 @@ Next, we will learn about customizing key [displays]. [repertoire]: ./planning#repertoire [displays]: ./displays +[keys]: ../reference/keys +[key]: ../reference/key From 989a95f7f7a22b10fbc53af513445537e589cbb1 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Thu, 28 Aug 2025 12:11:31 -0500 Subject: [PATCH 12/15] feat: ldml-docs: rename choosing-locale.md to locales.md --- developer/ldml/guide/index.md | 2 +- developer/ldml/guide/{choosing-locale.md => locales.md} | 0 developer/ldml/guide/overview.md | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename developer/ldml/guide/{choosing-locale.md => locales.md} (100%) diff --git a/developer/ldml/guide/index.md b/developer/ldml/guide/index.md index 6da4f1179..f3f09f3cc 100644 --- a/developer/ldml/guide/index.md +++ b/developer/ldml/guide/index.md @@ -14,7 +14,7 @@ Start with the [glossary](./glossary) and read these in order, or skip around as ## Jumping in * [Overview](overview) of the LDML format - * [Choosing a Locale](choosing-locale) + * [Choosing a Locale](locales) * The [Keybag](keybag) * Customizing key [Displays](displays) * Defining [Layers](layers) diff --git a/developer/ldml/guide/choosing-locale.md b/developer/ldml/guide/locales.md similarity index 100% rename from developer/ldml/guide/choosing-locale.md rename to developer/ldml/guide/locales.md diff --git a/developer/ldml/guide/overview.md b/developer/ldml/guide/overview.md index 6359222b0..0807068c4 100644 --- a/developer/ldml/guide/overview.md +++ b/developer/ldml/guide/overview.md @@ -77,7 +77,7 @@ version number. The `locale` attribute is the _primary_ [BCP 47] locale for the keyboard. -See [choosing a locale](choosing-locale) for more information about choosing +See [choosing a locale](locales) for more information about choosing locale id(s) for your keyboard. ```xml From c3bf001a192202380c57172edcef436b3f116938 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Thu, 28 Aug 2025 12:23:22 -0500 Subject: [PATCH 13/15] feat: ldml-docs: updates to guides - add exmples to locales.md - update displays.md from feedback - update to index from feedback - add stub settings.md For: #13836 --- developer/ldml/guide/displays.md | 6 +++--- developer/ldml/guide/index.md | 6 +++--- developer/ldml/guide/locales.md | 6 ++++++ developer/ldml/guide/settings.md | 4 ++++ 4 files changed, 16 insertions(+), 6 deletions(-) create mode 100644 developer/ldml/guide/settings.md diff --git a/developer/ldml/guide/displays.md b/developer/ldml/guide/displays.md index 647843215..f29e48580 100644 --- a/developer/ldml/guide/displays.md +++ b/developer/ldml/guide/displays.md @@ -4,9 +4,9 @@ title: Customizing Keytop Displays ## Why customize the display -Normally, the display of a keytop, whether in a touch enironment or the on-screen display of a hardware keyboard, simply matches the characrer output. So, a key that outputs `a` will have a keytop that looks like `a`. +Normally, the display of a keytop, whether in a touch environment or the on-screen display of a hardware keyboard, simply matches the characrer output. So, a key that outputs `a` will have a keytop that looks like `a`. -However, there are some situations where it is desireable to customize the display of a key. This is where the [display] element is useful. This is an optional element. +However, there are some situations where it is desirable to customize the display of a key. This is where the [display] element is useful. This is an optional element. Some situations where you might want to customize the display are as follows. This isn't an exhaustive list and there may be more situations where the display feature is useful. @@ -14,7 +14,7 @@ Some situations where you might want to customize the display are as follows. T - Switch keys: A key which switches layers, such as one that changes to a shift or alternate layer. -- Visible characters with challenging display: doubled combining marks or combining marks without a base character might need special handling, such as choosing a different base character. A combining circumflex U+0302 could be represented by a caret `^` or perhaps by use of U+25CC followed by the combining character: `◌̂` +- Visible characters with challenging display: doubled combining marks or combining marks without a base character might need special handling, such as choosing a different base character. A combining circumflex U+0302 could be represented by a caret `^`. ## Example displays element diff --git a/developer/ldml/guide/index.md b/developer/ldml/guide/index.md index f3f09f3cc..701ef2a02 100644 --- a/developer/ldml/guide/index.md +++ b/developer/ldml/guide/index.md @@ -4,11 +4,10 @@ title: LDML Guide This guide will take you through the concepts, planning process, and structure needed to successfully author an LDML Keyboard used with Keyman. -Start with the [glossary](./glossary) and read these in order, or skip around as suits your interest. The [reference](../reference/) is useful for details of a particular XML Element. +We recommend to start with [Planning](./planning) and read these pags in order, but you are welcome to skip around as suits your interest. The [reference](../reference/) is useful for details of a particular XML Element. ## Getting Started -* [Glossary](glossary) * [Planning](planning) your Keyboard ## Jumping in @@ -21,8 +20,9 @@ Start with the [glossary](./glossary) and read these in order, or skip around as ## Going further -* Settings, Options +* [Settings and Options](settings) * [Variables](variables) * [Transforms](transforms) * [Markers](markers) * [Reorders](reorders) +* [Glossary](glossary) diff --git a/developer/ldml/guide/locales.md b/developer/ldml/guide/locales.md index e7a4f0282..f001e97cd 100644 --- a/developer/ldml/guide/locales.md +++ b/developer/ldml/guide/locales.md @@ -9,6 +9,12 @@ The primary locale id is stored in the `locale` attribute of the [`keyboard3`][k (outer) element, while any additional locale ids are stored in the optional [`locales`][locales] element. +Examples: + +- `km` — Khmer +- `suz-Sunu` — Sunuwar language, in the Sunuwar script +- `fa-t-k0-isiri` — Persian ISIRI keyboard + [BCP 47]: ../../current-version/reference/bcp-47 [keyboard3]: ../reference/keyboard3 [locales]: ../reference/locales diff --git a/developer/ldml/guide/settings.md b/developer/ldml/guide/settings.md new file mode 100644 index 000000000..76878ef3e --- /dev/null +++ b/developer/ldml/guide/settings.md @@ -0,0 +1,4 @@ +--- +title: Settings and Options +--- + From 6d7d85d4ff9fb59f074d1012b839fabc8786a42c Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Thu, 28 Aug 2025 18:04:52 -0500 Subject: [PATCH 14/15] feat: ldml-docs: updates to guides - keybag: updated per review comments - layers: upated per review comments - moved "overview" into the getting started section - planning: updated per review comments For: #13836 --- developer/ldml/guide/index.md | 4 ++-- developer/ldml/guide/keybag.md | 15 +++++++-------- developer/ldml/guide/layers.md | 9 +++++++-- developer/ldml/guide/planning.md | 4 ++-- 4 files changed, 18 insertions(+), 14 deletions(-) diff --git a/developer/ldml/guide/index.md b/developer/ldml/guide/index.md index 701ef2a02..a5923b003 100644 --- a/developer/ldml/guide/index.md +++ b/developer/ldml/guide/index.md @@ -9,11 +9,11 @@ We recommend to start with [Planning](./planning) and read these pags in order, ## Getting Started * [Planning](planning) your Keyboard +* [Overview](overview) of the LDML format + * [Choosing a Locale](locales) ## Jumping in -* [Overview](overview) of the LDML format - * [Choosing a Locale](locales) * The [Keybag](keybag) * Customizing key [Displays](displays) * Defining [Layers](layers) diff --git a/developer/ldml/guide/keybag.md b/developer/ldml/guide/keybag.md index 0d2e33d6f..c8e57f27a 100644 --- a/developer/ldml/guide/keybag.md +++ b/developer/ldml/guide/keybag.md @@ -30,7 +30,7 @@ Keys are defined by the [key] element within the [keys] element, as seen in a si ``` -Note that the identifier doesn't have to be plain ASCII, as in the last key shown above, which has the ID of `ক`. +Note that the identifier doesn't have to be plain ASCII, as shown in the last key above, which has the ID of `ক`. In the following sections we will discuss more advanced uses of keys. @@ -42,17 +42,16 @@ A key within a touch layout can switch to a different [layer](./layers) by use o ``` -Such a key would otherwise have a blank keycap (because it doesn't produce any output), so it is recommended to use a [`display`](./displays) element to give it an identifiable appearance. See the [displays](./displays#example-displays-element) section for an example. +Such a key would by default have a blank keycap (because it doesn't produce any output), so it is recommended to use a [`display`](./displays) element to give it an identifiable appearance. See the [displays](./displays#example-displays-element) section for an example. ## Key Geometry ### Width -Keys are normally the same width (width="1" or width="1.0"). In some cases, a key is given a larger width for layout reasons. -The Khmer letter naa "ណ" is a little wider, so the key could be made wider to match. Widths are in tenths of a key width. +In a touch keyboard, keys are normally the same width (width="1" or width="1.0"). In some cases, a key is given a larger width for layout reasons, such as for the shift key. Widths are in tenths of a key width. ```xml - + ``` ### Gap @@ -63,14 +62,14 @@ There is a pre-defined key named `gap` that has the gap attribute set. It is pos additional gap keys if desired. The following defines `gap` as its normal definition, and then defines a 3-key wide gap. ```xml - + ``` ### Stretch The stretch attribute defines a key that expands to fill all available horizontal space. -This is used with the spacebar. +This is used, for example, with the spacebar. ```xml @@ -78,7 +77,7 @@ This is used with the spacebar. ## Marker key -Markers are discussed in more detail [markers](./markers) and [transforms](./transforms). +Markers are discussed in more detail in [markers](./markers) and [transforms](./transforms). For this discussion, it's used with a key that doesn't generate any actual output, but represents an invisible non-text data item that is used for later processing. diff --git a/developer/ldml/guide/layers.md b/developer/ldml/guide/layers.md index 0a77a669c..329e2e64b 100644 --- a/developer/ldml/guide/layers.md +++ b/developer/ldml/guide/layers.md @@ -4,12 +4,14 @@ title: Defining Layers A layer defines are how keys are arranged for display and use. For hardware layouts, a layer determines which hardware key connects to which key from the keybag. -For touch layouts, or hardware keyboards in an on-screen visual presentation, the layer controls how the keys are displayed on the screen for interaction with the finger or mouse. +For touch layouts, the layer controls how the keys are displayed on the screen for interaction with the finger or mouse. ## Layer Groups (`layers`) A layer group or [`layers`](../reference/layers) element occurs one or more times in the keyboard file. -There may be at most one layer group for the hardware keyboard, and then one or more layer group for different widths (sizes) of touch layouts, such as for a phone versus a tablet. As noted, a hardware layout can be used for on-screen/touch, but a touch layout cannot be used for hardware, so we recommend starting with a hardware layout. +There may be at most one layer group for the hardware keyboard, and then one or more layer group for different widths (sizes) of touch layouts, such as for a phone versus a tablet. + +If no touch layer group is present, then the hardware layout will be used in touch devices, but a touch layout cannot be used for hardware, so we recommend starting with a hardware layout. ### Hardware Layer Groups @@ -66,3 +68,6 @@ Here is a reference image to help you understand layers and layer groups. ![Image showing three layer groups. First, a layer group for hardware, with a base and shifted layer. Then, a layer group for touch or mobile devices, that is less than (in this example) 100 millimeters wide, having a "123" key to switch to numbers. Finally, a layer group for wider or tablet devices, that is a width of 100 or greater millimeters, having a separate number row above the keyboard.](/cdn/dev/img/developer/ldml/layers.png) +----- + +You've now completed a brief tour of the LDML format for Keyman. See [going further](./index#toc-going-further) for additional topics to explore. diff --git a/developer/ldml/guide/planning.md b/developer/ldml/guide/planning.md index 39b8a3677..bddbe116e 100644 --- a/developer/ldml/guide/planning.md +++ b/developer/ldml/guide/planning.md @@ -2,8 +2,8 @@ title: Planning your Keyboard --- -Whether you are building an entirely novel keyboard from zero, or implmenting one that already exists in another environment, planning is important. -Make sure you have all of the important information at hand so that you can begin down this journey. +Whether you are building an entirely novel keyboard from zero, or implementing one that already exists in another environment, planning is important. +Make sure you have all of the important information at hand so that you can begin on this journey. ## Questions From 3ee0de33a232da4c3861340a5da609aa7420df6b Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Sat, 30 Aug 2025 17:23:38 -0500 Subject: [PATCH 15/15] chore: rewrap to 80 columns --- developer/ldml/guide/displays.md | 37 +++++-- developer/ldml/guide/glossary.md | 12 ++- developer/ldml/guide/index.md | 7 +- developer/ldml/guide/keybag.md | 66 +++++++++---- developer/ldml/guide/layers.md | 10 +- developer/ldml/guide/locales.md | 10 +- developer/ldml/guide/overview.md | 55 +++++------ developer/ldml/guide/planning.md | 24 +++-- developer/ldml/index.md | 10 +- developer/ldml/reference/display.md | 6 +- developer/ldml/reference/displayOptions.md | 12 ++- developer/ldml/reference/displays.md | 13 ++- developer/ldml/reference/flick.md | 13 ++- developer/ldml/reference/flickSegment.md | 21 ++-- developer/ldml/reference/flicks.md | 9 +- developer/ldml/reference/form.md | 15 +-- developer/ldml/reference/forms.md | 9 +- developer/ldml/reference/import.md | 9 +- developer/ldml/reference/index.md | 106 +++++++++------------ developer/ldml/reference/info.md | 6 +- developer/ldml/reference/key.md | 9 +- developer/ldml/reference/keyboard3.md | 36 ++++--- developer/ldml/reference/keys.md | 9 +- developer/ldml/reference/layer.md | 10 +- developer/ldml/reference/layers.md | 9 +- developer/ldml/reference/locale.md | 6 +- developer/ldml/reference/locales.md | 6 +- developer/ldml/reference/reorder.md | 6 +- developer/ldml/reference/row.md | 6 +- developer/ldml/reference/set.md | 6 +- developer/ldml/reference/settings.md | 6 +- developer/ldml/reference/special.md | 3 +- developer/ldml/reference/string.md | 6 +- developer/ldml/reference/transform.md | 6 +- developer/ldml/reference/transformGroup.md | 9 +- developer/ldml/reference/transforms.md | 6 +- developer/ldml/reference/uset.md | 6 +- developer/ldml/reference/variables.md | 6 +- developer/ldml/reference/version.md | 6 +- 39 files changed, 350 insertions(+), 257 deletions(-) diff --git a/developer/ldml/guide/displays.md b/developer/ldml/guide/displays.md index f29e48580..eca0f1535 100644 --- a/developer/ldml/guide/displays.md +++ b/developer/ldml/guide/displays.md @@ -4,17 +4,30 @@ title: Customizing Keytop Displays ## Why customize the display -Normally, the display of a keytop, whether in a touch environment or the on-screen display of a hardware keyboard, simply matches the characrer output. So, a key that outputs `a` will have a keytop that looks like `a`. +Normally, the display of a keytop, whether in a touch environment or the +on-screen display of a hardware keyboard, simply matches the characrer output. +So, a key that outputs `a` will have a keytop that looks like `a`. -However, there are some situations where it is desirable to customize the display of a key. This is where the [display] element is useful. This is an optional element. +However, there are some situations where it is desirable to customize the +display of a key. This is where the [display] element is useful. This is an +optional element. -Some situations where you might want to customize the display are as follows. This isn't an exhaustive list and there may be more situations where the display feature is useful. +Some situations where you might want to customize the display are as follows. +This isn't an exhaustive list and there may be more situations where the display +feature is useful. -- Invisible characters: A key may output invisible text of some sort, such as a space, control, or a keyboard [marker](./markers.md). Such keys can have a customized keycap that displays something helpful for the users. For example, `sp` for a space key. +- Invisible characters: A key may output invisible text of some sort, such as a + space, control, or a keyboard [marker](./markers.md). Such keys can have a + customized keycap that displays something helpful for the users. For example, + `sp` for a space key. -- Switch keys: A key which switches layers, such as one that changes to a shift or alternate layer. +- Switch keys: A key which switches layers, such as one that changes to a shift + or alternate layer. -- Visible characters with challenging display: doubled combining marks or combining marks without a base character might need special handling, such as choosing a different base character. A combining circumflex U+0302 could be represented by a caret `^`. +- Visible characters with challenging display: doubled combining marks or + combining marks without a base character might need special handling, such as + choosing a different base character. A combining circumflex U+0302 could be + represented by a caret `^`. ## Example displays element @@ -31,11 +44,14 @@ Some situations where you might want to customize the display are as follows. T ## displayOptions -The `displayOptions` has a single configurable option at present, the baseCharacter. +The `displayOptions` has a single configurable option at present, the +baseCharacter. -In Lao for example, it's sometimes preferred to use `x` as the base for showing combining marks, rather than the dotted circle ◌. +In Lao for example, it's sometimes preferred to use `x` as the base for showing +combining marks, rather than the dotted circle ◌. -This is a hint for platforms to suggest using an alternative character. It doesn't require any specific behavior. +This is a hint for platforms to suggest using an alternative character. It +doesn't require any specific behavior. ```xml @@ -45,6 +61,7 @@ This is a hint for platforms to suggest using an alternative character. It doesn ``` -With the key display customized, it's time now to arrange the keys into [layers](./layers). +With the key display customized, it's time now to arrange the keys into +[layers](./layers). [display]: ../reference/display diff --git a/developer/ldml/guide/glossary.md b/developer/ldml/guide/glossary.md index b7bd4d9aa..bc417835a 100644 --- a/developer/ldml/guide/glossary.md +++ b/developer/ldml/guide/glossary.md @@ -6,14 +6,18 @@ title: Glossary for LDML ### BCP 47 language tag -A standardized code that is used to identify human languages on the Internet. More on [BCP 47](https://www.rfc-editor.org/info/bcp47). +A standardized code that is used to identify human languages on the Internet. +More on [BCP 47](https://www.rfc-editor.org/info/bcp47). -There are many possible subtags, but only three types are currently used in most places in Keyman Developer: +There are many possible subtags, but only three types are currently used in most +places in Keyman Developer: -* [language subtag](../../current-version/reference/bcp-47#toc-the-language-subtag) +* [language + subtag](../../current-version/reference/bcp-47#toc-the-language-subtag) * [script subtag](../../current-version/reference/bcp-47#toc-the-script-subtag) * [region subtag](../../current-version/reference/bcp-47#toc-the-region-subtag) -More information about BCP 47 language tag and full details on [how they are used in Keyman Developer](../../current-version/reference/bcp-47). +More information about BCP 47 language tag and full details on [how they are +used in Keyman Developer](../../current-version/reference/bcp-47). Now, go on to begin [planning](./planning) your LDML keyboard. diff --git a/developer/ldml/guide/index.md b/developer/ldml/guide/index.md index a5923b003..298b47a5e 100644 --- a/developer/ldml/guide/index.md +++ b/developer/ldml/guide/index.md @@ -2,9 +2,12 @@ title: LDML Guide --- -This guide will take you through the concepts, planning process, and structure needed to successfully author an LDML Keyboard used with Keyman. +This guide will take you through the concepts, planning process, and structure +needed to successfully author an LDML Keyboard used with Keyman. -We recommend to start with [Planning](./planning) and read these pags in order, but you are welcome to skip around as suits your interest. The [reference](../reference/) is useful for details of a particular XML Element. +We recommend to start with [Planning](./planning) and read these pags in order, +but you are welcome to skip around as suits your interest. The +[reference](../reference/) is useful for details of a particular XML Element. ## Getting Started diff --git a/developer/ldml/guide/keybag.md b/developer/ldml/guide/keybag.md index c8e57f27a..4fdcb5b67 100644 --- a/developer/ldml/guide/keybag.md +++ b/developer/ldml/guide/keybag.md @@ -2,23 +2,38 @@ title: The Keybag --- -The first major part of authoring your keyboard consists in setting up the keybag. +The first major part of authoring your keyboard consists in setting up the +keybag. ## What's in the Keybag? -You can think of the keybag as if it were a literal "bag of keys" from which you can bring out a key and place it into the right spot in your layout. +You can think of the keybag as if it were a literal "bag of keys" from which you +can bring out a key and place it into the right spot in your layout. -The keybag is not one-for-one with the [repertoire], due to the following reasons: +The keybag is not one-for-one with the [repertoire], due to the following + reasons: -- There may be text which is of the repertoire which are not typed by the user directly at all, but are accessed via transforms. For example, suppose `œ` were part of the repertoire, but accessed by the user by typing `o` + `e`. There might not be an `œ` key, though it is in the repertoire. +- There may be text which is of the repertoire which are not typed by the user +directly at all, but are accessed via transforms. For example, suppose `œ` were +part of the repertoire, but accessed by the user by typing `o` + `e`. There +might not be an `œ` key, though it is in the repertoire. -- There may also be more than one key which produces the same output, but has a distinct identity as a key. For example, there might be a key producing `a` which is used on a hardware layer, but also another key also producing `a` on one of the touch layers which has gestures attached to it such as a long press yielding `à`, `á`, `â` etc. The two `a` keys have diferent identities (`id=` attribute) and differ in other properties. +- There may also be more than one key which produces the same output, but has a + distinct identity as a key. For example, there might be a key producing `a` + which is used on a hardware layer, but also another key also producing `a` on + one of the touch layers which has gestures attached to it such as a long press + yielding `à`, `á`, `â` etc. The two `a` keys have diferent identities (`id=` + attribute) and differ in other properties. -- Rarer, but it may be possible that a key producing the same output intentionally has a different keycap display in two different contexts. Keys are identified by a unique identifier, so unique keys can have unique key [displays]. +- Rarer, but it may be possible that a key producing the same output + intentionally has a different keycap display in two different contexts. Keys + are identified by a unique identifier, so unique keys can have unique key + [displays]. ## Defining keys in the Keybag -Keys are defined by the [key] element within the [keys] element, as seen in a simple example: +Keys are defined by the [key] element within the [keys] element, as seen in a +simple example: ```xml @@ -30,25 +45,33 @@ Keys are defined by the [key] element within the [keys] element, as seen in a si ``` -Note that the identifier doesn't have to be plain ASCII, as shown in the last key above, which has the ID of `ক`. +Note that the identifier doesn't have to be plain ASCII, as shown in the last +key above, which has the ID of `ক`. In the following sections we will discuss more advanced uses of keys. ## Switch Keys -A key within a touch layout can switch to a different [layer](./layers) by use of the `layerId` attribute, which names another layer. For example, this key switches to the "numbers" layer: +A key within a touch layout can switch to a different [layer](./layers) by use +of the `layerId` attribute, which names another layer. For example, this key +switches to the "numbers" layer: ```xml ``` -Such a key would by default have a blank keycap (because it doesn't produce any output), so it is recommended to use a [`display`](./displays) element to give it an identifiable appearance. See the [displays](./displays#example-displays-element) section for an example. +Such a key would by default have a blank keycap (because it doesn't produce any +output), so it is recommended to use a [`display`](./displays) element to give +it an identifiable appearance. See the +[displays](./displays#example-displays-element) section for an example. ## Key Geometry ### Width -In a touch keyboard, keys are normally the same width (width="1" or width="1.0"). In some cases, a key is given a larger width for layout reasons, such as for the shift key. Widths are in tenths of a key width. +In a touch keyboard, keys are normally the same width (width="1" or +width="1.0"). In some cases, a key is given a larger width for layout reasons, +such as for the shift key. Widths are in tenths of a key width. ```xml @@ -56,10 +79,14 @@ In a touch keyboard, keys are normally the same width (width="1" or width="1.0") ### Gap -Sometimes on a key layout, it can be useful to have a blank area without any keys. For example, a shifted layer may not have a shifted key defined for each base key. The `gap="true"` attribute indicates that a key is a gap and has no output and no key cap display. +Sometimes on a key layout, it can be useful to have a blank area without any +keys. For example, a shifted layer may not have a shifted key defined for each +base key. The `gap="true"` attribute indicates that a key is a gap and has no +output and no key cap display. -There is a pre-defined key named `gap` that has the gap attribute set. It is possible to add -additional gap keys if desired. The following defines `gap` as its normal definition, and then defines a 3-key wide gap. +There is a pre-defined key named `gap` that has the gap attribute set. It is +possible to add additional gap keys if desired. The following defines `gap` as +its normal definition, and then defines a 3-key wide gap. ```xml @@ -68,8 +95,8 @@ additional gap keys if desired. The following defines `gap` as its normal defini ### Stretch -The stretch attribute defines a key that expands to fill all available horizontal space. -This is used, for example, with the spacebar. +The stretch attribute defines a key that expands to fill all available +horizontal space. This is used, for example, with the spacebar. ```xml @@ -77,9 +104,10 @@ This is used, for example, with the spacebar. ## Marker key -Markers are discussed in more detail in [markers](./markers) and [transforms](./transforms). -For this discussion, it's used with a key that doesn't generate any actual output, but represents an invisible -non-text data item that is used for later processing. +Markers are discussed in more detail in [markers](./markers) and +[transforms](./transforms). For this discussion, it's used with a key that +doesn't generate any actual output, but represents an invisible non-text data +item that is used for later processing. ```xml diff --git a/developer/ldml/guide/layers.md b/developer/ldml/guide/layers.md index 329e2e64b..18393f9d0 100644 --- a/developer/ldml/guide/layers.md +++ b/developer/ldml/guide/layers.md @@ -66,8 +66,14 @@ Example: Here is a reference image to help you understand layers and layer groups. -![Image showing three layer groups. First, a layer group for hardware, with a base and shifted layer. Then, a layer group for touch or mobile devices, that is less than (in this example) 100 millimeters wide, having a "123" key to switch to numbers. Finally, a layer group for wider or tablet devices, that is a width of 100 or greater millimeters, having a separate number row above the keyboard.](/cdn/dev/img/developer/ldml/layers.png) +![Image showing three layer groups. First, a layer group for hardware, with a +base and shifted layer. Then, a layer group for touch or mobile devices, that +is less than (in this example) 100 millimeters wide, having a "123" key to +switch to numbers. Finally, a layer group for wider or tablet devices, that is a +width of 100 or greater millimeters, having a separate number row above the +keyboard.](/cdn/dev/img/developer/ldml/layers.png) ----- -You've now completed a brief tour of the LDML format for Keyman. See [going further](./index#toc-going-further) for additional topics to explore. +You've now completed a brief tour of the LDML format for Keyman. See [going +further](./index#toc-going-further) for additional topics to explore. diff --git a/developer/ldml/guide/locales.md b/developer/ldml/guide/locales.md index f001e97cd..5f96df4fc 100644 --- a/developer/ldml/guide/locales.md +++ b/developer/ldml/guide/locales.md @@ -2,12 +2,12 @@ title: Choosing a locale --- -As part of your keyboard development, you must choose one or more [BCP 47] locale codes to -associate with the keyboard. +As part of your keyboard development, you must choose one or more [BCP 47] +locale codes to associate with the keyboard. -The primary locale id is stored in the `locale` attribute of the [`keyboard3`][keyboard3] -(outer) element, while any additional locale ids are stored in the optional [`locales`][locales] -element. +The primary locale id is stored in the `locale` attribute of the +[`keyboard3`][keyboard3] (outer) element, while any additional locale ids are +stored in the optional [`locales`][locales] element. Examples: diff --git a/developer/ldml/guide/overview.md b/developer/ldml/guide/overview.md index 0807068c4..eabc69b08 100644 --- a/developer/ldml/guide/overview.md +++ b/developer/ldml/guide/overview.md @@ -2,18 +2,18 @@ title: LDML overview --- -LDML is the Locale Data Markup Language. It it an XML-based format -specified as the Unicode Consortium’s specification [UTS#35 Part 7], -maintained by the [Common Locale Data Repository (CLDR)][CLDR] -Technical Commitee. +LDML is the Locale Data Markup Language. It it an XML-based format specified as +the Unicode Consortium’s specification [UTS#35 Part 7], maintained by the +[Common Locale Data Repository (CLDR)][CLDR] Technical Commitee. -LDML itself has several parts which describe diferent aspects of locale data. This document describes the part pertaining to keyboards, part 7. +LDML itself has several parts which describe diferent aspects of locale data. +This document describes the part pertaining to keyboards, part 7. ## File Structure -Source files have the **.xml** extension and are [XML] (text) files. Any -text editor can be used. An editor which understands XML and can highlight -syntax is preferred, such as that built into Keyman Developer. +Source files have the **.xml** extension and are [XML] (text) files. Any text +editor can be used. An editor which understands XML and can highlight syntax is +preferred, such as that built into Keyman Developer. ### Attributes and Escaping @@ -21,26 +21,25 @@ The LDML structure does not use any "element text", all text is in attributes. Attributes are opened and closed with double quotes `"`. Many attributes support escaping. That is, if you need to use a double quote -within an attribute, the double quote must be escaped. -For example, for a string variable with the value `I said, "yes"` it could be accomplished as shown: +within an attribute, the double quote must be escaped. For example, for a string +variable with the value `I said, "yes"` it could be accomplished as shown: ```xml ``` This notation is described in [Unicode UTS #18 section 1.1][UTS18escaping] and -consists of `\u{` followed by 1-6 hex digits and closed with `}`. -`\u{1E8CA}` and `\u{1e8CA}` and `\u{1e8Ca}` all refer to -U+1E8CA 𞣊 "MENDE KIKAKUI DIGIT FOUR". Upper and lower case does not matter. +consists of `\u{` followed by 1-6 hex digits and closed with `}`. `\u{1E8CA}` +and `\u{1e8CA}` and `\u{1e8Ca}` all refer to U+1E8CA 𞣊 "MENDE KIKAKUI DIGIT +FOUR". Upper and lower case does not matter. -Escaping is not allowed everywhere. -A double quote is not valid as the id of a key, for example, so the ` @@ -48,9 +47,8 @@ they processed by any code. this--> ``` -You can use comments to temporarily remove an element from processing. -The following "key" element is commented out, and so is not a part of -the keyboard. +You can use comments to temporarily remove an element from processing. The +following "key" element is commented out, and so is not a part of the keyboard. ```xml @@ -58,9 +56,8 @@ the keyboard. ### XML Prologue -As an XML file, the XML prologue is needed. -The prologue should be exactly as shown. -(A DTD not used.) +As an XML file, the XML prologue is needed. The prologue should be exactly as +shown. (A DTD not used.) ```xml @@ -70,15 +67,15 @@ The prologue should be exactly as shown. The root element of a keyboard file is the [`keyboard3`][keyboard3] element. -Note the `xmlns` and `conformsTo` elements both refer to a version of CLDR, -in this case v47. For compatibility, you should set these to the earliest possible +Note the `xmlns` and `conformsTo` elements both refer to a version of CLDR, in +this case v47. For compatibility, you should set these to the earliest possible version number. -The `locale` attribute is the _primary_ [BCP 47] locale for the keyboard. -See [choosing a locale](locales) for more information about choosing -locale id(s) for your keyboard. +The `locale` attribute is the _primary_ [BCP 47] locale for the keyboard. See +[choosing a locale](locales) for more information about choosing locale id(s) +for your keyboard. ```xml ` in UTS#35 Part 7][tr35-element-display] -[tr35-element-display]: https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-display +[tr35-element-display]: + https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-display diff --git a/developer/ldml/reference/displayOptions.md b/developer/ldml/reference/displayOptions.md index 27e33cb8f..5e29422f8 100644 --- a/developer/ldml/reference/displayOptions.md +++ b/developer/ldml/reference/displayOptions.md @@ -4,7 +4,8 @@ title: displayOptions ## Summary -The **`displayOptions`** element is used to provide setting information for keytop displays. +The **`displayOptions`** element is used to provide setting information for +keytop displays. ## Syntax @@ -15,8 +16,7 @@ The **`displayOptions`** element is used to provide setting information for keyt ### Attributes -`id` -: The … +`id` : The … ## Description @@ -41,7 +41,9 @@ The `displayOptions` element was added in LDML v46 ## See Also -- LDML Specification: [`` in UTS#35 Part 7][tr35-element-displayOptions] +- LDML Specification: [`` in UTS#35 Part + 7][tr35-element-displayOptions] -[tr35-element-displayOptions]: https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-displayoptions +[tr35-element-displayOptions]: + https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-displayoptions diff --git a/developer/ldml/reference/displays.md b/developer/ldml/reference/displays.md index fa2cec48a..b1f109b84 100644 --- a/developer/ldml/reference/displays.md +++ b/developer/ldml/reference/displays.md @@ -4,7 +4,8 @@ title: displays ## Summary -The **`displays`** element contains a collection of [``](display) elements as well as an optional [``](displayOptions) element. +The **`displays`** element contains a collection of [``](display) +elements as well as an optional [``](displayOptions) element. ## Syntax @@ -15,12 +16,13 @@ The **`displays`** element contains a collection of [``](display) eleme ### Attributes -`id` -: The … +`id` : The … ## Description -The `displays` element is used to contain all [``](key) elements and the optional [``](displayOptions) element for the keyboard. There may only be one of these elements. +The `displays` element is used to contain all [``](key) elements and +the optional [``](displayOptions) element for the keyboard. +There may only be one of these elements. ## Examples @@ -43,5 +45,6 @@ The `displays` element was added in LDML v46 - LDML Specification: [`` in UTS#35 Part 7][tr35-element-displays] -[tr35-element-displays]: https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-displays +[tr35-element-displays]: + https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-displays diff --git a/developer/ldml/reference/flick.md b/developer/ldml/reference/flick.md index 6d61e4022..c47bd306d 100644 --- a/developer/ldml/reference/flick.md +++ b/developer/ldml/reference/flick.md @@ -15,14 +15,16 @@ The **`flick`** element represents a set of possible flick gestures. ### Attributes -`id` -: The identifier for this flick. Only one flick may have this identifier, but it doesn't have to be diffrent from any other kinds of identifiers. +`id` : The identifier for this flick. Only one flick may have this identifier, +but it doesn't have to be diffrent from any other kinds of identifiers. ## Description -The **`flick`** element represents a set of possible flick gestures which can result in output text. +The **`flick`** element represents a set of possible flick gestures which can +result in output text. -The element is referenced by its id, allowing multiple [``](key) elements to reference and reuse the same flick set. +The element is referenced by its id, allowing multiple [``](key) elements +to reference and reuse the same flick set. ## Examples @@ -45,5 +47,6 @@ The `flick` element was added in LDML v46 - LDML Specification: [`` in UTS#35 Part 7][tr35-element-flick] -[tr35-element-flick]: https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-flick +[tr35-element-flick]: + https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-flick diff --git a/developer/ldml/reference/flickSegment.md b/developer/ldml/reference/flickSegment.md index 10b7e84e8..657a5a4bd 100644 --- a/developer/ldml/reference/flickSegment.md +++ b/developer/ldml/reference/flickSegment.md @@ -4,7 +4,8 @@ title: flickSegment ## Summary -The **`flickSegment`** element represents one particular set of gestures which will produce a specific output. +The **`flickSegment`** element represents one particular set of gestures which +will produce a specific output. ## Syntax @@ -15,16 +16,20 @@ The **`flickSegment`** element represents one particular set of gestures which w ### Attributes -`id` -: The … +`id` : The … ## Description -The `flickSegment` element is used to represent one set of gestures (an ordered path), and their output. For example, "Sliding the touch North produces `A`". It could include more than one keyword, such as "Sliding the touch West and then South produces `B`". +The `flickSegment` element is used to represent one set of gestures (an ordered +path), and their output. For example, "Sliding the touch North produces `A`". +It could include more than one keyword, such as "Sliding the touch West and then +South produces `B`". ### Directions -The following table attempts to show the eight directions supported by the format, relative to the center (•). So `nw` for Northwest means diagonally Up-and-Left, whereas `e` for East means directly to the right. +The following table attempts to show the eight directions supported by the +format, relative to the center (•). So `nw` for Northwest means diagonally +Up-and-Left, whereas `e` for East means directly to the right. | | | | |------|-----|------| @@ -51,7 +56,9 @@ The `flickSegment` element was added in LDML v46 ## See Also -- LDML Specification: [`` in UTS#35 Part 7][tr35-element-flickSegment] +- LDML Specification: [`` in UTS#35 Part + 7][tr35-element-flickSegment] -[tr35-element-flickSegment]: https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-flicksegment +[tr35-element-flickSegment]: + https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-flicksegment diff --git a/developer/ldml/reference/flicks.md b/developer/ldml/reference/flicks.md index 4aaa691ac..7d07ad90c 100644 --- a/developer/ldml/reference/flicks.md +++ b/developer/ldml/reference/flicks.md @@ -16,12 +16,12 @@ The **`flicks`** element contains a collection of [``](flick) elements. ### Attributes -`id` -: The … +`id` : The … ## Description -The `flicks` element is used to contain all [``](flick) elements for the keyboard. There may only be one of these elements. +The `flicks` element is used to contain all [``](flick) elements for the +keyboard. There may only be one of these elements. ## Examples @@ -45,5 +45,6 @@ The `flicks` element was added in LDML v46 - LDML Specification: [`` in UTS#35 Part 7][tr35-element-flicks] -[tr35-element-flicks]: https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-flicks +[tr35-element-flicks]: + https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-flicks diff --git a/developer/ldml/reference/form.md b/developer/ldml/reference/form.md index 82800f3a3..6c2cb8c71 100644 --- a/developer/ldml/reference/form.md +++ b/developer/ldml/reference/form.md @@ -4,7 +4,8 @@ title: form ## Summary -The **`form`** element is used to define or override the scan code layout of a hardware keyboard. +The **`form`** element is used to define or override the scan code layout of a +hardware keyboard. ## Syntax @@ -17,14 +18,15 @@ Parent Element: [``](forms) ### Attributes -`id` -: The … +`id` : The … ## Description -The `form` element is used to define or override the scan code layout of a hardware keyboard. +The `form` element is used to define or override the scan code layout of a +hardware keyboard. -Note that keyboard developers will not normally need or want to use this element, but rather to use the pre-defined hardware forms. +Note that keyboard developers will not normally need or want to use this +element, but rather to use the pre-defined hardware forms. ## Examples @@ -47,5 +49,6 @@ The `form` element was added in LDML v46 - LDML Specification: [`
` in UTS#35 Part 7][tr35-element-form] -[tr35-element-form]: https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-form +[tr35-element-form]: + https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-form diff --git a/developer/ldml/reference/forms.md b/developer/ldml/reference/forms.md index efb8db2c2..2f4d36983 100644 --- a/developer/ldml/reference/forms.md +++ b/developer/ldml/reference/forms.md @@ -15,12 +15,12 @@ The **`forms`** element contains `form` elements. ### Attributes -`id` -: The … +`id` : The … ## Description -The `forms` element is used to contain the [`form`](form) elements for the keyboard. There may only be one `forms` element in the file. +The `forms` element is used to contain the [`form`](form) elements for the +keyboard. There may only be one `forms` element in the file. ## Examples @@ -44,5 +44,6 @@ The `forms` element was added in LDML v46 - LDML Specification: [`` in UTS#35 Part 7][tr35-element-forms] -[tr35-element-forms]: https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-forms +[tr35-element-forms]: + https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-forms diff --git a/developer/ldml/reference/import.md b/developer/ldml/reference/import.md index f8efa8179..27f86afcc 100644 --- a/developer/ldml/reference/import.md +++ b/developer/ldml/reference/import.md @@ -4,7 +4,8 @@ title: import ## Summary -The **`import`** element is used to import elements from another file at this location. +The **`import`** element is used to import elements from another file at this +location. ## Syntax @@ -15,8 +16,7 @@ The **`import`** element is used to import elements from another file at this lo ### Attributes -`id` -: The … +`id` : The … ## Description @@ -43,5 +43,6 @@ The `import` element was added in LDML v46 - LDML Specification: [`` in UTS#35 Part 7][tr35-element-import] -[tr35-element-import]: https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-import +[tr35-element-import]: + https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-import diff --git a/developer/ldml/reference/index.md b/developer/ldml/reference/index.md index f3a86ec91..dca4662b5 100644 --- a/developer/ldml/reference/index.md +++ b/developer/ldml/reference/index.md @@ -2,95 +2,81 @@ title: LDML Reference --- -[``](display) -: Used to override the display of keytops. +[``](display) : Used to override the display of keytops. -[``](displayOptions) -: Modifies overall settings for keytop display. +[``](displayOptions) : Modifies overall settings for keytop +display. -[``](displays) -: Collection of [``](display) elements as well as an optional [``](displayOptions) element. +[``](displays) : Collection of [``](display) elements as +well as an optional [``](displayOptions) element. -[``](flick) -: A set of possible flick gestures which each may produce different output. +[``](flick) : A set of possible flick gestures which each may produce +different output. -[``](flicks) -: Collection of [``](flick) elements +[``](flicks) : Collection of [``](flick) elements -[``](flickSegment) -: One particular set of gestures which will produce a specific output. +[``](flickSegment) : One particular set of gestures which will +produce a specific output. -[``](form) -: Override the scan code layout of a hardware keyboard. +[``](form) : Override the scan code layout of a hardware keyboard. -[``](forms) -: Collection of [``](form) elements +[``](forms) : Collection of [``](form) elements -[``](import) -: Used to import elements from another file to this location. +[``](import) : Used to import elements from another file to this +location. -[``](info) -: Contains additional metadata about this keyboard. +[``](info) : Contains additional metadata about this keyboard. -[``](key) -: A single key in the keybag. +[``](key) : A single key in the keybag. -[``](keyboard3) -: Top level element +[``](keyboard3) : Top level element -[``](keys) -: The keybag, a collection of [``](key) elements +[``](keys) : The keybag, a collection of [``](key) elements -[``](layer) -: A single group of rows of keys, associated with a modifier/shift state. +[``](layer) : A single group of rows of keys, associated with a +modifier/shift state. -[``](layers) -: Collection of [``](layer) elements for a certain hardware or touch layout form factor. +[``](layers) : Collection of [``](layer) elements for a certain +hardware or touch layout form factor. -[``](locale) -: An additional locale this keyboard can support. +[``](locale) : An additional locale this keyboard can support. -[``](locales) -: Collection of [``](locale) elements indicating additional supported locales. +[``](locales) : Collection of [``](locale) elements +indicating additional supported locales. -[``](reorder) -: An element providing weighting rules for correcting the order of characters within a syllable. +[``](reorder) : An element providing weighting rules for correcting +the order of characters within a syllable. -[``](row) -: A row of [``](key) elements. +[``](row) : A row of [``](key) elements. -[``](scanCodes) -: A row of scan code information used for a custom [``](form). +[``](scanCodes) : A row of scan code information used for a custom +[``](form). -[``](set) -: A variable type representing a group of characters or strings. +[``](set) : A variable type representing a group of characters or +strings. -[``](settings) -: An element provides additional settings for the keyboard. +[``](settings) : An element provides additional settings for the +keyboard. -[``](special) -: A element used for extensions to the keyboard format. +[``](special) : A element used for extensions to the keyboard format. -[``](string) -: A variable type representing a single character string. +[``](string) : A variable type representing a single character string. -[``](transform) -: An element representing a single transform rule. +[``](transform) : An element representing a single transform rule. -[``](transformGroup) -: An element representing a group of [transform](transform) or [reorder](reorder) element. +[``](transformGroup) : An element representing a group of +[transform](transform) or [reorder](reorder) element. -[``](transforms) -: Collection of [``](transformGroup) elements +[``](transforms) : Collection of +[``](transformGroup) elements -[``](uset) -: A variable type representing a set of characters which supports ranges and boolean operations. +[``](uset) : A variable type representing a set of characters which +supports ranges and boolean operations. -[``](variables) -: Provides variables to be used in substitutions in other elements +[``](variables) : Provides variables to be used in substitutions in +other elements -[``](version) -: Provides information about the keyboard's version. +[``](version) : Provides information about the keyboard's version. ## See also diff --git a/developer/ldml/reference/info.md b/developer/ldml/reference/info.md index fc92d25a1..319badb92 100644 --- a/developer/ldml/reference/info.md +++ b/developer/ldml/reference/info.md @@ -15,8 +15,7 @@ The **`info`** element contains additional metadata about this keyboard. ### Attributes -`id` -: The … +`id` : The … ## Description @@ -43,5 +42,6 @@ The `info` element was added in LDML v46 - LDML Specification: [`` in UTS#35 Part 7][tr35-element-info] -[tr35-element-info]: https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-info +[tr35-element-info]: + https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-info diff --git a/developer/ldml/reference/key.md b/developer/ldml/reference/key.md index b1b815191..84baad139 100644 --- a/developer/ldml/reference/key.md +++ b/developer/ldml/reference/key.md @@ -15,12 +15,12 @@ The **`key`** element represents a single key in the keybag. ### Attributes -`id` -: The … +`id` : The … ## Description -The `key` element is used to represent a single key in the keybag. Keys are referenced from layers and from gestures. +The `key` element is used to represent a single key in the keybag. Keys are +referenced from layers and from gestures. ## Examples @@ -43,5 +43,6 @@ The `key` element was added in LDML v46 - LDML Specification: [`` in UTS#35 Part 7][tr35-element-key] -[tr35-element-key]: https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-key +[tr35-element-key]: + https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-key diff --git a/developer/ldml/reference/keyboard3.md b/developer/ldml/reference/keyboard3.md index 6a57c2e92..a75c02a39 100644 --- a/developer/ldml/reference/keyboard3.md +++ b/developer/ldml/reference/keyboard3.md @@ -16,18 +16,27 @@ The **`keyboard3`** element is the top level element in each LDML Keyboard file. ### Attributes -`conformsTo` - Required -: This indicates the minimum supported version number of CLDR that this file conforms to. In other words, this file may not use features from CLDR versions after this number. This must be a whole number such as "46". See [CLDR Releases] for a current list of CLDR versions. Authors should use the _minimum_ possible number here so that the keyboard is the most widely usable. - -`draft` - Optional -: For keyboards which are contributed to CLDR itself, this indicates the approval level of the [CLDR keyboard process]. For keyboard authors, it is best to omit this attribute or set it to `contributed`. Other possible values include `approved`, `unconfirmed`, and `provisional`. - -`locale` - Required -: This attribute specifies the [BCP 47] tag used for the primary locale for this keyboard. The [`locales`](./locales) element can be used to specify additional locales, however, at least one locale must be specified in the `locale` attribute. +`conformsTo` - Required : This indicates the minimum supported version number +of CLDR that this file conforms to. In other words, this file may not use +features from CLDR versions after this number. This must be a whole number such +as "46". See [CLDR Releases] for a current list of CLDR versions. Authors should +use the _minimum_ possible number here so that the keyboard is the most widely +usable. + +`draft` - Optional : For keyboards which are contributed to CLDR itself, this +indicates the approval level of the [CLDR keyboard process]. For keyboard +authors, it is best to omit this attribute or set it to `contributed`. Other +possible values include `approved`, `unconfirmed`, and `provisional`. + +`locale` - Required : This attribute specifies the [BCP 47] tag used for the +primary locale for this keyboard. The [`locales`](./locales) element can be used +to specify additional locales, however, at least one locale must be specified in +the `locale` attribute. ## Description -The `keyboard3` element contains all other elements of the keyboard, and its attributes provide important metadata about the keyboard. +The `keyboard3` element contains all other elements of the keyboard, and its +attributes provide important metadata about the keyboard. It is named "3" because it is the third version of the LDML Keyboard format. @@ -43,15 +52,18 @@ It is named "3" because it is the third version of the LDML Keyboard format. ## Version history -The `keyboard3` element was added in LDML v46. The `draft` attribute was added in LDML v47. +The `keyboard3` element was added in LDML v46. The `draft` attribute was added +in LDML v47. [CLDR Releases]: https://cldr.unicode.org/index/downloads -[CLDR keyboard process]: https://cldr.unicode.org/index/process/keyboard-repository-process +[CLDR keyboard process]: + https://cldr.unicode.org/index/process/keyboard-repository-process [BCP 47]: ../../current-version/reference/bcp-47 ## See Also - LDML Specification: [`` in UTS#35 Part 7][tr35-element-keyboard3] -[tr35-element-keyboard3]: https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-keyboard3 +[tr35-element-keyboard3]: + https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-keyboard3 diff --git a/developer/ldml/reference/keys.md b/developer/ldml/reference/keys.md index ccfd86815..879340f3b 100644 --- a/developer/ldml/reference/keys.md +++ b/developer/ldml/reference/keys.md @@ -15,12 +15,12 @@ The **`keys`** element… ### Attributes -`id` -: The … +`id` : The … ## Description -The `keys` element is used to contain all [``](key) elements for the keyboard. There may only be one of these elements. +The `keys` element is used to contain all [``](key) elements for the +keyboard. There may only be one of these elements. ## Examples @@ -43,5 +43,6 @@ The `keys` element was added in LDML v46 - LDML Specification: [`` in UTS#35 Part 7][tr35-element-keys] -[tr35-element-keys]: https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-keys +[tr35-element-keys]: + https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-keys diff --git a/developer/ldml/reference/layer.md b/developer/ldml/reference/layer.md index 0c6b74117..63f61a9d0 100644 --- a/developer/ldml/reference/layer.md +++ b/developer/ldml/reference/layer.md @@ -15,12 +15,13 @@ The **`layer`** element represents a single layer of the keyboard. ### Attributes -`id` -: The … +`id` : The … ## Description -The `layer` element is used to represent a single layer of the keyboard, such as a certain modifier combination. It is contained within the layers element, and it contains one or more row elements. +The `layer` element is used to represent a single layer of the keyboard, such as +a certain modifier combination. It is contained within the layers element, and +it contains one or more row elements. ## Examples @@ -43,5 +44,6 @@ The `layer` element was added in LDML v46 - LDML Specification: [`` in UTS#35 Part 7][tr35-element-layer] -[tr35-element-layer]: https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-layer +[tr35-element-layer]: + https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-layer diff --git a/developer/ldml/reference/layers.md b/developer/ldml/reference/layers.md index bb100c0ec..64c58325e 100644 --- a/developer/ldml/reference/layers.md +++ b/developer/ldml/reference/layers.md @@ -15,12 +15,12 @@ The **`layers`** element… ### Attributes -`id` -: The … +`id` : The … ## Description -The `layers` element is used to contain all [``](layer) elements for the keyboard. There may only be one of these elements. +The `layers` element is used to contain all [``](layer) elements for the +keyboard. There may only be one of these elements. ## Examples @@ -43,5 +43,6 @@ The `layers` element was added in LDML v46 - LDML Specification: [`` in UTS#35 Part 7][tr35-element-layers] -[tr35-element-layers]: https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-layers +[tr35-element-layers]: + https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-layers diff --git a/developer/ldml/reference/locale.md b/developer/ldml/reference/locale.md index 20b661721..64f385b9d 100644 --- a/developer/ldml/reference/locale.md +++ b/developer/ldml/reference/locale.md @@ -15,8 +15,7 @@ The **`locale`** element… ### Attributes -`id` -: The … +`id` : The … ## Description @@ -43,5 +42,6 @@ The `locale` element was added in LDML v46 - LDML Specification: [`` in UTS#35 Part 7][tr35-element-locale] -[tr35-element-locale]: https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-locale +[tr35-element-locale]: + https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-locale diff --git a/developer/ldml/reference/locales.md b/developer/ldml/reference/locales.md index 6df106c96..bb9e2972f 100644 --- a/developer/ldml/reference/locales.md +++ b/developer/ldml/reference/locales.md @@ -15,8 +15,7 @@ The **`locales`** element… ### Attributes -`id` -: The … +`id` : The … ## Description @@ -43,5 +42,6 @@ The `locales` element was added in LDML v46 - LDML Specification: [`` in UTS#35 Part 7][tr35-element-locales] -[tr35-element-locales]: https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-locales +[tr35-element-locales]: + https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-locales diff --git a/developer/ldml/reference/reorder.md b/developer/ldml/reference/reorder.md index 552ed0ed8..e69543852 100644 --- a/developer/ldml/reference/reorder.md +++ b/developer/ldml/reference/reorder.md @@ -15,8 +15,7 @@ The **`reorder`** element… ### Attributes -`id` -: The … +`id` : The … ## Description @@ -43,5 +42,6 @@ The `reorder` element was added in LDML v46 - LDML Specification: [`` in UTS#35 Part 7][tr35-element-reorder] -[tr35-element-reorder]: https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-reorder +[tr35-element-reorder]: + https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-reorder diff --git a/developer/ldml/reference/row.md b/developer/ldml/reference/row.md index f4c331dba..9726de5f4 100644 --- a/developer/ldml/reference/row.md +++ b/developer/ldml/reference/row.md @@ -15,8 +15,7 @@ The **`row`** element… ### Attributes -`id` -: The … +`id` : The … ## Description @@ -43,5 +42,6 @@ The `row` element was added in LDML v46 - LDML Specification: [`` in UTS#35 Part 7][tr35-element-row] -[tr35-element-row]: https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-row +[tr35-element-row]: + https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-row diff --git a/developer/ldml/reference/set.md b/developer/ldml/reference/set.md index b299c4010..3635ba0d4 100644 --- a/developer/ldml/reference/set.md +++ b/developer/ldml/reference/set.md @@ -15,8 +15,7 @@ The **`set`** element… ### Attributes -`id` -: The … +`id` : The … ## Description @@ -43,5 +42,6 @@ The `set` element was added in LDML v46 - LDML Specification: [`` in UTS#35 Part 7][tr35-element-set] -[tr35-element-set]: https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-set +[tr35-element-set]: + https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-set diff --git a/developer/ldml/reference/settings.md b/developer/ldml/reference/settings.md index 8797eb9fb..3437f2323 100644 --- a/developer/ldml/reference/settings.md +++ b/developer/ldml/reference/settings.md @@ -15,8 +15,7 @@ The **`settings`** element… ### Attributes -`id` -: The … +`id` : The … ## Description @@ -43,5 +42,6 @@ The `settings` element was added in LDML v46 - LDML Specification: [`` in UTS#35 Part 7][tr35-element-settings] -[tr35-element-settings]: https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-settings +[tr35-element-settings]: + https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-settings diff --git a/developer/ldml/reference/special.md b/developer/ldml/reference/special.md index 4f99ec8b6..cce6bf927 100644 --- a/developer/ldml/reference/special.md +++ b/developer/ldml/reference/special.md @@ -15,8 +15,7 @@ The **`special`** element… ### Attributes -`id` -: The … +`id` : The … ## Description diff --git a/developer/ldml/reference/string.md b/developer/ldml/reference/string.md index 084dd39bc..e84f92b2b 100644 --- a/developer/ldml/reference/string.md +++ b/developer/ldml/reference/string.md @@ -15,8 +15,7 @@ The **`string`** element… ### Attributes -`id` -: The … +`id` : The … ## Description @@ -43,5 +42,6 @@ The `string` element was added in LDML v46 - LDML Specification: [`` in UTS#35 Part 7][tr35-element-string] -[tr35-element-string]: https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-string +[tr35-element-string]: + https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-string diff --git a/developer/ldml/reference/transform.md b/developer/ldml/reference/transform.md index c1a399d25..0c2aca046 100644 --- a/developer/ldml/reference/transform.md +++ b/developer/ldml/reference/transform.md @@ -15,8 +15,7 @@ The **`transform`** element… ### Attributes -`id` -: The … +`id` : The … ## Description @@ -43,5 +42,6 @@ The `transform` element was added in LDML v46 - LDML Specification: [`` in UTS#35 Part 7][tr35-element-transform] -[tr35-element-transform]: https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-transform +[tr35-element-transform]: + https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-transform diff --git a/developer/ldml/reference/transformGroup.md b/developer/ldml/reference/transformGroup.md index 234cc92b6..ab1ca5712 100644 --- a/developer/ldml/reference/transformGroup.md +++ b/developer/ldml/reference/transformGroup.md @@ -15,8 +15,7 @@ The **`transformGroup`** element… ### Attributes -`id` -: The … +`id` : The … ## Description @@ -41,7 +40,9 @@ The `transformGroup` element was added in LDML v46 ## See Also -- LDML Specification: [`` in UTS#35 Part 7][tr35-element-transformGroup] +- LDML Specification: [`` in UTS#35 Part + 7][tr35-element-transformGroup] -[tr35-element-transformGroup]: https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-transformgroup +[tr35-element-transformGroup]: + https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-transformgroup diff --git a/developer/ldml/reference/transforms.md b/developer/ldml/reference/transforms.md index 261d38b97..aabd46374 100644 --- a/developer/ldml/reference/transforms.md +++ b/developer/ldml/reference/transforms.md @@ -15,8 +15,7 @@ The **`transforms`** element… ### Attributes -`id` -: The … +`id` : The … ## Description @@ -43,5 +42,6 @@ The `transforms` element was added in LDML v46 - LDML Specification: [`` in UTS#35 Part 7][tr35-element-transforms] -[tr35-element-transforms]: https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-transforms +[tr35-element-transforms]: + https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-transforms diff --git a/developer/ldml/reference/uset.md b/developer/ldml/reference/uset.md index e112babc5..00a6c9389 100644 --- a/developer/ldml/reference/uset.md +++ b/developer/ldml/reference/uset.md @@ -15,8 +15,7 @@ The **`uset`** element… ### Attributes -`id` -: The … +`id` : The … ## Description @@ -43,5 +42,6 @@ The `uset` element was added in LDML v46 - LDML Specification: [`` in UTS#35 Part 7][tr35-element-uset] -[tr35-element-uset]: https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-uset +[tr35-element-uset]: + https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-uset diff --git a/developer/ldml/reference/variables.md b/developer/ldml/reference/variables.md index aac5ab918..256808f0b 100644 --- a/developer/ldml/reference/variables.md +++ b/developer/ldml/reference/variables.md @@ -15,8 +15,7 @@ The **`variables`** element… ### Attributes -`id` -: The … +`id` : The … ## Description @@ -43,5 +42,6 @@ The `variables` element was added in LDML v46 - LDML Specification: [`` in UTS#35 Part 7][tr35-element-variables] -[tr35-element-variables]: https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-variables +[tr35-element-variables]: + https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-variables diff --git a/developer/ldml/reference/version.md b/developer/ldml/reference/version.md index 76c0f7d10..ac8b4494e 100644 --- a/developer/ldml/reference/version.md +++ b/developer/ldml/reference/version.md @@ -15,8 +15,7 @@ The **`version`** element… ### Attributes -`id` -: The … +`id` : The … ## Description @@ -43,5 +42,6 @@ The `version` element was added in LDML v46 - LDML Specification: [`` in UTS#35 Part 7][tr35-element-version] -[tr35-element-version]: https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-version +[tr35-element-version]: + https://www.unicode.org/reports/tr35/tr35-keyboards.html#element-version