void DocbookDocVisitor::visitPre(DocParamList *pl) { if (m_hide) return; QListIterator<DocNode> li(pl->parameters()); DocNode *param; m_t << " <row>" << endl; if (!li.toFirst()) { m_t << " <entry></entry>" << endl; } else { m_t << " <entry>"; int cnt = 0; for (li.toFirst();(param=li.current());++li) { if (cnt) { m_t << ", "; } if (param->kind()==DocNode::Kind_Word) { visit((DocWord*)param); } else if (param->kind()==DocNode::Kind_LinkedWord) { visit((DocLinkedWord*)param); } cnt++; } m_t << "</entry>" << endl; } m_t << " <entry>"; }
static void generateBriefDoc(FTextStream &t,Definition *def) { QCString brief = def->briefDescription(TRUE); //printf("*** %p: generateBriefDoc(%s)='%s'\n",def,def->name().data(),brief.data()); if (!brief.isEmpty()) { DocNode *root = validatingParseDoc(def->briefFile(),def->briefLine(), def,0,brief,FALSE,FALSE,0,TRUE,TRUE); QCString relPath = relativePathToRoot(def->getOutputFileBase()); HtmlCodeGenerator htmlGen(t,relPath); HtmlDocVisitor *visitor = new HtmlDocVisitor(t,htmlGen,def); root->accept(visitor); delete visitor; delete root; } }
void RTFDocVisitor::visitPre(DocParamList *pl) { if (m_hide) return; DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocParamList)}\n"); // Put in the direction: in/out/in,out if specified. if (pl->direction()!=DocParamSect::Unspecified) { m_t << "["; if (pl->direction()==DocParamSect::In) { m_t << "in"; } else if (pl->direction()==DocParamSect::Out) { m_t << "out"; } else if (pl->direction()==DocParamSect::InOut) { m_t << "in,out"; } m_t << "] "; } m_t << "{\\i "; //QStrListIterator li(pl->parameters()); //const char *s; QListIterator<DocNode> li(pl->parameters()); DocNode *param; bool first=TRUE; for (li.toFirst();(param=li.current());++li) { if (!first) m_t << ","; else first=FALSE; if (param->kind()==DocNode::Kind_Word) { visit((DocWord*)param); } else if (param->kind()==DocNode::Kind_LinkedWord) { visit((DocLinkedWord*)param); } } m_t << "} "; m_lastIsPara=TRUE; }
void XmlDocVisitor::visitPre(DocParamList *pl) { if (m_hide) return; m_t << "<parameteritem>" << endl; m_t << "<parameternamelist>" << endl; //QStrListIterator li(pl->parameters()); //const char *s; QListIterator<DocNode> li(pl->parameters()); DocNode *param; for (li.toFirst();(param=li.current());++li) { m_t << "<parametername"; if (pl->direction()!=DocParamSect::Unspecified) { m_t << " direction=\""; if (pl->direction()==DocParamSect::In) { m_t << "in"; } else if (pl->direction()==DocParamSect::Out) { m_t << "out"; } else if (pl->direction()==DocParamSect::InOut) { m_t << "inout"; } m_t << "\""; } m_t << ">"; if (param->kind()==DocNode::Kind_Word) { visit((DocWord*)param); } else if (param->kind()==DocNode::Kind_LinkedWord) { visit((DocLinkedWord*)param); } m_t << "</parametername>" << endl; } m_t << "</parameternamelist>" << endl; m_t << "<parameterdescription>" << endl; }
void LatexDocVisitor::visitPre(DocParamList *pl) { if (m_hide) return; m_t << "\\item["; if (pl->direction()!=DocParamSect::Unspecified) { m_t << "\\mbox{"; if (pl->direction()==DocParamSect::In) { m_t << "$\\leftarrow$"; } else if (pl->direction()==DocParamSect::Out) { m_t << "$\\rightarrow$"; } else if (pl->direction()==DocParamSect::InOut) { m_t << "$\\leftrightarrow$"; } m_t << "} "; } m_t << "{\\em "; //QStrListIterator li(pl->parameters()); //const char *s; QListIterator<DocNode> li(pl->parameters()); DocNode *param; bool first=TRUE; for (li.toFirst();(param=li.current());++li) { if (!first) m_t << ","; else first=FALSE; m_insideItem=TRUE; if (param->kind()==DocNode::Kind_Word) { visit((DocWord*)param); } else if (param->kind()==DocNode::Kind_LinkedWord) { visit((DocLinkedWord*)param); } m_insideItem=FALSE; } m_t << "}]"; }
void ManDocVisitor::visitPre(DocParamList *pl) { if (m_hide) return; m_t << "\\fI"; //QStrListIterator li(pl->parameters()); //const char *s; QListIterator<DocNode> li(pl->parameters()); DocNode *param; bool first=TRUE; for (li.toFirst();(param=li.current());++li) { if (!first) m_t << ","; else first=FALSE; if (param->kind()==DocNode::Kind_Word) { visit((DocWord*)param); } else if (param->kind()==DocNode::Kind_LinkedWord) { visit((DocLinkedWord*)param); } } m_t << "\\fP "; }
static void generateBriefDoc(QTextStream &t, QSharedPointer<Definition> def) { QString brief = def->briefDescription(true); /* ( save for testing ) if (brief.isEmpty()) { SortedList<QSharedPointer<GroupDef>> *groups = def->partOfGroups(); if (groups) { for (auto gd : *groups) { brief = gd->briefDescription(true); if (! brief.isEmpty()) { break; } } } } */ if (! brief.isEmpty()) { DocNode *root = validatingParseDoc(def->briefFile(), def->briefLine(), def, QSharedPointer<MemberDef>(), brief, false, false, "", true, true); QString relPath = relativePathToRoot(def->getOutputFileBase()); HtmlCodeGenerator htmlGen(t, relPath); HtmlDocVisitor *visitor = new HtmlDocVisitor(t, htmlGen, def); root->accept(visitor); delete visitor; delete root; } }
void HtmlDocVisitor::visitPre(DocParamList *pl) { //printf("DocParamList::visitPre\n"); if (m_hide) return; m_t << " <tr>"; DocParamSect *sect = 0; if (pl->parent()->kind()==DocNode::Kind_ParamSect) { sect=(DocParamSect*)pl->parent(); } if (sect && sect->hasInOutSpecifier()) { m_t << "<td class=\"paramdir\">"; if (pl->direction()!=DocParamSect::Unspecified) { m_t << "["; if (pl->direction()==DocParamSect::In) { m_t << "in"; } else if (pl->direction()==DocParamSect::Out) { m_t << "out"; } else if (pl->direction()==DocParamSect::InOut) { m_t << "in,out"; } m_t << "]"; } m_t << "</td>"; } if (sect && sect->hasTypeSpecifier()) { m_t << "<td class=\"paramtype\">"; QListIterator<DocNode> li(pl->paramTypes()); DocNode *type; bool first=TRUE; for (li.toFirst();(type=li.current());++li) { if (!first) m_t << " | "; else first=FALSE; if (type->kind()==DocNode::Kind_Word) { visit((DocWord*)type); } else if (type->kind()==DocNode::Kind_LinkedWord) { visit((DocLinkedWord*)type); } } m_t << "</td>"; } m_t << "<td class=\"paramname\">"; //QStrListIterator li(pl->parameters()); //const char *s; QListIterator<DocNode> li(pl->parameters()); DocNode *param; bool first=TRUE; for (li.toFirst();(param=li.current());++li) { if (!first) m_t << ","; else first=FALSE; if (param->kind()==DocNode::Kind_Word) { visit((DocWord*)param); } else if (param->kind()==DocNode::Kind_LinkedWord) { visit((DocLinkedWord*)param); } } m_t << "</td><td>"; }
void RTFDocVisitor::visitPre(DocParamList *pl) { static int columnPos[4][5] = { { 2, 25, 100, 100, 100 }, // no inout, no type { 3, 14, 35, 100, 100 }, // inout, no type { 3, 25, 50, 100, 100 }, // no inout, type { 4, 14, 35, 55, 100 }, // inout, type }; int config=0; if (m_hide) return; DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocParamList)}\n"); DocParamSect::Type parentType = DocParamSect::Unknown; DocParamSect *sect = 0; if (pl->parent() && pl->parent()->kind()==DocNode::Kind_ParamSect) { parentType = ((DocParamSect*)pl->parent())->type(); sect=(DocParamSect*)pl->parent(); } bool useTable = parentType==DocParamSect::Param || parentType==DocParamSect::RetVal || parentType==DocParamSect::Exception || parentType==DocParamSect::TemplateParam; if (sect && sect->hasInOutSpecifier()) config+=1; if (sect && sect->hasTypeSpecifier()) config+=2; if (useTable) { int i; m_t << "\\trowd \\trgaph108\\trleft426\\tblind426" "\\trbrdrt\\brdrs\\brdrw10\\brdrcf15 " "\\trbrdrl\\brdrs\\brdrw10\\brdrcf15 " "\\trbrdrb\\brdrs\\brdrw10\\brdrcf15 " "\\trbrdrr\\brdrs\\brdrw10\\brdrcf15 " "\\trbrdrh\\brdrs\\brdrw10\\brdrcf15 " "\\trbrdrv\\brdrs\\brdrw10\\brdrcf15 "<< endl; for (i=0;i<columnPos[config][0];i++) { m_t << "\\clvertalt\\clbrdrt\\brdrs\\brdrw10\\brdrcf15 " "\\clbrdrl\\brdrs\\brdrw10\\brdrcf15 " "\\clbrdrb\\brdrs\\brdrw10\\brdrcf15 " "\\clbrdrr \\brdrs\\brdrw10\\brdrcf15 " "\\cltxlrtb " "\\cellx" << (rtf_pageWidth*columnPos[config][i+1]/100) << endl; } m_t << "\\pard \\widctlpar\\intbl\\adjustright" << endl; } if (sect && sect->hasInOutSpecifier()) { if (useTable) { m_t << "{"; } // Put in the direction: in/out/in,out if specified. if (pl->direction()!=DocParamSect::Unspecified) { if (pl->direction()==DocParamSect::In) { m_t << "in"; } else if (pl->direction()==DocParamSect::Out) { m_t << "out"; } else if (pl->direction()==DocParamSect::InOut) { m_t << "in,out"; } } if (useTable) { m_t << "\\cell }"; } } if (sect && sect->hasTypeSpecifier()) { if (useTable) { m_t << "{"; } QListIterator<DocNode> li(pl->paramTypes()); DocNode *type; bool first=TRUE; for (li.toFirst();(type=li.current());++li) { if (!first) m_t << " | "; else first=FALSE; if (type->kind()==DocNode::Kind_Word) { visit((DocWord*)type); } else if (type->kind()==DocNode::Kind_LinkedWord) { visit((DocLinkedWord*)type); } } if (useTable) { m_t << "\\cell }"; } } if (useTable) { m_t << "{"; } m_t << "{\\i "; //QStrListIterator li(pl->parameters()); //const char *s; QListIterator<DocNode> li(pl->parameters()); DocNode *param; bool first=TRUE; for (li.toFirst();(param=li.current());++li) { if (!first) m_t << ","; else first=FALSE; if (param->kind()==DocNode::Kind_Word) { visit((DocWord*)param); } else if (param->kind()==DocNode::Kind_LinkedWord) { visit((DocLinkedWord*)param); } } m_t << "} "; if (useTable) { m_t << "\\cell }{"; } m_lastIsPara=TRUE; }
void LatexDocVisitor::visitPre(DocParamList *pl) { if (m_hide) return; DocParamSect::Type parentType = DocParamSect::Unknown; DocParamSect *sect = 0; if (pl->parent() && pl->parent()->kind()==DocNode::Kind_ParamSect) { parentType = ((DocParamSect*)pl->parent())->type(); sect=(DocParamSect*)pl->parent(); } bool useTable = parentType==DocParamSect::Param || parentType==DocParamSect::RetVal || parentType==DocParamSect::Exception || parentType==DocParamSect::TemplateParam; if (!useTable) { m_t << "\\item["; } if (sect && sect->hasInOutSpecifier()) { if (pl->direction()!=DocParamSect::Unspecified) { m_t << "\\mbox{\\tt "; if (pl->direction()==DocParamSect::In) { m_t << "in"; } else if (pl->direction()==DocParamSect::Out) { m_t << "out"; } else if (pl->direction()==DocParamSect::InOut) { m_t << "in,out"; } m_t << "} "; } if (useTable) m_t << " & "; } if (sect && sect->hasTypeSpecifier()) { QListIterator<DocNode> li(pl->paramTypes()); DocNode *type; bool first=TRUE; for (li.toFirst();(type=li.current());++li) { if (!first) m_t << " | "; else first=FALSE; if (type->kind()==DocNode::Kind_Word) { visit((DocWord*)type); } else if (type->kind()==DocNode::Kind_LinkedWord) { visit((DocLinkedWord*)type); } } if (useTable) m_t << " & "; } m_t << "{\\em "; //QStrListIterator li(pl->parameters()); //const char *s; QListIterator<DocNode> li(pl->parameters()); DocNode *param; bool first=TRUE; for (li.toFirst();(param=li.current());++li) { if (!first) m_t << ","; else first=FALSE; m_insideItem=TRUE; if (param->kind()==DocNode::Kind_Word) { visit((DocWord*)param); } else if (param->kind()==DocNode::Kind_LinkedWord) { visit((DocLinkedWord*)param); } m_insideItem=FALSE; } m_t << "}"; if (useTable) { m_t << " & "; } else { m_t << "]"; } }
static void visitCaption(DocbookDocVisitor *parent, QList<DocNode> children) { QListIterator<DocNode> cli(children); DocNode *n; for (cli.toFirst();(n=cli.current());++cli) n->accept(parent); }
// Read a document from a binary msgpack blob. // The blob data must remain valid for the lifetime of this Document (because a // string object in the document contains a StringRef into the original blob). // If Multi, then this sets root to an array and adds top-level objects to it. // If !Multi, then it only reads a single top-level object, even if there are // more, and sets root to that. // Returns false if failed due to illegal format. bool Document::readFromBlob(StringRef Blob, bool Multi) { msgpack::Reader MPReader(Blob); SmallVector<StackLevel, 4> Stack; if (Multi) { // Create the array for multiple top-level objects. Root = getArrayNode(); Stack.push_back(StackLevel({Root, (size_t)-1, nullptr})); } do { // On to next element (or key if doing a map key next). // Read the value. Object Obj; if (!MPReader.read(Obj)) { if (Multi && Stack.size() == 1) { // OK to finish here as we've just done a top-level element with Multi break; } return false; // Finished too early } // Convert it into a DocNode. DocNode Node; switch (Obj.Kind) { case Type::Nil: Node = getNode(); break; case Type::Int: Node = getNode(Obj.Int); break; case Type::UInt: Node = getNode(Obj.UInt); break; case Type::Boolean: Node = getNode(Obj.Bool); break; case Type::Float: Node = getNode(Obj.Float); break; case Type::String: Node = getNode(Obj.Raw); break; case Type::Map: Node = getMapNode(); break; case Type::Array: Node = getArrayNode(); break; default: return false; // Raw and Extension not supported } // Store it. if (Stack.empty()) Root = Node; else if (Stack.back().Node.getKind() == Type::Array) { // Reading an array entry. auto &Array = Stack.back().Node.getArray(); Array.push_back(Node); } else { auto &Map = Stack.back().Node.getMap(); if (!Stack.back().MapEntry) { // Reading a map key. Stack.back().MapEntry = &Map[Node]; } else { // Reading the value for the map key read in the last iteration. *Stack.back().MapEntry = Node; Stack.back().MapEntry = nullptr; } } // See if we're starting a new array or map. switch (Node.getKind()) { case msgpack::Type::Array: case msgpack::Type::Map: Stack.push_back(StackLevel({Node, Obj.Length, nullptr})); break; default: break; } // Pop finished stack levels. while (!Stack.empty()) { if (Stack.back().Node.getKind() == msgpack::Type::Array) { if (Stack.back().Node.getArray().size() != Stack.back().Length) break; } else { if (Stack.back().MapEntry || Stack.back().Node.getMap().size() != Stack.back().Length) break; } Stack.pop_back(); } } while (!Stack.empty()); return true; }
/// Write a MsgPack document to a binary MsgPack blob. void Document::writeToBlob(std::string &Blob) { Blob.clear(); raw_string_ostream OS(Blob); msgpack::Writer MPWriter(OS); SmallVector<WriterStackLevel, 4> Stack; DocNode Node = getRoot(); for (;;) { switch (Node.getKind()) { case Type::Array: MPWriter.writeArraySize(Node.getArray().size()); Stack.push_back( {Node, DocNode::MapTy::iterator(), Node.getArray().begin(), false}); break; case Type::Map: MPWriter.writeMapSize(Node.getMap().size()); Stack.push_back( {Node, Node.getMap().begin(), DocNode::ArrayTy::iterator(), true}); break; case Type::Nil: MPWriter.writeNil(); break; case Type::Boolean: MPWriter.write(Node.getBool()); break; case Type::Int: MPWriter.write(Node.getInt()); break; case Type::UInt: MPWriter.write(Node.getUInt()); break; case Type::String: MPWriter.write(Node.getString()); break; default: llvm_unreachable("unhandled msgpack object kind"); } // Pop finished stack levels. while (!Stack.empty()) { if (Stack.back().Node.getKind() == Type::Map) { if (Stack.back().MapIt != Stack.back().Node.getMap().end()) break; } else { if (Stack.back().ArrayIt != Stack.back().Node.getArray().end()) break; } Stack.pop_back(); } if (Stack.empty()) break; // Get the next value. if (Stack.back().Node.getKind() == Type::Map) { if (Stack.back().OnKey) { // Do the key of a key,value pair in a map. Node = Stack.back().MapIt->first; Stack.back().OnKey = false; } else { Node = Stack.back().MapIt->second; ++Stack.back().MapIt; Stack.back().OnKey = true; } } else { Node = *Stack.back().ArrayIt; ++Stack.back().ArrayIt; } } }