static void gv_to_gml(Agraph_t* G, FILE* outFile) { Agnode_t* n; Agedge_t* e; fprintf (outFile, "graph [\n version 2\n"); if (agisdirected(G)) fprintf (outFile, " directed 1\n"); else fprintf (outFile, " directed 0\n"); emitGraphAttrs (G, outFile); /* FIX: Not sure how to handle default attributes or subgraphs */ for (n = agfstnode(G); n; n = agnxtnode (G, n)) { emitNode (G, n, outFile); } for (n = agfstnode(G); n; n = agnxtnode (G, n)) { for (e = agfstout(G, n); e; e = agnxtout (G, e)) { emitEdge (G, e, outFile); } } fprintf (outFile, "]\n"); }
std::string OTMLEmitter::emitNode(const OTMLNodePtr& node, int currentDepth) { std::stringstream ss; // emit nodes if(currentDepth >= 0) { // fill spaces for current depth for(int i=0;i<currentDepth;++i) ss << " "; // emit node tag if(node->hasTag()) { ss << node->tag(); // add ':' to if the node is unique or has value if(node->hasValue() || node->isUnique() || node->isNull()) ss << ":"; } else ss << "-"; // emit node value if(node->isNull()) ss << " ~"; else if(node->hasValue()) { ss << " "; std::string value = node->value(); // emit multiline values if(value.find("\n") != std::string::npos) { if(value[value.length()-1] == '\n' && value[value.length()-2] == '\n') ss << "|+"; else if(value[value.length()-1] == '\n') ss << "|"; else ss << "|-"; // multilines for(std::size_t pos = 0; pos < value.length(); ++pos) { ss << "\n"; // fill spaces for multiline depth for(int i=0;i<currentDepth+1;++i) ss << " "; // fill until a new line while(pos < value.length()) { if(value[pos] == '\n') break; ss << value[pos++]; } } // emit inline values } else ss << value; } } // emit children for(int i=0;i<node->size();++i) { if(currentDepth >= 0 || i != 0) ss << "\n"; ss << emitNode(node->atIndex(i), currentDepth+1); } return ss.str(); }