generated at
scrapbox-line-info
scrapboxの行に関わる関数を集めたもの

変数
number : 行番号
id : 行のid
lines : div.lines

行番号→行id
script.js
export function getLineId(number, lines) { return lines.children[number]?.id; }

行id→行番号
script.js
export 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.js
export 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, // 改行文字として、最後の文字より一つ後ろの番号を返す }; }

#2020-11-25 19:15:29
#2020-11-24 16:19:45