@@ -90,22 +90,6 @@ void parse_sheet_cell_children(ElementRegistry ®istry,
9090 parse_any_element_children (registry, context, parent_id, node);
9191}
9292
93- void parse_frame_children (ElementRegistry ®istry,
94- const ParseContext &context,
95- const ElementIdentifier parent_id,
96- const pugi::xml_node node) {
97- (void )registry;
98- (void )context;
99- (void )parent_id;
100- if (const pugi::xml_node image_node =
101- node.child (" xdr:pic" ).child (" xdr:blipFill" ).child (" a:blip" )) {
102- (void )image_node;
103- // TODO
104- // auto [image, _] = parse_any_element_tree(registry, context, image_node);
105- // registry.append_child(parent_id, image);
106- }
107- }
108-
10993std::tuple<ElementIdentifier, pugi::xml_node>
11094parse_sheet_element (ElementRegistry ®istry, const ParseContext &context,
11195 const pugi::xml_node node) {
@@ -114,6 +98,9 @@ parse_sheet_element(ElementRegistry ®istry, const ParseContext &context,
11498 }
11599
116100 const auto &[element_id, _, sheet] = registry.create_sheet_element (node);
101+ registry.attach_element_relations (element_id,
102+ context.get_document_relations (),
103+ context.get_document_path ());
117104
118105 for (const pugi::xml_node col_node : node.child (" cols" ).children (" col" )) {
119106 const std::uint32_t min = col_node.attribute (" min" ).as_uint () - 1 ;
@@ -158,9 +145,14 @@ parse_sheet_element(ElementRegistry ®istry, const ParseContext &context,
158145 const auto &[drawing_xml, drawing_relations] =
159146 context.get_documents_and_relations ().at (drawing_path);
160147
148+ const ParseContext drawing_context (drawing_path, drawing_relations,
149+ context.get_documents_and_relations (),
150+ context.get_shared_strings ());
151+
161152 for (const pugi::xml_node shape_node :
162153 drawing_xml.document_element ().children ()) {
163- auto [shape, _] = parse_any_element_tree (registry, context, shape_node);
154+ const auto [shape, _] =
155+ parse_any_element_tree (registry, drawing_context, shape_node);
164156 if (shape == null_element_id) {
165157 continue ;
166158 }
@@ -207,6 +199,30 @@ parse_text_element(ElementRegistry ®istry, const ParseContext &context,
207199 return {element_id, last.next_sibling ()};
208200}
209201
202+ std::tuple<ElementIdentifier, pugi::xml_node>
203+ parse_frame_element (ElementRegistry ®istry, const ParseContext &context,
204+ const pugi::xml_node node) {
205+ if (!node) {
206+ return {null_element_id, pugi::xml_node ()};
207+ }
208+
209+ const auto &[element_id, _] =
210+ registry.create_element (ElementType::frame, node);
211+ registry.attach_element_relations (element_id,
212+ context.get_document_relations (),
213+ context.get_document_path ());
214+
215+ if (const pugi::xml_node image_node =
216+ node.child (" xdr:pic" ).child (" xdr:blipFill" ).child (" a:blip" )) {
217+ auto [image, _] =
218+ parse_element_tree (registry, context, ElementType::image, image_node,
219+ parse_any_element_children);
220+ registry.append_child (element_id, image);
221+ }
222+
223+ return {element_id, node.next_sibling ()};
224+ }
225+
210226std::tuple<ElementIdentifier, pugi::xml_node>
211227parse_any_element_tree (ElementRegistry ®istry, const ParseContext &context,
212228 const pugi::xml_node node) {
@@ -229,9 +245,7 @@ parse_any_element_tree(ElementRegistry ®istry, const ParseContext &context,
229245 {" r" , create_default_tree_parser (ElementType::span)},
230246 {" t" , parse_text_element},
231247 {" v" , parse_text_element},
232- {" xdr:twoCellAnchor" ,
233- create_default_tree_parser (ElementType::frame, parse_frame_children)},
234- };
248+ {" xdr:twoCellAnchor" , parse_frame_element}};
235249
236250 if (const auto constructor_it = parser_table.find (node.name ());
237251 constructor_it != std::end (parser_table)) {
0 commit comments