mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
IDEA-213112 introduce HTML in markdown
GitOrigin-RevId: 3a3bc07feda3b94de0312167b331ffcfb5ceeba2
This commit is contained in:
committed by
intellij-monorepo-bot
parent
23154edb0f
commit
0297955bd6
@@ -31,6 +31,7 @@ Includes the following features:</p>
|
||||
|
||||
<extensions defaultExtensionNs="com.intellij">
|
||||
<fileTypeFactory implementation="org.intellij.plugins.markdown.lang.MarkdownFileTypeFactory"/>
|
||||
<lang.fileViewProviderFactory language="Markdown" implementationClass="org.intellij.plugins.markdown.lang.MarkdownFileViewProviderFactory"/>
|
||||
<lang.parserDefinition language="Markdown" implementationClass="org.intellij.plugins.markdown.lang.parser.MarkdownParserDefinition"/>
|
||||
<lang.ast.factory language="Markdown" implementationClass="org.intellij.plugins.markdown.lang.psi.MarkdownASTFactory"/>
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
*/
|
||||
package org.intellij.plugins.markdown.lang;
|
||||
|
||||
import com.intellij.psi.templateLanguages.TemplateDataElementType;
|
||||
import com.intellij.psi.tree.IElementType;
|
||||
import com.intellij.psi.tree.IFileElementType;
|
||||
import com.intellij.psi.tree.IStubFileElementType;
|
||||
@@ -22,6 +23,7 @@ import org.intellij.markdown.flavours.gfm.GFMElementTypes;
|
||||
import org.intellij.markdown.flavours.gfm.GFMTokenTypes;
|
||||
|
||||
import static org.intellij.plugins.markdown.lang.MarkdownElementType.platformType;
|
||||
import static org.intellij.plugins.markdown.lang.MarkdownTokenTypes.HTML_BLOCK_CONTENT;
|
||||
|
||||
public interface MarkdownElementTypes {
|
||||
IFileElementType MARKDOWN_FILE_ELEMENT_TYPE = new IStubFileElementType("Markdown file", MarkdownLanguage.INSTANCE);
|
||||
@@ -62,6 +64,11 @@ public interface MarkdownElementTypes {
|
||||
|
||||
IElementType HTML_BLOCK = platformType(org.intellij.markdown.MarkdownElementTypes.HTML_BLOCK);
|
||||
|
||||
IElementType MARKDOWN_OUTER_BLOCK = new IElementType("MARKDOWN_OUTER_BLOCK", MarkdownLanguage.INSTANCE);
|
||||
|
||||
TemplateDataElementType MARKDOWN_TEMPLATE_DATA =
|
||||
new TemplateDataElementType("MARKDOWN_TEMPLATE_DATA", MarkdownLanguage.INSTANCE, HTML_BLOCK_CONTENT, MARKDOWN_OUTER_BLOCK);
|
||||
|
||||
IElementType AUTOLINK = platformType(org.intellij.markdown.MarkdownElementTypes.AUTOLINK);
|
||||
|
||||
IElementType TABLE = platformType(GFMElementTypes.TABLE);
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
|
||||
package org.intellij.plugins.markdown.lang
|
||||
|
||||
import com.intellij.lang.Language
|
||||
import com.intellij.lang.LanguageParserDefinitions
|
||||
import com.intellij.lang.StdLanguages
|
||||
import com.intellij.openapi.vfs.VirtualFile
|
||||
import com.intellij.psi.*
|
||||
import com.intellij.psi.impl.source.PsiFileImpl
|
||||
import com.intellij.psi.templateLanguages.TemplateLanguageFileViewProvider
|
||||
import gnu.trove.THashSet
|
||||
import org.intellij.plugins.markdown.lang.MarkdownElementTypes.MARKDOWN_TEMPLATE_DATA
|
||||
import org.intellij.plugins.markdown.lang.psi.impl.MarkdownFile
|
||||
|
||||
class MarkdownFileViewProvider(manager: PsiManager, virtualFile: VirtualFile, eventSystemEnabled: Boolean)
|
||||
: MultiplePsiFilesPerDocumentFileViewProvider(manager, virtualFile, eventSystemEnabled), TemplateLanguageFileViewProvider {
|
||||
|
||||
private val myRelevantLanguages = THashSet<Language>()
|
||||
|
||||
init {
|
||||
myRelevantLanguages.add(baseLanguage)
|
||||
myRelevantLanguages.add(templateDataLanguage)
|
||||
}
|
||||
|
||||
override fun createFile(lang: Language): PsiFile? {
|
||||
if (lang === MarkdownLanguage.INSTANCE) {
|
||||
return MarkdownFile(this)
|
||||
}
|
||||
|
||||
val parserDefinition = LanguageParserDefinitions.INSTANCE.forLanguage(lang) ?: return null
|
||||
|
||||
val psiFile = parserDefinition.createFile(this)
|
||||
if (lang === templateDataLanguage && psiFile is PsiFileImpl) {
|
||||
psiFile.contentElementType = MARKDOWN_TEMPLATE_DATA
|
||||
}
|
||||
|
||||
return psiFile
|
||||
}
|
||||
|
||||
override fun getBaseLanguage(): Language = MarkdownLanguage.INSTANCE
|
||||
|
||||
override fun getLanguages(): Set<Language> = myRelevantLanguages
|
||||
|
||||
override fun getTemplateDataLanguage(): Language = StdLanguages.HTML
|
||||
|
||||
override fun cloneInner(fileCopy: VirtualFile): MultiplePsiFilesPerDocumentFileViewProvider =
|
||||
MarkdownFileViewProvider(manager, fileCopy, false)
|
||||
}
|
||||
|
||||
class MarkdownFileViewProviderFactory : FileViewProviderFactory {
|
||||
override fun createFileViewProvider(file: VirtualFile,
|
||||
language: Language,
|
||||
manager: PsiManager,
|
||||
eventSystemEnabled: Boolean): FileViewProvider =
|
||||
MarkdownFileViewProvider(manager, file, eventSystemEnabled)
|
||||
}
|
||||
@@ -42,9 +42,6 @@ public enum MarkdownPsiFactory {
|
||||
if (elementType == MarkdownElementTypes.CODE_BLOCK) {
|
||||
return new MarkdownCodeBlockImpl(node);
|
||||
}
|
||||
if (elementType == MarkdownElementTypes.HTML_BLOCK) {
|
||||
return new MarkdownHtmlBlockImpl(node);
|
||||
}
|
||||
if (elementType == MarkdownElementTypes.TABLE) {
|
||||
return new MarkdownTableImpl(node);
|
||||
}
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
<table></table>
|
||||
@@ -0,0 +1,11 @@
|
||||
HtmlFile:html1.md
|
||||
PsiElement(HTML_DOCUMENT)
|
||||
PsiElement(XML_PROLOG)
|
||||
<empty list>
|
||||
HtmlTag:table
|
||||
XmlToken:XML_START_TAG_START('<')
|
||||
XmlToken:XML_NAME('table')
|
||||
XmlToken:XML_TAG_END('>')
|
||||
XmlToken:XML_END_TAG_START('</')
|
||||
XmlToken:XML_NAME('table')
|
||||
XmlToken:XML_TAG_END('>')
|
||||
@@ -0,0 +1,4 @@
|
||||
<table>
|
||||
|
||||
**bold**
|
||||
</table>
|
||||
@@ -0,0 +1,12 @@
|
||||
HtmlFile:html2.md
|
||||
PsiElement(HTML_DOCUMENT)
|
||||
PsiElement(XML_PROLOG)
|
||||
<empty list>
|
||||
HtmlTag:table
|
||||
XmlToken:XML_START_TAG_START('<')
|
||||
XmlToken:XML_NAME('table')
|
||||
XmlToken:XML_TAG_END('>')
|
||||
PsiElement(MARKDOWN_OUTER_BLOCK)('\n\n**bold**\n')
|
||||
XmlToken:XML_END_TAG_START('</')
|
||||
XmlToken:XML_NAME('table')
|
||||
XmlToken:XML_TAG_END('>')
|
||||
@@ -0,0 +1,9 @@
|
||||
#header
|
||||
|
||||
<table>
|
||||
|
||||
#header
|
||||
|
||||
</table>
|
||||
|
||||
#header
|
||||
@@ -0,0 +1,14 @@
|
||||
HtmlFile:html3.md
|
||||
PsiElement(HTML_DOCUMENT)
|
||||
PsiElement(XML_PROLOG)
|
||||
<empty list>
|
||||
PsiElement(MARKDOWN_OUTER_BLOCK)('#header\n\n')
|
||||
HtmlTag:table
|
||||
XmlToken:XML_START_TAG_START('<')
|
||||
XmlToken:XML_NAME('table')
|
||||
XmlToken:XML_TAG_END('>')
|
||||
PsiElement(MARKDOWN_OUTER_BLOCK)('\n\n#header\n\n')
|
||||
XmlToken:XML_END_TAG_START('</')
|
||||
XmlToken:XML_NAME('table')
|
||||
XmlToken:XML_TAG_END('>')
|
||||
PsiElement(MARKDOWN_OUTER_BLOCK)('\n\n#header')
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
|
||||
package org.intellij.plugins.markdown.html
|
||||
|
||||
import com.intellij.lang.html.HTMLLanguage
|
||||
import com.intellij.psi.impl.DebugUtil
|
||||
import com.intellij.testFramework.fixtures.LightPlatformCodeInsightFixtureTestCase
|
||||
import junit.framework.TestCase
|
||||
import org.intellij.plugins.markdown.MarkdownTestingUtil
|
||||
|
||||
class MarkdownEmbeddedHtmlTest : LightPlatformCodeInsightFixtureTestCase() {
|
||||
override fun getTestDataPath(): String {
|
||||
return MarkdownTestingUtil.TEST_DATA_PATH + "/html/embedded/"
|
||||
}
|
||||
|
||||
fun testHtml1() = doTest()
|
||||
|
||||
fun testHtml2() = doTest()
|
||||
|
||||
fun testHtml3() = doTest()
|
||||
|
||||
fun doTest() {
|
||||
val name = getTestName(true)
|
||||
val file = myFixture.configureByFile("$name.md")
|
||||
|
||||
val psi = DebugUtil.psiToString(file.viewProvider.getPsi(HTMLLanguage.INSTANCE), false, false)
|
||||
val tree = myFixture.configureByFile("$name.txt").text
|
||||
|
||||
TestCase.assertEquals(psi, tree)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user