scrapbox-userscript-std
UserScriptでよく使う函数を集めたmodule
takker99/scrapbox-userscript-std
https://jsr.io/@cosense/std
実装したいこと
📝Scrapbox REST APIのwrapperを実装する
documentつくる
README.mdに書いたdocumentのURLとcommit idとが常に一致するようにできないだろうか?
2022-03-27 20:16:28 今はrelease前に手動でversionを書き換えている
cursor操作函数を作る
まあこれは気が向いたらでいいや
優先度が低い
✅️DuplicationTitleErrorに対応する
getFormula()の実装が古い
.cursor-lineのときの表示をちゃんとやる
previewとテキストの双方を返せるようにする?
getIndentCount()をString.prototype.trimStart()で実装し直す
正規表現なしでスペースの数を数えられる
文字列処理の強化
欲しい物
任意のDOMに含まれる文字の番号を取得する
オンプレ版scrapboxに対応する
やっぱinstance.patch()みたいなのを作ろうかな
目的:APIを叩く回数を減らす
現状だと、書き込む度にuser idとproject idを取得しに行っている
そんなことはなかった。ちゃんとcacheしてた
ならclassにする必要ないかな?
これらが変わることは普通ないから、一度取得したら保持しておけばいい
interface
こんなのはどうかな?
code:ts
const editor = makeHeadlessEditor();
editor.patch("project", "title", (lines, metadata) => /*...*/);
2022-04-19 19:19:21 いや、普通にclassを使おう
保持する状態が多い
下手に関数にするより、classで書いたほうがやりやすそう
code:ts
export class Headless {
#userId: string;
static #projectIds = new Map<string, projectId>();
static #pageIds = new Map</${string}/${string}, pageId>();
constructor();
patch();
pin();
unpin();
delete();
*readStream(project: string): AsyncGenerator<>;
*readPage(project: string, title: string): AsyncGenerator<>;
disconnect();
#request(): Promise<void>;
}
disconnect()したら*readStream()などを中断できるようにする;
10:38:59 やっぱりほしいtakker.icon
現状だと同じページに連続して書き込む場合でも、api/pages/:projectname/:pagetitleを叩き直さないといけない
code:ts
{
using room = await join(projectId, pageId, userId);
for await (const event of room) {
// ...
}
// ページが削除されたら失敗する
await room.push(changes)
// scopeを抜けるときにdisconnect
}
const streamRoom = await join(projectId, "stream");
const listRoom = await join(projectId, "list");
"socket.io-request"はflatにしよう
これだけ"socket.io-request"→methodと二段階で場合分けしなければならない
型定義が面倒
event nameをcommit, room:join, cursorに統一し、前2つのみ実際にはsocket.io-requestとして送信するようにすればいい
scrapbox-userscript-websocketにwebsocketの処理を分離する必要あった?
scrapbox-userscript-stdのsocket周りを修正するのに、scrapbox-userscript-websocketに手を加えないといけない?
うーん、デメリットかどうか微妙
2024-08-19 統合した
patch()のupdaterの引数を変える
Line[]ではなくstring[]を返すようにする
Line[]は第二引数のobjectに入れて、使いたい人だけが使えるようにすればいい
⬜useStatusBar()をクリックできるようにする
REST APIのwrapper
エラー処理が雑 and 冗長な気がする
あんまり解決策は思いつかない
📝Requestの組み立てとResponseの解析を分離
createDebug()を入れる~@2023-11-02
自前実装をdeno_stdにある実装に切り替える
他のUserScriptでもそうしたい
assets/index.js内のobjectの型定義作成
https://github.com/takker99/scrapbox-userscript-std/blob/0.24.3/browser/dom/page.d.ts
patchの引数はおそらくscrapbox-userscript-websocketのCommitNotificationと同一
モチベ
もしかしたらページマージ機能もscrapboxの実装を直接使える可能性が出てきた
takeCursor().page.patchを使えばいけそう?
scrapbox-userscript-websocketをstdとを分ける必要あったかなtakker.icon
別にした恩恵が今のところない
むしろ別々にbranch切ってPR出して更新しなければならないので面倒
統合してしまおうかな
Result<T, E>をoption-tの定義に置き換える
valueからvalへの破壊的変更が発生する
v1でリリースすべきか?
まあまだv0.xのbeta versionだし、破壊してもいいだろう
バグ
https://github.com/takker99/scrapbox-userscript-std/blob/476d66da2ea5c6f2faf972ba3c0e467c51aff2d4/browser/dom/node.ts#L96
scrapbox.page.linesではなくDOMから文字を取得してしまっている
これでは元の文字を取得できない
おそらくコードブロック更新機能が壊れている
すでにコードブロックに別のコードが書き込まれているとき、import-devにbackgroundでテストコードを貼り付けるUserScriptが正常に機能していない
✅️saveApiCache()でHeader.prototype.setを使うとHeaders are immutableエラーが出る
patch()エラー
/*@__PURE__*/をproject linkだと誤認してしまう
これをproject linkとしてwebsocketでserverに送信すると、430[{"error":{"name":"Error","message":"Your changes have been declined by the server. invalid projectLink found: /*@__PURE__*/"}}]が返ってくる
scrapbox-parserに手を加える必要がありそう
修正箇所
REST API
websocket
その他URL
directory layout
./
mod.ts
すべてのコードをここからexportする
utilty関係はここにflatに置く
rest/
REST API系は全部ここ
browser/
browserで動かすやつ
dom/
↓以外
websocket/
scrapbox-headless-scriptを移動したもの
各階層にmod.tsを置いてある
/Mijinko/takker/scrapbox-userscript-std#623ac8357838e300008dfc8e
あれ入ってたっけ?
editとmotionで分けたつもりだった
/Mijinko/takker/scrapbox-userscript-std#623ab1947838e300008dfc4e
ややこしいところあるっぽいから説明詳しくしないとな
2024-08-02 15:18:26 JSRにpublishした
@cosense/stdに置いた
2022-02-10
08:05:03 CIを導入した
Add CI by takker99 · Pull Request #2 · takker99/scrapbox-userscript-std
まだ単体テストを書いていないのでエラーが出ているが、無視する
scrapbox-userscript-stdの例外戦略
code:mod.ts
export * from "jsr:@cosense/std@0.29";
code:dom.ts
export * from "jsr:@cosense/std@0.29/browser/dom";
export * from "jsr:@cosense/std@0.29/title";
code:websocket.ts
export * from "jsr:@cosense/std@0.29/browser/websocket";
export * from "jsr:@cosense/std@0.29/title";
code:rest.ts
export * from "jsr:@cosense/std@0.29/rest";
export * from "jsr:@cosense/std@0.29/title";
code:text.ts
export * from "jsr:@cosense/std@0.27/text";
export * from "jsr:@cosense/std@0.29/title";
#2024-07-14 12:09:59
#2024-07-13 22:58:58
#2023-11-05 12:46:47
#2023-09-04 10:51:44
#2023-04-29 09:18:11
#2023-04-04 20:40:33
#2022-12-24 14:58:51
#2022-10-07 11:59:50
#2022-07-26 06:36:47
#2022-05-13 16:44:08
#2022-04-30 09:35:35
#2022-04-24 17:18:56
#2022-04-22 05:08:39
#2022-04-19 19:35:58
#2022-04-17 15:05:12
#2022-04-09 19:53:35
#2022-04-07 05:24:06
#2022-04-06 19:45:37
#2022-03-27 20:13:06
#2022-03-25 02:24:47
#2022-03-12 22:49:11
#2022-03-01 07:36:11
#2022-02-21 17:27:00
#2022-02-21 01:38:48
#2022-02-20 03:07:40
#2022-02-16 17:17:51
#2022-02-14 14:33:22
#2022-02-10 05:56:32
#2021-10-12 11:40:49
#2021-09-30 11:50:01