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

Constructor & Destructor Documentation

◆ DocHtmlTable()

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

Definition at line 1266 of file docnode.h.

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

1270{ 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 2193 of file docnode.cpp.

2194{
2195 //printf("computeTableGrid()\n");
2196 RowSpanList rowSpans;
2197 uint32_t maxCols=0;
2198 uint32_t rowIdx=1;
2199 for (auto &rowNode : children())
2200 {
2201 uint32_t colIdx=1;
2202 uint32_t cells=0;
2203 DocHtmlRow *row = std::get_if<DocHtmlRow>(&rowNode);
2204 if (row)
2205 {
2206 for (auto &cellNode : row->children())
2207 {
2208 DocHtmlCell *cell = std::get_if<DocHtmlCell>(&cellNode);
2209 if (cell)
2210 {
2211 uint32_t rs = cell->rowSpan();
2212 uint32_t cs = cell->colSpan();
2213
2214 for (size_t i=0;i<rowSpans.size();i++)
2215 {
2216 if (rowSpans[i].rowsLeft>0 &&
2217 rowSpans[i].column==colIdx)
2218 {
2219 colIdx=rowSpans[i].column+1;
2220 cells++;
2221 }
2222 }
2223 if (rs>0) rowSpans.emplace_back(rs,colIdx);
2224 //printf("found cell at (%d,%d)\n",rowIdx,colIdx);
2225 cell->setRowIndex(rowIdx);
2226 cell->setColumnIndex(colIdx);
2227 colIdx+=cs;
2228 cells++;
2229 }
2230 }
2231 for (size_t i=0;i<rowSpans.size();i++)
2232 {
2233 if (rowSpans[i].rowsLeft>0) rowSpans[i].rowsLeft--;
2234 }
2235 row->setVisibleCells(cells);
2236 row->setRowIndex(rowIdx);
2237 rowIdx++;
2238 }
2239 if (colIdx-1>maxCols) maxCols=colIdx-1;
2240 }
2241 m_numCols = maxCols;
2242}
DocNodeList & children()
Definition docnode.h:142
void setColumnIndex(uint32_t idx)
Definition docnode.h:1212
void setRowIndex(uint32_t idx)
Definition docnode.h:1211
uint32_t rowSpan() const
Definition docnode.cpp:1814
uint32_t colSpan() const
Definition docnode.cpp:1826
void setVisibleCells(uint32_t n)
Definition docnode.h:1251
void setRowIndex(uint32_t idx)
Definition docnode.h:1256
size_t m_numCols
Definition docnode.h:1281
std::vector< ActiveRowSpan > RowSpanList
List of ActiveRowSpan classes.
Definition docnode.cpp:2187

References DocCompoundNode::children(), DocHtmlCell::colSpan(), 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 2049 of file docnode.cpp.

2050{
2051 if (!children().empty() && std::holds_alternative<DocHtmlRow>(children().front()))
2052 {
2053 return &children().front();
2054 }
2055 return nullptr;
2056}
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 2039 of file docnode.cpp.

2040{
2041 return m_caption!=nullptr;
2042}

References m_caption.

◆ numColumns()

size_t DocHtmlTable::numColumns ( ) const
inline

◆ numRows()

size_t DocHtmlTable::numRows ( ) const
inline

Definition at line 1268 of file docnode.h.

1268{ 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 2058 of file docnode.cpp.

2059{
2060 AUTO_TRACE();
2061 Token retval = Token::make_RetVal_OK();
2062 auto ns = AutoNodeStack(parser(),thisVariant());
2063
2064getrow:
2065 // get next token
2066 Token tok=parser()->tokenizer.lex();
2067 // skip whitespace
2068 while (tok.is_any_of(TokenRetval::TK_WHITESPACE,TokenRetval::TK_NEWPARA)) tok=parser()->tokenizer.lex();
2069 // should find a html tag now
2070 if (tok.is(TokenRetval::TK_HTMLTAG))
2071 {
2072 HtmlTagType tagId=Mappers::htmlTagMapper->map(parser()->context.token->name);
2073 if (tagId==HtmlTagType::HTML_THEAD && !parser()->context.token->endTag) // found <thead> tag
2074 {
2075 goto getrow;
2076 }
2077 else if (tagId==HtmlTagType::HTML_TBODY && !parser()->context.token->endTag) // found <tbody> tag
2078 {
2079 goto getrow;
2080 }
2081 else if (tagId==HtmlTagType::HTML_TFOOT && !parser()->context.token->endTag) // found <tfoot> tag
2082 {
2083 goto getrow;
2084 }
2085 else if (tagId==HtmlTagType::HTML_TR && !parser()->context.token->endTag) // found <tr> tag
2086 {
2087 // no caption, just rows
2088 retval = Token::make_RetVal_TableRow();
2089 }
2090 else if (tagId==HtmlTagType::HTML_CAPTION && !parser()->context.token->endTag) // found <caption> tag
2091 {
2092 if (m_caption)
2093 {
2094 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"table already has a caption, found another one");
2095 }
2096 else
2097 {
2098 m_caption = createDocNode<DocHtmlCaption>(parser(),thisVariant(),parser()->context.token->attribs);
2099 retval=std::get<DocHtmlCaption>(*m_caption).parse();
2100
2101 if (retval.is(TokenRetval::RetVal_OK)) // caption was parsed ok
2102 {
2103 goto getrow;
2104 }
2105 }
2106 }
2107 else // found wrong token
2108 {
2109 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected <tr> or <caption> tag but "
2110 "found <{}{}> instead!", parser()->context.token->endTag ? "/" : "", parser()->context.token->name);
2111 }
2112 }
2113 else if (tok.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF)) // premature end of comment
2114 {
2115 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected end of comment while looking"
2116 " for a <tr> or <caption> tag");
2117 }
2118 else // token other than html token
2119 {
2120 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected <tr> tag but found {} token instead!",
2121 tok.to_string());
2122 }
2123
2124 // parse one or more rows
2125 while (retval.is(TokenRetval::RetVal_TableRow))
2126 {
2128 retval = children().get_last<DocHtmlRow>()->parse();
2129 }
2130
2132
2133 return retval.is(TokenRetval::RetVal_EndTable) ? Token::make_RetVal_OK() : retval;
2134}
Token parse()
Definition docnode.cpp:2058
void computeTableGrid()
determines the location of all cells in a grid, resolving row and column spans.
Definition docnode.cpp:2193
DocNodeVariant * thisVariant()
Definition docnode.h:92
DocTokenizer tokenizer
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
std::unique_ptr< DocNodeVariant > createDocNode(Args &&...args)
Definition docnode.h:1486
#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:1394
T * get_last()
Returns a pointer to the last element in the list if that element exists and holds a T,...
Definition docnode.h:1405
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_TBODY, HTML_TFOOT, HTML_THEAD, HTML_TR, Mappers::htmlTagMapper, Token::is(), Token::is_any_of(), DocTokenizer::lex(), m_caption, parse(), DocNode::parser(), DocNode::thisVariant(), Token::to_string(), DocParserContext::token, DocParser::tokenizer, and warn_doc_error.

Referenced by parse().

◆ parseXml()

Token DocHtmlTable::parseXml ( )

Definition at line 2136 of file docnode.cpp.

2137{
2138 AUTO_TRACE();
2139 Token retval = Token::make_RetVal_OK();
2140 auto ns = AutoNodeStack(parser(),thisVariant());
2141
2142 // get next token
2143 Token tok=parser()->tokenizer.lex();
2144 // skip whitespace
2145 while (tok.is_any_of(TokenRetval::TK_WHITESPACE,TokenRetval::TK_NEWPARA)) tok=parser()->tokenizer.lex();
2146 // should find a html tag now
2148 bool isHeader=FALSE;
2149 if (tok.is(TokenRetval::TK_HTMLTAG))
2150 {
2151 tagId=Mappers::htmlTagMapper->map(parser()->context.token->name);
2152 if (tagId==HtmlTagType::XML_ITEM && !parser()->context.token->endTag) // found <item> tag
2153 {
2154 retval = Token::make_RetVal_TableRow();
2155 }
2156 if (tagId==HtmlTagType::XML_LISTHEADER && !parser()->context.token->endTag) // found <listheader> tag
2157 {
2158 retval = Token::make_RetVal_TableRow();
2159 isHeader=TRUE;
2160 }
2161 }
2162
2163 // parse one or more rows
2164 while (retval.is(TokenRetval::RetVal_TableRow))
2165 {
2167 DocHtmlRow *tr = children().get_last<DocHtmlRow>();
2168 retval=tr->parseXml(isHeader);
2169 isHeader=FALSE;
2170 }
2171
2173
2174 tagId=Mappers::htmlTagMapper->map(parser()->context.token->name);
2175 return tagId==HtmlTagType::XML_LIST && parser()->context.token->endTag ? Token::make_RetVal_OK() : retval;
2176}
#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 1280 of file docnode.h.

Referenced by attribs(), and DocHtmlTable().

◆ m_caption

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

Definition at line 1279 of file docnode.h.

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

◆ m_numCols

size_t DocHtmlTable::m_numCols = 0
private

Definition at line 1281 of file docnode.h.

Referenced by computeTableGrid(), and numColumns().


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