package org.jetbrains.plugins.javaFX.fxml; import com.intellij.lang.Language; import com.intellij.lang.injection.MultiHostInjector; import com.intellij.lang.injection.MultiHostRegistrar; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.util.text.StringUtil; import com.intellij.patterns.XmlElementPattern; import com.intellij.patterns.XmlPatterns; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiLanguageInjectionHost; import com.intellij.psi.xml.XmlFile; import com.intellij.psi.xml.XmlText; import org.jetbrains.annotations.NotNull; import java.util.Collections; import java.util.List; public class ScriptLanguageInjector implements MultiHostInjector { private static final XmlElementPattern.XmlTextPattern SCRIPT_PATTERN = XmlPatterns.xmlText().withParent( XmlPatterns.xmlTag().withName(FxmlConstants.FX_SCRIPT)); public void getLanguagesToInject(@NotNull final MultiHostRegistrar registrar, @NotNull final PsiElement host) { if (SCRIPT_PATTERN.accepts(host)) { final List<String> registeredLanguages = JavaFxPsiUtil.parseInjectedLanguages((XmlFile)host.getContainingFile()); for (Language language : Language.getRegisteredLanguages()) { for (String registeredLanguage : registeredLanguages) { if (StringUtil.equalsIgnoreCase(language.getID(), registeredLanguage)) { registrar.startInjecting(language) .addPlace(null, null, (PsiLanguageInjectionHost) host, TextRange.from(0, host.getTextLength() - 1)) .doneInjecting(); break; } } } } } @NotNull public List<? extends Class<? extends PsiElement>> elementsToInjectIn() { return Collections.singletonList(XmlText.class); } }