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

ahuber pushed a commit to branch v3
in repository https://gitbox.apache.org/repos/asf/causeway.git


The following commit(s) were added to refs/heads/v3 by this push:
     new 5f96fa61fc8 cherry picks commit 
120e92be3eb213541ca8c8330d188d97376bd933 from main
5f96fa61fc8 is described below

commit 5f96fa61fc85ecfd1516dcba4359be0de14dab51
Author: Andi Huber <[email protected]>
AuthorDate: Thu Aug 28 19:46:40 2025 +0200

    cherry picks commit 120e92be3eb213541ca8c8330d188d97376bd933 from main
    
    fixes prism syntax highlighter infinite loop
---
 .../viewer/commons/prism/PrismHighlighter.java         | 18 +++++++++++++++---
 .../causeway/viewer/commons/prism/PrismUtils.java      |  2 +-
 2 files changed, 16 insertions(+), 4 deletions(-)

diff --git 
a/viewers/commons/prism/src/main/java/org/apache/causeway/viewer/commons/prism/PrismHighlighter.java
 
b/viewers/commons/prism/src/main/java/org/apache/causeway/viewer/commons/prism/PrismHighlighter.java
index 8c20a684a3a..5c8b7f8849e 100644
--- 
a/viewers/commons/prism/src/main/java/org/apache/causeway/viewer/commons/prism/PrismHighlighter.java
+++ 
b/viewers/commons/prism/src/main/java/org/apache/causeway/viewer/commons/prism/PrismHighlighter.java
@@ -18,6 +18,7 @@
  */
 package org.apache.causeway.viewer.commons.prism;
 
+import java.util.ArrayList;
 import java.util.function.UnaryOperator;
 
 import org.jsoup.Jsoup;
@@ -26,8 +27,7 @@
 
 import lombok.extern.log4j.Log4j2;
 @Log4j2
-public record PrismHighlighter(
-        ) implements UnaryOperator<String> {
+public record PrismHighlighter() implements UnaryOperator<String> {
 
     /**
      * Returns the highlighted HTML.
@@ -40,6 +40,8 @@ public String apply(final String htmlContent) {
 
         //var tt = org.apache.causeway.commons.internal.base._Timing.now();
 
+        var replacements = new ArrayList<NodeReplacement>();
+
         doc.traverse((final Node node, final int depth)->{
             if(node instanceof Element element
                 && "code".equals(node.nodeName())) {
@@ -62,13 +64,23 @@ public String apply(final String htmlContent) {
                 //<pre class="highlight language-%s">
                 node.parent().attr("class", "highlight 
language-%s".formatted(prismLanguage.languageId()));
 
-                node.replaceWith(newNode);
+                replacements.add(new NodeReplacement(element, newNode));
             }
         });
 
+        replacements.forEach(NodeReplacement::apply);
+
         //tt.stop();System.err.printf("context took %s%n", tt);
 
         return doc.body().html();
     }
 
+    private record NodeReplacement(
+            Element oldNode,
+            Element newNode) {
+        void apply() {
+            oldNode.replaceWith(newNode);
+        }
+    }
+
 }
diff --git 
a/viewers/commons/prism/src/main/java/org/apache/causeway/viewer/commons/prism/PrismUtils.java
 
b/viewers/commons/prism/src/main/java/org/apache/causeway/viewer/commons/prism/PrismUtils.java
index 9b9256cef26..567920985ec 100644
--- 
a/viewers/commons/prism/src/main/java/org/apache/causeway/viewer/commons/prism/PrismUtils.java
+++ 
b/viewers/commons/prism/src/main/java/org/apache/causeway/viewer/commons/prism/PrismUtils.java
@@ -67,7 +67,7 @@ String mostCommonGrammerAsJs() {
 
     @SneakyThrows
     Context createPrismContext() {
-        var context = Context.newBuilder().engine(ENGINE.get()). build();
+        var context = Context.newBuilder().engine(ENGINE.get()).build();
         context.eval(PRISM_SOURCE.get());
         return context;
     }

Reply via email to