| ODT and ODP text is read from content.xml only, from text:p and text:h | Read from the code | superdocuments/src/document.rs:516 | odt() matches Start events for text:p and text:h, collects Text events while active, and writes each paragraph on its End event. No other element is matched. |
| Every ODT heading is written as '## ' whatever its outline level | Read from the code | superdocuments/src/document.rs:533 | The End arm writes '## ' only when the element is text:h. text:outline-level and styles.xml are not referenced anywhere in src/document.rs. |
| ODS sheets become '## <name>' sections followed by a Markdown table | Read from the code | superdocuments/src/document.rs:611 | The table:table End arm writes the heading and markdown_table(rows). The name comes from table:name at :570. |
| Empty repeated cells are expanded up to 16,384 copies; non-empty repeated cells are read once | Read from the code | superdocuments/src/document.rs:581 | Only the Empty table-cell arm calls odf_repeat (capped with .min(16_384) at :633). The Start arm pushes one cell at its End. |
| Package bounds are 4,096 entries, 32 MiB per entry and 128 MiB total | Read from the code | superdocuments/src/document.rs:12 | MAX_ENTRY, MAX_TOTAL and MAX_ENTRIES constants at :12-14. archive() checks entry count and declared sizes at :27-49. |
| Spaces, tabs and line breaks in ODF text are not emitted | Read from the code | superdocuments/src/document.rs:524 | text:s, text:tab and text:line-break are empty elements. The odt() match has no Empty arm, so they contribute no text. |
| ODS cell value attributes are read in a fixed order | Read from the code | superdocuments/src/document.rs:636 | odf_cell_value returns the first present attribute of office:string-value, office:value, office:date-value, office:time-value, office:boolean-value. |
| convert_bytes routes odt and odp to odt(), ods to ods(), and rejects other extensions | Read from the code | superdocuments/src/document.rs:849 | The dispatch matches odt | odp to odt(), ods to ods(). fodt is not in the match. Unknown extensions return 'unsupported document extension'. |
| webfold convert sends odt, ods and odp to superdocuments | Read from the code | webfold/src/cli/document.rs:130 | markdown_source tests the extension list and calls webfold::document::convert_path, which calls superdocuments::document::convert_bytes (webfold src/document.rs:126). The CLI usage is in webfold/src/main.rs:214. |
| The ODF test covers the heading, paragraph, sheet and presentation cases | Covered by a test | superdocuments/src/document.rs:2025 | office_packages_convert_through_public_api asserts that odt gives '## Title\n\nBody', that an ods cell of 42 gives a row containing '| 42 |', and that odp contains 'Body'. Not run. |
| The sparse-column spreadsheet test covers empty-cell repeats | Covered by a test | superdocuments/src/document.rs:2016 | spreadsheet_cells_preserve_sparse_columns. Named in the repo; not run. |
| A numeric ODS cell with a value attribute and display text is read once, not twice, in the superdocuments revision Webfold pins | Covered by a test | superdocuments/src/document.rs, test ods_cell_with_a_value_attribute_and_display_text_is_not_doubled | Run on 2026-11-07: failed before the change with '| 4242 | Name | 7.57.50 |' and passes after it; the library suite is 375 passed, 0 failed, 1 ignored. The test is in the superdocuments revision Webfold pins (68c216f). |