src/XMLDocumentConstructor.h
branchv_0
changeset 18 737c507a3e32
parent 17 75c6685cceb9
child 19 aabdab3e05a0
equal deleted inserted replaced
17:75c6685cceb9 18:737c507a3e32
    78 	}
    78 	}
    79 
    79 
    80 	void process() {
    80 	void process() {
    81 		current = parser->get_document()->create_root_node("yaml");
    81 		current = parser->get_document()->create_root_node("yaml");
    82 		mode.push_back(Mode::ROOT);
    82 		mode.push_back(Mode::ROOT);
       
    83 		std::string itemName;
    83 
    84 
    84 		while (true) {
    85 		while (true) {
    85 			yaml_event_t event;
    86 			yaml_event_t event;
    86 
    87 
    87 			if (!yaml_parser_parse(&yamlParser, &event)) {
    88 			if (!yaml_parser_parse(&yamlParser, &event)) {
   108 				std::cerr << "YAML_ALIAS_EVENT" << std::endl;
   109 				std::cerr << "YAML_ALIAS_EVENT" << std::endl;
   109 				// TODO: alias?
   110 				// TODO: alias?
   110 			} else if (event.type == YAML_SCALAR_EVENT) {
   111 			} else if (event.type == YAML_SCALAR_EVENT) {
   111 				if (mode.back() == Mode::SEQUENCE) {
   112 				if (mode.back() == Mode::SEQUENCE) {
   112 					std::cerr << "YAML_SCALAR_EVENT: Mode::SEQUENCE: " << event.data.scalar.value << std::endl;
   113 					std::cerr << "YAML_SCALAR_EVENT: Mode::SEQUENCE: " << event.data.scalar.value << std::endl;
   113 					current->add_child("item")->add_child_text(y2x(event.data.scalar.value));
   114 					current->add_child(itemName)->add_child_text(y2x(event.data.scalar.value));
   114 				} else if (mode.back() == Mode::MAPPING) {
   115 				} else if (mode.back() == Mode::MAPPING) {
   115 					std::cerr << "YAML_SCALAR_EVENT: Mode::MAPPING: " << event.data.scalar.value << std::endl;
   116 					std::cerr << "YAML_SCALAR_EVENT: Mode::MAPPING: " << event.data.scalar.value << std::endl;
   116 					current = current->add_child(y2xname(event.data.scalar.value));
   117 					current = current->add_child(y2xname(event.data.scalar.value));
   117 					mode.push_back(Mode::MAP_KEY);
   118 					mode.push_back(Mode::MAP_KEY);
   118 				} else if (mode.back() == Mode::MAP_KEY) {
   119 				} else if (mode.back() == Mode::MAP_KEY) {
   124 					std::cerr << "YAML_SCALAR_EVENT: ???" << std::endl;
   125 					std::cerr << "YAML_SCALAR_EVENT: ???" << std::endl;
   125 				}
   126 				}
   126 
   127 
   127 			} else if (event.type == YAML_SEQUENCE_START_EVENT) {
   128 			} else if (event.type == YAML_SEQUENCE_START_EVENT) {
   128 				std::cerr << "YAML_SEQUENCE_START_EVENT" << std::endl;
   129 				std::cerr << "YAML_SEQUENCE_START_EVENT" << std::endl;
       
   130 				xmlpp::Element* parent = current->get_parent();
       
   131 				if (parent) {
       
   132 					itemName = current->get_name();
       
   133 					parent->remove_child(current);
       
   134 					current = parent;
       
   135 				} else {
       
   136 					itemName = "item";
       
   137 				}
   129 				if (mode.back() == Mode::MAP_KEY) mode.pop_back();
   138 				if (mode.back() == Mode::MAP_KEY) mode.pop_back();
   130 				mode.push_back(Mode::SEQUENCE);
   139 				mode.push_back(Mode::SEQUENCE);
   131 			} else if (event.type == YAML_SEQUENCE_END_EVENT) {
   140 			} else if (event.type == YAML_SEQUENCE_END_EVENT) {
   132 				std::cerr << "YAML_SEQUENCE_END_EVENT" << std::endl;
   141 				std::cerr << "YAML_SEQUENCE_END_EVENT" << std::endl;
   133 				current = parentOrSelf(current);
       
   134 				mode.pop_back(); // TODO: assert sequence?
   142 				mode.pop_back(); // TODO: assert sequence?
   135 			} else if (event.type == YAML_MAPPING_START_EVENT) {
   143 			} else if (event.type == YAML_MAPPING_START_EVENT) {
   136 
   144 
   137 				if (mode.back() == Mode::SEQUENCE) {
   145 				if (mode.back() == Mode::ROOT) {
       
   146 					std::cerr << "YAML_MAPPING_START_EVENT: Mode:ROOT" << std::endl;
       
   147 				} else if (mode.back() == Mode::SEQUENCE) {
   138 					std::cerr << "YAML_MAPPING_START_EVENT: Mode::SEQUENCE" << std::endl;
   148 					std::cerr << "YAML_MAPPING_START_EVENT: Mode::SEQUENCE" << std::endl;
   139 					current = current->add_child("item");
   149 					current = current->add_child(itemName);
   140 				} else if (mode.back() == Mode::MAP_KEY) {
   150 				} else if (mode.back() == Mode::MAP_KEY) {
   141 					std::cerr << "YAML_MAPPING_START_EVENT: Mode::MAP_KEY" << std::endl;
   151 					std::cerr << "YAML_MAPPING_START_EVENT: Mode::MAP_KEY" << std::endl;
   142 					mode.pop_back();
   152 					mode.pop_back();
   143 				} else {
   153 				} else {
   144 					std::cerr << "YAML_MAPPING_START_EVENT: Mode::?" << std::endl;
   154 					std::cerr << "YAML_MAPPING_START_EVENT: Mode::?" << std::endl;