Merge pull request #13501 from calixteman/13500
XFA - CDATA can be xml so parse it when required
This commit is contained in:
commit
8b4acb4e36
@ -16,7 +16,9 @@
|
||||
import {
|
||||
$acceptWhitespace,
|
||||
$clean,
|
||||
$content,
|
||||
$finalize,
|
||||
$isCDATAXml,
|
||||
$nsAttributes,
|
||||
$onChild,
|
||||
$onText,
|
||||
@ -150,6 +152,13 @@ class XFAParser extends XMLParserBase {
|
||||
|
||||
onEndElement(name) {
|
||||
const node = this._current;
|
||||
if (node[$isCDATAXml]() && typeof node[$content] === "string") {
|
||||
const parser = new XFAParser();
|
||||
const root = parser.parse(node[$content]);
|
||||
node[$content] = null;
|
||||
node[$onChild](root);
|
||||
}
|
||||
|
||||
node[$finalize]();
|
||||
this._current = this._stack.pop();
|
||||
if (this._current[$onChild](node)) {
|
||||
|
@ -29,6 +29,7 @@ import {
|
||||
$hasItem,
|
||||
$hasSettableValue,
|
||||
$ids,
|
||||
$isCDATAXml,
|
||||
$isTransparent,
|
||||
$namespaceId,
|
||||
$nodeName,
|
||||
@ -1746,6 +1747,10 @@ class ExData extends ContentObject {
|
||||
this.usehref = attributes.usehref || "";
|
||||
}
|
||||
|
||||
[$isCDATAXml]() {
|
||||
return this.contentType === "text/html";
|
||||
}
|
||||
|
||||
[$onChild](child) {
|
||||
if (
|
||||
this.contentType === "text/html" &&
|
||||
|
@ -51,6 +51,7 @@ const $hasSettableValue = Symbol();
|
||||
const $ids = Symbol();
|
||||
const $indexOf = Symbol();
|
||||
const $insertAt = Symbol();
|
||||
const $isCDATAXml = Symbol();
|
||||
const $isDataValue = Symbol();
|
||||
const $isDescendent = Symbol();
|
||||
const $isTransparent = Symbol();
|
||||
@ -148,6 +149,10 @@ class XFAObject {
|
||||
return false;
|
||||
}
|
||||
|
||||
[$isCDATAXml]() {
|
||||
return false;
|
||||
}
|
||||
|
||||
[$setId](ids) {
|
||||
if (this.id && this[$namespaceId] === NamespaceIds.template.id) {
|
||||
ids.set(this.id, this);
|
||||
@ -970,6 +975,7 @@ export {
|
||||
$ids,
|
||||
$indexOf,
|
||||
$insertAt,
|
||||
$isCDATAXml,
|
||||
$isDataValue,
|
||||
$isDescendent,
|
||||
$isTransparent,
|
||||
|
@ -256,6 +256,38 @@ describe("XFAParser", function () {
|
||||
expect(root[$dump]()).toEqual(expected);
|
||||
});
|
||||
|
||||
it("should parse a xfa document and parse CDATA when needed", function () {
|
||||
const xml = `
|
||||
<?xml version="1.0"?>
|
||||
<xdp:xdp xmlns:xdp="http://ns.adobe.com/xdp/">
|
||||
<template xmlns="http://www.xfa.org/schema/xfa-template/3.3">
|
||||
<subform>
|
||||
<field>
|
||||
<extras>
|
||||
<exData contentType="text/html" name="foo">
|
||||
<![CDATA[<body xmlns="http://www.w3.org/1999/xhtml">
|
||||
<span>hello</span></body>]]>
|
||||
</exData>
|
||||
</extra>
|
||||
</field>
|
||||
</subform>
|
||||
</template>
|
||||
</xdp:xdp>
|
||||
`;
|
||||
const root = new XFAParser().parse(xml);
|
||||
const exdata = searchNode(root, root, "foo")[0];
|
||||
const body = exdata[$dump]().$content[$dump]();
|
||||
const expected = {
|
||||
$name: "body",
|
||||
attributes: {},
|
||||
children: [
|
||||
{ $content: "hello", $name: "span", attributes: {}, children: [] },
|
||||
],
|
||||
};
|
||||
|
||||
expect(body).toEqual(expected);
|
||||
});
|
||||
|
||||
it("should parse a xfa document and apply some prototypes", function () {
|
||||
const xml = `
|
||||
<?xml version="1.0"?>
|
||||
|
Loading…
Reference in New Issue
Block a user