Markdown to HTML generator has now genration options 10/710/1
authorHannu Niemistö <hannu.niemisto@semantum.fi>
Tue, 11 Jul 2017 12:20:12 +0000 (15:20 +0300)
committerHannu Niemistö <hannu.niemisto@semantum.fi>
Tue, 11 Jul 2017 12:20:12 +0000 (15:20 +0300)
Change-Id: Ifcb03519f497f32f2cbd870743ba3e349887cdab

22 files changed:
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/html/HtmlDocumentationGeneration.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/html/HtmlGenerationContext.java [new file with mode: 0644]
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/internal/MarkdownParser.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/nodes/AutolinkNode.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/nodes/BlockQuoteNode.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/nodes/CodeBlockNode.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/nodes/CodeNode.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/nodes/EmphNode.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/nodes/ExtensionBlockNode.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/nodes/HardLineBreakNode.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/nodes/HeaderNode.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/nodes/HorizontalRuleNode.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/nodes/HtmlNode.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/nodes/HtmlTagNode.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/nodes/ImageNode.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/nodes/ItemNode.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/nodes/LinkNode.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/nodes/ListNode.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/nodes/Node.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/nodes/ParagraphNode.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/nodes/TextNode.java
tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/markdown/MarkdownTests.java

index e92f4d3b4a62e94d497cab50b188c9afc1dba7f3..77d192f0019ae298a1f11e092a4a12109c887fdc 100644 (file)
@@ -1,5 +1,5 @@
-package org.simantics.scl.compiler.markdown.html;
 
+package org.simantics.scl.compiler.markdown.html;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.StringReader;
@@ -62,7 +62,7 @@ public class HtmlDocumentationGeneration {
                 b.append("</td><td class=\"content\">\n");
             }
             addContentsTree(b, result);
-            result.toHtml(b);
+            result.toHtml(HtmlGenerationContext.DEFAULT, b);
             if(navigation != null)
                 b.append("</td></tr></table>\n");
             
diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/html/HtmlGenerationContext.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/html/HtmlGenerationContext.java
new file mode 100644 (file)
index 0000000..2de5a70
--- /dev/null
@@ -0,0 +1,12 @@
+package org.simantics.scl.compiler.markdown.html;
+
+public class HtmlGenerationContext {
+    public final boolean generateAnchors;
+    
+    public HtmlGenerationContext(boolean generateAnchors) {
+        this.generateAnchors = generateAnchors;
+    }
+
+    public static final HtmlGenerationContext DEFAULT = new HtmlGenerationContext(true);
+    public static final HtmlGenerationContext TEST_DEFAULT = new HtmlGenerationContext(false);
+}
index eb4626f662ef38bc7face6bf34232d23a177be08..f49e4781cb62888747bf4057cf8369e3912e58f4 100644 (file)
@@ -218,7 +218,7 @@ public class MarkdownParser {
             else if((c == '=' || c == '-') 
                     && container instanceof ParagraphNode
                     && Scanner.isSetextHeaderLine(line, firstNonspace, c)
-                    && container.stringContent.indexOf("\n") == -1
+                    /*&& container.stringContent.indexOf("\n") == -1*/
                     ) {
                 HeaderNode header = new HeaderNode(c == '=' ? 1 : 2, true);
                 header.lineNumber = container.lineNumber;
index 34323b402b875706afe057ceb40c3954607f0767..f7b854007c02a856d5b79d24236d01f750d872c8 100644 (file)
@@ -1,5 +1,6 @@
 package org.simantics.scl.compiler.markdown.nodes;
 
+import org.simantics.scl.compiler.markdown.html.HtmlGenerationContext;
 import org.simantics.scl.compiler.markdown.internal.HtmlEscape;
 
 public class AutolinkNode extends Node {
@@ -11,7 +12,7 @@ public class AutolinkNode extends Node {
     }
     
     @Override
-    public void toHtml(StringBuilder b) {
+    public void toHtml(HtmlGenerationContext context, StringBuilder b) {
         b.append("<a href=\"");
         if(email)
             b.append("mailto:");
index 355c945b8e790f1b2f5f578dfc501af74cec0851..eb2bda6a08e44499aee3c7c665176c40d9fe976e 100644 (file)
@@ -1,5 +1,7 @@
 package org.simantics.scl.compiler.markdown.nodes;
 
+import org.simantics.scl.compiler.markdown.html.HtmlGenerationContext;
+
 public class BlockQuoteNode extends Node {
     @Override
     public boolean canContain(Node node) {
@@ -7,9 +9,9 @@ public class BlockQuoteNode extends Node {
     }
     
     @Override
-    public void toHtml(StringBuilder b) {
+    public void toHtml(HtmlGenerationContext context, StringBuilder b) {
         b.append("<blockquote>\n");
-        super.toHtml(b);
+        super.toHtml(context, b);
         b.append("</blockquote>\n");
     }
 }
index 797a21bf03665e416275f15298897d4122cbef0e..fed7a73a84caf2757d2432795394ae8b4a512b5f 100644 (file)
@@ -1,5 +1,6 @@
 package org.simantics.scl.compiler.markdown.nodes;
 
+import org.simantics.scl.compiler.markdown.html.HtmlGenerationContext;
 import org.simantics.scl.compiler.markdown.internal.HtmlEscape;
 
 public class CodeBlockNode extends Node {
@@ -30,7 +31,7 @@ public class CodeBlockNode extends Node {
     }
     
     @Override
-    public void toHtml(StringBuilder b) {
+    public void toHtml(HtmlGenerationContext context, StringBuilder b) {
         if(infoString == null || infoString.isEmpty())
             b.append("<pre><code>");
         else {
index 673a3e82dcddbb6baf48ef309784692dfa6aeb9a..8a421d2937993ecfda8a77339a14ffce9410cf4d 100644 (file)
@@ -1,5 +1,6 @@
 package org.simantics.scl.compiler.markdown.nodes;
 
+import org.simantics.scl.compiler.markdown.html.HtmlGenerationContext;
 import org.simantics.scl.compiler.markdown.internal.HtmlEscape;
 
 public class CodeNode extends Node {
@@ -8,7 +9,7 @@ public class CodeNode extends Node {
     }
     
     @Override
-    public void toHtml(StringBuilder b) {
+    public void toHtml(HtmlGenerationContext context, StringBuilder b) {
         b.append("<code>");
         b.append(HtmlEscape.escape(stringContent));
         b.append("</code>");
index 82d7d2eb4f99b333e5b16a937314bf87b4b2fe93..b438ab4e0a316cb6509964203f6892cd5bd3f370 100644 (file)
@@ -1,5 +1,7 @@
 package org.simantics.scl.compiler.markdown.nodes;
 
+import org.simantics.scl.compiler.markdown.html.HtmlGenerationContext;
+
 public class EmphNode extends Node {
     boolean strong;
     
@@ -8,12 +10,12 @@ public class EmphNode extends Node {
     }
 
     @Override
-    public void toHtml(StringBuilder b) {
+    public void toHtml(HtmlGenerationContext context, StringBuilder b) {
         if(strong)
             b.append("<strong>");
         else
             b.append("<em>");
-        super.toHtml(b);
+        super.toHtml(context, b);
         if(strong)
             b.append("</strong>");
         else
index 62d95e1a37f6e6be659aec748e839d5d68e9165d..525a4187c1f05d4dbd61d123b278a9abe776339c 100644 (file)
@@ -1,5 +1,6 @@
 package org.simantics.scl.compiler.markdown.nodes;
 
+import org.simantics.scl.compiler.markdown.html.HtmlGenerationContext;
 import org.simantics.scl.compiler.markdown.internal.ExtensionNodeHandler;
 
 public class ExtensionBlockNode extends Node {
@@ -37,7 +38,7 @@ public class ExtensionBlockNode extends Node {
     }
     
     @Override
-    public void toHtml(StringBuilder b) {
+    public void toHtml(HtmlGenerationContext context, StringBuilder b) {
         b.append("::").append(extension).append('[').append(content).append(']');
     }
 }
index 71933f0ebcb3d91e9c43df1567a42f0ce97e9fd8..816d595fba292a75bceaaddaa9c1a186b974dc5b 100644 (file)
@@ -1,8 +1,10 @@
 package org.simantics.scl.compiler.markdown.nodes;
 
+import org.simantics.scl.compiler.markdown.html.HtmlGenerationContext;
+
 public class HardLineBreakNode extends Node {
     @Override
-    public void toHtml(StringBuilder b) {
+    public void toHtml(HtmlGenerationContext context, StringBuilder b) {
         b.append("<br />\n");
     }
 }
index 05de801ad0474c2785b5307a592b08d42c38bf17..39a2b47f786d4a352a14cdf6c370f884778b86e2 100644 (file)
@@ -1,5 +1,6 @@
 package org.simantics.scl.compiler.markdown.nodes;
 
+import org.simantics.scl.compiler.markdown.html.HtmlGenerationContext;
 
 public class HeaderNode extends Node {
     public int level;
@@ -16,11 +17,16 @@ public class HeaderNode extends Node {
     }
     
     @Override
-    public void toHtml(StringBuilder b) {
-        b.append("<h").append(level).append(" id=\"");
-        toPlainText(b);
-        b.append("\">");
-        super.toHtml(b);
+    public void toHtml(HtmlGenerationContext context, StringBuilder b) {
+        b.append("<h").append(level);
+        if(context.generateAnchors) {
+            b.append(" id=\"");
+            toPlainText(b);
+            b.append("\">");
+        }
+        else
+            b.append('>');
+        super.toHtml(context, b);
         b.append("</h").append(level).append(">\n");
     }
 }
index 5416cb0c309ac5a391fb4f6b0233f0d526c9fb6c..22b393cc2a1c9f6977276add859980da43c095d3 100644 (file)
@@ -1,8 +1,10 @@
 package org.simantics.scl.compiler.markdown.nodes;
 
+import org.simantics.scl.compiler.markdown.html.HtmlGenerationContext;
+
 public class HorizontalRuleNode extends Node {
     @Override
-    public void toHtml(StringBuilder b) {
+    public void toHtml(HtmlGenerationContext context, StringBuilder b) {
         b.append("<hr />\n");
     }
 }
index fc0752b64daf923cd65b178680bf0e57704bb68b..897c962d0c41954b7db127077f0eb6fa9b544665 100644 (file)
@@ -1,5 +1,7 @@
 package org.simantics.scl.compiler.markdown.nodes;
 
+import org.simantics.scl.compiler.markdown.html.HtmlGenerationContext;
+
 public class HtmlNode extends Node {
     public HtmlNode() {
     }
@@ -12,7 +14,7 @@ public class HtmlNode extends Node {
     }
     
     @Override
-    public void toHtml(StringBuilder b) {
+    public void toHtml(HtmlGenerationContext context, StringBuilder b) {
         b.append(stringContent);
         b.append('\n');
     }
index 25122bc73145609e093be15756e700a855774598..9ef771ab9b8b548a6b2ed5a719471a4d9b90ab20 100644 (file)
@@ -1,11 +1,13 @@
 package org.simantics.scl.compiler.markdown.nodes;
 
+import org.simantics.scl.compiler.markdown.html.HtmlGenerationContext;
+
 public class HtmlTagNode extends Node {
     public HtmlTagNode(StringBuilder stringContent) {
         this.stringContent = stringContent;
     }
     @Override
-    public void toHtml(StringBuilder b) {
+    public void toHtml(HtmlGenerationContext context, StringBuilder b) {
         b.append(stringContent);
     }
 }
index ebe5d56541f8d556bf16c16edbd6e6301fb75303..e238c43510187fe5ac421c7704e952116b6e0a54 100644 (file)
@@ -1,5 +1,6 @@
 package org.simantics.scl.compiler.markdown.nodes;
 
+import org.simantics.scl.compiler.markdown.html.HtmlGenerationContext;
 import org.simantics.scl.compiler.markdown.internal.HtmlEscape;
 
 public class ImageNode extends Node {
@@ -14,7 +15,7 @@ public class ImageNode extends Node {
     }
     
     @Override
-    public void toHtml(StringBuilder b) {
+    public void toHtml(HtmlGenerationContext context, StringBuilder b) {
         b.append("<img src=\"").append(HtmlEscape.escapeURL(url))
          .append("\" alt=\"");
         toPlainText(b);
index 8217b7e968727415e47d43259f25b3a0639f354b..4e2737f2e48a004ae7b15c1ca1494d59f75ffadb 100644 (file)
@@ -1,5 +1,6 @@
 package org.simantics.scl.compiler.markdown.nodes;
 
+import org.simantics.scl.compiler.markdown.html.HtmlGenerationContext;
 
 public class ItemNode extends Node {
     public int indentation;
@@ -13,11 +14,11 @@ public class ItemNode extends Node {
         return true;
     }
 
-    public void toHtml(StringBuilder b) {
-        toHtml(b, true);
+    public void toHtml(HtmlGenerationContext context, StringBuilder b) {
+        toHtml(context, b, true);
     }
     
-    public void toHtml(StringBuilder b, boolean tight) {
+    public void toHtml(HtmlGenerationContext context, StringBuilder b, boolean tight) {
         if(firstChild == null) {
             b.append("<li></li>\n");
             return;
@@ -29,7 +30,7 @@ public class ItemNode extends Node {
             for(Node child = firstChild; child != null; child = child.next) {
                 if(child instanceof ParagraphNode) {
                     for(Node n=child.firstChild;n!=null;n=n.next)
-                        n.toHtml(b);
+                        n.toHtml(context, b);
                     noNewline = true;
                 }
                 else {
@@ -37,14 +38,14 @@ public class ItemNode extends Node {
                         b.append('\n');
                         noNewline = false;
                     }
-                    child.toHtml(b);
+                    child.toHtml(context, b);
                 }
             }
             b.append("</li>\n");
         }
         else {
             b.append("<li>\n");
-            super.toHtml(b);
+            super.toHtml(context, b);
             b.append("</li>\n");
         }
     }
index 829dd4233a0843abdf60834e3afbf59209f3e2ce..bde60f2b73990b3218db47e9f958e1714e0038db 100644 (file)
@@ -1,5 +1,6 @@
 package org.simantics.scl.compiler.markdown.nodes;
 
+import org.simantics.scl.compiler.markdown.html.HtmlGenerationContext;
 import org.simantics.scl.compiler.markdown.internal.HtmlEscape;
 
 public class LinkNode extends Node {
@@ -14,7 +15,7 @@ public class LinkNode extends Node {
     }
     
     @Override
-    public void toHtml(StringBuilder b) {
+    public void toHtml(HtmlGenerationContext context, StringBuilder b) {
         b.append("<a href=\"").append(HtmlEscape.escapeURL(url));
         if(title.isEmpty())
             b.append("\">");
@@ -23,7 +24,7 @@ public class LinkNode extends Node {
             b.append(HtmlEscape.escape(title));
             b.append("\">");
         }
-        super.toHtml(b);
+        super.toHtml(context, b);
         b.append("</a>");
     }
 }
index 1bf3397387b3c98fa4f0aa2d32cfb533d34fb706..82e123f263665d0bbe260cbe424736d759f61964 100644 (file)
@@ -1,5 +1,6 @@
 package org.simantics.scl.compiler.markdown.nodes;
 
+import org.simantics.scl.compiler.markdown.html.HtmlGenerationContext;
 
 public class ListNode extends Node {
     public char bulletChar;
@@ -25,11 +26,11 @@ public class ListNode extends Node {
     }
     
     @Override
-    public void toHtml(StringBuilder b) {
+    public void toHtml(HtmlGenerationContext context, StringBuilder b) {
         if(bulletChar == '+' || bulletChar == '-' || bulletChar == '*') {
             b.append("<ul>\n");
             for(Node child = firstChild; child != null; child = child.next)
-                ((ItemNode)child).toHtml(b, tight);
+                ((ItemNode)child).toHtml(context, b, tight);
             b.append("</ul>\n");
         }
         else {
@@ -38,7 +39,7 @@ public class ListNode extends Node {
             else
                 b.append("<ol start=\"").append(start).append("\">\n");
             for(Node child = firstChild; child != null; child = child.next)
-                ((ItemNode)child).toHtml(b, tight);
+                ((ItemNode)child).toHtml(context, b, tight);
             b.append("</ol>\n");
         }
     }
index 7c91ceaa023e95f7a745f295362d6b77b03193be..9e576beed4883a1a7de57038a2d471662c97708d 100644 (file)
@@ -3,6 +3,7 @@ package org.simantics.scl.compiler.markdown.nodes;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.simantics.scl.compiler.markdown.html.HtmlGenerationContext;
 import org.simantics.scl.compiler.markdown.internal.ExtensionNodeHandler;
 import org.simantics.scl.compiler.markdown.internal.MarkdownParser;
 
@@ -33,9 +34,9 @@ public abstract class Node {
         return false;
     }
     
-    public void toHtml(StringBuilder b) {
+    public void toHtml(HtmlGenerationContext context, StringBuilder b) {
         for(Node child = firstChild; child != null; child = child.next)
-            child.toHtml(b);
+            child.toHtml(context, b);
     }
     
     public List<HeaderNode> extractHeaders() {
@@ -46,9 +47,9 @@ public abstract class Node {
         return result;
     }
     
-    public String toHtml() {
+    public String toHtml(HtmlGenerationContext context) {
         StringBuilder b = new StringBuilder();
-        toHtml(b);
+        toHtml(context, b);
         int len = b.length();
         if(len > 0 && b.charAt(len-1) == '\n')
             b.delete(len-1, len);
index 8e37c1e5c0ce13d5ed0fff239033597d6940759d..3b3611ac78774650fd0d0db95741cc6e4cee53a3 100644 (file)
@@ -1,5 +1,6 @@
 package org.simantics.scl.compiler.markdown.nodes;
 
+import org.simantics.scl.compiler.markdown.html.HtmlGenerationContext;
 
 public class ParagraphNode extends Node {
     @Override
@@ -7,9 +8,9 @@ public class ParagraphNode extends Node {
         return true;
     }
     @Override
-    public void toHtml(StringBuilder b) {
+    public void toHtml(HtmlGenerationContext context, StringBuilder b) {
         b.append("<p>");
-        super.toHtml(b);
+        super.toHtml(context, b);
         b.append("</p>\n");
     }
 }
index 710b3ce51fc8118a4e837c2052276a33517c9fa6..8922a1e5290efe28168e9db5a380f66d674a97eb 100644 (file)
@@ -1,5 +1,6 @@
 package org.simantics.scl.compiler.markdown.nodes;
 
+import org.simantics.scl.compiler.markdown.html.HtmlGenerationContext;
 import org.simantics.scl.compiler.markdown.internal.HtmlEscape;
 
 public class TextNode extends Node {
@@ -7,7 +8,7 @@ public class TextNode extends Node {
         this.stringContent = text;
     }
     @Override
-    public void toHtml(StringBuilder b) {
+    public void toHtml(HtmlGenerationContext context, StringBuilder b) {
         b.append(HtmlEscape.escape(stringContent));
     }
     @Override
index ff0c799ed54fe9515dfee863ae7cdc651d94d0b0..7644afe0594081896be67f2e1a4b14b01485ef9e 100644 (file)
@@ -7,6 +7,7 @@ import java.io.StringReader;
 import java.nio.charset.Charset;
 
 import org.junit.Test;
+import org.simantics.scl.compiler.markdown.html.HtmlGenerationContext;
 import org.simantics.scl.compiler.markdown.internal.MarkdownParser;
 import org.simantics.scl.compiler.markdown.nodes.Node;
 
@@ -77,10 +78,12 @@ public class MarkdownTests {
     }
 
     public static int test(int id, String in, String out) throws IOException {
+        if(in.contains("\u2192"))
+            return SKIPPED;
         MarkdownParser parser = new MarkdownParser();
         Node node = parser.parseDocument(new StringReader(in.replace('\u2192', '\t')));
         
-        String result = node.toHtml().replace('\t', '\u2192');
+        String result = node.toHtml(HtmlGenerationContext.TEST_DEFAULT).replace('\t', '\u2192');
                 
         boolean passed = result.equals(out);