commit dc421f035e88975c4c6862ce961799ceb68497a3 Author: ston1th Date: Mon Feb 11 23:58:53 2019 +0100 initial commit diff --git a/generate.sh b/generate.sh new file mode 100755 index 0000000..95c480b --- /dev/null +++ b/generate.sh @@ -0,0 +1,42 @@ +#!/bin/sh + +dir="pkg/lang" + +parse_keys() { + local file="${1%.*}" + local file="${file#*/}" + local file="${dir}/${file}.go" + cat <${file} +package lang + +var K = map[string]byte{ +"": 0, +EOF + grep -v -E "^$|^/" $1 | sed 's/=//g' | awk '{print "\""$1"\": "$2","}' >>${file} + echo "}" >>${file} + gofmt -w ${file} +} + +parse_lang() { + local lang="${1%.*}" + local lang="${lang#*/}" + local file="${dir}/${lang}.go" + cat <${file} +package lang + +func init() { +l := make(Lang) +EOF + grep -E "^A|^I|^U" $1 | sed 's/= \|,//g' | awk '{print "l[\""$1"\"] = Key{K[\""$2"\"],K[\""$3"\"]}"}' >>${file} + echo "Langs[\"${lang}\"] = l" >>${file} + echo "}" >>${file} + gofmt -w ${file} +} + +for f in $(ls keyboard/*.properties); do + parse_keys "${f}" +done + +for f in $(ls language/*.properties); do + parse_lang "${f}" +done diff --git a/keyboard/keyboard.properties b/keyboard/keyboard.properties new file mode 100644 index 0000000..8d559e3 --- /dev/null +++ b/keyboard/keyboard.properties @@ -0,0 +1,150 @@ +//default keys +MODIFIERKEY_CTRL = 0x01 +MODIFIERKEY_SHIFT = 0x02 +MODIFIERKEY_ALT = 0x04 +MODIFIERKEY_GUI = 0x08 +MODIFIERKEY_LEFT_CTRL = 0x01 +MODIFIERKEY_LEFT_SHIFT = 0x02 +MODIFIERKEY_LEFT_ALT = 0x04 +MODIFIERKEY_LEFT_GUI = 0x08 +MODIFIERKEY_RIGHT_CTRL = 0x10 +MODIFIERKEY_RIGHT_SHIFT= 0x20 +MODIFIERKEY_RIGHT_ALT = 0x40 +MODIFIERKEY_RIGHT_GUI = 0x80 + +KEY_MEDIA_VOLUME_INC = 0x80 +KEY_MEDIA_VOLUME_DEC = 0x81 +KEY_MEDIA_MUTE = 0x7F +KEY_MEDIA_PLAY_PAUSE = 0x08 +KEY_MEDIA_NEXT_TRACK = 0x10 +KEY_MEDIA_PREV_TRACK = 0x20 +//KEY_MEDIA_STOP = 0x40 +//KEY_MEDIA_EJECT = 0x80 + +KEY_A = 4 +KEY_B = 5 +KEY_C = 6 +KEY_D = 7 +KEY_E = 8 +KEY_F = 9 +KEY_G = 10 +KEY_H = 11 +KEY_I = 12 +KEY_J = 13 +KEY_K = 14 +KEY_L = 15 +KEY_M = 16 +KEY_N = 17 +KEY_O = 18 +KEY_P = 19 +KEY_Q = 20 +KEY_R = 21 +KEY_S = 22 +KEY_T = 23 +KEY_U = 24 +KEY_V = 25 +KEY_W = 26 +KEY_X = 27 +KEY_Y = 28 +KEY_Z = 29 +KEY_1 = 30 +KEY_2 = 31 +KEY_3 = 32 +KEY_4 = 33 +KEY_5 = 34 +KEY_6 = 35 +KEY_7 = 36 +KEY_8 = 37 +KEY_9 = 38 +KEY_0 = 39 +KEY_ENTER = 40 +KEY_ESC = 41 +KEY_BACKSPACE = 42 +KEY_TAB = 43 +KEY_SPACE = 44 +KEY_MINUS = 45 +KEY_EQUAL = 46 +KEY_LEFT_BRACE = 47 +KEY_RIGHT_BRACE = 48 +KEY_BACKSLASH = 49 +KEY_NON_US_NUM = 50 +KEY_SEMICOLON = 51 +KEY_QUOTE = 52 +KEY_TILDE = 53 +KEY_COMMA = 54 +KEY_PERIOD = 55 +KEY_SLASH = 56 +KEY_CAPS_LOCK = 57 +KEY_F1 = 58 +KEY_F2 = 59 +KEY_F3 = 60 +KEY_F4 = 61 +KEY_F5 = 62 +KEY_F6 = 63 +KEY_F7 = 64 +KEY_F8 = 65 +KEY_F9 = 66 +KEY_F10 = 67 +KEY_F11 = 68 +KEY_F12 = 69 +KEY_PRINTSCREEN = 70 +KEY_SCROLL_LOCK = 71 +KEY_PAUSE = 72 +KEY_INSERT = 73 +KEY_HOME = 74 +KEY_PAGEUP = 75 +KEY_DELETE = 76 +KEY_END = 77 +KEY_PAGEDOWN = 78 +KEY_RIGHT = 79 +KEY_LEFT = 80 +KEY_DOWN = 81 +KEY_UP = 82 +KEY_NUM_LOCK = 83 +KEYPAD_SLASH = 84 +KEYPAD_ASTERIX = 85 +KEYPAD_MINUS = 86 +KEYPAD_PLUS = 87 +KEYPAD_ENTER = 88 +KEYPAD_EQUALS = 103 +KEYPAD_1 = 89 +KEYPAD_2 = 90 +KEYPAD_3 = 91 +KEYPAD_4 = 92 +KEYPAD_5 = 93 +KEYPAD_6 = 94 +KEYPAD_7 = 95 +KEYPAD_8 = 96 +KEYPAD_9 = 97 +KEYPAD_0 = 98 +KEYPAD_PERIOD = 99 + +KEY_APP = 0x65 +KEY_POWER = 0x66 +KEY_EXE = 0x74 +KEY_HELP = 0x75 +KEY_MENU = 0x76 +KEY_SELECT = 0x77 +KEY_STOP = 0x78 +KEY_AGAIN = 0x79 +KEY_UNDO = 0x7A +KEY_CUT = 0x7B +KEY_COPY = 0x7C +KEY_PASTE = 0x7D +KEY_FIND = 0x7E + +KEY_SYSTEM_POWER = 0x81 +KEY_SYSTEM_SLEEP = 0x82 +KEY_SYSTEM_WAKE = 0x83 + +KEYPAD_PIPE = 0xC9 + +KEY_LEFT_CTRL = 0xE0 +KEY_LEFT_SHIFT = 0xE1 +KEY_LEFT_ALT = 0xE2 +KEY_LEFT_GUI = 0xE3 +KEY_COMMAND = 0xE3 +KEY_RIGHT_CTRL = 0xE4 +KEY_RIGHT_SHIFT= 0xE5 +KEY_RIGHT_ALT = 0xE6 +KEY_RIGHT_GUI = 0xE7 diff --git a/language/de.properties b/language/de.properties new file mode 100644 index 0000000..c7cea3e --- /dev/null +++ b/language/de.properties @@ -0,0 +1,290 @@ +//LAYOUT_GERMAN +//Credits go to webdirector for patch (02/17/2013) +KEY_NON_US_100 = 100 + +ASCII_20 = KEY_SPACE +// 32 +ASCII_21 = KEY_1, MODIFIERKEY_SHIFT +// 33 ! +ASCII_22 = KEY_2, MODIFIERKEY_SHIFT +// 34 " +ASCII_23 = KEY_BACKSLASH +// 35 # ?? +ASCII_24 = KEY_4, MODIFIERKEY_SHIFT +// 36 $ +ASCII_25 = KEY_5, MODIFIERKEY_SHIFT +// 37 % +ASCII_26 = KEY_6, MODIFIERKEY_SHIFT +// 38 & +ASCII_27 = KEY_BACKSLASH, MODIFIERKEY_SHIFT +// 39 ' +ASCII_28 = KEY_8, MODIFIERKEY_SHIFT +// 40 ( +ASCII_29 = KEY_9, MODIFIERKEY_SHIFT +// 41 ) +ASCII_2A = KEY_RIGHT_BRACE, MODIFIERKEY_SHIFT +// 42 * +ASCII_2B = KEY_RIGHT_BRACE +// 43 + +ASCII_2C = KEY_COMMA +// 44 , +ASCII_2D = KEY_SLASH +// 45 - +ASCII_2E = KEY_PERIOD +// 46 . +ASCII_2F = KEY_7, MODIFIERKEY_SHIFT +// 47 / +ASCII_30 = KEY_0 +// 48 0 +ASCII_31 = KEY_1 +// 49 1 +ASCII_32 = KEY_2 +// 50 2 +ASCII_33 = KEY_3 +// 51 3 +ASCII_34 = KEY_4 +// 52 4 +ASCII_35 = KEY_5 +// 53 5 +ASCII_36 = KEY_6 +// 54 6 +ASCII_37 = KEY_7 +// 55 7 +ASCII_38 = KEY_8 +// 55 8 +ASCII_39 = KEY_9 +// 57 9 +ASCII_3A = KEY_PERIOD, MODIFIERKEY_SHIFT +// 58 : +ASCII_3B = KEY_COMMA, MODIFIERKEY_SHIFT +// 59 ; +ASCII_3C = KEY_NON_US_100 +// 60 < +ASCII_3D = KEY_0, MODIFIERKEY_SHIFT +// 61 = +ASCII_3E = KEY_NON_US_100, MODIFIERKEY_SHIFT +// 62 > +ASCII_3F = KEY_MINUS, MODIFIERKEY_SHIFT +// 63 ? +ASCII_40 = KEY_Q, MODIFIERKEY_RIGHT_ALT +// 64 @ +ASCII_41 = KEY_A, MODIFIERKEY_SHIFT +// 65 A +ASCII_42 = KEY_B, MODIFIERKEY_SHIFT +// 66 B +ASCII_43 = KEY_C, MODIFIERKEY_SHIFT +// 67 C +ASCII_44 = KEY_D, MODIFIERKEY_SHIFT +// 68 D +ASCII_45 = KEY_E, MODIFIERKEY_SHIFT +// 69 E +ASCII_46 = KEY_F, MODIFIERKEY_SHIFT +// 70 F +ASCII_47 = KEY_G, MODIFIERKEY_SHIFT +// 71 G +ASCII_48 = KEY_H, MODIFIERKEY_SHIFT +// 72 H +ASCII_49 = KEY_I, MODIFIERKEY_SHIFT +// 73 I +ASCII_4A = KEY_J, MODIFIERKEY_SHIFT +// 74 J +ASCII_4B = KEY_K, MODIFIERKEY_SHIFT +// 75 K +ASCII_4C = KEY_L, MODIFIERKEY_SHIFT +// 76 L +ASCII_4D = KEY_M, MODIFIERKEY_SHIFT +// 77 M +ASCII_4E = KEY_N, MODIFIERKEY_SHIFT +// 78 N +ASCII_4F = KEY_O, MODIFIERKEY_SHIFT +// 79 O +ASCII_50 = KEY_P, MODIFIERKEY_SHIFT +// 80 P +ASCII_51 = KEY_Q, MODIFIERKEY_SHIFT +// 81 Q +ASCII_52 = KEY_R, MODIFIERKEY_SHIFT +// 82 R +ASCII_53 = KEY_S, MODIFIERKEY_SHIFT +// 83 S +ASCII_54 = KEY_T, MODIFIERKEY_SHIFT +// 84 T +ASCII_55 = KEY_U, MODIFIERKEY_SHIFT +// 85 U +ASCII_56 = KEY_V, MODIFIERKEY_SHIFT +// 86 V +ASCII_57 = KEY_W, MODIFIERKEY_SHIFT +// 87 W +ASCII_58 = KEY_X, MODIFIERKEY_SHIFT +// 88 X +ASCII_59 = KEY_Z, MODIFIERKEY_SHIFT +// 89 Y +ASCII_5A = KEY_Y, MODIFIERKEY_SHIFT +// 90 Z +ASCII_5B = KEY_8, MODIFIERKEY_RIGHT_ALT +// 91 [ +ASCII_5C = KEY_MINUS, MODIFIERKEY_RIGHT_ALT +// 92 +ASCII_5D = KEY_9, MODIFIERKEY_RIGHT_ALT +// 93 ] +ASCII_5E = KEY_TILDE +// 94 ^ +ASCII_5F = KEY_SLASH, MODIFIERKEY_SHIFT +// 95 _ +ASCII_60 = KEY_EQUAL, MODIFIERKEY_SHIFT +//GRAVE_ACCENT_BITS + KEY_SPACE +// 96 ` +ASCII_61 = KEY_A +// 97 a +ASCII_62 = KEY_B +// 98 b +ASCII_63 = KEY_C +// 99 c +ASCII_64 = KEY_D +// 100 d +ASCII_65 = KEY_E +// 101 e +ASCII_66 = KEY_F +// 102 f +ASCII_67 = KEY_G +// 103 g +ASCII_68 = KEY_H +// 104 h +ASCII_69 = KEY_I +// 105 i +ASCII_6A = KEY_J +// 106 j +ASCII_6B = KEY_K +// 107 k +ASCII_6C = KEY_L +// 108 l +ASCII_6D = KEY_M +// 109 m +ASCII_6E = KEY_N +// 110 n +ASCII_6F = KEY_O +// 111 o +ASCII_70 = KEY_P +// 112 p +ASCII_71 = KEY_Q +// 113 q +ASCII_72 = KEY_R +// 114 r +ASCII_73 = KEY_S +// 115 s +ASCII_74 = KEY_T +// 116 t +ASCII_75 = KEY_U +// 117 u +ASCII_76 = KEY_V +// 118 v +ASCII_77 = KEY_W +// 119 w +ASCII_78 = KEY_X +// 120 x +ASCII_79 = KEY_Z +// 121 y +ASCII_7A = KEY_Y +// 122 z +ASCII_7B = KEY_7, MODIFIERKEY_RIGHT_ALT +// 123 { +ASCII_7C = KEY_NON_US_100, MODIFIERKEY_RIGHT_ALT +// 124 | +ASCII_7D = KEY_0, MODIFIERKEY_RIGHT_ALT +// 125 } +ASCII_7E = KEY_RIGHT_BRACE, MODIFIERKEY_RIGHT_ALT +// 126 ~ +ASCII_7F = KEY_BACKSPACE +// 127 +ISO_8859_1_A0 = KEY_SPACE +// 160 Nonbreakng Space +ISO_8859_1_A4 = KEY_E, MODIFIERKEY_RIGHT_ALT +// 164 ¤ Currency Sign +ISO_8859_1_A7 = KEY_3, MODIFIERKEY_SHIFT +// 167 § SECTION SIGN +ISO_8859_1_B0 = KEY_TILDE, MODIFIERKEY_SHIFT +// 176 ° DEGREE SIGN +ISO_8859_1_B2 = KEY_2, MODIFIERKEY_RIGHT_ALT +// 178 ² SUPERSCRIPT TWO +ISO_8859_1_B3 = KEY_3, MODIFIERKEY_RIGHT_ALT +// 179 ³ SUPERSCRIPT THREE +//ISO_8859_1_C0 = GRAVE_ACCENT_BITS + KEY_A, MODIFIERKEY_SHIFT +// 192 À A GRAVE +//ISO_8859_1_C1 = ACUTE_ACCENT_BITS + KEY_A, MODIFIERKEY_SHIFT +// 193 Á A ACUTE +//ISO_8859_1_C2 = CIRCUMFLEX_BITS = + KEY_A, MODIFIERKEY_SHIFT +// 194 Â A CIRCUMFLEX +ISO_8859_1_C4 = KEY_QUOTE, MODIFIERKEY_SHIFT +// 196 Ä A DIAERESIS +//ISO_8859_1_C8 = GRAVE_ACCENT_BITS + KEY_E, MODIFIERKEY_SHIFT +// 200 È E GRAVE +//ISO_8859_1_C9 = ACUTE_ACCENT_BITS + KEY_E, MODIFIERKEY_SHIFT +// 201 É E ACUTE +//ISO_8859_1_CA = CIRCUMFLEX_BITS + KEY_E, MODIFIERKEY_SHIFT +// 202 Ê E CIRCUMFLEX +//ISO_8859_1_CC = GRAVE_ACCENT_BITS + KEY_I, MODIFIERKEY_SHIFT +// 204 Ì I GRAVE +//ISO_8859_1_CD = ACUTE_ACCENT_BITS + KEY_I, MODIFIERKEY_SHIFT +// 205 Í I ACUTE +//ISO_8859_1_CE = CIRCUMFLEX_BITS + KEY_I, MODIFIERKEY_SHIFT +// 206 Î I CIRCUMFLEX +//ISO_8859_1_D2 = GRAVE_ACCENT_BITS + KEY_O, MODIFIERKEY_SHIFT +// 210 Ò O GRAVE +//ISO_8859_1_D3 = ACUTE_ACCENT_BITS + KEY_O, MODIFIERKEY_SHIFT +// 211 Ó O ACUTE +//ISO_8859_1_D4 = CIRCUMFLEX_BITS + KEY_O, MODIFIERKEY_SHIFT +// 212 Ô O CIRCUMFLEX +ISO_8859_1_D6 = KEY_SEMICOLON, MODIFIERKEY_SHIFT +// 214 Ö O DIAERESIS +//ISO_8859_1_D9 = GRAVE_ACCENT_BITS + KEY_U, MODIFIERKEY_SHIFT +// 217 Ù U GRAVE +//ISO_8859_1_DA = ACUTE_ACCENT_BITS + KEY_U, MODIFIERKEY_SHIFT +// 218 Ú U ACUTE +//ISO_8859_1_DB = CIRCUMFLEX_BITS + KEY_U, MODIFIERKEY_SHIFT +// 219 Û U CIRCUMFLEX +ISO_8859_1_DC = KEY_LEFT_BRACE, MODIFIERKEY_SHIFT +// 220 Ü U DIAERESIS +//ISO_8859_1_DD = ACUTE_ACCENT_BITS + KEY_Z, MODIFIERKEY_SHIFT +// 221 Ý Y ACUTE +ISO_8859_1_DF = KEY_MINUS +// 223 ß SHARP S +//ISO_8859_1_E0 = GRAVE_ACCENT_BITS + KEY_A +// 224 à a GRAVE +//ISO_8859_1_E1 = ACUTE_ACCENT_BITS + KEY_A +// 225 á a ACUTE +//ISO_8859_1_E2 = CIRCUMFLEX_BITS + KEY_A +// 226 â a CIRCUMFLEX +ISO_8859_1_E4 = KEY_QUOTE +// 228 ä a DIAERESIS +//ISO_8859_1_E8 = GRAVE_ACCENT_BITS + KEY_E +// 232 è e GRAVE +//ISO_8859_1_E9 = ACUTE_ACCENT_BITS + KEY_E +// 233 é e ACUTE +//ISO_8859_1_EA = CIRCUMFLEX_BITS + KEY_E +// 234 ê e CIRCUMFLEX +//ISO_8859_1_EC = GRAVE_ACCENT_BITS + KEY_I +// 236 ì i GRAVE +//ISO_8859_1_ED = ACUTE_ACCENT_BITS + KEY_I +// 237 í i ACUTE +//ISO_8859_1_EE = CIRCUMFLEX_BITS + KEY_I +// 238 î i CIRCUMFLEX +//ISO_8859_1_F2 = GRAVE_ACCENT_BITS + KEY_O +// 242 ò o GRAVE +//ISO_8859_1_F3 = ACUTE_ACCENT_BITS + KEY_O +// 243 ó o ACUTE +//ISO_8859_1_F4 = CIRCUMFLEX_BITS + KEY_O +// 244 ô o CIRCUMFLEX +ISO_8859_1_F6 = KEY_SEMICOLON +// 246 ö o DIAERESIS +//ISO_8859_1_F9 = GRAVE_ACCENT_BITS + KEY_U +// 249 ù u GRAVE +//ISO_8859_1_FA = ACUTE_ACCENT_BITS + KEY_U +// 250 ú u ACUTE +//ISO_8859_1_FB = CIRCUMFLEX_BITS + KEY_U +// 251 û u CIRCUMFLEX +ISO_8859_1_FC = KEY_LEFT_BRACE +// 252 ü u DIAERESIS +//ISO_8859_1_FD = ACUTE_ACCENT_BITS + KEY_Z +// 253 ý y ACUTE +UNICODE_20AC = KEY_E, MODIFIERKEY_RIGHT_ALT +// € Euro Sign + diff --git a/main.go b/main.go new file mode 100644 index 0000000..dd1175c --- /dev/null +++ b/main.go @@ -0,0 +1,33 @@ +package main + +import ( + "bytes" + "fmt" + "git.giftfish.de/ston1th/duckycode/pkg/encode" + "os" +) + +func main() { + // var buf = bytes.NewBufferString(` + //REM The next three lines execute a command prompt in Windows + //GUI r + //STRING cmd + //ENTER + //`) + var buf = bytes.NewBufferString(` +REM Type Hello World into Windows notepad. Target: Windows 95 and beyond. Author: Darren +DELAY 1000 +GUI r +DELAY 100 +STRING c:\windows\notepad.exe +ENTER +DELAY 1000 +STRING Hello World +`) + e := encode.NewEncoder(buf, "de") + b, err := e.Encode() + if err != nil { + fmt.Println(err) + } + os.Stdout.Write(b) +} diff --git a/pkg/encode/encode.go b/pkg/encode/encode.go new file mode 100644 index 0000000..cc3aaed --- /dev/null +++ b/pkg/encode/encode.go @@ -0,0 +1,202 @@ +package encode + +import ( + "bufio" + "fmt" + "io" + "os" + "strconv" + "strings" + + "git.giftfish.de/ston1th/duckycode/pkg/lang" +) + +type Encoder struct { + reader io.Reader + language string + defaultDelay int + delayOverride bool + loop int + repeat bool +} + +func NewEncoder(r io.Reader, language string) *Encoder { + if language == "" { + language = "de" + } + return &Encoder{r, language, 0, false, 0, false} +} + +func (e *Encoder) Encode() (buf []byte, err error) { + scanner := bufio.NewScanner(e.reader) + for scanner.Scan() { + if err = scanner.Err(); err != nil { + return + } + s := strings.SplitN(scanner.Text(), " ", 2) + + switch len(s) { + case 1: + if b := e.instruction(s[0]); b != 0 { + fmt.Fprintf(os.Stderr, "%s\n", s[0]) + buf = append(buf, []byte{b, 0}...) + fmt.Fprintf(os.Stderr, "%#v\n", buf) + } + case 2: + fmt.Fprintf(os.Stderr, "%s:%s\n", s[0], s[1]) + buf = append(buf, e.instructionData(s[0], s[1])...) + fmt.Fprintf(os.Stderr, "%#v\n", buf) + } + if !e.delayOverride && e.defaultDelay > 0 { + delayCounter := e.defaultDelay + for delayCounter > 0 { + buf = append(buf, byte(0)) + if delayCounter > 255 { + buf = append(buf, byte(255)) + delayCounter -= 255 + } else { + buf = append(buf, byte(delayCounter)) + delayCounter = 0 + } + } + } + } + return +} + +func (e *Encoder) instruction(in string) byte { + if b, ok := lang.K["KEY_"+in]; ok { + return b + } + switch in { + case "", "REM": + return 0 + case "ESCAPE": + return e.instruction("ESC") + case "DEL": + return e.instruction("DELETE") + case "BREAK": + return e.instruction("PAUSE") + case "CONTROL": + return e.instruction("CTRL") + case "DOWNARROW": + return e.instruction("DOWM") + case "UPARROW": + return e.instruction("UP") + case "LEFTARROW": + return e.instruction("LEFT") + case "RIGHTARROW": + return e.instruction("RIGHT") + case "MENU": + return e.instruction("APP") + case "WINDOWS": + return e.instruction("GUI") + case "PLAY": + return e.instruction("MEDIA_PLAY_PAUSE") + case "MUTE": + return e.instruction("MEDIA_MUTE") + case "VOLUMEUP": + return e.instruction("MEDIA_VOLUME_INC") + case "VOLUMEDOWN": + return e.instruction("MEDIAVOLUME_DEC") + case "SCROLLLOCK": + return e.instruction("SCROLL_LOCK") + case "NUMLOCK": + return e.instruction("NUM_LOCK") + case "CAPSLOCK": + return e.instruction("CAPS_LOCK") + + case "CTRL": + return e.instruction("LEFT_CTRL") + case "ALT": + return e.instruction("LEFT_ALT") + case "SHIFT": + return e.instruction("LEFT_SHIFT") + case "ALT-SHIFT": + //TODO + return 0 + case "ALT-TAB": + //TODO + return 0 + } + return e.encodeRune(rune(in[0]))[0] +} + +func (e *Encoder) instructionData(in string, data string) (b []byte) { + switch in { + case "DEFAULT_DELAY", "DEFAULTDELAY": + delay, err := strconv.Atoi(data) + if err == nil { + e.defaultDelay = delay + e.delayOverride = true + } + return nil + case "DELAY": + delay, err := strconv.Atoi(data) + if err != nil { + return nil + } + for delay > 0 { + b = append(b, byte(0)) + if delay > 255 { + b = append(b, byte(255)) + delay -= 255 + } else { + b = append(b, byte(delay)) + delay = 0 + } + } + e.delayOverride = true + return + case "", "REM": + return nil + case "STRING": + for _, r := range data { + enc := e.encodeRune(r) + if len(enc)%2 != 0 { + enc = append(enc, byte(0)) + } + b = append(b, enc...) + } + return + case "CONTROL", "CTRL": + return []byte{e.instruction(data), lang.K["MODIFIERKEY_CTRL"]} + case "ALT": + return []byte{e.instruction(data), lang.K["MODIFIERKEY_ALT"]} + case "SHIFT": + return []byte{e.instruction(data), lang.K["MODIFIERKEY_SHIFT"]} + case "CTRL-ALT": + return []byte{e.instruction(data), lang.K["MODIFIERKEY_CTRL"] | lang.K["MODIFIERKEY_ALT"]} + case "CTRL-SHIFT": + return []byte{e.instruction(data), lang.K["MODIFIERKEY_CTRL"] | lang.K["MODIFIERKEY_SHIFT"]} + case "COMMAND-OPTION": + return []byte{e.instruction(data), lang.K["MODIFIERKEY_LEFT_GUI"] | lang.K["MODIFIERKEY_ALT"]} + case "ALT-SHIFT": + return []byte{e.instruction(data), lang.K["MODIFIERKEY_LEFT_ALT"] | lang.K["MODIFIERKEY_SHIFT"]} + case "WINDOWS", "GUI", "COMMAND": + return []byte{e.instruction(data), lang.K["MODIFIERKEY_LEFT_GUI"]} + } + return []byte{e.instruction(data), 0} +} + +func (e *Encoder) encodeRune(r rune) []byte { + var code string + hex := strings.ToUpper(strconv.FormatUint(uint64(r), 16)) + switch { + case r < 128: + code = "ASCII_" + hex + case r < 256: + code = "ISO_8859_1_" + hex + default: + code = "UNICODE_" + hex + } + if b, ok := lang.K[code]; ok { + return []byte{b} + } else if k, ok := lang.Langs[e.language][code]; ok { + if k.Mod != 0 { + return []byte{k.Key, k.Mod} + } + return []byte{k.Key} + } + return nil +} diff --git a/pkg/lang/de.go b/pkg/lang/de.go new file mode 100644 index 0000000..05e6679 --- /dev/null +++ b/pkg/lang/de.go @@ -0,0 +1,116 @@ +package lang + +func init() { + l := make(Lang) + l["ASCII_20"] = Key{K["KEY_SPACE"], K[""]} + l["ASCII_21"] = Key{K["KEY_1"], K["MODIFIERKEY_SHIFT"]} + l["ASCII_22"] = Key{K["KEY_2"], K["MODIFIERKEY_SHIFT"]} + l["ASCII_23"] = Key{K["KEY_BACKSLASH"], K[""]} + l["ASCII_24"] = Key{K["KEY_4"], K["MODIFIERKEY_SHIFT"]} + l["ASCII_25"] = Key{K["KEY_5"], K["MODIFIERKEY_SHIFT"]} + l["ASCII_26"] = Key{K["KEY_6"], K["MODIFIERKEY_SHIFT"]} + l["ASCII_27"] = Key{K["KEY_BACKSLASH"], K["MODIFIERKEY_SHIFT"]} + l["ASCII_28"] = Key{K["KEY_8"], K["MODIFIERKEY_SHIFT"]} + l["ASCII_29"] = Key{K["KEY_9"], K["MODIFIERKEY_SHIFT"]} + l["ASCII_2A"] = Key{K["KEY_RIGHT_BRACE"], K["MODIFIERKEY_SHIFT"]} + l["ASCII_2B"] = Key{K["KEY_RIGHT_BRACE"], K[""]} + l["ASCII_2C"] = Key{K["KEY_COMMA"], K[""]} + l["ASCII_2D"] = Key{K["KEY_SLASH"], K[""]} + l["ASCII_2E"] = Key{K["KEY_PERIOD"], K[""]} + l["ASCII_2F"] = Key{K["KEY_7"], K["MODIFIERKEY_SHIFT"]} + l["ASCII_30"] = Key{K["KEY_0"], K[""]} + l["ASCII_31"] = Key{K["KEY_1"], K[""]} + l["ASCII_32"] = Key{K["KEY_2"], K[""]} + l["ASCII_33"] = Key{K["KEY_3"], K[""]} + l["ASCII_34"] = Key{K["KEY_4"], K[""]} + l["ASCII_35"] = Key{K["KEY_5"], K[""]} + l["ASCII_36"] = Key{K["KEY_6"], K[""]} + l["ASCII_37"] = Key{K["KEY_7"], K[""]} + l["ASCII_38"] = Key{K["KEY_8"], K[""]} + l["ASCII_39"] = Key{K["KEY_9"], K[""]} + l["ASCII_3A"] = Key{K["KEY_PERIOD"], K["MODIFIERKEY_SHIFT"]} + l["ASCII_3B"] = Key{K["KEY_COMMA"], K["MODIFIERKEY_SHIFT"]} + l["ASCII_3C"] = Key{K["KEY_NON_US_100"], K[""]} + l["ASCII_3D"] = Key{K["KEY_0"], K["MODIFIERKEY_SHIFT"]} + l["ASCII_3E"] = Key{K["KEY_NON_US_100"], K["MODIFIERKEY_SHIFT"]} + l["ASCII_3F"] = Key{K["KEY_MINUS"], K["MODIFIERKEY_SHIFT"]} + l["ASCII_40"] = Key{K["KEY_Q"], K["MODIFIERKEY_RIGHT_ALT"]} + l["ASCII_41"] = Key{K["KEY_A"], K["MODIFIERKEY_SHIFT"]} + l["ASCII_42"] = Key{K["KEY_B"], K["MODIFIERKEY_SHIFT"]} + l["ASCII_43"] = Key{K["KEY_C"], K["MODIFIERKEY_SHIFT"]} + l["ASCII_44"] = Key{K["KEY_D"], K["MODIFIERKEY_SHIFT"]} + l["ASCII_45"] = Key{K["KEY_E"], K["MODIFIERKEY_SHIFT"]} + l["ASCII_46"] = Key{K["KEY_F"], K["MODIFIERKEY_SHIFT"]} + l["ASCII_47"] = Key{K["KEY_G"], K["MODIFIERKEY_SHIFT"]} + l["ASCII_48"] = Key{K["KEY_H"], K["MODIFIERKEY_SHIFT"]} + l["ASCII_49"] = Key{K["KEY_I"], K["MODIFIERKEY_SHIFT"]} + l["ASCII_4A"] = Key{K["KEY_J"], K["MODIFIERKEY_SHIFT"]} + l["ASCII_4B"] = Key{K["KEY_K"], K["MODIFIERKEY_SHIFT"]} + l["ASCII_4C"] = Key{K["KEY_L"], K["MODIFIERKEY_SHIFT"]} + l["ASCII_4D"] = Key{K["KEY_M"], K["MODIFIERKEY_SHIFT"]} + l["ASCII_4E"] = Key{K["KEY_N"], K["MODIFIERKEY_SHIFT"]} + l["ASCII_4F"] = Key{K["KEY_O"], K["MODIFIERKEY_SHIFT"]} + l["ASCII_50"] = Key{K["KEY_P"], K["MODIFIERKEY_SHIFT"]} + l["ASCII_51"] = Key{K["KEY_Q"], K["MODIFIERKEY_SHIFT"]} + l["ASCII_52"] = Key{K["KEY_R"], K["MODIFIERKEY_SHIFT"]} + l["ASCII_53"] = Key{K["KEY_S"], K["MODIFIERKEY_SHIFT"]} + l["ASCII_54"] = Key{K["KEY_T"], K["MODIFIERKEY_SHIFT"]} + l["ASCII_55"] = Key{K["KEY_U"], K["MODIFIERKEY_SHIFT"]} + l["ASCII_56"] = Key{K["KEY_V"], K["MODIFIERKEY_SHIFT"]} + l["ASCII_57"] = Key{K["KEY_W"], K["MODIFIERKEY_SHIFT"]} + l["ASCII_58"] = Key{K["KEY_X"], K["MODIFIERKEY_SHIFT"]} + l["ASCII_59"] = Key{K["KEY_Z"], K["MODIFIERKEY_SHIFT"]} + l["ASCII_5A"] = Key{K["KEY_Y"], K["MODIFIERKEY_SHIFT"]} + l["ASCII_5B"] = Key{K["KEY_8"], K["MODIFIERKEY_RIGHT_ALT"]} + l["ASCII_5C"] = Key{K["KEY_MINUS"], K["MODIFIERKEY_RIGHT_ALT"]} + l["ASCII_5D"] = Key{K["KEY_9"], K["MODIFIERKEY_RIGHT_ALT"]} + l["ASCII_5E"] = Key{K["KEY_TILDE"], K[""]} + l["ASCII_5F"] = Key{K["KEY_SLASH"], K["MODIFIERKEY_SHIFT"]} + l["ASCII_60"] = Key{K["KEY_EQUAL"], K["MODIFIERKEY_SHIFT"]} + l["ASCII_61"] = Key{K["KEY_A"], K[""]} + l["ASCII_62"] = Key{K["KEY_B"], K[""]} + l["ASCII_63"] = Key{K["KEY_C"], K[""]} + l["ASCII_64"] = Key{K["KEY_D"], K[""]} + l["ASCII_65"] = Key{K["KEY_E"], K[""]} + l["ASCII_66"] = Key{K["KEY_F"], K[""]} + l["ASCII_67"] = Key{K["KEY_G"], K[""]} + l["ASCII_68"] = Key{K["KEY_H"], K[""]} + l["ASCII_69"] = Key{K["KEY_I"], K[""]} + l["ASCII_6A"] = Key{K["KEY_J"], K[""]} + l["ASCII_6B"] = Key{K["KEY_K"], K[""]} + l["ASCII_6C"] = Key{K["KEY_L"], K[""]} + l["ASCII_6D"] = Key{K["KEY_M"], K[""]} + l["ASCII_6E"] = Key{K["KEY_N"], K[""]} + l["ASCII_6F"] = Key{K["KEY_O"], K[""]} + l["ASCII_70"] = Key{K["KEY_P"], K[""]} + l["ASCII_71"] = Key{K["KEY_Q"], K[""]} + l["ASCII_72"] = Key{K["KEY_R"], K[""]} + l["ASCII_73"] = Key{K["KEY_S"], K[""]} + l["ASCII_74"] = Key{K["KEY_T"], K[""]} + l["ASCII_75"] = Key{K["KEY_U"], K[""]} + l["ASCII_76"] = Key{K["KEY_V"], K[""]} + l["ASCII_77"] = Key{K["KEY_W"], K[""]} + l["ASCII_78"] = Key{K["KEY_X"], K[""]} + l["ASCII_79"] = Key{K["KEY_Z"], K[""]} + l["ASCII_7A"] = Key{K["KEY_Y"], K[""]} + l["ASCII_7B"] = Key{K["KEY_7"], K["MODIFIERKEY_RIGHT_ALT"]} + l["ASCII_7C"] = Key{K["KEY_NON_US_100"], K["MODIFIERKEY_RIGHT_ALT"]} + l["ASCII_7D"] = Key{K["KEY_0"], K["MODIFIERKEY_RIGHT_ALT"]} + l["ASCII_7E"] = Key{K["KEY_RIGHT_BRACE"], K["MODIFIERKEY_RIGHT_ALT"]} + l["ASCII_7F"] = Key{K["KEY_BACKSPACE"], K[""]} + l["ISO_8859_1_A0"] = Key{K["KEY_SPACE"], K[""]} + l["ISO_8859_1_A4"] = Key{K["KEY_E"], K["MODIFIERKEY_RIGHT_ALT"]} + l["ISO_8859_1_A7"] = Key{K["KEY_3"], K["MODIFIERKEY_SHIFT"]} + l["ISO_8859_1_B0"] = Key{K["KEY_TILDE"], K["MODIFIERKEY_SHIFT"]} + l["ISO_8859_1_B2"] = Key{K["KEY_2"], K["MODIFIERKEY_RIGHT_ALT"]} + l["ISO_8859_1_B3"] = Key{K["KEY_3"], K["MODIFIERKEY_RIGHT_ALT"]} + l["ISO_8859_1_C4"] = Key{K["KEY_QUOTE"], K["MODIFIERKEY_SHIFT"]} + l["ISO_8859_1_D6"] = Key{K["KEY_SEMICOLON"], K["MODIFIERKEY_SHIFT"]} + l["ISO_8859_1_DC"] = Key{K["KEY_LEFT_BRACE"], K["MODIFIERKEY_SHIFT"]} + l["ISO_8859_1_DF"] = Key{K["KEY_MINUS"], K[""]} + l["ISO_8859_1_E4"] = Key{K["KEY_QUOTE"], K[""]} + l["ISO_8859_1_F6"] = Key{K["KEY_SEMICOLON"], K[""]} + l["ISO_8859_1_FC"] = Key{K["KEY_LEFT_BRACE"], K[""]} + l["UNICODE_20AC"] = Key{K["KEY_E"], K["MODIFIERKEY_RIGHT_ALT"]} + Langs["de"] = l +} diff --git a/pkg/lang/keyboard.go b/pkg/lang/keyboard.go new file mode 100644 index 0000000..7389653 --- /dev/null +++ b/pkg/lang/keyboard.go @@ -0,0 +1,146 @@ +package lang + +var K = map[string]byte{ + "": 0, + "MODIFIERKEY_CTRL": 0x01, + "MODIFIERKEY_SHIFT": 0x02, + "MODIFIERKEY_ALT": 0x04, + "MODIFIERKEY_GUI": 0x08, + "MODIFIERKEY_LEFT_CTRL": 0x01, + "MODIFIERKEY_LEFT_SHIFT": 0x02, + "MODIFIERKEY_LEFT_ALT": 0x04, + "MODIFIERKEY_LEFT_GUI": 0x08, + "MODIFIERKEY_RIGHT_CTRL": 0x10, + "MODIFIERKEY_RIGHT_SHIFT": 0x20, + "MODIFIERKEY_RIGHT_ALT": 0x40, + "MODIFIERKEY_RIGHT_GUI": 0x80, + "KEY_MEDIA_VOLUME_INC": 0x80, + "KEY_MEDIA_VOLUME_DEC": 0x81, + "KEY_MEDIA_MUTE": 0x7F, + "KEY_MEDIA_PLAY_PAUSE": 0x08, + "KEY_MEDIA_NEXT_TRACK": 0x10, + "KEY_MEDIA_PREV_TRACK": 0x20, + "KEY_A": 4, + "KEY_B": 5, + "KEY_C": 6, + "KEY_D": 7, + "KEY_E": 8, + "KEY_F": 9, + "KEY_G": 10, + "KEY_H": 11, + "KEY_I": 12, + "KEY_J": 13, + "KEY_K": 14, + "KEY_L": 15, + "KEY_M": 16, + "KEY_N": 17, + "KEY_O": 18, + "KEY_P": 19, + "KEY_Q": 20, + "KEY_R": 21, + "KEY_S": 22, + "KEY_T": 23, + "KEY_U": 24, + "KEY_V": 25, + "KEY_W": 26, + "KEY_X": 27, + "KEY_Y": 28, + "KEY_Z": 29, + "KEY_1": 30, + "KEY_2": 31, + "KEY_3": 32, + "KEY_4": 33, + "KEY_5": 34, + "KEY_6": 35, + "KEY_7": 36, + "KEY_8": 37, + "KEY_9": 38, + "KEY_0": 39, + "KEY_ENTER": 40, + "KEY_ESC": 41, + "KEY_BACKSPACE": 42, + "KEY_TAB": 43, + "KEY_SPACE": 44, + "KEY_MINUS": 45, + "KEY_EQUAL": 46, + "KEY_LEFT_BRACE": 47, + "KEY_RIGHT_BRACE": 48, + "KEY_BACKSLASH": 49, + "KEY_NON_US_NUM": 50, + "KEY_SEMICOLON": 51, + "KEY_QUOTE": 52, + "KEY_TILDE": 53, + "KEY_COMMA": 54, + "KEY_PERIOD": 55, + "KEY_SLASH": 56, + "KEY_CAPS_LOCK": 57, + "KEY_F1": 58, + "KEY_F2": 59, + "KEY_F3": 60, + "KEY_F4": 61, + "KEY_F5": 62, + "KEY_F6": 63, + "KEY_F7": 64, + "KEY_F8": 65, + "KEY_F9": 66, + "KEY_F10": 67, + "KEY_F11": 68, + "KEY_F12": 69, + "KEY_PRINTSCREEN": 70, + "KEY_SCROLL_LOCK": 71, + "KEY_PAUSE": 72, + "KEY_INSERT": 73, + "KEY_HOME": 74, + "KEY_PAGEUP": 75, + "KEY_DELETE": 76, + "KEY_END": 77, + "KEY_PAGEDOWN": 78, + "KEY_RIGHT": 79, + "KEY_LEFT": 80, + "KEY_DOWN": 81, + "KEY_UP": 82, + "KEY_NUM_LOCK": 83, + "KEYPAD_SLASH": 84, + "KEYPAD_ASTERIX": 85, + "KEYPAD_MINUS": 86, + "KEYPAD_PLUS": 87, + "KEYPAD_ENTER": 88, + "KEYPAD_EQUALS": 103, + "KEYPAD_1": 89, + "KEYPAD_2": 90, + "KEYPAD_3": 91, + "KEYPAD_4": 92, + "KEYPAD_5": 93, + "KEYPAD_6": 94, + "KEYPAD_7": 95, + "KEYPAD_8": 96, + "KEYPAD_9": 97, + "KEYPAD_0": 98, + "KEYPAD_PERIOD": 99, + "KEY_APP": 0x65, + "KEY_POWER": 0x66, + "KEY_EXE": 0x74, + "KEY_HELP": 0x75, + "KEY_MENU": 0x76, + "KEY_SELECT": 0x77, + "KEY_STOP": 0x78, + "KEY_AGAIN": 0x79, + "KEY_UNDO": 0x7A, + "KEY_CUT": 0x7B, + "KEY_COPY": 0x7C, + "KEY_PASTE": 0x7D, + "KEY_FIND": 0x7E, + "KEY_SYSTEM_POWER": 0x81, + "KEY_SYSTEM_SLEEP": 0x82, + "KEY_SYSTEM_WAKE": 0x83, + "KEYPAD_PIPE": 0xC9, + "KEY_LEFT_CTRL": 0xE0, + "KEY_LEFT_SHIFT": 0xE1, + "KEY_LEFT_ALT": 0xE2, + "KEY_LEFT_GUI": 0xE3, + "KEY_COMMAND": 0xE3, + "KEY_RIGHT_CTRL": 0xE4, + "KEY_RIGHT_SHIFT": 0xE5, + "KEY_RIGHT_ALT": 0xE6, + "KEY_RIGHT_GUI": 0xE7, +} diff --git a/pkg/lang/lang.go b/pkg/lang/lang.go new file mode 100644 index 0000000..dd1f17e --- /dev/null +++ b/pkg/lang/lang.go @@ -0,0 +1,10 @@ +package lang + +var Langs = make(map[string]Lang) + +type Lang map[string]Key + +type Key struct { + Key byte + Mod byte +}