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 }
Protected Member Functions inherited from DocNode
void setInsidePreformatted (bool p)

Detailed Description

Node representing a HTML table.

Definition at line 1268 of file docnode.h.

Constructor & Destructor Documentation

◆ DocHtmlTable()

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

Definition at line 1271 of file docnode.h.

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

1275{ 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 2353 of file docnode.cpp.

2354{
2355 //printf("computeTableGrid()\n");
2356 RowSpanList rowSpans;
2357 uint32_t maxCols=0;
2358 uint32_t rowIdx=1;
2359 for (auto &rowNode : children())
2360 {
2361 uint32_t colIdx=1;
2362 uint32_t cells=0;
2363 DocHtmlRow *row = std::get_if<DocHtmlRow>(&rowNode);
2364 if (row)
2365 {
2366 for (auto &cellNode : row->children())
2367 {
2368 DocHtmlCell *cell = std::get_if<DocHtmlCell>(&cellNode);
2369 if (cell)
2370 {
2371 uint32_t rs = cell->rowSpan();
2372 uint32_t cs = cell->colSpan();
2373
2374 for (size_t i=0;i<rowSpans.size();i++)
2375 {
2376 if (rowSpans[i].rowsLeft>0 &&
2377 rowSpans[i].column==colIdx)
2378 {
2379 colIdx=rowSpans[i].column+1;
2380 cells++;
2381 }
2382 }
2383 if (rs>0) rowSpans.emplace_back(rs,colIdx);
2384 //printf("found cell at (%d,%d)\n",rowIdx,colIdx);
2385 cell->setRowIndex(rowIdx);
2386 cell->setColumnIndex(colIdx);
2387 colIdx+=cs;
2388 cells++;
2389 }
2390 }
2391 for (size_t i=0;i<rowSpans.size();i++)
2392 {
2393 if (rowSpans[i].rowsLeft>0) rowSpans[i].rowsLeft--;
2394 }
2395 row->setVisibleCells(cells);
2396 row->setRowIndex(rowIdx);
2397 rowIdx++;
2398 }
2399 if (colIdx-1>maxCols) maxCols=colIdx-1;
2400 }
2401 m_numCols = maxCols;
2402}
DocNodeList & children()
Definition docnode.h:143
void setColumnIndex(uint32_t idx)
Definition docnode.h:1217
void setRowIndex(uint32_t idx)
Definition docnode.h:1216
uint32_t rowSpan() const
Definition docnode.cpp:1857
uint32_t colSpan() const
Definition docnode.cpp:1869
void setVisibleCells(uint32_t n)
Definition docnode.h:1256
void setRowIndex(uint32_t idx)
Definition docnode.h:1261
size_t m_numCols
Definition docnode.h:1286
std::vector< ActiveRowSpan > RowSpanList
List of ActiveRowSpan classes.
Definition docnode.cpp:2347

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

2185{
2186 return m_caption!=nullptr;
2187}

References m_caption.

◆ numberHeaderRows()

size_t DocHtmlTable::numberHeaderRows ( ) const

Definition at line 2194 of file docnode.cpp.

2195{
2196 size_t hl = 0;
2197 for (auto &rowNode : children())
2198 {
2199 const DocHtmlRow *row = std::get_if<DocHtmlRow>(&rowNode);
2200 if (row)
2201 {
2202 if (!row->isHeading()) break;
2203 hl++;
2204 }
2205 }
2206 return hl;
2207}
bool isHeading() const
Definition docnode.cpp:1941

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

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

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

Referenced by parse().

◆ parseXml()

Token DocHtmlTable::parseXml ( )

Definition at line 2296 of file docnode.cpp.

2297{
2298 AUTO_TRACE();
2299 Token retval = Token::make_RetVal_OK();
2300 auto ns = AutoNodeStack(parser(),thisVariant());
2301
2302 // get next token
2303 Token tok=parser()->tokenizer.lex();
2304 // skip whitespace
2305 while (tok.is_any_of(TokenRetval::TK_WHITESPACE,TokenRetval::TK_NEWPARA)) tok=parser()->tokenizer.lex();
2306 // should find a html tag now
2308 bool isHeader=FALSE;
2309 if (tok.is(TokenRetval::TK_HTMLTAG))
2310 {
2311 tagId=Mappers::htmlTagMapper->map(parser()->context.token->name);
2312 if (tagId==HtmlTagType::XML_ITEM && !parser()->context.token->endTag) // found <item> tag
2313 {
2314 retval = Token::make_RetVal_TableRow();
2315 }
2316 if (tagId==HtmlTagType::XML_LISTHEADER && !parser()->context.token->endTag) // found <listheader> tag
2317 {
2318 retval = Token::make_RetVal_TableRow();
2319 isHeader=TRUE;
2320 }
2321 }
2322
2323 // parse one or more rows
2324 while (retval.is(TokenRetval::RetVal_TableRow))
2325 {
2327 DocHtmlRow *tr = children().get_last<DocHtmlRow>();
2328 retval=tr->parseXml(isHeader);
2329 isHeader=FALSE;
2330 }
2331
2333
2334 tagId=Mappers::htmlTagMapper->map(parser()->context.token->name);
2335 return tagId==HtmlTagType::XML_LIST && parser()->context.token->endTag ? Token::make_RetVal_OK() : retval;
2336}
DocTokenizer tokenizer
#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 1285 of file docnode.h.

Referenced by attribs(), and DocHtmlTable().

◆ m_caption

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

Definition at line 1284 of file docnode.h.

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

◆ m_numCols

size_t DocHtmlTable::m_numCols = 0
private

Definition at line 1286 of file docnode.h.

Referenced by computeTableGrid(), and numColumns().


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