2004-09-08 13:28:49 +00:00
|
|
|
/*************************************************************************
|
|
|
|
*
|
2008-04-11 06:49:07 +00:00
|
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
2004-09-08 13:28:49 +00:00
|
|
|
*
|
2010-02-12 15:01:35 +01:00
|
|
|
* Copyright 2000, 2010 Oracle and/or its affiliates.
|
2004-09-08 13:28:49 +00:00
|
|
|
*
|
2008-04-11 06:49:07 +00:00
|
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
2004-09-08 13:28:49 +00:00
|
|
|
*
|
2008-04-11 06:49:07 +00:00
|
|
|
* This file is part of OpenOffice.org.
|
2004-09-08 13:28:49 +00:00
|
|
|
*
|
2008-04-11 06:49:07 +00:00
|
|
|
* OpenOffice.org is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU Lesser General Public License version 3
|
|
|
|
* only, as published by the Free Software Foundation.
|
2004-09-08 13:28:49 +00:00
|
|
|
*
|
2008-04-11 06:49:07 +00:00
|
|
|
* OpenOffice.org is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU Lesser General Public License version 3 for more details
|
|
|
|
* (a copy is included in the LICENSE file that accompanied this code).
|
2004-09-08 13:28:49 +00:00
|
|
|
*
|
2008-04-11 06:49:07 +00:00
|
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
|
|
* version 3 along with OpenOffice.org. If not, see
|
|
|
|
* <http://www.openoffice.org/license.html>
|
|
|
|
* for a copy of the LGPLv3 License.
|
2004-09-08 13:28:49 +00:00
|
|
|
*
|
|
|
|
************************************************************************/
|
|
|
|
|
2006-09-17 00:35:16 +00:00
|
|
|
// MARKER(update_precomp.py): autogen include statement, do not remove
|
|
|
|
#include "precompiled_shell.hxx"
|
2004-09-08 13:28:49 +00:00
|
|
|
#include "internal/contentreader.hxx"
|
|
|
|
#include "dummytag.hxx"
|
|
|
|
#include "simpletag.hxx"
|
|
|
|
#include "autostyletag.hxx"
|
|
|
|
|
|
|
|
#include "assert.h"
|
|
|
|
|
|
|
|
/** constructor.
|
|
|
|
*/
|
|
|
|
CContentReader::CContentReader( const std::string& DocumentName, LocaleSet_t const & DocumentLocale ):
|
|
|
|
CBaseReader( DocumentName )
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
|
|
|
m_DefaultLocale = DocumentLocale;
|
|
|
|
Initialize( DOC_CONTENT_NAME );
|
|
|
|
}
|
2006-06-19 13:15:40 +00:00
|
|
|
catch(xml_parser_exception&
|
|
|
|
#if OSL_DEBUG_LEVEL > 0
|
|
|
|
ex
|
|
|
|
#endif
|
|
|
|
)
|
2004-09-08 13:28:49 +00:00
|
|
|
{
|
|
|
|
ENSURE(false, ex.what());
|
|
|
|
}
|
|
|
|
catch(...)
|
|
|
|
{
|
|
|
|
ENSURE(false, "Unknown error");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-08-10 06:05:55 +00:00
|
|
|
CContentReader::CContentReader( void* stream, LocaleSet_t const & DocumentLocale, zlib_filefunc_def* fa ) :
|
|
|
|
CBaseReader( stream, fa )
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
|
|
|
m_DefaultLocale = DocumentLocale;
|
|
|
|
Initialize( DOC_CONTENT_NAME );
|
|
|
|
}
|
|
|
|
catch(xml_parser_exception&
|
|
|
|
#if OSL_DEBUG_LEVEL > 0
|
|
|
|
ex
|
|
|
|
#endif
|
|
|
|
)
|
|
|
|
{
|
|
|
|
ENSURE(false, ex.what());
|
|
|
|
}
|
|
|
|
catch(...)
|
|
|
|
{
|
|
|
|
ENSURE(false, "Unknown error");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2004-09-08 13:28:49 +00:00
|
|
|
/** destructor.
|
|
|
|
*/
|
|
|
|
|
|
|
|
CContentReader::~CContentReader( void )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************** helper functions ***********************/
|
|
|
|
|
|
|
|
/** choose an appropriate tag reader
|
|
|
|
*/
|
|
|
|
|
|
|
|
ITag* CContentReader::chooseTagReader( const std::wstring& tag_name, const XmlTagAttributes_t& XmlAttributes )
|
|
|
|
{
|
|
|
|
if (( tag_name == CONTENT_TEXT_A )||( tag_name == CONTENT_TEXT_P )||
|
|
|
|
( tag_name == CONTENT_TEXT_SPAN ) ||( tag_name == CONTENT_TEXT_H )||
|
|
|
|
( tag_name == CONTENT_TEXT_SEQUENCE ) ||( tag_name == CONTENT_TEXT_BOOKMARK_REF )||
|
|
|
|
( tag_name == CONTENT_TEXT_INDEX_TITLE_TEMPLATE ) )
|
|
|
|
return new CSimpleTag(XmlAttributes);
|
|
|
|
else if ( tag_name == CONTENT_STYLE_STYLE )
|
|
|
|
{
|
|
|
|
// if style:style | style:name is exist,, fill the style field, otherwise do nothing;
|
|
|
|
if ( XmlAttributes.find(CONTENT_STYLE_STYLE_NAME) != XmlAttributes.end())
|
|
|
|
return new CAutoStyleTag(XmlAttributes);
|
|
|
|
else
|
|
|
|
return new CDummyTag();
|
|
|
|
}
|
|
|
|
else if ( ( tag_name == CONTENT_STYLE_PROPERTIES ) || ( tag_name == CONTENT_TEXT_STYLE_PROPERTIES ) )
|
|
|
|
{
|
|
|
|
assert( !m_TagBuilderStack.empty() );
|
|
|
|
|
|
|
|
//here we presume that if CONTENT_STYLE_PROPERTIES tag is present, it just follow CONTENT_STYLE_STYLE;
|
|
|
|
ITag* pTagBuilder = m_TagBuilderStack.top();
|
|
|
|
pTagBuilder->addAttributes( XmlAttributes );
|
|
|
|
|
|
|
|
return new CDummyTag();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
return new CDummyTag();
|
|
|
|
}
|
|
|
|
|
|
|
|
/** get style of the current content.
|
|
|
|
*/
|
|
|
|
::std::wstring CContentReader::getCurrentContentStyle( void )
|
|
|
|
{
|
|
|
|
assert( !m_TagBuilderStack.empty() );
|
|
|
|
ITag* pTagBuilder = m_TagBuilderStack.top();
|
|
|
|
|
|
|
|
return ( pTagBuilder->getTagAttribute(CONTENT_TEXT_STYLENAME) );
|
|
|
|
}
|
|
|
|
|
|
|
|
/** add chunk into Chunk Buffer.
|
|
|
|
*/
|
|
|
|
void CContentReader::addChunk( LocaleSet_t const & Locale, Content_t const & Content )
|
|
|
|
{
|
|
|
|
if ( Content == EMPTY_STRING )
|
|
|
|
return;
|
|
|
|
|
|
|
|
if ( ( ( m_ChunkBuffer.empty() ) || ( m_ChunkBuffer.back().first != Locale ) ) &&
|
|
|
|
( ( Content != SPACE ) && ( Content != LF ) ) )
|
|
|
|
{
|
|
|
|
// if met a new locale, add a blank new chunk;
|
|
|
|
Chunk_t Chunk;
|
|
|
|
Chunk.first = Locale;
|
|
|
|
Chunk.second = EMPTY_STRING;
|
|
|
|
m_ChunkBuffer.push_back( Chunk );
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( !m_ChunkBuffer.empty() )
|
|
|
|
m_ChunkBuffer.back().second += Content;
|
|
|
|
}
|
|
|
|
|
|
|
|
/** get a style's locale field.
|
|
|
|
*/
|
|
|
|
|
|
|
|
LocaleSet_t const & CContentReader::getLocale( const StyleName_t Style )
|
|
|
|
{
|
|
|
|
if ( m_StyleMap.empty() )
|
|
|
|
return m_DefaultLocale;
|
|
|
|
|
|
|
|
StyleLocaleMap_t :: const_iterator style_Iter;
|
|
|
|
|
|
|
|
if ( ( style_Iter = m_StyleMap.find( Style ) ) == m_StyleMap.end( ) )
|
|
|
|
return m_DefaultLocale;
|
|
|
|
else
|
|
|
|
return style_Iter->second;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************** event handler functions ***********************/
|
|
|
|
|
|
|
|
//------------------------------
|
|
|
|
// start_element occurs when a tag is start
|
|
|
|
//------------------------------
|
|
|
|
|
|
|
|
void CContentReader::start_element(
|
|
|
|
const std::wstring& /*raw_name*/,
|
|
|
|
const std::wstring& local_name,
|
|
|
|
const XmlTagAttributes_t& attributes)
|
|
|
|
{
|
|
|
|
//get appropriate Xml Tag Builder using MetaInfoBuilderFactory;
|
|
|
|
ITag* pTagBuilder = chooseTagReader( local_name,attributes );
|
2004-09-14 08:24:32 +00:00
|
|
|
assert( pTagBuilder != NULL );
|
2004-09-08 13:28:49 +00:00
|
|
|
pTagBuilder->startTag( );
|
|
|
|
m_TagBuilderStack.push( pTagBuilder );
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------
|
|
|
|
// end_element occurs when a tag is closed
|
|
|
|
//------------------------------
|
|
|
|
|
|
|
|
void CContentReader::end_element(const std::wstring& /*raw_name*/, const std::wstring& local_name)
|
|
|
|
{
|
|
|
|
assert( !m_TagBuilderStack.empty() );
|
|
|
|
ITag* pTagBuilder = m_TagBuilderStack.top();
|
|
|
|
|
|
|
|
if ( local_name == CONTENT_STYLE_STYLE )
|
|
|
|
{
|
2006-06-19 13:15:40 +00:00
|
|
|
StyleLocalePair_t StyleLocalePair = static_cast<CAutoStyleTag * >( pTagBuilder)->getStyleLocalePair();
|
|
|
|
if ( ( static_cast<CAutoStyleTag * >( pTagBuilder)->isFull() ) && ( StyleLocalePair.second != m_DefaultLocale ) )
|
2004-09-08 13:28:49 +00:00
|
|
|
m_StyleMap.insert( StyleLocalePair );
|
|
|
|
}
|
|
|
|
if (( local_name == CONTENT_TEXT_A )||( local_name == CONTENT_TEXT_SPAN ) ||
|
|
|
|
( local_name == CONTENT_TEXT_SEQUENCE )||( local_name == CONTENT_TEXT_BOOKMARK_REF ))
|
|
|
|
addChunk( getLocale( getCurrentContentStyle() ), ::std::wstring( SPACE ) );
|
|
|
|
if ((( local_name == CONTENT_TEXT_P )||( local_name == CONTENT_TEXT_H ) ||
|
|
|
|
( local_name == CONTENT_TEXT_INDEX_TITLE_TEMPLATE ) )&&
|
|
|
|
( EMPTY_STRING != pTagBuilder->getTagContent( ) ) )
|
|
|
|
addChunk( getLocale( getCurrentContentStyle() ), ::std::wstring( LF ) );
|
|
|
|
|
|
|
|
m_TagBuilderStack.pop();
|
|
|
|
pTagBuilder->endTag();
|
|
|
|
delete pTagBuilder;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------
|
|
|
|
// characters occurs when receiving characters
|
|
|
|
//------------------------------
|
|
|
|
|
|
|
|
void CContentReader::characters( const std::wstring& character )
|
|
|
|
{
|
|
|
|
if ( character.length() > 0 && !HasOnlySpaces( character ) )
|
|
|
|
{
|
|
|
|
addChunk( getLocale( getCurrentContentStyle() ), ::std::wstring( character ) );
|
|
|
|
|
|
|
|
ITag* pTagBuilder = m_TagBuilderStack.top();
|
|
|
|
pTagBuilder->addCharacters( character );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|