265 lines
6.3 KiB
C
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 );
|
|
}
|
|
}
|
|
}
|
|
}
|