ThF*_*ich 5 markdown visual-studio-code tmlanguage vscode-extensions markdown-it
我正在开发 vscode 的语言扩展。我定义了一个 tmLanguage 文件,一切运行良好。在悬停功能中,使用vscode.MarkdownString.appendCodeblock()markdown 被正确解释,并且我的自定义语言的语法突出显示可以开箱即用,通过执行以下操作:
const content = new MarkdownString("", true)
content.appendMarkdown("## Examples: \n")
content.appendCodeblock(examples, "lmps")
Run Code Online (Sandbox Code Playgroud)
其中examples包含我的自定义语言的一些示例代码,"lmps"是我的语言标识符。(图像悬停示例)
我想知道是否有办法在网络视图中实现同样的事情。我成功地在 webview 中显示了content,将 markdownString 编译成 html:
async function set_doc_panel_content(panel: DocPanel | undefined, md_content: vscode.MarkdownString) {
const html: string = await vscode.commands.executeCommand('markdown.api.render', md_content.value) as string;
panel!.webview.html = html;
}
Run Code Online (Sandbox Code Playgroud)
到目前为止一切都很好,但是通过这种方式,Markdown 不知道我的自定义语言,并且不做任何语法突出显示。(示例图像 Webview)现在,我了解到向 Markdown 扩展添加语言支持可以通过在激活函数中返回一个对象来贡献一个 markdown-it 插件来实现。
export function activate(context: vscode.ExtensionContext) {
...
return {
extendMarkdownIt(md: any) {
return md.use(require('markdown-it-emoji'));
}
}
Run Code Online (Sandbox Code Playgroud)
然而,如果我没看错的话,这实际上需要开发一个专用的 markdown-it 插件。我想知道是否有更简单的方法将我的语言集成到 markdown api 中。因为 vscode 显然已经可以在悬停和完成建议中本地完成此操作。我可以以某种方式在网络视图中使用这个功能吗?或者,有没有一种方法可以从 tmLanguage 文件生成 markdown-it 插件,而无需深入学习 markdown-it 插件开发?也许有人指出做过类似事情的项目?
对于遇到同样问题的人:似乎没有超级简单的方法。我为这项工作找到的最容易使用的包是highlights。然而,这个包(以及其他像first-mate)依赖于本机模块Oniguruma。该包需要针对特定版本的 Electron 进行编译。这使得将 vscode 扩展发布到市场变得非常困难,因为 vscode 不允许在包安装中运行此编译。
我发现的一个解决方案是为 markdown-it 提供突出显示功能。例如,.plist 或 .tmLanguage 语法可以通过vscode-textmate读取。该包可以与vscode-oniguruma一起使用。这里的技巧是加载 WASM 才能使其工作:
const oniguruma = require('vscode-oniguruma')
const oniguruma_root: string = path.join(env.appRoot, 'node_modules.asar', 'vscode-oniguruma')
const wasm = readFileSync(path.join(oniguruma_root, 'release', 'onig.wasm')).buffer;
const on_wasm = oniguruma.loadWASM(wasm);
Run Code Online (Sandbox Code Playgroud)
然后可以这样做:
const registry = new vsctm.Registry({
onigLib: Promise.resolve({
createOnigScanner: (sources) => new oniguruma.OnigScanner(sources),
createOnigString: (str) => new oniguruma.OnigString(str)
}),
loadGrammar: () => {
return readJSON2plist(path.join(context.extensionPath, 'syntaxes', 'lmps.tmLanguage.json'))
.then(data => {
return vsctm.parseRawGrammar(data)
}).catch(null)
}
});
const grammar = await registry.loadGrammar('source.lmps')
const md = require('markdown-it')(
{
html: true,
linkify: true,
typographer: true,
langPrefix: '',
highlight: function (str: string, lang: string) {
if (grammar && lang && lang == 'lmps') {
return tokenize_lmps(str, grammar)
}
}
});
return md
Run Code Online (Sandbox Code Playgroud)
md然后可以用来渲染 markdown 内容:
let html = md.render(md_string)
Run Code Online (Sandbox Code Playgroud)
可以在这里找到有效的实现
| 归档时间: |
|
| 查看次数: |
1184 次 |
| 最近记录: |