Doxygen
Loading...
Searching...
No Matches
DocHtmlRow Class Referencefinal

Node representing a HTML table row. More...

#include <src/docnode.h>

Inheritance diagram for DocHtmlRow:
Collaboration diagram for DocHtmlRow:

Public Member Functions

 DocHtmlRow (DocParser *parser, DocNodeVariant *parent, const HtmlAttribList &attribs)
size_t numCells () const
const HtmlAttribListattribs () const
Token parse ()
Token parseXml (bool header)
bool isHeading () const
void setVisibleCells (uint32_t n)
uint32_t visibleCells () const
uint32_t rowIndex () 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 setRowIndex (uint32_t idx)

Private Attributes

HtmlAttribList m_attribs
uint32_t m_visibleCells = 0
uint32_t m_rowIdx = static_cast<uint32_t>(-1)

Friends

class DocHtmlTable

Additional Inherited Members

Protected Types inherited from DocNode
enum  RefType {
  Unknown , Anchor , Section , Table ,
  Requirement
}
Protected Member Functions inherited from DocNode
void setInsidePreformatted (bool p)

Detailed Description

Node representing a HTML table row.

Definition at line 1250 of file docnode.h.

Constructor & Destructor Documentation

◆ DocHtmlRow()

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

Definition at line 1254 of file docnode.h.

DocCompoundNode(DocParser *parser, DocNodeVariant *parent)
Definition docnode.h:141
HtmlAttribList m_attribs
Definition docnode.h:1267
const HtmlAttribList & attribs() const
Definition docnode.h:1257
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 & DocHtmlRow::attribs ( ) const
inline

Definition at line 1257 of file docnode.h.

1257{ return m_attribs; }

References m_attribs.

Referenced by DocHtmlRow(), DocbookDocVisitor::operator()(), and HtmlDocVisitor::operator()().

◆ isHeading()

bool DocHtmlRow::isHeading ( ) const

Definition at line 2005 of file docnode.cpp.

2006{ // a row is a table heading if all cells are marked as such
2007 bool heading=true;
2008 for (const auto &n : children())
2009 {
2010 const DocHtmlCell *cell = std::get_if<DocHtmlCell>(&n);
2011 if (cell && !cell->isHeading())
2012 {
2013 heading = false;
2014 break;
2015 }
2016 }
2017 return !children().empty() && heading;
2018}
DocNodeList & children()
Definition docnode.h:143
bool isHeading() const
Definition docnode.h:1205
bool empty() const
checks whether the container is empty
Definition growvector.h:140

References DocCompoundNode::children(), GrowVector< T >::empty(), and DocHtmlCell::isHeading().

Referenced by DocHtmlTable::numberHeaderRows(), DocbookDocVisitor::operator()(), RTFDocVisitor::operator()(), parse(), and parseXml().

◆ numCells()

size_t DocHtmlRow::numCells ( ) const
inline

Definition at line 1256 of file docnode.h.

1256{ 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 RTFDocVisitor::operator()().

◆ parse()

Token DocHtmlRow::parse ( )

Definition at line 2080 of file docnode.cpp.

2081{
2082 AUTO_TRACE();
2083 Token retval = Token::make_RetVal_OK();
2084 auto ns = AutoNodeStack(parser(),thisVariant());
2085
2086 bool isHeading=false;
2087 bool isFirst=true;
2088 DocHtmlCell *cell=nullptr;
2089
2090 Token tok = skipSpacesForTable(parser());
2091 // should find a html tag now
2092 if (tok.is(TokenRetval::TK_HTMLTAG))
2093 {
2094 HtmlTagType tagId=Mappers::htmlTagMapper->map(parser()->context.token->name);
2095 if (tagId==HtmlTagType::HTML_TD && !parser()->context.token->endTag) // found <td> tag
2096 {
2097 }
2098 else if (tagId==HtmlTagType::HTML_TH && !parser()->context.token->endTag) // found <th> tag
2099 {
2100 isHeading=true;
2101 }
2102 else // found some other tag
2103 {
2104 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected <td> or <th> tag but "
2105 "found <{}{}> instead!",parser()->context.token->endTag ? "/" : "", parser()->context.token->name);
2106 parser()->tokenizer.pushBackHtmlTag(parser()->context.token->name);
2107 goto endrow;
2108 }
2109 }
2110 else if (tok.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF)) // premature end of comment
2111 {
2112 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected end of comment while looking"
2113 " for a html description title");
2114 goto endrow;
2115 }
2116 else // token other than html token
2117 {
2118 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected <td> or <th> tag but found {} token instead!",
2119 tok.to_string());
2120 goto endrow;
2121 }
2122
2123 // parse one or more cells
2124 do
2125 {
2126 children().append<DocHtmlCell>(parser(),thisVariant(),
2128 isHeading);
2129 cell = children().get_last<DocHtmlCell>();
2130 cell->markFirst(isFirst);
2131 isFirst=false;
2132 retval=cell->parse();
2133 isHeading = retval.is(TokenRetval::RetVal_TableHCell);
2134 //printf("DocHtmlRow:retval=%s\n",retval.to_string());
2135 if (retval.is(TokenRetval::RetVal_EndTableCell))
2136 {
2137 // get next token
2138 retval = skipSpacesForTable(parser());
2139 //printf("DocHtmlRow:retval= next=%s name=%s endTag=%d\n",retval.to_string(),qPrint(parser()->context.token->name),parser()->context.token->endTag);
2140 HtmlTagType tagId=Mappers::htmlTagMapper->map(parser()->context.token->name);
2141 if (tok.is(TokenRetval::TK_HTMLTAG))
2142 {
2143 if ((tagId==HtmlTagType::HTML_TD || tagId==HtmlTagType::HTML_TH) &&
2144 !parser()->context.token->endTag) // found new <td> or <td> tag
2145 {
2146 retval = Token::make_RetVal_TableCell();
2148 }
2149 else if (tagId==HtmlTagType::HTML_TR)
2150 {
2151 if (parser()->context.token->endTag) // found </tr> tag
2152 {
2153 retval = Token::make_RetVal_EndTableRow();
2154 }
2155 else // found <tr> tag
2156 {
2157 retval = Token::make_RetVal_TableRow();
2158 }
2159 }
2160 else if (tagId==HtmlTagType::HTML_TABLE && parser()->context.token->endTag) // found </table>
2161 {
2162 retval = Token::make_RetVal_EndTable();
2163 }
2164 else // found some other tag
2165 {
2166 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected <td>, <th> or <tr> tag but "
2167 "found <{}{}> instead!",parser()->context.token->endTag ? "/" : "", parser()->context.token->name);
2168 parser()->tokenizer.pushBackHtmlTag(parser()->context.token->name);
2169 goto endrow;
2170 }
2171 }
2172 else // token other than html token
2173 {
2174 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected <td>, <th> or <tr> tag but found {} token instead!",
2175 tok.to_string());
2176 goto endrow;
2177 }
2178 }
2179 }
2180 while (retval.is_any_of(TokenRetval::RetVal_TableCell,TokenRetval::RetVal_TableHCell));
2181 cell->markLast(true);
2182
2183endrow:
2184 return retval;
2185}
AutoNodeStack(DocParser *parser, DocNodeVariant *node)
void markLast(bool v=true)
Definition docnode.h:1209
void markFirst(bool v=true)
Definition docnode.h:1208
Token parse()
Definition docnode.cpp:1853
bool isHeading() const
Definition docnode.cpp:2005
DocNodeVariant * thisVariant()
Definition docnode.h:92
void append(Args &&... args)
Append a new DocNodeVariant to the list by constructing it with type T and parameters Args.
Definition docnode.h:1404
T * get_last()
Returns a pointer to the last element in the list if that element exists and holds a T,...
Definition docnode.h:1415
DocTokenizer tokenizer
DocParserContext context
void pushBackHtmlTag(const DString &tag)
bool is(TokenRetval rv) const
TOKEN_SPECIFICATIONS RETVAL_SPECIFICATIONS const char * to_string() const
bool is_any_of(ARGS... args) const
HtmlAttribList attribs
HtmlTagType
Definition cmdmapper.h:174
#define AUTO_TRACE(...)
Definition docnode.cpp:51
static Token skipSpacesForTable(DocParser *parser)
Definition docnode.cpp:2020
#define warn_doc_error(file, line, fmt,...)
Definition message.h:112
const Mapper< HtmlTagType > * htmlTagMapper
TokenInfo * token
Definition docparser_p.h:94

References DocNodeList::append(), TokenInfo::attribs, AUTO_TRACE, AutoNodeStack::AutoNodeStack(), DocCompoundNode::children(), DocParser::context, DocNodeList::get_last(), HTML_TABLE, HTML_TD, HTML_TH, HTML_TR, Mappers::htmlTagMapper, Token::is(), Token::is_any_of(), isHeading(), DocHtmlCell::markFirst(), DocHtmlCell::markLast(), DocHtmlCell::parse(), DocNode::parser(), DocTokenizer::pushBackHtmlTag(), skipSpacesForTable(), DocNode::thisVariant(), Token::to_string(), DocParserContext::token, DocParser::tokenizer, and warn_doc_error.

◆ parseXml()

Token DocHtmlRow::parseXml ( bool header)

Definition at line 2187 of file docnode.cpp.

2188{
2189 AUTO_TRACE();
2190 Token retval = Token::make_RetVal_OK();
2191 auto ns = AutoNodeStack(parser(),thisVariant());
2192
2193 bool isFirst=true;
2194 DocHtmlCell *cell=nullptr;
2195
2196 // get next token
2197 Token tok=parser()->tokenizer.lex();
2198 // skip whitespace
2199 while (tok.is_any_of(TokenRetval::TK_WHITESPACE,TokenRetval::TK_NEWPARA)) tok=parser()->tokenizer.lex();
2200 // should find a html tag now
2201 if (tok.is(TokenRetval::TK_HTMLTAG))
2202 {
2203 HtmlTagType tagId=Mappers::htmlTagMapper->map(parser()->context.token->name);
2204 if (tagId==HtmlTagType::XML_TERM && !parser()->context.token->endTag) // found <term> tag
2205 {
2206 }
2207 else if (tagId==HtmlTagType::XML_DESCRIPTION && !parser()->context.token->endTag) // found <description> tag
2208 {
2209 }
2210 else // found some other tag
2211 {
2212 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected <term> or <description> tag but "
2213 "found <{}> instead!",parser()->context.token->name);
2214 parser()->tokenizer.pushBackHtmlTag(parser()->context.token->name);
2215 goto endrow;
2216 }
2217 }
2218 else if (tok.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF)) // premature end of comment
2219 {
2220 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected end of comment while looking"
2221 " for a html description title");
2222 goto endrow;
2223 }
2224 else // token other than html token
2225 {
2226 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected <td> or <th> tag but found {} token instead!",
2227 tok.to_string());
2228 goto endrow;
2229 }
2230
2231 do
2232 {
2234 cell = children().get_last<DocHtmlCell>();
2235 cell->markFirst(isFirst);
2236 isFirst=false;
2237 retval=cell->parseXml();
2238 }
2239 while (retval.is_any_of(TokenRetval::RetVal_TableCell,TokenRetval::RetVal_TableHCell));
2240 cell->markLast(true);
2241
2242endrow:
2243 return retval;
2244}
Token parseXml()
Definition docnode.cpp:1887

References DocNodeList::append(), TokenInfo::attribs, AUTO_TRACE, AutoNodeStack::AutoNodeStack(), DocCompoundNode::children(), DocParser::context, DocNodeList::get_last(), Mappers::htmlTagMapper, Token::is(), Token::is_any_of(), isHeading(), DocTokenizer::lex(), DocHtmlCell::markFirst(), DocHtmlCell::markLast(), DocNode::parser(), DocHtmlCell::parseXml(), DocTokenizer::pushBackHtmlTag(), DocNode::thisVariant(), Token::to_string(), DocParserContext::token, DocParser::tokenizer, warn_doc_error, XML_DESCRIPTION, and XML_TERM.

◆ rowIndex()

uint32_t DocHtmlRow::rowIndex ( ) const
inline

Definition at line 1263 of file docnode.h.

1263{ return m_rowIdx; }
uint32_t m_rowIdx
Definition docnode.h:1269

References m_rowIdx.

◆ setRowIndex()

void DocHtmlRow::setRowIndex ( uint32_t idx)
inlineprivate

Definition at line 1266 of file docnode.h.

1266{ m_rowIdx = idx; }

References m_rowIdx.

Referenced by DocHtmlTable::computeTableGrid().

◆ setVisibleCells()

void DocHtmlRow::setVisibleCells ( uint32_t n)
inline

Definition at line 1261 of file docnode.h.

1261{ m_visibleCells = n; }
uint32_t m_visibleCells
Definition docnode.h:1268

References m_visibleCells.

Referenced by DocHtmlTable::computeTableGrid().

◆ visibleCells()

uint32_t DocHtmlRow::visibleCells ( ) const
inline

Definition at line 1262 of file docnode.h.

1262{ return m_visibleCells; }

References m_visibleCells.

◆ DocHtmlTable

friend class DocHtmlTable
friend

Definition at line 1252 of file docnode.h.

References DocHtmlTable.

Referenced by DocHtmlTable.

Member Data Documentation

◆ m_attribs

HtmlAttribList DocHtmlRow::m_attribs
private

Definition at line 1267 of file docnode.h.

Referenced by attribs(), and DocHtmlRow().

◆ m_rowIdx

uint32_t DocHtmlRow::m_rowIdx = static_cast<uint32_t>(-1)
private

Definition at line 1269 of file docnode.h.

Referenced by rowIndex(), and setRowIndex().

◆ m_visibleCells

uint32_t DocHtmlRow::m_visibleCells = 0
private

Definition at line 1268 of file docnode.h.

Referenced by setVisibleCells(), and visibleCells().


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