diff --git a/src/common/utils.ts b/src/common/utils.ts new file mode 100644 index 000000000..95ea39019 --- /dev/null +++ b/src/common/utils.ts @@ -0,0 +1,38 @@ +import { OwlError } from "./owl_error"; + +/** + * Parses an XML string into an XML document, throwing errors on parser errors + * instead of returning an XML document containing the parseerror. + * + * @param xml the string to parse + * @returns an XML document corresponding to the content of the string + */ +export function parseXML(xml: string): XMLDocument { + const parser = new DOMParser(); + const doc = parser.parseFromString(xml, "text/xml"); + if (doc.getElementsByTagName("parsererror").length) { + let msg = "Invalid XML in template."; + const parsererrorText = doc.getElementsByTagName("parsererror")[0].textContent; + if (parsererrorText) { + msg += "\nThe parser has produced the following error message:\n" + parsererrorText; + const re = /\d+/g; + const firstMatch = re.exec(parsererrorText); + if (firstMatch) { + const lineNumber = Number(firstMatch[0]); + const line = xml.split("\n")[lineNumber - 1]; + const secondMatch = re.exec(parsererrorText); + if (line && secondMatch) { + const columnIndex = Number(secondMatch[0]) - 1; + if (line[columnIndex]) { + msg += + `\nThe error might be located at xml line ${lineNumber} column ${columnIndex}\n` + + `${line}\n${"-".repeat(columnIndex - 1)}^`; + } + } + } + } + throw new OwlError(msg); + } + + return doc; +} diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index ed31ea2a4..7c31945a5 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -1,4 +1,5 @@ import { OwlError } from "../common/owl_error"; +import { parseXML } from "../common/utils"; // ----------------------------------------------------------------------------- // AST Type definition @@ -972,40 +973,3 @@ function normalizeXML(el: Element) { normalizeTIf(el); normalizeTEscTOut(el); } - -/** - * Parses an XML string into an XML document, throwing errors on parser errors - * instead of returning an XML document containing the parseerror. - * - * @param xml the string to parse - * @returns an XML document corresponding to the content of the string - */ -function parseXML(xml: string): XMLDocument { - const parser = new DOMParser(); - const doc = parser.parseFromString(xml, "text/xml"); - if (doc.getElementsByTagName("parsererror").length) { - let msg = "Invalid XML in template."; - const parsererrorText = doc.getElementsByTagName("parsererror")[0].textContent; - if (parsererrorText) { - msg += "\nThe parser has produced the following error message:\n" + parsererrorText; - const re = /\d+/g; - const firstMatch = re.exec(parsererrorText); - if (firstMatch) { - const lineNumber = Number(firstMatch[0]); - const line = xml.split("\n")[lineNumber - 1]; - const secondMatch = re.exec(parsererrorText); - if (line && secondMatch) { - const columnIndex = Number(secondMatch[0]) - 1; - if (line[columnIndex]) { - msg += - `\nThe error might be located at xml line ${lineNumber} column ${columnIndex}\n` + - `${line}\n${"-".repeat(columnIndex - 1)}^`; - } - } - } - } - throw new OwlError(msg); - } - - return doc; -} diff --git a/src/runtime/template_set.ts b/src/runtime/template_set.ts index a2148a1bb..5cee95867 100644 --- a/src/runtime/template_set.ts +++ b/src/runtime/template_set.ts @@ -4,39 +4,10 @@ import { getCurrent } from "./component_node"; import { Portal, portalTemplate } from "./portal"; import { helpers } from "./template_helpers"; import { OwlError } from "../common/owl_error"; +import { parseXML } from "../common/utils"; const bdom = { text, createBlock, list, multi, html, toggler, comment }; -function parseXML(xml: string): Document { - const parser = new DOMParser(); - - const doc = parser.parseFromString(xml, "text/xml"); - if (doc.getElementsByTagName("parsererror").length) { - let msg = "Invalid XML in template."; - const parsererrorText = doc.getElementsByTagName("parsererror")[0].textContent; - if (parsererrorText) { - msg += "\nThe parser has produced the following error message:\n" + parsererrorText; - const re = /\d+/g; - const firstMatch = re.exec(parsererrorText); - if (firstMatch) { - const lineNumber = Number(firstMatch[0]); - const line = xml.split("\n")[lineNumber - 1]; - const secondMatch = re.exec(parsererrorText); - if (line && secondMatch) { - const columnIndex = Number(secondMatch[0]) - 1; - if (line[columnIndex]) { - msg += - `\nThe error might be located at xml line ${lineNumber} column ${columnIndex}\n` + - `${line}\n${"-".repeat(columnIndex - 1)}^`; - } - } - } - } - throw new OwlError(msg); - } - return doc; -} - export interface TemplateSetConfig { dev?: boolean; translatableAttributes?: string[];