import { getEachLatestDate } from "../getEachLatestDate/mod.ts"; import type { NewPageHookResult, NewPageHookOptions } from "../custom-new-page-3/mod.ts"; import { parse, toString, isTask } from "../takker99%2Ftakker-scheduler/deps.ts"; import type { Interval } from "../takker99%2Ftakker-scheduler/deps.ts"; import { getIndentCount } from "../scrapbox-userscript-std/text.ts"; import { lightFormat } from "../date-fns/mod.ts"; import { parse } from "../takker99%2Ftakker-scheduler/workflow.ts"; const foodType = { "あさごはん": "#log-breakfast", "ひるごはん": "#log-lunch", "よるごはん": "#log-dinner", } as Record; /** task lineの配下に書いたものを新しいページに切り出す * * 食べたもの記録のときは若干Templateを変える */ export const taskLineHook = ( text: string, { title, projectTo, mode }: NewPageHookOptions, ): NewPageHookResult | undefined => { const [taskLine, ...lines] = text.split("\n"); // 箇条書きが無い時は何もしない if (lines.length === 0) return; const parsed = parse(taskLine); if (!parsed) return; const { title: taskName, base, record, ...rest } = parsed; const newTitle = makeTaskTitle(taskName, base, record); const newTaskLine = toString({ title: `[${newTitle}]`, base, record, ...rest, }); // 余計なインデントを削る const minIndentNum = Math.min(...lines.map((line) => getIndentCount(line))); const newLines = [ // タスク名にリンクが入っていたときはそれを使う ...(/[\[\]]/.test(taskName) ? [taskName] : []), ...lines.map( (line) => line.slice(minIndentNum) ), "", `from [${title}]`, ...((title in foodType) ? [foodType[title], '#log-eatenfood'] : []), lightFormat(record.start ?? base, '#yyyy-MM-dd HH:mm:ss'), ]; return { text: newTaskLine, pages: [{ project: projectTo, title: newTitle, lines: newLines, mode, }], }; }; const makeTaskTitle = (title: string, base: Date, record: Interval) => { const date = lightFormat(record.start ?? base, 'yyyy-MM-dd'); if (title in foodType) { return `${date} ${title}`; } // タスクリンクの場合は、それをそのまま使う if (parse(title.slice(1, -1))) { return title.slice(1, -1); } return `${title.replace(/[\[\]]/g, '').trim()} ${date}`; }; export const newPageHook = ( text: string, { title: titleFrom, projectTo, mode, lines: metaLines }: NewPageHookOptions, ): NewPageHookResult => { const [rawTitle, ...lines] = text.split("\n"); const title = rawTitle.replace(/[\[\]]/g, "").trim(); // 余計なインデントを削る const minIndentNum = Math.min(...lines.map((line) => getIndentCount(line))); // 行の更新日時と現在日時から日付タグを作る // "takker"で始まるproject以外ではoffにする const dates = projectTo.startsWith("takker") ? getEachLatestDate([ new Date(), ...metaLines.map(({ updated }) => new Date(updated * 1000)), ]) .sort((a, b) => b.getTime() - a.getTime()) .map( (date) => lightFormat(date, '#yyyy-MM-dd HH:mm:ss') ) : []; const newLines = [ `from [${titleFrom}]`, "", // タイトルにリンクが入っていたときはそれを使う ...(/[\[\]]/.test(rawTitle) ? [rawTitle.trimStart()] : []), ...lines.map((line) => line.slice(minIndentNum)), "", ...dates, ]; return { text: `${" ".repeat(getIndentCount(rawTitle))}[${title}]`, pages: [{ project: projectTo, title, lines: newLines, mode, }], }; };