42 releases (19 breaking)
0.22.0 | Jan 31, 2025 |
---|---|
0.21.1 | Sep 25, 2024 |
0.20.0 | Sep 13, 2024 |
0.19.0 | Jun 30, 2024 |
0.3.0 | Mar 8, 2023 |
#515 in Parser implementations
137 downloads per month
130KB
3K
SLoC
Libdof
The .dof file format is a json compatible format with specified fields describing any keyboard layout, including some defaults.
It has a set amount of (sometimes optional*
) fields:
-
name
: name of the layout -
authors[]*
: authors of the layout -
year*
: year the layout was created. -
description*
: string containing a description of the layout. -
link*
: url to a page with more information about the layout. -
layers{}
: specifies all layers on the layout. They're of the form ofname: <layer>
where each layer is an array of rows specified by a string consisting of keys delimited by any amount of whitespace. They work like the following:-
If the string length is 1, output:
- An empty key when it's equal to
~
, - A transparent key when it's equal to
*
, which refers to the value on the main layer. This is equivalent to~
when on the main layer, - Enter when it's equal to
\n
, - Tab when it's equal to
\t
, - A character key otherwise.
- An empty key when it's equal to
-
If the string length is more than 1, output:
~
and*
characters if it contains\\~
and\\*
respectively,- A special key like shift or space when provided with specific identifiers which can be found at the bottom of the document,
- A layer key if it leads with an
@
, for example@altgr
, - A magic key if it leads with an
&
, for example&mgc
, - A word key with its first character removed if it leads with
#
,\\#
or\\@
, for example\\@altgr
would output@altgr
rather than become an altgr layer key, - A word key, which outputs multiple characters at the same time, otherwise.
-
If the string is any of these modifier values:
esc
=>Esc
,repeat
,rpt
=>Repeat
,space
,spc
=>Space
,tab
,tb
=>Tab
,enter
,return
,ret
,ent
,rt
=>Enter
,shift
,shft
,sft
,st
=>Shift
,caps
,cps
,cp
=>Caps
,ctrl
,ctl
,ct
=>Ctrl
,alt
,lalt
,ralt
,lt
=>Alt
,meta
,mta
,met
,mt
,super
,sup
,sp
=>Meta
,fn
=>Fn
,backspace
,bksp
,bcsp
,bsp
=>Backspace
,del
=>Del
All layer names are allowed though two are reserved:
main
(mandatory)shift
While
main
is mandatory to be filled,shift
can be elided and will follow qwerty's capitalization scheme when unspecified. Any shape is allowed, but if you use a standard 3x10 shape you may be able to forego specifying a custom finger map and keyboard as well. -
-
board
: specifies the keyboard type the layout is made for. Three formats are accepted here:-
ansi
,iso
,ortho
,colstag
specify preset boards, which by default place the provided as if they are a standard 3x10 matrix. -
A relative board, which specifies a keyboard that has horizontal rows, but isn't ortholinear; ansi and iso boards fall into this category. The way they're specified is with an array of strings that contain something like
"k 2k 3"
, wherek
is a key of 1x1,<number>k
is a key with a width ofnumber
, and simply a number specifies empty space, used for split ortho boards for example. -
A full specification. They're specified as an array of arrays, containing each key as a string. Each string contains 2 to four numbers specified by whitespace:
"1 2.5"
specifies(x, y) = (1, 2.5)
, where further numbers specify the width and height respectively.
-
-
anchor[]*
: Specifies where on the physical board the actual layers 'anchor' on. For example, if you wanted to place a 3x10 matrix on anansi
oriso
board, the anchor is one from the top, and one from the left so[1, 1]
. There are default anchors for the preset boards, but you are required to provide an anchor for custom boards. -
fingering
: specifies which finger presses which key. For known boards (iso
,ansi
etc) you can specify a known name:board: "ansi"
where the main layer shape starts at qwertyq
, allowed fingerings aretraditional
,standard
,angle
board: "iso"
where the main layer shape starts at qwertyq
and the bottom row includes the iso key, allowed fingerings aretraditional
,standard
,angle
board: "ortho"
,board: "colstag"
, allowed fingerings aretraditional
,standard
If you use a custom keyboard, you can specify fingering the same way you would a layer, but with fingers. Layer and fingering shapes should match though, as it will error otherwise.
LP
or0
: left pinkyLR
or1
: left ringLM
or2
: left middleLI
or3
: left indexLT
or4
: left thumbRT
or5
: right thumbRI
or6
: right indexRM
or7
: right middleRR
or8
: right ringRP
or9
: right pinky
-
combos{}
: Allows you to specify combos on a layer by layer basis. This works the same as withlayers
, except you now specify an array of combos. Say you specified"k k-2": "rpt"
for themain
layer, this means that if you pressed the first (starting top-left) and secondk
together, they output the repeat key. Index0
and1
are equivalent here, and do not have to be specified. -
magic{}
: Allows you to specify magic key(s) for the layout. Every magic key has a label, which has a map inside. You can then specify rules as being"leading": "output after magic press"
.
For all of these, it might be worth it to check out the example dofs.
Dependencies
~0.9–1.5MB
~33K SLoC