diff --git a/validator-worker/common/deps_xml.ts b/validator-worker/common/deps_xml.ts index 27b4518..ce874e5 100644 --- a/validator-worker/common/deps_xml.ts +++ b/validator-worker/common/deps_xml.ts @@ -1,2 +1,2 @@ -export { parseXml, findChildElements, findElementRecursive, computeAttributeMap, qnameEq, qnamesInclude } from 'https://raw.githubusercontent.com/skymethod/denoflare/v0.5.1/common/xml_parser.ts'; -export type { ExtendedXmlNode, Qname } from 'https://raw.githubusercontent.com/skymethod/denoflare/v0.5.1/common/xml_parser.ts'; +export { parseXml, validateXml, findChildElements, findElementRecursive, computeAttributeMap, qnameEq, qnamesInclude } from 'https://raw.githubusercontent.com/skymethod/denoflare/eeacf004d8ec15913f94d5644d10f8f04d5340d2/common/xml_parser.ts'; +export type { ExtendedXmlNode, Qname } from 'https://raw.githubusercontent.com/skymethod/denoflare/eeacf004d8ec15913f94d5644d10f8f04d5340d2/common/xml_parser.ts'; diff --git a/validator-worker/common/validation_job_vm.ts b/validator-worker/common/validation_job_vm.ts index 96aed70..17983de 100644 --- a/validator-worker/common/validation_job_vm.ts +++ b/validator-worker/common/validation_job_vm.ts @@ -2,7 +2,7 @@ import { checkMatches, checkEqual } from './check.ts'; import { Qnames } from './qnames.ts'; import { isReadonlyArray } from './util.ts'; import { RuleReference, MessageOptions, ValidationCallbacks, validateFeedXml, podcastIndexReference } from './validator.ts'; -import { computeAttributeMap, ExtendedXmlNode, parseXml } from './deps_xml.ts'; +import { computeAttributeMap, ExtendedXmlNode, parseXml, validateXml } from './deps_xml.ts'; import { setIntersect } from './sets.ts'; import { InMemoryCache, Callbacks, Comment, makeRateLimitedFetcher, makeThreadcap, Threadcap, updateThreadcap, Fetcher as ThreadcapFetcher } from './deps_comments.ts'; @@ -189,6 +189,11 @@ export class ValidationJobVM { let xml: ExtendedXmlNode | undefined; try { + const result = validateXml(text); + if (result !== true) { + const { code, col, line, msg } = result; + throw new Error(`${code} (at line ${line}, col ${col}): ${msg}`); + } xml = parseXml(text); console.log(xml); } catch (e) { diff --git a/validator-worker/deps_cli.ts b/validator-worker/deps_cli.ts index 940a8eb..f2ca418 100644 --- a/validator-worker/deps_cli.ts +++ b/validator-worker/deps_cli.ts @@ -1,7 +1,7 @@ export { basename, dirname, join, fromFileUrl, resolve, toFileUrl, extname, relative, isAbsolute, normalize, parse as parsePath, globToRegExp } from 'https://deno.land/std@0.140.0/path/mod.ts'; export { parse as parseFlags } from 'https://deno.land/std@0.140.0/flags/mod.ts'; -export { ModuleWatcher } from 'https://raw.githubusercontent.com/skymethod/denoflare/v0.5.1/cli/module_watcher.ts'; -export { bundle } from 'https://raw.githubusercontent.com/skymethod/denoflare/e5a9ba66237f9e3a5d555442252539ec267ae989/cli/bundle.ts'; -export { fileExists } from 'https://raw.githubusercontent.com/skymethod/denoflare/v0.5.1/cli/fs_util.ts'; -export { Bytes } from 'https://raw.githubusercontent.com/skymethod/denoflare/v0.5.1/common/bytes.ts'; -export { parseJsonc } from 'https://raw.githubusercontent.com/skymethod/denoflare/v0.5.1/cli/jsonc.ts'; +export { ModuleWatcher } from 'https://raw.githubusercontent.com/skymethod/denoflare/eeacf004d8ec15913f94d5644d10f8f04d5340d2/cli/module_watcher.ts'; +export { bundle } from 'https://raw.githubusercontent.com/skymethod/denoflare/eeacf004d8ec15913f94d5644d10f8f04d5340d2/cli/bundle.ts'; +export { fileExists } from 'https://raw.githubusercontent.com/skymethod/denoflare/eeacf004d8ec15913f94d5644d10f8f04d5340d2/cli/fs_util.ts'; +export { Bytes } from 'https://raw.githubusercontent.com/skymethod/denoflare/eeacf004d8ec15913f94d5644d10f8f04d5340d2/common/bytes.ts'; +export { parseJsonc } from 'https://raw.githubusercontent.com/skymethod/denoflare/eeacf004d8ec15913f94d5644d10f8f04d5340d2/cli/jsonc.ts'; diff --git a/validator-worker/deps_worker.ts b/validator-worker/deps_worker.ts index 5ce23c3..c7fd1f7 100644 --- a/validator-worker/deps_worker.ts +++ b/validator-worker/deps_worker.ts @@ -1,4 +1,4 @@ -export { Bytes } from 'https://raw.githubusercontent.com/skymethod/denoflare/v0.5.1/common/bytes.ts'; -export { importText } from 'https://raw.githubusercontent.com/skymethod/denoflare/v0.5.1/common/import_text.ts'; -export type { IncomingRequestCf, ModuleWorkerContext, DurableObjectNamespace, DurableObjectState } from 'https://raw.githubusercontent.com/skymethod/denoflare/v0.5.1/common/cloudflare_workers_types.d.ts'; -export { ColoFromTrace } from 'https://raw.githubusercontent.com/skymethod/denoflare/v0.5.1/examples/tiered-websockets-worker/colo_from_trace.ts'; +export { Bytes } from 'https://raw.githubusercontent.com/skymethod/denoflare/eeacf004d8ec15913f94d5644d10f8f04d5340d2/common/bytes.ts'; +export { importText } from 'https://raw.githubusercontent.com/skymethod/denoflare/eeacf004d8ec15913f94d5644d10f8f04d5340d2/common/import_text.ts'; +export type { IncomingRequestCf, ModuleWorkerContext, DurableObjectNamespace, DurableObjectState } from 'https://raw.githubusercontent.com/skymethod/denoflare/eeacf004d8ec15913f94d5644d10f8f04d5340d2/common/cloudflare_workers_types.d.ts'; +export { ColoFromTrace } from 'https://raw.githubusercontent.com/skymethod/denoflare/eeacf004d8ec15913f94d5644d10f8f04d5340d2/examples/tiered-websockets-worker/colo_from_trace.ts'; diff --git a/validator-worker/static/app.js b/validator-worker/static/app.js index 7ce92dd..b6b34ae 100644 --- a/validator-worker/static/app.js +++ b/validator-worker/static/app.js @@ -2389,11 +2389,13 @@ var getTraversalObj$1 = parser.getTraversalObj; parser.j2xParser; parser.parse; parser.parseToNimn; -parser.validate; -function decodeXml(encoded) { +var validate$1 = parser.validate; +function decodeXml(encoded, additionalEntities = {}) { return encoded.replaceAll(/&(#(\d+)|[a-z]+);/g, (str, entity, decimal)=>{ if (typeof decimal === 'string') return String.fromCharCode(parseInt(decimal)); if (typeof entity === 'string') { + const additional = additionalEntities[entity]; + if (additional) return additional; const rt = ENTITIES_TO_UNENCODED_CHARS[entity]; if (rt) return rt; } @@ -2407,12 +2409,18 @@ const ENTITIES_TO_UNENCODED_CHARS = { 'apos': `'`, 'quot': '"' }; -function parseXml(xml) { +function validateXml(xml) { + const rt = validate$1(xml); + return rt === true ? rt : rt.err; +} +function parseXml(xml, opts = {}) { + const { additionalEntities } = opts; + const tagValueProcessor = (tagName)=>decodeXml(tagName, additionalEntities); const rt = getTraversalObj$1(xml, { ignoreAttributes: false, parseAttributeValue: false, parseNodeValue: false, - tagValueProcessor: decodeXml + tagValueProcessor }); const namespaces = new XmlNamespaces(); applyQnames(rt, namespaces); @@ -4215,6 +4223,11 @@ class ValidationJobVM { start = Date.now(); let xml; try { + const result = validateXml(text); + if (result !== true) { + const { code , col , line , msg } = result; + throw new Error(`${code} (at line ${line}, col ${col}): ${msg}`); + } xml = parseXml(text); console.log(xml); } catch (e) { diff --git a/validator-worker/static/app.js.sha1 b/validator-worker/static/app.js.sha1 index 4cfe78f..9155e87 100644 --- a/validator-worker/static/app.js.sha1 +++ b/validator-worker/static/app.js.sha1 @@ -1 +1 @@ -343c7c4c43753e414235693f577f48d9f9382172 \ No newline at end of file +d053ae71a909e6e2ac4854bff6e2559e57f525a7 \ No newline at end of file