import { addTask, startTask, endTask, posterioriEndTask, walkDay, moveToday, toggleTask, transport, createTask, toString, format } from "../takker99%2Ftakker-scheduler/deps.ts"; import { parse, toTaskLine, } from "../takker99%2Ftakker-scheduler/workflow.ts"; import { caret, getLines, replaceLines, openInTheSameTab, } from "../scrapbox-userscript-std/dom.ts"; import { isMobile } from "../mobile版scrapboxの判定/script.js"; import type { Scrapbox } from "../scrapbox-jp%2Ftypes/userscript.ts"; declare const scrapbox: Scrapbox; if (isMobile()) { const id = "task"; scrapbox.PageMenu.addMenu({ title: id, image: 'https://img.icons8.com/ios/180/FFFFFF/todo-list--v2.png', }); scrapbox.PageMenu.addMenu({ title: 'Toggle task', image: 'https://img.icons8.com/ios/180/FFFFFF/repeat.png', onClick: toggleTask, }); scrapbox.PageMenu(id).addItem({ title: 'Add task', image: 'https://img.icons8.com/ios/180/FFFFFF/plus-math.png', onClick: addTask, }); scrapbox.PageMenu(id).addItem({ title: 'Start task', image: 'https://img.icons8.com/ios/180/FFFFFF/start--v1.png', onClick: startTask, }); scrapbox.PageMenu(id).addItem({ title: 'End task', image: 'https://img.icons8.com/ios/180/FFFFFF/stop-squared.png', onClick: endTask, }); scrapbox.PageMenu(id).addItem({ title: 'Posteriori end task', image: 'https://img.icons8.com/ios/180/FFFFFF/end--v1.png', onClick: posterioriEndTask, }); scrapbox.PageMenu(id).addItem({ title: 'Book starting', image: 'https://img.icons8.com/ios/180/FFFFFF/plus-1day.png', onClick: async () => { const [start, end] = getLineRange(); const text = getLines().slice(start, end + 1).map((line) => { const text = line.text; const link = line.text.match(/\[([^\]]+)\]/)?.[1]; if (!link) return text; const result = parse(link); if (!result || !result.ok) return text; const task = result.value; if (task.freshness?.status === "done") return text; const taskLine = toTaskLine(task); taskLine.title = `[${link}]`; if (!taskLine) return text; return toString(taskLine); }).join("\n"); await replaceLines(start, end, text); await createTask(); }, }); scrapbox.PageMenu(id).addItem({ title: 'Walk a day', image: 'https://img.icons8.com/ios/180/FFFFFF/plus-1day.png', onClick: () => walkDay(), }); scrapbox.PageMenu(id).addItem({ title: 'Move today', image: 'https://img.icons8.com/ios/180/FFFFFF/date-to.png', onClick: () => moveToday(), }); scrapbox.PageMenu(id).addItem({ title: 'Format', image: 'https://img.icons8.com/ios/180/FFFFFF/sort-by-start-date.png', onClick: () => format(scrapbox.Project.name, scrapbox.Page.title!), }); scrapbox.PageMenu(id).addItem({ title: 'Transport', onClick: () => transport({ from: { project: scrapbox.Project.name, title: scrapbox.Page.title!, }, to: "takker-memex", }), }); scrapbox.PageMenu(id).addItem({ title: 'Sync', onClick: () => window.open( "https://script.google.com/macros/s/AKfycbyAgN8nmUXjVXL_tahDzVyyrMzFaI4CJVmIapk8G0GuxxVN-7oUbuDJOf31fP7SFjx9/exec", ), }); } /** 選択範囲に含まれる行かカーソルがいる行を返す * * ported from https://github.com/takker99/takker-scheduler/blob/0.7.6/commands/getLineRange.ts */ const getLineRange = (): readonly [number, number] => { const { selectionRange: { start, end }, selectedText, position } = caret(); return selectedText === "" ? [position.line, position.line] : start.line > end.line ? [end.line, start.line] : [start.line, end.line] as const; };