IDEA-213112 introduce HTML in markdown

GitOrigin-RevId: 3a3bc07feda3b94de0312167b331ffcfb5ceeba2
This commit is contained in:
Dmitry.Krasilschikov
2019-05-21 19:13:45 +03:00
committed by intellij-monorepo-bot
parent 23154edb0f
commit 0297955bd6
11 changed files with 145 additions and 3 deletions
@@ -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')
@@ -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)
}
}