如何调用Visual Studio Code中的Markdown渲染器

3
Visual Studio Code的Markdown预览使用支持插件生态系统的“markdown-it”。文档化了这个渲染流程的扩展,但是这并没有考虑到除了Markdown预览窗格以外的客户端可能性。
我如何使用内置的Markdown渲染?如果有帮助的话,我的用例是打印。我为Visual Studio Code编写了一个打印扩展程序,自然的增强是在打印时呈现Markdown。
目前,我正在有效地重新创建渲染流程。除了明显的冗余之外,我想使用内置的渲染是为了继承任何配置过的扩展,以便打印出的内容与预览具有相同的能力。
Markdown预览窗格似乎被实现为虚拟文档,它是渲染流程的客户端。哪个存储库和文件包含Markdown预览窗格的实现?
1个回答

3

看起来有一个MarkdownEngine类,根据配置来管理插件的加载,虽然似乎没有办法引用MarkdownIt实例,但是这里定义了一个渲染方法。

https://github.com/Microsoft/vscode/blob/fa5306d67bb934c42d206fb3c7e028dff00d530f/extensions/markdown-language-features/src/markdownEngine.ts#L96

所以从表面上看,你只需要导入MarkdownEngine并使用该方法。然而,目前不支持此操作。我已经记录了一个功能请求
作者不想公开MarkdownEngine,但他们提出了提供一个渲染方法的建议。
那是最终答案,但现在没有任何帮助。在此期间,可以获得对Visual Studio Code的markdownIt实例的引用。
将您的扩展更改为伪装成Markdown插件。请注意,在添加插件的文档中指出:

Then, in the extension's main activation function, return an object with a function named extendMarkdownIt. This function takes the current MarkdownIt instance and must return a new MarkdownIt instance:

import * as vscode from 'vscode';

export function activate(context: vscode.ExtensionContext) {
  return {
    extendMarkdownIt(md: any) {
      return md.use(require('markdown-it-emoji'));
    }
  };
}

这是您抓住 Markdown 渲染器的机会。将您的扩展修改为 Markdown 插件:

"contributes": {
    "markdown.markdownItPlugins": true,

给它一个私有属性来保存MarkdownIt实例的引用。不需要强类型化,这会要求你打包MarkdownIt库。
var md: any;

然后,在您的激活方法末尾添加以下内容以捕获引用。

return { extendMarkdownIt(mdparam: any) { return md = mdparam; } };

当管道初始化时,它将调用您提供的回调函数并传递对自身的引用。您的其余代码可以从该属性中获取它。
这个技巧取决于渲染管道早期加载,无论您是否使用Markdown预览窗格。幸运的是,它确实如此。

我尝试了这个方法,一切都很好,直到我发现一个警告:VS Code在其自己的数据结构中使用此Markdown实例,其中有些数据只有在VS Code想要重置时才会被重置,并且它在设置某些Markdown规则函数时使用此数据。当您多次呈现相同的.md文件时,它不会重置标题ID的计数器,它们将获得不正确的“-1”、“-2”等后缀,这使得自动生成的链接(如目录)失败。我无法找到解决方法,最终我自己制作了一个项目来调用markdown-it,这实际上并不那么糟糕。 - John Haggerty
@JohnHaggerty 这就是为什么我渲染字符串而不是文件的原因。 - Peter Wone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接