Skip to content

Commit

Permalink
Implement dead key sequences. (#29)
Browse files Browse the repository at this point in the history
* Functionnal dead key sequences.
* Update keyhints correctly.
* Updated `layouts/fr(ergol).json` with ergolv0.99.2
* Added missing toml file (with makefile support)
* Fixed problems with original PR.
  • Loading branch information
Nuclear-Squid authored Jan 4, 2024
1 parent 67b3e40 commit 6fd0c9f
Show file tree
Hide file tree
Showing 7 changed files with 81 additions and 66 deletions.
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@ publish:
npm publish

layouts: layouts.yaml
@for file in layouts.yaml/*.yaml; do \
@for file in layouts.yaml/{*.yaml,*.toml}; do \
kalamine $$file --out "layouts/$$(basename $${file%.*}).json"; \
done
48 changes: 48 additions & 0 deletions layouts.yaml/fr(ergol).toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
name = "Ergo-L"
name8 = "ergol"
locale = "fr"
variant = "ergol"
description = "French (Ergo-L)"
author = "NuclearSquid"
url = "https://github.com/Nuclear-Squid/ergol"
geometry = "ERGO"
version = "0.99.2"

base = '''
╭╌╌╌╌╌┰─────┬─────┬─────┬─────┬─────┰─────┬─────┬─────┬─────┬─────┰╌╌╌╌╌┬╌╌╌╌╌╮
┆ ~ ┃ ! ¡ │ @ ‘ │ # ’ │ $ ¢ │ % ‰ ┃ ^ │ & │ * │ « │ » ┃ _ – ┆ + ± ┆
┆ ` ┃ 1 „ │ 2 “ │ 3 ” │ 4 £ │ 5 € ┃ 6 ¥ │ 7 ¤ │ 8 § │ 9 ¶ │ 0 ° ┃ / ÷ ┆ = ≠ ┆
╰╌╌╌╌╌╂─────┼─────┼─────┼─────┼─────╂─────┼─────┼─────┼─────┼─────╂╌╌╌╌╌┼╌╌╌╌╌┤
· ┃ Q │ C │ O │ P │ W ┃ J │ M │ D │** │ F ┃ { ┆ } ┆
· ┃ â │ ç │ œ │ ô │ ┃ │ µ │ _ │***¨ │ ŭ ┃ [ ┆ ] ┆
· ┠─────┼─────┼─────┼─────┼─────╂─────┼─────┼─────┼─────┼─────╂╌╌╌╌╌┼╌╌╌╌╌┤
· ┃ A │ S │ E │ N │ ; • ┃ L │ R │ T │ I │ U ┃ " ┆ | ┆
· ┃ à │ é │ è │ ê │ , · ┃ │ │ î │ û │ ù ┃ ' ┆ \ ┆
╭╌╌╌╌╌╂─────┼─────┼─────┼─────┼─────╂─────┼─────┼─────┼─────┼─────╂╌╌╌╌╌┴╌╌╌╌╌╯
┆ > ┃ Z │ X │ ? ¿ │ V │ B ┃ : │ H │ G │ Y │ K ┃ ·
┆ < ┃ æ │ ß │ - — │ ñ │ ┃ . … │ │ │ │ ┃ ·
╰╌╌╌╌╌┸─────┴─────┴─────┴─────┴─────┸─────┴─────┴─────┴─────┴─────┚ · · · · · ·
'''

altgr = '''
╭╌╌╌╌╌┰─────┬─────┬─────┬─────┬─────┰─────┬─────┬─────┬─────┬─────┰╌╌╌╌╌┬╌╌╌╌╌╮
┆ ┃ ¹ │ ² │ ³ │ ⁴ │ ⁵ ┃ ⁶ │ ⁷ │ ⁸ │ ⁹ │ ⁰ ┃ ┆ ┆
┆ ┃ ₁ │ ₂ │ ₃ │ ₄ │ ₅ ┃ ₆ │ ₇ │ ₈ │ ₉ │ ₀ ┃ ┆ ┆
╰╌╌╌╌╌╂─────┼─────┼─────┼─────┼─────╂─────┼─────┼─────┼─────┼─────╂╌╌╌╌╌┼╌╌╌╌╌┤
· ┃ │ ≤ │ ≥ │ *¤ │ ‰ ┃ *^ │ *µ │ × │ *´ │ *` ┃ ┆ ┆
· ┃ @ │ < │ > │ $ │ % ┃ ^ │ & │ * │ ' │ ` ┃ ┆ ┆
· ┠─────┼─────┼─────┼─────┼─────╂─────┼─────┼─────┼─────┼─────╂╌╌╌╌╌┼╌╌╌╌╌┤
· ┃ │ ⁽ │ ⁾ │ │ ≠ ┃ */ │ ± │ — │ ÷ │ *¨ ┃ ┆ ┆
· ┃ { │ ( │ ) │ } │ = ┃ \ │ + │ - │ / │ " ┃ ┆ ┆
╭╌╌╌╌╌╂─────┼─────┼─────┼─────┼─────╂─────┼─────┼─────┼─────┼─────╂╌╌╌╌╌┴╌╌╌╌╌╯
┆ ┃ *~ │ │ │ – │ ┃ ¦ │ ¬ │ *¸ │ │ ┃ ·
┆ ┃ ~ │ [ │ ] │ _ │ # ┃ | │ ! │ ; │ : │ ? ┃ ·
╰╌╌╌╌╌┸─────┴─────┴─────┴─────┴─────┸─────┴─────┴─────┴─────┴─────┚ · · · · · ·
'''

[spacebar]
shift = "\u202f" # NARROW NO-BREAK SPACE
altgr = "\u0020" # SPACE
altgr_shift = "\u00a0" # NO-BREAK SPACE
1dk = "\u2019" # RIGHT SINGLE QUOTATION MARK
1dk_shift = "\u2019" # RIGHT SINGLE QUOTATION MARK
45 changes: 0 additions & 45 deletions layouts.yaml/fr(ergol).yaml

This file was deleted.

24 changes: 13 additions & 11 deletions layouts/fr(ergol).json
Original file line number Diff line number Diff line change
Expand Up @@ -16,32 +16,32 @@
"KeyQ": [ "q", "Q", "@" ],
"KeyW": [ "c", "C", "<", "" ],
"KeyE": [ "o", "O", ">", "" ],
"KeyR": [ "p", "P", "$" ],
"KeyR": [ "p", "P", "$", "" ],
"KeyT": [ "w", "W", "%", "" ],
"KeyY": [ "j", "J", "^", "*^" ],
"KeyU": [ "m", "M", "&", "" ],
"KeyI": [ "d", "D", "*", "×" ],
"KeyO": [ "**", "*¨", "'", "" ],
"KeyO": [ "**", "**", "'", "" ],
"KeyP": [ "f", "F", "`", "*`" ],
"KeyA": [ "a", "A", "{" ],
"KeyS": [ "s", "S", "(", "" ],
"KeyD": [ "e", "E", ")", "" ],
"KeyF": [ "n", "N", "}" ],
"KeyG": [ ",", ";", "=", "" ],
"KeyH": [ "l", "L", "\\" ],
"KeyG": [ ",", ";", "=", "" ],
"KeyH": [ "l", "L", "\\", "*/" ],
"KeyJ": [ "r", "R", "+", "±" ],
"KeyK": [ "t", "T", "-", "" ],
"KeyL": [ "i", "I", "/", "÷" ],
"Semicolon": [ "u", "U", "\"", "" ],
"KeyZ": [ "z", "Z", "~", "*~" ],
"KeyX": [ "x", "X", "[" ],
"KeyC": [ "-", "?", "]" ],
"KeyV": [ "v", "V", "_" ],
"KeyV": [ "v", "V", "_", "" ],
"KeyB": [ "b", "B", "#" ],
"KeyN": [ ".", ":", "|", "¦" ],
"KeyM": [ "h", "H", "!" ],
"Comma": [ "g", "G", ";" ],
"Period": [ "y", "Y", ":", "¬" ],
"KeyM": [ "h", "H", "!", "¬" ],
"Comma": [ "g", "G", ";", "" ],
"Period": [ "y", "Y", ":" ],
"Slash": [ "k", "K", "?" ],
"Minus": [ "/", "_" ],
"Equal": [ "=", "+" ],
Expand All @@ -54,14 +54,16 @@
"Space": [ " ", "", " ", " " ]
},
"deadkeys": {
"**": { "**": "`", " ": "", " ": "", " ": "", "!": "¡", "1": "", "@": "", "2": "", "#": "", "3": "", "$": "¢", "4": "£", "%": "", "5": "", "6": "¥", "7": "¤", "8": "§", "9": "", "0": "°", "Q": "Â", "q": "â", "C": "Ç", "c": "ç", "O": "Œ", "o": "œ", "P": "Ô", "p": "ô", "m": "µ", "d": "_", "A": "À", "a": "à", "S": "É", "s": "é", "E": "È", "e": "è", "N": "Ê", "n": "ê", ";": "", ",": "·", "T": "Î", "t": "î", "I": "Û", "i": "û", "U": "Ù", "u": "ù", "X": "", "x": "ß", "?": "¿", "-": "", "V": "Ñ", "v": "ñ", ".": "", "_": "", "/": "÷", "+": "±", "=": "" },
"**": { "**": "", " ": "", " ": "", " ": "", "!": "¡", "1": "", "@": "", "2": "", "#": "", "3": "", "$": "¢", "4": "£", "%": "", "5": "", "6": "¥", "7": "¤", "8": "§", "9": "", "0": "°", "Q": "Â", "q": "â", "C": "Ç", "c": "ç", "O": "Œ", "o": "œ", "P": "Ô", "p": "ô", "m": "µ", "d": "_", "F": "Ŭ", "f": "ŭ", "A": "À", "a": "à", "S": "É", "s": "é", "E": "È", "e": "è", "N": "Ê", "n": "ê", ";": "", ",": "·", "T": "Î", "t": "î", "I": "Û", "i": "û", "U": "Ù", "u": "ù", "Z": "Æ", "z": "æ", "X": "", "x": "ß", "?": "¿", "-": "", "V": "Ñ", "v": "ñ", ".": "", "_": "", "/": "÷", "+": "±", "=": "" },
"*¨": { "*¨": "¨", " ": "\"", " ": "\"", " ": "\"", "A": "Ä", "a": "ä", "E": "Ë", "e": "ë", "H": "", "h": "", "I": "Ï", "i": "ï", "O": "Ö", "o": "ö", "t": "", "U": "Ü", "u": "ü", "W": "", "w": "", "X": "", "x": "", "Y": "Ÿ", "y": "ÿ" },
"*¤": { "*¤": "¤", " ": "¤", " ": "¤", " ": "¤", "A": "", "a": "؋", "B": "", "b": "฿", "C": "", "c": "¢", "D": "", "d": "", "E": "", "e": "", "F": "", "f": "ƒ", "G": "", "g": "", "H": "", "h": "", "I": "", "i": "", "K": "", "k": "", "L": "", "l": "£", "M": "", "m": "", "N": "", "n": "", "O": "", "o": "", "P": "", "p": "", "R": "", "r": "", "S": "$", "s": "", "T": "", "t": "", "U": "", "u": "", "W": "", "w": "", "Y": "", "y": "¥" },
"*^": { "*^": "^", " ": "^", " ": "^", " ": "^", "A": "Â", "a": "â", "C": "Ĉ", "c": "ĉ", "E": "Ê", "e": "ê", "G": "Ĝ", "g": "ĝ", "H": "Ĥ", "h": "ĥ", "I": "Î", "i": "î", "J": "Ĵ", "j": "ĵ", "O": "Ô", "o": "ô", "S": "Ŝ", "s": "ŝ", "U": "Û", "u": "û", "W": "Ŵ", "w": "ŵ", "Y": "Ŷ", "y": "ŷ", "Z": "", "z": "", "0": "", "1": "¹", "2": "²", "3": "³", "4": "", "5": "", "6": "", "7": "", "8": "", "9": "", "+": "", "-": "", "=": "" },
"*µ": { "*µ": "µ", " ": "µ", " ": "µ", " ": "µ", "A": "Α", "a": "α", "B": "Β", "b": "β", "D": "Δ", "d": "δ", "E": "Ε", "e": "ε", "F": "Φ", "f": "φ", "G": "Γ", "g": "γ", "H": "Η", "h": "η", "I": "Ι", "i": "ι", "J": "Θ", "j": "θ", "K": "Κ", "k": "κ", "L": "Λ", "l": "λ", "M": "Μ", "m": "μ", "N": "Ν", "n": "ν", "O": "Ο", "o": "ο", "P": "Π", "p": "π", "Q": "Χ", "q": "χ", "R": "Ρ", "r": "ρ", "S": "Σ", "s": "σ", "T": "Τ", "t": "τ", "U": "Υ", "u": "υ", "W": "Ω", "w": "ω", "X": "Ξ", "x": "ξ", "Y": "Ψ", "y": "ψ", "Z": "Ζ", "z": "ζ" },
"*´": { "*´": "´", " ": "'", " ": "'", " ": "'", "A": "Á", "a": "á", "C": "Ć", "c": "ć", "E": "É", "e": "é", "G": "Ǵ", "g": "ǵ", "I": "Í", "i": "í", "K": "", "k": "", "L": "Ĺ", "l": "ĺ", "M": "", "m": "ḿ", "N": "Ń", "n": "ń", "O": "Ó", "o": "ó", "P": "", "p": "", "R": "Ŕ", "r": "ŕ", "S": "Ś", "s": "ś", "U": "Ú", "u": "ú", "W": "", "w": "", "Y": "Ý", "y": "ý", "Z": "Ź", "z": "ź" },
"*`": { "*`": "`", " ": "`", " ": "`", " ": "`", "A": "À", "a": "à", "E": "È", "e": "è", "I": "Ì", "i": "ì", "N": "Ǹ", "n": "ǹ", "O": "Ò", "o": "ò", "U": "Ù", "u": "ù", "W": "", "w": "", "Y": "", "y": "" },
"*¸": { "*¸": "¸", " ": "¸", " ": "¸", " ": "¸", "C": "Ç", "c": "ç", "D": "", "d": "", "E": "Ȩ", "e": "ȩ", "G": "Ģ", "g": "ģ", "H": "", "h": "", "K": "Ķ", "k": "ķ", "L": "Ļ", "l": "ļ", "N": "Ņ", "n": "ņ", "R": "Ŗ", "r": "ŗ", "S": "Ş", "s": "ş", "T": "Ţ", "t": "ţ" },
"*~": { "*~": "~", " ": "~", " ": "~", " ": "~", "A": "Ã", "a": "ã", "E": "", "e": "", "I": "Ĩ", "i": "ĩ", "N": "Ñ", "n": "ñ", "O": "Õ", "o": "õ", "U": "Ũ", "u": "ũ", "V": "", "v": "", "Y": "", "y": "", "<": "", ">": "", "=": "" }
"*/": { "*/": "/", " ": "/", " ": "/", " ": "/", "A": "Ⱥ", "a": "", "B": "Ƀ", "b": "ƀ", "C": "Ȼ", "c": "ȼ", "D": "Đ", "d": "đ", "E": "Ɇ", "e": "ɇ", "G": "Ǥ", "g": "ǥ", "H": "Ħ", "h": "ħ", "I": "Ɨ", "i": "ɨ", "J": "Ɉ", "j": "ɉ", "L": "Ł", "l": "ł", "O": "Ø", "o": "ø", "P": "", "p": "", "R": "Ɍ", "r": "ɍ", "T": "Ŧ", "t": "ŧ", "U": "Ʉ", "u": "ʉ", "Y": "Ɏ", "y": "ɏ", "Z": "Ƶ", "z": "ƶ", "<": "", ">": "", "=": "" },
"*~": { "*~": "~", " ": "~", " ": "~", " ": "~", "A": "Ã", "a": "ã", "E": "", "e": "", "I": "Ĩ", "i": "ĩ", "N": "Ñ", "n": "ñ", "O": "Õ", "o": "õ", "U": "Ũ", "u": "ũ", "V": "", "v": "", "Y": "", "y": "", "<": "", ">": "", "=": "" },
"*¸": { "*¸": "¸", " ": "¸", " ": "¸", " ": "¸", "C": "Ç", "c": "ç", "D": "", "d": "", "E": "Ȩ", "e": "ȩ", "G": "Ģ", "g": "ģ", "H": "", "h": "", "K": "Ķ", "k": "ķ", "L": "Ļ", "l": "ļ", "N": "Ņ", "n": "ņ", "R": "Ŗ", "r": "ŗ", "S": "Ş", "s": "ş", "T": "Ţ", "t": "ţ" }
},
"altgr": true
}
20 changes: 15 additions & 5 deletions src/content.js
Original file line number Diff line number Diff line change
Expand Up @@ -149,14 +149,24 @@ export function drawKey(element, keyMap) {
}

export function drawDK(element, keyMap, deadKey) {
const keyChars = keyMap[element.parentNode.id];
if (!keyChars) {
return;
const drawChar = (element, content) => {
if (isDeadKey(content)) {
element.classList.add('deadKey', 'diacritic');
element.textContent = content[1];
} else {
element.classList.remove('deadKey', 'diacritic');
element.textContent = content || '';
}
}

const keyChars = keyMap[element.parentNode.id];
if (!keyChars) return;

const alt0 = deadKey[keyChars[0]];
const alt1 = deadKey[keyChars[1]];
element.querySelector('.level5').textContent = alt0 || '';
element.querySelector('.level6').textContent = altUpperChar(alt0, alt1);

drawChar(element.querySelector('.level5'), alt0);
drawChar(element.querySelector('.level6'), altUpperChar(alt0, alt1));
}

/**
Expand Down
5 changes: 2 additions & 3 deletions src/x-keyboard-layout.js
Original file line number Diff line number Diff line change
Expand Up @@ -151,11 +151,10 @@ export function newKeyboardLayout(keyMap = {}, deadKeys = {}, geometry = '') {
if (!key) {
return '';
}
const value = key[getModifierLevel(modifiers, platform)];
let value = key[getModifierLevel(modifiers, platform)];
if (pendingDK) {
const dk = pendingDK;
value = pendingDK[value] || '';
pendingDK = undefined;
return dk[value] || '';
}
if (isDeadKey(value)) {
pendingDK = deadKeys[value];
Expand Down
3 changes: 2 additions & 1 deletion src/x-keyboard.js
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,8 @@ class Keyboard extends HTMLElement {
span.textContent = '';
});
}
} else if (this.layout.pendingDK) { // show hints for this dead key
}
if (this.layout.pendingDK) { // show hints for this dead key
Array.from(this.root.querySelectorAll('.key')).forEach((key) => {
drawDK(key, this.layout.keyMap, this.layout.pendingDK);
});
Expand Down

0 comments on commit 6fd0c9f

Please sign in to comment.