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