/** Used for items found inside a paragraph, which due to XHTML restrictions * have to be outside of the paragraph. This method will forcefully end * the current paragraph and forceStartParagraph() will restart it. */ void HtmlDocVisitor::forceEndParagraph(DocNode *n) { //printf("forceEndParagraph(%p) %d\n",n,n->kind()); if (n->parent() && n->parent()->kind()==DocNode::Kind_Para) { DocPara *para = (DocPara*)n->parent(); int nodeIndex = para->children().findRef(n); nodeIndex--; if (nodeIndex<0) return; // first node while (nodeIndex>=0 && para->children().at(nodeIndex)->kind()==DocNode::Kind_WhiteSpace ) { nodeIndex--; } if (nodeIndex>=0) { DocNode *n = para->children().at(nodeIndex); //printf("n=%p kind=%d outside=%d\n",n,n->kind(),mustBeOutsideParagraph(n)); if (mustBeOutsideParagraph(n)) return; } bool isFirst; bool isLast; getParagraphContext(para,isFirst,isLast); //printf("forceEnd first=%d last=%d\n",isFirst,isLast); if (isFirst && isLast) return; m_t << "</p>" << endl; } }
/** Used for items found inside a paragraph, which due to XHTML restrictions * have to be outside of the paragraph. This method will forcefully start * the paragraph, that was previously ended by forceEndParagraph(). */ void HtmlDocVisitor::forceStartParagraph(DocNode *n) { //printf("forceStartParagraph(%p) %d\n",n,n->kind()); if (n->parent() && n->parent()->kind()==DocNode::Kind_Para) // if we are inside a paragraph { DocPara *para = (DocPara*)n->parent(); int nodeIndex = para->children().findRef(n); int numNodes = para->children().count(); nodeIndex++; if (nodeIndex==numNodes) return; // last node while (nodeIndex<numNodes && para->children().at(nodeIndex)->kind()==DocNode::Kind_WhiteSpace ) { nodeIndex++; } if (nodeIndex<numNodes) { DocNode *n = para->children().at(nodeIndex); if (mustBeOutsideParagraph(n)) return; } else { return; // only whitespace at the end! } bool isFirst; bool isLast; getParagraphContext(para,isFirst,isLast); //printf("forceStart first=%d last=%d\n",isFirst,isLast); if (isFirst && isLast) return; m_t << "<p>"; } }
void HtmlDocVisitor::visitPost(DocPara *p) { bool needsTag = FALSE; if (p && p->parent()) { switch (p->parent()->kind()) { case DocNode::Kind_Section: case DocNode::Kind_Internal: case DocNode::Kind_HtmlListItem: case DocNode::Kind_HtmlDescData: case DocNode::Kind_HtmlCell: case DocNode::Kind_SimpleListItem: case DocNode::Kind_AutoListItem: case DocNode::Kind_SimpleSect: case DocNode::Kind_XRefItem: case DocNode::Kind_Copy: case DocNode::Kind_HtmlBlockQuote: needsTag = TRUE; break; case DocNode::Kind_Root: needsTag = !((DocRoot*)p->parent())->singleLine(); break; default: needsTag = FALSE; } } QCString context; // if the last element of a paragraph is something that should be outside of // the paragraph (<ul>,<dl>,<table>) then that will already have ended the // paragraph and we don't need to do it here int nodeIndex = p->children().count()-1; if (p && nodeIndex>=0) { while (nodeIndex>=0 && p->children().at(nodeIndex)->kind()==DocNode::Kind_WhiteSpace) { nodeIndex--; } if (nodeIndex>=0) { DocNode *n = p->children().at(nodeIndex); if (mustBeOutsideParagraph(n)) { needsTag = FALSE; } } } bool isFirst; bool isLast; getParagraphContext(p,isFirst,isLast); //printf("endPara first=%d last=%d\n",isFirst,isLast); if (isFirst && isLast) needsTag=FALSE; //printf("DocPara::visitPost needsTag=%d\n",needsTag); if (needsTag) m_t << "</p>\n"; }
void HtmlDocVisitor::visitPre(DocPara *p) { if (m_hide) return; //printf("DocPara::visitPre: parent of kind %d ", // p->parent() ? p->parent()->kind() : -1); bool needsTag = FALSE; if (p && p->parent()) { switch (p->parent()->kind()) { case DocNode::Kind_Section: case DocNode::Kind_Internal: case DocNode::Kind_HtmlListItem: case DocNode::Kind_HtmlDescData: case DocNode::Kind_HtmlCell: case DocNode::Kind_SimpleListItem: case DocNode::Kind_AutoListItem: case DocNode::Kind_SimpleSect: case DocNode::Kind_XRefItem: case DocNode::Kind_Copy: needsTag = TRUE; break; case DocNode::Kind_Root: needsTag = !((DocRoot*)p->parent())->singleLine(); break; default: needsTag = FALSE; } } // if the first element of a paragraph is something that should be outside of // the paragraph (<ul>,<dl>,<table>,..) then that will already started the // paragraph and we don't need to do it here uint nodeIndex = 0; if (p && nodeIndex<p->children().count()) { while (nodeIndex<p->children().count() && p->children().at(nodeIndex)->kind()==DocNode::Kind_WhiteSpace) { nodeIndex++; } if (nodeIndex<p->children().count()) { DocNode *n = p->children().at(nodeIndex); if (mustBeOutsideParagraph(n)) { needsTag = FALSE; } } } // check if this paragraph is the first or last child of a <li> or <dd>. // this allows us to mark the tag with a special class so we can // fix the otherwise ugly spacing. int t; static const char *contexts[7] = { "", // 0 " class=\"startli\"", // 1 " class=\"startdd\"", // 2 " class=\"endli\"", // 3 " class=\"enddd\"", // 4 " class=\"starttd\"", // 5 " class=\"endtd\"" // 6 }; bool isFirst; bool isLast; t = getParagraphContext(p,isFirst,isLast); //printf("startPara first=%d last=%d\n",isFirst,isLast); if (isFirst && isLast) needsTag=FALSE; //printf(" needsTag=%d\n",needsTag); // write the paragraph tag (if needed) if (needsTag) m_t << "<p" << contexts[t] << ">"; }