diff --git a/src/main/java/de/plugh/compositeparse/xml/AttributesParser.java b/src/main/java/de/plugh/compositeparse/xml/AttributesParser.java index 2ab1129..4033854 100644 --- a/src/main/java/de/plugh/compositeparse/xml/AttributesParser.java +++ b/src/main/java/de/plugh/compositeparse/xml/AttributesParser.java @@ -20,7 +20,7 @@ public class AttributesParser implements Parser> { public Map read(Block block) throws ParseException { List attributes = new Repeat<>(block1 -> { Repeat.atLeast(1, Literal.literally(" ")).parse(block1); - + String name = new Expression(REGEX_NAME).parse(block1); Literal.literally("=").parse(block1); String value = new QuotedString().parse(block1); diff --git a/src/main/java/de/plugh/compositeparse/xml/Document.java b/src/main/java/de/plugh/compositeparse/xml/Document.java new file mode 100644 index 0000000..8bb9023 --- /dev/null +++ b/src/main/java/de/plugh/compositeparse/xml/Document.java @@ -0,0 +1,35 @@ +package de.plugh.compositeparse.xml; + +import java.util.List; + +public class Document { + + private final Prolog prolog; + private final List nodes; + + public Document(Prolog prolog, List nodes) { + this.prolog = prolog; + this.nodes = nodes; + } + + public String prettyPrint() { + StringBuilder result = new StringBuilder(); + + if (prolog != null) { + result.append(prolog.prettyPrint(true)); + } + + nodes.forEach(node -> result.append(node.prettyPrint())); + + return result.toString(); + } + + @Override + public String toString() { + return "Document{" + + "prolog=" + prolog + + ", nodes=" + nodes + + '}'; + } + +} diff --git a/src/main/java/de/plugh/compositeparse/xml/DocumentParser.java b/src/main/java/de/plugh/compositeparse/xml/DocumentParser.java new file mode 100644 index 0000000..9d6c214 --- /dev/null +++ b/src/main/java/de/plugh/compositeparse/xml/DocumentParser.java @@ -0,0 +1,21 @@ +package de.plugh.compositeparse.xml; + +import de.plugh.compositeparse.Block; +import de.plugh.compositeparse.ParseException; +import de.plugh.compositeparse.Parser; +import de.plugh.compositeparse.parsers.Default; +import de.plugh.compositeparse.parsers.Repeat; + +import java.util.List; + +public class DocumentParser implements Parser { + + @Override + public Document read(Block block) throws ParseException { + Prolog prolog = new Default<>(null, new PrologParser()).parse(block); + List nodes = new Repeat<>(new NodeParser()).parse(block); + + return new Document(prolog, nodes); + } + +} diff --git a/src/main/java/de/plugh/compositeparse/xml/Prolog.java b/src/main/java/de/plugh/compositeparse/xml/Prolog.java new file mode 100644 index 0000000..05e9297 --- /dev/null +++ b/src/main/java/de/plugh/compositeparse/xml/Prolog.java @@ -0,0 +1,43 @@ +package de.plugh.compositeparse.xml; + +import java.util.Map; + +public class Prolog { + + private final Map attributes; + + public Prolog(Map attributes) { + this.attributes = attributes; + } + + public String prettyPrint(boolean newline) { + StringBuilder result = new StringBuilder(); + + result.append(" { + result + .append(" ") + .append(s) + .append("=\"") + .append(s2) + .append("\""); + }); + + result.append("?>"); + + if (newline) { + result.append("\n"); + } + + return result.toString(); + } + + @Override + public String toString() { + return "Prolog{" + + "attributes=" + attributes + + '}'; + } + +} diff --git a/src/main/java/de/plugh/compositeparse/xml/PrologParser.java b/src/main/java/de/plugh/compositeparse/xml/PrologParser.java new file mode 100644 index 0000000..60c9049 --- /dev/null +++ b/src/main/java/de/plugh/compositeparse/xml/PrologParser.java @@ -0,0 +1,28 @@ +package de.plugh.compositeparse.xml; + +import de.plugh.compositeparse.Block; +import de.plugh.compositeparse.ParseException; +import de.plugh.compositeparse.Parser; +import de.plugh.compositeparse.parsers.Literal; + +import java.util.List; +import java.util.Map; +import java.util.function.Function; + +public class PrologParser implements Parser { + + @Override + public Function, String> getNamingScheme() { + return Block.label("xml prolog"); + } + + @Override + public Prolog read(Block block) throws ParseException { + Literal.literally(" attributes = new AttributesParser().parse(block); + Literal.literally("?>").parse(block); + + return new Prolog(attributes); + } + +}