You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@netbeans.apache.org by ak...@apache.org on 2022/05/02 06:58:22 UTC

[netbeans] branch master updated: JEP 413: External Snippets and Snippet Attributes Support (#3498)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 59785240fa JEP 413: External Snippets and Snippet Attributes Support (#3498)
59785240fa is described below

commit 59785240fa47b7d78335019d611f12ae7620b08c
Author: Sandeep Mishra <72...@users.noreply.github.com>
AuthorDate: Mon May 2 12:28:15 2022 +0530

    JEP 413: External Snippets and Snippet Attributes Support (#3498)
    
    * Added external snippet, snippet attributes, and copy snippet support
    
    Co-authored-by: singhs-akhilesh <ak...@oracle.com>
---
 .../editor/completion/DocumentationScrollPane.java |  74 +++++++++-
 .../modules/editor/completion/HTMLDocView.java     |   7 +-
 .../modules/java/editor/javadoc/TagRegistery.java  |   2 +-
 ...adocsnippet_HighlightAndReplace_cornercase.pass |   5 +-
 ...snippet_NestedRegion_Highlight_And_replace.pass |   5 +-
 ...ippet_NestedRegion_ReplaceAnnotation_Regex.pass |   5 +-
 ...t_NestedRegion_ReplaceAnnotation_Substring.pass |   5 +-
 ...adocsnippet_Region_ReplaceAnnotation_Regex.pass |   5 +-
 ...t_Region_ReplaceAnnotation_RegexInnComment.pass |   5 +-
 ...SingleLine_MultipleReplaceAnnotation_Regex.pass |   5 +-
 ...leLine_MultipleReplaceAnnotation_Substring.pass |   5 +-
 ...leLine_ReplaceAnnotation_Regex_DoubleQuote.pass |   5 +-
 .../javadocsnippet_SingleLine_Replace_Regex.pass   |   5 +-
 ...javadocsnippet_SingleLine_Replace_RegexDot.pass |   5 +-
 ...docsnippet_SingleLine_Replace_RegexDotStar.pass |   5 +-
 ...avadocsnippet_SingleLine_Replace_Substring.pass |   5 +-
 .../javadocsnippet_TestError_HighlightTag.pass     |  65 +++++----
 .../javadocsnippet_TestError_NoRegionToEnd.pass    |   5 +-
 .../javadocsnippet_TestError_ReplaceTag.pass       |  55 ++++---
 .../javadocsnippet_TestError_UnpairedRegion.pass   |  20 ++-
 .../javadocsnippet_highlightRecord.pass            |   5 +-
 ...et_highlightTagRegexWithAllCharacterChange.pass |   5 +-
 ...ightTagRegexWithAllCharacterChangeUsingDot.pass |   5 +-
 ...ippet_highlightTagSubstringApplyToNextLine.pass |   5 +-
 ...ngMultipleSnippetTagInOneJavaDocWithRegion.pass |   5 +-
 ...javadocsnippet_highlightUsingNestedRegions.pass |   5 +-
 .../javadocsnippet_highlightUsingRegex.pass        |   5 +-
 ..._highlightUsingRegionsEndedWithDoubleColon.pass |   5 +-
 .../javadocsnippet_highlightUsingSubstring.pass    |   5 +-
 ...docsnippet_highlightUsingSubstringAndRegex.pass |   5 +-
 ...nippet_highlightUsingSubstringRegexAndType.pass |   5 +-
 ...ass => javadocsnippet_highlight_markuptag.pass} |   3 +-
 .../javadocsnippet_noMarkupTagPresent.pass         |   5 +-
 .../modules/editor/java/GoToSupportTest.java       | 148 +------------------
 .../modules/java/source/builder/TreeFactory.java   |   9 ++
 .../transform/ImmutableDocTreeTranslator.java      |  16 +-
 .../api/java/source/ui/ElementJavadoc.java         | 161 +++++++++++++++------
 .../java/source/ui/snippet/MarkupTagProcessor.java |   7 +-
 .../source/ui/snippet/SnippetTagCommentParser.java |  10 +-
 39 files changed, 395 insertions(+), 312 deletions(-)

diff --git a/ide/editor.completion/src/org/netbeans/modules/editor/completion/DocumentationScrollPane.java b/ide/editor.completion/src/org/netbeans/modules/editor/completion/DocumentationScrollPane.java
index aa0e40ee84..33980b5003 100644
--- a/ide/editor.completion/src/org/netbeans/modules/editor/completion/DocumentationScrollPane.java
+++ b/ide/editor.completion/src/org/netbeans/modules/editor/completion/DocumentationScrollPane.java
@@ -21,6 +21,8 @@
 package org.netbeans.modules.editor.completion;
 
 import java.awt.*;
+import java.awt.datatransfer.Clipboard;
+import java.awt.datatransfer.StringSelection;
 import java.awt.event.ActionEvent;
 import java.awt.event.InputEvent;
 import java.awt.event.KeyEvent;
@@ -34,11 +36,15 @@ import javax.swing.*;
 import javax.swing.event.HyperlinkEvent;
 import javax.swing.event.HyperlinkListener;
 import javax.swing.plaf.TextUI;
+import javax.swing.text.BadLocationException;
 import javax.swing.text.Caret;
+import javax.swing.text.DefaultHighlighter.DefaultHighlightPainter;
 import javax.swing.text.Document;
 import javax.swing.text.EditorKit;
+import javax.swing.text.Element;
 import javax.swing.text.JTextComponent;
 import javax.swing.text.Keymap;
+import javax.swing.text.html.HTML;
 import javax.swing.text.html.HTMLDocument;
 
 import org.netbeans.editor.*;
@@ -47,6 +53,7 @@ import org.netbeans.spi.editor.completion.CompletionDocumentation;
 
 import org.openide.awt.HtmlBrowser;
 import org.openide.awt.StatusDisplayer;
+import org.openide.util.Exceptions;
 import org.openide.util.ImageUtilities;
 import org.openide.util.NbBundle;
 import org.openide.util.RequestProcessor;
@@ -62,7 +69,7 @@ public class DocumentationScrollPane extends JScrollPane {
     private static final String FORWARD = "org/netbeans/modules/editor/completion/resources/forward.png"; //NOI18N
     private static final String GOTO_SOURCE = "org/netbeans/modules/editor/completion/resources/open_source_in_editor.png"; //NOI18N
     private static final String SHOW_WEB = "org/netbeans/modules/editor/completion/resources/open_in_external_browser.png"; //NOI18N
-
+    
     private static final String JAVADOC_ESCAPE = "javadoc-escape"; //NOI18N
     private static final String JAVADOC_BACK = "javadoc-back"; //NOI18N
     private static final String JAVADOC_FORWARD = "javadoc-forward"; //NOI18N    
@@ -118,7 +125,7 @@ public class DocumentationScrollPane extends JScrollPane {
         }
         view.addHyperlinkListener(new HyperlinkAction());
         setViewportView(view);
-        
+
         installTitleComponent();
         installKeybindings(editorComponent);
         this.editorComponent = editorComponent;
@@ -451,8 +458,26 @@ public class DocumentationScrollPane extends JScrollPane {
 
     private class HyperlinkAction implements HyperlinkListener {
         
+        @Override
         public void hyperlinkUpdate(HyperlinkEvent e) {
-            if (e != null && HyperlinkEvent.EventType.ACTIVATED.equals(e.getEventType())) {
+            if (e != null && e.getEventType() == HyperlinkEvent.EventType.ACTIVATED && e.getDescription().startsWith("copy.snippet")) {
+                Clipboard systemClipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
+                String snippetCount = e.getDescription().replaceAll("[^0-9]", "");
+                HTMLDocument HtmlDoc = (HTMLDocument) e.getSourceElement().getDocument();
+                HTMLDocView source = (HTMLDocView) e.getSource();
+                source.getText();
+                Element snippetElement = HtmlDoc.getElement("snippet" + snippetCount);
+                StringBuilder text = new StringBuilder();
+                getTextToCopy(HtmlDoc, text, snippetElement);
+                handleTextToCopy(HtmlDoc, snippetElement, text);
+                systemClipboard.setContents(new StringSelection(text.toString()), null);
+                view.getHighlighter().removeAllHighlights();
+                try {
+                    view.getHighlighter().addHighlight(e.getSourceElement().getStartOffset(), e.getSourceElement().getEndOffset(), new DefaultHighlightPainter(Color.GRAY));
+                } catch (BadLocationException ex) {
+                    Exceptions.printStackTrace(ex);
+                }
+            } else if (e != null && HyperlinkEvent.EventType.ACTIVATED.equals(e.getEventType())) {
                 final String desc = e.getDescription();
                 if (desc != null) {
                     RP.post(new Runnable() {
@@ -470,7 +495,48 @@ public class DocumentationScrollPane extends JScrollPane {
                             }
                         }
                     });
-                }                    
+                }
+            }
+        }
+
+        private void handleTextToCopy(HTMLDocument HtmlDoc, Element snippetElement, StringBuilder text) {
+            HTMLDocument.Iterator it = HtmlDoc.getIterator(HTML.Tag.A);
+            int startOffset = snippetElement.getStartOffset();
+            int endOffset = snippetElement.getEndOffset();
+            int count = 0;
+            while (it.isValid()) {
+                int startOffset1 = it.getStartOffset();
+                int endOffset1 = it.getEndOffset();
+                try {
+                    String aTagText = HtmlDoc.getText(startOffset1, endOffset1 - startOffset1);
+                    if (startOffset1 > startOffset && endOffset1 < endOffset
+                            && aTagText.length() == 1 && Character.isWhitespace(aTagText.charAt(0))) {
+                        text.deleteCharAt(startOffset1 - startOffset - count);
+                        count++;
+                    }
+                } catch (BadLocationException ex) {
+                    Exceptions.printStackTrace(ex);
+                }
+                it.next();
+            }
+            text.delete(0, text.indexOf("\n") + 1); //removing first line of div i.e. "Copy"  
+        }
+
+        private void getTextToCopy(HTMLDocument HtmlDoc, StringBuilder sb, Element snippetElement) {
+            int elementCount = snippetElement.getElementCount();
+            if (elementCount == 0) {
+                int startOffset = snippetElement.getStartOffset();
+                int endOffset = snippetElement.getEndOffset();
+                try {
+                    sb.append(HtmlDoc.getText(startOffset, endOffset - startOffset));
+                } catch (BadLocationException ex) {
+                    Exceptions.printStackTrace(ex);
+                }
+                return;
+            }
+            for (int i = 0; i < elementCount; i++) {
+                Element element = snippetElement.getElement(i);
+                getTextToCopy(HtmlDoc, sb, element);
             }
         }
     }
diff --git a/ide/editor.completion/src/org/netbeans/modules/editor/completion/HTMLDocView.java b/ide/editor.completion/src/org/netbeans/modules/editor/completion/HTMLDocView.java
index 09342b982f..19e6dc2321 100644
--- a/ide/editor.completion/src/org/netbeans/modules/editor/completion/HTMLDocView.java
+++ b/ide/editor.completion/src/org/netbeans/modules/editor/completion/HTMLDocView.java
@@ -65,7 +65,6 @@ public class HTMLDocView extends JEditorPane {
         //add listeners for selection support
         addMouseListener(new MouseListener() {
             public void mouseClicked(MouseEvent e) {
-                getHighlighter().removeAllHighlights();
             }
             public void mousePressed(MouseEvent e) {
                 getHighlighter().removeAllHighlights();
@@ -77,7 +76,11 @@ public class HTMLDocView extends JEditorPane {
                 }
             }
 
-            public void mouseReleased(MouseEvent e) {}
+            public void mouseReleased(MouseEvent e) {
+                if(getSelectedText() == null){
+                    getHighlighter().removeAllHighlights();
+                }
+            }
             public void mouseEntered(MouseEvent e) {}
             public void mouseExited(MouseEvent e) {}
         });
diff --git a/java/java.editor/src/org/netbeans/modules/java/editor/javadoc/TagRegistery.java b/java/java.editor/src/org/netbeans/modules/java/editor/javadoc/TagRegistery.java
index 291308c243..5b4f67fd0c 100644
--- a/java/java.editor/src/org/netbeans/modules/java/editor/javadoc/TagRegistery.java
+++ b/java/java.editor/src/org/netbeans/modules/java/editor/javadoc/TagRegistery.java
@@ -100,7 +100,7 @@ final class TagRegistery {
         addTag("@uses", false, EnumSet.of(ElementKind.MODULE));
         
         addTag("@code", true, ALL_KINDS);
-	addTag("@snippet", true, ALL_KINDS);
+        addTag("@snippet", true, ALL_KINDS);
         addTag("@docRoot", true, ALL_KINDS);
         // just in empty tag description
         addTag("@inheritDoc", true, EnumSet.of(ElementKind.METHOD));
diff --git a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_HighlightAndReplace_cornercase.pass b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_HighlightAndReplace_cornercase.pass
index 3329513e12..712977fa4f 100644
--- a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_HighlightAndReplace_cornercase.pass
+++ b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_HighlightAndReplace_cornercase.pass
@@ -1,5 +1,6 @@
-<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>testHighlightAndReplace_cornercase</b>()</pre><p><pre><code>  public static void \bmain\b(String... args) {	
+<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>testHighlightAndReplace_cornercase</b>()</pre><p><div id="snippet1" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet1">Copy</a></div>
+<pre><code>  public static void \bmain\b(String... args) {	
 		 S<b>y</b><b>s</b>replace<b>.</b><b>o</b><b>u</b><b>t</b>.println("tests"); 	
  }
  
-</code></pre><p>
\ No newline at end of file
+</code></pre></div><p>
\ No newline at end of file
diff --git a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_NestedRegion_Highlight_And_replace.pass b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_NestedRegion_Highlight_And_replace.pass
index 25264427c1..e746d689da 100644
--- a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_NestedRegion_Highlight_And_replace.pass
+++ b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_NestedRegion_Highlight_And_replace.pass
@@ -1,4 +1,5 @@
-<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>testNestedRegion_Highlight_And_replace</b>()</pre><p><pre><code>   public static void \bmain\b(String... args) {	
+<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>testNestedRegion_Highlight_And_replace</b>()</pre><p><div id="snippet1" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet1">Copy</a></div>
+<pre><code>   public static void \bmain\b(String... args) {	
        for (var <i><b>a</b></i><i><b>r</b></i><i><b>g</b></i> : <i><b>a</b></i><i><b>r</b></i><i><b>g</b></i>s) {                         
            if (!<b>a</b><b>r</b><b>g</b>.isBl<b>a</b><b>r</b><b>g</b>k()) {
                System.<b><b>a</b></b><b><b>r</b></b><b><b>g</b></b>.println("<b><b>a</b></b><b><b>r</b></b><b><b>g</b></b>");		
@@ -13,4 +14,4 @@
  }
  }
  
-</code></pre><p>
\ No newline at end of file
+</code></pre></div><p>
\ No newline at end of file
diff --git a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_NestedRegion_ReplaceAnnotation_Regex.pass b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_NestedRegion_ReplaceAnnotation_Regex.pass
index 56cebce286..c40df372f8 100644
--- a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_NestedRegion_ReplaceAnnotation_Regex.pass
+++ b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_NestedRegion_ReplaceAnnotation_Regex.pass
@@ -1,4 +1,5 @@
-<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>testNestedRegion_ReplaceAnnotation_Regex</b>()</pre><p><pre><code> class HelloWorld<span style="background-color:yellow;">1</span> {
+<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>testNestedRegion_ReplaceAnnotation_Regex</b>()</pre><p><div id="snippet1" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet1">Copy</a></div>
+<pre><code> class HelloWorld<span style="background-color:yellow;">1</span> {
      public static void main(String... args) {
          UPPERystem.out.println(num);  
          UPPERystem.out.println(num);
@@ -7,4 +8,4 @@
  }
  }
  
-</code></pre><p>
\ No newline at end of file
+</code></pre></div><p>
\ No newline at end of file
diff --git a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_NestedRegion_ReplaceAnnotation_Substring.pass b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_NestedRegion_ReplaceAnnotation_Substring.pass
index cd65829929..5e146608a3 100644
--- a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_NestedRegion_ReplaceAnnotation_Substring.pass
+++ b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_NestedRegion_ReplaceAnnotation_Substring.pass
@@ -1,4 +1,5 @@
-<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>testNestedRegion_ReplaceAnnotation_Substring</b>()</pre><p><pre><code> class HelloWorld {
+<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>testNestedRegion_ReplaceAnnotation_Substring</b>()</pre><p><div id="snippet1" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet1">Copy</a></div>
+<pre><code> class HelloWorld {
      public static void main(String... args) {
          System.err.println("print");  
          System.err.println("print" + "to-do");
@@ -7,4 +8,4 @@
  }
  }
  
-</code></pre><p>
\ No newline at end of file
+</code></pre></div><p>
\ No newline at end of file
diff --git a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_Region_ReplaceAnnotation_Regex.pass b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_Region_ReplaceAnnotation_Regex.pass
index b47f032872..406ecd1cce 100644
--- a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_Region_ReplaceAnnotation_Regex.pass
+++ b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_Region_ReplaceAnnotation_Regex.pass
@@ -1,4 +1,5 @@
-<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>testRegion_ReplaceAnnotation_Regex</b>()</pre><p><pre><code> class HelloWorld {
+<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>testRegion_ReplaceAnnotation_Regex</b>()</pre><p><div id="snippet1" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet1">Copy</a></div>
+<pre><code> class HelloWorld {
      public static void main(String... args) {
          System.out.println("...replace...");  //to-do
          System.out.println("...replace..."
@@ -6,4 +7,4 @@
  }
  }
  
-</code></pre><p>
\ No newline at end of file
+</code></pre></div><p>
\ No newline at end of file
diff --git a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_Region_ReplaceAnnotation_RegexInnComment.pass b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_Region_ReplaceAnnotation_RegexInnComment.pass
index a355e5c86b..78df225937 100644
--- a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_Region_ReplaceAnnotation_RegexInnComment.pass
+++ b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_Region_ReplaceAnnotation_RegexInnComment.pass
@@ -1,8 +1,9 @@
-<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>testRegion_ReplaceAnnotation_RegexInnComment</b>()</pre><p><pre><code> class HelloWorld {
+<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>testRegion_ReplaceAnnotation_RegexInnComment</b>()</pre><p><div id="snippet1" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet1">Copy</a></div>
+<pre><code> class HelloWorld {
      public static void main(String... args) {
          System.out.println("...replace..." + "Good morning");  //"...replace..."
          System.out.println("Hello World!" + "...replace..."); 
  }
  }
  
-</code></pre><p>
\ No newline at end of file
+</code></pre></div><p>
\ No newline at end of file
diff --git a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_SingleLine_MultipleReplaceAnnotation_Regex.pass b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_SingleLine_MultipleReplaceAnnotation_Regex.pass
index d1fc76c975..21c971b351 100644
--- a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_SingleLine_MultipleReplaceAnnotation_Regex.pass
+++ b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_SingleLine_MultipleReplaceAnnotation_Regex.pass
@@ -1,7 +1,8 @@
-<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>testSingleLine_MultipleReplaceAnnotation_Regex</b>()</pre><p><pre><code> class HelloWorld {
+<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>testSingleLine_MultipleReplaceAnnotation_Regex</b>()</pre><p><div id="snippet1" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet1">Copy</a></div>
+<pre><code> class HelloWorld {
      public static void main(String... args) {
          System.err.println(...replace...);  
  }
  }
  
-</code></pre><p>
\ No newline at end of file
+</code></pre></div><p>
\ No newline at end of file
diff --git a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_SingleLine_MultipleReplaceAnnotation_Substring.pass b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_SingleLine_MultipleReplaceAnnotation_Substring.pass
index 2dfd28ecb2..ac9a23369e 100644
--- a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_SingleLine_MultipleReplaceAnnotation_Substring.pass
+++ b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_SingleLine_MultipleReplaceAnnotation_Substring.pass
@@ -1,8 +1,9 @@
-<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>testSingleLine_MultipleReplaceAnnotation_Substring</b>()</pre><p><pre><code> class HelloWorld {
+<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>testSingleLine_MultipleReplaceAnnotation_Substring</b>()</pre><p><div id="snippet1" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet1">Copy</a></div>
+<pre><code> class HelloWorld {
      public static void main(String... args) {
          System.out.println("Hi World!" + "Hi Morning");  
          System.out.println("Hiiiiii World!" + "Hiiiiii Morning");  
  }
  }
  
-</code></pre><p>
\ No newline at end of file
+</code></pre></div><p>
\ No newline at end of file
diff --git a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_SingleLine_ReplaceAnnotation_Regex_DoubleQuote.pass b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_SingleLine_ReplaceAnnotation_Regex_DoubleQuote.pass
index 62172d8e40..3f79d39d39 100644
--- a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_SingleLine_ReplaceAnnotation_Regex_DoubleQuote.pass
+++ b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_SingleLine_ReplaceAnnotation_Regex_DoubleQuote.pass
@@ -1,7 +1,8 @@
-<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>testSingleLine_ReplaceAnnotation_Regex_DoubleQuote</b>()</pre><p><pre><code> class HelloWorld {
+<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>testSingleLine_ReplaceAnnotation_Regex_DoubleQuote</b>()</pre><p><div id="snippet1" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet1">Copy</a></div>
+<pre><code> class HelloWorld {
      public static void main(String... args) {
          System.out.println("...replace...");  
  }
  }
  
-</code></pre><p>
\ No newline at end of file
+</code></pre></div><p>
\ No newline at end of file
diff --git a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_SingleLine_Replace_Regex.pass b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_SingleLine_Replace_Regex.pass
index 87c99b5e0f..a5dd54ba9f 100644
--- a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_SingleLine_Replace_Regex.pass
+++ b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_SingleLine_Replace_Regex.pass
@@ -1,7 +1,8 @@
-<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>testSingleLine_Replace_Regex</b>()</pre><p><pre><code> class HelloWorld {
+<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>testSingleLine_Replace_Regex</b>()</pre><p><div id="snippet1" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet1">Copy</a></div>
+<pre><code> class HelloWorld {
      public static void main(String... args) {
          System.out.println(...);  
  }
  }
  
-</code></pre><p>
\ No newline at end of file
+</code></pre></div><p>
\ No newline at end of file
diff --git a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_SingleLine_Replace_RegexDot.pass b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_SingleLine_Replace_RegexDot.pass
index 83fdb207d6..84036ecce7 100644
--- a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_SingleLine_Replace_RegexDot.pass
+++ b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_SingleLine_Replace_RegexDot.pass
@@ -1,7 +1,8 @@
-<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>testSingleLine_Replace_RegexDot</b>()</pre><p><pre><code> class HelloWorld {
+<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>testSingleLine_Replace_RegexDot</b>()</pre><p><div id="snippet1" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet1">Copy</a></div>
+<pre><code> class HelloWorld {
      public static void main(String... args) {
 ..........................................................................................................................................
  }
  }
  
-</code></pre><p>
\ No newline at end of file
+</code></pre></div><p>
\ No newline at end of file
diff --git a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_SingleLine_Replace_RegexDotStar.pass b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_SingleLine_Replace_RegexDotStar.pass
index 4e211ab417..1a57784635 100644
--- a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_SingleLine_Replace_RegexDotStar.pass
+++ b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_SingleLine_Replace_RegexDotStar.pass
@@ -1,7 +1,8 @@
-<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>testSingleLine_Replace_RegexDotStar</b>()</pre><p><pre><code> class HelloWorld {
+<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>testSingleLine_Replace_RegexDotStar</b>()</pre><p><div id="snippet1" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet1">Copy</a></div>
+<pre><code> class HelloWorld {
      public static void main(String... args) {
 ......
  }
  }
  
-</code></pre><p>
\ No newline at end of file
+</code></pre></div><p>
\ No newline at end of file
diff --git a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_SingleLine_Replace_Substring.pass b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_SingleLine_Replace_Substring.pass
index 545bc84469..79366b1266 100644
--- a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_SingleLine_Replace_Substring.pass
+++ b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_SingleLine_Replace_Substring.pass
@@ -1,7 +1,8 @@
-<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>testSingleLine_Replace_Substring</b>()</pre><p><pre><code> class HelloWorld {
+<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>testSingleLine_Replace_Substring</b>()</pre><p><div id="snippet1" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet1">Copy</a></div>
+<pre><code> class HelloWorld {
      public static void main(String... args) {
          System.out.println("Hel-replace-d!");  
  }
  }
  
-</code></pre><p>
\ No newline at end of file
+</code></pre></div><p>
\ No newline at end of file
diff --git a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_TestError_HighlightTag.pass b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_TestError_HighlightTag.pass
index 8f9a8ec3b8..f8a0fa69d3 100644
--- a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_TestError_HighlightTag.pass
+++ b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_TestError_HighlightTag.pass
@@ -1,43 +1,56 @@
-<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>errorsInHighlightTag</b>()</pre><p><pre><code><span style="color:red;">error: snippet markup: Invalid value <sub>^</sub><b><i>Blank</b></i> for <sub>^</sub><b><i>highlight</b></i> tag mark up attribute <sub>^</sub><b><i>substring</b></i></span>
-</code></pre>
+<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>errorsInHighlightTag</b>()</pre><p><div id="snippet1" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet1">Copy</a></div>
+<pre><code><span style="color:red;">error: snippet markup: Invalid value <sub>^</sub><b><i>Blank</b></i> for <sub>^</sub><b><i>highlight</b></i> tag mark up attribute <sub>^</sub><b><i>substring</b></i></span>
+</code></pre></div>
  
- <pre><code><span style="color:red;">error: snippet markup: Invalid value <sub>^</sub><b><i>Blank</b></i> for <sub>^</sub><b><i>highlight</b></i> tag mark up attribute <sub>^</sub><b><i>substring</b></i></span>
-</code></pre>
+ <div id="snippet2" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet2">Copy</a></div>
+<pre><code><span style="color:red;">error: snippet markup: Invalid value <sub>^</sub><b><i>Blank</b></i> for <sub>^</sub><b><i>highlight</b></i> tag mark up attribute <sub>^</sub><b><i>substring</b></i></span>
+</code></pre></div>
  
- <pre><code><span style="color:red;">error: snippet markup: Invalid value <sub>^</sub><b><i>Blank</b></i> for <sub>^</sub><b><i>highlight</b></i> tag mark up attribute <sub>^</sub><b><i>substring</b></i></span>
-</code></pre>
+ <div id="snippet3" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet3">Copy</a></div>
+<pre><code><span style="color:red;">error: snippet markup: Invalid value <sub>^</sub><b><i>Blank</b></i> for <sub>^</sub><b><i>highlight</b></i> tag mark up attribute <sub>^</sub><b><i>substring</b></i></span>
+</code></pre></div>
  
- <pre><code><span style="color:red;">error: snippet markup: Invalid value <sub>^</sub><b><i>Blank</b></i> for <sub>^</sub><b><i>highlight</b></i> tag mark up attribute <sub>^</sub><b><i>substring</b></i></span>
-</code></pre>
+ <div id="snippet4" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet4">Copy</a></div>
+<pre><code><span style="color:red;">error: snippet markup: Invalid value <sub>^</sub><b><i>Blank</b></i> for <sub>^</sub><b><i>highlight</b></i> tag mark up attribute <sub>^</sub><b><i>substring</b></i></span>
+</code></pre></div>
  
  
- <pre><code><span style="color:red;">error: snippet markup: Invalid value <sub>^</sub><b><i>Blank</b></i> for <sub>^</sub><b><i>highlight</b></i> tag mark up attribute <sub>^</sub><b><i>regex</b></i></span>
-</code></pre>
+ <div id="snippet5" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet5">Copy</a></div>
+<pre><code><span style="color:red;">error: snippet markup: Invalid value <sub>^</sub><b><i>Blank</b></i> for <sub>^</sub><b><i>highlight</b></i> tag mark up attribute <sub>^</sub><b><i>regex</b></i></span>
+</code></pre></div>
  
- <pre><code><span style="color:red;">error: snippet markup: Invalid value <sub>^</sub><b><i>Blank</b></i> for <sub>^</sub><b><i>highlight</b></i> tag mark up attribute <sub>^</sub><b><i>regex</b></i></span>
-</code></pre>
+ <div id="snippet6" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet6">Copy</a></div>
+<pre><code><span style="color:red;">error: snippet markup: Invalid value <sub>^</sub><b><i>Blank</b></i> for <sub>^</sub><b><i>highlight</b></i> tag mark up attribute <sub>^</sub><b><i>regex</b></i></span>
+</code></pre></div>
  
- <pre><code><span style="color:red;">error: snippet markup: Invalid value <sub>^</sub><b><i>Blank</b></i> for <sub>^</sub><b><i>highlight</b></i> tag mark up attribute <sub>^</sub><b><i>regex</b></i></span>
-</code></pre>
+ <div id="snippet7" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet7">Copy</a></div>
+<pre><code><span style="color:red;">error: snippet markup: Invalid value <sub>^</sub><b><i>Blank</b></i> for <sub>^</sub><b><i>highlight</b></i> tag mark up attribute <sub>^</sub><b><i>regex</b></i></span>
+</code></pre></div>
  
- <pre><code><span style="color:red;">error: snippet markup: Invalid value <sub>^</sub><b><i></b></i> for <sub>^</sub><b><i>highlight</b></i> tag mark up attribute <sub>^</sub><b><i>type</b></i>.<br>Valid values, such as bold, italic, or highlighted</span>
-</code></pre>
+ <div id="snippet8" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet8">Copy</a></div>
+<pre><code><span style="color:red;">error: snippet markup: Invalid value <sub>^</sub><b><i></b></i> for <sub>^</sub><b><i>highlight</b></i> tag mark up attribute <sub>^</sub><b><i>type</b></i>.<br>Valid values, such as bold, italic, or highlighted</span>
+</code></pre></div>
  
- <pre><code><span style="color:red;">error: snippet markup: Invalid value <sub>^</sub><b><i></b></i> for <sub>^</sub><b><i>highlight</b></i> tag mark up attribute <sub>^</sub><b><i>type</b></i>.<br>Valid values, such as bold, italic, or highlighted</span>
-</code></pre>
+ <div id="snippet9" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet9">Copy</a></div>
+<pre><code><span style="color:red;">error: snippet markup: Invalid value <sub>^</sub><b><i></b></i> for <sub>^</sub><b><i>highlight</b></i> tag mark up attribute <sub>^</sub><b><i>type</b></i>.<br>Valid values, such as bold, italic, or highlighted</span>
+</code></pre></div>
  
- <pre><code><span style="color:red;">error: snippet markup: Invalid value <sub>^</sub><b><i></b></i> for <sub>^</sub><b><i>highlight</b></i> tag mark up attribute <sub>^</sub><b><i>type</b></i>.<br>Valid values, such as bold, italic, or highlighted</span>
-</code></pre>
+ <div id="snippet10" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet10">Copy</a></div>
+<pre><code><span style="color:red;">error: snippet markup: Invalid value <sub>^</sub><b><i></b></i> for <sub>^</sub><b><i>highlight</b></i> tag mark up attribute <sub>^</sub><b><i>type</b></i>.<br>Valid values, such as bold, italic, or highlighted</span>
+</code></pre></div>
  
- <pre><code><span style="color:red;">error: snippet markup: Invalid value <sub>^</sub><b><i>xyz</b></i> for <sub>^</sub><b><i>highlight</b></i> tag mark up attribute <sub>^</sub><b><i>type</b></i>.<br>Valid values, such as bold, italic, or highlighted</span>
-</code></pre>
+ <div id="snippet11" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet11">Copy</a></div>
+<pre><code><span style="color:red;">error: snippet markup: Invalid value <sub>^</sub><b><i>xyz</b></i> for <sub>^</sub><b><i>highlight</b></i> tag mark up attribute <sub>^</sub><b><i>type</b></i>.<br>Valid values, such as bold, italic, or highlighted</span>
+</code></pre></div>
  
- <pre><code><span style="background-color:yellow;"> </span>class<span style="background-color:yellow;"> </span>HelloWorld<span style="background-color:yellow;"> </span>{
+ <div id="snippet12" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet12">Copy</a></div>
+<pre><code><span style="background-color:yellow;"> </span>class<span style="background-color:yellow;"> </span>HelloWorld<span style="background-color:yellow;"> </span>{
  }
  
-</code></pre>
+</code></pre></div>
  
- <pre><code> class HelloWorld {
+ <div id="snippet13" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet13">Copy</a></div>
+<pre><code> class HelloWorld {
  }
  
-</code></pre><p>
\ No newline at end of file
+</code></pre></div><p>
\ No newline at end of file
diff --git a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_TestError_NoRegionToEnd.pass b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_TestError_NoRegionToEnd.pass
index b1591dc581..3874175b80 100644
--- a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_TestError_NoRegionToEnd.pass
+++ b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_TestError_NoRegionToEnd.pass
@@ -1,2 +1,3 @@
-<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>errorsInNoRegionToEnd</b>()</pre><p><pre><code><span style="color:red;">error: snippet markup: no region to end @end <sub>^</sub><b><i>anonymous</b></i></span>
-</code></pre><p>
\ No newline at end of file
+<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>errorsInNoRegionToEnd</b>()</pre><p><div id="snippet1" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet1">Copy</a></div>
+<pre><code><span style="color:red;">error: snippet markup: no region to end @end <sub>^</sub><b><i>anonymous</b></i></span>
+</code></pre></div><p>
\ No newline at end of file
diff --git a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_TestError_ReplaceTag.pass b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_TestError_ReplaceTag.pass
index eba20ddebe..173fb2afd7 100644
--- a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_TestError_ReplaceTag.pass
+++ b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_TestError_ReplaceTag.pass
@@ -1,36 +1,47 @@
-<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>errorsInReplaceTag</b>()</pre><p><pre><code><span style="color:red;">error: snippet markup: Invalid value <sub>^</sub><b><i>Blank</b></i> for <sub>^</sub><b><i>replace</b></i> tag mark up attribute <sub>^</sub><b><i>substring</b></i></span>
-</code></pre>
+<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>errorsInReplaceTag</b>()</pre><p><div id="snippet1" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet1">Copy</a></div>
+<pre><code><span style="color:red;">error: snippet markup: Invalid value <sub>^</sub><b><i>Blank</b></i> for <sub>^</sub><b><i>replace</b></i> tag mark up attribute <sub>^</sub><b><i>substring</b></i></span>
+</code></pre></div>
  
- <pre><code><span style="color:red;">error: snippet markup: Invalid value <sub>^</sub><b><i>Blank</b></i> for <sub>^</sub><b><i>replace</b></i> tag mark up attribute <sub>^</sub><b><i>substring</b></i></span>
-</code></pre>
+ <div id="snippet2" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet2">Copy</a></div>
+<pre><code><span style="color:red;">error: snippet markup: Invalid value <sub>^</sub><b><i>Blank</b></i> for <sub>^</sub><b><i>replace</b></i> tag mark up attribute <sub>^</sub><b><i>substring</b></i></span>
+</code></pre></div>
  
- <pre><code><span style="color:red;">error: snippet markup: Invalid value <sub>^</sub><b><i>Blank</b></i> for <sub>^</sub><b><i>replace</b></i> tag mark up attribute <sub>^</sub><b><i>substring</b></i></span>
-</code></pre>
+ <div id="snippet3" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet3">Copy</a></div>
+<pre><code><span style="color:red;">error: snippet markup: Invalid value <sub>^</sub><b><i>Blank</b></i> for <sub>^</sub><b><i>replace</b></i> tag mark up attribute <sub>^</sub><b><i>substring</b></i></span>
+</code></pre></div>
  
- <pre><code><span style="color:red;">error: snippet markup: Invalid value <sub>^</sub><b><i>Blank</b></i> for <sub>^</sub><b><i>replace</b></i> tag mark up attribute <sub>^</sub><b><i>regex</b></i></span>
-</code></pre>
+ <div id="snippet4" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet4">Copy</a></div>
+<pre><code><span style="color:red;">error: snippet markup: Invalid value <sub>^</sub><b><i>Blank</b></i> for <sub>^</sub><b><i>replace</b></i> tag mark up attribute <sub>^</sub><b><i>regex</b></i></span>
+</code></pre></div>
  
- <pre><code><span style="color:red;">error: snippet markup: Invalid value <sub>^</sub><b><i>Blank</b></i> for <sub>^</sub><b><i>replace</b></i> tag mark up attribute <sub>^</sub><b><i>regex</b></i></span>
-</code></pre>
+ <div id="snippet5" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet5">Copy</a></div>
+<pre><code><span style="color:red;">error: snippet markup: Invalid value <sub>^</sub><b><i>Blank</b></i> for <sub>^</sub><b><i>replace</b></i> tag mark up attribute <sub>^</sub><b><i>regex</b></i></span>
+</code></pre></div>
  
- <pre><code><span style="color:red;">error: snippet markup: Invalid value <sub>^</sub><b><i>Blank</b></i> for <sub>^</sub><b><i>replace</b></i> tag mark up attribute <sub>^</sub><b><i>regex</b></i></span>
-</code></pre>
+ <div id="snippet6" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet6">Copy</a></div>
+<pre><code><span style="color:red;">error: snippet markup: Invalid value <sub>^</sub><b><i>Blank</b></i> for <sub>^</sub><b><i>replace</b></i> tag mark up attribute <sub>^</sub><b><i>regex</b></i></span>
+</code></pre></div>
  
- <pre><code><span style="color:red;">error: snippet markup: Missing <sub>^</sub><b><i>replace</b></i> tag attribute : <sub>^</sub><b><i>replacement</b></i></span>
-</code></pre>
+ <div id="snippet7" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet7">Copy</a></div>
+<pre><code><span style="color:red;">error: snippet markup: Missing <sub>^</sub><b><i>replace</b></i> tag attribute : <sub>^</sub><b><i>replacement</b></i></span>
+</code></pre></div>
  
- <pre><code><span style="color:red;">error: snippet markup: Missing <sub>^</sub><b><i>replace</b></i> tag attribute : <sub>^</sub><b><i>replacement</b></i></span>
-</code></pre>
+ <div id="snippet8" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet8">Copy</a></div>
+<pre><code><span style="color:red;">error: snippet markup: Missing <sub>^</sub><b><i>replace</b></i> tag attribute : <sub>^</sub><b><i>replacement</b></i></span>
+</code></pre></div>
  
- <pre><code><span style="color:red;">error: snippet markup: Invalid value <sub>^</sub><b><i>Blank</b></i> for <sub>^</sub><b><i>replace</b></i> tag mark up attribute <sub>^</sub><b><i>substring</b></i></span>
-</code></pre>
+ <div id="snippet9" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet9">Copy</a></div>
+<pre><code><span style="color:red;">error: snippet markup: Invalid value <sub>^</sub><b><i>Blank</b></i> for <sub>^</sub><b><i>replace</b></i> tag mark up attribute <sub>^</sub><b><i>substring</b></i></span>
+</code></pre></div>
  
- <pre><code> interface Helloclass {
+ <div id="snippet10" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet10">Copy</a></div>
+<pre><code> interface Helloclass {
  }
  
-</code></pre>
+</code></pre></div>
  
- <pre><code> class Hello {
+ <div id="snippet11" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet11">Copy</a></div>
+<pre><code> class Hello {
  }
  
-</code></pre><p>
\ No newline at end of file
+</code></pre></div><p>
\ No newline at end of file
diff --git a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_TestError_UnpairedRegion.pass b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_TestError_UnpairedRegion.pass
index 6e2c011098..59b3db609f 100644
--- a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_TestError_UnpairedRegion.pass
+++ b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_TestError_UnpairedRegion.pass
@@ -1,11 +1,15 @@
-<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>errorsInUnpairedRegion</b>()</pre><p><pre><code><span style="color:red;">error: snippet markup: unpaired region <b><i>highlight anonymous</b></i></span>
-</code></pre>
+<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>errorsInUnpairedRegion</b>()</pre><p><div id="snippet1" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet1">Copy</a></div>
+<pre><code><span style="color:red;">error: snippet markup: unpaired region <b><i>highlight anonymous</b></i></span>
+</code></pre></div>
  
- <pre><code><span style="color:red;">error: snippet markup: unpaired region <b><i>highlight rg1</b></i></span>
-</code></pre>
+ <div id="snippet2" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet2">Copy</a></div>
+<pre><code><span style="color:red;">error: snippet markup: unpaired region <b><i>highlight rg1</b></i></span>
+</code></pre></div>
  
- <pre><code><span style="color:red;">error: snippet markup: unpaired region <b><i>highlight rg2</b></i></span>
-</code></pre>
+ <div id="snippet3" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet3">Copy</a></div>
+<pre><code><span style="color:red;">error: snippet markup: unpaired region <b><i>highlight rg2</b></i></span>
+</code></pre></div>
  
- <pre><code><span style="color:red;">error: snippet markup: unpaired region <b><i>highlight rg1</b></i></span>
-</code></pre><p>
\ No newline at end of file
+ <div id="snippet4" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet4">Copy</a></div>
+<pre><code><span style="color:red;">error: snippet markup: unpaired region <b><i>highlight rg1</b></i></span>
+</code></pre></div><p>
\ No newline at end of file
diff --git a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlightRecord.pass b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlightRecord.pass
index e2f92e03ee..ebeb164087 100644
--- a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlightRecord.pass
+++ b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlightRecord.pass
@@ -1,10 +1,11 @@
 <html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>private static void <b>method</b>(<a href='*1'>R</a> r)</pre><p>A simple program.
 
  <code><a href='*2'>System.out</a></code>
- <pre><code> class HelloWorld {
+ <div id="snippet1" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet1">Copy</a></div>
+<pre><code> class HelloWorld {
      public static void main(String... args) {
          System.out.<b>p</b><b>r</b><b>i</b><b>n</b><b>t</b><b>l</b><b>n</b>("Hello World!");      
  }
  }
  
-</code></pre><p>
\ No newline at end of file
+</code></pre></div><p>
\ No newline at end of file
diff --git a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlightTagRegexWithAllCharacterChange.pass b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlightTagRegexWithAllCharacterChange.pass
index 67b9a4886f..a42f299868 100644
--- a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlightTagRegexWithAllCharacterChange.pass
+++ b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlightTagRegexWithAllCharacterChange.pass
@@ -1,6 +1,7 @@
-<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>highlightTagRegexWithAllCharacterChange</b>()</pre><p><pre><code>   public static void main(String... args) {
+<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>highlightTagRegexWithAllCharacterChange</b>()</pre><p><div id="snippet1" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet1">Copy</a></div>
+<pre><code>   public static void main(String... args) {
       
 <b> </b><b> </b><b> </b><b> </b><b> </b><b>S</b><b>y</b><b>s</b><b>t</b><b>e</b><b>m</b><b>.</b><b>o</b><b>u</b><b>t</b><b>.</b><b>p</b><b>r</b><b>i</b><b>n</b><b>t</b><b>l</b><b>n</b><b>(</b><b>"</b><b>a</b><b>r</b><b>g</b><b>s</b><b>"</b><b>)</b><b>;</b><b> </b><b>/</b><b>/</b><b> </b><b>t</b><b>o</b><b>-</b><b>d</b><b>o</b><b> </b><b>a</b><b>r</b><b>g</b><b>s</b>
  }
  
-</code></pre><p>
\ No newline at end of file
+</code></pre></div><p>
\ No newline at end of file
diff --git a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlightTagRegexWithAllCharacterChangeUsingDot.pass b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlightTagRegexWithAllCharacterChangeUsingDot.pass
index 1c646154c8..994db22393 100644
--- a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlightTagRegexWithAllCharacterChangeUsingDot.pass
+++ b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlightTagRegexWithAllCharacterChangeUsingDot.pass
@@ -1,6 +1,7 @@
-<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>highlightTagRegexWithAllCharacterChangeUsingDot</b>()</pre><p><pre><code>   public static void main(String... args) {
+<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>highlightTagRegexWithAllCharacterChangeUsingDot</b>()</pre><p><div id="snippet1" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet1">Copy</a></div>
+<pre><code>   public static void main(String... args) {
       
 <b> </b><b> </b><b> </b><b> </b><b> </b><b>S</b><b>y</b><b>s</b><b>t</b><b>e</b><b>m</b><b>.</b><b>o</b><b>u</b><b>t</b><b>.</b><b>p</b><b>r</b><b>i</b><b>n</b><b>t</b><b>l</b><b>n</b><b>(</b><b>"</b><b>a</b><b>r</b><b>g</b><b>s</b><b>"</b><b>)</b><b>;</b><b> </b><b>/</b><b>/</b><b> </b><b>t</b><b>o</b><b>-</b><b>d</b><b>o</b><b> </b><b>a</b><b>r</b><b>g</b><b>s</b>
  }
  
-</code></pre><p>
\ No newline at end of file
+</code></pre></div><p>
\ No newline at end of file
diff --git a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlightTagSubstringApplyToNextLine.pass b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlightTagSubstringApplyToNextLine.pass
index cb9be01146..9b05d647a3 100644
--- a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlightTagSubstringApplyToNextLine.pass
+++ b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlightTagSubstringApplyToNextLine.pass
@@ -1,6 +1,7 @@
-<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>highlightTagSubstringApplyToNextLine</b>()</pre><p><pre><code>   public static void main(String... args) {
+<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>highlightTagSubstringApplyToNextLine</b>()</pre><p><div id="snippet1" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet1">Copy</a></div>
+<pre><code>   public static void main(String... args) {
       
      System.out.println("<b>a</b><b>r</b><b>g</b><b>s</b>"); // to-do <b>a</b><b>r</b><b>g</b><b>s</b>
  }
  
-</code></pre><p>
\ No newline at end of file
+</code></pre></div><p>
\ No newline at end of file
diff --git a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlightUsingMultipleSnippetTagInOneJavaDocWithRegion.pass b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlightUsingMultipleSnippetTagInOneJavaDocWithRegion.pass
index 3151555e57..83732f2b1f 100644
--- a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlightUsingMultipleSnippetTagInOneJavaDocWithRegion.pass
+++ b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlightUsingMultipleSnippetTagInOneJavaDocWithRegion.pass
@@ -1,4 +1,5 @@
-<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>highlightUsingSubstringRegexAndType</b>()</pre><p><pre><code>   public static void main(String... substring) {
+<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>highlightUsingSubstringRegexAndType</b>()</pre><p><div id="snippet1" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet1">Copy</a></div>
+<pre><code>   public static void main(String... substring) {
        for (var regex : substring) {
            if (!arg.isBlank()) {
                 System.out.println("<i>i</i><i>t</i><i>a</i><i>l</i><i>i</i><i>c</i>");     
@@ -20,4 +21,4 @@
  }
  }
  
-</code></pre><p>
\ No newline at end of file
+</code></pre></div><p>
\ No newline at end of file
diff --git a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlightUsingNestedRegions.pass b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlightUsingNestedRegions.pass
index 198d556abe..0b642aa0f5 100644
--- a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlightUsingNestedRegions.pass
+++ b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlightUsingNestedRegions.pass
@@ -1,4 +1,5 @@
-<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>highlightUsingNestedRegions</b>()</pre><p><pre><code>   public static void \bmain\b(String... args) {
+<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>highlightUsingNestedRegions</b>()</pre><p><div id="snippet1" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet1">Copy</a></div>
+<pre><code>   public static void \bmain\b(String... args) {
  
        for (var <b><i>a</i></b><b><i>r</i></b><b><i>g</i></b> : <b><i>a</i></b><b><i>r</i></b><b><i>g</i></b>s) {
            if (!<b>a</b><b>r</b><b>g</b>.isBl<b>a</b><b>r</b><b>g</b>k()) {
@@ -11,4 +12,4 @@
  }
  }
  
-</code></pre><p>
\ No newline at end of file
+</code></pre></div><p>
\ No newline at end of file
diff --git a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlightUsingRegex.pass b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlightUsingRegex.pass
index 5871306357..7c96bd0913 100644
--- a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlightUsingRegex.pass
+++ b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlightUsingRegex.pass
@@ -1,4 +1,5 @@
-<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>highlightUsingRegex</b>()</pre><p><pre><code>   public static void main(String... args1) {
+<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>highlightUsingRegex</b>()</pre><p><div id="snippet1" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet1">Copy</a></div>
+<pre><code>   public static void main(String... args1) {
        for (var arg : args<b>1</b>) {                 
            if (!<b>a</b><b>r</b><b>g</b>.isBlankarg()) {           
                System.<b>o</b><b>u</b><b>t</b>.println(args1);       
@@ -6,4 +7,4 @@
  }
  }
  
-</code></pre><p>
\ No newline at end of file
+</code></pre></div><p>
\ No newline at end of file
diff --git a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlightUsingRegionsEndedWithDoubleColon.pass b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlightUsingRegionsEndedWithDoubleColon.pass
index 4f35b1235d..faac4e2c66 100644
--- a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlightUsingRegionsEndedWithDoubleColon.pass
+++ b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlightUsingRegionsEndedWithDoubleColon.pass
@@ -1,4 +1,5 @@
-<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>highlightUsingRegionsEndedWithDoubleColon</b>()</pre><p><pre><code>   public static void \bmain\b(String... args) {
+<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>highlightUsingRegionsEndedWithDoubleColon</b>()</pre><p><div id="snippet1" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet1">Copy</a></div>
+<pre><code>   public static void \bmain\b(String... args) {
        for (var arg : args) {                         
            if (!<span style="background-color:yellow;">a</span><span style="background-color:yellow;">r</span><span style="background-color:yellow;">g</span>.<b>i</b><b>s</b>Bl<span style="background-color:yellow;">a</span><span style="background-color:yellow;">r</span><span style="background-color:yellow;">g</span>k()) {
                System.<span style="background-color:yellow;">a</span><span style="background-color:yellow;">r</span><span style="background-color:yellow;">g</span>.println("<span style="background-color:yellow;">a</span><span style="background-color:yellow;">r</span><span style="background-color:yellow;">g</span>");
@@ -10,4 +11,4 @@
  }
  }
  
-</code></pre><p>
\ No newline at end of file
+</code></pre></div><p>
\ No newline at end of file
diff --git a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlightUsingSubstring.pass b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlightUsingSubstring.pass
index 7ebe758b32..7230e25d72 100644
--- a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlightUsingSubstring.pass
+++ b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlightUsingSubstring.pass
@@ -1,4 +1,5 @@
-<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>highlightUsingSubstring</b>()</pre><p><pre><code>   public static void main(String... args) {
+<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>highlightUsingSubstring</b>()</pre><p><div id="snippet1" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet1">Copy</a></div>
+<pre><code>   public static void main(String... args) {
        for (var arg : <b>a</b><b>r</b><b>g</b><b>s</b>) {                 
            if (!<b>a</b><b>r</b><b>g</b>.isBlank<b>a</b><b>r</b><b>g</b>()) {           
                System.out.<b>p</b><b>r</b><b>i</b><b>n</b><b>t</b><b>l</b><b>n</b>(<b>a</b><b>r</b><b>g</b>);       
@@ -6,4 +7,4 @@
  }
  }
  
-</code></pre><p>
\ No newline at end of file
+</code></pre></div><p>
\ No newline at end of file
diff --git a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlightUsingSubstringAndRegex.pass b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlightUsingSubstringAndRegex.pass
index f3ce2ed3be..dea56f3efa 100644
--- a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlightUsingSubstringAndRegex.pass
+++ b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlightUsingSubstringAndRegex.pass
@@ -1,4 +1,5 @@
-<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>highlightUsingSubstringAndRegex</b>()</pre><p><pre><code>   public static void main(String... args1) {
+<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>highlightUsingSubstringAndRegex</b>()</pre><p><div id="snippet1" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet1">Copy</a></div>
+<pre><code>   public static void main(String... args1) {
        for (<b>v</b><b>a</b><b>r</b> arg : args<b>1</b>) {                 
            if (!<b>a</b><b>r</b><b>g</b>.isBlankarg<b>(</b><b>)</b>) {           
                <b>S</b><b>y</b><b>s</b><b>t</b><b>e</b><b>m</b>.<b>o</b><b>u</b><b>t</b>.println("outs");       
@@ -6,4 +7,4 @@
  }
  }
  
-</code></pre><p>
\ No newline at end of file
+</code></pre></div><p>
\ No newline at end of file
diff --git a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlightUsingSubstringRegexAndType.pass b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlightUsingSubstringRegexAndType.pass
index 3151555e57..83732f2b1f 100644
--- a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlightUsingSubstringRegexAndType.pass
+++ b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlightUsingSubstringRegexAndType.pass
@@ -1,4 +1,5 @@
-<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>highlightUsingSubstringRegexAndType</b>()</pre><p><pre><code>   public static void main(String... substring) {
+<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>highlightUsingSubstringRegexAndType</b>()</pre><p><div id="snippet1" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet1">Copy</a></div>
+<pre><code>   public static void main(String... substring) {
        for (var regex : substring) {
            if (!arg.isBlank()) {
                 System.out.println("<i>i</i><i>t</i><i>a</i><i>l</i><i>i</i><i>c</i>");     
@@ -20,4 +21,4 @@
  }
  }
  
-</code></pre><p>
\ No newline at end of file
+</code></pre></div><p>
\ No newline at end of file
diff --git a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlightRecord.pass b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlight_markuptag.pass
similarity index 94%
copy from java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlightRecord.pass
copy to java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlight_markuptag.pass
index e2f92e03ee..2e5d769fb5 100644
--- a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlightRecord.pass
+++ b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_highlight_markuptag.pass
@@ -1,10 +1,9 @@
 <html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>private static void <b>method</b>(<a href='*1'>R</a> r)</pre><p>A simple program.
-
  <code><a href='*2'>System.out</a></code>
  <pre><code> class HelloWorld {
      public static void main(String... args) {
          System.out.<b>p</b><b>r</b><b>i</b><b>n</b><b>t</b><b>l</b><b>n</b>("Hello World!");      
- }
+     }
  }
  
 </code></pre><p>
\ No newline at end of file
diff --git a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_noMarkupTagPresent.pass b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_noMarkupTagPresent.pass
index 8e64c58d70..82b3e07aea 100644
--- a/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_noMarkupTagPresent.pass
+++ b/java/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/editor/java/GoToSupportTest/javadocsnippet_noMarkupTagPresent.pass
@@ -1,5 +1,6 @@
-<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>noMarkupTagPresent</b>()</pre><p><pre><code>   public static void main(String... args) {
+<html><body><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public void <b>noMarkupTagPresent</b>()</pre><p><div id="snippet1" style="font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px"><div align=right><a href="copy.snippet1">Copy</a></div>
+<pre><code>   public static void main(String... args) {
      System.out.println("args"); // highligh substring = "args"
  }
  
-</code></pre><p>
\ No newline at end of file
+</code></pre></div><p>
\ No newline at end of file
diff --git a/java/java.editor/test/unit/src/org/netbeans/modules/editor/java/GoToSupportTest.java b/java/java.editor/test/unit/src/org/netbeans/modules/editor/java/GoToSupportTest.java
index 43f1d8e50c..8f66d208b1 100644
--- a/java/java.editor/test/unit/src/org/netbeans/modules/editor/java/GoToSupportTest.java
+++ b/java/java.editor/test/unit/src/org/netbeans/modules/editor/java/GoToSupportTest.java
@@ -46,6 +46,7 @@ import org.netbeans.api.java.source.ClasspathInfo;
 import org.netbeans.api.java.source.CompilationController;
 import org.netbeans.api.java.source.ElementHandle;
 import org.netbeans.api.java.source.JavaSource;
+import org.netbeans.api.java.source.SourceUtilsTest;
 import org.netbeans.api.java.source.SourceUtilsTestUtil;
 import org.netbeans.api.java.source.SourceUtilsTestUtil2;
 import org.netbeans.api.java.source.Task;
@@ -278,31 +279,6 @@ public class GoToSupportTest extends NbTestCase {
         }, true);
     }
 
-    public void testTooltipForInnerClasses() throws Exception {
-        String code = "package test; public class Test {enum EE {A} class CC {} EE a; CC c;}";
-        int[] offset = new int[] {82, 88};
-        String[] golden = new String[] {
-            "<html><body><base href=\"file:" + getWorkDirPath() + "/src/test/Test.java\"></base><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>static enum <b>EE</b><br>extends <a href='*1'>Enum</a>&lt;<a href='*2'>EE</a>&gt;</pre>",
-            "<html><body><base href=\"file:" + getWorkDirPath() + "/src/test/Test.java\"></base><font size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>class <b>CC</b><br>extends <a href='*1'>Object</a></pre>",
-        };
-        assertEquals(offset.length, golden.length);
-        for (int cntr = 0; cntr < offset.length; cntr++) {
-            String tooltip = performTest(code, offset[cntr] - 24, new OrigUiUtilsCaller() {
-                public void open(FileObject fo, int pos) {
-                    fail("Should not be called.");
-                }
-                public void beep() {
-                    fail("Should not be called.");
-                }
-                public void open(ClasspathInfo info, Element el) {
-                    fail("Should not be called.");
-                }
-            }, true);
-
-            assertEquals(golden[cntr], tooltip);
-        }
-    }
-
     public void testGoToIntoAnnonymous() throws Exception {
         final boolean[] wasCalled = new boolean[1];
 
@@ -1857,118 +1833,6 @@ public class GoToSupportTest extends NbTestCase {
         performTest("ReplaceTag", 6926, null, "javadocsnippet_HighlightAndReplace_cornercase.pass", this.sourceLevel);
     }
 
-    public void testLinkTag() throws Exception {
-        if (!TreeShims.isJDKVersionRelease18_Or_Above()) {
-            return;
-        }
-        this.sourceLevel = getLatestSourceVersion();
-        EXTRA_OPTIONS.add("--enable-preview");
-        JavacParser.DISABLE_SOURCE_LEVEL_DOWNGRADE = true;
-        performTest("LinkTag", 558, null, "javadocsnippet_LinkTag.pass", this.sourceLevel);
-
-    }
-
-    public void testLinkTag_With_RegexAndRegion() throws Exception {
-        if (!TreeShims.isJDKVersionRelease18_Or_Above()) {
-            return;
-        }
-        this.sourceLevel = getLatestSourceVersion();
-        EXTRA_OPTIONS.add("--enable-preview");
-        JavacParser.DISABLE_SOURCE_LEVEL_DOWNGRADE = true;
-        performTest("LinkTag", 999, null, "javadocsnippet_LinkTag_With_RegexAndRegion.pass", this.sourceLevel);
-
-    }
-
-    public void testLinkTag_AppliesToNextLine() throws Exception {
-        if (!TreeShims.isJDKVersionRelease18_Or_Above()) {
-            return;
-        }
-        this.sourceLevel = getLatestSourceVersion();
-        EXTRA_OPTIONS.add("--enable-preview");
-        JavacParser.DISABLE_SOURCE_LEVEL_DOWNGRADE = true;
-        performTest("LinkTag", 1350, null, "javadocsnippet_LinkTag_AppliesToNextLine.pass", this.sourceLevel);
-
-    }
-
-    public void testLink_MultipleTag_OnSameLine() throws Exception {
-        if (!TreeShims.isJDKVersionRelease18_Or_Above()) {
-            return;
-        }
-        this.sourceLevel = getLatestSourceVersion();
-        EXTRA_OPTIONS.add("--enable-preview");
-        JavacParser.DISABLE_SOURCE_LEVEL_DOWNGRADE = true;
-        performTest("LinkTag", 1737, null, "javadocsnippet_Link_MultipleTag_OnSameLine.pass", this.sourceLevel);
-    }
-
-    public void testLinkTag_With_RegionAttribute() throws Exception {
-        if (!TreeShims.isJDKVersionRelease18_Or_Above()) {
-            return;
-        }
-        this.sourceLevel = getLatestSourceVersion();
-        EXTRA_OPTIONS.add("--enable-preview");
-        JavacParser.DISABLE_SOURCE_LEVEL_DOWNGRADE = true;
-        performTest("LinkTag", 2420, null, "javadocsnippet_LinkTag_With_RegionAttribute.pass", this.sourceLevel);
-    }
-
-    public void testLinkTag_Ref_ToThisClass_UsingHash() throws Exception {
-        if (!TreeShims.isJDKVersionRelease18_Or_Above()) {
-            return;
-        }
-        this.sourceLevel = getLatestSourceVersion();
-        EXTRA_OPTIONS.add("--enable-preview");
-        JavacParser.DISABLE_SOURCE_LEVEL_DOWNGRADE = true;
-        performTest("LinkTag", 2752, null, "javadocsnippet_LinkTag_Ref_ToThisClass_UsingHash.pass", this.sourceLevel);
-    }
-
-    public void testLinkTag_FieldRef_ToThisClass_UsingHash() throws Exception {
-        if (!TreeShims.isJDKVersionRelease18_Or_Above()) {
-            return;
-        }
-        this.sourceLevel = getLatestSourceVersion();
-        EXTRA_OPTIONS.add("--enable-preview");
-        JavacParser.DISABLE_SOURCE_LEVEL_DOWNGRADE = true;
-        performTest("LinkTag", 3074, null, "javadocsnippet_LinkTag_FieldRef_ToThisClass_UsingHash.pass", this.sourceLevel);
-    }
-
-    public void testLinkTag_AlongWith_HighlightTag() throws Exception {
-        if (!TreeShims.isJDKVersionRelease18_Or_Above()) {
-            return;
-        }
-        this.sourceLevel = getLatestSourceVersion();
-        EXTRA_OPTIONS.add("--enable-preview");
-        JavacParser.DISABLE_SOURCE_LEVEL_DOWNGRADE = true;
-        performTest("LinkTag", 3492, null, "javadocsnippet_LinkTag_AlongWith_HighlightTag.pass", this.sourceLevel);
-    }
-
-    public void testLinkTag_AlongWith_ReplaceTag() throws Exception {
-        if (!TreeShims.isJDKVersionRelease18_Or_Above()) {
-            return;
-        }
-        this.sourceLevel = getLatestSourceVersion();
-        EXTRA_OPTIONS.add("--enable-preview");
-        JavacParser.DISABLE_SOURCE_LEVEL_DOWNGRADE = true;
-        performTest("LinkTag", 3895, null, "javadocsnippet_LinkTag_AlongWith_ReplaceTag.pass", this.sourceLevel);
-    }
-
-    public void testLinkTag_AlongWith_SubStringAndReplaceTag() throws Exception {
-        if (!TreeShims.isJDKVersionRelease18_Or_Above()) {
-            return;
-        }
-        this.sourceLevel = getLatestSourceVersion();
-        EXTRA_OPTIONS.add("--enable-preview");
-        JavacParser.DISABLE_SOURCE_LEVEL_DOWNGRADE = true;
-        performTest("LinkTag", 4353, null, "javadocsnippet_LinkTag_AlongWith_SubStringAndReplaceTag.pass", this.sourceLevel);
-    }
-
-    public void testLinkTag_EmptyReplacementValue() throws Exception {
-        if (!TreeShims.isJDKVersionRelease18_Or_Above()) {
-            return;
-        }
-        this.sourceLevel = getLatestSourceVersion();
-        EXTRA_OPTIONS.add("--enable-preview");
-        JavacParser.DISABLE_SOURCE_LEVEL_DOWNGRADE = true;
-        performTest("LinkTag", 4758, null, "javadocsnippet_LinkTag_EmptyReplacementValue.pass", this.sourceLevel);
-    }
     public void testError_HighlightTag() throws Exception {
         if (!TreeShims.isJDKVersionRelease18_Or_Above()) {
             return;
@@ -1989,16 +1853,6 @@ public class GoToSupportTest extends NbTestCase {
         performTest("Errors", 2613, null, "javadocsnippet_TestError_ReplaceTag.pass", this.sourceLevel);
     }
     
-    public void testError_LinkTag() throws Exception {
-        if (!TreeShims.isJDKVersionRelease18_Or_Above()) {
-            return;
-        }
-        this.sourceLevel = getLatestSourceVersion();
-        EXTRA_OPTIONS.add("--enable-preview");
-        JavacParser.DISABLE_SOURCE_LEVEL_DOWNGRADE = true;
-        performTest("Errors", 4069, null, "javadocsnippet_TestError_LinkTag.pass", this.sourceLevel);
-    }
-    
     public void testError_UnpairedRegion() throws Exception {
         if (!TreeShims.isJDKVersionRelease18_Or_Above()) {
             return;
diff --git a/java/java.source.base/src/org/netbeans/modules/java/source/builder/TreeFactory.java b/java/java.source.base/src/org/netbeans/modules/java/source/builder/TreeFactory.java
index de5f566b73..568e8952f5 100644
--- a/java/java.source.base/src/org/netbeans/modules/java/source/builder/TreeFactory.java
+++ b/java/java.source.base/src/org/netbeans/modules/java/source/builder/TreeFactory.java
@@ -61,6 +61,7 @@ import com.sun.tools.javac.code.TypeTag;
 import com.sun.tools.javac.jvm.ClassReader;
 import com.sun.tools.javac.model.JavacElements;
 import com.sun.tools.javac.model.JavacTypes;
+import com.sun.tools.javac.tree.DCTree;
 import com.sun.tools.javac.tree.DocTreeMaker;
 import com.sun.tools.javac.tree.JCTree;
 import com.sun.tools.javac.tree.JCTree.*;
@@ -1774,6 +1775,14 @@ public class TreeFactory {
         return docMake.at(NOPOS).newDocCommentTree(fullBody, tags);
     }
     
+    public DocTree Snippet(List<? extends DocTree> attributes, TextTree text){
+        try {
+            return (DocTree) docMake.getClass().getMethod("newSnippetTree", List.class, TextTree.class).invoke(docMake.at(NOPOS), attributes, text);
+        } catch (Throwable t) {
+            throw throwAny(t);
+        }
+    }
+    
     public DocCommentTree DocComment(List<? extends DocTree> firstSentence, List<? extends DocTree> body, List<? extends DocTree> tags) {
         final ArrayList<DocTree> fullBody = new ArrayList<>(firstSentence.size() + body.size());
         fullBody.addAll(firstSentence);
diff --git a/java/java.source.base/src/org/netbeans/modules/java/source/transform/ImmutableDocTreeTranslator.java b/java/java.source.base/src/org/netbeans/modules/java/source/transform/ImmutableDocTreeTranslator.java
index 991142f359..9e3fd125ad 100644
--- a/java/java.source.base/src/org/netbeans/modules/java/source/transform/ImmutableDocTreeTranslator.java
+++ b/java/java.source.base/src/org/netbeans/modules/java/source/transform/ImmutableDocTreeTranslator.java
@@ -61,6 +61,7 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import org.netbeans.api.java.source.WorkingCopy;
+import org.netbeans.modules.java.source.TreeShims;
 
 /**
  *
@@ -77,7 +78,9 @@ public class ImmutableDocTreeTranslator extends ImmutableTreeTranslator implemen
     public DocTree translate(DocTree tree) {
         if (tree == null) {
             return null;
-        } else {
+        } else if (tree.getKind().name().equals("SNIPPET")){
+            return rewriteSnippetChildren(tree);
+        }else {
             DocTree t = tree.accept(this, null);
             if (tree2Tag != null && tree != t) {
                 tree2Tag.put(t, tree2Tag.get(tree));
@@ -370,7 +373,18 @@ public class ImmutableDocTreeTranslator extends ImmutableTreeTranslator implemen
             value = make.Version(body);
         }
         return value;
+    }  
+
+    protected final DocTree rewriteSnippetChildren(DocTree tree) {
+        DocTree value = tree;
+        List<? extends DocTree> snippetTreeAttributes = translateDoc(TreeShims.getSnippetDocTreeAttributes(tree));
+        TextTree snippetTreeText = (TextTree) translate(TreeShims.getSnippetDocTreeText(tree));
+        if((snippetTreeAttributes != TreeShims.getSnippetDocTreeAttributes(tree)) || (snippetTreeText != TreeShims.getSnippetDocTreeText(tree))){
+            value=make.Snippet(snippetTreeAttributes, snippetTreeText);
+        }    
+        return value;
     }
+    
     //</editor-fold>
 
     //<editor-fold defaultstate="collapsed" desc="VisitMethods">
diff --git a/java/java.sourceui/src/org/netbeans/api/java/source/ui/ElementJavadoc.java b/java/java.sourceui/src/org/netbeans/api/java/source/ui/ElementJavadoc.java
index 1a1b2521a7..d79aba7e38 100644
--- a/java/java.sourceui/src/org/netbeans/api/java/source/ui/ElementJavadoc.java
+++ b/java/java.sourceui/src/org/netbeans/api/java/source/ui/ElementJavadoc.java
@@ -118,6 +118,7 @@ import javax.tools.ToolProvider;
 import com.sun.source.tree.ImportTree;
 import com.sun.source.tree.Tree;
 import com.sun.source.util.JavacTask;
+import com.sun.tools.javac.code.ClassFinder;
 import org.netbeans.api.java.source.ui.snippet.MarkupTagProcessor;
 
 /** Utility class for viewing Javadoc comments as HTML.
@@ -175,6 +176,7 @@ public class ElementJavadoc {
     static{
         MARKUPTAG_MANDATORY_ATTRIBUTE.put("link", "target");
         MARKUPTAG_MANDATORY_ATTRIBUTE.put("replace", "replacement");
+        MARKUPTAG_MANDATORY_ATTRIBUTE.put("start", "region");
     }
     
     /** Creates an object describing the Javadoc of given element. The object
@@ -1224,6 +1226,7 @@ public class ElementJavadoc {
 
     private StringBuilder inlineTags(List<? extends DocTree> tags, TreePath docPath, DocCommentTree doc, DocTrees trees, CharSequence inherited) {
         StringBuilder sb = new StringBuilder();
+        Integer snippetCount=0;
         for (DocTree tag : tags) {
             switch (tag.getKind()) {
                 case REFERENCE:
@@ -1318,41 +1321,106 @@ public class ElementJavadoc {
                     sb.append(ttag.getBody());
 					break;
 		default:
-                    if (tag.getKind().toString().equals("SNIPPET")) {
-                        processDocSnippet(sb, tag);
+                    if (tag.getKind().toString().equals("SNIPPET")) { 
+                        snippetCount++;
+                        processDocSnippet(sb, tag, snippetCount,docPath, doc, trees);
                     }	
             }
         }
         return sb;
     }
 
-    private void processDocSnippet(StringBuilder sb, DocTree tag) {
+    private void processDocSnippet(StringBuilder sb, DocTree tag, Integer snippetCount, TreePath docPath,DocCommentTree doc, DocTrees trees) {
+        sb.append("<div id=\"snippet").append(snippetCount).append("\" style=\"font-size: 10px; border: 1px solid black; margin-top: 2px; margin-bottom: 2px\">"); //NOI18N
+        sb.append("<div align=right>" //NOI18N
+                + "<a href=\"copy.snippet").append(snippetCount).append("\">Copy</a>" //NOI18N
+                + "</div>\n"); //NOI18N
         sb.append("<pre>"); //NOI18N
         sb.append("<code>"); //NOI18N
+
+        ClassPath classPath = this.cpInfo.getClassPath(ClasspathInfo.PathKind.SOURCE);
+        String pckgName = docPath.getCompilationUnit().getPackageName().toString();
+        
+        List<DocTree> attributes = (List<DocTree>) TreeShims.getSnippetDocTreeAttributes(tag);
+        
+        String fileName = null;
+        String regionName = null;
+        String lang = null;
+  
+        boolean isExternalSnippet = false;
+        
+        for(DocTree att : attributes){
+            switch (((AttributeTree)att).getName().toString()) {
+                case "file":
+                    fileName = ((AttributeTree)att).getValue().get(0).toString();
+                    isExternalSnippet = true;
+                    break;
+                case "class":
+                    fileName = ((AttributeTree)att).getValue().get(0).toString() + ".java";
+                    isExternalSnippet = true;
+                    lang="java";
+                    break;
+                case "region":
+                    regionName = ((AttributeTree)att).getValue().get(0).toString();
+                    break;
+                case "lang":
+                    lang = ((AttributeTree)att).getValue().get(0).toString();
+                    break;
+            }
+        }
+        
+        
+        if(lang == null && fileName!=null){
+            if(fileName.endsWith(".java")){
+                lang="java";
+            }else if(fileName.endsWith(".properties")){
+                lang="properties";
+            }
+        }
         
-        List<DocTree> attributes = TreeShims.getSnippetDocTreeAttributes(tag);
-        TextTree text = TreeShims.getSnippetDocTreeText(tag);
-        SnippetTagCommentParser parser = new SnippetTagCommentParser();
-        List<SourceLineMeta> parseResult = parser.parse(text.getBody());
+        String text = null;
+        if (isExternalSnippet) {
+            pckgName = pckgName.replaceAll("\\.", "\\\\");
+            FileObject snippetFile = classPath.findResource(pckgName + "\\snippet-files\\" + fileName);
+            try {
+                text = snippetFile.asText();
+            } catch (IOException ex) {
+                Exceptions.printStackTrace(ex);
+            }
+        } else {
+            text = TreeShims.getSnippetDocTreeText(tag).toString();
+        }
+        
+        String langCommentPattern;
+        if(lang != null && lang.equals("properties")){
+            langCommentPattern = "#";
+        }else{
+            langCommentPattern = "\\Q//\\E";
+        }
+        
+        SnippetTagCommentParser parser = new SnippetTagCommentParser(langCommentPattern);
+        List<SourceLineMeta> parseResult = parser.parse(text);
+		
         MarkupTagProcessor tagProcessor = new MarkupTagProcessor();
         MarkupTagProcessor.ProcessedTags tags = tagProcessor.process(parseResult);
-        applyTags(parseResult, tags, sb);
+        applyTags(parseResult, tags, sb, regionName);
 
         sb.append("</code>"); //NOI18N
         sb.append("</pre>"); //NOI18N
+        sb.append("</div>"); //NOI18N
     }
     
-    private void applyTags(List<SourceLineMeta> parseResult, MarkupTagProcessor.ProcessedTags tags, StringBuilder sb) {
-        
+    private void applyTags(List<SourceLineMeta> parseResult, MarkupTagProcessor.ProcessedTags tags, StringBuilder sb, String regionName) {
+
         if(!tags.getErrorList().isEmpty()){
             reportError(tags.getErrorList(), sb);
             return;
         }
-        
+
         int lineCounter = 0;
         for (SourceLineMeta fullLineInfo : parseResult) {
             lineCounter++;
-            
+
             String codeLine = fullLineInfo.getSourceLineWithoutComment() != null ? fullLineInfo.getSourceLineWithoutComment() : fullLineInfo.getActualSourceLine();
 
             List<SourceLineCharterMapperToHtmlTag> eachCharList = new LinkedList<>();
@@ -1360,29 +1428,38 @@ public class ElementJavadoc {
                 SourceLineCharterMapperToHtmlTag htmlCharMapper = new SourceLineCharterMapperToHtmlTag(new LinkedList<>(), codeLine.charAt(pos), new ArrayList<>());
                 eachCharList.add(htmlCharMapper);
             }
-            
+
             List<MarkupTagProcessor.ApplicableMarkupTag> attributes = tags.getMarkUpTagLineMapper().get(lineCounter);
+            List<MarkupTagProcessor.Region> regions = tags.getRegionTagLineMapper().get(lineCounter);
 
-            if (attributes != null) {
-                for (MarkupTagProcessor.ApplicableMarkupTag attrib : attributes) {
-                    codeLine = applyTagsToHTML(codeLine, attrib.getAttributes(), attrib.getMarkupTagName(), sb, eachCharList);
-                    if(codeLine == null){//its error
-                        return;
-                    }
-                }
+            boolean toAddCurrent = true;
+            if (regionName != null && regions != null) {
+                toAddCurrent = regions.stream().anyMatch(p -> p.getValue().equals(regionName));
+            } else if (regionName != null) {
+                toAddCurrent = false;
             }
-            
-            for (SourceLineCharterMapperToHtmlTag charMapper : eachCharList) {
-                for (String startTag : charMapper.getStartTag()) {
-                    sb.append(startTag);
+            if (toAddCurrent) {
+                if (attributes != null) {
+                    for (MarkupTagProcessor.ApplicableMarkupTag attrib : attributes) {
+                        codeLine = applyTagsToHTML(codeLine, attrib.getAttributes(), attrib.getMarkupTagName(), sb, eachCharList);
+                        if (codeLine == null) {//its error
+                            return;
+                        }
+                    }
                 }
-                //replace html tag to equivalent plain text
-                sb.append(charMapper.getSourceChar()=='<' ? "&lt;" : charMapper.getSourceChar());
-                for (String endTag : charMapper.getEndTag()) {
-                    sb.append(endTag);
+
+                for (SourceLineCharterMapperToHtmlTag charMapper : eachCharList) {
+                    for (String startTag : charMapper.getStartTag()) {
+                        sb.append(startTag);
+                    }
+                    //replace html tag to equivalent plain text
+                    sb.append(charMapper.getSourceChar() == '<' ? "&lt;" : charMapper.getSourceChar());
+                    for (String endTag : charMapper.getEndTag()) {
+                        sb.append(endTag);
+                    }
                 }
+                sb.append("\n");
             }
-            sb.append("\n");
         }
     }
 
@@ -1400,11 +1477,9 @@ public class ElementJavadoc {
                 applyHighlightTag(codeLine, tagAction, htmlHighlightType, tagAttributes.get(tagAction), eachCharList);
                 break;
             case "replace":
-                //String replacement = tagAttributes.get("replacement") != null && !tagAttributes.get("replacement").trim().isEmpty() ? tagAttributes.get("replacement") : null;
                 codeLine = applyReplaceTag(codeLine, tagAction, tagAttributes.get("replacement"), tagAttributes.get(tagAction), eachCharList);
                 break;
             case "link":
-                //String linkTarget = tagAttributes.get("target") != null && !tagAttributes.get("target").trim().isEmpty() ? tagAttributes.get("target") : null;
                 applyLinkTag(codeLine, tagAction, tagAttributes.get("target"), tagAttributes.get(tagAction), eachCharList);
                 break;
             default:
@@ -1426,6 +1501,8 @@ public class ElementJavadoc {
             } else {
                 return true;
             }
+        } else if(markupTagName.equals("start")){
+            return true;
         } else if (!tagAttributes.containsKey(MARKUPTAG_MANDATORY_ATTRIBUTE.get(markupTagName))) {
             // mandatory mark up tag not present
             String error = String.format("error: snippet markup: Missing <sub>^</sub><b><i>%s</b></i> tag attribute : <sub>^</sub><b><i>%s</b></i>", markupTagName, MARKUPTAG_MANDATORY_ATTRIBUTE.get(markupTagName));
@@ -1511,7 +1588,7 @@ public class ElementJavadoc {
                     }
                     formattedLine.replace(fromIndex, fromIndex + tagActionValue.length(), replacement);
                     
-                    fromIndex += replacement.length();
+                        fromIndex += replacement.length();
                     codeLine = formattedLine.toString();
                 }
             }
@@ -1545,7 +1622,7 @@ public class ElementJavadoc {
     }
     
     private void applyLinkTag(String codeLine, String tagAction, String linkTarget, String tagActionValue, List<SourceLineCharterMapperToHtmlTag> eachCharList) {
-        
+
         String linkHtmlStartTag = "";
         String linkHtmlEndTag = "";
         try {
@@ -1555,12 +1632,12 @@ public class ElementJavadoc {
             JavaDocSnippetLinkTagFileObject docSnippetLinkTagFileObject = new JavaDocSnippetLinkTagFileObject(fullClassCode);
             StringBuilder linkRef = new StringBuilder();
             createSnippetMarkupLinkTag(linkRef, docSnippetLinkTagFileObject);
-            
+
             String link = linkRef.toString();
             //replace <code>, becasue of some issue while resolving hyperlink and code in netbeans ide
             link = link.replace("<code>", "");
             link = link.replace("</code>", "");
-                        
+
             String linkValue = link.replaceAll("\\<.*?>", "");
             linkHtmlStartTag = link.substring(0, link.indexOf(linkValue));
             linkHtmlEndTag = link.substring(link.indexOf(linkValue) + linkValue.length());
@@ -1571,7 +1648,7 @@ public class ElementJavadoc {
         if(linkHtmlStartTag.equals("") || linkHtmlEndTag.equals("")){
             return;
         }
-        
+
          if(tagAction.equals("substring")){
             int fromIndex = 0;
             while (fromIndex != -1) {
@@ -1587,7 +1664,7 @@ public class ElementJavadoc {
                     fromIndex += tagActionValue.length();
                 }
             }
-            
+
         } else if(tagAction.equals("regex")){
             Pattern p = Pattern.compile(tagActionValue);
             Matcher m = p.matcher(codeLine);
@@ -1597,10 +1674,10 @@ public class ElementJavadoc {
                     startTag.add(0, linkHtmlStartTag);
                     List<String> endTag = eachCharList.get(t).getEndTag();
                     endTag.add(linkHtmlEndTag);
-                }
             }
         }
-
+    }
+    
         
     }
     
@@ -1648,7 +1725,7 @@ public class ElementJavadoc {
         StringBuilder prjClsPath = new StringBuilder();
         String prjSrcPath = cpInfo.getClassPath(ClasspathInfo.PathKind.SOURCE).toString();
         prjClsPath.append(prjSrcPath);
-
+        
         for(ClassPath.Entry cpe : cpInfo.getClassPath(ClasspathInfo.PathKind.COMPILE).entries()){
             prjClsPath.append(";");
             prjClsPath.append(cpe.getRoot().getFileSystem().getDisplayName());
@@ -1657,7 +1734,7 @@ public class ElementJavadoc {
         JavacTask task = (JavacTask) compiler.getTask(null, null, null, opt, null, Arrays.asList(fileObject));
 
         DocTrees docTrees = DocTrees.instance(task);//trees
-
+        
         Iterable<? extends Element> docClass = task.analyze();
 
         main:
@@ -1988,4 +2065,4 @@ public class ElementJavadoc {
             docURL = url;
         }
     }
-}
\ No newline at end of file
+}
diff --git a/java/java.sourceui/src/org/netbeans/api/java/source/ui/snippet/MarkupTagProcessor.java b/java/java.sourceui/src/org/netbeans/api/java/source/ui/snippet/MarkupTagProcessor.java
index 1cdbdc8d3b..2efe5a10c7 100644
--- a/java/java.sourceui/src/org/netbeans/api/java/source/ui/snippet/MarkupTagProcessor.java
+++ b/java/java.sourceui/src/org/netbeans/api/java/source/ui/snippet/MarkupTagProcessor.java
@@ -32,7 +32,7 @@ import java.util.TreeMap;
  */
 public class MarkupTagProcessor {
     
-    private static final List<String> SUPPORTED_SNIPPET_MARKUP_TAGS = Arrays.asList("highlight", "replace", "link");
+    private static final List<String> SUPPORTED_SNIPPET_MARKUP_TAGS = Arrays.asList("highlight", "replace", "link", "start");
 
     public ProcessedTags process(List<SourceLineMeta> parseResult ){
         Map<Integer, List<ApplicableMarkupTag>> markUpTagOnLine = new TreeMap<>();
@@ -78,8 +78,7 @@ public class MarkupTagProcessor {
                             markupAttribute.remove("region");
                             Region region = new Region(regionVal, markupAttribute, markUpTag.getTagName());
                             regionList.add(region);
-                            List<Region> newRegionList = new ArrayList<>();
-                            newRegionList.add(region);
+                            List<Region> newRegionList = new ArrayList<>(regionList);
                             regionTagOnLine.put(markUpTag.isTagApplicableToNextLine() ? nextLine : thisLine, newRegionList);
                             if(!markUpTag.isTagApplicableToNextLine()){
                                 addMarkupTags(thisLine, transformRegionAttributeToMarkupTag(newRegionList), markUpTagOnLine);
@@ -151,7 +150,7 @@ public class MarkupTagProcessor {
         }
     }
     
-    private class Region{
+    public class Region{
         private final String markupTagName;
         private final String value;
         private final Map<String, String> attributes;
diff --git a/java/java.sourceui/src/org/netbeans/api/java/source/ui/snippet/SnippetTagCommentParser.java b/java/java.sourceui/src/org/netbeans/api/java/source/ui/snippet/SnippetTagCommentParser.java
index 0e8ab81aea..905fb0e4f8 100644
--- a/java/java.sourceui/src/org/netbeans/api/java/source/ui/snippet/SnippetTagCommentParser.java
+++ b/java/java.sourceui/src/org/netbeans/api/java/source/ui/snippet/SnippetTagCommentParser.java
@@ -37,8 +37,16 @@ public class SnippetTagCommentParser {
     private static final String JAVA_LANG_SOURCE_LINE_START_PATTERN = "^(.*)(";
     private static final String MARKUPTAG_START_PATTERN = "(\\s*@\\s*\\w+.+?))$";
     private final SnippetMarkupTagExtractor extractor = new SnippetMarkupTagExtractor();
-    private final Pattern markUpPattern = Pattern.compile(JAVA_LANG_SOURCE_LINE_START_PATTERN + "\\Q//\\E"+ MARKUPTAG_START_PATTERN);
+    private final Pattern markUpPattern;
+
+    public SnippetTagCommentParser() {
+        this.markUpPattern = Pattern.compile(JAVA_LANG_SOURCE_LINE_START_PATTERN + "\\Q//\\E" + MARKUPTAG_START_PATTERN);     
+    }
     
+    public SnippetTagCommentParser(String langCommentPattern) {
+        this.markUpPattern = Pattern.compile(JAVA_LANG_SOURCE_LINE_START_PATTERN + langCommentPattern + MARKUPTAG_START_PATTERN);     
+    }
+  
     public List<SourceLineMeta> parse(String snippetDocComment) {
         List<SourceLineMeta> fullSourceLineInfo = new ArrayList<>();
         Matcher matcher = markUpPattern.matcher("");


---------------------------------------------------------------------
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