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

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

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

2248{
2249 return m_caption!=nullptr;
2250}

References m_caption.

◆ numberHeaderRows()

size_t DocHtmlTable::numberHeaderRows ( ) const

Definition at line 2257 of file docnode.cpp.

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

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

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

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

References DocNodeList::append(), TokenInfo::attribs, AUTO_TRACE, AutoNodeStack::AutoNodeStack(), 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: