カーソル行の座標と文字列の座標を表示するテスト
カーソル行から特定の文字列を抽出するテストの続き
cursorのleftと、マッチした文字列のoffsetLeftを表示する
code:script.js
import {suggestWindow} from '/api/code/takker/suggestWindow/script.js';
const suggestion=new suggestWindow();
suggestion.editor.addEventListener('keyup',() => {
const line = suggestion.editor.getElementsByClassName('cursor-line')0;
const text = line.textContent;
const matches = [...text.matchAll(/\[\/^\s!"#%&'()\*\+,\-\.\/\{\|\}<>_~\]+^\]*\]/g)];
/icons/done.icon正規表現テスト
/shokai
これも/shokaiマッチするはず
これはUserScriptマッチしない
複数あってもマッチする/shokaisss/shokai
ちゃんと別々にマッチする
斜体はマッチしない
斜体+文字装飾記法もマッチしないよー/takker
code:script.js
if(matches.length == 0) {
suggestion.close();
return;
}
const cursor = document.getElementById('text-input');
let list = [ textContent: ${text.replace(/\s/g,'t')},
left(cusor): ${cursor.style.left},
...matches
.map(match => {
const cursorLine = suggestion.editor
.getElementsByClassName('cursor-line')0;
const start = cursorLine
// '['の内側にカーソルが入ったときの座標
// i.e. '/'の左端の座標
.getElementsByClassName(c-${match.index})0;
const startLeft = start.offsetLeft;
const startLeft2 = start.getBoundingClientRect().left - cursorLine.getBoundingClientRect().left;
const startChar = start.textContent;
const end = cursorLine
.getElementsByClassName(c-${match.index + match[0].length - 1})0;
const endLeft = end.offsetLeft;
const endLeft2 = end.getBoundingClientRect().left - cursorLine.getBoundingClientRect().left;
const endChar = end.textContent;
//return ${match[0]}: c-${match.index+1} = ${startLeft}px c-${match.index + match[0].length - 1} = ${endLeft}px.;
// firefox調査用
return ${match[0]}: ${startChar} = ${startLeft2}px | ${endChar} = ${endLeft2}px;
})];
ちょっとずれる?
複数あってもマッチする/shokaisss/shokai
↑の2つ目の括弧のはじめの部分の座標が合わない
まあ、括弧の外で補完判定されるわけではないので構わないか?
/icons/firefox.iconだと判定がずれる
常にstart.left=4pxのまま
Firefoxのelement.offsetTopが上手く動かないときはElement.getBoundingClientRect()を使う - Qiitaを参考にしてみたがダメだった
取得できる文字を確認してみる
/icons/done.icon問題なし
cursorLineのElement.getBoundingClientRect()を使ってみる
/icons/done.icon直った!
原因(推測)
/icons/firefox.iconのoffsetLeftだと<a>タグからの相対座標を取得してしまう
一つ上の親要素を基準にしている
ちゃんとcursor-lineを基準にすれば正しい座標が表示される
code:script.js
suggestion.open();
suggestion.updateItems(list.map(item => {
const div = document.createElement('div');
div.textContent = item;
return div;
}));
suggestion.reDraw(cursor);
});
#2020-11-21 18:40:54
#2020-08-24
#2020-08-23
#2020-08-22