diff --git a/nextjs/src/models/local/IModuleItem.ts b/nextjs/src/models/local/IModuleItem.ts new file mode 100644 index 0000000..43d40f1 --- /dev/null +++ b/nextjs/src/models/local/IModuleItem.ts @@ -0,0 +1,4 @@ +export interface IModuleItem { + name: string; + dueAt: string; +} diff --git a/nextjs/src/models/local/page/localCoursePage.ts b/nextjs/src/models/local/page/localCoursePage.ts new file mode 100644 index 0000000..ead366e --- /dev/null +++ b/nextjs/src/models/local/page/localCoursePage.ts @@ -0,0 +1,7 @@ +import { IModuleItem } from "../IModuleItem"; + +export interface LocalCoursePage extends IModuleItem { + name: string; + text: string; + dueAt: string; +} diff --git a/nextjs/src/models/local/page/pageMarkdown.ts b/nextjs/src/models/local/page/pageMarkdown.ts new file mode 100644 index 0000000..c7858e5 --- /dev/null +++ b/nextjs/src/models/local/page/pageMarkdown.ts @@ -0,0 +1,32 @@ +import { extractLabelValue } from "../assignmnet/utils/markdownUtils"; +import { LocalCoursePage } from "./localCoursePage"; + +export const pageMarkdown = { + toMarkdown: (page: LocalCoursePage) => { + const printableDueDate = new Date(page.dueAt) + .toISOString() + .replace("\u202F", " "); + const settingsMarkdown = `Name: ${page.name}\nDueDateForOrdering: ${printableDueDate}\n---\n`; + return settingsMarkdown + page.text; + }, + + parseMarkdown: (pageMarkdown: string) => { + const rawSettings = pageMarkdown.split("---")[0]; + const name = extractLabelValue(rawSettings, "Name"); + const rawDate = extractLabelValue(rawSettings, "DueDateForOrdering"); + + const parsedDate = new Date(rawDate); + if (isNaN(parsedDate.getTime())) { + throw new Error(`could not parse due date: ${rawDate}`); + } + + const text = pageMarkdown.split("---\n")[1]; + + const page: LocalCoursePage = { + name, + dueAt: parsedDate.toISOString(), + text, + }; + return page; + }, +}; diff --git a/nextjs/src/models/local/tests/markdown/pageMarkdown.test.ts b/nextjs/src/models/local/tests/markdown/pageMarkdown.test.ts new file mode 100644 index 0000000..f904e88 --- /dev/null +++ b/nextjs/src/models/local/tests/markdown/pageMarkdown.test.ts @@ -0,0 +1,19 @@ +import { describe, it, expect } from "vitest"; +import { LocalCoursePage } from "../../page/localCoursePage"; +import { pageMarkdown } from "../../page/pageMarkdown"; + +describe("PageMarkdownTests", () => { + it("can parse page", () => { + const page: LocalCoursePage = { + name: "test title", + text: "test text content", + dueAt: new Date().toISOString(), + }; + + const pageMarkdownString = pageMarkdown.toMarkdown(page); + + const parsedPage = pageMarkdown.parseMarkdown(pageMarkdownString); + + expect(parsedPage).toEqual(page); + }); +});