scrapbox-snapshot@0.1.0
処理を簡略化した
変更日時を取得できるようにした
2021-07-04
19:21:58 debug用console.logを削除
code:script.d.ts
// 変更内容
type Change =
{
_update: string; // 更新した行のid
lines: {
origText: string; // 変更前の文字列
text: string; // 変更後の文字列
};
} |
{
_insert: string; // このidの示す行の上に挿入する。ページ末尾に挿入するときは _end が入る
lines: {
id: string; // 新しく挿入した行のid
text: string; // 挿入した文字列
};
} |
{
_delete: string; // 削除された行のid
lines: {
origText: string; // 削除された文字列
};
} |
// 更新されたタイトル情報
{
title: string;
titleLc: string;
} |
{descriptions: string[];} | // 更新されたページのサムネイル用説明文
// 更新されたリンク情報
{
links: string[];
linksLc: string[];
};
export type Commit = {
changes: Change[];
userId: string; // 変更したuserのid
created: number; // 変更日時
};
type Line = {text: string | null; userId?: string;}; // 削除されたらnull
export type LineSnapshot = {
id: string; // 行のID
// ある時刻における行のテキスト。
}
export function convert(commits: Commit[]): {
history: LineSnapshot[];
range: number[]; // 利用可能なsnapshotの日時のリスト
};
// 内部で使う中間データ
type ChangeInfo = {
id: string;
userId: string;
created: number;
} & ({
type: 'update';
text: string;
} | {
type: 'insert';
text: string;
parentId: string;
} | {
type: 'delete';
});
function makeChangeInfo(change: Change, userId: string, created: number): ChangeInfo | undefined;
code:script.js
export function convert(commits) {
// _insert, _update, _delete以外を無視する
const changes = commits.flatMap(
({changes, created, userId}) => changes.flatMap(change => {
const changeInfo = makeChangeInfo(change, userId, created);
})
);
// LineSnapshotに変換する
const lines = changes.reduce((lines, change) => {
if (change.type === 'insert') {
const snapshots = {};
const line = {
id: change.id,
snapshots,
};
// parentIdのデータの前に挿入する
const index = lines.findIndex(({id}) => id === change.parentId);
// parentIdのデータが存在しなかったら、とりあえず末尾に挿入する
if (index < 0) {
console.warn([scrapbox-snapshot@0.1.0] The parent line the snapshot would insert before is not found. change: , change);
}
}
// 行データを追加するsnapshotを探す
const index = lines.findIndex(({id}) => id === change.id);
if (index < 0) {
console.warn([scrapbox-snapshot@0.1.0] The line data to be append the change is not found. change: , change);
return lines;
}
if (change.type === 'update') {
return lines;
}
if (change.type === 'delete') {
return lines;
}
return lines;
}, []);
return {history: lines, range};
}
Commitを使いやすい形に変換する
ChangeInfoに変換する
_insert, _update, _delete以外のchangesは全て無視する
code:script.js
function makeChangeInfo(change, userId, created) {
const changeInfo = {userId, created};
if (change._insert) return {
type: 'insert',
id: change.lines.id,
parentId: change._insert,
text: change.lines.text,
...changeInfo
};
if (change._update) return {
type: 'update',
id: change._update,
text: change.lines.text,
...changeInfo
};
if (change._delete) return {
type: 'delete',
id: change._delete,
...changeInfo
};
return;
}
test code
code:js
(async () => {
const {execute} = await import('/api/code/programming-notes/scrapbox-snapshot@0.1.0/test.js');
console.log(await execute());
})();
code:test.js
import {convert} from './script.js';
export async function execute() {
const res = await fetch(/api/commits/${scrapbox.Project.name}/${scrapbox.Page.id});
const {commits} = await res.json();
return convert(commits);
}