takker-scheduler-3/plan-generator
仕様
code:script.d.ts
export function generatePlan(dates: Date[], targetProject: string | undefined): void;
既知の問題点
すでにtaskを書き出したかどうかを判定できない
対策
重複して出力してしまった度に手動で消す
これで十分な気もする
日付ページをfetchして、すでに出力したかどうかを調べる
出力した場合は何らかの文字列を書き込んでおく
fetchする分出力に時間がかかってしまう
2021-05-09
dependencies
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 ?? []), 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();
}
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;
}
}