A slide's picture placeholder can hold text the author typed instead of an image, which PowerPoint displays. Impress dropped that text on import and wrote nothing at all for such a shape on save. To reproduce, type into a picture placeholder in PowerPoint, save, open the file and save it again: the text is gone from the shape, and the shape from the file. What a placeholder is now lives in the page's presentation object list, and what represents it follows what it holds: a graphic object for a picture, an SdrObjKind::OutlineText object while it holds text, the placeholder itself while it holds nothing. It changes over when a file states such text, when that text is deleted again and the prompt comes back, and when an image is put in. Text arriving another way, through the API, is caught by the new SdrPage::onEmptyPresObjFilled and switched at the next idle, so that route needs a spinning scheduler; what a save writes is right either way. An object in text edit is left to that edit, which is where it changes over: the idle pass walks every page, so it asks each object rather than trusting the one that asked for the pass - in a shared document another view holds it. That switch is the model's own and covered by no undo step - it answers for a document the API changed, not for anything the user did. What the file says about the shape travels with it both ways, the graphic items included, so an outline a picture placeholder is clipped to is still there when a picture arrives. It is not written while the placeholder holds text: the file says text box, and a text box states no geometry to clip a picture to. PPTX writes it as the placeholder it is, with the text it holds. ODF states the class of what represents it, so the placeholder's own class travels beside it as coext:placeholder-class, and a reader that ignores the extension sees an outline placeholder with the text. Signed-off-by: Mike Kaganski <mike.kaganski@collabora.com> Change-Id: I0f3353115e56d63a4158ebaeb5689689499894bb Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/9441 Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com> Tested-by: Jenkins CPCI <releng@collaboraoffice.com> (cherry picked from commit 7921401ae48188568e1016db00bd90256d666a6a) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/210329 Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org> Tested-by: Jenkins
ODF Import and Export Filter Logic
The main library "xo" contains the basic ODF import/export filter
implementation for most applications. The document is accessed
via its UNO API, which has the advantage that the same import/export
code can be used for text in all applications (from/to Writer/EditEngine).
The filter consumes/produces via SAX UNO API interface (implemented in
"sax"). Various bits of the ODF filters are also implemented in
applications, for example [git:sw/source/filter/xml].
There is a central list of all element or attribute names in
[git:include/xmloff/xmltoken.hxx]. The main class of the import filter
is SvXMLImport, and of the export filter SvXMLExport.
The Import filter maintains a stack of contexts for each element being read. There are many classes specific to particular elements, derived from SvXMLImportContext.
Note that for export several different versions of ODF are supported, with the default being the latest ODF version with "extensions", which means it may contain elements and attributes that are only in drafts of the specification or are not yet submitted for specification. Documents produced in the other (non-extended) ODF modes are supposed to be strictly conforming to the respective specification, i.e., only markup defined by the ODF specification is allowed.
There is another library "xof" built from the source/transform directory, which is the filter for the OpenOffice.org XML format. This legacy format is a predecessor of ODF and was the default in OpenOffice.org 1.x versions, which did not support ODF. This filter works as a SAX transformation from/to ODF, i.e., when importing a document the transform library reads the SAX events from the file and generates SAX events that are then consumed by the ODF import filter.
OpenOffice.org XML File Format
There is some stuff in the "dtd" directory which is most likely related to the OpenOffice.org XML format but is possibly outdated and obsolete.
Add New XML Tokens
When adding a new XML token, you need to add its entry in the following three files:
[git:include/xmloff/xmltoken.hxx][git:xmloff/source/core/xmltoken.cxx][git:xmloff/source/token/tokens.txt]