186 lines
4.0 KiB
C
186 lines
4.0 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: TOCTask.cc /main/2 1996/07/18 15:21:32 drk $ */
|
|
|
|
/* exported interfaces... */
|
|
#include "TOCTask.h"
|
|
|
|
/* imported interfaces... */
|
|
#include "Token.h"
|
|
#include "AttributeRec.h"
|
|
#include "OLAF.h"
|
|
#include "SGMLName.h"
|
|
#include "OL_Data.h"
|
|
#include "BookTasks.h"
|
|
#include "DataBase.h"
|
|
#include "BookCaseDB.h"
|
|
|
|
/*
|
|
* TOCTask
|
|
*/
|
|
|
|
TOCTask::TOCTask(const Token& t, BookTask *book, TOCTask *parent, int sibindx)
|
|
{
|
|
f_book = book;
|
|
f_parent = parent;
|
|
|
|
f_sibling_index = sibindx;
|
|
|
|
f_base = t.level();
|
|
|
|
f_locator = NULL;
|
|
|
|
markup(t);
|
|
}
|
|
|
|
|
|
int toc_depth(const Token& t)
|
|
{
|
|
int ret = -1;
|
|
const AttributeRec *a;
|
|
|
|
if( t.LookupAttr( OLAF::OL_ToC ) ){
|
|
ret = 0;
|
|
}
|
|
else if((a = t.LookupAttr( OLAF::OL_ToCEntry ))){
|
|
const char *val;
|
|
|
|
if((val = a->getAttrValueString())){
|
|
ret = atoi(val);
|
|
}
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
|
|
void TOCTask::markup(const Token& t)
|
|
{
|
|
if(f_base >= 0){
|
|
if(f_locator) f_locator->markup(t);
|
|
if(used > 0) subtasks[used-1]->markup(t);
|
|
|
|
if(t.type() == START){
|
|
|
|
if(f_locator == NULL){
|
|
/* locator for root node, TOC, is an OL_id.
|
|
* others are OL_idref
|
|
*/
|
|
if(f_parent == NULL && t.LookupAttr(OLAF::OL_id)){
|
|
f_locator = new OL_Data(t, OLAF::OL_id, REMOVE_SPACES);
|
|
}
|
|
else if(f_parent != NULL && t.LookupAttr(OLAF::OL_idref)){
|
|
f_locator = new OL_Data(t, OLAF::OL_idref, REMOVE_SPACES);
|
|
}
|
|
}
|
|
|
|
if (t.level() == f_base + 1
|
|
&& t.LookupAttr( OLAF::OL_ToCEntry ) ){
|
|
TOCTask *child = new TOCTask(t, f_book, this, used + 1);
|
|
addSubTask(child);
|
|
}
|
|
|
|
}
|
|
|
|
else if(t.type() == END){
|
|
|
|
if(t.level() == f_base){
|
|
if(f_parent == 0){ /* is this the root node? */
|
|
/* tree is now complete. write it out. */
|
|
BookCaseTask *bc = f_book->bookcase();
|
|
|
|
write_tree(bc->table(BookCaseDB::TOCTree));
|
|
|
|
/* write out path too */
|
|
write_path(bc->table(BookCaseDB::TOCPath));
|
|
}
|
|
|
|
f_base = -1;
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
|
|
void TOCTask::data(const char *chars, size_t len)
|
|
{
|
|
if(f_locator) f_locator->data(chars, len);
|
|
if(used) subtasks[used-1]->data(chars,len);
|
|
}
|
|
|
|
|
|
const char *TOCTask::locator()
|
|
{
|
|
if (!f_locator){
|
|
throw(Unexpected("No locator for TOC entry"));
|
|
}
|
|
|
|
return f_locator->content();
|
|
}
|
|
|
|
|
|
void TOCTask::write_path(DBTable *tbl)
|
|
{
|
|
tbl->insert(STRING_CODE, f_book->locator(),
|
|
STRING_CODE, locator(),
|
|
INTEGER_CODE, f_locator->line_no(),
|
|
STRING_CODE, f_locator->filename(),
|
|
NULL);
|
|
|
|
for(int i = 0; i < used; i++){
|
|
((TOCTask*)subtasks[i])->write_path(tbl);
|
|
}
|
|
}
|
|
|
|
|
|
int TOCTask::write_tree(DBTable *tbl)
|
|
{
|
|
const char **children = NULL;
|
|
int qty = 1;
|
|
|
|
if(used){
|
|
children = (const char **)new char*[used];
|
|
|
|
for(int i = 0; i < used; i++){
|
|
TOCTask *ch = (TOCTask*)subtasks[i];
|
|
children[i] = ch->locator();
|
|
qty += ((TOCTask*)subtasks[i])->write_tree(tbl);
|
|
}
|
|
}
|
|
|
|
tbl->insert(STRING_CODE, f_book->locator(),
|
|
STRING_CODE, locator(),
|
|
STRING_CODE, f_parent ? f_parent->locator() : "",
|
|
SHORT_LIST_CODE,
|
|
used, STRING_CODE, children,
|
|
INTEGER_CODE, qty,
|
|
NULL);
|
|
|
|
delete [] children;
|
|
return qty;
|
|
}
|
|
|
|
|