Search in sources :

Example 21 with HtmlTag

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();
                            }
                        }
                    }
                }
            }
        }
    };
}
Also used : XmlElementVisitor(com.intellij.psi.XmlElementVisitor) XmlTagValue(com.intellij.psi.xml.XmlTagValue) XmlLikeFileType(com.intellij.ide.highlighter.XmlLikeFileType) HtmlTag(com.intellij.psi.html.HtmlTag) TextRange(com.intellij.openapi.util.TextRange) XmlLexer(com.intellij.lexer.XmlLexer) IElementType(com.intellij.psi.tree.IElementType) FileType(com.intellij.openapi.fileTypes.FileType) XmlLikeFileType(com.intellij.ide.highlighter.XmlLikeFileType) PsiFile(com.intellij.psi.PsiFile) PsiElement(com.intellij.psi.PsiElement) XmlTag(com.intellij.psi.xml.XmlTag) NotNull(org.jetbrains.annotations.NotNull)

Example 22 with HtmlTag

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("&#39;") ? "&#39;" : "&apos;") : newContent.replace("\"", oldText.contains("&#34;") ? "&#34;" : "&quot;");
        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;
}
Also used : Project(com.intellij.openapi.project.Project) XmlAttribute(com.intellij.psi.xml.XmlAttribute) HtmlTag(com.intellij.psi.html.HtmlTag) XmlTag(com.intellij.psi.xml.XmlTag)

Example 23 with HtmlTag

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());
                    }
                }
            }
        }
    }
}
Also used : PsiErrorElement(com.intellij.psi.PsiErrorElement) HtmlTag(com.intellij.psi.html.HtmlTag) PsiFile(com.intellij.psi.PsiFile) PsiElement(com.intellij.psi.PsiElement) Annotation(com.intellij.lang.annotation.Annotation) XmlToken(com.intellij.psi.xml.XmlToken) XmlTag(com.intellij.psi.xml.XmlTag)

Example 24 with HtmlTag

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);
                }
            }
        }
    }
}
Also used : ASTNode(com.intellij.lang.ASTNode) PsiFile(com.intellij.psi.PsiFile) HtmlTag(com.intellij.psi.html.HtmlTag)

Example 25 with HtmlTag

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;
}
Also used : Language(com.intellij.lang.Language) XHTMLLanguage(com.intellij.lang.xhtml.XHTMLLanguage) HTMLLanguage(com.intellij.lang.html.HTMLLanguage) HtmlTag(com.intellij.psi.html.HtmlTag)

Aggregations

HtmlTag (com.intellij.psi.html.HtmlTag)25 XmlTag (com.intellij.psi.xml.XmlTag)9 AnyXmlElementDescriptor (com.intellij.xml.impl.schema.AnyXmlElementDescriptor)8 PsiElement (com.intellij.psi.PsiElement)7 PsiFile (com.intellij.psi.PsiFile)7 XmlElementDescriptor (com.intellij.xml.XmlElementDescriptor)7 XmlAttributeDescriptor (com.intellij.xml.XmlAttributeDescriptor)5 ASTNode (com.intellij.lang.ASTNode)4 Language (com.intellij.lang.Language)4 TextRange (com.intellij.openapi.util.TextRange)4 LocalQuickFix (com.intellij.codeInspection.LocalQuickFix)3 XHTMLLanguage (com.intellij.lang.xhtml.XHTMLLanguage)3 XMLLanguage (com.intellij.lang.xml.XMLLanguage)3 Project (com.intellij.openapi.project.Project)3 TemplateLanguageFileViewProvider (com.intellij.psi.templateLanguages.TemplateLanguageFileViewProvider)3 HighlightInfo (com.intellij.codeInsight.daemon.impl.HighlightInfo)2 HighlightInfoType (com.intellij.codeInsight.daemon.impl.HighlightInfoType)2 LookupElement (com.intellij.codeInsight.lookup.LookupElement)2 HTMLLanguage (com.intellij.lang.html.HTMLLanguage)2 PsiErrorElement (com.intellij.psi.PsiErrorElement)2