This commit is contained in:
2025-08-21 08:28:52 -06:00
parent 54e4d7b4a1
commit e07a12f622
10 changed files with 48 additions and 23 deletions

View File

@@ -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

View File

@@ -105,7 +105,10 @@ export const getStatus = ({
try {
const htmlIsSame = htmlIsCloseEnough(
markdownToHTMLSafe(assignment.description, settings),
markdownToHTMLSafe({
markdownString: assignment.description,
settings,
}),
canvasAssignment.description
);
if (!htmlIsSame)

View File

@@ -60,12 +60,6 @@ export default function AssignmentPreview({
<br />
<section>
<MarkdownDisplay markdown={assignment.description} />
{/* <div
className="markdownPreview"
dangerouslySetInnerHTML={{
__html: htmlPreview,
}}
></div> */}
</section>
<hr />
<section>

View File

@@ -35,7 +35,7 @@ function DangerousInnerMarkdown({
<div
className={"markdownPreview " + className}
dangerouslySetInnerHTML={{
__html: markdownToHTMLSafe(markdown, settings),
__html: markdownToHTMLSafe({ markdownString: markdown, settings }),
}}
></div>
);

View File

@@ -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";

View File

@@ -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 &&

View File

@@ -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);

View File

@@ -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,

View File

@@ -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({

View File

@@ -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 `<img src="${url}" alt="Mermaid diagram" />`;
},
@@ -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) {