takker-scheduler-3/plan-generator
任意の日付のタスクを自動生成するtakker-scheduler-3の機能の実装
複数のページから関数をimportして同時実行する実験で書いたscriptをベースに作る
仕様
task portal page (takker-scheduler-3)となる条件に一致するページでgenerate()を持っているものを対象とする
すべてのgenerate()を実行し、返ってきたtask data (takker-scheduler-3)をすべて指定された日付ページに書き込む
code:script.d.ts
export function generatePlan(dates: Date[], targetProject: string | undefined): void;
既知の問題点
すでにtaskを書き出したかどうかを判定できない
対策
重複して出力してしまった度に手動で消す
これで十分な気もする
日付ページをfetchして、すでに出力したかどうかを調べる
出力した場合は何らかの文字列を書き込んでおく
fetchする分出力に時間がかかってしまう
2021-05-09
13:05:28 ✅一定期間のtask lineを一つのページに書き込む (takker-scheduler-3)
dependencies
takker-scheduler-3/task
task portal page (takker-scheduler-3)となる条件
takker-scheduler-3/diary-page
date-fns.min.js
scrapbox-insert-text-2
scrapbox-motion-emulation
scrapbox-keyboard-emulation-2
code:script.js
import {toString} from '../takker-scheduler-3%2Ftask/script.js';
import {isTaskPortalPage} from '../task_portal_page_(takker-scheduler-3)となる条件/script.js';
import {getTitle} from '../takker-scheduler-3%2Fdiary-page/script.js';
import {lightFormat, parse} from '../date-fns.min.js/script.js';
import {insertText} from '../scrapbox-insert-text-2/script.js';
import {goLastLine} from '../scrapbox-motion-emulation/script.js';
import {press} from '../scrapbox-keyboard-emulation-2/script.js';
export async function generatePlan(dates, targetProject, {minify = false} = {}) {
targetProject = targetProject ?? scrapbox.Project.name;
const taskList = (await Promise.all(dates.map(date => generateTaskList(date))))
.flat();
if (minify) {
// 現在のページの末尾に書き込む
await goLastLine();
press('Enter');
await insertText(taskList.map(task => toString(task)).join('\n'));
return;
}
// 日付ごとにまとめる
let taskStrings = {};
taskList.forEach(task => {
const key = lightFormat(task.baseDate, 'yyyy-MM-dd');
taskStringskey = [
...(taskStringskey ?? []),
toString(task),
];
});
// 新しいタブで開く
for (const key, tasks of Object.entries(taskStrings)) {
const body = encodeURIComponent(tasks.join('\n'));
const title = encodeURIComponent(getTitle(parse(key, 'yyyy-MM-dd', new Date())));
window.open(https://scrapbox.io/${targetProject}/${title}?body=${body});
}
}
async function generateTaskList(date) {
const generates = await getFunctions(isTaskPortalPage, 'generate.js');
return (await Promise.all(generates.map(generate => generate(date)))).flat();
}
task portal page (takker-scheduler-3)からtask line生成関数を読み込む
code:script.js
async function getFunctions(judge, filename) {
const titles = scrapbox.Project.pages
.flatMap(({titleLc, exists}) => (exists && judge(titleLc)) ? titleLc : []);
const generates = await Promise.all(titles.map(title => getFunction(title, filename)));
return generates.filter(generate => generate);
}
async function getFunction(title, filename) {
try {
const {generate} = await import(/api/code/${scrapbox.Project.name}/${title}/${filename});
return generate;
} catch(e) {
// 404 Not foundは無視
if (!(e instanceof SyntaxError)) return undefined;
console.error(e.message);
console.error(file: ${e.fileName}, line: ${e.lineNumber}, col: ${e.columnNumber});
console.error(e.stack);
return undefined;
}
}
#2021-05-09 13:03:41
#2021-03-15 03:49:48