LibreOffice Module writerperfect (master) 1
xmlmetai.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 "xmlmetai.hxx"
11
12#include "xmlimp.hxx"
13
14using namespace com::sun::star;
15
16namespace writerperfect::exp
17{
18namespace
19{
21class XMLDcTitleContext : public XMLImportContext
22{
23public:
24 XMLDcTitleContext(XMLImport& rImport, XMLMetaDocumentContext& rMeta);
25
26 void SAL_CALL characters(const OUString& rChars) override;
27
28private:
29 XMLMetaDocumentContext& mrMeta;
30};
31}
32
33XMLDcTitleContext::XMLDcTitleContext(XMLImport& rImport, XMLMetaDocumentContext& rMeta)
34 : XMLImportContext(rImport)
35 , mrMeta(rMeta)
36{
37}
38
39void XMLDcTitleContext::characters(const OUString& rChars)
40{
41 OString sCharU8 = OUStringToOString(rChars, RTL_TEXTENCODING_UTF8);
42 if (!mrMeta.GetPropertyList()["dc:title"])
43 mrMeta.GetPropertyList().insert("dc:title", librevenge::RVNGString(sCharU8.getStr()));
44}
45
46namespace
47{
49class XMLDcLanguageContext : public XMLImportContext
50{
51public:
52 XMLDcLanguageContext(XMLImport& rImport, XMLMetaDocumentContext& rMeta);
53
54 void SAL_CALL characters(const OUString& rChars) override;
55
56private:
57 XMLMetaDocumentContext& mrMeta;
58};
59}
60
61XMLDcLanguageContext::XMLDcLanguageContext(XMLImport& rImport, XMLMetaDocumentContext& rMeta)
62 : XMLImportContext(rImport)
63 , mrMeta(rMeta)
64{
65}
66
67void XMLDcLanguageContext::characters(const OUString& rChars)
68{
69 OString sCharU8 = OUStringToOString(rChars, RTL_TEXTENCODING_UTF8);
70 if (!mrMeta.GetPropertyList()["dc:language"])
71 mrMeta.GetPropertyList().insert("dc:language", librevenge::RVNGString(sCharU8.getStr()));
72}
73
74namespace
75{
77class XMLDcDateContext : public XMLImportContext
78{
79public:
80 XMLDcDateContext(XMLImport& rImport, XMLMetaDocumentContext& rMeta);
81
82 void SAL_CALL characters(const OUString& rChars) override;
83
84private:
85 XMLMetaDocumentContext& mrMeta;
86};
87}
88
89XMLDcDateContext::XMLDcDateContext(XMLImport& rImport, XMLMetaDocumentContext& rMeta)
90 : XMLImportContext(rImport)
91 , mrMeta(rMeta)
92{
93}
94
95void XMLDcDateContext::characters(const OUString& rChars)
96{
97 OString sCharU8 = OUStringToOString(rChars, RTL_TEXTENCODING_UTF8);
98 if (!mrMeta.GetPropertyList()["dc:date"])
99 mrMeta.GetPropertyList().insert("dc:date", librevenge::RVNGString(sCharU8.getStr()));
100}
101
102namespace
103{
105class XMLMetaGeneratorContext : public XMLImportContext
106{
107public:
108 XMLMetaGeneratorContext(XMLImport& rImport, XMLMetaDocumentContext& rMeta);
109
110 void SAL_CALL characters(const OUString& rChars) override;
111
112private:
113 XMLMetaDocumentContext& mrMeta;
114};
115}
116
117XMLMetaGeneratorContext::XMLMetaGeneratorContext(XMLImport& rImport, XMLMetaDocumentContext& rMeta)
118 : XMLImportContext(rImport)
119 , mrMeta(rMeta)
120{
121}
122
123void XMLMetaGeneratorContext::characters(const OUString& rChars)
124{
125 OString sCharU8 = OUStringToOString(rChars, RTL_TEXTENCODING_UTF8);
126 mrMeta.GetPropertyList().insert("meta:generator", librevenge::RVNGString(sCharU8.getStr()));
127}
128
129namespace
130{
132class XMLMetaInitialCreatorContext : public XMLImportContext
133{
134public:
135 XMLMetaInitialCreatorContext(XMLImport& rImport, XMLMetaDocumentContext& rMeta);
136
137 void SAL_CALL characters(const OUString& rChars) override;
138
139private:
140 XMLMetaDocumentContext& mrMeta;
141};
142}
143
144XMLMetaInitialCreatorContext::XMLMetaInitialCreatorContext(XMLImport& rImport,
145 XMLMetaDocumentContext& rMeta)
146 : XMLImportContext(rImport)
147 , mrMeta(rMeta)
148{
149}
150
151void XMLMetaInitialCreatorContext::characters(const OUString& rChars)
152{
153 OString sCharU8 = OUStringToOString(rChars, RTL_TEXTENCODING_UTF8);
154 if (!mrMeta.GetPropertyList()["meta:initial-creator"])
155 mrMeta.GetPropertyList().insert("meta:initial-creator",
156 librevenge::RVNGString(sCharU8.getStr()));
157}
158
159XMLMetaDocumentContext::XMLMetaDocumentContext(XMLImport& rImport)
160 : XMLImportContext(rImport)
161{
162 librevenge::RVNGPropertyList::Iter it(GetImport().GetMetaData());
163 for (it.rewind(); it.next();)
164 m_aPropertyList.insert(it.key(), it()->clone());
165 m_aPropertyList.insert("librevenge:cover-images", GetImport().GetCoverImages());
166}
167
169 const OUString& rName, const css::uno::Reference<css::xml::sax::XAttributeList>& /*xAttribs*/)
170{
171 if (rName == "dc:title")
172 return new XMLDcTitleContext(GetImport(), *this);
173 if (rName == "dc:language")
174 return new XMLDcLanguageContext(GetImport(), *this);
175 if (rName == "dc:date")
176 return new XMLDcDateContext(GetImport(), *this);
177 if (rName == "meta:generator")
178 return new XMLMetaGeneratorContext(GetImport(), *this);
179 if (rName == "meta:initial-creator")
180 return new XMLMetaInitialCreatorContext(GetImport(), *this);
181 return nullptr;
182}
183
184void XMLMetaDocumentContext::endElement(const OUString& /*rName*/)
185{
186 GetImport().GetGenerator().setDocumentMetaData(m_aPropertyList);
187}
188
189XMPParser::XMPParser(librevenge::RVNGPropertyList& rMetaData)
190 : mrMetaData(rMetaData)
191{
192}
193
194XMPParser::~XMPParser() = default;
195
197
199{
200 if (!mrMetaData["dc:identifier"] && !m_aIdentifier.isEmpty())
201 mrMetaData.insert("dc:identifier", m_aIdentifier.toUtf8().getStr());
202 if (!mrMetaData["dc:title"] && !m_aTitle.isEmpty())
203 mrMetaData.insert("dc:title", m_aTitle.toUtf8().getStr());
204 if (!mrMetaData["meta:initial-creator"] && !m_aCreator.isEmpty())
205 mrMetaData.insert("meta:initial-creator", m_aCreator.toUtf8().getStr());
206 if (!mrMetaData["dc:language"] && !m_aLanguage.isEmpty())
207 mrMetaData.insert("dc:language", m_aLanguage.toUtf8().getStr());
208 if (!mrMetaData["dc:date"] && !m_aDate.isEmpty())
209 mrMetaData.insert("dc:date", m_aDate.toUtf8().getStr());
210}
211
212void XMPParser::startElement(const OUString& rName,
214{
215 if (rName == "dc:identifier")
216 m_bInIdentifier = true;
217 else if (rName == "dc:title")
218 m_bInTitle = true;
219 else if (rName == "dc:creator")
220 m_bInCreator = true;
221 else if (rName == "dc:language")
222 m_bInLanguage = true;
223 else if (rName == "dc:date")
224 m_bInDate = true;
225 else if (rName == "rdf:li")
226 {
227 if (m_bInTitle)
228 m_bInTitleItem = true;
229 else if (m_bInCreator)
230 m_bInCreatorItem = true;
231 else if (m_bInLanguage)
232 m_bInLanguageItem = true;
233 else if (m_bInDate)
234 m_bInDateItem = true;
235 }
236}
237
238void XMPParser::endElement(const OUString& rName)
239{
240 if (rName == "dc:identifier")
241 m_bInIdentifier = false;
242 else if (rName == "dc:title")
243 m_bInTitle = false;
244 else if (rName == "dc:creator")
245 m_bInCreator = false;
246 else if (rName == "dc:language")
247 m_bInLanguage = false;
248 else if (rName == "dc:date")
249 m_bInDate = false;
250 else if (rName == "rdf:li")
251 {
252 if (m_bInTitle)
253 m_bInTitleItem = false;
254 else if (m_bInCreator)
255 m_bInCreatorItem = false;
256 else if (m_bInLanguage)
257 m_bInLanguageItem = false;
258 else if (m_bInDate)
259 m_bInDateItem = false;
260 }
261}
262
263void XMPParser::characters(const OUString& rChars)
264{
265 if (m_bInIdentifier)
266 m_aIdentifier += rChars;
267 else if (m_bInTitleItem)
268 m_aTitle += rChars;
269 else if (m_bInCreatorItem)
270 m_aCreator += rChars;
271 else if (m_bInLanguageItem)
272 m_aLanguage += rChars;
273 else if (m_bInDateItem)
274 m_aDate += rChars;
275}
276
277void XMPParser::ignorableWhitespace(const OUString& /*rWhitespace*/) {}
278
279void XMPParser::processingInstruction(const OUString& /*rTarget*/, const OUString& /*rData*/) {}
280
282
283} // namespace writerperfect::exp
284
285/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
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
librevenge::RVNGTextInterface & GetGenerator() const
Definition: xmlimp.cxx:462
void SAL_CALL endElement(const OUString &rName) override
Definition: xmlmetai.cxx:184
librevenge::RVNGPropertyList m_aPropertyList
Definition: xmlmetai.hxx:33
rtl::Reference< XMLImportContext > CreateChildContext(const OUString &rName, const css::uno::Reference< css::xml::sax::XAttributeList > &xAttribs) override
Definition: xmlmetai.cxx:168
XMPParser(librevenge::RVNGPropertyList &rMetaData)
Definition: xmlmetai.cxx:189
void SAL_CALL endElement(const OUString &rName) override
Definition: xmlmetai.cxx:238
void SAL_CALL startDocument() override
Definition: xmlmetai.cxx:196
void SAL_CALL startElement(const OUString &rName, const css::uno::Reference< css::xml::sax::XAttributeList > &xAttribs) override
Definition: xmlmetai.cxx:212
librevenge::RVNGPropertyList & mrMetaData
Definition: xmlmetai.hxx:64
void SAL_CALL endDocument() override
Definition: xmlmetai.cxx:198
void SAL_CALL setDocumentLocator(const css::uno::Reference< css::xml::sax::XLocator > &xLocator) override
Definition: xmlmetai.cxx:281
void SAL_CALL ignorableWhitespace(const OUString &aWhitespaces) override
Definition: xmlmetai.cxx:277
void SAL_CALL characters(const OUString &rChars) override
Definition: xmlmetai.cxx:263
void SAL_CALL processingInstruction(const OUString &aTarget, const OUString &aData) override
Definition: xmlmetai.cxx:279
T * clone(T *const other)
OString OUStringToOString(std::u16string_view str, ConnectionSettings const *settings)
XMLMetaDocumentContext & mrMeta
Definition: xmlmetai.cxx:29