【发布时间】:2019-03-28 00:45:18
【问题描述】:
小结
所以,我尝试在我的项目中使用MDX。它只是 MarkDown 与一些 JSX(包括 ES6 导入)混合在一起。我想使用 IntelliJ 编辑文件并为 Markdown 位和 JSX 位获得正确的语法突出显示。
我想我应该可以为此配置一个language injection,但我在尝试前进时有点停滞不前。看起来我需要自己编写 XML,因为我想要的语言语法是 JSX,而 UI 中唯一的目标语言是 xml、js、sql 和其他一些常见的语言。
我的尝试
查看Groovy injections 和Java injections 的来源,我开始拼凑我需要的东西。
我 looked at the PSI Structure 我的一个示例 MDX 文件(我已告诉 IntelliJ 将其视为 Markdown)。我可以看到我的 JSX 标记被注册为 HTML_TAG 元素。
<?xml version="1.0" encoding="UTF-8"?>
<component name="LanguageInjectionConfiguration">
<injection language="JSX" injector-id="markdown">
<display-name>JSX in Markdown</display-name>
<place><![CDATA[psiElement().withElementType(org.intellij.plugins.markdown.lang.MarkdownTokenTypes.HTML_TAG)]]></place>
</injection>
</component>
IntelliJ 无法导入它,并显示一条消息“没有导入新条目”。然后我查看了一个示例导出,发现我应该使用<LanguageInjectionConfiguration> 标签,所以我尝试了:
<LanguageInjectionConfiguration>
<injection language="JSX" injector-id="markdown" enabled="true">
<display-name>JSX in Markdown</display-name>
<place><![CDATA[psiElement().withElementType(org.intellij.plugins.markdown.lang.MarkdownTokenTypes.HTML_TAG)]]></place>
</injection>
</LanguageInjectionConfiguration>
...但是,我收到了同样的错误。
查看 IntelliJ 日志,它显示此错误:
2018-10-23 12:17:28,680 [3894254] 警告 - s.compiler.PatternCompilerImpl - Markdown 中的 JSX:psiElement().withElementType(org.intellij.plugins.markdown.lang.MarkdownTokenTypes.HTML_TAG)
java.lang.IllegalStateException: 33(.): 'org.'方法名 start 无效,应为 '('
在 com.intellij.patterns.compiler.PatternCompilerImpl.throwError(PatternCompilerImpl.java:293)
...长长的堆栈跟踪...
在 java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
MarkdownTokenTypes.HTML_TAG 绝对是one of the withElementType method signatures 所需的IElementType。
结论
我担心我把事情复杂化了。是否有编写自定义语言注入的好指南?我不清楚 place 标记的返回类型应该是什么,也不清楚我是否应该使用模式而不是位置。
【问题讨论】:
-
就上下文而言,我知道 IntelliJ 支持对于 MDX 项目和 JetBrains 来说都是一个悬而未决的问题。 github.com/mdx-js/mdx/issues/119 youtrack.jetbrains.com/oauth?state=%2Fissue%2FWEB-32599 这似乎是一个低调的贡献,但我不能完全掌握如何制作一个像样的语言注入器。
标签: intellij-idea markdown jsx remarkjs