From 2114d7c83d1274ce5783915f7945fdf6e4972dce Mon Sep 17 00:00:00 2001 From: Sergey Evdokimov Date: Wed, 21 Nov 2012 17:28:27 +0400 Subject: [PATCH] IDEA-92848 Html tags not parsed in description reviewer: anton.makeev --- .../dom/MavenPomXmlDocumentationProvider.java | 89 +++++++++++++++++++ .../src/main/resources/META-INF/plugin.xml | 2 + .../dom/MavenPomXmlDocumentationTest.groovy | 52 +++++++++++ .../HtmlDocumentationProvider.java | 2 +- .../XmlDocumentationProvider.java | 6 +- 5 files changed, 147 insertions(+), 4 deletions(-) create mode 100644 plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenPomXmlDocumentationProvider.java create mode 100644 plugins/maven/src/test/java/org/jetbrains/idea/maven/dom/MavenPomXmlDocumentationTest.groovy diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenPomXmlDocumentationProvider.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenPomXmlDocumentationProvider.java new file mode 100644 index 000000000000..f6e6f8a21563 --- /dev/null +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenPomXmlDocumentationProvider.java @@ -0,0 +1,89 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.idea.maven.dom; + +import com.intellij.lang.documentation.DocumentationProvider; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiManager; +import com.intellij.xml.util.documentation.XmlDocumentationProvider; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +/** + * @author Sergey Evdokimov + */ +public class MavenPomXmlDocumentationProvider implements DocumentationProvider { + + private final DocumentationProvider myDelegate = new XmlDocumentationProvider() { + @Override + protected String generateDoc(String str, String name, String typeName, String version) { + if (str != null) { + str = StringUtil.unescapeXml(str); + } + + return super.generateDoc(str, name, typeName, version); + } + }; + + + private static boolean isFromPomXml(PsiElement element) { + if (element == null) return false; + + PsiFile containingFile = element.getContainingFile(); + return containingFile != null && containingFile.getName().equals("maven-4.0.0.xsd"); + } + + @Nullable + @Override + public String getQuickNavigateInfo(PsiElement element, PsiElement originalElement) { + if (!isFromPomXml(element)) return null; + + return myDelegate.getQuickNavigateInfo(element, originalElement); + } + + @Nullable + @Override + public List getUrlFor(PsiElement element, PsiElement originalElement) { + if (!isFromPomXml(element)) return null; + + return myDelegate.getUrlFor(element, originalElement); + } + + @Nullable + @Override + public String generateDoc(PsiElement element, @Nullable PsiElement originalElement) { + if (!isFromPomXml(element)) return null; + + return myDelegate.generateDoc(element, originalElement); + } + + @Nullable + @Override + public PsiElement getDocumentationElementForLookupItem(PsiManager psiManager, Object object, PsiElement element) { + if (!isFromPomXml(element)) return null; + + return myDelegate.getDocumentationElementForLookupItem(psiManager, object, element); + } + + @Nullable + @Override + public PsiElement getDocumentationElementForLink(PsiManager psiManager, String link, PsiElement context) { + return null; + } +} diff --git a/plugins/maven/src/main/resources/META-INF/plugin.xml b/plugins/maven/src/main/resources/META-INF/plugin.xml index 61893bc25c6e..6d10f242467a 100644 --- a/plugins/maven/src/main/resources/META-INF/plugin.xml +++ b/plugins/maven/src/main/resources/META-INF/plugin.xml @@ -73,6 +73,8 @@ order="first"/> + + test +project +1 + + > +""" + ); + + def expectedText = """Tag name: connection
Description : The source control management system URL + that describes the repository and how to connect to the + repository. For more information, see the + URL format + and list of supported SCMs. + This connection is read-only.
Version : 4.0.0""" + + PsiElement originalElement = getElementAtCaret(myProjectPom); + PsiElement targetElement = DocumentationManager.getInstance(myProject).findTargetElement(getEditor(), getTestPsiFile(), originalElement); + + DocumentationProvider provider = DocumentationManager.getProviderFromElement(targetElement); + + assert expectedText.replaceAll(" +", " ") == provider.generateDoc(targetElement, originalElement).replaceAll(" +", " ") + } + +} diff --git a/xml/impl/src/com/intellij/xml/util/documentation/HtmlDocumentationProvider.java b/xml/impl/src/com/intellij/xml/util/documentation/HtmlDocumentationProvider.java index 1fbe416d72bf..34e9b5b914d6 100644 --- a/xml/impl/src/com/intellij/xml/util/documentation/HtmlDocumentationProvider.java +++ b/xml/impl/src/com/intellij/xml/util/documentation/HtmlDocumentationProvider.java @@ -166,7 +166,7 @@ public class HtmlDocumentationProvider implements DocumentationProvider { if (element instanceof XmlEntityDecl) { final XmlEntityDecl entityDecl = (XmlEntityDecl)element; - return XmlDocumentationProvider.findDocRightAfterElement(element, entityDecl.getName()); + return new XmlDocumentationProvider().findDocRightAfterElement(element, entityDecl.getName()); } return null; } diff --git a/xml/impl/src/com/intellij/xml/util/documentation/XmlDocumentationProvider.java b/xml/impl/src/com/intellij/xml/util/documentation/XmlDocumentationProvider.java index 76ad3ac20bd8..8af0acc7fc75 100644 --- a/xml/impl/src/com/intellij/xml/util/documentation/XmlDocumentationProvider.java +++ b/xml/impl/src/com/intellij/xml/util/documentation/XmlDocumentationProvider.java @@ -237,7 +237,7 @@ public class XmlDocumentationProvider implements DocumentationProvider { return buf.toString(); } - public static String findDocRightAfterElement(final PsiElement parent, final String referenceName) { + public String findDocRightAfterElement(final PsiElement parent, final String referenceName) { // Check for comment right after the xml attlist decl PsiElement uncleElement = parent.getNextSibling(); if (uncleElement instanceof PsiWhiteSpace && uncleElement.getText().indexOf('\n') == -1) uncleElement = uncleElement.getNextSibling(); @@ -267,7 +267,7 @@ public class XmlDocumentationProvider implements DocumentationProvider { return curElement; } - private static String formatDocFromComment(final PsiElement curElement, final String name) { + private String formatDocFromComment(final PsiElement curElement, final String name) { String text = curElement.getText(); text = text.substring("".length()).trim(); text = escapeDocumentationTextText(text); @@ -317,7 +317,7 @@ public class XmlDocumentationProvider implements DocumentationProvider { return null; } - private static String generateDoc(String str, String name, String typeName, String version) { + protected String generateDoc(String str, String name, String typeName, String version) { if (str == null) return null; StringBuilder buf = new StringBuilder(str.length() + 20);