xfa_object.js 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952
  1. /**
  2. * @licstart The following is the entire license notice for the
  3. * JavaScript code in this page
  4. *
  5. * Copyright 2022 Mozilla Foundation
  6. *
  7. * Licensed under the Apache License, Version 2.0 (the "License");
  8. * you may not use this file except in compliance with the License.
  9. * You may obtain a copy of the License at
  10. *
  11. * http://www.apache.org/licenses/LICENSE-2.0
  12. *
  13. * Unless required by applicable law or agreed to in writing, software
  14. * distributed under the License is distributed on an "AS IS" BASIS,
  15. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  16. * See the License for the specific language governing permissions and
  17. * limitations under the License.
  18. *
  19. * @licend The above is the entire license notice for the
  20. * JavaScript code in this page
  21. */
  22. "use strict";
  23. Object.defineProperty(exports, "__esModule", {
  24. value: true
  25. });
  26. exports.XmlObject = exports.XFAObjectArray = exports.XFAObject = exports.XFAAttribute = exports.StringObject = exports.OptionObject = exports.Option10 = exports.Option01 = exports.IntegerObject = exports.ContentObject = exports.$uid = exports.$toStyle = exports.$toString = exports.$toPages = exports.$toHTML = exports.$text = exports.$tabIndex = exports.$setValue = exports.$setSetAttributes = exports.$setId = exports.$searchNode = exports.$root = exports.$resolvePrototypes = exports.$removeChild = exports.$pushPara = exports.$pushGlyphs = exports.$popPara = exports.$onText = exports.$onChildCheck = exports.$onChild = exports.$nsAttributes = exports.$nodeName = exports.$namespaceId = exports.$isUsable = exports.$isTransparent = exports.$isThereMoreWidth = exports.$isSplittable = exports.$isNsAgnostic = exports.$isDescendent = exports.$isDataValue = exports.$isCDATAXml = exports.$isBindable = exports.$insertAt = exports.$indexOf = exports.$ids = exports.$hasSettableValue = exports.$globalData = exports.$getTemplateRoot = exports.$getSubformParent = exports.$getRealChildrenByNameIt = exports.$getParent = exports.$getNextPage = exports.$getExtra = exports.$getDataValue = exports.$getContainedChildren = exports.$getChildrenByNameIt = exports.$getChildrenByName = exports.$getChildrenByClass = exports.$getChildren = exports.$getAvailableSpace = exports.$getAttributes = exports.$getAttributeIt = exports.$flushHTML = exports.$finalize = exports.$extra = exports.$dump = exports.$data = exports.$content = exports.$consumed = exports.$clone = exports.$cleanup = exports.$cleanPage = exports.$clean = exports.$childrenToHTML = exports.$appendChild = exports.$addHTML = exports.$acceptWhitespace = void 0;
  27. var _utils = require("./utils.js");
  28. var _util = require("../../shared/util.js");
  29. var _core_utils = require("../core_utils.js");
  30. var _namespaces = require("./namespaces.js");
  31. var _som = require("./som.js");
  32. const $acceptWhitespace = Symbol();
  33. exports.$acceptWhitespace = $acceptWhitespace;
  34. const $addHTML = Symbol();
  35. exports.$addHTML = $addHTML;
  36. const $appendChild = Symbol();
  37. exports.$appendChild = $appendChild;
  38. const $childrenToHTML = Symbol();
  39. exports.$childrenToHTML = $childrenToHTML;
  40. const $clean = Symbol();
  41. exports.$clean = $clean;
  42. const $cleanPage = Symbol();
  43. exports.$cleanPage = $cleanPage;
  44. const $cleanup = Symbol();
  45. exports.$cleanup = $cleanup;
  46. const $clone = Symbol();
  47. exports.$clone = $clone;
  48. const $consumed = Symbol();
  49. exports.$consumed = $consumed;
  50. const $content = Symbol("content");
  51. exports.$content = $content;
  52. const $data = Symbol("data");
  53. exports.$data = $data;
  54. const $dump = Symbol();
  55. exports.$dump = $dump;
  56. const $extra = Symbol("extra");
  57. exports.$extra = $extra;
  58. const $finalize = Symbol();
  59. exports.$finalize = $finalize;
  60. const $flushHTML = Symbol();
  61. exports.$flushHTML = $flushHTML;
  62. const $getAttributeIt = Symbol();
  63. exports.$getAttributeIt = $getAttributeIt;
  64. const $getAttributes = Symbol();
  65. exports.$getAttributes = $getAttributes;
  66. const $getAvailableSpace = Symbol();
  67. exports.$getAvailableSpace = $getAvailableSpace;
  68. const $getChildrenByClass = Symbol();
  69. exports.$getChildrenByClass = $getChildrenByClass;
  70. const $getChildrenByName = Symbol();
  71. exports.$getChildrenByName = $getChildrenByName;
  72. const $getChildrenByNameIt = Symbol();
  73. exports.$getChildrenByNameIt = $getChildrenByNameIt;
  74. const $getDataValue = Symbol();
  75. exports.$getDataValue = $getDataValue;
  76. const $getExtra = Symbol();
  77. exports.$getExtra = $getExtra;
  78. const $getRealChildrenByNameIt = Symbol();
  79. exports.$getRealChildrenByNameIt = $getRealChildrenByNameIt;
  80. const $getChildren = Symbol();
  81. exports.$getChildren = $getChildren;
  82. const $getContainedChildren = Symbol();
  83. exports.$getContainedChildren = $getContainedChildren;
  84. const $getNextPage = Symbol();
  85. exports.$getNextPage = $getNextPage;
  86. const $getSubformParent = Symbol();
  87. exports.$getSubformParent = $getSubformParent;
  88. const $getParent = Symbol();
  89. exports.$getParent = $getParent;
  90. const $getTemplateRoot = Symbol();
  91. exports.$getTemplateRoot = $getTemplateRoot;
  92. const $globalData = Symbol();
  93. exports.$globalData = $globalData;
  94. const $hasSettableValue = Symbol();
  95. exports.$hasSettableValue = $hasSettableValue;
  96. const $ids = Symbol();
  97. exports.$ids = $ids;
  98. const $indexOf = Symbol();
  99. exports.$indexOf = $indexOf;
  100. const $insertAt = Symbol();
  101. exports.$insertAt = $insertAt;
  102. const $isCDATAXml = Symbol();
  103. exports.$isCDATAXml = $isCDATAXml;
  104. const $isBindable = Symbol();
  105. exports.$isBindable = $isBindable;
  106. const $isDataValue = Symbol();
  107. exports.$isDataValue = $isDataValue;
  108. const $isDescendent = Symbol();
  109. exports.$isDescendent = $isDescendent;
  110. const $isNsAgnostic = Symbol();
  111. exports.$isNsAgnostic = $isNsAgnostic;
  112. const $isSplittable = Symbol();
  113. exports.$isSplittable = $isSplittable;
  114. const $isThereMoreWidth = Symbol();
  115. exports.$isThereMoreWidth = $isThereMoreWidth;
  116. const $isTransparent = Symbol();
  117. exports.$isTransparent = $isTransparent;
  118. const $isUsable = Symbol();
  119. exports.$isUsable = $isUsable;
  120. const $lastAttribute = Symbol();
  121. const $namespaceId = Symbol("namespaceId");
  122. exports.$namespaceId = $namespaceId;
  123. const $nodeName = Symbol("nodeName");
  124. exports.$nodeName = $nodeName;
  125. const $nsAttributes = Symbol();
  126. exports.$nsAttributes = $nsAttributes;
  127. const $onChild = Symbol();
  128. exports.$onChild = $onChild;
  129. const $onChildCheck = Symbol();
  130. exports.$onChildCheck = $onChildCheck;
  131. const $onText = Symbol();
  132. exports.$onText = $onText;
  133. const $pushGlyphs = Symbol();
  134. exports.$pushGlyphs = $pushGlyphs;
  135. const $popPara = Symbol();
  136. exports.$popPara = $popPara;
  137. const $pushPara = Symbol();
  138. exports.$pushPara = $pushPara;
  139. const $removeChild = Symbol();
  140. exports.$removeChild = $removeChild;
  141. const $root = Symbol("root");
  142. exports.$root = $root;
  143. const $resolvePrototypes = Symbol();
  144. exports.$resolvePrototypes = $resolvePrototypes;
  145. const $searchNode = Symbol();
  146. exports.$searchNode = $searchNode;
  147. const $setId = Symbol();
  148. exports.$setId = $setId;
  149. const $setSetAttributes = Symbol();
  150. exports.$setSetAttributes = $setSetAttributes;
  151. const $setValue = Symbol();
  152. exports.$setValue = $setValue;
  153. const $tabIndex = Symbol();
  154. exports.$tabIndex = $tabIndex;
  155. const $text = Symbol();
  156. exports.$text = $text;
  157. const $toPages = Symbol();
  158. exports.$toPages = $toPages;
  159. const $toHTML = Symbol();
  160. exports.$toHTML = $toHTML;
  161. const $toString = Symbol();
  162. exports.$toString = $toString;
  163. const $toStyle = Symbol();
  164. exports.$toStyle = $toStyle;
  165. const $uid = Symbol("uid");
  166. exports.$uid = $uid;
  167. const _applyPrototype = Symbol();
  168. const _attributes = Symbol();
  169. const _attributeNames = Symbol();
  170. const _children = Symbol("_children");
  171. const _cloneAttribute = Symbol();
  172. const _dataValue = Symbol();
  173. const _defaultValue = Symbol();
  174. const _filteredChildrenGenerator = Symbol();
  175. const _getPrototype = Symbol();
  176. const _getUnsetAttributes = Symbol();
  177. const _hasChildren = Symbol();
  178. const _max = Symbol();
  179. const _options = Symbol();
  180. const _parent = Symbol("parent");
  181. const _resolvePrototypesHelper = Symbol();
  182. const _setAttributes = Symbol();
  183. const _validator = Symbol();
  184. let uid = 0;
  185. const NS_DATASETS = _namespaces.NamespaceIds.datasets.id;
  186. class XFAObject {
  187. constructor(nsId, name, hasChildren = false) {
  188. this[$namespaceId] = nsId;
  189. this[$nodeName] = name;
  190. this[_hasChildren] = hasChildren;
  191. this[_parent] = null;
  192. this[_children] = [];
  193. this[$uid] = `${name}${uid++}`;
  194. this[$globalData] = null;
  195. }
  196. [$onChild](child) {
  197. if (!this[_hasChildren] || !this[$onChildCheck](child)) {
  198. return false;
  199. }
  200. const name = child[$nodeName];
  201. const node = this[name];
  202. if (node instanceof XFAObjectArray) {
  203. if (node.push(child)) {
  204. this[$appendChild](child);
  205. return true;
  206. }
  207. } else {
  208. if (node !== null) {
  209. this[$removeChild](node);
  210. }
  211. this[name] = child;
  212. this[$appendChild](child);
  213. return true;
  214. }
  215. let id = "";
  216. if (this.id) {
  217. id = ` (id: ${this.id})`;
  218. } else if (this.name) {
  219. id = ` (name: ${this.name} ${this.h.value})`;
  220. }
  221. (0, _util.warn)(`XFA - node "${this[$nodeName]}"${id} has already enough "${name}"!`);
  222. return false;
  223. }
  224. [$onChildCheck](child) {
  225. return this.hasOwnProperty(child[$nodeName]) && child[$namespaceId] === this[$namespaceId];
  226. }
  227. [$isNsAgnostic]() {
  228. return false;
  229. }
  230. [$acceptWhitespace]() {
  231. return false;
  232. }
  233. [$isCDATAXml]() {
  234. return false;
  235. }
  236. [$isBindable]() {
  237. return false;
  238. }
  239. [$popPara]() {
  240. if (this.para) {
  241. this[$getTemplateRoot]()[$extra].paraStack.pop();
  242. }
  243. }
  244. [$pushPara]() {
  245. this[$getTemplateRoot]()[$extra].paraStack.push(this.para);
  246. }
  247. [$setId](ids) {
  248. if (this.id && this[$namespaceId] === _namespaces.NamespaceIds.template.id) {
  249. ids.set(this.id, this);
  250. }
  251. }
  252. [$getTemplateRoot]() {
  253. return this[$globalData].template;
  254. }
  255. [$isSplittable]() {
  256. return false;
  257. }
  258. [$isThereMoreWidth]() {
  259. return false;
  260. }
  261. [$appendChild](child) {
  262. child[_parent] = this;
  263. this[_children].push(child);
  264. if (!child[$globalData] && this[$globalData]) {
  265. child[$globalData] = this[$globalData];
  266. }
  267. }
  268. [$removeChild](child) {
  269. const i = this[_children].indexOf(child);
  270. this[_children].splice(i, 1);
  271. }
  272. [$hasSettableValue]() {
  273. return this.hasOwnProperty("value");
  274. }
  275. [$setValue](_) {}
  276. [$onText](_) {}
  277. [$finalize]() {}
  278. [$clean](builder) {
  279. delete this[_hasChildren];
  280. if (this[$cleanup]) {
  281. builder.clean(this[$cleanup]);
  282. delete this[$cleanup];
  283. }
  284. }
  285. [$indexOf](child) {
  286. return this[_children].indexOf(child);
  287. }
  288. [$insertAt](i, child) {
  289. child[_parent] = this;
  290. this[_children].splice(i, 0, child);
  291. if (!child[$globalData] && this[$globalData]) {
  292. child[$globalData] = this[$globalData];
  293. }
  294. }
  295. [$isTransparent]() {
  296. return !this.name;
  297. }
  298. [$lastAttribute]() {
  299. return "";
  300. }
  301. [$text]() {
  302. if (this[_children].length === 0) {
  303. return this[$content];
  304. }
  305. return this[_children].map(c => c[$text]()).join("");
  306. }
  307. get [_attributeNames]() {
  308. const proto = Object.getPrototypeOf(this);
  309. if (!proto._attributes) {
  310. const attributes = proto._attributes = new Set();
  311. for (const name of Object.getOwnPropertyNames(this)) {
  312. if (this[name] === null || this[name] instanceof XFAObject || this[name] instanceof XFAObjectArray) {
  313. break;
  314. }
  315. attributes.add(name);
  316. }
  317. }
  318. return (0, _util.shadow)(this, _attributeNames, proto._attributes);
  319. }
  320. [$isDescendent](parent) {
  321. let node = this;
  322. while (node) {
  323. if (node === parent) {
  324. return true;
  325. }
  326. node = node[$getParent]();
  327. }
  328. return false;
  329. }
  330. [$getParent]() {
  331. return this[_parent];
  332. }
  333. [$getSubformParent]() {
  334. return this[$getParent]();
  335. }
  336. [$getChildren](name = null) {
  337. if (!name) {
  338. return this[_children];
  339. }
  340. return this[name];
  341. }
  342. [$dump]() {
  343. const dumped = Object.create(null);
  344. if (this[$content]) {
  345. dumped.$content = this[$content];
  346. }
  347. for (const name of Object.getOwnPropertyNames(this)) {
  348. const value = this[name];
  349. if (value === null) {
  350. continue;
  351. }
  352. if (value instanceof XFAObject) {
  353. dumped[name] = value[$dump]();
  354. } else if (value instanceof XFAObjectArray) {
  355. if (!value.isEmpty()) {
  356. dumped[name] = value.dump();
  357. }
  358. } else {
  359. dumped[name] = value;
  360. }
  361. }
  362. return dumped;
  363. }
  364. [$toStyle]() {
  365. return null;
  366. }
  367. [$toHTML]() {
  368. return _utils.HTMLResult.EMPTY;
  369. }
  370. *[$getContainedChildren]() {
  371. for (const node of this[$getChildren]()) {
  372. yield node;
  373. }
  374. }
  375. *[_filteredChildrenGenerator](filter, include) {
  376. for (const node of this[$getContainedChildren]()) {
  377. if (!filter || include === filter.has(node[$nodeName])) {
  378. const availableSpace = this[$getAvailableSpace]();
  379. const res = node[$toHTML](availableSpace);
  380. if (!res.success) {
  381. this[$extra].failingNode = node;
  382. }
  383. yield res;
  384. }
  385. }
  386. }
  387. [$flushHTML]() {
  388. return null;
  389. }
  390. [$addHTML](html, bbox) {
  391. this[$extra].children.push(html);
  392. }
  393. [$getAvailableSpace]() {}
  394. [$childrenToHTML]({
  395. filter = null,
  396. include = true
  397. }) {
  398. if (!this[$extra].generator) {
  399. this[$extra].generator = this[_filteredChildrenGenerator](filter, include);
  400. } else {
  401. const availableSpace = this[$getAvailableSpace]();
  402. const res = this[$extra].failingNode[$toHTML](availableSpace);
  403. if (!res.success) {
  404. return res;
  405. }
  406. if (res.html) {
  407. this[$addHTML](res.html, res.bbox);
  408. }
  409. delete this[$extra].failingNode;
  410. }
  411. while (true) {
  412. const gen = this[$extra].generator.next();
  413. if (gen.done) {
  414. break;
  415. }
  416. const res = gen.value;
  417. if (!res.success) {
  418. return res;
  419. }
  420. if (res.html) {
  421. this[$addHTML](res.html, res.bbox);
  422. }
  423. }
  424. this[$extra].generator = null;
  425. return _utils.HTMLResult.EMPTY;
  426. }
  427. [$setSetAttributes](attributes) {
  428. this[_setAttributes] = new Set(Object.keys(attributes));
  429. }
  430. [_getUnsetAttributes](protoAttributes) {
  431. const allAttr = this[_attributeNames];
  432. const setAttr = this[_setAttributes];
  433. return [...protoAttributes].filter(x => allAttr.has(x) && !setAttr.has(x));
  434. }
  435. [$resolvePrototypes](ids, ancestors = new Set()) {
  436. for (const child of this[_children]) {
  437. child[_resolvePrototypesHelper](ids, ancestors);
  438. }
  439. }
  440. [_resolvePrototypesHelper](ids, ancestors) {
  441. const proto = this[_getPrototype](ids, ancestors);
  442. if (proto) {
  443. this[_applyPrototype](proto, ids, ancestors);
  444. } else {
  445. this[$resolvePrototypes](ids, ancestors);
  446. }
  447. }
  448. [_getPrototype](ids, ancestors) {
  449. const {
  450. use,
  451. usehref
  452. } = this;
  453. if (!use && !usehref) {
  454. return null;
  455. }
  456. let proto = null;
  457. let somExpression = null;
  458. let id = null;
  459. let ref = use;
  460. if (usehref) {
  461. ref = usehref;
  462. if (usehref.startsWith("#som(") && usehref.endsWith(")")) {
  463. somExpression = usehref.slice("#som(".length, usehref.length - 1);
  464. } else if (usehref.startsWith(".#som(") && usehref.endsWith(")")) {
  465. somExpression = usehref.slice(".#som(".length, usehref.length - 1);
  466. } else if (usehref.startsWith("#")) {
  467. id = usehref.slice(1);
  468. } else if (usehref.startsWith(".#")) {
  469. id = usehref.slice(2);
  470. }
  471. } else if (use.startsWith("#")) {
  472. id = use.slice(1);
  473. } else {
  474. somExpression = use;
  475. }
  476. this.use = this.usehref = "";
  477. if (id) {
  478. proto = ids.get(id);
  479. } else {
  480. proto = (0, _som.searchNode)(ids.get($root), this, somExpression, true, false);
  481. if (proto) {
  482. proto = proto[0];
  483. }
  484. }
  485. if (!proto) {
  486. (0, _util.warn)(`XFA - Invalid prototype reference: ${ref}.`);
  487. return null;
  488. }
  489. if (proto[$nodeName] !== this[$nodeName]) {
  490. (0, _util.warn)(`XFA - Incompatible prototype: ${proto[$nodeName]} !== ${this[$nodeName]}.`);
  491. return null;
  492. }
  493. if (ancestors.has(proto)) {
  494. (0, _util.warn)(`XFA - Cycle detected in prototypes use.`);
  495. return null;
  496. }
  497. ancestors.add(proto);
  498. const protoProto = proto[_getPrototype](ids, ancestors);
  499. if (protoProto) {
  500. proto[_applyPrototype](protoProto, ids, ancestors);
  501. }
  502. proto[$resolvePrototypes](ids, ancestors);
  503. ancestors.delete(proto);
  504. return proto;
  505. }
  506. [_applyPrototype](proto, ids, ancestors) {
  507. if (ancestors.has(proto)) {
  508. (0, _util.warn)(`XFA - Cycle detected in prototypes use.`);
  509. return;
  510. }
  511. if (!this[$content] && proto[$content]) {
  512. this[$content] = proto[$content];
  513. }
  514. const newAncestors = new Set(ancestors);
  515. newAncestors.add(proto);
  516. for (const unsetAttrName of this[_getUnsetAttributes](proto[_setAttributes])) {
  517. this[unsetAttrName] = proto[unsetAttrName];
  518. if (this[_setAttributes]) {
  519. this[_setAttributes].add(unsetAttrName);
  520. }
  521. }
  522. for (const name of Object.getOwnPropertyNames(this)) {
  523. if (this[_attributeNames].has(name)) {
  524. continue;
  525. }
  526. const value = this[name];
  527. const protoValue = proto[name];
  528. if (value instanceof XFAObjectArray) {
  529. for (const child of value[_children]) {
  530. child[_resolvePrototypesHelper](ids, ancestors);
  531. }
  532. for (let i = value[_children].length, ii = protoValue[_children].length; i < ii; i++) {
  533. const child = proto[_children][i][$clone]();
  534. if (value.push(child)) {
  535. child[_parent] = this;
  536. this[_children].push(child);
  537. child[_resolvePrototypesHelper](ids, ancestors);
  538. } else {
  539. break;
  540. }
  541. }
  542. continue;
  543. }
  544. if (value !== null) {
  545. value[$resolvePrototypes](ids, ancestors);
  546. if (protoValue) {
  547. value[_applyPrototype](protoValue, ids, ancestors);
  548. }
  549. continue;
  550. }
  551. if (protoValue !== null) {
  552. const child = protoValue[$clone]();
  553. child[_parent] = this;
  554. this[name] = child;
  555. this[_children].push(child);
  556. child[_resolvePrototypesHelper](ids, ancestors);
  557. }
  558. }
  559. }
  560. static [_cloneAttribute](obj) {
  561. if (Array.isArray(obj)) {
  562. return obj.map(x => XFAObject[_cloneAttribute](x));
  563. }
  564. if (typeof obj === "object" && obj !== null) {
  565. return Object.assign({}, obj);
  566. }
  567. return obj;
  568. }
  569. [$clone]() {
  570. const clone = Object.create(Object.getPrototypeOf(this));
  571. for (const $symbol of Object.getOwnPropertySymbols(this)) {
  572. try {
  573. clone[$symbol] = this[$symbol];
  574. } catch (_) {
  575. (0, _util.shadow)(clone, $symbol, this[$symbol]);
  576. }
  577. }
  578. clone[$uid] = `${clone[$nodeName]}${uid++}`;
  579. clone[_children] = [];
  580. for (const name of Object.getOwnPropertyNames(this)) {
  581. if (this[_attributeNames].has(name)) {
  582. clone[name] = XFAObject[_cloneAttribute](this[name]);
  583. continue;
  584. }
  585. const value = this[name];
  586. if (value instanceof XFAObjectArray) {
  587. clone[name] = new XFAObjectArray(value[_max]);
  588. } else {
  589. clone[name] = null;
  590. }
  591. }
  592. for (const child of this[_children]) {
  593. const name = child[$nodeName];
  594. const clonedChild = child[$clone]();
  595. clone[_children].push(clonedChild);
  596. clonedChild[_parent] = clone;
  597. if (clone[name] === null) {
  598. clone[name] = clonedChild;
  599. } else {
  600. clone[name][_children].push(clonedChild);
  601. }
  602. }
  603. return clone;
  604. }
  605. [$getChildren](name = null) {
  606. if (!name) {
  607. return this[_children];
  608. }
  609. return this[_children].filter(c => c[$nodeName] === name);
  610. }
  611. [$getChildrenByClass](name) {
  612. return this[name];
  613. }
  614. [$getChildrenByName](name, allTransparent, first = true) {
  615. return Array.from(this[$getChildrenByNameIt](name, allTransparent, first));
  616. }
  617. *[$getChildrenByNameIt](name, allTransparent, first = true) {
  618. if (name === "parent") {
  619. yield this[_parent];
  620. return;
  621. }
  622. for (const child of this[_children]) {
  623. if (child[$nodeName] === name) {
  624. yield child;
  625. }
  626. if (child.name === name) {
  627. yield child;
  628. }
  629. if (allTransparent || child[$isTransparent]()) {
  630. yield* child[$getChildrenByNameIt](name, allTransparent, false);
  631. }
  632. }
  633. if (first && this[_attributeNames].has(name)) {
  634. yield new XFAAttribute(this, name, this[name]);
  635. }
  636. }
  637. }
  638. exports.XFAObject = XFAObject;
  639. class XFAObjectArray {
  640. constructor(max = Infinity) {
  641. this[_max] = max;
  642. this[_children] = [];
  643. }
  644. push(child) {
  645. const len = this[_children].length;
  646. if (len <= this[_max]) {
  647. this[_children].push(child);
  648. return true;
  649. }
  650. (0, _util.warn)(`XFA - node "${child[$nodeName]}" accepts no more than ${this[_max]} children`);
  651. return false;
  652. }
  653. isEmpty() {
  654. return this[_children].length === 0;
  655. }
  656. dump() {
  657. return this[_children].length === 1 ? this[_children][0][$dump]() : this[_children].map(x => x[$dump]());
  658. }
  659. [$clone]() {
  660. const clone = new XFAObjectArray(this[_max]);
  661. clone[_children] = this[_children].map(c => c[$clone]());
  662. return clone;
  663. }
  664. get children() {
  665. return this[_children];
  666. }
  667. clear() {
  668. this[_children].length = 0;
  669. }
  670. }
  671. exports.XFAObjectArray = XFAObjectArray;
  672. class XFAAttribute {
  673. constructor(node, name, value) {
  674. this[_parent] = node;
  675. this[$nodeName] = name;
  676. this[$content] = value;
  677. this[$consumed] = false;
  678. this[$uid] = `attribute${uid++}`;
  679. }
  680. [$getParent]() {
  681. return this[_parent];
  682. }
  683. [$isDataValue]() {
  684. return true;
  685. }
  686. [$getDataValue]() {
  687. return this[$content].trim();
  688. }
  689. [$setValue](value) {
  690. value = value.value || "";
  691. this[$content] = value.toString();
  692. }
  693. [$text]() {
  694. return this[$content];
  695. }
  696. [$isDescendent](parent) {
  697. return this[_parent] === parent || this[_parent][$isDescendent](parent);
  698. }
  699. }
  700. exports.XFAAttribute = XFAAttribute;
  701. class XmlObject extends XFAObject {
  702. constructor(nsId, name, attributes = {}) {
  703. super(nsId, name);
  704. this[$content] = "";
  705. this[_dataValue] = null;
  706. if (name !== "#text") {
  707. const map = new Map();
  708. this[_attributes] = map;
  709. for (const [attrName, value] of Object.entries(attributes)) {
  710. map.set(attrName, new XFAAttribute(this, attrName, value));
  711. }
  712. if (attributes.hasOwnProperty($nsAttributes)) {
  713. const dataNode = attributes[$nsAttributes].xfa.dataNode;
  714. if (dataNode !== undefined) {
  715. if (dataNode === "dataGroup") {
  716. this[_dataValue] = false;
  717. } else if (dataNode === "dataValue") {
  718. this[_dataValue] = true;
  719. }
  720. }
  721. }
  722. }
  723. this[$consumed] = false;
  724. }
  725. [$toString](buf) {
  726. const tagName = this[$nodeName];
  727. if (tagName === "#text") {
  728. buf.push((0, _core_utils.encodeToXmlString)(this[$content]));
  729. return;
  730. }
  731. const utf8TagName = (0, _util.utf8StringToString)(tagName);
  732. const prefix = this[$namespaceId] === NS_DATASETS ? "xfa:" : "";
  733. buf.push(`<${prefix}${utf8TagName}`);
  734. for (const [name, value] of this[_attributes].entries()) {
  735. const utf8Name = (0, _util.utf8StringToString)(name);
  736. buf.push(` ${utf8Name}="${(0, _core_utils.encodeToXmlString)(value[$content])}"`);
  737. }
  738. if (this[_dataValue] !== null) {
  739. if (this[_dataValue]) {
  740. buf.push(` xfa:dataNode="dataValue"`);
  741. } else {
  742. buf.push(` xfa:dataNode="dataGroup"`);
  743. }
  744. }
  745. if (!this[$content] && this[_children].length === 0) {
  746. buf.push("/>");
  747. return;
  748. }
  749. buf.push(">");
  750. if (this[$content]) {
  751. if (typeof this[$content] === "string") {
  752. buf.push((0, _core_utils.encodeToXmlString)(this[$content]));
  753. } else {
  754. this[$content][$toString](buf);
  755. }
  756. } else {
  757. for (const child of this[_children]) {
  758. child[$toString](buf);
  759. }
  760. }
  761. buf.push(`</${prefix}${utf8TagName}>`);
  762. }
  763. [$onChild](child) {
  764. if (this[$content]) {
  765. const node = new XmlObject(this[$namespaceId], "#text");
  766. this[$appendChild](node);
  767. node[$content] = this[$content];
  768. this[$content] = "";
  769. }
  770. this[$appendChild](child);
  771. return true;
  772. }
  773. [$onText](str) {
  774. this[$content] += str;
  775. }
  776. [$finalize]() {
  777. if (this[$content] && this[_children].length > 0) {
  778. const node = new XmlObject(this[$namespaceId], "#text");
  779. this[$appendChild](node);
  780. node[$content] = this[$content];
  781. delete this[$content];
  782. }
  783. }
  784. [$toHTML]() {
  785. if (this[$nodeName] === "#text") {
  786. return _utils.HTMLResult.success({
  787. name: "#text",
  788. value: this[$content]
  789. });
  790. }
  791. return _utils.HTMLResult.EMPTY;
  792. }
  793. [$getChildren](name = null) {
  794. if (!name) {
  795. return this[_children];
  796. }
  797. return this[_children].filter(c => c[$nodeName] === name);
  798. }
  799. [$getAttributes]() {
  800. return this[_attributes];
  801. }
  802. [$getChildrenByClass](name) {
  803. const value = this[_attributes].get(name);
  804. if (value !== undefined) {
  805. return value;
  806. }
  807. return this[$getChildren](name);
  808. }
  809. *[$getChildrenByNameIt](name, allTransparent) {
  810. const value = this[_attributes].get(name);
  811. if (value) {
  812. yield value;
  813. }
  814. for (const child of this[_children]) {
  815. if (child[$nodeName] === name) {
  816. yield child;
  817. }
  818. if (allTransparent) {
  819. yield* child[$getChildrenByNameIt](name, allTransparent);
  820. }
  821. }
  822. }
  823. *[$getAttributeIt](name, skipConsumed) {
  824. const value = this[_attributes].get(name);
  825. if (value && (!skipConsumed || !value[$consumed])) {
  826. yield value;
  827. }
  828. for (const child of this[_children]) {
  829. yield* child[$getAttributeIt](name, skipConsumed);
  830. }
  831. }
  832. *[$getRealChildrenByNameIt](name, allTransparent, skipConsumed) {
  833. for (const child of this[_children]) {
  834. if (child[$nodeName] === name && (!skipConsumed || !child[$consumed])) {
  835. yield child;
  836. }
  837. if (allTransparent) {
  838. yield* child[$getRealChildrenByNameIt](name, allTransparent, skipConsumed);
  839. }
  840. }
  841. }
  842. [$isDataValue]() {
  843. if (this[_dataValue] === null) {
  844. return this[_children].length === 0 || this[_children][0][$namespaceId] === _namespaces.NamespaceIds.xhtml.id;
  845. }
  846. return this[_dataValue];
  847. }
  848. [$getDataValue]() {
  849. if (this[_dataValue] === null) {
  850. if (this[_children].length === 0) {
  851. return this[$content].trim();
  852. }
  853. if (this[_children][0][$namespaceId] === _namespaces.NamespaceIds.xhtml.id) {
  854. return this[_children][0][$text]().trim();
  855. }
  856. return null;
  857. }
  858. return this[$content].trim();
  859. }
  860. [$setValue](value) {
  861. value = value.value || "";
  862. this[$content] = value.toString();
  863. }
  864. [$dump](hasNS = false) {
  865. const dumped = Object.create(null);
  866. if (hasNS) {
  867. dumped.$ns = this[$namespaceId];
  868. }
  869. if (this[$content]) {
  870. dumped.$content = this[$content];
  871. }
  872. dumped.$name = this[$nodeName];
  873. dumped.children = [];
  874. for (const child of this[_children]) {
  875. dumped.children.push(child[$dump](hasNS));
  876. }
  877. dumped.attributes = Object.create(null);
  878. for (const [name, value] of this[_attributes]) {
  879. dumped.attributes[name] = value[$content];
  880. }
  881. return dumped;
  882. }
  883. }
  884. exports.XmlObject = XmlObject;
  885. class ContentObject extends XFAObject {
  886. constructor(nsId, name) {
  887. super(nsId, name);
  888. this[$content] = "";
  889. }
  890. [$onText](text) {
  891. this[$content] += text;
  892. }
  893. [$finalize]() {}
  894. }
  895. exports.ContentObject = ContentObject;
  896. class OptionObject extends ContentObject {
  897. constructor(nsId, name, options) {
  898. super(nsId, name);
  899. this[_options] = options;
  900. }
  901. [$finalize]() {
  902. this[$content] = (0, _utils.getKeyword)({
  903. data: this[$content],
  904. defaultValue: this[_options][0],
  905. validate: k => this[_options].includes(k)
  906. });
  907. }
  908. [$clean](builder) {
  909. super[$clean](builder);
  910. delete this[_options];
  911. }
  912. }
  913. exports.OptionObject = OptionObject;
  914. class StringObject extends ContentObject {
  915. [$finalize]() {
  916. this[$content] = this[$content].trim();
  917. }
  918. }
  919. exports.StringObject = StringObject;
  920. class IntegerObject extends ContentObject {
  921. constructor(nsId, name, defaultValue, validator) {
  922. super(nsId, name);
  923. this[_defaultValue] = defaultValue;
  924. this[_validator] = validator;
  925. }
  926. [$finalize]() {
  927. this[$content] = (0, _utils.getInteger)({
  928. data: this[$content],
  929. defaultValue: this[_defaultValue],
  930. validate: this[_validator]
  931. });
  932. }
  933. [$clean](builder) {
  934. super[$clean](builder);
  935. delete this[_defaultValue];
  936. delete this[_validator];
  937. }
  938. }
  939. exports.IntegerObject = IntegerObject;
  940. class Option01 extends IntegerObject {
  941. constructor(nsId, name) {
  942. super(nsId, name, 0, n => n === 1);
  943. }
  944. }
  945. exports.Option01 = Option01;
  946. class Option10 extends IntegerObject {
  947. constructor(nsId, name) {
  948. super(nsId, name, 1, n => n === 0);
  949. }
  950. }
  951. exports.Option10 = Option10;