scrapbox-line-info
scrapboxの行に関わる関数を集めたもの
変数
number
: 行番号
id
: 行のid
lines
: div.lines
行番号→行id
script.jsexport function getLineId(number, lines) {
return lines.children[number]?.id;
}
行id→行番号
script.jsexport function getLineNumber(id, lines) {
if (isHeadLine(id, lines)) return 0;
if (isTailLine(id, lines)) return lines.children.length - 1;
const line = document.getElementById(id);
if (!line) return undefined;
return [...lines.children].indexOf(line);
}
export function isHeadLine(id, lines) {
return scrapVim.lines.firstElementChild.id === id;
}
export function isTailLine(id, lines) {
return scrapVim.lines.lastElementChild.id === id;
}
left
から文字を取得する
line
から文字を探す
2020-11-25 10:02:10 left
だけだと行が折り返しているときに対応できない
top
と left
で判別する必要がある
script.jsexport function getCharFromPosision(targetLeft, line) {
// 行内の文字を<span>のまま取得する
const chars = [...line?.querySelectorAll('span[class^="c-"]')];
//console.log('chars in the line: %o',chars)
// leftに位置する<span>を検索する
const targetPosition = Math.round(targetLeft);
//console.log('target position is %o', targetPosition);
const targetChar = chars?.find(char => {
const {left, right} = char.getBoundingClientRect();
return Math.round(left) <= targetPosition && targetPosition < Math.round(right);
});
return {
target: targetChar,
index: targetChar? parseInt(targetChar.className.replace(/c-(\d+)/,'$1')) :
chars?.length, // 改行文字として、最後の文字より一つ後ろの番号を返す
};
}