diffToChanges()のleftに要素数0の配列を渡すと例外が発生する
https://code2svg.vercel.app/svg/L13-27/https://raw.githubusercontent.com/takker99/scrapbox-userscript-std/0.19.0/browser/websocket/diffToChanges.ts#.svg
なるほどたしかにtakker.icon
diffToChangesはどこで使っていたかな
makeChangesではそのまま渡しているだけ
https://code2svg.vercel.app/svg/L19-27/https://raw.githubusercontent.com/takker99/scrapbox-userscript-std/0.19.0/browser/websocket/makeChanges.ts#.svg
https://code2svg.vercel.app/svg/L22-32/https://raw.githubusercontent.com/takker99/scrapbox-userscript-std/0.19.0/browser/websocket/patch.ts#.svg
(略)
https://code2svg.vercel.app/svg/L68-80/https://raw.githubusercontent.com/takker99/scrapbox-userscript-std/0.19.0/browser/websocket/patch.ts#.svg
head.linesは少なくとも1行含むはず(タイトル行が入る)だから、現状ではバグらなそうですtakker.icon
もちろんパーツごとに見たらあきらかにまずいです
場当たり的にはなりますが、Options内にleft[0].idが存在しなかった際に使用する行IDを格納することができれば回避できると思います
code:lines_sample
元々あった行
挿入された行
挿入された行その2
Options内で指定した行
left: [PartialLine, ...PartialLine[]](type PartialLine = Pick<Line, "text" | "id">;)とする手もありますtakker.icon
型定義の変更だけで済む
ただし、利用側で要素数が1以上であることを保証するコードを挿入する必要が生じる
scrapboxでは何もない場所に文字列を挿入することを想定していないので、こっちの変更のほうがscrapboxにあうかなと思いました
確かに、行が1つも無いページは存在しない(少なくともタイトル行が存在する)ので、そうした方が良いかもしれませんが…Mijinko_SD.icon
下のPR:108のようにページに含まれる行の1部分のみを切り取った場合は、leftの要素数が0になるということが起こり得ると思います
すいません
/vim-jp-emojis/iinoyo.icontakker.icon
TinyCodeBlockがタイトル行と本文行とをばらばらに持ってしまっているからこうなったと。なるほど
https://code2svg.vercel.app/svg/L8-30/https://raw.githubusercontent.com/MijinkoSD/scrapbox-userscript-std/ca6e48c553129a851779afacbc95ac10bd2217bc/rest/getCodeBlocks.ts#.svg
titleLineとbodyLinesは分ける必要ありますか?
scrapboxのlinesはタイトル行を含むので、それに合わせたほうが統一感がある
コードブロックの中身だけ欲しい場合は、getContent: (block: TinyCodeBlock) => stringのような函数を別途用意すれば取り出せる
同じ型なので、分けなくても実装上は多分問題ないですMijinko_SD.icon
ただ、TitleとBodyで用途がまるで違うので分けています
TitleとBodyの双方に同じ処理をする(例えばforEachでまとめて操作する等)ということがまず無いので
(コードブロックを取得してあれこれしている関係上)混ぜて置いておくと、呼び出しの際に適切なindexを指定しなければならず、色々と不便です
projectNameとpageTitleのセットはほかのところでも多用するので、一つのinterfaceとして切り出したい
今回のPRとは関係ないので、やるとしたら別のPRでやる
/icons/わかる.iconMijinko_SD.icon
プロジェクト名・ページ名は結構いろんなところで渡している
もっと言うとページID・プロジェクトID・ユーザーIDあたりも
pageInfoは当初TinyCodeBlockの中には入れていなかったのですが、後々でこのオブジェクトを別の関数(主にupdateなんちゃら)に渡す際に高確率で必要になることが判明したのと、getCodeBlocks()から作成する分にはなんら手間では無かったので入れました (よくコードを読んでいなかったごめんなさいtakker.icon)
お互いにやることが多いので仕方ないですMijinko_SD.icon
ついでに、nextLineについても書いておこう(聞かれてないけれど)Mijinko_SD.icon
↓な理由で生やしているのだろう、と推測が付いたのでとくに聞きませんでしたtakker.icon
コードブロックの中身に関係ないのになんで格納しているか、という話ですがInsertCommitを作成する際にIDが必要になるので入れています じゃあ行IDだけstring型で入れておけばいいじゃんとなりますが、もし今後BaseLine型に含まれる他の値が必要になった場合に面倒なことになるので、BaseLineのオブジェクトをそのまま入れています
ただ、今のところはID以外使ったことはなかったはずです
https://code2svg.vercel.app/svg/L48-50/https://raw.githubusercontent.com/takker99/scrapbox-userscript-std/0.19.2/browser/websocket/diffToChanges.ts#.svg https://github.com/takker99/scrapbox-userscript-std/blob/0.19.2/browser/websocket/diffToChanges.ts#L49
想定される状況としては、
ページ内の一部行を抜き出した値を渡した時に対応できるようにする
left[0].idがundefinedだった場合にもそのオプションの値を使用することで、自然に例外を回避できると思います
Issueとして投げるべきかな
https://gyazo.com/65acd48c40b38faa6ce5c7c1962f6f37
ラベルの設定ができない…
ラベルなしでもいいですよtakker.icon
2024-07-23 完全に見落としてましたごめんなさいtakker.icon
だいぶ時間があいたので理解が抜け落ちてしまった
思い出すとこからやります