From 6b75883c4816af3ebdbb2a5237ebff7bb5ee0a2b Mon Sep 17 00:00:00 2001 From: Sabine Date: Fri, 20 Dec 2024 09:50:23 +0100 Subject: [PATCH] eat(developer): kmc-convert write out sorted --- .../keylayout-to-kmn-converter.ts | 276 +++++++++++++----- 1 file changed, 199 insertions(+), 77 deletions(-) diff --git a/developer/src/kmc-convert/src/keylayout-to-kmn/keylayout-to-kmn-converter.ts b/developer/src/kmc-convert/src/keylayout-to-kmn/keylayout-to-kmn-converter.ts index 09793a9da0..f09cefac6d 100644 --- a/developer/src/kmc-convert/src/keylayout-to-kmn/keylayout-to-kmn-converter.ts +++ b/developer/src/kmc-convert/src/keylayout-to-kmn/keylayout-to-kmn-converter.ts @@ -463,11 +463,13 @@ export class KeylayoutToKmnConverter { } } + // do e clear - // console.log("deadkeys_One_dk", deadkeys_One_dk) + // consoleconsole.log("deadkeys_One_dk", deadkeys_One_dk) deadkeyedChars_all_Layers.push(deadkeys_One_dk) - //console.log("deadkeyedChars_all_Layers", deadkeyedChars_all_Layers) + + //console.consolelog("deadkeyedChars_all_Layers", deadkeyedChars_all_Layers) } @@ -535,7 +537,7 @@ export class KeylayoutToKmnConverter { */ //TODO need to use export const USVirtualKeyCodes here public write(data_ukelele: convert_object): boolean { - console.log("start write") + console.log("start write") // ************************************************************* // **** write stores ******************************************* @@ -545,15 +547,20 @@ export class KeylayoutToKmnConverter { data += "c Keyman keyboard generated by kmn-convert\n" data += "c\n" data += "\n" + + data += '\########## OK #################################################################\n' data += "store(&VERSION) \'...\'\n" data += "store(&TARGETS) \'any\'\n" data += "store(&KEYBOARDVERSION) \'...\'\n" data += "store(©RIGHT) '© 2024 SIL International\n" // TODO what else ?? + data += '\########## OK #################################################################\n' + data += "\n" data += "begin Unicode > use(main)\n\n" data += "group(main) using keys\n\n" + data += '\########## OK #################################################################\n' data += "Tipp: if K_? is replaced by undefined-> no enry in kmn_Key_Name=> add K_? there and it will be shown here\n" data += "Tipp: keys that are marked with sction do not aoear in ukelele_Array_output->do not appear in kmn\n" data += "\n" @@ -615,6 +622,31 @@ export class KeylayoutToKmnConverter { //console.log("start write 2G") } + //......................................................................... + // end write out ........................................................ + //......................................................................... + //......................................................................... + + const NEWDATA = this.writeLastPart(data_ukelele, isCAPSused) + data += NEWDATA + '\n' + + // console.log("start write 5") + /*writeFileSync("data/MyResult.kmn", data, { flag: "w" })*/ + const data_encoded = new TextEncoder().encode(data) + this.callbacks.fs.writeFileSync("data/MyResult.kmn", data_encoded) // not usable here since it takes UInt8array data + + // ToDo conditions? + if (data.length > 0) + return true; + else + return false + + + //......................................................................... + // end write out ........................................................ + //......................................................................... + //......................................................................... + //console.log("start write 3") data += '\n' @@ -829,7 +861,7 @@ export class KeylayoutToKmnConverter { if (array_deadkeyed_unique[i].length !== 0) data += '\n\'' + array_deadkeyed_unique[i] + '\' ' // console.log("array_deadkeyed_unique[i][1]", array_deadkeyed_unique[i][1]) - } + } // console.log("modiArray", modiArray) data += '\'\n' @@ -954,19 +986,19 @@ export class KeylayoutToKmnConverter { - const NEWDATA = this.writeLastPart(data_ukelele, isCAPSused) - data += NEWDATA + '\n' - - // console.log("start write 5") - /*writeFileSync("data/MyResult.kmn", data, { flag: "w" })*/ - const data_encoded = new TextEncoder().encode(data) - this.callbacks.fs.writeFileSync("data/MyResult.kmn", data_encoded) // not usable here since it takes UInt8array data - - // ToDo conditions? - if (data.length > 0) - return true; - else - return false + //const NEWDATA = this.writeLastPart(data_ukelele, isCAPSused) + /* data += NEWDATA + '\n' + + // console.log("start write 5") + //writeFileSync("data/MyResult.kmn", data, { flag: "w" }) + const data_encoded = new TextEncoder().encode(data) + this.callbacks.fs.writeFileSync("data/MyResult.kmn", data_encoded) // not usable here since it takes UInt8array data + + // ToDo conditions? + if (data.length > 0) + return true; + else + return false*/ } //... helpers ............................................................................................. @@ -1661,57 +1693,6 @@ export class KeylayoutToKmnConverter { //---------------------------------------------------------------------------------------------------- public writeLastPart(data_ukelele: convert_object, isCAPSused: boolean): string { - - //°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° - // DEADKEYS °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° - //°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° - const dk_ss_array: string[][] = [] - - // ToDo get data from WorkArray - // filter for dk values - let data: string = "" - data += '\nNOW MY C4 RULES *********** (only to get 02C6 ect) *********************\n\n' - for (let kkk = 0; kkk < data_ukelele.ArrayOf_processed_RuleData.length; kkk++) { - if (new TextDecoder().decode(data_ukelele.ArrayOf_processed_RuleData[kkk][4]) === "isTerminator") { - let line: string = "" - for (let lll = 0; lll < data_ukelele.ArrayOf_processed_RuleData[kkk].length; lll++) { - const dk_ss_array1D: string[] = [] - const entry = new TextDecoder().decode(data_ukelele.ArrayOf_processed_RuleData[kkk][lll]) - dk_ss_array1D.push(new TextDecoder().decode(data_ukelele.ArrayOf_processed_RuleData[kkk][2])) - dk_ss_array1D.push(new TextDecoder().decode(data_ukelele.ArrayOf_processed_RuleData[kkk][3])) - dk_ss_array1D.push(new TextDecoder().decode(data_ukelele.ArrayOf_processed_RuleData[kkk][6])) - line += " " + entry + " " - dk_ss_array.push(dk_ss_array1D) - } - line += "\n" - data += line + '\n' - console.log((data += line), "\n") - } - } - - - // remove duplicates - const [uniqueDeadkeys] = dk_ss_array.reduce((acc, curr) => { - const [uniq, set] = acc; - if (!set.has(curr.join(','))) { - set.add(curr.join(',')); - uniq.push(curr); - } - return acc; - }, [[], new Set()], - ); - - // array ony of dk (array_dk_char [ '¨', 'ˆ', '´', '˜', '`' ]) - const array_dk_char = [...new Set(data_ukelele.ArrayOf_processed_dk.map(a => a[1]))]; - - console.log("data_ukelele.ArrayOf_processed_RuleData", data_ukelele.ArrayOf_processed_RuleData); - console.log("dk_ss_array", dk_ss_array); - console.log("uniqueDeadkeys", uniqueDeadkeys); - - console.log("array_dk_charN", array_dk_char); - //console.log("data_ukelele.ArrayOf_processed_dk", data_ukelele.ArrayOf_processed_dk); - // let data = "\n" - // create a string array ....................................................... const workArray2D: string[][] = [] for (let k = 0; k < data_ukelele.ArrayOf_processed_RuleData.length; k++) { @@ -1723,6 +1704,133 @@ export class KeylayoutToKmnConverter { workArray2D.push(array1D) } console.log("workArray2D", workArray2D) + //°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° + // DEADKEYS °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° + //°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° + //const dk_ss_array: string[][] = [] + + // ToDo get data from WorkArray + // filter for dk values + let data: string = "" + + //data += '\n.. dk part here (+ [K_BKQUOTE] > dk(005e))\n\n' + + console.log("start dk-part ") + console.log("data_ukelele.ArrayOf_Element_KeyAction.length ", data_ukelele.ArrayOf_Element_KeyAction.length) + console.log(" data_ukelele.ArrayOf_Element_ModifierMaps_ALLKeyMapSelect.length", data_ukelele.ArrayOf_Element_ModifierMaps_ALLKeyMapSelect.length) + + + /* + // all 109 keys with action a9 + for (let i = 0; i < data_ukelele.ArrayOf_Element_KeyAction.length; i++) { + // loop through keyMapSelect (8) + for (let ii = 0; ii < data_ukelele.ArrayOf_Element_ModifierMaps_ALLKeyMapSelect.length; ii++) { + //for (let ii = 0; ii < 8; ii++) { + // loop through modifiers + //for (let j = 0; j < data_ukelele.ArrayOf_Element_KeyAction.length; j++) { + // 8 behaviors + for (let j = 0; j < data_ukelele.ArrayOf_Element_ModifierMaps_ALLKeyMapSelect.length; j++) { + //console.log("start write 3A", i, ii, j) + + // get the modifier for the layer + //const label_modifier = this.create_kmn_modifier(data_ukelele.ArrayOf_Element_ALL_ModifierMaps[j], isCAPSused) + const label_modifier = this.create_kmn_modifier(data_ukelele.ArrayOf_Element_ALL_ModifierMaps[j], isCAPSused) + console.log("label_modifier ", label_modifier) + + // get the character from keymap-section of .keylayout-file that will be written as result in kmn-file + //const resulting_character = new TextDecoder().decode(data_ukelele.ArrayOf_Element_KeyAction[j][i]) + // wrong since it attempts to convert a9 and not 4 ( the termínator id ) + const resulting_character = new TextDecoder().decode(data_ukelele.ArrayOf_Element_KeyAction[ii][i]) + console.log("resulting_character ",resulting_character ) + console.log("data_ukelele.ArrayOf_Element_KeyAction ",data_ukelele.ArrayOf_Element_KeyAction ) + + // therefore get character from ~ <- 4 <- a9 + //const realChar = this.getCharacterFromActionName(data_ukelele, data_ukelele.ArrayOf_Element_KeyAction[ii][i]) + //console.log("realChar", realChar,i,ii,j ) + // console.log("data_ukelele.ArrayOf_Element_KeyAction[ii][i],", + // data_ukelele.ArrayOf_Element_KeyAction[ii][i], + // realChar) + + if (resulting_character !== "") { + console.log("start write 3B+3C", i, ii, j, label_modifier, "---", resulting_character) + + const VK: (string | number)[][] = data_ukelele.ArrayOf_processed_VK_from_keylayout + const vk_label = VK.filter(item => item[0] === data_ukelele.ArrayOf_processed_VK_from_keylayout[i][0]) + // console.log("VK", VK, "vk_label", vk_label) + + // console.log("start write 3D,data_ukelele.ArrayOf_processed_dk", data_ukelele.ArrayOf_processed_dk) + for (let k = 0; k < data_ukelele.ArrayOf_processed_dk.length; k++) { + console.log("start write 3E") + console.log("resulting_character", resulting_character, "data_ukelele.ArrayOf_processed_dk[k][1]", data_ukelele.ArrayOf_processed_dk[k][1]) + console.log("data_ukelele.ArrayOf_processed_dk is", data_ukelele.ArrayOf_processed_dk) + console.log("resulting_characte, data_ukelele.ArrayOf_processed_dk is", resulting_character, data_ukelele.ArrayOf_processed_dk[k][2]) + if ((resulting_character !== "") && (resulting_character === data_ukelele.ArrayOf_processed_dk[k][2])) { + data += '[' + (label_modifier + ' ' + vk_label[0][1]).trim() + '] ' + "> dk(" + this.getHexFromChar(data_ukelele.ArrayOf_processed_dk[k][1]) + ") " + '\n' + console.log("start write 3D", data) + + } + } + } + } + + } + } + */ + data += '\########## OK #################################################################\n' + + data += '\nNOW MY C4 RULES **ccc ********* (only to get 02C6 ect) *********************\n\n' + console.log("data_ukelele.ArrayOf_processed_RuleData", data_ukelele.ArrayOf_processed_RuleData); + console.log("data_ukelele.ArrayOf_processed_RuleData.length ", data_ukelele.ArrayOf_processed_RuleData.length) + + const dk_line_array = workArray2D.filter(function ([A, B, C, D, E, F]) { + return (E === "isTerminator") + }); + console.log("dk_line_array", dk_line_array.length, dk_line_array) + + // remove duplicates + const [uniqueDeadkeys] = dk_line_array.reduce((acc, curr) => { + const [uniq, set] = acc; + if (!set.has(curr.join(','))) { + set.add(curr.join(',')); + uniq.push(curr); + } + return acc; + }, [[], new Set()], + ); + console.log("uniquedk_line_array,uniqueDeadkeys", uniqueDeadkeys.length, uniqueDeadkeys); + + + for (let kkk = 0; kkk < uniqueDeadkeys.length; kkk++) { + let line: string = "" + line = "+ [" + uniqueDeadkeys[kkk][1] + " " + uniqueDeadkeys[kkk][2] + "] > dk(" + uniqueDeadkeys[kkk][6] + ")" + data += line + '\n' + } + console.log(" data all together", data); + + + + + // remove duplicates + /*const [uniqueDeadkeys] = dk_ss_array.reduce((acc, curr) => { + const [uniq, set] = acc; + if (!set.has(curr.join(','))) { + set.add(curr.join(',')); + uniq.push(curr); + } + return acc; + }, [[], new Set()], + ); + console.log("uniqueDeadkeys", uniqueDeadkeys);*/ + + + // array ony of dk (array_dk_char [ '¨', 'ˆ', '´', '˜', '`' ]) + const array_dk_char = [...new Set(data_ukelele.ArrayOf_processed_dk.map(a => a[1]))]; + console.log("array_dk_charN", array_dk_char); + + + + + // we have 5 different types: /* C0: size: 4 [ 'first_modifier_C0', '33RIGHTSHIFT NCAPS', 'K_S', 'S' ] @@ -1758,6 +1866,7 @@ export class KeylayoutToKmnConverter { let deadkeyables_raw: string[][] = [] let deadkeyed_raw: string[][] = [] + // find deadkeyable [ 'first_modifier_C1', 'CAPS', 'K_A', 'A', '', '', '' ] deadkeyables_raw = workArray2D.filter(function ([A, B, C, D, E, F, G]) { return ((A === "first_modifier_C1") /*&& (B === shiftstate) && (C === key_name)*/ @@ -1766,15 +1875,17 @@ export class KeylayoutToKmnConverter { }); //console.log("deadkeyables_raw", deadkeyables_raw) + // find deadkeyed [ 'first_modifier_C2', 'CAPS', 'K_A', 'K_N', 'Ã' ] deadkeyed_raw = workArray2D.filter(function ([A, B, C, D, E, F, G]) { return ((A === "first_modifier_C2")/* && (B === shiftstate) && (C === key_name)*/ && ((C !== "K_SPACE")) - ) }); console.log("deadkeyables_raw", deadkeyables_raw.length, deadkeyables_raw) console.log("deadkeyed_raw", deadkeyed_raw.length, deadkeyed_raw) + + const dkable_dked_array2D: any[][] = [] // loop dedkeyables, take first for (let rr = 0; rr < deadkeyables_raw.length; rr++) { @@ -1796,9 +1907,9 @@ export class KeylayoutToKmnConverter { dkable_dked_array2D.push(dkable_dked_array) } } - console.log("dkable_dked_array2D", dkable_dked_array2D.length, dkable_dked_array2D) + // remove duplicates const [uniqueDeadkeyables] = dkable_dked_array2D.reduce((acc, curr) => { const [uniq, set] = acc; @@ -1812,31 +1923,42 @@ export class KeylayoutToKmnConverter { console.log("uniqueDeadkeyables", uniqueDeadkeyables.length, uniqueDeadkeyables); - const deadkeyedArray:string[][] = Array.from({ length: uniqueDeadkeys.length }, () => new Array(2).fill('')); - + const deadkeyedArray: string[][] = Array.from({ length: uniqueDeadkeys.length }, () => new Array(2).fill('')); console.log("deadkeyedArray", deadkeyedArray) - const deadkeyablesArray:string[][] = Array.from({ length: uniqueDeadkeys.length }, () => new Array(1).fill('')); + const deadkeyablesArray: string[][] = Array.from({ length: uniqueDeadkeys.length }, () => new Array(1).fill('')); + console.log("deadkeyablesArray", deadkeyablesArray) + + console.log("uniqueDeadkeys", uniqueDeadkeys) for (let i = 0; i < uniqueDeadkeys.length; i++) { for (let j = 0; j < uniqueDeadkeyables.length; j++) { - if (uniqueDeadkeys[i][0] === uniqueDeadkeyables[j][1]) { + console.log("uniqueDeadkeys[i][2] ", uniqueDeadkeys[i][2]) + console.log("uniqueDeadkeyables[j][1] ", uniqueDeadkeyables[j][1]) + + if (uniqueDeadkeys[i][2] === uniqueDeadkeyables[j][1]) { deadkeyablesArray[i][0] = deadkeyablesArray[i][0] + "\'" + uniqueDeadkeyables[j][0] + "\' " deadkeyedArray[i][0] = deadkeyedArray[i][0] + "\'" + uniqueDeadkeyables[j][2] + "\' " } } - deadkeyedArray[i][1]=(uniqueDeadkeys[i][2]) + deadkeyedArray[i][1] = (uniqueDeadkeys[i][6]) } + data += "\n" + data += '\########## OK #################################################################\n' + + data += '\nmatch > use(deadkeys)\n\n' + data += '\ngroup(deadkeys)\n\n' + // finally write out for (let i = 0; i < deadkeyablesArray.length; i++) { - data += "\n\ndk: "+ deadkeyedArray[i][1] + data += "\n\ndk: " + deadkeyedArray[i][1] console.log("dk: ", deadkeyedArray[i][1]) data += "\ndeadkeyablesArray" + deadkeyablesArray[i][0] console.log("deadkeyablesArray", deadkeyablesArray[i][0]) - data += "\ndeadkeyedArray "+ deadkeyedArray[i][0] + data += "\ndeadkeyedArray " + deadkeyedArray[i][0] console.log("deadkeyedArray ", deadkeyedArray[i][0]) } return data