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

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

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

2245{
2246 return m_caption!=nullptr;
2247}

References m_caption.

◆ numberHeaderRows()

size_t DocHtmlTable::numberHeaderRows ( ) const

Definition at line 2254 of file docnode.cpp.

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

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

2270{
2271 AUTO_TRACE();
2272 Token retval = Token::make_RetVal_OK();
2273 auto ns = AutoNodeStack(parser(),thisVariant());
2274
2275getrow:
2276 // skip whitespace and tbody, thead and tfoot tags
2277 Token tok = skipSpacesForTable(parser());
2278 // should find a html tag now
2279 if (tok.is(TokenRetval::TK_HTMLTAG))
2280 {
2281 HtmlTagType tagId=Mappers::htmlTagMapper->map(parser()->context.token->name);
2282 if (tagId==HtmlTagType::HTML_TR && !parser()->context.token->endTag) // found <tr> tag
2283 {
2284 // no caption, just rows
2285 retval = Token::make_RetVal_TableRow();
2286 }
2287 else if (tagId==HtmlTagType::HTML_CAPTION && !parser()->context.token->endTag) // found <caption> tag
2288 {
2289 if (m_caption)
2290 {
2291 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"table already has a caption, found another one");
2292 }
2293 else
2294 {
2295 m_caption = createDocNode<DocHtmlCaption>(parser(),thisVariant(),parser()->context.token->attribs);
2296 retval=std::get<DocHtmlCaption>(*m_caption).parse();
2297
2298 if (retval.is(TokenRetval::RetVal_OK)) // caption was parsed ok
2299 {
2300 goto getrow;
2301 }
2302 }
2303 }
2304 else // found wrong token
2305 {
2306 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected <tr> or <caption> tag but "
2307 "found <{}{}> instead!", parser()->context.token->endTag ? "/" : "", parser()->context.token->name);
2308 }
2309 }
2310 else if (tok.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF)) // premature end of comment
2311 {
2312 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected end of comment while looking"
2313 " for a <tr> or <caption> tag");
2314 }
2315 else // token other than html token
2316 {
2317 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected <tr> tag but found {} token instead!",
2318 tok.to_string());
2319 }
2320
2321 // parse one or more rows
2322 while (retval.is(TokenRetval::RetVal_TableRow))
2323 {
2325 retval = children().get_last<DocHtmlRow>()->parse();
2326 //printf("DocHtmlTable::retval=%s\n",retval.to_string());
2327 if (retval.is(TokenRetval::RetVal_EndTableRow))
2328 {
2329 // get next token
2330 retval = skipSpacesForTable(parser());
2331 //printf("DocHtmlTable::retval= next=%s name=%s endTag=%d\n",retval.to_string(),qPrint(parser()->context.token->name),parser()->context.token->endTag);
2332 HtmlTagType tagId=Mappers::htmlTagMapper->map(parser()->context.token->name);
2333 if (tagId==HtmlTagType::HTML_TR && !parser()->context.token->endTag)
2334 {
2335 retval = Token::make_RetVal_TableRow();
2336 }
2337 else if (tagId==HtmlTagType::HTML_TABLE && parser()->context.token->endTag)
2338 {
2339 retval = Token::make_RetVal_EndTable();
2340 }
2341 else if (retval.is(TokenRetval::TK_HTMLTAG)) // some other HTML tag
2342 {
2343 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected <tr> or </table> tag but "
2344 "found <{}> instead!",parser()->context.token->name);
2345 parser()->tokenizer.pushBackHtmlTag(parser()->context.token->name);
2346 }
2347 else // found some other tag
2348 {
2349 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected <tr> or </table> tag but "
2350 "found token {} instead!",retval.to_string());
2351 retval=Token::make_RetVal_OK();
2352 break;
2353 }
2354 }
2355 }
2356
2358
2359 return retval.is(TokenRetval::RetVal_EndTable) ? Token::make_RetVal_OK() : retval;
2360}
Token parse()
Definition docnode.cpp:2269
void computeTableGrid()
determines the location of all cells in a grid, resolving row and column spans.
Definition docnode.cpp:2419
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:2016
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
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
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 2362 of file docnode.cpp.

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