✅変換処理を切り出す (takker99/ScrapBubble)
from takker99/ScrapBubble
fetchやindexed DBと関係ないロジックなので、単体テストを書ける
2023-01-10
✅whiteListにないページとカードは表示しない (takker99/ScrapBubble)
17:04:06 merged
次やること
⬜GitにあるUserScriptのPreactのversionを上げる
📝関連ページリストを更新日時順に並び替える (takker99/ScrapBubble)
✅リンク先にスクロールする機能が壊れているのを直す (takker99/ScrapBubble)
✅cache読み込みの制限を外してfetch読み込みを制限する (takker99/ScrapBubble)
✅空リンク判定処理がバグっている (takker99/ScrapBubble)
16:38:56
いよいよPR作る
変換処理の部分だけcommitする
やること
✅git diffで変更箇所を確認し、必要なファイルだけcommitする
✅convertの単体テストを増やす
storage.tsの単体テストも作りたいが、労力の問題から見送る
そこまで作るのは大変
ちなみにリンク先へスクロールする機能がバグったのは、そもそもscrollToを渡しそこねていたからだったようだ
15:11:01 bubbleの表示はこれで問題なさそう
denoでnpm modulesを使えるようになったおかげで、npm installせずにesbuildを使えるようになった
$ deno bundle mod.tsx bundle.js && deno run --allow-env --allow-read --allow-run npm:esbuild --minify bundle.js | clip.exe && rm bundle.js
|で全部つなぎたかったが、なぜかうまく渡せずdenoがpanickしてしまったため、tempファイルに書き込んでからminifyしている
2023-01-07
20:13:15 ほとんど書き出した
commitはまだしていない
まだやっていないこと
✅Bubbleからpageとcardを消す
2023-01-09 17:34:12 データ更新判定とcheckedの要件設定が曖昧かも
他のコードのinterfaceをこれに切り替える
📝単体テスト
2023-01-09 19:09:00 おそらく単一projectのみ全パターン入りで試せた
すぐバグが見つかったので直した
table:試したいパターン
テストしたものに✅ ✅ ✅
逆リンク ○
順リンク ○
双方向リンク ○
空リンク ○
空headword ○
中身ありheadword ○
複数パス2hop link ○
逆リンク+2hop link ○
順リンク+2hop link ○
双方向リンク+2hop link ○
逆external link ○
順external link ○
双方向external link ○
空external link ○
api/pages/:projectname/:pagetitleから得られるデータの都合上、双方向external linkと順external linkを区別できない
✅特定のケースで関連ページリストの中身が頻繁に変わる (takker99/ScrapBubble)
Component構造を変える
<Bubble>
ここでuseBubbleDataからBubble[]を取り出す
<Page>
Linesなどを流し込む
<CardList>
新造するComponent
linkedとprojectLinkedを<Bubble>を受け取り、各ページカードを読み込む
カードの並び替え処理をするために、一旦ここで全てのページデータを取得する必要がある
並び替えが不要ならいらない
external linksとそうでないものとで分けて渡す
<Card>
descriptionsなどを流し込む
変換処理だけ変えるつもりが、大規模になってしまった
一度に変更する箇所は1つにとどめたいので、Component処理にまで手を加えたくないのだが……
ただそうすると、useBubbleDataでlinkedとprojectLinked先のデータの取得までやらざるを得ず、コードが膨れ上がってしまう
切り出す処理
(以下、型定義はbubble.tsを参照)
api/pages/:projectname/:pagetitleのデータからBubble[]を作る
最終的には以下の形式で格納する
2023-01-07 20:05:59 pageとcardをなくし、直接Bubbleに展開してしまおう
データが重複しているので、そっちのほうが楽
BubbleからPageとCardを作る函数を別途用意する
code:storage.ts
export type BubbleStorage = Map<ID, Bubble>;
export interface Bubble {
/** project name */
project: string;
/** page titleLc */
titleLc: StringLc;
/** サムネイル */
image: string | null;
/** サムネイル本文 */
descriptions: string[];
/** ページ本文
*
* 1行目にタイトルを入れる
*/
lines: Line[];
exists: boolean;
/** ページの更新日時 */
updated: number;
/** ページの更新状況を最後に確認した日時 */
checked: number;
/** 内部リンク記法による逆リンクのリスト
*
* 未計算のときはundefinedになる
*/
linked?: StringLc[];
/** 外部リンク記法による逆リンクのリスト
*
* 未計算のときはundefinedになる
*/
projectLinked?: ID[];
}
特定タイトルの関連ページリストを、projectを横断して取得する場合
2023-01-09 17:31:59 これいらない
<CardList />にlinkedとprojectLinkedを渡す
bubbleを取得するcomponentでは、linkedとprojectLinkedのbubbleを取得する必要がない
code:ts
declare const titleLc: StringLc;
declare const storage: BubbleStorage;
declare const projects: string[];
const cards = new Set<Card>(); // External Linksなどで、同じカードが格納される可能性があるため、Setで重複がないことを保証する
for (const project of projects) {
const linked = storage.get(toId(project, titleLc))?.linked;
if (!linked) continue;
for (const linkId of linked) {
const card = storage.get(linkId)?.card;
if (!card) continue;
cards.push(cards);
}
}
CardからPageを作る
code:ts
const convert = <C extends { descriptions: string[] }>(card: C): Omit<C, "descriptions"> & { lines: Line[] } => {
const { descriptions, ...rest } = card;
const lines = [
{ text: rest.title, id: "dummy", updated: 0, created: 0 },
...descriptions.map(
(text) => ({ text, id: "dummy", updated: 0, created: 0 })
),
];
return { lines, ...rest};
};
空リンク判定
code:ts
const isEmptyLink = (projects: string[], titleLc: StringLc, storage: BubbleStorage): boolean => {
let linked = 0;
for (const project of projects) {
const bubble = storage.get(toId(project, titleLc));
if (!bubble) continue;
if (bubble.page.lines.length > 0) return false;
if (bubble.linked.size > 1) return false;
linked += bubble.linked.size;
}
return linked < 2;
}
カードの並び替え
Most related順にするなど
単体テストはsnapshot testを使う
2022-11-02 10:05:04 に書いたメモ
やっぱり逆リンク計算バグってんじゃん
https://gyazo.com/5ebd19116a8f91295e415d9649d34ee9
このページのPRで直ったと考えられる
#2023-01-09 17:34:09
#2023-01-07 19:29:26
#2023-01-06 05:54:44
#2022-12-24 17:56:58
#2022-12-15 19:26:52
#2022-11-02 10:05:04