src/XMLDocumentConstructor.h
branchv_0
changeset 29 cc601886f0a7
parent 26 84ff7c97bfdc
equal deleted inserted replaced
28:3662c567dab9 29:cc601886f0a7
    36 	XMLNameCodec nameCodec;
    36 	XMLNameCodec nameCodec;
    37 
    37 
    38 	enum class Mode {
    38 	enum class Mode {
    39 		ROOT,
    39 		ROOT,
    40 		SEQUENCE,
    40 		SEQUENCE,
    41 		MAPPING,
    41 		MAP_KEY,
    42 		MAP_KEY
    42 		MAP_VALUE
    43 	};
    43 	};
    44 
    44 
    45 	std::string rootName = "yaml";
    45 	std::string rootName = "yaml";
    46 	xmlpp::Element* current;
    46 	xmlpp::Element* current;
    47 	std::vector<Mode> mode;
    47 	std::vector<Mode> mode;
   109 			} else if (event.type == YAML_ALIAS_EVENT) {
   109 			} else if (event.type == YAML_ALIAS_EVENT) {
   110 				// TODO: alias?
   110 				// TODO: alias?
   111 			} else if (event.type == YAML_SCALAR_EVENT) {
   111 			} else if (event.type == YAML_SCALAR_EVENT) {
   112 				if (mode.back() == Mode::SEQUENCE) {
   112 				if (mode.back() == Mode::SEQUENCE) {
   113 					current->add_child(itemName)->add_child_text(y2x(event.data.scalar.value));
   113 					current->add_child(itemName)->add_child_text(y2x(event.data.scalar.value));
   114 				} else if (mode.back() == Mode::MAPPING) {
   114 				} else if (mode.back() == Mode::MAP_KEY) {
   115 					current = current->add_child(y2xname(event.data.scalar.value));
   115 					current = current->add_child(y2xname(event.data.scalar.value));
   116 					mode.push_back(Mode::MAP_KEY);
   116 					mode.push_back(Mode::MAP_VALUE);
   117 				} else if (mode.back() == Mode::MAP_KEY) {
   117 				} else if (mode.back() == Mode::MAP_VALUE) {
   118 					current->add_child_text(y2x(event.data.scalar.value));
   118 					current->add_child_text(y2x(event.data.scalar.value));
   119 					current = parentOrSelf(current);
   119 					current = parentOrSelf(current);
   120 					mode.pop_back();
   120 					mode.pop_back();
   121 				} else if (mode.back() == Mode::ROOT) {
   121 				} else if (mode.back() == Mode::ROOT) {
   122 					current->add_child_text(y2x(event.data.scalar.value));
   122 					current->add_child_text(y2x(event.data.scalar.value));
   131 					parent->remove_child(current);
   131 					parent->remove_child(current);
   132 					current = parent;
   132 					current = parent;
   133 				} else {
   133 				} else {
   134 					itemName = "item";
   134 					itemName = "item";
   135 				}
   135 				}
   136 				if (mode.back() == Mode::MAP_KEY) mode.pop_back();
   136 				if (mode.back() == Mode::MAP_VALUE) mode.pop_back();
   137 				mode.push_back(Mode::SEQUENCE);
   137 				mode.push_back(Mode::SEQUENCE);
   138 			} else if (event.type == YAML_SEQUENCE_END_EVENT) {
   138 			} else if (event.type == YAML_SEQUENCE_END_EVENT) {
   139 				mode.pop_back(); // TODO: assert sequence?
   139 				mode.pop_back(); // TODO: assert sequence?
   140 			} else if (event.type == YAML_MAPPING_START_EVENT) {
   140 			} else if (event.type == YAML_MAPPING_START_EVENT) {
   141 
   141 
   142 				if (mode.back() == Mode::ROOT) {
   142 				if (mode.back() == Mode::ROOT) {
   143 				} else if (mode.back() == Mode::SEQUENCE) {
   143 				} else if (mode.back() == Mode::SEQUENCE) {
   144 					current = current->add_child(itemName);
   144 					current = current->add_child(itemName);
   145 				} else if (mode.back() == Mode::MAP_KEY) {
   145 				} else if (mode.back() == Mode::MAP_VALUE) {
   146 					mode.pop_back();
   146 					mode.pop_back();
   147 				} else {
   147 				} else {
   148 					// TODO: map might be a key of another map → wrap/nest
   148 					// TODO: map might be a key of another map → wrap/nest
   149 				}
   149 				}
   150 
   150 
   151 				mode.push_back(Mode::MAPPING);
   151 				mode.push_back(Mode::MAP_KEY);
   152 			} else if (event.type == YAML_MAPPING_END_EVENT) {
   152 			} else if (event.type == YAML_MAPPING_END_EVENT) {
   153 				current = parentOrSelf(current);
   153 				current = parentOrSelf(current);
   154 				mode.pop_back(); // TODO: assert map?
   154 				mode.pop_back(); // TODO: assert map?
   155 			} else {
   155 			} else {
   156 				// TODO: unsupported type?
   156 				// TODO: unsupported type?