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