custom-new-page-3-settings
実装したいこと
✅task lineのタイトルがタスクリンクだった場合の処理を入れる 切り出し元のリンクをすでに含んでいる場合は、from [xxx]をつけない
settingsの範囲で実装できないこともないが……そうするよりcustom-new-page-3に手を加えて、hookにPage.linksを渡すよう変更したほうが実装しやすい code:mod.ts
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";
code:mod.ts
const foodType = {
"あさごはん": "#log-breakfast",
"ひるごはん": "#log-lunch",
"よるごはん": "#log-dinner",
} as Record<string, #${string}>;
/** task lineの配下に書いたものを新しいページに切り出す
*
* 食べたもの記録のときは若干Templateを変える
*/
export const taskLineHook = (
text: string,
{ title, projectTo, mode }: NewPageHookOptions,
): NewPageHookResult | undefined => {
// 箇条書きが無い時は何もしない
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 = [
// タスク名にリンクが入っていたときはそれを使う
...lines.map(
(line) => line.slice(minIndentNum)
),
"",
from [${title}],
...((title in foodType) ? [foodTypetitle, '#log-eatenfood'] : []), lightFormat(record.start ?? base, '#yyyy-MM-dd HH:mm:ss'),
];
return {
text: newTaskLine,
pages: [{
project: projectTo,
title: newTitle,
lines: newLines,
mode,
}],
};
};
切り出したページのタイトル
code:mod.ts
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};
};
末尾に日付タグを追記する
/^takker-/にマッチするproject以外では発動しない
2022-04-07
06:52:52 切り出し範囲の行の更新日時を日付タグにして挿入しておく
02:03:49 リンクなどを含んだタイトル行を本文に追記するとき、先頭の空白を削っておく
code:mod.ts
export const newPageHook = (
text: string,
{ title: titleFrom, projectTo, mode, lines: metaLines }: NewPageHookOptions,
): NewPageHookResult => {
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}],
"",
// タイトルにリンクが入っていたときはそれを使う
...lines.map((line) => line.slice(minIndentNum)),
"",
...dates,
];
return {
text: ${" ".repeat(getIndentCount(rawTitle))}[${title}],
pages: [{
project: projectTo,
title,
lines: newLines,
mode,
}],
};
};