You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@netbeans.apache.org by sk...@apache.org on 2022/04/28 16:02:42 UTC

[netbeans] branch delivery updated: Strip HTML tags in project problems.

This is an automated email from the ASF dual-hosted git repository.

skygo pushed a commit to branch delivery
in repository https://gitbox.apache.org/repos/asf/netbeans.git


The following commit(s) were added to refs/heads/delivery by this push:
     new 26447d1c22 Strip HTML tags in project problems.
     new 0266567dfa Merge pull request #4042 from sdedic/lsp/problems-strip-html
26447d1c22 is described below

commit 26447d1c225df8341d642b878f6bcad912a7e194
Author: Svata Dedic <sv...@oracle.com>
AuthorDate: Thu Apr 28 08:05:28 2022 +0200

    Strip HTML tags in project problems.
---
 .../netbeans/modules/java/lsp/server/Utils.java    | 42 ++++++++++++++++++++++
 .../lsp/server/project/ProjectAlertPresenter.java  | 14 ++++----
 2 files changed, 50 insertions(+), 6 deletions(-)

diff --git a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/Utils.java b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/Utils.java
index a3561e6564..0b1afccd52 100644
--- a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/Utils.java
+++ b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/Utils.java
@@ -32,6 +32,7 @@ import java.net.URI;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Locale;
 import java.util.Set;
 import javax.lang.model.element.Element;
 import javax.lang.model.element.ElementKind;
@@ -337,4 +338,45 @@ public class Utils {
         return encoded.substring(2, encoded.length() - 2);
     }
 
+    /**
+     * Simple conversion from HTML to plaintext. Removes all html tags incl. attributes,
+     * replaces BR, P and HR tags with newlines.
+     * @param s html text
+     * @return plaintext
+     */
+    public static String html2plain(String s) {
+        boolean inTag = false;
+        int tagStart = -1;
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < s.length(); i++) {
+            char ch = s.charAt(i);
+            if (inTag) {
+                boolean alpha = Character.isAlphabetic(ch);
+                if (tagStart > 0 && !alpha) {
+                    String t = s.substring(tagStart, i).toLowerCase(Locale.ENGLISH);
+                    switch (t) {
+                        case "br": case "p": case "hr": // NOI1N
+                            sb.append("\n");
+                            break;
+                    }
+                    // prevent entering tagstart state again
+                    tagStart = -2;
+                }
+                if (ch == '>') { // NOI18N
+                    inTag = false;
+                } else if (tagStart == -1 && alpha) {
+                    tagStart = i;
+                }
+            } else {
+                if (ch == '<') { // NOI18N
+                    tagStart = -1;
+                    inTag = true;
+                    continue;
+                }
+                sb.append(ch);
+            }
+        }
+        return sb.toString();
+    }
+
 }
diff --git a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/project/ProjectAlertPresenter.java b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/project/ProjectAlertPresenter.java
index 0482e7cd23..035d796b33 100644
--- a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/project/ProjectAlertPresenter.java
+++ b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/project/ProjectAlertPresenter.java
@@ -39,6 +39,7 @@ import javax.swing.event.ListDataListener;
 import org.netbeans.api.project.Project;
 import org.netbeans.api.project.ProjectInformation;
 import org.netbeans.api.project.ProjectUtils;
+import org.netbeans.modules.java.lsp.server.Utils;
 import org.netbeans.spi.project.ui.ProjectProblemsProvider;
 import org.openide.DialogDisplayer;
 import org.openide.NotifyDescriptor;
@@ -489,7 +490,7 @@ class ProjectAlertPresenter {
             // hack: the LSP protocol does not support title. Until fixed, or implemented through a custom message,
             // embed the title into description:
             String title = Bundle.ProjectProblem_Title(projectName, p.getDisplayName());
-            NotifyDescriptor msg = new NotifyDescriptor(title + ": " + p.getDescription(), title, NotifyDescriptor.DEFAULT_OPTION, type, new Object[]{NotifyDescriptor.OK_OPTION}, null);
+            NotifyDescriptor msg = new NotifyDescriptor(title + ": " + Utils.html2plain(p.getDescription()), title, NotifyDescriptor.DEFAULT_OPTION, type, new Object[]{NotifyDescriptor.OK_OPTION}, null);
 
             // Note: the number of 'fatal' dialogs displayed at the same time is limited by the RP throughput. Dialog API does not support CompletableFuture<> interface
             // so threads may dangle.
@@ -647,7 +648,7 @@ class ProjectAlertPresenter {
             }
             
             String title = Bundle.ProjectProblems_Fixable_Title(projectName, ref.problem.getDisplayName());
-            String msg = ref.problem.getDescription();
+            String msg = Utils.html2plain(ref.problem.getDescription());
             if (probs.size() > 1) {
                 msg = Bundle.ProjectProblems_Additional(probs.size() - 1, msg);
             }
@@ -739,7 +740,7 @@ class ProjectAlertPresenter {
         }, RESOLVE_RP).thenApply(r -> {
             if (r.isResolved()) {
                 if (r.getMessage() != null) {
-                    StatusDisplayer.getDefault().setStatusText(r.getMessage());
+                    StatusDisplayer.getDefault().setStatusText(Utils.html2plain(r.getMessage()));
                 }
                 return ctx.autoResolve ? r : null;
             }
@@ -764,18 +765,19 @@ class ProjectAlertPresenter {
         });
         return f;
     }
-
+    
     private NotifyDescriptor createNotifyDescriptor(ProjectProblemsProvider.ProjectProblem pp, ProjectProblemsProvider.Result r, int probs) {
         String title;
         String msg;
         int type;
+        String plainMessage = Utils.html2plain(r.getMessage());
         if (r.getStatus() == ProjectProblemsProvider.Status.UNRESOLVED) {
             title = Bundle.ProjectProblems_Resolved_Error(projectName);
-            msg = Bundle.ProjectProblems_Resolved_ErrorMessage1(pp.getDisplayName(), r.getMessage());
+            msg = Bundle.ProjectProblems_Resolved_ErrorMessage1(pp.getDisplayName(), plainMessage);
             type = NotifyDescriptor.ERROR_MESSAGE;
         } else {
             title = Bundle.ProjectProblems_Resolved_Warning(projectName);
-            msg = Bundle.ProjectProblems_Resolved_WarningMessage1(pp.getDisplayName(), r.getMessage());
+            msg = Bundle.ProjectProblems_Resolved_WarningMessage1(pp.getDisplayName(), plainMessage);
             type = NotifyDescriptor.WARNING_MESSAGE;
         }
         if (probs > 0) {


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@netbeans.apache.org
For additional commands, e-mail: commits-help@netbeans.apache.org

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists