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>
23 #include <unotools/charclass.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 
39 using namespace ::com::sun::star::uno;
40 using namespace ::com::sun::star;
41 using namespace css::xml::sax;
42 
45 
46 namespace {
47 
48 class SwXMLBlockListContext : public SvXMLImportContext
49 {
50 private:
51  SwXMLBlockListImport& m_rLocalRef;
52 
53 public:
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 
61 class SwXMLBlockContext : public SvXMLImportContext
62 {
63 public:
64  SwXMLBlockContext( SwXMLBlockListImport& rImport,
65  const css::uno::Reference< css::xml::sax::XFastAttributeList > & xAttrList );
66 };
67 
68 class SwXMLTextBlockDocumentContext : public SvXMLImportContext
69 {
70 private:
71  SwXMLTextBlockImport& m_rLocalRef;
72 
73 public:
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 
80 class SwXMLTextBlockBodyContext : public SvXMLImportContext
81 {
82 private:
83  SwXMLTextBlockImport& m_rLocalRef;
84 
85 public:
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 
92 class SwXMLTextBlockTextContext : public SvXMLImportContext
93 {
94 private:
95  SwXMLTextBlockImport& m_rLocalRef;
96 
97 public:
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 
105 class SwXMLTextBlockParContext : public SvXMLImportContext
106 {
107 private:
108  SwXMLTextBlockImport& m_rLocalRef;
109 
110 public:
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 
128 sal_Int32 SAL_CALL SwXMLTextBlockTokenHandler::getTokenFromUTF8( const Sequence< sal_Int8 >& Identifier )
129 {
130  return getTokenDirect( reinterpret_cast< const char* >( Identifier.getConstArray() ), Identifier.getLength() );
131 }
132 
133 Sequence< sal_Int8 > SAL_CALL SwXMLTextBlockTokenHandler::getUTF8Identifier( sal_Int32 )
134 {
135  return Sequence< sal_Int8 >();
136 }
137 
138 sal_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 
154 sal_Int32 SAL_CALL SwXMLBlockListTokenHandler::getTokenFromUTF8( const Sequence< sal_Int8 >& Identifier )
155 {
156  return getTokenDirect( reinterpret_cast< const char* >( Identifier.getConstArray() ), Identifier.getLength() );
157 }
158 
159 Sequence< sal_Int8 > SAL_CALL SwXMLBlockListTokenHandler::getUTF8Identifier( sal_Int32 )
160 {
161  return Sequence< sal_Int8 >();
162 }
163 
164 sal_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 
172 SwXMLBlockListContext::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 
181 uno::Reference< ::xml::sax::XFastContextHandler > SAL_CALL
182 SwXMLBlockListContext::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 
190 SwXMLBlockContext::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 
218 SwXMLTextBlockDocumentContext::SwXMLTextBlockDocumentContext(SwXMLTextBlockImport& rImport)
219  : SvXMLImportContext(rImport)
220  , m_rLocalRef(rImport)
221 {
222 }
223 
224 uno::Reference< ::xml::sax::XFastContextHandler > SAL_CALL
225 SwXMLTextBlockDocumentContext::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 
233 SwXMLTextBlockTextContext::SwXMLTextBlockTextContext(SwXMLTextBlockImport& rImport)
234  : SvXMLImportContext(rImport)
235  , m_rLocalRef(rImport)
236 {
237 }
238 
239 uno::Reference< xml::sax::XFastContextHandler > SAL_CALL
240 SwXMLTextBlockTextContext::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 
248 SwXMLTextBlockBodyContext::SwXMLTextBlockBodyContext(SwXMLTextBlockImport& rImport)
249  : SvXMLImportContext(rImport)
250  , m_rLocalRef(rImport)
251 {
252 }
253 
254 uno::Reference < xml::sax::XFastContextHandler > SAL_CALL
255 SwXMLTextBlockBodyContext::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 
265 SwXMLTextBlockParContext::SwXMLTextBlockParContext(SwXMLTextBlockImport& rImport)
266  : SvXMLImportContext(rImport)
267  , m_rLocalRef(rImport)
268 {
269 }
270 
271 void SAL_CALL SwXMLTextBlockParContext::characters( const OUString & aChars )
272 {
273  m_rLocalRef.m_rText += aChars;
274 }
275 
276 SwXMLTextBlockParContext::~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 {
327  if( Element == SwXMLTextBlockToken::OFFICE_DOCUMENT ||
329  return new SwXMLTextBlockDocumentContext( *this );
330  return nullptr;
331 }
332 
334 {
335 }
336 
337 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
virtual ~SwXMLTextBlockImport() noexcept override
virtual ~SwXMLBlockListTokenHandler() override
bool IsXMLToken(std::u16string_view rString, enum XMLTokenEnum eToken)
SvXMLImportFlags
XML_TOKEN_INVALID
virtual SvXMLImportContext * CreateFastContext(sal_Int32 Element, const css::uno::Reference< css::xml::sax::XFastAttributeList > &xAttrList) override
virtual ~SwXMLBlockListImport() noexcept override
sal_Int32 SAL_CALL getTokenFromUTF8(const css::uno::Sequence< sal_Int8 > &Identifier) override
virtual ~SwXMLTextBlockTokenHandler() override
sal_Int32 SAL_CALL getTokenFromUTF8(const css::uno::Sequence< sal_Int8 > &Identifier) override
OUString uppercase(const OUString &rStr, sal_Int32 nPos, sal_Int32 nCount) const
virtual SvXMLImportContext * CreateFastContext(sal_Int32 Element, const css::uno::Reference< css::xml::sax::XFastAttributeList > &xAttrList) override
void AddName(const OUString &, const OUString &, const OUString &, bool bOnlyText)
SwXMLTextBlocks & getBlockList()
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 sal_Int32 getTokenDirect(const char *pTag, sal_Int32 nLength) const override
SwXMLTextBlockImport(const css::uno::Reference< css::uno::XComponentContext > &rContext, OUString &rNewText, bool bNewTextOnly)
SwXMLBlockListImport(const css::uno::Reference< css::uno::XComponentContext > &rContext, SwXMLTextBlocks &rBlocks)
void SetName(const OUString &rName)
Return physical file name.
Definition: swblocks.hxx:99
css::uno::Sequence< sal_Int8 > SAL_CALL getUTF8Identifier(sal_Int32 Token) override
CharClass & GetAppCharClass()
Definition: init.cxx:703
virtual void SAL_CALL endDocument() override