generated at
scriptからscrapboxに文字を流し込んだときの挙動を調べる
insertText()を使うと、scriptからscrapboxに文字を入力することができる
とても便利takkertakkertakker
しかし、scrapboxの自動入力が邪魔してうまく行かない場合がある
確認済みの現象
引用文中で挿入すると、改行の前に勝手に > が入る
どんな場合にどんな不具合が生じるのかを調べておこうと思う

目的
不具合の発生条件を洗い出し、それへの対策を試みる

方法
1. 次のコードをUserScriptに入れる
js
import '/api/code/takker/scrapbox-insert-text/test1.js';
developper toolから insertText() が使えるようになる
2. consoleから様々なcursor位置で insertText() を実行して調べる

調査結果
改行なし
pass本文に挿入
passコードブロックに挿入
passアイコン記法の途中に挿入
pass折返しのある行の途中に挿入
pass展開すると折返しが発生するほど長い外部リンク記法の内外で挿入
改行あり
passインデントなしの文中に挿入
インデントありの文中に挿入
インデントは維持されなかった
Shift + Enter の挙動と同じ
空白のみの行
空白が維持された
Shift + Enter の挙動と同じ
折返しのある行の途中に挿入
インデントは維持されなかった
Shift + Enter の挙動と同じ
引用文中に挿入
インデント及び引用を維持して改行された
2020-12-30 07:44:18 コードブロックの空白行に挿入
コードブロックとインデントを維持して改行された
ここまでの調査を踏まえた暫定の結論
\n を挿入されたとき、インデントは維持されない
引用文中に挿入されると、インデントと引用が維持される
コードブロックの空白行中に挿入されると、インデントとコードブロックが維持される

対処
目標
どんな場所であっても、インデントや引用を無視して文字列を挿入する
方法
カーソルが引用文中にあるかどうかで処理を切り替える
scrapbox-cursor-position-2でcursorのいる文字のDOMを取得する
DOMの親要素に span.quote がいたら、改行を Enter で代用する
いなかったら普通に挿入する
cons: 挿入のたびにcursorの位置計算が必要になる?
Scrapboxのcursorの位置を監視するscriptを常時走らせているのなら、コストが増えることはない
すべての改行を Shift + Enter で代用する
多分無理
前にキーボード代行をやったとき、 Shift + Enter だけ動かなかった覚えがある
もしできたとしても、引用文中は Enter を使わないと引用を無視できないので、どのみち引用文中にカーソルがあるかどうかの判定が必要になる
.*\n まで入力したあと、カーソルがどの位置にいるかを都度確認する
先頭にいなかったら、インデントetc.が挿入されたとみなして Home Home Shift+End Del を実行する

#2021-05-28 18:00:53
#2020-12-30 07:45:04