A c:legendEntry can give one legend entry its own text (c:txPr), as
decks do to make legend text white on a dark chart. It was never read,
so every entry drew in the legend's text. The chart model keeps each
entry's size, bold and colour (Chart::legend_entries); the reader
takes them from the entry's c:txPr, the legend draws each name, key
and row at its entry's size and in its weight and colour, and a chart
rebuilt after an edit writes them back before c:overlay, in schema
order. Entries that set none of the three are not kept.
Fixes#2067
* PPTX export: stop adding chart series once a group's caches pass a point budget
* address review: size chart exports from the caches each group writes
* address review: cut each chart data cache at a cap far above Excel's 32,000 points per series, so the first series is bounded without failing export
* PPTX: charge repeated chart decodes and sidecar copies to presentation-wide budgets
* address review: count all chart vectors and relationship strings; reject a chart that crosses the presentation limit
* address review: charge chart part names/content types, roll back rejected capture
* address review: bound chart decode work across rejected and repeated references, cache refused sidecar captures
* address review: keep a chart past the presentation chart limits as its original part and closure, so a save writes it back
* pptx: preserve SmartArt node text when dgm:cxnLst has no parent-child connections
* fix(pptx): apply unconnected-point SmartArt outline fallback when type="doc" point is absent
* fix(pptx): restrict SmartArt pt_order fallback to empty parOf graphs and preserve cached Picture/Connector children
* fix(pptx): convert default rect geometry to line for connectors in diagram drawings
* docs(pptx): note flat ptLst order fallback on dgm::outline
* PPTX export: index animation targets, cache a paragraph's build roles, serialize run properties once per text run
* address review: warn once when a by-paragraph build is truncated
The round trip now also checks the written presProps.xml: inside p:showPr, the extension uri and
p14:showMediaCtrls with its namespace declared on the element; the default writes nothing.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Parse each tags part once per import and cache in `Imp::tags_by_part`
- Cap total copied tags into the model at `MAX_TAG_BYTES` (64 MiB), charging each pair a fixed size_of::<(String, String)>() in addition to text
- Bound the cache: once `tags_capped` is set, return early before parsing or caching any subsequent part
- Tests covering deduplicated part copies, empty-tag pair budgets, and verifying unread tag parts are not parsed or cached after the budget is reached