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

Constructor & Destructor Documentation

◆ DocHtmlTable()

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

Definition at line 1265 of file docnode.h.

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

1269{ 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 2178 of file docnode.cpp.

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

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

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

2025{
2026 return m_caption!=nullptr;
2027}

References m_caption.

◆ numColumns()

size_t DocHtmlTable::numColumns ( ) const
inline

◆ numRows()

size_t DocHtmlTable::numRows ( ) const
inline

Definition at line 1267 of file docnode.h.

1267{ 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 2043 of file docnode.cpp.

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

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

Referenced by attribs(), and DocHtmlTable().

◆ m_caption

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

Definition at line 1278 of file docnode.h.

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

◆ m_numCols

size_t DocHtmlTable::m_numCols = 0
private

Definition at line 1280 of file docnode.h.

Referenced by computeTableGrid(), and numColumns().


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