首页 > 解决方案 > 如何调用 Visual Studio Code Markdown 渲染器

问题描述

markdown-it支持插件生态系统的 Visual Studio Code Markdown 预览版使用。

此渲染管道的扩展已记录在案,但这并未考虑除 markdown 预览窗格之外的客户端的可能性。

如何使用内置的 Markdown 渲染?

如果有帮助,我的用例是打印。我为 Visual Studio Code 编写了一个打印扩展,它的自然增强是在打印时呈现 Markdown。

目前我正在有效地重新创建渲染管道。除了明显的冗余之外,我想使用内置渲染的原因是继承任何配置的扩展,以便打印输出与预览功能相匹配。

期望 Markdown 预览窗格被实现为作为渲染管道客户端的虚拟文档似乎是合理的。哪些存储库和文件包含 Markdown 预览窗格的实现?

标签: visual-studio-codemarkdownvscode-extensions

解决方案


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

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

所以从表面上看,你需要做的就是导入 MarkdownEngine 并使用这个方法。但是,目前不支持此功能。我已经记录了一个功能请求

作者不想暴露 MarkdownEngine,但他们建议提供一个渲染方法。


这是最终的答案,但现在没有任何帮助。在此期间,可以获得对 Visual Studio CodemarkdownIt实例的引用。

将您的扩展更改为伪装成 Markdown 插件。请注意,在添加插件的文档中它说:

然后,在扩展的主激活函数中,返回一个对象,其函数名为 extendMarkdownIt。这个函数接受当前的 MarkdownIt 实例并且必须返回一个新的 MarkdownIt 实例:

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 预览窗格,此技巧都取决于提前加载渲染管道。很高兴它确实如此。


推荐阅读