package com.google.jstestdriver.idea.assertFramework.jstd;
import com.intellij.lang.Language;
import com.intellij.lang.javascript.JSTokenTypes;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.InjectedLanguagePlaces;
import com.intellij.psi.LanguageInjector;
import com.intellij.psi.PsiComment;
import com.intellij.psi.PsiLanguageInjectionHost;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author Sergey Simonchik
*/
public class JstdFixtureHtmlLanguageInjector implements LanguageInjector {
private static final Pattern[] PATTERNS = new Pattern[] {
Pattern.compile("/\\*:DOC\\s*\\+=(.*)\\*/", Pattern.DOTALL),
Pattern.compile("/\\*:DOC\\s+\\w*\\s*=(.*)\\*/", Pattern.DOTALL)
};
private static final Language HTML_LANGUAGE = Language.findLanguageByID("HTML");
@Override
public void getLanguagesToInject(@NotNull PsiLanguageInjectionHost host,
@NotNull InjectedLanguagePlaces injectionPlacesRegistrar) {
if (host instanceof PsiComment) {
PsiComment comment = (PsiComment) host;
if (comment.getTokenType() == JSTokenTypes.C_STYLE_COMMENT) {
String commentStr = comment.getText();
TextRange htmlTextRange = findTextRange(commentStr);
if (htmlTextRange != null && HTML_LANGUAGE != null) {
injectionPlacesRegistrar.addPlace(HTML_LANGUAGE, htmlTextRange, null, null);
}
}
}
}
@Nullable
private static TextRange findTextRange(@NotNull String commentStr) {
for (Pattern pattern : PATTERNS) {
Matcher matcher = pattern.matcher(commentStr);
if (matcher.matches()) {
String original = matcher.group(1);
String trimmed = original.trim();
int offset = original.indexOf(trimmed);
if (offset >= 0 && !trimmed.isEmpty()) {
int startInd = matcher.start(1) + offset;
return TextRange.create(startInd, startInd + trimmed.length());
}
}
}
return null;
}
}