scrapVimの実装の話
from Vim Advent Calendar 2020の記事を書く
お蔵入りした
内容がjavascript only
vimと関係ない
/icons/hr.icon
テキスト編集とカーソル移動は、キーボードとマウスのイベントをscriptから発行して操作しています
キーボード入力代行 (javascript)
別のUserScriptを作成したときに試行錯誤済みの部分だったのでそこまで苦労しませんでした
こちらの記事にある方法で実装しました
JavaScript でキーボード入力を代行させる / JavaScript | PersonWriter's Room
code:script.js
textInput.dispatchEvent(new KeyboardEvent('keydown', {
bubbles: true,
cancelable: true,
keyCode: 8,}));
標準のpropertyであるkeyではなく非推奨のkeyCodeを使わないと入力が反映されません。
理由は不明です。もしご存知な方は教えていただけると嬉しいです。
注意点が3つ有ります
bubbles
scrapbox-keyboard-emulation-2
scrapbox特有の操作
文字spanの取得
座標計算
範囲計算とか全部これ
行クリック
どうやってemulateするのか全くわからなかった
わかったこと
div.line辺りをクリックする
最初はspan.c-*のクリックだけに着目していた
あとでもっと上位のelementでeventを捕捉している可能性があることを指摘されて、探し直してみたらうまく行った
clickではなくmousedownを使う
ただし、mousedownだけだと選択範囲が出現したりポインタが明後日の方向に飛んだりする現象が発生する
mouseupも発行すると直る
最終的には、clickeventも発行しておいた
通常のevent発生順序
行内に<a>タグが含まれていると、それの内部にある文字にcursorをmouse clickで移動させることが出来ない
これは本物のmouseを使っても出来ないので、scriptから出来なくて当然
仕方ないので、確実に移動できる箇所にAPIの使用を限定した
clipboardの読み取りが出来ない
おそらくfirefox限定
navigator.clipboard.readText
これは仕方ないので、<C-v>だけ上書きせずに残そうと思う
テキストの書き込みと削除
書き込みはscrapbox-insert-textを使う
cf. emoji-selecterがうまく動いていない
削除はひたすらDelete連打
#2020-12-18 20:41:07