123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312 |
- "use strict";
- /**
- * Copyright (C) 2016-2019 Michael Kourlas
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
- };
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.validatePubId = void 0;
- var error_1 = require("../error");
- var options_1 = require("../options");
- var validate_1 = require("../validate");
- var XmlComment_1 = __importDefault(require("./XmlComment"));
- var XmlDtdAttlist_1 = __importDefault(require("./XmlDtdAttlist"));
- var XmlDtdElement_1 = __importDefault(require("./XmlDtdElement"));
- var XmlDtdEntity_1 = __importDefault(require("./XmlDtdEntity"));
- var XmlDtdNotation_1 = __importDefault(require("./XmlDtdNotation"));
- var XmlDtdParamEntityRef_1 = __importDefault(require("./XmlDtdParamEntityRef"));
- var XmlProcInst_1 = __importDefault(require("./XmlProcInst"));
- /**
- * Represents an XML document type definition (DTD).
- *
- * A document type definition is structured as follows, where `{name}` is
- * the name of the DTD, `{sysId}` is the system identifier of the DTD,
- * `{pubId}` is the public identifier of the DTD, and `{intSubset}` is the
- * internal subset of the DTD:
- *
- * ```xml
- * <!DOCTYPE {name} SYSTEM "{sysId}" PUBLIC "{pubId}" [
- * {intSubset}
- * ]>
- * ```
- *
- * DTDs can have an unlimited number of comments, attribute-list declarations,
- * element declarations, entity declarations, notation declarations, parameter
- * entity references, and processing instructions.
- */
- var XmlDtd = /** @class */ (function () {
- function XmlDtd(parent, validation, options) {
- this._pubId = undefined;
- this._sysId = undefined;
- this._validation = validation;
- this._children = [];
- this._parent = parent;
- this.name = options.name;
- if (!(0, validate_1.isUndefined)(options.sysId)) {
- this.sysId = options.sysId;
- }
- if (!(0, validate_1.isUndefined)(options.pubId)) {
- this.pubId = options.pubId;
- }
- }
- Object.defineProperty(XmlDtd.prototype, "name", {
- /**
- * Gets the name of the DTD.
- */
- get: function () {
- return this._name;
- },
- /**
- * Sets the name of the DTD.
- */
- set: function (name) {
- if (this._validation && !(0, validate_1.validateName)(name)) {
- throw new Error((0, error_1.getContext)(this.up()) + ": DTD name \"" + name + "\""
- + " should not contain characters not allowed in"
- + " XML names");
- }
- this._name = name;
- },
- enumerable: false,
- configurable: true
- });
- Object.defineProperty(XmlDtd.prototype, "pubId", {
- /**
- * Gets the public identifier of the DTD.
- */
- get: function () {
- return this._pubId;
- },
- /**
- * Sets the public identifier of the DTD.
- */
- set: function (pubId) {
- if (!(0, validate_1.isUndefined)(pubId)) {
- if (this._validation && !validatePubId(pubId)) {
- throw new Error((0, error_1.getContext)(this.up()) + ": DTD public"
- + (" identifier \"" + pubId + "\" should not contain")
- + " characters not allowed in public"
- + " identifiers");
- }
- if (this._validation && (0, validate_1.isUndefined)(this._sysId)) {
- throw new Error((0, error_1.getContext)(this.up()) + ": DTD public"
- + (" identifier \"" + pubId + "\" should not be defined")
- + " if system identifier is undefined");
- }
- }
- this._pubId = pubId;
- },
- enumerable: false,
- configurable: true
- });
- Object.defineProperty(XmlDtd.prototype, "sysId", {
- /**
- * Gets the system identifier of the DTD.
- */
- get: function () {
- return this._sysId;
- },
- /**
- * Sets the system identifier of the DTD.
- */
- set: function (sysId) {
- if (!(0, validate_1.isUndefined)(sysId)) {
- if (this._validation && !(0, validate_1.validateChar)(sysId)) {
- throw new Error((0, error_1.getContext)(this.up()) + ": DTD system"
- + (" identifier \"" + sysId + "\" should not contain")
- + " characters not allowed in XML");
- }
- else if (this._validation
- && sysId.indexOf("'") !== -1
- && sysId.indexOf("\"") !== -1) {
- throw new Error((0, error_1.getContext)(this.up()) + ": DTD system"
- + (" identifier \"" + sysId + "\" should not contain")
- + " both single quotes and double quotes");
- }
- }
- this._sysId = sysId;
- },
- enumerable: false,
- configurable: true
- });
- /**
- * Adds an attribute-list declaration to this document type declaration
- * and returns the new attribute-list declaration.
- */
- XmlDtd.prototype.attlist = function (options) {
- var attlist = new XmlDtdAttlist_1.default(this, this._validation, options);
- this._children.push(attlist);
- return attlist;
- };
- /**
- * Adds a comment to this document type declaration and returns the
- * new comment.
- */
- XmlDtd.prototype.comment = function (options) {
- var comment = new XmlComment_1.default(this, this._validation, options);
- this._children.push(comment);
- return comment;
- };
- /**
- * Adds an element declaration to this document type declaration
- * and returns the new element declaration.
- */
- XmlDtd.prototype.element = function (options) {
- var element = new XmlDtdElement_1.default(this, this._validation, options);
- this._children.push(element);
- return element;
- };
- /**
- * Adds an entity declaration to this document type declaration
- * and returns the new entity declaration.
- */
- XmlDtd.prototype.entity = function (options) {
- var entity = new XmlDtdEntity_1.default(this, this._validation, options);
- this._children.push(entity);
- return entity;
- };
- /**
- * Adds a notation declaration to this document type declaration
- * and returns the new notation declaration.
- */
- XmlDtd.prototype.notation = function (options) {
- var notation = new XmlDtdNotation_1.default(this, this._validation, options);
- this._children.push(notation);
- return notation;
- };
- /**
- * Adds a parameter entity reference to this document type declaration
- * and returns the new parameter entity reference.
- */
- XmlDtd.prototype.paramEntityRef = function (options) {
- var paramEntity = new XmlDtdParamEntityRef_1.default(this, this._validation, options);
- this._children.push(paramEntity);
- return paramEntity;
- };
- /**
- * Adds a processing instruction to this document type declaration
- * and returns the new processing instruction.
- */
- XmlDtd.prototype.procInst = function (options) {
- var procInst = new XmlProcInst_1.default(this, this._validation, options);
- this._children.push(procInst);
- return procInst;
- };
- /**
- * Returns an XML string representation of this document type declaration.
- */
- XmlDtd.prototype.toString = function (options) {
- if (options === void 0) { options = {}; }
- var optionsObj = new options_1.StringOptions(options);
- var str = "<!DOCTYPE " + this._name;
- if ((0, validate_1.isUndefined)(this._pubId)) {
- if (!(0, validate_1.isUndefined)(this._sysId)) {
- str += " ";
- str = this.appendId("SYSTEM", this._sysId, str, optionsObj);
- }
- }
- else {
- if ((0, validate_1.isUndefined)(this._sysId)) {
- throw new Error((0, error_1.getContext)(this.up()) + ": DTD system"
- + " identifier is not undefined");
- }
- str += " ";
- str = this.appendId("PUBLIC", this._pubId, str, optionsObj);
- str = this.appendId("", this._sysId, str, optionsObj);
- }
- if (this._children.length !== 0) {
- str += " [";
- for (var _i = 0, _a = this._children; _i < _a.length; _i++) {
- var node = _a[_i];
- if (optionsObj.pretty) {
- str += optionsObj.newline + optionsObj.indent;
- }
- str += node.toString();
- }
- if (optionsObj.pretty) {
- str += optionsObj.newline;
- }
- str += "]>";
- }
- else {
- str += ">";
- }
- return str;
- };
- /**
- * Returns the parent of this attribute.
- */
- XmlDtd.prototype.up = function () {
- return this._parent;
- };
- /**
- * Appends the XML string representation of a public or system identifier
- * to an existing string.
- */
- XmlDtd.prototype.appendId = function (type, value, str, options) {
- str += type + " ";
- if (options.doubleQuotes) {
- if (this._validation && value.indexOf("\"") !== -1) {
- throw new Error((0, error_1.getContext)(this.up()) + ": doubleQuotes option"
- + " inconsistent with DTD system identifier or"
- + " public identifier");
- }
- str += "\"" + value + "\"";
- }
- else {
- if (this._validation && value.indexOf("'") !== -1) {
- throw new Error((0, error_1.getContext)(this) + ": doubleQuotes option"
- + " inconsistent with DTD system identifier or"
- + " public identifier");
- }
- str += "'" + value + "'";
- }
- return str;
- };
- return XmlDtd;
- }());
- exports.default = XmlDtd;
- /**
- * Returns true if the specified public identifier only contains characters
- * permitted by the XML specification.
- */
- function validatePubId(str) {
- for (var i = 0; i < str.length; i++) {
- var char = str.charCodeAt(i);
- if (char === 0xA
- || char === 0xD
- || char === 0x20
- || char === 0x21
- || (char >= 0x23 && char <= 0x25)
- || (char >= 0x27 && char <= 0x2F)
- || (char >= 0x30 && char <= 0x39)
- || char === 0x3A
- || char === 0x3B
- || char === 0x3D
- || char === 0x3F
- || (char >= 0x40 && char <= 0x5A)
- || char === 0x5F
- || (char >= 0x61 && char <= 0x7A)) {
- continue;
- }
- if (i + 1 === str.length) {
- return false;
- }
- return false;
- }
- return true;
- }
- exports.validatePubId = validatePubId;
|