You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2020/12/12 18:21:07 UTC

[isis] branch master updated: ISIS-2473: adoc writer: support for admonitions

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/isis.git


The following commit(s) were added to refs/heads/master by this push:
     new 221aaee  ISIS-2473: adoc writer: support for admonitions
221aaee is described below

commit 221aaee86eefdd46a61098e9688a220b77d48692
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sat Dec 12 19:20:52 2020 +0100

    ISIS-2473: adoc writer: support for admonitions
---
 .../j2adoc/convert/J2AdocConverterDefault.java     |  3 +-
 .../isis/tooling/model4adoc/AsciiDocFactory.java   | 65 +++++++++++++++-
 .../apache/isis/tooling/model4adoc/NodeWriter.java | 52 ++++++++++++-
 .../isis/tooling/model4adoc/ast/SimpleBlock.java   |  4 +
 .../tooling/adocmodel/test/AdmonitionTest.java     | 91 ++++++++++++++++++++++
 .../apache/isis/tooling/adocmodel/test/Debug.java  | 40 +++++++++-
 .../isis/tooling/adocmodel/test/admonition.adoc    |  9 +++
 7 files changed, 253 insertions(+), 11 deletions(-)

diff --git a/tooling/java2adoc/src/main/java/org/apache/isis/tooling/j2adoc/convert/J2AdocConverterDefault.java b/tooling/java2adoc/src/main/java/org/apache/isis/tooling/j2adoc/convert/J2AdocConverterDefault.java
index 439667a..2ca09f9 100644
--- a/tooling/java2adoc/src/main/java/org/apache/isis/tooling/j2adoc/convert/J2AdocConverterDefault.java
+++ b/tooling/java2adoc/src/main/java/org/apache/isis/tooling/j2adoc/convert/J2AdocConverterDefault.java
@@ -230,7 +230,7 @@ final class J2AdocConverterDefault implements J2AdocConverter {
         .map(javadocDescription->javadocDescription(javadocDescription))
         .ifPresent(deprecatedAdoc->{
             
-            val deprecatedBlock = AsciiDocFactory.block(doc);
+            val deprecatedBlock = AsciiDocFactory.warning(doc);
             deprecatedBlock.setSource("[red]#_deprecated:_#");
             deprecatedBlock.getBlocks().addAll(deprecatedAdoc.getBlocks());
         });
@@ -298,5 +298,4 @@ final class J2AdocConverterDefault implements J2AdocConverter {
     }
 
 
-
 }
diff --git a/tooling/model4adoc/src/main/java/org/apache/isis/tooling/model4adoc/AsciiDocFactory.java b/tooling/model4adoc/src/main/java/org/apache/isis/tooling/model4adoc/AsciiDocFactory.java
index 2813146..6a2fe0c 100644
--- a/tooling/model4adoc/src/main/java/org/apache/isis/tooling/model4adoc/AsciiDocFactory.java
+++ b/tooling/model4adoc/src/main/java/org/apache/isis/tooling/model4adoc/AsciiDocFactory.java
@@ -71,8 +71,63 @@ public class AsciiDocFactory {
         node.setAttribute("Notice", value, true);
     }
     
+    // -- ADMONITIONS
+
+    //NOTE
+    //TIP
+    //IMPORTANT
+    //CAUTION
+    //WARNING
+    
+    public static Block note(StructuralNode parent) {
+        return admonition("Note", parent, null);
+    }
+    
+    public static Block note(StructuralNode parent, String source) {
+        return admonition("Note", parent, source);
+    }
+    
+    public static Block tip(StructuralNode parent) {
+        return admonition("Tip", parent, null);
+    }
+    
+    public static Block tip(StructuralNode parent, String source) {
+        return admonition("Tip", parent, source);
+    }
+    
+    public static Block important(StructuralNode parent) {
+        return admonition("Important", parent, null);
+    }
+    
+    public static Block important(StructuralNode parent, String source) {
+        return admonition("Important", parent, source);
+    }
+    
+    public static Block caution(StructuralNode parent) {
+        return admonition("Caution", parent, null);
+    }
+    
+    public static Block caution(StructuralNode parent, String source) {
+        return admonition("Caution", parent, source);
+    }
+    
+    public static Block warning(StructuralNode parent) {
+        return admonition("Warning", parent, null);
+    }
+    
+    public static Block warning(StructuralNode parent, String source) {
+        return admonition("Warning", parent, source);
+    }
+    
+    // -- BLOCK
+    
     public static Block block(StructuralNode parent) {
+        return block(parent, null);
+    }
+    
+    public static Block block(StructuralNode parent, String source) {
         val block = new SimpleBlock();
+        block.setSource(source);
         block.setLevel(parent.getLevel());
         parent.getBlocks().add(block);
         block.setParent(parent);
@@ -85,6 +140,8 @@ public class AsciiDocFactory {
         return openBlock;
     }
     
+    // -- TABLE
+    
     public static Table table(StructuralNode parent) {
         val table = new SimpleTable();
         parent.getBlocks().add(table);
@@ -264,7 +321,13 @@ public class AsciiDocFactory {
         return table.getFooter().get(rowIndex);
     }
 
-    
+    private static Block admonition(String label, StructuralNode parent, String source) {
+        val admonition = block(parent, source);
+        admonition.setAttribute("textlabel", label, true);
+        admonition.setAttribute("name", label.toLowerCase(), true);
+        admonition.setAttribute("style", label.toUpperCase(), true);
+        return admonition;
+    }
 
     
 }
diff --git a/tooling/model4adoc/src/main/java/org/apache/isis/tooling/model4adoc/NodeWriter.java b/tooling/model4adoc/src/main/java/org/apache/isis/tooling/model4adoc/NodeWriter.java
index 67a3045..9b33132 100644
--- a/tooling/model4adoc/src/main/java/org/apache/isis/tooling/model4adoc/NodeWriter.java
+++ b/tooling/model4adoc/src/main/java/org/apache/isis/tooling/model4adoc/NodeWriter.java
@@ -23,7 +23,9 @@ import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
+import java.util.function.Predicate;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 import org.asciidoctor.ast.Block;
 import org.asciidoctor.ast.Document;
@@ -83,12 +85,38 @@ final class NodeWriter implements StructuralNodeVisitor {
     
     // -- BLOCK
     
+    @RequiredArgsConstructor
+    private static enum Style {
+        OPEN_BLOCK("open"::equals),
+        ADMONITION_NOTE("NOTE"::equals),
+        ADMONITION_TIP("TIP"::equals),
+        ADMONITION_IMPORTANT("IMPORTANT"::equals),
+        ADMONITION_CAUTION("CAUTION"::equals),
+        ADMONITION_WARNING("WARNING"::equals),
+        UNKNOWN(x->false)
+        ;
+        private final Predicate<String> matcher;
+        public static Style parse(StructuralNode node) {
+            val styleAttribute = (String)node.getAttribute("style");
+            return Stream.of(Style.values())
+            .filter(style->style.matcher.test(styleAttribute))
+            .findFirst()
+            .orElse(UNKNOWN);
+        }
+        public boolean isOpenBlock() {
+            return this==Style.OPEN_BLOCK;
+        }
+        public boolean isAdmonition() {
+            return name().startsWith("ADMONITION_");
+        }
+    }
+    
     @Override
     public void blockHead(Block block, int depth) {
         
-        val isOpenBlockStyle = "open".equals(block.getAttribute("style"));
+        val style = Style.parse(block);        
         
-        if(isOpenBlockStyle){
+        if(style.isOpenBlock()){
             println("+");
             println("--");
             isContinuation = true; // set continuation flag, so other blocks don't add newlines
@@ -98,6 +126,16 @@ final class NodeWriter implements StructuralNodeVisitor {
             }    
         }
         
+        if(style.isAdmonition()){
+            if(block.getBlocks().size()>0) {
+                printfln("[%s]", (String)block.getAttribute("style"));
+                println("====");    
+                isContinuation = true; // set continuation flag, so other blocks don't add newlines
+            } else {
+                printf("%s: ", (String)block.getAttribute("style"));
+            }
+        } 
+        
         for(val line : block.getLines()) {
             println(line);
         }
@@ -106,9 +144,15 @@ final class NodeWriter implements StructuralNodeVisitor {
     
     @Override
     public void blockTail(Block block, int depth) {
-        val isOpenBlockStyle = "open".equals(block.getAttribute("style"));
-        if(isOpenBlockStyle){
+        
+        val style = Style.parse(block);
+        
+        if(style.isOpenBlock()){
             println("--");
+        } else if(style.isAdmonition()){
+            if(block.getBlocks().size()>0) {
+                println("====");    
+            }
         }
     }
     
diff --git a/tooling/model4adoc/src/main/java/org/apache/isis/tooling/model4adoc/ast/SimpleBlock.java b/tooling/model4adoc/src/main/java/org/apache/isis/tooling/model4adoc/ast/SimpleBlock.java
index baef8e0..e47a469 100644
--- a/tooling/model4adoc/src/main/java/org/apache/isis/tooling/model4adoc/ast/SimpleBlock.java
+++ b/tooling/model4adoc/src/main/java/org/apache/isis/tooling/model4adoc/ast/SimpleBlock.java
@@ -58,6 +58,10 @@ public class SimpleBlock extends SimpleStructuralNode implements Block {
 
     @Override
     public void setSource(String source) {
+        if(source==null) {
+            lines.clear();
+            return;
+        }
         setLines(Arrays.asList(source.replace("\r", "").split("\n")));
     }
 }
diff --git a/tooling/model4adoc/src/test/java/org/apache/isis/tooling/adocmodel/test/AdmonitionTest.java b/tooling/model4adoc/src/test/java/org/apache/isis/tooling/adocmodel/test/AdmonitionTest.java
new file mode 100644
index 0000000..a70761b
--- /dev/null
+++ b/tooling/model4adoc/src/test/java/org/apache/isis/tooling/adocmodel/test/AdmonitionTest.java
@@ -0,0 +1,91 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.tooling.adocmodel.test;
+
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+
+import org.asciidoctor.Asciidoctor;
+import org.asciidoctor.ast.Document;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+
+import org.apache.isis.commons.internal.base._Strings;
+import org.apache.isis.commons.internal.base._Text;
+import org.apache.isis.tooling.model4adoc.AsciiDocFactory;
+import org.apache.isis.tooling.model4adoc.AsciiDocWriter;
+
+import static org.apache.isis.tooling.model4adoc.AsciiDocFactory.doc;
+
+import lombok.val;
+
+class AdmonitionTest {
+
+    private Document doc;
+
+    @BeforeEach
+    void setUp() throws Exception {
+        doc = doc();
+    }
+
+    //[NOTE]
+    //====
+    //the note is multiple paragraphs, and can have all the usual styling
+    //
+    //also note
+    //====
+    //
+    //TIP: Here's something worth knowing...
+    @Test
+    void testAdmonition() throws IOException {
+        
+        val note = AsciiDocFactory.note(doc);
+        AsciiDocFactory.block(note, "the note is multiple paragraphs, and can have all the usual styling");
+        AsciiDocFactory.block(note, "also note");
+        
+        AsciiDocFactory.tip(doc, "Here's something worth knowing...");
+        
+        String actualAdoc = AsciiDocWriter.toString(doc);
+        System.out.println(actualAdoc); //debug
+        
+        _Text.assertTextEquals(
+                _Text.readLinesFromResource(this.getClass(), "admonition.adoc", StandardCharsets.UTF_8), 
+                actualAdoc);
+    }
+    
+    @Test @Disabled
+    void reverseTestAdmonition() throws IOException {
+    
+        val adocRef = _Strings.readFromResource(this.getClass(), "admonition.adoc", StandardCharsets.UTF_8);
+        val asciidoctor = Asciidoctor.Factory.create();
+        val refDoc = asciidoctor.load(adocRef, new HashMap<String, Object>());
+        
+        Debug.debug(refDoc);
+        
+        String actualAdoc = AsciiDocWriter.toString(refDoc);
+        System.out.println(actualAdoc); //debug
+        
+        _Text.assertTextEquals(adocRef, actualAdoc);
+    }
+    
+    
+
+}
diff --git a/tooling/model4adoc/src/test/java/org/apache/isis/tooling/adocmodel/test/Debug.java b/tooling/model4adoc/src/test/java/org/apache/isis/tooling/adocmodel/test/Debug.java
index db454bc..d0091b6 100644
--- a/tooling/model4adoc/src/test/java/org/apache/isis/tooling/adocmodel/test/Debug.java
+++ b/tooling/model4adoc/src/test/java/org/apache/isis/tooling/adocmodel/test/Debug.java
@@ -18,10 +18,16 @@
  */
 package org.apache.isis.tooling.adocmodel.test;
 
+import java.util.Optional;
+
+import org.asciidoctor.ast.Block;
 import org.asciidoctor.ast.Document;
+import org.asciidoctor.ast.ListItem;
 import org.asciidoctor.ast.StructuralNode;
+import org.asciidoctor.ast.Table;
 
 import org.apache.isis.commons.internal.base._Strings;
+import org.apache.isis.commons.internal.exceptions._Exceptions;
 
 import lombok.val;
 
@@ -32,23 +38,49 @@ final class Debug {
     }
     
     static void debug(StructuralNode node, int level) {
-        print(level, "node type: %s", node.getClass());
-        print(level, "node title: %s", node.getTitle());
-        print(level, "node attributes: %d", node.getAttributes().size());
         
+        val simpleName = node.getClass().getSimpleName();
         
+        print(level, "node type: %s", node.getClass());
+        print(level, "%s title: %s", simpleName, node.getTitle());
+        sourceFor(node).ifPresent(x->print(level, "%s source: %s", simpleName, x));
+        print(level, "%s attributes: %d", simpleName, node.getAttributes().size());
         node.getAttributes()
         .forEach((k, v)->{
             print(level+1, " - %s->%s", k, v);
         });
         
-        print(level, "node blocks: %d", node.getBlocks().size());
+        if(node.getBlocks().size()>0) {
+            print(level, "%s child blocks: %d ...", simpleName, node.getBlocks().size());
+        }
         
         for(val subNode : node.getBlocks()) {
             debug(subNode, level+1);
         }
     }
 
+    private static Optional<String> sourceFor(StructuralNode node) {
+        if(node instanceof Document) {
+            //((Document)node);
+            return Optional.empty();
+        }
+        if(node instanceof Table) {
+            //((Table)node);
+            return Optional.empty();
+        }
+        if(node instanceof org.asciidoctor.ast.List) {
+            //((org.asciidoctor.ast.List)node);
+            return Optional.empty();
+        }
+        if(node instanceof ListItem) {
+            return Optional.ofNullable(((ListItem)node).getSource());
+        }
+        if(node instanceof Block) {
+            return Optional.ofNullable(((Block)node).getSource());
+        }    
+        throw _Exceptions.unsupportedOperation("node type not supported %s", node.getClass());
+    }
+
     private static void print(int level, String format, Object... args) {
         val indent = _Strings.padEnd("", level*2, ' ');
         System.out.println(String.format("%s%s", indent, String.format(format, args)));
diff --git a/tooling/model4adoc/src/test/resources/org/apache/isis/tooling/adocmodel/test/admonition.adoc b/tooling/model4adoc/src/test/resources/org/apache/isis/tooling/adocmodel/test/admonition.adoc
new file mode 100644
index 0000000..47e3379
--- /dev/null
+++ b/tooling/model4adoc/src/test/resources/org/apache/isis/tooling/adocmodel/test/admonition.adoc
@@ -0,0 +1,9 @@
+[NOTE]
+====
+the note is multiple paragraphs, and can have all the usual styling
+
+also note
+====
+
+TIP: Here's something worth knowing...
+