committed

ZDS 0009: The ODP Reader

Category Format Record
Intended Status Committed
Created 2026-08-06
Last Updated 2026-08-08
Authors Zen Contributors <team@insan.ai>
Discussion Mapping, omissions, and round-trip expectations for the ODP reader

Abstract

The format record for zenfmt_odp (ai.insan.zenfmt.odp). An OpenDocument presentation projects exactly like PPTX: each draw:page becomes a level-two heading followed by the text of its frames, and speaker notes append as a container classed notes. As with PPTX, the reader says loudly — odp.presentation-projection, a warning on every conversion — that a slide deck loses the most in this projection.

Mapping

SourceTree resultFacets
draw:pageOne slide in document order.The zero-based page index is the surface_index of every layout facet on that slide.
Frame classed title (presentation:class)Its first paragraph is the slide’s heading (level 2). Slides without a title frame fall back to the page’s draw:name; empty slides still contribute their heading.LayoutFacet (surface slide) from the frame’s svg:x/svg:y/svg:width/svg:height, converted exactly to EMU (cm 360000, mm 36000, in 914400, pt 12700, pc 152400, px 9525) and attached to the heading. Frames without geometry attach none; the synthetic fallback heading has no frame and attaches none.
Other frames’ text:pParagraphs, in frame order.LayoutFacet from the frame’s geometry, attached to the frame’s first emitted block.
text:spanCharacter styles resolved through office:automatic-styles and styles.xml with style:parent-style-name chains (16 hops), exactly the ODT rules: bold weight → strong, italic → emphasis, and the rest of the canonical nesting order.none.
text:alink with the xlink:href target.none.
text:listlist; ordered when the list style’s first level is text:list-level-style-number, as in ODT.LayoutFacet from the enclosing frame, when the list is the frame’s first block.
table:table inside a frameA table, streamed as in the ODT reader. Every row lands in table_body — presentations have no header semantics — unless the deck declares table:table-header-rows, which maps to table_head. table:covered-table-cell folds into its originating cell and table:number-columns-spanned carries as the cell’s column span.LayoutFacet from the enclosing frame, when the table is the frame’s first block.
presentation:notesA container with class notes appended after the slide’s frames.none.
office:annotationDropped with odp.annotations-dropped.none.

Deliberate omissions

WhatWhy
Positioning, sizes, z-order, rotationA linear document has no spatial layout; this is the projection the warning names.
Animations, transitions, timingsBehavior, not content.
Images, charts, media, non-text shapesDropped; the projection warning covers them. Carrying images is future work shared with the PPTX reader.
Master pages and layout inheritanceSlide masters carry design, not content; placeholder text is never document text.
Presenter console settings, presentation:settingsTooling state.

Round-trip expectations

None: ODP is read-only and no preservation namespace is written. The projection is deliberately lossy and the loss is announced on every conversion; a Markdown-to-slides authoring path is a different feature with its own record.

Security

The shared zenfmt_ooxml archive limits and the DTD-free XML parser apply unchanged. The frame machine is the same bounded, non-recursive design as the ODT reader: a 256-frame stack and skipElement for subtrees the mapping drops.

References

  • ZDS 0002, Reading the Office Formats.
  • ZDS 0006, The ODT Reader (style resolution shared with this reader).
  • ZDS 0007, The PPTX Reader (the projection conventions).
  • OASIS OpenDocument v1.3 Part 3, draw:* and presentation:*.