first commit
This commit is contained in:
891
node_modules/@xmldom/xmldom/CHANGELOG.md
generated
vendored
Normal file
891
node_modules/@xmldom/xmldom/CHANGELOG.md
generated
vendored
Normal file
@@ -0,0 +1,891 @@
|
||||
# Changelog
|
||||
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
|
||||
## [0.9.8](https://github.com/xmldom/xmldom/compare/0.9.8...0.9.7)
|
||||
|
||||
### Fixed
|
||||
|
||||
- fix: replace \u2029 as part of normalizeLineEndings [`#839`](https://github.com/xmldom/xmldom/pull/839) / [`#838`](https://github.com/xmldom/xmldom/issues/838)
|
||||
- perf: speed up line detection [`#847`](https://github.com/xmldom/xmldom/pull/847) / [`#838`](https://github.com/xmldom/xmldom/issues/838)
|
||||
|
||||
### Chore
|
||||
|
||||
- updated dependencies
|
||||
- drop jazzer and rxjs devDependencies [`#845`](https://github.com/xmldom/xmldom/pull/845)
|
||||
|
||||
Thank you,
|
||||
[@kboshold](https://github.com/kboshold),
|
||||
[@Ponynjaa](https://github.com/Ponynjaa),
|
||||
for your contributions.
|
||||
|
||||
|
||||
## [0.9.7](https://github.com/xmldom/xmldom/compare/0.9.6...0.9.7)
|
||||
|
||||
### Added
|
||||
|
||||
- Implementation of `hasAttributes` [`#804`](https://github.com/xmldom/xmldom/pull/804)
|
||||
|
||||
### Fixed
|
||||
|
||||
- locator is now true even when other options are being used for the DOMParser [`#802`](https://github.com/xmldom/xmldom/issues/802) / [`#803`](https://github.com/xmldom/xmldom/pull/803)
|
||||
- allow case-insensitive DOCTYPE in HTML [`#817`](https://github.com/xmldom/xmldom/issues/817) / [`#819`](https://github.com/xmldom/xmldom/pull/819)
|
||||
|
||||
### Performance
|
||||
|
||||
- simplify `DOM.compareDocumentPosition` [`#805`](https://github.com/xmldom/xmldom/pull/805)
|
||||
|
||||
### Chore
|
||||
|
||||
- updated devDependencies
|
||||
|
||||
Thank you,
|
||||
[@zorkow](https://github.com/zorkow),
|
||||
[@Ponynjaa](https://github.com/Ponynjaa),
|
||||
[@WesselKroos](https://github.com/WesselKroos),
|
||||
for your contributions.
|
||||
|
||||
|
||||
## [0.9.6](https://github.com/xmldom/xmldom/compare/0.9.5...0.9.6)
|
||||
|
||||
### Fixed
|
||||
|
||||
- lower error level for unicode replacement character [`#790`](https://github.com/xmldom/xmldom/issues/790) / [`#794`](https://github.com/xmldom/xmldom/pull/794) / [`#797`](https://github.com/xmldom/xmldom/pull/797)
|
||||
|
||||
### Chore
|
||||
|
||||
- updated devDependencies
|
||||
- migrate renovate config [`#792`](https://github.com/xmldom/xmldom/pull/792)
|
||||
|
||||
Thank you, [@eglitise](https://github.com/eglitise), for your contributions.
|
||||
|
||||
|
||||
## [0.9.5](https://github.com/xmldom/xmldom/compare/0.9.4...0.9.5)
|
||||
|
||||
### Fixed
|
||||
|
||||
- fix: re-index childNodes on insertBefore [`#763`](https://github.com/xmldom/xmldom/issues/763) / [`#766`](https://github.com/xmldom/xmldom/pull/766)
|
||||
|
||||
Thank you,
|
||||
[@mureinik](https://github.com/mureinik),
|
||||
for your contributions.
|
||||
|
||||
|
||||
## [0.9.4](https://github.com/xmldom/xmldom/compare/0.9.3...0.9.4)
|
||||
|
||||
### Fixed
|
||||
|
||||
- restore performance for large amount of child nodes [`#748`](https://github.com/xmldom/xmldom/issues/748) / [`#760`](https://github.com/xmldom/xmldom/pull/760)
|
||||
- types: correct error handler level to `warning` (#759) [`#754`](https://github.com/xmldom/xmldom/issues/754) / [`#759`](https://github.com/xmldom/xmldom/pull/759)
|
||||
|
||||
### Docs
|
||||
|
||||
- test: verify BOM handling [`#758`](https://github.com/xmldom/xmldom/pull/758)
|
||||
|
||||
Thank you,
|
||||
[@luffynando](https://github.com/luffynando),
|
||||
[@mattiasw](https://github.com/mattiasw),
|
||||
[@JoinerDev](https://github.com/JoinerDev),
|
||||
for your contributions.
|
||||
|
||||
|
||||
## [0.9.3](https://github.com/xmldom/xmldom/compare/0.9.2...0.9.3)
|
||||
|
||||
### Fixed
|
||||
|
||||
- restore more `Node` and `ProcessingInstruction` types [`#725`](https://github.com/xmldom/xmldom/issues/725) / [`#726`](https://github.com/xmldom/xmldom/pull/726)
|
||||
- `getElements*` methods return `LiveNodeList<Element>` [`#731`](https://github.com/xmldom/xmldom/issues/731) / [`#734`](https://github.com/xmldom/xmldom/pull/734)
|
||||
- Add more missing `Node` props [`#728`](https://github.com/xmldom/xmldom/pull/728), triggered by unclosed [`#724`](https://github.com/xmldom/xmldom/pull/724)
|
||||
|
||||
### Docs
|
||||
|
||||
- Update supported runtimes in readme (NodeJS >= 14.6 and other [ES5 compatible runtimes](https://compat-table.github.io/compat-table/es5/))
|
||||
|
||||
### Chore
|
||||
|
||||
- updates devDependencies
|
||||
|
||||
Thank you,
|
||||
[@Ponynjaa](https://github.com/Ponynjaa),
|
||||
[@ayZagen](https://github.com/ayZagen),
|
||||
[@sserdyuk](https://github.com/sserdyuk),
|
||||
[@wydengyre](https://github.com/wydengyre),
|
||||
[@mykola-mokhnach](https://github.com/mykola-mokhnach),
|
||||
[@benkroeger](https://github.com/benkroeger),
|
||||
for your contributions.
|
||||
|
||||
# Changelog
|
||||
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
|
||||
## [0.9.2](https://github.com/xmldom/xmldom/compare/0.9.1...0.9.2)
|
||||
|
||||
### Feature
|
||||
|
||||
- add `Element.getElementsByClassName` [`#722`](https://github.com/xmldom/xmldom/pull/722)
|
||||
|
||||
### Fixed
|
||||
|
||||
- add missing types for `Document.documentElement` and `Element.tagName` [`#721`](https://github.com/xmldom/xmldom/pull/721) [`#720`](https://github.com/xmldom/xmldom/issues/720)
|
||||
|
||||
Thank you, [@censujiang](https://github.com/censujiang), [@Mathias-S](https://github.com/Mathias-S), for your contributions
|
||||
|
||||
|
||||
## [0.9.1](https://github.com/xmldom/xmldom/compare/0.9.0...0.9.1)
|
||||
|
||||
### Fixed
|
||||
|
||||
- DOMParser.parseFromString requires mimeType as second argument [`#713`](https://github.com/xmldom/xmldom/pull/713)
|
||||
- correct spelling of `isHTMLMimeType` in type definition [`#715`](https://github.com/xmldom/xmldom/pull/715) / [`#712`](https://github.com/xmldom/xmldom/issues/712)
|
||||
- sync types with exports [`#717`](https://github.com/xmldom/xmldom/pull/717) / [`#285`](https://github.com/xmldom/xmldom/issues/285) / [`#695`](https://github.com/xmldom/xmldom/issues/695)
|
||||
|
||||
### Other
|
||||
|
||||
- minimum tested node version is 14 [`#710`](https://github.com/xmldom/xmldom/pull/710)
|
||||
|
||||
Thank you, [@krystofwoldrich](https://github.com/krystofwoldrich), [@marvinruder](https://github.com/marvinruder), [@amacneil](https://github.com/amacneil), [@defunctzombie](https://github.com/defunctzombie),
|
||||
[@tjhorner](https://github.com/tjhorner), [@danon](https://github.com/danon), for your contributions
|
||||
|
||||
|
||||
## [0.9.0](https://github.com/xmldom/xmldom/compare/0.9.0-beta.11...0.9.0)
|
||||
|
||||
- [Discussion](https://github.com/xmldom/xmldom/discussions/435)
|
||||
- [Summary on dev.to](https://dev.to/karfau/release-090-of-xmldomxmldom-4106)
|
||||
|
||||
### Features
|
||||
|
||||
- feat: expose all DOM level 2 element prototypes [`#637`](https://github.com/xmldom/xmldom/pull/637) / [`#40`](https://github.com/xmldom/xmldom/issues/40)
|
||||
- feat: add iterator function to NodeList and NamedNodeMap [`#634`](https://github.com/xmldom/xmldom/pull/634) / [`#633`](https://github.com/xmldom/xmldom/issues/633)
|
||||
|
||||
### Fixed
|
||||
|
||||
- parse empty/whitspace only doctype internal subset [`#692`](https://github.com/xmldom/xmldom/pull/692)
|
||||
- avoid prototype clash in namespace prefix [`#554`](https://github.com/xmldom/xmldom/pull/554)
|
||||
- report fatalError when doctype is inside elements [`#550`](https://github.com/xmldom/xmldom/pull/550)
|
||||
|
||||
### Other
|
||||
|
||||
- test: add fuzz target and regression tests [`#556`](https://github.com/xmldom/xmldom/pull/556)
|
||||
- chore: improve .gitignore and provide .envrc.template [`#697`](https://github.com/xmldom/xmldom/pull/697)
|
||||
- chore: Apply security best practices [`#546`](https://github.com/xmldom/xmldom/pull/546)
|
||||
- ci: check test coverage in PRs [`#524`](https://github.com/xmldom/xmldom/pull/524)
|
||||
- docs: add missing commas to readme [`#566`](https://github.com/xmldom/xmldom/pull/566)
|
||||
- docs: click to copy install command in readme [`#644`](https://github.com/xmldom/xmldom/pull/644)
|
||||
- docs: enhance jsdoc comments [`#511`](https://github.com/xmldom/xmldom/pull/511)
|
||||
|
||||
Thank you, [@kboshold](https://github.com/kboshold), [@edi9999](https://github.com/edi9999), [@apupier](https://github.com/apupier),
|
||||
[@shunkica](https://github.com/shunkica), [@homer0](https://github.com/homer0), [@jhauga](https://github.com/jhauga),
|
||||
[@UdayKharatmol](https://github.com/UdayKharatmol), for your contributions
|
||||
|
||||
|
||||
## [0.9.0-beta.11](https://github.com/xmldom/xmldom/compare/0.9.0-beta.10...0.9.0-beta.11)
|
||||
|
||||
### Fixed
|
||||
|
||||
- report more non well-formed cases [`#519`](https://github.com/xmldom/xmldom/pull/519) / [`#45`](https://github.com/xmldom/xmldom/issues/45) / [`#125`](https://github.com/xmldom/xmldom/issues/125) / [`#467`](https://github.com/xmldom/xmldom/issues/467)
|
||||
BREAKING-CHANGE: Reports more not well-formed documents as fatalError
|
||||
and drop broken support for optional and unclosed tags in HTML.
|
||||
|
||||
### Other
|
||||
|
||||
- Translate/drop non English comments [`#518`](https://github.com/xmldom/xmldom/pull/518)
|
||||
- use node v16 for development [`#517`](https://github.com/xmldom/xmldom/pull/517)
|
||||
|
||||
Thank you, [@brodybits](https://github.com/brodybits), [@cbettinger](https://github.com/cbettinger), [@josecarlosrx](https://github.com/josecarlosrx), for your contributions
|
||||
|
||||
|
||||
## [0.9.0-beta.10](https://github.com/xmldom/xmldom/compare/0.9.0-beta.9...0.9.0-beta.10)
|
||||
|
||||
### Fixed
|
||||
|
||||
- dom: prevent iteration over deleted items [`#514`](https://github.com/xmldom/xmldom/pull/514)/ [`#499`](https://github.com/xmldom/xmldom/issues/499)
|
||||
|
||||
### Chore
|
||||
|
||||
- use prettier plugin for jsdoc [`#513`](https://github.com/xmldom/xmldom/pull/513)
|
||||
|
||||
Thank you, [@qtow](https://github.com/qtow), [@shunkica](https://github.com/shunkica), [@homer0](https://github.com/homer0), for your contributions
|
||||
|
||||
|
||||
## [0.8.10](https://github.com/xmldom/xmldom/compare/0.8.9...0.8.10)
|
||||
|
||||
### Fixed
|
||||
|
||||
- dom: prevent iteration over deleted items [`#514`](https://github.com/xmldom/xmldom/pull/514)/ [`#499`](https://github.com/xmldom/xmldom/issues/499)
|
||||
|
||||
Thank you, [@qtow](https://github.com/qtow), for your contributions
|
||||
|
||||
|
||||
## [0.7.13](https://github.com/xmldom/xmldom/compare/0.7.12...0.7.13)
|
||||
|
||||
### Fixed
|
||||
|
||||
- dom: prevent iteration over deleted items [`#514`](https://github.com/xmldom/xmldom/pull/514)/ [`#499`](https://github.com/xmldom/xmldom/issues/499)
|
||||
|
||||
Thank you, [@qtow](https://github.com/qtow), for your contributions
|
||||
|
||||
|
||||
## [0.9.0-beta.9](https://github.com/xmldom/xmldom/compare/0.9.0-beta.8...0.9.0-beta.9)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Set nodeName property in ProcessingInstruction [`#509`](https://github.com/xmldom/xmldom/pull/509) / [`#505`](https://github.com/xmldom/xmldom/issues/505)
|
||||
- preserve DOCTYPE internal subset [`#498`](https://github.com/xmldom/xmldom/pull/498) / [`#497`](https://github.com/xmldom/xmldom/pull/497) / [`#117`](https://github.com/xmldom/xmldom/issues/117)\
|
||||
BREAKING CHANGES: Many documents that were previously accepted by xmldom, esecially non well-formed ones are no longer accepted. Some issues that were formerly reported as errors are now a fatalError.
|
||||
- DOMParser: Align parseFromString errors with specs [`#454`](https://github.com/xmldom/xmldom/pull/454)
|
||||
|
||||
### Chore
|
||||
|
||||
- stop running mutation tests using stryker [`#496`](https://github.com/xmldom/xmldom/pull/496)
|
||||
- make `toErrorSnapshot` windows compatible [`#503`](https://github.com/xmldom/xmldom/pull/503)
|
||||
|
||||
Thank you, [@cjbarth](https://github.com/cjbarth), [@shunkica](https://github.com/shunkica), [@pmahend1](https://github.com/pmahend1), [@niklasl](https://github.com/niklasl), for your contributions
|
||||
|
||||
|
||||
## [0.8.9](https://github.com/xmldom/xmldom/compare/0.8.8...0.8.9)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Set nodeName property in ProcessingInstruction [`#509`](https://github.com/xmldom/xmldom/pull/509) / [`#505`](https://github.com/xmldom/xmldom/issues/505)
|
||||
|
||||
Thank you, [@cjbarth](https://github.com/cjbarth), for your contributions
|
||||
|
||||
|
||||
## [0.7.12](https://github.com/xmldom/xmldom/compare/0.7.11...0.7.12)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Set nodeName property in ProcessingInstruction [`#509`](https://github.com/xmldom/xmldom/pull/509) / [`#505`](https://github.com/xmldom/xmldom/issues/505)
|
||||
|
||||
Thank you, [@cjbarth](https://github.com/cjbarth), for your contributions
|
||||
|
||||
|
||||
## [0.9.0-beta.8](https://github.com/xmldom/xmldom/compare/0.9.0-beta.7...0.9.0-beta.8)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Throw DOMException when calling removeChild with invalid parameter [`#494`](https://github.com/xmldom/xmldom/pull/494) / [`#135`](https://github.com/xmldom/xmldom/issues/135)
|
||||
|
||||
BREAKING CHANGE: Previously it was possible (but not documented) to call `Node.removeChild` with any node in the tree,
|
||||
and with certain exceptions, it would work. This is no longer the case: calling `Node.removeChild` with an argument that is not a direct child of the node that it is called from, will throw a NotFoundError DOMException, as it is described by the specs.
|
||||
|
||||
Thank you, [@noseworthy](https://github.com/noseworthy), [@davidmc24](https://github.com/davidmc24), for your contributions
|
||||
|
||||
|
||||
## [0.9.0-beta.7](https://github.com/xmldom/xmldom/compare/0.9.0-beta.6...0.9.0-beta.7)
|
||||
|
||||
### Feature
|
||||
|
||||
- Add `compareDocumentPosition` method from level 3 spec. [`#488`](https://github.com/xmldom/xmldom/pull/488)
|
||||
|
||||
### Fixed
|
||||
|
||||
- `getAttribute` and `getAttributeNS` should return `null` (#477) [`#46`](https://github.com/xmldom/xmldom/issues/46)
|
||||
- several issues in NamedNodeMap and Element (#482) [`#46`](https://github.com/xmldom/xmldom/issues/46)
|
||||
- properly parse closing where the last attribute has no value [`#485`](https://github.com/xmldom/xmldom/pull/485) / [`#486`](https://github.com/xmldom/xmldom/issues/486)
|
||||
- extend list of HTML entities [`#489`](https://github.com/xmldom/xmldom/pull/489)
|
||||
|
||||
BREAKING CHANGE: Iteration over attributes now happens in the right order and non-existing attributes now return `null` instead of undefined. THe same is true for the `namepsaceURI` and `prefix` of Attr nodes.
|
||||
All of the changes are fixing misalignment with the DOM specs, so if you expected it to work as specified,
|
||||
nothing should break for you.
|
||||
|
||||
### Chore
|
||||
|
||||
- update multiple devDependencies
|
||||
- Configure jest (correctly) and wallaby [`#481`](https://github.com/xmldom/xmldom/pull/481) / [`#483`](https://github.com/xmldom/xmldom/pull/483)
|
||||
|
||||
Thank you, [@bulandent](https://github.com/bulandent), [@zorkow](https://github.com/zorkow), for your contributions
|
||||
|
||||
|
||||
## [0.8.8](https://github.com/xmldom/xmldom/compare/0.8.7...0.8.8)
|
||||
|
||||
### Fixed
|
||||
|
||||
- extend list of HTML entities [`#489`](https://github.com/xmldom/xmldom/pull/489)
|
||||
|
||||
Thank you, [@zorkow](https://github.com/zorkow), for your contributions
|
||||
|
||||
## [0.7.11](https://github.com/xmldom/xmldom/compare/0.7.10...0.7.11)
|
||||
|
||||
### Fixed
|
||||
|
||||
- extend list of HTML entities [`#489`](https://github.com/xmldom/xmldom/pull/489)
|
||||
|
||||
Thank you, [@zorkow](https://github.com/zorkow), for your contributions
|
||||
|
||||
|
||||
## [0.8.7](https://github.com/xmldom/xmldom/compare/0.8.6...0.8.7)
|
||||
|
||||
### Fixed
|
||||
|
||||
- properly parse closing where the last attribute has no value [`#485`](https://github.com/xmldom/xmldom/pull/485) / [`#486`](https://github.com/xmldom/xmldom/issues/486)
|
||||
|
||||
Thank you, [@bulandent](https://github.com/bulandent), for your contributions
|
||||
|
||||
|
||||
## [0.7.10](https://github.com/xmldom/xmldom/compare/0.7.9...0.7.10)
|
||||
|
||||
### Fixed
|
||||
|
||||
- properly parse closing where the last attribute has no value [`#485`](https://github.com/xmldom/xmldom/pull/485) / [`#486`](https://github.com/xmldom/xmldom/issues/486)
|
||||
|
||||
Thank you, [@bulandent](https://github.com/bulandent), for your contributions
|
||||
|
||||
|
||||
## [0.8.6](https://github.com/xmldom/xmldom/compare/0.8.5...0.8.6)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Properly check nodes before replacement [`#457`](https://github.com/xmldom/xmldom/pull/457) / [`#455`](https://github.com/xmldom/xmldom/issues/455) / [`#456`](https://github.com/xmldom/xmldom/issues/456)
|
||||
|
||||
Thank you, [@edemaine](https://github.com/edemaine), [@pedro-l9](https://github.com/pedro-l9), for your contributions
|
||||
|
||||
|
||||
## [0.7.9](https://github.com/xmldom/xmldom/compare/0.7.8...0.7.9)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Properly check nodes before replacement [`#457`](https://github.com/xmldom/xmldom/pull/457) / [`#455`](https://github.com/xmldom/xmldom/issues/455) / [`#456`](https://github.com/xmldom/xmldom/issues/456)
|
||||
|
||||
Thank you, [@edemaine](https://github.com/edemaine), [@pedro-l9](https://github.com/pedro-l9), for your contributions
|
||||
|
||||
|
||||
## [0.9.0-beta.6](https://github.com/xmldom/xmldom/compare/0.9.0-beta.5...0.9.0-beta.6)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Properly check nodes before replacement [`#457`](https://github.com/xmldom/xmldom/pull/457) / [`#455`](https://github.com/xmldom/xmldom/issues/455) / [`#456`](https://github.com/xmldom/xmldom/issues/456)
|
||||
|
||||
Thank you, [@edemaine](https://github.com/edemaine), [@pedro-l9](https://github.com/pedro-l9), for your contributions
|
||||
|
||||
|
||||
## [0.9.0-beta.5](https://github.com/xmldom/xmldom/compare/0.9.0-beta.4...0.9.0-beta.5)
|
||||
|
||||
### Fixed
|
||||
|
||||
- fix: Restore ES5 compatibility [`#452`](https://github.com/xmldom/xmldom/pull/452) / [`#453`](https://github.com/xmldom/xmldom/issues/453)
|
||||
|
||||
Thank you, [@fengxinming](https://github.com/fengxinming), for your contributions
|
||||
|
||||
|
||||
## [0.8.5](https://github.com/xmldom/xmldom/compare/0.8.4...0.8.5)
|
||||
|
||||
### Fixed
|
||||
|
||||
- fix: Restore ES5 compatibility [`#452`](https://github.com/xmldom/xmldom/pull/452) / [`#453`](https://github.com/xmldom/xmldom/issues/453)
|
||||
|
||||
Thank you, [@fengxinming](https://github.com/fengxinming), for your contributions
|
||||
|
||||
|
||||
## [0.7.8](https://github.com/xmldom/xmldom/compare/0.7.7...0.7.8)
|
||||
|
||||
### Fixed
|
||||
|
||||
- fix: Restore ES5 compatibility [`#452`](https://github.com/xmldom/xmldom/pull/452) / [`#453`](https://github.com/xmldom/xmldom/issues/453)
|
||||
|
||||
Thank you, [@fengxinming](https://github.com/fengxinming), for your contributions
|
||||
|
||||
|
||||
## [0.9.0-beta.4](https://github.com/xmldom/xmldom/compare/0.9.0-beta.3...0.9.0-beta.4)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Security: Prevent inserting DOM nodes when they are not well-formed [`CVE-2022-39353`](https://github.com/xmldom/xmldom/security/advisories/GHSA-crh6-fp67-6883)
|
||||
In case such a DOM would be created, the part that is not well-formed will be transformed into text nodes, in which xml specific characters like `<` and `>` are encoded accordingly.
|
||||
In the upcoming version 0.9.0 those text nodes will no longer be added and an error will be thrown instead.
|
||||
This change can break your code, if you relied on this behavior, e.g. multiple root elements in the past. We consider it more important to align with the specs that we want to be aligned with, considering the potential security issues that might derive from people not being aware of the difference in behavior.
|
||||
Related Spec: <https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity>
|
||||
|
||||
### Chore
|
||||
|
||||
- update multiple devDependencies
|
||||
- Add eslint-plugin-node for `lib` [`#448`](https://github.com/xmldom/xmldom/pull/448) / [`#190`](https://github.com/xmldom/xmldom/issues/190)
|
||||
- style: Apply prettier to all code [`#447`](https://github.com/xmldom/xmldom/pull/447) / [`#29`](https://github.com/xmldom/xmldom/issues/29) / [`#130`](https://github.com/xmldom/xmldom/issues/130)
|
||||
|
||||
Thank you, [@XhmikosR](https://github.com/XhmikosR), [@awwright](https://github.com/awwright), [@frumioj](https://github.com/frumioj), [@cjbarth](https://github.com/cjbarth), [@markgollnick](https://github.com/markgollnick) for your contributions
|
||||
|
||||
|
||||
## [0.8.4](https://github.com/xmldom/xmldom/compare/0.8.3...0.8.4)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Security: Prevent inserting DOM nodes when they are not well-formed [`CVE-2022-39353`](https://github.com/xmldom/xmldom/security/advisories/GHSA-crh6-fp67-6883)
|
||||
In case such a DOM would be created, the part that is not well-formed will be transformed into text nodes, in which xml specific characters like `<` and `>` are encoded accordingly.
|
||||
In the upcoming version 0.9.0 those text nodes will no longer be added and an error will be thrown instead.
|
||||
This change can break your code, if you relied on this behavior, e.g. multiple root elements in the past. We consider it more important to align with the specs that we want to be aligned with, considering the potential security issues that might derive from people not being aware of the difference in behavior.
|
||||
Related Spec: <https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity>
|
||||
|
||||
Thank you, [@frumioj](https://github.com/frumioj), [@cjbarth](https://github.com/cjbarth), [@markgollnick](https://github.com/markgollnick) for your contributions
|
||||
|
||||
|
||||
## [0.7.7](https://github.com/xmldom/xmldom/compare/0.7.6...0.7.7)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Security: Prevent inserting DOM nodes when they are not well-formed [`CVE-2022-39353`](https://github.com/xmldom/xmldom/security/advisories/GHSA-crh6-fp67-6883)
|
||||
In case such a DOM would be created, the part that is not well-formed will be transformed into text nodes, in which xml specific characters like `<` and `>` are encoded accordingly.
|
||||
In the upcoming version 0.9.0 those text nodes will no longer be added and an error will be thrown instead.
|
||||
This change can break your code, if you relied on this behavior, e.g. multiple root elements in the past. We consider it more important to align with the specs that we want to be aligned with, considering the potential security issues that might derive from people not being aware of the difference in behavior.
|
||||
Related Spec: <https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity>
|
||||
|
||||
Thank you, [@frumioj](https://github.com/frumioj), [@cjbarth](https://github.com/cjbarth), [@markgollnick](https://github.com/markgollnick) for your contributions
|
||||
|
||||
|
||||
## [0.9.0-beta.3](https://github.com/xmldom/xmldom/compare/0.9.0-beta.2...0.9.0-beta.3)
|
||||
|
||||
### Fixed
|
||||
|
||||
- fix: Stop adding tags after incomplete closing tag [`#445`](https://github.com/xmldom/xmldom/pull/445) / [`#416`](https://github.com/xmldom/xmldom/pull/416)
|
||||
BREAKING CHANGE: It no longer reports an error when parsing HTML containing incomplete closing tags, to align the behavior with the one in the browser.
|
||||
BREAKING CHANGE: If your code relied on not well-formed XML to be parsed and include subsequent tags, this will no longer work.
|
||||
- fix: Avoid bidirectional characters in source code [`#440`](https://github.com/xmldom/xmldom/pull/440)
|
||||
|
||||
### Other
|
||||
|
||||
- ci: Add CodeQL scan [`#444`](https://github.com/xmldom/xmldom/pull/444)
|
||||
|
||||
Thank you, [@ACN-kck](https://github.com/ACN-kck), [@mgerlach](https://github.com/mgerlach) for your contributions
|
||||
|
||||
|
||||
## [0.7.6](https://github.com/xmldom/xmldom/compare/0.7.5...0.7.6)
|
||||
|
||||
### Fixed
|
||||
- Avoid iterating over prototype properties [`#441`](https://github.com/xmldom/xmldom/pull/441) / [`#437`](https://github.com/xmldom/xmldom/pull/437) / [`#436`](https://github.com/xmldom/xmldom/issues/436)
|
||||
|
||||
Thank you, [@jftanner](https://github.com/jftanner), [@Supraja9726](https://github.com/Supraja9726) for your contributions
|
||||
|
||||
|
||||
## [0.8.3](https://github.com/xmldom/xmldom/compare/0.8.3...0.8.2)
|
||||
|
||||
### Fixed
|
||||
- Avoid iterating over prototype properties [`#437`](https://github.com/xmldom/xmldom/pull/437) / [`#436`](https://github.com/xmldom/xmldom/issues/436)
|
||||
|
||||
Thank you, [@Supraja9726](https://github.com/Supraja9726) for your contributions
|
||||
|
||||
|
||||
## [0.9.0-beta.2](https://github.com/xmldom/xmldom/compare/0.9.0-beta.1...0.9.0-beta.2)
|
||||
|
||||
### Fixed
|
||||
- Avoid iterating over prototype properties [`#437`](https://github.com/xmldom/xmldom/pull/437) / [`#436`](https://github.com/xmldom/xmldom/issues/436)
|
||||
|
||||
Thank you, [@Supraja9726](https://github.com/Supraja9726) for your contributions
|
||||
|
||||
|
||||
## [0.9.0-beta.1](https://github.com/xmldom/xmldom/compare/0.8.2...0.9.0-beta.1)
|
||||
|
||||
### Fixed
|
||||
|
||||
**Only use HTML rules if mimeType matches** [`#338`](https://github.com/xmldom/xmldom/pull/338), fixes [`#203`](https://github.com/xmldom/xmldom/issues/203)
|
||||
|
||||
In the living specs for parsing XML and HTML, that this library is trying to implement,
|
||||
there is a distinction between the different types of documents being parsed:
|
||||
There are quite some rules that are different for parsing, constructing and serializing XML vs HTML documents.
|
||||
|
||||
So far xmldom was always "detecting" whether "the HTML rules should be applied" by looking at the current namespace. So from the first time an the HTML default namespace (`http://www.w3.org/1999/xhtml`) was found, every node was treated as being part of an HTML document. This misconception is the root cause for quite some reported bugs.
|
||||
|
||||
BREAKING CHANGE: HTML rules are no longer applied just because of the namespace, but require the `mimeType` argument passed to `DOMParser.parseFromString(source, mimeType)` to match `'text/html'`. Doing so implies all rules for handling casing for tag and attribute names when parsing, creation of nodes and searching nodes.
|
||||
|
||||
BREAKING CHANGE: Correct the return type of `DOMParser.parseFromString` to `Document | undefined`. In case of parsing errors it was always possible that "the returned `Document`" has not been created. In case you are using Typescript you now need to handle those cases.
|
||||
|
||||
BREAKING CHANGE: The instance property `DOMParser.options` is no longer available, instead use the individual `readonly` property per option (`assign`, `domHandler`, `errorHandler`, `normalizeLineEndings`, `locator`, `xmlns`). Those also provides the default value if the option was not passed. The 'locator' option is now just a boolean (default remains `true`).
|
||||
|
||||
BREAKING CHANGE: The following methods no longer allow a (non spec compliant) boolean argument to toggle "HTML rules":
|
||||
- `XMLSerializer.serializeToString`
|
||||
- `Node.toString`
|
||||
- `Document.toString`
|
||||
|
||||
The following interfaces have been implemented:
|
||||
`DOMImplementation` now implements all methods defined in the DOM spec, but not all of the behavior is implemented (see docstring):
|
||||
- `createDocument` creates an "XML Document" (prototype: `Document`, property `type` is `'xml'`)
|
||||
- `createHTMLDocument` creates an "HTML Document" (type/prototype: `Document`, property `type` is `'html'`).
|
||||
- when no argument is passed or the first argument is a string, the basic nodes for an HTML structure are created, as specified
|
||||
- when the first argument is `false` no child nodes are created
|
||||
|
||||
`Document` now has two new readonly properties as specified in the DOM spec:
|
||||
- `contentType` which is the mime-type that was used to create the document
|
||||
- `type` which is either the string literal `'xml'` or `'html'`
|
||||
|
||||
`MIME_TYPE` (`/lib/conventions.js`):
|
||||
- `hasDefaultHTMLNamespace` test if the provided string is one of the miem types that implies the default HTML namespace: `text/html` or `application/xhtml+xml`
|
||||
|
||||
Thank you [@weiwu-zhang](https://github.com/weiwu-zhang) for your contributions
|
||||
|
||||
### Chore
|
||||
|
||||
- update multiple devDependencies
|
||||
|
||||
|
||||
## [0.8.2](https://github.com/xmldom/xmldom/compare/0.8.1...0.8.2)
|
||||
|
||||
### Fixed
|
||||
- fix(dom): Serialize `>` as specified (#395) [`#58`](https://github.com/xmldom/xmldom/issues/58)
|
||||
|
||||
### Other
|
||||
- docs: Add `nodeType` values to public interface description [`#396`](https://github.com/xmldom/xmldom/pull/396)
|
||||
- test: Add executable examples for node and typescript [`#317`](https://github.com/xmldom/xmldom/pull/317)
|
||||
- fix(dom): Serialize `>` as specified [`#395`](https://github.com/xmldom/xmldom/pull/395)
|
||||
- chore: Add minimal `Object.assign` ponyfill [`#379`](https://github.com/xmldom/xmldom/pull/379)
|
||||
- docs: Refine release documentation [`#378`](https://github.com/xmldom/xmldom/pull/378)
|
||||
- chore: update various dev dependencies
|
||||
|
||||
Thank you [@niklasl](https://github.com/niklasl), [@cburatto](https://github.com/cburatto), [@SheetJSDev](https://github.com/SheetJSDev), [@pyrsmk](https://github.com/pyrsmk) for your contributions
|
||||
|
||||
## [0.8.1](https://github.com/xmldom/xmldom/compare/0.8.0...0.8.1)
|
||||
|
||||
### Fixes
|
||||
- Only use own properties in entityMap [`#374`](https://github.com/xmldom/xmldom/pull/374)
|
||||
|
||||
### Docs
|
||||
- Add security policy [`#365`](https://github.com/xmldom/xmldom/pull/365)
|
||||
- changelog: Correct contributor name and link [`#366`](https://github.com/xmldom/xmldom/pull/366)
|
||||
- Describe release/publish steps [`#358`](https://github.com/xmldom/xmldom/pull/358), [`#376`](https://github.com/xmldom/xmldom/pull/376)
|
||||
- Add snyk package health badge [`#360`](https://github.com/xmldom/xmldom/pull/360)
|
||||
|
||||
|
||||
## [0.8.0](https://github.com/xmldom/xmldom/compare/0.7.5...0.8.0)
|
||||
|
||||
### Fixed
|
||||
- Normalize all line endings according to XML specs [1.0](https://w3.org/TR/xml/#sec-line-ends) and [1.1](https://www.w3.org/TR/xml11/#sec-line-ends) \
|
||||
BREAKING CHANGE: Certain combination of line break characters are normalized to a single `\n` before parsing takes place and will no longer be preserved.
|
||||
- [`#303`](https://github.com/xmldom/xmldom/issues/303) / [`#307`](https://github.com/xmldom/xmldom/pull/307)
|
||||
- [`#49`](https://github.com/xmldom/xmldom/issues/49), [`#97`](https://github.com/xmldom/xmldom/issues/97), [`#324`](https://github.com/xmldom/xmldom/issues/324) / [`#314`](https://github.com/xmldom/xmldom/pull/314)
|
||||
- XMLSerializer: Preserve whitespace character references [`#284`](https://github.com/xmldom/xmldom/issues/284) / [`#310`](https://github.com/xmldom/xmldom/pull/310) \
|
||||
BREAKING CHANGE: If you relied on the not spec compliant preservation of literal `\t`, `\n` or `\r` in **attribute values**.
|
||||
To preserve those you will have to create XML that instead contains the correct numerical (or hexadecimal) equivalent (e.g. `	`, `
`, `
`).
|
||||
- Drop deprecated exports `DOMImplementation` and `XMLSerializer` from `lib/dom-parser.js` [#53](https://github.com/xmldom/xmldom/issues/53) / [`#309`](https://github.com/xmldom/xmldom/pull/309)
|
||||
BREAKING CHANGE: Use the one provided by the main package export.
|
||||
- dom: Remove all links as part of `removeChild` [`#343`](https://github.com/xmldom/xmldom/issues/343) / [`#355`](https://github.com/xmldom/xmldom/pull/355)
|
||||
|
||||
### Chore
|
||||
- ci: Restore latest tested node version to 16.x [`#325`](https://github.com/xmldom/xmldom/pull/325)
|
||||
- ci: Split test and lint steps into jobs [`#111`](https://github.com/xmldom/xmldom/issues/111) / [`#304`](https://github.com/xmldom/xmldom/pull/304)
|
||||
- Pinned and updated devDependencies
|
||||
|
||||
Thank you [@marrus-sh](https://github.com/marrus-sh), [@victorandree](https://github.com/victorandree), [@mdierolf](https://github.com/mdierolf), [@tsabbay](https://github.com/tsabbay), [@fatihpense](https://github.com/fatihpense) for your contributions
|
||||
|
||||
## 0.7.5
|
||||
|
||||
[Commits](https://github.com/xmldom/xmldom/compare/0.7.4...0.7.5)
|
||||
|
||||
### Fixes:
|
||||
|
||||
- Preserve default namespace when serializing [`#319`](https://github.com/xmldom/xmldom/issues/319) / [`#321`](https://github.com/xmldom/xmldom/pull/321)
|
||||
Thank you, [@lupestro](https://github.com/lupestro)
|
||||
|
||||
## 0.7.4
|
||||
|
||||
[Commits](https://github.com/xmldom/xmldom/compare/0.7.3...0.7.4)
|
||||
|
||||
### Fixes:
|
||||
|
||||
- Restore ability to parse `__prototype__` attributes [`#315`](https://github.com/xmldom/xmldom/pull/315)
|
||||
Thank you, [@dsimpsonOMF](https://github.com/dsimpsonOMF)
|
||||
|
||||
## 0.7.3
|
||||
|
||||
[Commits](https://github.com/xmldom/xmldom/compare/0.7.2...0.7.3)
|
||||
|
||||
### Fixes:
|
||||
|
||||
- Add doctype when parsing from string [`#277`](https://github.com/xmldom/xmldom/issues/277) / [`#301`](https://github.com/xmldom/xmldom/pull/301)
|
||||
- Correct typo in error message [`#294`](https://github.com/xmldom/xmldom/pull/294)
|
||||
Thank you, [@rrthomas](https://github.com/rrthomas)
|
||||
|
||||
### Refactor:
|
||||
|
||||
- Improve exports & require statements, new main package entry [`#233`](https://github.com/xmldom/xmldom/pull/233)
|
||||
|
||||
### Docs:
|
||||
|
||||
- Fix Stryker badge [`#298`](https://github.com/xmldom/xmldom/pull/298)
|
||||
- Fix link to help-wanted issues [`#299`](https://github.com/xmldom/xmldom/pull/299)
|
||||
|
||||
### Chore:
|
||||
|
||||
- Execute stryker:dry-run on branches [`#302`](https://github.com/xmldom/xmldom/pull/302)
|
||||
- Fix stryker config [`#300`](https://github.com/xmldom/xmldom/pull/300)
|
||||
- Split test and lint scripts [`#297`](https://github.com/xmldom/xmldom/pull/297)
|
||||
- Switch to stryker dashboard owned by org [`#292`](https://github.com/xmldom/xmldom/pull/292)
|
||||
|
||||
## 0.7.2
|
||||
|
||||
[Commits](https://github.com/xmldom/xmldom/compare/0.7.1...0.7.2)
|
||||
|
||||
### Fixes:
|
||||
|
||||
- Types: Add index.d.ts to packaged files [`#288`](https://github.com/xmldom/xmldom/pull/288)
|
||||
Thank you, [@forty](https://github.com/forty)
|
||||
|
||||
## 0.7.1
|
||||
|
||||
[Commits](https://github.com/xmldom/xmldom/compare/0.7.0...0.7.1)
|
||||
|
||||
### Fixes:
|
||||
|
||||
- Types: Copy types from DefinitelyTyped [`#283`](https://github.com/xmldom/xmldom/pull/283)
|
||||
Thank you, [@kachkaev](https://github.com/kachkaev)
|
||||
|
||||
### Chore:
|
||||
- package.json: remove author, maintainers, etc. [`#279`](https://github.com/xmldom/xmldom/pull/279)
|
||||
|
||||
## 0.7.0
|
||||
|
||||
[Commits](https://github.com/xmldom/xmldom/compare/0.6.0...0.7.0)
|
||||
|
||||
Due to [`#271`](https://github.com/xmldom/xmldom/issue/271) this version was published as
|
||||
- unscoped `xmldom` package to github (git tags [`0.7.0`](https://github.com/xmldom/xmldom/tree/0.7.0) and [`0.7.0+unscoped`](https://github.com/xmldom/xmldom/tree/0.7.0%2Bunscoped))
|
||||
- scoped `@xmldom/xmldom` package to npm (git tag `0.7.0+scoped`)
|
||||
For more details look at [`#278`](https://github.com/xmldom/xmldom/pull/278#issuecomment-902172483)
|
||||
|
||||
### Fixes:
|
||||
|
||||
- Security: Misinterpretation of malicious XML input [`CVE-2021-32796`](https://github.com/xmldom/xmldom/security/advisories/GHSA-5fg8-2547-mr8q)
|
||||
- Implement `Document.getElementsByClassName` as specified [`#213`](https://github.com/xmldom/xmldom/pull/213), thank you, [@ChALkeR](https://github.com/ChALkeR)
|
||||
- Inherit namespace prefix from parent when required [`#268`](https://github.com/xmldom/xmldom/pull/268)
|
||||
- Handle whitespace in closing tags [`#267`](https://github.com/xmldom/xmldom/pull/267)
|
||||
- Update `DOMImplementation` according to recent specs [`#210`](https://github.com/xmldom/xmldom/pull/210)
|
||||
BREAKING CHANGE: Only if you "passed features to be marked as available as a constructor arguments" and expected it to "magically work".
|
||||
- No longer serializes any namespaces with an empty URI [`#244`](https://github.com/xmldom/xmldom/pull/244)
|
||||
(related to [`#168`](https://github.com/xmldom/xmldom/pull/168) released in 0.6.0)
|
||||
BREAKING CHANGE: Only if you rely on ["unsetting" a namespace prefix](https://github.com/xmldom/xmldom/pull/168#issuecomment-886984994) by setting it to an empty string
|
||||
- Set `localName` as part of `Document.createElement` [`#229`](https://github.com/xmldom/xmldom/pull/229), thank you, [@rrthomas](https://github.com/rrthomas)
|
||||
|
||||
### CI
|
||||
|
||||
- We are now additionally running tests against node v16
|
||||
- Stryker tests on the master branch now run against node v14
|
||||
|
||||
### Docs
|
||||
|
||||
- Describe relations with and between specs: [`#211`](https://github.com/xmldom/xmldom/pull/211), [`#247`](https://github.com/xmldom/xmldom/pull/247)
|
||||
|
||||
## 0.6.0
|
||||
|
||||
[Commits](https://github.com/xmldom/xmldom/compare/0.5.0...0.6.0)
|
||||
|
||||
### Fixes
|
||||
|
||||
- Stop serializing empty namespace values like `xmlns:ds=""` [`#168`](https://github.com/xmldom/xmldom/pull/168)
|
||||
BREAKING CHANGE: If your code expected empty namespaces attributes to be serialized.
|
||||
Thank you, [@pdecat](https://github.com/pdecat) and [@FranckDepoortere](https://github.com/FranckDepoortere)
|
||||
- Escape `<` to `<` when serializing attribute values [`#198`](https://github.com/xmldom/xmldom/issues/198) / [`#199`](https://github.com/xmldom/xmldom/pull/199)
|
||||
|
||||
## 0.5.0
|
||||
|
||||
[Commits](https://github.com/xmldom/xmldom/compare/0.4.0...0.5.0)
|
||||
|
||||
### Fixes
|
||||
- Avoid misinterpretation of malicious XML input - [`GHSA-h6q6-9hqw-rwfv`](https://github.com/xmldom/xmldom/security/advisories/GHSA-h6q6-9hqw-rwfv) (CVE-2021-21366)
|
||||
- Improve error reporting; throw on duplicate attribute\
|
||||
BREAKING CHANGE: It is currently not clear how to consistently deal with duplicate attributes, so it's also safer for our users to fail when detecting them.
|
||||
It's possible to configure the `DOMParser.errorHandler` before parsing, to handle those errors differently.
|
||||
|
||||
To accomplish this and also be able to verify it in tests I needed to
|
||||
- create a new `Error` type `ParseError` and export it
|
||||
- Throw `ParseError` from `errorHandler.fatalError` and prevent those from being caught in `XMLReader`.
|
||||
- export `DOMHandler` constructor as `__DOMHandler`
|
||||
- Preserve quotes in DOCTYPE declaration
|
||||
Since the only purpose of parsing the DOCTYPE is to be able to restore it when serializing, we decided that it would be best to leave the parsed `publicId` and `systemId` as is, including any quotes.
|
||||
BREAKING CHANGE: If somebody relies on the actual unquoted values of those ids, they will need to take care of either single or double quotes and the right escaping.
|
||||
(Without this change this would not have been possible because the SAX parser already dropped the information about the quotes that have been used in the source.)
|
||||
|
||||
https://www.w3.org/TR/2006/REC-xml11-20060816/#dtd
|
||||
https://www.w3.org/TR/2006/REC-xml11-20060816/#IDAX1KS (External Entity Declaration)
|
||||
|
||||
- Fix breaking preprocessors' directives when parsing attributes [`#171`](https://github.com/xmldom/xmldom/pull/171)
|
||||
- fix(dom): Escape `]]>` when serializing CharData [`#181`](https://github.com/xmldom/xmldom/pull/181)
|
||||
- Switch to (only) MIT license (drop problematic LGPL license option) [`#178`](https://github.com/xmldom/xmldom/pull/178)
|
||||
- Export DOMException; remove custom assertions; etc. [`#174`](https://github.com/xmldom/xmldom/pull/174)
|
||||
|
||||
### Docs
|
||||
- Update MDN links in `readme.md` [`#188`](https://github.com/xmldom/xmldom/pull/188)
|
||||
|
||||
## 0.4.0
|
||||
|
||||
[Commits](https://github.com/xmldom/xmldom/compare/0.3.0...0.4.0)
|
||||
|
||||
### Fixes
|
||||
- **BREAKING** Restore ` ` behavior from v0.1.27 [`#67`](https://github.com/xmldom/xmldom/pull/67)
|
||||
- **BREAKING** Typecheck source param before parsing [`#113`](https://github.com/xmldom/xmldom/pull/113)
|
||||
- Include documents in package files list [`#156`](https://github.com/xmldom/xmldom/pull/156)
|
||||
- Preserve doctype with sysid [`#144`](https://github.com/xmldom/xmldom/pull/144)
|
||||
- Remove ES6 syntax from getElementsByClassName [`#91`](https://github.com/xmldom/xmldom/pull/91)
|
||||
- Revert "Add lowercase of åäö in entityMap" due to duplicate entries [`#84`](https://github.com/xmldom/xmldom/pull/84)
|
||||
- fix: Convert all line separators to LF [`#66`](https://github.com/xmldom/xmldom/pull/66)
|
||||
|
||||
### Docs
|
||||
- Update CHANGELOG.md through version 0.3.0 [`#63`](https://github.com/xmldom/xmldom/pull/63)
|
||||
- Update badges [`#78`](https://github.com/xmldom/xmldom/pull/78)
|
||||
- Add .editorconfig file [`#104`](https://github.com/xmldom/xmldom/pull/104)
|
||||
- Add note about import [`#79`](https://github.com/xmldom/xmldom/pull/79)
|
||||
- Modernize & improve the example in readme.md [`#81`](https://github.com/xmldom/xmldom/pull/81)
|
||||
|
||||
### CI
|
||||
- Add Stryker Mutator [`#70`](https://github.com/xmldom/xmldom/pull/70)
|
||||
- Add Stryker action to update dashboard [`#77`](https://github.com/xmldom/xmldom/pull/77)
|
||||
- Add Node GitHub action workflow [`#64`](https://github.com/xmldom/xmldom/pull/64)
|
||||
- add & enable eslint [`#106`](https://github.com/xmldom/xmldom/pull/106)
|
||||
- Use eslint-plugin-es5 to enforce ES5 syntax [`#107`](https://github.com/xmldom/xmldom/pull/107)
|
||||
- Recover `vows` tests, drop `proof` tests [`#59`](https://github.com/xmldom/xmldom/pull/59)
|
||||
- Add jest tessuite and first tests [`#114`](https://github.com/xmldom/xmldom/pull/114)
|
||||
- Add jest testsuite with `xmltest` cases [`#112`](https://github.com/xmldom/xmldom/pull/112)
|
||||
- Configure Renovate [`#108`](https://github.com/xmldom/xmldom/pull/108)
|
||||
- Test European HTML entities [`#86`](https://github.com/xmldom/xmldom/pull/86)
|
||||
- Updated devDependencies
|
||||
|
||||
### Other
|
||||
- Remove files that are not of any use [`#131`](https://github.com/xmldom/xmldom/pull/131), [`#65`](https://github.com/xmldom/xmldom/pull/65), [`#33`](https://github.com/xmldom/xmldom/pull/33)
|
||||
|
||||
## 0.3.0
|
||||
|
||||
[Commits](https://github.com/xmldom/xmldom/compare/0.2.1...0.3.0)
|
||||
|
||||
- **BREAKING** Node >=10.x is now required.
|
||||
- **BREAKING** Remove `component.json` (deprecated package manager https://github.com/componentjs/guide)
|
||||
- **BREAKING** Move existing sources into `lib` subdirectory.
|
||||
- **POSSIBLY BREAKING** Introduce `files` entry in `package.json` and remove use of `.npmignore`.
|
||||
- [Add `Document.getElementsByClassName`](https://github.com/xmldom/xmldom/issues/24).
|
||||
- [Add `Node` to the list of exports](https://github.com/xmldom/xmldom/pull/27)
|
||||
- [Add lowercase of åäö in `entityMap`](https://github.com/xmldom/xmldom/pull/23).
|
||||
- Move CHANGELOG to markdown file.
|
||||
- Move LICENSE to markdown file.
|
||||
|
||||
## 0.2.1
|
||||
|
||||
[Commits](https://github.com/xmldom/xmldom/compare/0.2.0...0.2.1)
|
||||
|
||||
- Correct `homepage`, `repository` and `bugs` URLs in `package.json`.
|
||||
|
||||
## 0.2.0
|
||||
|
||||
[Commits](https://github.com/xmldom/xmldom/compare/v0.1.27...0.2.0)
|
||||
|
||||
- Includes all **BREAKING** changes introduced in [`xmldom-alpha@v0.1.28`](#0128) by the original authors.
|
||||
- **POSSIBLY BREAKING** [remove the `Object.create` check from the `_extends` method of `dom.js` that added a `__proto__` property](https://github.com/xmldom/xmldom/commit/0be2ae910a8a22c9ec2cac042e04de4c04317d2a#diff-7d1c5d97786fdf9af5446a241d0b6d56L19-L22) ().
|
||||
- **POSSIBLY BREAKING** [remove code that added a `__proto__` property](https://github.com/xmldom/xmldom/commit/366159a76a181ce9a0d83f5dc48205686cfaf9cc)
|
||||
- formatting/corrections in `package.json`
|
||||
|
||||
## 0.1.31
|
||||
|
||||
[Commits](https://github.com/xmldom/xmldom/compare/v0.1.27...v0.1.31)
|
||||
|
||||
The patch versions (`v0.1.29` - `v0.1.31`) that have been released on the [v0.1.x branch](https://github.com/xmldom/xmldom/tree/0.1.x), to reflect the changed maintainers, **are branched off from [`v0.1.27`](#0127) so they don't include the breaking changes introduced in [`xmldom-alpha@v0.1.28`](#0128)**:
|
||||
|
||||
## Maintainer changes
|
||||
|
||||
After the last commit to the original repository <https://github.com/jindw/xmldom> on the 9th of May 2017, the first commit to <https://github.com/xmldom/xmldom> is from the 19th of December 2019. [The fork has been announced in the original repository on the 2nd of March 2020.](https://github.com/jindw/xmldom/issues/259)
|
||||
|
||||
The versions listed below have been published to one or both of the following packages:
|
||||
- <https://www.npmjs.com/package/xmldom-alpha>
|
||||
- <https://www.npmjs.com/package/xmldom>
|
||||
|
||||
It is currently not planned to continue publishing the `xmldom-alpha` package.
|
||||
|
||||
The new maintainers did not invest time to understand changes that led to the last `xmldom` version [`0.1.27`](#0127) published by the original maintainer, but consider it the basis for their work.
|
||||
A timeline of all the changes that happened from that version until `0.3.0` is available in <https://github.com/xmldom/xmldom/issues/62>. Any related questions should be asked there.
|
||||
|
||||
## 0.1.28
|
||||
|
||||
[Commits](https://github.com/xmldom/xmldom/compare/v0.1.27...xmldom-alpha@v0.1.28)
|
||||
|
||||
Published by @jindw on the 9th of May 2017 as
|
||||
- `xmldom-alpha@0.1.28`
|
||||
|
||||
- **BREAKING** includes [regression regarding ` ` (issue #57)](https://github.com/xmldom/xmldom/issues/57)
|
||||
- [Fix `license` field in `package.json`](https://github.com/jindw/xmldom/pull/178)
|
||||
- [Conditional converting of HTML entities](https://github.com/jindw/xmldom/pull/80)
|
||||
- Fix `dom.js` serialization issue for missing document element ([example that failed on `toString()` before this change](https://github.com/xmldom/xmldom/blob/a58dcf7a265522e80ce520fe3be0cddb1b976f6f/test/parse/unclosedcomment.js#L10-L11))
|
||||
- Add new module `entities.js`
|
||||
|
||||
## 0.1.27
|
||||
|
||||
Published by @jindw on the 28th of Nov 2016 as
|
||||
- `xmldom@0.1.27`
|
||||
- `xmldom-alpha@0.1.27`
|
||||
|
||||
- Various bug fixes.
|
||||
|
||||
## 0.1.26
|
||||
|
||||
Published on the 18th of Nov 2016
|
||||
as `xmldom@0.1.26`
|
||||
|
||||
- Details unknown
|
||||
|
||||
## 0.1.25
|
||||
|
||||
Published on the 18th of Nov 2016 as
|
||||
- `xmldom@0.1.25`
|
||||
|
||||
- Details unknown
|
||||
|
||||
## 0.1.24
|
||||
|
||||
Published on the 27th of November 2016 as
|
||||
- `xmldom@0.1.24`
|
||||
- `xmldom-alpha@0.1.24`
|
||||
|
||||
- Added node filter.
|
||||
|
||||
## 0.1.23
|
||||
|
||||
Published on the 5th of May 2016 as
|
||||
- `xmldom-alpha@0.1.23`
|
||||
|
||||
- Add namespace support for nest node serialize.
|
||||
- Various other bug fixes.
|
||||
|
||||
## 0.1.22
|
||||
|
||||
- Merge XMLNS serialization.
|
||||
- Remove \r from source string.
|
||||
- Print namespaces for child elements.
|
||||
- Switch references to nodeType to use named constants.
|
||||
- Add nodelist toString support.
|
||||
|
||||
## 0.1.21
|
||||
|
||||
- Fix serialize bug.
|
||||
|
||||
## 0.1.20
|
||||
|
||||
- Optimize invalid XML support.
|
||||
- Add toString sorter for attributes output.
|
||||
- Add html self closed node button.
|
||||
- Add `*` NS support for getElementsByTagNameNS.
|
||||
- Convert attribute's value to string in setAttributeNS.
|
||||
- Add support for HTML entities for HTML docs only.
|
||||
- Fix TypeError when Document is created with DocumentType.
|
||||
|
||||
## 0.1.19
|
||||
|
||||
- Fix [infinite loop on unclosed comment (jindw/xmldom#68)](https://github.com/jindw/xmldom/issues/68)
|
||||
- Add error report for unclosed tag.
|
||||
- Various other fixes.
|
||||
|
||||
## 0.1.18
|
||||
|
||||
- Add default `ns` support.
|
||||
- parseFromString now renders entirely plain text documents as textNode.
|
||||
- Enable option to ignore white space on parsing.
|
||||
|
||||
## 0.1.17
|
||||
|
||||
**Details missing for this and potential earlier version**
|
||||
|
||||
## 0.1.16
|
||||
|
||||
- Correctly handle multibyte Unicode greater than two byts. #57. #56.
|
||||
- Initial unit testing and test coverage. #53. #46. #19.
|
||||
- Create Bower `component.json` #52.
|
||||
|
||||
## 0.1.8
|
||||
|
||||
- Add: some test case from node-o3-xml(excludes xpath support)
|
||||
- Fix: remove existed attribute before setting (bug introduced in v0.1.5)
|
||||
- Fix: index direct access for childNodes and any NodeList collection(not w3c standard)
|
||||
- Fix: remove last child bug
|
||||
8
node_modules/@xmldom/xmldom/LICENSE
generated
vendored
Normal file
8
node_modules/@xmldom/xmldom/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
Copyright 2019 - present Christopher J. Brody and other contributors, as listed in: https://github.com/xmldom/xmldom/graphs/contributors
|
||||
Copyright 2012 - 2017 @jindw <jindw@xidea.org> and other contributors, as listed in: https://github.com/jindw/xmldom/graphs/contributors
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
50
node_modules/@xmldom/xmldom/SECURITY.md
generated
vendored
Normal file
50
node_modules/@xmldom/xmldom/SECURITY.md
generated
vendored
Normal file
@@ -0,0 +1,50 @@
|
||||
# Security Policy
|
||||
|
||||
The most up-to-date version of this document can be found at <https://github.com/xmldom/xmldom/security/policy>.
|
||||
|
||||
## Supported Versions
|
||||
|
||||
This repository contains the code for the libraries `xmldom` and `@xmldom/xmldom` on npm.
|
||||
|
||||
As long as we didn't publish v1, we aim to maintain the last two minor versions with security fixes. If it is possible we provide security fixes as patch versions.
|
||||
If you think there is a good reason to also patch an earlier version, let us know in a GitHub issue or the release discussion once the fix has been provided.
|
||||
The maintainers will consider it, and if we agree and have/find the required resources, a patch for that version will be provided.
|
||||
|
||||
Please notice that [we are no longer able to publish the (unscoped) `xmldom` package](https://github.com/xmldom/xmldom/issues/271),
|
||||
and that all existing versions of `xmldom` are affected by at least one security vulnerability and should be considered deprecated.
|
||||
You can still report issues regarding `xmldom` as described below.
|
||||
|
||||
If you need help with migrating from `xmldom` to `@xmldom/xmldom`, file a GitHub issue or PR in the affected repository and mention @karfau.
|
||||
|
||||
## Reporting vulnerabilities
|
||||
|
||||
Please email reports about any security related issues you find to `security@xmldom.org`, which will forward it to the list of maintainers.
|
||||
The maintainers will try to respond within 7 calendar days. (If nobody replies after 7 days, please us send a reminder!)
|
||||
As part of you communication please make sure to always hit "Reply all", so all maintainers are kept in the loop.
|
||||
|
||||
In addition, please include the following information along with your report:
|
||||
|
||||
- Your name and affiliation (if any).
|
||||
- A description of the technical details of the vulnerabilities. It is very important to let us know how we can reproduce your findings.
|
||||
- An explanation who can exploit this vulnerability, and what they gain when doing so -- write an attack scenario. This will help us evaluate your report quickly, especially if the issue is complex.
|
||||
- Whether this vulnerability public or known to third parties. If it is, please provide details.
|
||||
|
||||
If you believe that an existing (public) issue is security-related, please email `security@xmldom.org`.
|
||||
The email should include the issue URL and a short description of why it should be handled according to this security policy.
|
||||
|
||||
Once an issue is reported, the maintainers use the following disclosure process:
|
||||
|
||||
- When a report is received, we confirm the issue, determine its severity and the affected versions.
|
||||
- If we know of specific third-party services or software based on xmldom that require mitigation before publication, those projects will be notified.
|
||||
- A [GitHub security advisory](https://docs.github.com/en/code-security/security-advisories/about-github-security-advisories) is [created](https://docs.github.com/en/code-security/security-advisories/creating-a-security-advisory) (but not published) which details the problem and steps for mitigation.
|
||||
- If the reporter provides a GitHub account and agrees to it, we [add that GitHub account as a collaborator on the advisory](https://docs.github.com/en/code-security/security-advisories/adding-a-collaborator-to-a-security-advisory).
|
||||
- The vulnerability is fixed in a [private fork](https://docs.github.com/en/code-security/security-advisories/collaborating-in-a-temporary-private-fork-to-resolve-a-security-vulnerability) and potential workarounds are identified.
|
||||
- The maintainers audit the existing code to find any potential similar problems.
|
||||
- The release for the current minor version and the [security advisory are published](https://docs.github.com/en/code-security/security-advisories/publishing-a-security-advisory).
|
||||
- The release(s) for previous minor version(s) are published.
|
||||
|
||||
We credit reporters for identifying security issues, if they confirm that they want to.
|
||||
|
||||
## Known vulnerabilities
|
||||
|
||||
See https://github.com/xmldom/xmldom/security/advisories?state=published
|
||||
1620
node_modules/@xmldom/xmldom/index.d.ts
generated
vendored
Normal file
1620
node_modules/@xmldom/xmldom/index.d.ts
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3
node_modules/@xmldom/xmldom/lib/.eslintrc.yml
generated
vendored
Normal file
3
node_modules/@xmldom/xmldom/lib/.eslintrc.yml
generated
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
extends:
|
||||
- 'plugin:es5/no-es2015'
|
||||
- 'plugin:n/recommended'
|
||||
429
node_modules/@xmldom/xmldom/lib/conventions.js
generated
vendored
Normal file
429
node_modules/@xmldom/xmldom/lib/conventions.js
generated
vendored
Normal file
@@ -0,0 +1,429 @@
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
* Ponyfill for `Array.prototype.find` which is only available in ES6 runtimes.
|
||||
*
|
||||
* Works with anything that has a `length` property and index access properties,
|
||||
* including NodeList.
|
||||
*
|
||||
* @param {T[] | { length: number; [number]: T }} list
|
||||
* @param {function (item: T, index: number, list:T[]):boolean} predicate
|
||||
* @param {Partial<Pick<ArrayConstructor['prototype'], 'find'>>?} ac
|
||||
* Allows injecting a custom implementation in tests (`Array.prototype` by default).
|
||||
* @returns {T | undefined}
|
||||
* @template {unknown} T
|
||||
* @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find
|
||||
* @see https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.find
|
||||
*/
|
||||
function find(list, predicate, ac) {
|
||||
if (ac === undefined) {
|
||||
ac = Array.prototype;
|
||||
}
|
||||
if (list && typeof ac.find === 'function') {
|
||||
return ac.find.call(list, predicate);
|
||||
}
|
||||
for (var i = 0; i < list.length; i++) {
|
||||
if (hasOwn(list, i)) {
|
||||
var item = list[i];
|
||||
if (predicate.call(undefined, item, i, list)) {
|
||||
return item;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* "Shallow freezes" an object to render it immutable.
|
||||
* Uses `Object.freeze` if available,
|
||||
* otherwise the immutability is only in the type.
|
||||
*
|
||||
* Is used to create "enum like" objects.
|
||||
*
|
||||
* If `Object.getOwnPropertyDescriptors` is available,
|
||||
* a new object with all properties of object but without any prototype is created and returned
|
||||
* after freezing it.
|
||||
*
|
||||
* @param {T} object
|
||||
* The object to freeze.
|
||||
* @param {Pick<ObjectConstructor, 'create' | 'freeze' | 'getOwnPropertyDescriptors'>} [oc=Object]
|
||||
* `Object` by default,
|
||||
* allows to inject custom object constructor for tests.
|
||||
* @returns {Readonly<T>}
|
||||
* @template {Object} T
|
||||
* @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze
|
||||
* @prettierignore
|
||||
*/
|
||||
function freeze(object, oc) {
|
||||
if (oc === undefined) {
|
||||
oc = Object;
|
||||
}
|
||||
if (oc && typeof oc.getOwnPropertyDescriptors === 'function') {
|
||||
object = oc.create(null, oc.getOwnPropertyDescriptors(object));
|
||||
}
|
||||
return oc && typeof oc.freeze === 'function' ? oc.freeze(object) : object;
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation for `Object.hasOwn` but ES5 compatible.
|
||||
*
|
||||
* @param {any} object
|
||||
* @param {string | number} key
|
||||
* @returns {boolean}
|
||||
*/
|
||||
function hasOwn(object, key) {
|
||||
return Object.prototype.hasOwnProperty.call(object, key);
|
||||
}
|
||||
|
||||
/**
|
||||
* Since xmldom can not rely on `Object.assign`,
|
||||
* it uses/provides a simplified version that is sufficient for its needs.
|
||||
*
|
||||
* @param {Object} target
|
||||
* @param {Object | null | undefined} source
|
||||
* @returns {Object}
|
||||
* The target with the merged/overridden properties.
|
||||
* @throws {TypeError}
|
||||
* If target is not an object.
|
||||
* @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
|
||||
* @see https://tc39.es/ecma262/multipage/fundamental-objects.html#sec-object.assign
|
||||
*/
|
||||
function assign(target, source) {
|
||||
if (target === null || typeof target !== 'object') {
|
||||
throw new TypeError('target is not an object');
|
||||
}
|
||||
for (var key in source) {
|
||||
if (hasOwn(source, key)) {
|
||||
target[key] = source[key];
|
||||
}
|
||||
}
|
||||
return target;
|
||||
}
|
||||
|
||||
/**
|
||||
* A number of attributes are boolean attributes.
|
||||
* The presence of a boolean attribute on an element represents the `true` value,
|
||||
* and the absence of the attribute represents the `false` value.
|
||||
*
|
||||
* If the attribute is present, its value must either be the empty string, or a value that is
|
||||
* an ASCII case-insensitive match for the attribute's canonical name,
|
||||
* with no leading or trailing whitespace.
|
||||
*
|
||||
* Note: The values `"true"` and `"false"` are not allowed on boolean attributes.
|
||||
* To represent a `false` value, the attribute has to be omitted altogether.
|
||||
*
|
||||
* @see https://html.spec.whatwg.org/#boolean-attributes
|
||||
* @see https://html.spec.whatwg.org/#attributes-3
|
||||
*/
|
||||
var HTML_BOOLEAN_ATTRIBUTES = freeze({
|
||||
allowfullscreen: true,
|
||||
async: true,
|
||||
autofocus: true,
|
||||
autoplay: true,
|
||||
checked: true,
|
||||
controls: true,
|
||||
default: true,
|
||||
defer: true,
|
||||
disabled: true,
|
||||
formnovalidate: true,
|
||||
hidden: true,
|
||||
ismap: true,
|
||||
itemscope: true,
|
||||
loop: true,
|
||||
multiple: true,
|
||||
muted: true,
|
||||
nomodule: true,
|
||||
novalidate: true,
|
||||
open: true,
|
||||
playsinline: true,
|
||||
readonly: true,
|
||||
required: true,
|
||||
reversed: true,
|
||||
selected: true,
|
||||
});
|
||||
|
||||
/**
|
||||
* Check if `name` is matching one of the HTML boolean attribute names.
|
||||
* This method doesn't check if such attributes are allowed in the context of the current
|
||||
* document/parsing.
|
||||
*
|
||||
* @param {string} name
|
||||
* @returns {boolean}
|
||||
* @see {@link HTML_BOOLEAN_ATTRIBUTES}
|
||||
* @see https://html.spec.whatwg.org/#boolean-attributes
|
||||
* @see https://html.spec.whatwg.org/#attributes-3
|
||||
*/
|
||||
function isHTMLBooleanAttribute(name) {
|
||||
return hasOwn(HTML_BOOLEAN_ATTRIBUTES, name.toLowerCase());
|
||||
}
|
||||
|
||||
/**
|
||||
* Void elements only have a start tag; end tags must not be specified for void elements.
|
||||
* These elements should be written as self-closing like this: `<area />`.
|
||||
* This should not be confused with optional tags that HTML allows to omit the end tag for
|
||||
* (like `li`, `tr` and others), which can have content after them,
|
||||
* so they can not be written as self-closing.
|
||||
* xmldom does not have any logic for optional end tags cases,
|
||||
* and will report them as a warning.
|
||||
* Content that would go into the unopened element,
|
||||
* will instead be added as a sibling text node.
|
||||
*
|
||||
* @type {Readonly<{
|
||||
* area: boolean;
|
||||
* col: boolean;
|
||||
* img: boolean;
|
||||
* wbr: boolean;
|
||||
* link: boolean;
|
||||
* hr: boolean;
|
||||
* source: boolean;
|
||||
* br: boolean;
|
||||
* input: boolean;
|
||||
* param: boolean;
|
||||
* meta: boolean;
|
||||
* embed: boolean;
|
||||
* track: boolean;
|
||||
* base: boolean;
|
||||
* }>}
|
||||
* @see https://html.spec.whatwg.org/#void-elements
|
||||
* @see https://html.spec.whatwg.org/#optional-tags
|
||||
*/
|
||||
var HTML_VOID_ELEMENTS = freeze({
|
||||
area: true,
|
||||
base: true,
|
||||
br: true,
|
||||
col: true,
|
||||
embed: true,
|
||||
hr: true,
|
||||
img: true,
|
||||
input: true,
|
||||
link: true,
|
||||
meta: true,
|
||||
param: true,
|
||||
source: true,
|
||||
track: true,
|
||||
wbr: true,
|
||||
});
|
||||
|
||||
/**
|
||||
* Check if `tagName` is matching one of the HTML void element names.
|
||||
* This method doesn't check if such tags are allowed in the context of the current
|
||||
* document/parsing.
|
||||
*
|
||||
* @param {string} tagName
|
||||
* @returns {boolean}
|
||||
* @see {@link HTML_VOID_ELEMENTS}
|
||||
* @see https://html.spec.whatwg.org/#void-elements
|
||||
*/
|
||||
function isHTMLVoidElement(tagName) {
|
||||
return hasOwn(HTML_VOID_ELEMENTS, tagName.toLowerCase());
|
||||
}
|
||||
|
||||
/**
|
||||
* Tag names that are raw text elements according to HTML spec.
|
||||
* The value denotes whether they are escapable or not.
|
||||
*
|
||||
* @see {@link isHTMLEscapableRawTextElement}
|
||||
* @see {@link isHTMLRawTextElement}
|
||||
* @see https://html.spec.whatwg.org/#raw-text-elements
|
||||
* @see https://html.spec.whatwg.org/#escapable-raw-text-elements
|
||||
*/
|
||||
var HTML_RAW_TEXT_ELEMENTS = freeze({
|
||||
script: false,
|
||||
style: false,
|
||||
textarea: true,
|
||||
title: true,
|
||||
});
|
||||
|
||||
/**
|
||||
* Check if `tagName` is matching one of the HTML raw text element names.
|
||||
* This method doesn't check if such tags are allowed in the context of the current
|
||||
* document/parsing.
|
||||
*
|
||||
* @param {string} tagName
|
||||
* @returns {boolean}
|
||||
* @see {@link isHTMLEscapableRawTextElement}
|
||||
* @see {@link HTML_RAW_TEXT_ELEMENTS}
|
||||
* @see https://html.spec.whatwg.org/#raw-text-elements
|
||||
* @see https://html.spec.whatwg.org/#escapable-raw-text-elements
|
||||
*/
|
||||
function isHTMLRawTextElement(tagName) {
|
||||
var key = tagName.toLowerCase();
|
||||
return hasOwn(HTML_RAW_TEXT_ELEMENTS, key) && !HTML_RAW_TEXT_ELEMENTS[key];
|
||||
}
|
||||
/**
|
||||
* Check if `tagName` is matching one of the HTML escapable raw text element names.
|
||||
* This method doesn't check if such tags are allowed in the context of the current
|
||||
* document/parsing.
|
||||
*
|
||||
* @param {string} tagName
|
||||
* @returns {boolean}
|
||||
* @see {@link isHTMLRawTextElement}
|
||||
* @see {@link HTML_RAW_TEXT_ELEMENTS}
|
||||
* @see https://html.spec.whatwg.org/#raw-text-elements
|
||||
* @see https://html.spec.whatwg.org/#escapable-raw-text-elements
|
||||
*/
|
||||
function isHTMLEscapableRawTextElement(tagName) {
|
||||
var key = tagName.toLowerCase();
|
||||
return hasOwn(HTML_RAW_TEXT_ELEMENTS, key) && HTML_RAW_TEXT_ELEMENTS[key];
|
||||
}
|
||||
/**
|
||||
* Only returns true if `value` matches MIME_TYPE.HTML, which indicates an HTML document.
|
||||
*
|
||||
* @param {string} mimeType
|
||||
* @returns {mimeType is 'text/html'}
|
||||
* @see https://www.iana.org/assignments/media-types/text/html
|
||||
* @see https://en.wikipedia.org/wiki/HTML
|
||||
* @see https://developer.mozilla.org/en-US/docs/Web/API/DOMParser/parseFromString
|
||||
* @see https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#dom-domparser-parsefromstring
|
||||
*/
|
||||
function isHTMLMimeType(mimeType) {
|
||||
return mimeType === MIME_TYPE.HTML;
|
||||
}
|
||||
/**
|
||||
* For both the `text/html` and the `application/xhtml+xml` namespace the spec defines that the
|
||||
* HTML namespace is provided as the default.
|
||||
*
|
||||
* @param {string} mimeType
|
||||
* @returns {boolean}
|
||||
* @see https://dom.spec.whatwg.org/#dom-document-createelement
|
||||
* @see https://dom.spec.whatwg.org/#dom-domimplementation-createdocument
|
||||
* @see https://dom.spec.whatwg.org/#dom-domimplementation-createhtmldocument
|
||||
*/
|
||||
function hasDefaultHTMLNamespace(mimeType) {
|
||||
return isHTMLMimeType(mimeType) || mimeType === MIME_TYPE.XML_XHTML_APPLICATION;
|
||||
}
|
||||
|
||||
/**
|
||||
* All mime types that are allowed as input to `DOMParser.parseFromString`
|
||||
*
|
||||
* @see https://developer.mozilla.org/en-US/docs/Web/API/DOMParser/parseFromString#Argument02
|
||||
* MDN
|
||||
* @see https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#domparsersupportedtype
|
||||
* WHATWG HTML Spec
|
||||
* @see {@link DOMParser.prototype.parseFromString}
|
||||
*/
|
||||
var MIME_TYPE = freeze({
|
||||
/**
|
||||
* `text/html`, the only mime type that triggers treating an XML document as HTML.
|
||||
*
|
||||
* @see https://www.iana.org/assignments/media-types/text/html IANA MimeType registration
|
||||
* @see https://en.wikipedia.org/wiki/HTML Wikipedia
|
||||
* @see https://developer.mozilla.org/en-US/docs/Web/API/DOMParser/parseFromString MDN
|
||||
* @see https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#dom-domparser-parsefromstring
|
||||
* WHATWG HTML Spec
|
||||
*/
|
||||
HTML: 'text/html',
|
||||
|
||||
/**
|
||||
* `application/xml`, the standard mime type for XML documents.
|
||||
*
|
||||
* @see https://www.iana.org/assignments/media-types/application/xml IANA MimeType
|
||||
* registration
|
||||
* @see https://tools.ietf.org/html/rfc7303#section-9.1 RFC 7303
|
||||
* @see https://en.wikipedia.org/wiki/XML_and_MIME Wikipedia
|
||||
*/
|
||||
XML_APPLICATION: 'application/xml',
|
||||
|
||||
/**
|
||||
* `text/xml`, an alias for `application/xml`.
|
||||
*
|
||||
* @see https://tools.ietf.org/html/rfc7303#section-9.2 RFC 7303
|
||||
* @see https://www.iana.org/assignments/media-types/text/xml IANA MimeType registration
|
||||
* @see https://en.wikipedia.org/wiki/XML_and_MIME Wikipedia
|
||||
*/
|
||||
XML_TEXT: 'text/xml',
|
||||
|
||||
/**
|
||||
* `application/xhtml+xml`, indicates an XML document that has the default HTML namespace,
|
||||
* but is parsed as an XML document.
|
||||
*
|
||||
* @see https://www.iana.org/assignments/media-types/application/xhtml+xml IANA MimeType
|
||||
* registration
|
||||
* @see https://dom.spec.whatwg.org/#dom-domimplementation-createdocument WHATWG DOM Spec
|
||||
* @see https://en.wikipedia.org/wiki/XHTML Wikipedia
|
||||
*/
|
||||
XML_XHTML_APPLICATION: 'application/xhtml+xml',
|
||||
|
||||
/**
|
||||
* `image/svg+xml`,
|
||||
*
|
||||
* @see https://www.iana.org/assignments/media-types/image/svg+xml IANA MimeType registration
|
||||
* @see https://www.w3.org/TR/SVG11/ W3C SVG 1.1
|
||||
* @see https://en.wikipedia.org/wiki/Scalable_Vector_Graphics Wikipedia
|
||||
*/
|
||||
XML_SVG_IMAGE: 'image/svg+xml',
|
||||
});
|
||||
/**
|
||||
* @typedef {'application/xhtml+xml' | 'application/xml' | 'image/svg+xml' | 'text/html' | 'text/xml'}
|
||||
* MimeType
|
||||
*/
|
||||
/**
|
||||
* @type {MimeType[]}
|
||||
* @private
|
||||
* Basically `Object.values`, which is not available in ES5.
|
||||
*/
|
||||
var _MIME_TYPES = Object.keys(MIME_TYPE).map(function (key) {
|
||||
return MIME_TYPE[key];
|
||||
});
|
||||
|
||||
/**
|
||||
* Only returns true if `mimeType` is one of the allowed values for
|
||||
* `DOMParser.parseFromString`.
|
||||
*
|
||||
* @param {string} mimeType
|
||||
* @returns {mimeType is 'application/xhtml+xml' | 'application/xml' | 'image/svg+xml' | 'text/html' | 'text/xml'}
|
||||
*
|
||||
*/
|
||||
function isValidMimeType(mimeType) {
|
||||
return _MIME_TYPES.indexOf(mimeType) > -1;
|
||||
}
|
||||
/**
|
||||
* Namespaces that are used in this code base.
|
||||
*
|
||||
* @see http://www.w3.org/TR/REC-xml-names
|
||||
*/
|
||||
var NAMESPACE = freeze({
|
||||
/**
|
||||
* The XHTML namespace.
|
||||
*
|
||||
* @see http://www.w3.org/1999/xhtml
|
||||
*/
|
||||
HTML: 'http://www.w3.org/1999/xhtml',
|
||||
|
||||
/**
|
||||
* The SVG namespace.
|
||||
*
|
||||
* @see http://www.w3.org/2000/svg
|
||||
*/
|
||||
SVG: 'http://www.w3.org/2000/svg',
|
||||
|
||||
/**
|
||||
* The `xml:` namespace.
|
||||
*
|
||||
* @see http://www.w3.org/XML/1998/namespace
|
||||
*/
|
||||
XML: 'http://www.w3.org/XML/1998/namespace',
|
||||
|
||||
/**
|
||||
* The `xmlns:` namespace.
|
||||
*
|
||||
* @see https://www.w3.org/2000/xmlns/
|
||||
*/
|
||||
XMLNS: 'http://www.w3.org/2000/xmlns/',
|
||||
});
|
||||
|
||||
exports.assign = assign;
|
||||
exports.find = find;
|
||||
exports.freeze = freeze;
|
||||
exports.HTML_BOOLEAN_ATTRIBUTES = HTML_BOOLEAN_ATTRIBUTES;
|
||||
exports.HTML_RAW_TEXT_ELEMENTS = HTML_RAW_TEXT_ELEMENTS;
|
||||
exports.HTML_VOID_ELEMENTS = HTML_VOID_ELEMENTS;
|
||||
exports.hasDefaultHTMLNamespace = hasDefaultHTMLNamespace;
|
||||
exports.hasOwn = hasOwn;
|
||||
exports.isHTMLBooleanAttribute = isHTMLBooleanAttribute;
|
||||
exports.isHTMLRawTextElement = isHTMLRawTextElement;
|
||||
exports.isHTMLEscapableRawTextElement = isHTMLEscapableRawTextElement;
|
||||
exports.isHTMLMimeType = isHTMLMimeType;
|
||||
exports.isHTMLVoidElement = isHTMLVoidElement;
|
||||
exports.isValidMimeType = isValidMimeType;
|
||||
exports.MIME_TYPE = MIME_TYPE;
|
||||
exports.NAMESPACE = NAMESPACE;
|
||||
586
node_modules/@xmldom/xmldom/lib/dom-parser.js
generated
vendored
Normal file
586
node_modules/@xmldom/xmldom/lib/dom-parser.js
generated
vendored
Normal file
@@ -0,0 +1,586 @@
|
||||
'use strict';
|
||||
|
||||
var conventions = require('./conventions');
|
||||
var dom = require('./dom');
|
||||
var errors = require('./errors');
|
||||
var entities = require('./entities');
|
||||
var sax = require('./sax');
|
||||
|
||||
var DOMImplementation = dom.DOMImplementation;
|
||||
|
||||
var hasDefaultHTMLNamespace = conventions.hasDefaultHTMLNamespace;
|
||||
var isHTMLMimeType = conventions.isHTMLMimeType;
|
||||
var isValidMimeType = conventions.isValidMimeType;
|
||||
var MIME_TYPE = conventions.MIME_TYPE;
|
||||
var NAMESPACE = conventions.NAMESPACE;
|
||||
var ParseError = errors.ParseError;
|
||||
|
||||
var XMLReader = sax.XMLReader;
|
||||
|
||||
/**
|
||||
* Normalizes line ending according to <https://www.w3.org/TR/xml11/#sec-line-ends>,
|
||||
* including some Unicode "newline" characters:
|
||||
*
|
||||
* > XML parsed entities are often stored in computer files which,
|
||||
* > for editing convenience, are organized into lines.
|
||||
* > These lines are typically separated by some combination
|
||||
* > of the characters CARRIAGE RETURN (#xD) and LINE FEED (#xA).
|
||||
* >
|
||||
* > To simplify the tasks of applications, the XML processor must behave
|
||||
* > as if it normalized all line breaks in external parsed entities (including the document entity)
|
||||
* > on input, before parsing, by translating the following to a single #xA character:
|
||||
* >
|
||||
* > 1. the two-character sequence #xD #xA,
|
||||
* > 2. the two-character sequence #xD #x85,
|
||||
* > 3. the single character #x85,
|
||||
* > 4. the single character #x2028,
|
||||
* > 5. the single character #x2029,
|
||||
* > 6. any #xD character that is not immediately followed by #xA or #x85.
|
||||
*
|
||||
* @param {string} input
|
||||
* @returns {string}
|
||||
* @prettierignore
|
||||
*/
|
||||
function normalizeLineEndings(input) {
|
||||
return input.replace(/\r[\n\u0085]/g, '\n').replace(/[\r\u0085\u2028\u2029]/g, '\n');
|
||||
}
|
||||
|
||||
/**
|
||||
* @typedef Locator
|
||||
* @property {number} [columnNumber]
|
||||
* @property {number} [lineNumber]
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef DOMParserOptions
|
||||
* @property {typeof assign} [assign]
|
||||
* The method to use instead of `conventions.assign`, which is used to copy values from
|
||||
* `options` before they are used for parsing.
|
||||
* @property {typeof DOMHandler} [domHandler]
|
||||
* For internal testing: The class for creating an instance for handling events from the SAX
|
||||
* parser.
|
||||
* *****Warning: By configuring a faulty implementation, the specified behavior can completely
|
||||
* be broken.*****.
|
||||
* @property {Function} [errorHandler]
|
||||
* DEPRECATED! use `onError` instead.
|
||||
* @property {function(level:ErrorLevel, message:string, context: DOMHandler):void}
|
||||
* [onError]
|
||||
* A function invoked for every error that occurs during parsing.
|
||||
*
|
||||
* If it is not provided, all errors are reported to `console.error`
|
||||
* and only `fatalError`s are thrown as a `ParseError`,
|
||||
* which prevents any further processing.
|
||||
* If the provided method throws, a `ParserError` is thrown,
|
||||
* which prevents any further processing.
|
||||
*
|
||||
* Be aware that many `warning`s are considered an error that prevents further processing in
|
||||
* most implementations.
|
||||
* @property {boolean} [locator=true]
|
||||
* Configures if the nodes created during parsing will have a `lineNumber` and a `columnNumber`
|
||||
* attribute describing their location in the XML string.
|
||||
* Default is true.
|
||||
* @property {(string) => string} [normalizeLineEndings]
|
||||
* used to replace line endings before parsing, defaults to exported `normalizeLineEndings`,
|
||||
* which normalizes line endings according to <https://www.w3.org/TR/xml11/#sec-line-ends>,
|
||||
* including some Unicode "newline" characters.
|
||||
* @property {Object} [xmlns]
|
||||
* The XML namespaces that should be assumed when parsing.
|
||||
* The default namespace can be provided by the key that is the empty string.
|
||||
* When the `mimeType` for HTML, XHTML or SVG are passed to `parseFromString`,
|
||||
* the default namespace that will be used,
|
||||
* will be overridden according to the specification.
|
||||
* @see {@link normalizeLineEndings}
|
||||
*/
|
||||
|
||||
/**
|
||||
* The DOMParser interface provides the ability to parse XML or HTML source code from a string
|
||||
* into a DOM `Document`.
|
||||
*
|
||||
* ***xmldom is different from the spec in that it allows an `options` parameter,
|
||||
* to control the behavior***.
|
||||
*
|
||||
* @class
|
||||
* @param {DOMParserOptions} [options]
|
||||
* @see https://developer.mozilla.org/en-US/docs/Web/API/DOMParser
|
||||
* @see https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#dom-parsing-and-serialization
|
||||
*/
|
||||
function DOMParser(options) {
|
||||
options = options || {};
|
||||
if (options.locator === undefined) {
|
||||
options.locator = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* The method to use instead of `conventions.assign`, which is used to copy values from
|
||||
* `options`
|
||||
* before they are used for parsing.
|
||||
*
|
||||
* @type {conventions.assign}
|
||||
* @private
|
||||
* @see {@link conventions.assign}
|
||||
* @readonly
|
||||
*/
|
||||
this.assign = options.assign || conventions.assign;
|
||||
|
||||
/**
|
||||
* For internal testing: The class for creating an instance for handling events from the SAX
|
||||
* parser.
|
||||
* *****Warning: By configuring a faulty implementation, the specified behavior can completely
|
||||
* be broken*****.
|
||||
*
|
||||
* @type {typeof DOMHandler}
|
||||
* @private
|
||||
* @readonly
|
||||
*/
|
||||
this.domHandler = options.domHandler || DOMHandler;
|
||||
|
||||
/**
|
||||
* A function that is invoked for every error that occurs during parsing.
|
||||
*
|
||||
* If it is not provided, all errors are reported to `console.error`
|
||||
* and only `fatalError`s are thrown as a `ParseError`,
|
||||
* which prevents any further processing.
|
||||
* If the provided method throws, a `ParserError` is thrown,
|
||||
* which prevents any further processing.
|
||||
*
|
||||
* Be aware that many `warning`s are considered an error that prevents further processing in
|
||||
* most implementations.
|
||||
*
|
||||
* @type {function(level:ErrorLevel, message:string, context: DOMHandler):void}
|
||||
* @see {@link onErrorStopParsing}
|
||||
* @see {@link onWarningStopParsing}
|
||||
*/
|
||||
this.onError = options.onError || options.errorHandler;
|
||||
if (options.errorHandler && typeof options.errorHandler !== 'function') {
|
||||
throw new TypeError('errorHandler object is no longer supported, switch to onError!');
|
||||
} else if (options.errorHandler) {
|
||||
options.errorHandler('warning', 'The `errorHandler` option has been deprecated, use `onError` instead!', this);
|
||||
}
|
||||
|
||||
/**
|
||||
* used to replace line endings before parsing, defaults to `normalizeLineEndings`
|
||||
*
|
||||
* @type {(string) => string}
|
||||
* @readonly
|
||||
*/
|
||||
this.normalizeLineEndings = options.normalizeLineEndings || normalizeLineEndings;
|
||||
|
||||
/**
|
||||
* Configures if the nodes created during parsing will have a `lineNumber` and a
|
||||
* `columnNumber`
|
||||
* attribute describing their location in the XML string.
|
||||
* Default is true.
|
||||
*
|
||||
* @type {boolean}
|
||||
* @readonly
|
||||
*/
|
||||
this.locator = !!options.locator;
|
||||
|
||||
/**
|
||||
* The default namespace can be provided by the key that is the empty string.
|
||||
* When the `mimeType` for HTML, XHTML or SVG are passed to `parseFromString`,
|
||||
* the default namespace that will be used,
|
||||
* will be overridden according to the specification.
|
||||
*
|
||||
* @type {Readonly<Object>}
|
||||
* @readonly
|
||||
*/
|
||||
this.xmlns = this.assign(Object.create(null), options.xmlns);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses `source` using the options in the way configured by the `DOMParserOptions` of `this`
|
||||
* `DOMParser`. If `mimeType` is `text/html` an HTML `Document` is created,
|
||||
* otherwise an XML `Document` is created.
|
||||
*
|
||||
* __It behaves different from the description in the living standard__:
|
||||
* - Uses the `options` passed to the `DOMParser` constructor to modify the behavior.
|
||||
* - Any unexpected input is reported to `onError` with either a `warning`,
|
||||
* `error` or `fatalError` level.
|
||||
* - Any `fatalError` throws a `ParseError` which prevents further processing.
|
||||
* - Any error thrown by `onError` is converted to a `ParseError` which prevents further
|
||||
* processing - If no `Document` was created during parsing it is reported as a `fatalError`.
|
||||
* *****Warning: By configuring a faulty DOMHandler implementation,
|
||||
* the specified behavior can completely be broken*****.
|
||||
*
|
||||
* @param {string} source
|
||||
* The XML mime type only allows string input!
|
||||
* @param {string} [mimeType='application/xml']
|
||||
* the mimeType or contentType of the document to be created determines the `type` of document
|
||||
* created (XML or HTML)
|
||||
* @returns {Document}
|
||||
* The `Document` node.
|
||||
* @throws {ParseError}
|
||||
* for any `fatalError` or anything that is thrown by `onError`
|
||||
* @throws {TypeError}
|
||||
* for any invalid `mimeType`
|
||||
* @see https://developer.mozilla.org/en-US/docs/Web/API/DOMParser/parseFromString
|
||||
* @see https://html.spec.whatwg.org/#dom-domparser-parsefromstring-dev
|
||||
*/
|
||||
DOMParser.prototype.parseFromString = function (source, mimeType) {
|
||||
if (!isValidMimeType(mimeType)) {
|
||||
throw new TypeError('DOMParser.parseFromString: the provided mimeType "' + mimeType + '" is not valid.');
|
||||
}
|
||||
var defaultNSMap = this.assign(Object.create(null), this.xmlns);
|
||||
var entityMap = entities.XML_ENTITIES;
|
||||
var defaultNamespace = defaultNSMap[''] || null;
|
||||
if (hasDefaultHTMLNamespace(mimeType)) {
|
||||
entityMap = entities.HTML_ENTITIES;
|
||||
defaultNamespace = NAMESPACE.HTML;
|
||||
} else if (mimeType === MIME_TYPE.XML_SVG_IMAGE) {
|
||||
defaultNamespace = NAMESPACE.SVG;
|
||||
}
|
||||
defaultNSMap[''] = defaultNamespace;
|
||||
defaultNSMap.xml = defaultNSMap.xml || NAMESPACE.XML;
|
||||
|
||||
var domBuilder = new this.domHandler({
|
||||
mimeType: mimeType,
|
||||
defaultNamespace: defaultNamespace,
|
||||
onError: this.onError,
|
||||
});
|
||||
var locator = this.locator ? {} : undefined;
|
||||
if (this.locator) {
|
||||
domBuilder.setDocumentLocator(locator);
|
||||
}
|
||||
|
||||
var sax = new XMLReader();
|
||||
sax.errorHandler = domBuilder;
|
||||
sax.domBuilder = domBuilder;
|
||||
var isXml = !conventions.isHTMLMimeType(mimeType);
|
||||
if (isXml && typeof source !== 'string') {
|
||||
sax.errorHandler.fatalError('source is not a string');
|
||||
}
|
||||
sax.parse(this.normalizeLineEndings(String(source)), defaultNSMap, entityMap);
|
||||
if (!domBuilder.doc.documentElement) {
|
||||
sax.errorHandler.fatalError('missing root element');
|
||||
}
|
||||
return domBuilder.doc;
|
||||
};
|
||||
|
||||
/**
|
||||
* @typedef DOMHandlerOptions
|
||||
* @property {string} [mimeType=MIME_TYPE.XML_APPLICATION]
|
||||
* @property {string | null} [defaultNamespace=null]
|
||||
*/
|
||||
/**
|
||||
* The class that is used to handle events from the SAX parser to create the related DOM
|
||||
* elements.
|
||||
*
|
||||
* Some methods are only implemented as an empty function,
|
||||
* since they are (at least currently) not relevant for xmldom.
|
||||
*
|
||||
* @class
|
||||
* @param {DOMHandlerOptions} [options]
|
||||
* @see http://www.saxproject.org/apidoc/org/xml/sax/ext/DefaultHandler2.html
|
||||
*/
|
||||
function DOMHandler(options) {
|
||||
var opt = options || {};
|
||||
/**
|
||||
* The mime type is used to determine if the DOM handler will create an XML or HTML document.
|
||||
* Only if it is set to `text/html` it will create an HTML document.
|
||||
* It defaults to MIME_TYPE.XML_APPLICATION.
|
||||
*
|
||||
* @type {string}
|
||||
* @see {@link MIME_TYPE}
|
||||
* @readonly
|
||||
*/
|
||||
this.mimeType = opt.mimeType || MIME_TYPE.XML_APPLICATION;
|
||||
|
||||
/**
|
||||
* The namespace to use to create an XML document.
|
||||
* For the following reasons this is required:
|
||||
* - The SAX API for `startDocument` doesn't offer any way to pass a namespace,
|
||||
* since at that point there is no way for the parser to know what the default namespace from
|
||||
* the document will be.
|
||||
* - When creating using `DOMImplementation.createDocument` it is required to pass a
|
||||
* namespace,
|
||||
* to determine the correct `Document.contentType`, which should match `this.mimeType`.
|
||||
* - When parsing an XML document with the `application/xhtml+xml` mimeType,
|
||||
* the HTML namespace needs to be the default namespace.
|
||||
*
|
||||
* @type {string | null}
|
||||
* @private
|
||||
* @readonly
|
||||
*/
|
||||
this.defaultNamespace = opt.defaultNamespace || null;
|
||||
|
||||
/**
|
||||
* @type {boolean}
|
||||
* @private
|
||||
*/
|
||||
this.cdata = false;
|
||||
|
||||
/**
|
||||
* The last `Element` that was created by `startElement`.
|
||||
* `endElement` sets it to the `currentElement.parentNode`.
|
||||
*
|
||||
* Note: The sax parser currently sets it to white space text nodes between tags.
|
||||
*
|
||||
* @type {Element | Node | undefined}
|
||||
* @private
|
||||
*/
|
||||
this.currentElement = undefined;
|
||||
|
||||
/**
|
||||
* The Document that is created as part of `startDocument`,
|
||||
* and returned by `DOMParser.parseFromString`.
|
||||
*
|
||||
* @type {Document | undefined}
|
||||
* @readonly
|
||||
*/
|
||||
this.doc = undefined;
|
||||
|
||||
/**
|
||||
* The locator is stored as part of setDocumentLocator.
|
||||
* It is controlled and mutated by the SAX parser to store the current parsing position.
|
||||
* It is used by DOMHandler to set `columnNumber` and `lineNumber`
|
||||
* on the DOM nodes.
|
||||
*
|
||||
* @type {Readonly<Locator> | undefined}
|
||||
* @private
|
||||
* @readonly (the
|
||||
* sax parser currently sometimes set's it)
|
||||
*/
|
||||
this.locator = undefined;
|
||||
/**
|
||||
* @type {function (level:ErrorLevel ,message:string, context:DOMHandler):void}
|
||||
* @readonly
|
||||
*/
|
||||
this.onError = opt.onError;
|
||||
}
|
||||
|
||||
function position(locator, node) {
|
||||
node.lineNumber = locator.lineNumber;
|
||||
node.columnNumber = locator.columnNumber;
|
||||
}
|
||||
|
||||
DOMHandler.prototype = {
|
||||
/**
|
||||
* Either creates an XML or an HTML document and stores it under `this.doc`.
|
||||
* If it is an XML document, `this.defaultNamespace` is used to create it,
|
||||
* and it will not contain any `childNodes`.
|
||||
* If it is an HTML document, it will be created without any `childNodes`.
|
||||
*
|
||||
* @see http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html
|
||||
*/
|
||||
startDocument: function () {
|
||||
var impl = new DOMImplementation();
|
||||
this.doc = isHTMLMimeType(this.mimeType) ? impl.createHTMLDocument(false) : impl.createDocument(this.defaultNamespace, '');
|
||||
},
|
||||
startElement: function (namespaceURI, localName, qName, attrs) {
|
||||
var doc = this.doc;
|
||||
var el = doc.createElementNS(namespaceURI, qName || localName);
|
||||
var len = attrs.length;
|
||||
appendElement(this, el);
|
||||
this.currentElement = el;
|
||||
|
||||
this.locator && position(this.locator, el);
|
||||
for (var i = 0; i < len; i++) {
|
||||
var namespaceURI = attrs.getURI(i);
|
||||
var value = attrs.getValue(i);
|
||||
var qName = attrs.getQName(i);
|
||||
var attr = doc.createAttributeNS(namespaceURI, qName);
|
||||
this.locator && position(attrs.getLocator(i), attr);
|
||||
attr.value = attr.nodeValue = value;
|
||||
el.setAttributeNode(attr);
|
||||
}
|
||||
},
|
||||
endElement: function (namespaceURI, localName, qName) {
|
||||
this.currentElement = this.currentElement.parentNode;
|
||||
},
|
||||
startPrefixMapping: function (prefix, uri) {},
|
||||
endPrefixMapping: function (prefix) {},
|
||||
processingInstruction: function (target, data) {
|
||||
var ins = this.doc.createProcessingInstruction(target, data);
|
||||
this.locator && position(this.locator, ins);
|
||||
appendElement(this, ins);
|
||||
},
|
||||
ignorableWhitespace: function (ch, start, length) {},
|
||||
characters: function (chars, start, length) {
|
||||
chars = _toString.apply(this, arguments);
|
||||
//console.log(chars)
|
||||
if (chars) {
|
||||
if (this.cdata) {
|
||||
var charNode = this.doc.createCDATASection(chars);
|
||||
} else {
|
||||
var charNode = this.doc.createTextNode(chars);
|
||||
}
|
||||
if (this.currentElement) {
|
||||
this.currentElement.appendChild(charNode);
|
||||
} else if (/^\s*$/.test(chars)) {
|
||||
this.doc.appendChild(charNode);
|
||||
//process xml
|
||||
}
|
||||
this.locator && position(this.locator, charNode);
|
||||
}
|
||||
},
|
||||
skippedEntity: function (name) {},
|
||||
endDocument: function () {
|
||||
this.doc.normalize();
|
||||
},
|
||||
/**
|
||||
* Stores the locator to be able to set the `columnNumber` and `lineNumber`
|
||||
* on the created DOM nodes.
|
||||
*
|
||||
* @param {Locator} locator
|
||||
*/
|
||||
setDocumentLocator: function (locator) {
|
||||
if (locator) {
|
||||
locator.lineNumber = 0;
|
||||
}
|
||||
this.locator = locator;
|
||||
},
|
||||
//LexicalHandler
|
||||
comment: function (chars, start, length) {
|
||||
chars = _toString.apply(this, arguments);
|
||||
var comm = this.doc.createComment(chars);
|
||||
this.locator && position(this.locator, comm);
|
||||
appendElement(this, comm);
|
||||
},
|
||||
|
||||
startCDATA: function () {
|
||||
//used in characters() methods
|
||||
this.cdata = true;
|
||||
},
|
||||
endCDATA: function () {
|
||||
this.cdata = false;
|
||||
},
|
||||
|
||||
startDTD: function (name, publicId, systemId, internalSubset) {
|
||||
var impl = this.doc.implementation;
|
||||
if (impl && impl.createDocumentType) {
|
||||
var dt = impl.createDocumentType(name, publicId, systemId, internalSubset);
|
||||
this.locator && position(this.locator, dt);
|
||||
appendElement(this, dt);
|
||||
this.doc.doctype = dt;
|
||||
}
|
||||
},
|
||||
reportError: function (level, message) {
|
||||
if (typeof this.onError === 'function') {
|
||||
try {
|
||||
this.onError(level, message, this);
|
||||
} catch (e) {
|
||||
throw new ParseError('Reporting ' + level + ' "' + message + '" caused ' + e, this.locator);
|
||||
}
|
||||
} else {
|
||||
console.error('[xmldom ' + level + ']\t' + message, _locator(this.locator));
|
||||
}
|
||||
},
|
||||
/**
|
||||
* @see http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html
|
||||
*/
|
||||
warning: function (message) {
|
||||
this.reportError('warning', message);
|
||||
},
|
||||
error: function (message) {
|
||||
this.reportError('error', message);
|
||||
},
|
||||
/**
|
||||
* This function reports a fatal error and throws a ParseError.
|
||||
*
|
||||
* @param {string} message
|
||||
* - The message to be used for reporting and throwing the error.
|
||||
* @returns {never}
|
||||
* This function always throws an error and never returns a value.
|
||||
* @throws {ParseError}
|
||||
* Always throws a ParseError with the provided message.
|
||||
*/
|
||||
fatalError: function (message) {
|
||||
this.reportError('fatalError', message);
|
||||
throw new ParseError(message, this.locator);
|
||||
},
|
||||
};
|
||||
|
||||
function _locator(l) {
|
||||
if (l) {
|
||||
return '\n@#[line:' + l.lineNumber + ',col:' + l.columnNumber + ']';
|
||||
}
|
||||
}
|
||||
|
||||
function _toString(chars, start, length) {
|
||||
if (typeof chars == 'string') {
|
||||
return chars.substr(start, length);
|
||||
} else {
|
||||
//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)")
|
||||
if (chars.length >= start + length || start) {
|
||||
return new java.lang.String(chars, start, length) + '';
|
||||
}
|
||||
return chars;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html
|
||||
* used method of org.xml.sax.ext.LexicalHandler:
|
||||
* #comment(chars, start, length)
|
||||
* #startCDATA()
|
||||
* #endCDATA()
|
||||
* #startDTD(name, publicId, systemId)
|
||||
*
|
||||
*
|
||||
* IGNORED method of org.xml.sax.ext.LexicalHandler:
|
||||
* #endDTD()
|
||||
* #startEntity(name)
|
||||
* #endEntity(name)
|
||||
*
|
||||
*
|
||||
* @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html
|
||||
* IGNORED method of org.xml.sax.ext.DeclHandler
|
||||
* #attributeDecl(eName, aName, type, mode, value)
|
||||
* #elementDecl(name, model)
|
||||
* #externalEntityDecl(name, publicId, systemId)
|
||||
* #internalEntityDecl(name, value)
|
||||
* @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html
|
||||
* IGNORED method of org.xml.sax.EntityResolver2
|
||||
* #resolveEntity(String name,String publicId,String baseURI,String systemId)
|
||||
* #resolveEntity(publicId, systemId)
|
||||
* #getExternalSubset(name, baseURI)
|
||||
* @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html
|
||||
* IGNORED method of org.xml.sax.DTDHandler
|
||||
* #notationDecl(name, publicId, systemId) {};
|
||||
* #unparsedEntityDecl(name, publicId, systemId, notationName) {};
|
||||
*/
|
||||
'endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl'.replace(
|
||||
/\w+/g,
|
||||
function (key) {
|
||||
DOMHandler.prototype[key] = function () {
|
||||
return null;
|
||||
};
|
||||
}
|
||||
);
|
||||
|
||||
/* Private static helpers treated below as private instance methods, so don't need to add these to the public API; we might use a Relator to also get rid of non-standard public properties */
|
||||
function appendElement(handler, node) {
|
||||
if (!handler.currentElement) {
|
||||
handler.doc.appendChild(node);
|
||||
} else {
|
||||
handler.currentElement.appendChild(node);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A method that prevents any further parsing when an `error`
|
||||
* with level `error` is reported during parsing.
|
||||
*
|
||||
* @see {@link DOMParserOptions.onError}
|
||||
* @see {@link onWarningStopParsing}
|
||||
*/
|
||||
function onErrorStopParsing(level) {
|
||||
if (level === 'error') throw 'onErrorStopParsing';
|
||||
}
|
||||
|
||||
/**
|
||||
* A method that prevents any further parsing when any `error` is reported during parsing.
|
||||
*
|
||||
* @see {@link DOMParserOptions.onError}
|
||||
* @see {@link onErrorStopParsing}
|
||||
*/
|
||||
function onWarningStopParsing() {
|
||||
throw 'onWarningStopParsing';
|
||||
}
|
||||
|
||||
exports.__DOMHandler = DOMHandler;
|
||||
exports.DOMParser = DOMParser;
|
||||
exports.normalizeLineEndings = normalizeLineEndings;
|
||||
exports.onErrorStopParsing = onErrorStopParsing;
|
||||
exports.onWarningStopParsing = onWarningStopParsing;
|
||||
3135
node_modules/@xmldom/xmldom/lib/dom.js
generated
vendored
Normal file
3135
node_modules/@xmldom/xmldom/lib/dom.js
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
2171
node_modules/@xmldom/xmldom/lib/entities.js
generated
vendored
Normal file
2171
node_modules/@xmldom/xmldom/lib/entities.js
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
202
node_modules/@xmldom/xmldom/lib/errors.js
generated
vendored
Normal file
202
node_modules/@xmldom/xmldom/lib/errors.js
generated
vendored
Normal file
@@ -0,0 +1,202 @@
|
||||
'use strict';
|
||||
|
||||
var conventions = require('./conventions');
|
||||
|
||||
function extendError(constructor, writableName) {
|
||||
constructor.prototype = Object.create(Error.prototype, {
|
||||
constructor: { value: constructor },
|
||||
name: { value: constructor.name, enumerable: true, writable: writableName },
|
||||
});
|
||||
}
|
||||
|
||||
var DOMExceptionName = conventions.freeze({
|
||||
/**
|
||||
* the default value as defined by the spec
|
||||
*/
|
||||
Error: 'Error',
|
||||
/**
|
||||
* @deprecated
|
||||
* Use RangeError instead.
|
||||
*/
|
||||
IndexSizeError: 'IndexSizeError',
|
||||
/**
|
||||
* @deprecated
|
||||
* Just to match the related static code, not part of the spec.
|
||||
*/
|
||||
DomstringSizeError: 'DomstringSizeError',
|
||||
HierarchyRequestError: 'HierarchyRequestError',
|
||||
WrongDocumentError: 'WrongDocumentError',
|
||||
InvalidCharacterError: 'InvalidCharacterError',
|
||||
/**
|
||||
* @deprecated
|
||||
* Just to match the related static code, not part of the spec.
|
||||
*/
|
||||
NoDataAllowedError: 'NoDataAllowedError',
|
||||
NoModificationAllowedError: 'NoModificationAllowedError',
|
||||
NotFoundError: 'NotFoundError',
|
||||
NotSupportedError: 'NotSupportedError',
|
||||
InUseAttributeError: 'InUseAttributeError',
|
||||
InvalidStateError: 'InvalidStateError',
|
||||
SyntaxError: 'SyntaxError',
|
||||
InvalidModificationError: 'InvalidModificationError',
|
||||
NamespaceError: 'NamespaceError',
|
||||
/**
|
||||
* @deprecated
|
||||
* Use TypeError for invalid arguments,
|
||||
* "NotSupportedError" DOMException for unsupported operations,
|
||||
* and "NotAllowedError" DOMException for denied requests instead.
|
||||
*/
|
||||
InvalidAccessError: 'InvalidAccessError',
|
||||
/**
|
||||
* @deprecated
|
||||
* Just to match the related static code, not part of the spec.
|
||||
*/
|
||||
ValidationError: 'ValidationError',
|
||||
/**
|
||||
* @deprecated
|
||||
* Use TypeError instead.
|
||||
*/
|
||||
TypeMismatchError: 'TypeMismatchError',
|
||||
SecurityError: 'SecurityError',
|
||||
NetworkError: 'NetworkError',
|
||||
AbortError: 'AbortError',
|
||||
/**
|
||||
* @deprecated
|
||||
* Just to match the related static code, not part of the spec.
|
||||
*/
|
||||
URLMismatchError: 'URLMismatchError',
|
||||
QuotaExceededError: 'QuotaExceededError',
|
||||
TimeoutError: 'TimeoutError',
|
||||
InvalidNodeTypeError: 'InvalidNodeTypeError',
|
||||
DataCloneError: 'DataCloneError',
|
||||
EncodingError: 'EncodingError',
|
||||
NotReadableError: 'NotReadableError',
|
||||
UnknownError: 'UnknownError',
|
||||
ConstraintError: 'ConstraintError',
|
||||
DataError: 'DataError',
|
||||
TransactionInactiveError: 'TransactionInactiveError',
|
||||
ReadOnlyError: 'ReadOnlyError',
|
||||
VersionError: 'VersionError',
|
||||
OperationError: 'OperationError',
|
||||
NotAllowedError: 'NotAllowedError',
|
||||
OptOutError: 'OptOutError',
|
||||
});
|
||||
var DOMExceptionNames = Object.keys(DOMExceptionName);
|
||||
|
||||
function isValidDomExceptionCode(value) {
|
||||
return typeof value === 'number' && value >= 1 && value <= 25;
|
||||
}
|
||||
function endsWithError(value) {
|
||||
return typeof value === 'string' && value.substring(value.length - DOMExceptionName.Error.length) === DOMExceptionName.Error;
|
||||
}
|
||||
/**
|
||||
* DOM operations only raise exceptions in "exceptional" circumstances, i.e., when an operation
|
||||
* is impossible to perform (either for logical reasons, because data is lost, or because the
|
||||
* implementation has become unstable). In general, DOM methods return specific error values in
|
||||
* ordinary processing situations, such as out-of-bound errors when using NodeList.
|
||||
*
|
||||
* Implementations should raise other exceptions under other circumstances. For example,
|
||||
* implementations should raise an implementation-dependent exception if a null argument is
|
||||
* passed when null was not expected.
|
||||
*
|
||||
* This implementation supports the following usages:
|
||||
* 1. according to the living standard (both arguments are optional):
|
||||
* ```
|
||||
* new DOMException("message (can be empty)", DOMExceptionNames.HierarchyRequestError)
|
||||
* ```
|
||||
* 2. according to previous xmldom implementation (only the first argument is required):
|
||||
* ```
|
||||
* new DOMException(DOMException.HIERARCHY_REQUEST_ERR, "optional message")
|
||||
* ```
|
||||
* both result in the proper name being set.
|
||||
*
|
||||
* @class DOMException
|
||||
* @param {number | string} messageOrCode
|
||||
* The reason why an operation is not acceptable.
|
||||
* If it is a number, it is used to determine the `name`, see
|
||||
* {@link https://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-258A00AF ExceptionCode}
|
||||
* @param {string | keyof typeof DOMExceptionName | Error} [nameOrMessage]
|
||||
* The `name` to use for the error.
|
||||
* If `messageOrCode` is a number, this arguments is used as the `message` instead.
|
||||
* @augments Error
|
||||
* @see https://webidl.spec.whatwg.org/#idl-DOMException
|
||||
* @see https://webidl.spec.whatwg.org/#dfn-error-names-table
|
||||
* @see https://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-17189187
|
||||
* @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html
|
||||
* @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html
|
||||
*/
|
||||
function DOMException(messageOrCode, nameOrMessage) {
|
||||
// support old way of passing arguments: first argument is a valid number
|
||||
if (isValidDomExceptionCode(messageOrCode)) {
|
||||
this.name = DOMExceptionNames[messageOrCode];
|
||||
this.message = nameOrMessage || '';
|
||||
} else {
|
||||
this.message = messageOrCode;
|
||||
this.name = endsWithError(nameOrMessage) ? nameOrMessage : DOMExceptionName.Error;
|
||||
}
|
||||
if (Error.captureStackTrace) Error.captureStackTrace(this, DOMException);
|
||||
}
|
||||
extendError(DOMException, true);
|
||||
Object.defineProperties(DOMException.prototype, {
|
||||
code: {
|
||||
enumerable: true,
|
||||
get: function () {
|
||||
var code = DOMExceptionNames.indexOf(this.name);
|
||||
if (isValidDomExceptionCode(code)) return code;
|
||||
return 0;
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
var ExceptionCode = {
|
||||
INDEX_SIZE_ERR: 1,
|
||||
DOMSTRING_SIZE_ERR: 2,
|
||||
HIERARCHY_REQUEST_ERR: 3,
|
||||
WRONG_DOCUMENT_ERR: 4,
|
||||
INVALID_CHARACTER_ERR: 5,
|
||||
NO_DATA_ALLOWED_ERR: 6,
|
||||
NO_MODIFICATION_ALLOWED_ERR: 7,
|
||||
NOT_FOUND_ERR: 8,
|
||||
NOT_SUPPORTED_ERR: 9,
|
||||
INUSE_ATTRIBUTE_ERR: 10,
|
||||
INVALID_STATE_ERR: 11,
|
||||
SYNTAX_ERR: 12,
|
||||
INVALID_MODIFICATION_ERR: 13,
|
||||
NAMESPACE_ERR: 14,
|
||||
INVALID_ACCESS_ERR: 15,
|
||||
VALIDATION_ERR: 16,
|
||||
TYPE_MISMATCH_ERR: 17,
|
||||
SECURITY_ERR: 18,
|
||||
NETWORK_ERR: 19,
|
||||
ABORT_ERR: 20,
|
||||
URL_MISMATCH_ERR: 21,
|
||||
QUOTA_EXCEEDED_ERR: 22,
|
||||
TIMEOUT_ERR: 23,
|
||||
INVALID_NODE_TYPE_ERR: 24,
|
||||
DATA_CLONE_ERR: 25,
|
||||
};
|
||||
|
||||
var entries = Object.entries(ExceptionCode);
|
||||
for (var i = 0; i < entries.length; i++) {
|
||||
var key = entries[i][0];
|
||||
DOMException[key] = entries[i][1];
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an error that will not be caught by XMLReader aka the SAX parser.
|
||||
*
|
||||
* @class
|
||||
* @param {string} message
|
||||
* @param {any} [locator]
|
||||
*/
|
||||
function ParseError(message, locator) {
|
||||
this.message = message;
|
||||
this.locator = locator;
|
||||
if (Error.captureStackTrace) Error.captureStackTrace(this, ParseError);
|
||||
}
|
||||
extendError(ParseError);
|
||||
|
||||
exports.DOMException = DOMException;
|
||||
exports.DOMExceptionName = DOMExceptionName;
|
||||
exports.ExceptionCode = ExceptionCode;
|
||||
exports.ParseError = ParseError;
|
||||
533
node_modules/@xmldom/xmldom/lib/grammar.js
generated
vendored
Normal file
533
node_modules/@xmldom/xmldom/lib/grammar.js
generated
vendored
Normal file
@@ -0,0 +1,533 @@
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
* Detects relevant unicode support for regular expressions in the runtime.
|
||||
* Should the runtime not accepts the flag `u` or unicode ranges,
|
||||
* character classes without unicode handling will be used.
|
||||
*
|
||||
* @param {typeof RegExp} [RegExpImpl=RegExp]
|
||||
* For testing: the RegExp class.
|
||||
* @returns {boolean}
|
||||
* @see https://node.green/#ES2015-syntax-RegExp--y--and--u--flags
|
||||
*/
|
||||
function detectUnicodeSupport(RegExpImpl) {
|
||||
try {
|
||||
if (typeof RegExpImpl !== 'function') {
|
||||
RegExpImpl = RegExp;
|
||||
}
|
||||
// eslint-disable-next-line es5/no-unicode-regex,es5/no-unicode-code-point-escape
|
||||
var match = new RegExpImpl('\u{1d306}', 'u').exec('𝌆');
|
||||
return !!match && match[0].length === 2;
|
||||
} catch (error) {}
|
||||
return false;
|
||||
}
|
||||
var UNICODE_SUPPORT = detectUnicodeSupport();
|
||||
|
||||
/**
|
||||
* Removes `[`, `]` and any trailing quantifiers from the source of a RegExp.
|
||||
*
|
||||
* @param {RegExp} regexp
|
||||
*/
|
||||
function chars(regexp) {
|
||||
if (regexp.source[0] !== '[') {
|
||||
throw new Error(regexp + ' can not be used with chars');
|
||||
}
|
||||
return regexp.source.slice(1, regexp.source.lastIndexOf(']'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new character list regular expression,
|
||||
* by removing `search` from the source of `regexp`.
|
||||
*
|
||||
* @param {RegExp} regexp
|
||||
* @param {string} search
|
||||
* The character(s) to remove.
|
||||
* @returns {RegExp}
|
||||
*/
|
||||
function chars_without(regexp, search) {
|
||||
if (regexp.source[0] !== '[') {
|
||||
throw new Error('/' + regexp.source + '/ can not be used with chars_without');
|
||||
}
|
||||
if (!search || typeof search !== 'string') {
|
||||
throw new Error(JSON.stringify(search) + ' is not a valid search');
|
||||
}
|
||||
if (regexp.source.indexOf(search) === -1) {
|
||||
throw new Error('"' + search + '" is not is /' + regexp.source + '/');
|
||||
}
|
||||
if (search === '-' && regexp.source.indexOf(search) !== 1) {
|
||||
throw new Error('"' + search + '" is not at the first postion of /' + regexp.source + '/');
|
||||
}
|
||||
return new RegExp(regexp.source.replace(search, ''), UNICODE_SUPPORT ? 'u' : '');
|
||||
}
|
||||
|
||||
/**
|
||||
* Combines and Regular expressions correctly by using `RegExp.source`.
|
||||
*
|
||||
* @param {...(RegExp | string)[]} args
|
||||
* @returns {RegExp}
|
||||
*/
|
||||
function reg(args) {
|
||||
var self = this;
|
||||
return new RegExp(
|
||||
Array.prototype.slice
|
||||
.call(arguments)
|
||||
.map(function (part) {
|
||||
var isStr = typeof part === 'string';
|
||||
if (isStr && self === undefined && part === '|') {
|
||||
throw new Error('use regg instead of reg to wrap expressions with `|`!');
|
||||
}
|
||||
return isStr ? part : part.source;
|
||||
})
|
||||
.join(''),
|
||||
UNICODE_SUPPORT ? 'mu' : 'm'
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Like `reg` but wraps the expression in `(?:`,`)` to create a non tracking group.
|
||||
*
|
||||
* @param {...(RegExp | string)[]} args
|
||||
* @returns {RegExp}
|
||||
*/
|
||||
function regg(args) {
|
||||
if (arguments.length === 0) {
|
||||
throw new Error('no parameters provided');
|
||||
}
|
||||
return reg.apply(regg, ['(?:'].concat(Array.prototype.slice.call(arguments), [')']));
|
||||
}
|
||||
|
||||
// /**
|
||||
// * Append ^ to the beginning of the expression.
|
||||
// * @param {...(RegExp | string)[]} args
|
||||
// * @returns {RegExp}
|
||||
// */
|
||||
// function reg_start(args) {
|
||||
// if (arguments.length === 0) {
|
||||
// throw new Error('no parameters provided');
|
||||
// }
|
||||
// return reg.apply(reg_start, ['^'].concat(Array.prototype.slice.call(arguments)));
|
||||
// }
|
||||
|
||||
// https://www.w3.org/TR/xml/#document
|
||||
// `[1] document ::= prolog element Misc*`
|
||||
// https://www.w3.org/TR/xml11/#NT-document
|
||||
// `[1] document ::= ( prolog element Misc* ) - ( Char* RestrictedChar Char* )`
|
||||
|
||||
/**
|
||||
* A character usually appearing in wrongly converted strings.
|
||||
*
|
||||
* @type {string}
|
||||
* @see https://en.wikipedia.org/wiki/Specials_(Unicode_block)#Replacement_character
|
||||
* @see https://nodejs.dev/en/api/v18/buffer/#buffers-and-character-encodings
|
||||
* @see https://www.unicode.org/faq/utf_bom.html#BOM
|
||||
* @readonly
|
||||
*/
|
||||
var UNICODE_REPLACEMENT_CHARACTER = '\uFFFD';
|
||||
// https://www.w3.org/TR/xml/#NT-Char
|
||||
// any Unicode character, excluding the surrogate blocks, FFFE, and FFFF.
|
||||
// `[2] Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]`
|
||||
// https://www.w3.org/TR/xml11/#NT-Char
|
||||
// `[2] Char ::= [#x1-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]`
|
||||
// https://www.w3.org/TR/xml11/#NT-RestrictedChar
|
||||
// `[2a] RestrictedChar ::= [#x1-#x8] | [#xB-#xC] | [#xE-#x1F] | [#x7F-#x84] | [#x86-#x9F]`
|
||||
// https://www.w3.org/TR/xml11/#charsets
|
||||
var Char = /[-\x09\x0A\x0D\x20-\x2C\x2E-\uD7FF\uE000-\uFFFD]/; // without \u10000-\uEFFFF
|
||||
if (UNICODE_SUPPORT) {
|
||||
// eslint-disable-next-line es5/no-unicode-code-point-escape
|
||||
Char = reg('[', chars(Char), '\\u{10000}-\\u{10FFFF}', ']');
|
||||
}
|
||||
|
||||
var _SChar = /[\x20\x09\x0D\x0A]/;
|
||||
var SChar_s = chars(_SChar);
|
||||
// https://www.w3.org/TR/xml11/#NT-S
|
||||
// `[3] S ::= (#x20 | #x9 | #xD | #xA)+`
|
||||
var S = reg(_SChar, '+');
|
||||
// optional whitespace described as `S?` in the grammar,
|
||||
// simplified to 0-n occurrences of the character class
|
||||
// instead of 0-1 occurrences of a non-capturing group around S
|
||||
var S_OPT = reg(_SChar, '*');
|
||||
|
||||
// https://www.w3.org/TR/xml11/#NT-NameStartChar
|
||||
// `[4] NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]`
|
||||
var NameStartChar =
|
||||
/[:_a-zA-Z\xC0-\xD6\xD8-\xF6\xF8-\u02FF\u0370-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/; // without \u10000-\uEFFFF
|
||||
if (UNICODE_SUPPORT) {
|
||||
// eslint-disable-next-line es5/no-unicode-code-point-escape
|
||||
NameStartChar = reg('[', chars(NameStartChar), '\\u{10000}-\\u{10FFFF}', ']');
|
||||
}
|
||||
var NameStartChar_s = chars(NameStartChar);
|
||||
|
||||
// https://www.w3.org/TR/xml11/#NT-NameChar
|
||||
// `[4a] NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]`
|
||||
var NameChar = reg('[', NameStartChar_s, chars(/[-.0-9\xB7]/), chars(/[\u0300-\u036F\u203F-\u2040]/), ']');
|
||||
// https://www.w3.org/TR/xml11/#NT-Name
|
||||
// `[5] Name ::= NameStartChar (NameChar)*`
|
||||
var Name = reg(NameStartChar, NameChar, '*');
|
||||
/*
|
||||
https://www.w3.org/TR/xml11/#NT-Names
|
||||
`[6] Names ::= Name (#x20 Name)*`
|
||||
*/
|
||||
|
||||
// https://www.w3.org/TR/xml11/#NT-Nmtoken
|
||||
// `[7] Nmtoken ::= (NameChar)+`
|
||||
var Nmtoken = reg(NameChar, '+');
|
||||
/*
|
||||
https://www.w3.org/TR/xml11/#NT-Nmtokens
|
||||
`[8] Nmtokens ::= Nmtoken (#x20 Nmtoken)*`
|
||||
var Nmtokens = reg(Nmtoken, regg(/\x20/, Nmtoken), '*');
|
||||
*/
|
||||
|
||||
// https://www.w3.org/TR/xml11/#NT-EntityRef
|
||||
// `[68] EntityRef ::= '&' Name ';'` [WFC: Entity Declared] [VC: Entity Declared] [WFC: Parsed Entity] [WFC: No Recursion]
|
||||
var EntityRef = reg('&', Name, ';');
|
||||
// https://www.w3.org/TR/xml11/#NT-CharRef
|
||||
// `[66] CharRef ::= '&#' [0-9]+ ';' | '&#x' [0-9a-fA-F]+ ';'` [WFC: Legal Character]
|
||||
var CharRef = regg(/&#[0-9]+;|&#x[0-9a-fA-F]+;/);
|
||||
|
||||
/*
|
||||
https://www.w3.org/TR/xml11/#NT-Reference
|
||||
- `[67] Reference ::= EntityRef | CharRef`
|
||||
- `[66] CharRef ::= '&#' [0-9]+ ';' | '&#x' [0-9a-fA-F]+ ';'` [WFC: Legal Character]
|
||||
- `[68] EntityRef ::= '&' Name ';'` [WFC: Entity Declared] [VC: Entity Declared] [WFC: Parsed Entity] [WFC: No Recursion]
|
||||
*/
|
||||
var Reference = regg(EntityRef, '|', CharRef);
|
||||
|
||||
// https://www.w3.org/TR/xml11/#NT-PEReference
|
||||
// `[69] PEReference ::= '%' Name ';'`
|
||||
// [VC: Entity Declared] [WFC: No Recursion] [WFC: In DTD]
|
||||
var PEReference = reg('%', Name, ';');
|
||||
|
||||
// https://www.w3.org/TR/xml11/#NT-EntityValue
|
||||
// `[9] EntityValue ::= '"' ([^%&"] | PEReference | Reference)* '"' | "'" ([^%&'] | PEReference | Reference)* "'"`
|
||||
var EntityValue = regg(
|
||||
reg('"', regg(/[^%&"]/, '|', PEReference, '|', Reference), '*', '"'),
|
||||
'|',
|
||||
reg("'", regg(/[^%&']/, '|', PEReference, '|', Reference), '*', "'")
|
||||
);
|
||||
|
||||
// https://www.w3.org/TR/xml11/#NT-AttValue
|
||||
// `[10] AttValue ::= '"' ([^<&"] | Reference)* '"' | "'" ([^<&'] | Reference)* "'"`
|
||||
var AttValue = regg('"', regg(/[^<&"]/, '|', Reference), '*', '"', '|', "'", regg(/[^<&']/, '|', Reference), '*', "'");
|
||||
|
||||
// https://www.w3.org/TR/xml-names/#ns-decl
|
||||
// https://www.w3.org/TR/xml-names/#ns-qualnames
|
||||
// NameStartChar without ":"
|
||||
var NCNameStartChar = chars_without(NameStartChar, ':');
|
||||
// https://www.w3.org/TR/xml-names/#orphans
|
||||
// `[5] NCNameChar ::= NameChar - ':'`
|
||||
// An XML NameChar, minus the ":"
|
||||
var NCNameChar = chars_without(NameChar, ':');
|
||||
// https://www.w3.org/TR/xml-names/#NT-NCName
|
||||
// `[4] NCName ::= Name - (Char* ':' Char*)`
|
||||
// An XML Name, minus the ":"
|
||||
var NCName = reg(NCNameStartChar, NCNameChar, '*');
|
||||
|
||||
/**
|
||||
https://www.w3.org/TR/xml-names/#ns-qualnames
|
||||
|
||||
```
|
||||
[7] QName ::= PrefixedName | UnprefixedName
|
||||
=== (NCName ':' NCName) | NCName
|
||||
=== NCName (':' NCName)?
|
||||
[8] PrefixedName ::= Prefix ':' LocalPart
|
||||
=== NCName ':' NCName
|
||||
[9] UnprefixedName ::= LocalPart
|
||||
=== NCName
|
||||
[10] Prefix ::= NCName
|
||||
[11] LocalPart ::= NCName
|
||||
```
|
||||
*/
|
||||
var QName = reg(NCName, regg(':', NCName), '?');
|
||||
var QName_exact = reg('^', QName, '$');
|
||||
var QName_group = reg('(', QName, ')');
|
||||
|
||||
// https://www.w3.org/TR/xml11/#NT-SystemLiteral
|
||||
// `[11] SystemLiteral ::= ('"' [^"]* '"') | ("'" [^']* "'")`
|
||||
var SystemLiteral = regg(/"[^"]*"|'[^']*'/);
|
||||
|
||||
/*
|
||||
https://www.w3.org/TR/xml11/#NT-PI
|
||||
```
|
||||
[17] PITarget ::= Name - (('X' | 'x') ('M' | 'm') ('L' | 'l'))
|
||||
[16] PI ::= '<?' PITarget (S (Char* - (Char* '?>' Char*)))? '?>'
|
||||
```
|
||||
target /xml/i is not excluded!
|
||||
*/
|
||||
var PI = reg(/^<\?/, '(', Name, ')', regg(S, '(', Char, '*?)'), '?', /\?>/);
|
||||
|
||||
// https://www.w3.org/TR/xml11/#NT-PubidChar
|
||||
// `[13] PubidChar ::= #x20 | #xD | #xA | [a-zA-Z0-9] | [-'()+,./:=?;!*#@$_%]`
|
||||
var PubidChar = /[\x20\x0D\x0Aa-zA-Z0-9-'()+,./:=?;!*#@$_%]/;
|
||||
|
||||
// https://www.w3.org/TR/xml11/#NT-PubidLiteral
|
||||
// `[12] PubidLiteral ::= '"' PubidChar* '"' | "'" (PubidChar - "'")* "'"`
|
||||
var PubidLiteral = regg('"', PubidChar, '*"', '|', "'", chars_without(PubidChar, "'"), "*'");
|
||||
|
||||
// https://www.w3.org/TR/xml11/#NT-CharData
|
||||
// `[14] CharData ::= [^<&]* - ([^<&]* ']]>' [^<&]*)`
|
||||
|
||||
var COMMENT_START = '<!--';
|
||||
var COMMENT_END = '-->';
|
||||
// https://www.w3.org/TR/xml11/#NT-Comment
|
||||
// `[15] Comment ::= '<!--' ((Char - '-') | ('-' (Char - '-')))* '-->'`
|
||||
var Comment = reg(COMMENT_START, regg(chars_without(Char, '-'), '|', reg('-', chars_without(Char, '-'))), '*', COMMENT_END);
|
||||
|
||||
var PCDATA = '#PCDATA';
|
||||
// https://www.w3.org/TR/xml11/#NT-Mixed
|
||||
// `[51] Mixed ::= '(' S? '#PCDATA' (S? '|' S? Name)* S? ')*' | '(' S? '#PCDATA' S? ')'`
|
||||
// https://www.w3.org/TR/xml-names/#NT-Mixed
|
||||
// `[51] Mixed ::= '(' S? '#PCDATA' (S? '|' S? QName)* S? ')*' | '(' S? '#PCDATA' S? ')'`
|
||||
// [VC: Proper Group/PE Nesting] [VC: No Duplicate Types]
|
||||
var Mixed = regg(
|
||||
reg(/\(/, S_OPT, PCDATA, regg(S_OPT, /\|/, S_OPT, QName), '*', S_OPT, /\)\*/),
|
||||
'|',
|
||||
reg(/\(/, S_OPT, PCDATA, S_OPT, /\)/)
|
||||
);
|
||||
|
||||
var _children_quantity = /[?*+]?/;
|
||||
/*
|
||||
`[49] choice ::= '(' S? cp ( S? '|' S? cp )+ S? ')'` [VC: Proper Group/PE Nesting]
|
||||
`[50] seq ::= '(' S? cp ( S? ',' S? cp )* S? ')'` [VC: Proper Group/PE Nesting]
|
||||
simplification to solve circular referencing, but doesn't check validity constraint "Proper Group/PE Nesting"
|
||||
var _choice_or_seq = reg('[', NameChar_s, SChar_s, chars(_children_quantity), '()|,]*');
|
||||
```
|
||||
[48] cp ::= (Name | choice | seq) ('?' | '*' | '+')?
|
||||
=== (Name | '(' S? cp ( S? '|' S? cp )+ S? ')' | '(' S? cp ( S? ',' S? cp )* S? ')') ('?' | '*' | '+')?
|
||||
!== (Name | [_choice_or_seq]*) ('?' | '*' | '+')?
|
||||
```
|
||||
simplification to solve circular referencing, but doesn't check validity constraint "Proper Group/PE Nesting"
|
||||
var cp = reg(regg(Name, '|', _choice_or_seq), _children_quantity);
|
||||
*/
|
||||
/*
|
||||
Inefficient regular expression (High)
|
||||
This part of the regular expression may cause exponential backtracking on strings starting with '(|' and containing many repetitions of '|'.
|
||||
https://github.com/xmldom/xmldom/security/code-scanning/91
|
||||
var choice = regg(/\(/, S_OPT, cp, regg(S_OPT, /\|/, S_OPT, cp), '+', S_OPT, /\)/);
|
||||
*/
|
||||
/*
|
||||
Inefficient regular expression (High)
|
||||
This part of the regular expression may cause exponential backtracking on strings starting with '(,' and containing many repetitions of ','.
|
||||
https://github.com/xmldom/xmldom/security/code-scanning/92
|
||||
var seq = regg(/\(/, S_OPT, cp, regg(S_OPT, /,/, S_OPT, cp), '*', S_OPT, /\)/);
|
||||
*/
|
||||
|
||||
// `[47] children ::= (choice | seq) ('?' | '*' | '+')?`
|
||||
// simplification to solve circular referencing, but doesn't check validity constraint "Proper Group/PE Nesting"
|
||||
var children = reg(/\([^>]+\)/, _children_quantity /*regg(choice, '|', seq), _children_quantity*/);
|
||||
|
||||
// https://www.w3.org/TR/xml11/#NT-contentspec
|
||||
// `[46] contentspec ::= 'EMPTY' | 'ANY' | Mixed | children`
|
||||
var contentspec = regg('EMPTY', '|', 'ANY', '|', Mixed, '|', children);
|
||||
|
||||
var ELEMENTDECL_START = '<!ELEMENT';
|
||||
// https://www.w3.org/TR/xml11/#NT-elementdecl
|
||||
// `[45] elementdecl ::= '<!ELEMENT' S Name S contentspec S? '>'`
|
||||
// https://www.w3.org/TR/xml-names/#NT-elementdecl
|
||||
// `[17] elementdecl ::= '<!ELEMENT' S QName S contentspec S? '>'`
|
||||
// because of https://www.w3.org/TR/xml11/#NT-PEReference
|
||||
// since xmldom is not supporting replacements of PEReferences in the DTD
|
||||
// this also supports PEReference in the possible places
|
||||
var elementdecl = reg(ELEMENTDECL_START, S, regg(QName, '|', PEReference), S, regg(contentspec, '|', PEReference), S_OPT, '>');
|
||||
|
||||
// https://www.w3.org/TR/xml11/#NT-NotationType
|
||||
// `[58] NotationType ::= 'NOTATION' S '(' S? Name (S? '|' S? Name)* S? ')'`
|
||||
// [VC: Notation Attributes] [VC: One Notation Per Element Type] [VC: No Notation on Empty Element] [VC: No Duplicate Tokens]
|
||||
var NotationType = reg('NOTATION', S, /\(/, S_OPT, Name, regg(S_OPT, /\|/, S_OPT, Name), '*', S_OPT, /\)/);
|
||||
// https://www.w3.org/TR/xml11/#NT-Enumeration
|
||||
// `[59] Enumeration ::= '(' S? Nmtoken (S? '|' S? Nmtoken)* S? ')'`
|
||||
// [VC: Enumeration] [VC: No Duplicate Tokens]
|
||||
var Enumeration = reg(/\(/, S_OPT, Nmtoken, regg(S_OPT, /\|/, S_OPT, Nmtoken), '*', S_OPT, /\)/);
|
||||
|
||||
// https://www.w3.org/TR/xml11/#NT-EnumeratedType
|
||||
// `[57] EnumeratedType ::= NotationType | Enumeration`
|
||||
var EnumeratedType = regg(NotationType, '|', Enumeration);
|
||||
|
||||
/*
|
||||
```
|
||||
[55] StringType ::= 'CDATA'
|
||||
[56] TokenizedType ::= 'ID' [VC: ID] [VC: One ID per Element Type] [VC: ID Attribute Default]
|
||||
| 'IDREF' [VC: IDREF]
|
||||
| 'IDREFS' [VC: IDREF]
|
||||
| 'ENTITY' [VC: Entity Name]
|
||||
| 'ENTITIES' [VC: Entity Name]
|
||||
| 'NMTOKEN' [VC: Name Token]
|
||||
| 'NMTOKENS' [VC: Name Token]
|
||||
[54] AttType ::= StringType | TokenizedType | EnumeratedType
|
||||
```*/
|
||||
var AttType = regg(/CDATA|ID|IDREF|IDREFS|ENTITY|ENTITIES|NMTOKEN|NMTOKENS/, '|', EnumeratedType);
|
||||
|
||||
// `[60] DefaultDecl ::= '#REQUIRED' | '#IMPLIED' | (('#FIXED' S)? AttValue)`
|
||||
// [WFC: No < in Attribute Values] [WFC: No External Entity References]
|
||||
// [VC: Fixed Attribute Default] [VC: Required Attribute] [VC: Attribute Default Value Syntactically Correct]
|
||||
var DefaultDecl = regg(/#REQUIRED|#IMPLIED/, '|', regg(regg('#FIXED', S), '?', AttValue));
|
||||
|
||||
// https://www.w3.org/TR/xml11/#NT-AttDef
|
||||
// [53] AttDef ::= S Name S AttType S DefaultDecl
|
||||
// https://www.w3.org/TR/xml-names/#NT-AttDef
|
||||
// [1] NSAttName ::= PrefixedAttName | DefaultAttName
|
||||
// [2] PrefixedAttName ::= 'xmlns:' NCName [NSC: Reserved Prefixes and Namespace Names]
|
||||
// [3] DefaultAttName ::= 'xmlns'
|
||||
// [21] AttDef ::= S (QName | NSAttName) S AttType S DefaultDecl
|
||||
// === S Name S AttType S DefaultDecl
|
||||
// xmldom is not distinguishing between QName and NSAttName on this level
|
||||
// to support XML without namespaces in DTD we can not restrict it to QName
|
||||
var AttDef = regg(S, Name, S, AttType, S, DefaultDecl);
|
||||
|
||||
var ATTLIST_DECL_START = '<!ATTLIST';
|
||||
// https://www.w3.org/TR/xml11/#NT-AttlistDecl
|
||||
// `[52] AttlistDecl ::= '<!ATTLIST' S Name AttDef* S? '>'`
|
||||
// https://www.w3.org/TR/xml-names/#NT-AttlistDecl
|
||||
// `[20] AttlistDecl ::= '<!ATTLIST' S QName AttDef* S? '>'`
|
||||
// to support XML without namespaces in DTD we can not restrict it to QName
|
||||
var AttlistDecl = reg(ATTLIST_DECL_START, S, Name, AttDef, '*', S_OPT, '>');
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/urls-and-fetching.html#about:legacy-compat
|
||||
var ABOUT_LEGACY_COMPAT = 'about:legacy-compat';
|
||||
var ABOUT_LEGACY_COMPAT_SystemLiteral = regg('"' + ABOUT_LEGACY_COMPAT + '"', '|', "'" + ABOUT_LEGACY_COMPAT + "'");
|
||||
var SYSTEM = 'SYSTEM';
|
||||
var PUBLIC = 'PUBLIC';
|
||||
// https://www.w3.org/TR/xml11/#NT-ExternalID
|
||||
// `[75] ExternalID ::= 'SYSTEM' S SystemLiteral | 'PUBLIC' S PubidLiteral S SystemLiteral`
|
||||
var ExternalID = regg(regg(SYSTEM, S, SystemLiteral), '|', regg(PUBLIC, S, PubidLiteral, S, SystemLiteral));
|
||||
var ExternalID_match = reg(
|
||||
'^',
|
||||
regg(
|
||||
regg(SYSTEM, S, '(?<SystemLiteralOnly>', SystemLiteral, ')'),
|
||||
'|',
|
||||
regg(PUBLIC, S, '(?<PubidLiteral>', PubidLiteral, ')', S, '(?<SystemLiteral>', SystemLiteral, ')')
|
||||
)
|
||||
);
|
||||
|
||||
// https://www.w3.org/TR/xml11/#NT-NDataDecl
|
||||
// `[76] NDataDecl ::= S 'NDATA' S Name` [VC: Notation Declared]
|
||||
var NDataDecl = regg(S, 'NDATA', S, Name);
|
||||
|
||||
// https://www.w3.org/TR/xml11/#NT-EntityDef
|
||||
// `[73] EntityDef ::= EntityValue | (ExternalID NDataDecl?)`
|
||||
var EntityDef = regg(EntityValue, '|', regg(ExternalID, NDataDecl, '?'));
|
||||
|
||||
var ENTITY_DECL_START = '<!ENTITY';
|
||||
// https://www.w3.org/TR/xml11/#NT-GEDecl
|
||||
// `[71] GEDecl ::= '<!ENTITY' S Name S EntityDef S? '>'`
|
||||
var GEDecl = reg(ENTITY_DECL_START, S, Name, S, EntityDef, S_OPT, '>');
|
||||
// https://www.w3.org/TR/xml11/#NT-PEDef
|
||||
// `[74] PEDef ::= EntityValue | ExternalID`
|
||||
var PEDef = regg(EntityValue, '|', ExternalID);
|
||||
// https://www.w3.org/TR/xml11/#NT-PEDecl
|
||||
// `[72] PEDecl ::= '<!ENTITY' S '%' S Name S PEDef S? '>'`
|
||||
var PEDecl = reg(ENTITY_DECL_START, S, '%', S, Name, S, PEDef, S_OPT, '>');
|
||||
// https://www.w3.org/TR/xml11/#NT-EntityDecl
|
||||
// `[70] EntityDecl ::= GEDecl | PEDecl`
|
||||
var EntityDecl = regg(GEDecl, '|', PEDecl);
|
||||
|
||||
// https://www.w3.org/TR/xml11/#NT-PublicID
|
||||
// `[83] PublicID ::= 'PUBLIC' S PubidLiteral`
|
||||
var PublicID = reg(PUBLIC, S, PubidLiteral);
|
||||
// https://www.w3.org/TR/xml11/#NT-NotationDecl
|
||||
// `[82] NotationDecl ::= '<!NOTATION' S Name S (ExternalID | PublicID) S? '>'` [VC: Unique Notation Name]
|
||||
var NotationDecl = reg('<!NOTATION', S, Name, S, regg(ExternalID, '|', PublicID), S_OPT, '>');
|
||||
|
||||
// https://www.w3.org/TR/xml11/#NT-Eq
|
||||
// `[25] Eq ::= S? '=' S?`
|
||||
var Eq = reg(S_OPT, '=', S_OPT);
|
||||
// https://www.w3.org/TR/xml/#NT-VersionNum
|
||||
// `[26] VersionNum ::= '1.' [0-9]+`
|
||||
// https://www.w3.org/TR/xml11/#NT-VersionNum
|
||||
// `[26] VersionNum ::= '1.1'`
|
||||
var VersionNum = /1[.]\d+/;
|
||||
// https://www.w3.org/TR/xml11/#NT-VersionInfo
|
||||
// `[24] VersionInfo ::= S 'version' Eq ("'" VersionNum "'" | '"' VersionNum '"')`
|
||||
var VersionInfo = reg(S, 'version', Eq, regg("'", VersionNum, "'", '|', '"', VersionNum, '"'));
|
||||
// https://www.w3.org/TR/xml11/#NT-EncName
|
||||
// `[81] EncName ::= [A-Za-z] ([A-Za-z0-9._] | '-')*`
|
||||
var EncName = /[A-Za-z][-A-Za-z0-9._]*/;
|
||||
// https://www.w3.org/TR/xml11/#NT-EncDecl
|
||||
// `[80] EncodingDecl ::= S 'encoding' Eq ('"' EncName '"' | "'" EncName "'" )`
|
||||
var EncodingDecl = regg(S, 'encoding', Eq, regg('"', EncName, '"', '|', "'", EncName, "'"));
|
||||
// https://www.w3.org/TR/xml11/#NT-SDDecl
|
||||
// `[32] SDDecl ::= S 'standalone' Eq (("'" ('yes' | 'no') "'") | ('"' ('yes' | 'no') '"'))`
|
||||
var SDDecl = regg(S, 'standalone', Eq, regg("'", regg('yes', '|', 'no'), "'", '|', '"', regg('yes', '|', 'no'), '"'));
|
||||
// https://www.w3.org/TR/xml11/#NT-XMLDecl
|
||||
// [23] XMLDecl ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>'
|
||||
var XMLDecl = reg(/^<\?xml/, VersionInfo, EncodingDecl, '?', SDDecl, '?', S_OPT, /\?>/);
|
||||
|
||||
/*
|
||||
https://www.w3.org/TR/xml/#NT-markupdecl
|
||||
https://www.w3.org/TR/xml11/#NT-markupdecl
|
||||
`[29] markupdecl ::= elementdecl | AttlistDecl | EntityDecl | NotationDecl | PI | Comment`
|
||||
var markupdecl = regg(elementdecl, '|', AttlistDecl, '|', EntityDecl, '|', NotationDecl, '|', PI_unsafe, '|', Comment);
|
||||
*/
|
||||
/*
|
||||
https://www.w3.org/TR/xml-names/#NT-doctypedecl
|
||||
`[28a] DeclSep ::= PEReference | S`
|
||||
https://www.w3.org/TR/xml11/#NT-intSubset
|
||||
```
|
||||
[28b] intSubset ::= (markupdecl | DeclSep)*
|
||||
=== (markupdecl | PEReference | S)*
|
||||
```
|
||||
[WFC: PE Between Declarations]
|
||||
var intSubset = reg(regg(markupdecl, '|', PEReference, '|', S), '*');
|
||||
*/
|
||||
var DOCTYPE_DECL_START = '<!DOCTYPE';
|
||||
/*
|
||||
https://www.w3.org/TR/xml11/#NT-doctypedecl
|
||||
`[28] doctypedecl ::= '<!DOCTYPE' S Name (S ExternalID)? S? ('[' intSubset ']' S?)? '>'`
|
||||
https://www.afterwardsw3.org/TR/xml-names/#NT-doctypedecl
|
||||
`[16] doctypedecl ::= '<!DOCTYPE' S QName (S ExternalID)? S? ('[' (markupdecl | PEReference | S)* ']' S?)? '>'`
|
||||
var doctypedecl = reg('<!DOCTYPE', S, Name, regg(S, ExternalID), '?', S_OPT, regg(/\[/, intSubset, /]/, S_OPT), '?', '>');
|
||||
*/
|
||||
|
||||
var CDATA_START = '<![CDATA[';
|
||||
var CDATA_END = ']]>';
|
||||
var CDStart = /<!\[CDATA\[/;
|
||||
var CDEnd = /\]\]>/;
|
||||
var CData = reg(Char, '*?', CDEnd);
|
||||
/*
|
||||
https://www.w3.org/TR/xml/#dt-cdsection
|
||||
`[18] CDSect ::= CDStart CData CDEnd`
|
||||
`[19] CDStart ::= '<![CDATA['`
|
||||
`[20] CData ::= (Char* - (Char* ']]>' Char*))`
|
||||
`[21] CDEnd ::= ']]>'`
|
||||
*/
|
||||
var CDSect = reg(CDStart, CData);
|
||||
|
||||
// unit tested
|
||||
exports.chars = chars;
|
||||
exports.chars_without = chars_without;
|
||||
exports.detectUnicodeSupport = detectUnicodeSupport;
|
||||
exports.reg = reg;
|
||||
exports.regg = regg;
|
||||
exports.ABOUT_LEGACY_COMPAT = ABOUT_LEGACY_COMPAT;
|
||||
exports.ABOUT_LEGACY_COMPAT_SystemLiteral = ABOUT_LEGACY_COMPAT_SystemLiteral;
|
||||
exports.AttlistDecl = AttlistDecl;
|
||||
exports.CDATA_START = CDATA_START;
|
||||
exports.CDATA_END = CDATA_END;
|
||||
exports.CDSect = CDSect;
|
||||
exports.Char = Char;
|
||||
exports.Comment = Comment;
|
||||
exports.COMMENT_START = COMMENT_START;
|
||||
exports.COMMENT_END = COMMENT_END;
|
||||
exports.DOCTYPE_DECL_START = DOCTYPE_DECL_START;
|
||||
exports.elementdecl = elementdecl;
|
||||
exports.EntityDecl = EntityDecl;
|
||||
exports.EntityValue = EntityValue;
|
||||
exports.ExternalID = ExternalID;
|
||||
exports.ExternalID_match = ExternalID_match;
|
||||
exports.Name = Name;
|
||||
exports.NotationDecl = NotationDecl;
|
||||
exports.Reference = Reference;
|
||||
exports.PEReference = PEReference;
|
||||
exports.PI = PI;
|
||||
exports.PUBLIC = PUBLIC;
|
||||
exports.PubidLiteral = PubidLiteral;
|
||||
exports.QName = QName;
|
||||
exports.QName_exact = QName_exact;
|
||||
exports.QName_group = QName_group;
|
||||
exports.S = S;
|
||||
exports.SChar_s = SChar_s;
|
||||
exports.S_OPT = S_OPT;
|
||||
exports.SYSTEM = SYSTEM;
|
||||
exports.SystemLiteral = SystemLiteral;
|
||||
exports.UNICODE_REPLACEMENT_CHARACTER = UNICODE_REPLACEMENT_CHARACTER;
|
||||
exports.UNICODE_SUPPORT = UNICODE_SUPPORT;
|
||||
exports.XMLDecl = XMLDecl;
|
||||
41
node_modules/@xmldom/xmldom/lib/index.js
generated
vendored
Normal file
41
node_modules/@xmldom/xmldom/lib/index.js
generated
vendored
Normal file
@@ -0,0 +1,41 @@
|
||||
'use strict';
|
||||
var conventions = require('./conventions');
|
||||
exports.assign = conventions.assign;
|
||||
exports.hasDefaultHTMLNamespace = conventions.hasDefaultHTMLNamespace;
|
||||
exports.isHTMLMimeType = conventions.isHTMLMimeType;
|
||||
exports.isValidMimeType = conventions.isValidMimeType;
|
||||
exports.MIME_TYPE = conventions.MIME_TYPE;
|
||||
exports.NAMESPACE = conventions.NAMESPACE;
|
||||
|
||||
var errors = require('./errors');
|
||||
exports.DOMException = errors.DOMException;
|
||||
exports.DOMExceptionName = errors.DOMExceptionName;
|
||||
exports.ExceptionCode = errors.ExceptionCode;
|
||||
exports.ParseError = errors.ParseError;
|
||||
|
||||
var dom = require('./dom');
|
||||
exports.Attr = dom.Attr;
|
||||
exports.CDATASection = dom.CDATASection;
|
||||
exports.CharacterData = dom.CharacterData;
|
||||
exports.Comment = dom.Comment;
|
||||
exports.Document = dom.Document;
|
||||
exports.DocumentFragment = dom.DocumentFragment;
|
||||
exports.DocumentType = dom.DocumentType;
|
||||
exports.DOMImplementation = dom.DOMImplementation;
|
||||
exports.Element = dom.Element;
|
||||
exports.Entity = dom.Entity;
|
||||
exports.EntityReference = dom.EntityReference;
|
||||
exports.LiveNodeList = dom.LiveNodeList;
|
||||
exports.NamedNodeMap = dom.NamedNodeMap;
|
||||
exports.Node = dom.Node;
|
||||
exports.NodeList = dom.NodeList;
|
||||
exports.Notation = dom.Notation;
|
||||
exports.ProcessingInstruction = dom.ProcessingInstruction;
|
||||
exports.Text = dom.Text;
|
||||
exports.XMLSerializer = dom.XMLSerializer;
|
||||
|
||||
var domParser = require('./dom-parser');
|
||||
exports.DOMParser = domParser.DOMParser;
|
||||
exports.normalizeLineEndings = domParser.normalizeLineEndings;
|
||||
exports.onErrorStopParsing = domParser.onErrorStopParsing;
|
||||
exports.onWarningStopParsing = domParser.onWarningStopParsing;
|
||||
929
node_modules/@xmldom/xmldom/lib/sax.js
generated
vendored
Normal file
929
node_modules/@xmldom/xmldom/lib/sax.js
generated
vendored
Normal file
@@ -0,0 +1,929 @@
|
||||
'use strict';
|
||||
|
||||
var conventions = require('./conventions');
|
||||
var g = require('./grammar');
|
||||
var errors = require('./errors');
|
||||
|
||||
var isHTMLEscapableRawTextElement = conventions.isHTMLEscapableRawTextElement;
|
||||
var isHTMLMimeType = conventions.isHTMLMimeType;
|
||||
var isHTMLRawTextElement = conventions.isHTMLRawTextElement;
|
||||
var hasOwn = conventions.hasOwn;
|
||||
var NAMESPACE = conventions.NAMESPACE;
|
||||
var ParseError = errors.ParseError;
|
||||
var DOMException = errors.DOMException;
|
||||
|
||||
//var handlers = 'resolveEntity,getExternalSubset,characters,endDocument,endElement,endPrefixMapping,ignorableWhitespace,processingInstruction,setDocumentLocator,skippedEntity,startDocument,startElement,startPrefixMapping,notationDecl,unparsedEntityDecl,error,fatalError,warning,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,comment,endCDATA,endDTD,endEntity,startCDATA,startDTD,startEntity'.split(',')
|
||||
|
||||
//S_TAG, S_ATTR, S_EQ, S_ATTR_NOQUOT_VALUE
|
||||
//S_ATTR_SPACE, S_ATTR_END, S_TAG_SPACE, S_TAG_CLOSE
|
||||
var S_TAG = 0; //tag name offerring
|
||||
var S_ATTR = 1; //attr name offerring
|
||||
var S_ATTR_SPACE = 2; //attr name end and space offer
|
||||
var S_EQ = 3; //=space?
|
||||
var S_ATTR_NOQUOT_VALUE = 4; //attr value(no quot value only)
|
||||
var S_ATTR_END = 5; //attr value end and no space(quot end)
|
||||
var S_TAG_SPACE = 6; //(attr value end || tag end ) && (space offer)
|
||||
var S_TAG_CLOSE = 7; //closed el<el />
|
||||
|
||||
function XMLReader() {}
|
||||
|
||||
XMLReader.prototype = {
|
||||
parse: function (source, defaultNSMap, entityMap) {
|
||||
var domBuilder = this.domBuilder;
|
||||
domBuilder.startDocument();
|
||||
_copy(defaultNSMap, (defaultNSMap = Object.create(null)));
|
||||
parse(source, defaultNSMap, entityMap, domBuilder, this.errorHandler);
|
||||
domBuilder.endDocument();
|
||||
},
|
||||
};
|
||||
|
||||
/**
|
||||
* Detecting everything that might be a reference,
|
||||
* including those without ending `;`, since those are allowed in HTML.
|
||||
* The entityReplacer takes care of verifying and transforming each occurrence,
|
||||
* and reports to the errorHandler on those that are not OK,
|
||||
* depending on the context.
|
||||
*/
|
||||
var ENTITY_REG = /&#?\w+;?/g;
|
||||
|
||||
function parse(source, defaultNSMapCopy, entityMap, domBuilder, errorHandler) {
|
||||
var isHTML = isHTMLMimeType(domBuilder.mimeType);
|
||||
if (source.indexOf(g.UNICODE_REPLACEMENT_CHARACTER) >= 0) {
|
||||
errorHandler.warning('Unicode replacement character detected, source encoding issues?');
|
||||
}
|
||||
|
||||
function fixedFromCharCode(code) {
|
||||
// String.prototype.fromCharCode does not supports
|
||||
// > 2 bytes unicode chars directly
|
||||
if (code > 0xffff) {
|
||||
code -= 0x10000;
|
||||
var surrogate1 = 0xd800 + (code >> 10),
|
||||
surrogate2 = 0xdc00 + (code & 0x3ff);
|
||||
|
||||
return String.fromCharCode(surrogate1, surrogate2);
|
||||
} else {
|
||||
return String.fromCharCode(code);
|
||||
}
|
||||
}
|
||||
|
||||
function entityReplacer(a) {
|
||||
var complete = a[a.length - 1] === ';' ? a : a + ';';
|
||||
if (!isHTML && complete !== a) {
|
||||
errorHandler.error('EntityRef: expecting ;');
|
||||
return a;
|
||||
}
|
||||
var match = g.Reference.exec(complete);
|
||||
if (!match || match[0].length !== complete.length) {
|
||||
errorHandler.error('entity not matching Reference production: ' + a);
|
||||
return a;
|
||||
}
|
||||
var k = complete.slice(1, -1);
|
||||
if (hasOwn(entityMap, k)) {
|
||||
return entityMap[k];
|
||||
} else if (k.charAt(0) === '#') {
|
||||
return fixedFromCharCode(parseInt(k.substring(1).replace('x', '0x')));
|
||||
} else {
|
||||
errorHandler.error('entity not found:' + a);
|
||||
return a;
|
||||
}
|
||||
}
|
||||
|
||||
function appendText(end) {
|
||||
//has some bugs
|
||||
if (end > start) {
|
||||
var xt = source.substring(start, end).replace(ENTITY_REG, entityReplacer);
|
||||
locator && position(start);
|
||||
domBuilder.characters(xt, 0, end - start);
|
||||
start = end;
|
||||
}
|
||||
}
|
||||
|
||||
var lineStart = 0;
|
||||
var lineEnd = 0;
|
||||
var linePattern = /\r\n?|\n|$/g;
|
||||
var locator = domBuilder.locator;
|
||||
|
||||
function position(p, m) {
|
||||
while (p >= lineEnd && (m = linePattern.exec(source))) {
|
||||
lineStart = lineEnd;
|
||||
lineEnd = m.index + m[0].length;
|
||||
locator.lineNumber++;
|
||||
}
|
||||
locator.columnNumber = p - lineStart + 1;
|
||||
}
|
||||
|
||||
var parseStack = [{ currentNSMap: defaultNSMapCopy }];
|
||||
var unclosedTags = [];
|
||||
var start = 0;
|
||||
while (true) {
|
||||
try {
|
||||
var tagStart = source.indexOf('<', start);
|
||||
if (tagStart < 0) {
|
||||
if (!isHTML && unclosedTags.length > 0) {
|
||||
return errorHandler.fatalError('unclosed xml tag(s): ' + unclosedTags.join(', '));
|
||||
}
|
||||
if (!source.substring(start).match(/^\s*$/)) {
|
||||
var doc = domBuilder.doc;
|
||||
var text = doc.createTextNode(source.substring(start));
|
||||
if (doc.documentElement) {
|
||||
return errorHandler.error('Extra content at the end of the document');
|
||||
}
|
||||
doc.appendChild(text);
|
||||
domBuilder.currentElement = text;
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (tagStart > start) {
|
||||
var fromSource = source.substring(start, tagStart);
|
||||
if (!isHTML && unclosedTags.length === 0) {
|
||||
fromSource = fromSource.replace(new RegExp(g.S_OPT.source, 'g'), '');
|
||||
fromSource && errorHandler.error("Unexpected content outside root element: '" + fromSource + "'");
|
||||
}
|
||||
appendText(tagStart);
|
||||
}
|
||||
switch (source.charAt(tagStart + 1)) {
|
||||
case '/':
|
||||
var end = source.indexOf('>', tagStart + 2);
|
||||
var tagNameRaw = source.substring(tagStart + 2, end > 0 ? end : undefined);
|
||||
if (!tagNameRaw) {
|
||||
return errorHandler.fatalError('end tag name missing');
|
||||
}
|
||||
var tagNameMatch = end > 0 && g.reg('^', g.QName_group, g.S_OPT, '$').exec(tagNameRaw);
|
||||
if (!tagNameMatch) {
|
||||
return errorHandler.fatalError('end tag name contains invalid characters: "' + tagNameRaw + '"');
|
||||
}
|
||||
if (!domBuilder.currentElement && !domBuilder.doc.documentElement) {
|
||||
// not enough information to provide a helpful error message,
|
||||
// but parsing will throw since there is no root element
|
||||
return;
|
||||
}
|
||||
var currentTagName =
|
||||
unclosedTags[unclosedTags.length - 1] ||
|
||||
domBuilder.currentElement.tagName ||
|
||||
domBuilder.doc.documentElement.tagName ||
|
||||
'';
|
||||
if (currentTagName !== tagNameMatch[1]) {
|
||||
var tagNameLower = tagNameMatch[1].toLowerCase();
|
||||
if (!isHTML || currentTagName.toLowerCase() !== tagNameLower) {
|
||||
return errorHandler.fatalError('Opening and ending tag mismatch: "' + currentTagName + '" != "' + tagNameRaw + '"');
|
||||
}
|
||||
}
|
||||
var config = parseStack.pop();
|
||||
unclosedTags.pop();
|
||||
var localNSMap = config.localNSMap;
|
||||
domBuilder.endElement(config.uri, config.localName, currentTagName);
|
||||
if (localNSMap) {
|
||||
for (var prefix in localNSMap) {
|
||||
if (hasOwn(localNSMap, prefix)) {
|
||||
domBuilder.endPrefixMapping(prefix);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
end++;
|
||||
break;
|
||||
// end element
|
||||
case '?': // <?...?>
|
||||
locator && position(tagStart);
|
||||
end = parseProcessingInstruction(source, tagStart, domBuilder, errorHandler);
|
||||
break;
|
||||
case '!': // <!doctype,<![CDATA,<!--
|
||||
locator && position(tagStart);
|
||||
end = parseDoctypeCommentOrCData(source, tagStart, domBuilder, errorHandler, isHTML);
|
||||
break;
|
||||
default:
|
||||
locator && position(tagStart);
|
||||
var el = new ElementAttributes();
|
||||
var currentNSMap = parseStack[parseStack.length - 1].currentNSMap;
|
||||
//elStartEnd
|
||||
var end = parseElementStartPart(source, tagStart, el, currentNSMap, entityReplacer, errorHandler, isHTML);
|
||||
var len = el.length;
|
||||
|
||||
if (!el.closed) {
|
||||
if (isHTML && conventions.isHTMLVoidElement(el.tagName)) {
|
||||
el.closed = true;
|
||||
} else {
|
||||
unclosedTags.push(el.tagName);
|
||||
}
|
||||
}
|
||||
if (locator && len) {
|
||||
var locator2 = copyLocator(locator, {});
|
||||
//try{//attribute position fixed
|
||||
for (var i = 0; i < len; i++) {
|
||||
var a = el[i];
|
||||
position(a.offset);
|
||||
a.locator = copyLocator(locator, {});
|
||||
}
|
||||
domBuilder.locator = locator2;
|
||||
if (appendElement(el, domBuilder, currentNSMap)) {
|
||||
parseStack.push(el);
|
||||
}
|
||||
domBuilder.locator = locator;
|
||||
} else {
|
||||
if (appendElement(el, domBuilder, currentNSMap)) {
|
||||
parseStack.push(el);
|
||||
}
|
||||
}
|
||||
|
||||
if (isHTML && !el.closed) {
|
||||
end = parseHtmlSpecialContent(source, end, el.tagName, entityReplacer, domBuilder);
|
||||
} else {
|
||||
end++;
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
if (e instanceof ParseError) {
|
||||
throw e;
|
||||
} else if (e instanceof DOMException) {
|
||||
throw new ParseError(e.name + ': ' + e.message, domBuilder.locator, e);
|
||||
}
|
||||
errorHandler.error('element parse error: ' + e);
|
||||
end = -1;
|
||||
}
|
||||
if (end > start) {
|
||||
start = end;
|
||||
} else {
|
||||
//Possible sax fallback here, risk of positional error
|
||||
appendText(Math.max(tagStart, start) + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function copyLocator(f, t) {
|
||||
t.lineNumber = f.lineNumber;
|
||||
t.columnNumber = f.columnNumber;
|
||||
return t;
|
||||
}
|
||||
|
||||
/**
|
||||
* @returns
|
||||
* end of the elementStartPart(end of elementEndPart for selfClosed el)
|
||||
* @see {@link #appendElement}
|
||||
*/
|
||||
function parseElementStartPart(source, start, el, currentNSMap, entityReplacer, errorHandler, isHTML) {
|
||||
/**
|
||||
* @param {string} qname
|
||||
* @param {string} value
|
||||
* @param {number} startIndex
|
||||
*/
|
||||
function addAttribute(qname, value, startIndex) {
|
||||
if (hasOwn(el.attributeNames, qname)) {
|
||||
return errorHandler.fatalError('Attribute ' + qname + ' redefined');
|
||||
}
|
||||
if (!isHTML && value.indexOf('<') >= 0) {
|
||||
return errorHandler.fatalError("Unescaped '<' not allowed in attributes values");
|
||||
}
|
||||
el.addValue(
|
||||
qname,
|
||||
// @see https://www.w3.org/TR/xml/#AVNormalize
|
||||
// since the xmldom sax parser does not "interpret" DTD the following is not implemented:
|
||||
// - recursive replacement of (DTD) entity references
|
||||
// - trimming and collapsing multiple spaces into a single one for attributes that are not of type CDATA
|
||||
value.replace(/[\t\n\r]/g, ' ').replace(ENTITY_REG, entityReplacer),
|
||||
startIndex
|
||||
);
|
||||
}
|
||||
|
||||
var attrName;
|
||||
var value;
|
||||
var p = ++start;
|
||||
var s = S_TAG; //status
|
||||
while (true) {
|
||||
var c = source.charAt(p);
|
||||
switch (c) {
|
||||
case '=':
|
||||
if (s === S_ATTR) {
|
||||
//attrName
|
||||
attrName = source.slice(start, p);
|
||||
s = S_EQ;
|
||||
} else if (s === S_ATTR_SPACE) {
|
||||
s = S_EQ;
|
||||
} else {
|
||||
//fatalError: equal must after attrName or space after attrName
|
||||
throw new Error('attribute equal must after attrName'); // No known test case
|
||||
}
|
||||
break;
|
||||
case "'":
|
||||
case '"':
|
||||
if (
|
||||
s === S_EQ ||
|
||||
s === S_ATTR //|| s == S_ATTR_SPACE
|
||||
) {
|
||||
//equal
|
||||
if (s === S_ATTR) {
|
||||
errorHandler.warning('attribute value must after "="');
|
||||
attrName = source.slice(start, p);
|
||||
}
|
||||
start = p + 1;
|
||||
p = source.indexOf(c, start);
|
||||
if (p > 0) {
|
||||
value = source.slice(start, p);
|
||||
addAttribute(attrName, value, start - 1);
|
||||
s = S_ATTR_END;
|
||||
} else {
|
||||
//fatalError: no end quot match
|
||||
throw new Error("attribute value no end '" + c + "' match");
|
||||
}
|
||||
} else if (s == S_ATTR_NOQUOT_VALUE) {
|
||||
value = source.slice(start, p);
|
||||
addAttribute(attrName, value, start);
|
||||
errorHandler.warning('attribute "' + attrName + '" missed start quot(' + c + ')!!');
|
||||
start = p + 1;
|
||||
s = S_ATTR_END;
|
||||
} else {
|
||||
//fatalError: no equal before
|
||||
throw new Error('attribute value must after "="'); // No known test case
|
||||
}
|
||||
break;
|
||||
case '/':
|
||||
switch (s) {
|
||||
case S_TAG:
|
||||
el.setTagName(source.slice(start, p));
|
||||
case S_ATTR_END:
|
||||
case S_TAG_SPACE:
|
||||
case S_TAG_CLOSE:
|
||||
s = S_TAG_CLOSE;
|
||||
el.closed = true;
|
||||
case S_ATTR_NOQUOT_VALUE:
|
||||
case S_ATTR:
|
||||
break;
|
||||
case S_ATTR_SPACE:
|
||||
el.closed = true;
|
||||
break;
|
||||
//case S_EQ:
|
||||
default:
|
||||
throw new Error("attribute invalid close char('/')"); // No known test case
|
||||
}
|
||||
break;
|
||||
case '': //end document
|
||||
errorHandler.error('unexpected end of input');
|
||||
if (s == S_TAG) {
|
||||
el.setTagName(source.slice(start, p));
|
||||
}
|
||||
return p;
|
||||
case '>':
|
||||
switch (s) {
|
||||
case S_TAG:
|
||||
el.setTagName(source.slice(start, p));
|
||||
case S_ATTR_END:
|
||||
case S_TAG_SPACE:
|
||||
case S_TAG_CLOSE:
|
||||
break; //normal
|
||||
case S_ATTR_NOQUOT_VALUE: //Compatible state
|
||||
case S_ATTR:
|
||||
value = source.slice(start, p);
|
||||
if (value.slice(-1) === '/') {
|
||||
el.closed = true;
|
||||
value = value.slice(0, -1);
|
||||
}
|
||||
case S_ATTR_SPACE:
|
||||
if (s === S_ATTR_SPACE) {
|
||||
value = attrName;
|
||||
}
|
||||
if (s == S_ATTR_NOQUOT_VALUE) {
|
||||
errorHandler.warning('attribute "' + value + '" missed quot(")!');
|
||||
addAttribute(attrName, value, start);
|
||||
} else {
|
||||
if (!isHTML) {
|
||||
errorHandler.warning('attribute "' + value + '" missed value!! "' + value + '" instead!!');
|
||||
}
|
||||
addAttribute(value, value, start);
|
||||
}
|
||||
break;
|
||||
case S_EQ:
|
||||
if (!isHTML) {
|
||||
return errorHandler.fatalError('AttValue: \' or " expected');
|
||||
}
|
||||
}
|
||||
return p;
|
||||
/*xml space '\x20' | #x9 | #xD | #xA; */
|
||||
case '\u0080':
|
||||
c = ' ';
|
||||
default:
|
||||
if (c <= ' ') {
|
||||
//space
|
||||
switch (s) {
|
||||
case S_TAG:
|
||||
el.setTagName(source.slice(start, p)); //tagName
|
||||
s = S_TAG_SPACE;
|
||||
break;
|
||||
case S_ATTR:
|
||||
attrName = source.slice(start, p);
|
||||
s = S_ATTR_SPACE;
|
||||
break;
|
||||
case S_ATTR_NOQUOT_VALUE:
|
||||
var value = source.slice(start, p);
|
||||
errorHandler.warning('attribute "' + value + '" missed quot(")!!');
|
||||
addAttribute(attrName, value, start);
|
||||
case S_ATTR_END:
|
||||
s = S_TAG_SPACE;
|
||||
break;
|
||||
//case S_TAG_SPACE:
|
||||
//case S_EQ:
|
||||
//case S_ATTR_SPACE:
|
||||
// void();break;
|
||||
//case S_TAG_CLOSE:
|
||||
//ignore warning
|
||||
}
|
||||
} else {
|
||||
//not space
|
||||
//S_TAG, S_ATTR, S_EQ, S_ATTR_NOQUOT_VALUE
|
||||
//S_ATTR_SPACE, S_ATTR_END, S_TAG_SPACE, S_TAG_CLOSE
|
||||
switch (s) {
|
||||
//case S_TAG:void();break;
|
||||
//case S_ATTR:void();break;
|
||||
//case S_ATTR_NOQUOT_VALUE:void();break;
|
||||
case S_ATTR_SPACE:
|
||||
if (!isHTML) {
|
||||
errorHandler.warning('attribute "' + attrName + '" missed value!! "' + attrName + '" instead2!!');
|
||||
}
|
||||
addAttribute(attrName, attrName, start);
|
||||
start = p;
|
||||
s = S_ATTR;
|
||||
break;
|
||||
case S_ATTR_END:
|
||||
errorHandler.warning('attribute space is required"' + attrName + '"!!');
|
||||
case S_TAG_SPACE:
|
||||
s = S_ATTR;
|
||||
start = p;
|
||||
break;
|
||||
case S_EQ:
|
||||
s = S_ATTR_NOQUOT_VALUE;
|
||||
start = p;
|
||||
break;
|
||||
case S_TAG_CLOSE:
|
||||
throw new Error("elements closed character '/' and '>' must be connected to");
|
||||
}
|
||||
}
|
||||
} //end outer switch
|
||||
p++;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @returns
|
||||
* `true` if a new namespace has been defined.
|
||||
*/
|
||||
function appendElement(el, domBuilder, currentNSMap) {
|
||||
var tagName = el.tagName;
|
||||
var localNSMap = null;
|
||||
var i = el.length;
|
||||
while (i--) {
|
||||
var a = el[i];
|
||||
var qName = a.qName;
|
||||
var value = a.value;
|
||||
var nsp = qName.indexOf(':');
|
||||
if (nsp > 0) {
|
||||
var prefix = (a.prefix = qName.slice(0, nsp));
|
||||
var localName = qName.slice(nsp + 1);
|
||||
var nsPrefix = prefix === 'xmlns' && localName;
|
||||
} else {
|
||||
localName = qName;
|
||||
prefix = null;
|
||||
nsPrefix = qName === 'xmlns' && '';
|
||||
}
|
||||
//can not set prefix,because prefix !== ''
|
||||
a.localName = localName;
|
||||
//prefix == null for no ns prefix attribute
|
||||
if (nsPrefix !== false) {
|
||||
//hack!!
|
||||
if (localNSMap == null) {
|
||||
localNSMap = Object.create(null);
|
||||
_copy(currentNSMap, (currentNSMap = Object.create(null)));
|
||||
}
|
||||
currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;
|
||||
a.uri = NAMESPACE.XMLNS;
|
||||
domBuilder.startPrefixMapping(nsPrefix, value);
|
||||
}
|
||||
}
|
||||
var i = el.length;
|
||||
while (i--) {
|
||||
a = el[i];
|
||||
if (a.prefix) {
|
||||
//no prefix attribute has no namespace
|
||||
if (a.prefix === 'xml') {
|
||||
a.uri = NAMESPACE.XML;
|
||||
}
|
||||
if (a.prefix !== 'xmlns') {
|
||||
a.uri = currentNSMap[a.prefix];
|
||||
}
|
||||
}
|
||||
}
|
||||
var nsp = tagName.indexOf(':');
|
||||
if (nsp > 0) {
|
||||
prefix = el.prefix = tagName.slice(0, nsp);
|
||||
localName = el.localName = tagName.slice(nsp + 1);
|
||||
} else {
|
||||
prefix = null; //important!!
|
||||
localName = el.localName = tagName;
|
||||
}
|
||||
//no prefix element has default namespace
|
||||
var ns = (el.uri = currentNSMap[prefix || '']);
|
||||
domBuilder.startElement(ns, localName, tagName, el);
|
||||
//endPrefixMapping and startPrefixMapping have not any help for dom builder
|
||||
//localNSMap = null
|
||||
if (el.closed) {
|
||||
domBuilder.endElement(ns, localName, tagName);
|
||||
if (localNSMap) {
|
||||
for (prefix in localNSMap) {
|
||||
if (hasOwn(localNSMap, prefix)) {
|
||||
domBuilder.endPrefixMapping(prefix);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
el.currentNSMap = currentNSMap;
|
||||
el.localNSMap = localNSMap;
|
||||
//parseStack.push(el);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
function parseHtmlSpecialContent(source, elStartEnd, tagName, entityReplacer, domBuilder) {
|
||||
// https://html.spec.whatwg.org/#raw-text-elements
|
||||
// https://html.spec.whatwg.org/#escapable-raw-text-elements
|
||||
// https://html.spec.whatwg.org/#cdata-rcdata-restrictions:raw-text-elements
|
||||
// TODO: https://html.spec.whatwg.org/#cdata-rcdata-restrictions
|
||||
var isEscapableRaw = isHTMLEscapableRawTextElement(tagName);
|
||||
if (isEscapableRaw || isHTMLRawTextElement(tagName)) {
|
||||
var elEndStart = source.indexOf('</' + tagName + '>', elStartEnd);
|
||||
var text = source.substring(elStartEnd + 1, elEndStart);
|
||||
|
||||
if (isEscapableRaw) {
|
||||
text = text.replace(ENTITY_REG, entityReplacer);
|
||||
}
|
||||
domBuilder.characters(text, 0, text.length);
|
||||
return elEndStart;
|
||||
}
|
||||
return elStartEnd + 1;
|
||||
}
|
||||
|
||||
function _copy(source, target) {
|
||||
for (var n in source) {
|
||||
if (hasOwn(source, n)) {
|
||||
target[n] = source[n];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @typedef ParseUtils
|
||||
* @property {function(relativeIndex: number?): string | undefined} char
|
||||
* Provides look ahead access to a singe character relative to the current index.
|
||||
* @property {function(): number} getIndex
|
||||
* Provides read-only access to the current index.
|
||||
* @property {function(reg: RegExp): string | null} getMatch
|
||||
* Applies the provided regular expression enforcing that it starts at the current index and
|
||||
* returns the complete matching string,
|
||||
* and moves the current index by the length of the matching string.
|
||||
* @property {function(): string} getSource
|
||||
* Provides read-only access to the complete source.
|
||||
* @property {function(places: number?): void} skip
|
||||
* moves the current index by places (defaults to 1)
|
||||
* @property {function(): number} skipBlanks
|
||||
* Moves the current index by the amount of white space that directly follows the current index
|
||||
* and returns the amount of whitespace chars skipped (0..n),
|
||||
* or -1 if the end of the source was reached.
|
||||
* @property {function(): string} substringFromIndex
|
||||
* creates a substring from the current index to the end of `source`
|
||||
* @property {function(compareWith: string): boolean} substringStartsWith
|
||||
* Checks if `source` contains `compareWith`, starting from the current index.
|
||||
* @property {function(compareWith: string): boolean} substringStartsWithCaseInsensitive
|
||||
* Checks if `source` contains `compareWith`, starting from the current index,
|
||||
* comparing the upper case of both sides.
|
||||
* @see {@link parseUtils}
|
||||
*/
|
||||
|
||||
/**
|
||||
* A temporary scope for parsing and look ahead operations in `source`,
|
||||
* starting from index `start`.
|
||||
*
|
||||
* Some operations move the current index by a number of positions,
|
||||
* after which `getIndex` returns the new index.
|
||||
*
|
||||
* @param {string} source
|
||||
* @param {number} start
|
||||
* @returns {ParseUtils}
|
||||
*/
|
||||
function parseUtils(source, start) {
|
||||
var index = start;
|
||||
|
||||
function char(n) {
|
||||
n = n || 0;
|
||||
return source.charAt(index + n);
|
||||
}
|
||||
|
||||
function skip(n) {
|
||||
n = n || 1;
|
||||
index += n;
|
||||
}
|
||||
|
||||
function skipBlanks() {
|
||||
var blanks = 0;
|
||||
while (index < source.length) {
|
||||
var c = char();
|
||||
if (c !== ' ' && c !== '\n' && c !== '\t' && c !== '\r') {
|
||||
return blanks;
|
||||
}
|
||||
blanks++;
|
||||
skip();
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
function substringFromIndex() {
|
||||
return source.substring(index);
|
||||
}
|
||||
function substringStartsWith(text) {
|
||||
return source.substring(index, index + text.length) === text;
|
||||
}
|
||||
function substringStartsWithCaseInsensitive(text) {
|
||||
return source.substring(index, index + text.length).toUpperCase() === text.toUpperCase();
|
||||
}
|
||||
|
||||
function getMatch(args) {
|
||||
var expr = g.reg('^', args);
|
||||
var match = expr.exec(substringFromIndex());
|
||||
if (match) {
|
||||
skip(match[0].length);
|
||||
return match[0];
|
||||
}
|
||||
return null;
|
||||
}
|
||||
return {
|
||||
char: char,
|
||||
getIndex: function () {
|
||||
return index;
|
||||
},
|
||||
getMatch: getMatch,
|
||||
getSource: function () {
|
||||
return source;
|
||||
},
|
||||
skip: skip,
|
||||
skipBlanks: skipBlanks,
|
||||
substringFromIndex: substringFromIndex,
|
||||
substringStartsWith: substringStartsWith,
|
||||
substringStartsWithCaseInsensitive: substringStartsWithCaseInsensitive,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {ParseUtils} p
|
||||
* @param {DOMHandler} errorHandler
|
||||
* @returns {string}
|
||||
*/
|
||||
function parseDoctypeInternalSubset(p, errorHandler) {
|
||||
/**
|
||||
* @param {ParseUtils} p
|
||||
* @param {DOMHandler} errorHandler
|
||||
* @returns {string}
|
||||
*/
|
||||
function parsePI(p, errorHandler) {
|
||||
var match = g.PI.exec(p.substringFromIndex());
|
||||
if (!match) {
|
||||
return errorHandler.fatalError('processing instruction is not well-formed at position ' + p.getIndex());
|
||||
}
|
||||
if (match[1].toLowerCase() === 'xml') {
|
||||
return errorHandler.fatalError(
|
||||
'xml declaration is only allowed at the start of the document, but found at position ' + p.getIndex()
|
||||
);
|
||||
}
|
||||
p.skip(match[0].length);
|
||||
return match[0];
|
||||
}
|
||||
// Parse internal subset
|
||||
var source = p.getSource();
|
||||
if (p.char() === '[') {
|
||||
p.skip(1);
|
||||
var intSubsetStart = p.getIndex();
|
||||
while (p.getIndex() < source.length) {
|
||||
p.skipBlanks();
|
||||
if (p.char() === ']') {
|
||||
var internalSubset = source.substring(intSubsetStart, p.getIndex());
|
||||
p.skip(1);
|
||||
return internalSubset;
|
||||
}
|
||||
var current = null;
|
||||
// Only in external subset
|
||||
// if (char() === '<' && char(1) === '!' && char(2) === '[') {
|
||||
// parseConditionalSections(p, errorHandler);
|
||||
// } else
|
||||
if (p.char() === '<' && p.char(1) === '!') {
|
||||
switch (p.char(2)) {
|
||||
case 'E': // ELEMENT | ENTITY
|
||||
if (p.char(3) === 'L') {
|
||||
current = p.getMatch(g.elementdecl);
|
||||
} else if (p.char(3) === 'N') {
|
||||
current = p.getMatch(g.EntityDecl);
|
||||
}
|
||||
break;
|
||||
case 'A': // ATTRIBUTE
|
||||
current = p.getMatch(g.AttlistDecl);
|
||||
break;
|
||||
case 'N': // NOTATION
|
||||
current = p.getMatch(g.NotationDecl);
|
||||
break;
|
||||
case '-': // COMMENT
|
||||
current = p.getMatch(g.Comment);
|
||||
break;
|
||||
}
|
||||
} else if (p.char() === '<' && p.char(1) === '?') {
|
||||
current = parsePI(p, errorHandler);
|
||||
} else if (p.char() === '%') {
|
||||
current = p.getMatch(g.PEReference);
|
||||
} else {
|
||||
return errorHandler.fatalError('Error detected in Markup declaration');
|
||||
}
|
||||
if (!current) {
|
||||
return errorHandler.fatalError('Error in internal subset at position ' + p.getIndex());
|
||||
}
|
||||
}
|
||||
return errorHandler.fatalError('doctype internal subset is not well-formed, missing ]');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when the parser encounters an element starting with '<!'.
|
||||
*
|
||||
* @param {string} source
|
||||
* The xml.
|
||||
* @param {number} start
|
||||
* the start index of the '<!'
|
||||
* @param {DOMHandler} domBuilder
|
||||
* @param {DOMHandler} errorHandler
|
||||
* @param {boolean} isHTML
|
||||
* @returns {number | never}
|
||||
* The end index of the element.
|
||||
* @throws {ParseError}
|
||||
* In case the element is not well-formed.
|
||||
*/
|
||||
function parseDoctypeCommentOrCData(source, start, domBuilder, errorHandler, isHTML) {
|
||||
var p = parseUtils(source, start);
|
||||
|
||||
switch (isHTML ? p.char(2).toUpperCase() : p.char(2)) {
|
||||
case '-':
|
||||
// should be a comment
|
||||
var comment = p.getMatch(g.Comment);
|
||||
if (comment) {
|
||||
domBuilder.comment(comment, g.COMMENT_START.length, comment.length - g.COMMENT_START.length - g.COMMENT_END.length);
|
||||
return p.getIndex();
|
||||
} else {
|
||||
return errorHandler.fatalError('comment is not well-formed at position ' + p.getIndex());
|
||||
}
|
||||
case '[':
|
||||
// should be CDATA
|
||||
var cdata = p.getMatch(g.CDSect);
|
||||
if (cdata) {
|
||||
if (!isHTML && !domBuilder.currentElement) {
|
||||
return errorHandler.fatalError('CDATA outside of element');
|
||||
}
|
||||
domBuilder.startCDATA();
|
||||
domBuilder.characters(cdata, g.CDATA_START.length, cdata.length - g.CDATA_START.length - g.CDATA_END.length);
|
||||
domBuilder.endCDATA();
|
||||
return p.getIndex();
|
||||
} else {
|
||||
return errorHandler.fatalError('Invalid CDATA starting at position ' + start);
|
||||
}
|
||||
case 'D': {
|
||||
// should be DOCTYPE
|
||||
if (domBuilder.doc && domBuilder.doc.documentElement) {
|
||||
return errorHandler.fatalError('Doctype not allowed inside or after documentElement at position ' + p.getIndex());
|
||||
}
|
||||
if (isHTML ? !p.substringStartsWithCaseInsensitive(g.DOCTYPE_DECL_START) : !p.substringStartsWith(g.DOCTYPE_DECL_START)) {
|
||||
return errorHandler.fatalError('Expected ' + g.DOCTYPE_DECL_START + ' at position ' + p.getIndex());
|
||||
}
|
||||
p.skip(g.DOCTYPE_DECL_START.length);
|
||||
if (p.skipBlanks() < 1) {
|
||||
return errorHandler.fatalError('Expected whitespace after ' + g.DOCTYPE_DECL_START + ' at position ' + p.getIndex());
|
||||
}
|
||||
|
||||
var doctype = {
|
||||
name: undefined,
|
||||
publicId: undefined,
|
||||
systemId: undefined,
|
||||
internalSubset: undefined,
|
||||
};
|
||||
// Parse the DOCTYPE name
|
||||
doctype.name = p.getMatch(g.Name);
|
||||
if (!doctype.name)
|
||||
return errorHandler.fatalError('doctype name missing or contains unexpected characters at position ' + p.getIndex());
|
||||
|
||||
if (isHTML && doctype.name.toLowerCase() !== 'html') {
|
||||
errorHandler.warning('Unexpected DOCTYPE in HTML document at position ' + p.getIndex());
|
||||
}
|
||||
p.skipBlanks();
|
||||
|
||||
// Check for ExternalID
|
||||
if (p.substringStartsWith(g.PUBLIC) || p.substringStartsWith(g.SYSTEM)) {
|
||||
var match = g.ExternalID_match.exec(p.substringFromIndex());
|
||||
if (!match) {
|
||||
return errorHandler.fatalError('doctype external id is not well-formed at position ' + p.getIndex());
|
||||
}
|
||||
if (match.groups.SystemLiteralOnly !== undefined) {
|
||||
doctype.systemId = match.groups.SystemLiteralOnly;
|
||||
} else {
|
||||
doctype.systemId = match.groups.SystemLiteral;
|
||||
doctype.publicId = match.groups.PubidLiteral;
|
||||
}
|
||||
p.skip(match[0].length);
|
||||
} else if (isHTML && p.substringStartsWithCaseInsensitive(g.SYSTEM)) {
|
||||
// https://html.spec.whatwg.org/multipage/syntax.html#doctype-legacy-string
|
||||
p.skip(g.SYSTEM.length);
|
||||
if (p.skipBlanks() < 1) {
|
||||
return errorHandler.fatalError('Expected whitespace after ' + g.SYSTEM + ' at position ' + p.getIndex());
|
||||
}
|
||||
doctype.systemId = p.getMatch(g.ABOUT_LEGACY_COMPAT_SystemLiteral);
|
||||
if (!doctype.systemId) {
|
||||
return errorHandler.fatalError(
|
||||
'Expected ' + g.ABOUT_LEGACY_COMPAT + ' in single or double quotes after ' + g.SYSTEM + ' at position ' + p.getIndex()
|
||||
);
|
||||
}
|
||||
}
|
||||
if (isHTML && doctype.systemId && !g.ABOUT_LEGACY_COMPAT_SystemLiteral.test(doctype.systemId)) {
|
||||
errorHandler.warning('Unexpected doctype.systemId in HTML document at position ' + p.getIndex());
|
||||
}
|
||||
if (!isHTML) {
|
||||
p.skipBlanks();
|
||||
doctype.internalSubset = parseDoctypeInternalSubset(p, errorHandler);
|
||||
}
|
||||
p.skipBlanks();
|
||||
if (p.char() !== '>') {
|
||||
return errorHandler.fatalError('doctype not terminated with > at position ' + p.getIndex());
|
||||
}
|
||||
p.skip(1);
|
||||
domBuilder.startDTD(doctype.name, doctype.publicId, doctype.systemId, doctype.internalSubset);
|
||||
domBuilder.endDTD();
|
||||
return p.getIndex();
|
||||
}
|
||||
default:
|
||||
return errorHandler.fatalError('Not well-formed XML starting with "<!" at position ' + start);
|
||||
}
|
||||
}
|
||||
|
||||
function parseProcessingInstruction(source, start, domBuilder, errorHandler) {
|
||||
var match = source.substring(start).match(g.PI);
|
||||
if (!match) {
|
||||
return errorHandler.fatalError('Invalid processing instruction starting at position ' + start);
|
||||
}
|
||||
if (match[1].toLowerCase() === 'xml') {
|
||||
if (start > 0) {
|
||||
return errorHandler.fatalError(
|
||||
'processing instruction at position ' + start + ' is an xml declaration which is only at the start of the document'
|
||||
);
|
||||
}
|
||||
if (!g.XMLDecl.test(source.substring(start))) {
|
||||
return errorHandler.fatalError('xml declaration is not well-formed');
|
||||
}
|
||||
}
|
||||
domBuilder.processingInstruction(match[1], match[2]);
|
||||
return start + match[0].length;
|
||||
}
|
||||
|
||||
function ElementAttributes() {
|
||||
this.attributeNames = Object.create(null);
|
||||
}
|
||||
|
||||
ElementAttributes.prototype = {
|
||||
setTagName: function (tagName) {
|
||||
if (!g.QName_exact.test(tagName)) {
|
||||
throw new Error('invalid tagName:' + tagName);
|
||||
}
|
||||
this.tagName = tagName;
|
||||
},
|
||||
addValue: function (qName, value, offset) {
|
||||
if (!g.QName_exact.test(qName)) {
|
||||
throw new Error('invalid attribute:' + qName);
|
||||
}
|
||||
this.attributeNames[qName] = this.length;
|
||||
this[this.length++] = { qName: qName, value: value, offset: offset };
|
||||
},
|
||||
length: 0,
|
||||
getLocalName: function (i) {
|
||||
return this[i].localName;
|
||||
},
|
||||
getLocator: function (i) {
|
||||
return this[i].locator;
|
||||
},
|
||||
getQName: function (i) {
|
||||
return this[i].qName;
|
||||
},
|
||||
getURI: function (i) {
|
||||
return this[i].uri;
|
||||
},
|
||||
getValue: function (i) {
|
||||
return this[i].value;
|
||||
},
|
||||
// ,getIndex:function(uri, localName)){
|
||||
// if(localName){
|
||||
//
|
||||
// }else{
|
||||
// var qName = uri
|
||||
// }
|
||||
// },
|
||||
// getValue:function(){return this.getValue(this.getIndex.apply(this,arguments))},
|
||||
// getType:function(uri,localName){}
|
||||
// getType:function(i){},
|
||||
};
|
||||
|
||||
exports.XMLReader = XMLReader;
|
||||
exports.parseUtils = parseUtils;
|
||||
exports.parseDoctypeCommentOrCData = parseDoctypeCommentOrCData;
|
||||
73
node_modules/@xmldom/xmldom/package.json
generated
vendored
Normal file
73
node_modules/@xmldom/xmldom/package.json
generated
vendored
Normal file
@@ -0,0 +1,73 @@
|
||||
{
|
||||
"name": "@xmldom/xmldom",
|
||||
"version": "0.9.8",
|
||||
"description": "A pure JavaScript W3C standard-based (XML DOM Level 2 Core) DOMParser and XMLSerializer module.",
|
||||
"keywords": [
|
||||
"w3c",
|
||||
"dom",
|
||||
"xml",
|
||||
"parser",
|
||||
"javascript",
|
||||
"DOMParser",
|
||||
"XMLSerializer",
|
||||
"ponyfill"
|
||||
],
|
||||
"homepage": "https://github.com/xmldom/xmldom",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git://github.com/xmldom/xmldom.git"
|
||||
},
|
||||
"main": "lib/index.js",
|
||||
"types": "index.d.ts",
|
||||
"files": [
|
||||
"CHANGELOG.md",
|
||||
"LICENSE",
|
||||
"readme.md",
|
||||
"SECURITY.md",
|
||||
"index.d.ts",
|
||||
"lib"
|
||||
],
|
||||
"scripts": {
|
||||
"lint": "eslint examples lib test",
|
||||
"format": "prettier --write examples lib test index.d.ts",
|
||||
"changelog": "auto-changelog --unreleased-only",
|
||||
"start": "nodemon --watch package.json --watch lib --watch test --exec 'npm --silent run test && npm --silent run lint'",
|
||||
"test": "jest",
|
||||
"fuzz": "jest --config=./jest.fuzz.config.js",
|
||||
"test:types": "cd examples/typescript-node-es6 && ./pretest.sh 3 && ./pretest.sh 4 && ./pretest.sh 5 && node dist/index.js",
|
||||
"testrelease": "npm test && eslint lib",
|
||||
"version": "./changelog-has-version.sh",
|
||||
"release": "np --no-yarn --test-script testrelease"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14.6"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@homer0/prettier-plugin-jsdoc": "9.1.0",
|
||||
"auto-changelog": "2.5.0",
|
||||
"eslint": "8.57.1",
|
||||
"eslint-config-prettier": "10.0.1",
|
||||
"eslint-plugin-anti-trojan-source": "1.1.1",
|
||||
"eslint-plugin-es5": "1.5.0",
|
||||
"eslint-plugin-n": "17.15.1",
|
||||
"eslint-plugin-prettier": "5.2.3",
|
||||
"get-stream": "6.0.1",
|
||||
"jest": "29.7.0",
|
||||
"nodemon": "3.1.9",
|
||||
"np": "8.0.4",
|
||||
"prettier": "3.5.2",
|
||||
"xmltest": "2.0.3",
|
||||
"yauzl": "3.2.0"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/xmldom/xmldom/issues"
|
||||
},
|
||||
"license": "MIT",
|
||||
"auto-changelog": {
|
||||
"prepend": true,
|
||||
"remote": "origin",
|
||||
"tagPrefix": "",
|
||||
"template": "./auto-changelog.hbs"
|
||||
},
|
||||
"packageManager": "npm@11.1.0+sha512.acf301ad9b9ddba948fcb72341e2f0fcae477f56a95cc2a092934d133a7461062633cefbf93d5934a3dc0768674e2edee9f04dcfcc4bb4c327ff0e3a7d552a1b"
|
||||
}
|
||||
357
node_modules/@xmldom/xmldom/readme.md
generated
vendored
Normal file
357
node_modules/@xmldom/xmldom/readme.md
generated
vendored
Normal file
@@ -0,0 +1,357 @@
|
||||
# @xmldom/xmldom
|
||||
|
||||
***Since version 0.7.0 this package is published to npm as [`@xmldom/xmldom`](https://www.npmjs.com/package/@xmldom/xmldom) and no longer as [`xmldom`](https://www.npmjs.com/package/xmldom), because [we are no longer able to publish `xmldom`](https://github.com/xmldom/xmldom/issues/271).***
|
||||
*For better readability in the docs, we will continue to talk about this library as "xmldom".*
|
||||
|
||||
[](https://github.com/xmldom/xmldom/blob/master/LICENSE)
|
||||
[](https://socket.dev/npm/package/@xmldom/xmldom)
|
||||
[](https://codecov.io/gh/xmldom/xmldom)
|
||||
[](https://packagephobia.com/result?p=@xmldom/xmldom)
|
||||
|
||||
[](https://www.bestpractices.dev/projects/7879)
|
||||
[](https://securityscorecards.dev/viewer/?uri=github.com/xmldom/xmldom)
|
||||
[](https://socket.dev/npm/package/@xmldom/xmldom)
|
||||
[](https://snyk.io/advisor/npm-package/@xmldom/xmldom)
|
||||
|
||||
[](https://www.npmjs.com/package/@xmldom/xmldom)
|
||||
[](https://www.npmjs.com/package/@xmldom/xmldom?activeTab=versions)
|
||||
[](https://www.npmjs.com/package/@xmldom/xmldom?activeTab=versions)
|
||||
|
||||
[](https://github.com/xmldom/xmldom/issues?q=is%3Aissue+is%3Aopen+label%3Abug)
|
||||
[](https://github.com/xmldom/xmldom/issues?q=is%3Aissue+is%3Aopen+label%3Ahelp-wanted)
|
||||
|
||||
xmldom is a javascript [ponyfill](https://ponyfill.com/) to provide the following APIs [that are present in modern browsers](https://caniuse.com/xml-serializer) to other runtimes:
|
||||
- convert an XML string into a DOM tree
|
||||
```
|
||||
new DOMParser().parseFromString(xml, mimeType) => Document
|
||||
```
|
||||
- create, access and modify a DOM tree
|
||||
```
|
||||
new DOMImplementation().createDocument(...) => Document
|
||||
```
|
||||
- serialize a DOM tree back into an XML string
|
||||
```
|
||||
new XMLSerializer().serializeToString(node) => string
|
||||
```
|
||||
|
||||
The target runtimes `xmldom` supports are currently Node >= v14.6 (and very likely any other [ES5 compatible runtime](https://compat-table.github.io/compat-table/es5/)).
|
||||
|
||||
When deciding how to fix bugs or implement features, `xmldom` tries to stay as close as possible to the various [related specifications/standards](#specs).
|
||||
As indicated by the version starting with `0.`, this implementation is not feature complete and some implemented features differ from what the specifications describe.
|
||||
**Issues and PRs for such differences are always welcome, even when they only provide a failing test case.**
|
||||
|
||||
This project was forked from it's [original source](https://github.com/jindw/xmldom) in 2019, more details about that transition can be found in the [CHANGELOG](CHANGELOG.md#maintainer-changes).
|
||||
|
||||
## Usage
|
||||
|
||||
### Install:
|
||||
|
||||
```
|
||||
npm install @xmldom/xmldom
|
||||
```
|
||||
|
||||
### Example:
|
||||
|
||||
[In NodeJS](examples/nodejs/src/index.js)
|
||||
```javascript
|
||||
const { DOMParser, XMLSerializer } = require('@xmldom/xmldom')
|
||||
|
||||
const source = `<xml xmlns="a">
|
||||
<child>test</child>
|
||||
<child/>
|
||||
</xml>`
|
||||
|
||||
const doc = new DOMParser().parseFromString(source, 'text/xml')
|
||||
|
||||
const serialized = new XMLSerializer().serializeToString(doc)
|
||||
```
|
||||
|
||||
Note: in Typescript ~~and ES6~~ (see [#316](https://github.com/xmldom/xmldom/issues/316)) you can use the `import` approach, as follows:
|
||||
|
||||
```typescript
|
||||
import { DOMParser } from '@xmldom/xmldom'
|
||||
```
|
||||
|
||||
## API Reference
|
||||
|
||||
* [DOMParser](https://developer.mozilla.org/en-US/docs/Web/API/DOMParser):
|
||||
|
||||
```javascript
|
||||
parseFromString(xmlsource, mimeType)
|
||||
```
|
||||
* **options extension** _by xmldom_ (not DOM standard!!)
|
||||
|
||||
```javascript
|
||||
// the options argument can be used to modify behavior
|
||||
// for more details check the documentation on the code or type definition
|
||||
new DOMParser(options)
|
||||
```
|
||||
|
||||
* [XMLSerializer](https://developer.mozilla.org/en-US/docs/Web/API/XMLSerializer)
|
||||
|
||||
```javascript
|
||||
serializeToString(node)
|
||||
```
|
||||
### DOM level2 method and attribute:
|
||||
|
||||
* [Node](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247)
|
||||
|
||||
readonly class properties (aka `NodeType`),
|
||||
these can be accessed from any `Node` instance `node`:
|
||||
`if (node.nodeType === node.ELEMENT_NODE) {...`
|
||||
|
||||
1. `ELEMENT_NODE` (`1`)
|
||||
2. `ATTRIBUTE_NODE` (`2`)
|
||||
3. `TEXT_NODE` (`3`)
|
||||
4. `CDATA_SECTION_NODE` (`4`)
|
||||
5. `ENTITY_REFERENCE_NODE` (`5`)
|
||||
6. `ENTITY_NODE` (`6`)
|
||||
7. `PROCESSING_INSTRUCTION_NODE` (`7`)
|
||||
8. `COMMENT_NODE` (`8`)
|
||||
9. `DOCUMENT_NODE` (`9`)
|
||||
10. `DOCUMENT_TYPE_NODE` (`10`)
|
||||
11. `DOCUMENT_FRAGMENT_NODE` (`11`)
|
||||
12. `NOTATION_NODE` (`12`)
|
||||
|
||||
attribute:
|
||||
- `nodeValue` | `prefix` | `textContent`
|
||||
|
||||
readonly attribute:
|
||||
- `nodeName` | `nodeType` | `parentNode` | `parentElement` | `childNodes` | `firstChild` | `lastChild` | `previousSibling` | `nextSibling` | `attributes` | `ownerDocument` | `namespaceURI` | `localName` | `isConnected` | `baseURI`
|
||||
|
||||
method:
|
||||
* `insertBefore(newChild, refChild)`
|
||||
* `replaceChild(newChild, oldChild)`
|
||||
* `removeChild(oldChild)`
|
||||
* `appendChild(newChild)`
|
||||
* `hasChildNodes()`
|
||||
* `cloneNode(deep)`
|
||||
* `normalize()`
|
||||
* `contains(otherNode)`
|
||||
* `getRootNode()`
|
||||
* `isEqualNode(otherNode)`
|
||||
* `isSameNode(otherNode)`
|
||||
* `isSupported(feature, version)`
|
||||
* `hasAttributes()`
|
||||
* [DOMException](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html)
|
||||
|
||||
extends the Error type thrown as part of DOM API.
|
||||
|
||||
readonly class properties:
|
||||
- `INDEX_SIZE_ERR` (`1`)
|
||||
- `DOMSTRING_SIZE_ERR` (`2`)
|
||||
- `HIERARCHY_REQUEST_ERR` (`3`)
|
||||
- `WRONG_DOCUMENT_ERR` (`4`)
|
||||
- `INVALID_CHARACTER_ERR` (`5`)
|
||||
- `NO_DATA_ALLOWED_ERR` (`6`)
|
||||
- `NO_MODIFICATION_ALLOWED_ERR` (`7`)
|
||||
- `NOT_FOUND_ERR` (`8`)
|
||||
- `NOT_SUPPORTED_ERR` (`9`)
|
||||
- `INUSE_ATTRIBUTE_ERR` (`10`)
|
||||
- `INVALID_STATE_ERR` (`11`)
|
||||
- `SYNTAX_ERR` (`12`)
|
||||
- `INVALID_MODIFICATION_ERR` (`13`)
|
||||
- `NAMESPACE_ERR` (`14`)
|
||||
- `INVALID_ACCESS_ERR` (`15`)
|
||||
|
||||
attributes:
|
||||
- `code` with a value matching one of the above constants.
|
||||
|
||||
* [DOMImplementation](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-102161490)
|
||||
|
||||
method:
|
||||
- `hasFeature(feature, version)` (deprecated)
|
||||
- `createDocumentType(qualifiedName, publicId, systemId)`
|
||||
- `createDocument(namespaceURI, qualifiedName, doctype)`
|
||||
|
||||
* [Document](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#i-Document) : Node
|
||||
|
||||
readonly attribute:
|
||||
- `doctype` | `implementation` | `documentElement`
|
||||
|
||||
method:
|
||||
- `createElement(tagName)`
|
||||
- `createDocumentFragment()`
|
||||
- `createTextNode(data)`
|
||||
- `createComment(data)`
|
||||
- `createCDATASection(data)`
|
||||
- `createProcessingInstruction(target, data)`
|
||||
- `createAttribute(name)`
|
||||
- `createEntityReference(name)`
|
||||
- `getElementsByTagName(tagname)`
|
||||
- `importNode(importedNode, deep)`
|
||||
- `createElementNS(namespaceURI, qualifiedName)`
|
||||
- `createAttributeNS(namespaceURI, qualifiedName)`
|
||||
- `getElementsByTagNameNS(namespaceURI, localName)`
|
||||
- `getElementById(elementId)`
|
||||
|
||||
* [DocumentFragment](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-B63ED1A3) : Node
|
||||
* [Element](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-745549614) : Node
|
||||
|
||||
readonly attribute:
|
||||
- `tagName`
|
||||
|
||||
method:
|
||||
- `getAttribute(name)`
|
||||
- `setAttribute(name, value)`
|
||||
- `removeAttribute(name)`
|
||||
- `getAttributeNode(name)`
|
||||
- `setAttributeNode(newAttr)`
|
||||
- `removeAttributeNode(oldAttr)`
|
||||
- `getElementsByTagName(name)`
|
||||
- `getAttributeNS(namespaceURI, localName)`
|
||||
- `setAttributeNS(namespaceURI, qualifiedName, value)`
|
||||
- `removeAttributeNS(namespaceURI, localName)`
|
||||
- `getAttributeNodeNS(namespaceURI, localName)`
|
||||
- `setAttributeNodeNS(newAttr)`
|
||||
- `getElementsByTagNameNS(namespaceURI, localName)`
|
||||
- `hasAttribute(name)`
|
||||
- `hasAttributeNS(namespaceURI, localName)`
|
||||
|
||||
* [Attr](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-637646024) : Node
|
||||
|
||||
attribute:
|
||||
- `value`
|
||||
|
||||
readonly attribute:
|
||||
- `name` | `specified` | `ownerElement`
|
||||
|
||||
* [NodeList](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177)
|
||||
|
||||
readonly attribute:
|
||||
- `length`
|
||||
|
||||
method:
|
||||
- `item(index)`
|
||||
|
||||
* [NamedNodeMap](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1780488922)
|
||||
|
||||
readonly attribute:
|
||||
- `length`
|
||||
|
||||
method:
|
||||
- `getNamedItem(name)`
|
||||
- `setNamedItem(arg)`
|
||||
- `removeNamedItem(name)`
|
||||
- `item(index)`
|
||||
- `getNamedItemNS(namespaceURI, localName)`
|
||||
- `setNamedItemNS(arg)`
|
||||
- `removeNamedItemNS(namespaceURI, localName)`
|
||||
|
||||
* [CharacterData](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-FF21A306) : Node
|
||||
|
||||
method:
|
||||
- `substringData(offset, count)`
|
||||
- `appendData(arg)`
|
||||
- `insertData(offset, arg)`
|
||||
- `deleteData(offset, count)`
|
||||
- `replaceData(offset, count, arg)`
|
||||
|
||||
* [Text](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1312295772) : CharacterData
|
||||
|
||||
method:
|
||||
- `splitText(offset)`
|
||||
|
||||
* [CDATASection](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-667469212)
|
||||
* [Comment](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1728279322) : CharacterData
|
||||
|
||||
* [DocumentType](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-412266927)
|
||||
|
||||
readonly attribute:
|
||||
- `name` | `entities` | `notations` | `publicId` | `systemId` | `internalSubset`
|
||||
|
||||
* Notation : Node
|
||||
|
||||
readonly attribute:
|
||||
- `publicId` | `systemId`
|
||||
|
||||
* Entity : Node
|
||||
|
||||
readonly attribute:
|
||||
- `publicId` | `systemId` | `notationName`
|
||||
|
||||
* EntityReference : Node
|
||||
* ProcessingInstruction : Node
|
||||
|
||||
attribute:
|
||||
- `data`
|
||||
readonly attribute:
|
||||
- `target`
|
||||
|
||||
### DOM level 3 support:
|
||||
|
||||
* [Node](http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-textContent)
|
||||
|
||||
attribute:
|
||||
- `textContent`
|
||||
|
||||
method:
|
||||
- `isDefaultNamespace(namespaceURI)`
|
||||
- `lookupNamespaceURI(prefix)`
|
||||
|
||||
### DOM extension by xmldom
|
||||
|
||||
* [Node] Source position extension;
|
||||
|
||||
attribute:
|
||||
- `lineNumber` //number starting from `1`
|
||||
- `columnNumber` //number starting from `1`
|
||||
|
||||
## Specs
|
||||
|
||||
The implementation is based on several specifications:
|
||||
|
||||
<!-- Should open in new tab and the links in the SVG should be clickable there! -->
|
||||
<a href="https://raw.githubusercontent.com/xmldom/xmldom/master/docs/specs.svg" target="_blank" rel="noopener noreferrer nofollow" ></a>
|
||||
|
||||
### DOM Parsing and Serialization
|
||||
|
||||
From the [W3C DOM Parsing and Serialization (WD 2016)](https://www.w3.org/TR/2016/WD-DOM-Parsing-20160517/) `xmldom` provides an implementation for the interfaces:
|
||||
- `DOMParser`
|
||||
- `XMLSerializer`
|
||||
|
||||
Note that there are some known deviations between this implementation and the W3 specifications.
|
||||
|
||||
Note: [The latest version of this spec](https://w3c.github.io/DOM-Parsing/) has the status "Editors Draft", since it is under active development. One major change is that [the definition of the `DOMParser` interface has been moved to the HTML spec](https://w3c.github.io/DOM-Parsing/#the-domparser-interface)
|
||||
|
||||
|
||||
### DOM
|
||||
|
||||
The original author claims that xmldom implements [DOM Level 2] in a "fully compatible" way and some parts of [DOM Level 3], but there are not enough tests to prove this. Both Specifications are now superseded by the [DOM Level 4 aka Living standard] wich has a much broader scope than xmldom.
|
||||
In the past, there have been multiple (even breaking) changes to align xmldom with the living standard,
|
||||
so if you find a difference that is not documented, any contribution to resolve the difference is very welcome (even just reporting it as an issue).
|
||||
|
||||
xmldom implements the following interfaces:
|
||||
- `Attr`
|
||||
- `CDATASection`
|
||||
- `CharacterData`
|
||||
- `Comment`
|
||||
- `Document`
|
||||
- `DocumentFragment`
|
||||
- `DocumentType`
|
||||
- `DOMException`
|
||||
- `DOMImplementation`
|
||||
- `Element`
|
||||
- `Entity`
|
||||
- `EntityReference`
|
||||
- `LiveNodeList`
|
||||
- `NamedNodeMap`
|
||||
- `Node`
|
||||
- `NodeList`
|
||||
- `Notation`
|
||||
- `ProcessingInstruction`
|
||||
- `Text`
|
||||
|
||||
more details are available in the (incomplete) [API Reference](#api-reference) section.
|
||||
|
||||
### HTML
|
||||
|
||||
xmldom does not have any goal of supporting the full spec, but it has some capability to parse, report and serialize things differently when it is told to parse HTML (by passing the HTML namespace).
|
||||
|
||||
### SAX, XML, XMLNS
|
||||
|
||||
xmldom has an own SAX parser implementation to do the actual parsing, which implements some interfaces in alignment with the Java interfaces SAX defines:
|
||||
- `XMLReader`
|
||||
- `DOMHandler`
|
||||
|
||||
There is an idea/proposal to make it possible to replace it with something else in <https://github.com/xmldom/xmldom/issues/55>
|
||||
Reference in New Issue
Block a user