Files
cdesktop/cde/programs/dtdocbook/infolib/AusText.C
2022-01-26 19:50:11 +08:00

265 lines
6.3 KiB
C

/*
* CDE - Common Desktop Environment
*
* Copyright (c) 1993-2012, The Open Group. All rights reserved.
*
* These libraries and programs are free software; you can
* redistribute them and/or modify them under the terms of the GNU
* Lesser General Public License as published by the Free Software
* Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* These libraries and programs are distributed in the hope that
* they 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 for more
* details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with these libraries and programs; if not, write
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
* Floor, Boston, MA 02110-1301 USA
*/
/* $XConsortium: AusText.C /main/3 1996/09/10 16:04:23 cde-hal $
*
* (c) Copyright 1996 Digital Equipment Corporation.
* (c) Copyright 1996 Hewlett-Packard Company.
* (c) Copyright 1996 International Business Machines Corp.
* (c) Copyright 1996 Sun Microsystems, Inc.
* (c) Copyright 1996 Novell, Inc.
* (c) Copyright 1996 FUJITSU LIMITED.
* (c) Copyright 1996 Hitachi.
*/
/* imported interfaces */
#include "OL_Data.h"
#include "Task.h"
#include "FlexBuffer.h"
#include "Token.h"
#include "OLAF.h"
#include "BookCaseDB.h"
#include "BookTasks.h"
#include "NodeData.h"
#include "NodeTask.h"
#include "GraphicsTask.h"
#include "BookTasks.h"
#include "Dispatch.h"
#include "SGMLName.h"
#include "DataRepository.h"
#include "AusTextStorage.h"
/* exported interfaces */
#include "AusText.h"
const unsigned char WORD_SEP = ' ';
// charater strings
const int OLIAS_SCOPE_TITLE = OLAF::Title;
const int OLIAS_SCOPE_EXAMPLE = OLAF::Example;
const int OLIAS_SCOPE_INDEX = OLAF::Index;
const int OLIAS_SCOPE_TABLE = OLAF::Table;
const int OLIAS_SCOPE_GRAPHIC = OLAF::Graphic;
//-----------------------------------------------------------------------
AusText::AusText(NodeData *f_node, const Token &t):SearchEngine(f_node, t)
{
store = new DataRepository;
f_search_store = NULL;
// NOTE: We need to activate default zone here because AusText::markup
// is not being called for the top element in the section.
// Do not forget to deactivate it on the other end!
store->ActivateZone ( DataRepository::Default, t.level() );
}
//-----------------------------------------------------------------------
AusText::~AusText()
{
store->deActivateZone ( f_base );
delete store;
if ( f_search_store ) { delete f_search_store; }
}
//-----------------------------------------------------------------------
void
AusText::write_start_tag ( const Token &t)
{
const AttributeRec *a;
int level = t.level();
if ( (a = t.LookupAttr( OLAF::OL_scope )) ) {
switch ( a->getAttValue() ) {
case OLIAS_SCOPE_EXAMPLE :
store->ActivateZone( DataRepository::Example, level );
break;
case OLIAS_SCOPE_GRAPHIC :
store->ActivateZone( DataRepository::Graphic, level );
break;
case OLIAS_SCOPE_INDEX :
store->ActivateZone( DataRepository::Index, level );
break;
case OLIAS_SCOPE_TABLE :
store->ActivateZone( DataRepository::Table, level );
break;
case OLIAS_SCOPE_TITLE :
store->ActivateZone( DataRepository::Head, level );
break;
default : throw(Unexpected("Not a valid zone"));
}
}
#if 0
else {
store->ActivateZone ( DataRepository::Default, level );
}
#endif
store->put( WORD_SEP );
}
//------------------------------------------------------------------------
void
AusText::write_end_tag( const Token & t)
{
store->deActivateZone( t.level() );
store->put( WORD_SEP );
}
//------------------------------------------------------------------------
void
AusText::write_terms( FlexBuffer *termsbuf )
{
int bufsize = termsbuf->GetSize();
const char *buffer = termsbuf->GetBuffer();
store->write( buffer, bufsize );
termsBuffer = termsbuf;
}
//------------------------------------------------------------------------
void
AusText::write_buffer()
{
BookCaseTask *f_bc = f_parent->node()->book()->bookcase();
const char *BookCaseName = f_bc->bookcasename();
const char *pathname = f_bc->database()->path();
f_search_store = new AusTextStore( pathname, BookCaseName );
assert(f_search_store != NULL);
const char *book_short_title = f_parent->node()->book()->book_short_title();
const char *book_id = f_parent->node()->book()->locator();
const char *nodelocator = f_parent->node()->locator();
const char *node_title = f_parent->node()->title();
f_search_store->insert(book_short_title,
book_id,
nodelocator,
node_title,
store
);
}
//------------------------------------------------------------------------
void
AusText::markup( const Token & t )
{
if ( f_base > 0 ) {
ComplexTask::markup(t);
if ( t.type() == START ) {
if ( Dispatch::OutsideIgnoreScope() ) {
if ( t.LookupAttr( OLAF::OL_Graphic ) ) {
CollectObject = t.level();
f_graphics = new GraphicsTask ( this, t );
assert ( f_graphics != NULL );
addSubTask( f_graphics );
}
#if TABLES
else if( t.LookupAttr( OLAF::OL_Table ) ) {
CollectObject = t.level();
addSubTask(new SearchableTableTask(this, t));
}
#endif
write_start_tag ( t );
}
}
else if ( t.type() == END ) {
if ( Dispatch::OutsideIgnoreScope() ) {
if ( CollectObject >= 0 ) {
if ( CollectObject == t.level() ) {
CollectObject = -1;
if ( f_graphics ) {
if ( f_graphics->HasSearchTerms() ) {
hasTerms = 1;
FlexBuffer *buf = (FlexBuffer *)f_graphics->GetTerms();
write_terms ( buf );
}
KILLSUBTASK( f_graphics );
}
}
}
write_end_tag( t );
if ( f_base == t.level() ) {
f_base = -1;
write_buffer();
}
} /* OutsideIgnoreScope */
} /* if ( t.type() == END ) */
} /* if ( f_base > 0 ) */
}
//---------------------------------------------------------------------
void
AusText::data ( const char *str, size_t sz )
{
if ( f_base > 0 ) {
ComplexTask::data( str, sz );
if ( Dispatch::OutsideIgnoreScope() ) {
/* @@ for tables, this isn't quite right... */
if ( CollectObject < 0 ) {
if ( sz == 0 ) { return; }
store->write( str, sz );
}
}
}
}