mirror of
https://github.com/keymanapp/keyman.git
synced 2026-10-11 16:37:28 +00:00
eat(developer): kmc-convert write out sorted
This commit is contained in:
parent
3bdcee9488
commit
6b75883c48
1 changed files with 199 additions and 77 deletions
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue