monaco-editor-core 0.56.0-dev-20251124 → 0.56.0-dev-20251217

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.
Files changed (337) hide show
  1. package/esm/nls.keys.json +1 -1
  2. package/esm/nls.messages.cs.js +2 -2
  3. package/esm/nls.messages.de.js +2 -2
  4. package/esm/nls.messages.es.js +2 -2
  5. package/esm/nls.messages.fr.js +2 -2
  6. package/esm/nls.messages.it.js +2 -2
  7. package/esm/nls.messages.ja.js +2 -2
  8. package/esm/nls.messages.js +1 -1
  9. package/esm/nls.messages.json +1 -1
  10. package/esm/nls.messages.ko.js +2 -2
  11. package/esm/nls.messages.pl.js +2 -2
  12. package/esm/nls.messages.pt-br.js +2 -2
  13. package/esm/nls.messages.ru.js +2 -2
  14. package/esm/nls.messages.tr.js +2 -2
  15. package/esm/nls.messages.zh-cn.js +2 -2
  16. package/esm/nls.messages.zh-tw.js +2 -2
  17. package/esm/nls.metadata.json +34 -2
  18. package/esm/vs/base/browser/dom.js +1 -4
  19. package/esm/vs/base/browser/dom.js.map +1 -1
  20. package/esm/vs/base/browser/markdownRenderer.js +25 -11
  21. package/esm/vs/base/browser/markdownRenderer.js.map +1 -1
  22. package/esm/vs/base/browser/ui/button/button.js +15 -8
  23. package/esm/vs/base/browser/ui/button/button.js.map +1 -1
  24. package/esm/vs/base/browser/ui/codicons/codicon/codicon-modifiers.css +3 -8
  25. package/esm/vs/base/browser/ui/codicons/codicon/codicon.ttf +0 -0
  26. package/esm/vs/base/browser/ui/list/list.css +1 -0
  27. package/esm/vs/base/browser/ui/toolbar/toolbar.js +3 -0
  28. package/esm/vs/base/browser/ui/toolbar/toolbar.js.map +1 -1
  29. package/esm/vs/base/common/async.js +11 -0
  30. package/esm/vs/base/common/async.js.map +1 -1
  31. package/esm/vs/base/common/codiconsLibrary.js +11 -2
  32. package/esm/vs/base/common/codiconsLibrary.js.map +1 -1
  33. package/esm/vs/base/common/defaultAccount.js +6 -0
  34. package/esm/vs/base/common/defaultAccount.js.map +1 -0
  35. package/esm/vs/base/common/equals.js +73 -24
  36. package/esm/vs/base/common/equals.js.map +1 -1
  37. package/esm/vs/base/common/event.js +14 -4
  38. package/esm/vs/base/common/event.js.map +1 -1
  39. package/esm/vs/base/common/iterator.js.map +1 -1
  40. package/esm/vs/base/common/keybindings.js +0 -8
  41. package/esm/vs/base/common/keybindings.js.map +1 -1
  42. package/esm/vs/base/common/lifecycle.js +2 -2
  43. package/esm/vs/base/common/lifecycle.js.map +1 -1
  44. package/esm/vs/base/common/marshallingIds.js.map +1 -1
  45. package/esm/vs/base/common/observableInternal/index.js +1 -1
  46. package/esm/vs/base/common/observableInternal/index.js.map +1 -1
  47. package/esm/vs/base/common/observableInternal/observables/observableFromEvent.js +1 -1
  48. package/esm/vs/base/common/observableInternal/observables/observableFromEvent.js.map +1 -1
  49. package/esm/vs/base/common/observableInternal/reactions/autorunImpl.js +16 -0
  50. package/esm/vs/base/common/observableInternal/reactions/autorunImpl.js.map +1 -1
  51. package/esm/vs/base/common/observableInternal/utils/utils.js +11 -0
  52. package/esm/vs/base/common/observableInternal/utils/utils.js.map +1 -1
  53. package/esm/vs/base/common/product.js.map +1 -1
  54. package/esm/vs/base/common/strings.js +3 -1
  55. package/esm/vs/base/common/strings.js.map +1 -1
  56. package/esm/vs/editor/browser/controller/dragScrolling.js +2 -1
  57. package/esm/vs/editor/browser/controller/dragScrolling.js.map +1 -1
  58. package/esm/vs/editor/browser/controller/editContext/clipboardUtils.js +73 -2
  59. package/esm/vs/editor/browser/controller/editContext/clipboardUtils.js.map +1 -1
  60. package/esm/vs/editor/browser/controller/editContext/native/nativeEditContext.js +7 -51
  61. package/esm/vs/editor/browser/controller/editContext/native/nativeEditContext.js.map +1 -1
  62. package/esm/vs/editor/browser/controller/editContext/screenReaderUtils.js.map +1 -1
  63. package/esm/vs/editor/browser/controller/editContext/textArea/textAreaEditContext.js +7 -20
  64. package/esm/vs/editor/browser/controller/editContext/textArea/textAreaEditContext.js.map +1 -1
  65. package/esm/vs/editor/browser/controller/editContext/textArea/textAreaEditContextInput.js +14 -44
  66. package/esm/vs/editor/browser/controller/editContext/textArea/textAreaEditContextInput.js.map +1 -1
  67. package/esm/vs/editor/browser/controller/editContext/textArea/textAreaEditContextRegistry.js +19 -0
  68. package/esm/vs/editor/browser/controller/editContext/textArea/textAreaEditContextRegistry.js.map +1 -0
  69. package/esm/vs/editor/browser/controller/editContext/textArea/textAreaEditContextState.js +14 -1
  70. package/esm/vs/editor/browser/controller/editContext/textArea/textAreaEditContextState.js.map +1 -1
  71. package/esm/vs/editor/browser/controller/mouseHandler.js +5 -2
  72. package/esm/vs/editor/browser/controller/mouseHandler.js.map +1 -1
  73. package/esm/vs/editor/browser/editorBrowser.js.map +1 -1
  74. package/esm/vs/editor/browser/observableCodeEditor.js +32 -15
  75. package/esm/vs/editor/browser/observableCodeEditor.js.map +1 -1
  76. package/esm/vs/editor/browser/view.js +11 -2
  77. package/esm/vs/editor/browser/view.js.map +1 -1
  78. package/esm/vs/editor/browser/viewParts/contentWidgets/contentWidgets.js +5 -2
  79. package/esm/vs/editor/browser/viewParts/contentWidgets/contentWidgets.js.map +1 -1
  80. package/esm/vs/editor/browser/widget/codeEditor/codeEditorWidget.js +10 -0
  81. package/esm/vs/editor/browser/widget/codeEditor/codeEditorWidget.js.map +1 -1
  82. package/esm/vs/editor/browser/widget/multiDiffEditor/multiDiffEditorWidgetImpl.js.map +1 -1
  83. package/esm/vs/editor/browser/widget/multiDiffEditor/style.css +48 -0
  84. package/esm/vs/editor/common/config/fontInfo.js +1 -1
  85. package/esm/vs/editor/common/config/fontInfo.js.map +1 -1
  86. package/esm/vs/editor/common/core/edits/edit.js +19 -0
  87. package/esm/vs/editor/common/core/edits/edit.js.map +1 -1
  88. package/esm/vs/editor/common/core/edits/stringEdit.js +13 -0
  89. package/esm/vs/editor/common/core/edits/stringEdit.js.map +1 -1
  90. package/esm/vs/editor/common/core/edits/textEdit.js.map +1 -1
  91. package/esm/vs/editor/common/core/text/positionToOffsetImpl.js +24 -10
  92. package/esm/vs/editor/common/core/text/positionToOffsetImpl.js.map +1 -1
  93. package/esm/vs/editor/common/cursor/cursorMoveCommands.js +4 -4
  94. package/esm/vs/editor/common/cursor/cursorMoveCommands.js.map +1 -1
  95. package/esm/vs/editor/common/cursor/cursorWordOperations.js +6 -3
  96. package/esm/vs/editor/common/cursor/cursorWordOperations.js.map +1 -1
  97. package/esm/vs/editor/common/languages/defaultDocumentColorsComputer.js +2 -2
  98. package/esm/vs/editor/common/languages/defaultDocumentColorsComputer.js.map +1 -1
  99. package/esm/vs/editor/common/languages/nullTokenize.js +1 -1
  100. package/esm/vs/editor/common/languages/nullTokenize.js.map +1 -1
  101. package/esm/vs/editor/common/languages/supports/tokenization.js +3 -0
  102. package/esm/vs/editor/common/languages/supports/tokenization.js.map +1 -1
  103. package/esm/vs/editor/common/languages.js +2 -1
  104. package/esm/vs/editor/common/languages.js.map +1 -1
  105. package/esm/vs/editor/common/model/decorationProvider.js +21 -1
  106. package/esm/vs/editor/common/model/decorationProvider.js.map +1 -1
  107. package/esm/vs/editor/common/model/textModel.js +49 -30
  108. package/esm/vs/editor/common/model/textModel.js.map +1 -1
  109. package/esm/vs/editor/common/model/tokens/abstractSyntaxTokenBackend.js +6 -3
  110. package/esm/vs/editor/common/model/tokens/abstractSyntaxTokenBackend.js.map +1 -1
  111. package/esm/vs/editor/common/model/tokens/annotations.js +177 -0
  112. package/esm/vs/editor/common/model/tokens/annotations.js.map +1 -0
  113. package/esm/vs/editor/common/model/tokens/tokenizationFontDecorationsProvider.js +131 -0
  114. package/esm/vs/editor/common/model/tokens/tokenizationFontDecorationsProvider.js.map +1 -0
  115. package/esm/vs/editor/common/model/tokens/tokenizationTextModelPart.js +9 -0
  116. package/esm/vs/editor/common/model/tokens/tokenizationTextModelPart.js.map +1 -1
  117. package/esm/vs/editor/common/model/tokens/tokenizerSyntaxTokenBackend.js +9 -0
  118. package/esm/vs/editor/common/model/tokens/tokenizerSyntaxTokenBackend.js.map +1 -1
  119. package/esm/vs/editor/common/textModelEditSource.js +2 -0
  120. package/esm/vs/editor/common/textModelEditSource.js.map +1 -1
  121. package/esm/vs/editor/common/textModelEvents.js.map +1 -1
  122. package/esm/vs/editor/common/viewLayout/lineDecorations.js.map +1 -1
  123. package/esm/vs/editor/common/viewLayout/viewLineRenderer.js +1 -1
  124. package/esm/vs/editor/common/viewLayout/viewLineRenderer.js.map +1 -1
  125. package/esm/vs/editor/contrib/clipboard/browser/clipboard.js +54 -36
  126. package/esm/vs/editor/contrib/clipboard/browser/clipboard.js.map +1 -1
  127. package/esm/vs/editor/contrib/dropOrPasteInto/browser/copyPasteController.js +14 -1
  128. package/esm/vs/editor/contrib/dropOrPasteInto/browser/copyPasteController.js.map +1 -1
  129. package/esm/vs/editor/contrib/floatingMenu/browser/floatingMenu.css +1 -1
  130. package/esm/vs/editor/contrib/hover/browser/hover.css +1 -1
  131. package/esm/vs/editor/contrib/hover/browser/markdownHoverParticipant.js +1 -1
  132. package/esm/vs/editor/contrib/hover/browser/markdownHoverParticipant.js.map +1 -1
  133. package/esm/vs/editor/contrib/inPlaceReplace/browser/inPlaceReplace.js +2 -2
  134. package/esm/vs/editor/contrib/inlayHints/browser/inlayHintsController.js +1 -0
  135. package/esm/vs/editor/contrib/inlayHints/browser/inlayHintsController.js.map +1 -1
  136. package/esm/vs/editor/contrib/inlineCompletions/browser/controller/commandIds.js +2 -0
  137. package/esm/vs/editor/contrib/inlineCompletions/browser/controller/commandIds.js.map +1 -1
  138. package/esm/vs/editor/contrib/inlineCompletions/browser/controller/commands.js +33 -4
  139. package/esm/vs/editor/contrib/inlineCompletions/browser/controller/commands.js.map +1 -1
  140. package/esm/vs/editor/contrib/inlineCompletions/browser/controller/inlineCompletionContextKeys.js +13 -12
  141. package/esm/vs/editor/contrib/inlineCompletions/browser/controller/inlineCompletionContextKeys.js.map +1 -1
  142. package/esm/vs/editor/contrib/inlineCompletions/browser/controller/inlineCompletionsController.js +7 -1
  143. package/esm/vs/editor/contrib/inlineCompletions/browser/controller/inlineCompletionsController.js.map +1 -1
  144. package/esm/vs/editor/contrib/inlineCompletions/browser/hintsWidget/hoverParticipant.js +2 -2
  145. package/esm/vs/editor/contrib/inlineCompletions/browser/hintsWidget/inlineCompletionsHintsWidget.js +5 -5
  146. package/esm/vs/editor/contrib/inlineCompletions/browser/inlineCompletions.contribution.js +2 -1
  147. package/esm/vs/editor/contrib/inlineCompletions/browser/inlineCompletions.contribution.js.map +1 -1
  148. package/esm/vs/editor/contrib/inlineCompletions/browser/model/InlineSuggestAlternativeAction.js +8 -0
  149. package/esm/vs/editor/contrib/inlineCompletions/browser/model/InlineSuggestAlternativeAction.js.map +1 -0
  150. package/esm/vs/editor/contrib/inlineCompletions/browser/model/editKind.js +198 -0
  151. package/esm/vs/editor/contrib/inlineCompletions/browser/model/editKind.js.map +1 -0
  152. package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionIsVisible.js +40 -0
  153. package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionIsVisible.js.map +1 -0
  154. package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionsModel.js +128 -65
  155. package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionsModel.js.map +1 -1
  156. package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionsSource.js +69 -13
  157. package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionsSource.js.map +1 -1
  158. package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineSuggestionItem.js +159 -94
  159. package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineSuggestionItem.js.map +1 -1
  160. package/esm/vs/editor/contrib/inlineCompletions/browser/model/provideInlineCompletions.js +124 -50
  161. package/esm/vs/editor/contrib/inlineCompletions/browser/model/provideInlineCompletions.js.map +1 -1
  162. package/esm/vs/editor/contrib/inlineCompletions/browser/model/renameSymbolProcessor.js +393 -0
  163. package/esm/vs/editor/contrib/inlineCompletions/browser/model/renameSymbolProcessor.js.map +1 -0
  164. package/esm/vs/editor/contrib/inlineCompletions/browser/telemetry.js.map +1 -1
  165. package/esm/vs/editor/contrib/inlineCompletions/browser/utils.js +20 -0
  166. package/esm/vs/editor/contrib/inlineCompletions/browser/utils.js.map +1 -1
  167. package/esm/vs/editor/contrib/inlineCompletions/browser/view/ghostText/ghostTextView.js +59 -42
  168. package/esm/vs/editor/contrib/inlineCompletions/browser/view/ghostText/ghostTextView.js.map +1 -1
  169. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/components/gutterIndicatorMenu.js +29 -8
  170. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/components/gutterIndicatorMenu.js.map +1 -1
  171. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/components/gutterIndicatorView.js +78 -46
  172. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/components/gutterIndicatorView.js.map +1 -1
  173. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditWithChanges.js +9 -4
  174. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditWithChanges.js.map +1 -1
  175. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsModel.js +11 -4
  176. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsModel.js.map +1 -1
  177. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsView.js +81 -41
  178. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsView.js.map +1 -1
  179. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViewInterface.js +48 -0
  180. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViewInterface.js.map +1 -1
  181. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViewProducer.js +18 -15
  182. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViewProducer.js.map +1 -1
  183. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsCollapsedView.js +3 -4
  184. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsCollapsedView.js.map +1 -1
  185. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsCustomView.js +6 -7
  186. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsCustomView.js.map +1 -1
  187. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsDeletionView.js +4 -5
  188. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsDeletionView.js.map +1 -1
  189. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsInsertionView.js +4 -3
  190. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsInsertionView.js.map +1 -1
  191. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsLineReplacementView.js +8 -8
  192. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsLineReplacementView.js.map +1 -1
  193. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsSideBySideView.js +9 -7
  194. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsSideBySideView.js.map +1 -1
  195. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsWordReplacementView.js +203 -41
  196. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsWordReplacementView.js.map +1 -1
  197. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/jumpToView.js +189 -0
  198. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/jumpToView.js.map +1 -0
  199. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/longDistanceHint/inlineEditsLongDistanceHint.js +85 -102
  200. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/longDistanceHint/inlineEditsLongDistanceHint.js.map +1 -1
  201. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/longDistanceHint/longDistancePreviewEditor.js +75 -32
  202. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/longDistanceHint/longDistancePreviewEditor.js.map +1 -1
  203. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/longDistanceHint/longDistnaceWidgetPlacement.js +121 -0
  204. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/longDistanceHint/longDistnaceWidgetPlacement.js.map +1 -0
  205. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/originalEditorInlineDiffView.js +2 -1
  206. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/originalEditorInlineDiffView.js.map +1 -1
  207. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/theme.js +22 -20
  208. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/theme.js.map +1 -1
  209. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/utils/utils.js +15 -5
  210. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/utils/utils.js.map +1 -1
  211. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/view.css +39 -6
  212. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineSuggestionsView.js +10 -5
  213. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineSuggestionsView.js.map +1 -1
  214. package/esm/vs/editor/contrib/insertFinalNewLine/browser/insertFinalNewLine.js +1 -1
  215. package/esm/vs/editor/contrib/lineSelection/browser/lineSelection.js +1 -1
  216. package/esm/vs/editor/contrib/linesOperations/browser/linesOperations.js +32 -32
  217. package/esm/vs/editor/contrib/linesOperations/browser/linesOperations.js.map +1 -1
  218. package/esm/vs/editor/contrib/linkedEditing/browser/linkedEditing.js +2 -2
  219. package/esm/vs/editor/contrib/links/browser/links.js +10 -10
  220. package/esm/vs/editor/contrib/message/browser/messageController.js +1 -1
  221. package/esm/vs/editor/contrib/multicursor/browser/multicursor.js +22 -22
  222. package/esm/vs/editor/contrib/parameterHints/browser/parameterHints.js +1 -1
  223. package/esm/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.js +4 -4
  224. package/esm/vs/editor/contrib/peekView/browser/peekView.js +18 -18
  225. package/esm/vs/editor/contrib/placeholderText/browser/placeholderText.contribution.js +1 -1
  226. package/esm/vs/editor/contrib/quickAccess/browser/gotoLineQuickAccess.js +11 -11
  227. package/esm/vs/editor/contrib/quickAccess/browser/gotoSymbolQuickAccess.js +32 -32
  228. package/esm/vs/editor/contrib/readOnlyMessage/browser/contribution.js +2 -2
  229. package/esm/vs/editor/contrib/rename/browser/rename.js +19 -11
  230. package/esm/vs/editor/contrib/rename/browser/rename.js.map +1 -1
  231. package/esm/vs/editor/contrib/rename/browser/renameWidget.js +7 -7
  232. package/esm/vs/editor/contrib/sectionHeaders/browser/sectionHeaders.js +3 -2
  233. package/esm/vs/editor/contrib/sectionHeaders/browser/sectionHeaders.js.map +1 -1
  234. package/esm/vs/editor/contrib/smartSelect/browser/smartSelect.js +4 -4
  235. package/esm/vs/editor/contrib/snippet/browser/snippetController2.js +4 -4
  236. package/esm/vs/editor/contrib/snippet/browser/snippetParser.js +33 -0
  237. package/esm/vs/editor/contrib/snippet/browser/snippetParser.js.map +1 -1
  238. package/esm/vs/editor/contrib/snippet/browser/snippetVariables.js +4 -4
  239. package/esm/vs/editor/contrib/stickyScroll/browser/stickyScrollActions.js +11 -11
  240. package/esm/vs/editor/contrib/stickyScroll/browser/stickyScrollController.js +12 -4
  241. package/esm/vs/editor/contrib/stickyScroll/browser/stickyScrollController.js.map +1 -1
  242. package/esm/vs/editor/contrib/stickyScroll/browser/stickyScrollWidget.js +1 -0
  243. package/esm/vs/editor/contrib/stickyScroll/browser/stickyScrollWidget.js.map +1 -1
  244. package/esm/vs/editor/contrib/suggest/browser/suggest.js +9 -8
  245. package/esm/vs/editor/contrib/suggest/browser/suggest.js.map +1 -1
  246. package/esm/vs/editor/contrib/suggest/browser/suggestController.js +39 -28
  247. package/esm/vs/editor/contrib/suggest/browser/suggestController.js.map +1 -1
  248. package/esm/vs/editor/contrib/suggest/browser/suggestInlineCompletions.js +1 -0
  249. package/esm/vs/editor/contrib/suggest/browser/suggestInlineCompletions.js.map +1 -1
  250. package/esm/vs/editor/contrib/suggest/browser/suggestWidget.js +22 -18
  251. package/esm/vs/editor/contrib/suggest/browser/suggestWidget.js.map +1 -1
  252. package/esm/vs/editor/contrib/suggest/browser/suggestWidgetDetails.js +28 -6
  253. package/esm/vs/editor/contrib/suggest/browser/suggestWidgetDetails.js.map +1 -1
  254. package/esm/vs/editor/contrib/suggest/browser/suggestWidgetRenderer.js +2 -2
  255. package/esm/vs/editor/contrib/suggest/browser/wordContextKey.js +1 -1
  256. package/esm/vs/editor/contrib/symbolIcons/browser/symbolIcons.js +33 -33
  257. package/esm/vs/editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode.js +4 -4
  258. package/esm/vs/editor/contrib/tokenization/browser/tokenization.js +1 -1
  259. package/esm/vs/editor/contrib/unicodeHighlighter/browser/bannerController.js +1 -1
  260. package/esm/vs/editor/contrib/unicodeHighlighter/browser/unicodeHighlighter.js +24 -24
  261. package/esm/vs/editor/contrib/unusualLineTerminators/browser/unusualLineTerminators.js +5 -5
  262. package/esm/vs/editor/contrib/wordHighlighter/browser/highlightDecorations.js +9 -9
  263. package/esm/vs/editor/contrib/wordHighlighter/browser/wordHighlighter.js +3 -3
  264. package/esm/vs/editor/contrib/wordOperations/browser/wordOperations.js +19 -2
  265. package/esm/vs/editor/contrib/wordOperations/browser/wordOperations.js.map +1 -1
  266. package/esm/vs/editor/editor.api.d.ts +37 -2
  267. package/esm/vs/editor/standalone/browser/standaloneLanguages.js +2 -2
  268. package/esm/vs/editor/standalone/browser/standaloneLanguages.js.map +1 -1
  269. package/esm/vs/editor/standalone/browser/standaloneServices.js +11 -1
  270. package/esm/vs/editor/standalone/browser/standaloneServices.js.map +1 -1
  271. package/esm/vs/editor/standalone/common/monarch/monarchLexer.js +1 -1
  272. package/esm/vs/editor/standalone/common/monarch/monarchLexer.js.map +1 -1
  273. package/esm/vs/platform/accessibilitySignal/browser/accessibilitySignalService.js +62 -62
  274. package/esm/vs/platform/action/common/actionCommonCategories.js +6 -6
  275. package/esm/vs/platform/actionWidget/browser/actionList.js +4 -4
  276. package/esm/vs/platform/actionWidget/browser/actionWidget.css +11 -8
  277. package/esm/vs/platform/actionWidget/browser/actionWidget.js +7 -7
  278. package/esm/vs/platform/actions/browser/menuEntryActionViewItem.js +5 -5
  279. package/esm/vs/platform/actions/browser/toolbar.js +2 -2
  280. package/esm/vs/platform/actions/common/actions.js +11 -4
  281. package/esm/vs/platform/actions/common/actions.js.map +1 -1
  282. package/esm/vs/platform/actions/common/menuService.js +2 -2
  283. package/esm/vs/platform/configuration/common/configurationRegistry.js +10 -10
  284. package/esm/vs/platform/contextkey/browser/contextKeyService.js +1 -1
  285. package/esm/vs/platform/contextkey/common/contextkey.js +9 -9
  286. package/esm/vs/platform/contextkey/common/contextkeys.js +9 -9
  287. package/esm/vs/platform/contextkey/common/scanner.js +5 -5
  288. package/esm/vs/platform/{product/common/productService.js → defaultAccount/common/defaultAccount.js} +2 -2
  289. package/esm/vs/platform/defaultAccount/common/defaultAccount.js.map +1 -0
  290. package/esm/vs/platform/history/browser/contextScopedHistoryWidget.js +1 -1
  291. package/esm/vs/platform/hover/browser/hoverWidget.js +1 -1
  292. package/esm/vs/platform/hover/browser/updatableHoverWidget.js +1 -1
  293. package/esm/vs/platform/instantiation/common/instantiation.js.map +1 -1
  294. package/esm/vs/platform/instantiation/common/instantiationService.js +1 -8
  295. package/esm/vs/platform/instantiation/common/instantiationService.js.map +1 -1
  296. package/esm/vs/platform/keybinding/common/abstractKeybindingService.js +4 -4
  297. package/esm/vs/platform/list/browser/listService.js +27 -27
  298. package/esm/vs/platform/log/common/log.js +1 -1
  299. package/esm/vs/platform/log/common/log.js.map +1 -1
  300. package/esm/vs/platform/markers/common/markerService.js +6 -6
  301. package/esm/vs/platform/markers/common/markerService.js.map +1 -1
  302. package/esm/vs/platform/markers/common/markers.js +6 -6
  303. package/esm/vs/platform/quickinput/browser/commandsQuickAccess.js +8 -8
  304. package/esm/vs/platform/quickinput/browser/helpQuickAccess.js +1 -1
  305. package/esm/vs/platform/quickinput/browser/media/quickInput.css +7 -3
  306. package/esm/vs/platform/quickinput/browser/quickInput.js +19 -11
  307. package/esm/vs/platform/quickinput/browser/quickInput.js.map +1 -1
  308. package/esm/vs/platform/quickinput/browser/quickInputActions.js +5 -5
  309. package/esm/vs/platform/quickinput/browser/quickInputController.js +6 -6
  310. package/esm/vs/platform/quickinput/browser/quickInputList.js +1 -1
  311. package/esm/vs/platform/quickinput/browser/quickInputUtils.js +1 -1
  312. package/esm/vs/platform/quickinput/browser/tree/quickInputTreeAccessibilityProvider.js +1 -1
  313. package/esm/vs/platform/theme/common/colorUtils.js +2 -2
  314. package/esm/vs/platform/theme/common/colors/baseColors.js +18 -17
  315. package/esm/vs/platform/theme/common/colors/baseColors.js.map +1 -1
  316. package/esm/vs/platform/theme/common/colors/chartsColors.js +8 -8
  317. package/esm/vs/platform/theme/common/colors/editorColors.js +95 -95
  318. package/esm/vs/platform/theme/common/colors/inputColors.js +47 -47
  319. package/esm/vs/platform/theme/common/colors/listColors.js +36 -36
  320. package/esm/vs/platform/theme/common/colors/menuColors.js +7 -7
  321. package/esm/vs/platform/theme/common/colors/minimapColors.js +13 -13
  322. package/esm/vs/platform/theme/common/colors/minimapColors.js.map +1 -1
  323. package/esm/vs/platform/theme/common/colors/miscColors.js +16 -16
  324. package/esm/vs/platform/theme/common/colors/quickpickColors.js +9 -9
  325. package/esm/vs/platform/theme/common/colors/searchColors.js +3 -3
  326. package/esm/vs/platform/theme/common/iconRegistry.js +6 -6
  327. package/esm/vs/platform/undoRedo/common/undoRedoService.js +21 -21
  328. package/esm/vs/platform/undoRedo/common/undoRedoService.js.map +1 -1
  329. package/esm/vs/platform/window/common/window.js +1 -1
  330. package/esm/vs/platform/window/common/window.js.map +1 -1
  331. package/esm/vs/platform/workspace/common/workspace.js +1 -1
  332. package/monaco.d.ts +37 -2
  333. package/package.json +2 -2
  334. package/version.txt +1 -1
  335. package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineEdit.js +0 -16
  336. package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineEdit.js.map +0 -1
  337. package/esm/vs/platform/product/common/productService.js.map +0 -1
@@ -6,13 +6,13 @@ import { onUnexpectedError } from '../common/errors.js';
6
6
  import { escapeDoubleQuotes, parseHrefAndDimensions, removeMarkdownEscapes } from '../common/htmlContent.js';
7
7
  import { markdownEscapeEscapedIcons } from '../common/iconLabels.js';
8
8
  import { defaultGenerator } from '../common/idGenerator.js';
9
- import { Lazy } from '../common/lazy.js';
10
9
  import { DisposableStore } from '../common/lifecycle.js';
11
10
  import * as marked from '../common/marked/marked.js';
12
11
  import { parse } from '../common/marshalling.js';
13
12
  import { FileAccess, Schemas } from '../common/network.js';
14
13
  import { cloneAndChange } from '../common/objects.js';
15
- import { dirname, resolvePath } from '../common/resources.js';
14
+ import { basename as pathBasename } from '../common/path.js';
15
+ import { basename, dirname, resolvePath } from '../common/resources.js';
16
16
  import { escape } from '../common/strings.js';
17
17
  import { URI } from '../common/uri.js';
18
18
  import * as DOM from './dom.js';
@@ -551,7 +551,14 @@ export function renderAsPlaintext(str, options) {
551
551
  if (value.length > 100_000) {
552
552
  value = `${value.substr(0, 100_000)}…`;
553
553
  }
554
- const html = marked.parse(value, { async: false, renderer: options?.includeCodeBlocksFences ? plainTextWithCodeBlocksRenderer.value : plainTextRenderer.value });
554
+ const renderer = createPlainTextRenderer();
555
+ if (options?.includeCodeBlocksFences) {
556
+ renderer.code = codeBlockFences;
557
+ }
558
+ if (options?.useLinkFormatter) {
559
+ renderer.link = linkFormatter;
560
+ }
561
+ const html = marked.parse(value, { async: false, renderer });
555
562
  return sanitizeRenderedMarkdown(html, { isTrusted: false }, {})
556
563
  .toString()
557
564
  .replace(/&(#\d+|[a-zA-Z]+);/g, m => unescapeInfo.get(m) ?? m)
@@ -626,14 +633,21 @@ function createPlainTextRenderer() {
626
633
  };
627
634
  return renderer;
628
635
  }
629
- const plainTextRenderer = new Lazy(createPlainTextRenderer);
630
- const plainTextWithCodeBlocksRenderer = new Lazy(() => {
631
- const renderer = createPlainTextRenderer();
632
- renderer.code = ({ text }) => {
633
- return `\n\`\`\`\n${escape(text)}\n\`\`\`\n`;
634
- };
635
- return renderer;
636
- });
636
+ const codeBlockFences = ({ text }) => {
637
+ return `\n\`\`\`\n${escape(text)}\n\`\`\`\n`;
638
+ };
639
+ const linkFormatter = ({ text, href }) => {
640
+ try {
641
+ if (href) {
642
+ const uri = URI.parse(href);
643
+ return text.trim() || basename(uri);
644
+ }
645
+ }
646
+ catch (e) {
647
+ return text.trim() || pathBasename(href);
648
+ }
649
+ return text;
650
+ };
637
651
  function mergeRawTokenText(tokens) {
638
652
  let mergedTokenText = '';
639
653
  tokens.forEach(token => {
@@ -1 +1 @@
1
- {"version":3,"sources":["file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src/vs/base/browser/markdownRenderer.ts","vs/base/browser/markdownRenderer.ts"],"names":[],"mappings":"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","file":"markdownRenderer.js","sourceRoot":"file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { onUnexpectedError } from '../common/errors.js';\nimport { escapeDoubleQuotes, IMarkdownString, MarkdownStringTrustedOptions, parseHrefAndDimensions, removeMarkdownEscapes } from '../common/htmlContent.js';\nimport { markdownEscapeEscapedIcons } from '../common/iconLabels.js';\nimport { defaultGenerator } from '../common/idGenerator.js';\nimport { KeyCode } from '../common/keyCodes.js';\nimport { Lazy } from '../common/lazy.js';\nimport { DisposableStore, IDisposable } from '../common/lifecycle.js';\nimport * as marked from '../common/marked/marked.js';\nimport { parse } from '../common/marshalling.js';\nimport { FileAccess, Schemas } from '../common/network.js';\nimport { cloneAndChange } from '../common/objects.js';\nimport { dirname, resolvePath } from '../common/resources.js';\nimport { escape } from '../common/strings.js';\nimport { URI, UriComponents } from '../common/uri.js';\nimport * as DOM from './dom.js';\nimport * as domSanitize from './domSanitize.js';\nimport { convertTagToPlaintext } from './domSanitize.js';\nimport { StandardKeyboardEvent } from './keyboardEvent.js';\nimport { StandardMouseEvent } from './mouseEvent.js';\nimport { renderIcon, renderLabelWithIcons } from './ui/iconLabel/iconLabels.js';\n\nexport type MarkdownActionHandler = (linkContent: string, mdStr: IMarkdownString) => void;\n\n/**\n * Options for the rendering of markdown with {@link renderMarkdown}.\n */\nexport interface MarkdownRenderOptions {\n\treadonly codeBlockRenderer?: (languageId: string, value: string) => Promise<HTMLElement>;\n\treadonly codeBlockRendererSync?: (languageId: string, value: string, raw?: string) => HTMLElement;\n\treadonly asyncRenderCallback?: () => void;\n\n\treadonly actionHandler?: MarkdownActionHandler;\n\n\treadonly fillInIncompleteTokens?: boolean;\n\n\treadonly sanitizerConfig?: MarkdownSanitizerConfig;\n\n\treadonly markedOptions?: MarkdownRendererMarkedOptions;\n\treadonly markedExtensions?: marked.MarkedExtension[];\n}\n\n/**\n * Subset of options passed to `Marked` for rendering markdown.\n */\nexport interface MarkdownRendererMarkedOptions {\n}\n\nexport interface MarkdownSanitizerConfig {\n\treadonly replaceWithPlaintext?: boolean;\n\treadonly allowedTags?: {\n\t\treadonly override: readonly string[];\n\t};\n\treadonly allowedAttributes?: {\n\t\treadonly override: ReadonlyArray<string | domSanitize.SanitizeAttributeRule>;\n\t};\n\treadonly allowedLinkSchemes?: {\n\t\treadonly augment: readonly string[];\n\t};\n\treadonly remoteImageIsAllowed?: (uri: URI) => boolean;\n}\n\nconst defaultMarkedRenderers = Object.freeze({\n\timage: ({ href, title, text }: marked.Tokens.Image): string => {\n\t\tlet dimensions: string[] = [];\n\t\tlet attributes: string[] = [];\n\t\tif (href) {\n\t\t\t({ href, dimensions } = parseHrefAndDimensions(href));\n\t\t\tattributes.push(`src=\"${escapeDoubleQuotes(href)}\"`);\n\t\t}\n\t\tif (text) {\n\t\t\tattributes.push(`alt=\"${escapeDoubleQuotes(text)}\"`);\n\t\t}\n\t\tif (title) {\n\t\t\tattributes.push(`title=\"${escapeDoubleQuotes(title)}\"`);\n\t\t}\n\t\tif (dimensions.length) {\n\t\t\tattributes = attributes.concat(dimensions);\n\t\t}\n\t\treturn '<img ' + attributes.join(' ') + '>';\n\t},\n\n\tparagraph(this: marked.Renderer, { tokens }: marked.Tokens.Paragraph): string {\n\t\treturn `<p>${this.parser.parseInline(tokens)}</p>`;\n\t},\n\n\tlink(this: marked.Renderer, { href, title, tokens }: marked.Tokens.Link): string {\n\t\tlet text = this.parser.parseInline(tokens);\n\t\tif (typeof href !== 'string') {\n\t\t\treturn '';\n\t\t}\n\n\t\t// Remove markdown escapes. Workaround for https://github.com/chjj/marked/issues/829\n\t\tif (href === text) { // raw link case\n\t\t\ttext = removeMarkdownEscapes(text);\n\t\t}\n\n\t\ttitle = typeof title === 'string' ? escapeDoubleQuotes(removeMarkdownEscapes(title)) : '';\n\t\thref = removeMarkdownEscapes(href);\n\n\t\t// HTML Encode href\n\t\thref = href.replace(/&/g, '&amp;')\n\t\t\t.replace(/</g, '&lt;')\n\t\t\t.replace(/>/g, '&gt;')\n\t\t\t.replace(/\"/g, '&quot;')\n\t\t\t.replace(/'/g, '&#39;');\n\n\t\treturn `<a href=\"${href}\" title=\"${title || href}\" draggable=\"false\">${text}</a>`;\n\t},\n});\n\n/**\n * Blockquote renderer that processes GitHub-style alert syntax.\n * Transforms blockquotes like \"> [!NOTE]\" into structured alert markup with icons.\n *\n * Based on GitHub's alert syntax: https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax#alerts\n */\nfunction createAlertBlockquoteRenderer(fallbackRenderer: (this: marked.Renderer, token: marked.Tokens.Blockquote) => string) {\n\treturn function (this: marked.Renderer, token: marked.Tokens.Blockquote): string {\n\t\tconst { tokens } = token;\n\t\t// Check if this blockquote starts with alert syntax [!TYPE]\n\t\tconst firstToken = tokens[0];\n\t\tif (firstToken?.type !== 'paragraph') {\n\t\t\treturn fallbackRenderer.call(this, token);\n\t\t}\n\n\t\tconst paragraphTokens = firstToken.tokens;\n\t\tif (!paragraphTokens || paragraphTokens.length === 0) {\n\t\t\treturn fallbackRenderer.call(this, token);\n\t\t}\n\n\t\tconst firstTextToken = paragraphTokens[0];\n\t\tif (firstTextToken?.type !== 'text') {\n\t\t\treturn fallbackRenderer.call(this, token);\n\t\t}\n\n\t\tconst pattern = /^\\s*\\[!(NOTE|TIP|IMPORTANT|WARNING|CAUTION)\\]\\s*?\\n*/i;\n\t\tconst match = firstTextToken.raw.match(pattern);\n\t\tif (!match) {\n\t\t\treturn fallbackRenderer.call(this, token);\n\t\t}\n\n\t\t// Remove the alert marker from the token\n\t\tfirstTextToken.raw = firstTextToken.raw.replace(pattern, '');\n\t\tfirstTextToken.text = firstTextToken.text.replace(pattern, '');\n\n\t\tconst alertIcons: Record<string, string> = {\n\t\t\t'note': 'info',\n\t\t\t'tip': 'light-bulb',\n\t\t\t'important': 'comment',\n\t\t\t'warning': 'alert',\n\t\t\t'caution': 'stop'\n\t\t};\n\n\t\tconst type = match[1];\n\t\tconst typeCapitalized = type.charAt(0).toUpperCase() + type.slice(1).toLowerCase();\n\t\tconst severity = type.toLowerCase();\n\t\tconst iconHtml = renderIcon({ id: alertIcons[severity] }).outerHTML;\n\n\t\t// Render the remaining content\n\t\tconst content = this.parser.parse(tokens);\n\n\t\t// Return alert markup with icon and severity (skipping the first 3 characters: `<p>`)\n\t\treturn `<blockquote data-severity=\"${severity}\"><p><span>${iconHtml}${typeCapitalized}</span>${content.substring(3)}</blockquote>\\n`;\n\t};\n}\n\nexport interface IRenderedMarkdown extends IDisposable {\n\treadonly element: HTMLElement;\n}\n\n/**\n * Low-level way create a html element from a markdown string.\n *\n * **Note** that for most cases you should be using {@link import('../../editor/browser/widget/markdownRenderer/browser/markdownRenderer.js').MarkdownRenderer MarkdownRenderer}\n * which comes with support for pretty code block rendering and which uses the default way of handling links.\n */\nexport function renderMarkdown(markdown: IMarkdownString, options: MarkdownRenderOptions = {}, target?: HTMLElement): IRenderedMarkdown {\n\tconst disposables = new DisposableStore();\n\tlet isDisposed = false;\n\n\tconst markedInstance = new marked.Marked(...(options.markedExtensions ?? []));\n\tconst { renderer, codeBlocks, syncCodeBlocks } = createMarkdownRenderer(markedInstance, options, markdown);\n\tconst value = preprocessMarkdownString(markdown);\n\n\tlet renderedMarkdown: string;\n\tif (options.fillInIncompleteTokens) {\n\t\t// The defaults are applied by parse but not lexer()/parser(), and they need to be present\n\t\tconst opts: marked.MarkedOptions = {\n\t\t\t...markedInstance.defaults,\n\t\t\t...options.markedOptions,\n\t\t\trenderer\n\t\t};\n\t\tconst tokens = markedInstance.lexer(value, opts);\n\t\tconst newTokens = fillInIncompleteTokens(tokens);\n\t\trenderedMarkdown = markedInstance.parser(newTokens, opts);\n\t} else {\n\t\trenderedMarkdown = markedInstance.parse(value, { ...options?.markedOptions, renderer, async: false });\n\t}\n\n\t// Rewrite theme icons\n\tif (markdown.supportThemeIcons) {\n\t\tconst elements = renderLabelWithIcons(renderedMarkdown);\n\t\trenderedMarkdown = elements.map(e => typeof e === 'string' ? e : e.outerHTML).join('');\n\t}\n\n\tconst renderedContent = document.createElement('div');\n\tconst sanitizerConfig = getDomSanitizerConfig(markdown, options.sanitizerConfig ?? {});\n\tdomSanitize.safeSetInnerHtml(renderedContent, renderedMarkdown, sanitizerConfig);\n\n\t// Rewrite links and images before potentially inserting them into the real dom\n\trewriteRenderedLinks(markdown, options, renderedContent);\n\n\tlet outElement: HTMLElement;\n\tif (target) {\n\t\toutElement = target;\n\t\tDOM.reset(target, ...renderedContent.childNodes);\n\t} else {\n\t\toutElement = renderedContent;\n\t}\n\n\tif (codeBlocks.length > 0) {\n\t\tPromise.all(codeBlocks).then((tuples) => {\n\t\t\tif (isDisposed) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst renderedElements = new Map(tuples);\n\t\t\t// eslint-disable-next-line no-restricted-syntax\n\t\t\tconst placeholderElements = outElement.querySelectorAll<HTMLDivElement>(`div[data-code]`);\n\t\t\tfor (const placeholderElement of placeholderElements) {\n\t\t\t\tconst renderedElement = renderedElements.get(placeholderElement.dataset['code'] ?? '');\n\t\t\t\tif (renderedElement) {\n\t\t\t\t\tDOM.reset(placeholderElement, renderedElement);\n\t\t\t\t}\n\t\t\t}\n\t\t\toptions.asyncRenderCallback?.();\n\t\t});\n\t} else if (syncCodeBlocks.length > 0) {\n\t\tconst renderedElements = new Map(syncCodeBlocks);\n\t\t// eslint-disable-next-line no-restricted-syntax\n\t\tconst placeholderElements = outElement.querySelectorAll<HTMLDivElement>(`div[data-code]`);\n\t\tfor (const placeholderElement of placeholderElements) {\n\t\t\tconst renderedElement = renderedElements.get(placeholderElement.dataset['code'] ?? '');\n\t\t\tif (renderedElement) {\n\t\t\t\tDOM.reset(placeholderElement, renderedElement);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Signal size changes for image tags\n\tif (options.asyncRenderCallback) {\n\t\t// eslint-disable-next-line no-restricted-syntax\n\t\tfor (const img of outElement.getElementsByTagName('img')) {\n\t\t\tconst listener = disposables.add(DOM.addDisposableListener(img, 'load', () => {\n\t\t\t\tlistener.dispose();\n\t\t\t\toptions.asyncRenderCallback!();\n\t\t\t}));\n\t\t}\n\t}\n\n\t// Add event listeners for links\n\tif (options.actionHandler) {\n\t\tconst clickCb = (e: PointerEvent) => {\n\t\t\tconst mouseEvent = new StandardMouseEvent(DOM.getWindow(outElement), e);\n\t\t\tif (!mouseEvent.leftButton && !mouseEvent.middleButton) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tactivateLink(markdown, options, mouseEvent);\n\t\t};\n\t\tdisposables.add(DOM.addDisposableListener(outElement, 'click', clickCb));\n\t\tdisposables.add(DOM.addDisposableListener(outElement, 'auxclick', clickCb));\n\n\t\tdisposables.add(DOM.addDisposableListener(outElement, 'keydown', (e) => {\n\t\t\tconst keyboardEvent = new StandardKeyboardEvent(e);\n\t\t\tif (!keyboardEvent.equals(KeyCode.Space) && !keyboardEvent.equals(KeyCode.Enter)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tactivateLink(markdown, options, keyboardEvent);\n\t\t}));\n\t}\n\n\t// Remove/disable inputs\n\t// eslint-disable-next-line no-restricted-syntax\n\tfor (const input of [...outElement.getElementsByTagName('input')]) {\n\t\tif (input.attributes.getNamedItem('type')?.value === 'checkbox') {\n\t\t\tinput.setAttribute('disabled', '');\n\t\t} else {\n\t\t\tif (options.sanitizerConfig?.replaceWithPlaintext) {\n\t\t\t\tconst replacement = convertTagToPlaintext(input);\n\t\t\t\tif (replacement) {\n\t\t\t\t\tinput.parentElement?.replaceChild(replacement, input);\n\t\t\t\t} else {\n\t\t\t\t\tinput.remove();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tinput.remove();\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\telement: outElement,\n\t\tdispose: () => {\n\t\t\tisDisposed = true;\n\t\t\tdisposables.dispose();\n\t\t}\n\t};\n}\n\nfunction rewriteRenderedLinks(markdown: IMarkdownString, options: MarkdownRenderOptions, root: HTMLElement) {\n\t// eslint-disable-next-line no-restricted-syntax\n\tfor (const el of root.querySelectorAll('img, audio, video, source')) {\n\t\tconst src = el.getAttribute('src'); // Get the raw 'src' attribute value as text, not the resolved 'src'\n\t\tif (src) {\n\t\t\tlet href = src;\n\t\t\ttry {\n\t\t\t\tif (markdown.baseUri) { // absolute or relative local path, or file: uri\n\t\t\t\t\thref = resolveWithBaseUri(URI.from(markdown.baseUri), href);\n\t\t\t\t}\n\t\t\t} catch (err) { }\n\n\t\t\tel.setAttribute('src', massageHref(markdown, href, true));\n\n\t\t\tif (options.sanitizerConfig?.remoteImageIsAllowed) {\n\t\t\t\tconst uri = URI.parse(href);\n\t\t\t\tif (uri.scheme !== Schemas.file && uri.scheme !== Schemas.data && !options.sanitizerConfig.remoteImageIsAllowed(uri)) {\n\t\t\t\t\tel.replaceWith(DOM.$('', undefined, el.outerHTML));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// eslint-disable-next-line no-restricted-syntax\n\tfor (const el of root.querySelectorAll('a')) {\n\t\tconst href = el.getAttribute('href'); // Get the raw 'href' attribute value as text, not the resolved 'href'\n\t\tel.setAttribute('href', ''); // Clear out href. We use the `data-href` for handling clicks instead\n\t\tif (!href\n\t\t\t|| /^data:|javascript:/i.test(href)\n\t\t\t|| (/^command:/i.test(href) && !markdown.isTrusted)\n\t\t\t|| /^command:(\\/\\/\\/)?_workbench\\.downloadResource/i.test(href)) {\n\t\t\t// drop the link\n\t\t\tel.replaceWith(...el.childNodes);\n\t\t} else {\n\t\t\tlet resolvedHref = massageHref(markdown, href, false);\n\t\t\tif (markdown.baseUri) {\n\t\t\t\tresolvedHref = resolveWithBaseUri(URI.from(markdown.baseUri), href);\n\t\t\t}\n\t\t\tel.dataset.href = resolvedHref;\n\t\t}\n\t}\n}\n\nfunction createMarkdownRenderer(marked: marked.Marked, options: MarkdownRenderOptions, markdown: IMarkdownString): { renderer: marked.Renderer; codeBlocks: Promise<[string, HTMLElement]>[]; syncCodeBlocks: [string, HTMLElement][] } {\n\tconst renderer = new marked.Renderer(options.markedOptions);\n\trenderer.image = defaultMarkedRenderers.image;\n\trenderer.link = defaultMarkedRenderers.link;\n\trenderer.paragraph = defaultMarkedRenderers.paragraph;\n\n\tif (markdown.supportAlertSyntax) {\n\t\trenderer.blockquote = createAlertBlockquoteRenderer(renderer.blockquote);\n\t}\n\n\t// Will collect [id, renderedElement] tuples\n\tconst codeBlocks: Promise<[string, HTMLElement]>[] = [];\n\tconst syncCodeBlocks: [string, HTMLElement][] = [];\n\n\tif (options.codeBlockRendererSync) {\n\t\trenderer.code = ({ text, lang, raw }: marked.Tokens.Code) => {\n\t\t\tconst id = defaultGenerator.nextId();\n\t\t\tconst value = options.codeBlockRendererSync!(postProcessCodeBlockLanguageId(lang), text, raw);\n\t\t\tsyncCodeBlocks.push([id, value]);\n\t\t\treturn `<div class=\"code\" data-code=\"${id}\">${escape(text)}</div>`;\n\t\t};\n\t} else if (options.codeBlockRenderer) {\n\t\trenderer.code = ({ text, lang }: marked.Tokens.Code) => {\n\t\t\tconst id = defaultGenerator.nextId();\n\t\t\tconst value = options.codeBlockRenderer!(postProcessCodeBlockLanguageId(lang), text);\n\t\t\tcodeBlocks.push(value.then(element => [id, element]));\n\t\t\treturn `<div class=\"code\" data-code=\"${id}\">${escape(text)}</div>`;\n\t\t};\n\t}\n\n\tif (!markdown.supportHtml) {\n\t\t// Note: we always pass the output through dompurify after this so that we don't rely on\n\t\t// marked for real sanitization.\n\t\trenderer.html = ({ text }) => {\n\t\t\tif (options.sanitizerConfig?.replaceWithPlaintext) {\n\t\t\t\treturn escape(text);\n\t\t\t}\n\n\t\t\tconst match = markdown.isTrusted ? text.match(/^(<span[^>]+>)|(<\\/\\s*span>)$/) : undefined;\n\t\t\treturn match ? text : '';\n\t\t};\n\t}\n\treturn { renderer, codeBlocks, syncCodeBlocks };\n}\n\nfunction preprocessMarkdownString(markdown: IMarkdownString) {\n\tlet value = markdown.value;\n\n\t// values that are too long will freeze the UI\n\tif (value.length > 100_000) {\n\t\tvalue = `${value.substr(0, 100_000)}…`;\n\t}\n\n\t// escape theme icons\n\tif (markdown.supportThemeIcons) {\n\t\tvalue = markdownEscapeEscapedIcons(value);\n\t}\n\n\treturn value;\n}\n\nfunction activateLink(mdStr: IMarkdownString, options: MarkdownRenderOptions, event: StandardMouseEvent | StandardKeyboardEvent): void {\n\tconst target = event.target.closest('a[data-href]');\n\tif (!DOM.isHTMLElement(target)) {\n\t\treturn;\n\t}\n\n\ttry {\n\t\tlet href = target.dataset['href'];\n\t\tif (href) {\n\t\t\tif (mdStr.baseUri) {\n\t\t\t\thref = resolveWithBaseUri(URI.from(mdStr.baseUri), href);\n\t\t\t}\n\t\t\toptions.actionHandler?.(href, mdStr);\n\t\t}\n\t} catch (err) {\n\t\tonUnexpectedError(err);\n\t} finally {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t}\n}\n\nfunction uriMassage(markdown: IMarkdownString, part: string): string {\n\tlet data: unknown;\n\ttry {\n\t\tdata = parse(decodeURIComponent(part));\n\t} catch (e) {\n\t\t// ignore\n\t}\n\tif (!data) {\n\t\treturn part;\n\t}\n\tdata = cloneAndChange(data, value => {\n\t\tif (markdown.uris && markdown.uris[value]) {\n\t\t\treturn URI.revive(markdown.uris[value]);\n\t\t} else {\n\t\t\treturn undefined;\n\t\t}\n\t});\n\treturn encodeURIComponent(JSON.stringify(data));\n}\n\nfunction massageHref(markdown: IMarkdownString, href: string, isDomUri: boolean): string {\n\tconst data = markdown.uris && markdown.uris[href];\n\tlet uri = URI.revive(data);\n\tif (isDomUri) {\n\t\tif (href.startsWith(Schemas.data + ':')) {\n\t\t\treturn href;\n\t\t}\n\t\tif (!uri) {\n\t\t\turi = URI.parse(href);\n\t\t}\n\t\t// this URI will end up as \"src\"-attribute of a dom node\n\t\t// and because of that special rewriting needs to be done\n\t\t// so that the URI uses a protocol that's understood by\n\t\t// browsers (like http or https)\n\t\treturn FileAccess.uriToBrowserUri(uri).toString(true);\n\t}\n\tif (!uri) {\n\t\treturn href;\n\t}\n\tif (URI.parse(href).toString() === uri.toString()) {\n\t\treturn href; // no transformation performed\n\t}\n\tif (uri.query) {\n\t\turi = uri.with({ query: uriMassage(markdown, uri.query) });\n\t}\n\treturn uri.toString();\n}\n\nfunction postProcessCodeBlockLanguageId(lang: string | undefined): string {\n\tif (!lang) {\n\t\treturn '';\n\t}\n\n\tconst parts = lang.split(/[\\s+|:|,|\\{|\\?]/, 1);\n\tif (parts.length) {\n\t\treturn parts[0];\n\t}\n\treturn lang;\n}\n\nfunction resolveWithBaseUri(baseUri: URI, href: string): string {\n\tconst hasScheme = /^\\w[\\w\\d+.-]*:/.test(href);\n\tif (hasScheme) {\n\t\treturn href;\n\t}\n\n\tif (baseUri.path.endsWith('/')) {\n\t\treturn resolvePath(baseUri, href).toString();\n\t} else {\n\t\treturn resolvePath(dirname(baseUri), href).toString();\n\t}\n}\n\ntype MdStrConfig = {\n\treadonly isTrusted?: boolean | MarkdownStringTrustedOptions;\n\treadonly baseUri?: UriComponents;\n};\n\nfunction sanitizeRenderedMarkdown(\n\trenderedMarkdown: string,\n\toriginalMdStrConfig: MdStrConfig,\n\toptions: MarkdownSanitizerConfig = {},\n): TrustedHTML {\n\tconst sanitizerConfig = getDomSanitizerConfig(originalMdStrConfig, options);\n\treturn domSanitize.sanitizeHtml(renderedMarkdown, sanitizerConfig);\n}\n\nexport const allowedMarkdownHtmlTags = Object.freeze([\n\t...domSanitize.basicMarkupHtmlTags,\n\t'input', // Allow inputs for rendering checkboxes. Other types of inputs are removed and the inputs are always disabled\n]);\n\nexport const allowedMarkdownHtmlAttributes = Object.freeze<Array<string | domSanitize.SanitizeAttributeRule>>([\n\t'align',\n\t'autoplay',\n\t'alt',\n\t'colspan',\n\t'controls',\n\t'draggable',\n\t'height',\n\t'href',\n\t'loop',\n\t'muted',\n\t'playsinline',\n\t'poster',\n\t'rowspan',\n\t'src',\n\t'target',\n\t'title',\n\t'type',\n\t'width',\n\t'start',\n\n\t// Input (For disabled inputs)\n\t'checked',\n\t'disabled',\n\t'value',\n\n\t// Custom markdown attributes\n\t'data-code',\n\t'data-href',\n\t'data-severity',\n\n\t// Only allow very specific styles\n\t{\n\t\tattributeName: 'style',\n\t\tshouldKeep: (element, data) => {\n\t\t\tif (element.tagName === 'SPAN') {\n\t\t\t\tif (data.attrName === 'style') {\n\t\t\t\t\treturn /^(color\\:(#[0-9a-fA-F]+|var\\(--vscode(-[a-zA-Z0-9]+)+\\));)?(background-color\\:(#[0-9a-fA-F]+|var\\(--vscode(-[a-zA-Z0-9]+)+\\));)?(border-radius:[0-9]+px;)?$/.test(data.attrValue);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t},\n\n\t// Only allow codicons for classes\n\t{\n\t\tattributeName: 'class',\n\t\tshouldKeep: (element, data) => {\n\t\t\tif (element.tagName === 'SPAN') {\n\t\t\t\tif (data.attrName === 'class') {\n\t\t\t\t\treturn /^codicon codicon-[a-z\\-]+( codicon-modifier-[a-z\\-]+)?$/.test(data.attrValue);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t},\n]);\n\nfunction getDomSanitizerConfig(mdStrConfig: MdStrConfig, options: MarkdownSanitizerConfig): domSanitize.DomSanitizerConfig {\n\tconst isTrusted = mdStrConfig.isTrusted ?? false;\n\tconst allowedLinkSchemes = [\n\t\tSchemas.http,\n\t\tSchemas.https,\n\t\tSchemas.mailto,\n\t\tSchemas.file,\n\t\tSchemas.vscodeFileResource,\n\t\tSchemas.vscodeRemote,\n\t\tSchemas.vscodeRemoteResource,\n\t\tSchemas.vscodeNotebookCell,\n\t\t// For links that are handled entirely by the action handler\n\t\tSchemas.internal,\n\t];\n\n\tif (isTrusted) {\n\t\tallowedLinkSchemes.push(Schemas.command);\n\t}\n\n\tif (options.allowedLinkSchemes?.augment) {\n\t\tallowedLinkSchemes.push(...options.allowedLinkSchemes.augment);\n\t}\n\n\treturn {\n\t\t// allowedTags should included everything that markdown renders to.\n\t\t// Since we have our own sanitize function for marked, it's possible we missed some tag so let dompurify make sure.\n\t\t// HTML tags that can result from markdown are from reading https://spec.commonmark.org/0.29/\n\t\t// HTML table tags that can result from markdown are from https://github.github.com/gfm/#tables-extension-\n\t\tallowedTags: {\n\t\t\toverride: options.allowedTags?.override ?? allowedMarkdownHtmlTags\n\t\t},\n\t\tallowedAttributes: {\n\t\t\toverride: options.allowedAttributes?.override ?? allowedMarkdownHtmlAttributes,\n\t\t},\n\t\tallowedLinkProtocols: {\n\t\t\toverride: allowedLinkSchemes,\n\t\t},\n\t\tallowRelativeLinkPaths: !!mdStrConfig.baseUri,\n\t\tallowedMediaProtocols: {\n\t\t\toverride: [\n\t\t\t\tSchemas.http,\n\t\t\t\tSchemas.https,\n\t\t\t\tSchemas.data,\n\t\t\t\tSchemas.file,\n\t\t\t\tSchemas.vscodeFileResource,\n\t\t\t\tSchemas.vscodeRemote,\n\t\t\t\tSchemas.vscodeRemoteResource,\n\t\t\t]\n\t\t},\n\t\tallowRelativeMediaPaths: !!mdStrConfig.baseUri,\n\t\treplaceWithPlaintext: options.replaceWithPlaintext,\n\t};\n}\n\n/**\n * Renders `str` as plaintext, stripping out Markdown syntax if it's a {@link IMarkdownString}.\n *\n * For example `# Header` would be output as `Header`.\n */\nexport function renderAsPlaintext(str: IMarkdownString | string, options?: {\n\t/** Controls if the ``` of code blocks should be preserved in the output or not */\n\treadonly includeCodeBlocksFences?: boolean;\n}) {\n\tif (typeof str === 'string') {\n\t\treturn str;\n\t}\n\n\t// values that are too long will freeze the UI\n\tlet value = str.value ?? '';\n\tif (value.length > 100_000) {\n\t\tvalue = `${value.substr(0, 100_000)}…`;\n\t}\n\n\tconst html = marked.parse(value, { async: false, renderer: options?.includeCodeBlocksFences ? plainTextWithCodeBlocksRenderer.value : plainTextRenderer.value });\n\treturn sanitizeRenderedMarkdown(html, { isTrusted: false }, {})\n\t\t.toString()\n\t\t.replace(/&(#\\d+|[a-zA-Z]+);/g, m => unescapeInfo.get(m) ?? m)\n\t\t.trim();\n}\n\nconst unescapeInfo = new Map<string, string>([\n\t['&quot;', '\"'],\n\t['&nbsp;', ' '],\n\t['&amp;', '&'],\n\t['&#39;', '\\''],\n\t['&lt;', '<'],\n\t['&gt;', '>'],\n]);\n\nfunction createPlainTextRenderer(): marked.Renderer {\n\tconst renderer = new marked.Renderer();\n\n\trenderer.code = ({ text }: marked.Tokens.Code): string => {\n\t\treturn escape(text);\n\t};\n\trenderer.blockquote = ({ text }: marked.Tokens.Blockquote): string => {\n\t\treturn text + '\\n';\n\t};\n\trenderer.html = (_: marked.Tokens.HTML): string => {\n\t\treturn '';\n\t};\n\trenderer.heading = function ({ tokens }: marked.Tokens.Heading): string {\n\t\treturn this.parser.parseInline(tokens) + '\\n';\n\t};\n\trenderer.hr = (): string => {\n\t\treturn '';\n\t};\n\trenderer.list = function ({ items }: marked.Tokens.List): string {\n\t\treturn items.map(x => this.listitem(x)).join('\\n') + '\\n';\n\t};\n\trenderer.listitem = ({ text }: marked.Tokens.ListItem): string => {\n\t\treturn text + '\\n';\n\t};\n\trenderer.paragraph = function ({ tokens }: marked.Tokens.Paragraph): string {\n\t\treturn this.parser.parseInline(tokens) + '\\n';\n\t};\n\trenderer.table = function ({ header, rows }: marked.Tokens.Table): string {\n\t\treturn header.map(cell => this.tablecell(cell)).join(' ') + '\\n' + rows.map(cells => cells.map(cell => this.tablecell(cell)).join(' ')).join('\\n') + '\\n';\n\t};\n\trenderer.tablerow = ({ text }: marked.Tokens.TableRow): string => {\n\t\treturn text;\n\t};\n\trenderer.tablecell = function ({ tokens }: marked.Tokens.TableCell): string {\n\t\treturn this.parser.parseInline(tokens);\n\t};\n\trenderer.strong = ({ text }: marked.Tokens.Strong): string => {\n\t\treturn text;\n\t};\n\trenderer.em = ({ text }: marked.Tokens.Em): string => {\n\t\treturn text;\n\t};\n\trenderer.codespan = ({ text }: marked.Tokens.Codespan): string => {\n\t\treturn escape(text);\n\t};\n\trenderer.br = (_: marked.Tokens.Br): string => {\n\t\treturn '\\n';\n\t};\n\trenderer.del = ({ text }: marked.Tokens.Del): string => {\n\t\treturn text;\n\t};\n\trenderer.image = (_: marked.Tokens.Image): string => {\n\t\treturn '';\n\t};\n\trenderer.text = ({ text }: marked.Tokens.Text): string => {\n\t\treturn text;\n\t};\n\trenderer.link = ({ text }: marked.Tokens.Link): string => {\n\t\treturn text;\n\t};\n\treturn renderer;\n}\nconst plainTextRenderer = new Lazy<marked.Renderer>(createPlainTextRenderer);\n\nconst plainTextWithCodeBlocksRenderer = new Lazy<marked.Renderer>(() => {\n\tconst renderer = createPlainTextRenderer();\n\trenderer.code = ({ text }: marked.Tokens.Code): string => {\n\t\treturn `\\n\\`\\`\\`\\n${escape(text)}\\n\\`\\`\\`\\n`;\n\t};\n\treturn renderer;\n});\n\nfunction mergeRawTokenText(tokens: marked.Token[]): string {\n\tlet mergedTokenText = '';\n\ttokens.forEach(token => {\n\t\tmergedTokenText += token.raw;\n\t});\n\treturn mergedTokenText;\n}\n\nfunction completeSingleLinePattern(token: marked.Tokens.Text | marked.Tokens.Paragraph): marked.Token | undefined {\n\tif (!token.tokens) {\n\t\treturn undefined;\n\t}\n\n\tfor (let i = token.tokens.length - 1; i >= 0; i--) {\n\t\tconst subtoken = token.tokens[i];\n\t\tif (subtoken.type === 'text') {\n\t\t\tconst lines = subtoken.raw.split('\\n');\n\t\t\tconst lastLine = lines[lines.length - 1];\n\t\t\tif (lastLine.includes('`')) {\n\t\t\t\treturn completeCodespan(token);\n\t\t\t}\n\n\t\t\telse if (lastLine.includes('**')) {\n\t\t\t\treturn completeDoublestar(token);\n\t\t\t}\n\n\t\t\telse if (lastLine.match(/\\*\\w/)) {\n\t\t\t\treturn completeStar(token);\n\t\t\t}\n\n\t\t\telse if (lastLine.match(/(^|\\s)__\\w/)) {\n\t\t\t\treturn completeDoubleUnderscore(token);\n\t\t\t}\n\n\t\t\telse if (lastLine.match(/(^|\\s)_\\w/)) {\n\t\t\t\treturn completeUnderscore(token);\n\t\t\t}\n\n\t\t\telse if (\n\t\t\t\t// Text with start of link target\n\t\t\t\thasLinkTextAndStartOfLinkTarget(lastLine) ||\n\t\t\t\t// This token doesn't have the link text, eg if it contains other markdown constructs that are in other subtokens.\n\t\t\t\t// But some preceding token does have an unbalanced [ at least\n\t\t\t\thasStartOfLinkTargetAndNoLinkText(lastLine) && token.tokens.slice(0, i).some(t => t.type === 'text' && t.raw.match(/\\[[^\\]]*$/))\n\t\t\t) {\n\t\t\t\tconst nextTwoSubTokens = token.tokens.slice(i + 1);\n\n\t\t\t\t// A markdown link can look like\n\t\t\t\t// [link text](https://microsoft.com \"more text\")\n\t\t\t\t// Where \"more text\" is a title for the link or an argument to a vscode command link\n\t\t\t\tif (\n\t\t\t\t\t// If the link was parsed as a link, then look for a link token and a text token with a quote\n\t\t\t\t\tnextTwoSubTokens[0]?.type === 'link' && nextTwoSubTokens[1]?.type === 'text' && nextTwoSubTokens[1].raw.match(/^ *\"[^\"]*$/) ||\n\t\t\t\t\t// And if the link was not parsed as a link (eg command link), just look for a single quote in this token\n\t\t\t\t\tlastLine.match(/^[^\"]* +\"[^\"]*$/)\n\t\t\t\t) {\n\n\t\t\t\t\treturn completeLinkTargetArg(token);\n\t\t\t\t}\n\t\t\t\treturn completeLinkTarget(token);\n\t\t\t}\n\n\t\t\t// Contains the start of link text, and no following tokens contain the link target\n\t\t\telse if (lastLine.match(/(^|\\s)\\[\\w*[^\\]]*$/)) {\n\t\t\t\treturn completeLinkText(token);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn undefined;\n}\n\nfunction hasLinkTextAndStartOfLinkTarget(str: string): boolean {\n\treturn !!str.match(/(^|\\s)\\[.*\\]\\(\\w*/);\n}\n\nfunction hasStartOfLinkTargetAndNoLinkText(str: string): boolean {\n\treturn !!str.match(/^[^\\[]*\\]\\([^\\)]*$/);\n}\n\nfunction completeListItemPattern(list: marked.Tokens.List): marked.Tokens.List | undefined {\n\t// Patch up this one list item\n\tconst lastListItem = list.items[list.items.length - 1];\n\tconst lastListSubToken = lastListItem.tokens ? lastListItem.tokens[lastListItem.tokens.length - 1] : undefined;\n\n\t/*\n\tExample list token structures:\n\n\tlist\n\t\tlist_item\n\t\t\ttext\n\t\t\t\ttext\n\t\t\t\tcodespan\n\t\t\t\tlink\n\t\tlist_item\n\t\t\ttext\n\t\t\tcode // Complete indented codeblock\n\t\tlist_item\n\t\t\ttext\n\t\t\tspace\n\t\t\ttext\n\t\t\t\ttext // Incomplete indented codeblock\n\t\tlist_item\n\t\t\ttext\n\t\t\tlist // Nested list\n\t\t\t\tlist_item\n\t\t\t\t\ttext\n\t\t\t\t\t\ttext\n\n\tContrast with paragraph:\n\tparagraph\n\t\ttext\n\t\tcodespan\n\t*/\n\n\tconst listEndsInHeading = (list: marked.Tokens.List): boolean => {\n\t\t// A list item can be rendered as a heading for some reason when it has a subitem where we haven't rendered the text yet like this:\n\t\t// 1. list item\n\t\t// -\n\t\tconst lastItem = list.items.at(-1);\n\t\tconst lastToken = lastItem?.tokens.at(-1);\n\t\treturn lastToken?.type === 'heading' || lastToken?.type === 'list' && listEndsInHeading(lastToken as marked.Tokens.List);\n\t};\n\n\tlet newToken: marked.Token | undefined;\n\tif (lastListSubToken?.type === 'text' && !('inRawBlock' in lastListItem)) { // Why does Tag have a type of 'text'\n\t\tnewToken = completeSingleLinePattern(lastListSubToken as marked.Tokens.Text);\n\t} else if (listEndsInHeading(list)) {\n\t\tconst newList = marked.lexer(list.raw.trim() + ' &nbsp;')[0] as marked.Tokens.List;\n\t\tif (newList.type !== 'list') {\n\t\t\t// Something went wrong\n\t\t\treturn;\n\t\t}\n\t\treturn newList;\n\t}\n\n\tif (!newToken || newToken.type !== 'paragraph') { // 'text' item inside the list item turns into paragraph\n\t\t// Nothing to fix, or not a pattern we were expecting\n\t\treturn;\n\t}\n\n\tconst previousListItemsText = mergeRawTokenText(list.items.slice(0, -1));\n\n\t// Grabbing the `- ` or `1. ` or `* ` off the list item because I can't find a better way to do this\n\tconst lastListItemLead = lastListItem.raw.match(/^(\\s*(-|\\d+\\.|\\*) +)/)?.[0];\n\tif (!lastListItemLead) {\n\t\t// Is badly formatted\n\t\treturn;\n\t}\n\n\tconst newListItemText = lastListItemLead +\n\t\tmergeRawTokenText(lastListItem.tokens.slice(0, -1)) +\n\t\tnewToken.raw;\n\n\tconst newList = marked.lexer(previousListItemsText + newListItemText)[0] as marked.Tokens.List;\n\tif (newList.type !== 'list') {\n\t\t// Something went wrong\n\t\treturn;\n\t}\n\n\treturn newList;\n}\n\nfunction completeHeading(token: marked.Tokens.Heading, fullRawText: string): marked.TokensList | void {\n\tif (token.raw.match(/-\\s*$/)) {\n\t\treturn marked.lexer(fullRawText + ' &nbsp;');\n\t}\n}\n\nconst maxIncompleteTokensFixRounds = 3;\nexport function fillInIncompleteTokens(tokens: marked.TokensList): marked.TokensList {\n\tfor (let i = 0; i < maxIncompleteTokensFixRounds; i++) {\n\t\tconst newTokens = fillInIncompleteTokensOnce(tokens);\n\t\tif (newTokens) {\n\t\t\ttokens = newTokens;\n\t\t} else {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn tokens;\n}\n\nfunction fillInIncompleteTokensOnce(tokens: marked.TokensList): marked.TokensList | null {\n\tlet i: number;\n\tlet newTokens: marked.Token[] | undefined;\n\tfor (i = 0; i < tokens.length; i++) {\n\t\tconst token = tokens[i];\n\n\t\tif (token.type === 'paragraph' && token.raw.match(/(\\n|^)\\|/)) {\n\t\t\tnewTokens = completeTable(tokens.slice(i));\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tconst lastToken = tokens.at(-1);\n\tif (!newTokens && lastToken?.type === 'list') {\n\t\tconst newListToken = completeListItemPattern(lastToken as marked.Tokens.List);\n\t\tif (newListToken) {\n\t\t\tnewTokens = [newListToken];\n\t\t\ti = tokens.length - 1;\n\t\t}\n\t}\n\n\tif (!newTokens && lastToken?.type === 'paragraph') {\n\t\t// Only operates on a single token, because any newline that follows this should break these patterns\n\t\tconst newToken = completeSingleLinePattern(lastToken as marked.Tokens.Paragraph);\n\t\tif (newToken) {\n\t\t\tnewTokens = [newToken];\n\t\t\ti = tokens.length - 1;\n\t\t}\n\t}\n\n\tif (newTokens) {\n\t\tconst newTokensList = [\n\t\t\t...tokens.slice(0, i),\n\t\t\t...newTokens\n\t\t];\n\t\t(newTokensList as marked.TokensList).links = tokens.links;\n\t\treturn newTokensList as marked.TokensList;\n\t}\n\n\tif (lastToken?.type === 'heading') {\n\t\tconst completeTokens = completeHeading(lastToken as marked.Tokens.Heading, mergeRawTokenText(tokens));\n\t\tif (completeTokens) {\n\t\t\treturn completeTokens;\n\t\t}\n\t}\n\n\treturn null;\n}\n\n\nfunction completeCodespan(token: marked.Token): marked.Token {\n\treturn completeWithString(token, '`');\n}\n\nfunction completeStar(tokens: marked.Token): marked.Token {\n\treturn completeWithString(tokens, '*');\n}\n\nfunction completeUnderscore(tokens: marked.Token): marked.Token {\n\treturn completeWithString(tokens, '_');\n}\n\nfunction completeLinkTarget(tokens: marked.Token): marked.Token {\n\treturn completeWithString(tokens, ')', false);\n}\n\nfunction completeLinkTargetArg(tokens: marked.Token): marked.Token {\n\treturn completeWithString(tokens, '\")', false);\n}\n\nfunction completeLinkText(tokens: marked.Token): marked.Token {\n\treturn completeWithString(tokens, '](https://microsoft.com)', false);\n}\n\nfunction completeDoublestar(tokens: marked.Token): marked.Token {\n\treturn completeWithString(tokens, '**');\n}\n\nfunction completeDoubleUnderscore(tokens: marked.Token): marked.Token {\n\treturn completeWithString(tokens, '__');\n}\n\nfunction completeWithString(tokens: marked.Token[] | marked.Token, closingString: string, shouldTrim = true): marked.Token {\n\tconst mergedRawText = mergeRawTokenText(Array.isArray(tokens) ? tokens : [tokens]);\n\n\t// If it was completed correctly, this should be a single token.\n\t// Expecting either a Paragraph or a List\n\tconst trimmedRawText = shouldTrim ? mergedRawText.trimEnd() : mergedRawText;\n\treturn marked.lexer(trimmedRawText + closingString)[0];\n}\n\nfunction completeTable(tokens: marked.Token[]): marked.Token[] | undefined {\n\tconst mergedRawText = mergeRawTokenText(tokens);\n\tconst lines = mergedRawText.split('\\n');\n\n\tlet numCols: number | undefined; // The number of line1 col headers\n\tlet hasSeparatorRow = false;\n\tfor (let i = 0; i < lines.length; i++) {\n\t\tconst line = lines[i].trim();\n\t\tif (typeof numCols === 'undefined' && line.match(/^\\s*\\|/)) {\n\t\t\tconst line1Matches = line.match(/(\\|[^\\|]+)(?=\\||$)/g);\n\t\t\tif (line1Matches) {\n\t\t\t\tnumCols = line1Matches.length;\n\t\t\t}\n\t\t} else if (typeof numCols === 'number') {\n\t\t\tif (line.match(/^\\s*\\|/)) {\n\t\t\t\tif (i !== lines.length - 1) {\n\t\t\t\t\t// We got the line1 header row, and the line2 separator row, but there are more lines, and it wasn't parsed as a table!\n\t\t\t\t\t// That's strange and means that the table is probably malformed in the source, so I won't try to patch it up.\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\n\t\t\t\t// Got a line2 separator row- partial or complete, doesn't matter, we'll replace it with a correct one\n\t\t\t\thasSeparatorRow = true;\n\t\t\t} else {\n\t\t\t\t// The line after the header row isn't a valid separator row, so the table is malformed, don't fix it up\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (typeof numCols === 'number' && numCols > 0) {\n\t\tconst prefixText = hasSeparatorRow ? lines.slice(0, -1).join('\\n') : mergedRawText;\n\t\tconst line1EndsInPipe = !!prefixText.match(/\\|\\s*$/);\n\t\tconst newRawText = prefixText + (line1EndsInPipe ? '' : '|') + `\\n|${' --- |'.repeat(numCols)}`;\n\t\treturn marked.lexer(newRawText);\n\t}\n\n\treturn undefined;\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { onUnexpectedError } from '../common/errors.js';\nimport { escapeDoubleQuotes, IMarkdownString, MarkdownStringTrustedOptions, parseHrefAndDimensions, removeMarkdownEscapes } from '../common/htmlContent.js';\nimport { markdownEscapeEscapedIcons } from '../common/iconLabels.js';\nimport { defaultGenerator } from '../common/idGenerator.js';\nimport { KeyCode } from '../common/keyCodes.js';\nimport { Lazy } from '../common/lazy.js';\nimport { DisposableStore, IDisposable } from '../common/lifecycle.js';\nimport * as marked from '../common/marked/marked.js';\nimport { parse } from '../common/marshalling.js';\nimport { FileAccess, Schemas } from '../common/network.js';\nimport { cloneAndChange } from '../common/objects.js';\nimport { dirname, resolvePath } from '../common/resources.js';\nimport { escape } from '../common/strings.js';\nimport { URI, UriComponents } from '../common/uri.js';\nimport * as DOM from './dom.js';\nimport * as domSanitize from './domSanitize.js';\nimport { convertTagToPlaintext } from './domSanitize.js';\nimport { StandardKeyboardEvent } from './keyboardEvent.js';\nimport { StandardMouseEvent } from './mouseEvent.js';\nimport { renderIcon, renderLabelWithIcons } from './ui/iconLabel/iconLabels.js';\n\nexport type MarkdownActionHandler = (linkContent: string, mdStr: IMarkdownString) => void;\n\n/**\n * Options for the rendering of markdown with {@link renderMarkdown}.\n */\nexport interface MarkdownRenderOptions {\n\treadonly codeBlockRenderer?: (languageId: string, value: string) => Promise<HTMLElement>;\n\treadonly codeBlockRendererSync?: (languageId: string, value: string, raw?: string) => HTMLElement;\n\treadonly asyncRenderCallback?: () => void;\n\n\treadonly actionHandler?: MarkdownActionHandler;\n\n\treadonly fillInIncompleteTokens?: boolean;\n\n\treadonly sanitizerConfig?: MarkdownSanitizerConfig;\n\n\treadonly markedOptions?: MarkdownRendererMarkedOptions;\n\treadonly markedExtensions?: marked.MarkedExtension[];\n}\n\n/**\n * Subset of options passed to `Marked` for rendering markdown.\n */\nexport interface MarkdownRendererMarkedOptions {\n}\n\nexport interface MarkdownSanitizerConfig {\n\treadonly replaceWithPlaintext?: boolean;\n\treadonly allowedTags?: {\n\t\treadonly override: readonly string[];\n\t};\n\treadonly allowedAttributes?: {\n\t\treadonly override: ReadonlyArray<string | domSanitize.SanitizeAttributeRule>;\n\t};\n\treadonly allowedLinkSchemes?: {\n\t\treadonly augment: readonly string[];\n\t};\n\treadonly remoteImageIsAllowed?: (uri: URI) => boolean;\n}\n\nconst defaultMarkedRenderers = Object.freeze({\n\timage: ({ href, title, text }: marked.Tokens.Image): string => {\n\t\tlet dimensions: string[] = [];\n\t\tlet attributes: string[] = [];\n\t\tif (href) {\n\t\t\t({ href, dimensions } = parseHrefAndDimensions(href));\n\t\t\tattributes.push(`src=\"${escapeDoubleQuotes(href)}\"`);\n\t\t}\n\t\tif (text) {\n\t\t\tattributes.push(`alt=\"${escapeDoubleQuotes(text)}\"`);\n\t\t}\n\t\tif (title) {\n\t\t\tattributes.push(`title=\"${escapeDoubleQuotes(title)}\"`);\n\t\t}\n\t\tif (dimensions.length) {\n\t\t\tattributes = attributes.concat(dimensions);\n\t\t}\n\t\treturn '<img ' + attributes.join(' ') + '>';\n\t},\n\n\tparagraph(this: marked.Renderer, { tokens }: marked.Tokens.Paragraph): string {\n\t\treturn `<p>${this.parser.parseInline(tokens)}</p>`;\n\t},\n\n\tlink(this: marked.Renderer, { href, title, tokens }: marked.Tokens.Link): string {\n\t\tlet text = this.parser.parseInline(tokens);\n\t\tif (typeof href !== 'string') {\n\t\t\treturn '';\n\t\t}\n\n\t\t// Remove markdown escapes. Workaround for https://github.com/chjj/marked/issues/829\n\t\tif (href === text) { // raw link case\n\t\t\ttext = removeMarkdownEscapes(text);\n\t\t}\n\n\t\ttitle = typeof title === 'string' ? escapeDoubleQuotes(removeMarkdownEscapes(title)) : '';\n\t\thref = removeMarkdownEscapes(href);\n\n\t\t// HTML Encode href\n\t\thref = href.replace(/&/g, '&amp;')\n\t\t\t.replace(/</g, '&lt;')\n\t\t\t.replace(/>/g, '&gt;')\n\t\t\t.replace(/\"/g, '&quot;')\n\t\t\t.replace(/'/g, '&#39;');\n\n\t\treturn `<a href=\"${href}\" title=\"${title || href}\" draggable=\"false\">${text}</a>`;\n\t},\n});\n\n/**\n * Blockquote renderer that processes GitHub-style alert syntax.\n * Transforms blockquotes like \"> [!NOTE]\" into structured alert markup with icons.\n *\n * Based on GitHub's alert syntax: https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax#alerts\n */\nfunction createAlertBlockquoteRenderer(fallbackRenderer: (this: marked.Renderer, token: marked.Tokens.Blockquote) => string) {\n\treturn function (this: marked.Renderer, token: marked.Tokens.Blockquote): string {\n\t\tconst { tokens } = token;\n\t\t// Check if this blockquote starts with alert syntax [!TYPE]\n\t\tconst firstToken = tokens[0];\n\t\tif (firstToken?.type !== 'paragraph') {\n\t\t\treturn fallbackRenderer.call(this, token);\n\t\t}\n\n\t\tconst paragraphTokens = firstToken.tokens;\n\t\tif (!paragraphTokens || paragraphTokens.length === 0) {\n\t\t\treturn fallbackRenderer.call(this, token);\n\t\t}\n\n\t\tconst firstTextToken = paragraphTokens[0];\n\t\tif (firstTextToken?.type !== 'text') {\n\t\t\treturn fallbackRenderer.call(this, token);\n\t\t}\n\n\t\tconst pattern = /^\\s*\\[!(NOTE|TIP|IMPORTANT|WARNING|CAUTION)\\]\\s*?\\n*/i;\n\t\tconst match = firstTextToken.raw.match(pattern);\n\t\tif (!match) {\n\t\t\treturn fallbackRenderer.call(this, token);\n\t\t}\n\n\t\t// Remove the alert marker from the token\n\t\tfirstTextToken.raw = firstTextToken.raw.replace(pattern, '');\n\t\tfirstTextToken.text = firstTextToken.text.replace(pattern, '');\n\n\t\tconst alertIcons: Record<string, string> = {\n\t\t\t'note': 'info',\n\t\t\t'tip': 'light-bulb',\n\t\t\t'important': 'comment',\n\t\t\t'warning': 'alert',\n\t\t\t'caution': 'stop'\n\t\t};\n\n\t\tconst type = match[1];\n\t\tconst typeCapitalized = type.charAt(0).toUpperCase() + type.slice(1).toLowerCase();\n\t\tconst severity = type.toLowerCase();\n\t\tconst iconHtml = renderIcon({ id: alertIcons[severity] }).outerHTML;\n\n\t\t// Render the remaining content\n\t\tconst content = this.parser.parse(tokens);\n\n\t\t// Return alert markup with icon and severity (skipping the first 3 characters: `<p>`)\n\t\treturn `<blockquote data-severity=\"${severity}\"><p><span>${iconHtml}${typeCapitalized}</span>${content.substring(3)}</blockquote>\\n`;\n\t};\n}\n\nexport interface IRenderedMarkdown extends IDisposable {\n\treadonly element: HTMLElement;\n}\n\n/**\n * Low-level way create a html element from a markdown string.\n *\n * **Note** that for most cases you should be using {@link import('../../editor/browser/widget/markdownRenderer/browser/markdownRenderer.js').MarkdownRenderer MarkdownRenderer}\n * which comes with support for pretty code block rendering and which uses the default way of handling links.\n */\nexport function renderMarkdown(markdown: IMarkdownString, options: MarkdownRenderOptions = {}, target?: HTMLElement): IRenderedMarkdown {\n\tconst disposables = new DisposableStore();\n\tlet isDisposed = false;\n\n\tconst markedInstance = new marked.Marked(...(options.markedExtensions ?? []));\n\tconst { renderer, codeBlocks, syncCodeBlocks } = createMarkdownRenderer(markedInstance, options, markdown);\n\tconst value = preprocessMarkdownString(markdown);\n\n\tlet renderedMarkdown: string;\n\tif (options.fillInIncompleteTokens) {\n\t\t// The defaults are applied by parse but not lexer()/parser(), and they need to be present\n\t\tconst opts: marked.MarkedOptions = {\n\t\t\t...markedInstance.defaults,\n\t\t\t...options.markedOptions,\n\t\t\trenderer\n\t\t};\n\t\tconst tokens = markedInstance.lexer(value, opts);\n\t\tconst newTokens = fillInIncompleteTokens(tokens);\n\t\trenderedMarkdown = markedInstance.parser(newTokens, opts);\n\t} else {\n\t\trenderedMarkdown = markedInstance.parse(value, { ...options?.markedOptions, renderer, async: false });\n\t}\n\n\t// Rewrite theme icons\n\tif (markdown.supportThemeIcons) {\n\t\tconst elements = renderLabelWithIcons(renderedMarkdown);\n\t\trenderedMarkdown = elements.map(e => typeof e === 'string' ? e : e.outerHTML).join('');\n\t}\n\n\tconst renderedContent = document.createElement('div');\n\tconst sanitizerConfig = getDomSanitizerConfig(markdown, options.sanitizerConfig ?? {});\n\tdomSanitize.safeSetInnerHtml(renderedContent, renderedMarkdown, sanitizerConfig);\n\n\t// Rewrite links and images before potentially inserting them into the real dom\n\trewriteRenderedLinks(markdown, options, renderedContent);\n\n\tlet outElement: HTMLElement;\n\tif (target) {\n\t\toutElement = target;\n\t\tDOM.reset(target, ...renderedContent.childNodes);\n\t} else {\n\t\toutElement = renderedContent;\n\t}\n\n\tif (codeBlocks.length > 0) {\n\t\tPromise.all(codeBlocks).then((tuples) => {\n\t\t\tif (isDisposed) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst renderedElements = new Map(tuples);\n\t\t\t// eslint-disable-next-line no-restricted-syntax\n\t\t\tconst placeholderElements = outElement.querySelectorAll<HTMLDivElement>(`div[data-code]`);\n\t\t\tfor (const placeholderElement of placeholderElements) {\n\t\t\t\tconst renderedElement = renderedElements.get(placeholderElement.dataset['code'] ?? '');\n\t\t\t\tif (renderedElement) {\n\t\t\t\t\tDOM.reset(placeholderElement, renderedElement);\n\t\t\t\t}\n\t\t\t}\n\t\t\toptions.asyncRenderCallback?.();\n\t\t});\n\t} else if (syncCodeBlocks.length > 0) {\n\t\tconst renderedElements = new Map(syncCodeBlocks);\n\t\t// eslint-disable-next-line no-restricted-syntax\n\t\tconst placeholderElements = outElement.querySelectorAll<HTMLDivElement>(`div[data-code]`);\n\t\tfor (const placeholderElement of placeholderElements) {\n\t\t\tconst renderedElement = renderedElements.get(placeholderElement.dataset['code'] ?? '');\n\t\t\tif (renderedElement) {\n\t\t\t\tDOM.reset(placeholderElement, renderedElement);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Signal size changes for image tags\n\tif (options.asyncRenderCallback) {\n\t\t// eslint-disable-next-line no-restricted-syntax\n\t\tfor (const img of outElement.getElementsByTagName('img')) {\n\t\t\tconst listener = disposables.add(DOM.addDisposableListener(img, 'load', () => {\n\t\t\t\tlistener.dispose();\n\t\t\t\toptions.asyncRenderCallback!();\n\t\t\t}));\n\t\t}\n\t}\n\n\t// Add event listeners for links\n\tif (options.actionHandler) {\n\t\tconst clickCb = (e: PointerEvent) => {\n\t\t\tconst mouseEvent = new StandardMouseEvent(DOM.getWindow(outElement), e);\n\t\t\tif (!mouseEvent.leftButton && !mouseEvent.middleButton) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tactivateLink(markdown, options, mouseEvent);\n\t\t};\n\t\tdisposables.add(DOM.addDisposableListener(outElement, 'click', clickCb));\n\t\tdisposables.add(DOM.addDisposableListener(outElement, 'auxclick', clickCb));\n\n\t\tdisposables.add(DOM.addDisposableListener(outElement, 'keydown', (e) => {\n\t\t\tconst keyboardEvent = new StandardKeyboardEvent(e);\n\t\t\tif (!keyboardEvent.equals(KeyCode.Space) && !keyboardEvent.equals(KeyCode.Enter)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tactivateLink(markdown, options, keyboardEvent);\n\t\t}));\n\t}\n\n\t// Remove/disable inputs\n\t// eslint-disable-next-line no-restricted-syntax\n\tfor (const input of [...outElement.getElementsByTagName('input')]) {\n\t\tif (input.attributes.getNamedItem('type')?.value === 'checkbox') {\n\t\t\tinput.setAttribute('disabled', '');\n\t\t} else {\n\t\t\tif (options.sanitizerConfig?.replaceWithPlaintext) {\n\t\t\t\tconst replacement = convertTagToPlaintext(input);\n\t\t\t\tif (replacement) {\n\t\t\t\t\tinput.parentElement?.replaceChild(replacement, input);\n\t\t\t\t} else {\n\t\t\t\t\tinput.remove();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tinput.remove();\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\telement: outElement,\n\t\tdispose: () => {\n\t\t\tisDisposed = true;\n\t\t\tdisposables.dispose();\n\t\t}\n\t};\n}\n\nfunction rewriteRenderedLinks(markdown: IMarkdownString, options: MarkdownRenderOptions, root: HTMLElement) {\n\t// eslint-disable-next-line no-restricted-syntax\n\tfor (const el of root.querySelectorAll('img, audio, video, source')) {\n\t\tconst src = el.getAttribute('src'); // Get the raw 'src' attribute value as text, not the resolved 'src'\n\t\tif (src) {\n\t\t\tlet href = src;\n\t\t\ttry {\n\t\t\t\tif (markdown.baseUri) { // absolute or relative local path, or file: uri\n\t\t\t\t\thref = resolveWithBaseUri(URI.from(markdown.baseUri), href);\n\t\t\t\t}\n\t\t\t} catch (err) { }\n\n\t\t\tel.setAttribute('src', massageHref(markdown, href, true));\n\n\t\t\tif (options.sanitizerConfig?.remoteImageIsAllowed) {\n\t\t\t\tconst uri = URI.parse(href);\n\t\t\t\tif (uri.scheme !== Schemas.file && uri.scheme !== Schemas.data && !options.sanitizerConfig.remoteImageIsAllowed(uri)) {\n\t\t\t\t\tel.replaceWith(DOM.$('', undefined, el.outerHTML));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// eslint-disable-next-line no-restricted-syntax\n\tfor (const el of root.querySelectorAll('a')) {\n\t\tconst href = el.getAttribute('href'); // Get the raw 'href' attribute value as text, not the resolved 'href'\n\t\tel.setAttribute('href', ''); // Clear out href. We use the `data-href` for handling clicks instead\n\t\tif (!href\n\t\t\t|| /^data:|javascript:/i.test(href)\n\t\t\t|| (/^command:/i.test(href) && !markdown.isTrusted)\n\t\t\t|| /^command:(\\/\\/\\/)?_workbench\\.downloadResource/i.test(href)) {\n\t\t\t// drop the link\n\t\t\tel.replaceWith(...el.childNodes);\n\t\t} else {\n\t\t\tlet resolvedHref = massageHref(markdown, href, false);\n\t\t\tif (markdown.baseUri) {\n\t\t\t\tresolvedHref = resolveWithBaseUri(URI.from(markdown.baseUri), href);\n\t\t\t}\n\t\t\tel.dataset.href = resolvedHref;\n\t\t}\n\t}\n}\n\nfunction createMarkdownRenderer(marked: marked.Marked, options: MarkdownRenderOptions, markdown: IMarkdownString): { renderer: marked.Renderer; codeBlocks: Promise<[string, HTMLElement]>[]; syncCodeBlocks: [string, HTMLElement][] } {\n\tconst renderer = new marked.Renderer(options.markedOptions);\n\trenderer.image = defaultMarkedRenderers.image;\n\trenderer.link = defaultMarkedRenderers.link;\n\trenderer.paragraph = defaultMarkedRenderers.paragraph;\n\n\tif (markdown.supportAlertSyntax) {\n\t\trenderer.blockquote = createAlertBlockquoteRenderer(renderer.blockquote);\n\t}\n\n\t// Will collect [id, renderedElement] tuples\n\tconst codeBlocks: Promise<[string, HTMLElement]>[] = [];\n\tconst syncCodeBlocks: [string, HTMLElement][] = [];\n\n\tif (options.codeBlockRendererSync) {\n\t\trenderer.code = ({ text, lang, raw }: marked.Tokens.Code) => {\n\t\t\tconst id = defaultGenerator.nextId();\n\t\t\tconst value = options.codeBlockRendererSync!(postProcessCodeBlockLanguageId(lang), text, raw);\n\t\t\tsyncCodeBlocks.push([id, value]);\n\t\t\treturn `<div class=\"code\" data-code=\"${id}\">${escape(text)}</div>`;\n\t\t};\n\t} else if (options.codeBlockRenderer) {\n\t\trenderer.code = ({ text, lang }: marked.Tokens.Code) => {\n\t\t\tconst id = defaultGenerator.nextId();\n\t\t\tconst value = options.codeBlockRenderer!(postProcessCodeBlockLanguageId(lang), text);\n\t\t\tcodeBlocks.push(value.then(element => [id, element]));\n\t\t\treturn `<div class=\"code\" data-code=\"${id}\">${escape(text)}</div>`;\n\t\t};\n\t}\n\n\tif (!markdown.supportHtml) {\n\t\t// Note: we always pass the output through dompurify after this so that we don't rely on\n\t\t// marked for real sanitization.\n\t\trenderer.html = ({ text }) => {\n\t\t\tif (options.sanitizerConfig?.replaceWithPlaintext) {\n\t\t\t\treturn escape(text);\n\t\t\t}\n\n\t\t\tconst match = markdown.isTrusted ? text.match(/^(<span[^>]+>)|(<\\/\\s*span>)$/) : undefined;\n\t\t\treturn match ? text : '';\n\t\t};\n\t}\n\treturn { renderer, codeBlocks, syncCodeBlocks };\n}\n\nfunction preprocessMarkdownString(markdown: IMarkdownString) {\n\tlet value = markdown.value;\n\n\t// values that are too long will freeze the UI\n\tif (value.length > 100_000) {\n\t\tvalue = `${value.substr(0, 100_000)}…`;\n\t}\n\n\t// escape theme icons\n\tif (markdown.supportThemeIcons) {\n\t\tvalue = markdownEscapeEscapedIcons(value);\n\t}\n\n\treturn value;\n}\n\nfunction activateLink(mdStr: IMarkdownString, options: MarkdownRenderOptions, event: StandardMouseEvent | StandardKeyboardEvent): void {\n\tconst target = event.target.closest('a[data-href]');\n\tif (!DOM.isHTMLElement(target)) {\n\t\treturn;\n\t}\n\n\ttry {\n\t\tlet href = target.dataset['href'];\n\t\tif (href) {\n\t\t\tif (mdStr.baseUri) {\n\t\t\t\thref = resolveWithBaseUri(URI.from(mdStr.baseUri), href);\n\t\t\t}\n\t\t\toptions.actionHandler?.(href, mdStr);\n\t\t}\n\t} catch (err) {\n\t\tonUnexpectedError(err);\n\t} finally {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t}\n}\n\nfunction uriMassage(markdown: IMarkdownString, part: string): string {\n\tlet data: unknown;\n\ttry {\n\t\tdata = parse(decodeURIComponent(part));\n\t} catch (e) {\n\t\t// ignore\n\t}\n\tif (!data) {\n\t\treturn part;\n\t}\n\tdata = cloneAndChange(data, value => {\n\t\tif (markdown.uris && markdown.uris[value]) {\n\t\t\treturn URI.revive(markdown.uris[value]);\n\t\t} else {\n\t\t\treturn undefined;\n\t\t}\n\t});\n\treturn encodeURIComponent(JSON.stringify(data));\n}\n\nfunction massageHref(markdown: IMarkdownString, href: string, isDomUri: boolean): string {\n\tconst data = markdown.uris && markdown.uris[href];\n\tlet uri = URI.revive(data);\n\tif (isDomUri) {\n\t\tif (href.startsWith(Schemas.data + ':')) {\n\t\t\treturn href;\n\t\t}\n\t\tif (!uri) {\n\t\t\turi = URI.parse(href);\n\t\t}\n\t\t// this URI will end up as \"src\"-attribute of a dom node\n\t\t// and because of that special rewriting needs to be done\n\t\t// so that the URI uses a protocol that's understood by\n\t\t// browsers (like http or https)\n\t\treturn FileAccess.uriToBrowserUri(uri).toString(true);\n\t}\n\tif (!uri) {\n\t\treturn href;\n\t}\n\tif (URI.parse(href).toString() === uri.toString()) {\n\t\treturn href; // no transformation performed\n\t}\n\tif (uri.query) {\n\t\turi = uri.with({ query: uriMassage(markdown, uri.query) });\n\t}\n\treturn uri.toString();\n}\n\nfunction postProcessCodeBlockLanguageId(lang: string | undefined): string {\n\tif (!lang) {\n\t\treturn '';\n\t}\n\n\tconst parts = lang.split(/[\\s+|:|,|\\{|\\?]/, 1);\n\tif (parts.length) {\n\t\treturn parts[0];\n\t}\n\treturn lang;\n}\n\nfunction resolveWithBaseUri(baseUri: URI, href: string): string {\n\tconst hasScheme = /^\\w[\\w\\d+.-]*:/.test(href);\n\tif (hasScheme) {\n\t\treturn href;\n\t}\n\n\tif (baseUri.path.endsWith('/')) {\n\t\treturn resolvePath(baseUri, href).toString();\n\t} else {\n\t\treturn resolvePath(dirname(baseUri), href).toString();\n\t}\n}\n\ntype MdStrConfig = {\n\treadonly isTrusted?: boolean | MarkdownStringTrustedOptions;\n\treadonly baseUri?: UriComponents;\n};\n\nfunction sanitizeRenderedMarkdown(\n\trenderedMarkdown: string,\n\toriginalMdStrConfig: MdStrConfig,\n\toptions: MarkdownSanitizerConfig = {},\n): TrustedHTML {\n\tconst sanitizerConfig = getDomSanitizerConfig(originalMdStrConfig, options);\n\treturn domSanitize.sanitizeHtml(renderedMarkdown, sanitizerConfig);\n}\n\nexport const allowedMarkdownHtmlTags = Object.freeze([\n\t...domSanitize.basicMarkupHtmlTags,\n\t'input', // Allow inputs for rendering checkboxes. Other types of inputs are removed and the inputs are always disabled\n]);\n\nexport const allowedMarkdownHtmlAttributes = Object.freeze<Array<string | domSanitize.SanitizeAttributeRule>>([\n\t'align',\n\t'autoplay',\n\t'alt',\n\t'colspan',\n\t'controls',\n\t'draggable',\n\t'height',\n\t'href',\n\t'loop',\n\t'muted',\n\t'playsinline',\n\t'poster',\n\t'rowspan',\n\t'src',\n\t'target',\n\t'title',\n\t'type',\n\t'width',\n\t'start',\n\n\t// Input (For disabled inputs)\n\t'checked',\n\t'disabled',\n\t'value',\n\n\t// Custom markdown attributes\n\t'data-code',\n\t'data-href',\n\t'data-severity',\n\n\t// Only allow very specific styles\n\t{\n\t\tattributeName: 'style',\n\t\tshouldKeep: (element, data) => {\n\t\t\tif (element.tagName === 'SPAN') {\n\t\t\t\tif (data.attrName === 'style') {\n\t\t\t\t\treturn /^(color\\:(#[0-9a-fA-F]+|var\\(--vscode(-[a-zA-Z0-9]+)+\\));)?(background-color\\:(#[0-9a-fA-F]+|var\\(--vscode(-[a-zA-Z0-9]+)+\\));)?(border-radius:[0-9]+px;)?$/.test(data.attrValue);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t},\n\n\t// Only allow codicons for classes\n\t{\n\t\tattributeName: 'class',\n\t\tshouldKeep: (element, data) => {\n\t\t\tif (element.tagName === 'SPAN') {\n\t\t\t\tif (data.attrName === 'class') {\n\t\t\t\t\treturn /^codicon codicon-[a-z\\-]+( codicon-modifier-[a-z\\-]+)?$/.test(data.attrValue);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t},\n]);\n\nfunction getDomSanitizerConfig(mdStrConfig: MdStrConfig, options: MarkdownSanitizerConfig): domSanitize.DomSanitizerConfig {\n\tconst isTrusted = mdStrConfig.isTrusted ?? false;\n\tconst allowedLinkSchemes = [\n\t\tSchemas.http,\n\t\tSchemas.https,\n\t\tSchemas.mailto,\n\t\tSchemas.file,\n\t\tSchemas.vscodeFileResource,\n\t\tSchemas.vscodeRemote,\n\t\tSchemas.vscodeRemoteResource,\n\t\tSchemas.vscodeNotebookCell,\n\t\t// For links that are handled entirely by the action handler\n\t\tSchemas.internal,\n\t];\n\n\tif (isTrusted) {\n\t\tallowedLinkSchemes.push(Schemas.command);\n\t}\n\n\tif (options.allowedLinkSchemes?.augment) {\n\t\tallowedLinkSchemes.push(...options.allowedLinkSchemes.augment);\n\t}\n\n\treturn {\n\t\t// allowedTags should included everything that markdown renders to.\n\t\t// Since we have our own sanitize function for marked, it's possible we missed some tag so let dompurify make sure.\n\t\t// HTML tags that can result from markdown are from reading https://spec.commonmark.org/0.29/\n\t\t// HTML table tags that can result from markdown are from https://github.github.com/gfm/#tables-extension-\n\t\tallowedTags: {\n\t\t\toverride: options.allowedTags?.override ?? allowedMarkdownHtmlTags\n\t\t},\n\t\tallowedAttributes: {\n\t\t\toverride: options.allowedAttributes?.override ?? allowedMarkdownHtmlAttributes,\n\t\t},\n\t\tallowedLinkProtocols: {\n\t\t\toverride: allowedLinkSchemes,\n\t\t},\n\t\tallowRelativeLinkPaths: !!mdStrConfig.baseUri,\n\t\tallowedMediaProtocols: {\n\t\t\toverride: [\n\t\t\t\tSchemas.http,\n\t\t\t\tSchemas.https,\n\t\t\t\tSchemas.data,\n\t\t\t\tSchemas.file,\n\t\t\t\tSchemas.vscodeFileResource,\n\t\t\t\tSchemas.vscodeRemote,\n\t\t\t\tSchemas.vscodeRemoteResource,\n\t\t\t]\n\t\t},\n\t\tallowRelativeMediaPaths: !!mdStrConfig.baseUri,\n\t\treplaceWithPlaintext: options.replaceWithPlaintext,\n\t};\n}\n\n/**\n * Renders `str` as plaintext, stripping out Markdown syntax if it's a {@link IMarkdownString}.\n *\n * For example `# Header` would be output as `Header`.\n */\nexport function renderAsPlaintext(str: IMarkdownString | string, options?: {\n\t/** Controls if the ``` of code blocks should be preserved in the output or not */\n\treadonly includeCodeBlocksFences?: boolean;\n}) {\n\tif (typeof str === 'string') {\n\t\treturn str;\n\t}\n\n\t// values that are too long will freeze the UI\n\tlet value = str.value ?? '';\n\tif (value.length > 100_000) {\n\t\tvalue = `${value.substr(0, 100_000)}…`;\n\t}\n\n\tconst html = marked.parse(value, { async: false, renderer: options?.includeCodeBlocksFences ? plainTextWithCodeBlocksRenderer.value : plainTextRenderer.value });\n\treturn sanitizeRenderedMarkdown(html, { isTrusted: false }, {})\n\t\t.toString()\n\t\t.replace(/&(#\\d+|[a-zA-Z]+);/g, m => unescapeInfo.get(m) ?? m)\n\t\t.trim();\n}\n\nconst unescapeInfo = new Map<string, string>([\n\t['&quot;', '\"'],\n\t['&nbsp;', ' '],\n\t['&amp;', '&'],\n\t['&#39;', '\\''],\n\t['&lt;', '<'],\n\t['&gt;', '>'],\n]);\n\nfunction createPlainTextRenderer(): marked.Renderer {\n\tconst renderer = new marked.Renderer();\n\n\trenderer.code = ({ text }: marked.Tokens.Code): string => {\n\t\treturn escape(text);\n\t};\n\trenderer.blockquote = ({ text }: marked.Tokens.Blockquote): string => {\n\t\treturn text + '\\n';\n\t};\n\trenderer.html = (_: marked.Tokens.HTML): string => {\n\t\treturn '';\n\t};\n\trenderer.heading = function ({ tokens }: marked.Tokens.Heading): string {\n\t\treturn this.parser.parseInline(tokens) + '\\n';\n\t};\n\trenderer.hr = (): string => {\n\t\treturn '';\n\t};\n\trenderer.list = function ({ items }: marked.Tokens.List): string {\n\t\treturn items.map(x => this.listitem(x)).join('\\n') + '\\n';\n\t};\n\trenderer.listitem = ({ text }: marked.Tokens.ListItem): string => {\n\t\treturn text + '\\n';\n\t};\n\trenderer.paragraph = function ({ tokens }: marked.Tokens.Paragraph): string {\n\t\treturn this.parser.parseInline(tokens) + '\\n';\n\t};\n\trenderer.table = function ({ header, rows }: marked.Tokens.Table): string {\n\t\treturn header.map(cell => this.tablecell(cell)).join(' ') + '\\n' + rows.map(cells => cells.map(cell => this.tablecell(cell)).join(' ')).join('\\n') + '\\n';\n\t};\n\trenderer.tablerow = ({ text }: marked.Tokens.TableRow): string => {\n\t\treturn text;\n\t};\n\trenderer.tablecell = function ({ tokens }: marked.Tokens.TableCell): string {\n\t\treturn this.parser.parseInline(tokens);\n\t};\n\trenderer.strong = ({ text }: marked.Tokens.Strong): string => {\n\t\treturn text;\n\t};\n\trenderer.em = ({ text }: marked.Tokens.Em): string => {\n\t\treturn text;\n\t};\n\trenderer.codespan = ({ text }: marked.Tokens.Codespan): string => {\n\t\treturn escape(text);\n\t};\n\trenderer.br = (_: marked.Tokens.Br): string => {\n\t\treturn '\\n';\n\t};\n\trenderer.del = ({ text }: marked.Tokens.Del): string => {\n\t\treturn text;\n\t};\n\trenderer.image = (_: marked.Tokens.Image): string => {\n\t\treturn '';\n\t};\n\trenderer.text = ({ text }: marked.Tokens.Text): string => {\n\t\treturn text;\n\t};\n\trenderer.link = ({ text }: marked.Tokens.Link): string => {\n\t\treturn text;\n\t};\n\treturn renderer;\n}\nconst plainTextRenderer = new Lazy<marked.Renderer>(createPlainTextRenderer);\n\nconst plainTextWithCodeBlocksRenderer = new Lazy<marked.Renderer>(() => {\n\tconst renderer = createPlainTextRenderer();\n\trenderer.code = ({ text }: marked.Tokens.Code): string => {\n\t\treturn `\\n\\`\\`\\`\\n${escape(text)}\\n\\`\\`\\`\\n`;\n\t};\n\treturn renderer;\n});\n\nfunction mergeRawTokenText(tokens: marked.Token[]): string {\n\tlet mergedTokenText = '';\n\ttokens.forEach(token => {\n\t\tmergedTokenText += token.raw;\n\t});\n\treturn mergedTokenText;\n}\n\nfunction completeSingleLinePattern(token: marked.Tokens.Text | marked.Tokens.Paragraph): marked.Token | undefined {\n\tif (!token.tokens) {\n\t\treturn undefined;\n\t}\n\n\tfor (let i = token.tokens.length - 1; i >= 0; i--) {\n\t\tconst subtoken = token.tokens[i];\n\t\tif (subtoken.type === 'text') {\n\t\t\tconst lines = subtoken.raw.split('\\n');\n\t\t\tconst lastLine = lines[lines.length - 1];\n\t\t\tif (lastLine.includes('`')) {\n\t\t\t\treturn completeCodespan(token);\n\t\t\t}\n\n\t\t\telse if (lastLine.includes('**')) {\n\t\t\t\treturn completeDoublestar(token);\n\t\t\t}\n\n\t\t\telse if (lastLine.match(/\\*\\w/)) {\n\t\t\t\treturn completeStar(token);\n\t\t\t}\n\n\t\t\telse if (lastLine.match(/(^|\\s)__\\w/)) {\n\t\t\t\treturn completeDoubleUnderscore(token);\n\t\t\t}\n\n\t\t\telse if (lastLine.match(/(^|\\s)_\\w/)) {\n\t\t\t\treturn completeUnderscore(token);\n\t\t\t}\n\n\t\t\telse if (\n\t\t\t\t// Text with start of link target\n\t\t\t\thasLinkTextAndStartOfLinkTarget(lastLine) ||\n\t\t\t\t// This token doesn't have the link text, eg if it contains other markdown constructs that are in other subtokens.\n\t\t\t\t// But some preceding token does have an unbalanced [ at least\n\t\t\t\thasStartOfLinkTargetAndNoLinkText(lastLine) && token.tokens.slice(0, i).some(t => t.type === 'text' && t.raw.match(/\\[[^\\]]*$/))\n\t\t\t) {\n\t\t\t\tconst nextTwoSubTokens = token.tokens.slice(i + 1);\n\n\t\t\t\t// A markdown link can look like\n\t\t\t\t// [link text](https://microsoft.com \"more text\")\n\t\t\t\t// Where \"more text\" is a title for the link or an argument to a vscode command link\n\t\t\t\tif (\n\t\t\t\t\t// If the link was parsed as a link, then look for a link token and a text token with a quote\n\t\t\t\t\tnextTwoSubTokens[0]?.type === 'link' && nextTwoSubTokens[1]?.type === 'text' && nextTwoSubTokens[1].raw.match(/^ *\"[^\"]*$/) ||\n\t\t\t\t\t// And if the link was not parsed as a link (eg command link), just look for a single quote in this token\n\t\t\t\t\tlastLine.match(/^[^\"]* +\"[^\"]*$/)\n\t\t\t\t) {\n\n\t\t\t\t\treturn completeLinkTargetArg(token);\n\t\t\t\t}\n\t\t\t\treturn completeLinkTarget(token);\n\t\t\t}\n\n\t\t\t// Contains the start of link text, and no following tokens contain the link target\n\t\t\telse if (lastLine.match(/(^|\\s)\\[\\w*[^\\]]*$/)) {\n\t\t\t\treturn completeLinkText(token);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn undefined;\n}\n\nfunction hasLinkTextAndStartOfLinkTarget(str: string): boolean {\n\treturn !!str.match(/(^|\\s)\\[.*\\]\\(\\w*/);\n}\n\nfunction hasStartOfLinkTargetAndNoLinkText(str: string): boolean {\n\treturn !!str.match(/^[^\\[]*\\]\\([^\\)]*$/);\n}\n\nfunction completeListItemPattern(list: marked.Tokens.List): marked.Tokens.List | undefined {\n\t// Patch up this one list item\n\tconst lastListItem = list.items[list.items.length - 1];\n\tconst lastListSubToken = lastListItem.tokens ? lastListItem.tokens[lastListItem.tokens.length - 1] : undefined;\n\n\t/*\n\tExample list token structures:\n\n\tlist\n\t\tlist_item\n\t\t\ttext\n\t\t\t\ttext\n\t\t\t\tcodespan\n\t\t\t\tlink\n\t\tlist_item\n\t\t\ttext\n\t\t\tcode // Complete indented codeblock\n\t\tlist_item\n\t\t\ttext\n\t\t\tspace\n\t\t\ttext\n\t\t\t\ttext // Incomplete indented codeblock\n\t\tlist_item\n\t\t\ttext\n\t\t\tlist // Nested list\n\t\t\t\tlist_item\n\t\t\t\t\ttext\n\t\t\t\t\t\ttext\n\n\tContrast with paragraph:\n\tparagraph\n\t\ttext\n\t\tcodespan\n\t*/\n\n\tconst listEndsInHeading = (list: marked.Tokens.List): boolean => {\n\t\t// A list item can be rendered as a heading for some reason when it has a subitem where we haven't rendered the text yet like this:\n\t\t// 1. list item\n\t\t// -\n\t\tconst lastItem = list.items.at(-1);\n\t\tconst lastToken = lastItem?.tokens.at(-1);\n\t\treturn lastToken?.type === 'heading' || lastToken?.type === 'list' && listEndsInHeading(lastToken as marked.Tokens.List);\n\t};\n\n\tlet newToken: marked.Token | undefined;\n\tif (lastListSubToken?.type === 'text' && !('inRawBlock' in lastListItem)) { // Why does Tag have a type of 'text'\n\t\tnewToken = completeSingleLinePattern(lastListSubToken as marked.Tokens.Text);\n\t} else if (listEndsInHeading(list)) {\n\t\tconst newList = marked.lexer(list.raw.trim() + ' &nbsp;')[0] as marked.Tokens.List;\n\t\tif (newList.type !== 'list') {\n\t\t\t// Something went wrong\n\t\t\treturn;\n\t\t}\n\t\treturn newList;\n\t}\n\n\tif (!newToken || newToken.type !== 'paragraph') { // 'text' item inside the list item turns into paragraph\n\t\t// Nothing to fix, or not a pattern we were expecting\n\t\treturn;\n\t}\n\n\tconst previousListItemsText = mergeRawTokenText(list.items.slice(0, -1));\n\n\t// Grabbing the `- ` or `1. ` or `* ` off the list item because I can't find a better way to do this\n\tconst lastListItemLead = lastListItem.raw.match(/^(\\s*(-|\\d+\\.|\\*) +)/)?.[0];\n\tif (!lastListItemLead) {\n\t\t// Is badly formatted\n\t\treturn;\n\t}\n\n\tconst newListItemText = lastListItemLead +\n\t\tmergeRawTokenText(lastListItem.tokens.slice(0, -1)) +\n\t\tnewToken.raw;\n\n\tconst newList = marked.lexer(previousListItemsText + newListItemText)[0] as marked.Tokens.List;\n\tif (newList.type !== 'list') {\n\t\t// Something went wrong\n\t\treturn;\n\t}\n\n\treturn newList;\n}\n\nfunction completeHeading(token: marked.Tokens.Heading, fullRawText: string): marked.TokensList | void {\n\tif (token.raw.match(/-\\s*$/)) {\n\t\treturn marked.lexer(fullRawText + ' &nbsp;');\n\t}\n}\n\nconst maxIncompleteTokensFixRounds = 3;\nexport function fillInIncompleteTokens(tokens: marked.TokensList): marked.TokensList {\n\tfor (let i = 0; i < maxIncompleteTokensFixRounds; i++) {\n\t\tconst newTokens = fillInIncompleteTokensOnce(tokens);\n\t\tif (newTokens) {\n\t\t\ttokens = newTokens;\n\t\t} else {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn tokens;\n}\n\nfunction fillInIncompleteTokensOnce(tokens: marked.TokensList): marked.TokensList | null {\n\tlet i: number;\n\tlet newTokens: marked.Token[] | undefined;\n\tfor (i = 0; i < tokens.length; i++) {\n\t\tconst token = tokens[i];\n\n\t\tif (token.type === 'paragraph' && token.raw.match(/(\\n|^)\\|/)) {\n\t\t\tnewTokens = completeTable(tokens.slice(i));\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tconst lastToken = tokens.at(-1);\n\tif (!newTokens && lastToken?.type === 'list') {\n\t\tconst newListToken = completeListItemPattern(lastToken as marked.Tokens.List);\n\t\tif (newListToken) {\n\t\t\tnewTokens = [newListToken];\n\t\t\ti = tokens.length - 1;\n\t\t}\n\t}\n\n\tif (!newTokens && lastToken?.type === 'paragraph') {\n\t\t// Only operates on a single token, because any newline that follows this should break these patterns\n\t\tconst newToken = completeSingleLinePattern(lastToken as marked.Tokens.Paragraph);\n\t\tif (newToken) {\n\t\t\tnewTokens = [newToken];\n\t\t\ti = tokens.length - 1;\n\t\t}\n\t}\n\n\tif (newTokens) {\n\t\tconst newTokensList = [\n\t\t\t...tokens.slice(0, i),\n\t\t\t...newTokens\n\t\t];\n\t\t(newTokensList as marked.TokensList).links = tokens.links;\n\t\treturn newTokensList as marked.TokensList;\n\t}\n\n\tif (lastToken?.type === 'heading') {\n\t\tconst completeTokens = completeHeading(lastToken as marked.Tokens.Heading, mergeRawTokenText(tokens));\n\t\tif (completeTokens) {\n\t\t\treturn completeTokens;\n\t\t}\n\t}\n\n\treturn null;\n}\n\n\nfunction completeCodespan(token: marked.Token): marked.Token {\n\treturn completeWithString(token, '`');\n}\n\nfunction completeStar(tokens: marked.Token): marked.Token {\n\treturn completeWithString(tokens, '*');\n}\n\nfunction completeUnderscore(tokens: marked.Token): marked.Token {\n\treturn completeWithString(tokens, '_');\n}\n\nfunction completeLinkTarget(tokens: marked.Token): marked.Token {\n\treturn completeWithString(tokens, ')', false);\n}\n\nfunction completeLinkTargetArg(tokens: marked.Token): marked.Token {\n\treturn completeWithString(tokens, '\")', false);\n}\n\nfunction completeLinkText(tokens: marked.Token): marked.Token {\n\treturn completeWithString(tokens, '](https://microsoft.com)', false);\n}\n\nfunction completeDoublestar(tokens: marked.Token): marked.Token {\n\treturn completeWithString(tokens, '**');\n}\n\nfunction completeDoubleUnderscore(tokens: marked.Token): marked.Token {\n\treturn completeWithString(tokens, '__');\n}\n\nfunction completeWithString(tokens: marked.Token[] | marked.Token, closingString: string, shouldTrim = true): marked.Token {\n\tconst mergedRawText = mergeRawTokenText(Array.isArray(tokens) ? tokens : [tokens]);\n\n\t// If it was completed correctly, this should be a single token.\n\t// Expecting either a Paragraph or a List\n\tconst trimmedRawText = shouldTrim ? mergedRawText.trimEnd() : mergedRawText;\n\treturn marked.lexer(trimmedRawText + closingString)[0];\n}\n\nfunction completeTable(tokens: marked.Token[]): marked.Token[] | undefined {\n\tconst mergedRawText = mergeRawTokenText(tokens);\n\tconst lines = mergedRawText.split('\\n');\n\n\tlet numCols: number | undefined; // The number of line1 col headers\n\tlet hasSeparatorRow = false;\n\tfor (let i = 0; i < lines.length; i++) {\n\t\tconst line = lines[i].trim();\n\t\tif (typeof numCols === 'undefined' && line.match(/^\\s*\\|/)) {\n\t\t\tconst line1Matches = line.match(/(\\|[^\\|]+)(?=\\||$)/g);\n\t\t\tif (line1Matches) {\n\t\t\t\tnumCols = line1Matches.length;\n\t\t\t}\n\t\t} else if (typeof numCols === 'number') {\n\t\t\tif (line.match(/^\\s*\\|/)) {\n\t\t\t\tif (i !== lines.length - 1) {\n\t\t\t\t\t// We got the line1 header row, and the line2 separator row, but there are more lines, and it wasn't parsed as a table!\n\t\t\t\t\t// That's strange and means that the table is probably malformed in the source, so I won't try to patch it up.\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\n\t\t\t\t// Got a line2 separator row- partial or complete, doesn't matter, we'll replace it with a correct one\n\t\t\t\thasSeparatorRow = true;\n\t\t\t} else {\n\t\t\t\t// The line after the header row isn't a valid separator row, so the table is malformed, don't fix it up\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (typeof numCols === 'number' && numCols > 0) {\n\t\tconst prefixText = hasSeparatorRow ? lines.slice(0, -1).join('\\n') : mergedRawText;\n\t\tconst line1EndsInPipe = !!prefixText.match(/\\|\\s*$/);\n\t\tconst newRawText = prefixText + (line1EndsInPipe ? '' : '|') + `\\n|${' --- |'.repeat(numCols)}`;\n\t\treturn marked.lexer(newRawText);\n\t}\n\n\treturn undefined;\n}\n"]}
1
+ {"version":3,"sources":["file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src/vs/base/browser/markdownRenderer.ts","vs/base/browser/markdownRenderer.ts"],"names":[],"mappings":"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","file":"markdownRenderer.js","sourceRoot":"file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { onUnexpectedError } from '../common/errors.js';\nimport { escapeDoubleQuotes, IMarkdownString, MarkdownStringTrustedOptions, parseHrefAndDimensions, removeMarkdownEscapes } from '../common/htmlContent.js';\nimport { markdownEscapeEscapedIcons } from '../common/iconLabels.js';\nimport { defaultGenerator } from '../common/idGenerator.js';\nimport { KeyCode } from '../common/keyCodes.js';\nimport { DisposableStore, IDisposable } from '../common/lifecycle.js';\nimport * as marked from '../common/marked/marked.js';\nimport { parse } from '../common/marshalling.js';\nimport { FileAccess, Schemas } from '../common/network.js';\nimport { cloneAndChange } from '../common/objects.js';\nimport { basename as pathBasename } from '../common/path.js';\nimport { basename, dirname, resolvePath } from '../common/resources.js';\nimport { escape } from '../common/strings.js';\nimport { URI, UriComponents } from '../common/uri.js';\nimport * as DOM from './dom.js';\nimport * as domSanitize from './domSanitize.js';\nimport { convertTagToPlaintext } from './domSanitize.js';\nimport { StandardKeyboardEvent } from './keyboardEvent.js';\nimport { StandardMouseEvent } from './mouseEvent.js';\nimport { renderIcon, renderLabelWithIcons } from './ui/iconLabel/iconLabels.js';\n\nexport type MarkdownActionHandler = (linkContent: string, mdStr: IMarkdownString) => void;\n\n/**\n * Options for the rendering of markdown with {@link renderMarkdown}.\n */\nexport interface MarkdownRenderOptions {\n\treadonly codeBlockRenderer?: (languageId: string, value: string) => Promise<HTMLElement>;\n\treadonly codeBlockRendererSync?: (languageId: string, value: string, raw?: string) => HTMLElement;\n\treadonly asyncRenderCallback?: () => void;\n\n\treadonly actionHandler?: MarkdownActionHandler;\n\n\treadonly fillInIncompleteTokens?: boolean;\n\n\treadonly sanitizerConfig?: MarkdownSanitizerConfig;\n\n\treadonly markedOptions?: MarkdownRendererMarkedOptions;\n\treadonly markedExtensions?: marked.MarkedExtension[];\n}\n\n/**\n * Subset of options passed to `Marked` for rendering markdown.\n */\nexport interface MarkdownRendererMarkedOptions {\n}\n\nexport interface MarkdownSanitizerConfig {\n\treadonly replaceWithPlaintext?: boolean;\n\treadonly allowedTags?: {\n\t\treadonly override: readonly string[];\n\t};\n\treadonly allowedAttributes?: {\n\t\treadonly override: ReadonlyArray<string | domSanitize.SanitizeAttributeRule>;\n\t};\n\treadonly allowedLinkSchemes?: {\n\t\treadonly augment: readonly string[];\n\t};\n\treadonly remoteImageIsAllowed?: (uri: URI) => boolean;\n}\n\nconst defaultMarkedRenderers = Object.freeze({\n\timage: ({ href, title, text }: marked.Tokens.Image): string => {\n\t\tlet dimensions: string[] = [];\n\t\tlet attributes: string[] = [];\n\t\tif (href) {\n\t\t\t({ href, dimensions } = parseHrefAndDimensions(href));\n\t\t\tattributes.push(`src=\"${escapeDoubleQuotes(href)}\"`);\n\t\t}\n\t\tif (text) {\n\t\t\tattributes.push(`alt=\"${escapeDoubleQuotes(text)}\"`);\n\t\t}\n\t\tif (title) {\n\t\t\tattributes.push(`title=\"${escapeDoubleQuotes(title)}\"`);\n\t\t}\n\t\tif (dimensions.length) {\n\t\t\tattributes = attributes.concat(dimensions);\n\t\t}\n\t\treturn '<img ' + attributes.join(' ') + '>';\n\t},\n\n\tparagraph(this: marked.Renderer, { tokens }: marked.Tokens.Paragraph): string {\n\t\treturn `<p>${this.parser.parseInline(tokens)}</p>`;\n\t},\n\n\tlink(this: marked.Renderer, { href, title, tokens }: marked.Tokens.Link): string {\n\t\tlet text = this.parser.parseInline(tokens);\n\t\tif (typeof href !== 'string') {\n\t\t\treturn '';\n\t\t}\n\n\t\t// Remove markdown escapes. Workaround for https://github.com/chjj/marked/issues/829\n\t\tif (href === text) { // raw link case\n\t\t\ttext = removeMarkdownEscapes(text);\n\t\t}\n\n\t\ttitle = typeof title === 'string' ? escapeDoubleQuotes(removeMarkdownEscapes(title)) : '';\n\t\thref = removeMarkdownEscapes(href);\n\n\t\t// HTML Encode href\n\t\thref = href.replace(/&/g, '&amp;')\n\t\t\t.replace(/</g, '&lt;')\n\t\t\t.replace(/>/g, '&gt;')\n\t\t\t.replace(/\"/g, '&quot;')\n\t\t\t.replace(/'/g, '&#39;');\n\n\t\treturn `<a href=\"${href}\" title=\"${title || href}\" draggable=\"false\">${text}</a>`;\n\t},\n});\n\n/**\n * Blockquote renderer that processes GitHub-style alert syntax.\n * Transforms blockquotes like \"> [!NOTE]\" into structured alert markup with icons.\n *\n * Based on GitHub's alert syntax: https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax#alerts\n */\nfunction createAlertBlockquoteRenderer(fallbackRenderer: (this: marked.Renderer, token: marked.Tokens.Blockquote) => string) {\n\treturn function (this: marked.Renderer, token: marked.Tokens.Blockquote): string {\n\t\tconst { tokens } = token;\n\t\t// Check if this blockquote starts with alert syntax [!TYPE]\n\t\tconst firstToken = tokens[0];\n\t\tif (firstToken?.type !== 'paragraph') {\n\t\t\treturn fallbackRenderer.call(this, token);\n\t\t}\n\n\t\tconst paragraphTokens = firstToken.tokens;\n\t\tif (!paragraphTokens || paragraphTokens.length === 0) {\n\t\t\treturn fallbackRenderer.call(this, token);\n\t\t}\n\n\t\tconst firstTextToken = paragraphTokens[0];\n\t\tif (firstTextToken?.type !== 'text') {\n\t\t\treturn fallbackRenderer.call(this, token);\n\t\t}\n\n\t\tconst pattern = /^\\s*\\[!(NOTE|TIP|IMPORTANT|WARNING|CAUTION)\\]\\s*?\\n*/i;\n\t\tconst match = firstTextToken.raw.match(pattern);\n\t\tif (!match) {\n\t\t\treturn fallbackRenderer.call(this, token);\n\t\t}\n\n\t\t// Remove the alert marker from the token\n\t\tfirstTextToken.raw = firstTextToken.raw.replace(pattern, '');\n\t\tfirstTextToken.text = firstTextToken.text.replace(pattern, '');\n\n\t\tconst alertIcons: Record<string, string> = {\n\t\t\t'note': 'info',\n\t\t\t'tip': 'light-bulb',\n\t\t\t'important': 'comment',\n\t\t\t'warning': 'alert',\n\t\t\t'caution': 'stop'\n\t\t};\n\n\t\tconst type = match[1];\n\t\tconst typeCapitalized = type.charAt(0).toUpperCase() + type.slice(1).toLowerCase();\n\t\tconst severity = type.toLowerCase();\n\t\tconst iconHtml = renderIcon({ id: alertIcons[severity] }).outerHTML;\n\n\t\t// Render the remaining content\n\t\tconst content = this.parser.parse(tokens);\n\n\t\t// Return alert markup with icon and severity (skipping the first 3 characters: `<p>`)\n\t\treturn `<blockquote data-severity=\"${severity}\"><p><span>${iconHtml}${typeCapitalized}</span>${content.substring(3)}</blockquote>\\n`;\n\t};\n}\n\nexport interface IRenderedMarkdown extends IDisposable {\n\treadonly element: HTMLElement;\n}\n\n/**\n * Low-level way create a html element from a markdown string.\n *\n * **Note** that for most cases you should be using {@link import('../../editor/browser/widget/markdownRenderer/browser/markdownRenderer.js').MarkdownRenderer MarkdownRenderer}\n * which comes with support for pretty code block rendering and which uses the default way of handling links.\n */\nexport function renderMarkdown(markdown: IMarkdownString, options: MarkdownRenderOptions = {}, target?: HTMLElement): IRenderedMarkdown {\n\tconst disposables = new DisposableStore();\n\tlet isDisposed = false;\n\n\tconst markedInstance = new marked.Marked(...(options.markedExtensions ?? []));\n\tconst { renderer, codeBlocks, syncCodeBlocks } = createMarkdownRenderer(markedInstance, options, markdown);\n\tconst value = preprocessMarkdownString(markdown);\n\n\tlet renderedMarkdown: string;\n\tif (options.fillInIncompleteTokens) {\n\t\t// The defaults are applied by parse but not lexer()/parser(), and they need to be present\n\t\tconst opts: marked.MarkedOptions = {\n\t\t\t...markedInstance.defaults,\n\t\t\t...options.markedOptions,\n\t\t\trenderer\n\t\t};\n\t\tconst tokens = markedInstance.lexer(value, opts);\n\t\tconst newTokens = fillInIncompleteTokens(tokens);\n\t\trenderedMarkdown = markedInstance.parser(newTokens, opts);\n\t} else {\n\t\trenderedMarkdown = markedInstance.parse(value, { ...options?.markedOptions, renderer, async: false });\n\t}\n\n\t// Rewrite theme icons\n\tif (markdown.supportThemeIcons) {\n\t\tconst elements = renderLabelWithIcons(renderedMarkdown);\n\t\trenderedMarkdown = elements.map(e => typeof e === 'string' ? e : e.outerHTML).join('');\n\t}\n\n\tconst renderedContent = document.createElement('div');\n\tconst sanitizerConfig = getDomSanitizerConfig(markdown, options.sanitizerConfig ?? {});\n\tdomSanitize.safeSetInnerHtml(renderedContent, renderedMarkdown, sanitizerConfig);\n\n\t// Rewrite links and images before potentially inserting them into the real dom\n\trewriteRenderedLinks(markdown, options, renderedContent);\n\n\tlet outElement: HTMLElement;\n\tif (target) {\n\t\toutElement = target;\n\t\tDOM.reset(target, ...renderedContent.childNodes);\n\t} else {\n\t\toutElement = renderedContent;\n\t}\n\n\tif (codeBlocks.length > 0) {\n\t\tPromise.all(codeBlocks).then((tuples) => {\n\t\t\tif (isDisposed) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst renderedElements = new Map(tuples);\n\t\t\t// eslint-disable-next-line no-restricted-syntax\n\t\t\tconst placeholderElements = outElement.querySelectorAll<HTMLDivElement>(`div[data-code]`);\n\t\t\tfor (const placeholderElement of placeholderElements) {\n\t\t\t\tconst renderedElement = renderedElements.get(placeholderElement.dataset['code'] ?? '');\n\t\t\t\tif (renderedElement) {\n\t\t\t\t\tDOM.reset(placeholderElement, renderedElement);\n\t\t\t\t}\n\t\t\t}\n\t\t\toptions.asyncRenderCallback?.();\n\t\t});\n\t} else if (syncCodeBlocks.length > 0) {\n\t\tconst renderedElements = new Map(syncCodeBlocks);\n\t\t// eslint-disable-next-line no-restricted-syntax\n\t\tconst placeholderElements = outElement.querySelectorAll<HTMLDivElement>(`div[data-code]`);\n\t\tfor (const placeholderElement of placeholderElements) {\n\t\t\tconst renderedElement = renderedElements.get(placeholderElement.dataset['code'] ?? '');\n\t\t\tif (renderedElement) {\n\t\t\t\tDOM.reset(placeholderElement, renderedElement);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Signal size changes for image tags\n\tif (options.asyncRenderCallback) {\n\t\t// eslint-disable-next-line no-restricted-syntax\n\t\tfor (const img of outElement.getElementsByTagName('img')) {\n\t\t\tconst listener = disposables.add(DOM.addDisposableListener(img, 'load', () => {\n\t\t\t\tlistener.dispose();\n\t\t\t\toptions.asyncRenderCallback!();\n\t\t\t}));\n\t\t}\n\t}\n\n\t// Add event listeners for links\n\tif (options.actionHandler) {\n\t\tconst clickCb = (e: PointerEvent) => {\n\t\t\tconst mouseEvent = new StandardMouseEvent(DOM.getWindow(outElement), e);\n\t\t\tif (!mouseEvent.leftButton && !mouseEvent.middleButton) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tactivateLink(markdown, options, mouseEvent);\n\t\t};\n\t\tdisposables.add(DOM.addDisposableListener(outElement, 'click', clickCb));\n\t\tdisposables.add(DOM.addDisposableListener(outElement, 'auxclick', clickCb));\n\n\t\tdisposables.add(DOM.addDisposableListener(outElement, 'keydown', (e) => {\n\t\t\tconst keyboardEvent = new StandardKeyboardEvent(e);\n\t\t\tif (!keyboardEvent.equals(KeyCode.Space) && !keyboardEvent.equals(KeyCode.Enter)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tactivateLink(markdown, options, keyboardEvent);\n\t\t}));\n\t}\n\n\t// Remove/disable inputs\n\t// eslint-disable-next-line no-restricted-syntax\n\tfor (const input of [...outElement.getElementsByTagName('input')]) {\n\t\tif (input.attributes.getNamedItem('type')?.value === 'checkbox') {\n\t\t\tinput.setAttribute('disabled', '');\n\t\t} else {\n\t\t\tif (options.sanitizerConfig?.replaceWithPlaintext) {\n\t\t\t\tconst replacement = convertTagToPlaintext(input);\n\t\t\t\tif (replacement) {\n\t\t\t\t\tinput.parentElement?.replaceChild(replacement, input);\n\t\t\t\t} else {\n\t\t\t\t\tinput.remove();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tinput.remove();\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\telement: outElement,\n\t\tdispose: () => {\n\t\t\tisDisposed = true;\n\t\t\tdisposables.dispose();\n\t\t}\n\t};\n}\n\nfunction rewriteRenderedLinks(markdown: IMarkdownString, options: MarkdownRenderOptions, root: HTMLElement) {\n\t// eslint-disable-next-line no-restricted-syntax\n\tfor (const el of root.querySelectorAll('img, audio, video, source')) {\n\t\tconst src = el.getAttribute('src'); // Get the raw 'src' attribute value as text, not the resolved 'src'\n\t\tif (src) {\n\t\t\tlet href = src;\n\t\t\ttry {\n\t\t\t\tif (markdown.baseUri) { // absolute or relative local path, or file: uri\n\t\t\t\t\thref = resolveWithBaseUri(URI.from(markdown.baseUri), href);\n\t\t\t\t}\n\t\t\t} catch (err) { }\n\n\t\t\tel.setAttribute('src', massageHref(markdown, href, true));\n\n\t\t\tif (options.sanitizerConfig?.remoteImageIsAllowed) {\n\t\t\t\tconst uri = URI.parse(href);\n\t\t\t\tif (uri.scheme !== Schemas.file && uri.scheme !== Schemas.data && !options.sanitizerConfig.remoteImageIsAllowed(uri)) {\n\t\t\t\t\tel.replaceWith(DOM.$('', undefined, el.outerHTML));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// eslint-disable-next-line no-restricted-syntax\n\tfor (const el of root.querySelectorAll('a')) {\n\t\tconst href = el.getAttribute('href'); // Get the raw 'href' attribute value as text, not the resolved 'href'\n\t\tel.setAttribute('href', ''); // Clear out href. We use the `data-href` for handling clicks instead\n\t\tif (!href\n\t\t\t|| /^data:|javascript:/i.test(href)\n\t\t\t|| (/^command:/i.test(href) && !markdown.isTrusted)\n\t\t\t|| /^command:(\\/\\/\\/)?_workbench\\.downloadResource/i.test(href)) {\n\t\t\t// drop the link\n\t\t\tel.replaceWith(...el.childNodes);\n\t\t} else {\n\t\t\tlet resolvedHref = massageHref(markdown, href, false);\n\t\t\tif (markdown.baseUri) {\n\t\t\t\tresolvedHref = resolveWithBaseUri(URI.from(markdown.baseUri), href);\n\t\t\t}\n\t\t\tel.dataset.href = resolvedHref;\n\t\t}\n\t}\n}\n\nfunction createMarkdownRenderer(marked: marked.Marked, options: MarkdownRenderOptions, markdown: IMarkdownString): { renderer: marked.Renderer; codeBlocks: Promise<[string, HTMLElement]>[]; syncCodeBlocks: [string, HTMLElement][] } {\n\tconst renderer = new marked.Renderer(options.markedOptions);\n\trenderer.image = defaultMarkedRenderers.image;\n\trenderer.link = defaultMarkedRenderers.link;\n\trenderer.paragraph = defaultMarkedRenderers.paragraph;\n\n\tif (markdown.supportAlertSyntax) {\n\t\trenderer.blockquote = createAlertBlockquoteRenderer(renderer.blockquote);\n\t}\n\n\t// Will collect [id, renderedElement] tuples\n\tconst codeBlocks: Promise<[string, HTMLElement]>[] = [];\n\tconst syncCodeBlocks: [string, HTMLElement][] = [];\n\n\tif (options.codeBlockRendererSync) {\n\t\trenderer.code = ({ text, lang, raw }: marked.Tokens.Code) => {\n\t\t\tconst id = defaultGenerator.nextId();\n\t\t\tconst value = options.codeBlockRendererSync!(postProcessCodeBlockLanguageId(lang), text, raw);\n\t\t\tsyncCodeBlocks.push([id, value]);\n\t\t\treturn `<div class=\"code\" data-code=\"${id}\">${escape(text)}</div>`;\n\t\t};\n\t} else if (options.codeBlockRenderer) {\n\t\trenderer.code = ({ text, lang }: marked.Tokens.Code) => {\n\t\t\tconst id = defaultGenerator.nextId();\n\t\t\tconst value = options.codeBlockRenderer!(postProcessCodeBlockLanguageId(lang), text);\n\t\t\tcodeBlocks.push(value.then(element => [id, element]));\n\t\t\treturn `<div class=\"code\" data-code=\"${id}\">${escape(text)}</div>`;\n\t\t};\n\t}\n\n\tif (!markdown.supportHtml) {\n\t\t// Note: we always pass the output through dompurify after this so that we don't rely on\n\t\t// marked for real sanitization.\n\t\trenderer.html = ({ text }) => {\n\t\t\tif (options.sanitizerConfig?.replaceWithPlaintext) {\n\t\t\t\treturn escape(text);\n\t\t\t}\n\n\t\t\tconst match = markdown.isTrusted ? text.match(/^(<span[^>]+>)|(<\\/\\s*span>)$/) : undefined;\n\t\t\treturn match ? text : '';\n\t\t};\n\t}\n\treturn { renderer, codeBlocks, syncCodeBlocks };\n}\n\nfunction preprocessMarkdownString(markdown: IMarkdownString) {\n\tlet value = markdown.value;\n\n\t// values that are too long will freeze the UI\n\tif (value.length > 100_000) {\n\t\tvalue = `${value.substr(0, 100_000)}…`;\n\t}\n\n\t// escape theme icons\n\tif (markdown.supportThemeIcons) {\n\t\tvalue = markdownEscapeEscapedIcons(value);\n\t}\n\n\treturn value;\n}\n\nfunction activateLink(mdStr: IMarkdownString, options: MarkdownRenderOptions, event: StandardMouseEvent | StandardKeyboardEvent): void {\n\tconst target = event.target.closest('a[data-href]');\n\tif (!DOM.isHTMLElement(target)) {\n\t\treturn;\n\t}\n\n\ttry {\n\t\tlet href = target.dataset['href'];\n\t\tif (href) {\n\t\t\tif (mdStr.baseUri) {\n\t\t\t\thref = resolveWithBaseUri(URI.from(mdStr.baseUri), href);\n\t\t\t}\n\t\t\toptions.actionHandler?.(href, mdStr);\n\t\t}\n\t} catch (err) {\n\t\tonUnexpectedError(err);\n\t} finally {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t}\n}\n\nfunction uriMassage(markdown: IMarkdownString, part: string): string {\n\tlet data: unknown;\n\ttry {\n\t\tdata = parse(decodeURIComponent(part));\n\t} catch (e) {\n\t\t// ignore\n\t}\n\tif (!data) {\n\t\treturn part;\n\t}\n\tdata = cloneAndChange(data, value => {\n\t\tif (markdown.uris && markdown.uris[value]) {\n\t\t\treturn URI.revive(markdown.uris[value]);\n\t\t} else {\n\t\t\treturn undefined;\n\t\t}\n\t});\n\treturn encodeURIComponent(JSON.stringify(data));\n}\n\nfunction massageHref(markdown: IMarkdownString, href: string, isDomUri: boolean): string {\n\tconst data = markdown.uris && markdown.uris[href];\n\tlet uri = URI.revive(data);\n\tif (isDomUri) {\n\t\tif (href.startsWith(Schemas.data + ':')) {\n\t\t\treturn href;\n\t\t}\n\t\tif (!uri) {\n\t\t\turi = URI.parse(href);\n\t\t}\n\t\t// this URI will end up as \"src\"-attribute of a dom node\n\t\t// and because of that special rewriting needs to be done\n\t\t// so that the URI uses a protocol that's understood by\n\t\t// browsers (like http or https)\n\t\treturn FileAccess.uriToBrowserUri(uri).toString(true);\n\t}\n\tif (!uri) {\n\t\treturn href;\n\t}\n\tif (URI.parse(href).toString() === uri.toString()) {\n\t\treturn href; // no transformation performed\n\t}\n\tif (uri.query) {\n\t\turi = uri.with({ query: uriMassage(markdown, uri.query) });\n\t}\n\treturn uri.toString();\n}\n\nfunction postProcessCodeBlockLanguageId(lang: string | undefined): string {\n\tif (!lang) {\n\t\treturn '';\n\t}\n\n\tconst parts = lang.split(/[\\s+|:|,|\\{|\\?]/, 1);\n\tif (parts.length) {\n\t\treturn parts[0];\n\t}\n\treturn lang;\n}\n\nfunction resolveWithBaseUri(baseUri: URI, href: string): string {\n\tconst hasScheme = /^\\w[\\w\\d+.-]*:/.test(href);\n\tif (hasScheme) {\n\t\treturn href;\n\t}\n\n\tif (baseUri.path.endsWith('/')) {\n\t\treturn resolvePath(baseUri, href).toString();\n\t} else {\n\t\treturn resolvePath(dirname(baseUri), href).toString();\n\t}\n}\n\ntype MdStrConfig = {\n\treadonly isTrusted?: boolean | MarkdownStringTrustedOptions;\n\treadonly baseUri?: UriComponents;\n};\n\nfunction sanitizeRenderedMarkdown(\n\trenderedMarkdown: string,\n\toriginalMdStrConfig: MdStrConfig,\n\toptions: MarkdownSanitizerConfig = {},\n): TrustedHTML {\n\tconst sanitizerConfig = getDomSanitizerConfig(originalMdStrConfig, options);\n\treturn domSanitize.sanitizeHtml(renderedMarkdown, sanitizerConfig);\n}\n\nexport const allowedMarkdownHtmlTags = Object.freeze([\n\t...domSanitize.basicMarkupHtmlTags,\n\t'input', // Allow inputs for rendering checkboxes. Other types of inputs are removed and the inputs are always disabled\n]);\n\nexport const allowedMarkdownHtmlAttributes = Object.freeze<Array<string | domSanitize.SanitizeAttributeRule>>([\n\t'align',\n\t'autoplay',\n\t'alt',\n\t'colspan',\n\t'controls',\n\t'draggable',\n\t'height',\n\t'href',\n\t'loop',\n\t'muted',\n\t'playsinline',\n\t'poster',\n\t'rowspan',\n\t'src',\n\t'target',\n\t'title',\n\t'type',\n\t'width',\n\t'start',\n\n\t// Input (For disabled inputs)\n\t'checked',\n\t'disabled',\n\t'value',\n\n\t// Custom markdown attributes\n\t'data-code',\n\t'data-href',\n\t'data-severity',\n\n\t// Only allow very specific styles\n\t{\n\t\tattributeName: 'style',\n\t\tshouldKeep: (element, data) => {\n\t\t\tif (element.tagName === 'SPAN') {\n\t\t\t\tif (data.attrName === 'style') {\n\t\t\t\t\treturn /^(color\\:(#[0-9a-fA-F]+|var\\(--vscode(-[a-zA-Z0-9]+)+\\));)?(background-color\\:(#[0-9a-fA-F]+|var\\(--vscode(-[a-zA-Z0-9]+)+\\));)?(border-radius:[0-9]+px;)?$/.test(data.attrValue);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t},\n\n\t// Only allow codicons for classes\n\t{\n\t\tattributeName: 'class',\n\t\tshouldKeep: (element, data) => {\n\t\t\tif (element.tagName === 'SPAN') {\n\t\t\t\tif (data.attrName === 'class') {\n\t\t\t\t\treturn /^codicon codicon-[a-z\\-]+( codicon-modifier-[a-z\\-]+)?$/.test(data.attrValue);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t},\n]);\n\nfunction getDomSanitizerConfig(mdStrConfig: MdStrConfig, options: MarkdownSanitizerConfig): domSanitize.DomSanitizerConfig {\n\tconst isTrusted = mdStrConfig.isTrusted ?? false;\n\tconst allowedLinkSchemes = [\n\t\tSchemas.http,\n\t\tSchemas.https,\n\t\tSchemas.mailto,\n\t\tSchemas.file,\n\t\tSchemas.vscodeFileResource,\n\t\tSchemas.vscodeRemote,\n\t\tSchemas.vscodeRemoteResource,\n\t\tSchemas.vscodeNotebookCell,\n\t\t// For links that are handled entirely by the action handler\n\t\tSchemas.internal,\n\t];\n\n\tif (isTrusted) {\n\t\tallowedLinkSchemes.push(Schemas.command);\n\t}\n\n\tif (options.allowedLinkSchemes?.augment) {\n\t\tallowedLinkSchemes.push(...options.allowedLinkSchemes.augment);\n\t}\n\n\treturn {\n\t\t// allowedTags should included everything that markdown renders to.\n\t\t// Since we have our own sanitize function for marked, it's possible we missed some tag so let dompurify make sure.\n\t\t// HTML tags that can result from markdown are from reading https://spec.commonmark.org/0.29/\n\t\t// HTML table tags that can result from markdown are from https://github.github.com/gfm/#tables-extension-\n\t\tallowedTags: {\n\t\t\toverride: options.allowedTags?.override ?? allowedMarkdownHtmlTags\n\t\t},\n\t\tallowedAttributes: {\n\t\t\toverride: options.allowedAttributes?.override ?? allowedMarkdownHtmlAttributes,\n\t\t},\n\t\tallowedLinkProtocols: {\n\t\t\toverride: allowedLinkSchemes,\n\t\t},\n\t\tallowRelativeLinkPaths: !!mdStrConfig.baseUri,\n\t\tallowedMediaProtocols: {\n\t\t\toverride: [\n\t\t\t\tSchemas.http,\n\t\t\t\tSchemas.https,\n\t\t\t\tSchemas.data,\n\t\t\t\tSchemas.file,\n\t\t\t\tSchemas.vscodeFileResource,\n\t\t\t\tSchemas.vscodeRemote,\n\t\t\t\tSchemas.vscodeRemoteResource,\n\t\t\t]\n\t\t},\n\t\tallowRelativeMediaPaths: !!mdStrConfig.baseUri,\n\t\treplaceWithPlaintext: options.replaceWithPlaintext,\n\t};\n}\n\n/**\n * Renders `str` as plaintext, stripping out Markdown syntax if it's a {@link IMarkdownString}.\n *\n * For example `# Header` would be output as `Header`.\n */\nexport function renderAsPlaintext(str: IMarkdownString | string, options?: {\n\t/** Controls if the ``` of code blocks should be preserved in the output or not */\n\treadonly includeCodeBlocksFences?: boolean;\n\t/** Controls if we want to format empty links from \"Link [](file)\" to \"Link file\" */\n\treadonly useLinkFormatter?: boolean;\n}) {\n\tif (typeof str === 'string') {\n\t\treturn str;\n\t}\n\n\t// values that are too long will freeze the UI\n\tlet value = str.value ?? '';\n\tif (value.length > 100_000) {\n\t\tvalue = `${value.substr(0, 100_000)}…`;\n\t}\n\n\tconst renderer = createPlainTextRenderer();\n\tif (options?.includeCodeBlocksFences) {\n\t\trenderer.code = codeBlockFences;\n\t}\n\tif (options?.useLinkFormatter) {\n\t\trenderer.link = linkFormatter;\n\t}\n\n\tconst html = marked.parse(value, { async: false, renderer });\n\treturn sanitizeRenderedMarkdown(html, { isTrusted: false }, {})\n\t\t.toString()\n\t\t.replace(/&(#\\d+|[a-zA-Z]+);/g, m => unescapeInfo.get(m) ?? m)\n\t\t.trim();\n}\n\nconst unescapeInfo = new Map<string, string>([\n\t['&quot;', '\"'],\n\t['&nbsp;', ' '],\n\t['&amp;', '&'],\n\t['&#39;', '\\''],\n\t['&lt;', '<'],\n\t['&gt;', '>'],\n]);\n\nfunction createPlainTextRenderer(): marked.Renderer {\n\tconst renderer = new marked.Renderer();\n\n\trenderer.code = ({ text }: marked.Tokens.Code): string => {\n\t\treturn escape(text);\n\t};\n\trenderer.blockquote = ({ text }: marked.Tokens.Blockquote): string => {\n\t\treturn text + '\\n';\n\t};\n\trenderer.html = (_: marked.Tokens.HTML): string => {\n\t\treturn '';\n\t};\n\trenderer.heading = function ({ tokens }: marked.Tokens.Heading): string {\n\t\treturn this.parser.parseInline(tokens) + '\\n';\n\t};\n\trenderer.hr = (): string => {\n\t\treturn '';\n\t};\n\trenderer.list = function ({ items }: marked.Tokens.List): string {\n\t\treturn items.map(x => this.listitem(x)).join('\\n') + '\\n';\n\t};\n\trenderer.listitem = ({ text }: marked.Tokens.ListItem): string => {\n\t\treturn text + '\\n';\n\t};\n\trenderer.paragraph = function ({ tokens }: marked.Tokens.Paragraph): string {\n\t\treturn this.parser.parseInline(tokens) + '\\n';\n\t};\n\trenderer.table = function ({ header, rows }: marked.Tokens.Table): string {\n\t\treturn header.map(cell => this.tablecell(cell)).join(' ') + '\\n' + rows.map(cells => cells.map(cell => this.tablecell(cell)).join(' ')).join('\\n') + '\\n';\n\t};\n\trenderer.tablerow = ({ text }: marked.Tokens.TableRow): string => {\n\t\treturn text;\n\t};\n\trenderer.tablecell = function ({ tokens }: marked.Tokens.TableCell): string {\n\t\treturn this.parser.parseInline(tokens);\n\t};\n\trenderer.strong = ({ text }: marked.Tokens.Strong): string => {\n\t\treturn text;\n\t};\n\trenderer.em = ({ text }: marked.Tokens.Em): string => {\n\t\treturn text;\n\t};\n\trenderer.codespan = ({ text }: marked.Tokens.Codespan): string => {\n\t\treturn escape(text);\n\t};\n\trenderer.br = (_: marked.Tokens.Br): string => {\n\t\treturn '\\n';\n\t};\n\trenderer.del = ({ text }: marked.Tokens.Del): string => {\n\t\treturn text;\n\t};\n\trenderer.image = (_: marked.Tokens.Image): string => {\n\t\treturn '';\n\t};\n\trenderer.text = ({ text }: marked.Tokens.Text): string => {\n\t\treturn text;\n\t};\n\trenderer.link = ({ text }: marked.Tokens.Link): string => {\n\t\treturn text;\n\t};\n\treturn renderer;\n}\n\nconst codeBlockFences = ({ text }: marked.Tokens.Code): string => {\n\treturn `\\n\\`\\`\\`\\n${escape(text)}\\n\\`\\`\\`\\n`;\n};\n\nconst linkFormatter = ({ text, href }: marked.Tokens.Link): string => {\n\ttry {\n\t\tif (href) {\n\t\t\tconst uri = URI.parse(href);\n\t\t\treturn text.trim() || basename(uri);\n\t\t}\n\t} catch (e) {\n\t\treturn text.trim() || pathBasename(href);\n\t}\n\treturn text;\n};\n\nfunction mergeRawTokenText(tokens: marked.Token[]): string {\n\tlet mergedTokenText = '';\n\ttokens.forEach(token => {\n\t\tmergedTokenText += token.raw;\n\t});\n\treturn mergedTokenText;\n}\n\nfunction completeSingleLinePattern(token: marked.Tokens.Text | marked.Tokens.Paragraph): marked.Token | undefined {\n\tif (!token.tokens) {\n\t\treturn undefined;\n\t}\n\n\tfor (let i = token.tokens.length - 1; i >= 0; i--) {\n\t\tconst subtoken = token.tokens[i];\n\t\tif (subtoken.type === 'text') {\n\t\t\tconst lines = subtoken.raw.split('\\n');\n\t\t\tconst lastLine = lines[lines.length - 1];\n\t\t\tif (lastLine.includes('`')) {\n\t\t\t\treturn completeCodespan(token);\n\t\t\t}\n\n\t\t\telse if (lastLine.includes('**')) {\n\t\t\t\treturn completeDoublestar(token);\n\t\t\t}\n\n\t\t\telse if (lastLine.match(/\\*\\w/)) {\n\t\t\t\treturn completeStar(token);\n\t\t\t}\n\n\t\t\telse if (lastLine.match(/(^|\\s)__\\w/)) {\n\t\t\t\treturn completeDoubleUnderscore(token);\n\t\t\t}\n\n\t\t\telse if (lastLine.match(/(^|\\s)_\\w/)) {\n\t\t\t\treturn completeUnderscore(token);\n\t\t\t}\n\n\t\t\telse if (\n\t\t\t\t// Text with start of link target\n\t\t\t\thasLinkTextAndStartOfLinkTarget(lastLine) ||\n\t\t\t\t// This token doesn't have the link text, eg if it contains other markdown constructs that are in other subtokens.\n\t\t\t\t// But some preceding token does have an unbalanced [ at least\n\t\t\t\thasStartOfLinkTargetAndNoLinkText(lastLine) && token.tokens.slice(0, i).some(t => t.type === 'text' && t.raw.match(/\\[[^\\]]*$/))\n\t\t\t) {\n\t\t\t\tconst nextTwoSubTokens = token.tokens.slice(i + 1);\n\n\t\t\t\t// A markdown link can look like\n\t\t\t\t// [link text](https://microsoft.com \"more text\")\n\t\t\t\t// Where \"more text\" is a title for the link or an argument to a vscode command link\n\t\t\t\tif (\n\t\t\t\t\t// If the link was parsed as a link, then look for a link token and a text token with a quote\n\t\t\t\t\tnextTwoSubTokens[0]?.type === 'link' && nextTwoSubTokens[1]?.type === 'text' && nextTwoSubTokens[1].raw.match(/^ *\"[^\"]*$/) ||\n\t\t\t\t\t// And if the link was not parsed as a link (eg command link), just look for a single quote in this token\n\t\t\t\t\tlastLine.match(/^[^\"]* +\"[^\"]*$/)\n\t\t\t\t) {\n\n\t\t\t\t\treturn completeLinkTargetArg(token);\n\t\t\t\t}\n\t\t\t\treturn completeLinkTarget(token);\n\t\t\t}\n\n\t\t\t// Contains the start of link text, and no following tokens contain the link target\n\t\t\telse if (lastLine.match(/(^|\\s)\\[\\w*[^\\]]*$/)) {\n\t\t\t\treturn completeLinkText(token);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn undefined;\n}\n\nfunction hasLinkTextAndStartOfLinkTarget(str: string): boolean {\n\treturn !!str.match(/(^|\\s)\\[.*\\]\\(\\w*/);\n}\n\nfunction hasStartOfLinkTargetAndNoLinkText(str: string): boolean {\n\treturn !!str.match(/^[^\\[]*\\]\\([^\\)]*$/);\n}\n\nfunction completeListItemPattern(list: marked.Tokens.List): marked.Tokens.List | undefined {\n\t// Patch up this one list item\n\tconst lastListItem = list.items[list.items.length - 1];\n\tconst lastListSubToken = lastListItem.tokens ? lastListItem.tokens[lastListItem.tokens.length - 1] : undefined;\n\n\t/*\n\tExample list token structures:\n\n\tlist\n\t\tlist_item\n\t\t\ttext\n\t\t\t\ttext\n\t\t\t\tcodespan\n\t\t\t\tlink\n\t\tlist_item\n\t\t\ttext\n\t\t\tcode // Complete indented codeblock\n\t\tlist_item\n\t\t\ttext\n\t\t\tspace\n\t\t\ttext\n\t\t\t\ttext // Incomplete indented codeblock\n\t\tlist_item\n\t\t\ttext\n\t\t\tlist // Nested list\n\t\t\t\tlist_item\n\t\t\t\t\ttext\n\t\t\t\t\t\ttext\n\n\tContrast with paragraph:\n\tparagraph\n\t\ttext\n\t\tcodespan\n\t*/\n\n\tconst listEndsInHeading = (list: marked.Tokens.List): boolean => {\n\t\t// A list item can be rendered as a heading for some reason when it has a subitem where we haven't rendered the text yet like this:\n\t\t// 1. list item\n\t\t// -\n\t\tconst lastItem = list.items.at(-1);\n\t\tconst lastToken = lastItem?.tokens.at(-1);\n\t\treturn lastToken?.type === 'heading' || lastToken?.type === 'list' && listEndsInHeading(lastToken as marked.Tokens.List);\n\t};\n\n\tlet newToken: marked.Token | undefined;\n\tif (lastListSubToken?.type === 'text' && !('inRawBlock' in lastListItem)) { // Why does Tag have a type of 'text'\n\t\tnewToken = completeSingleLinePattern(lastListSubToken as marked.Tokens.Text);\n\t} else if (listEndsInHeading(list)) {\n\t\tconst newList = marked.lexer(list.raw.trim() + ' &nbsp;')[0] as marked.Tokens.List;\n\t\tif (newList.type !== 'list') {\n\t\t\t// Something went wrong\n\t\t\treturn;\n\t\t}\n\t\treturn newList;\n\t}\n\n\tif (!newToken || newToken.type !== 'paragraph') { // 'text' item inside the list item turns into paragraph\n\t\t// Nothing to fix, or not a pattern we were expecting\n\t\treturn;\n\t}\n\n\tconst previousListItemsText = mergeRawTokenText(list.items.slice(0, -1));\n\n\t// Grabbing the `- ` or `1. ` or `* ` off the list item because I can't find a better way to do this\n\tconst lastListItemLead = lastListItem.raw.match(/^(\\s*(-|\\d+\\.|\\*) +)/)?.[0];\n\tif (!lastListItemLead) {\n\t\t// Is badly formatted\n\t\treturn;\n\t}\n\n\tconst newListItemText = lastListItemLead +\n\t\tmergeRawTokenText(lastListItem.tokens.slice(0, -1)) +\n\t\tnewToken.raw;\n\n\tconst newList = marked.lexer(previousListItemsText + newListItemText)[0] as marked.Tokens.List;\n\tif (newList.type !== 'list') {\n\t\t// Something went wrong\n\t\treturn;\n\t}\n\n\treturn newList;\n}\n\nfunction completeHeading(token: marked.Tokens.Heading, fullRawText: string): marked.TokensList | void {\n\tif (token.raw.match(/-\\s*$/)) {\n\t\treturn marked.lexer(fullRawText + ' &nbsp;');\n\t}\n}\n\nconst maxIncompleteTokensFixRounds = 3;\nexport function fillInIncompleteTokens(tokens: marked.TokensList): marked.TokensList {\n\tfor (let i = 0; i < maxIncompleteTokensFixRounds; i++) {\n\t\tconst newTokens = fillInIncompleteTokensOnce(tokens);\n\t\tif (newTokens) {\n\t\t\ttokens = newTokens;\n\t\t} else {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn tokens;\n}\n\nfunction fillInIncompleteTokensOnce(tokens: marked.TokensList): marked.TokensList | null {\n\tlet i: number;\n\tlet newTokens: marked.Token[] | undefined;\n\tfor (i = 0; i < tokens.length; i++) {\n\t\tconst token = tokens[i];\n\n\t\tif (token.type === 'paragraph' && token.raw.match(/(\\n|^)\\|/)) {\n\t\t\tnewTokens = completeTable(tokens.slice(i));\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tconst lastToken = tokens.at(-1);\n\tif (!newTokens && lastToken?.type === 'list') {\n\t\tconst newListToken = completeListItemPattern(lastToken as marked.Tokens.List);\n\t\tif (newListToken) {\n\t\t\tnewTokens = [newListToken];\n\t\t\ti = tokens.length - 1;\n\t\t}\n\t}\n\n\tif (!newTokens && lastToken?.type === 'paragraph') {\n\t\t// Only operates on a single token, because any newline that follows this should break these patterns\n\t\tconst newToken = completeSingleLinePattern(lastToken as marked.Tokens.Paragraph);\n\t\tif (newToken) {\n\t\t\tnewTokens = [newToken];\n\t\t\ti = tokens.length - 1;\n\t\t}\n\t}\n\n\tif (newTokens) {\n\t\tconst newTokensList = [\n\t\t\t...tokens.slice(0, i),\n\t\t\t...newTokens\n\t\t];\n\t\t(newTokensList as marked.TokensList).links = tokens.links;\n\t\treturn newTokensList as marked.TokensList;\n\t}\n\n\tif (lastToken?.type === 'heading') {\n\t\tconst completeTokens = completeHeading(lastToken as marked.Tokens.Heading, mergeRawTokenText(tokens));\n\t\tif (completeTokens) {\n\t\t\treturn completeTokens;\n\t\t}\n\t}\n\n\treturn null;\n}\n\n\nfunction completeCodespan(token: marked.Token): marked.Token {\n\treturn completeWithString(token, '`');\n}\n\nfunction completeStar(tokens: marked.Token): marked.Token {\n\treturn completeWithString(tokens, '*');\n}\n\nfunction completeUnderscore(tokens: marked.Token): marked.Token {\n\treturn completeWithString(tokens, '_');\n}\n\nfunction completeLinkTarget(tokens: marked.Token): marked.Token {\n\treturn completeWithString(tokens, ')', false);\n}\n\nfunction completeLinkTargetArg(tokens: marked.Token): marked.Token {\n\treturn completeWithString(tokens, '\")', false);\n}\n\nfunction completeLinkText(tokens: marked.Token): marked.Token {\n\treturn completeWithString(tokens, '](https://microsoft.com)', false);\n}\n\nfunction completeDoublestar(tokens: marked.Token): marked.Token {\n\treturn completeWithString(tokens, '**');\n}\n\nfunction completeDoubleUnderscore(tokens: marked.Token): marked.Token {\n\treturn completeWithString(tokens, '__');\n}\n\nfunction completeWithString(tokens: marked.Token[] | marked.Token, closingString: string, shouldTrim = true): marked.Token {\n\tconst mergedRawText = mergeRawTokenText(Array.isArray(tokens) ? tokens : [tokens]);\n\n\t// If it was completed correctly, this should be a single token.\n\t// Expecting either a Paragraph or a List\n\tconst trimmedRawText = shouldTrim ? mergedRawText.trimEnd() : mergedRawText;\n\treturn marked.lexer(trimmedRawText + closingString)[0];\n}\n\nfunction completeTable(tokens: marked.Token[]): marked.Token[] | undefined {\n\tconst mergedRawText = mergeRawTokenText(tokens);\n\tconst lines = mergedRawText.split('\\n');\n\n\tlet numCols: number | undefined; // The number of line1 col headers\n\tlet hasSeparatorRow = false;\n\tfor (let i = 0; i < lines.length; i++) {\n\t\tconst line = lines[i].trim();\n\t\tif (typeof numCols === 'undefined' && line.match(/^\\s*\\|/)) {\n\t\t\tconst line1Matches = line.match(/(\\|[^\\|]+)(?=\\||$)/g);\n\t\t\tif (line1Matches) {\n\t\t\t\tnumCols = line1Matches.length;\n\t\t\t}\n\t\t} else if (typeof numCols === 'number') {\n\t\t\tif (line.match(/^\\s*\\|/)) {\n\t\t\t\tif (i !== lines.length - 1) {\n\t\t\t\t\t// We got the line1 header row, and the line2 separator row, but there are more lines, and it wasn't parsed as a table!\n\t\t\t\t\t// That's strange and means that the table is probably malformed in the source, so I won't try to patch it up.\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\n\t\t\t\t// Got a line2 separator row- partial or complete, doesn't matter, we'll replace it with a correct one\n\t\t\t\thasSeparatorRow = true;\n\t\t\t} else {\n\t\t\t\t// The line after the header row isn't a valid separator row, so the table is malformed, don't fix it up\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (typeof numCols === 'number' && numCols > 0) {\n\t\tconst prefixText = hasSeparatorRow ? lines.slice(0, -1).join('\\n') : mergedRawText;\n\t\tconst line1EndsInPipe = !!prefixText.match(/\\|\\s*$/);\n\t\tconst newRawText = prefixText + (line1EndsInPipe ? '' : '|') + `\\n|${' --- |'.repeat(numCols)}`;\n\t\treturn marked.lexer(newRawText);\n\t}\n\n\treturn undefined;\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { onUnexpectedError } from '../common/errors.js';\nimport { escapeDoubleQuotes, IMarkdownString, MarkdownStringTrustedOptions, parseHrefAndDimensions, removeMarkdownEscapes } from '../common/htmlContent.js';\nimport { markdownEscapeEscapedIcons } from '../common/iconLabels.js';\nimport { defaultGenerator } from '../common/idGenerator.js';\nimport { KeyCode } from '../common/keyCodes.js';\nimport { DisposableStore, IDisposable } from '../common/lifecycle.js';\nimport * as marked from '../common/marked/marked.js';\nimport { parse } from '../common/marshalling.js';\nimport { FileAccess, Schemas } from '../common/network.js';\nimport { cloneAndChange } from '../common/objects.js';\nimport { basename as pathBasename } from '../common/path.js';\nimport { basename, dirname, resolvePath } from '../common/resources.js';\nimport { escape } from '../common/strings.js';\nimport { URI, UriComponents } from '../common/uri.js';\nimport * as DOM from './dom.js';\nimport * as domSanitize from './domSanitize.js';\nimport { convertTagToPlaintext } from './domSanitize.js';\nimport { StandardKeyboardEvent } from './keyboardEvent.js';\nimport { StandardMouseEvent } from './mouseEvent.js';\nimport { renderIcon, renderLabelWithIcons } from './ui/iconLabel/iconLabels.js';\n\nexport type MarkdownActionHandler = (linkContent: string, mdStr: IMarkdownString) => void;\n\n/**\n * Options for the rendering of markdown with {@link renderMarkdown}.\n */\nexport interface MarkdownRenderOptions {\n\treadonly codeBlockRenderer?: (languageId: string, value: string) => Promise<HTMLElement>;\n\treadonly codeBlockRendererSync?: (languageId: string, value: string, raw?: string) => HTMLElement;\n\treadonly asyncRenderCallback?: () => void;\n\n\treadonly actionHandler?: MarkdownActionHandler;\n\n\treadonly fillInIncompleteTokens?: boolean;\n\n\treadonly sanitizerConfig?: MarkdownSanitizerConfig;\n\n\treadonly markedOptions?: MarkdownRendererMarkedOptions;\n\treadonly markedExtensions?: marked.MarkedExtension[];\n}\n\n/**\n * Subset of options passed to `Marked` for rendering markdown.\n */\nexport interface MarkdownRendererMarkedOptions {\n}\n\nexport interface MarkdownSanitizerConfig {\n\treadonly replaceWithPlaintext?: boolean;\n\treadonly allowedTags?: {\n\t\treadonly override: readonly string[];\n\t};\n\treadonly allowedAttributes?: {\n\t\treadonly override: ReadonlyArray<string | domSanitize.SanitizeAttributeRule>;\n\t};\n\treadonly allowedLinkSchemes?: {\n\t\treadonly augment: readonly string[];\n\t};\n\treadonly remoteImageIsAllowed?: (uri: URI) => boolean;\n}\n\nconst defaultMarkedRenderers = Object.freeze({\n\timage: ({ href, title, text }: marked.Tokens.Image): string => {\n\t\tlet dimensions: string[] = [];\n\t\tlet attributes: string[] = [];\n\t\tif (href) {\n\t\t\t({ href, dimensions } = parseHrefAndDimensions(href));\n\t\t\tattributes.push(`src=\"${escapeDoubleQuotes(href)}\"`);\n\t\t}\n\t\tif (text) {\n\t\t\tattributes.push(`alt=\"${escapeDoubleQuotes(text)}\"`);\n\t\t}\n\t\tif (title) {\n\t\t\tattributes.push(`title=\"${escapeDoubleQuotes(title)}\"`);\n\t\t}\n\t\tif (dimensions.length) {\n\t\t\tattributes = attributes.concat(dimensions);\n\t\t}\n\t\treturn '<img ' + attributes.join(' ') + '>';\n\t},\n\n\tparagraph(this: marked.Renderer, { tokens }: marked.Tokens.Paragraph): string {\n\t\treturn `<p>${this.parser.parseInline(tokens)}</p>`;\n\t},\n\n\tlink(this: marked.Renderer, { href, title, tokens }: marked.Tokens.Link): string {\n\t\tlet text = this.parser.parseInline(tokens);\n\t\tif (typeof href !== 'string') {\n\t\t\treturn '';\n\t\t}\n\n\t\t// Remove markdown escapes. Workaround for https://github.com/chjj/marked/issues/829\n\t\tif (href === text) { // raw link case\n\t\t\ttext = removeMarkdownEscapes(text);\n\t\t}\n\n\t\ttitle = typeof title === 'string' ? escapeDoubleQuotes(removeMarkdownEscapes(title)) : '';\n\t\thref = removeMarkdownEscapes(href);\n\n\t\t// HTML Encode href\n\t\thref = href.replace(/&/g, '&amp;')\n\t\t\t.replace(/</g, '&lt;')\n\t\t\t.replace(/>/g, '&gt;')\n\t\t\t.replace(/\"/g, '&quot;')\n\t\t\t.replace(/'/g, '&#39;');\n\n\t\treturn `<a href=\"${href}\" title=\"${title || href}\" draggable=\"false\">${text}</a>`;\n\t},\n});\n\n/**\n * Blockquote renderer that processes GitHub-style alert syntax.\n * Transforms blockquotes like \"> [!NOTE]\" into structured alert markup with icons.\n *\n * Based on GitHub's alert syntax: https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax#alerts\n */\nfunction createAlertBlockquoteRenderer(fallbackRenderer: (this: marked.Renderer, token: marked.Tokens.Blockquote) => string) {\n\treturn function (this: marked.Renderer, token: marked.Tokens.Blockquote): string {\n\t\tconst { tokens } = token;\n\t\t// Check if this blockquote starts with alert syntax [!TYPE]\n\t\tconst firstToken = tokens[0];\n\t\tif (firstToken?.type !== 'paragraph') {\n\t\t\treturn fallbackRenderer.call(this, token);\n\t\t}\n\n\t\tconst paragraphTokens = firstToken.tokens;\n\t\tif (!paragraphTokens || paragraphTokens.length === 0) {\n\t\t\treturn fallbackRenderer.call(this, token);\n\t\t}\n\n\t\tconst firstTextToken = paragraphTokens[0];\n\t\tif (firstTextToken?.type !== 'text') {\n\t\t\treturn fallbackRenderer.call(this, token);\n\t\t}\n\n\t\tconst pattern = /^\\s*\\[!(NOTE|TIP|IMPORTANT|WARNING|CAUTION)\\]\\s*?\\n*/i;\n\t\tconst match = firstTextToken.raw.match(pattern);\n\t\tif (!match) {\n\t\t\treturn fallbackRenderer.call(this, token);\n\t\t}\n\n\t\t// Remove the alert marker from the token\n\t\tfirstTextToken.raw = firstTextToken.raw.replace(pattern, '');\n\t\tfirstTextToken.text = firstTextToken.text.replace(pattern, '');\n\n\t\tconst alertIcons: Record<string, string> = {\n\t\t\t'note': 'info',\n\t\t\t'tip': 'light-bulb',\n\t\t\t'important': 'comment',\n\t\t\t'warning': 'alert',\n\t\t\t'caution': 'stop'\n\t\t};\n\n\t\tconst type = match[1];\n\t\tconst typeCapitalized = type.charAt(0).toUpperCase() + type.slice(1).toLowerCase();\n\t\tconst severity = type.toLowerCase();\n\t\tconst iconHtml = renderIcon({ id: alertIcons[severity] }).outerHTML;\n\n\t\t// Render the remaining content\n\t\tconst content = this.parser.parse(tokens);\n\n\t\t// Return alert markup with icon and severity (skipping the first 3 characters: `<p>`)\n\t\treturn `<blockquote data-severity=\"${severity}\"><p><span>${iconHtml}${typeCapitalized}</span>${content.substring(3)}</blockquote>\\n`;\n\t};\n}\n\nexport interface IRenderedMarkdown extends IDisposable {\n\treadonly element: HTMLElement;\n}\n\n/**\n * Low-level way create a html element from a markdown string.\n *\n * **Note** that for most cases you should be using {@link import('../../editor/browser/widget/markdownRenderer/browser/markdownRenderer.js').MarkdownRenderer MarkdownRenderer}\n * which comes with support for pretty code block rendering and which uses the default way of handling links.\n */\nexport function renderMarkdown(markdown: IMarkdownString, options: MarkdownRenderOptions = {}, target?: HTMLElement): IRenderedMarkdown {\n\tconst disposables = new DisposableStore();\n\tlet isDisposed = false;\n\n\tconst markedInstance = new marked.Marked(...(options.markedExtensions ?? []));\n\tconst { renderer, codeBlocks, syncCodeBlocks } = createMarkdownRenderer(markedInstance, options, markdown);\n\tconst value = preprocessMarkdownString(markdown);\n\n\tlet renderedMarkdown: string;\n\tif (options.fillInIncompleteTokens) {\n\t\t// The defaults are applied by parse but not lexer()/parser(), and they need to be present\n\t\tconst opts: marked.MarkedOptions = {\n\t\t\t...markedInstance.defaults,\n\t\t\t...options.markedOptions,\n\t\t\trenderer\n\t\t};\n\t\tconst tokens = markedInstance.lexer(value, opts);\n\t\tconst newTokens = fillInIncompleteTokens(tokens);\n\t\trenderedMarkdown = markedInstance.parser(newTokens, opts);\n\t} else {\n\t\trenderedMarkdown = markedInstance.parse(value, { ...options?.markedOptions, renderer, async: false });\n\t}\n\n\t// Rewrite theme icons\n\tif (markdown.supportThemeIcons) {\n\t\tconst elements = renderLabelWithIcons(renderedMarkdown);\n\t\trenderedMarkdown = elements.map(e => typeof e === 'string' ? e : e.outerHTML).join('');\n\t}\n\n\tconst renderedContent = document.createElement('div');\n\tconst sanitizerConfig = getDomSanitizerConfig(markdown, options.sanitizerConfig ?? {});\n\tdomSanitize.safeSetInnerHtml(renderedContent, renderedMarkdown, sanitizerConfig);\n\n\t// Rewrite links and images before potentially inserting them into the real dom\n\trewriteRenderedLinks(markdown, options, renderedContent);\n\n\tlet outElement: HTMLElement;\n\tif (target) {\n\t\toutElement = target;\n\t\tDOM.reset(target, ...renderedContent.childNodes);\n\t} else {\n\t\toutElement = renderedContent;\n\t}\n\n\tif (codeBlocks.length > 0) {\n\t\tPromise.all(codeBlocks).then((tuples) => {\n\t\t\tif (isDisposed) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst renderedElements = new Map(tuples);\n\t\t\t// eslint-disable-next-line no-restricted-syntax\n\t\t\tconst placeholderElements = outElement.querySelectorAll<HTMLDivElement>(`div[data-code]`);\n\t\t\tfor (const placeholderElement of placeholderElements) {\n\t\t\t\tconst renderedElement = renderedElements.get(placeholderElement.dataset['code'] ?? '');\n\t\t\t\tif (renderedElement) {\n\t\t\t\t\tDOM.reset(placeholderElement, renderedElement);\n\t\t\t\t}\n\t\t\t}\n\t\t\toptions.asyncRenderCallback?.();\n\t\t});\n\t} else if (syncCodeBlocks.length > 0) {\n\t\tconst renderedElements = new Map(syncCodeBlocks);\n\t\t// eslint-disable-next-line no-restricted-syntax\n\t\tconst placeholderElements = outElement.querySelectorAll<HTMLDivElement>(`div[data-code]`);\n\t\tfor (const placeholderElement of placeholderElements) {\n\t\t\tconst renderedElement = renderedElements.get(placeholderElement.dataset['code'] ?? '');\n\t\t\tif (renderedElement) {\n\t\t\t\tDOM.reset(placeholderElement, renderedElement);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Signal size changes for image tags\n\tif (options.asyncRenderCallback) {\n\t\t// eslint-disable-next-line no-restricted-syntax\n\t\tfor (const img of outElement.getElementsByTagName('img')) {\n\t\t\tconst listener = disposables.add(DOM.addDisposableListener(img, 'load', () => {\n\t\t\t\tlistener.dispose();\n\t\t\t\toptions.asyncRenderCallback!();\n\t\t\t}));\n\t\t}\n\t}\n\n\t// Add event listeners for links\n\tif (options.actionHandler) {\n\t\tconst clickCb = (e: PointerEvent) => {\n\t\t\tconst mouseEvent = new StandardMouseEvent(DOM.getWindow(outElement), e);\n\t\t\tif (!mouseEvent.leftButton && !mouseEvent.middleButton) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tactivateLink(markdown, options, mouseEvent);\n\t\t};\n\t\tdisposables.add(DOM.addDisposableListener(outElement, 'click', clickCb));\n\t\tdisposables.add(DOM.addDisposableListener(outElement, 'auxclick', clickCb));\n\n\t\tdisposables.add(DOM.addDisposableListener(outElement, 'keydown', (e) => {\n\t\t\tconst keyboardEvent = new StandardKeyboardEvent(e);\n\t\t\tif (!keyboardEvent.equals(KeyCode.Space) && !keyboardEvent.equals(KeyCode.Enter)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tactivateLink(markdown, options, keyboardEvent);\n\t\t}));\n\t}\n\n\t// Remove/disable inputs\n\t// eslint-disable-next-line no-restricted-syntax\n\tfor (const input of [...outElement.getElementsByTagName('input')]) {\n\t\tif (input.attributes.getNamedItem('type')?.value === 'checkbox') {\n\t\t\tinput.setAttribute('disabled', '');\n\t\t} else {\n\t\t\tif (options.sanitizerConfig?.replaceWithPlaintext) {\n\t\t\t\tconst replacement = convertTagToPlaintext(input);\n\t\t\t\tif (replacement) {\n\t\t\t\t\tinput.parentElement?.replaceChild(replacement, input);\n\t\t\t\t} else {\n\t\t\t\t\tinput.remove();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tinput.remove();\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\telement: outElement,\n\t\tdispose: () => {\n\t\t\tisDisposed = true;\n\t\t\tdisposables.dispose();\n\t\t}\n\t};\n}\n\nfunction rewriteRenderedLinks(markdown: IMarkdownString, options: MarkdownRenderOptions, root: HTMLElement) {\n\t// eslint-disable-next-line no-restricted-syntax\n\tfor (const el of root.querySelectorAll('img, audio, video, source')) {\n\t\tconst src = el.getAttribute('src'); // Get the raw 'src' attribute value as text, not the resolved 'src'\n\t\tif (src) {\n\t\t\tlet href = src;\n\t\t\ttry {\n\t\t\t\tif (markdown.baseUri) { // absolute or relative local path, or file: uri\n\t\t\t\t\thref = resolveWithBaseUri(URI.from(markdown.baseUri), href);\n\t\t\t\t}\n\t\t\t} catch (err) { }\n\n\t\t\tel.setAttribute('src', massageHref(markdown, href, true));\n\n\t\t\tif (options.sanitizerConfig?.remoteImageIsAllowed) {\n\t\t\t\tconst uri = URI.parse(href);\n\t\t\t\tif (uri.scheme !== Schemas.file && uri.scheme !== Schemas.data && !options.sanitizerConfig.remoteImageIsAllowed(uri)) {\n\t\t\t\t\tel.replaceWith(DOM.$('', undefined, el.outerHTML));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// eslint-disable-next-line no-restricted-syntax\n\tfor (const el of root.querySelectorAll('a')) {\n\t\tconst href = el.getAttribute('href'); // Get the raw 'href' attribute value as text, not the resolved 'href'\n\t\tel.setAttribute('href', ''); // Clear out href. We use the `data-href` for handling clicks instead\n\t\tif (!href\n\t\t\t|| /^data:|javascript:/i.test(href)\n\t\t\t|| (/^command:/i.test(href) && !markdown.isTrusted)\n\t\t\t|| /^command:(\\/\\/\\/)?_workbench\\.downloadResource/i.test(href)) {\n\t\t\t// drop the link\n\t\t\tel.replaceWith(...el.childNodes);\n\t\t} else {\n\t\t\tlet resolvedHref = massageHref(markdown, href, false);\n\t\t\tif (markdown.baseUri) {\n\t\t\t\tresolvedHref = resolveWithBaseUri(URI.from(markdown.baseUri), href);\n\t\t\t}\n\t\t\tel.dataset.href = resolvedHref;\n\t\t}\n\t}\n}\n\nfunction createMarkdownRenderer(marked: marked.Marked, options: MarkdownRenderOptions, markdown: IMarkdownString): { renderer: marked.Renderer; codeBlocks: Promise<[string, HTMLElement]>[]; syncCodeBlocks: [string, HTMLElement][] } {\n\tconst renderer = new marked.Renderer(options.markedOptions);\n\trenderer.image = defaultMarkedRenderers.image;\n\trenderer.link = defaultMarkedRenderers.link;\n\trenderer.paragraph = defaultMarkedRenderers.paragraph;\n\n\tif (markdown.supportAlertSyntax) {\n\t\trenderer.blockquote = createAlertBlockquoteRenderer(renderer.blockquote);\n\t}\n\n\t// Will collect [id, renderedElement] tuples\n\tconst codeBlocks: Promise<[string, HTMLElement]>[] = [];\n\tconst syncCodeBlocks: [string, HTMLElement][] = [];\n\n\tif (options.codeBlockRendererSync) {\n\t\trenderer.code = ({ text, lang, raw }: marked.Tokens.Code) => {\n\t\t\tconst id = defaultGenerator.nextId();\n\t\t\tconst value = options.codeBlockRendererSync!(postProcessCodeBlockLanguageId(lang), text, raw);\n\t\t\tsyncCodeBlocks.push([id, value]);\n\t\t\treturn `<div class=\"code\" data-code=\"${id}\">${escape(text)}</div>`;\n\t\t};\n\t} else if (options.codeBlockRenderer) {\n\t\trenderer.code = ({ text, lang }: marked.Tokens.Code) => {\n\t\t\tconst id = defaultGenerator.nextId();\n\t\t\tconst value = options.codeBlockRenderer!(postProcessCodeBlockLanguageId(lang), text);\n\t\t\tcodeBlocks.push(value.then(element => [id, element]));\n\t\t\treturn `<div class=\"code\" data-code=\"${id}\">${escape(text)}</div>`;\n\t\t};\n\t}\n\n\tif (!markdown.supportHtml) {\n\t\t// Note: we always pass the output through dompurify after this so that we don't rely on\n\t\t// marked for real sanitization.\n\t\trenderer.html = ({ text }) => {\n\t\t\tif (options.sanitizerConfig?.replaceWithPlaintext) {\n\t\t\t\treturn escape(text);\n\t\t\t}\n\n\t\t\tconst match = markdown.isTrusted ? text.match(/^(<span[^>]+>)|(<\\/\\s*span>)$/) : undefined;\n\t\t\treturn match ? text : '';\n\t\t};\n\t}\n\treturn { renderer, codeBlocks, syncCodeBlocks };\n}\n\nfunction preprocessMarkdownString(markdown: IMarkdownString) {\n\tlet value = markdown.value;\n\n\t// values that are too long will freeze the UI\n\tif (value.length > 100_000) {\n\t\tvalue = `${value.substr(0, 100_000)}…`;\n\t}\n\n\t// escape theme icons\n\tif (markdown.supportThemeIcons) {\n\t\tvalue = markdownEscapeEscapedIcons(value);\n\t}\n\n\treturn value;\n}\n\nfunction activateLink(mdStr: IMarkdownString, options: MarkdownRenderOptions, event: StandardMouseEvent | StandardKeyboardEvent): void {\n\tconst target = event.target.closest('a[data-href]');\n\tif (!DOM.isHTMLElement(target)) {\n\t\treturn;\n\t}\n\n\ttry {\n\t\tlet href = target.dataset['href'];\n\t\tif (href) {\n\t\t\tif (mdStr.baseUri) {\n\t\t\t\thref = resolveWithBaseUri(URI.from(mdStr.baseUri), href);\n\t\t\t}\n\t\t\toptions.actionHandler?.(href, mdStr);\n\t\t}\n\t} catch (err) {\n\t\tonUnexpectedError(err);\n\t} finally {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t}\n}\n\nfunction uriMassage(markdown: IMarkdownString, part: string): string {\n\tlet data: unknown;\n\ttry {\n\t\tdata = parse(decodeURIComponent(part));\n\t} catch (e) {\n\t\t// ignore\n\t}\n\tif (!data) {\n\t\treturn part;\n\t}\n\tdata = cloneAndChange(data, value => {\n\t\tif (markdown.uris && markdown.uris[value]) {\n\t\t\treturn URI.revive(markdown.uris[value]);\n\t\t} else {\n\t\t\treturn undefined;\n\t\t}\n\t});\n\treturn encodeURIComponent(JSON.stringify(data));\n}\n\nfunction massageHref(markdown: IMarkdownString, href: string, isDomUri: boolean): string {\n\tconst data = markdown.uris && markdown.uris[href];\n\tlet uri = URI.revive(data);\n\tif (isDomUri) {\n\t\tif (href.startsWith(Schemas.data + ':')) {\n\t\t\treturn href;\n\t\t}\n\t\tif (!uri) {\n\t\t\turi = URI.parse(href);\n\t\t}\n\t\t// this URI will end up as \"src\"-attribute of a dom node\n\t\t// and because of that special rewriting needs to be done\n\t\t// so that the URI uses a protocol that's understood by\n\t\t// browsers (like http or https)\n\t\treturn FileAccess.uriToBrowserUri(uri).toString(true);\n\t}\n\tif (!uri) {\n\t\treturn href;\n\t}\n\tif (URI.parse(href).toString() === uri.toString()) {\n\t\treturn href; // no transformation performed\n\t}\n\tif (uri.query) {\n\t\turi = uri.with({ query: uriMassage(markdown, uri.query) });\n\t}\n\treturn uri.toString();\n}\n\nfunction postProcessCodeBlockLanguageId(lang: string | undefined): string {\n\tif (!lang) {\n\t\treturn '';\n\t}\n\n\tconst parts = lang.split(/[\\s+|:|,|\\{|\\?]/, 1);\n\tif (parts.length) {\n\t\treturn parts[0];\n\t}\n\treturn lang;\n}\n\nfunction resolveWithBaseUri(baseUri: URI, href: string): string {\n\tconst hasScheme = /^\\w[\\w\\d+.-]*:/.test(href);\n\tif (hasScheme) {\n\t\treturn href;\n\t}\n\n\tif (baseUri.path.endsWith('/')) {\n\t\treturn resolvePath(baseUri, href).toString();\n\t} else {\n\t\treturn resolvePath(dirname(baseUri), href).toString();\n\t}\n}\n\ntype MdStrConfig = {\n\treadonly isTrusted?: boolean | MarkdownStringTrustedOptions;\n\treadonly baseUri?: UriComponents;\n};\n\nfunction sanitizeRenderedMarkdown(\n\trenderedMarkdown: string,\n\toriginalMdStrConfig: MdStrConfig,\n\toptions: MarkdownSanitizerConfig = {},\n): TrustedHTML {\n\tconst sanitizerConfig = getDomSanitizerConfig(originalMdStrConfig, options);\n\treturn domSanitize.sanitizeHtml(renderedMarkdown, sanitizerConfig);\n}\n\nexport const allowedMarkdownHtmlTags = Object.freeze([\n\t...domSanitize.basicMarkupHtmlTags,\n\t'input', // Allow inputs for rendering checkboxes. Other types of inputs are removed and the inputs are always disabled\n]);\n\nexport const allowedMarkdownHtmlAttributes = Object.freeze<Array<string | domSanitize.SanitizeAttributeRule>>([\n\t'align',\n\t'autoplay',\n\t'alt',\n\t'colspan',\n\t'controls',\n\t'draggable',\n\t'height',\n\t'href',\n\t'loop',\n\t'muted',\n\t'playsinline',\n\t'poster',\n\t'rowspan',\n\t'src',\n\t'target',\n\t'title',\n\t'type',\n\t'width',\n\t'start',\n\n\t// Input (For disabled inputs)\n\t'checked',\n\t'disabled',\n\t'value',\n\n\t// Custom markdown attributes\n\t'data-code',\n\t'data-href',\n\t'data-severity',\n\n\t// Only allow very specific styles\n\t{\n\t\tattributeName: 'style',\n\t\tshouldKeep: (element, data) => {\n\t\t\tif (element.tagName === 'SPAN') {\n\t\t\t\tif (data.attrName === 'style') {\n\t\t\t\t\treturn /^(color\\:(#[0-9a-fA-F]+|var\\(--vscode(-[a-zA-Z0-9]+)+\\));)?(background-color\\:(#[0-9a-fA-F]+|var\\(--vscode(-[a-zA-Z0-9]+)+\\));)?(border-radius:[0-9]+px;)?$/.test(data.attrValue);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t},\n\n\t// Only allow codicons for classes\n\t{\n\t\tattributeName: 'class',\n\t\tshouldKeep: (element, data) => {\n\t\t\tif (element.tagName === 'SPAN') {\n\t\t\t\tif (data.attrName === 'class') {\n\t\t\t\t\treturn /^codicon codicon-[a-z\\-]+( codicon-modifier-[a-z\\-]+)?$/.test(data.attrValue);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t},\n]);\n\nfunction getDomSanitizerConfig(mdStrConfig: MdStrConfig, options: MarkdownSanitizerConfig): domSanitize.DomSanitizerConfig {\n\tconst isTrusted = mdStrConfig.isTrusted ?? false;\n\tconst allowedLinkSchemes = [\n\t\tSchemas.http,\n\t\tSchemas.https,\n\t\tSchemas.mailto,\n\t\tSchemas.file,\n\t\tSchemas.vscodeFileResource,\n\t\tSchemas.vscodeRemote,\n\t\tSchemas.vscodeRemoteResource,\n\t\tSchemas.vscodeNotebookCell,\n\t\t// For links that are handled entirely by the action handler\n\t\tSchemas.internal,\n\t];\n\n\tif (isTrusted) {\n\t\tallowedLinkSchemes.push(Schemas.command);\n\t}\n\n\tif (options.allowedLinkSchemes?.augment) {\n\t\tallowedLinkSchemes.push(...options.allowedLinkSchemes.augment);\n\t}\n\n\treturn {\n\t\t// allowedTags should included everything that markdown renders to.\n\t\t// Since we have our own sanitize function for marked, it's possible we missed some tag so let dompurify make sure.\n\t\t// HTML tags that can result from markdown are from reading https://spec.commonmark.org/0.29/\n\t\t// HTML table tags that can result from markdown are from https://github.github.com/gfm/#tables-extension-\n\t\tallowedTags: {\n\t\t\toverride: options.allowedTags?.override ?? allowedMarkdownHtmlTags\n\t\t},\n\t\tallowedAttributes: {\n\t\t\toverride: options.allowedAttributes?.override ?? allowedMarkdownHtmlAttributes,\n\t\t},\n\t\tallowedLinkProtocols: {\n\t\t\toverride: allowedLinkSchemes,\n\t\t},\n\t\tallowRelativeLinkPaths: !!mdStrConfig.baseUri,\n\t\tallowedMediaProtocols: {\n\t\t\toverride: [\n\t\t\t\tSchemas.http,\n\t\t\t\tSchemas.https,\n\t\t\t\tSchemas.data,\n\t\t\t\tSchemas.file,\n\t\t\t\tSchemas.vscodeFileResource,\n\t\t\t\tSchemas.vscodeRemote,\n\t\t\t\tSchemas.vscodeRemoteResource,\n\t\t\t]\n\t\t},\n\t\tallowRelativeMediaPaths: !!mdStrConfig.baseUri,\n\t\treplaceWithPlaintext: options.replaceWithPlaintext,\n\t};\n}\n\n/**\n * Renders `str` as plaintext, stripping out Markdown syntax if it's a {@link IMarkdownString}.\n *\n * For example `# Header` would be output as `Header`.\n */\nexport function renderAsPlaintext(str: IMarkdownString | string, options?: {\n\t/** Controls if the ``` of code blocks should be preserved in the output or not */\n\treadonly includeCodeBlocksFences?: boolean;\n\t/** Controls if we want to format empty links from \"Link [](file)\" to \"Link file\" */\n\treadonly useLinkFormatter?: boolean;\n}) {\n\tif (typeof str === 'string') {\n\t\treturn str;\n\t}\n\n\t// values that are too long will freeze the UI\n\tlet value = str.value ?? '';\n\tif (value.length > 100_000) {\n\t\tvalue = `${value.substr(0, 100_000)}…`;\n\t}\n\n\tconst renderer = createPlainTextRenderer();\n\tif (options?.includeCodeBlocksFences) {\n\t\trenderer.code = codeBlockFences;\n\t}\n\tif (options?.useLinkFormatter) {\n\t\trenderer.link = linkFormatter;\n\t}\n\n\tconst html = marked.parse(value, { async: false, renderer });\n\treturn sanitizeRenderedMarkdown(html, { isTrusted: false }, {})\n\t\t.toString()\n\t\t.replace(/&(#\\d+|[a-zA-Z]+);/g, m => unescapeInfo.get(m) ?? m)\n\t\t.trim();\n}\n\nconst unescapeInfo = new Map<string, string>([\n\t['&quot;', '\"'],\n\t['&nbsp;', ' '],\n\t['&amp;', '&'],\n\t['&#39;', '\\''],\n\t['&lt;', '<'],\n\t['&gt;', '>'],\n]);\n\nfunction createPlainTextRenderer(): marked.Renderer {\n\tconst renderer = new marked.Renderer();\n\n\trenderer.code = ({ text }: marked.Tokens.Code): string => {\n\t\treturn escape(text);\n\t};\n\trenderer.blockquote = ({ text }: marked.Tokens.Blockquote): string => {\n\t\treturn text + '\\n';\n\t};\n\trenderer.html = (_: marked.Tokens.HTML): string => {\n\t\treturn '';\n\t};\n\trenderer.heading = function ({ tokens }: marked.Tokens.Heading): string {\n\t\treturn this.parser.parseInline(tokens) + '\\n';\n\t};\n\trenderer.hr = (): string => {\n\t\treturn '';\n\t};\n\trenderer.list = function ({ items }: marked.Tokens.List): string {\n\t\treturn items.map(x => this.listitem(x)).join('\\n') + '\\n';\n\t};\n\trenderer.listitem = ({ text }: marked.Tokens.ListItem): string => {\n\t\treturn text + '\\n';\n\t};\n\trenderer.paragraph = function ({ tokens }: marked.Tokens.Paragraph): string {\n\t\treturn this.parser.parseInline(tokens) + '\\n';\n\t};\n\trenderer.table = function ({ header, rows }: marked.Tokens.Table): string {\n\t\treturn header.map(cell => this.tablecell(cell)).join(' ') + '\\n' + rows.map(cells => cells.map(cell => this.tablecell(cell)).join(' ')).join('\\n') + '\\n';\n\t};\n\trenderer.tablerow = ({ text }: marked.Tokens.TableRow): string => {\n\t\treturn text;\n\t};\n\trenderer.tablecell = function ({ tokens }: marked.Tokens.TableCell): string {\n\t\treturn this.parser.parseInline(tokens);\n\t};\n\trenderer.strong = ({ text }: marked.Tokens.Strong): string => {\n\t\treturn text;\n\t};\n\trenderer.em = ({ text }: marked.Tokens.Em): string => {\n\t\treturn text;\n\t};\n\trenderer.codespan = ({ text }: marked.Tokens.Codespan): string => {\n\t\treturn escape(text);\n\t};\n\trenderer.br = (_: marked.Tokens.Br): string => {\n\t\treturn '\\n';\n\t};\n\trenderer.del = ({ text }: marked.Tokens.Del): string => {\n\t\treturn text;\n\t};\n\trenderer.image = (_: marked.Tokens.Image): string => {\n\t\treturn '';\n\t};\n\trenderer.text = ({ text }: marked.Tokens.Text): string => {\n\t\treturn text;\n\t};\n\trenderer.link = ({ text }: marked.Tokens.Link): string => {\n\t\treturn text;\n\t};\n\treturn renderer;\n}\n\nconst codeBlockFences = ({ text }: marked.Tokens.Code): string => {\n\treturn `\\n\\`\\`\\`\\n${escape(text)}\\n\\`\\`\\`\\n`;\n};\n\nconst linkFormatter = ({ text, href }: marked.Tokens.Link): string => {\n\ttry {\n\t\tif (href) {\n\t\t\tconst uri = URI.parse(href);\n\t\t\treturn text.trim() || basename(uri);\n\t\t}\n\t} catch (e) {\n\t\treturn text.trim() || pathBasename(href);\n\t}\n\treturn text;\n};\n\nfunction mergeRawTokenText(tokens: marked.Token[]): string {\n\tlet mergedTokenText = '';\n\ttokens.forEach(token => {\n\t\tmergedTokenText += token.raw;\n\t});\n\treturn mergedTokenText;\n}\n\nfunction completeSingleLinePattern(token: marked.Tokens.Text | marked.Tokens.Paragraph): marked.Token | undefined {\n\tif (!token.tokens) {\n\t\treturn undefined;\n\t}\n\n\tfor (let i = token.tokens.length - 1; i >= 0; i--) {\n\t\tconst subtoken = token.tokens[i];\n\t\tif (subtoken.type === 'text') {\n\t\t\tconst lines = subtoken.raw.split('\\n');\n\t\t\tconst lastLine = lines[lines.length - 1];\n\t\t\tif (lastLine.includes('`')) {\n\t\t\t\treturn completeCodespan(token);\n\t\t\t}\n\n\t\t\telse if (lastLine.includes('**')) {\n\t\t\t\treturn completeDoublestar(token);\n\t\t\t}\n\n\t\t\telse if (lastLine.match(/\\*\\w/)) {\n\t\t\t\treturn completeStar(token);\n\t\t\t}\n\n\t\t\telse if (lastLine.match(/(^|\\s)__\\w/)) {\n\t\t\t\treturn completeDoubleUnderscore(token);\n\t\t\t}\n\n\t\t\telse if (lastLine.match(/(^|\\s)_\\w/)) {\n\t\t\t\treturn completeUnderscore(token);\n\t\t\t}\n\n\t\t\telse if (\n\t\t\t\t// Text with start of link target\n\t\t\t\thasLinkTextAndStartOfLinkTarget(lastLine) ||\n\t\t\t\t// This token doesn't have the link text, eg if it contains other markdown constructs that are in other subtokens.\n\t\t\t\t// But some preceding token does have an unbalanced [ at least\n\t\t\t\thasStartOfLinkTargetAndNoLinkText(lastLine) && token.tokens.slice(0, i).some(t => t.type === 'text' && t.raw.match(/\\[[^\\]]*$/))\n\t\t\t) {\n\t\t\t\tconst nextTwoSubTokens = token.tokens.slice(i + 1);\n\n\t\t\t\t// A markdown link can look like\n\t\t\t\t// [link text](https://microsoft.com \"more text\")\n\t\t\t\t// Where \"more text\" is a title for the link or an argument to a vscode command link\n\t\t\t\tif (\n\t\t\t\t\t// If the link was parsed as a link, then look for a link token and a text token with a quote\n\t\t\t\t\tnextTwoSubTokens[0]?.type === 'link' && nextTwoSubTokens[1]?.type === 'text' && nextTwoSubTokens[1].raw.match(/^ *\"[^\"]*$/) ||\n\t\t\t\t\t// And if the link was not parsed as a link (eg command link), just look for a single quote in this token\n\t\t\t\t\tlastLine.match(/^[^\"]* +\"[^\"]*$/)\n\t\t\t\t) {\n\n\t\t\t\t\treturn completeLinkTargetArg(token);\n\t\t\t\t}\n\t\t\t\treturn completeLinkTarget(token);\n\t\t\t}\n\n\t\t\t// Contains the start of link text, and no following tokens contain the link target\n\t\t\telse if (lastLine.match(/(^|\\s)\\[\\w*[^\\]]*$/)) {\n\t\t\t\treturn completeLinkText(token);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn undefined;\n}\n\nfunction hasLinkTextAndStartOfLinkTarget(str: string): boolean {\n\treturn !!str.match(/(^|\\s)\\[.*\\]\\(\\w*/);\n}\n\nfunction hasStartOfLinkTargetAndNoLinkText(str: string): boolean {\n\treturn !!str.match(/^[^\\[]*\\]\\([^\\)]*$/);\n}\n\nfunction completeListItemPattern(list: marked.Tokens.List): marked.Tokens.List | undefined {\n\t// Patch up this one list item\n\tconst lastListItem = list.items[list.items.length - 1];\n\tconst lastListSubToken = lastListItem.tokens ? lastListItem.tokens[lastListItem.tokens.length - 1] : undefined;\n\n\t/*\n\tExample list token structures:\n\n\tlist\n\t\tlist_item\n\t\t\ttext\n\t\t\t\ttext\n\t\t\t\tcodespan\n\t\t\t\tlink\n\t\tlist_item\n\t\t\ttext\n\t\t\tcode // Complete indented codeblock\n\t\tlist_item\n\t\t\ttext\n\t\t\tspace\n\t\t\ttext\n\t\t\t\ttext // Incomplete indented codeblock\n\t\tlist_item\n\t\t\ttext\n\t\t\tlist // Nested list\n\t\t\t\tlist_item\n\t\t\t\t\ttext\n\t\t\t\t\t\ttext\n\n\tContrast with paragraph:\n\tparagraph\n\t\ttext\n\t\tcodespan\n\t*/\n\n\tconst listEndsInHeading = (list: marked.Tokens.List): boolean => {\n\t\t// A list item can be rendered as a heading for some reason when it has a subitem where we haven't rendered the text yet like this:\n\t\t// 1. list item\n\t\t// -\n\t\tconst lastItem = list.items.at(-1);\n\t\tconst lastToken = lastItem?.tokens.at(-1);\n\t\treturn lastToken?.type === 'heading' || lastToken?.type === 'list' && listEndsInHeading(lastToken as marked.Tokens.List);\n\t};\n\n\tlet newToken: marked.Token | undefined;\n\tif (lastListSubToken?.type === 'text' && !('inRawBlock' in lastListItem)) { // Why does Tag have a type of 'text'\n\t\tnewToken = completeSingleLinePattern(lastListSubToken as marked.Tokens.Text);\n\t} else if (listEndsInHeading(list)) {\n\t\tconst newList = marked.lexer(list.raw.trim() + ' &nbsp;')[0] as marked.Tokens.List;\n\t\tif (newList.type !== 'list') {\n\t\t\t// Something went wrong\n\t\t\treturn;\n\t\t}\n\t\treturn newList;\n\t}\n\n\tif (!newToken || newToken.type !== 'paragraph') { // 'text' item inside the list item turns into paragraph\n\t\t// Nothing to fix, or not a pattern we were expecting\n\t\treturn;\n\t}\n\n\tconst previousListItemsText = mergeRawTokenText(list.items.slice(0, -1));\n\n\t// Grabbing the `- ` or `1. ` or `* ` off the list item because I can't find a better way to do this\n\tconst lastListItemLead = lastListItem.raw.match(/^(\\s*(-|\\d+\\.|\\*) +)/)?.[0];\n\tif (!lastListItemLead) {\n\t\t// Is badly formatted\n\t\treturn;\n\t}\n\n\tconst newListItemText = lastListItemLead +\n\t\tmergeRawTokenText(lastListItem.tokens.slice(0, -1)) +\n\t\tnewToken.raw;\n\n\tconst newList = marked.lexer(previousListItemsText + newListItemText)[0] as marked.Tokens.List;\n\tif (newList.type !== 'list') {\n\t\t// Something went wrong\n\t\treturn;\n\t}\n\n\treturn newList;\n}\n\nfunction completeHeading(token: marked.Tokens.Heading, fullRawText: string): marked.TokensList | void {\n\tif (token.raw.match(/-\\s*$/)) {\n\t\treturn marked.lexer(fullRawText + ' &nbsp;');\n\t}\n}\n\nconst maxIncompleteTokensFixRounds = 3;\nexport function fillInIncompleteTokens(tokens: marked.TokensList): marked.TokensList {\n\tfor (let i = 0; i < maxIncompleteTokensFixRounds; i++) {\n\t\tconst newTokens = fillInIncompleteTokensOnce(tokens);\n\t\tif (newTokens) {\n\t\t\ttokens = newTokens;\n\t\t} else {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn tokens;\n}\n\nfunction fillInIncompleteTokensOnce(tokens: marked.TokensList): marked.TokensList | null {\n\tlet i: number;\n\tlet newTokens: marked.Token[] | undefined;\n\tfor (i = 0; i < tokens.length; i++) {\n\t\tconst token = tokens[i];\n\n\t\tif (token.type === 'paragraph' && token.raw.match(/(\\n|^)\\|/)) {\n\t\t\tnewTokens = completeTable(tokens.slice(i));\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tconst lastToken = tokens.at(-1);\n\tif (!newTokens && lastToken?.type === 'list') {\n\t\tconst newListToken = completeListItemPattern(lastToken as marked.Tokens.List);\n\t\tif (newListToken) {\n\t\t\tnewTokens = [newListToken];\n\t\t\ti = tokens.length - 1;\n\t\t}\n\t}\n\n\tif (!newTokens && lastToken?.type === 'paragraph') {\n\t\t// Only operates on a single token, because any newline that follows this should break these patterns\n\t\tconst newToken = completeSingleLinePattern(lastToken as marked.Tokens.Paragraph);\n\t\tif (newToken) {\n\t\t\tnewTokens = [newToken];\n\t\t\ti = tokens.length - 1;\n\t\t}\n\t}\n\n\tif (newTokens) {\n\t\tconst newTokensList = [\n\t\t\t...tokens.slice(0, i),\n\t\t\t...newTokens\n\t\t];\n\t\t(newTokensList as marked.TokensList).links = tokens.links;\n\t\treturn newTokensList as marked.TokensList;\n\t}\n\n\tif (lastToken?.type === 'heading') {\n\t\tconst completeTokens = completeHeading(lastToken as marked.Tokens.Heading, mergeRawTokenText(tokens));\n\t\tif (completeTokens) {\n\t\t\treturn completeTokens;\n\t\t}\n\t}\n\n\treturn null;\n}\n\n\nfunction completeCodespan(token: marked.Token): marked.Token {\n\treturn completeWithString(token, '`');\n}\n\nfunction completeStar(tokens: marked.Token): marked.Token {\n\treturn completeWithString(tokens, '*');\n}\n\nfunction completeUnderscore(tokens: marked.Token): marked.Token {\n\treturn completeWithString(tokens, '_');\n}\n\nfunction completeLinkTarget(tokens: marked.Token): marked.Token {\n\treturn completeWithString(tokens, ')', false);\n}\n\nfunction completeLinkTargetArg(tokens: marked.Token): marked.Token {\n\treturn completeWithString(tokens, '\")', false);\n}\n\nfunction completeLinkText(tokens: marked.Token): marked.Token {\n\treturn completeWithString(tokens, '](https://microsoft.com)', false);\n}\n\nfunction completeDoublestar(tokens: marked.Token): marked.Token {\n\treturn completeWithString(tokens, '**');\n}\n\nfunction completeDoubleUnderscore(tokens: marked.Token): marked.Token {\n\treturn completeWithString(tokens, '__');\n}\n\nfunction completeWithString(tokens: marked.Token[] | marked.Token, closingString: string, shouldTrim = true): marked.Token {\n\tconst mergedRawText = mergeRawTokenText(Array.isArray(tokens) ? tokens : [tokens]);\n\n\t// If it was completed correctly, this should be a single token.\n\t// Expecting either a Paragraph or a List\n\tconst trimmedRawText = shouldTrim ? mergedRawText.trimEnd() : mergedRawText;\n\treturn marked.lexer(trimmedRawText + closingString)[0];\n}\n\nfunction completeTable(tokens: marked.Token[]): marked.Token[] | undefined {\n\tconst mergedRawText = mergeRawTokenText(tokens);\n\tconst lines = mergedRawText.split('\\n');\n\n\tlet numCols: number | undefined; // The number of line1 col headers\n\tlet hasSeparatorRow = false;\n\tfor (let i = 0; i < lines.length; i++) {\n\t\tconst line = lines[i].trim();\n\t\tif (typeof numCols === 'undefined' && line.match(/^\\s*\\|/)) {\n\t\t\tconst line1Matches = line.match(/(\\|[^\\|]+)(?=\\||$)/g);\n\t\t\tif (line1Matches) {\n\t\t\t\tnumCols = line1Matches.length;\n\t\t\t}\n\t\t} else if (typeof numCols === 'number') {\n\t\t\tif (line.match(/^\\s*\\|/)) {\n\t\t\t\tif (i !== lines.length - 1) {\n\t\t\t\t\t// We got the line1 header row, and the line2 separator row, but there are more lines, and it wasn't parsed as a table!\n\t\t\t\t\t// That's strange and means that the table is probably malformed in the source, so I won't try to patch it up.\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\n\t\t\t\t// Got a line2 separator row- partial or complete, doesn't matter, we'll replace it with a correct one\n\t\t\t\thasSeparatorRow = true;\n\t\t\t} else {\n\t\t\t\t// The line after the header row isn't a valid separator row, so the table is malformed, don't fix it up\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (typeof numCols === 'number' && numCols > 0) {\n\t\tconst prefixText = hasSeparatorRow ? lines.slice(0, -1).join('\\n') : mergedRawText;\n\t\tconst line1EndsInPipe = !!prefixText.match(/\\|\\s*$/);\n\t\tconst newRawText = prefixText + (line1EndsInPipe ? '' : '|') + `\\n|${' --- |'.repeat(numCols)}`;\n\t\treturn marked.lexer(newRawText);\n\t}\n\n\treturn undefined;\n}\n"]}