generated at
diffToChanges()のleftに要素数0の配列を渡すと例外が発生する
from @takker
想定内かもしれませんが、scrapbox-userscript-stddiffToChanges()のleftへ要素数0の配列を渡すと例外を引き起こしますMijinko_SD
if文などでの前処理無しに let lineId = left[0].id; https://github.com/takker99/scrapbox-userscript-std/blob/main/browser/websocket/diffToChanges.ts#L23をしているのが原因です
なるほどたしかにtakker
diffToChanges はどこで使っていたかな
makeChanges ではそのまま渡しているだけ
patch()でしか使っていないようですね
(略)
head.lines は少なくとも1行含むはず(タイトル行が入る)だから、現状ではバグらなそうですtakker
もちろんパーツごとに見たらあきらかにまずいです
場当たり的にはなりますが、Options内に left[0].id が存在しなかった際に使用する行IDを格納することができれば回避できると思います
その行IDはInsertCommitにしか使用されないため、実質的に挿入した行の真下に来る行になると思います
lines_sample
元々あった行 挿入された行 挿入された行その2 Options内で指定した行
left: [PartialLine, ...PartialLine[]] ( type PartialLine = Pick<Line, "text" | "id">; )とする手もありますtakker
型定義の変更だけで済む
ただし、利用側で要素数が1以上であることを保証するコードを挿入する必要が生じる
scrapboxでは何もない場所に文字列を挿入することを想定していないので、こっちの変更のほうがscrapboxにあうかなと思いました
確かに、行が1つも無いページは存在しない(少なくともタイトル行が存在する)ので、そうした方が良いかもしれませんが…Mijinko_SD
下の PR:108 のようにページに含まれる行の1部分のみを切り取った場合は、 left の要素数が0になるということが起こり得ると思います
ちなみに、scrapbox-userscript-std/PR:108にて追加したupdateCodeBlock()はこの例外を想定していないため、 target にコード本体がない(タイトル行しか無い)コードブロックを渡すと、diffToChanges()で例外が発生します
すいません
iinoyotakker
TinyCodeBlock がタイトル行と本文行とをばらばらに持ってしまっているからこうなったと。なるほど
titleLine bodyLines は分ける必要ありますか?
scrapboxの lines はタイトル行を含むので、それに合わせたほうが統一感がある
コードブロックの中身だけ欲しい場合は、 getContent: (block: TinyCodeBlock) => string のような函数を別途用意すれば取り出せる
同じ型なので、分けなくても実装上は多分問題ないですMijinko_SD
ただ、TitleとBodyで用途がまるで違うので分けています
TitleとBodyの双方に同じ処理をする(例えばforEachでまとめて操作する等)ということがまず無いので
(コードブロックを取得してあれこれしている関係上)混ぜて置いておくと、呼び出しの際に適切なindexを指定しなければならず、色々と不便です
projectName pageTitle のセットはほかのところでも多用するので、一つのinterfaceとして切り出したい
今回のPRとは関係ないので、やるとしたら別のPRでやる
わかるMijinko_SD
プロジェクト名・ページ名は結構いろんなところで渡している
もっと言うとページID・プロジェクトID・ユーザーIDあたりも
pageInfoは当初TinyCodeBlockの中には入れていなかったのですが、後々でこのオブジェクトを別の関数(主にupdateなんちゃら)に渡す際に高確率で必要になることが判明したのと、getCodeBlocks()から作成する分にはなんら手間では無かったので入れました
(よくコードを読んでいなかったごめんなさいtakker)
お互いにやることが多いので仕方ないですMijinko_SD
ついでに、 nextLine についても書いておこう(聞かれてないけれど)Mijinko_SD
↓な理由で生やしているのだろう、と推測が付いたのでとくに聞きませんでしたtakker
コードブロックの中身に関係ないのになんで格納しているか、という話ですがInsertCommitを作成する際にIDが必要になるので入れています
じゃあ行IDだけstring型で入れておけばいいじゃんとなりますが、もし今後BaseLine型に含まれる他の値が必要になった場合に面倒なことになるので、BaseLineのオブジェクトをそのまま入れています
ただ、今のところはID以外使ったことはなかったはずです

diffToChanges()のleftに要素数0の配列を渡すと例外が発生する#63fac47a7838e30000c8f648と被りますが、一番下に Insert する時のIDに _end 以外の任意の値を設定できるようにするオプションが欲しいですMijinko_SD
こことかにハードコーディングされている "_end" を別のものにしたい
想定される状況としては、
ページ内の一部行を抜き出した値を渡した時に対応できるようにする
left[0].id がundefinedだった場合にもそのオプションの値を使用することで、自然に例外を回避できると思います
Issueとして投げるべきかな
ラベルの設定ができない…
ラベルなしでもいいですよtakker
2024-07-23 完全に見落としてましたごめんなさいtakker
だいぶ時間があいたので理解が抜け落ちてしまった
思い出すとこからやります