当前位置: 首页 > 知识库问答 >
问题:

有没有办法使用tmLanguage语法来扩展vs code integrated markdown extensions语法高亮?

马琛
2023-03-14

我正在为vscode开发一个语言扩展。我定义了一个tmLanguage文件,一切都很好。在悬停功能中,使用vscode.MarkdownString.append代码块()可以正确解释降价,并且我的自定义语言的语法突出显示可以开箱即用,通过执行以下操作:

const content = new MarkdownString("", true)
content.appendMarkdown("## Examples: \n")
content.appendCodeblock(examples, "lmps")

其中示例包含我的自定义语言中的一些示例代码,"l

我想知道是否有办法在网络视图中实现同样的事情。我成功地在web视图中显示内容,将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;
    }

到目前为止还不错,但这样一来,markdown不知道我的自定义语言,也不做任何语法突出显示。(示例图片Webview)现在,我知道可以通过在激活函数中返回一个对象来贡献一个Markdown it插件,从而为Markdown扩展添加语言支持。

export function activate(context: vscode.ExtensionContext) {

...

    return {
        extendMarkdownIt(md: any) {
          return md.use(require('markdown-it-emoji'));
        }
}

然而,如果我认为正确的话,这实际上需要开发一个专用的markdown-it插件。我想知道是否有更简单的方法将我的语言集成到markdown api中。因为vscode显然可以在悬停和完成建议中本地完成。我可以在网络视图中使用此功能吗?或者,有没有一种方法可以从tmLanguage文件生成markdown it插件,而无需深入学习markdownit插件开发?也许有人对这样做的项目有所指点?


共有1个答案

徐安康
2023-03-14

对于任何有同样问题的人:似乎没有一种超级简单的方法。我为这项工作找到的最容易使用的软件包是亮点。但是,这个包(以及其他像大副这样的包)依赖于原生模块Oniguruma。该包需要针对特定版本的Electron进行编译。这使得将 vscode 扩展发布到市场变得非常困难,因为 vscode 不允许在包安装中运行此编译。

我找到的一个解决方案是提供一个突出显示功能来降价它。例如,.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);

然后可以做到:

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

md然后可用于呈现降价内容:

let html = md.render(md_string)

在这里可以找到一个有效的实现

 类似资料:
  • Markdown 标准 本身所包含的功能有限,所以产生了许多第三方的扩展语法,如 GitHub Flavored Markdown。 这里只介绍众多扩展语法中的一部分内容,它们在不同平台或工具的支持程度不同,请参考具体平台或工具的文档和说明来使用。 删除线 代码块和语法高亮 表格 Task List CommonMark CommonMark 试图将碎片化的 Markdown 实现和扩展进行标准化

  • Markdown 的目标是实现「易读易写」。 可读性,无论如何,都是最重要的。一份使用 Markdown 格式撰写的文件应该可以直接以纯文本发布,并且看起来不会像是由许多标签或是格式指令所构成。Markdown 语法受到一些既有 text-to-HTML 格式的影响,包括 Setext、atx、Textile、reStructuredText、Grutatext 和 EtText,而最大灵感来源其

  • 我有一个组件,它基本上从输入中获取所有内容并呈现html: 现在,当我开始输入时,它显然会向我抛出错误,说输入值没有结束或结束标记。 有没有办法事先验证HTML?它适用于v-html,但第三方模块存在问题。 沙盒:https://codesandbox.io/s/vruntimetemplate-27bdz?fontsize=14

  • 记事本有一个语言菜单,我们可以使用它来设置当前文件的语言而无需保存它,它提供了语法突出显示。这对于快速检查内容很有用,例如,粘贴XML文件并快速分析它,键入一些JS代码并将其复制到控制台中。 有没有办法在vscode中实现这一点?

  • 问题内容: 我想在AJAX和常规HTTP调用之间共享一个模板,唯一的区别是一个模板需要与base.html html一起提供,而另一个则不需要。 任何想法? 问题答案: 使用变量。 然后在您的视图中将其设置为“ base.html”,或者将其设置为一个新的“ ajax.html”文件,该文件仅提供该阻止,而没有其他内容。

  • 问题内容: 假设我有以下情况: 有没有一种方法可以保证实现的任何类也必须扩展?我不想创建一个抽象类,因为我希望能够以类似的方式混合其他一些接口。 例如: 问题答案: Java接口无法扩展类,这很有意义,因为类包含无法在接口内指定的实现细节。 解决此问题的正确方法是通过将接口也完全从实现中分离出来。所述等可以扩展接口以迫使程序员来实现相应的方法。如果要在所有实例之间共享代码,则可以将(可能是抽象的)