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