takker99/takker-scheduler/plugins
2022-01-17
02:13:52 linterがなくて描くのが辛くなってきたので、gitの方に移動する
scrapboxでcodingする旨味がほとんどなかった
code:mod.ts
import {
pushTasks,
getLineRange,
makeCheckCircle,
makeExclamationTriangle,
makeSpinner,
useStatusBar,
joinPageRoom,
sleep,
Scrapbox,
Task,
} from "../takker99%2Ftakker-scheduler/lib.ts";
declare const scrapbox: Scrapbox;
全体の動き
1. 選択範囲からタスク名(複数)を取得する
改行で区切って両端の空白を取り除く
開始日時の指定optionはまだ実装しない
$ f:x\mapsto\frac{30}{(300+1)^{1.5}-1}((x+1)^{1.5}-1)
単位は入出力ともに$ \mathrm{days}
アルゴリズムのテスト
code:ts
const toStart = (duration = 7) =>
(30 * ((duration + 1) ** 1.5 - 1)) / ((300 + 1) ** 1.5 - 1);
alert(toStart(1));
問題なさそう
code:mod.ts
/** 開始日時を計算する
*
* @param happen タスクが発生した日時のUNIX時刻
* @param duration 発生から何日目までを締め切りとするか
* @return 開始日時
*/
const toStart = (happen: number, duration = 7): Date =>
new Date((
happen +
(24 * 60 * 60 * 30 * ((duration + 1) ** 1.5 - 1)) / ((300 + 1) ** 1.5 - 1)
) * 1000);
export async function makeJudgeTimeFromSelection(project: string) {
const stacks = scrapbox.Page.lines.slice(start, end)
.flatMap((line) => {
const title = line.text.trim();
const start = toStart(line.updated);
if (title === "") return [];
return { title, start, };
});
code:mod.ts
const promises = [] as Promise<PushTasksResult>[];
while (stacks.length > 0) {
const stack = stacks.shift();
if (!stack) break;
const task = {
};
// taskと同じ日付のtaskを集める
const date = task.base;
for (let i = 0; i < stacks.length; i++) {
if (!isSameDay(stacksi.base, date)) continue; // stacksからtasks_に移動する
tasks_.push(...stacks.splice(i, 1));
i--;
}
const { render, dispose } = useStatusBar();
const spinner = makeSpinner();
render(spinner, writing ${tasks.length} tasks...);
let count = 0;
let failed = false;
for await (const result of pushTasks(project, ...tasks)) {
if (result.state !== "fulfilled") {
console.error(result.reason);
failed = true;
continue;
}
count += result.value.size;
// 書き込み状況を.status-barに表示する
render(spinner, writing ${tasks.length - count} tasks...);
}
if (failed) {
render(makeExclamationTriangle(), Some tasks failed to be written);
await sleep(1000);
dispose();
return;
}
render(makeCheckCircle(), "wrote");
書き込みに成功したら、現在ページに走り書きした文字列を全部消す
code:mod.ts
const { patch, cleanup } = await joinPageRoom(
scrapbox.Project.name,
scrapbox.Page.title ?? "",
);
count = 0;
await patch((lines) =>
lines.flatMap((line, i) => start <= i && i <= end ? [] : line.text) );
cleanup();
dispose();
}