Skip to content

Commit c482b1c

Browse files
committed
multiple fixes
1 parent 3437e15 commit c482b1c

14 files changed

+354
-156
lines changed

src/odr/document_element.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,8 @@ template <typename T> class ElementBase : public Element {
243243
const ExtendedElementIdentifier identifier, const T *adapter2)
244244
: Element(adapter, identifier), m_adapter2{adapter2} {}
245245

246+
explicit operator bool() const { return exists_(); }
247+
246248
protected:
247249
const T *m_adapter2{nullptr};
248250

src/odr/internal/odf/odf_document.cpp

Lines changed: 107 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -194,103 +194,178 @@ class ElementAdapter final : public abstract::ElementAdapter,
194194
}
195195

196196
[[nodiscard]] const TextRootAdapter *
197-
text_root_adapter(const ExtendedElementIdentifier) const override {
197+
text_root_adapter(const ExtendedElementIdentifier element_id) const override {
198+
if (m_registry->element(element_id).type != ElementType::root) {
199+
return nullptr;
200+
}
198201
return this;
199202
}
200203
[[nodiscard]] const SlideAdapter *
201-
slide_adapter(const ExtendedElementIdentifier) const override {
204+
slide_adapter(const ExtendedElementIdentifier element_id) const override {
205+
if (m_registry->element(element_id).type != ElementType::slide) {
206+
return nullptr;
207+
}
202208
return this;
203209
}
204210
[[nodiscard]] const PageAdapter *
205-
page_adapter(const ExtendedElementIdentifier) const override {
211+
page_adapter(const ExtendedElementIdentifier element_id) const override {
212+
if (m_registry->element(element_id).type != ElementType::page) {
213+
return nullptr;
214+
}
206215
return this;
207216
}
208217
[[nodiscard]] const SheetAdapter *
209-
sheet_adapter(const ExtendedElementIdentifier) const override {
218+
sheet_adapter(const ExtendedElementIdentifier element_id) const override {
219+
if (m_registry->element(element_id).type != ElementType::sheet) {
220+
return nullptr;
221+
}
210222
return this;
211223
}
212-
[[nodiscard]] const SheetColumnAdapter *
213-
sheet_column_adapter(const ExtendedElementIdentifier) const override {
224+
[[nodiscard]] const SheetColumnAdapter *sheet_column_adapter(
225+
const ExtendedElementIdentifier element_id) const override {
226+
if (m_registry->element(element_id).type != ElementType::sheet_column) {
227+
return nullptr;
228+
}
214229
return this;
215230
}
216231
[[nodiscard]] const SheetRowAdapter *
217-
sheet_row_adapter(const ExtendedElementIdentifier) const override {
232+
sheet_row_adapter(const ExtendedElementIdentifier element_id) const override {
233+
if (m_registry->element(element_id).type != ElementType::sheet_row) {
234+
return nullptr;
235+
}
218236
return this;
219237
}
220-
[[nodiscard]] const SheetCellAdapter *
221-
sheet_cell_adapter(const ExtendedElementIdentifier) const override {
238+
[[nodiscard]] const SheetCellAdapter *sheet_cell_adapter(
239+
const ExtendedElementIdentifier element_id) const override {
240+
if (m_registry->element(element_id).type != ElementType::sheet_cell) {
241+
return nullptr;
242+
}
222243
return this;
223244
}
224-
[[nodiscard]] const MasterPageAdapter *
225-
master_page_adapter(const ExtendedElementIdentifier) const override {
245+
[[nodiscard]] const MasterPageAdapter *master_page_adapter(
246+
const ExtendedElementIdentifier element_id) const override {
247+
if (m_registry->element(element_id).type != ElementType::page) {
248+
return nullptr;
249+
}
226250
return this;
227251
}
228-
[[nodiscard]] const LineBreakAdapter *
229-
line_break_adapter(const ExtendedElementIdentifier) const override {
252+
[[nodiscard]] const LineBreakAdapter *line_break_adapter(
253+
const ExtendedElementIdentifier element_id) const override {
254+
if (m_registry->element(element_id).type != ElementType::line_break) {
255+
return nullptr;
256+
}
230257
return this;
231258
}
232259
[[nodiscard]] const ParagraphAdapter *
233-
paragraph_adapter(const ExtendedElementIdentifier) const override {
260+
paragraph_adapter(const ExtendedElementIdentifier element_id) const override {
261+
if (m_registry->element(element_id).type != ElementType::paragraph) {
262+
return nullptr;
263+
}
234264
return this;
235265
}
236266
[[nodiscard]] const SpanAdapter *
237-
span_adapter(const ExtendedElementIdentifier) const override {
267+
span_adapter(const ExtendedElementIdentifier element_id) const override {
268+
if (m_registry->element(element_id).type != ElementType::span) {
269+
return nullptr;
270+
}
238271
return this;
239272
}
240273
[[nodiscard]] const TextAdapter *
241-
text_adapter(const ExtendedElementIdentifier) const override {
274+
text_adapter(const ExtendedElementIdentifier element_id) const override {
275+
if (m_registry->element(element_id).type != ElementType::text) {
276+
return nullptr;
277+
}
242278
return this;
243279
}
244280
[[nodiscard]] const LinkAdapter *
245-
link_adapter(const ExtendedElementIdentifier) const override {
281+
link_adapter(const ExtendedElementIdentifier element_id) const override {
282+
if (m_registry->element(element_id).type != ElementType::link) {
283+
return nullptr;
284+
}
246285
return this;
247286
}
248287
[[nodiscard]] const BookmarkAdapter *
249-
bookmark_adapter(const ExtendedElementIdentifier) const override {
288+
bookmark_adapter(const ExtendedElementIdentifier element_id) const override {
289+
if (m_registry->element(element_id).type != ElementType::bookmark) {
290+
return nullptr;
291+
}
250292
return this;
251293
}
252294
[[nodiscard]] const ListItemAdapter *
253-
list_item_adapter(const ExtendedElementIdentifier) const override {
295+
list_item_adapter(const ExtendedElementIdentifier element_id) const override {
296+
if (m_registry->element(element_id).type != ElementType::list_item) {
297+
return nullptr;
298+
}
254299
return this;
255300
}
256301
[[nodiscard]] const TableAdapter *
257-
table_adapter(const ExtendedElementIdentifier) const override {
302+
table_adapter(const ExtendedElementIdentifier element_id) const override {
303+
if (m_registry->element(element_id).type != ElementType::table) {
304+
return nullptr;
305+
}
258306
return this;
259307
}
260-
[[nodiscard]] const TableColumnAdapter *
261-
table_column_adapter(const ExtendedElementIdentifier) const override {
308+
[[nodiscard]] const TableColumnAdapter *table_column_adapter(
309+
const ExtendedElementIdentifier element_id) const override {
310+
if (m_registry->element(element_id).type != ElementType::table_column) {
311+
return nullptr;
312+
}
262313
return this;
263314
}
264315
[[nodiscard]] const TableRowAdapter *
265-
table_row_adapter(const ExtendedElementIdentifier) const override {
316+
table_row_adapter(const ExtendedElementIdentifier element_id) const override {
317+
if (m_registry->element(element_id).type != ElementType::table_row) {
318+
return nullptr;
319+
}
266320
return this;
267321
}
268-
[[nodiscard]] const TableCellAdapter *
269-
table_cell_adapter(const ExtendedElementIdentifier) const override {
322+
[[nodiscard]] const TableCellAdapter *table_cell_adapter(
323+
const ExtendedElementIdentifier element_id) const override {
324+
if (m_registry->element(element_id).type != ElementType::table_cell) {
325+
return nullptr;
326+
}
270327
return this;
271328
}
272329
[[nodiscard]] const FrameAdapter *
273-
frame_adapter(const ExtendedElementIdentifier) const override {
330+
frame_adapter(const ExtendedElementIdentifier element_id) const override {
331+
if (m_registry->element(element_id).type != ElementType::frame) {
332+
return nullptr;
333+
}
274334
return this;
275335
}
276336
[[nodiscard]] const RectAdapter *
277-
rect_adapter(const ExtendedElementIdentifier) const override {
337+
rect_adapter(const ExtendedElementIdentifier element_id) const override {
338+
if (m_registry->element(element_id).type != ElementType::rect) {
339+
return nullptr;
340+
}
278341
return this;
279342
}
280343
[[nodiscard]] const LineAdapter *
281-
line_adapter(const ExtendedElementIdentifier) const override {
344+
line_adapter(const ExtendedElementIdentifier element_id) const override {
345+
if (m_registry->element(element_id).type != ElementType::line) {
346+
return nullptr;
347+
}
282348
return this;
283349
}
284350
[[nodiscard]] const CircleAdapter *
285-
circle_adapter(const ExtendedElementIdentifier) const override {
351+
circle_adapter(const ExtendedElementIdentifier element_id) const override {
352+
if (m_registry->element(element_id).type != ElementType::circle) {
353+
return nullptr;
354+
}
286355
return this;
287356
}
288-
[[nodiscard]] const CustomShapeAdapter *
289-
custom_shape_adapter(const ExtendedElementIdentifier) const override {
357+
[[nodiscard]] const CustomShapeAdapter *custom_shape_adapter(
358+
const ExtendedElementIdentifier element_id) const override {
359+
if (m_registry->element(element_id).type != ElementType::custom_shape) {
360+
return nullptr;
361+
}
290362
return this;
291363
}
292364
[[nodiscard]] const ImageAdapter *
293-
image_adapter(const ExtendedElementIdentifier) const override {
365+
image_adapter(const ExtendedElementIdentifier element_id) const override {
366+
if (m_registry->element(element_id).type != ElementType::image) {
367+
return nullptr;
368+
}
294369
return this;
295370
}
296371

src/odr/internal/odf/odf_element_registry.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -108,10 +108,6 @@ void ElementRegistry::append_child(const ExtendedElementIdentifier parent_id,
108108
element(parent_id).last_child_id);
109109

110110
element(child_id).parent_id = parent_id;
111-
element(child_id).first_child_id = null_element_id;
112-
element(child_id).last_child_id = null_element_id;
113-
element(child_id).previous_sibling_id = previous_sibling_id.element_id();
114-
element(child_id).next_sibling_id = null_element_id;
115111

116112
if (element(parent_id).first_child_id == null_element_id) {
117113
element(parent_id).first_child_id = child_id.element_id();

src/odr/internal/odf/odf_parser.cpp

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,9 @@ parse_text_element(ElementRegistry &registry, const pugi::xml_node first) {
8181
}
8282

8383
const ExtendedElementIdentifier element_id = registry.create_element();
84+
ElementRegistry::Element &element = registry.element(element_id);
85+
element.type = ElementType::text;
86+
element.node = first;
8487
auto &[last] = registry.create_text_element(element_id);
8588

8689
for (last = first; is_text_node(last.next_sibling());
@@ -97,6 +100,9 @@ parse_table_row(ElementRegistry &registry, const pugi::xml_node node) {
97100
}
98101

99102
const ExtendedElementIdentifier element_id = registry.create_element();
103+
ElementRegistry::Element &element = registry.element(element_id);
104+
element.type = ElementType::table_row;
105+
element.node = node;
100106

101107
for (const pugi::xml_node cell_node : node.children()) {
102108
// TODO log warning if repeated
@@ -114,6 +120,10 @@ parse_table(ElementRegistry &registry, const pugi::xml_node node) {
114120
}
115121

116122
const ExtendedElementIdentifier element_id = registry.create_element();
123+
ElementRegistry::Element &element = registry.element(element_id);
124+
element.type = ElementType::table;
125+
element.node = node;
126+
registry.create_table_element(element_id);
117127

118128
// TODO inflate table first?
119129

@@ -143,6 +153,9 @@ parse_sheet(ElementRegistry &registry, const pugi::xml_node node) {
143153
}
144154

145155
const ExtendedElementIdentifier element_id = registry.create_element();
156+
ElementRegistry::Element &element = registry.element(element_id);
157+
element.type = ElementType::sheet;
158+
element.node = node;
146159
ElementRegistry::Sheet &sheet = registry.create_sheet_element(element_id);
147160

148161
TableCursor cursor;
@@ -221,7 +234,8 @@ void parse_presentation_children(ElementRegistry &registry,
221234
const ExtendedElementIdentifier root_id,
222235
const pugi::xml_node node) {
223236
for (const pugi::xml_node child_node : node.children("draw:page")) {
224-
auto [child_id, _] = parse_any_element_tree(registry, child_node);
237+
auto [child_id, _] = parse_element_tree(
238+
registry, ElementType::slide, child_node, parse_any_element_children);
225239
registry.append_child(root_id, child_id);
226240
}
227241
}
@@ -239,7 +253,8 @@ void parse_drawing_children(ElementRegistry &registry,
239253
const ExtendedElementIdentifier root_id,
240254
const pugi::xml_node node) {
241255
for (const pugi::xml_node child_node : node.children("draw:page")) {
242-
auto [child_id, _] = parse_any_element_tree(registry, child_node);
256+
auto [child_id, _] = parse_element_tree(
257+
registry, ElementType::page, child_node, parse_any_element_children);
243258
registry.append_child(root_id, child_id);
244259
}
245260
}

0 commit comments

Comments
 (0)