座標からScrapboxの文字の位置を取得する
interface
getCharIndex({left, top, line = undefined})
lineが指定されているときは、対応する行内から文字を検索する
判定方法
https://gyazo.com/1ccbb67f96f5d673f3c5880d993d36e5
灰色は斜線のつもり
上図の領域に{x: left, y: top}が入っている時、対応する文字のindexを返す
領域には実線を含み、点線を除く
最後尾の文字より後ろの部分を押している場合
折り返しがないときは、最後尾の文字番号の次を返す
改行文字を選択しているという意味合い
これ必要ないと思う
いやそうでもないか?
vimが改行の選択をどう処理しているかで決めよう
折り返しがある時
最後尾以外は、折り返しの前の文字番号を返す
折り返し地点の文字を把握しておく必要があるな
境界線上の微妙な位置にあるときに判定に失敗することがわかった
判定方法その2
発想を転換する
座標から文字を取得するために必要な情報は複数通りある
与えた座標を含む文字のDOM
与えた座標に最も近い文字と文字との境界
そもそも与える座標はcursorや選択範囲の端など文字境界に一番近い座標なのだから、最も近い境界なら正確に取得できる
境界線の左隣にある文字はすぐに取得できるので、それを使えばいい
欠点
文字の中央に位置する座標を与えると判定が微妙になる
両隣の境界のどちらに近いと判断するのか、判定が難しくなる
文字領域での判定と、境界線での判定とで関数を使い分ければいいだろう。
参考にするコード
このコードは行が折り返されている場合に対応できていない
処理の手順
該当する行を検索する
.linesの小要素のDOMRectに引っかかるかどうかをひたすら検索する
05:53:53 多分完成した
別ページに函数を作っておこう
06:23:29 作成終了
テストはしていない