src/XMLDocumentConstructor.h
branchv_0
changeset 24 ee72fccc5267
parent 21 053054f9f702
child 25 0e8a58946c48
equal deleted inserted replaced
23:b25404ff2b2b 24:ee72fccc5267
    86 		while (true) {
    86 		while (true) {
    87 			yaml_event_t event;
    87 			yaml_event_t event;
    88 
    88 
    89 			if (!yaml_parser_parse(&yamlParser, &event)) {
    89 			if (!yaml_parser_parse(&yamlParser, &event)) {
    90 				// FIXME: throw exception
    90 				// FIXME: throw exception
    91 				std::wcerr << L"YAML error" << std::endl;
       
    92 				return;
    91 				return;
    93 			}
    92 			}
    94 
    93 
    95 
    94 
    96 			if (event.type == YAML_STREAM_END_EVENT) {
    95 			if (event.type == YAML_STREAM_END_EVENT) {
    97 				std::cerr << "YAML_STREAM_END_EVENT" << std::endl;
       
    98 				yaml_event_delete(&event);
    96 				yaml_event_delete(&event);
    99 				break;
    97 				break;
   100 			} else if (event.type == YAML_STREAM_START_EVENT) {
    98 			} else if (event.type == YAML_STREAM_START_EVENT) {
   101 				std::cerr << "YAML_STREAM_START_EVENT" << std::endl;
       
   102 			} else if (event.type == YAML_NO_EVENT) {
    99 			} else if (event.type == YAML_NO_EVENT) {
   103 				std::cerr << "YAML_NO_EVENT" << std::endl;
       
   104 				current->add_child("null"); // TODO: null?
   100 				current->add_child("null"); // TODO: null?
   105 			} else if (event.type == YAML_DOCUMENT_START_EVENT) {
   101 			} else if (event.type == YAML_DOCUMENT_START_EVENT) {
   106 				std::cerr << "YAML_DOCUMENT_START_EVENT" << std::endl;
       
   107 			} else if (event.type == YAML_DOCUMENT_END_EVENT) {
   102 			} else if (event.type == YAML_DOCUMENT_END_EVENT) {
   108 				std::cerr << "YAML_DOCUMENT_END_EVENT" << std::endl;
       
   109 			} else if (event.type == YAML_ALIAS_EVENT) {
   103 			} else if (event.type == YAML_ALIAS_EVENT) {
   110 				std::cerr << "YAML_ALIAS_EVENT" << std::endl;
       
   111 				// TODO: alias?
   104 				// TODO: alias?
   112 			} else if (event.type == YAML_SCALAR_EVENT) {
   105 			} else if (event.type == YAML_SCALAR_EVENT) {
   113 				if (mode.back() == Mode::SEQUENCE) {
   106 				if (mode.back() == Mode::SEQUENCE) {
   114 					std::cerr << "YAML_SCALAR_EVENT: Mode::SEQUENCE: " << event.data.scalar.value << std::endl;
       
   115 					current->add_child(itemName)->add_child_text(y2x(event.data.scalar.value));
   107 					current->add_child(itemName)->add_child_text(y2x(event.data.scalar.value));
   116 				} else if (mode.back() == Mode::MAPPING) {
   108 				} else if (mode.back() == Mode::MAPPING) {
   117 					std::cerr << "YAML_SCALAR_EVENT: Mode::MAPPING: " << event.data.scalar.value << std::endl;
       
   118 					current = current->add_child(y2xname(event.data.scalar.value));
   109 					current = current->add_child(y2xname(event.data.scalar.value));
   119 					mode.push_back(Mode::MAP_KEY);
   110 					mode.push_back(Mode::MAP_KEY);
   120 				} else if (mode.back() == Mode::MAP_KEY) {
   111 				} else if (mode.back() == Mode::MAP_KEY) {
   121 					std::cerr << "YAML_SCALAR_EVENT: Mode::MAP_KEY: " << event.data.scalar.value << std::endl;
       
   122 					current->add_child_text(y2x(event.data.scalar.value));
   112 					current->add_child_text(y2x(event.data.scalar.value));
   123 					current = parentOrSelf(current);
   113 					current = parentOrSelf(current);
   124 					mode.pop_back();
   114 					mode.pop_back();
   125 				} else if (mode.back() == Mode::ROOT) {
   115 				} else if (mode.back() == Mode::ROOT) {
   126 					current->add_child_text(y2x(event.data.scalar.value));
   116 					current->add_child_text(y2x(event.data.scalar.value));
   127 				} else {
   117 				} else {
   128 					std::cerr << "YAML_SCALAR_EVENT: ???" << std::endl;
   118 					// TODO: process YAML_SCALAR_EVENT
   129 				}
   119 				}
   130 
   120 
   131 			} else if (event.type == YAML_SEQUENCE_START_EVENT) {
   121 			} else if (event.type == YAML_SEQUENCE_START_EVENT) {
   132 				std::cerr << "YAML_SEQUENCE_START_EVENT" << std::endl;
       
   133 				xmlpp::Element* parent = current->get_parent();
   122 				xmlpp::Element* parent = current->get_parent();
   134 				if (parent) {
   123 				if (parent) {
   135 					itemName = current->get_name();
   124 					itemName = current->get_name();
   136 					parent->remove_child(current);
   125 					parent->remove_child(current);
   137 					current = parent;
   126 					current = parent;
   139 					itemName = "item";
   128 					itemName = "item";
   140 				}
   129 				}
   141 				if (mode.back() == Mode::MAP_KEY) mode.pop_back();
   130 				if (mode.back() == Mode::MAP_KEY) mode.pop_back();
   142 				mode.push_back(Mode::SEQUENCE);
   131 				mode.push_back(Mode::SEQUENCE);
   143 			} else if (event.type == YAML_SEQUENCE_END_EVENT) {
   132 			} else if (event.type == YAML_SEQUENCE_END_EVENT) {
   144 				std::cerr << "YAML_SEQUENCE_END_EVENT" << std::endl;
       
   145 				mode.pop_back(); // TODO: assert sequence?
   133 				mode.pop_back(); // TODO: assert sequence?
   146 			} else if (event.type == YAML_MAPPING_START_EVENT) {
   134 			} else if (event.type == YAML_MAPPING_START_EVENT) {
   147 
   135 
   148 				if (mode.back() == Mode::ROOT) {
   136 				if (mode.back() == Mode::ROOT) {
   149 					std::cerr << "YAML_MAPPING_START_EVENT: Mode:ROOT" << std::endl;
       
   150 				} else if (mode.back() == Mode::SEQUENCE) {
   137 				} else if (mode.back() == Mode::SEQUENCE) {
   151 					std::cerr << "YAML_MAPPING_START_EVENT: Mode::SEQUENCE" << std::endl;
       
   152 					current = current->add_child(itemName);
   138 					current = current->add_child(itemName);
   153 				} else if (mode.back() == Mode::MAP_KEY) {
   139 				} else if (mode.back() == Mode::MAP_KEY) {
   154 					std::cerr << "YAML_MAPPING_START_EVENT: Mode::MAP_KEY" << std::endl;
       
   155 					mode.pop_back();
   140 					mode.pop_back();
   156 				} else {
   141 				} else {
   157 					std::cerr << "YAML_MAPPING_START_EVENT: Mode::?" << std::endl;
       
   158 					// TODO: map might be a key of another map → wrap/nest
   142 					// TODO: map might be a key of another map → wrap/nest
   159 				}
   143 				}
   160 
   144 
   161 				mode.push_back(Mode::MAPPING);
   145 				mode.push_back(Mode::MAPPING);
   162 			} else if (event.type == YAML_MAPPING_END_EVENT) {
   146 			} else if (event.type == YAML_MAPPING_END_EVENT) {
   163 				std::cerr << "YAML_MAPPING_END_EVENT" << std::endl;
       
   164 				current = parentOrSelf(current);
   147 				current = parentOrSelf(current);
   165 				mode.pop_back(); // TODO: assert map?
   148 				mode.pop_back(); // TODO: assert map?
   166 			} else {
   149 			} else {
   167 				std::cerr << "???" << std::endl;
   150 				// TODO: unsupported type?
   168 			}
   151 			}
   169 
   152 
   170 			yaml_event_delete(&event);
   153 			yaml_event_delete(&event);
   171 		}
   154 		}
   172 
   155