LibreOffice Module sw (master) 1
SwXMLBlockImport.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 * This file incorporates work covered by the following license notice:
10 *
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 */
19
20#include <SwXMLBlockImport.hxx>
21#include <SwXMLTextBlocks.hxx>
22#include <xmloff/xmlictxt.hxx>
24#include <swtypes.hxx>
25
26#if defined __clang__
27#if __has_warning("-Wdeprecated-register")
28#pragma GCC diagnostic push
29#pragma GCC diagnostic ignored "-Wdeprecated-register"
30#endif
31#endif
32#include <tokens.cxx>
33#if defined __clang__
34#if __has_warning("-Wdeprecated-register")
35#pragma GCC diagnostic pop
36#endif
37#endif
38
39using namespace ::com::sun::star::uno;
40using namespace ::com::sun::star;
41using namespace css::xml::sax;
42
45
46namespace {
47
48class SwXMLBlockListContext : public SvXMLImportContext
49{
50private:
51 SwXMLBlockListImport& m_rLocalRef;
52
53public:
54 SwXMLBlockListContext( SwXMLBlockListImport& rImport,
55 const css::uno::Reference< css::xml::sax::XFastAttributeList > & xAttrList );
56
57 virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
58 sal_Int32 Element, const css::uno::Reference< css::xml::sax::XFastAttributeList > & xAttrList ) override;
59};
60
61class SwXMLBlockContext : public SvXMLImportContext
62{
63public:
64 SwXMLBlockContext( SwXMLBlockListImport& rImport,
65 const css::uno::Reference< css::xml::sax::XFastAttributeList > & xAttrList );
66};
67
68class SwXMLTextBlockDocumentContext : public SvXMLImportContext
69{
70private:
71 SwXMLTextBlockImport& m_rLocalRef;
72
73public:
74 SwXMLTextBlockDocumentContext( SwXMLTextBlockImport& rImport );
75
76 virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
77 sal_Int32 Element, const css::uno::Reference< css::xml::sax::XFastAttributeList > & xAttrList ) override;
78};
79
80class SwXMLTextBlockBodyContext : public SvXMLImportContext
81{
82private:
83 SwXMLTextBlockImport& m_rLocalRef;
84
85public:
86 SwXMLTextBlockBodyContext( SwXMLTextBlockImport& rImport );
87
88 virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
89 sal_Int32, const css::uno::Reference< css::xml::sax::XFastAttributeList > & xAttrList ) override;
90};
91
92class SwXMLTextBlockTextContext : public SvXMLImportContext
93{
94private:
95 SwXMLTextBlockImport& m_rLocalRef;
96
97public:
98 SwXMLTextBlockTextContext( SwXMLTextBlockImport& rImport );
99
100 virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
101 sal_Int32 Element,
102 const css::uno::Reference< css::xml::sax::XFastAttributeList > & xAttrList ) override;
103};
104
105class SwXMLTextBlockParContext : public SvXMLImportContext
106{
107private:
108 SwXMLTextBlockImport& m_rLocalRef;
109
110public:
111 SwXMLTextBlockParContext( SwXMLTextBlockImport & rImport );
112
113 virtual void SAL_CALL characters( const OUString & aChars ) override;
114
115 virtual ~SwXMLTextBlockParContext() override;
116};
117
118}
119
121{
122}
123
125{
126}
127
128sal_Int32 SAL_CALL SwXMLTextBlockTokenHandler::getTokenFromUTF8( const Sequence< sal_Int8 >& Identifier )
129{
130 return getTokenDirect( reinterpret_cast< const char* >( Identifier.getConstArray() ), Identifier.getLength() );
131}
132
133Sequence< sal_Int8 > SAL_CALL SwXMLTextBlockTokenHandler::getUTF8Identifier( sal_Int32 )
134{
135 return Sequence< sal_Int8 >();
136}
137
138sal_Int32 SwXMLTextBlockTokenHandler::getTokenDirect( const char *pTag, sal_Int32 nLength ) const
139{
140 if( !nLength )
141 nLength = strlen( pTag );
142 const struct xmltoken* pToken = TextBlockTokens::in_word_set( pTag, nLength );
143 return pToken ? pToken->nToken : XML_TOKEN_INVALID;
144}
145
147{
148}
149
151{
152}
153
154sal_Int32 SAL_CALL SwXMLBlockListTokenHandler::getTokenFromUTF8( const Sequence< sal_Int8 >& Identifier )
155{
156 return getTokenDirect( reinterpret_cast< const char* >( Identifier.getConstArray() ), Identifier.getLength() );
157}
158
159Sequence< sal_Int8 > SAL_CALL SwXMLBlockListTokenHandler::getUTF8Identifier( sal_Int32 )
160{
161 return Sequence< sal_Int8 >();
162}
163
164sal_Int32 SwXMLBlockListTokenHandler::getTokenDirect( const char *pTag, sal_Int32 nLength ) const
165{
166 if( !nLength )
167 nLength = strlen( pTag );
168 const struct xmltoken* pToken = BlockListTokens::in_word_set( pTag, nLength );
169 return pToken ? pToken->nToken : XML_TOKEN_INVALID;
170}
171
172SwXMLBlockListContext::SwXMLBlockListContext(
173 SwXMLBlockListImport& rImport, const uno::Reference<xml::sax::XFastAttributeList>& xAttrList)
174 : SvXMLImportContext(rImport)
175 , m_rLocalRef(rImport)
176{
177 if( xAttrList.is() && xAttrList->hasAttribute( SwXMLBlockListToken::LIST_NAME ) )
178 rImport.getBlockList().SetName( xAttrList->getValue( SwXMLBlockListToken::LIST_NAME ) );
179}
180
181uno::Reference< ::xml::sax::XFastContextHandler > SAL_CALL
182SwXMLBlockListContext::createFastChildContext( sal_Int32 Element,
183 const uno::Reference< xml::sax::XFastAttributeList > & xAttrList )
184{
185 if ( Element == SwXMLBlockListToken::BLOCK )
186 return new SwXMLBlockContext(m_rLocalRef, xAttrList);
187 return nullptr;
188}
189
190SwXMLBlockContext::SwXMLBlockContext(
191 SwXMLBlockListImport& rImport,
192 const uno::Reference< xml::sax::XFastAttributeList > & xAttrList ) :
193 SvXMLImportContext( rImport )
194{
195 static const CharClass & rCC = GetAppCharClass();
196 OUString aShort, aLong, aPackageName;
197 bool bTextOnly = false;
198 if( xAttrList.is() )
199 {
200 if( xAttrList->hasAttribute( SwXMLBlockListToken::ABBREVIATED_NAME ) )
201 aShort = rCC.uppercase( xAttrList->getValue( SwXMLBlockListToken::ABBREVIATED_NAME ) );
202 if( xAttrList->hasAttribute( SwXMLBlockListToken::NAME ) )
203 aLong = xAttrList->getValue( SwXMLBlockListToken::NAME );
204 if( xAttrList->hasAttribute( SwXMLBlockListToken::PACKAGE_NAME ) )
205 aPackageName = xAttrList->getValue( SwXMLBlockListToken::PACKAGE_NAME );
206 if( xAttrList->hasAttribute( SwXMLBlockListToken::UNFORMATTED_TEXT ) )
207 {
208 OUString rAttrValue( xAttrList->getValue( SwXMLBlockListToken::UNFORMATTED_TEXT ) );
209 if( IsXMLToken( rAttrValue, XML_TRUE ) )
210 bTextOnly = true;
211 }
212 }
213 if (aShort.isEmpty() || aLong.isEmpty() || aPackageName.isEmpty())
214 return;
215 rImport.getBlockList().AddName( aShort, aLong, aPackageName, bTextOnly);
216}
217
218SwXMLTextBlockDocumentContext::SwXMLTextBlockDocumentContext(SwXMLTextBlockImport& rImport)
219 : SvXMLImportContext(rImport)
220 , m_rLocalRef(rImport)
221{
222}
223
224uno::Reference< ::xml::sax::XFastContextHandler > SAL_CALL
225SwXMLTextBlockDocumentContext::createFastChildContext( sal_Int32 Element,
226 const uno::Reference< xml::sax::XFastAttributeList > & /*xAttrList*/ )
227{
228 if ( Element == SwXMLTextBlockToken::OFFICE_BODY )
229 return new SwXMLTextBlockBodyContext(m_rLocalRef);
230 return nullptr;
231}
232
233SwXMLTextBlockTextContext::SwXMLTextBlockTextContext(SwXMLTextBlockImport& rImport)
234 : SvXMLImportContext(rImport)
235 , m_rLocalRef(rImport)
236{
237}
238
239uno::Reference< xml::sax::XFastContextHandler > SAL_CALL
240SwXMLTextBlockTextContext::createFastChildContext( sal_Int32 Element,
241 const uno::Reference< xml::sax::XFastAttributeList > & /*xAttrList*/ )
242{
243 if ( Element == SwXMLTextBlockToken::TEXT_P )
244 return new SwXMLTextBlockParContext(m_rLocalRef);
245 return nullptr;
246}
247
248SwXMLTextBlockBodyContext::SwXMLTextBlockBodyContext(SwXMLTextBlockImport& rImport)
249 : SvXMLImportContext(rImport)
250 , m_rLocalRef(rImport)
251{
252}
253
254uno::Reference < xml::sax::XFastContextHandler > SAL_CALL
255SwXMLTextBlockBodyContext::createFastChildContext( sal_Int32 Element,
256 const uno::Reference< xml::sax::XFastAttributeList > & /*xAttrList*/ )
257{
258 if( Element == SwXMLTextBlockToken::OFFICE_TEXT )
259 return new SwXMLTextBlockTextContext(m_rLocalRef);
260 else if( Element == SwXMLTextBlockToken::TEXT_P )
261 return new SwXMLTextBlockParContext(m_rLocalRef);
262 return nullptr;
263}
264
265SwXMLTextBlockParContext::SwXMLTextBlockParContext(SwXMLTextBlockImport& rImport)
266 : SvXMLImportContext(rImport)
267 , m_rLocalRef(rImport)
268{
269}
270
271void SAL_CALL SwXMLTextBlockParContext::characters( const OUString & aChars )
272{
273 m_rLocalRef.m_rText += aChars;
274}
275
276SwXMLTextBlockParContext::~SwXMLTextBlockParContext()
277{
278 if (m_rLocalRef.m_bTextOnly)
279 m_rLocalRef.m_rText += "\015";
280 else
281 {
282 if (!m_rLocalRef.m_rText.endsWith(" "))
283 m_rLocalRef.m_rText += " ";
284 }
285}
286
287// SwXMLBlockListImport //////////////////////////////
289 const uno::Reference< uno::XComponentContext >& rContext,
290 SwXMLTextBlocks &rBlocks )
291: SvXMLImport( rContext, "", SvXMLImportFlags::NONE ),
292 m_rBlockList (rBlocks)
293{
294}
295
297 noexcept
298{
299}
300
302 const uno::Reference< xml::sax::XFastAttributeList > & xAttrList )
303{
304 if( Element == SwXMLBlockListToken::BLOCK_LIST )
305 return new SwXMLBlockListContext( *this, xAttrList );
306 return nullptr;
307}
308
310 const uno::Reference< uno::XComponentContext >& rContext,
311 OUString & rNewText,
312 bool bNewTextOnly )
313: SvXMLImport(rContext, "", SvXMLImportFlags::ALL ),
314 m_bTextOnly ( bNewTextOnly ),
315 m_rText ( rNewText )
316{
317}
318
320 noexcept
321{
322}
323
325 const uno::Reference< xml::sax::XFastAttributeList > & /*xAttrList*/ )
326{
329 return new SwXMLTextBlockDocumentContext( *this );
330 return nullptr;
331}
332
334{
335}
336
337/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
@ OFFICE_DOCUMENT_CONTENT
@ OFFICE_DOCUMENT
@ OFFICE_BODY
@ TEXT_P
@ OFFICE_TEXT
@ PACKAGE_NAME
@ UNFORMATTED_TEXT
@ LIST_NAME
@ BLOCK_LIST
@ ABBREVIATED_NAME
OUString uppercase(const OUString &rStr, sal_Int32 nPos, sal_Int32 nCount) const
void SetName(const OUString &rName)
Return physical file name.
Definition: swblocks.hxx:99
virtual ~SwXMLBlockListImport() noexcept override
virtual SvXMLImportContext * CreateFastContext(sal_Int32 Element, const css::uno::Reference< css::xml::sax::XFastAttributeList > &xAttrList) override
SwXMLBlockListImport(const css::uno::Reference< css::uno::XComponentContext > &rContext, SwXMLTextBlocks &rBlocks)
SwXMLTextBlocks & getBlockList()
sal_Int32 SAL_CALL getTokenFromUTF8(const css::uno::Sequence< sal_Int8 > &Identifier) override
virtual sal_Int32 getTokenDirect(const char *pTag, sal_Int32 nLength) const override
virtual ~SwXMLBlockListTokenHandler() override
css::uno::Sequence< sal_Int8 > SAL_CALL getUTF8Identifier(sal_Int32 Token) override
virtual SvXMLImportContext * CreateFastContext(sal_Int32 Element, const css::uno::Reference< css::xml::sax::XFastAttributeList > &xAttrList) override
virtual void SAL_CALL endDocument() override
SwXMLTextBlockImport(const css::uno::Reference< css::uno::XComponentContext > &rContext, OUString &rNewText, bool bNewTextOnly)
virtual ~SwXMLTextBlockImport() noexcept override
sal_Int32 SAL_CALL getTokenFromUTF8(const css::uno::Sequence< sal_Int8 > &Identifier) override
css::uno::Sequence< sal_Int8 > SAL_CALL getUTF8Identifier(sal_Int32 Token) override
virtual sal_Int32 getTokenDirect(const char *pTag, sal_Int32 nLength) const override
virtual ~SwXMLTextBlockTokenHandler() override
void AddName(const OUString &, const OUString &, const OUString &, bool bOnlyText)
CharClass & GetAppCharClass()
Definition: init.cxx:721
XML_TOKEN_INVALID
bool IsXMLToken(std::u16string_view rString, enum XMLTokenEnum eToken)
SvXMLImportFlags
sal_Int32 nLength