Files
xboct-flow/src/utils/markdown.ts
T

42 lines
1.2 KiB
TypeScript

import fm from "front-matter";
import * as yaml from "js-yaml";
import { Task, TaskPriority, TaskStatus } from "@/model/task";
function toISO(value: unknown): string {
if (value instanceof Date) return value.toISOString();
if (typeof value === "string") return value;
return new Date().toISOString();
}
export function parseTaskFile(content: string): Task {
const parsed = fm<Record<string, unknown>>(content);
const data = parsed.attributes;
return {
id: data.id as string,
title: data.title as string,
description: parsed.body.trim(),
status: (data.status as TaskStatus) ?? "todo",
priority: (data.priority as TaskPriority) ?? "medium",
tags: (data.tags as string[]) ?? [],
assignee: (data.assignee as string) ?? "",
created: toISO(data.created),
updated: toISO(data.updated),
};
}
export function serializeTask(task: Task): string {
const frontmatter: Record<string, unknown> = {
id: task.id,
title: task.title,
status: task.status,
priority: task.priority,
tags: task.tags,
assignee: task.assignee,
created: task.created,
updated: task.updated,
};
const yamlStr = yaml.dump(frontmatter).trim();
return `---\n${yamlStr}\n---\n${task.description}`;
}