LinkObserver
カーソルがいるリンクの文字列の変更を監視するclass
変更があったら通知する
StringObserverでは正規表現を使って文字列を解析していたが、監視対象がリンクに限られているのでDOM操作で十分だと言うことに気づいた。
2021-02-06 21:26:44 やっていることが大げさな気がする
要はcursorがリンクの中にいるかどうかさえわかればいい
そしてそれはscrapbox-cursor-position-4とElement.closest()を使えばすぐにわかる
クラスにするまでもなさそう
判定関数で十分
2020-12-03
01:37:19 triggerを文字から正規表現に変えた
external-completion-2で/:で補完が発動しないようにしたかった
00:32:10 triggerが空の場合でも変更監視できるようにした
既知の問題
🔳を含む行だと判定処理に失敗する
matchAllがサロゲートペアを含んだ文字列の文字数を計算できないのが原因
code:script.js
export class LinkObserver {
cf. JavaScript 分割代入な引数にデフォルト値を設定したい - かもメモ
code:script.js
constructor(editor, {
trigger // 監視対象のリンクのpattern
}= {}) {
this.raw = undefined; // []つきリンク文字列
this.target = undefined; // []をとったリンク文字列
this.editor = editor;
this.trigger = trigger;
}
// 監視を更新する
reload(cursor) {
// focusがcursorになかったら何もしない
if(editor.getElementsByClassName('cursor-line').length == 0) return false;
const oldRaw = this.raw
this.raw = this._getLinkIncludingCursor(cursor);
this.target = this.raw?.replace(/\(.*)\/,'$1');
//console.log(Found a link: ${this.raw});
return oldRaw !== this.raw ;
}
解説:Scrapboxでcursor下のリンクを取得する
code:script.js
// cursorを含む外部projectへのリンクを取得する関数
_getLinkIncludingCursor(cursor){
const cursorLine = editor
.getElementsByClassName('cursor-line')0;
if(!cursorLine) return undefined;
// 現在行からリンクを探す
const LinkStrings = ...cursorLine.getElementsByClassName('page-link');
// 要素の左端の相対座標を取得する
const getLeftPosition = targetElement => targetElement.getBoundingClientRect().left - cursorLine.getBoundingClientRect().left;
// cursorを含む文字列のみ抽出
const targetLink = LinkStrings
// cursorを含む外部projectリンクは一つしかないはずなので、filterではなくfindを使う
.find(a => {
// 正規表現に合わなかったらfalse
if(!this.trigger.test(a.textContent.replace(/\(.*)\$/,'$1'))) return false;
// '['の右端の座標
const startLeft = getLeftPosition(a.firstElementChild);
// ']'の左端の座標
const endLeft = getLeftPosition(a.lastElementChild);
// cursorの左端の座標
const cursorLeft = parseInt(cursor.style.left);
return startLeft <= cursorLeft && cursorLeft <= endLeft;
});
return targetLink?.innerText;
}
}
#2021-02-06 21:29:51
#2020-12-03 00:30:28
#2020-11-12 00:38:16
#2020-10-12 00:14:36
#2020-09-30 19:37:54