1 /** 2 * Copyright: © 2017 Andrey Kabylin 3 * License: Subject to the terms of the MIT license, as written in the included LICENSE.txt file. 4 */ 5 6 module rpdl.file_formats.text; 7 8 import std.conv; 9 10 import rpdl.node; 11 import rpdl.value; 12 import rpdl.writer; 13 14 /// Tree writer to text file 15 final class TextWriter : Writer { 16 /** 17 * Write `root` node and it children to text file. 18 * Params: 19 * root = Root node which need to write. 20 * indentSize = indentation size of items. 21 */ 22 this(Node root, in int indentSize = 4) { 23 super(root); 24 this.indentSize = indentSize; 25 } 26 27 protected: 28 int currentDepth = 0; 29 int indentSize = 0; 30 31 /// Write current indentation. 32 void writeIndent() { 33 for (int i = 0; i < currentDepth*indentSize; ++i) 34 rawWrite(' '); 35 } 36 37 override void writeObject(ObjectNode object) { 38 writeIndent(); 39 rawWrite(object.name); 40 rawWrite('\n'); 41 ++currentDepth; 42 super.writeObject(object); 43 --currentDepth; 44 } 45 46 override void writeParameter(Parameter parameter) { 47 writeIndent(); 48 rawWrite(parameter.name); 49 rawWrite(": "); 50 int i = 0; 51 52 foreach (Node child; parameter.children) { 53 if (cast(Value) child) { 54 ++i; 55 writeValue(cast(Value) child); 56 57 if (i < parameter.children.length) 58 rawWrite(", "); 59 } 60 } 61 62 rawWrite('\n'); 63 } 64 65 override void writeNumberValue(NumberValue node) { 66 rawWrite(to!string(node.value)); 67 } 68 69 override void writeBooleanValue(BooleanValue node) { 70 rawWrite(to!string(node.value)); 71 } 72 73 override void writeStringValue(StringValue node) { 74 rawWrite('"'); 75 rawWrite(node.value); 76 rawWrite('"'); 77 } 78 79 override void writeIdentifierValue(IdentifierValue node) { 80 rawWrite(node.value); 81 } 82 83 override void writeArrayValue(ArrayValue array) { 84 rawWrite("["); 85 int i = 0; 86 87 foreach (Node node; array.children) { 88 ++i; 89 writeValue(cast(Value) node); 90 91 if (i < array.children.length) 92 rawWrite(", "); 93 } 94 95 rawWrite("]"); 96 } 97 }