use of com.intellij.psi.html.HtmlTag in project intellij-community by JetBrains.
the class CheckValidXmlInScriptBodyInspectionBase method buildVisitor.
@Override
@NotNull
public PsiElementVisitor buildVisitor(@NotNull final ProblemsHolder holder, boolean isOnTheFly) {
return new XmlElementVisitor() {
@Override
public void visitXmlTag(final XmlTag tag) {
if (HtmlUtil.isHtmlTag(tag))
return;
if (HtmlUtil.SCRIPT_TAG_NAME.equals(tag.getName()) || tag instanceof HtmlTag && HtmlUtil.SCRIPT_TAG_NAME.equalsIgnoreCase(tag.getName())) {
final PsiFile psiFile = tag.getContainingFile();
final FileType fileType = psiFile.getFileType();
if (fileType instanceof XmlLikeFileType) {
synchronized (CheckValidXmlInScriptBodyInspectionBase.class) {
if (myXmlLexer == null)
myXmlLexer = new XmlLexer();
final XmlTagValue tagValue = tag.getValue();
final String tagBodyText = tagValue.getText();
if (!tagBodyText.isEmpty()) {
myXmlLexer.start(tagBodyText);
while (myXmlLexer.getTokenType() != null) {
IElementType tokenType = myXmlLexer.getTokenType();
if (tokenType == XmlTokenType.XML_CDATA_START) {
while (tokenType != null && tokenType != XmlTokenType.XML_CDATA_END) {
myXmlLexer.advance();
tokenType = myXmlLexer.getTokenType();
}
if (tokenType == null)
break;
}
if (tokenType == XmlTokenType.XML_BAD_CHARACTER && "&".equals(TreeUtil.getTokenText(myXmlLexer)) || tokenType == XmlTokenType.XML_START_TAG_START) {
final int valueStart = tagValue.getTextRange().getStartOffset();
final int offset = valueStart + myXmlLexer.getTokenStart();
final PsiElement psiElement = psiFile.findElementAt(offset);
final TextRange elementRange = psiElement.getTextRange();
final int offsetInElement = offset - elementRange.getStartOffset();
holder.registerProblem(psiElement, XmlBundle.message("unescaped.xml.character"), ProblemHighlightType.GENERIC_ERROR_OR_WARNING, createFix(psiElement, offsetInElement));
int endOfElementInScriptTag = elementRange.getEndOffset() - valueStart;
while (myXmlLexer.getTokenEnd() < endOfElementInScriptTag) {
myXmlLexer.advance();
if (myXmlLexer.getTokenType() == null)
break;
}
}
myXmlLexer.advance();
}
}
}
}
}
}
};
}
use of com.intellij.psi.html.HtmlTag in project intellij-community by JetBrains.
the class XmlAttributeValueManipulator method handleContentChange.
@Override
public XmlAttributeValue handleContentChange(@NotNull XmlAttributeValue element, @NotNull TextRange range, String newContent) throws IncorrectOperationException {
CheckUtil.checkWritable(element);
String text;
final String oldText = element.getText();
try {
String textBeforeRange = oldText.substring(0, range.getStartOffset());
String textAfterRange = oldText.substring(range.getEndOffset(), oldText.length());
newContent = oldText.startsWith("'") || oldText.endsWith("'") ? newContent.replace("'", oldText.contains("'") ? "'" : "'") : newContent.replace("\"", oldText.contains(""") ? """ : """);
text = "<a value=" + textBeforeRange + newContent + textAfterRange;
} catch (StringIndexOutOfBoundsException e) {
LOG.error("Range: " + range + " in text: '" + oldText + "'", e);
throw e;
}
final Project project = element.getProject();
final XmlTag tag = element.getParent().getParent() instanceof HtmlTag ? XmlElementFactory.getInstance(project).createHTMLTagFromText(text) : XmlElementFactory.getInstance(project).createTagFromText(text);
final XmlAttribute attribute = tag.getAttribute("value");
assert attribute != null && attribute.getValueElement() != null;
element.getNode().replaceAllChildrenToChildrenOf(attribute.getValueElement().getNode());
return element;
}
use of com.intellij.psi.html.HtmlTag in project intellij-community by JetBrains.
the class XmlWrongClosingTagNameInspection method annotate.
@Override
public void annotate(@NotNull final PsiElement psiElement, @NotNull final AnnotationHolder holder) {
if (psiElement instanceof XmlToken) {
final PsiElement parent = psiElement.getParent();
if (parent instanceof XmlTag) {
final XmlTag tag = (XmlTag) parent;
final XmlToken start = XmlTagUtil.getStartTagNameElement(tag);
XmlToken endTagName = XmlTagUtil.getEndTagNameElement(tag);
if (start == psiElement) {
if (endTagName != null && !(tag instanceof HtmlTag) && !tag.getName().equals(endTagName.getText())) {
registerProblemStart(holder, tag, start, endTagName);
} else if (endTagName == null && !(tag instanceof HtmlTag && HtmlUtil.isSingleHtmlTag(tag.getName()))) {
final PsiErrorElement errorElement = PsiTreeUtil.getChildOfType(tag, PsiErrorElement.class);
endTagName = findEndTagName(errorElement);
if (endTagName != null) {
registerProblemStart(holder, tag, start, endTagName);
}
}
} else if (endTagName == psiElement) {
if (!(tag instanceof HtmlTag) && !tag.getName().equals(endTagName.getText())) {
registerProblemEnd(holder, tag, endTagName);
}
}
} else if (parent instanceof PsiErrorElement) {
if (XmlTokenType.XML_NAME == ((XmlToken) psiElement).getTokenType()) {
final PsiFile psiFile = psiElement.getContainingFile();
if (psiFile != null && (HTMLLanguage.INSTANCE == psiFile.getViewProvider().getBaseLanguage() || HTMLLanguage.INSTANCE == parent.getLanguage())) {
final String message = XmlErrorMessages.message("xml.parsing.closing.tag.matches.nothing");
if (message.equals(((PsiErrorElement) parent).getErrorDescription()) && psiFile.getContext() == null) {
final Annotation annotation = holder.createWarningAnnotation(parent, message);
annotation.registerFix(new RemoveExtraClosingTagIntentionAction());
}
}
}
}
}
}
use of com.intellij.psi.html.HtmlTag in project intellij-community by JetBrains.
the class XmlWrongRootElementInspection method checkTag.
@Override
protected void checkTag(@NotNull final XmlTag tag, @NotNull final ProblemsHolder holder, final boolean isOnTheFly) {
if (!(tag.getParent() instanceof XmlTag)) {
final PsiFile psiFile = tag.getContainingFile();
if (!(psiFile instanceof XmlFile)) {
return;
}
XmlFile xmlFile = (XmlFile) psiFile;
final XmlDocument document = xmlFile.getDocument();
if (document == null) {
return;
}
XmlProlog prolog = document.getProlog();
if (prolog == null || XmlHighlightVisitor.skipValidation(prolog)) {
return;
}
final XmlDoctype doctype = prolog.getDoctype();
if (doctype == null) {
return;
}
XmlElement nameElement = doctype.getNameElement();
if (nameElement == null) {
return;
}
String name = tag.getName();
String text = nameElement.getText();
if (tag instanceof HtmlTag) {
name = name.toLowerCase();
text = text.toLowerCase();
}
if (!name.equals(text)) {
name = XmlUtil.findLocalNameByQualifiedName(name);
if (!name.equals(text)) {
if (tag instanceof HtmlTag) {
// it is legal to have html / head / body omitted
return;
}
final LocalQuickFix localQuickFix = new MyLocalQuickFix(doctype.getNameElement().getText());
holder.registerProblem(XmlChildRole.START_TAG_NAME_FINDER.findChild(tag.getNode()).getPsi(), XmlErrorMessages.message("wrong.root.element"), ProblemHighlightType.LIKE_UNKNOWN_SYMBOL, localQuickFix);
final ASTNode astNode = XmlChildRole.CLOSING_TAG_NAME_FINDER.findChild(tag.getNode());
if (astNode != null) {
holder.registerProblem(astNode.getPsi(), XmlErrorMessages.message("wrong.root.element"), ProblemHighlightType.LIKE_UNKNOWN_SYMBOL, localQuickFix);
}
}
}
}
}
use of com.intellij.psi.html.HtmlTag in project intellij-community by JetBrains.
the class CheckEmptyTagInspection method isTagWithEmptyEndNotAllowed.
public static boolean isTagWithEmptyEndNotAllowed(final XmlTag tag) {
String tagName = tag.getName();
if (tag instanceof HtmlTag)
tagName = tagName.toLowerCase();
Language language = tag.getLanguage();
return ourTagsWithEmptyEndsNotAllowed.contains(tagName) && (language.isKindOf(HTMLLanguage.INSTANCE) || language.isKindOf(XHTMLLanguage.INSTANCE)) || language.isKindOf(HTMLLanguage.INSTANCE) && !HtmlUtil.isSingleHtmlTagL(tagName) && tagName.indexOf(':') == -1;
}
Aggregations