Initial commit

This commit is contained in:
yuding
2025-12-03 12:00:46 +08:00
commit 5763b764a3
5365 changed files with 1483113 additions and 0 deletions

View File

@@ -0,0 +1,92 @@
"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.BuiltInDocNodes = void 0;
const DocNode_1 = require("./DocNode");
const nodes = __importStar(require(".."));
class BuiltInDocNodes {
static register(configuration) {
const docNodeManager = configuration.docNodeManager;
docNodeManager.registerDocNodes('@microsoft/tsdoc', [
{ docNodeKind: DocNode_1.DocNodeKind.Block, constructor: nodes.DocBlock },
{ docNodeKind: DocNode_1.DocNodeKind.BlockTag, constructor: nodes.DocBlockTag },
{ docNodeKind: DocNode_1.DocNodeKind.CodeSpan, constructor: nodes.DocCodeSpan },
{ docNodeKind: DocNode_1.DocNodeKind.Comment, constructor: nodes.DocComment },
{ docNodeKind: DocNode_1.DocNodeKind.DeclarationReference, constructor: nodes.DocDeclarationReference },
{ docNodeKind: DocNode_1.DocNodeKind.ErrorText, constructor: nodes.DocErrorText },
{ docNodeKind: DocNode_1.DocNodeKind.EscapedText, constructor: nodes.DocEscapedText },
{ docNodeKind: DocNode_1.DocNodeKind.Excerpt, constructor: nodes.DocExcerpt },
{ docNodeKind: DocNode_1.DocNodeKind.FencedCode, constructor: nodes.DocFencedCode },
{ docNodeKind: DocNode_1.DocNodeKind.HtmlAttribute, constructor: nodes.DocHtmlAttribute },
{ docNodeKind: DocNode_1.DocNodeKind.HtmlEndTag, constructor: nodes.DocHtmlEndTag },
{ docNodeKind: DocNode_1.DocNodeKind.HtmlStartTag, constructor: nodes.DocHtmlStartTag },
{ docNodeKind: DocNode_1.DocNodeKind.InheritDocTag, constructor: nodes.DocInheritDocTag },
{ docNodeKind: DocNode_1.DocNodeKind.InlineTag, constructor: nodes.DocInlineTag },
{ docNodeKind: DocNode_1.DocNodeKind.LinkTag, constructor: nodes.DocLinkTag },
{ docNodeKind: DocNode_1.DocNodeKind.MemberIdentifier, constructor: nodes.DocMemberIdentifier },
{ docNodeKind: DocNode_1.DocNodeKind.MemberReference, constructor: nodes.DocMemberReference },
{ docNodeKind: DocNode_1.DocNodeKind.MemberSelector, constructor: nodes.DocMemberSelector },
{ docNodeKind: DocNode_1.DocNodeKind.MemberSymbol, constructor: nodes.DocMemberSymbol },
{ docNodeKind: DocNode_1.DocNodeKind.Paragraph, constructor: nodes.DocParagraph },
{ docNodeKind: DocNode_1.DocNodeKind.ParamBlock, constructor: nodes.DocParamBlock },
{ docNodeKind: DocNode_1.DocNodeKind.ParamCollection, constructor: nodes.DocParamCollection },
{ docNodeKind: DocNode_1.DocNodeKind.PlainText, constructor: nodes.DocPlainText },
{ docNodeKind: DocNode_1.DocNodeKind.Section, constructor: nodes.DocSection },
{ docNodeKind: DocNode_1.DocNodeKind.SoftBreak, constructor: nodes.DocSoftBreak }
]);
docNodeManager.registerAllowableChildren(DocNode_1.DocNodeKind.Section, [
DocNode_1.DocNodeKind.FencedCode,
DocNode_1.DocNodeKind.Paragraph,
DocNode_1.DocNodeKind.HtmlStartTag,
DocNode_1.DocNodeKind.HtmlEndTag
]);
docNodeManager.registerAllowableChildren(DocNode_1.DocNodeKind.Paragraph, [
DocNode_1.DocNodeKind.BlockTag,
DocNode_1.DocNodeKind.CodeSpan,
DocNode_1.DocNodeKind.ErrorText,
DocNode_1.DocNodeKind.EscapedText,
DocNode_1.DocNodeKind.HtmlStartTag,
DocNode_1.DocNodeKind.HtmlEndTag,
DocNode_1.DocNodeKind.InlineTag,
DocNode_1.DocNodeKind.LinkTag,
DocNode_1.DocNodeKind.PlainText,
DocNode_1.DocNodeKind.SoftBreak
]);
}
}
exports.BuiltInDocNodes = BuiltInDocNodes;
//# sourceMappingURL=BuiltInDocNodes.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,44 @@
"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.DocBlock = void 0;
const DocNode_1 = require("./DocNode");
const DocSection_1 = require("./DocSection");
/**
* Represents a section that is introduced by a TSDoc block tag.
* For example, an `@example` block.
*/
class DocBlock extends DocNode_1.DocNode {
/**
* Don't call this directly. Instead use {@link TSDocParser}
* @internal
*/
constructor(parameters) {
super(parameters);
this._blockTag = parameters.blockTag;
this._content = new DocSection_1.DocSection({ configuration: this.configuration });
}
/** @override */
get kind() {
return DocNode_1.DocNodeKind.Block;
}
/**
* The TSDoc tag that introduces this section.
*/
get blockTag() {
return this._blockTag;
}
/**
* The TSDoc tag that introduces this section.
*/
get content() {
return this._content;
}
/** @override */
onGetChildNodes() {
return [this.blockTag, this._content];
}
}
exports.DocBlock = DocBlock;
//# sourceMappingURL=DocBlock.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"DocBlock.js","sourceRoot":"","sources":["../../src/nodes/DocBlock.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;AAE3D,uCAAyG;AACzG,6CAA0C;AAiB1C;;;GAGG;AACH,MAAa,QAAS,SAAQ,iBAAO;IAInC;;;OAGG;IACH,YAAmB,UAA2D;QAC5E,KAAK,CAAC,UAAU,CAAC,CAAC;QAClB,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,QAAQ,CAAC;QACrC,IAAI,CAAC,QAAQ,GAAG,IAAI,uBAAU,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,gBAAgB;IAChB,IAAW,IAAI;QACb,OAAO,qBAAW,CAAC,KAAK,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,gBAAgB;IACN,eAAe;QACvB,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;CACF;AArCD,4BAqCC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nimport { DocNodeKind, DocNode, type IDocNodeParameters, type IDocNodeParsedParameters } from './DocNode';\r\nimport { DocSection } from './DocSection';\r\nimport type { DocBlockTag } from './DocBlockTag';\r\n\r\n/**\r\n * Constructor parameters for {@link DocBlock}.\r\n */\r\nexport interface IDocBlockParameters extends IDocNodeParameters {\r\n blockTag: DocBlockTag;\r\n}\r\n\r\n/**\r\n * Constructor parameters for {@link DocBlock}.\r\n */\r\nexport interface IDocBlockParsedParameters extends IDocNodeParsedParameters {\r\n blockTag: DocBlockTag;\r\n}\r\n\r\n/**\r\n * Represents a section that is introduced by a TSDoc block tag.\r\n * For example, an `@example` block.\r\n */\r\nexport class DocBlock extends DocNode {\r\n private readonly _blockTag: DocBlockTag;\r\n private readonly _content: DocSection;\r\n\r\n /**\r\n * Don't call this directly. Instead use {@link TSDocParser}\r\n * @internal\r\n */\r\n public constructor(parameters: IDocBlockParameters | IDocBlockParsedParameters) {\r\n super(parameters);\r\n this._blockTag = parameters.blockTag;\r\n this._content = new DocSection({ configuration: this.configuration });\r\n }\r\n\r\n /** @override */\r\n public get kind(): DocNodeKind | string {\r\n return DocNodeKind.Block;\r\n }\r\n\r\n /**\r\n * The TSDoc tag that introduces this section.\r\n */\r\n public get blockTag(): DocBlockTag {\r\n return this._blockTag;\r\n }\r\n\r\n /**\r\n * The TSDoc tag that introduces this section.\r\n */\r\n public get content(): DocSection {\r\n return this._content;\r\n }\r\n\r\n /** @override */\r\n protected onGetChildNodes(): ReadonlyArray<DocNode | undefined> {\r\n return [this.blockTag, this._content];\r\n }\r\n}\r\n"]}

View File

@@ -0,0 +1,60 @@
"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.DocBlockTag = void 0;
const DocNode_1 = require("./DocNode");
const StringChecks_1 = require("../parser/StringChecks");
const DocExcerpt_1 = require("./DocExcerpt");
/**
* Represents a TSDoc block tag such as `@param` or `@public`.
*/
class DocBlockTag extends DocNode_1.DocNode {
/**
* Don't call this directly. Instead use {@link TSDocParser}
* @internal
*/
constructor(parameters) {
super(parameters);
StringChecks_1.StringChecks.validateTSDocTagName(parameters.tagName);
this._tagName = parameters.tagName;
this._tagNameWithUpperCase = parameters.tagName.toUpperCase();
if (DocNode_1.DocNode.isParsedParameters(parameters)) {
this._tagNameExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.BlockTag,
content: parameters.tagNameExcerpt
});
}
}
/** @override */
get kind() {
return DocNode_1.DocNodeKind.BlockTag;
}
/**
* The TSDoc tag name. TSDoc tag names start with an at-sign (`@`) followed
* by ASCII letters using "camelCase" capitalization.
*/
get tagName() {
return this._tagName;
}
/**
* The TSDoc tag name in all capitals, which is used for performing
* case-insensitive comparisons or lookups.
*/
get tagNameWithUpperCase() {
return this._tagNameWithUpperCase;
}
/** @override */
onGetChildNodes() {
return [this._tagNameExcerpt];
}
getTokenSequence() {
if (!this._tagNameExcerpt) {
throw new Error('DocBlockTag.getTokenSequence() failed because this object did not originate from a parsed input');
}
return this._tagNameExcerpt.content;
}
}
exports.DocBlockTag = DocBlockTag;
//# sourceMappingURL=DocBlockTag.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"DocBlockTag.js","sourceRoot":"","sources":["../../src/nodes/DocBlockTag.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;AAE3D,uCAAyG;AACzG,yDAAsD;AAEtD,6CAAuD;AAiBvD;;GAEG;AACH,MAAa,WAAY,SAAQ,iBAAO;IAKtC;;;OAGG;IACH,YAAmB,UAAiE;QAClF,KAAK,CAAC,UAAU,CAAC,CAAC;QAElB,2BAAY,CAAC,oBAAoB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACtD,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC;QACnC,IAAI,CAAC,qBAAqB,GAAG,UAAU,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAE9D,IAAI,iBAAO,CAAC,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,eAAe,GAAG,IAAI,uBAAU,CAAC;gBACpC,aAAa,EAAE,IAAI,CAAC,aAAa;gBACjC,WAAW,EAAE,wBAAW,CAAC,QAAQ;gBACjC,OAAO,EAAE,UAAU,CAAC,cAAc;aACnC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,IAAW,IAAI;QACb,OAAO,qBAAW,CAAC,QAAQ,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACH,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,IAAW,oBAAoB;QAC7B,OAAO,IAAI,CAAC,qBAAqB,CAAC;IACpC,CAAC;IAED,gBAAgB;IACN,eAAe;QACvB,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAChC,CAAC;IAEM,gBAAgB;QACrB,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CACb,iGAAiG,CAClG,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC;IACtC,CAAC;CACF;AA3DD,kCA2DC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nimport { DocNodeKind, DocNode, type IDocNodeParameters, type IDocNodeParsedParameters } from './DocNode';\r\nimport { StringChecks } from '../parser/StringChecks';\r\nimport type { TokenSequence } from '../parser/TokenSequence';\r\nimport { DocExcerpt, ExcerptKind } from './DocExcerpt';\r\n\r\n/**\r\n * Constructor parameters for {@link DocBlockTag}.\r\n */\r\nexport interface IDocBlockTagParameters extends IDocNodeParameters {\r\n tagName: string;\r\n}\r\n\r\n/**\r\n * Constructor parameters for {@link DocBlockTag}.\r\n */\r\nexport interface IDocBlockTagParsedParameters extends IDocNodeParsedParameters {\r\n tagName: string;\r\n tagNameExcerpt: TokenSequence;\r\n}\r\n\r\n/**\r\n * Represents a TSDoc block tag such as `@param` or `@public`.\r\n */\r\nexport class DocBlockTag extends DocNode {\r\n private readonly _tagName: string;\r\n private readonly _tagNameWithUpperCase: string;\r\n private readonly _tagNameExcerpt: DocExcerpt | undefined;\r\n\r\n /**\r\n * Don't call this directly. Instead use {@link TSDocParser}\r\n * @internal\r\n */\r\n public constructor(parameters: IDocBlockTagParameters | IDocBlockTagParsedParameters) {\r\n super(parameters);\r\n\r\n StringChecks.validateTSDocTagName(parameters.tagName);\r\n this._tagName = parameters.tagName;\r\n this._tagNameWithUpperCase = parameters.tagName.toUpperCase();\r\n\r\n if (DocNode.isParsedParameters(parameters)) {\r\n this._tagNameExcerpt = new DocExcerpt({\r\n configuration: this.configuration,\r\n excerptKind: ExcerptKind.BlockTag,\r\n content: parameters.tagNameExcerpt\r\n });\r\n }\r\n }\r\n\r\n /** @override */\r\n public get kind(): DocNodeKind | string {\r\n return DocNodeKind.BlockTag;\r\n }\r\n\r\n /**\r\n * The TSDoc tag name. TSDoc tag names start with an at-sign (`@`) followed\r\n * by ASCII letters using \"camelCase\" capitalization.\r\n */\r\n public get tagName(): string {\r\n return this._tagName;\r\n }\r\n\r\n /**\r\n * The TSDoc tag name in all capitals, which is used for performing\r\n * case-insensitive comparisons or lookups.\r\n */\r\n public get tagNameWithUpperCase(): string {\r\n return this._tagNameWithUpperCase;\r\n }\r\n\r\n /** @override */\r\n protected onGetChildNodes(): ReadonlyArray<DocNode | undefined> {\r\n return [this._tagNameExcerpt];\r\n }\r\n\r\n public getTokenSequence(): TokenSequence {\r\n if (!this._tagNameExcerpt) {\r\n throw new Error(\r\n 'DocBlockTag.getTokenSequence() failed because this object did not originate from a parsed input'\r\n );\r\n }\r\n return this._tagNameExcerpt.content;\r\n }\r\n}\r\n"]}

View File

@@ -0,0 +1,59 @@
"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.DocCodeSpan = void 0;
const DocNode_1 = require("./DocNode");
const DocExcerpt_1 = require("./DocExcerpt");
/**
* Represents CommonMark-style code span, i.e. code surrounded by
* backtick characters.
*/
class DocCodeSpan extends DocNode_1.DocNode {
/**
* Don't call this directly. Instead use {@link TSDocParser}
* @internal
*/
constructor(parameters) {
super(parameters);
if (DocNode_1.DocNode.isParsedParameters(parameters)) {
this._openingDelimiterExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.CodeSpan_OpeningDelimiter,
content: parameters.openingDelimiterExcerpt
});
this._codeExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.CodeSpan_Code,
content: parameters.codeExcerpt
});
this._closingDelimiterExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.CodeSpan_ClosingDelimiter,
content: parameters.closingDelimiterExcerpt
});
}
else {
this._code = parameters.code;
}
}
/** @override */
get kind() {
return DocNode_1.DocNodeKind.CodeSpan;
}
/**
* The text that should be rendered as code, excluding the backtick delimiters.
*/
get code() {
if (this._code === undefined) {
this._code = this._codeExcerpt.content.toString();
}
return this._code;
}
/** @override */
onGetChildNodes() {
return [this._openingDelimiterExcerpt, this._codeExcerpt, this._closingDelimiterExcerpt];
}
}
exports.DocCodeSpan = DocCodeSpan;
//# sourceMappingURL=DocCodeSpan.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"DocCodeSpan.js","sourceRoot":"","sources":["../../src/nodes/DocCodeSpan.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;AAE3D,uCAAyG;AAEzG,6CAAuD;AAoBvD;;;GAGG;AACH,MAAa,WAAY,SAAQ,iBAAO;IAWtC;;;OAGG;IACH,YAAmB,UAAiE;QAClF,KAAK,CAAC,UAAU,CAAC,CAAC;QAElB,IAAI,iBAAO,CAAC,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,wBAAwB,GAAG,IAAI,uBAAU,CAAC;gBAC7C,aAAa,EAAE,IAAI,CAAC,aAAa;gBACjC,WAAW,EAAE,wBAAW,CAAC,yBAAyB;gBAClD,OAAO,EAAE,UAAU,CAAC,uBAAuB;aAC5C,CAAC,CAAC;YACH,IAAI,CAAC,YAAY,GAAG,IAAI,uBAAU,CAAC;gBACjC,aAAa,EAAE,IAAI,CAAC,aAAa;gBACjC,WAAW,EAAE,wBAAW,CAAC,aAAa;gBACtC,OAAO,EAAE,UAAU,CAAC,WAAW;aAChC,CAAC,CAAC;YACH,IAAI,CAAC,wBAAwB,GAAG,IAAI,uBAAU,CAAC;gBAC7C,aAAa,EAAE,IAAI,CAAC,aAAa;gBACjC,WAAW,EAAE,wBAAW,CAAC,yBAAyB;gBAClD,OAAO,EAAE,UAAU,CAAC,uBAAuB;aAC5C,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,IAAW,IAAI;QACb,OAAO,qBAAW,CAAC,QAAQ,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,IAAW,IAAI;QACb,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC7B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,YAAa,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrD,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,gBAAgB;IACN,eAAe;QACvB,OAAO,CAAC,IAAI,CAAC,wBAAwB,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,wBAAwB,CAAC,CAAC;IAC3F,CAAC;CACF;AA1DD,kCA0DC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nimport { DocNodeKind, type IDocNodeParameters, DocNode, type IDocNodeParsedParameters } from './DocNode';\r\nimport type { TokenSequence } from '../parser/TokenSequence';\r\nimport { DocExcerpt, ExcerptKind } from './DocExcerpt';\r\n\r\n/**\r\n * Constructor parameters for {@link DocCodeSpan}.\r\n */\r\nexport interface IDocCodeSpanParameters extends IDocNodeParameters {\r\n code: string;\r\n}\r\n\r\n/**\r\n * Constructor parameters for {@link DocCodeSpan}.\r\n */\r\nexport interface IDocCodeSpanParsedParameters extends IDocNodeParsedParameters {\r\n openingDelimiterExcerpt: TokenSequence;\r\n\r\n codeExcerpt: TokenSequence;\r\n\r\n closingDelimiterExcerpt: TokenSequence;\r\n}\r\n\r\n/**\r\n * Represents CommonMark-style code span, i.e. code surrounded by\r\n * backtick characters.\r\n */\r\nexport class DocCodeSpan extends DocNode {\r\n // The opening ` delimiter\r\n private readonly _openingDelimiterExcerpt: DocExcerpt | undefined;\r\n\r\n // The code content\r\n private _code: string | undefined;\r\n private readonly _codeExcerpt: DocExcerpt | undefined;\r\n\r\n // The closing ` delimiter\r\n private readonly _closingDelimiterExcerpt: DocExcerpt | undefined;\r\n\r\n /**\r\n * Don't call this directly. Instead use {@link TSDocParser}\r\n * @internal\r\n */\r\n public constructor(parameters: IDocCodeSpanParameters | IDocCodeSpanParsedParameters) {\r\n super(parameters);\r\n\r\n if (DocNode.isParsedParameters(parameters)) {\r\n this._openingDelimiterExcerpt = new DocExcerpt({\r\n configuration: this.configuration,\r\n excerptKind: ExcerptKind.CodeSpan_OpeningDelimiter,\r\n content: parameters.openingDelimiterExcerpt\r\n });\r\n this._codeExcerpt = new DocExcerpt({\r\n configuration: this.configuration,\r\n excerptKind: ExcerptKind.CodeSpan_Code,\r\n content: parameters.codeExcerpt\r\n });\r\n this._closingDelimiterExcerpt = new DocExcerpt({\r\n configuration: this.configuration,\r\n excerptKind: ExcerptKind.CodeSpan_ClosingDelimiter,\r\n content: parameters.closingDelimiterExcerpt\r\n });\r\n } else {\r\n this._code = parameters.code;\r\n }\r\n }\r\n\r\n /** @override */\r\n public get kind(): DocNodeKind | string {\r\n return DocNodeKind.CodeSpan;\r\n }\r\n\r\n /**\r\n * The text that should be rendered as code, excluding the backtick delimiters.\r\n */\r\n public get code(): string {\r\n if (this._code === undefined) {\r\n this._code = this._codeExcerpt!.content.toString();\r\n }\r\n return this._code;\r\n }\r\n\r\n /** @override */\r\n protected onGetChildNodes(): ReadonlyArray<DocNode | undefined> {\r\n return [this._openingDelimiterExcerpt, this._codeExcerpt, this._closingDelimiterExcerpt];\r\n }\r\n}\r\n"]}

View File

@@ -0,0 +1,99 @@
"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.DocComment = void 0;
const DocNode_1 = require("./DocNode");
const DocSection_1 = require("./DocSection");
const StandardModifierTagSet_1 = require("../details/StandardModifierTagSet");
const StringBuilder_1 = require("../emitters/StringBuilder");
const TSDocEmitter_1 = require("../emitters/TSDocEmitter");
const DocParamCollection_1 = require("./DocParamCollection");
/**
* Represents an entire documentation comment conforming to the TSDoc structure.
* This is the root of the DocNode tree.
*/
class DocComment extends DocNode_1.DocNode {
/**
* Don't call this directly. Instead use {@link TSDocParser}
* @internal
*/
constructor(parameters) {
super(parameters);
this.summarySection = new DocSection_1.DocSection({ configuration: this.configuration });
this.remarksBlock = undefined;
this.privateRemarks = undefined;
this.deprecatedBlock = undefined;
this.params = new DocParamCollection_1.DocParamCollection({ configuration: this.configuration });
this.typeParams = new DocParamCollection_1.DocParamCollection({ configuration: this.configuration });
this.returnsBlock = undefined;
this.modifierTagSet = new StandardModifierTagSet_1.StandardModifierTagSet();
this._seeBlocks = [];
this._customBlocks = [];
}
/** @override */
get kind() {
return DocNode_1.DocNodeKind.Comment;
}
/**
* The collection of all `@see` DockBlockTag nodes belonging to this doc comment.
*/
get seeBlocks() {
return this._seeBlocks;
}
/**
* The collection of all DocBlock nodes belonging to this doc comment.
*/
get customBlocks() {
return this._customBlocks;
}
/**
* Append an item to the seeBlocks collection.
* @internal
*/
_appendSeeBlock(block) {
this._seeBlocks.push(block);
}
/**
* Append an item to the customBlocks collection.
*/
appendCustomBlock(block) {
this._customBlocks.push(block);
}
/** @override */
onGetChildNodes() {
return [
this.summarySection,
this.remarksBlock,
this.privateRemarks,
this.deprecatedBlock,
this.params.count > 0 ? this.params : undefined,
this.typeParams.count > 0 ? this.typeParams : undefined,
this.returnsBlock,
...this.customBlocks,
...this.seeBlocks,
this.inheritDocTag,
...this.modifierTagSet.nodes
];
}
/**
* Generates a doc comment corresponding to the `DocComment` tree. The output is in a normalized form,
* and may ignore formatting/spacing from the original input.
*
* @remarks
* After parsing a string, and possibly modifying the result, `emitAsTsdoc()` can be used to render the result
* as a doc comment in a normalized format. It can also be used to emit a `DocComment` tree that was constructed
* manually.
*
* This method is provided as convenience for simple use cases. To customize the output, or if you need
* to render into a `StringBuilder`, use the {@link TSDocEmitter} class instead.
*/
emitAsTsdoc() {
const stringBuilder = new StringBuilder_1.StringBuilder();
const emitter = new TSDocEmitter_1.TSDocEmitter();
emitter.renderComment(stringBuilder, this);
return stringBuilder.toString();
}
}
exports.DocComment = DocComment;
//# sourceMappingURL=DocComment.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,126 @@
"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.DocDeclarationReference = void 0;
const DocNode_1 = require("./DocNode");
const DocExcerpt_1 = require("./DocExcerpt");
const StringBuilder_1 = require("../emitters/StringBuilder");
const TSDocEmitter_1 = require("../emitters/TSDocEmitter");
/**
* Represents a declaration reference.
*
* @remarks
* Declaration references are TSDoc expressions used by tags such as `{@link}`
* or `{@inheritDoc}` that need to refer to another declaration.
*/
class DocDeclarationReference extends DocNode_1.DocNode {
/**
* Don't call this directly. Instead use {@link TSDocParser}
* @internal
*/
constructor(parameters) {
super(parameters);
if (DocNode_1.DocNode.isParsedParameters(parameters)) {
if (parameters.packageNameExcerpt) {
this._packageNameExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.DeclarationReference_PackageName,
content: parameters.packageNameExcerpt
});
}
if (parameters.importPathExcerpt) {
this._importPathExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.DeclarationReference_ImportPath,
content: parameters.importPathExcerpt
});
}
if (parameters.importHashExcerpt) {
this._importHashExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.DeclarationReference_ImportHash,
content: parameters.importHashExcerpt
});
}
if (parameters.spacingAfterImportHashExcerpt) {
this._spacingAfterImportHashExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.Spacing,
content: parameters.spacingAfterImportHashExcerpt
});
}
}
else {
this._packageName = parameters.packageName;
this._importPath = parameters.importPath;
}
this._memberReferences = [];
if (parameters.memberReferences) {
this._memberReferences.push(...parameters.memberReferences);
}
}
/** @override */
get kind() {
return DocNode_1.DocNodeKind.DeclarationReference;
}
/**
* The optional package name, which may optionally include an NPM scope.
*
* Example: `"@scope/my-package"`
*/
get packageName() {
if (this._packageName === undefined) {
if (this._packageNameExcerpt !== undefined) {
this._packageName = this._packageNameExcerpt.content.toString();
}
}
return this._packageName;
}
/**
* The optional import path. If a package name is provided, then if an import path is provided,
* the path must start with a "/" delimiter; otherwise paths are resolved relative to the source file
* containing the reference.
*
* Example: `"/path1/path2"`
* Example: `"./path1/path2"`
* Example: `"../path2/path2"`
*/
get importPath() {
if (this._importPath === undefined) {
if (this._importPathExcerpt !== undefined) {
this._importPath = this._importPathExcerpt.content.toString();
}
}
return this._importPath;
}
/**
* The chain of member references that indicate the declaration being referenced.
* If this list is empty, then either the packageName or importPath must be provided,
* because the reference refers to a module.
*/
get memberReferences() {
return this._memberReferences;
}
/**
* Generates the TSDoc representation of this declaration reference.
*/
emitAsTsdoc() {
const stringBuilder = new StringBuilder_1.StringBuilder();
const emitter = new TSDocEmitter_1.TSDocEmitter();
emitter.renderDeclarationReference(stringBuilder, this);
return stringBuilder.toString();
}
/** @override */
onGetChildNodes() {
return [
this._packageNameExcerpt,
this._importPathExcerpt,
this._importHashExcerpt,
this._spacingAfterImportHashExcerpt,
...this._memberReferences
];
}
}
exports.DocDeclarationReference = DocDeclarationReference;
//# sourceMappingURL=DocDeclarationReference.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,80 @@
"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.DocErrorText = void 0;
const DocNode_1 = require("./DocNode");
const DocExcerpt_1 = require("./DocExcerpt");
/**
* Represents a span of text that contained invalid markup.
* The characters should be rendered as plain text.
*/
class DocErrorText extends DocNode_1.DocNode {
/**
* Don't call this directly. Instead use {@link TSDocParser}
* @internal
*/
constructor(parameters) {
super(parameters);
this._textExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.ErrorText,
content: parameters.textExcerpt
});
this._messageId = parameters.messageId;
this._errorMessage = parameters.errorMessage;
this._errorLocation = parameters.errorLocation;
}
/** @override */
get kind() {
return DocNode_1.DocNodeKind.ErrorText;
}
/**
* The characters that should be rendered as plain text because they
* could not be parsed successfully.
*/
get text() {
if (this._text === undefined) {
this._text = this._textExcerpt.content.toString();
}
return this._text;
}
get textExcerpt() {
if (this._textExcerpt) {
return this._textExcerpt.content;
}
else {
return undefined;
}
}
/**
* The TSDoc error message identifier.
*/
get messageId() {
return this._messageId;
}
/**
* A description of why the character could not be parsed.
*/
get errorMessage() {
return this._errorMessage;
}
/**
* The range of characters that caused the error. In general these may be
* somewhat farther ahead in the input stream from the DocErrorText node itself.
*
* @remarks
* For example, for the malformed HTML tag `<a href="123" @ /a>`, the DocErrorText node
* will correspond to the `<` character that looked like an HTML tag, whereas the
* error location might be the `@` character that caused the trouble.
*/
get errorLocation() {
return this._errorLocation;
}
/** @override */
onGetChildNodes() {
return [this._textExcerpt];
}
}
exports.DocErrorText = DocErrorText;
//# sourceMappingURL=DocErrorText.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"DocErrorText.js","sourceRoot":"","sources":["../../src/nodes/DocErrorText.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;AAE3D,uCAAgF;AAEhF,6CAAuD;AAcvD;;;GAGG;AACH,MAAa,YAAa,SAAQ,iBAAO;IAQvC;;;OAGG;IACH,YAAmB,UAAyC;QAC1D,KAAK,CAAC,UAAU,CAAC,CAAC;QAElB,IAAI,CAAC,YAAY,GAAG,IAAI,uBAAU,CAAC;YACjC,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,WAAW,EAAE,wBAAW,CAAC,SAAS;YAClC,OAAO,EAAE,UAAU,CAAC,WAAW;SAChC,CAAC,CAAC;QAEH,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,SAAS,CAAC;QACvC,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,YAAY,CAAC;QAC7C,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,aAAa,CAAC;IACjD,CAAC;IAED,gBAAgB;IAChB,IAAW,IAAI;QACb,OAAO,qBAAW,CAAC,SAAS,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACH,IAAW,IAAI;QACb,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC7B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QACpD,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,IAAW,WAAW;QACpB,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;QACnC,CAAC;aAAM,CAAC;YACN,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,IAAW,SAAS;QAClB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED;;;;;;;;OAQG;IACH,IAAW,aAAa;QACtB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED,gBAAgB;IACN,eAAe;QACvB,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC7B,CAAC;CACF;AAjFD,oCAiFC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nimport { DocNodeKind, DocNode, type IDocNodeParsedParameters } from './DocNode';\r\nimport type { TokenSequence } from '../parser/TokenSequence';\r\nimport { DocExcerpt, ExcerptKind } from './DocExcerpt';\r\nimport type { TSDocMessageId } from '../parser/TSDocMessageId';\r\n\r\n/**\r\n * Constructor parameters for {@link DocErrorText}.\r\n */\r\nexport interface IDocErrorTextParsedParameters extends IDocNodeParsedParameters {\r\n textExcerpt: TokenSequence;\r\n\r\n messageId: TSDocMessageId;\r\n errorMessage: string;\r\n errorLocation: TokenSequence;\r\n}\r\n\r\n/**\r\n * Represents a span of text that contained invalid markup.\r\n * The characters should be rendered as plain text.\r\n */\r\nexport class DocErrorText extends DocNode {\r\n private _text: string | undefined;\r\n private readonly _textExcerpt: DocExcerpt;\r\n\r\n private readonly _messageId: TSDocMessageId;\r\n private readonly _errorMessage: string;\r\n private readonly _errorLocation: TokenSequence;\r\n\r\n /**\r\n * Don't call this directly. Instead use {@link TSDocParser}\r\n * @internal\r\n */\r\n public constructor(parameters: IDocErrorTextParsedParameters) {\r\n super(parameters);\r\n\r\n this._textExcerpt = new DocExcerpt({\r\n configuration: this.configuration,\r\n excerptKind: ExcerptKind.ErrorText,\r\n content: parameters.textExcerpt\r\n });\r\n\r\n this._messageId = parameters.messageId;\r\n this._errorMessage = parameters.errorMessage;\r\n this._errorLocation = parameters.errorLocation;\r\n }\r\n\r\n /** @override */\r\n public get kind(): DocNodeKind | string {\r\n return DocNodeKind.ErrorText;\r\n }\r\n\r\n /**\r\n * The characters that should be rendered as plain text because they\r\n * could not be parsed successfully.\r\n */\r\n public get text(): string {\r\n if (this._text === undefined) {\r\n this._text = this._textExcerpt.content.toString();\r\n }\r\n return this._text;\r\n }\r\n\r\n public get textExcerpt(): TokenSequence | undefined {\r\n if (this._textExcerpt) {\r\n return this._textExcerpt.content;\r\n } else {\r\n return undefined;\r\n }\r\n }\r\n\r\n /**\r\n * The TSDoc error message identifier.\r\n */\r\n public get messageId(): TSDocMessageId {\r\n return this._messageId;\r\n }\r\n\r\n /**\r\n * A description of why the character could not be parsed.\r\n */\r\n public get errorMessage(): string {\r\n return this._errorMessage;\r\n }\r\n\r\n /**\r\n * The range of characters that caused the error. In general these may be\r\n * somewhat farther ahead in the input stream from the DocErrorText node itself.\r\n *\r\n * @remarks\r\n * For example, for the malformed HTML tag `<a href=\"123\" @ /a>`, the DocErrorText node\r\n * will correspond to the `<` character that looked like an HTML tag, whereas the\r\n * error location might be the `@` character that caused the trouble.\r\n */\r\n public get errorLocation(): TokenSequence {\r\n return this._errorLocation;\r\n }\r\n\r\n /** @override */\r\n protected onGetChildNodes(): ReadonlyArray<DocNode | undefined> {\r\n return [this._textExcerpt];\r\n }\r\n}\r\n"]}

View File

@@ -0,0 +1,71 @@
"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.DocEscapedText = exports.EscapeStyle = void 0;
const DocNode_1 = require("./DocNode");
const DocExcerpt_1 = require("./DocExcerpt");
/**
* The style of escaping to be used with DocEscapedText.
*/
var EscapeStyle;
(function (EscapeStyle) {
/**
* Use a backslash symbol to escape the character.
*/
EscapeStyle[EscapeStyle["CommonMarkBackslash"] = 0] = "CommonMarkBackslash";
})(EscapeStyle || (exports.EscapeStyle = EscapeStyle = {}));
/**
* Represents a text character that should be escaped as a TSDoc symbol.
* @remarks
* Note that renders will normally apply appropriate escaping when rendering
* DocPlainText in a format such as HTML or TSDoc. The DocEscapedText node
* forces a specific escaping that may not be the default.
*/
class DocEscapedText extends DocNode_1.DocNode {
/**
* Don't call this directly. Instead use {@link TSDocParser}
* @internal
*/
constructor(parameters) {
super(parameters);
this._escapeStyle = parameters.escapeStyle;
this._encodedTextExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.EscapedText,
content: parameters.encodedTextExcerpt
});
this._decodedText = parameters.decodedText;
}
/** @override */
get kind() {
return DocNode_1.DocNodeKind.EscapedText;
}
/**
* The style of escaping to be performed.
*/
get escapeStyle() {
return this._escapeStyle;
}
/**
* The text sequence including escapes.
*/
get encodedText() {
if (this._encodedText === undefined) {
this._encodedText = this._encodedTextExcerpt.content.toString();
}
return this._encodedText;
}
/**
* The text without escaping.
*/
get decodedText() {
return this._decodedText;
}
/** @override */
onGetChildNodes() {
return [this._encodedTextExcerpt];
}
}
exports.DocEscapedText = DocEscapedText;
//# sourceMappingURL=DocEscapedText.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"DocEscapedText.js","sourceRoot":"","sources":["../../src/nodes/DocEscapedText.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;AAE3D,uCAAgF;AAChF,6CAAuD;AAYvD;;GAEG;AACH,IAAY,WAKX;AALD,WAAY,WAAW;IACrB;;OAEG;IACH,2EAAmB,CAAA;AACrB,CAAC,EALW,WAAW,2BAAX,WAAW,QAKtB;AAED;;;;;;GAMG;AACH,MAAa,cAAe,SAAQ,iBAAO;IAQzC;;;OAGG;IACH,YAAmB,UAA2C;QAC5D,KAAK,CAAC,UAAU,CAAC,CAAC;QAElB,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,WAAW,CAAC;QAE3C,IAAI,CAAC,mBAAmB,GAAG,IAAI,uBAAU,CAAC;YACxC,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,WAAW,EAAE,wBAAW,CAAC,WAAW;YACpC,OAAO,EAAE,UAAU,CAAC,kBAAkB;SACvC,CAAC,CAAC;QAEH,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,WAAW,CAAC;IAC7C,CAAC;IAED,gBAAgB;IAChB,IAAW,IAAI;QACb,OAAO,qBAAW,CAAC,WAAW,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,IAAW,WAAW;QACpB,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACpC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QAClE,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED,gBAAgB;IACN,eAAe;QACvB,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACpC,CAAC;CACF;AA3DD,wCA2DC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nimport { DocNodeKind, type IDocNodeParsedParameters, DocNode } from './DocNode';\r\nimport { DocExcerpt, ExcerptKind } from './DocExcerpt';\r\nimport type { TokenSequence } from '../parser/TokenSequence';\r\n\r\n/**\r\n * Constructor parameters for {@link DocEscapedText}.\r\n */\r\nexport interface IDocEscapedTextParsedParameters extends IDocNodeParsedParameters {\r\n escapeStyle: EscapeStyle;\r\n encodedTextExcerpt: TokenSequence;\r\n decodedText: string;\r\n}\r\n\r\n/**\r\n * The style of escaping to be used with DocEscapedText.\r\n */\r\nexport enum EscapeStyle {\r\n /**\r\n * Use a backslash symbol to escape the character.\r\n */\r\n CommonMarkBackslash\r\n}\r\n\r\n/**\r\n * Represents a text character that should be escaped as a TSDoc symbol.\r\n * @remarks\r\n * Note that renders will normally apply appropriate escaping when rendering\r\n * DocPlainText in a format such as HTML or TSDoc. The DocEscapedText node\r\n * forces a specific escaping that may not be the default.\r\n */\r\nexport class DocEscapedText extends DocNode {\r\n private readonly _escapeStyle: EscapeStyle;\r\n\r\n private _encodedText: string | undefined;\r\n private readonly _encodedTextExcerpt: DocExcerpt;\r\n\r\n private readonly _decodedText: string;\r\n\r\n /**\r\n * Don't call this directly. Instead use {@link TSDocParser}\r\n * @internal\r\n */\r\n public constructor(parameters: IDocEscapedTextParsedParameters) {\r\n super(parameters);\r\n\r\n this._escapeStyle = parameters.escapeStyle;\r\n\r\n this._encodedTextExcerpt = new DocExcerpt({\r\n configuration: this.configuration,\r\n excerptKind: ExcerptKind.EscapedText,\r\n content: parameters.encodedTextExcerpt\r\n });\r\n\r\n this._decodedText = parameters.decodedText;\r\n }\r\n\r\n /** @override */\r\n public get kind(): DocNodeKind | string {\r\n return DocNodeKind.EscapedText;\r\n }\r\n\r\n /**\r\n * The style of escaping to be performed.\r\n */\r\n public get escapeStyle(): EscapeStyle {\r\n return this._escapeStyle;\r\n }\r\n\r\n /**\r\n * The text sequence including escapes.\r\n */\r\n public get encodedText(): string {\r\n if (this._encodedText === undefined) {\r\n this._encodedText = this._encodedTextExcerpt.content.toString();\r\n }\r\n return this._encodedText;\r\n }\r\n\r\n /**\r\n * The text without escaping.\r\n */\r\n public get decodedText(): string {\r\n return this._decodedText;\r\n }\r\n\r\n /** @override */\r\n protected onGetChildNodes(): ReadonlyArray<DocNode | undefined> {\r\n return [this._encodedTextExcerpt];\r\n }\r\n}\r\n"]}

View File

@@ -0,0 +1,126 @@
"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.DocExcerpt = exports.ExcerptKind = void 0;
const DocNode_1 = require("./DocNode");
const Token_1 = require("../parser/Token");
/* eslint-disable @typescript-eslint/naming-convention */
/**
* Indicates the type of {@link DocExcerpt}.
*/
var ExcerptKind;
(function (ExcerptKind) {
ExcerptKind["Spacing"] = "Spacing";
ExcerptKind["BlockTag"] = "BlockTag";
ExcerptKind["CodeSpan_OpeningDelimiter"] = "CodeSpan_OpeningDelimiter";
ExcerptKind["CodeSpan_Code"] = "CodeSpan_Code";
ExcerptKind["CodeSpan_ClosingDelimiter"] = "CodeSpan_ClosingDelimiter";
ExcerptKind["DeclarationReference_PackageName"] = "DeclarationReference_PackageName";
ExcerptKind["DeclarationReference_ImportPath"] = "DeclarationReference_ImportPath";
ExcerptKind["DeclarationReference_ImportHash"] = "DeclarationReference_ImportHash";
/**
* Input characters that were reported as an error and do not appear to be part of a valid expression.
* A syntax highlighter might display them with an error color (e.g. red).
*/
ExcerptKind["ErrorText"] = "ErrorText";
/**
* Input characters that do not conform to the TSDoc specification, but were recognized by the parser, for example
* as a known JSDoc pattern. A syntax highlighter should not display them with an error color (e.g. red)
* because the error reporting may be suppressed for "lax" parsing of legacy source code.
*/
ExcerptKind["NonstandardText"] = "NonstandardText";
ExcerptKind["EscapedText"] = "EscapedText";
ExcerptKind["FencedCode_OpeningFence"] = "FencedCode_OpeningFence";
ExcerptKind["FencedCode_Language"] = "FencedCode_Language";
ExcerptKind["FencedCode_Code"] = "FencedCode_Code";
ExcerptKind["FencedCode_ClosingFence"] = "FencedCode_ClosingFence";
ExcerptKind["HtmlAttribute_Name"] = "HtmlAttribute_Name";
ExcerptKind["HtmlAttribute_Equals"] = "HtmlAttribute_Equals";
ExcerptKind["HtmlAttribute_Value"] = "HtmlAttribute_Value";
ExcerptKind["HtmlEndTag_OpeningDelimiter"] = "HtmlEndTag_OpeningDelimiter";
ExcerptKind["HtmlEndTag_Name"] = "HtmlEndTag_Name";
ExcerptKind["HtmlEndTag_ClosingDelimiter"] = "HtmlEndTag_ClosingDelimiter";
ExcerptKind["HtmlStartTag_OpeningDelimiter"] = "HtmlStartTag_OpeningDelimiter";
ExcerptKind["HtmlStartTag_Name"] = "HtmlStartTag_Name";
ExcerptKind["HtmlStartTag_ClosingDelimiter"] = "HtmlStartTag_ClosingDelimiter";
ExcerptKind["InlineTag_OpeningDelimiter"] = "InlineTag_OpeningDelimiter";
ExcerptKind["InlineTag_TagName"] = "InlineTag_TagName";
ExcerptKind["InlineTag_TagContent"] = "InlineTag_TagContent";
ExcerptKind["InlineTag_ClosingDelimiter"] = "InlineTag_ClosingDelimiter";
ExcerptKind["LinkTag_UrlDestination"] = "LinkTag_UrlDestination";
ExcerptKind["LinkTag_Pipe"] = "LinkTag_Pipe";
ExcerptKind["LinkTag_LinkText"] = "LinkTag_LinkText";
ExcerptKind["MemberIdentifier_LeftQuote"] = "MemberIdentifier_LeftQuote";
ExcerptKind["MemberIdentifier_Identifier"] = "MemberIdentifier_Identifier";
ExcerptKind["MemberIdentifier_RightQuote"] = "MemberIdentifier_RightQuote";
ExcerptKind["MemberReference_Dot"] = "MemberReference_Dot";
ExcerptKind["MemberReference_LeftParenthesis"] = "MemberReference_LeftParenthesis";
ExcerptKind["MemberReference_Colon"] = "MemberReference_Colon";
ExcerptKind["MemberReference_RightParenthesis"] = "MemberReference_RightParenthesis";
ExcerptKind["MemberSelector"] = "MemberSelector";
ExcerptKind["DocMemberSymbol_LeftBracket"] = "DocMemberSymbol_LeftBracket";
ExcerptKind["DocMemberSymbol_RightBracket"] = "DocMemberSymbol_RightBracket";
ExcerptKind["ParamBlock_ParameterName"] = "ParamBlock_ParameterName";
ExcerptKind["ParamBlock_Hyphen"] = "ParamBlock_Hyphen";
ExcerptKind["PlainText"] = "PlainText";
ExcerptKind["SoftBreak"] = "SoftBreak";
})(ExcerptKind || (exports.ExcerptKind = ExcerptKind = {}));
/**
* Represents a parsed token sequence.
*
* @remarks
* When a `DocNode` is created by parsing a doc comment, it will have `DocExcerpt` child nodes corresponding to
* the parsed syntax elements such as names, keywords, punctuation, and spaces. These excerpts indicate the original
* coordinates of the syntax element, and thus can be used for syntax highlighting and precise error reporting.
* They could also be used to rewrite specific words in a source file (e.g. renaming a parameter) without disturbing
* any other characters in the file.
*
* Every parsed character will correspond to at most one DocExcerpt object. In other words, excerpts never overlap.
* A given excerpt can span multiple comment lines, and it may contain gaps, for example to skip the `*` character
* that starts a new TSDoc comment line.
*/
class DocExcerpt extends DocNode_1.DocNode {
/**
* Don't call this directly. Instead use {@link TSDocParser}
* @internal
*/
constructor(parameters) {
super(parameters);
if (parameters.excerptKind === ExcerptKind.Spacing) {
for (const token of parameters.content.tokens) {
switch (token.kind) {
case Token_1.TokenKind.Spacing:
case Token_1.TokenKind.Newline:
case Token_1.TokenKind.EndOfInput:
break;
default:
throw new Error(`The excerptKind=Spacing but the range contains a non-whitespace token`);
}
}
}
this._excerptKind = parameters.excerptKind;
this._content = parameters.content;
}
/** @override */
get kind() {
return DocNode_1.DocNodeKind.Excerpt;
}
/**
* Indicates the kind of DocExcerpt.
*/
get excerptKind() {
return this._excerptKind;
}
/**
* The input token sequence corresponding to this excerpt.
* @remarks
* Note that a token sequence can span multiple input lines and may contain gaps, for example to skip the `*`
* character that starts a new TSDoc comment line.
*/
get content() {
return this._content;
}
}
exports.DocExcerpt = DocExcerpt;
//# sourceMappingURL=DocExcerpt.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,133 @@
"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.DocFencedCode = void 0;
const DocNode_1 = require("./DocNode");
const DocExcerpt_1 = require("./DocExcerpt");
/**
* Represents CommonMark-style code fence, i.e. a block of program code that
* starts and ends with a line comprised of three backticks. The opening delimiter
* can also specify a language for a syntax highlighter.
*/
class DocFencedCode extends DocNode_1.DocNode {
/**
* Don't call this directly. Instead use {@link TSDocParser}
* @internal
*/
constructor(parameters) {
super(parameters);
if (DocNode_1.DocNode.isParsedParameters(parameters)) {
this._openingFenceExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.FencedCode_OpeningFence,
content: parameters.openingFenceExcerpt
});
if (parameters.spacingAfterOpeningFenceExcerpt) {
this._spacingAfterOpeningFenceExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.Spacing,
content: parameters.spacingAfterOpeningFenceExcerpt
});
}
if (parameters.languageExcerpt) {
this._languageExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.FencedCode_Language,
content: parameters.languageExcerpt
});
}
if (parameters.spacingAfterLanguageExcerpt) {
this._spacingAfterLanguageExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.Spacing,
content: parameters.spacingAfterLanguageExcerpt
});
}
this._codeExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.FencedCode_Code,
content: parameters.codeExcerpt
});
if (parameters.spacingBeforeClosingFenceExcerpt) {
this._spacingBeforeClosingFenceExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.Spacing,
content: parameters.spacingBeforeClosingFenceExcerpt
});
}
this._closingFenceExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.FencedCode_ClosingFence,
content: parameters.closingFenceExcerpt
});
if (parameters.spacingAfterClosingFenceExcerpt) {
this._spacingAfterClosingFenceExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.Spacing,
content: parameters.spacingAfterClosingFenceExcerpt
});
}
}
else {
this._code = parameters.code;
this._language = parameters.language;
}
}
/** @override */
get kind() {
return DocNode_1.DocNodeKind.FencedCode;
}
/**
* A name that can optionally be included after the opening code fence delimiter,
* on the same line as the three backticks. This name indicates the programming language
* for the code, which a syntax highlighter may use to style the code block.
*
* @remarks
* The TSDoc standard requires that the language "ts" should be interpreted to mean TypeScript.
* Other languages names may be supported, but this is implementation dependent.
*
* CommonMark refers to this field as the "info string".
*
* @privateRemarks
* Examples of language strings supported by GitHub flavored markdown:
* https://raw.githubusercontent.com/github/linguist/master/lib/linguist/languages.yml
*/
get language() {
if (this._language === undefined) {
if (this._languageExcerpt !== undefined) {
this._language = this._languageExcerpt.content.toString();
}
else {
this._language = '';
}
}
return this._language;
}
/**
* The text that should be rendered as code.
*/
get code() {
if (this._code === undefined) {
if (this._codeExcerpt !== undefined) {
this._code = this._codeExcerpt.content.toString();
}
}
return this._code;
}
/** @override */
onGetChildNodes() {
return [
this._openingFenceExcerpt,
this._spacingAfterOpeningFenceExcerpt,
this._languageExcerpt,
this._spacingAfterLanguageExcerpt,
this._codeExcerpt,
this._spacingBeforeClosingFenceExcerpt,
this._closingFenceExcerpt,
this._spacingAfterClosingFenceExcerpt
];
}
}
exports.DocFencedCode = DocFencedCode;
//# sourceMappingURL=DocFencedCode.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,137 @@
"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.DocHtmlAttribute = void 0;
const DocNode_1 = require("./DocNode");
const DocExcerpt_1 = require("./DocExcerpt");
/**
* Represents an HTML attribute inside a DocHtmlStartTag or DocHtmlEndTag.
*
* Example: `href="#"` inside `<a href="#" />`
*/
class DocHtmlAttribute extends DocNode_1.DocNode {
/**
* Don't call this directly. Instead use {@link TSDocParser}
* @internal
*/
constructor(parameters) {
super(parameters);
if (DocNode_1.DocNode.isParsedParameters(parameters)) {
this._nameExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.HtmlAttribute_Name,
content: parameters.nameExcerpt
});
if (parameters.spacingAfterNameExcerpt) {
this._spacingAfterNameExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.Spacing,
content: parameters.spacingAfterNameExcerpt
});
}
this._equalsExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.HtmlAttribute_Equals,
content: parameters.equalsExcerpt
});
if (parameters.spacingAfterEqualsExcerpt) {
this._spacingAfterEqualsExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.Spacing,
content: parameters.spacingAfterEqualsExcerpt
});
}
this._valueExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.HtmlAttribute_Value,
content: parameters.valueExcerpt
});
if (parameters.spacingAfterValueExcerpt) {
this._spacingAfterValueExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.Spacing,
content: parameters.spacingAfterValueExcerpt
});
}
}
else {
this._name = parameters.name;
this._spacingAfterName = parameters.spacingAfterName;
this._spacingAfterEquals = parameters.spacingAfterEquals;
this._value = parameters.value;
this._spacingAfterValue = parameters.spacingAfterValue;
}
}
/** @override */
get kind() {
return DocNode_1.DocNodeKind.HtmlAttribute;
}
/**
* The HTML attribute name.
*/
get name() {
if (this._name === undefined) {
this._name = this._nameExcerpt.content.toString();
}
return this._name;
}
/**
* Explicit whitespace that a renderer should insert after the HTML attribute name.
* If undefined, then the renderer can use a formatting rule to generate appropriate spacing.
*/
get spacingAfterName() {
if (this._spacingAfterName === undefined) {
if (this._spacingAfterNameExcerpt !== undefined) {
this._spacingAfterName = this._spacingAfterNameExcerpt.content.toString();
}
}
return this._spacingAfterName;
}
/**
* Explicit whitespace that a renderer should insert after the "=".
* If undefined, then the renderer can use a formatting rule to generate appropriate spacing.
*/
get spacingAfterEquals() {
if (this._spacingAfterEquals === undefined) {
if (this._spacingAfterEqualsExcerpt !== undefined) {
this._spacingAfterEquals = this._spacingAfterEqualsExcerpt.content.toString();
}
}
return this._spacingAfterEquals;
}
/**
* The HTML attribute value.
*/
get value() {
if (this._value === undefined) {
this._value = this._valueExcerpt.content.toString();
}
return this._value;
}
/**
* Explicit whitespace that a renderer should insert after the HTML attribute name.
* If undefined, then the renderer can use a formatting rule to generate appropriate spacing.
*/
get spacingAfterValue() {
if (this._spacingAfterValue === undefined) {
if (this._spacingAfterValueExcerpt !== undefined) {
this._spacingAfterValue = this._spacingAfterValueExcerpt.content.toString();
}
}
return this._spacingAfterValue;
}
/** @override */
onGetChildNodes() {
return [
this._nameExcerpt,
this._spacingAfterNameExcerpt,
this._equalsExcerpt,
this._spacingAfterEqualsExcerpt,
this._valueExcerpt,
this._spacingAfterValueExcerpt
];
}
}
exports.DocHtmlAttribute = DocHtmlAttribute;
//# sourceMappingURL=DocHtmlAttribute.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,82 @@
"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.DocHtmlEndTag = void 0;
const DocNode_1 = require("./DocNode");
const DocExcerpt_1 = require("./DocExcerpt");
const StringBuilder_1 = require("../emitters/StringBuilder");
const TSDocEmitter_1 = require("../emitters/TSDocEmitter");
/**
* Represents an HTML end tag. Example: `</a>`
*/
class DocHtmlEndTag extends DocNode_1.DocNode {
/**
* Don't call this directly. Instead use {@link TSDocParser}
* @internal
*/
constructor(parameters) {
super(parameters);
if (DocNode_1.DocNode.isParsedParameters(parameters)) {
this._openingDelimiterExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.HtmlEndTag_OpeningDelimiter,
content: parameters.openingDelimiterExcerpt
});
this._nameExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.HtmlEndTag_Name,
content: parameters.nameExcerpt
});
if (parameters.spacingAfterNameExcerpt) {
this._spacingAfterNameExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.Spacing,
content: parameters.spacingAfterNameExcerpt
});
}
this._closingDelimiterExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.HtmlEndTag_ClosingDelimiter,
content: parameters.closingDelimiterExcerpt
});
}
else {
this._name = parameters.name;
}
}
/** @override */
get kind() {
return DocNode_1.DocNodeKind.HtmlEndTag;
}
/**
* The HTML element name.
*/
get name() {
if (this._name === undefined) {
this._name = this._nameExcerpt.content.toString();
}
return this._name;
}
/**
* Generates the HTML for this tag.
*/
emitAsHtml() {
// NOTE: Here we're assuming that the TSDoc representation for a tag is also a valid HTML expression.
const stringBuilder = new StringBuilder_1.StringBuilder();
const emitter = new TSDocEmitter_1.TSDocEmitter();
emitter.renderHtmlTag(stringBuilder, this);
return stringBuilder.toString();
}
/** @override */
onGetChildNodes() {
return [
this._openingDelimiterExcerpt,
this._nameExcerpt,
this._spacingAfterNameExcerpt,
this._closingDelimiterExcerpt
];
}
}
exports.DocHtmlEndTag = DocHtmlEndTag;
//# sourceMappingURL=DocHtmlEndTag.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,115 @@
"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.DocHtmlStartTag = void 0;
const DocNode_1 = require("./DocNode");
const DocExcerpt_1 = require("./DocExcerpt");
const StringBuilder_1 = require("../emitters/StringBuilder");
const TSDocEmitter_1 = require("../emitters/TSDocEmitter");
/**
* Represents an HTML start tag, which may or may not be self-closing.
*
* Example: `<a href="#" />`
*/
class DocHtmlStartTag extends DocNode_1.DocNode {
/**
* Don't call this directly. Instead use {@link TSDocParser}
* @internal
*/
constructor(parameters) {
super(parameters);
if (DocNode_1.DocNode.isParsedParameters(parameters)) {
this._openingDelimiterExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.HtmlStartTag_OpeningDelimiter,
content: parameters.openingDelimiterExcerpt
});
this._nameExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.HtmlStartTag_Name,
content: parameters.nameExcerpt
});
if (parameters.spacingAfterNameExcerpt) {
this._spacingAfterNameExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.Spacing,
content: parameters.spacingAfterNameExcerpt
});
}
this._closingDelimiterExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.HtmlStartTag_ClosingDelimiter,
content: parameters.closingDelimiterExcerpt
});
}
else {
this._name = parameters.name;
this._spacingAfterName = parameters.spacingAfterName;
}
this._htmlAttributes = [];
if (parameters.htmlAttributes) {
this._htmlAttributes.push(...parameters.htmlAttributes);
}
this._selfClosingTag = !!parameters.selfClosingTag;
}
/** @override */
get kind() {
return DocNode_1.DocNodeKind.HtmlStartTag;
}
/**
* The HTML element name.
*/
get name() {
if (this._name === undefined) {
this._name = this._nameExcerpt.content.toString();
}
return this._name;
}
/**
* The HTML attributes belonging to this HTML element.
*/
get htmlAttributes() {
return this._htmlAttributes;
}
/**
* If true, then the HTML tag ends with `/>` instead of `>`.
*/
get selfClosingTag() {
return this._selfClosingTag;
}
/**
* Explicit whitespace that a renderer should insert after the HTML element name.
* If undefined, then the renderer can use a formatting rule to generate appropriate spacing.
*/
get spacingAfterName() {
if (this._spacingAfterName === undefined) {
if (this._spacingAfterNameExcerpt !== undefined) {
this._spacingAfterName = this._spacingAfterNameExcerpt.content.toString();
}
}
return this._spacingAfterName;
}
/**
* Generates the HTML for this tag.
*/
emitAsHtml() {
// NOTE: Here we're assuming that the TSDoc representation for a tag is also a valid HTML expression.
const stringBuilder = new StringBuilder_1.StringBuilder();
const emitter = new TSDocEmitter_1.TSDocEmitter();
emitter.renderHtmlTag(stringBuilder, this);
return stringBuilder.toString();
}
/** @override */
onGetChildNodes() {
return [
this._openingDelimiterExcerpt,
this._nameExcerpt,
this._spacingAfterNameExcerpt,
...this._htmlAttributes,
this._closingDelimiterExcerpt
];
}
}
exports.DocHtmlStartTag = DocHtmlStartTag;
//# sourceMappingURL=DocHtmlStartTag.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,41 @@
"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.DocInheritDocTag = void 0;
const DocNode_1 = require("./DocNode");
const DocInlineTagBase_1 = require("./DocInlineTagBase");
/**
* Represents an `{@inheritDoc}` tag.
*/
class DocInheritDocTag extends DocInlineTagBase_1.DocInlineTagBase {
/**
* Don't call this directly. Instead use {@link TSDocParser}
* @internal
*/
constructor(parameters) {
super(parameters);
if (this.tagNameWithUpperCase !== '@INHERITDOC') {
throw new Error('DocInheritDocTag requires the tag name to be "{@inheritDoc}"');
}
this._declarationReference = parameters.declarationReference;
}
/** @override */
get kind() {
return DocNode_1.DocNodeKind.InheritDocTag;
}
/**
* The declaration that the documentation will be inherited from.
* If omitted, the documentation will be inherited from the parent class.
*/
get declarationReference() {
return this._declarationReference;
}
/** @override */
getChildNodesForContent() {
// abstract
return [this._declarationReference];
}
}
exports.DocInheritDocTag = DocInheritDocTag;
//# sourceMappingURL=DocInheritDocTag.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"DocInheritDocTag.js","sourceRoot":"","sources":["../../src/nodes/DocInheritDocTag.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;AAE3D,uCAAsD;AAEtD,yDAI4B;AAgB5B;;GAEG;AACH,MAAa,gBAAiB,SAAQ,mCAAgB;IAGpD;;;OAGG;IACH,YAAmB,UAA2E;QAC5F,KAAK,CAAC,UAAU,CAAC,CAAC;QAElB,IAAI,IAAI,CAAC,oBAAoB,KAAK,aAAa,EAAE,CAAC;YAChD,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;QAClF,CAAC;QAED,IAAI,CAAC,qBAAqB,GAAG,UAAU,CAAC,oBAAoB,CAAC;IAC/D,CAAC;IAED,gBAAgB;IAChB,IAAW,IAAI;QACb,OAAO,qBAAW,CAAC,aAAa,CAAC;IACnC,CAAC;IAED;;;OAGG;IACH,IAAW,oBAAoB;QAC7B,OAAO,IAAI,CAAC,qBAAqB,CAAC;IACpC,CAAC;IAED,gBAAgB;IACN,uBAAuB;QAC/B,WAAW;QACX,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACtC,CAAC;CACF;AAnCD,4CAmCC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nimport { DocNodeKind, type DocNode } from './DocNode';\r\nimport type { DocDeclarationReference } from './DocDeclarationReference';\r\nimport {\r\n DocInlineTagBase,\r\n type IDocInlineTagBaseParsedParameters,\r\n type IDocInlineTagBaseParameters\r\n} from './DocInlineTagBase';\r\n\r\n/**\r\n * Constructor parameters for {@link DocInheritDocTag}.\r\n */\r\nexport interface IDocInheritDocTagParameters extends IDocInlineTagBaseParameters {\r\n declarationReference?: DocDeclarationReference;\r\n}\r\n\r\n/**\r\n * Constructor parameters for {@link DocInheritDocTag}.\r\n */\r\nexport interface IDocInheritDocTagParsedParameters extends IDocInlineTagBaseParsedParameters {\r\n declarationReference?: DocDeclarationReference;\r\n}\r\n\r\n/**\r\n * Represents an `{@inheritDoc}` tag.\r\n */\r\nexport class DocInheritDocTag extends DocInlineTagBase {\r\n private readonly _declarationReference: DocDeclarationReference | undefined;\r\n\r\n /**\r\n * Don't call this directly. Instead use {@link TSDocParser}\r\n * @internal\r\n */\r\n public constructor(parameters: IDocInheritDocTagParameters | IDocInheritDocTagParsedParameters) {\r\n super(parameters);\r\n\r\n if (this.tagNameWithUpperCase !== '@INHERITDOC') {\r\n throw new Error('DocInheritDocTag requires the tag name to be \"{@inheritDoc}\"');\r\n }\r\n\r\n this._declarationReference = parameters.declarationReference;\r\n }\r\n\r\n /** @override */\r\n public get kind(): DocNodeKind | string {\r\n return DocNodeKind.InheritDocTag;\r\n }\r\n\r\n /**\r\n * The declaration that the documentation will be inherited from.\r\n * If omitted, the documentation will be inherited from the parent class.\r\n */\r\n public get declarationReference(): DocDeclarationReference | undefined {\r\n return this._declarationReference;\r\n }\r\n\r\n /** @override */\r\n protected getChildNodesForContent(): ReadonlyArray<DocNode | undefined> {\r\n // abstract\r\n return [this._declarationReference];\r\n }\r\n}\r\n"]}

View File

@@ -0,0 +1,67 @@
"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.DocInlineTag = void 0;
const DocNode_1 = require("./DocNode");
const DocExcerpt_1 = require("./DocExcerpt");
const DocInlineTagBase_1 = require("./DocInlineTagBase");
/**
* Represents a generic TSDoc inline tag, including custom tags.
*
* @remarks
* NOTE: Certain tags such as `{@link}` and `{@inheritDoc}` have specialized structures and parser rules,
* and thus are represented using {@link DocLinkTag} or {@link DocInheritDocTag} instead. However, if the
* specialized parser rule encounters a syntax error, but the outer framing is correct, then the parser constructs
* a generic `DocInlineTag` instead of `DocErrorText`. This means, for example, that it is possible sometimes for
* `DocInlineTag.tagName` to be `"@link"`.
*/
class DocInlineTag extends DocInlineTagBase_1.DocInlineTagBase {
/**
* Don't call this directly. Instead use {@link TSDocParser}
* @internal
*/
constructor(parameters) {
super(parameters);
if (DocNode_1.DocNode.isParsedParameters(parameters)) {
if (parameters.tagContentExcerpt) {
this._tagContentExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.InlineTag_TagContent,
content: parameters.tagContentExcerpt
});
}
}
else {
this._tagContent = parameters.tagContent;
}
}
/** @override */
get kind() {
return DocNode_1.DocNodeKind.InlineTag;
}
/**
* The tag content.
* @remarks
* For example, if the tag is `{@myTag x=12.34 y=56.78 }` then the tag content
* would be `x=12.34 y=56.78 `, including the trailing space but not the leading space.
*/
get tagContent() {
if (this._tagContent === undefined) {
if (this._tagContentExcerpt) {
this._tagContent = this._tagContentExcerpt.content.toString();
}
else {
return '';
}
}
return this._tagContent;
}
/** @override */
getChildNodesForContent() {
// abstract
return [this._tagContentExcerpt];
}
}
exports.DocInlineTag = DocInlineTag;
//# sourceMappingURL=DocInlineTag.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"DocInlineTag.js","sourceRoot":"","sources":["../../src/nodes/DocInlineTag.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;AAE3D,uCAAiD;AAEjD,6CAAuD;AACvD,yDAI4B;AAgB5B;;;;;;;;;GASG;AACH,MAAa,YAAa,SAAQ,mCAAgB;IAIhD;;;OAGG;IACH,YAAmB,UAAmE;QACpF,KAAK,CAAC,UAAU,CAAC,CAAC;QAElB,IAAI,iBAAO,CAAC,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3C,IAAI,UAAU,CAAC,iBAAiB,EAAE,CAAC;gBACjC,IAAI,CAAC,kBAAkB,GAAG,IAAI,uBAAU,CAAC;oBACvC,aAAa,EAAE,IAAI,CAAC,aAAa;oBACjC,WAAW,EAAE,wBAAW,CAAC,oBAAoB;oBAC7C,OAAO,EAAE,UAAU,CAAC,iBAAiB;iBACtC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,UAAU,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,IAAW,IAAI;QACb,OAAO,qBAAW,CAAC,SAAS,CAAC;IAC/B,CAAC;IAED;;;;;OAKG;IACH,IAAW,UAAU;QACnB,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACnC,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAC5B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YAChE,CAAC;iBAAM,CAAC;gBACN,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,gBAAgB;IACN,uBAAuB;QAC/B,WAAW;QACX,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACnC,CAAC;CACF;AAnDD,oCAmDC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nimport { DocNodeKind, DocNode } from './DocNode';\r\nimport type { TokenSequence } from '../parser/TokenSequence';\r\nimport { DocExcerpt, ExcerptKind } from './DocExcerpt';\r\nimport {\r\n type IDocInlineTagBaseParameters,\r\n type IDocInlineTagBaseParsedParameters,\r\n DocInlineTagBase\r\n} from './DocInlineTagBase';\r\n\r\n/**\r\n * Constructor parameters for {@link DocInlineTag}.\r\n */\r\nexport interface IDocInlineTagParameters extends IDocInlineTagBaseParameters {\r\n tagContent: string;\r\n}\r\n\r\n/**\r\n * Constructor parameters for {@link DocInlineTag}.\r\n */\r\nexport interface IDocInlineTagParsedParameters extends IDocInlineTagBaseParsedParameters {\r\n tagContentExcerpt?: TokenSequence;\r\n}\r\n\r\n/**\r\n * Represents a generic TSDoc inline tag, including custom tags.\r\n *\r\n * @remarks\r\n * NOTE: Certain tags such as `{@link}` and `{@inheritDoc}` have specialized structures and parser rules,\r\n * and thus are represented using {@link DocLinkTag} or {@link DocInheritDocTag} instead. However, if the\r\n * specialized parser rule encounters a syntax error, but the outer framing is correct, then the parser constructs\r\n * a generic `DocInlineTag` instead of `DocErrorText`. This means, for example, that it is possible sometimes for\r\n * `DocInlineTag.tagName` to be `\"@link\"`.\r\n */\r\nexport class DocInlineTag extends DocInlineTagBase {\r\n private _tagContent: string | undefined;\r\n private readonly _tagContentExcerpt: DocExcerpt | undefined;\r\n\r\n /**\r\n * Don't call this directly. Instead use {@link TSDocParser}\r\n * @internal\r\n */\r\n public constructor(parameters: IDocInlineTagParameters | IDocInlineTagParsedParameters) {\r\n super(parameters);\r\n\r\n if (DocNode.isParsedParameters(parameters)) {\r\n if (parameters.tagContentExcerpt) {\r\n this._tagContentExcerpt = new DocExcerpt({\r\n configuration: this.configuration,\r\n excerptKind: ExcerptKind.InlineTag_TagContent,\r\n content: parameters.tagContentExcerpt\r\n });\r\n }\r\n } else {\r\n this._tagContent = parameters.tagContent;\r\n }\r\n }\r\n\r\n /** @override */\r\n public get kind(): DocNodeKind | string {\r\n return DocNodeKind.InlineTag;\r\n }\r\n\r\n /**\r\n * The tag content.\r\n * @remarks\r\n * For example, if the tag is `{@myTag x=12.34 y=56.78 }` then the tag content\r\n * would be `x=12.34 y=56.78 `, including the trailing space but not the leading space.\r\n */\r\n public get tagContent(): string {\r\n if (this._tagContent === undefined) {\r\n if (this._tagContentExcerpt) {\r\n this._tagContent = this._tagContentExcerpt.content.toString();\r\n } else {\r\n return '';\r\n }\r\n }\r\n return this._tagContent;\r\n }\r\n\r\n /** @override */\r\n protected getChildNodesForContent(): ReadonlyArray<DocNode | undefined> {\r\n // abstract\r\n return [this._tagContentExcerpt];\r\n }\r\n}\r\n"]}

View File

@@ -0,0 +1,77 @@
"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.DocInlineTagBase = void 0;
const DocNode_1 = require("./DocNode");
const StringChecks_1 = require("../parser/StringChecks");
const DocExcerpt_1 = require("./DocExcerpt");
/**
* The abstract base class for {@link DocInlineTag}, {@link DocLinkTag}, and {@link DocInheritDocTag}.
*/
class DocInlineTagBase extends DocNode_1.DocNode {
/**
* Don't call this directly. Instead use {@link TSDocParser}
* @internal
*/
constructor(parameters) {
super(parameters);
StringChecks_1.StringChecks.validateTSDocTagName(parameters.tagName);
if (DocNode_1.DocNode.isParsedParameters(parameters)) {
this._openingDelimiterExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.InlineTag_OpeningDelimiter,
content: parameters.openingDelimiterExcerpt
});
this._tagNameExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.InlineTag_TagName,
content: parameters.tagNameExcerpt
});
if (parameters.spacingAfterTagNameExcerpt) {
this._spacingAfterTagNameExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.Spacing,
content: parameters.spacingAfterTagNameExcerpt
});
}
this._closingDelimiterExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.InlineTag_ClosingDelimiter,
content: parameters.closingDelimiterExcerpt
});
}
this._tagName = parameters.tagName;
this._tagNameWithUpperCase = parameters.tagName.toUpperCase();
}
/**
* The TSDoc tag name. TSDoc tag names start with an at-sign (`@`) followed
* by ASCII letters using "camelCase" capitalization.
*
* @remarks
* For example, if the inline tag is `{@link Guid.toString | the toString() method}`
* then the tag name would be `@link`.
*/
get tagName() {
return this._tagName;
}
/**
* The TSDoc tag name in all capitals, which is used for performing
* case-insensitive comparisons or lookups.
*/
get tagNameWithUpperCase() {
return this._tagNameWithUpperCase;
}
/** @override @sealed */
onGetChildNodes() {
return [
this._openingDelimiterExcerpt,
this._tagNameExcerpt,
this._spacingAfterTagNameExcerpt,
...this.getChildNodesForContent(),
this._closingDelimiterExcerpt
];
}
}
exports.DocInlineTagBase = DocInlineTagBase;
//# sourceMappingURL=DocInlineTagBase.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,150 @@
"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.DocLinkTag = void 0;
const DocNode_1 = require("./DocNode");
const DocInlineTagBase_1 = require("./DocInlineTagBase");
const DocExcerpt_1 = require("./DocExcerpt");
/**
* Represents an `{@link}` tag.
*/
class DocLinkTag extends DocInlineTagBase_1.DocInlineTagBase {
/**
* Don't call this directly. Instead use {@link TSDocParser}
* @internal
*/
constructor(parameters) {
super(parameters);
if (this.tagNameWithUpperCase !== '@LINK') {
throw new Error('DocLinkTag requires the tag name to be "{@link}"');
}
this._codeDestination = parameters.codeDestination;
if (DocNode_1.DocNode.isParsedParameters(parameters)) {
if (parameters.codeDestination !== undefined && parameters.urlDestinationExcerpt !== undefined) {
throw new Error('Either the codeDestination or the urlDestination may be specified, but not both');
}
if (parameters.urlDestinationExcerpt) {
this._urlDestinationExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.LinkTag_UrlDestination,
content: parameters.urlDestinationExcerpt
});
}
if (parameters.spacingAfterDestinationExcerpt) {
this._spacingAfterDestinationExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.Spacing,
content: parameters.spacingAfterDestinationExcerpt
});
}
if (parameters.pipeExcerpt) {
this._pipeExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.LinkTag_Pipe,
content: parameters.pipeExcerpt
});
}
if (parameters.spacingAfterPipeExcerpt) {
this._spacingAfterPipeExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.Spacing,
content: parameters.spacingAfterPipeExcerpt
});
}
if (parameters.linkTextExcerpt) {
this._linkTextExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.LinkTag_LinkText,
content: parameters.linkTextExcerpt
});
}
if (parameters.spacingAfterLinkTextExcerpt) {
this._spacingAfterLinkTextExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.Spacing,
content: parameters.spacingAfterLinkTextExcerpt
});
}
}
else {
if (parameters.codeDestination !== undefined && parameters.urlDestination !== undefined) {
throw new Error('Either the codeDestination or the urlDestination may be specified, but not both');
}
this._urlDestination = parameters.urlDestination;
this._linkText = parameters.linkText;
}
}
/** @override */
get kind() {
return DocNode_1.DocNodeKind.LinkTag;
}
/**
* If the link tag refers to a declaration, this returns the declaration reference object;
* otherwise this property is undefined.
* @remarks
* Either the `codeDestination` or the `urlDestination` property will be defined, but never both.
*/
get codeDestination() {
return this._codeDestination;
}
/**
* If the link tag was an ordinary URI, this returns the URL string;
* otherwise this property is undefined.
* @remarks
* Either the `codeDestination` or the `urlDestination` property will be defined, but never both.
*/
get urlDestination() {
if (this._urlDestination === undefined) {
if (this._urlDestinationExcerpt !== undefined) {
this._urlDestination = this._urlDestinationExcerpt.content.toString();
}
}
return this._urlDestination;
}
/**
* An optional text string that is the hyperlink text. If omitted, the documentation
* renderer will use a default string based on the link itself (e.g. the URL text
* or the declaration identifier).
*
* @remarks
*
* In HTML, the hyperlink can include leading/trailing space characters around the link text.
* For example, this HTML will cause a web browser to `y` and also the space character before
* and after it:
*
* ```html
* x<a href="#Button"> y </a> z
* ```
*
* Unlike HTML, TSDoc trims leading/trailing spaces. For example, this TSDoc will be
* displayed `xy z` and underline only the `y` character:
*
* ```
* x{@link Button | y } z
* ```
*/
get linkText() {
if (this._linkText === undefined) {
if (this._linkTextExcerpt !== undefined) {
this._linkText = this._linkTextExcerpt.content.toString();
}
}
return this._linkText;
}
/** @override */
getChildNodesForContent() {
// abstract
return [
this._codeDestination,
this._urlDestinationExcerpt,
this._spacingAfterDestinationExcerpt,
this._pipeExcerpt,
this._spacingAfterPipeExcerpt,
this._linkTextExcerpt,
this._spacingAfterLinkTextExcerpt
];
}
}
exports.DocLinkTag = DocLinkTag;
//# sourceMappingURL=DocLinkTag.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,92 @@
"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.DocMemberIdentifier = void 0;
const DocNode_1 = require("./DocNode");
const StringChecks_1 = require("../parser/StringChecks");
const DocExcerpt_1 = require("./DocExcerpt");
/**
* A member identifier is part of a {@link DocMemberReference}.
*/
class DocMemberIdentifier extends DocNode_1.DocNode {
/**
* Don't call this directly. Instead use {@link TSDocParser}
* @internal
*/
constructor(parameters) {
super(parameters);
if (DocNode_1.DocNode.isParsedParameters(parameters)) {
if (parameters.leftQuoteExcerpt) {
this._leftQuoteExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.MemberIdentifier_LeftQuote,
content: parameters.leftQuoteExcerpt
});
}
this._identifierExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.MemberIdentifier_Identifier,
content: parameters.identifierExcerpt
});
if (parameters.rightQuoteExcerpt) {
this._rightQuoteExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.MemberIdentifier_RightQuote,
content: parameters.rightQuoteExcerpt
});
}
}
else {
this._identifier = parameters.identifier;
}
}
/**
* Tests whether the input string can be used without quotes as a member identifier in a declaration reference.
* If not, {@link DocMemberIdentifier.hasQuotes} will be required.
*
* @remarks
* In order to be used without quotes, the string must follow the identifier syntax for ECMAScript / TypeScript,
* and it must not be one of the reserved words used for system selectors (such as `instance`, `static`,
* `constructor`, etc).
*/
static isValidIdentifier(identifier) {
return !StringChecks_1.StringChecks.explainIfInvalidUnquotedMemberIdentifier(identifier);
}
/** @override */
get kind() {
return DocNode_1.DocNodeKind.MemberIdentifier;
}
/**
* The identifier string without any quote encoding.
*
* @remarks
* If the value is not a valid ECMAScript identifier, it will be quoted as a
* string literal during rendering.
*/
get identifier() {
if (this._identifier === undefined) {
this._identifier = this._identifierExcerpt.content.toString();
}
return this._identifier;
}
/**
* Returns true if the identifier will be rendered as a quoted string literal
* instead of as a programming language identifier. This is required if the
* `identifier` property is not a valid ECMAScript identifier.
*/
get hasQuotes() {
if (this._identifierExcerpt) {
return !!this._leftQuoteExcerpt;
}
else {
return !DocMemberIdentifier.isValidIdentifier(this.identifier);
}
}
/** @override */
onGetChildNodes() {
return [this._leftQuoteExcerpt, this._identifierExcerpt, this._rightQuoteExcerpt];
}
}
exports.DocMemberIdentifier = DocMemberIdentifier;
//# sourceMappingURL=DocMemberIdentifier.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,159 @@
"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.DocMemberReference = void 0;
const DocNode_1 = require("./DocNode");
const DocExcerpt_1 = require("./DocExcerpt");
/**
* A {@link DocDeclarationReference | declaration reference} includes a chain of
* member references represented using `DocMemberReference` nodes.
*
* @remarks
* For example, `example-library#ui.controls.Button.(render:static)` is a
* declaration reference that contains three member references:
* `ui`, `.controls`, and `.Button`, and `.(render:static)`.
*/
class DocMemberReference extends DocNode_1.DocNode {
/**
* Don't call this directly. Instead use {@link TSDocParser}
* @internal
*/
constructor(parameters) {
super(parameters);
if (DocNode_1.DocNode.isParsedParameters(parameters)) {
this._hasDot = !!parameters.dotExcerpt;
if (parameters.dotExcerpt) {
this._dotExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.MemberReference_Dot,
content: parameters.dotExcerpt
});
}
if (parameters.spacingAfterDotExcerpt) {
this._spacingAfterDotExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.Spacing,
content: parameters.spacingAfterDotExcerpt
});
}
if (parameters.leftParenthesisExcerpt) {
this._leftParenthesisExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.MemberReference_LeftParenthesis,
content: parameters.leftParenthesisExcerpt
});
}
if (parameters.spacingAfterLeftParenthesisExcerpt) {
this._spacingAfterLeftParenthesisExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.Spacing,
content: parameters.spacingAfterLeftParenthesisExcerpt
});
}
if (parameters.spacingAfterMemberExcerpt) {
this._spacingAfterMemberExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.Spacing,
content: parameters.spacingAfterMemberExcerpt
});
}
if (parameters.colonExcerpt) {
this._colonExcerpt = new DocExcerpt_1.DocExcerpt({
excerptKind: DocExcerpt_1.ExcerptKind.MemberReference_Colon,
configuration: this.configuration,
content: parameters.colonExcerpt
});
}
if (parameters.spacingAfterColonExcerpt) {
this._spacingAfterColonExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.Spacing,
content: parameters.spacingAfterColonExcerpt
});
}
if (parameters.spacingAfterSelectorExcerpt) {
this._spacingAfterSelectorExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.Spacing,
content: parameters.spacingAfterSelectorExcerpt
});
}
if (parameters.rightParenthesisExcerpt) {
this._rightParenthesisExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.MemberReference_RightParenthesis,
content: parameters.rightParenthesisExcerpt
});
}
if (parameters.spacingAfterRightParenthesisExcerpt) {
this._spacingAfterRightParenthesisExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.Spacing,
content: parameters.spacingAfterRightParenthesisExcerpt
});
}
}
else {
this._hasDot = parameters.hasDot;
}
this._memberIdentifier = parameters.memberIdentifier;
this._memberSymbol = parameters.memberSymbol;
this._selector = parameters.selector;
}
/** @override */
get kind() {
return DocNode_1.DocNodeKind.MemberReference;
}
/**
* True if this member reference is preceded by a dot (".") token.
* It should be false only for the first member in the chain.
*/
get hasDot() {
return this._hasDot;
}
/**
* The identifier for the referenced member.
* @remarks
* Either `memberIdentifier` or `memberSymbol` may be specified, but not both.
*/
get memberIdentifier() {
return this._memberIdentifier;
}
/**
* The ECMAScript 6 symbol expression, which may be used instead of an identifier
* to indicate the referenced member.
* @remarks
* Either `memberIdentifier` or `memberSymbol` may be specified, but not both.
*/
get memberSymbol() {
return this._memberSymbol;
}
/**
* A TSDoc selector, which may be optionally when the identifier or symbol is insufficient
* to unambiguously determine the referenced declaration.
*/
get selector() {
return this._selector;
}
/** @override */
onGetChildNodes() {
return [
this._dotExcerpt,
this._spacingAfterDotExcerpt,
this._leftParenthesisExcerpt,
this._spacingAfterLeftParenthesisExcerpt,
this._memberIdentifier,
this._memberSymbol,
this._spacingAfterMemberExcerpt,
this._colonExcerpt,
this._spacingAfterColonExcerpt,
this._selector,
this._spacingAfterSelectorExcerpt,
this._rightParenthesisExcerpt,
this._spacingAfterRightParenthesisExcerpt
];
}
}
exports.DocMemberReference = DocMemberReference;
//# sourceMappingURL=DocMemberReference.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,142 @@
"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.DocMemberSelector = exports.SelectorKind = void 0;
const DocNode_1 = require("./DocNode");
const StringChecks_1 = require("../parser/StringChecks");
const DocExcerpt_1 = require("./DocExcerpt");
/**
* Kinds of TSDoc selectors.
*/
var SelectorKind;
(function (SelectorKind) {
/**
* Used in cases where the parser encounters a string that is incorrect but
* valid enough that a DocMemberSelector node was created.
*/
SelectorKind["Error"] = "error";
/**
* System selectors are always all lower-case and belong to a set of predefined label names.
*/
SelectorKind["System"] = "system";
/**
* Index selectors are integer numbers. They provide an alternative way of referencing
* overloaded functions, based on the order in which the declarations appear in
* a source file.
*
* @remarks
* Warning: Index selectors are not recommended; they are intended to provide a temporary
* workaround for situations where an external library neglected to declare a `{@label}` tag
* and cannot be easily fixed.
*/
SelectorKind["Index"] = "index";
/**
* Label selectors refer to labels created using the `{@label}` TSDoc tag.
* The labels are always comprised of upper-case letters or numbers separated by underscores,
* and the first character cannot be a number.
*/
SelectorKind["Label"] = "label";
})(SelectorKind || (exports.SelectorKind = SelectorKind = {}));
/**
*/
class DocMemberSelector extends DocNode_1.DocNode {
/**
* Don't call this directly. Instead use {@link TSDocParser}
* @internal
*/
constructor(parameters) {
super(parameters);
if (DocNode_1.DocNode.isParsedParameters(parameters)) {
this._selectorExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.MemberSelector,
content: parameters.selectorExcerpt
});
this._selector = parameters.selectorExcerpt.toString();
}
else {
this._selector = parameters.selector;
}
this._selectorKind = SelectorKind.Error;
this._errorMessage = undefined;
// The logic below will always either (1) assign selectorKind or (2) else assign an errorMessage
if (this._selector.length === 0) {
this._errorMessage = 'The selector cannot be an empty string';
}
else if (DocMemberSelector._likeIndexSelectorRegExp.test(this._selector)) {
// It looks like an index selector
if (DocMemberSelector._indexSelectorRegExp.test(this._selector)) {
this._selectorKind = SelectorKind.Index;
}
else {
this._errorMessage = 'If the selector begins with a number, it must be a positive integer value';
}
}
else if (DocMemberSelector._likeLabelSelectorRegExp.test(this._selector)) {
// It looks like a label selector
if (DocMemberSelector._labelSelectorRegExp.test(this._selector)) {
this._selectorKind = SelectorKind.Label;
}
else {
this._errorMessage =
'A label selector must be comprised of upper case letters, numbers,' +
' and underscores and must not start with a number';
}
}
else {
if (StringChecks_1.StringChecks.isSystemSelector(this._selector)) {
this._selectorKind = SelectorKind.System;
}
else if (DocMemberSelector._likeSystemSelectorRegExp.test(this._selector)) {
// It looks like a system selector, but is not
this._errorMessage =
`The selector ${JSON.stringify(this._selector)}` +
` is not a recognized TSDoc system selector name`;
}
else {
// It doesn't look like anything we recognize
this._errorMessage = 'Invalid syntax for selector';
}
}
}
/** @override */
get kind() {
return DocNode_1.DocNodeKind.MemberSelector;
}
/**
* The text representation of the selector.
*
* @remarks
* For system selectors, it will be a predefined lower case name.
* For label selectors, it will be an upper case name defined using the `{@label}` tag.
* For index selectors, it will be a positive integer.
*/
get selector() {
return this._selector;
}
/**
* Indicates the kind of selector.
*/
get selectorKind() {
return this._selectorKind;
}
/**
* If the `selectorKind` is `SelectorKind.Error`, this string will be defined and provide
* more detail about why the string was not valid.
*/
get errorMessage() {
return this._errorMessage;
}
/** @override */
onGetChildNodes() {
return [this._selectorExcerpt];
}
}
exports.DocMemberSelector = DocMemberSelector;
DocMemberSelector._likeIndexSelectorRegExp = /^[0-9]/;
DocMemberSelector._indexSelectorRegExp = /^[1-9][0-9]*$/;
DocMemberSelector._likeLabelSelectorRegExp = /^[A-Z_]/u;
DocMemberSelector._labelSelectorRegExp = /^[A-Z_][A-Z0-9_]+$/;
DocMemberSelector._likeSystemSelectorRegExp = /^[a-z]+$/u;
//# sourceMappingURL=DocMemberSelector.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,68 @@
"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.DocMemberSymbol = void 0;
const DocNode_1 = require("./DocNode");
const DocExcerpt_1 = require("./DocExcerpt");
/**
* Represents a reference to an ECMAScript 6 symbol that is used
* to identify a member declaration.
*
* @example
*
* In the declaration reference `{@link MyClass.([MySymbols.example]:instance)}`,
* the member symbol `[MySymbols.example]` might be used to reference a property
* of the class.
*/
class DocMemberSymbol extends DocNode_1.DocNode {
/**
* Don't call this directly. Instead use {@link TSDocParser}
* @internal
*/
constructor(parameters) {
super(parameters);
if (DocNode_1.DocNode.isParsedParameters(parameters)) {
this._leftBracketExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.DocMemberSymbol_LeftBracket,
content: parameters.leftBracketExcerpt
});
if (parameters.spacingAfterLeftBracketExcerpt) {
this._spacingAfterLeftBracketExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.Spacing,
content: parameters.spacingAfterLeftBracketExcerpt
});
}
this._rightBracketExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.DocMemberSymbol_RightBracket,
content: parameters.rightBracketExcerpt
});
}
this._symbolReference = parameters.symbolReference;
}
/** @override */
get kind() {
return DocNode_1.DocNodeKind.MemberSymbol;
}
/**
* The declaration reference for the ECMAScript 6 symbol that will act as
* the identifier for the member.
*/
get symbolReference() {
return this._symbolReference;
}
/** @override */
onGetChildNodes() {
return [
this._leftBracketExcerpt,
this._spacingAfterLeftBracketExcerpt,
this._symbolReference,
this._rightBracketExcerpt
];
}
}
exports.DocMemberSymbol = DocMemberSymbol;
//# sourceMappingURL=DocMemberSymbol.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"DocMemberSymbol.js","sourceRoot":"","sources":["../../src/nodes/DocMemberSymbol.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;AAE3D,uCAAyG;AAGzG,6CAAuD;AAqBvD;;;;;;;;;GASG;AACH,MAAa,eAAgB,SAAQ,iBAAO;IAQ1C;;;OAGG;IACH,YAAmB,UAAyE;QAC1F,KAAK,CAAC,UAAU,CAAC,CAAC;QAElB,IAAI,iBAAO,CAAC,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,mBAAmB,GAAG,IAAI,uBAAU,CAAC;gBACxC,aAAa,EAAE,IAAI,CAAC,aAAa;gBACjC,WAAW,EAAE,wBAAW,CAAC,2BAA2B;gBACpD,OAAO,EAAE,UAAU,CAAC,kBAAkB;aACvC,CAAC,CAAC;YAEH,IAAI,UAAU,CAAC,8BAA8B,EAAE,CAAC;gBAC9C,IAAI,CAAC,+BAA+B,GAAG,IAAI,uBAAU,CAAC;oBACpD,aAAa,EAAE,IAAI,CAAC,aAAa;oBACjC,WAAW,EAAE,wBAAW,CAAC,OAAO;oBAChC,OAAO,EAAE,UAAU,CAAC,8BAA8B;iBACnD,CAAC,CAAC;YACL,CAAC;YAED,IAAI,CAAC,oBAAoB,GAAG,IAAI,uBAAU,CAAC;gBACzC,aAAa,EAAE,IAAI,CAAC,aAAa;gBACjC,WAAW,EAAE,wBAAW,CAAC,4BAA4B;gBACrD,OAAO,EAAE,UAAU,CAAC,mBAAmB;aACxC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,gBAAgB,GAAG,UAAU,CAAC,eAAe,CAAC;IACrD,CAAC;IAED,gBAAgB;IAChB,IAAW,IAAI;QACb,OAAO,qBAAW,CAAC,YAAY,CAAC;IAClC,CAAC;IAED;;;OAGG;IACH,IAAW,eAAe;QACxB,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;IAED,gBAAgB;IACN,eAAe;QACvB,OAAO;YACL,IAAI,CAAC,mBAAmB;YACxB,IAAI,CAAC,+BAA+B;YACpC,IAAI,CAAC,gBAAgB;YACrB,IAAI,CAAC,oBAAoB;SAC1B,CAAC;IACJ,CAAC;CACF;AA9DD,0CA8DC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nimport { DocNodeKind, DocNode, type IDocNodeParameters, type IDocNodeParsedParameters } from './DocNode';\r\nimport type { DocDeclarationReference } from './DocDeclarationReference';\r\nimport type { TokenSequence } from '../parser/TokenSequence';\r\nimport { DocExcerpt, ExcerptKind } from './DocExcerpt';\r\n\r\n/**\r\n * Constructor parameters for {@link DocMemberSymbol}.\r\n */\r\nexport interface IDocMemberSymbolParameters extends IDocNodeParameters {\r\n symbolReference: DocDeclarationReference;\r\n}\r\n\r\n/**\r\n * Constructor parameters for {@link DocMemberSymbol}.\r\n */\r\nexport interface IDocMemberSymbolParsedParameters extends IDocNodeParsedParameters {\r\n leftBracketExcerpt: TokenSequence;\r\n spacingAfterLeftBracketExcerpt?: TokenSequence;\r\n\r\n symbolReference: DocDeclarationReference;\r\n\r\n rightBracketExcerpt: TokenSequence;\r\n}\r\n\r\n/**\r\n * Represents a reference to an ECMAScript 6 symbol that is used\r\n * to identify a member declaration.\r\n *\r\n * @example\r\n *\r\n * In the declaration reference `{@link MyClass.([MySymbols.example]:instance)}`,\r\n * the member symbol `[MySymbols.example]` might be used to reference a property\r\n * of the class.\r\n */\r\nexport class DocMemberSymbol extends DocNode {\r\n private readonly _leftBracketExcerpt: DocExcerpt | undefined;\r\n private readonly _spacingAfterLeftBracketExcerpt: DocExcerpt | undefined;\r\n\r\n private readonly _symbolReference: DocDeclarationReference;\r\n\r\n private readonly _rightBracketExcerpt: DocExcerpt | undefined;\r\n\r\n /**\r\n * Don't call this directly. Instead use {@link TSDocParser}\r\n * @internal\r\n */\r\n public constructor(parameters: IDocMemberSymbolParameters | IDocMemberSymbolParsedParameters) {\r\n super(parameters);\r\n\r\n if (DocNode.isParsedParameters(parameters)) {\r\n this._leftBracketExcerpt = new DocExcerpt({\r\n configuration: this.configuration,\r\n excerptKind: ExcerptKind.DocMemberSymbol_LeftBracket,\r\n content: parameters.leftBracketExcerpt\r\n });\r\n\r\n if (parameters.spacingAfterLeftBracketExcerpt) {\r\n this._spacingAfterLeftBracketExcerpt = new DocExcerpt({\r\n configuration: this.configuration,\r\n excerptKind: ExcerptKind.Spacing,\r\n content: parameters.spacingAfterLeftBracketExcerpt\r\n });\r\n }\r\n\r\n this._rightBracketExcerpt = new DocExcerpt({\r\n configuration: this.configuration,\r\n excerptKind: ExcerptKind.DocMemberSymbol_RightBracket,\r\n content: parameters.rightBracketExcerpt\r\n });\r\n }\r\n\r\n this._symbolReference = parameters.symbolReference;\r\n }\r\n\r\n /** @override */\r\n public get kind(): DocNodeKind | string {\r\n return DocNodeKind.MemberSymbol;\r\n }\r\n\r\n /**\r\n * The declaration reference for the ECMAScript 6 symbol that will act as\r\n * the identifier for the member.\r\n */\r\n public get symbolReference(): DocDeclarationReference {\r\n return this._symbolReference;\r\n }\r\n\r\n /** @override */\r\n protected onGetChildNodes(): ReadonlyArray<DocNode | undefined> {\r\n return [\r\n this._leftBracketExcerpt,\r\n this._spacingAfterLeftBracketExcerpt,\r\n this._symbolReference,\r\n this._rightBracketExcerpt\r\n ];\r\n }\r\n}\r\n"]}

View File

@@ -0,0 +1,80 @@
"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.DocNode = exports.DocNodeKind = void 0;
/**
* Indicates the type of {@link DocNode}.
*
* @remarks
* When creating custom subclasses of `DocNode`, it's recommended to create your own enum to identify them.
* To avoid naming conflicts between projects, the enum value should be a string comprised of your full
* NPM package name, followed by a "#" symbol, followed by the class name (without the "Doc" prefix).
*/
var DocNodeKind;
(function (DocNodeKind) {
DocNodeKind["Block"] = "Block";
DocNodeKind["BlockTag"] = "BlockTag";
DocNodeKind["Excerpt"] = "Excerpt";
DocNodeKind["FencedCode"] = "FencedCode";
DocNodeKind["CodeSpan"] = "CodeSpan";
DocNodeKind["Comment"] = "Comment";
DocNodeKind["DeclarationReference"] = "DeclarationReference";
DocNodeKind["ErrorText"] = "ErrorText";
DocNodeKind["EscapedText"] = "EscapedText";
DocNodeKind["HtmlAttribute"] = "HtmlAttribute";
DocNodeKind["HtmlEndTag"] = "HtmlEndTag";
DocNodeKind["HtmlStartTag"] = "HtmlStartTag";
DocNodeKind["InheritDocTag"] = "InheritDocTag";
DocNodeKind["InlineTag"] = "InlineTag";
DocNodeKind["LinkTag"] = "LinkTag";
DocNodeKind["MemberIdentifier"] = "MemberIdentifier";
DocNodeKind["MemberReference"] = "MemberReference";
DocNodeKind["MemberSelector"] = "MemberSelector";
DocNodeKind["MemberSymbol"] = "MemberSymbol";
DocNodeKind["Paragraph"] = "Paragraph";
DocNodeKind["ParamBlock"] = "ParamBlock";
DocNodeKind["ParamCollection"] = "ParamCollection";
DocNodeKind["PlainText"] = "PlainText";
DocNodeKind["Section"] = "Section";
DocNodeKind["SoftBreak"] = "SoftBreak";
})(DocNodeKind || (exports.DocNodeKind = DocNodeKind = {}));
/**
* The base class for the parser's Abstract Syntax Tree nodes.
*/
class DocNode {
constructor(parameters) {
this.configuration = parameters.configuration;
}
/**
* Returns the list of child nodes for this node. This is useful for visitors that want
* to scan the tree looking for nodes of a specific type, without having to process
* intermediary nodes.
*/
getChildNodes() {
// Do this sanity check here, since the constructor cannot access abstract members
this.configuration.docNodeManager.throwIfNotRegisteredKind(this.kind);
return this.onGetChildNodes().filter((x) => x !== undefined);
}
/**
* Overridden by child classes to implement {@link DocNode.getChildNodes}.
* @virtual
*/
onGetChildNodes() {
return [];
}
/**
* A type guard that returns true if the input uses the `IDocNodeParsedParameters` (parser scenario).
*
* @remarks
* There are two scenarios for constructing `DocNode` objects. The "builder scenario" constructs the object based on
* literal strings, does NOT create DocExcerpt child nodes, and generally uses the {@link IDocNodeParameters}
* hierarchy for its constructor parameters. The "parser scenario" constructs the object by parsing a TypeScript
* source file, does create DocExcerpt child nodes, and generally uses the {@link IDocNodeParsedParameters} hierarchy.
*/
static isParsedParameters(parameters) {
return parameters.parsed === true;
}
}
exports.DocNode = DocNode;
//# sourceMappingURL=DocNode.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,59 @@
"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.DocNodeContainer = void 0;
const DocNode_1 = require("./DocNode");
/**
* DocNodeContainer is the base class for DocNode classes that allow arbitrary child nodes to be added by the consumer.
* The child classes are {@link DocParagraph} and {@link DocSection}.
*/
class DocNodeContainer extends DocNode_1.DocNode {
/**
* Don't call this directly. Instead use {@link TSDocParser}
* @internal
*/
constructor(parameters, childNodes) {
super(parameters);
this._nodes = [];
if (childNodes !== undefined && childNodes.length > 0) {
this.appendNodes(childNodes);
}
}
/**
* The nodes that were added to this container.
*/
get nodes() {
return this._nodes;
}
/**
* Append a node to the container.
*/
appendNode(docNode) {
if (!this.configuration.docNodeManager.isAllowedChild(this.kind, docNode.kind)) {
throw new Error(`The TSDocConfiguration does not allow a ${this.kind} node to` +
` contain a node of type ${docNode.kind}`);
}
this._nodes.push(docNode);
}
/**
* Append nodes to the container.
*/
appendNodes(docNodes) {
for (const docNode of docNodes) {
this.appendNode(docNode);
}
}
/**
* Remove all nodes from the container.
*/
clearNodes() {
this._nodes.length = 0;
}
/** @override */
onGetChildNodes() {
return this._nodes;
}
}
exports.DocNodeContainer = DocNodeContainer;
//# sourceMappingURL=DocNodeContainer.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"DocNodeContainer.js","sourceRoot":"","sources":["../../src/nodes/DocNodeContainer.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;AAE3D,uCAA4F;AAY5F;;;GAGG;AACH,MAAsB,gBAAiB,SAAQ,iBAAO;IAGpD;;;OAGG;IACH,YACE,UAA2E,EAC3E,UAAmC;QAEnC,KAAK,CAAC,UAAU,CAAC,CAAC;QAVH,WAAM,GAAc,EAAE,CAAC;QAYtC,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtD,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,IAAW,KAAK;QACd,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;OAEG;IACI,UAAU,CAAC,OAAgB;QAChC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/E,MAAM,IAAI,KAAK,CACb,2CAA2C,IAAI,CAAC,IAAI,UAAU;gBAC5D,2BAA2B,OAAO,CAAC,IAAI,EAAE,CAC5C,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,MAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAED;;OAEG;IACI,WAAW,CAAC,QAAgC;QACjD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED;;OAEG;IACI,UAAU;QACf,IAAI,CAAC,MAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED,gBAAgB;IACN,eAAe;QACvB,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF;AA3DD,4CA2DC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nimport { DocNode, type IDocNodeParameters, type IDocNodeParsedParameters } from './DocNode';\r\n\r\n/**\r\n * Constructor parameters for {@link DocNodeContainer}.\r\n */\r\nexport interface IDocNodeContainerParameters extends IDocNodeParameters {}\r\n\r\n/**\r\n * Constructor parameters for {@link DocNodeContainer}.\r\n */\r\nexport interface IDocNodeContainerParsedParameters extends IDocNodeParsedParameters {}\r\n\r\n/**\r\n * DocNodeContainer is the base class for DocNode classes that allow arbitrary child nodes to be added by the consumer.\r\n * The child classes are {@link DocParagraph} and {@link DocSection}.\r\n */\r\nexport abstract class DocNodeContainer extends DocNode {\r\n private readonly _nodes: DocNode[] = [];\r\n\r\n /**\r\n * Don't call this directly. Instead use {@link TSDocParser}\r\n * @internal\r\n */\r\n public constructor(\r\n parameters: IDocNodeContainerParameters | IDocNodeContainerParsedParameters,\r\n childNodes?: ReadonlyArray<DocNode>\r\n ) {\r\n super(parameters);\r\n\r\n if (childNodes !== undefined && childNodes.length > 0) {\r\n this.appendNodes(childNodes);\r\n }\r\n }\r\n\r\n /**\r\n * The nodes that were added to this container.\r\n */\r\n public get nodes(): ReadonlyArray<DocNode> {\r\n return this._nodes;\r\n }\r\n\r\n /**\r\n * Append a node to the container.\r\n */\r\n public appendNode(docNode: DocNode): void {\r\n if (!this.configuration.docNodeManager.isAllowedChild(this.kind, docNode.kind)) {\r\n throw new Error(\r\n `The TSDocConfiguration does not allow a ${this.kind} node to` +\r\n ` contain a node of type ${docNode.kind}`\r\n );\r\n }\r\n\r\n this._nodes!.push(docNode);\r\n }\r\n\r\n /**\r\n * Append nodes to the container.\r\n */\r\n public appendNodes(docNodes: ReadonlyArray<DocNode>): void {\r\n for (const docNode of docNodes) {\r\n this.appendNode(docNode);\r\n }\r\n }\r\n\r\n /**\r\n * Remove all nodes from the container.\r\n */\r\n public clearNodes(): void {\r\n this._nodes!.length = 0;\r\n }\r\n\r\n /** @override */\r\n protected onGetChildNodes(): ReadonlyArray<DocNode | undefined> {\r\n return this._nodes;\r\n }\r\n}\r\n"]}

View File

@@ -0,0 +1,27 @@
"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.DocParagraph = void 0;
const DocNode_1 = require("./DocNode");
const DocNodeContainer_1 = require("./DocNodeContainer");
/**
* Represents a paragraph of text, similar to a `<p>` element in HTML.
* Like CommonMark, the TSDoc syntax uses blank lines to delineate paragraphs
* instead of explicitly notating them.
*/
class DocParagraph extends DocNodeContainer_1.DocNodeContainer {
/**
* Don't call this directly. Instead use {@link TSDocParser}
* @internal
*/
constructor(parameters, childNodes) {
super(parameters, childNodes);
}
/** @override */
get kind() {
return DocNode_1.DocNodeKind.Paragraph;
}
}
exports.DocParagraph = DocParagraph;
//# sourceMappingURL=DocParagraph.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"DocParagraph.js","sourceRoot":"","sources":["../../src/nodes/DocParagraph.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;AAE3D,uCAAsD;AACtD,yDAAwF;AAOxF;;;;GAIG;AACH,MAAa,YAAa,SAAQ,mCAAgB;IAChD;;;OAGG;IACH,YAAmB,UAAmC,EAAE,UAAmC;QACzF,KAAK,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAChC,CAAC;IAED,gBAAgB;IAChB,IAAW,IAAI;QACb,OAAO,qBAAW,CAAC,SAAS,CAAC;IAC/B,CAAC;CACF;AAbD,oCAaC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nimport { DocNodeKind, type DocNode } from './DocNode';\r\nimport { DocNodeContainer, type IDocNodeContainerParameters } from './DocNodeContainer';\r\n\r\n/**\r\n * Constructor parameters for {@link DocParagraph}.\r\n */\r\nexport interface IDocParagraphParameters extends IDocNodeContainerParameters {}\r\n\r\n/**\r\n * Represents a paragraph of text, similar to a `<p>` element in HTML.\r\n * Like CommonMark, the TSDoc syntax uses blank lines to delineate paragraphs\r\n * instead of explicitly notating them.\r\n */\r\nexport class DocParagraph extends DocNodeContainer {\r\n /**\r\n * Don't call this directly. Instead use {@link TSDocParser}\r\n * @internal\r\n */\r\n public constructor(parameters: IDocParagraphParameters, childNodes?: ReadonlyArray<DocNode>) {\r\n super(parameters, childNodes);\r\n }\r\n\r\n /** @override */\r\n public get kind(): DocNodeKind | string {\r\n return DocNodeKind.Paragraph;\r\n }\r\n}\r\n"]}

View File

@@ -0,0 +1,122 @@
"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.DocParamBlock = void 0;
const DocNode_1 = require("./DocNode");
const DocBlock_1 = require("./DocBlock");
const DocExcerpt_1 = require("./DocExcerpt");
/**
* Represents a parsed `@param` or `@typeParam` block, which provides a description for a
* function parameter.
*/
class DocParamBlock extends DocBlock_1.DocBlock {
/**
* Don't call this directly. Instead use {@link TSDocParser}
* @internal
*/
constructor(parameters) {
super(parameters);
this._parameterName = parameters.parameterName;
if (DocNode_1.DocNode.isParsedParameters(parameters)) {
if (parameters.spacingBeforeParameterNameExcerpt) {
this._spacingBeforeParameterNameExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.Spacing,
content: parameters.spacingBeforeParameterNameExcerpt
});
}
if (parameters.unsupportedJsdocTypeBeforeParameterNameExcerpt) {
this._unsupportedJsdocTypeBeforeParameterNameExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.NonstandardText,
content: parameters.unsupportedJsdocTypeBeforeParameterNameExcerpt
});
}
if (parameters.unsupportedJsdocOptionalNameOpenBracketExcerpt) {
this._unsupportedJsdocOptionalNameOpenBracketExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.NonstandardText,
content: parameters.unsupportedJsdocOptionalNameOpenBracketExcerpt
});
}
this._parameterNameExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.ParamBlock_ParameterName,
content: parameters.parameterNameExcerpt
});
if (parameters.unsupportedJsdocOptionalNameRestExcerpt) {
this._unsupportedJsdocOptionalNameRestExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.NonstandardText,
content: parameters.unsupportedJsdocOptionalNameRestExcerpt
});
}
if (parameters.spacingAfterParameterNameExcerpt) {
this._spacingAfterParameterNameExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.Spacing,
content: parameters.spacingAfterParameterNameExcerpt
});
}
if (parameters.unsupportedJsdocTypeAfterParameterNameExcerpt) {
this._unsupportedJsdocTypeAfterParameterNameExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.NonstandardText,
content: parameters.unsupportedJsdocTypeAfterParameterNameExcerpt
});
}
if (parameters.hyphenExcerpt) {
this._hyphenExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.ParamBlock_Hyphen,
content: parameters.hyphenExcerpt
});
}
if (parameters.spacingAfterHyphenExcerpt) {
this._spacingAfterHyphenExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.Spacing,
content: parameters.spacingAfterHyphenExcerpt
});
}
if (parameters.unsupportedJsdocTypeAfterHyphenExcerpt) {
this._unsupportedJsdocTypeAfterHyphenExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.NonstandardText,
content: parameters.unsupportedJsdocTypeAfterHyphenExcerpt
});
}
}
}
/** @override */
get kind() {
return DocNode_1.DocNodeKind.ParamBlock;
}
/**
* The name of the parameter that is being documented.
* For example "width" in `@param width - the width of the object`.
*/
get parameterName() {
return this._parameterName;
}
/** @override */
onGetChildNodes() {
return [
this.blockTag,
this._spacingBeforeParameterNameExcerpt,
this._unsupportedJsdocTypeBeforeParameterNameExcerpt,
this._unsupportedJsdocOptionalNameOpenBracketExcerpt,
this._parameterNameExcerpt,
this._unsupportedJsdocOptionalNameRestExcerpt,
this._spacingAfterParameterNameExcerpt,
this._unsupportedJsdocTypeAfterParameterNameExcerpt,
this._hyphenExcerpt,
this._spacingAfterHyphenExcerpt,
this._unsupportedJsdocTypeAfterHyphenExcerpt,
this.content
];
}
}
exports.DocParamBlock = DocParamBlock;
//# sourceMappingURL=DocParamBlock.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,85 @@
"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.DocParamCollection = void 0;
const DocNode_1 = require("./DocNode");
/**
* Represents a collection of DocParamBlock objects and provides efficient operations for looking up the
* documentation for a specified parameter name.
*/
class DocParamCollection extends DocNode_1.DocNode {
/**
* Don't call this directly. Instead use {@link TSDocParser}
* @internal
*/
constructor(parameters) {
super(parameters);
this._blocks = [];
}
/** @override */
get kind() {
return DocNode_1.DocNodeKind.ParamCollection;
}
/**
* Provide an iterator for callers that support it.
*/
[Symbol.iterator]() {
return this._blocks[Symbol.iterator]();
}
/**
* Returns the blocks in this collection.
*/
get blocks() {
return this._blocks;
}
/**
* Returns the number of blocks in this collection.
*/
get count() {
return this._blocks.length;
}
/**
* Adds a new block to the collection.
*/
add(docParamBlock) {
this._blocks.push(docParamBlock);
// Allocate the map on demand, since most DocComment parameter collections will be empty
if (this._blocksByName === undefined) {
this._blocksByName = new Map();
}
// The first block to be added takes precedence
if (!this._blocksByName.has(docParamBlock.parameterName)) {
this._blocksByName.set(docParamBlock.parameterName, docParamBlock);
}
}
/**
* Removes all blocks from the collection
*/
clear() {
this._blocks.length = 0;
this._blocksByName = undefined;
}
/**
* Returns the first block whose `parameterName` matches the specified string.
*
* @remarks
* If the collection was parsed from an input containing errors, there could potentially be more than
* one DocParamBlock with the same name. In this situation, tryGetBlockByName() will return the first match
* that it finds.
*
* This lookup is optimized using a dictionary.
*/
tryGetBlockByName(parameterName) {
if (this._blocksByName) {
return this._blocksByName.get(parameterName);
}
return undefined;
}
/** @override */
onGetChildNodes() {
return this._blocks;
}
}
exports.DocParamCollection = DocParamCollection;
//# sourceMappingURL=DocParamCollection.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"DocParamCollection.js","sourceRoot":"","sources":["../../src/nodes/DocParamCollection.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;AAE3D,uCAA0E;AAQ1E;;;GAGG;AACH,MAAa,kBAAmB,SAAQ,iBAAO;IAI7C;;;OAGG;IACH,YAAmB,UAAyC;QAC1D,KAAK,CAAC,UAAU,CAAC,CAAC;QARH,YAAO,GAAoB,EAAE,CAAC;IAS/C,CAAC;IAED,gBAAgB;IAChB,IAAW,IAAI;QACb,OAAO,qBAAW,CAAC,eAAe,CAAC;IACrC,CAAC;IAED;;OAEG;IACI,CAAC,MAAM,CAAC,QAAQ,CAAC;QACtB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,IAAW,MAAM;QACf,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,IAAW,KAAK;QACd,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED;;OAEG;IACI,GAAG,CAAC,aAA4B;QACrC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAEjC,wFAAwF;QACxF,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACrC,IAAI,CAAC,aAAa,GAAG,IAAI,GAAG,EAAyB,CAAC;QACxD,CAAC;QAED,+CAA+C;QAC/C,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,aAAa,CAAC,EAAE,CAAC;YACzD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IAED;;OAEG;IACI,KAAK;QACV,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;IACjC,CAAC;IAED;;;;;;;;;OASG;IACI,iBAAiB,CAAC,aAAqB;QAC5C,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,gBAAgB;IACN,eAAe;QACvB,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;CACF;AApFD,gDAoFC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nimport { DocNodeKind, DocNode, type IDocNodeParameters } from './DocNode';\r\nimport type { DocParamBlock } from './DocParamBlock';\r\n\r\n/**\r\n * Constructor parameters for {@link DocParamCollection}.\r\n */\r\nexport interface IDocParamCollectionParameters extends IDocNodeParameters {}\r\n\r\n/**\r\n * Represents a collection of DocParamBlock objects and provides efficient operations for looking up the\r\n * documentation for a specified parameter name.\r\n */\r\nexport class DocParamCollection extends DocNode {\r\n private readonly _blocks: DocParamBlock[] = [];\r\n private _blocksByName: Map<string, DocParamBlock> | undefined;\r\n\r\n /**\r\n * Don't call this directly. Instead use {@link TSDocParser}\r\n * @internal\r\n */\r\n public constructor(parameters: IDocParamCollectionParameters) {\r\n super(parameters);\r\n }\r\n\r\n /** @override */\r\n public get kind(): DocNodeKind | string {\r\n return DocNodeKind.ParamCollection;\r\n }\r\n\r\n /**\r\n * Provide an iterator for callers that support it.\r\n */\r\n public [Symbol.iterator](): IterableIterator<DocParamBlock> {\r\n return this._blocks[Symbol.iterator]();\r\n }\r\n\r\n /**\r\n * Returns the blocks in this collection.\r\n */\r\n public get blocks(): ReadonlyArray<DocParamBlock> {\r\n return this._blocks;\r\n }\r\n\r\n /**\r\n * Returns the number of blocks in this collection.\r\n */\r\n public get count(): number {\r\n return this._blocks.length;\r\n }\r\n\r\n /**\r\n * Adds a new block to the collection.\r\n */\r\n public add(docParamBlock: DocParamBlock): void {\r\n this._blocks.push(docParamBlock);\r\n\r\n // Allocate the map on demand, since most DocComment parameter collections will be empty\r\n if (this._blocksByName === undefined) {\r\n this._blocksByName = new Map<string, DocParamBlock>();\r\n }\r\n\r\n // The first block to be added takes precedence\r\n if (!this._blocksByName.has(docParamBlock.parameterName)) {\r\n this._blocksByName.set(docParamBlock.parameterName, docParamBlock);\r\n }\r\n }\r\n\r\n /**\r\n * Removes all blocks from the collection\r\n */\r\n public clear(): void {\r\n this._blocks.length = 0;\r\n this._blocksByName = undefined;\r\n }\r\n\r\n /**\r\n * Returns the first block whose `parameterName` matches the specified string.\r\n *\r\n * @remarks\r\n * If the collection was parsed from an input containing errors, there could potentially be more than\r\n * one DocParamBlock with the same name. In this situation, tryGetBlockByName() will return the first match\r\n * that it finds.\r\n *\r\n * This lookup is optimized using a dictionary.\r\n */\r\n public tryGetBlockByName(parameterName: string): DocParamBlock | undefined {\r\n if (this._blocksByName) {\r\n return this._blocksByName.get(parameterName);\r\n }\r\n return undefined;\r\n }\r\n\r\n /** @override */\r\n protected onGetChildNodes(): ReadonlyArray<DocNode | undefined> {\r\n return this._blocks;\r\n }\r\n}\r\n"]}

View File

@@ -0,0 +1,68 @@
"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.DocPlainText = void 0;
const DocNode_1 = require("./DocNode");
const DocExcerpt_1 = require("./DocExcerpt");
/**
* Represents a span of comment text that is considered by the parser
* to contain no special symbols or meaning.
*
* @remarks
* The text content must not contain newline characters.
* Use DocSoftBreak to represent manual line splitting.
*/
class DocPlainText extends DocNode_1.DocNode {
/**
* Don't call this directly. Instead use {@link TSDocParser}
* @internal
*/
constructor(parameters) {
super(parameters);
if (DocNode_1.DocNode.isParsedParameters(parameters)) {
this._textExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.PlainText,
content: parameters.textExcerpt
});
}
else {
if (DocPlainText._newlineCharacterRegExp.test(parameters.text)) {
// Use DocSoftBreak to represent manual line splitting
throw new Error('The DocPlainText content must not contain newline characters');
}
this._text = parameters.text;
}
}
/** @override */
get kind() {
return DocNode_1.DocNodeKind.PlainText;
}
/**
* The text content.
*/
get text() {
if (this._text === undefined) {
this._text = this._textExcerpt.content.toString();
}
return this._text;
}
get textExcerpt() {
if (this._textExcerpt) {
return this._textExcerpt.content;
}
else {
return undefined;
}
}
/** @override */
onGetChildNodes() {
return [this._textExcerpt];
}
}
exports.DocPlainText = DocPlainText;
// TODO: We should also prohibit "\r", but this requires updating LineExtractor
// to interpret a lone "\r" as a newline
DocPlainText._newlineCharacterRegExp = /[\n]/;
//# sourceMappingURL=DocPlainText.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"DocPlainText.js","sourceRoot":"","sources":["../../src/nodes/DocPlainText.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;AAE3D,uCAAyG;AAEzG,6CAAuD;AAgBvD;;;;;;;GAOG;AACH,MAAa,YAAa,SAAQ,iBAAO;IAQvC;;;OAGG;IACH,YAAmB,UAAmE;QACpF,KAAK,CAAC,UAAU,CAAC,CAAC;QAElB,IAAI,iBAAO,CAAC,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,YAAY,GAAG,IAAI,uBAAU,CAAC;gBACjC,aAAa,EAAE,IAAI,CAAC,aAAa;gBACjC,WAAW,EAAE,wBAAW,CAAC,SAAS;gBAClC,OAAO,EAAE,UAAU,CAAC,WAAW;aAChC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,IAAI,YAAY,CAAC,uBAAuB,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC/D,sDAAsD;gBACtD,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;YAClF,CAAC;YAED,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,IAAW,IAAI;QACb,OAAO,qBAAW,CAAC,SAAS,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,IAAW,IAAI;QACb,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC7B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,YAAa,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrD,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,IAAW,WAAW;QACpB,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;QACnC,CAAC;aAAM,CAAC;YACN,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,gBAAgB;IACN,eAAe;QACvB,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC7B,CAAC;;AAzDH,oCA0DC;AAzDC,+EAA+E;AAC/E,wCAAwC;AAChB,oCAAuB,GAAW,MAAM,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nimport { DocNodeKind, type IDocNodeParameters, type IDocNodeParsedParameters, DocNode } from './DocNode';\r\nimport type { TokenSequence } from '../parser/TokenSequence';\r\nimport { DocExcerpt, ExcerptKind } from './DocExcerpt';\r\n\r\n/**\r\n * Constructor parameters for {@link DocPlainText}.\r\n */\r\nexport interface IDocPlainTextParameters extends IDocNodeParameters {\r\n text: string;\r\n}\r\n\r\n/**\r\n * Constructor parameters for {@link DocPlainText}.\r\n */\r\nexport interface IDocPlainTextParsedParameters extends IDocNodeParsedParameters {\r\n textExcerpt: TokenSequence;\r\n}\r\n\r\n/**\r\n * Represents a span of comment text that is considered by the parser\r\n * to contain no special symbols or meaning.\r\n *\r\n * @remarks\r\n * The text content must not contain newline characters.\r\n * Use DocSoftBreak to represent manual line splitting.\r\n */\r\nexport class DocPlainText extends DocNode {\r\n // TODO: We should also prohibit \"\\r\", but this requires updating LineExtractor\r\n // to interpret a lone \"\\r\" as a newline\r\n private static readonly _newlineCharacterRegExp: RegExp = /[\\n]/;\r\n\r\n private _text: string | undefined;\r\n private readonly _textExcerpt: DocExcerpt | undefined;\r\n\r\n /**\r\n * Don't call this directly. Instead use {@link TSDocParser}\r\n * @internal\r\n */\r\n public constructor(parameters: IDocPlainTextParameters | IDocPlainTextParsedParameters) {\r\n super(parameters);\r\n\r\n if (DocNode.isParsedParameters(parameters)) {\r\n this._textExcerpt = new DocExcerpt({\r\n configuration: this.configuration,\r\n excerptKind: ExcerptKind.PlainText,\r\n content: parameters.textExcerpt\r\n });\r\n } else {\r\n if (DocPlainText._newlineCharacterRegExp.test(parameters.text)) {\r\n // Use DocSoftBreak to represent manual line splitting\r\n throw new Error('The DocPlainText content must not contain newline characters');\r\n }\r\n\r\n this._text = parameters.text;\r\n }\r\n }\r\n\r\n /** @override */\r\n public get kind(): DocNodeKind | string {\r\n return DocNodeKind.PlainText;\r\n }\r\n\r\n /**\r\n * The text content.\r\n */\r\n public get text(): string {\r\n if (this._text === undefined) {\r\n this._text = this._textExcerpt!.content.toString();\r\n }\r\n return this._text;\r\n }\r\n\r\n public get textExcerpt(): TokenSequence | undefined {\r\n if (this._textExcerpt) {\r\n return this._textExcerpt.content;\r\n } else {\r\n return undefined;\r\n }\r\n }\r\n\r\n /** @override */\r\n protected onGetChildNodes(): ReadonlyArray<DocNode | undefined> {\r\n return [this._textExcerpt];\r\n }\r\n}\r\n"]}

View File

@@ -0,0 +1,49 @@
"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.DocSection = void 0;
const DocNode_1 = require("./DocNode");
const DocParagraph_1 = require("./DocParagraph");
const DocNodeContainer_1 = require("./DocNodeContainer");
/**
* Represents a general block of rich text.
*/
class DocSection extends DocNodeContainer_1.DocNodeContainer {
/**
* Don't call this directly. Instead use {@link TSDocParser}
* @internal
*/
constructor(parameters, childNodes) {
super(parameters, childNodes);
}
/** @override */
get kind() {
return DocNode_1.DocNodeKind.Section;
}
/**
* If the last item in DocSection.nodes is not a DocParagraph, a new paragraph
* is started. Either way, the provided docNode will be appended to the paragraph.
*/
appendNodeInParagraph(docNode) {
let paragraphNode = undefined;
if (this.nodes.length > 0) {
const lastNode = this.nodes[this.nodes.length - 1];
if (lastNode.kind === DocNode_1.DocNodeKind.Paragraph) {
paragraphNode = lastNode;
}
}
if (!paragraphNode) {
paragraphNode = new DocParagraph_1.DocParagraph({ configuration: this.configuration });
this.appendNode(paragraphNode);
}
paragraphNode.appendNode(docNode);
}
appendNodesInParagraph(docNodes) {
for (const docNode of docNodes) {
this.appendNodeInParagraph(docNode);
}
}
}
exports.DocSection = DocSection;
//# sourceMappingURL=DocSection.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"DocSection.js","sourceRoot":"","sources":["../../src/nodes/DocSection.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;AAE3D,uCAAsD;AACtD,iDAA8C;AAC9C,yDAI4B;AAY5B;;GAEG;AACH,MAAa,UAAW,SAAQ,mCAAgB;IAC9C;;;OAGG;IACH,YACE,UAA+D,EAC/D,UAAmC;QAEnC,KAAK,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAChC,CAAC;IAED,gBAAgB;IAChB,IAAW,IAAI;QACb,OAAO,qBAAW,CAAC,OAAO,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACI,qBAAqB,CAAC,OAAgB;QAC3C,IAAI,aAAa,GAA6B,SAAS,CAAC;QAExD,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,QAAQ,GAAY,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC5D,IAAI,QAAQ,CAAC,IAAI,KAAK,qBAAW,CAAC,SAAS,EAAE,CAAC;gBAC5C,aAAa,GAAG,QAAwB,CAAC;YAC3C,CAAC;QACH,CAAC;QACD,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,aAAa,GAAG,IAAI,2BAAY,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;YACxE,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QACjC,CAAC;QAED,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IAEM,sBAAsB,CAAC,QAAgC;QAC5D,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;CACF;AA3CD,gCA2CC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nimport { type DocNode, DocNodeKind } from './DocNode';\r\nimport { DocParagraph } from './DocParagraph';\r\nimport {\r\n DocNodeContainer,\r\n type IDocNodeContainerParameters,\r\n type IDocNodeContainerParsedParameters\r\n} from './DocNodeContainer';\r\n\r\n/**\r\n * Constructor parameters for {@link DocSection}.\r\n */\r\nexport interface IDocSectionParameters extends IDocNodeContainerParameters {}\r\n\r\n/**\r\n * Constructor parameters for {@link DocSection}.\r\n */\r\nexport interface IDocSectionParsedParameters extends IDocNodeContainerParsedParameters {}\r\n\r\n/**\r\n * Represents a general block of rich text.\r\n */\r\nexport class DocSection extends DocNodeContainer {\r\n /**\r\n * Don't call this directly. Instead use {@link TSDocParser}\r\n * @internal\r\n */\r\n public constructor(\r\n parameters: IDocSectionParameters | IDocSectionParsedParameters,\r\n childNodes?: ReadonlyArray<DocNode>\r\n ) {\r\n super(parameters, childNodes);\r\n }\r\n\r\n /** @override */\r\n public get kind(): DocNodeKind | string {\r\n return DocNodeKind.Section;\r\n }\r\n\r\n /**\r\n * If the last item in DocSection.nodes is not a DocParagraph, a new paragraph\r\n * is started. Either way, the provided docNode will be appended to the paragraph.\r\n */\r\n public appendNodeInParagraph(docNode: DocNode): void {\r\n let paragraphNode: DocParagraph | undefined = undefined;\r\n\r\n if (this.nodes.length > 0) {\r\n const lastNode: DocNode = this.nodes[this.nodes.length - 1];\r\n if (lastNode.kind === DocNodeKind.Paragraph) {\r\n paragraphNode = lastNode as DocParagraph;\r\n }\r\n }\r\n if (!paragraphNode) {\r\n paragraphNode = new DocParagraph({ configuration: this.configuration });\r\n this.appendNode(paragraphNode);\r\n }\r\n\r\n paragraphNode.appendNode(docNode);\r\n }\r\n\r\n public appendNodesInParagraph(docNodes: ReadonlyArray<DocNode>): void {\r\n for (const docNode of docNodes) {\r\n this.appendNodeInParagraph(docNode);\r\n }\r\n }\r\n}\r\n"]}

View File

@@ -0,0 +1,50 @@
"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.DocSoftBreak = void 0;
const DocNode_1 = require("./DocNode");
const DocExcerpt_1 = require("./DocExcerpt");
/**
* Instructs a renderer to insert an explicit newline in the output.
* (Normally the renderer uses a formatting rule to determine where
* lines should wrap.)
*
* @remarks
* In HTML, a soft break is represented as an ASCII newline character (which does not
* affect the web browser's view), whereas the hard break is the `<br />` element
* (which starts a new line in the web browser's view).
*
* TSDoc follows the same conventions, except the renderer avoids emitting
* two empty lines (because that could start a new CommonMark paragraph).
*/
class DocSoftBreak extends DocNode_1.DocNode {
/**
* Don't call this directly. Instead use {@link TSDocParser}
* @internal
*/
constructor(parameters) {
super(parameters);
if (DocNode_1.DocNode.isParsedParameters(parameters)) {
// The type is IDocNodeParsedParameters, which is a base of IDocSoftBreakParsedParameters
// but not a base of IDocSoftBreakParameters. Therefore the type must be IDocSoftBreakParsedParameters.
// TypeScript 4 could infer this, but for some reason TypeScript 5 cannot.
const parsedParameters = parameters;
this._softBreakExcerpt = new DocExcerpt_1.DocExcerpt({
configuration: this.configuration,
excerptKind: DocExcerpt_1.ExcerptKind.SoftBreak,
content: parsedParameters.softBreakExcerpt
});
}
}
/** @override */
get kind() {
return DocNode_1.DocNodeKind.SoftBreak;
}
/** @override */
onGetChildNodes() {
return [this._softBreakExcerpt];
}
}
exports.DocSoftBreak = DocSoftBreak;
//# sourceMappingURL=DocSoftBreak.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"DocSoftBreak.js","sourceRoot":"","sources":["../../src/nodes/DocSoftBreak.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;AAE3D,uCAAyG;AAEzG,6CAAuD;AAcvD;;;;;;;;;;;;GAYG;AACH,MAAa,YAAa,SAAQ,iBAAO;IAGvC;;;OAGG;IACH,YAAmB,UAAmE;QACpF,KAAK,CAAC,UAAU,CAAC,CAAC;QAElB,IAAI,iBAAO,CAAC,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3C,yFAAyF;YACzF,uGAAuG;YACvG,0EAA0E;YAC1E,MAAM,gBAAgB,GAAkC,UAA2C,CAAC;YACpG,IAAI,CAAC,iBAAiB,GAAG,IAAI,uBAAU,CAAC;gBACtC,aAAa,EAAE,IAAI,CAAC,aAAa;gBACjC,WAAW,EAAE,wBAAW,CAAC,SAAS;gBAClC,OAAO,EAAE,gBAAgB,CAAC,gBAAgB;aAC3C,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,IAAW,IAAI;QACb,OAAO,qBAAW,CAAC,SAAS,CAAC;IAC/B,CAAC;IAED,gBAAgB;IACN,eAAe;QACvB,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAClC,CAAC;CACF;AAhCD,oCAgCC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nimport { DocNodeKind, type IDocNodeParameters, DocNode, type IDocNodeParsedParameters } from './DocNode';\r\nimport type { TokenSequence } from '../parser/TokenSequence';\r\nimport { DocExcerpt, ExcerptKind } from './DocExcerpt';\r\n\r\n/**\r\n * Constructor parameters for {@link DocSoftBreak}.\r\n */\r\nexport interface IDocSoftBreakParameters extends IDocNodeParameters {}\r\n\r\n/**\r\n * Constructor parameters for {@link DocSoftBreak}.\r\n */\r\nexport interface IDocSoftBreakParsedParameters extends IDocNodeParsedParameters {\r\n softBreakExcerpt: TokenSequence;\r\n}\r\n\r\n/**\r\n * Instructs a renderer to insert an explicit newline in the output.\r\n * (Normally the renderer uses a formatting rule to determine where\r\n * lines should wrap.)\r\n *\r\n * @remarks\r\n * In HTML, a soft break is represented as an ASCII newline character (which does not\r\n * affect the web browser's view), whereas the hard break is the `<br />` element\r\n * (which starts a new line in the web browser's view).\r\n *\r\n * TSDoc follows the same conventions, except the renderer avoids emitting\r\n * two empty lines (because that could start a new CommonMark paragraph).\r\n */\r\nexport class DocSoftBreak extends DocNode {\r\n private readonly _softBreakExcerpt: DocExcerpt | undefined;\r\n\r\n /**\r\n * Don't call this directly. Instead use {@link TSDocParser}\r\n * @internal\r\n */\r\n public constructor(parameters: IDocSoftBreakParameters | IDocSoftBreakParsedParameters) {\r\n super(parameters);\r\n\r\n if (DocNode.isParsedParameters(parameters)) {\r\n // The type is IDocNodeParsedParameters, which is a base of IDocSoftBreakParsedParameters\r\n // but not a base of IDocSoftBreakParameters. Therefore the type must be IDocSoftBreakParsedParameters.\r\n // TypeScript 4 could infer this, but for some reason TypeScript 5 cannot.\r\n const parsedParameters: IDocSoftBreakParsedParameters = parameters as IDocSoftBreakParsedParameters;\r\n this._softBreakExcerpt = new DocExcerpt({\r\n configuration: this.configuration,\r\n excerptKind: ExcerptKind.SoftBreak,\r\n content: parsedParameters.softBreakExcerpt\r\n });\r\n }\r\n }\r\n\r\n /** @override */\r\n public get kind(): DocNodeKind | string {\r\n return DocNodeKind.SoftBreak;\r\n }\r\n\r\n /** @override */\r\n protected onGetChildNodes(): ReadonlyArray<DocNode | undefined> {\r\n return [this._softBreakExcerpt];\r\n }\r\n}\r\n"]}

View File

@@ -0,0 +1,47 @@
"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", { value: true });
__exportStar(require("./DocBlock"), exports);
__exportStar(require("./DocBlockTag"), exports);
__exportStar(require("./DocCodeSpan"), exports);
__exportStar(require("./DocComment"), exports);
__exportStar(require("./DocDeclarationReference"), exports);
__exportStar(require("./DocErrorText"), exports);
__exportStar(require("./DocEscapedText"), exports);
__exportStar(require("./DocExcerpt"), exports);
__exportStar(require("./DocFencedCode"), exports);
__exportStar(require("./DocHtmlAttribute"), exports);
__exportStar(require("./DocHtmlEndTag"), exports);
__exportStar(require("./DocHtmlStartTag"), exports);
__exportStar(require("./DocInheritDocTag"), exports);
__exportStar(require("./DocInlineTag"), exports);
__exportStar(require("./DocInlineTagBase"), exports);
__exportStar(require("./DocLinkTag"), exports);
__exportStar(require("./DocMemberIdentifier"), exports);
__exportStar(require("./DocMemberReference"), exports);
__exportStar(require("./DocMemberSelector"), exports);
__exportStar(require("./DocMemberSymbol"), exports);
__exportStar(require("./DocNode"), exports);
__exportStar(require("./DocNodeContainer"), exports);
__exportStar(require("./DocParagraph"), exports);
__exportStar(require("./DocParamBlock"), exports);
__exportStar(require("./DocParamCollection"), exports);
__exportStar(require("./DocPlainText"), exports);
__exportStar(require("./DocSection"), exports);
__exportStar(require("./DocSoftBreak"), exports);
//# sourceMappingURL=index.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/nodes/index.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;;;;;;;;;;;;;;AAE3D,6CAA2B;AAC3B,gDAA8B;AAC9B,gDAA8B;AAC9B,+CAA6B;AAC7B,4DAA0C;AAC1C,iDAA+B;AAC/B,mDAAiC;AACjC,+CAA6B;AAC7B,kDAAgC;AAChC,qDAAmC;AACnC,kDAAgC;AAChC,oDAAkC;AAClC,qDAAmC;AACnC,iDAA+B;AAC/B,qDAAmC;AACnC,+CAA6B;AAC7B,wDAAsC;AACtC,uDAAqC;AACrC,sDAAoC;AACpC,oDAAkC;AAClC,4CAA0B;AAC1B,qDAAmC;AACnC,iDAA+B;AAC/B,kDAAgC;AAChC,uDAAqC;AACrC,iDAA+B;AAC/B,+CAA6B;AAC7B,iDAA+B","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nexport * from './DocBlock';\r\nexport * from './DocBlockTag';\r\nexport * from './DocCodeSpan';\r\nexport * from './DocComment';\r\nexport * from './DocDeclarationReference';\r\nexport * from './DocErrorText';\r\nexport * from './DocEscapedText';\r\nexport * from './DocExcerpt';\r\nexport * from './DocFencedCode';\r\nexport * from './DocHtmlAttribute';\r\nexport * from './DocHtmlEndTag';\r\nexport * from './DocHtmlStartTag';\r\nexport * from './DocInheritDocTag';\r\nexport * from './DocInlineTag';\r\nexport * from './DocInlineTagBase';\r\nexport * from './DocLinkTag';\r\nexport * from './DocMemberIdentifier';\r\nexport * from './DocMemberReference';\r\nexport * from './DocMemberSelector';\r\nexport * from './DocMemberSymbol';\r\nexport * from './DocNode';\r\nexport * from './DocNodeContainer';\r\nexport * from './DocParagraph';\r\nexport * from './DocParamBlock';\r\nexport * from './DocParamCollection';\r\nexport * from './DocPlainText';\r\nexport * from './DocSection';\r\nexport * from './DocSoftBreak';\r\n"]}