scrapbox-watchlist-sync
使い方
1. ここをクリックして生成したコードを適当なページのコードブロックに貼り付ける 以下、/sample-project/scrapbox-watchlist-sync/script.jsに貼り付けたとする
2. 自分のページのscript.jsに以下のコードを記入する
code:js
import { sync } from "../../sample-project/scrapbox-watchlist-sync/script.js";
sync({
project: "sample-project",
});
常に上書きされるので、手動で書き込まないこと
別のページに書き込みたいときは、titleを指定する
3. おわり
実装案
✅2(採用)
1
書式は/rmaruon/rmaruon.iconさんのテーブル記法を用いる 新しいprojectがwatch listに入ったら、それをそのページに書き込む
書き込みはwebsocketを通じてbackgroundで行う
code:script.ts
import { encodeTitleURI, patch } from "../scrapbox-userscript-std/websocket.ts";
/** 同期設定 */
export interface SyncInit {
/** projectLastAccessedを書き出すページのproject name */
project: string;
/** projectLastAccessedを書き出すページのpage title
*
* @default ".watchlistrc"
*/
title?: string;
}
/** watchListを全てのデバイスで同期する
*
* @param init watchListの保存先ページを決める
*/
export const sync = async (init: SyncInit): Promise<void> => {
const title = init.title ?? ".watchlistrc";
const filename = "projectsLastAccessed.json";
// scrapbox.ioに保存したwatchListを取得する
const res = await fetch(
https://${location.hostname}/api/code/${init.project}/${encodeTitleURI(title)}/${filename}
);
const json = res.ok ? await res.json() : {};
const prevText = localStorage.getItem("projectsLastAccessed") ?? "{}";
/** 端末に保存されたwatchList */
const prev = JSON.parse(prevText);
// projectおよびそのアクセス日時を更新する
// 一番新しいアクセス日時を採用する
const newData = keys.map((key) => [key, Math.max(jsonkey ?? 0, prevkey ?? 0)]); // 端末とscrapbox.ioに新しいwatchListデータを保存する
localStorage.setItem("projectsLastAccessed", JSON.stringify(Object.fromEntries(newData)));
await patch(init.project, title, () => [
title,
"This page is automatically generated. DO NOT EDIT ANYTHING, WHITCH WILL BE OVERWRITTEN.",
"",
code:${filename},
${prevText},
"",
]);
};