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

Constructor & Destructor Documentation

◆ DocHtmlTable()

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

Definition at line 1269 of file docnode.h.

DocCompoundNode(DocParser *parser, DocNodeVariant *parent)
Definition docnode.h:141
const HtmlAttribList & attribs() const
Definition docnode.h:1273
HtmlAttribList m_attribs
Definition docnode.h:1283
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 1273 of file docnode.h.

1273{ 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 2372 of file docnode.cpp.

2373{
2374 //printf("computeTableGrid()\n");
2375 RowSpanList rowSpans;
2376 uint32_t maxCols=0;
2377 uint32_t rowIdx=1;
2378 for (auto &rowNode : children())
2379 {
2380 uint32_t colIdx=1;
2381 uint32_t cells=0;
2382 DocHtmlRow *row = std::get_if<DocHtmlRow>(&rowNode);
2383 if (row)
2384 {
2385 for (auto &cellNode : row->children())
2386 {
2387 DocHtmlCell *cell = std::get_if<DocHtmlCell>(&cellNode);
2388 if (cell)
2389 {
2390 uint32_t rs = cell->rowSpan();
2391 uint32_t cs = cell->colSpan();
2392
2393 for (size_t i=0;i<rowSpans.size();i++)
2394 {
2395 if (rowSpans[i].rowsLeft>0 &&
2396 rowSpans[i].column==colIdx)
2397 {
2398 colIdx=rowSpans[i].column+1;
2399 cells++;
2400 }
2401 }
2402 if (rs>0) rowSpans.emplace_back(rs,colIdx);
2403 //printf("found cell at (%d,%d)\n",rowIdx,colIdx);
2404 cell->setRowIndex(rowIdx);
2405 cell->setColumnIndex(colIdx);
2406 colIdx+=cs;
2407 cells++;
2408 }
2409 }
2410 for (size_t i=0;i<rowSpans.size();i++)
2411 {
2412 if (rowSpans[i].rowsLeft>0) rowSpans[i].rowsLeft--;
2413 }
2414 row->setVisibleCells(cells);
2415 row->setRowIndex(rowIdx);
2416 rowIdx++;
2417 }
2418 if (colIdx-1>maxCols) maxCols=colIdx-1;
2419 }
2420 m_numCols = maxCols;
2421}
DocNodeList & children()
Definition docnode.h:143
void setColumnIndex(uint32_t idx)
Definition docnode.h:1215
void setRowIndex(uint32_t idx)
Definition docnode.h:1214
uint32_t rowSpan() const
Definition docnode.cpp:1870
uint32_t colSpan() const
Definition docnode.cpp:1882
void setVisibleCells(uint32_t n)
Definition docnode.h:1254
void setRowIndex(uint32_t idx)
Definition docnode.h:1259
size_t m_numCols
Definition docnode.h:1284
std::vector< ActiveRowSpan > RowSpanList
List of ActiveRowSpan classes.
Definition docnode.cpp:2366

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

2198{
2199 return m_caption!=nullptr;
2200}

References m_caption.

◆ numberHeaderRows()

size_t DocHtmlTable::numberHeaderRows ( ) const

Definition at line 2207 of file docnode.cpp.

2208{
2209 size_t hl = 0;
2210 for (auto &rowNode : children())
2211 {
2212 const DocHtmlRow *row = std::get_if<DocHtmlRow>(&rowNode);
2213 if (row)
2214 {
2215 if (!row->isHeading()) break;
2216 hl++;
2217 }
2218 }
2219 return hl;
2220}
bool isHeading() const
Definition docnode.cpp:1954

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

1271{ 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 2222 of file docnode.cpp.

2223{
2224 AUTO_TRACE();
2225 Token retval = Token::make_RetVal_OK();
2226 auto ns = AutoNodeStack(parser(),thisVariant());
2227
2228getrow:
2229 // skip whitespace and tbody, thead and tfoot tags
2230 Token tok = skipSpacesForTable(parser());
2231 // should find a html tag now
2232 if (tok.is(TokenRetval::TK_HTMLTAG))
2233 {
2234 HtmlTagType tagId=Mappers::htmlTagMapper->map(parser()->context.token->name);
2235 if (tagId==HtmlTagType::HTML_TR && !parser()->context.token->endTag) // found <tr> tag
2236 {
2237 // no caption, just rows
2238 retval = Token::make_RetVal_TableRow();
2239 }
2240 else if (tagId==HtmlTagType::HTML_CAPTION && !parser()->context.token->endTag) // found <caption> tag
2241 {
2242 if (m_caption)
2243 {
2244 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"table already has a caption, found another one");
2245 }
2246 else
2247 {
2248 m_caption = createDocNode<DocHtmlCaption>(parser(),thisVariant(),parser()->context.token->attribs);
2249 retval=std::get<DocHtmlCaption>(*m_caption).parse();
2250
2251 if (retval.is(TokenRetval::RetVal_OK)) // caption was parsed ok
2252 {
2253 goto getrow;
2254 }
2255 }
2256 }
2257 else // found wrong token
2258 {
2259 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected <tr> or <caption> tag but "
2260 "found <{}{}> instead!", parser()->context.token->endTag ? "/" : "", parser()->context.token->name);
2261 }
2262 }
2263 else if (tok.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF)) // premature end of comment
2264 {
2265 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected end of comment while looking"
2266 " for a <tr> or <caption> tag");
2267 }
2268 else // token other than html token
2269 {
2270 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected <tr> tag but found {} token instead!",
2271 tok.to_string());
2272 }
2273
2274 // parse one or more rows
2275 while (retval.is(TokenRetval::RetVal_TableRow))
2276 {
2278 retval = children().get_last<DocHtmlRow>()->parse();
2279 //printf("DocHtmlTable::retval=%s\n",retval.to_string());
2280 if (retval.is(TokenRetval::RetVal_EndTableRow))
2281 {
2282 // get next token
2283 retval = skipSpacesForTable(parser());
2284 //printf("DocHtmlTable::retval= next=%s name=%s endTag=%d\n",retval.to_string(),qPrint(parser()->context.token->name),parser()->context.token->endTag);
2285 HtmlTagType tagId=Mappers::htmlTagMapper->map(parser()->context.token->name);
2286 if (tagId==HtmlTagType::HTML_TR && !parser()->context.token->endTag)
2287 {
2288 retval = Token::make_RetVal_TableRow();
2289 }
2290 else if (tagId==HtmlTagType::HTML_TABLE && parser()->context.token->endTag)
2291 {
2292 retval = Token::make_RetVal_EndTable();
2293 }
2294 else if (retval.is(TokenRetval::TK_HTMLTAG)) // some other HTML tag
2295 {
2296 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected <tr> or </table> tag but "
2297 "found <{}> instead!",parser()->context.token->name);
2298 parser()->tokenizer.pushBackHtmlTag(parser()->context.token->name);
2299 }
2300 else // found some other tag
2301 {
2302 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected <tr> or </table> tag but "
2303 "found token {} instead!",retval.to_string());
2304 retval=Token::make_RetVal_OK();
2305 break;
2306 }
2307 }
2308 }
2309
2311
2312 return retval.is(TokenRetval::RetVal_EndTable) ? Token::make_RetVal_OK() : retval;
2313}
Token parse()
Definition docnode.cpp:2222
void computeTableGrid()
determines the location of all cells in a grid, resolving row and column spans.
Definition docnode.cpp:2372
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:170
#define AUTO_TRACE(...)
Definition docnode.cpp:47
static Token skipSpacesForTable(DocParser *parser)
Definition docnode.cpp:1969
std::unique_ptr< DocNodeVariant > createDocNode(Args &&...args)
Definition docnode.h:1493
#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:1397
T * get_last()
Returns a pointer to the last element in the list if that element exists and holds a T,...
Definition docnode.h:1408
TokenInfo * token
Definition docparser_p.h:93
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 2315 of file docnode.cpp.

2316{
2317 AUTO_TRACE();
2318 Token retval = Token::make_RetVal_OK();
2319 auto ns = AutoNodeStack(parser(),thisVariant());
2320
2321 // get next token
2322 Token tok=parser()->tokenizer.lex();
2323 // skip whitespace
2324 while (tok.is_any_of(TokenRetval::TK_WHITESPACE,TokenRetval::TK_NEWPARA)) tok=parser()->tokenizer.lex();
2325 // should find a html tag now
2327 bool isHeader=FALSE;
2328 if (tok.is(TokenRetval::TK_HTMLTAG))
2329 {
2330 tagId=Mappers::htmlTagMapper->map(parser()->context.token->name);
2331 if (tagId==HtmlTagType::XML_ITEM && !parser()->context.token->endTag) // found <item> tag
2332 {
2333 retval = Token::make_RetVal_TableRow();
2334 }
2335 if (tagId==HtmlTagType::XML_LISTHEADER && !parser()->context.token->endTag) // found <listheader> tag
2336 {
2337 retval = Token::make_RetVal_TableRow();
2338 isHeader=TRUE;
2339 }
2340 }
2341
2342 // parse one or more rows
2343 while (retval.is(TokenRetval::RetVal_TableRow))
2344 {
2346 DocHtmlRow *tr = children().get_last<DocHtmlRow>();
2347 retval=tr->parseXml(isHeader);
2348 isHeader=FALSE;
2349 }
2350
2352
2353 tagId=Mappers::htmlTagMapper->map(parser()->context.token->name);
2354 return tagId==HtmlTagType::XML_LIST && parser()->context.token->endTag ? Token::make_RetVal_OK() : retval;
2355}
#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 1283 of file docnode.h.

Referenced by attribs(), and DocHtmlTable().

◆ m_caption

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

Definition at line 1282 of file docnode.h.

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

◆ m_numCols

size_t DocHtmlTable::m_numCols = 0
private

Definition at line 1284 of file docnode.h.

Referenced by computeTableGrid(), and numColumns().


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