940408c6bd688d9a804588cdd80051c73d6d13c2
kate
  Tue Apr 10 23:45:28 2012 -0700
hgEncodeApi and hgApi cleanup complete
diff --git src/hg/lib/cv.c src/hg/lib/cv.c
index 64b3e73..7b37e3e 100644
--- src/hg/lib/cv.c
+++ src/hg/lib/cv.c
@@ -39,30 +39,99 @@
 }
 
 const char *cvTermNormalized(const char *sloppyTerm)
 // returns the proper term to use when requesting a cvTerm hash
 {
 static const char *approvedSpellingOfCell     = CV_TERM_CELL;
 static const char *approvedSpellingOfAntibody = CV_TERM_ANTIBODY;
 if (sameWord((char *)sloppyTerm,CV_UGLY_TOT_CELLTYPE) || sameWord((char *)sloppyTerm,CV_UGLY_TERM_CELL_LINE))
     return approvedSpellingOfCell;
 if (sameWord((char *)sloppyTerm,CV_UGLY_TERM_ANTIBODY))
     return approvedSpellingOfAntibody;
 
 return sloppyTerm;
 }
 
+#define CV_UNKNOWN "unknown"
+
+void cvTermJson(struct dyString *json, char *type, struct hash *termHash)
+/* Print out CV term in JSON format. Currently just supports dataType, cellType, antibody
+ * and antibody types */
+{
+dyStringPrintf(json, "{");
+dyStringPrintf(json, "\"" CV_TERM "\":\"%s\"", (char *)hashFindVal(termHash, CV_TERM));
+dyStringPrintf(json, ",");
+if (sameString(type, "dataType"))
+    {
+    dyStringPrintf(json, "\"" CV_LABEL "\":\"%s\"", (char *)hashOptionalVal(termHash, CV_LABEL, CV_UNKNOWN));
+    dyStringPrintf(json, ",");
+    dyStringPrintf(json, "\"" CV_DATA_GROUP "\":\"%s\"", (char *)hashOptionalVal(termHash, CV_DATA_GROUP, CV_UNKNOWN));
+    dyStringPrintf(json, ",");
+    dyStringPrintf(json, "\"" CV_DESCRIPTION "\":\"%s\"", (char *)hashOptionalVal(termHash, CV_DESCRIPTION, CV_UNKNOWN));
+    }
+else if (sameString(type, "cellType"))  // NOTE: 'ugly' term by above criteria ?  Should reconcile before publishing API
+    {
+    dyStringPrintf(json, "\"" CV_DESCRIPTION "\":\"");
+    // TODO: handle modularly
+    dyStringAppendEscapeQuotes(json, (char *)hashOptionalVal(termHash, CV_DESCRIPTION, CV_UNKNOWN), '"', '\\');
+    dyStringPrintf(json, "\",");
+    dyStringPrintf(json, "\"" CV_TIER "\":\"%s\"", (char *)hashOptionalVal(termHash, CV_TIER, CV_UNKNOWN));
+    dyStringPrintf(json, ",");
+    dyStringPrintf(json, "\"" CV_KARYOTYPE "\":\"");
+    dyStringAppendEscapeQuotes(json, (char *)hashOptionalVal(termHash, CV_KARYOTYPE, CV_UNKNOWN), '"', '\\');
+    dyStringPrintf(json, "\",");
+    dyStringPrintf(json, "\"" CV_ORGANISM "\":\"%s\"", (char *)hashOptionalVal(termHash, CV_ORGANISM, CV_UNKNOWN));
+    dyStringPrintf(json, ",");
+    dyStringPrintf(json, "\"" CV_SEX "\":\"%s\"", (char *)hashOptionalVal(termHash, CV_SEX, CV_UNKNOWN));
+    dyStringPrintf(json, ",");
+    dyStringPrintf(json, "\"" CV_TISSUE "\":\"%s\"", (char *)hashOptionalVal(termHash, CV_TISSUE, CV_UNKNOWN));
+    dyStringPrintf(json, ",");
+    dyStringPrintf(json, "\"" CV_VENDOR_NAME "\":\"%s\"", (char *)hashOptionalVal(termHash, CV_VENDOR_NAME, CV_UNKNOWN));
+    dyStringPrintf(json, ",");
+    dyStringPrintf(json, "\"" CV_VENDOR_ID "\":\"%s\"", (char *)hashOptionalVal(termHash, CV_VENDOR_ID, CV_UNKNOWN));
+    dyStringPrintf(json, ",");
+    dyStringPrintf(json, "\"" CV_LINEAGE "\":\"%s\"", (char *)hashOptionalVal(termHash, CV_LINEAGE, CV_UNKNOWN));
+    dyStringPrintf(json, ",");
+    dyStringPrintf(json, "\"" CV_TERM_ID "\":\"%s\"", (char *)hashOptionalVal(termHash, CV_TERM_ID, CV_UNKNOWN));
+    dyStringPrintf(json, ",");
+    dyStringPrintf(json, "\"" CV_TERM_URL "\":\"%s\"", (char *)hashOptionalVal(termHash, CV_TERM_URL, CV_UNKNOWN));
+    // TODO: add URL protocol file ?
+    }
+else if (sameString(type, "antibody"))
+    {
+    dyStringPrintf(json, "\"" CV_TARGET "\":\"%s\"", (char *)hashOptionalVal(termHash, CV_TARGET, CV_UNKNOWN));
+    dyStringPrintf(json, ",");
+    dyStringPrintf(json, "\"" CV_ANTIBODY_DESCRIPTION "\":\"%s\"", (char *)hashOptionalVal(termHash, CV_ANTIBODY_DESCRIPTION, CV_UNKNOWN));
+    dyStringPrintf(json, ",");
+    dyStringPrintf(json, "\"" CV_TARGET_DESCRIPTION "\":\"%s\"", (char *)hashOptionalVal(termHash, CV_TARGET_DESCRIPTION, CV_UNKNOWN));
+    dyStringPrintf(json, ",");
+    dyStringPrintf(json, "\"" CV_VENDOR_NAME "\":\"%s\"", (char *)hashOptionalVal(termHash, CV_VENDOR_NAME, CV_UNKNOWN));
+    dyStringPrintf(json, ",");
+    dyStringPrintf(json, "\"" CV_VENDOR_ID "\":\"%s\"", (char *)hashOptionalVal(termHash, CV_VENDOR_ID, CV_UNKNOWN));
+    dyStringPrintf(json, ",");
+    dyStringPrintf(json, "\"" CV_TERM_LAB "\":\"%s\"", (char *)hashOptionalVal(termHash, CV_TERM_LAB, CV_UNKNOWN));
+    dyStringPrintf(json, ",");
+    dyStringPrintf(json, "\"" CV_TARGET_ID "\":\"%s\"", (char *)hashOptionalVal(termHash, CV_TARGET_ID, CV_UNKNOWN));
+    dyStringPrintf(json, ",");
+    dyStringPrintf(json, "\"" CV_TARGET_URL "\":\"%s\"", (char *)hashOptionalVal(termHash, CV_TARGET_URL, CV_UNKNOWN));
+    dyStringPrintf(json, ",");
+    dyStringPrintf(json, "\"" CV_ORDER_URL "\":\"%s\"", (char *)hashOptionalVal(termHash, CV_ORDER_URL, CV_UNKNOWN));
+    // TODO: add validation file(s) ?
+    }
+dyStringPrintf(json, "}\n");
+}
+
 char *cvLabNormalize(const char *sloppyTerm)
 /* CV inconsistency work-arounds.  Return lab name trimmed of parenthesized trailing
  * info (a few ENCODE labs have this in metaDb and/or in CV term --
  * PI name embedded in parens in the CV term).  Also fixes other problems until
  * cleaned up in CV, metaDb and user processes.  Caller must free mem. */
 {
 char *lab = (char *)sloppyTerm;
 
 if (containsStringNoCase((char *)sloppyTerm, "Weissman"))
     lab = "Yale-Weissman";
 
 char *ret = cloneString(lab);
 chopSuffixAt(ret, '(');
 return ret;
 }