takker-scheduler-3/task
takker-scheduler-3で使うタスクの解析と書き込みを行うModule
takker-scheduler-2/taskからの変更点
属性を削除した
その他いらない機能を消した
機能
本文を解析する
code:script.d.ts
export function parse(lineNo: number): TaskLine | undefined;
lineNo行にあるtask line (takker-scheduler-3)を読み込む
task line (takker-scheduler-3)でなければundefinedを返す
本文に書き込む
code:script.d.ts
export function set(
taskLine: TaskLine,
props: {
title: string;
baseDate: Date;
plan?: {
start?: Date | 'delete';
duration? DateFns.Duration | 'delete';
};
record?: {
start?: Date | 'delete';
end?: Date | 'delete';
};
},
option: {overwrite: boolean;}): Promise<TaskLine>;
taskLineのparameterを変更して、editorに反映する
propsに{}を渡せば、新規書き込みとなる
defaultは{}
overwriteをfalseにすると、新しい行を挿入して書き込む
defaultはfalse
2021-03-15 01:46:20 あまりいい設計じゃなかったかも
propertiesの削除が出来ない
対策
特定の値を渡すと、値をclearするようにする
'delete'を渡すようにするか。
code:script.d.ts
export function toString(task: Task): string;
task data (takker-scheduler-3)を文字列に変換する
別ページに書き込むときとかに使う
2021-05-04
14:49:03 文字列を解析できる函数parseFromString()を作った
takker-scheduler-3/syncで使う
dependencies
scrapbox-edit-emulation-2
code:script.js
import {
goHead, goLine,
} from '../scrapbox-motion-emulation/script.js';
import {insertLine} from '../scrapbox-edit-emulation-2/script.js';
import {press} from '../scrapbox-keyboard-emulation-2/script.js';
import {insertText} from '../scrapbox-insert-text-2/script.js';
import {
format, parse, set, addDays, isAfter,
intervalToDuration, differenceInMinutes,
} from '../date-fns.min.js/script.js';
import {sleep} from '../sleep/script.js';
設定とかもろもろ
code:script.js
// タスクの書式
const taskReg = /^(\d{4}-\d{2}-\d{2}) ( {5}|\d{2}:\d{2}) ( {4}|\d{4}) ( {8}|\d{2}:\d{2}:\d{2}) ( {8}|\d{2}:\d{2}:\d{2})(^\n*)$/;
code:script.d.ts
type Task = {
title: string;
baseDate: Date;
plan?: {
start?: Date;
duration? DateFns.Duration;
};
record?: {
start?: Date;
end?: Date;
};
};
type TaskLine = Task & {lineNo: number};
lineNo行にあるtask line (takker-scheduler-3)を解析する
なかったら何もしない
code:script.js
function parseDate(lineNo) {
const task = parseFromString(scrapbox.Page.lineslineNo?.text);
// lineNo行がタスク行でなければ何もしない
return task ? {lineNo, ...task} : undefined;
}
export {parseDate as parse};
任意の文字列をtask line (takker-scheduler-3)として解析する
code:script.js
export function parseFromString(line) {
if (!isTask(line)) return undefined;
// タスクが書き込まれた行を解析する
const baseDateString, plan, estimate, start, end, title = line.match(taskReg)?.slice(1);
const baseDate = parse(baseDateString, 'yyyy-MM-dd', new Date());
// 実績時刻を解析する
// 開始時刻より終了時刻の方が前だったら、日付を越えているとみなす
const rStart = !/^\s*$/.test(start) ? parse(start, 'HH:mm:ss', baseDate) : undefined;
let rEnd = !/^\s*$/.test(end) ? parse(end, 'HH:mm:ss', baseDate) : undefined;
if (rStart && rEnd && isAfter(rStart, rEnd)) rEnd = addDays(rEnd, 1);
return {
title,
baseDate,
plan: {
start: !/^\s*$/.test(plan) ?
parse(plan, 'HH:mm', baseDate) :
undefined,
duration: !/^\s*$/.test(estimate) ?
{minutes: parseInt(estimate)} :
undefined,
},
record: {start: rStart, end: rEnd,},
};
}
タスクの判定
解析までしなくていいときはこっちを使う
code:script.d.ts
export function isTask(text: string): boolean;
code:script.js
export function isTask(text) {
return taskReg.test(text);
}
タスクを書き込む
code:script.js
async function setProperties(taskLine, {title, baseDate, plan, record, lineNo} = {}, {overwrite = true} = {}) {
const newTaskLine = {
title: title ?? taskLine.title,
baseDate: baseDate ?? taskLine.baseDate,
plan: {
start: isDeleted(plan?.start) ? undefined : plan?.start ?? taskLine?.plan?.start,
duration: isDeleted(plan?.duration) ? undefined : plan?.duration ?? taskLine?.plan?.duration,
},
record: {
start: isDeleted(record?.start) ? undefined : record?.start ?? taskLine?.record?.start,
end: isDeleted( record?.end) ? undefined : record?.end ?? taskLine?.record?.end,
},
lineNo: lineNo ?? taskLine.lineNo,
};
if (overwrite) {
await goLine(newTaskLine.lineNo);
goHead();
press('End', {shiftKey: true});
await insertText(toString(newTaskLine));
} else {
await insertLine(newTaskLine.lineNo, toString(newTaskLine));
}
}
function isDeleted(value) {
return value === 'delete';
}
export {setProperties as set};
taskの文字列を作成する
code:script.js
export function toString({title, baseDate, plan, record}) {
return [
'`',
format(baseDate, 'yyyy-MM-dd'),
' ',
plan?.start ? format(plan.start, 'HH:mm') : ' '.repeat(5),
' ',
plan?.duration ?
String(plan.duration.minutes).padStart(4, '0') :
' '.repeat(4),
' ',
record?.start ? format(record?.start, 'HH:mm:ss') : ' '.repeat(8),
' ',
record?.end ? format(record?.end, 'HH:mm:ss') : ' '.repeat(8),
'`',
title,
].join('');
}
#2021-05-04 14:49:34
#2021-03-15 04:01:26
#2021-03-14 03:59:16