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