@microsoft/api-documenter 7.23.38 → 7.24.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"CustomMarkdownEmitter.d.ts","sourceRoot":"","sources":["../../src/markdown/CustomMarkdownEmitter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,KAAK,EAAE,QAAQ,EAAsC,OAAO,EAAE,MAAM,gCAAgC,CAAC;AAS5G,OAAO,EACL,eAAe,EACf,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAC7B,MAAM,mBAAmB,CAAC;AAG3B,MAAM,WAAW,6BAA8B,SAAQ,uBAAuB;IAC5E,cAAc,EAAE,OAAO,GAAG,SAAS,CAAC;IAEpC,uBAAuB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,GAAG,SAAS,CAAC;CACnE;AAED,qBAAa,qBAAsB,SAAQ,eAAe;IACxD,OAAO,CAAC,SAAS,CAAW;gBAET,QAAQ,EAAE,QAAQ;IAM9B,IAAI,CACT,aAAa,EAAE,aAAa,EAC5B,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,6BAA6B,GACrC,MAAM;IAIT,gBAAgB;IAChB,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,uBAAuB,EAAE,eAAe,EAAE,OAAO,GAAG,IAAI;IAgHvG,gBAAgB;IAChB,SAAS,CAAC,+BAA+B,CACvC,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,uBAAuB,CAAC,6BAA6B,CAAC,GAC9D,IAAI;CAoCR"}
1
+ {"version":3,"file":"CustomMarkdownEmitter.d.ts","sourceRoot":"","sources":["../../src/markdown/CustomMarkdownEmitter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,KAAK,EAAE,QAAQ,EAAsC,OAAO,EAAE,MAAM,gCAAgC,CAAC;AAS5G,OAAO,EACL,eAAe,EACf,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAC7B,MAAM,mBAAmB,CAAC;AAG3B,MAAM,WAAW,6BAA8B,SAAQ,uBAAuB;IAC5E,cAAc,EAAE,OAAO,GAAG,SAAS,CAAC;IAEpC,uBAAuB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,GAAG,SAAS,CAAC;CACnE;AAED,qBAAa,qBAAsB,SAAQ,eAAe;IACxD,OAAO,CAAC,SAAS,CAAW;gBAET,QAAQ,EAAE,QAAQ;IAM9B,IAAI,CACT,aAAa,EAAE,aAAa,EAC5B,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,6BAA6B,GACrC,MAAM;IAIT,gBAAgB;IAChB,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,uBAAuB,EAAE,eAAe,EAAE,OAAO,GAAG,IAAI;IAkHvG,gBAAgB;IAChB,SAAS,CAAC,+BAA+B,CACvC,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,uBAAuB,CAAC,6BAA6B,CAAC,GAC9D,IAAI;CAoCR"}
@@ -53,7 +53,6 @@ class CustomMarkdownEmitter extends MarkdownEmitter_1.MarkdownEmitter {
53
53
  // GitHub's markdown renderer chokes on tables that don't have a blank line above them,
54
54
  // whereas VS Code's renderer is totally fine with it.
55
55
  writer.ensureSkippedLine();
56
- context.insideTable = true;
57
56
  // Markdown table rows can have inconsistent cell counts. Size the table based on the longest row.
58
57
  let columnCount = 0;
59
58
  if (docTable.header) {
@@ -64,36 +63,42 @@ class CustomMarkdownEmitter extends MarkdownEmitter_1.MarkdownEmitter {
64
63
  columnCount = row.cells.length;
65
64
  }
66
65
  }
67
- // write the table header (which is required by Markdown)
68
- writer.write('| ');
69
- for (let i = 0; i < columnCount; ++i) {
70
- writer.write(' ');
71
- if (docTable.header) {
66
+ writer.write('<table>');
67
+ if (docTable.header) {
68
+ writer.write('<thead><tr>');
69
+ for (let i = 0; i < columnCount; ++i) {
70
+ writer.write('<th>');
71
+ writer.ensureNewLine();
72
+ writer.writeLine();
72
73
  const cell = docTable.header.cells[i];
73
74
  if (cell) {
74
75
  this.writeNode(cell.content, context, false);
75
76
  }
77
+ writer.ensureNewLine();
78
+ writer.writeLine();
79
+ writer.write('</th>');
76
80
  }
77
- writer.write(' |');
78
- }
79
- writer.writeLine();
80
- // write the divider
81
- writer.write('| ');
82
- for (let i = 0; i < columnCount; ++i) {
83
- writer.write(' --- |');
81
+ writer.write('</tr></thead>');
84
82
  }
85
83
  writer.writeLine();
84
+ writer.write('<tbody>');
86
85
  for (const row of docTable.rows) {
87
- writer.write('| ');
86
+ writer.write('<tr>');
88
87
  for (const cell of row.cells) {
89
- writer.write(' ');
88
+ writer.write('<td>');
89
+ writer.ensureNewLine();
90
+ writer.writeLine();
90
91
  this.writeNode(cell.content, context, false);
91
- writer.write(' |');
92
+ writer.ensureNewLine();
93
+ writer.writeLine();
94
+ writer.write('</td>');
92
95
  }
96
+ writer.write('</tr>');
93
97
  writer.writeLine();
94
98
  }
99
+ writer.write('</tbody>');
100
+ writer.write('</table>');
95
101
  writer.writeLine();
96
- context.insideTable = false;
97
102
  break;
98
103
  }
99
104
  case "EmphasisSpan" /* CustomDocNodeKind.EmphasisSpan */: {
@@ -1 +1 @@
1
- {"version":3,"file":"CustomMarkdownEmitter.js","sourceRoot":"","sources":["../../src/markdown/CustomMarkdownEmitter.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport type { DocNode, DocLinkTag, StringBuilder } from '@microsoft/tsdoc';\nimport type { ApiModel, IResolveDeclarationReferenceResult, ApiItem } from '@microsoft/api-extractor-model';\nimport { Colorize } from '@rushstack/terminal';\n\nimport { CustomDocNodeKind } from '../nodes/CustomDocNodeKind';\nimport type { DocHeading } from '../nodes/DocHeading';\nimport type { DocNoteBox } from '../nodes/DocNoteBox';\nimport type { DocTable } from '../nodes/DocTable';\nimport type { DocTableCell } from '../nodes/DocTableCell';\nimport type { DocEmphasisSpan } from '../nodes/DocEmphasisSpan';\nimport {\n MarkdownEmitter,\n type IMarkdownEmitterContext,\n type IMarkdownEmitterOptions\n} from './MarkdownEmitter';\nimport type { IndentedWriter } from '../utils/IndentedWriter';\n\nexport interface ICustomMarkdownEmitterOptions extends IMarkdownEmitterOptions {\n contextApiItem: ApiItem | undefined;\n\n onGetFilenameForApiItem: (apiItem: ApiItem) => string | undefined;\n}\n\nexport class CustomMarkdownEmitter extends MarkdownEmitter {\n private _apiModel: ApiModel;\n\n public constructor(apiModel: ApiModel) {\n super();\n\n this._apiModel = apiModel;\n }\n\n public emit(\n stringBuilder: StringBuilder,\n docNode: DocNode,\n options: ICustomMarkdownEmitterOptions\n ): string {\n return super.emit(stringBuilder, docNode, options);\n }\n\n /** @override */\n protected writeNode(docNode: DocNode, context: IMarkdownEmitterContext, docNodeSiblings: boolean): void {\n const writer: IndentedWriter = context.writer;\n\n switch (docNode.kind) {\n case CustomDocNodeKind.Heading: {\n const docHeading: DocHeading = docNode as DocHeading;\n writer.ensureSkippedLine();\n\n let prefix: string;\n switch (docHeading.level) {\n case 1:\n prefix = '##';\n break;\n case 2:\n prefix = '###';\n break;\n case 3:\n prefix = '###';\n break;\n default:\n prefix = '####';\n }\n\n writer.writeLine(prefix + ' ' + this.getEscapedText(docHeading.title));\n writer.writeLine();\n break;\n }\n case CustomDocNodeKind.NoteBox: {\n const docNoteBox: DocNoteBox = docNode as DocNoteBox;\n writer.ensureNewLine();\n\n writer.increaseIndent('> ');\n\n this.writeNode(docNoteBox.content, context, false);\n writer.ensureNewLine();\n\n writer.decreaseIndent();\n\n writer.writeLine();\n break;\n }\n case CustomDocNodeKind.Table: {\n const docTable: DocTable = docNode as DocTable;\n // GitHub's markdown renderer chokes on tables that don't have a blank line above them,\n // whereas VS Code's renderer is totally fine with it.\n writer.ensureSkippedLine();\n\n context.insideTable = true;\n\n // Markdown table rows can have inconsistent cell counts. Size the table based on the longest row.\n let columnCount: number = 0;\n if (docTable.header) {\n columnCount = docTable.header.cells.length;\n }\n for (const row of docTable.rows) {\n if (row.cells.length > columnCount) {\n columnCount = row.cells.length;\n }\n }\n\n // write the table header (which is required by Markdown)\n writer.write('| ');\n for (let i: number = 0; i < columnCount; ++i) {\n writer.write(' ');\n if (docTable.header) {\n const cell: DocTableCell | undefined = docTable.header.cells[i];\n if (cell) {\n this.writeNode(cell.content, context, false);\n }\n }\n writer.write(' |');\n }\n writer.writeLine();\n\n // write the divider\n writer.write('| ');\n for (let i: number = 0; i < columnCount; ++i) {\n writer.write(' --- |');\n }\n writer.writeLine();\n\n for (const row of docTable.rows) {\n writer.write('| ');\n for (const cell of row.cells) {\n writer.write(' ');\n this.writeNode(cell.content, context, false);\n writer.write(' |');\n }\n writer.writeLine();\n }\n writer.writeLine();\n\n context.insideTable = false;\n\n break;\n }\n case CustomDocNodeKind.EmphasisSpan: {\n const docEmphasisSpan: DocEmphasisSpan = docNode as DocEmphasisSpan;\n const oldBold: boolean = context.boldRequested;\n const oldItalic: boolean = context.italicRequested;\n context.boldRequested = docEmphasisSpan.bold;\n context.italicRequested = docEmphasisSpan.italic;\n this.writeNodes(docEmphasisSpan.nodes, context);\n context.boldRequested = oldBold;\n context.italicRequested = oldItalic;\n break;\n }\n default:\n super.writeNode(docNode, context, docNodeSiblings);\n }\n }\n\n /** @override */\n protected writeLinkTagWithCodeDestination(\n docLinkTag: DocLinkTag,\n context: IMarkdownEmitterContext<ICustomMarkdownEmitterOptions>\n ): void {\n const options: ICustomMarkdownEmitterOptions = context.options;\n\n const result: IResolveDeclarationReferenceResult = this._apiModel.resolveDeclarationReference(\n docLinkTag.codeDestination!,\n options.contextApiItem\n );\n\n if (result.resolvedApiItem) {\n const filename: string | undefined = options.onGetFilenameForApiItem(result.resolvedApiItem);\n\n if (filename) {\n let linkText: string = docLinkTag.linkText || '';\n if (linkText.length === 0) {\n // Generate a name such as Namespace1.Namespace2.MyClass.myMethod()\n linkText = result.resolvedApiItem.getScopedNameWithinPackage();\n }\n if (linkText.length > 0) {\n const encodedLinkText: string = this.getEscapedText(linkText.replace(/\\s+/g, ' '));\n\n context.writer.write('[');\n context.writer.write(encodedLinkText);\n context.writer.write(`](${filename!})`);\n } else {\n console.log(Colorize.yellow('WARNING: Unable to determine link text'));\n }\n }\n } else if (result.errorMessage) {\n console.log(\n Colorize.yellow(\n `WARNING: Unable to resolve reference \"${docLinkTag.codeDestination!.emitAsTsdoc()}\": ` +\n result.errorMessage\n )\n );\n }\n }\n}\n"]}
1
+ {"version":3,"file":"CustomMarkdownEmitter.js","sourceRoot":"","sources":["../../src/markdown/CustomMarkdownEmitter.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport type { DocNode, DocLinkTag, StringBuilder } from '@microsoft/tsdoc';\nimport type { ApiModel, IResolveDeclarationReferenceResult, ApiItem } from '@microsoft/api-extractor-model';\nimport { Colorize } from '@rushstack/terminal';\n\nimport { CustomDocNodeKind } from '../nodes/CustomDocNodeKind';\nimport type { DocHeading } from '../nodes/DocHeading';\nimport type { DocNoteBox } from '../nodes/DocNoteBox';\nimport type { DocTable } from '../nodes/DocTable';\nimport type { DocTableCell } from '../nodes/DocTableCell';\nimport type { DocEmphasisSpan } from '../nodes/DocEmphasisSpan';\nimport {\n MarkdownEmitter,\n type IMarkdownEmitterContext,\n type IMarkdownEmitterOptions\n} from './MarkdownEmitter';\nimport type { IndentedWriter } from '../utils/IndentedWriter';\n\nexport interface ICustomMarkdownEmitterOptions extends IMarkdownEmitterOptions {\n contextApiItem: ApiItem | undefined;\n\n onGetFilenameForApiItem: (apiItem: ApiItem) => string | undefined;\n}\n\nexport class CustomMarkdownEmitter extends MarkdownEmitter {\n private _apiModel: ApiModel;\n\n public constructor(apiModel: ApiModel) {\n super();\n\n this._apiModel = apiModel;\n }\n\n public emit(\n stringBuilder: StringBuilder,\n docNode: DocNode,\n options: ICustomMarkdownEmitterOptions\n ): string {\n return super.emit(stringBuilder, docNode, options);\n }\n\n /** @override */\n protected writeNode(docNode: DocNode, context: IMarkdownEmitterContext, docNodeSiblings: boolean): void {\n const writer: IndentedWriter = context.writer;\n\n switch (docNode.kind) {\n case CustomDocNodeKind.Heading: {\n const docHeading: DocHeading = docNode as DocHeading;\n writer.ensureSkippedLine();\n\n let prefix: string;\n switch (docHeading.level) {\n case 1:\n prefix = '##';\n break;\n case 2:\n prefix = '###';\n break;\n case 3:\n prefix = '###';\n break;\n default:\n prefix = '####';\n }\n\n writer.writeLine(prefix + ' ' + this.getEscapedText(docHeading.title));\n writer.writeLine();\n break;\n }\n case CustomDocNodeKind.NoteBox: {\n const docNoteBox: DocNoteBox = docNode as DocNoteBox;\n writer.ensureNewLine();\n\n writer.increaseIndent('> ');\n\n this.writeNode(docNoteBox.content, context, false);\n writer.ensureNewLine();\n\n writer.decreaseIndent();\n\n writer.writeLine();\n break;\n }\n case CustomDocNodeKind.Table: {\n const docTable: DocTable = docNode as DocTable;\n // GitHub's markdown renderer chokes on tables that don't have a blank line above them,\n // whereas VS Code's renderer is totally fine with it.\n writer.ensureSkippedLine();\n\n // Markdown table rows can have inconsistent cell counts. Size the table based on the longest row.\n let columnCount: number = 0;\n if (docTable.header) {\n columnCount = docTable.header.cells.length;\n }\n for (const row of docTable.rows) {\n if (row.cells.length > columnCount) {\n columnCount = row.cells.length;\n }\n }\n\n writer.write('<table>');\n if (docTable.header) {\n writer.write('<thead><tr>');\n for (let i: number = 0; i < columnCount; ++i) {\n writer.write('<th>');\n writer.ensureNewLine();\n writer.writeLine();\n const cell: DocTableCell | undefined = docTable.header.cells[i];\n if (cell) {\n this.writeNode(cell.content, context, false);\n }\n writer.ensureNewLine();\n writer.writeLine();\n writer.write('</th>');\n }\n writer.write('</tr></thead>');\n }\n writer.writeLine();\n\n writer.write('<tbody>');\n for (const row of docTable.rows) {\n writer.write('<tr>');\n for (const cell of row.cells) {\n writer.write('<td>');\n writer.ensureNewLine();\n writer.writeLine();\n this.writeNode(cell.content, context, false);\n writer.ensureNewLine();\n writer.writeLine();\n writer.write('</td>');\n }\n writer.write('</tr>');\n writer.writeLine();\n }\n writer.write('</tbody>');\n writer.write('</table>');\n writer.writeLine();\n\n break;\n }\n case CustomDocNodeKind.EmphasisSpan: {\n const docEmphasisSpan: DocEmphasisSpan = docNode as DocEmphasisSpan;\n const oldBold: boolean = context.boldRequested;\n const oldItalic: boolean = context.italicRequested;\n context.boldRequested = docEmphasisSpan.bold;\n context.italicRequested = docEmphasisSpan.italic;\n this.writeNodes(docEmphasisSpan.nodes, context);\n context.boldRequested = oldBold;\n context.italicRequested = oldItalic;\n break;\n }\n default:\n super.writeNode(docNode, context, docNodeSiblings);\n }\n }\n\n /** @override */\n protected writeLinkTagWithCodeDestination(\n docLinkTag: DocLinkTag,\n context: IMarkdownEmitterContext<ICustomMarkdownEmitterOptions>\n ): void {\n const options: ICustomMarkdownEmitterOptions = context.options;\n\n const result: IResolveDeclarationReferenceResult = this._apiModel.resolveDeclarationReference(\n docLinkTag.codeDestination!,\n options.contextApiItem\n );\n\n if (result.resolvedApiItem) {\n const filename: string | undefined = options.onGetFilenameForApiItem(result.resolvedApiItem);\n\n if (filename) {\n let linkText: string = docLinkTag.linkText || '';\n if (linkText.length === 0) {\n // Generate a name such as Namespace1.Namespace2.MyClass.myMethod()\n linkText = result.resolvedApiItem.getScopedNameWithinPackage();\n }\n if (linkText.length > 0) {\n const encodedLinkText: string = this.getEscapedText(linkText.replace(/\\s+/g, ' '));\n\n context.writer.write('[');\n context.writer.write(encodedLinkText);\n context.writer.write(`](${filename!})`);\n } else {\n console.log(Colorize.yellow('WARNING: Unable to determine link text'));\n }\n }\n } else if (result.errorMessage) {\n console.log(\n Colorize.yellow(\n `WARNING: Unable to resolve reference \"${docLinkTag.codeDestination!.emitAsTsdoc()}\": ` +\n result.errorMessage\n )\n );\n }\n }\n}\n"]}
@@ -4,7 +4,6 @@ export interface IMarkdownEmitterOptions {
4
4
  }
5
5
  export interface IMarkdownEmitterContext<TOptions = IMarkdownEmitterOptions> {
6
6
  writer: IndentedWriter;
7
- insideTable: boolean;
8
7
  boldRequested: boolean;
9
8
  italicRequested: boolean;
10
9
  writingBold: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"MarkdownEmitter.d.ts","sourceRoot":"","sources":["../../src/markdown/MarkdownEmitter.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,OAAO,EAEZ,KAAK,aAAa,EAKlB,KAAK,UAAU,EAQhB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzD,MAAM,WAAW,uBAAuB;CAAG;AAE3C,MAAM,WAAW,uBAAuB,CAAC,QAAQ,GAAG,uBAAuB;IACzE,MAAM,EAAE,cAAc,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IAErB,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,EAAE,OAAO,CAAC;IAEzB,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;IAEvB,OAAO,EAAE,QAAQ,CAAC;CACnB;AAED;;;GAGG;AACH,qBAAa,eAAe;IACnB,IAAI,CAAC,aAAa,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,uBAAuB,GAAG,MAAM;IAuBrG,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAW9C,SAAS,CAAC,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IASnD;;OAEG;IACH,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,uBAAuB,EAAE,eAAe,EAAE,OAAO,GAAG,IAAI;IAoHvG,eAAe;IACf,SAAS,CAAC,+BAA+B,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,uBAAuB,GAAG,IAAI;IAKzG,eAAe;IACf,SAAS,CAAC,8BAA8B,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,uBAAuB,GAAG,IAAI;IAWxG,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,uBAAuB,GAAG,IAAI;IA+C9E,SAAS,CAAC,UAAU,CAAC,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,uBAAuB,GAAG,IAAI;CAK/F"}
1
+ {"version":3,"file":"MarkdownEmitter.d.ts","sourceRoot":"","sources":["../../src/markdown/MarkdownEmitter.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,OAAO,EAEZ,KAAK,aAAa,EAKlB,KAAK,UAAU,EAQhB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzD,MAAM,WAAW,uBAAuB;CAAG;AAE3C,MAAM,WAAW,uBAAuB,CAAC,QAAQ,GAAG,uBAAuB;IACzE,MAAM,EAAE,cAAc,CAAC;IAEvB,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,EAAE,OAAO,CAAC;IAEzB,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;IAEvB,OAAO,EAAE,QAAQ,CAAC;CACnB;AAED;;;GAGG;AACH,qBAAa,eAAe;IACnB,IAAI,CAAC,aAAa,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,uBAAuB,GAAG,MAAM;IAsBrG,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAW9C,SAAS,CAAC,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IASnD;;OAEG;IACH,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,uBAAuB,EAAE,eAAe,EAAE,OAAO,GAAG,IAAI;IAwFvG,eAAe;IACf,SAAS,CAAC,+BAA+B,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,uBAAuB,GAAG,IAAI;IAKzG,eAAe;IACf,SAAS,CAAC,8BAA8B,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,uBAAuB,GAAG,IAAI;IAWxG,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,uBAAuB,GAAG,IAAI;IA+C9E,SAAS,CAAC,UAAU,CAAC,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,uBAAuB,GAAG,IAAI;CAK/F"}
@@ -15,7 +15,6 @@ class MarkdownEmitter {
15
15
  const writer = new IndentedWriter_1.IndentedWriter(stringBuilder);
16
16
  const context = {
17
17
  writer,
18
- insideTable: false,
19
18
  boldRequested: false,
20
19
  italicRequested: false,
21
20
  writingBold: false,
@@ -64,26 +63,9 @@ class MarkdownEmitter {
64
63
  }
65
64
  case tsdoc_1.DocNodeKind.CodeSpan: {
66
65
  const docCodeSpan = docNode;
67
- if (context.insideTable) {
68
- writer.write('<code>');
69
- }
70
- else {
71
- writer.write('`');
72
- }
73
- if (context.insideTable) {
74
- const code = this.getTableEscapedText(docCodeSpan.code);
75
- const parts = code.split(/\r?\n/g);
76
- writer.write(parts.join('</code><br/><code>'));
77
- }
78
- else {
79
- writer.write(docCodeSpan.code);
80
- }
81
- if (context.insideTable) {
82
- writer.write('</code>');
83
- }
84
- else {
85
- writer.write('`');
86
- }
66
+ writer.write('`');
67
+ writer.write(docCodeSpan.code);
68
+ writer.write('`');
87
69
  break;
88
70
  }
89
71
  case tsdoc_1.DocNodeKind.LinkTag: {
@@ -102,26 +84,9 @@ class MarkdownEmitter {
102
84
  case tsdoc_1.DocNodeKind.Paragraph: {
103
85
  const docParagraph = docNode;
104
86
  const trimmedParagraph = tsdoc_1.DocNodeTransforms.trimSpacesInParagraph(docParagraph);
105
- if (context.insideTable) {
106
- if (docNodeSiblings) {
107
- // This tentative write is necessary to avoid writing empty paragraph tags (i.e. `<p></p>`). At the
108
- // time this code runs, we do not know whether the `writeNodes` call below will actually write
109
- // anything. Thus, we want to only write a `<p>` tag (as well as eventually a corresponding
110
- // `</p>` tag) if something ends up being written within the tags.
111
- writer.writeTentative('<p>', '</p>', () => {
112
- this.writeNodes(trimmedParagraph.nodes, context);
113
- });
114
- }
115
- else {
116
- // Special case: If we are the only element inside this table cell, then we can omit the <p></p> container.
117
- this.writeNodes(trimmedParagraph.nodes, context);
118
- }
119
- }
120
- else {
121
- this.writeNodes(trimmedParagraph.nodes, context);
122
- writer.ensureNewLine();
123
- writer.writeLine();
124
- }
87
+ this.writeNodes(trimmedParagraph.nodes, context);
88
+ writer.ensureNewLine();
89
+ writer.writeLine();
125
90
  break;
126
91
  }
127
92
  case tsdoc_1.DocNodeKind.FencedCode: {
@@ -1 +1 @@
1
- {"version":3,"file":"MarkdownEmitter.js","sourceRoot":"","sources":["../../src/markdown/MarkdownEmitter.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport {\n type DocNode,\n DocNodeKind,\n type StringBuilder,\n type DocPlainText,\n type DocHtmlStartTag,\n type DocHtmlEndTag,\n type DocCodeSpan,\n type DocLinkTag,\n type DocParagraph,\n type DocFencedCode,\n type DocSection,\n DocNodeTransforms,\n type DocEscapedText,\n type DocErrorText,\n type DocBlockTag\n} from '@microsoft/tsdoc';\nimport { InternalError } from '@rushstack/node-core-library';\n\nimport { IndentedWriter } from '../utils/IndentedWriter';\n\nexport interface IMarkdownEmitterOptions {}\n\nexport interface IMarkdownEmitterContext<TOptions = IMarkdownEmitterOptions> {\n writer: IndentedWriter;\n insideTable: boolean;\n\n boldRequested: boolean;\n italicRequested: boolean;\n\n writingBold: boolean;\n writingItalic: boolean;\n\n options: TOptions;\n}\n\n/**\n * Renders MarkupElement content in the Markdown file format.\n * For more info: https://en.wikipedia.org/wiki/Markdown\n */\nexport class MarkdownEmitter {\n public emit(stringBuilder: StringBuilder, docNode: DocNode, options: IMarkdownEmitterOptions): string {\n const writer: IndentedWriter = new IndentedWriter(stringBuilder);\n\n const context: IMarkdownEmitterContext = {\n writer,\n insideTable: false,\n\n boldRequested: false,\n italicRequested: false,\n\n writingBold: false,\n writingItalic: false,\n\n options\n };\n\n this.writeNode(docNode, context, false);\n\n writer.ensureNewLine(); // finish the last line\n\n return writer.toString();\n }\n\n protected getEscapedText(text: string): string {\n const textWithBackslashes: string = text\n .replace(/\\\\/g, '\\\\\\\\') // first replace the escape character\n .replace(/[*#[\\]_|`~]/g, (x) => '\\\\' + x) // then escape any special characters\n .replace(/---/g, '\\\\-\\\\-\\\\-') // hyphens only if it's 3 or more\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;');\n return textWithBackslashes;\n }\n\n protected getTableEscapedText(text: string): string {\n return text\n .replace(/&/g, '&amp;')\n .replace(/\"/g, '&quot;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\\|/g, '&#124;');\n }\n\n /**\n * @virtual\n */\n protected writeNode(docNode: DocNode, context: IMarkdownEmitterContext, docNodeSiblings: boolean): void {\n const writer: IndentedWriter = context.writer;\n\n switch (docNode.kind) {\n case DocNodeKind.PlainText: {\n const docPlainText: DocPlainText = docNode as DocPlainText;\n this.writePlainText(docPlainText.text, context);\n break;\n }\n case DocNodeKind.HtmlStartTag:\n case DocNodeKind.HtmlEndTag: {\n const docHtmlTag: DocHtmlStartTag | DocHtmlEndTag = docNode as DocHtmlStartTag | DocHtmlEndTag;\n // write the HTML element verbatim into the output\n writer.write(docHtmlTag.emitAsHtml());\n break;\n }\n case DocNodeKind.CodeSpan: {\n const docCodeSpan: DocCodeSpan = docNode as DocCodeSpan;\n if (context.insideTable) {\n writer.write('<code>');\n } else {\n writer.write('`');\n }\n if (context.insideTable) {\n const code: string = this.getTableEscapedText(docCodeSpan.code);\n const parts: string[] = code.split(/\\r?\\n/g);\n writer.write(parts.join('</code><br/><code>'));\n } else {\n writer.write(docCodeSpan.code);\n }\n if (context.insideTable) {\n writer.write('</code>');\n } else {\n writer.write('`');\n }\n break;\n }\n case DocNodeKind.LinkTag: {\n const docLinkTag: DocLinkTag = docNode as DocLinkTag;\n if (docLinkTag.codeDestination) {\n this.writeLinkTagWithCodeDestination(docLinkTag, context);\n } else if (docLinkTag.urlDestination) {\n this.writeLinkTagWithUrlDestination(docLinkTag, context);\n } else if (docLinkTag.linkText) {\n this.writePlainText(docLinkTag.linkText, context);\n }\n break;\n }\n case DocNodeKind.Paragraph: {\n const docParagraph: DocParagraph = docNode as DocParagraph;\n const trimmedParagraph: DocParagraph = DocNodeTransforms.trimSpacesInParagraph(docParagraph);\n if (context.insideTable) {\n if (docNodeSiblings) {\n // This tentative write is necessary to avoid writing empty paragraph tags (i.e. `<p></p>`). At the\n // time this code runs, we do not know whether the `writeNodes` call below will actually write\n // anything. Thus, we want to only write a `<p>` tag (as well as eventually a corresponding\n // `</p>` tag) if something ends up being written within the tags.\n writer.writeTentative('<p>', '</p>', () => {\n this.writeNodes(trimmedParagraph.nodes, context);\n });\n } else {\n // Special case: If we are the only element inside this table cell, then we can omit the <p></p> container.\n this.writeNodes(trimmedParagraph.nodes, context);\n }\n } else {\n this.writeNodes(trimmedParagraph.nodes, context);\n writer.ensureNewLine();\n writer.writeLine();\n }\n break;\n }\n case DocNodeKind.FencedCode: {\n const docFencedCode: DocFencedCode = docNode as DocFencedCode;\n writer.ensureNewLine();\n writer.write('```');\n writer.write(docFencedCode.language);\n writer.writeLine();\n writer.write(docFencedCode.code);\n writer.ensureNewLine();\n writer.writeLine('```');\n break;\n }\n case DocNodeKind.Section: {\n const docSection: DocSection = docNode as DocSection;\n this.writeNodes(docSection.nodes, context);\n break;\n }\n case DocNodeKind.SoftBreak: {\n if (!/^\\s?$/.test(writer.peekLastCharacter())) {\n writer.write(' ');\n }\n break;\n }\n case DocNodeKind.EscapedText: {\n const docEscapedText: DocEscapedText = docNode as DocEscapedText;\n this.writePlainText(docEscapedText.decodedText, context);\n break;\n }\n case DocNodeKind.ErrorText: {\n const docErrorText: DocErrorText = docNode as DocErrorText;\n this.writePlainText(docErrorText.text, context);\n break;\n }\n case DocNodeKind.InlineTag: {\n break;\n }\n case DocNodeKind.BlockTag: {\n const tagNode: DocBlockTag = docNode as DocBlockTag;\n console.warn('Unsupported block tag: ' + tagNode.tagName);\n break;\n }\n default:\n throw new InternalError('Unsupported DocNodeKind kind: ' + docNode.kind);\n }\n }\n\n /** @virtual */\n protected writeLinkTagWithCodeDestination(docLinkTag: DocLinkTag, context: IMarkdownEmitterContext): void {\n // The subclass needs to implement this to support code destinations\n throw new InternalError('writeLinkTagWithCodeDestination()');\n }\n\n /** @virtual */\n protected writeLinkTagWithUrlDestination(docLinkTag: DocLinkTag, context: IMarkdownEmitterContext): void {\n const linkText: string =\n docLinkTag.linkText !== undefined ? docLinkTag.linkText : docLinkTag.urlDestination!;\n\n const encodedLinkText: string = this.getEscapedText(linkText.replace(/\\s+/g, ' '));\n\n context.writer.write('[');\n context.writer.write(encodedLinkText);\n context.writer.write(`](${docLinkTag.urlDestination!})`);\n }\n\n protected writePlainText(text: string, context: IMarkdownEmitterContext): void {\n const writer: IndentedWriter = context.writer;\n\n // split out the [ leading whitespace, content, trailing whitespace ]\n const parts: string[] = text.match(/^(\\s*)(.*?)(\\s*)$/) || [];\n\n writer.write(parts[1]); // write leading whitespace\n\n const middle: string = parts[2];\n\n if (middle !== '') {\n switch (writer.peekLastCharacter()) {\n case '':\n case '\\n':\n case ' ':\n case '[':\n case '>':\n // okay to put a symbol\n break;\n default:\n // This is no problem: \"**one** *two* **three**\"\n // But this is trouble: \"**one***two***three**\"\n // The most general solution: \"**one**<!-- -->*two*<!-- -->**three**\"\n writer.write('<!-- -->');\n break;\n }\n\n if (context.boldRequested) {\n writer.write('**');\n }\n if (context.italicRequested) {\n writer.write('_');\n }\n\n writer.write(this.getEscapedText(middle));\n\n if (context.italicRequested) {\n writer.write('_');\n }\n if (context.boldRequested) {\n writer.write('**');\n }\n }\n\n writer.write(parts[3]); // write trailing whitespace\n }\n\n protected writeNodes(docNodes: ReadonlyArray<DocNode>, context: IMarkdownEmitterContext): void {\n for (const docNode of docNodes) {\n this.writeNode(docNode, context, docNodes.length > 1);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"MarkdownEmitter.js","sourceRoot":"","sources":["../../src/markdown/MarkdownEmitter.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport {\n type DocNode,\n DocNodeKind,\n type StringBuilder,\n type DocPlainText,\n type DocHtmlStartTag,\n type DocHtmlEndTag,\n type DocCodeSpan,\n type DocLinkTag,\n type DocParagraph,\n type DocFencedCode,\n type DocSection,\n DocNodeTransforms,\n type DocEscapedText,\n type DocErrorText,\n type DocBlockTag\n} from '@microsoft/tsdoc';\nimport { InternalError } from '@rushstack/node-core-library';\n\nimport { IndentedWriter } from '../utils/IndentedWriter';\n\nexport interface IMarkdownEmitterOptions {}\n\nexport interface IMarkdownEmitterContext<TOptions = IMarkdownEmitterOptions> {\n writer: IndentedWriter;\n\n boldRequested: boolean;\n italicRequested: boolean;\n\n writingBold: boolean;\n writingItalic: boolean;\n\n options: TOptions;\n}\n\n/**\n * Renders MarkupElement content in the Markdown file format.\n * For more info: https://en.wikipedia.org/wiki/Markdown\n */\nexport class MarkdownEmitter {\n public emit(stringBuilder: StringBuilder, docNode: DocNode, options: IMarkdownEmitterOptions): string {\n const writer: IndentedWriter = new IndentedWriter(stringBuilder);\n\n const context: IMarkdownEmitterContext = {\n writer,\n\n boldRequested: false,\n italicRequested: false,\n\n writingBold: false,\n writingItalic: false,\n\n options\n };\n\n this.writeNode(docNode, context, false);\n\n writer.ensureNewLine(); // finish the last line\n\n return writer.toString();\n }\n\n protected getEscapedText(text: string): string {\n const textWithBackslashes: string = text\n .replace(/\\\\/g, '\\\\\\\\') // first replace the escape character\n .replace(/[*#[\\]_|`~]/g, (x) => '\\\\' + x) // then escape any special characters\n .replace(/---/g, '\\\\-\\\\-\\\\-') // hyphens only if it's 3 or more\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;');\n return textWithBackslashes;\n }\n\n protected getTableEscapedText(text: string): string {\n return text\n .replace(/&/g, '&amp;')\n .replace(/\"/g, '&quot;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\\|/g, '&#124;');\n }\n\n /**\n * @virtual\n */\n protected writeNode(docNode: DocNode, context: IMarkdownEmitterContext, docNodeSiblings: boolean): void {\n const writer: IndentedWriter = context.writer;\n\n switch (docNode.kind) {\n case DocNodeKind.PlainText: {\n const docPlainText: DocPlainText = docNode as DocPlainText;\n this.writePlainText(docPlainText.text, context);\n break;\n }\n case DocNodeKind.HtmlStartTag:\n case DocNodeKind.HtmlEndTag: {\n const docHtmlTag: DocHtmlStartTag | DocHtmlEndTag = docNode as DocHtmlStartTag | DocHtmlEndTag;\n // write the HTML element verbatim into the output\n writer.write(docHtmlTag.emitAsHtml());\n break;\n }\n case DocNodeKind.CodeSpan: {\n const docCodeSpan: DocCodeSpan = docNode as DocCodeSpan;\n writer.write('`');\n writer.write(docCodeSpan.code);\n writer.write('`');\n break;\n }\n case DocNodeKind.LinkTag: {\n const docLinkTag: DocLinkTag = docNode as DocLinkTag;\n if (docLinkTag.codeDestination) {\n this.writeLinkTagWithCodeDestination(docLinkTag, context);\n } else if (docLinkTag.urlDestination) {\n this.writeLinkTagWithUrlDestination(docLinkTag, context);\n } else if (docLinkTag.linkText) {\n this.writePlainText(docLinkTag.linkText, context);\n }\n break;\n }\n case DocNodeKind.Paragraph: {\n const docParagraph: DocParagraph = docNode as DocParagraph;\n const trimmedParagraph: DocParagraph = DocNodeTransforms.trimSpacesInParagraph(docParagraph);\n\n this.writeNodes(trimmedParagraph.nodes, context);\n writer.ensureNewLine();\n writer.writeLine();\n break;\n }\n case DocNodeKind.FencedCode: {\n const docFencedCode: DocFencedCode = docNode as DocFencedCode;\n writer.ensureNewLine();\n writer.write('```');\n writer.write(docFencedCode.language);\n writer.writeLine();\n writer.write(docFencedCode.code);\n writer.ensureNewLine();\n writer.writeLine('```');\n break;\n }\n case DocNodeKind.Section: {\n const docSection: DocSection = docNode as DocSection;\n this.writeNodes(docSection.nodes, context);\n break;\n }\n case DocNodeKind.SoftBreak: {\n if (!/^\\s?$/.test(writer.peekLastCharacter())) {\n writer.write(' ');\n }\n break;\n }\n case DocNodeKind.EscapedText: {\n const docEscapedText: DocEscapedText = docNode as DocEscapedText;\n this.writePlainText(docEscapedText.decodedText, context);\n break;\n }\n case DocNodeKind.ErrorText: {\n const docErrorText: DocErrorText = docNode as DocErrorText;\n this.writePlainText(docErrorText.text, context);\n break;\n }\n case DocNodeKind.InlineTag: {\n break;\n }\n case DocNodeKind.BlockTag: {\n const tagNode: DocBlockTag = docNode as DocBlockTag;\n console.warn('Unsupported block tag: ' + tagNode.tagName);\n break;\n }\n default:\n throw new InternalError('Unsupported DocNodeKind kind: ' + docNode.kind);\n }\n }\n\n /** @virtual */\n protected writeLinkTagWithCodeDestination(docLinkTag: DocLinkTag, context: IMarkdownEmitterContext): void {\n // The subclass needs to implement this to support code destinations\n throw new InternalError('writeLinkTagWithCodeDestination()');\n }\n\n /** @virtual */\n protected writeLinkTagWithUrlDestination(docLinkTag: DocLinkTag, context: IMarkdownEmitterContext): void {\n const linkText: string =\n docLinkTag.linkText !== undefined ? docLinkTag.linkText : docLinkTag.urlDestination!;\n\n const encodedLinkText: string = this.getEscapedText(linkText.replace(/\\s+/g, ' '));\n\n context.writer.write('[');\n context.writer.write(encodedLinkText);\n context.writer.write(`](${docLinkTag.urlDestination!})`);\n }\n\n protected writePlainText(text: string, context: IMarkdownEmitterContext): void {\n const writer: IndentedWriter = context.writer;\n\n // split out the [ leading whitespace, content, trailing whitespace ]\n const parts: string[] = text.match(/^(\\s*)(.*?)(\\s*)$/) || [];\n\n writer.write(parts[1]); // write leading whitespace\n\n const middle: string = parts[2];\n\n if (middle !== '') {\n switch (writer.peekLastCharacter()) {\n case '':\n case '\\n':\n case ' ':\n case '[':\n case '>':\n // okay to put a symbol\n break;\n default:\n // This is no problem: \"**one** *two* **three**\"\n // But this is trouble: \"**one***two***three**\"\n // The most general solution: \"**one**<!-- -->*two*<!-- -->**three**\"\n writer.write('<!-- -->');\n break;\n }\n\n if (context.boldRequested) {\n writer.write('**');\n }\n if (context.italicRequested) {\n writer.write('_');\n }\n\n writer.write(this.getEscapedText(middle));\n\n if (context.italicRequested) {\n writer.write('_');\n }\n if (context.boldRequested) {\n writer.write('**');\n }\n }\n\n writer.write(parts[3]); // write trailing whitespace\n }\n\n protected writeNodes(docNodes: ReadonlyArray<DocNode>, context: IMarkdownEmitterContext): void {\n for (const docNode of docNodes) {\n this.writeNode(docNode, context, docNodes.length > 1);\n }\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@microsoft/api-documenter",
3
- "version": "7.23.38",
3
+ "version": "7.24.1",
4
4
  "description": "Read JSON files from api-extractor, generate documentation pages",
5
5
  "repository": {
6
6
  "type": "git",
@@ -26,8 +26,8 @@
26
26
  "devDependencies": {
27
27
  "@types/js-yaml": "3.12.1",
28
28
  "@types/resolve": "1.20.2",
29
- "local-node-rig": "1.0.0",
30
- "@rushstack/heft": "0.66.1"
29
+ "@rushstack/heft": "0.66.2",
30
+ "local-node-rig": "1.0.0"
31
31
  },
32
32
  "scripts": {
33
33
  "build": "heft build --clean",