Skip to content

Commit

Permalink
Merge pull request #2 from hiohlan/main
Browse files Browse the repository at this point in the history
  • Loading branch information
narze authored Jul 27, 2021
2 parents c129812 + 2dfe8b2 commit bc6ec41
Show file tree
Hide file tree
Showing 3 changed files with 192 additions and 0 deletions.
13 changes: 13 additions & 0 deletions cli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import fs from "fs"
import path from "path"
import { generateKeylayout } from "./generateKeylayout"
import { generateKlc } from "./generateKlc"
import { generateXkb } from "./generateXkb"
import { fixUnicode } from "./utils"

// eslint-disable-next-line @typescript-eslint/no-var-requires
Expand Down Expand Up @@ -47,6 +48,18 @@ const choices = filenames.map((filename) => ({
const outputFilename = `output/${layoutName}.klc`
await generateKlc(jsonInput, outputFilename)

console.log(`Output : ${outputFilename}`)
} catch (e) {
console.error(e)
process.exit(1)
}

// Xkb
try {
const layoutName = response.input.split(".")[0]
const outputFilename = `output/${layoutName}_xkb`
await generateXkb(jsonInput, outputFilename)

console.log(`Output : ${outputFilename}`)
} catch (e) {
console.error(e)
Expand Down
121 changes: 121 additions & 0 deletions generateXkb.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
import { plainToClass } from "class-transformer"
import { validate } from "class-validator"
import fs from "fs"
import { Layout, WindowsAttributes } from "./main"

export async function generateXkb(
content: Record<string, unknown>,
outputPath: string
): Promise<void> {
const layout = plainToClass(Layout, content)
const errors = await validate(layout)

if (errors.length) {
throw new Error(errors.map((e) => e.toString()).join(", "))
}

const windowsErrors = await validate(
plainToClass(WindowsAttributes, layout.os.windows)
)

if (windowsErrors.length) {
throw new Error(windowsErrors.map((e) => e.toString()).join(", "))
}

function toHex(str: string) {
var hex, i;
var result = "";
for (i=0; i<str.length; i++) {
hex = str.charCodeAt(i).toString(16);
result += " 0x1"+("000000"+hex).slice(-6);
}
return result;
}



const klfDefaultLayout = {
"1": "key <AE01> { [",
"2": "key <AE02> { [",
"3": "key <AE03> { [",
"4": "key <AE04> { [",
"5": "key <AE05> { [",
"6": "key <AE06> { [",
"7": "key <AE07> { [",
"8": "key <AE08> { [",
"9": "key <AE09> { [",
"0": "key <AE10> { [",
"-": "key <AE11> { [",
"=": "key <AE12> { [",
"`": "key <TLDE> { [",
q: "key <AD01> { [",
w: "key <AD02> { [",
e: "key <AD03> { [",
r: "key <AD04> { [",
t: "key <AD05> { [",
y: "key <AD06> { [",
u: "key <AD07> { [",
i: "key <AD08> { [",
o: "key <AD09> { [",
p: "key <AD10> { [",
"[": "key <AD11> { [",
"]": "key <AD12> { [",
a: "key <AC01> { [",
s: "key <AC02> { [",
d: "key <AC03> { [",
f: "key <AC04> { [",
g: "key <AC05> { [",
h: "key <AC06> { [",
j: "key <AC07> { [",
k: "key <AC08> { [",
l: "key <AC09> { [",
";": "key <AC10> { [",
"'": "key <AC11> { [",
"\\": "key <BKSL> { [",
z: "key <AB01> { [",
x: "key <AB02> { [",
c: "key <AB03> { [",
v: "key <AB04> { [",
b: "key <AB05> { [",
n: "key <AB06> { [",
m: "key <AB07> { [",
",": "key <AB08> { [",
".": "key <AB09> { [",
"/": "key <AB10> { [",
}

const lines = [
`partial alphanumeric_keys`,
`xkb_symbols "${layout.os.windows.installerName}" {`,
`\n // COPYRIGHT "MIT"`,
`\n name[Group1]= "${layout.name} v${layout.version}";`,
]

const layoutLines = [""]
Object.entries(klfDefaultLayout).forEach(([key, value]) =>
{
const extensions = layout.layers.map
(
(_, idx) =>
{
return (toHex(layout.keys[key][idx]) || "voidsymbol")+((idx<3)?",":"")
}
)

extensions.push("] };")
layoutLines.push([value,...extensions].join(" "))
})

fs.writeFileSync(
outputPath,
"\ufeff" +
[
lines.join("\n"),
layoutLines.join("\n "),
" include \"level3(ralt_switch)\"\n};",
].join("\n\n"),
{
encoding: "utf8",
}
)
}
58 changes: 58 additions & 0 deletions output/Manoonchai_xkb
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
partial alphanumeric_keys
xkb_symbols "ThaiMnc" {

// COPYRIGHT "MIT"

name[Group1]= "Manoonchai v1.0";


key <AE10> { [ 0x1000030, 0x1000029, 0x1000e50, voidsymbol ] };
key <AE01> { [ 0x1000031, 0x1000021, 0x1000e51, voidsymbol ] };
key <AE02> { [ 0x1000032, 0x1000040, 0x1000e52, voidsymbol ] };
key <AE03> { [ 0x1000033, 0x1000023, 0x1000e53, voidsymbol ] };
key <AE04> { [ 0x1000034, 0x1000024, 0x1000e54, voidsymbol ] };
key <AE05> { [ 0x1000035, 0x1000025, 0x1000e55, voidsymbol ] };
key <AE06> { [ 0x1000036, 0x100005e, 0x1000e56, voidsymbol ] };
key <AE07> { [ 0x1000037, 0x1000026, 0x1000e57, voidsymbol ] };
key <AE08> { [ 0x1000038, 0x100002a, 0x1000e58, voidsymbol ] };
key <AE09> { [ 0x1000039, 0x1000028, 0x1000e59, voidsymbol ] };
key <AE11> { [ 0x100002d, 0x100005f, 0x10000f7, voidsymbol ] };
key <AE12> { [ 0x100003d, 0x100002b, 0x10000d7, voidsymbol ] };
key <TLDE> { [ 0x1000060, 0x100007e, 0x1000060, voidsymbol ] };
key <AD01> { [ 0x1000e43, 0x1000e12, voidsymbol, voidsymbol ] };
key <AD02> { [ 0x1000e15, 0x1000e0f, voidsymbol, voidsymbol ] };
key <AD03> { [ 0x1000e2b, 0x1000e0b, voidsymbol, voidsymbol ] };
key <AD04> { [ 0x1000e25, 0x1000e0d, voidsymbol, voidsymbol ] };
key <AD05> { [ 0x1000e2a, 0x1000e1f, voidsymbol, voidsymbol ] };
key <AD06> { [ 0x1000e1b, 0x1000e09, voidsymbol, voidsymbol ] };
key <AD07> { [ 0x1000e31, 0x1000e36, 0x1000e3a, voidsymbol ] };
key <AD08> { [ 0x1000e01, 0x1000e18, voidsymbol, voidsymbol ] };
key <AD09> { [ 0x1000e34, 0x1000e10, voidsymbol, voidsymbol ] };
key <AD10> { [ 0x1000e1a, 0x1000e0e, voidsymbol, voidsymbol ] };
key <AD11> { [ 0x1000e47, 0x1000e06, 0x100005b, 0x100007b ] };
key <AD12> { [ 0x1000e2c, 0x1000e11, 0x100005d, 0x100007d ] };
key <AC01> { [ 0x1000e07, 0x1000e29, 0x10025cc, voidsymbol ] };
key <AC02> { [ 0x1000e40, 0x1000e16, 0x1000e4f, voidsymbol ] };
key <AC03> { [ 0x1000e23, 0x1000e41, 0x1000e5b, voidsymbol ] };
key <AC04> { [ 0x1000e19, 0x1000e0a, 0x1000e3f, voidsymbol ] };
key <AC05> { [ 0x1000e21, 0x1000e1e, voidsymbol, voidsymbol ] };
key <AC06> { [ 0x1000e2d, 0x1000e1c, 0x1000e4d, voidsymbol ] };
key <AC07> { [ 0x1000e32, 0x1000e33, 0x1000e45, voidsymbol ] };
key <AC08> { [ 0x1000e48, 0x1000e02, 0x1000e03, voidsymbol ] };
key <AC09> { [ 0x1000e49, 0x1000e42, voidsymbol, voidsymbol ] };
key <AC10> { [ 0x1000e27, 0x1000e20, 0x100003b, 0x100003a ] };
key <AC11> { [ 0x1000e37, 0x1000022, 0x1000027, 0x1000022 ] };
key <BKSL> { [ 0x1000e2f, 0x1000e0c, 0x100005c, 0x100007c ] };
key <AB01> { [ 0x1000e38, 0x1000e24, 0x1000e26, voidsymbol ] };
key <AB02> { [ 0x1000e44, 0x1000e1d, voidsymbol, voidsymbol ] };
key <AB03> { [ 0x1000e17, 0x1000e46, 0x1000e5a, voidsymbol ] };
key <AB04> { [ 0x1000e22, 0x1000e13, voidsymbol, voidsymbol ] };
key <AB05> { [ 0x1000e08, 0x1000e4a, voidsymbol, voidsymbol ] };
key <AB06> { [ 0x1000e04, 0x1000e4b, 0x1000e05, voidsymbol ] };
key <AB07> { [ 0x1000e35, 0x1000e4c, 0x1000e4e, voidsymbol ] };
key <AB08> { [ 0x1000e14, 0x1000e28, 0x100002c, 0x100003c ] };
key <AB09> { [ 0x1000e30, 0x1000e2e, 0x100002e, 0x100003e ] };
key <AB10> { [ 0x1000e39, 0x100003f, 0x100002f, 0x100003f ] };

include "level3(ralt_switch)"
};

0 comments on commit bc6ec41

Please sign in to comment.