scrapbox-keyboard-emulation
多分/emoji/scrapbox.icon以外でも使える
動作確認済みの環境
/icons2/Firefox.icon
そのうち/icons/GoogleChrome.iconでも確認しておきたい
本来keyだけを設定すればいいはずなのだが、非推奨のkeyCodeも渡さないとキー入力したことにならないみたい
code:script.js
const KEYCODE_MAP = {
Backspace:8,
Tab: 9,
Enter: 13,
Delete: 46,
Escape: 27,
' ': 32,
PageUp: 33,
PageDown: 34,
End: 35,
Home: 36,
ArrowLeft: 37,
ArrowUp: 38,
ArrowRight: 39,
ArrowDown: 40,
a: 65,
b: 66,
c: 67,
d: 68,
e: 69,
f: 70,
g: 71,
h: 72,
i: 73,
j: 74,
k: 75,
l: 76,
m: 77,
n: 78,
o: 79,
p: 80,
q: 81,
r: 82,
s: 83,
t: 84,
u: 85,
v: 86,
w: 87,
x: 88,
y: 89,
z: 90,
F5: 116,
F12: 123,
'[': 219,
};
本体
これclassにする必要ないような
外からcursorを指定できたほうが良いのでは?
code:script.js
export class KeyboardEmulator {
constructor({cursor = null} = {}){
this.cursor = cursor ?? document.getElementById('text-input');
}
press(key, {shiftKey = false, ctrlKey = false, altKey = false, noKey = false} = {}) {
// 大文字キーの場合は小文字にする
const lowerKey = key.length === 1 ? key.toLowerCase() : key;
console.log(No key code of ${key});
}
const keyObj = noKey ? {} : {key: key};
this.cursor.dispatchEvent(new KeyboardEvent('keydown', {
bubbles: true,
cancelable: true,
//...keyObj,
shiftKey: shiftKey,
ctrlKey: ctrlKey,
altKey: altKey,}));
}
}
テストtakker.icon
code:test.js
import {KeyboardEmulator} from '/api/code/takker/scrapbox-keyboard-emulation/script.js';
const emulator = new KeyboardEmulator();
window.emulator = emulator;
developper toolに↓を貼り付ける
コピペと切り取りはemulateできないようだ
noKeyを入れてkeyがないかどうかで変わるのか確かめてみたが、keyのあるなしで変化はなかった
おそらくclipboardを使っていないからできたのだと思われる
戻るのは行ける
code:js
const listener = document.body.addEventListener('keydown',e=>{
if (!e.key)return;
if (e.ctrlKey) return;
if ('hjkl[pdyu'.split('').includes(e.key)){
e.preventDefault();
e.stopPropagation();
switch(e.key){
case 'h':
emulator.press('ArrowLeft');
return;
case 'j':
emulator.press('ArrowDown');
return;
case 'k':
emulator.press('ArrowUp');
return;
case 'l':
emulator.press('ArrowRight');
return;
case 'p':
emulator.press('y',{ctrlKey: true});
return;
case 'y':
emulator.press('c',{ctrlKey: true});
return;
case 'd':
emulator.press('k',{ctrlKey: true});
return;
case 'u':
emulator.press('z',{ctrlKey: true});
return;
case '[':
emulator.press('Escape');
return;
}
}
});
document.body.addEventListener('keydown',e=>console.log(e));