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
const DocNodeVariantfirstRow () 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 2341 of file docnode.cpp.

2342{
2343 //printf("computeTableGrid()\n");
2344 RowSpanList rowSpans;
2345 uint32_t maxCols=0;
2346 uint32_t rowIdx=1;
2347 for (auto &rowNode : children())
2348 {
2349 uint32_t colIdx=1;
2350 uint32_t cells=0;
2351 DocHtmlRow *row = std::get_if<DocHtmlRow>(&rowNode);
2352 if (row)
2353 {
2354 for (auto &cellNode : row->children())
2355 {
2356 DocHtmlCell *cell = std::get_if<DocHtmlCell>(&cellNode);
2357 if (cell)
2358 {
2359 uint32_t rs = cell->rowSpan();
2360 uint32_t cs = cell->colSpan();
2361
2362 for (size_t i=0;i<rowSpans.size();i++)
2363 {
2364 if (rowSpans[i].rowsLeft>0 &&
2365 rowSpans[i].column==colIdx)
2366 {
2367 colIdx=rowSpans[i].column+1;
2368 cells++;
2369 }
2370 }
2371 if (rs>0) rowSpans.emplace_back(rs,colIdx);
2372 //printf("found cell at (%d,%d)\n",rowIdx,colIdx);
2373 cell->setRowIndex(rowIdx);
2374 cell->setColumnIndex(colIdx);
2375 colIdx+=cs;
2376 cells++;
2377 }
2378 }
2379 for (size_t i=0;i<rowSpans.size();i++)
2380 {
2381 if (rowSpans[i].rowsLeft>0) rowSpans[i].rowsLeft--;
2382 }
2383 row->setVisibleCells(cells);
2384 row->setRowIndex(rowIdx);
2385 rowIdx++;
2386 }
2387 if (colIdx-1>maxCols) maxCols=colIdx-1;
2388 }
2389 m_numCols = maxCols;
2390}
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:1851
uint32_t colSpan() const
Definition docnode.cpp:1863
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:2335
size_t i
Definition htmlgen.cpp:161

References DocCompoundNode::children(), DocHtmlCell::colSpan(), i, m_numCols, DocHtmlCell::rowSpan(), DocHtmlCell::setColumnIndex(), DocHtmlCell::setRowIndex(), DocHtmlRow::setRowIndex(), and DocHtmlRow::setVisibleCells().

Referenced by parse(), and parseXml().

◆ firstRow()

const DocNodeVariant * DocHtmlTable::firstRow ( ) const

Definition at line 2188 of file docnode.cpp.

2189{
2190 if (!children().empty() && std::holds_alternative<DocHtmlRow>(children().front()))
2191 {
2192 return &children().front();
2193 }
2194 return nullptr;
2195}
T & front()
access the first element
Definition growvector.h:130

References DocCompoundNode::children(), and GrowVector< T >::front().

Referenced by LatexDocVisitor::operator()().

◆ hasCaption()

bool DocHtmlTable::hasCaption ( ) const

Definition at line 2178 of file docnode.cpp.

2179{
2180 return m_caption!=nullptr;
2181}

References m_caption.

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

2198{
2199 AUTO_TRACE();
2200 Token retval = Token::make_RetVal_OK();
2201 auto ns = AutoNodeStack(parser(),thisVariant());
2202
2203getrow:
2204 // skip whitespace and tbody, thead and tfoot tags
2205 Token tok = skipSpacesForTable(parser());
2206 // should find a html tag now
2207 if (tok.is(TokenRetval::TK_HTMLTAG))
2208 {
2209 HtmlTagType tagId=Mappers::htmlTagMapper->map(parser()->context.token->name);
2210 if (tagId==HtmlTagType::HTML_TR && !parser()->context.token->endTag) // found <tr> tag
2211 {
2212 // no caption, just rows
2213 retval = Token::make_RetVal_TableRow();
2214 }
2215 else if (tagId==HtmlTagType::HTML_CAPTION && !parser()->context.token->endTag) // found <caption> tag
2216 {
2217 if (m_caption)
2218 {
2219 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"table already has a caption, found another one");
2220 }
2221 else
2222 {
2223 m_caption = createDocNode<DocHtmlCaption>(parser(),thisVariant(),parser()->context.token->attribs);
2224 retval=std::get<DocHtmlCaption>(*m_caption).parse();
2225
2226 if (retval.is(TokenRetval::RetVal_OK)) // caption was parsed ok
2227 {
2228 goto getrow;
2229 }
2230 }
2231 }
2232 else // found wrong token
2233 {
2234 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected <tr> or <caption> tag but "
2235 "found <{}{}> instead!", parser()->context.token->endTag ? "/" : "", parser()->context.token->name);
2236 }
2237 }
2238 else if (tok.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF)) // premature end of comment
2239 {
2240 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected end of comment while looking"
2241 " for a <tr> or <caption> tag");
2242 }
2243 else // token other than html token
2244 {
2245 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected <tr> tag but found {} token instead!",
2246 tok.to_string());
2247 }
2248
2249 // parse one or more rows
2250 while (retval.is(TokenRetval::RetVal_TableRow))
2251 {
2253 retval = children().get_last<DocHtmlRow>()->parse();
2254 //printf("DocHtmlTable::retval=%s\n",retval.to_string());
2255 if (retval.is(TokenRetval::RetVal_EndTableRow))
2256 {
2257 // get next token
2258 retval = skipSpacesForTable(parser());
2259 //printf("DocHtmlTable::retval= next=%s name=%s endTag=%d\n",retval.to_string(),qPrint(parser()->context.token->name),parser()->context.token->endTag);
2260 HtmlTagType tagId=Mappers::htmlTagMapper->map(parser()->context.token->name);
2261 if (tagId==HtmlTagType::HTML_TR && !parser()->context.token->endTag)
2262 {
2263 retval = Token::make_RetVal_TableRow();
2264 }
2265 else if (tagId==HtmlTagType::HTML_TABLE && parser()->context.token->endTag)
2266 {
2267 retval = Token::make_RetVal_EndTable();
2268 }
2269 else // found some other tag
2270 {
2271 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected <tr> or </table> tag but "
2272 "found token {} instead!",retval.to_string());
2273 retval=Token::make_RetVal_OK();
2274 break;
2275 }
2276 }
2277 }
2278
2280
2281 return retval.is(TokenRetval::RetVal_EndTable) ? Token::make_RetVal_OK() : retval;
2282}
Token parse()
Definition docnode.cpp:2197
void computeTableGrid()
determines the location of all cells in a grid, resolving row and column spans.
Definition docnode.cpp:2341
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:1950
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:92
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 2284 of file docnode.cpp.

2285{
2286 AUTO_TRACE();
2287 Token retval = Token::make_RetVal_OK();
2288 auto ns = AutoNodeStack(parser(),thisVariant());
2289
2290 // get next token
2291 Token tok=parser()->tokenizer.lex();
2292 // skip whitespace
2293 while (tok.is_any_of(TokenRetval::TK_WHITESPACE,TokenRetval::TK_NEWPARA)) tok=parser()->tokenizer.lex();
2294 // should find a html tag now
2296 bool isHeader=FALSE;
2297 if (tok.is(TokenRetval::TK_HTMLTAG))
2298 {
2299 tagId=Mappers::htmlTagMapper->map(parser()->context.token->name);
2300 if (tagId==HtmlTagType::XML_ITEM && !parser()->context.token->endTag) // found <item> tag
2301 {
2302 retval = Token::make_RetVal_TableRow();
2303 }
2304 if (tagId==HtmlTagType::XML_LISTHEADER && !parser()->context.token->endTag) // found <listheader> tag
2305 {
2306 retval = Token::make_RetVal_TableRow();
2307 isHeader=TRUE;
2308 }
2309 }
2310
2311 // parse one or more rows
2312 while (retval.is(TokenRetval::RetVal_TableRow))
2313 {
2315 DocHtmlRow *tr = children().get_last<DocHtmlRow>();
2316 retval=tr->parseXml(isHeader);
2317 isHeader=FALSE;
2318 }
2319
2321
2322 tagId=Mappers::htmlTagMapper->map(parser()->context.token->name);
2323 return tagId==HtmlTagType::XML_LIST && parser()->context.token->endTag ? Token::make_RetVal_OK() : retval;
2324}
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: