LibreOffice Module writerperfect (master) 1
xmlfmt.cxx
Go to the documentation of this file.
1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/*
3 * This file is part of the LibreOffice project.
4 *
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 */
9
10#include "xmlfmt.hxx"
11
13#include "txtstyli.hxx"
14#include "xmlimp.hxx"
15
16#include <sal/log.hxx>
17
18using namespace com::sun::star;
19
20namespace writerperfect::exp
21{
23 : XMLImportContext(rImport)
24 , m_rParagraphStyles(eType == StyleType_AUTOMATIC ? GetImport().GetAutomaticParagraphStyles()
25 : GetImport().GetParagraphStyles())
26 , m_rTextStyles(eType == StyleType_AUTOMATIC ? GetImport().GetAutomaticTextStyles()
27 : GetImport().GetTextStyles())
28 , m_rCellStyles(eType == StyleType_AUTOMATIC ? GetImport().GetAutomaticCellStyles()
29 : GetImport().GetCellStyles())
30 , m_rColumnStyles(eType == StyleType_AUTOMATIC ? GetImport().GetAutomaticColumnStyles()
31 : GetImport().GetColumnStyles())
32 , m_rRowStyles(eType == StyleType_AUTOMATIC ? GetImport().GetAutomaticRowStyles()
33 : GetImport().GetRowStyles())
34 , m_rTableStyles(eType == StyleType_AUTOMATIC ? GetImport().GetAutomaticTableStyles()
35 : GetImport().GetTableStyles())
36 , m_rGraphicStyles(eType == StyleType_AUTOMATIC ? GetImport().GetAutomaticGraphicStyles()
37 : GetImport().GetGraphicStyles())
38 , m_rPageLayouts(GetImport().GetPageLayouts())
39 , m_rMasterStyles(GetImport().GetMasterStyles())
40{
41}
42
44 const OUString& rName, const css::uno::Reference<css::xml::sax::XAttributeList>& /*xAttribs*/)
45{
46 if (rName == "style:style" || rName == "style:page-layout" || rName == "style:master-page")
47 return new XMLStyleContext(GetImport(), *this);
48 return nullptr;
49}
50
51std::map<OUString, librevenge::RVNGPropertyList>& XMLStylesContext::GetCurrentParagraphStyles()
52{
53 return m_rParagraphStyles;
54}
55
56std::map<OUString, librevenge::RVNGPropertyList>& XMLStylesContext::GetCurrentTextStyles()
57{
58 return m_rTextStyles;
59}
60
61std::map<OUString, librevenge::RVNGPropertyList>& XMLStylesContext::GetCurrentCellStyles()
62{
63 return m_rCellStyles;
64}
65
66std::map<OUString, librevenge::RVNGPropertyList>& XMLStylesContext::GetCurrentColumnStyles()
67{
68 return m_rColumnStyles;
69}
70
71std::map<OUString, librevenge::RVNGPropertyList>& XMLStylesContext::GetCurrentRowStyles()
72{
73 return m_rRowStyles;
74}
75
76std::map<OUString, librevenge::RVNGPropertyList>& XMLStylesContext::GetCurrentTableStyles()
77{
78 return m_rTableStyles;
79}
80
81std::map<OUString, librevenge::RVNGPropertyList>& XMLStylesContext::GetCurrentGraphicStyles()
82{
83 return m_rGraphicStyles;
84}
85
86std::map<OUString, librevenge::RVNGPropertyList>& XMLStylesContext::GetCurrentPageLayouts()
87{
88 return m_rPageLayouts;
89}
90
91std::map<OUString, librevenge::RVNGPropertyList>& XMLStylesContext::GetCurrentMasterStyles()
92{
93 return m_rMasterStyles;
94}
95
96namespace
97{
99class XMLFontFaceContext : public XMLImportContext
100{
101public:
102 XMLFontFaceContext(XMLImport& rImport);
103 void SAL_CALL
104 startElement(const OUString& rName,
105 const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
106
108 CreateChildContext(const OUString& rName,
109 const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
110
111 OUString const& GetName() const { return maName; }
112
113private:
114 OUString maName;
115};
116
118class XMLFontFaceSrcContext : public XMLImportContext
119{
120public:
121 XMLFontFaceSrcContext(XMLImport& rImport, XMLFontFaceContext& rFontFace);
122
124 CreateChildContext(const OUString& rName,
125 const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
126
127private:
128 XMLFontFaceContext& mrFontFace;
129};
130
132class XMLFontFaceUriContext : public XMLImportContext
133{
134public:
135 XMLFontFaceUriContext(XMLImport& rImport, XMLFontFaceContext const& rFontFace);
136 void SAL_CALL
137 startElement(const OUString& rName,
138 const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
139 void SAL_CALL endElement(const OUString& rName) override;
140
142 CreateChildContext(const OUString& rName,
143 const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
144
145 librevenge::RVNGPropertyList& GetPropertyList() { return maPropertyList; }
146
147private:
148 librevenge::RVNGPropertyList maPropertyList;
150};
151
153class XMLFontFaceFormatContext : public XMLImportContext
154{
155public:
156 XMLFontFaceFormatContext(XMLImport& rImport, XMLFontFaceUriContext& rFontFaceUri);
157 void SAL_CALL
158 startElement(const OUString& rName,
159 const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs) override;
160
161private:
162 XMLFontFaceUriContext& mrFontFaceUri;
163};
164}
165
166XMLFontFaceFormatContext::XMLFontFaceFormatContext(XMLImport& rImport,
167 XMLFontFaceUriContext& rFontFaceUri)
168 : XMLImportContext(rImport)
169 , mrFontFaceUri(rFontFaceUri)
170{
171}
172
173void XMLFontFaceFormatContext::startElement(
174 const OUString& /*rName*/, const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs)
175{
176 for (sal_Int16 i = 0; i < xAttribs->getLength(); ++i)
177 {
178 const OUString& rAttributeName = xAttribs->getNameByIndex(i);
179 const OUString& rAttributeValue = xAttribs->getValueByIndex(i);
180 if (rAttributeName == "svg:string")
181 {
182 OString aAttributeValueU8 = OUStringToOString(rAttributeValue, RTL_TEXTENCODING_UTF8);
183 mrFontFaceUri.GetPropertyList().insert("librevenge:mime-type",
184 aAttributeValueU8.getStr());
185 }
186 }
187}
188
189XMLFontFaceUriContext::XMLFontFaceUriContext(XMLImport& rImport,
190 XMLFontFaceContext const& rFontFace)
191 : XMLImportContext(rImport)
192{
193 OString aNameU8 = OUStringToOString(rFontFace.GetName(), RTL_TEXTENCODING_UTF8);
194 maPropertyList.insert("librevenge:name", aNameU8.getStr());
195}
196
197void XMLFontFaceUriContext::startElement(
198 const OUString& /*rName*/, const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs)
199{
200 for (sal_Int16 i = 0; i < xAttribs->getLength(); ++i)
201 {
202 const OUString& rAttributeName = xAttribs->getNameByIndex(i);
203 const OUString& rAttributeValue = xAttribs->getValueByIndex(i);
204 if (rAttributeName == "loext:font-style")
205 {
206 OString aAttributeValueU8 = OUStringToOString(rAttributeValue, RTL_TEXTENCODING_UTF8);
207 maPropertyList.insert("librevenge:font-style", aAttributeValueU8.getStr());
208 }
209 else if (rAttributeName == "loext:font-weight")
210 {
211 OString aAttributeValueU8 = OUStringToOString(rAttributeValue, RTL_TEXTENCODING_UTF8);
212 maPropertyList.insert("librevenge:font-weight", aAttributeValueU8.getStr());
213 }
214 }
215}
216
217void XMLFontFaceUriContext::endElement(const OUString& /*rName*/)
218{
219 if (mxBinaryData.is())
220 maPropertyList.insert("office:binary-data", mxBinaryData->getBinaryData());
221 GetImport().GetGenerator().defineEmbeddedFont(maPropertyList);
222}
223
224rtl::Reference<XMLImportContext> XMLFontFaceUriContext::CreateChildContext(
225 const OUString& rName, const css::uno::Reference<css::xml::sax::XAttributeList>& /*xAttribs*/)
226{
227 if (rName == "office:binary-data")
228 {
229 mxBinaryData = new XMLBase64ImportContext(GetImport());
230 return mxBinaryData;
231 }
232 if (rName == "svg:font-face-format")
233 return new XMLFontFaceFormatContext(GetImport(), *this);
234
235 SAL_WARN("writerperfect", "XMLFontFaceUriContext::CreateChildContext: unhandled " << rName);
236 return nullptr;
237}
238
239XMLFontFaceSrcContext::XMLFontFaceSrcContext(XMLImport& rImport, XMLFontFaceContext& rFontFace)
240 : XMLImportContext(rImport)
241 , mrFontFace(rFontFace)
242{
243}
244
245rtl::Reference<XMLImportContext> XMLFontFaceSrcContext::CreateChildContext(
246 const OUString& rName, const css::uno::Reference<css::xml::sax::XAttributeList>& /*xAttribs*/)
247{
248 if (rName == "svg:font-face-uri")
249 return new XMLFontFaceUriContext(GetImport(), mrFontFace);
250 SAL_WARN("writerperfect", "XMLFontFaceSrcContext::CreateChildContext: unhandled " << rName);
251 return nullptr;
252}
253
254XMLFontFaceContext::XMLFontFaceContext(XMLImport& rImport)
255 : XMLImportContext(rImport)
256{
257}
258
259void XMLFontFaceContext::startElement(
260 const OUString& /*rName*/, const css::uno::Reference<css::xml::sax::XAttributeList>& xAttribs)
261{
262 for (sal_Int16 i = 0; i < xAttribs->getLength(); ++i)
263 {
264 const OUString& rAttributeName = xAttribs->getNameByIndex(i);
265 const OUString& rAttributeValue = xAttribs->getValueByIndex(i);
266 if (rAttributeName == "style:name")
267 maName = rAttributeValue;
268 }
269}
270
271rtl::Reference<XMLImportContext> XMLFontFaceContext::CreateChildContext(
272 const OUString& rName, const css::uno::Reference<css::xml::sax::XAttributeList>& /*xAttribs*/)
273{
274 if (rName == "svg:font-face-src")
275 return new XMLFontFaceSrcContext(GetImport(), *this);
276 SAL_WARN("writerperfect", "XMLFontFaceContext::CreateChildContext: unhandled " << rName);
277 return nullptr;
278}
279
280XMLFontFaceDeclsContext::XMLFontFaceDeclsContext(XMLImport& rImport)
281 : XMLImportContext(rImport)
282{
283}
284
286 const OUString& rName, const css::uno::Reference<css::xml::sax::XAttributeList>& /*xAttribs*/)
287{
288 if (rName == "style:font-face")
289 return new XMLFontFaceContext(GetImport());
290 return nullptr;
291}
292
293} // namespace writerperfect::exp
294
295/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
rtl::Reference< XMLImportContext > CreateChildContext(const OUString &rName, const css::uno::Reference< css::xml::sax::XAttributeList > &xAttribs) override
Definition: xmlfmt.cxx:285
Base class for a handler of a single XML element during ODF -> librevenge conversion.
Definition: xmlictxt.hxx:23
ODT export feeds this class to make librevenge calls.
Definition: xmlimp.hxx:69
Handler for <style:style>.
Definition: txtstyli.hxx:22
std::map< OUString, librevenge::RVNGPropertyList > & m_rColumnStyles
Definition: xmlfmt.hxx:52
rtl::Reference< XMLImportContext > CreateChildContext(const OUString &rName, const css::uno::Reference< css::xml::sax::XAttributeList > &xAttribs) override
Definition: xmlfmt.cxx:43
std::map< OUString, librevenge::RVNGPropertyList > & GetCurrentPageLayouts()
Definition: xmlfmt.cxx:86
std::map< OUString, librevenge::RVNGPropertyList > & m_rGraphicStyles
Definition: xmlfmt.hxx:55
std::map< OUString, librevenge::RVNGPropertyList > & GetCurrentColumnStyles()
Definition: xmlfmt.cxx:66
std::map< OUString, librevenge::RVNGPropertyList > & GetCurrentRowStyles()
Definition: xmlfmt.cxx:71
std::map< OUString, librevenge::RVNGPropertyList > & m_rParagraphStyles
Definition: xmlfmt.hxx:49
std::map< OUString, librevenge::RVNGPropertyList > & m_rMasterStyles
Definition: xmlfmt.hxx:57
std::map< OUString, librevenge::RVNGPropertyList > & GetCurrentMasterStyles()
Definition: xmlfmt.cxx:91
std::map< OUString, librevenge::RVNGPropertyList > & m_rPageLayouts
Definition: xmlfmt.hxx:56
std::map< OUString, librevenge::RVNGPropertyList > & GetCurrentTableStyles()
Definition: xmlfmt.cxx:76
std::map< OUString, librevenge::RVNGPropertyList > & m_rCellStyles
Definition: xmlfmt.hxx:51
std::map< OUString, librevenge::RVNGPropertyList > & GetCurrentGraphicStyles()
Definition: xmlfmt.cxx:81
std::map< OUString, librevenge::RVNGPropertyList > & GetCurrentCellStyles()
Definition: xmlfmt.cxx:61
std::map< OUString, librevenge::RVNGPropertyList > & GetCurrentParagraphStyles()
Definition: xmlfmt.cxx:51
std::map< OUString, librevenge::RVNGPropertyList > & GetCurrentTextStyles()
Definition: xmlfmt.cxx:56
std::map< OUString, librevenge::RVNGPropertyList > & m_rRowStyles
Definition: xmlfmt.hxx:53
XMLStylesContext(XMLImport &rImport, StyleType eType)
Definition: xmlfmt.cxx:22
std::map< OUString, librevenge::RVNGPropertyList > & m_rTextStyles
Definition: xmlfmt.hxx:50
std::map< OUString, librevenge::RVNGPropertyList > & m_rTableStyles
Definition: xmlfmt.hxx:54
virtual OUString GetName() const override
DocumentType eType
#define SAL_WARN(area, stream)
int i
OString OUStringToOString(std::u16string_view str, ConnectionSettings const *settings)
rtl::Reference< XMLBase64ImportContext > mxBinaryData
Definition: xmlfmt.cxx:149
librevenge::RVNGPropertyList maPropertyList
Definition: xmlfmt.cxx:148
XMLFontFaceUriContext & mrFontFaceUri
Definition: xmlfmt.cxx:162
XMLFontFaceContext & mrFontFace
Definition: xmlfmt.cxx:128
OUString maName
Definition: xmlfmt.cxx:114