From 8c8d9119d4e11b9bb2eff63675528cd6e71cb203 Mon Sep 17 00:00:00 2001 From: Braden MacDonald Date: Tue, 22 Oct 2024 11:53:22 -0700 Subject: [PATCH] fix: don't revert to advanced editor if problem contains fields like url_name (#1421) --- .../containers/ProblemEditor/data/OLXParser.js | 16 ++++++++++++---- .../ProblemEditor/data/OLXParser.test.js | 2 +- .../ProblemEditor/data/mockData/olxTestData.js | 2 +- src/editors/data/constants/problem.ts | 6 ++++++ 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/editors/containers/ProblemEditor/data/OLXParser.js b/src/editors/containers/ProblemEditor/data/OLXParser.js index 0ac8664bf..cbdb163c5 100644 --- a/src/editors/containers/ProblemEditor/data/OLXParser.js +++ b/src/editors/containers/ProblemEditor/data/OLXParser.js @@ -3,7 +3,12 @@ import { XMLParser, XMLBuilder } from 'fast-xml-parser'; import _ from 'lodash'; -import { ProblemTypeKeys, RichTextProblems, settingsOlxAttributes } from '../../../data/constants/problem'; +import { + ProblemTypeKeys, + RichTextProblems, + settingsOlxAttributes, + ignoredOlxAttributes, +} from '../../../data/constants/problem'; export const indexToLetterMap = [...Array(26)].map((val, i) => String.fromCharCode(i + 65)); @@ -663,9 +668,12 @@ export class OLXParser { return {}; } - if (Object.keys(this.problem).some((key) => key.indexOf('@_') !== -1 && !settingsOlxAttributes.includes(key))) { - throw new Error('Misc Attributes associated with problem, opening in advanced editor'); - } + Object.keys(this.problem).forEach((key) => { + if (key.indexOf('@_') !== -1 && !settingsOlxAttributes.includes(key) && !ignoredOlxAttributes.includes(key)) { + const plainKey = key.replace(/^@_/, ''); + throw new Error(`Unrecognized attribute "${plainKey}" associated with problem, opening in advanced editor`); + } + }); const problemType = this.getProblemType(); diff --git a/src/editors/containers/ProblemEditor/data/OLXParser.test.js b/src/editors/containers/ProblemEditor/data/OLXParser.test.js index 4a6d7fb25..b463ccf34 100644 --- a/src/editors/containers/ProblemEditor/data/OLXParser.test.js +++ b/src/editors/containers/ProblemEditor/data/OLXParser.test.js @@ -58,7 +58,7 @@ describe('OLXParser', () => { labelDescriptionQuestionOlxParser.getParsedOLXData(); } catch (e) { expect(e).toBeInstanceOf(Error); - expect(e.message).toBe('Misc Attributes associated with problem, opening in advanced editor'); + expect(e.message).toBe('Unrecognized attribute "markdown" associated with problem, opening in advanced editor'); } }); }); diff --git a/src/editors/containers/ProblemEditor/data/mockData/olxTestData.js b/src/editors/containers/ProblemEditor/data/mockData/olxTestData.js index 0158428f0..99e25a2b5 100644 --- a/src/editors/containers/ProblemEditor/data/mockData/olxTestData.js +++ b/src/editors/containers/ProblemEditor/data/mockData/olxTestData.js @@ -2,7 +2,7 @@ // lint is disabled for this file due to strict spacing export const checkboxesOLXWithFeedbackAndHintsOLX = { - rawOLX: ` + rawOLX: `

You can use this template as a guide to the simple editor markdown and OLX markup to use for checkboxes with hints and feedback problems. Edit this component to replace this template with your own assessment.

diff --git a/src/editors/data/constants/problem.ts b/src/editors/data/constants/problem.ts index 230eb5751..0c26a45f0 100644 --- a/src/editors/data/constants/problem.ts +++ b/src/editors/data/constants/problem.ts @@ -233,3 +233,9 @@ export const settingsOlxAttributes = [ '@_submission_wait_seconds', '@_attempts_before_showanswer_button', ] as const; + +export const ignoredOlxAttributes = [ + // '@_markdown', // Not sure if this is safe to ignore; some tests seem to indicate it's not. + '@_url_name', + '@_x-is-pointer-node', +] as const;