diff --git a/globalSettings.yml b/globalSettings.yml
index 8c44f50..831ebaf 100644
--- a/globalSettings.yml
+++ b/globalSettings.yml
@@ -15,3 +15,5 @@ courses:
name: Telem and Ops
- path: ./4850_AdvancedFE/2024-fall-alex/modules/
name: Old Adv Frontend
+ - path: ./1430/2025-spring-jonathan/Modules/
+ name: Jonathan UX
diff --git a/src/app/course/[courseName]/calendar/day/getStatus.tsx b/src/app/course/[courseName]/calendar/day/getStatus.tsx
index 5ea6b6c..6caf87a 100644
--- a/src/app/course/[courseName]/calendar/day/getStatus.tsx
+++ b/src/app/course/[courseName]/calendar/day/getStatus.tsx
@@ -105,7 +105,10 @@ export const getStatus = ({
try {
const htmlIsSame = htmlIsCloseEnough(
- markdownToHTMLSafe(assignment.description, settings),
+ markdownToHTMLSafe({
+ markdownString: assignment.description,
+ settings,
+ }),
canvasAssignment.description
);
if (!htmlIsSame)
diff --git a/src/app/course/[courseName]/modules/[moduleName]/assignment/[assignmentName]/AssignmentPreview.tsx b/src/app/course/[courseName]/modules/[moduleName]/assignment/[assignmentName]/AssignmentPreview.tsx
index 5852e45..03bbc88 100644
--- a/src/app/course/[courseName]/modules/[moduleName]/assignment/[assignmentName]/AssignmentPreview.tsx
+++ b/src/app/course/[courseName]/modules/[moduleName]/assignment/[assignmentName]/AssignmentPreview.tsx
@@ -60,12 +60,6 @@ export default function AssignmentPreview({
diff --git a/src/components/MarkdownDisplay.tsx b/src/components/MarkdownDisplay.tsx
index 069af69..c1c93cb 100644
--- a/src/components/MarkdownDisplay.tsx
+++ b/src/components/MarkdownDisplay.tsx
@@ -35,7 +35,7 @@ function DangerousInnerMarkdown({
);
diff --git a/src/features/canvas/hooks/canvasModuleHooks.ts b/src/features/canvas/hooks/canvasModuleHooks.ts
index 4665837..3e9799b 100644
--- a/src/features/canvas/hooks/canvasModuleHooks.ts
+++ b/src/features/canvas/hooks/canvasModuleHooks.ts
@@ -1,4 +1,3 @@
-import { CanvasModuleItem } from "@/features/canvas/models/modules/canvasModuleItems";
import { useLocalCourseSettingsQuery } from "@/features/local/course/localCoursesHooks";
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import { canvasModuleService } from "../services/canvasModuleService";
diff --git a/src/features/canvas/services/canvasAssignmentService.ts b/src/features/canvas/services/canvasAssignmentService.ts
index 108daa6..43da076 100644
--- a/src/features/canvas/services/canvasAssignmentService.ts
+++ b/src/features/canvas/services/canvasAssignmentService.ts
@@ -29,7 +29,10 @@ export const canvasAssignmentService = {
) {
console.log(`Creating assignment: ${localAssignment.name}`);
const url = `${canvasApi}/courses/${canvasCourseId}/assignments`;
- const content = markdownToHTMLSafe(localAssignment.description, settings);
+ const content = markdownToHTMLSafe({
+ markdownString: localAssignment.description,
+ settings,
+ });
const contentWithClassroomLinks =
localAssignment.githubClassroomAssignmentShareLink
@@ -84,7 +87,10 @@ export const canvasAssignmentService = {
allowed_extensions: localAssignment.allowedFileUploadExtensions.map(
(e) => e.toString()
),
- description: markdownToHTMLSafe(localAssignment.description, settings),
+ description: markdownToHTMLSafe({
+ markdownString: localAssignment.description,
+ settings,
+ }),
due_at: getDateFromString(localAssignment.dueAt)?.toISOString(),
lock_at:
localAssignment.lockAt &&
diff --git a/src/features/canvas/services/canvasPageService.ts b/src/features/canvas/services/canvasPageService.ts
index 692a528..fd446b8 100644
--- a/src/features/canvas/services/canvasPageService.ts
+++ b/src/features/canvas/services/canvasPageService.ts
@@ -37,7 +37,7 @@ export const canvasPageService = {
const body = {
wiki_page: {
title: page.name,
- body: markdownToHTMLSafe(page.text, settings),
+ body: markdownToHTMLSafe({ markdownString: page.text, settings }),
},
};
@@ -59,7 +59,7 @@ export const canvasPageService = {
const body = {
wiki_page: {
title: page.name,
- body: markdownToHTMLSafe(page.text, settings),
+ body: markdownToHTMLSafe({ markdownString: page.text, settings }),
},
};
await axiosClient.put(url, body);
diff --git a/src/features/canvas/services/canvasQuizService.ts b/src/features/canvas/services/canvasQuizService.ts
index 81e4022..adbca00 100644
--- a/src/features/canvas/services/canvasQuizService.ts
+++ b/src/features/canvas/services/canvasQuizService.ts
@@ -30,7 +30,7 @@ export const getAnswers = (
});
return question.answers.map((answer) => ({
- answer_html: markdownToHTMLSafe(answer.text, settings),
+ answer_html: markdownToHTMLSafe({ markdownString: answer.text, settings }),
answer_weight: answer.correct ? 100 : 0,
answer_text: answer.text,
}));
@@ -53,7 +53,10 @@ const createQuestionOnly = async (
const body = {
question: {
- question_text: markdownToHTMLSafe(question.text, settings),
+ question_text: markdownToHTMLSafe({
+ markdownString: question.text,
+ settings,
+ }),
question_type: getQuestionType(question),
points_possible: question.points,
position,
@@ -175,7 +178,10 @@ export const canvasQuizService = {
const body = {
quiz: {
title: localQuiz.name,
- description: markdownToHTMLSafe(localQuiz.description, settings),
+ description: markdownToHTMLSafe({
+ markdownString: localQuiz.description,
+ settings,
+ }),
shuffle_answers: localQuiz.shuffleAnswers,
access_code: localQuiz.password,
show_correct_answers: localQuiz.showCorrectAnswers,
diff --git a/src/features/local/utils/tests/fileStorage.test.ts b/src/features/local/utils/tests/fileStorage.test.ts
index 4b36b14..da3ce1c 100644
--- a/src/features/local/utils/tests/fileStorage.test.ts
+++ b/src/features/local/utils/tests/fileStorage.test.ts
@@ -9,6 +9,7 @@ import {
createModuleFile,
getModuleNamesFromFiles,
} from "@/features/local/modules/moduleRouter";
+import { getCoursePathByName } from "../../globalSettings/globalSettingsFileStorageService";
describe("FileStorageTests", () => {
beforeEach(async () => {
@@ -41,6 +42,7 @@ describe("FileStorageTests", () => {
assets: [],
};
+ await fileStorageService.settings.createCourseSettings(settings, await getCoursePathByName(name));
await fileStorageService.settings.updateCourseSettings(name, settings);
const loadedSettings = await fileStorageService.settings.getCourseSettings({
diff --git a/src/services/htmlMarkdownUtils.ts b/src/services/htmlMarkdownUtils.ts
index 00f98d8..7c61ee0 100644
--- a/src/services/htmlMarkdownUtils.ts
+++ b/src/services/htmlMarkdownUtils.ts
@@ -23,7 +23,7 @@ const mermaidExtension = {
},
renderer(token: { text: string }) {
const base64 = btoa(token.text);
- const url = `https://mermaid.ink/img/${base64}?type=svg`
+ const url = `https://mermaid.ink/img/${base64}?type=svg`;
console.log(token.text, url);
return `
`;
},
@@ -78,14 +78,27 @@ export function convertImagesToCanvasImages(
return mutableHtml;
}
-export function markdownToHTMLSafe(
- markdownString: string,
- settings: LocalCourseSettings,
- convertImages: boolean = true
-) {
+export function markdownToHTMLSafe({
+ markdownString,
+ settings,
+ convertImages = true,
+ replaceText = [],
+}: {
+ markdownString: string;
+ settings: LocalCourseSettings;
+ convertImages?: boolean;
+ replaceText?: { source: string; destination: string }[];
+}) {
const html = markdownToHtmlNoImages(markdownString);
if (convertImages) return convertImagesToCanvasImages(html, settings);
- else return html;
+
+
+ const replacedHtml = replaceText.reduce(
+ (acc, { source, destination }) => acc.replaceAll(source, destination),
+ html
+ );
+ return html;
+ return replacedHtml;
}
export function markdownToHtmlNoImages(markdownString: string) {