summaryrefslogtreecommitdiff
path: root/xml/xml-psi-impl/src/com/intellij/lexer/HtmlHighlightingLexer.java
diff options
context:
space:
mode:
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.java121
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());
+ }
+ }
+ }
}