1 /*
2 * Portions of this software was developed by employees of the National Institute
3 * of Standards and Technology (NIST), an agency of the Federal Government and is
4 * being made available as a public service. Pursuant to title 17 United States
5 * Code Section 105, works of NIST employees are not subject to copyright
6 * protection in the United States. This software may be subject to foreign
7 * copyright. Permission in the United States and in foreign countries, to the
8 * extent that NIST may hold copyright, to use, copy, modify, create derivative
9 * works, and distribute this software and its documentation without fee is hereby
10 * granted on a non-exclusive basis, provided that this notice and disclaimer
11 * of warranty appears in all copies.
12 *
13 * THE SOFTWARE IS PROVIDED 'AS IS' WITHOUT ANY WARRANTY OF ANY KIND, EITHER
14 * EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, ANY WARRANTY
15 * THAT THE SOFTWARE WILL CONFORM TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF
16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND FREEDOM FROM
17 * INFRINGEMENT, AND ANY WARRANTY THAT THE DOCUMENTATION WILL CONFORM TO THE
18 * SOFTWARE, OR ANY WARRANTY THAT THE SOFTWARE WILL BE ERROR FREE. IN NO EVENT
19 * SHALL NIST BE LIABLE FOR ANY DAMAGES, INCLUDING, BUT NOT LIMITED TO, DIRECT,
20 * INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES, ARISING OUT OF, RESULTING FROM,
21 * OR IN ANY WAY CONNECTED WITH THIS SOFTWARE, WHETHER OR NOT BASED UPON WARRANTY,
22 * CONTRACT, TORT, OR OTHERWISE, WHETHER OR NOT INJURY WAS SUSTAINED BY PERSONS OR
23 * PROPERTY OR OTHERWISE, AND WHETHER OR NOT LOSS WAS SUSTAINED FROM, OR AROSE OUT
24 * OF THE RESULTS OF, OR USE OF, THE SOFTWARE OR SERVICES PROVIDED HEREUNDER.
25 */
26
27 package gov.nist.secauto.metaschema.core.datatype.markup;
28
29 import com.vladsch.flexmark.formatter.Formatter;
30 import com.vladsch.flexmark.util.ast.Document;
31 import com.vladsch.flexmark.util.ast.Node;
32
33 import gov.nist.secauto.metaschema.core.datatype.ICustomJavaDataType;
34 import gov.nist.secauto.metaschema.core.datatype.markup.flexmark.FlexmarkFactory;
35 import gov.nist.secauto.metaschema.core.datatype.markup.flexmark.InsertAnchorExtension.InsertAnchorNode;
36
37 import org.codehaus.stax2.XMLStreamWriter2;
38 import org.codehaus.stax2.evt.XMLEventFactory2;
39
40 import java.io.IOException;
41 import java.util.List;
42 import java.util.function.Predicate;
43 import java.util.stream.Stream;
44
45 import javax.xml.stream.XMLEventWriter;
46 import javax.xml.stream.XMLStreamException;
47
48 import edu.umd.cs.findbugs.annotations.NonNull;
49
50 public interface IMarkupString<TYPE extends IMarkupString<TYPE>>
51 extends ICustomJavaDataType<TYPE> {
52 @NonNull
53 FlexmarkFactory getFlexmarkFactory();
54
55 @NonNull
56 Document getDocument();
57
58 // /**
59 // * Write HTML content to the provided {@code xmlStreamWriter} using the
60 // provided {@code
61 // namespace}.
62 // *
63 // * @param writer
64 // * the writer
65 // * @param namespace
66 // * the XML namespace for the HTML
67 // * @throws XMLStreamException
68 // * if an error occurred while writing
69 // */
70 // void writeHtml(@NonNull XMLStreamWriter2 writer, @NonNull String namespace)
71 // throws
72 // XMLStreamException;
73
74 @NonNull
75 String toHtml();
76
77 @NonNull
78 String toXHtml(@NonNull String namespace) throws XMLStreamException, IOException;
79
80 @NonNull
81 String toMarkdown();
82
83 @NonNull
84 String toMarkdown(@NonNull Formatter formatter);
85
86 /**
87 * Retrieve all nodes contained within this markup text as a stream.
88 *
89 * @return a depth first stream
90 */
91 @NonNull
92 Stream<Node> getNodesAsStream();
93
94 @NonNull
95 default List<InsertAnchorNode> getInserts() {
96 return getInserts(insert -> true);
97 }
98
99 /**
100 * Retrieve all insert statements that are contained within this markup text
101 * that match the provided filter.
102 *
103 * @param filter
104 * a filter used to identify matching insert statements
105 * @return the matching insert statements
106 */
107 @NonNull
108 List<InsertAnchorNode> getInserts(
109 @NonNull Predicate<InsertAnchorNode> filter);
110
111 /**
112 * Determine if the Markup consists of block elements.
113 *
114 * @return {@code true} if the markup consists of block elements, or
115 * {@code false} otherwise
116 */
117 boolean isBlock();
118
119 void writeXHtml(
120 @NonNull String namespace,
121 @NonNull XMLStreamWriter2 streamWriter) throws XMLStreamException;
122
123 void writeXHtml(
124 @NonNull String namespace,
125 @NonNull XMLEventFactory2 eventFactory,
126 @NonNull XMLEventWriter eventWriter) throws XMLStreamException;
127 }