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

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

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

2249{
2250 return m_caption!=nullptr;
2251}

References m_caption.

◆ numberHeaderRows()

size_t DocHtmlTable::numberHeaderRows ( ) const

Definition at line 2258 of file docnode.cpp.

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

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

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

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

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: