73e45ce8ceee39823400e8c1c7e7fc9d1d363f4c
chmalee
  Fri Jan 22 08:40:30 2021 -0800
Support the standard bigBed URL substitutinos in bigPsl, refs #24672

diff --git src/hg/hgc/hgc.c src/hg/hgc/hgc.c
index 8021f17..b8ada21 100644
--- src/hg/hgc/hgc.c
+++ src/hg/hgc/hgc.c
@@ -3079,37 +3079,43 @@
     struct bptFile *bpt = bigBedOpenExtraIndex(bbi, "name", &fieldIx);
     bbList = bigBedNameQuery(bbi, bpt, fieldIx, item, lm);
     }
 else
     bbList = bigBedIntervalQuery(bbi, seqName, ivStart, ivEnd, 0, lm);
 
 /* print out extra fields */
 for (bb = bbList; bb != NULL; bb = bb->next)
     {
     char *restFields[256];
     int restCount = chopTabs(cloneString(bb->rest), restFields);
     if (sameString(restFields[0], item))
         {
         /* print standard position information */
         char *strand = restFields[2];
-        printPos(seqName, ivStart, ivEnd, strand, FALSE, item);
         int bedSize = 25;
         int restBedFields = bedSize - 3;
+        struct slPair *extraFieldPairs = NULL;
         if (restCount > restBedFields)
             {
             char **extraFields = (restFields + restBedFields);
             int extraFieldCount = restCount - restBedFields;
+            extraFieldPairs = getExtraFields(tdb, extraFields, extraFieldCount);
+            char *itemForUrl = getIdInUrl(tdb, item);
+            printCustomUrlWithFields(tdb, item, item, item == itemForUrl, extraFieldPairs);
+            if (itemForUrl)
+                printIframe(tdb, itemForUrl);
+            printPos(seqName, ivStart, ivEnd, strand, FALSE, item);
             int printCount = extraFieldsPrint(tdb,NULL,extraFields, extraFieldCount);
             printCount += 0;
             }
         }
     }
 
 char *bedRow[32];
 char startBuf[16], endBuf[16];
 
 int lastChromId = -1;
 char chromName[bbi->chromBpt->keySize+1];
 
 boolean firstTime = TRUE;
 for (bb = bbList; bb != NULL; bb = bb->next)
     {
@@ -4260,31 +4266,32 @@
         headerItem = NULL;
     else if ((  sameString(type, "narrowPeak")
              || sameString(type, "broadPeak")
              || sameString(type, "gappedPeak") )
          &&  headerItem
          &&  sameString(headerItem, ".") )
         headerItem = NULL;
     }
 /* Print header. */
 genericHeader(tdb, headerItem);
 
 if (differentString(type, "bigInteract") && differentString(type, "interact"))
     {
     // skip generic URL code as these may have multiple items returned for a click
     itemForUrl = getIdInUrl(tdb, item);
-    if (itemForUrl != NULL && trackDbSetting(tdb, "url") && differentString(type, "bigBed"))
+    if (itemForUrl != NULL && trackDbSetting(tdb, "url") && differentString(type, "bigBed")
+            && differentString(type, "bigPsl"))
         {
         printCustomUrl(tdb, itemForUrl, item == itemForUrl);
         printIframe(tdb, itemForUrl);
         }
     }
 if (plus != NULL)
     {
     fputs(plus, stdout);
     }
 if (container != NULL)
     {
     genericContainerClick(conn, container, tdb, item, itemForUrl);
     }
 else if (wordCount > 0)
     {