Skip to content

Commit

Permalink
highlighting via lang
Browse files Browse the repository at this point in the history
  • Loading branch information
denofevil committed Jan 11, 2017
1 parent 42d1725 commit b9a0aeb
Show file tree
Hide file tree
Showing 5 changed files with 84 additions and 37 deletions.
1 change: 1 addition & 0 deletions vuejs/resources/META-INF/plugin.xml
Expand Up @@ -9,5 +9,6 @@
<extensions defaultExtensionNs="com.intellij">
<fileTypeFactory implementation="org.jetbrains.vuejs.VueFileTypeFactory" />
<lang.parserDefinition language="Vue" implementationClass="org.jetbrains.vuejs.language.VueParserDefinition" />
<lang.syntaxHighlighterFactory language="Vue" implementationClass="org.jetbrains.vuejs.language.VueSyntaxHighlighterFactory" />
</extensions>
</idea-plugin>
22 changes: 22 additions & 0 deletions vuejs/src/org/jetbrains/vuejs/language/VueHandledLexer.kt
@@ -1,9 +1,31 @@
package org.jetbrains.vuejs.language

import com.intellij.lang.HtmlScriptContentProvider
import com.intellij.lang.Language
import com.intellij.lang.LanguageHtmlScriptContentProvider

interface VueHandledLexer {
fun seenScript():Boolean
fun setSeenScriptType()
fun seenStyle():Boolean
fun setSeenStyleType()
fun seenTag():Boolean
fun getScriptType(): String?
fun getStyleType(): String?

fun scriptContentViaLang(): HtmlScriptContentProvider? {
return Language.getRegisteredLanguages()
.filter { getScriptType()!!.equals(it.id, ignoreCase = true) }
.map { LanguageHtmlScriptContentProvider.getScriptContentProvider(it) }
.firstOrNull { it != null }
}

fun styleViaLang(default: Language?): Language? {
if (default != null && getStyleType() != null) {
default.dialects
.filter { getStyleType().equals(it.id, ignoreCase = true) }
.forEach { return it }
}
return null
}
}
35 changes: 35 additions & 0 deletions vuejs/src/org/jetbrains/vuejs/language/VueHighlightingLexer.kt
@@ -0,0 +1,35 @@
package org.jetbrains.vuejs.language

import com.intellij.lang.HtmlScriptContentProvider
import com.intellij.lang.Language
import com.intellij.lexer.HtmlHighlightingLexer
import com.intellij.psi.xml.XmlTokenType

class VueHighlightingLexer : HtmlHighlightingLexer(), VueHandledLexer {
init {
registerHandler(XmlTokenType.XML_NAME, VueLangAttributeHandler())
}

override fun findScriptContentProvider(mimeType: String?): HtmlScriptContentProvider? {
val type = super.findScriptContentProvider(mimeType ?: "text/ecmascript-6")
return type ?: scriptContentViaLang()
}

override fun getStyleLanguage(): Language? {
return styleViaLang(ourDefaultStyleLanguage) ?: super.getStyleLanguage()
}

override fun seenScript() = seenScript
override fun seenStyle()= seenStyle
override fun seenTag() = seenTag
override fun getScriptType() = scriptType
override fun getStyleType() = styleType

override fun setSeenScriptType() {
seenContentType = true
}

override fun setSeenStyleType() {
seenStylesheetType = true
}
}
47 changes: 10 additions & 37 deletions vuejs/src/org/jetbrains/vuejs/language/VueLexer.kt
@@ -1,53 +1,29 @@
package org.jetbrains.vuejs.language

import com.intellij.lang.HtmlScriptContentProvider
import com.intellij.lang.Language
import com.intellij.lang.LanguageHtmlScriptContentProvider
import com.intellij.lexer.BaseHtmlLexer
import com.intellij.lexer.HtmlLexer
import com.intellij.psi.tree.IElementType
import com.intellij.psi.xml.XmlTokenType

class VueLexer : HtmlLexer(), VueHandledLexer {
init {
registerHandler(XmlTokenType.XML_NAME, VueLangAttributeHandler())
}

override fun getCurrentScriptElementType(): IElementType? {
if (scriptType == null) {
val provider = BaseHtmlLexer.findScriptContentProvider("text/ecmascript-6")
return provider?.scriptElementType
}
val type = super.getCurrentScriptElementType()
if (type != null) return type
for (language in Language.getRegisteredLanguages()) {
if (scriptType!!.equals(language.id, ignoreCase = true)) {
val scriptContentProvider = LanguageHtmlScriptContentProvider.getScriptContentProvider(language)
if (scriptContentProvider != null) {
return scriptContentProvider.scriptElementType
}
}
}
return null
override fun findScriptContentProvider(mimeType: String?): HtmlScriptContentProvider? {
val type = super.findScriptContentProvider(mimeType ?: "text/ecmascript-6")
return type ?: scriptContentViaLang()
}

override fun getStyleLanguage(): Language? {
if (ourDefaultStyleLanguage != null && styleType != null) {
for (language in ourDefaultStyleLanguage!!.dialects) {
if (styleType.equals(language.id, ignoreCase = true)) {
return language
}
}
}
return super.getStyleLanguage()
return styleViaLang(ourDefaultStyleLanguage) ?: super.getStyleLanguage()
}

override fun seenScript(): Boolean {
return seenScript
}

override fun seenStyle(): Boolean {
return seenStyle
}
override fun seenScript() = seenScript
override fun seenStyle()= seenStyle
override fun seenTag() = seenTag
override fun getScriptType() = scriptType
override fun getStyleType() = styleType

override fun setSeenScriptType() {
seenContentType = true
Expand All @@ -57,7 +33,4 @@ class VueLexer : HtmlLexer(), VueHandledLexer {
seenStylesheetType = true
}

override fun seenTag(): Boolean {
return seenTag
}
}
@@ -0,0 +1,16 @@
package org.jetbrains.vuejs.language

import com.intellij.ide.highlighter.HtmlFileHighlighter
import com.intellij.lexer.Lexer
import com.intellij.openapi.fileTypes.SingleLazyInstanceSyntaxHighlighterFactory
import com.intellij.openapi.fileTypes.SyntaxHighlighter

class VueSyntaxHighlighterFactory : SingleLazyInstanceSyntaxHighlighterFactory() {
override fun createHighlighter(): SyntaxHighlighter {
return object : HtmlFileHighlighter() {
override fun getHighlightingLexer(): Lexer {
return VueHighlightingLexer()
}
}
}
}

0 comments on commit b9a0aeb

Please sign in to comment.