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

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 1274 of file docnode.h.

Constructor & Destructor Documentation

◆ DocHtmlTable()

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

Definition at line 1277 of file docnode.h.

DocCompoundNode(DocParser *parser, DocNodeVariant *parent)
Definition docnode.h:141
const HtmlAttribList & attribs() const
Definition docnode.h:1281
HtmlAttribList m_attribs
Definition docnode.h:1291
DocParser * parser()
Definition docnode.h:98
DocNodeVariant * parent()
Definition docnode.h:90

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

Member Function Documentation

◆ attribs()

const HtmlAttribList & DocHtmlTable::attribs ( ) const
inline

Definition at line 1281 of file docnode.h.

1281{ 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 2420 of file docnode.cpp.

2421{
2422 //printf("computeTableGrid()\n");
2423 RowSpanList rowSpans;
2424 uint32_t maxCols=0;
2425 uint32_t rowIdx=1;
2426 for (auto &rowNode : children())
2427 {
2428 uint32_t colIdx=1;
2429 uint32_t cells=0;
2430 DocHtmlRow *row = std::get_if<DocHtmlRow>(&rowNode);
2431 if (row)
2432 {
2433 for (auto &cellNode : row->children())
2434 {
2435 DocHtmlCell *cell = std::get_if<DocHtmlCell>(&cellNode);
2436 if (cell)
2437 {
2438 uint32_t rs = cell->rowSpan();
2439 uint32_t cs = cell->colSpan();
2440
2441 for (size_t i=0;i<rowSpans.size();i++)
2442 {
2443 if (rowSpans[i].rowsLeft>0 &&
2444 rowSpans[i].column==colIdx)
2445 {
2446 colIdx=rowSpans[i].column+1;
2447 cells++;
2448 }
2449 }
2450 if (rs>0) rowSpans.emplace_back(rs,colIdx);
2451 //printf("found cell at (%d,%d)\n",rowIdx,colIdx);
2452 cell->setRowIndex(rowIdx);
2453 cell->setColumnIndex(colIdx);
2454 colIdx+=cs;
2455 cells++;
2456 }
2457 }
2458 for (size_t i=0;i<rowSpans.size();i++)
2459 {
2460 if (rowSpans[i].rowsLeft>0) rowSpans[i].rowsLeft--;
2461 }
2462 row->setVisibleCells(cells);
2463 row->setRowIndex(rowIdx);
2464 rowIdx++;
2465 }
2466 if (colIdx-1>maxCols) maxCols=colIdx-1;
2467 }
2468 m_numCols = maxCols;
2469}
DocNodeList & children()
Definition docnode.h:143
void setColumnIndex(uint32_t idx)
Definition docnode.h:1223
void setRowIndex(uint32_t idx)
Definition docnode.h:1222
uint32_t rowSpan() const
Definition docnode.cpp:1918
uint32_t colSpan() const
Definition docnode.cpp:1930
void setVisibleCells(uint32_t n)
Definition docnode.h:1262
void setRowIndex(uint32_t idx)
Definition docnode.h:1267
size_t m_numCols
Definition docnode.h:1292
std::vector< ActiveRowSpan > RowSpanList
List of ActiveRowSpan classes.
Definition docnode.cpp:2414

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 2245 of file docnode.cpp.

2246{
2247 return m_caption!=nullptr;
2248}

References m_caption.

◆ numberHeaderRows()

size_t DocHtmlTable::numberHeaderRows ( ) const

Definition at line 2255 of file docnode.cpp.

2256{
2257 size_t hl = 0;
2258 for (auto &rowNode : children())
2259 {
2260 const DocHtmlRow *row = std::get_if<DocHtmlRow>(&rowNode);
2261 if (row)
2262 {
2263 if (!row->isHeading()) break;
2264 hl++;
2265 }
2266 }
2267 return hl;
2268}
bool isHeading() const
Definition docnode.cpp:2002

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 1279 of file docnode.h.

1279{ 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 2270 of file docnode.cpp.

2271{
2272 AUTO_TRACE();
2273 Token retval = Token::make_RetVal_OK();
2274 auto ns = AutoNodeStack(parser(),thisVariant());
2275
2276getrow:
2277 // skip whitespace and tbody, thead and tfoot tags
2278 Token tok = skipSpacesForTable(parser());
2279 // should find a html tag now
2280 if (tok.is(TokenRetval::TK_HTMLTAG))
2281 {
2282 HtmlTagType tagId=Mappers::htmlTagMapper->map(parser()->context.token->name);
2283 if (tagId==HtmlTagType::HTML_TR && !parser()->context.token->endTag) // found <tr> tag
2284 {
2285 // no caption, just rows
2286 retval = Token::make_RetVal_TableRow();
2287 }
2288 else if (tagId==HtmlTagType::HTML_CAPTION && !parser()->context.token->endTag) // found <caption> tag
2289 {
2290 if (m_caption)
2291 {
2292 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"table already has a caption, found another one");
2293 }
2294 else
2295 {
2296 m_caption = createDocNode<DocHtmlCaption>(parser(),thisVariant(),parser()->context.token->attribs);
2297 retval=std::get<DocHtmlCaption>(*m_caption).parse();
2298
2299 if (retval.is(TokenRetval::RetVal_OK)) // caption was parsed ok
2300 {
2301 goto getrow;
2302 }
2303 }
2304 }
2305 else // found wrong token
2306 {
2307 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected <tr> or <caption> tag but "
2308 "found <{}{}> instead!", parser()->context.token->endTag ? "/" : "", parser()->context.token->name);
2309 }
2310 }
2311 else if (tok.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF)) // premature end of comment
2312 {
2313 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected end of comment while looking"
2314 " for a <tr> or <caption> tag");
2315 }
2316 else // token other than html token
2317 {
2318 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected <tr> tag but found {} token instead!",
2319 tok.to_string());
2320 }
2321
2322 // parse one or more rows
2323 while (retval.is(TokenRetval::RetVal_TableRow))
2324 {
2326 retval = children().get_last<DocHtmlRow>()->parse();
2327 //printf("DocHtmlTable::retval=%s\n",retval.to_string());
2328 if (retval.is(TokenRetval::RetVal_EndTableRow))
2329 {
2330 // get next token
2331 retval = skipSpacesForTable(parser());
2332 //printf("DocHtmlTable::retval= next=%s name=%s endTag=%d\n",retval.to_string(),qPrint(parser()->context.token->name),parser()->context.token->endTag);
2333 HtmlTagType tagId=Mappers::htmlTagMapper->map(parser()->context.token->name);
2334 if (tagId==HtmlTagType::HTML_TR && !parser()->context.token->endTag)
2335 {
2336 retval = Token::make_RetVal_TableRow();
2337 }
2338 else if (tagId==HtmlTagType::HTML_TABLE && parser()->context.token->endTag)
2339 {
2340 retval = Token::make_RetVal_EndTable();
2341 }
2342 else if (retval.is(TokenRetval::TK_HTMLTAG)) // some other HTML tag
2343 {
2344 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected <tr> or </table> tag but "
2345 "found <{}> instead!",parser()->context.token->name);
2346 parser()->tokenizer.pushBackHtmlTag(parser()->context.token->name);
2347 }
2348 else // found some other tag
2349 {
2350 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected <tr> or </table> tag but "
2351 "found token {} instead!",retval.to_string());
2352 retval=Token::make_RetVal_OK();
2353 break;
2354 }
2355 }
2356 }
2357
2359
2360 return retval.is(TokenRetval::RetVal_EndTable) ? Token::make_RetVal_OK() : retval;
2361}
Token parse()
Definition docnode.cpp:2270
void computeTableGrid()
determines the location of all cells in a grid, resolving row and column spans.
Definition docnode.cpp:2420
DocNodeVariant * thisVariant()
Definition docnode.h:93
DocTokenizer tokenizer
DocParserContext context
void pushBackHtmlTag(const QCString &tag)
bool is(TokenRetval rv) const
TOKEN_SPECIFICATIONS RETVAL_SPECIFICATIONS const char * to_string() const
bool is_any_of(ARGS... args) const
HtmlTagType
Definition cmdmapper.h:173
#define AUTO_TRACE(...)
Definition docnode.cpp:48
static Token skipSpacesForTable(DocParser *parser)
Definition docnode.cpp:2017
std::unique_ptr< DocNodeVariant > createDocNode(Args &&...args)
Definition docnode.h:1501
#define warn_doc_error(file, line, fmt,...)
Definition message.h:112
const Mapper< HtmlTagType > * htmlTagMapper
void append(Args &&... args)
Append a new DocNodeVariant to the list by constructing it with type T and parameters Args.
Definition docnode.h:1405
T * get_last()
Returns a pointer to the last element in the list if that element exists and holds a T,...
Definition docnode.h:1416
TokenInfo * token
Definition docparser_p.h:95
HtmlAttribList attribs

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 2363 of file docnode.cpp.

2364{
2365 AUTO_TRACE();
2366 Token retval = Token::make_RetVal_OK();
2367 auto ns = AutoNodeStack(parser(),thisVariant());
2368
2369 // get next token
2370 Token tok=parser()->tokenizer.lex();
2371 // skip whitespace
2372 while (tok.is_any_of(TokenRetval::TK_WHITESPACE,TokenRetval::TK_NEWPARA)) tok=parser()->tokenizer.lex();
2373 // should find a html tag now
2375 bool isHeader=FALSE;
2376 if (tok.is(TokenRetval::TK_HTMLTAG))
2377 {
2378 tagId=Mappers::htmlTagMapper->map(parser()->context.token->name);
2379 if (tagId==HtmlTagType::XML_ITEM && !parser()->context.token->endTag) // found <item> tag
2380 {
2381 retval = Token::make_RetVal_TableRow();
2382 }
2383 if (tagId==HtmlTagType::XML_LISTHEADER && !parser()->context.token->endTag) // found <listheader> tag
2384 {
2385 retval = Token::make_RetVal_TableRow();
2386 isHeader=TRUE;
2387 }
2388 }
2389
2390 // parse one or more rows
2391 while (retval.is(TokenRetval::RetVal_TableRow))
2392 {
2394 DocHtmlRow *tr = children().get_last<DocHtmlRow>();
2395 retval=tr->parseXml(isHeader);
2396 isHeader=FALSE;
2397 }
2398
2400
2401 tagId=Mappers::htmlTagMapper->map(parser()->context.token->name);
2402 return tagId==HtmlTagType::XML_LIST && parser()->context.token->endTag ? Token::make_RetVal_OK() : retval;
2403}
#define TRUE
Definition qcstring.h:37
#define FALSE
Definition qcstring.h:34

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

Member Data Documentation

◆ m_attribs

HtmlAttribList DocHtmlTable::m_attribs
private

Definition at line 1291 of file docnode.h.

Referenced by attribs(), and DocHtmlTable().

◆ m_caption

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

Definition at line 1290 of file docnode.h.

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

◆ m_numCols

size_t DocHtmlTable::m_numCols = 0
private

Definition at line 1292 of file docnode.h.

Referenced by computeTableGrid(), and numColumns().


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