From feb53cd1c531fa5b983e97f2b78bf2830851fef5 Mon Sep 17 00:00:00 2001 From: robyngit Date: Tue, 18 Nov 2025 12:48:41 -0500 Subject: [PATCH] Correct handling of elements in EML Fixes #2497 --- src/js/models/metadata/eml211/EML211.js | 23 ++++++++++++++++--- .../models/metadata/eml211/EML211.spec.js | 21 +++++++++++++++++ 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/src/js/models/metadata/eml211/EML211.js b/src/js/models/metadata/eml211/EML211.js index 2301e747f..1298c716c 100644 --- a/src/js/models/metadata/eml211/EML211.js +++ b/src/js/models/metadata/eml211/EML211.js @@ -1185,6 +1185,8 @@ define([ emlString += this.formatXML(rootEMLNode); }); + emlString = this.revertSourcedToSource(emlString); + return emlString; }, @@ -2187,14 +2189,29 @@ define([ /** * Replace elements named "source" with "sourced" due to limitations with - * using $.parseHTML() rather than $.parseXML() + * using $.parseHTML() rather than $.parseXML(). In HTML is + * treated as a void element a closing tag so any … will + * have the closing tag removed upon parsing. To avoid this problem, we + * replace with before parsing, and then revert it back + * to before saving to the server. * @param {string} xmlString The XML string to make the replacement in * @returns {string} The cleaned up XML string */ cleanUpXML(xmlString) { - xmlString.replace("", ""); - xmlString.replace("", ""); + xmlString = xmlString.replace(//g, ""); + xmlString = xmlString.replace(/<\/source>/g, ""); + return xmlString; + }, + /** + * Revert elements named "sourced" back to "source" before saving to the + * server. See cleanUpXML() for more info. + * @param {string} xmlString The XML string in which to make the replacement + * @returns {string} The cleaned up XML string + */ + revertSourcedToSource(xmlString) { + xmlString = xmlString.replace(//g, ""); + xmlString = xmlString.replace(/<\/sourced>/g, ""); return xmlString; }, diff --git a/test/js/specs/unit/models/metadata/eml211/EML211.spec.js b/test/js/specs/unit/models/metadata/eml211/EML211.spec.js index 9678fe9b5..fe645f05a 100644 --- a/test/js/specs/unit/models/metadata/eml211/EML211.spec.js +++ b/test/js/specs/unit/models/metadata/eml211/EML211.spec.js @@ -44,5 +44,26 @@ define([ .should.be.instanceof(EMLTaxonCoverage); }); }); + + describe("XML clean up helpers", function () { + const sourceXML = + "OneTwo"; + const sourcedXML = + "OneTwo"; + + it("cleanUpXML converts source elements to sourced", function () { + state.eml.cleanUpXML(sourceXML).should.equal(sourcedXML); + }); + + it("revertSourcedToSource converts sourced elements back to source", function () { + state.eml.revertSourcedToSource(sourcedXML).should.equal(sourceXML); + }); + + it("round trips source elements through cleanUpXML and revertSourcedToSource", function () { + state.eml + .revertSourcedToSource(state.eml.cleanUpXML(sourceXML)) + .should.equal(sourceXML); + }); + }); }); });