xref: /AOO41X/main/shell/source/all/ooofilereader/contentreader.cxx (revision f8e2c85a611dbc087707e0b32c9aee1ddf7485ca)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_shell.hxx"
26 #include "internal/contentreader.hxx"
27 #include "dummytag.hxx"
28 #include "simpletag.hxx"
29 #include "autostyletag.hxx"
30 
31 #include "assert.h"
32 
33 /** constructor.
34 */
CContentReader(const std::string & DocumentName,LocaleSet_t const & DocumentLocale)35 CContentReader::CContentReader( const std::string& DocumentName, LocaleSet_t const & DocumentLocale ):
36 CBaseReader( DocumentName )
37 {
38     try
39     {
40         m_DefaultLocale = DocumentLocale;
41         Initialize( DOC_CONTENT_NAME );
42     }
43     catch(xml_parser_exception&
44     #if OSL_DEBUG_LEVEL > 0
45     ex
46     #endif
47     )
48     {
49         ENSURE(false, ex.what());
50     }
51     catch(...)
52     {
53         ENSURE(false, "Unknown error");
54     }
55 }
56 
CContentReader(void * stream,LocaleSet_t const & DocumentLocale,zlib_filefunc_def * fa)57 CContentReader::CContentReader( void* stream, LocaleSet_t const & DocumentLocale, zlib_filefunc_def* fa ) :
58 CBaseReader( stream, fa )
59 {
60 try
61     {
62         m_DefaultLocale = DocumentLocale;
63         Initialize( DOC_CONTENT_NAME );
64     }
65     catch(xml_parser_exception&
66     #if OSL_DEBUG_LEVEL > 0
67     ex
68     #endif
69     )
70     {
71         ENSURE(false, ex.what());
72     }
73     catch(...)
74     {
75         ENSURE(false, "Unknown error");
76     }
77 }
78 
79 
80 /** destructor.
81 */
82 
~CContentReader(void)83 CContentReader::~CContentReader( void )
84 {
85 }
86 
87 /***********************   helper functions  ***********************/
88 
89 /** choose an appropriate tag reader
90 */
91 
chooseTagReader(const std::wstring & tag_name,const XmlTagAttributes_t & XmlAttributes)92 ITag* CContentReader::chooseTagReader( const std::wstring& tag_name, const XmlTagAttributes_t& XmlAttributes )
93 {
94     if (( tag_name == CONTENT_TEXT_A )||( tag_name == CONTENT_TEXT_P )||
95         ( tag_name == CONTENT_TEXT_SPAN ) ||( tag_name == CONTENT_TEXT_H )||
96         ( tag_name == CONTENT_TEXT_SEQUENCE ) ||( tag_name == CONTENT_TEXT_BOOKMARK_REF )||
97         ( tag_name == CONTENT_TEXT_INDEX_TITLE_TEMPLATE ) )
98         return new CSimpleTag(XmlAttributes);
99     else if ( tag_name == CONTENT_STYLE_STYLE )
100     {
101         // if style:style | style:name is exist,, fill the style field, otherwise do nothing;
102         if  ( XmlAttributes.find(CONTENT_STYLE_STYLE_NAME) != XmlAttributes.end())
103             return new CAutoStyleTag(XmlAttributes);
104        else
105             return new CDummyTag();
106     }
107     else if ( ( tag_name == CONTENT_STYLE_PROPERTIES ) || ( tag_name == CONTENT_TEXT_STYLE_PROPERTIES ) )
108     {
109         assert( !m_TagBuilderStack.empty() );
110 
111         //here we presume that if CONTENT_STYLE_PROPERTIES tag is present, it just follow CONTENT_STYLE_STYLE;
112         ITag* pTagBuilder = m_TagBuilderStack.top();
113         pTagBuilder->addAttributes( XmlAttributes );
114 
115         return new CDummyTag();
116     }
117     else
118         return new CDummyTag();
119 }
120 
121 /** get style of the current content.
122 */
getCurrentContentStyle(void)123 ::std::wstring CContentReader::getCurrentContentStyle( void )
124 {
125     assert( !m_TagBuilderStack.empty() );
126     ITag* pTagBuilder = m_TagBuilderStack.top();
127 
128     return ( pTagBuilder->getTagAttribute(CONTENT_TEXT_STYLENAME) );
129 }
130 
131 /** add chunk into Chunk Buffer.
132 */
addChunk(LocaleSet_t const & Locale,Content_t const & Content)133 void CContentReader::addChunk( LocaleSet_t const & Locale, Content_t const & Content )
134 {
135     if ( Content == EMPTY_STRING )
136         return;
137 
138     if ( ( ( m_ChunkBuffer.empty() ) || ( m_ChunkBuffer.back().first != Locale ) ) &&
139          ( ( Content != SPACE )  && ( Content != LF ) ) )
140     {
141         // if met a new locale, add a blank new chunk;
142         Chunk_t Chunk;
143         Chunk.first = Locale;
144         Chunk.second = EMPTY_STRING;
145         m_ChunkBuffer.push_back( Chunk );
146     }
147 
148     if ( !m_ChunkBuffer.empty() )
149         m_ChunkBuffer.back().second += Content;
150 }
151 
152 /** get a style's locale field.
153 */
154 
getLocale(const StyleName_t Style)155 LocaleSet_t const & CContentReader::getLocale( const StyleName_t Style )
156 {
157     if ( m_StyleMap.empty() )
158         return m_DefaultLocale;
159 
160     StyleLocaleMap_t :: const_iterator style_Iter;
161 
162     if ( ( style_Iter = m_StyleMap.find( Style ) ) == m_StyleMap.end( ) )
163         return m_DefaultLocale;
164     else
165         return style_Iter->second;
166 
167 }
168 
169 /***********************   event handler functions  ***********************/
170 
171 //------------------------------
172 // start_element occurs when a tag is start
173 //------------------------------
174 
start_element(const std::wstring &,const std::wstring & local_name,const XmlTagAttributes_t & attributes)175 void CContentReader::start_element(
176     const std::wstring& /*raw_name*/,
177     const std::wstring& local_name,
178     const XmlTagAttributes_t& attributes)
179 {
180     //get appropriate Xml Tag Builder using MetaInfoBuilderFactory;
181     ITag* pTagBuilder = chooseTagReader( local_name,attributes );
182     assert( pTagBuilder != NULL );
183     pTagBuilder->startTag( );
184     m_TagBuilderStack.push( pTagBuilder );
185 
186 }
187 
188 //------------------------------
189 // end_element occurs when a tag is closed
190 //------------------------------
191 
end_element(const std::wstring &,const std::wstring & local_name)192 void CContentReader::end_element(const std::wstring& /*raw_name*/, const std::wstring& local_name)
193 {
194     assert( !m_TagBuilderStack.empty() );
195     ITag* pTagBuilder = m_TagBuilderStack.top();
196 
197     if ( local_name == CONTENT_STYLE_STYLE )
198     {
199         StyleLocalePair_t StyleLocalePair = static_cast<CAutoStyleTag * >( pTagBuilder)->getStyleLocalePair();
200         if ( ( static_cast<CAutoStyleTag * >( pTagBuilder)->isFull() ) && ( StyleLocalePair.second != m_DefaultLocale ) )
201                 m_StyleMap.insert( StyleLocalePair );
202     }
203     if (( local_name == CONTENT_TEXT_A )||( local_name == CONTENT_TEXT_SPAN ) ||
204         ( local_name == CONTENT_TEXT_SEQUENCE )||( local_name == CONTENT_TEXT_BOOKMARK_REF ))
205         addChunk( getLocale( getCurrentContentStyle() ), ::std::wstring( SPACE ) );
206     if ((( local_name == CONTENT_TEXT_P )||( local_name == CONTENT_TEXT_H ) ||
207          ( local_name == CONTENT_TEXT_INDEX_TITLE_TEMPLATE ) )&&
208         ( EMPTY_STRING != pTagBuilder->getTagContent( ) ) )
209         addChunk( getLocale( getCurrentContentStyle() ), ::std::wstring( LF ) );
210 
211     m_TagBuilderStack.pop();
212     pTagBuilder->endTag();
213     delete pTagBuilder;
214 
215 }
216 
217 //------------------------------
218 // characters occurs when receiving characters
219 //------------------------------
220 
characters(const std::wstring & character)221 void CContentReader::characters( const std::wstring& character )
222 {
223     if ( character.length() > 0 && !HasOnlySpaces( character ) )
224     {
225         addChunk( getLocale( getCurrentContentStyle() ), ::std::wstring( character ) );
226 
227         ITag* pTagBuilder = m_TagBuilderStack.top();
228         pTagBuilder->addCharacters( character );
229     }
230 }
231 
232