You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@causeway.apache.org by ah...@apache.org on 2023/01/28 09:49:11 UTC

[causeway] branch master updated: CAUSEWAY-3344: adds plantuml source block to bottom of diagrams

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 7fd436e08a CAUSEWAY-3344: adds plantuml source block to bottom of diagrams
7fd436e08a is described below

commit 7fd436e08aabc3fa5e035e6f9f897ef43f165ff6
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sat Jan 28 10:49:06 2023 +0100

    CAUSEWAY-3344: adds plantuml source block to bottom of diagrams
---
 .../domainobjects/EntityDiagramPageAbstract.java   |  9 +++-
 .../docgen/topics/domainobjects/_DiagramUtils.java | 30 ++++++++++--
 .../applib/CausewayModuleValAsciidocApplib.java    | 54 ++++++++++++++++++----
 3 files changed, 79 insertions(+), 14 deletions(-)

diff --git a/extensions/core/docgen/src/main/java/org/apache/causeway/extensions/docgen/topics/domainobjects/EntityDiagramPageAbstract.java b/extensions/core/docgen/src/main/java/org/apache/causeway/extensions/docgen/topics/domainobjects/EntityDiagramPageAbstract.java
index 38faf7748d..16db814e94 100644
--- a/extensions/core/docgen/src/main/java/org/apache/causeway/extensions/docgen/topics/domainobjects/EntityDiagramPageAbstract.java
+++ b/extensions/core/docgen/src/main/java/org/apache/causeway/extensions/docgen/topics/domainobjects/EntityDiagramPageAbstract.java
@@ -45,9 +45,14 @@ public abstract class EntityDiagramPageAbstract implements HelpPage {
 
     @Override
     public AsciiDoc getContent() {
+        val title = getTitle();
+        val plantumlSource = entityTypesAsDiagram();
+
         return AsciiDoc.valueOf(
-                "== Entities\n\n"
-                + _DiagramUtils.plantumlBlock(entityTypesAsDiagram()));
+                "== " + title + "\n\n"
+                + _DiagramUtils.plantumlBlock(plantumlSource)
+                + "\n"
+                + _DiagramUtils.plantumlSourceBlock(plantumlSource));
     }
 
     /** governs which entities to include */
diff --git a/extensions/core/docgen/src/main/java/org/apache/causeway/extensions/docgen/topics/domainobjects/_DiagramUtils.java b/extensions/core/docgen/src/main/java/org/apache/causeway/extensions/docgen/topics/domainobjects/_DiagramUtils.java
index 43a5b00adc..90a3552b5f 100644
--- a/extensions/core/docgen/src/main/java/org/apache/causeway/extensions/docgen/topics/domainobjects/_DiagramUtils.java
+++ b/extensions/core/docgen/src/main/java/org/apache/causeway/extensions/docgen/topics/domainobjects/_DiagramUtils.java
@@ -30,10 +30,32 @@ import lombok.experimental.UtilityClass;
 class _DiagramUtils {
 
     String plantumlBlock(final String diagramSource) {
-        return "[plantuml]\n"
-                + "--\n"
-                + diagramSource
-                + "--\n";
+        return adocBlockHeader("plantuml")
+                + adocDelimited("----", diagramSource);
+    }
+
+    String plantumlSourceBlock(final String diagramSource) {
+        return adocLabel("Diagram Source")
+            + adocCollapsibeBlock(
+                    adocBlockHeader("source")
+                    + adocLabel("Plantuml Syntax")
+                    + adocDelimited("----", diagramSource));
+    }
+
+    String adocCollapsibeBlock(final String content) {
+        return "[%collapsible]\n"
+                + adocDelimited("====", content);
+    }
+    String adocBlockHeader(final String entry) {
+        return "[" + entry + "]\n";
+    }
+    String adocDelimited(final String delimiter, final String content) {
+        return delimiter + "\n"
+            + content
+            + "\n" + delimiter + "\n";
+    }
+    String adocLabel(final String label) {
+        return "." + label + "\n";
     }
 
     String multilineLabel(final String...lines) {
diff --git a/valuetypes/asciidoc/applib/src/main/java/org/apache/causeway/valuetypes/asciidoc/applib/CausewayModuleValAsciidocApplib.java b/valuetypes/asciidoc/applib/src/main/java/org/apache/causeway/valuetypes/asciidoc/applib/CausewayModuleValAsciidocApplib.java
index 86dbace53c..3d8bd3ac2b 100644
--- a/valuetypes/asciidoc/applib/src/main/java/org/apache/causeway/valuetypes/asciidoc/applib/CausewayModuleValAsciidocApplib.java
+++ b/valuetypes/asciidoc/applib/src/main/java/org/apache/causeway/valuetypes/asciidoc/applib/CausewayModuleValAsciidocApplib.java
@@ -26,10 +26,10 @@ import java.net.http.HttpRequest;
 import java.net.http.HttpResponse.BodyHandlers;
 import java.nio.charset.StandardCharsets;
 import java.time.Duration;
+import java.util.ArrayList;
 import java.util.Base64;
 import java.util.List;
 import java.util.Map;
-import java.util.stream.Collectors;
 import java.util.zip.Deflater;
 
 import org.asciidoctor.Asciidoctor;
@@ -122,19 +122,57 @@ public class CausewayModuleValAsciidocApplib {
     }
 
     /**
-     * Normalizes 'open' blocks, such that these are recognized by the
+     * Converts 'plantuml' blocks to 'open' blocks, such that these are recognized by the
      * {@link PlantumlBlockProcessor}. Not needed otherwise.
      */
     public static class OpenBlockPreProcessor extends Preprocessor {
+
+        private static enum State {
+            DISABLED,
+            BEFORE_BLOCK_START,
+            AFTER_BLOCK_STARTED;
+            State next() {
+                val values = State.values();
+                return values[(this.ordinal() + 1) % values.length];
+            }
+        }
+
         @Override
         public void process(final Document document, final PreprocessorReader reader) {
+
+            var state = State.DISABLED;
+
+            final List<String> processedLines = new ArrayList<>();
             final List<String> lines = reader.readLines();
-            val processedLines = lines.stream()
-                    .map(line->
-                    line.trim().equals("----")
-                    ? "--"
-                            : line)
-                    .collect(Collectors.toList());
+            for(val line : lines) {
+                val trimmedLine = line.trim();
+
+                switch(state) {
+                case DISABLED: {
+                    if(trimmedLine.startsWith("[plantuml")) {
+                        // condition causes a state transition
+                        state = state.next();
+                    }
+                }
+                case BEFORE_BLOCK_START: {
+                    if(trimmedLine.equals("----")) {
+                        // condition causes a state transition
+                        state = state.next();
+                        processedLines.add("--");
+                        continue;
+                    }
+                }
+                case AFTER_BLOCK_STARTED: {
+                    if(trimmedLine.equals("----")) {
+                        // condition causes a state transition
+                        state = state.next();
+                        processedLines.add("--");
+                        continue;
+                    }
+                }}
+                processedLines.add(line);
+            }
+
             reader.restoreLines(processedLines);
         }
     }