Doxygen
Loading...
Searching...
No Matches
DocHtmlTable Class Referencefinal

Node representing a HTML table. More...

#include <src/docnode.h>

Inheritance diagram for DocHtmlTable:
Collaboration diagram for DocHtmlTable:

Public Member Functions

 DocHtmlTable (DocParser *parser, DocNodeVariant *parent, const HtmlAttribList &attribs)
size_t numRows () const
bool hasCaption () const
const HtmlAttribListattribs () const
Token parse ()
Token parseXml ()
size_t numColumns () const
const DocNodeVariantcaption () const
size_t numberHeaderRows () const
Public Member Functions inherited from DocCompoundNode
 DocCompoundNode (DocParser *parser, DocNodeVariant *parent)
DocNodeListchildren ()
const DocNodeListchildren () const
Public Member Functions inherited from DocNode
 DocNode (DocParser *parser, DocNodeVariant *parent)
 ~DocNode ()=default
DocNodeVariantparent ()
const DocNodeVariantparent () const
DocNodeVariantthisVariant ()
const DocNodeVariantthisVariant () const
void setThisVariant (DocNodeVariant *thisVariant)
DocParserparser ()
const DocParserparser () const
void setParent (DocNodeVariant *parent)
bool isPreformatted () const

Private Member Functions

void computeTableGrid ()
 determines the location of all cells in a grid, resolving row and column spans.

Private Attributes

std::unique_ptr< DocNodeVariantm_caption
HtmlAttribList m_attribs
size_t m_numCols = 0

Additional Inherited Members

Protected Types inherited from DocNode
enum  RefType {
  Unknown , Anchor , Section , Table ,
  Requirement
}
Protected Member Functions inherited from DocNode
void setInsidePreformatted (bool p)

Detailed Description

Node representing a HTML table.

Definition at line 1273 of file docnode.h.

Constructor & Destructor Documentation

◆ DocHtmlTable()

DocHtmlTable::DocHtmlTable ( DocParser * parser,
DocNodeVariant * parent,
const HtmlAttribList & attribs )
inline

Definition at line 1276 of file docnode.h.

DocCompoundNode(DocParser *parser, DocNodeVariant *parent)
Definition docnode.h:141
const HtmlAttribList & attribs() const
Definition docnode.h:1280
HtmlAttribList m_attribs
Definition docnode.h:1290
DocParser * parser()
Definition docnode.h:97
DocNodeVariant * parent()
Definition docnode.h:89

References attribs(), DocCompoundNode::DocCompoundNode(), m_attribs, DocNode::parent(), and DocNode::parser().

Member Function Documentation

◆ attribs()

const HtmlAttribList & DocHtmlTable::attribs ( ) const
inline

Definition at line 1280 of file docnode.h.

1280{ return m_attribs; }

References m_attribs.

Referenced by DocHtmlTable(), HtmlDocVisitor::operator()(), and XmlDocVisitor::operator()().

◆ caption()

const DocNodeVariant * DocHtmlTable::caption ( ) const

◆ computeTableGrid()

void DocHtmlTable::computeTableGrid ( )
private

determines the location of all cells in a grid, resolving row and column spans.

For each the total number of visible cells is computed, and the total number of visible columns over all rows is stored.

Definition at line 2504 of file docnode.cpp.

2505{
2506 //printf("computeTableGrid()\n");
2507 RowSpanList rowSpans;
2508 uint32_t maxCols=0;
2509 uint32_t rowIdx=1;
2510 for (auto &rowNode : children())
2511 {
2512 uint32_t colIdx=1;
2513 uint32_t cells=0;
2514 DocHtmlRow *row = std::get_if<DocHtmlRow>(&rowNode);
2515 if (row)
2516 {
2517 for (auto &cellNode : row->children())
2518 {
2519 DocHtmlCell *cell = std::get_if<DocHtmlCell>(&cellNode);
2520 if (cell)
2521 {
2522 uint32_t rs = cell->rowSpan();
2523 uint32_t cs = cell->colSpan();
2524
2525 for (size_t i=0;i<rowSpans.size();i++)
2526 {
2527 if (rowSpans[i].rowsLeft>0 &&
2528 rowSpans[i].column==colIdx)
2529 {
2530 colIdx=rowSpans[i].column+1;
2531 cells++;
2532 }
2533 }
2534 if (rs>0) rowSpans.emplace_back(rs,colIdx);
2535 //printf("found cell at (%d,%d)\n",rowIdx,colIdx);
2536 cell->setRowIndex(rowIdx);
2537 cell->setColumnIndex(colIdx);
2538 colIdx+=cs;
2539 cells++;
2540 }
2541 }
2542 for (size_t i=0;i<rowSpans.size();i++)
2543 {
2544 if (rowSpans[i].rowsLeft>0) rowSpans[i].rowsLeft--;
2545 }
2546 row->setVisibleCells(cells);
2547 row->setRowIndex(rowIdx);
2548 rowIdx++;
2549 }
2550 if (colIdx-1>maxCols) maxCols=colIdx-1;
2551 }
2552 m_numCols = maxCols;
2553}
DocNodeList & children()
Definition docnode.h:143
void setColumnIndex(uint32_t idx)
Definition docnode.h:1222
void setRowIndex(uint32_t idx)
Definition docnode.h:1221
uint32_t rowSpan() const
Definition docnode.cpp:2002
uint32_t colSpan() const
Definition docnode.cpp:2014
void setVisibleCells(uint32_t n)
Definition docnode.h:1261
void setRowIndex(uint32_t idx)
Definition docnode.h:1266
size_t m_numCols
Definition docnode.h:1291
std::vector< ActiveRowSpan > RowSpanList
List of ActiveRowSpan classes.
Definition docnode.cpp:2498

References DocCompoundNode::children(), DocHtmlCell::colSpan(), m_numCols, DocHtmlCell::rowSpan(), DocHtmlCell::setColumnIndex(), DocHtmlCell::setRowIndex(), DocHtmlRow::setRowIndex(), and DocHtmlRow::setVisibleCells().

Referenced by parse(), and parseXml().

◆ hasCaption()

bool DocHtmlTable::hasCaption ( ) const

Definition at line 2329 of file docnode.cpp.

2330{
2331 return m_caption!=nullptr;
2332}

References m_caption.

◆ numberHeaderRows()

size_t DocHtmlTable::numberHeaderRows ( ) const

Definition at line 2339 of file docnode.cpp.

2340{
2341 size_t hl = 0;
2342 for (auto &rowNode : children())
2343 {
2344 const DocHtmlRow *row = std::get_if<DocHtmlRow>(&rowNode);
2345 if (row)
2346 {
2347 if (!row->isHeading()) break;
2348 hl++;
2349 }
2350 }
2351 return hl;
2352}
bool isHeading() const
Definition docnode.cpp:2086

References DocCompoundNode::children(), and DocHtmlRow::isHeading().

Referenced by LatexDocVisitor::operator()().

◆ numColumns()

size_t DocHtmlTable::numColumns ( ) const
inline

◆ numRows()

size_t DocHtmlTable::numRows ( ) const
inline

Definition at line 1278 of file docnode.h.

1278{ return children().size(); }
size_t size() const
returns the number of elements
Definition growvector.h:93

References DocCompoundNode::children(), and GrowVector< T >::size().

Referenced by PerlModDocVisitor::operator()(), PrintDocVisitor::operator()(), and XmlDocVisitor::operator()().

◆ parse()

Token DocHtmlTable::parse ( )

Definition at line 2354 of file docnode.cpp.

2355{
2356 AUTO_TRACE();
2357 Token retval = Token::make_RetVal_OK();
2358 auto ns = AutoNodeStack(parser(),thisVariant());
2359
2360getrow:
2361 // skip whitespace and tbody, thead and tfoot tags
2362 Token tok = skipSpacesForTable(parser());
2363 // should find a html tag now
2364 if (tok.is(TokenRetval::TK_HTMLTAG))
2365 {
2366 HtmlTagType tagId=Mappers::htmlTagMapper->map(parser()->context.token->name);
2367 if (tagId==HtmlTagType::HTML_TR && !parser()->context.token->endTag) // found <tr> tag
2368 {
2369 // no caption, just rows
2370 retval = Token::make_RetVal_TableRow();
2371 }
2372 else if (tagId==HtmlTagType::HTML_CAPTION && !parser()->context.token->endTag) // found <caption> tag
2373 {
2374 if (m_caption)
2375 {
2376 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"table already has a caption, found another one");
2377 }
2378 else
2379 {
2380 m_caption = createDocNode<DocHtmlCaption>(parser(),thisVariant(),parser()->context.token->attribs);
2381 retval=std::get<DocHtmlCaption>(*m_caption).parse();
2382
2383 if (retval.is(TokenRetval::RetVal_OK)) // caption was parsed ok
2384 {
2385 goto getrow;
2386 }
2387 }
2388 }
2389 else // found wrong token
2390 {
2391 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected <tr> or <caption> tag but "
2392 "found <{}{}> instead!", parser()->context.token->endTag ? "/" : "", parser()->context.token->name);
2393 }
2394 }
2395 else if (tok.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF)) // premature end of comment
2396 {
2397 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected end of comment while looking"
2398 " for a <tr> or <caption> tag");
2399 }
2400 else // token other than html token
2401 {
2402 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected <tr> tag but found {} token instead!",
2403 tok.to_string());
2404 }
2405
2406 // parse one or more rows
2407 while (retval.is(TokenRetval::RetVal_TableRow))
2408 {
2410 retval = children().get_last<DocHtmlRow>()->parse();
2411 //printf("DocHtmlTable::retval=%s\n",retval.to_string());
2412 if (retval.is(TokenRetval::RetVal_EndTableRow))
2413 {
2414 // get next token
2415 retval = skipSpacesForTable(parser());
2416 //printf("DocHtmlTable::retval= next=%s name=%s endTag=%d\n",retval.to_string(),qPrint(parser()->context.token->name),parser()->context.token->endTag);
2417 HtmlTagType tagId=Mappers::htmlTagMapper->map(parser()->context.token->name);
2418 if (tagId==HtmlTagType::HTML_TR && !parser()->context.token->endTag)
2419 {
2420 retval = Token::make_RetVal_TableRow();
2421 }
2422 else if (tagId==HtmlTagType::HTML_TABLE && parser()->context.token->endTag)
2423 {
2424 retval = Token::make_RetVal_EndTable();
2425 }
2426 else if (retval.is(TokenRetval::TK_HTMLTAG)) // some other HTML tag
2427 {
2428 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected <tr> or </table> tag but "
2429 "found <{}> instead!",parser()->context.token->name);
2430 parser()->tokenizer.pushBackHtmlTag(parser()->context.token->name);
2431 }
2432 else // found some other tag
2433 {
2434 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected <tr> or </table> tag but "
2435 "found token {} instead!",retval.to_string());
2436 retval=Token::make_RetVal_OK();
2437 break;
2438 }
2439 }
2440 }
2441
2443
2444 return retval.is(TokenRetval::RetVal_EndTable) ? Token::make_RetVal_OK() : retval;
2445}
Token parse()
Definition docnode.cpp:2354
void computeTableGrid()
determines the location of all cells in a grid, resolving row and column spans.
Definition docnode.cpp:2504
DocNodeVariant * thisVariant()
Definition docnode.h:92
void append(Args &&... args)
Append a new DocNodeVariant to the list by constructing it with type T and parameters Args.
Definition docnode.h:1404
T * get_last()
Returns a pointer to the last element in the list if that element exists and holds a T,...
Definition docnode.h:1415
DocTokenizer tokenizer
DocParserContext context
void pushBackHtmlTag(const DString &tag)
bool is(TokenRetval rv) const
TOKEN_SPECIFICATIONS RETVAL_SPECIFICATIONS const char * to_string() const
bool is_any_of(ARGS... args) const
HtmlAttribList attribs
HtmlTagType
Definition cmdmapper.h:174
#define AUTO_TRACE(...)
Definition docnode.cpp:53
static Token skipSpacesForTable(DocParser *parser)
Definition docnode.cpp:2101
std::unique_ptr< DocNodeVariant > createDocNode(Args &&...args)
Definition docnode.h:1500
#define warn_doc_error(file, line, fmt,...)
Definition message.h:112
const Mapper< HtmlTagType > * htmlTagMapper
TokenInfo * token
Definition docparser_p.h:94

References DocNodeList::append(), TokenInfo::attribs, AUTO_TRACE, DocCompoundNode::children(), computeTableGrid(), DocParser::context, createDocNode(), DocNodeList::get_last(), HTML_CAPTION, HTML_TABLE, HTML_TR, Mappers::htmlTagMapper, Token::is(), Token::is_any_of(), m_caption, parse(), DocNode::parser(), DocTokenizer::pushBackHtmlTag(), skipSpacesForTable(), DocNode::thisVariant(), Token::to_string(), DocParserContext::token, DocParser::tokenizer, and warn_doc_error.

Referenced by parse().

◆ parseXml()

Token DocHtmlTable::parseXml ( )

Definition at line 2447 of file docnode.cpp.

2448{
2449 AUTO_TRACE();
2450 Token retval = Token::make_RetVal_OK();
2451 auto ns = AutoNodeStack(parser(),thisVariant());
2452
2453 // get next token
2454 Token tok=parser()->tokenizer.lex();
2455 // skip whitespace
2456 while (tok.is_any_of(TokenRetval::TK_WHITESPACE,TokenRetval::TK_NEWPARA)) tok=parser()->tokenizer.lex();
2457 // should find a html tag now
2459 bool isHeader=false;
2460 if (tok.is(TokenRetval::TK_HTMLTAG))
2461 {
2462 tagId=Mappers::htmlTagMapper->map(parser()->context.token->name);
2463 if (tagId==HtmlTagType::XML_ITEM && !parser()->context.token->endTag) // found <item> tag
2464 {
2465 retval = Token::make_RetVal_TableRow();
2466 }
2467 if (tagId==HtmlTagType::XML_LISTHEADER && !parser()->context.token->endTag) // found <listheader> tag
2468 {
2469 retval = Token::make_RetVal_TableRow();
2470 isHeader=true;
2471 }
2472 }
2473
2474 // parse one or more rows
2475 while (retval.is(TokenRetval::RetVal_TableRow))
2476 {
2478 DocHtmlRow *tr = children().get_last<DocHtmlRow>();
2479 retval=tr->parseXml(isHeader);
2480 isHeader=false;
2481 }
2482
2484
2485 tagId=Mappers::htmlTagMapper->map(parser()->context.token->name);
2486 return tagId==HtmlTagType::XML_LIST && parser()->context.token->endTag ? Token::make_RetVal_OK() : retval;
2487}

References DocNodeList::append(), TokenInfo::attribs, AUTO_TRACE, DocCompoundNode::children(), computeTableGrid(), DocParser::context, TokenInfo::endTag, DocNodeList::get_last(), Mappers::htmlTagMapper, Token::is(), Token::is_any_of(), DocTokenizer::lex(), DocNode::parser(), DocNode::thisVariant(), DocParserContext::token, DocParser::tokenizer, UNKNOWN, XML_ITEM, XML_LIST, and XML_LISTHEADER.

Member Data Documentation

◆ m_attribs

HtmlAttribList DocHtmlTable::m_attribs
private

Definition at line 1290 of file docnode.h.

Referenced by attribs(), and DocHtmlTable().

◆ m_caption

std::unique_ptr<DocNodeVariant> DocHtmlTable::m_caption
private

Definition at line 1289 of file docnode.h.

Referenced by caption(), hasCaption(), and parse().

◆ m_numCols

size_t DocHtmlTable::m_numCols = 0
private

Definition at line 1291 of file docnode.h.

Referenced by computeTableGrid(), and numColumns().


The documentation for this class was generated from the following files: