39aldo39/klfc

"dead key is not defined" when converting from .klc

lord-ne opened this issue · 9 comments

When converting a certain .klc file (attached), I get the error klfc: warning: dead key ‘ְ’ is not defined., and the converted output files (also attached) do not contain the dead key definition. The dead key is definitely defined, on lines 95-102 of the input. I've attached my input file, as well as all of the output files produced by the conversion (which do not include the dead key).

he_phon.klc.txt (renamed to .txt to attach)
output.zip (zipped)

Here's the full text of the input file, for easier viewing. The input contains the dead key definition.

KBD	he_phon	"Phonetic Hebrew"

COPYRIGHT	"(c) 2021 N.E."

COMPANY	"N.E."

LOCALENAME	"he-IL"

LOCALEID	"0000040d"

VERSION	1.0

SHIFTSTATE

0	//Column 4
1	//Column 5 : Shft
2	//Column 6 :       Ctrl
6	//Column 7 :       Ctrl Alt
7	//Column 8 : Shft  Ctrl Alt

LAYOUT		;an extra '@' at the end is a dead key

//SC	VK_		Cap	0	1	2	6	7
//--	----		----	----	----	----	----	----

02	1		0	1	0021	-1	-1	-1		// DIGIT ONE, EXCLAMATION MARK, <none>, <none>, <none>
03	2		0	2	0040	-1	-1	-1		// DIGIT TWO, COMMERCIAL AT, <none>, <none>, <none>
04	3		0	3	0023	-1	20ac	-1		// DIGIT THREE, NUMBER SIGN, <none>, EURO SIGN, <none>
05	4		0	4	0024	-1	20aa	-1		// DIGIT FOUR, DOLLAR SIGN, <none>, NEW SHEQEL SIGN, <none>
06	5		0	5	0025	-1	00b0	-1		// DIGIT FIVE, PERCENT SIGN, <none>, DEGREE SIGN, <none>
07	6		0	6	005e	-1	-1	-1		// DIGIT SIX, CIRCUMFLEX ACCENT, <none>, <none>, <none>
08	7		0	7	0026	-1	-1	-1		// DIGIT SEVEN, AMPERSAND, <none>, <none>, <none>
09	8		0	8	002a	-1	00d7	-1		// DIGIT EIGHT, ASTERISK, <none>, MULTIPLICATION SIGN, <none>
0a	9		0	9	0028	-1	-1	-1		// DIGIT NINE, LEFT PARENTHESIS, <none>, <none>, <none>
0b	0		0	0	0029	-1	-1	-1		// DIGIT ZERO, RIGHT PARENTHESIS, <none>, <none>, <none>
0c	OEM_MINUS	0	002d	005f	-1	200c	-1		// HYPHEN-MINUS, LOW LINE, <none>, ZERO WIDTH NON-JOINER, <none>
0d	OEM_PLUS	0	003d	002b	-1	200d	-1		// EQUALS SIGN, PLUS SIGN, <none>, ZERO WIDTH JOINER, <none>
10	Q		0	05e7	-1	-1	05b8	05c7		// HEBREW LETTER QOF, <none>, <none>, HEBREW POINT QAMATS, HEBREW POINT QAMATS QATAN
11	W		0	05e9	05e1	-1	%%	%%		// HEBREW LETTER SHIN, HEBREW LETTER SAMEKH, <none>, <null>, <null>
12	E		0	05e2	-1	-1	05b6	-1		// HEBREW LETTER AYIN, <none>, <none>, HEBREW POINT SEGOL, <none>
13	R		0	05e8	-1	-1	-1	-1		// HEBREW LETTER RESH, <none>, <none>, <none>, <none>
14	T		0	05ea	05d8	-1	%%	-1		// HEBREW LETTER TAV, HEBREW LETTER TET, <none>, <null>, <none>
15	Y		0	05d9	-1	-1	05b5	-1		// HEBREW LETTER YOD, <none>, <none>, HEBREW POINT TSERE, <none>
16	U		0	05d5	%%	-1	05bb	-1		// HEBREW LETTER VAV, <null>, <none>, HEBREW POINT QUBUTS, <none>
17	I		0	05d9	-1	-1	05b4	-1		// HEBREW LETTER YOD, <none>, <none>, HEBREW POINT HIRIQ, <none>
18	O		0	05d5	%%	-1	05b9	05c7		// HEBREW LETTER VAV, <null>, <none>, HEBREW POINT HOLAM, HEBREW POINT QAMATS QATAN
19	P		0	05e4	05e3	-1	%%	%%		// HEBREW LETTER PE, HEBREW LETTER FINAL PE, <none>, <null>, <null>
1a	OEM_4		0	005b	007b	-1	200e	-1		// LEFT SQUARE BRACKET, LEFT CURLY BRACKET, <none>, LEFT-TO-RIGHT MARK, <none>
1b	OEM_6		0	005d	007d	-1	200f	-1		// RIGHT SQUARE BRACKET, RIGHT CURLY BRACKET, <none>, RIGHT-TO-LEFT MARK, <none>
1e	A		0	05d0	-1	-1	05b7	05b8		// HEBREW LETTER ALEF, <none>, <none>, HEBREW POINT PATAH, HEBREW POINT QAMATS
1f	S		0	05e1	05e9	-1	-1	-1		// HEBREW LETTER SAMEKH, HEBREW LETTER SHIN, <none>, <none>, <none>
20	D		0	05d3	-1	-1	-1	-1		// HEBREW LETTER DALET, <none>, <none>, <none>, <none>
21	F		0	05e4	05e3	-1	%%	%%		// HEBREW LETTER PE, HEBREW LETTER FINAL PE, <none>, <null>, <null>
22	G		0	05d2	-1	-1	-1	-1		// HEBREW LETTER GIMEL, <none>, <none>, <none>, <none>
23	H		0	05d4	-1	-1	-1	-1		// HEBREW LETTER HE, <none>, <none>, <none>, <none>
24	J		0	05d8	05ea	-1	-1	-1		// HEBREW LETTER TET, HEBREW LETTER TAV, <none>, <none>, <none>
25	K		0	05db	05da	-1	%%	%%		// HEBREW LETTER KAF, HEBREW LETTER FINAL KAF, <none>, <null>, <null>
26	L		0	05dc	-1	-1	-1	-1		// HEBREW LETTER LAMED, <none>, <none>, <none>, <none>
27	OEM_1		0	003b	003a	-1	-1	-1		// SEMICOLON, COLON, <none>, <none>, <none>
28	OEM_7		0	0027	0022	-1	05b0	05b0@		// APOSTROPHE, QUOTATION MARK, <none>, HEBREW POINT SHEVA, HEBREW POINT SHEVA
29	OEM_3		0	0060	007e	-1	-1	-1		// GRAVE ACCENT, TILDE, <none>, <none>, <none>
2b	OEM_5		0	005c	007c	-1	-1	-1		// REVERSE SOLIDUS, VERTICAL LINE, <none>, <none>, <none>
2c	Z		0	05d6	-1	-1	-1	-1		// HEBREW LETTER ZAYIN, <none>, <none>, <none>, <none>
2d	X		0	05d7	-1	-1	-1	-1		// HEBREW LETTER HET, <none>, <none>, <none>, <none>
2e	C		0	05e6	05e5	-1	-1	-1		// HEBREW LETTER TSADI, HEBREW LETTER FINAL TSADI, <none>, <none>, <none>
2f	V		0	05d5	-1	-1	-1	-1		// HEBREW LETTER VAV, <none>, <none>, <none>, <none>
30	B		0	05d1	-1	-1	%%	-1		// HEBREW LETTER BET, <none>, <none>, <null>, <none>
31	N		0	05e0	05df	-1	-1	-1		// HEBREW LETTER NUN, HEBREW LETTER FINAL NUN, <none>, <none>, <none>
32	M		0	05de	05dd	-1	-1	-1		// HEBREW LETTER MEM, HEBREW LETTER FINAL MEM, <none>, <none>, <none>
33	OEM_COMMA	0	002c	003c	-1	-1	-1		// COMMA, LESS-THAN SIGN, <none>, <none>, <none>
34	OEM_PERIOD	0	002e	003e	-1	05bc	-1		// FULL STOP, GREATER-THAN SIGN, <none>, HEBREW POINT DAGESH OR MAPIQ (or shuruq), <none>
35	OEM_2		0	002f	003f	-1	00f7	-1		// SOLIDUS, QUESTION MARK, <none>, DIVISION SIGN, <none>
39	SPACE		0	0020	0020	-1	-1	-1		// SPACE, SPACE, <none>, <none>, <none>
56	OEM_102	0	005c	007c	-1	-1	-1		// REVERSE SOLIDUS, VERTICAL LINE, <none>, <none>, <none>
53	DECIMAL	0	002e	002e	-1	-1	-1		// FULL STOP, FULL STOP, , , 

LIGATURE

//VK_	Mod#	Char0	Char1	Char2	Char3
//----		----	----	----	----	----

B		3	05d1	05bc		// HEBREW LETTER BET + HEBREW POINT DAGESH OR MAPIQ (or shuruq)
F		3	05e4	05bc		// HEBREW LETTER PE + HEBREW POINT DAGESH OR MAPIQ (or shuruq)
F		4	05e3	05bc		// HEBREW LETTER FINAL PE + HEBREW POINT DAGESH OR MAPIQ (or shuruq)
K		3	05db	05bc		// HEBREW LETTER KAF + HEBREW POINT DAGESH OR MAPIQ (or shuruq)
K		4	05da	05bc		// HEBREW LETTER FINAL KAF + HEBREW POINT DAGESH OR MAPIQ (or shuruq)
O		1	05d5	05b9		// HEBREW LETTER VAV + HEBREW POINT HOLAM
P		3	05e4	05bc		// HEBREW LETTER PE + HEBREW POINT DAGESH OR MAPIQ (or shuruq)
P		4	05e3	05bc		// HEBREW LETTER FINAL PE + HEBREW POINT DAGESH OR MAPIQ (or shuruq)
T		3	05ea	05bc		// HEBREW LETTER TAV + HEBREW POINT DAGESH OR MAPIQ (or shuruq)
U		1	05d5	05bc		// HEBREW LETTER VAV + HEBREW POINT DAGESH OR MAPIQ (or shuruq)
W		3	05e9	05c1		// HEBREW LETTER SHIN + HEBREW POINT SHIN DOT
W		4	05e9	05c2		// HEBREW LETTER SHIN + HEBREW POINT SIN DOT

DEADKEY	05b0

05b6	05b1	// ֶ -> ֱ
05b7	05b2	// ַ -> ֲ
05b8	05b3	// ָ -> ֳ
05e2	05b1	// ע -> ֱ
05d0	05b2	// א -> ֲ
05e7	05b3	// ק -> ֳ


KEYNAME

01	Esc
0e	Backspace
0f	Tab
1c	Enter
1d	Ctrl
2a	Shift
36	"Right Shift"
37	"Num *"
38	Alt
39	Space
3a	"Caps Lock"
3b	F1
3c	F2
3d	F3
3e	F4
3f	F5
40	F6
41	F7
42	F8
43	F9
44	F10
45	Pause
46	"Scroll Lock"
47	"Num 7"
48	"Num 8"
49	"Num 9"
4a	"Num -"
4b	"Num 4"
4c	"Num 5"
4d	"Num 6"
4e	"Num +"
4f	"Num 1"
50	"Num 2"
51	"Num 3"
52	"Num 0"
53	"Num Del"
54	"Sys Req"
57	F11
58	F12
7c	F13
7d	F14
7e	F15
7f	F16
80	F17
81	F18
82	F19
83	F20
84	F21
85	F22
86	F23
87	F24

KEYNAME_EXT

1c	"Num Enter"
1d	"Right Ctrl"
35	"Num /"
37	"Prnt Scrn"
38	"Right Alt"
45	"Num Lock"
46	Break
47	Home
48	Up
49	"Page Up"
4b	Left
4d	Right
4f	End
50	Down
51	"Page Down"
52	Insert
53	Delete
54	<00>
56	Help
5b	"Left Windows"
5c	"Right Windows"
5d	Application

KEYNAME_DEAD

05b0	"HEBREW POINT SHEVA"


DESCRIPTIONS

0409	Phonetic Hebrew

LANGUAGENAMES

0409	Hebrew (Israel)

ENDKBD

And here's the output json file. The output does not contain the dead key definition.

{
  "fullName": "Phonetic Hebrew",
  "name": "he_phon",
  "copyright": "(c) 2021 N.E.",
  "company": "N.E.",
  "localeId": "0000040d",
  "version": "1.0",
  "shiftlevels": [ "None", "Shift", "Control", "Alt+Control", "Shift+Alt+Control" ],
  "keys": [
    { "pos": "1", "shortcutPos": "1", "letters": [ "1", "!", "", "", "" ], "capslock": false },
    { "pos": "2", "shortcutPos": "2", "letters": [ "2", "@", "", "", "" ], "capslock": false },
    { "pos": "3", "shortcutPos": "3", "letters": [ "3", "#", "", "€", "" ], "capslock": false },
    { "pos": "4", "shortcutPos": "4", "letters": [ "4", "$", "", "₪", "" ], "capslock": false },
    { "pos": "5", "shortcutPos": "5", "letters": [ "5", "%", "", "°", "" ], "capslock": false },
    { "pos": "6", "shortcutPos": "6", "letters": [ "6", "^", "", "", "" ], "capslock": false },
    { "pos": "7", "shortcutPos": "7", "letters": [ "7", "&", "", "", "" ], "capslock": false },
    { "pos": "8", "shortcutPos": "8", "letters": [ "8", "*", "", "×", "" ], "capslock": false },
    { "pos": "9", "shortcutPos": "9", "letters": [ "9", "(", "", "", "" ], "capslock": false },
    { "pos": "0", "shortcutPos": "0", "letters": [ "0", ")", "", "", "" ], "capslock": false },
    { "pos": "-", "shortcutPos": "-", "letters": [ "-", "_", "", "‌", "" ], "capslock": false },
    { "pos": "+", "shortcutPos": "+", "letters": [ "=", "+", "", "‍", "" ], "capslock": false },
    { "pos": "Q", "shortcutPos": "Q", "letters": [ "ק", "", "", "ָ", "ׇ" ], "capslock": false },
    { "pos": "W", "shortcutPos": "W", "letters": [ "ש", "ס", "", "lig:שׁ", "lig:שׂ" ], "capslock": false },
    { "pos": "E", "shortcutPos": "E", "letters": [ "ע", "", "", "ֶ", "" ], "capslock": false },
    { "pos": "R", "shortcutPos": "R", "letters": [ "ר", "", "", "", "" ], "capslock": false },
    { "pos": "T", "shortcutPos": "T", "letters": [ "ת", "ט", "", "lig:תּ", "" ], "capslock": false },
    { "pos": "Y", "shortcutPos": "Y", "letters": [ "י", "", "", "ֵ", "" ], "capslock": false },
    { "pos": "U", "shortcutPos": "U", "letters": [ "ו", "lig:וּ", "", "ֻ", "" ], "capslock": false },
    { "pos": "I", "shortcutPos": "I", "letters": [ "י", "", "", "ִ", "" ], "capslock": false },
    { "pos": "O", "shortcutPos": "O", "letters": [ "ו", "lig:וֹ", "", "ֹ", "ׇ" ], "capslock": false },
    { "pos": "P", "shortcutPos": "P", "letters": [ "פ", "ף", "", "lig:פּ", "lig:ףּ" ], "capslock": false },
    { "pos": "[", "shortcutPos": "[", "letters": [ "[", "{", "", "‎", "" ], "capslock": false },
    { "pos": "]", "shortcutPos": "]", "letters": [ "]", "}", "", "‏", "" ], "capslock": false },
    { "pos": "A", "shortcutPos": "A", "letters": [ "א", "", "", "ַ", "ָ" ], "capslock": false },
    { "pos": "S", "shortcutPos": "S", "letters": [ "ס", "ש", "", "", "" ], "capslock": false },
    { "pos": "D", "shortcutPos": "D", "letters": [ "ד", "", "", "", "" ], "capslock": false },
    { "pos": "F", "shortcutPos": "F", "letters": [ "פ", "ף", "", "lig:פּ", "lig:ףּ" ], "capslock": false },
    { "pos": "G", "shortcutPos": "G", "letters": [ "ג", "", "", "", "" ], "capslock": false },
    { "pos": "H", "shortcutPos": "H", "letters": [ "ה", "", "", "", "" ], "capslock": false },
    { "pos": "J", "shortcutPos": "J", "letters": [ "ט", "ת", "", "", "" ], "capslock": false },
    { "pos": "K", "shortcutPos": "K", "letters": [ "כ", "ך", "", "lig:כּ", "lig:ךּ" ], "capslock": false },
    { "pos": "L", "shortcutPos": "L", "letters": [ "ל", "", "", "", "" ], "capslock": false },
    { "pos": ";", "shortcutPos": ";", "letters": [ ";", ":", "", "", "" ], "capslock": false },
    { "pos": "'", "shortcutPos": "'", "letters": [ "'", "\"", "", "ְ", "cdk:ְ" ], "capslock": false },
    { "pos": "~", "shortcutPos": "~", "letters": [ "`", "~", "", "", "" ], "capslock": false },
    { "pos": "\\", "shortcutPos": "\\", "letters": [ "\\", "|", "", "", "" ], "capslock": false },
    { "pos": "Z", "shortcutPos": "Z", "letters": [ "ז", "", "", "", "" ], "capslock": false },
    { "pos": "X", "shortcutPos": "X", "letters": [ "ח", "", "", "", "" ], "capslock": false },
    { "pos": "C", "shortcutPos": "C", "letters": [ "צ", "ץ", "", "", "" ], "capslock": false },
    { "pos": "V", "shortcutPos": "V", "letters": [ "ו", "", "", "", "" ], "capslock": false },
    { "pos": "B", "shortcutPos": "B", "letters": [ "ב", "", "", "lig:בּ", "" ], "capslock": false },
    { "pos": "N", "shortcutPos": "N", "letters": [ "נ", "ן", "", "", "" ], "capslock": false },
    { "pos": "M", "shortcutPos": "M", "letters": [ "מ", "ם", "", "", "" ], "capslock": false },
    { "pos": ",", "shortcutPos": ",", "letters": [ ",", "<", "", "", "" ], "capslock": false },
    { "pos": ".", "shortcutPos": ".", "letters": [ ".", ">", "", "ּ", "" ], "capslock": false },
    { "pos": "/", "shortcutPos": "/", "letters": [ "/", "?", "", "÷", "" ], "capslock": false },
    { "pos": "Space", "shortcutPos": "Space", "letters": [ " ", " ", "", "", "" ], "capslock": false },
    { "pos": "Iso", "shortcutPos": "Iso", "letters": [ "\\", "|", "", "", "" ], "capslock": false },
    { "pos": "KP_Dec", "shortcutPos": "KP_Dec", "letters": [ ".", ".", "", "", "" ], "capslock": false }
  ],
  "customDeadKeys": [
    {
      "name": "ְ",
      "baseChar": "ְ",
      "stringMap": []
    }
  ]
}

28 OEM_7 0 0027 0022 -1 05b0 05b0@

That line if where the magic's supposed to happen, right? AltGr+Shift+Apostrophe should produce the Sheva dead key.

I've experienced that you cannot always use non-ASCII marks for dead key names. Maybe that's your problem. Try calling your dead key period instead of sheva. You can still have it output exactly the same symbols as it does now!

Oh, and while I have your attention: Could you please take the time to swing by my EPKL repo and tell me what you think of the phonetic Colemak layout there? I'm a bit stoked about inventing those dead keys on O and Y for writing niqqud and so much more.

https://github.com/DreymaR/BigBagKbdTrixPKL/tree/master/Layouts/Colemak/Cmk-eD-Heb

How do I change the "name" of a dead key without changing the actual definition? (Note that in many word processors, pressing the dead key and then pressing any character other than those the dead key maps will send the actual character of the dead key, followed by the character you typed.)

Your keyboard layout is definitely interesting, although I'm not that familiar with Colemak in general. I would say that I definitely prefer using AltGr and AltGr+Shift for nikud as opposed to dead keys, but that's just my personal preference. I find that the segregation of anything nikud-related to the AltGr key makes my life easier because 99% of the time I'm not using nikud.

Change the 05b0@ entry to, e.g., 002e@, and accordingly change the KEYNAME_DEAD 05b0 "HEBREW POINT SHEVA" and DEADKEY 05b0 below from 05b0 to 002e. That should work I think. You should specify a space release (a 0020 entry) for the dead key at the end of its table, that's tradition. I'm not sure, but that entry may be the one the dead key releases on untabulated releases as well. If not, maybe you have to live with imperfection. I seem to remember having similar problems with MSKLC and Greek character dead keys.

Niqqudot is a conundrum, for sure. Most people nearly never use it, but I think that if you are to use them then AltGr mappings would make that very uncomfortable. For a "1%" use case that's okay but for a scholar it wouldn't be cool. The dead keys, furthermore, can release a lot more than just niqqud including special Hebrew characters and Yiddish. I'm taking that further now by including a Compose method so you could for instance compose a yod-yod bigram to a yod-yod digraph. EPKL is a fun project!

The dead key works properly on Windows, so this isn't a problem with MSKLC, it's a problem with this conversion tool. I think I'll leave it as-is for now, I'm not really using any of the other platform formats right now anyway. Maybe I'll add something to my conversion script to make a copy with the sheva dead key replaced with a period, and convert from that.

Yeah, I'm just guessing at why Aldo's tool might have a problem with that DK.

I'd still recommend that you follow the convention of including a space release for your dead key. All standard DKs have that, ttbomk. An example from my own layout, where I also made a NBSP release for the combining accent:

0067	011f	// g -> ğ
00a0	0306	//   -> ̆
0020	02d8	//   -> ˘

I'll add it in

There was an issue with the KLC parsing: it behaved like the ligature part extended to the end of the file (with most having no values of course). I have pushed a fix, but as a workaround you can simply put the DEADKEY 05b0 section above the LIGATURE section if you want to use the current version.