38791fcc8e27d95bf1ecde01035aae26027f956b
max
  Thu Feb 18 05:05:17 2021 -0800
making hgBlat json format look more like our API, refs #27010

diff --git src/lib/psl.c src/lib/psl.c
index 3d4b4ae..fc445ce 100644
--- src/lib/psl.c
+++ src/lib/psl.c
@@ -183,58 +183,56 @@
 fprintf(f, "%u,", el->qNumInsert);
 fprintf(f, "%d,", el->qBaseInsert);
 fprintf(f, "%u,", el->tNumInsert);
 fprintf(f, "%d,", el->tBaseInsert);
 fprintf(f, "\"%s\",", el->strand);
 fprintf(f, "\"%s\",", el->qName);
 fprintf(f, "%u,", el->qSize);
 fprintf(f, "%u,", el->qStart);
 fprintf(f, "%u,", el->qEnd);
 fprintf(f, "\"%s\",", el->tName);
 fprintf(f, "%u,", el->tSize);
 fprintf(f, "%u,", el->tStart);
 fprintf(f, "%u,", el->tEnd);
 fprintf(f, "%u,", el->blockCount);
 
-fputs("[", f);
+fputs("\"", f);
 for (int i=0; i<el->blockCount; ++i)
     {
     fprintf(f, "%u", el->blockSizes[i]);
     if (i < el->blockCount-1)
         fputc(',', f);
     }
-fputs("]", f);
-fputs(",", f);
+fputs("\",", f);
 
-fputs("[", f);
+fputs("\"", f);
 for (int i=0; i<el->blockCount; ++i)
     {
     fprintf(f, "%u", el->qStarts[i]);
     if (i < el->blockCount-1)
         fputc(',', f); // json does not allow trailing commas
     }
-fputs("]", f);
-fputs(",", f);
+fputs("\",", f);
 
-fputs("[", f);
+fputs("\"", f);
 for (int i=0; i<el->blockCount; ++i)
     {
     fprintf(f, "%u", el->tStarts[i]);
     if (i < el->blockCount-1)
         fputc(',', f);
     }
-fputs("]", f);
+fputs("\"", f);
 
 if (el->qSequence)
     {
     fputc(',',f);
     fputc('[',f);
     for (int i=0; i<el->blockCount; ++i)
 	{
 	fprintf(f, "'%s'", el->qSequence[i]);
         if (i < el->blockCount-1)
             fputc(',', f);
 	}
     fputc(']',f);
     fputc(',',f);
 
     fputc('[',f);
@@ -574,46 +572,52 @@
 
 void pslWriteAll(struct psl *pslList, char *fileName, boolean writeHeader)
 /* Write a psl file from list. */
 {
 FILE *f;
 struct psl *psl;
 
 f = mustOpen(fileName, "w");
 if (writeHeader)
     pslWriteHead(f);
 for (psl = pslList; psl != NULL; psl = psl->next)
     pslTabOut(psl, f);
 fclose(f);
 }
 
-void pslWriteAllJson(struct psl *pslList, FILE *f, boolean writeHeader)
+void pslWriteAllJson(struct psl *pslList, FILE *f, char *db, boolean writeHeader)
 /* Write a psl file from list as a json array . */
 {
-fputs("[\n", f);
+fputs("{\n", f);
 if (writeHeader) 
+    {
+    fputs("\"track\": \"blat\",\n", f);
+    fprintf(f, "\"genome\": \"%s\",\n", db);
+    fputs("\"fields\": ", f);
     pslLabelColumnsJson(f);
     fputs(",\n", f);
+    }
+fputs("\"blat\" : [\n", f);
 
 for (struct psl *psl = pslList; psl; psl = psl->next)
     {
     pslOutputJson(psl, f);
     if (psl->next)
         fputs(",\n", f);
     }
 
-puts("\n]\n");
+puts("\n]\n}\n");
 }
 
 void pslxFileOpen(char *fileName, enum gfType *retQueryType, enum gfType *retTargetType, struct lineFile **retLf)
 /* Read header part of psl and make sure it's right.  Return
  * sequence types and file handle. */
 {
 char *line;
 int lineSize;
 char *words[30];
 char *version;
 int wordCount;
 int i;
 enum gfType qt = gftRna,  tt = gftDna;
 struct lineFile *lf = lineFileOpen(fileName, TRUE);