diff options
author | Tor Norbye <tnorbye@google.com> | 2014-09-18 11:43:07 -0700 |
---|---|---|
committer | Tor Norbye <tnorbye@google.com> | 2014-09-18 11:43:28 -0700 |
commit | e782c57d74000722f9db4c9426317410520670c6 (patch) | |
tree | 6e5d3e8934107ffabb7661f8bfc0e1a08eb37faf /xml/xml-psi-impl/src/com/intellij/lexer/HtmlHighlightingLexer.java | |
parent | c3d3a90f6b4ead083d63e28e6b9fcea93d675678 (diff) | |
download | idea-e782c57d74000722f9db4c9426317410520670c6.tar.gz |
Snapshot idea/138.2210 from git://git.jetbrains.org/idea/community.git
Change-Id: I8f0204d7887ee78cf1fd8c09f936c5afff0edd2f
Diffstat (limited to 'xml/xml-psi-impl/src/com/intellij/lexer/HtmlHighlightingLexer.java')
-rw-r--r-- | xml/xml-psi-impl/src/com/intellij/lexer/HtmlHighlightingLexer.java | 121 |
1 files changed, 67 insertions, 54 deletions
diff --git a/xml/xml-psi-impl/src/com/intellij/lexer/HtmlHighlightingLexer.java b/xml/xml-psi-impl/src/com/intellij/lexer/HtmlHighlightingLexer.java index eeae1d318e15..1d20283aa708 100644 --- a/xml/xml-psi-impl/src/com/intellij/lexer/HtmlHighlightingLexer.java +++ b/xml/xml-psi-impl/src/com/intellij/lexer/HtmlHighlightingLexer.java @@ -15,74 +15,41 @@ */ package com.intellij.lexer; -import com.intellij.lang.*; +import com.intellij.lang.HtmlInlineScriptTokenTypesProvider; +import com.intellij.lang.HtmlScriptContentProvider; +import com.intellij.lang.Language; +import com.intellij.lang.LanguageHtmlInlineScriptTokenTypesProvider; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.fileTypes.*; +import com.intellij.openapi.fileTypes.FileType; +import com.intellij.openapi.fileTypes.PlainTextLanguage; +import com.intellij.openapi.fileTypes.SyntaxHighlighter; +import com.intellij.openapi.fileTypes.SyntaxHighlighterFactory; import com.intellij.psi.tree.IElementType; import com.intellij.psi.xml.XmlTokenType; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.HashMap; +import java.util.Map; + public class HtmlHighlightingLexer extends BaseHtmlLexer { private static final Logger LOG = Logger.getInstance("#com.intellij.lexer.HtmlHighlightingLexer"); private static final int EMBEDDED_LEXER_ON = 0x1 << BASE_STATE_SHIFT; private static final int EMBEDDED_LEXER_STATE_SHIFT = BASE_STATE_SHIFT + 1; - - private Lexer embeddedLexer; - private Lexer styleLexer; - private Lexer scriptLexer; - protected Lexer elLexer; - private boolean hasNoEmbeddments; - private final FileType ourStyleFileType;// = FileTypeManager.getInstance().getStdFileType("CSS"); private static final FileType ourInlineScriptFileType; - - static { // At the moment only JS. HtmlInlineScriptTokenTypesProvider provider = LanguageHtmlInlineScriptTokenTypesProvider.getInlineScriptProvider(Language.findLanguageByID("JavaScript")); ourInlineScriptFileType = provider != null ? provider.getFileType() : null; } - - public class XmlEmbeddmentHandler implements TokenHandler { - @Override - public void handleElement(Lexer lexer) { - if (!hasSeenStyle() && !hasSeenScript() || hasNoEmbeddments) return; - final IElementType tokenType = lexer.getTokenType(); - - if (tokenType == XmlTokenType.XML_ATTRIBUTE_VALUE_TOKEN && hasSeenAttribute() || - tokenType == XmlTokenType.XML_DATA_CHARACTERS && hasSeenTag() || - tokenType == XmlTokenType.XML_COMMENT_CHARACTERS && hasSeenTag() - ) { - setEmbeddedLexer(); - - if (embeddedLexer != null) { - embeddedLexer.start( - getBufferSequence(), - HtmlHighlightingLexer.super.getTokenStart(), - skipToTheEndOfTheEmbeddment(), - embeddedLexer instanceof EmbedmentLexer ? ((EmbedmentLexer)embeddedLexer).getEmbeddedInitialState(tokenType) : 0 - ); - - if (embeddedLexer.getTokenType() == null) { - // no content for embeddment - embeddedLexer = null; - } - } - } - } - } - - public class ElEmbeddmentHandler implements TokenHandler { - @Override - public void handleElement(Lexer lexer) { - setEmbeddedLexer(); - if (embeddedLexer != null) { - embeddedLexer.start(getBufferSequence(), HtmlHighlightingLexer.super.getTokenStart(), HtmlHighlightingLexer.super.getTokenEnd()); - } - } - } + private final FileType ourStyleFileType;// = FileTypeManager.getInstance().getStdFileType("CSS"); + protected Lexer elLexer; + private Lexer embeddedLexer; + private Lexer styleLexer; + private Map<String, Lexer> scriptLexers = new HashMap<String, Lexer>(); + private boolean hasNoEmbeddments; public HtmlHighlightingLexer() { this(null); @@ -114,7 +81,7 @@ public class HtmlHighlightingLexer extends BaseHtmlLexer { } else { embeddedLexer = null; - scriptLexer = null; + scriptLexers.clear(); } } @@ -122,14 +89,20 @@ public class HtmlHighlightingLexer extends BaseHtmlLexer { Lexer newLexer = null; if (hasSeenStyle()) { if (styleLexer == null) { - styleLexer = ourStyleFileType == null - ? null - : SyntaxHighlighterFactory.getSyntaxHighlighter(ourStyleFileType, null, null).getHighlightingLexer(); + if (ourStyleFileType == null) { + styleLexer = null; + } + else { + SyntaxHighlighter highlighter = SyntaxHighlighterFactory.getSyntaxHighlighter(ourStyleFileType, null, null); + LOG.assertTrue(highlighter != null, ourStyleFileType); + styleLexer = highlighter.getHighlightingLexer(); + } } newLexer = styleLexer; } else if (hasSeenScript()) { + Lexer scriptLexer = scriptLexers.get(scriptType); if (scriptLexer == null) { if (hasSeenTag()) { HtmlScriptContentProvider provider = findScriptContentProvider(scriptType); @@ -145,6 +118,7 @@ public class HtmlHighlightingLexer extends BaseHtmlLexer { ourInlineScriptFileType != null ? SyntaxHighlighterFactory.getSyntaxHighlighter(ourInlineScriptFileType, null, null) : null; scriptLexer = syntaxHighlighter != null ? syntaxHighlighter.getHighlightingLexer() : null; } + scriptLexers.put(scriptType, scriptLexer); } newLexer = scriptLexer; } @@ -254,4 +228,43 @@ public class HtmlHighlightingLexer extends BaseHtmlLexer { public void setHasNoEmbeddments(boolean hasNoEmbeddments) { this.hasNoEmbeddments = hasNoEmbeddments; } + + public class XmlEmbeddmentHandler implements TokenHandler { + @Override + public void handleElement(Lexer lexer) { + if (!hasSeenStyle() && !hasSeenScript() || hasNoEmbeddments) return; + final IElementType tokenType = lexer.getTokenType(); + + if (tokenType == XmlTokenType.XML_ATTRIBUTE_VALUE_TOKEN && hasSeenAttribute() || + tokenType == XmlTokenType.XML_DATA_CHARACTERS && hasSeenTag() || + tokenType == XmlTokenType.XML_COMMENT_CHARACTERS && hasSeenTag() + ) { + setEmbeddedLexer(); + + if (embeddedLexer != null) { + embeddedLexer.start( + getBufferSequence(), + HtmlHighlightingLexer.super.getTokenStart(), + skipToTheEndOfTheEmbeddment(), + embeddedLexer instanceof EmbedmentLexer ? ((EmbedmentLexer)embeddedLexer).getEmbeddedInitialState(tokenType) : 0 + ); + + if (embeddedLexer.getTokenType() == null) { + // no content for embeddment + embeddedLexer = null; + } + } + } + } + } + + public class ElEmbeddmentHandler implements TokenHandler { + @Override + public void handleElement(Lexer lexer) { + setEmbeddedLexer(); + if (embeddedLexer != null) { + embeddedLexer.start(getBufferSequence(), HtmlHighlightingLexer.super.getTokenStart(), HtmlHighlightingLexer.super.getTokenEnd()); + } + } + } } |