eat(developer): kmc-convert write out sorted

This commit is contained in:
Sabine 2024-12-20 09:50:23 +01:00
parent 3bdcee9488
commit 6b75883c48

View file

@ -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(&COPYRIGHT) '© 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