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

Constructor & Destructor Documentation

◆ DocHtmlTable()

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

Definition at line 1251 of file docnode.h.

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

1255{ 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 2176 of file docnode.cpp.

2177{
2178 //printf("computeTableGrid()\n");
2179 RowSpanList rowSpans;
2180 uint32_t maxCols=0;
2181 uint32_t rowIdx=1;
2182 for (auto &rowNode : children())
2183 {
2184 uint32_t colIdx=1;
2185 uint32_t cells=0;
2186 DocHtmlRow *row = std::get_if<DocHtmlRow>(&rowNode);
2187 if (row)
2188 {
2189 for (auto &cellNode : row->children())
2190 {
2191 DocHtmlCell *cell = std::get_if<DocHtmlCell>(&cellNode);
2192 if (cell)
2193 {
2194 uint32_t rs = cell->rowSpan();
2195 uint32_t cs = cell->colSpan();
2196
2197 for (size_t i=0;i<rowSpans.size();i++)
2198 {
2199 if (rowSpans[i].rowsLeft>0 &&
2200 rowSpans[i].column==colIdx)
2201 {
2202 colIdx=rowSpans[i].column+1;
2203 cells++;
2204 }
2205 }
2206 if (rs>0) rowSpans.emplace_back(rs,colIdx);
2207 //printf("found cell at (%d,%d)\n",rowIdx,colIdx);
2208 cell->setRowIndex(rowIdx);
2209 cell->setColumnIndex(colIdx);
2210 colIdx+=cs;
2211 cells++;
2212 }
2213 }
2214 for (size_t i=0;i<rowSpans.size();i++)
2215 {
2216 if (rowSpans[i].rowsLeft>0) rowSpans[i].rowsLeft--;
2217 }
2218 row->setVisibleCells(cells);
2219 row->setRowIndex(rowIdx);
2220 rowIdx++;
2221 }
2222 if (colIdx-1>maxCols) maxCols=colIdx-1;
2223 }
2224 m_numCols = maxCols;
2225}
DocNodeList & children()
Definition docnode.h:142
void setColumnIndex(uint32_t idx)
Definition docnode.h:1197
void setRowIndex(uint32_t idx)
Definition docnode.h:1196
uint32_t rowSpan() const
Definition docnode.cpp:1797
uint32_t colSpan() const
Definition docnode.cpp:1809
void setVisibleCells(uint32_t n)
Definition docnode.h:1236
void setRowIndex(uint32_t idx)
Definition docnode.h:1241
size_t m_numCols
Definition docnode.h:1266
std::vector< ActiveRowSpan > RowSpanList
List of ActiveRowSpan classes.
Definition docnode.cpp:2170

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

2033{
2034 if (!children().empty() && std::holds_alternative<DocHtmlRow>(children().front()))
2035 {
2036 return &children().front();
2037 }
2038 return nullptr;
2039}
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 2022 of file docnode.cpp.

2023{
2024 return m_caption!=nullptr;
2025}

References m_caption.

◆ numColumns()

size_t DocHtmlTable::numColumns ( ) const
inline

◆ numRows()

size_t DocHtmlTable::numRows ( ) const
inline

Definition at line 1253 of file docnode.h.

1253{ 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 2041 of file docnode.cpp.

2042{
2043 AUTO_TRACE();
2044 Token retval = Token::make_RetVal_OK();
2045 auto ns = AutoNodeStack(parser(),thisVariant());
2046
2047getrow:
2048 // get next token
2049 Token tok=parser()->tokenizer.lex();
2050 // skip whitespace
2051 while (tok.is_any_of(TokenRetval::TK_WHITESPACE,TokenRetval::TK_NEWPARA)) tok=parser()->tokenizer.lex();
2052 // should find a html tag now
2053 if (tok.is(TokenRetval::TK_HTMLTAG))
2054 {
2055 HtmlTagType tagId=Mappers::htmlTagMapper->map(parser()->context.token->name);
2056 if (tagId==HtmlTagType::HTML_THEAD && !parser()->context.token->endTag) // found <thead> tag
2057 {
2058 goto getrow;
2059 }
2060 else if (tagId==HtmlTagType::HTML_TBODY && !parser()->context.token->endTag) // found <tbody> tag
2061 {
2062 goto getrow;
2063 }
2064 else if (tagId==HtmlTagType::HTML_TFOOT && !parser()->context.token->endTag) // found <tfoot> tag
2065 {
2066 goto getrow;
2067 }
2068 else if (tagId==HtmlTagType::HTML_TR && !parser()->context.token->endTag) // found <tr> tag
2069 {
2070 // no caption, just rows
2071 retval = Token::make_RetVal_TableRow();
2072 }
2073 else if (tagId==HtmlTagType::HTML_CAPTION && !parser()->context.token->endTag) // found <caption> tag
2074 {
2075 if (m_caption)
2076 {
2077 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"table already has a caption, found another one");
2078 }
2079 else
2080 {
2081 m_caption = createDocNode<DocHtmlCaption>(parser(),thisVariant(),parser()->context.token->attribs);
2082 retval=std::get<DocHtmlCaption>(*m_caption).parse();
2083
2084 if (retval.is(TokenRetval::RetVal_OK)) // caption was parsed ok
2085 {
2086 goto getrow;
2087 }
2088 }
2089 }
2090 else // found wrong token
2091 {
2092 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected <tr> or <caption> tag but "
2093 "found <%s%s> instead!", parser()->context.token->endTag ? "/" : "", qPrint(parser()->context.token->name));
2094 }
2095 }
2096 else if (tok.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF)) // premature end of comment
2097 {
2098 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected end of comment while looking"
2099 " for a <tr> or <caption> tag");
2100 }
2101 else // token other than html token
2102 {
2103 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected <tr> tag but found %s token instead!",
2104 tok.to_string());
2105 }
2106
2107 // parse one or more rows
2108 while (retval.is(TokenRetval::RetVal_TableRow))
2109 {
2111 retval = children().get_last<DocHtmlRow>()->parse();
2112 }
2113
2115
2116 return retval.is(TokenRetval::RetVal_EndTable) ? Token::make_RetVal_OK() : retval;
2117}
Token parse()
Definition docnode.cpp:2041
void computeTableGrid()
determines the location of all cells in a grid, resolving row and column spans.
Definition docnode.cpp:2176
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:167
#define AUTO_TRACE(...)
Definition docnode.cpp:46
std::unique_ptr< DocNodeVariant > createDocNode(Args &&...args)
Definition docnode.h:1471
#define warn_doc_error(file, line, fmt,...)
Definition message.h:74
const Mapper< HtmlTagType > * htmlTagMapper
const char * qPrint(const char *s)
Definition qcstring.h:661
void append(Args &&... args)
Append a new DocNodeVariant to the list by constructing it with type T and parameters Args.
Definition docnode.h:1379
T * get_last()
Returns a pointer to the last element in the list if that element exists and holds a T,...
Definition docnode.h:1390
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(), qPrint(), DocNode::thisVariant(), Token::to_string(), DocParserContext::token, DocParser::tokenizer, and warn_doc_error.

Referenced by parse().

◆ parseXml()

Token DocHtmlTable::parseXml ( )

Definition at line 2119 of file docnode.cpp.

2120{
2121 AUTO_TRACE();
2122 Token retval = Token::make_RetVal_OK();
2123 auto ns = AutoNodeStack(parser(),thisVariant());
2124
2125 // get next token
2126 Token tok=parser()->tokenizer.lex();
2127 // skip whitespace
2128 while (tok.is_any_of(TokenRetval::TK_WHITESPACE,TokenRetval::TK_NEWPARA)) tok=parser()->tokenizer.lex();
2129 // should find a html tag now
2131 bool isHeader=FALSE;
2132 if (tok.is(TokenRetval::TK_HTMLTAG))
2133 {
2134 tagId=Mappers::htmlTagMapper->map(parser()->context.token->name);
2135 if (tagId==HtmlTagType::XML_ITEM && !parser()->context.token->endTag) // found <item> tag
2136 {
2137 retval = Token::make_RetVal_TableRow();
2138 }
2139 if (tagId==HtmlTagType::XML_LISTHEADER && !parser()->context.token->endTag) // found <listheader> tag
2140 {
2141 retval = Token::make_RetVal_TableRow();
2142 isHeader=TRUE;
2143 }
2144 }
2145
2146 // parse one or more rows
2147 while (retval.is(TokenRetval::RetVal_TableRow))
2148 {
2150 DocHtmlRow *tr = children().get_last<DocHtmlRow>();
2151 retval=tr->parseXml(isHeader);
2152 isHeader=FALSE;
2153 }
2154
2156
2157 tagId=Mappers::htmlTagMapper->map(parser()->context.token->name);
2158 return tagId==HtmlTagType::XML_LIST && parser()->context.token->endTag ? Token::make_RetVal_OK() : retval;
2159}
#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 1265 of file docnode.h.

Referenced by attribs(), and DocHtmlTable().

◆ m_caption

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

Definition at line 1264 of file docnode.h.

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

◆ m_numCols

size_t DocHtmlTable::m_numCols = 0
private

Definition at line 1266 of file docnode.h.

Referenced by computeTableGrid(), and numColumns().


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