1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 package gov.nist.secauto.metaschema.core.datatype.markup;
28
29 import com.vladsch.flexmark.html.HtmlRenderer;
30 import com.vladsch.flexmark.parser.Parser;
31 import com.vladsch.flexmark.util.ast.Block;
32 import com.vladsch.flexmark.util.ast.Document;
33 import com.vladsch.flexmark.util.ast.Node;
34 import com.vladsch.flexmark.util.data.DataSet;
35 import com.vladsch.flexmark.util.data.MutableDataSet;
36 import com.vladsch.flexmark.util.misc.Extension;
37
38 import gov.nist.secauto.metaschema.core.datatype.markup.flexmark.FlexmarkConfiguration;
39 import gov.nist.secauto.metaschema.core.datatype.markup.flexmark.FlexmarkFactory;
40 import gov.nist.secauto.metaschema.core.datatype.markup.flexmark.SuppressPTagExtension;
41
42 import java.util.Collection;
43 import java.util.LinkedList;
44 import java.util.List;
45
46 import edu.umd.cs.findbugs.annotations.NonNull;
47
48 public class MarkupLine
49 extends AbstractMarkupString<MarkupLine> {
50
51 @NonNull
52 private static final DataSet FLEXMARK_CONFIG = newParserOptions();
53
54 @NonNull
55 private static final FlexmarkFactory FLEXMARK_FACTORY = new FlexmarkFactory(FLEXMARK_CONFIG);
56
57 @SuppressWarnings("null")
58 @NonNull
59 protected static DataSet newParserOptions() {
60 MutableDataSet options = new MutableDataSet();
61
62 options.set(Parser.HTML_BLOCK_PARSER, false);
63
64 options.set(Parser.LIST_BLOCK_PARSER, false);
65 options.set(HtmlRenderer.SUPPRESS_HTML_BLOCKS, true);
66
67 Collection<Extension> currentExtensions = Parser.EXTENSIONS.get(FlexmarkConfiguration.FLEXMARK_CONFIG);
68 List<Extension> extensions = new LinkedList<>(currentExtensions);
69 extensions.add(SuppressPTagExtension.create());
70 Parser.EXTENSIONS.set(options, extensions);
71
72 return FlexmarkConfiguration.newFlexmarkConfig(options);
73 }
74
75 @NonNull
76 public static MarkupLine fromHtml(@NonNull String html) {
77 return new MarkupLine(
78 parseHtml(html, FLEXMARK_FACTORY.getFlexmarkHtmlConverter(), FLEXMARK_FACTORY.getMarkdownParser()));
79 }
80
81 @NonNull
82 public static MarkupLine fromMarkdown(@NonNull String markdown) {
83 return new MarkupLine(parseMarkdown(markdown, FLEXMARK_FACTORY.getMarkdownParser()));
84 }
85
86 @Override
87 public FlexmarkFactory getFlexmarkFactory() {
88 return FLEXMARK_FACTORY;
89 }
90
91 protected MarkupLine(@NonNull Document astNode) {
92 super(astNode);
93 Node child = astNode.getFirstChild();
94 if (child instanceof Block && child.getNext() != null) {
95 throw new IllegalStateException("multiple blocks not allowed");
96 }
97 }
98
99 @Override
100 public MarkupLine copy() {
101
102
103 return new MarkupLine(getDocument());
104 }
105
106 @Override
107 public boolean isBlock() {
108 return false;
109 }
110 }