int PNode_op_sizes(PNode *self, Datum *d) { PNode *tmpNode = PDB_allocNode(self->pdb); Datum *k; PQuery *q = PNode_startQuery(self); yajl_gen_map_open(self->yajl); while (k = PQuery_key(q)) { if(!Datum_beginsWithCString_(k, "_")) { yajl_gen_datum(self->yajl, PNode_key(self)); PNode_setPid_(tmpNode, PNode_value(self)); yajl_gen_integer(self->yajl, PNode_size(tmpNode)); } if (q) { PQuery_enumerate(q); } else { PNode_next(self); } } yajl_gen_map_close(self->yajl); Datum_appendYajl_(d, self->yajl); return 0; }
int PNode_op_pairs(PNode *self, Datum *d) { PQuery *q = PNode_startQuery(self); PNode *tmpNode = PDB_allocNode(self->pdb); Datum *k; yajl_gen_array_open(self->yajl); while (k = PQuery_key(q)) { yajl_gen_array_open(self->yajl); yajl_gen_datum(self->yajl, k); if(!Datum_beginsWithCString_(k, "_")) { PNode_setPid_(tmpNode, PNode_value(self)); PNode_op_object(tmpNode, d); } else { yajl_gen_datum(self->yajl, PNode_value(self)); } PQuery_enumerate(q); yajl_gen_array_close(self->yajl); } yajl_gen_array_close(self->yajl); Datum_appendYajl_(d, self->yajl); return 0; }
int PNode_op_values(PNode *self, Datum *d) { PQuery *q = PNode_startQuery(self); PNode *tmpNode = PDB_allocNode(self->pdb); Datum *k; Datum *attribute = PQuery_attribute(q); int hasAttribute = Datum_size(attribute) != 0; yajl_gen_array_open(self->yajl); while (k = PQuery_key(q)) { if(!Datum_beginsWithCString_(k, "_")) { PNode_setPid_(tmpNode, PNode_value(self)); if(hasAttribute) { //Datum *a = PQuery_attributeValue(q); Datum *a = PNode_at_(tmpNode, attribute); yajl_gen_array_open(self->yajl); yajl_gen_datum(self->yajl, k); if(a) { yajl_gen_datum(self->yajl, a); } else { yajl_gen_null(self->yajl); } yajl_gen_array_close(self->yajl); } else { PNode_setPid_(tmpNode, PNode_value(self)); PNode_op_object(tmpNode, 0x0); } } else { yajl_gen_datum(self->yajl, PNode_value(self)); } PQuery_enumerate(q); } yajl_gen_array_close(self->yajl); Datum_appendYajl_(d, self->yajl); return 0; }
int PNode_asHtmlRow(PNode *self, Datum *d) { PQuery *q = PNode_startQuery(self); Datum *k; Datum_appendCString_(d, "<tr>"); while (k = PQuery_key(q)) { if(Datum_beginsWithCString_(k, "_")) { Datum *v = PNode_value(self); Datum_appendCString_(d, "<td>"); if(v) Datum_append_(d, v); Datum_appendCString_(d, "</td><td> </td>"); } PQuery_enumerate(q); } Datum_appendCString_(d, "</tr>"); return 0; }
int VertexServer_api_view(VertexServer *self) { Datum *before = HttpRequest_queryValue_(self->httpRequest, "before"); Datum *after = HttpRequest_queryValue_(self->httpRequest, "after"); Datum *mode = HttpRequest_queryValue_(self->httpRequest, "mode"); PNode *node = PDB_allocNode(self->pdb); PNode *tmpNode = PDB_allocNode(self->pdb); Datum *d = self->result; int maxCount = 200; if (PNode_moveToPathIfExists_(node, HttpRequest_uriPath(self->httpRequest)) != 0) { VertexServer_setErrorCString_(self, "path does not exist: "); VertexServer_appendError_(self, HttpRequest_uriPath(self->httpRequest)); return -1; } Datum_appendCString_(d, "<!DOCTYPE html>\n"); Datum_appendCString_(d, "<html>\n"); Datum_appendCString_(d, "<head>\n"); Datum_appendCString_(d, "<title>"); Datum_append_(d, HttpRequest_uriPath(self->httpRequest)); Datum_appendCString_(d, "</title>\n"); Datum_appendCString_(d, "<meta charset=\"utf-8\">\n"); Datum_appendCString_(d, "<style>"); Datum_appendCString_(d, "body, td { font-family: Helvetica; font-size: 12px; margin-top:2em; margin-left:2em; }"); Datum_appendCString_(d, ".path { font-weight: normal; }"); Datum_appendCString_(d, ".note { color:#aaaaaa; }"); Datum_appendCString_(d, ".key { color:#000000; }"); Datum_appendCString_(d, ".value { color:#888888; white-space:pre; }"); Datum_appendCString_(d, "a { color: #0000aa; text-decoration: none; }"); Datum_appendCString_(d, "</style>\n"); Datum_appendCString_(d, "</head>\n"); Datum_appendCString_(d, "<body>\n"); /* if(Datum_size(HttpRequest_uriPath(self->httpRequest)) == 0) { Datum_appendCString_(d, "/"); } else { */ Datum_appendCString_(d, "<font class=path>"); Datum_appendCString_(d, "/"); Datum_append_(d, HttpRequest_uriPath(self->httpRequest)); Datum_appendCString_(d, "</font>"); Datum_appendCString_(d, "<br>\n"); //} PNode_first(node); if(Datum_size(before)) { PNode_jump_(node, before); int i; for(i = 0; i < maxCount; i++) { PNode_previous(node); } PNode_next(node); } else if(Datum_size(after)) { PNode_jump_(node, after); } if (Datum_size(after) && PNode_key(node)) { Datum_appendCString_(d, "<a href=/"); Datum_append_(d, HttpRequest_uriPath(self->httpRequest)); Datum_appendCString_(d, "?before="); Datum_append_(d, PNode_key(node)); Datum_appendCString_(d, ">previous</a>"); } Datum_appendCString_(d, "<ul>\n"); Datum_appendCString_(d, "<table cellpadding=0 cellspacing=0 border=0>"); { Datum *k; int count = 0; while ((k = PNode_key(node)) && count < maxCount) { if (Datum_beginsWithCString_(k , "_")) { Datum_appendCString_(d, "<tr>"); Datum_appendCString_(d, "<td align=right style=\"line-height:1.5em\">"); Datum_appendCString_(d, "<font class=key>"); Datum_append_(d, k); Datum_appendCString_(d, "</font>"); Datum_appendCString_(d, " "); Datum_appendCString_(d, "</td>"); Datum_appendCString_(d, "<td>"); Datum_appendCString_(d, " <span class=value>"); Datum_append_(d, PNode_value(node)); Datum_appendCString_(d, "</span>"); Datum_appendCString_(d, "<br>\n"); Datum_appendCString_(d, "</td>"); Datum_appendCString_(d, "</tr>"); } else { if(Datum_equalsCString_(mode, "table")) { PNode_setPid_(tmpNode, PNode_value(node)); PNode_asHtmlRow(tmpNode, d); } else { Datum_appendCString_(d, "<tr>"); Datum_appendCString_(d, "<td align=right>"); Datum_appendCString_(d, "<font class=key>"); Datum_append_(d, k); Datum_appendCString_(d, "</font><br>\n"); Datum_appendCString_(d, "</td>"); Datum_appendCString_(d, "<td style=\"line-height:1.5em\">"); Datum_appendCString_(d, " <a href="); if(Datum_size(HttpRequest_uriPath(self->httpRequest)) != 0) Datum_appendCString_(d, "/"); Datum_append_(d, HttpRequest_uriPath(self->httpRequest)); Datum_appendCString_(d, "/"); Datum_append_(d, k); Datum_appendCString_(d, "> ↠ "); Datum_appendLong_(d, PNode_nodeSizeAtCursor(node)); Datum_appendCString_(d, "</a> "); Datum_appendCString_(d, "<font class=value>"); Datum_appendCString_(d, "</td>"); Datum_appendCString_(d, "</tr>"); } } PNode_next(node); count ++; } } Datum_appendCString_(d, "</table>"); Datum_appendCString_(d, "</ul>\n"); if(PNode_key(node)) { Datum_appendCString_(d, "<a href=/"); Datum_append_(d, HttpRequest_uriPath(self->httpRequest)); Datum_appendCString_(d, "?after="); Datum_append_(d, PNode_key(node)); Datum_appendCString_(d, ">next</a><br>"); } Datum_appendCString_(d, "</body>\n"); Datum_appendCString_(d, "</html>\n"); HttpResponse_setContentType_(self->httpResponse, "text/html; charset=utf-8"); return 0; }