6103cfb97b45dafba47eced8573b21179823a63e hiram Fri Apr 5 15:49:35 2019 -0700 better html output refs #18869 diff --git src/hg/hubApi/hubApi.c src/hg/hubApi/hubApi.c index 867efe9..f754cdf 100644 --- src/hg/hubApi/hubApi.c +++ src/hg/hubApi/hubApi.c @@ -212,54 +212,54 @@ unsigned end = start + 10000; if (end > chromSize) end = chromSize; char *genome = NULL; if (hub) genome = hub->genomeList->name; if (db) { if (hub) { char urlReference[2048]; safef(urlReference, sizeof(urlReference), " <a href='%s/getData/track?hubUrl=%s&genome=%s&track=%s&chrom=%s&start=%u&end=%u' target=_blank>(sample getData)%s</a>\n", urlPrefix, hub->url, genome, tdb->track, chrom, start, end, errorPrint); if (tdb->parent) - hPrintf("<li>%s : %s subtrack of parent: %s%s</li>\n", tdb->track, tdb->type, tdb->parent->track, urlReference); + hPrintf("<li><b>%s</b>: %s subtrack of parent: %s%s</li>\n", tdb->track, tdb->type, tdb->parent->track, urlReference); else - hPrintf("<li>%s : %s%s</li>\n", tdb->track, tdb->type, urlReference); + hPrintf("<li><b>%s</b>: %s%s</li>\n", tdb->track, tdb->type, urlReference); } else { char urlReference[2048]; safef(urlReference, sizeof(urlReference), " <a href='%s/getData/track?db=%s&chrom=%s&track=%s&start=%u&end=%u' target=_blank>(sample getData)%s</a>\n", urlPrefix, db, chrom, tdb->track, start, end, errorPrint); if (tdb->parent) - hPrintf("<li>%s : %s subtrack of parent: %s%s</li>\n", tdb->track, tdb->type, tdb->parent->track, urlReference); + hPrintf("<li><b>%s</b>: %s subtrack of parent: %s%s</li>\n", tdb->track, tdb->type, tdb->parent->track, urlReference); else - hPrintf("<li>%s : %s%s</li>\n", tdb->track, tdb->type, urlReference ); + hPrintf("<li><b>%s</b>: %s%s</li>\n", tdb->track, tdb->type, urlReference ); } } else if (hub) { char urlReference[2048]; safef(urlReference, sizeof(urlReference), " <a href='%s/getData/track?hubUrl=%s&genome=%s&track=%s&chrom=%s&start=%u&end=%u' target=_blank>(sample getData)%s</a>\n", urlPrefix, hub->url, genome, tdb->track, chrom, start, end, errorPrint); if (tdb->parent) - hPrintf("<li>%s : %s subtrack of parent: %s%s</li>\n", tdb->track, tdb->type, tdb->parent->track, urlReference); + hPrintf("<li><b>%s</b>: %s subtrack of parent: %s%s</li>\n", tdb->track, tdb->type, tdb->parent->track, urlReference); else - hPrintf("<li>%s : %s%s</li>\n", tdb->track, tdb->type, urlReference); + hPrintf("<li><b>%s</b>: %s%s</li>\n", tdb->track, tdb->type, urlReference); } else hPrintf("<li>%s : %s not db hub track ?</li>\n", tdb->track, tdb->type); } static void hubSampleUrl(struct trackHub *hub, struct trackDb *tdb, long chromCount, long itemCount, char *chromName, unsigned chromSize, char *genome, char *errorString) { unsigned start = chromSize / 4; unsigned end = start + 10000; if (end > chromSize) end = chromSize; char errorPrint[2048]; @@ -276,44 +276,44 @@ { if (startsWithWord("bigBed", tdb->type)) safef(countsMessage, sizeof(countsMessage), " : %ld chroms : %ld item count ", chromCount, itemCount); else if (startsWithWord("bigWig", tdb->type)) safef(countsMessage, sizeof(countsMessage), " : %ld chroms : %ld bases covered ", chromCount, itemCount); else safef(countsMessage, sizeof(countsMessage), " : %ld chroms : %ld count ", chromCount, itemCount); } if (isSupportedType(tdb->type)) { char urlReference[2048]; safef(urlReference, sizeof(urlReference), "<a href='%s/getData/track?hubUrl=%s&genome=%s&track=%s&chrom=%s&start=%u&end=%u' target=_blank>(sample getData)%s</a>\n", urlPrefix, hub->url, genome, tdb->track, chromName, start, end, errorPrint); if (startsWithWord("bigBed", tdb->type)) - hPrintf(" <li>%s : %s%s%s</li>\n", tdb->track, tdb->type, countsMessage, urlReference); + hPrintf(" <li><b>%s</b>: %s%s%s</li>\n", tdb->track, tdb->type, countsMessage, urlReference); else if (startsWithWord("bigWig", tdb->type)) - hPrintf(" <li>%s : %s%s%s</li>\n", tdb->track, tdb->type, countsMessage, urlReference); + hPrintf(" <li><b>%s</b>: %s%s%s</li>\n", tdb->track, tdb->type, countsMessage, urlReference); else - hPrintf(" <li>%s : %s%s%s</li>\n", tdb->track, tdb->type, countsMessage, urlReference); + hPrintf(" <li><b>%s</b>: %s%s%s</li>\n", tdb->track, tdb->type, countsMessage, urlReference); } else { if (startsWithWord("bigBed", tdb->type)) - hPrintf(" <li>%s : %s%s</li>\n", tdb->track, tdb->type, countsMessage); + hPrintf(" <li><b>%s</b>: %s%s</li>\n", tdb->track, tdb->type, countsMessage); else if (startsWithWord("bigWig", tdb->type)) - hPrintf(" <li>%s : %s%s</li>\n", tdb->track, tdb->type, countsMessage); + hPrintf(" <li><b>%s</b>: %s%s</li>\n", tdb->track, tdb->type, countsMessage); else - hPrintf(" <li>%s : %s%s</li>\n", tdb->track, tdb->type, countsMessage); + hPrintf(" <li><b>%s</b>: %s%s</li>\n", tdb->track, tdb->type, countsMessage); } } /* static void hubSampleUrl(struct trackHub *hub, struct trackDb *tdb, * long chromCount, long itemCount, char *chromName, unsigned chromSize, * char *genome) */ static void bbiLargestChrom(struct bbiChromInfo *chromList, char **chromName, unsigned *chromSize) /* find largest chromosome name and size in the chromList */ { if (chromName && chromSize) { *chromSize = 0; char *returnName = NULL; struct bbiChromInfo *el; @@ -455,93 +455,93 @@ { char *bigDataIndex = NULL; char *relIdxUrl = trackDbSetting(tdbEl, "bigDataIndex"); if (relIdxUrl != NULL) bigDataIndex = trackHubRelativeUrl(hub->genomeList->trackDbFile, relIdxUrl); char *bigDataUrl = trackDbSetting(tdbEl, "bigDataUrl"); char *longName = NULL; unsigned longSize = 0; struct dyString *errors = newDyString(1024); (void) bbiBriefMeasure(tdbEl->type, bigDataUrl, bigDataIndex, &chromCount, &itemCount, errors, &longName, &longSize); chromSize = longSize; chromName = longName; } } if (tdbIsCompositeView(tdbEl)) - hPrintf("<li>%s : %s : composite view of parent: %s</li>\n", tdbEl->track, tdbEl->type, tdbEl->parent->track); + hPrintf("<li><b>%s</b>: %s : composite view of parent: %s</li>\n", tdbEl->track, tdbEl->type, tdbEl->parent->track); else { if (isSupportedType(tdbEl->type)) hubSampleUrl(hub, tdbEl, chromCount, itemCount, chromName, chromSize, genome, errorString); else - hPrintf("<li>%s : %s : subtrack of parent: %s</li>\n", tdbEl->track, tdbEl->type, tdbEl->parent->track); + hPrintf("<li><b>%s</b>: %s : subtrack of parent: %s</li>\n", tdbEl->track, tdbEl->type, tdbEl->parent->track); } hashCountTrack(tdbEl, countTracks); if (tdbEl->subtracks) hubSubTracks(hub, db, tdbEl, countTracks, chromCount, itemCount, chromName, chromSize, genome, errorString); } } hPrintf(" </ul></li>\n"); } /* hubSubTracks() */ static void showSubTracks(struct trackHub *hub, char *db, struct trackDb *tdb, struct hash *countTracks, char *chromName, unsigned chromSize, char *errorString) /* tdb has subtracks, show only subTracks, no details */ { hPrintf(" <li><ul>\n"); if (debug) hPrintf(" <li>subtracks for '%s' db: '%s'</li>\n", tdb->track, db); if (tdb->subtracks) { struct trackDb *tdbEl = NULL; for (tdbEl = tdb->subtracks; tdbEl; tdbEl = tdbEl->next) { if (tdbIsCompositeView(tdbEl)) - hPrintf("<li>%s : %s : composite view of parent: %s</li>\n", tdbEl->track, tdbEl->type, tdbEl->parent->track); + hPrintf("<li><b>%s</b>: %s : composite view of parent: %s</li>\n", tdbEl->track, tdbEl->type, tdbEl->parent->track); else { if (isSupportedType(tdbEl->type)) sampleUrl(hub, db, tdbEl, chromName, chromSize, errorString); else - hPrintf("<li>%s : %s : subtrack of parent: %s</li>\n", tdbEl->track, tdbEl->type, tdbEl->parent->track); + hPrintf("<li><b>%s</b>: %s : subtrack of parent: %s</li>\n", tdbEl->track, tdbEl->type, tdbEl->parent->track); } hashCountTrack(tdbEl, countTracks); if (tdbEl->subtracks) showSubTracks(hub, db, tdbEl, countTracks, chromName, chromSize, errorString); } } hPrintf(" </ul></li>\n"); } static void trackSettings(struct trackDb *tdb, struct hash *countTracks) /* process the settingsHash for a trackDb, recursive when subtracks */ { hPrintf(" <li><ul>\n"); // if (tdb->children) haven't yet seen a track with children ? // hPrintf(" <li>%s: has children</li>\n", tdb->track); // else // hPrintf(" <li>%s: NO children</li>\n", tdb->track); struct hashEl *hel; struct hashCookie hc = hashFirst(tdb->settingsHash); while ((hel = hashNext(&hc)) != NULL) { if (sameWord("track", hel->name)) continue; // already output in header if (isEmpty((char *)hel->val)) - hPrintf(" <li>%s : <empty></li>\n", hel->name); + hPrintf(" <li><b>%s</b>: <empty></li>\n", hel->name); else - hPrintf(" <li>%s : '%s'</li>\n", hel->name, (char *)hel->val); + hPrintf(" <li><b>%s</b>: '%s'</li>\n", hel->name, (char *)hel->val); } if (tdb->subtracks) { struct trackDb *tdbEl = NULL; if (debug) hPrintf(" <li>has %d subtrack(s)</li>\n", slCount(tdb->subtracks)); for (tdbEl = tdb->subtracks; tdbEl; tdbEl = tdbEl->next) { hPrintf("<li>subtrack: %s of parent: %s : type: '%s'</li>\n", tdbEl->track, tdbEl->parent->track, tdbEl->type); hashCountTrack(tdbEl, countTracks); trackSettings(tdbEl, countTracks); } } hPrintf(" </ul></li>\n"); } @@ -575,50 +575,50 @@ unsigned longSize = 0; (void) bbiBriefMeasure(tdb->type, bigDataUrl, bigDataIndex, &chromCount, &itemCount, errors, &longName, &longSize); chromSize = longSize; chromName = longName; } } if (depthSearch && bigDataUrl) { if (isSupportedType(tdb->type)) hubSampleUrl(hub, tdb, chromCount, itemCount, chromName, chromSize, genome, errors->string); } else { if (compositeContainer) - hPrintf(" <li>%s : %s : composite track container has %d subtracks</li>\n", tdb->track, tdb->type, slCount(tdb->subtracks)); + hPrintf(" <li><b>%s</b>: %s : composite track container has %d subtracks</li>\n", tdb->track, tdb->type, slCount(tdb->subtracks)); else if (compositeView) - hPrintf(" <li>%s : %s : composite view of parent: %s</li>\n", tdb->track, tdb->type, tdb->parent->track); + hPrintf(" <li><b>%s</b>: %s : composite view of parent: %s</li>\n", tdb->track, tdb->type, tdb->parent->track); else if (superChild) - hPrintf(" <li>%s : %s : superTrack child of parent: %s (sample getData)</li>\n", tdb->track, tdb->type, tdb->parent->track); + hPrintf(" <li><b>%s</b>: %s : superTrack child of parent: %s (sample getData)</li>\n", tdb->track, tdb->type, tdb->parent->track); else if (! depthSearch && bigDataUrl) { if (isSupportedType(tdb->type)) { hubSampleUrl(hub, tdb, chromCount, itemCount, chromName, chromSize, genome, errors->string); } } else { if (isSupportedType(tdb->type)) { hubSampleUrl(hub, tdb, chromCount, itemCount, chromName, chromSize, genome, errors->string); } else - hPrintf(" <li>%s : %s (what is this)</li>\n", tdb->track, tdb->type); + hPrintf(" <li><b>%s</b>: %s (what is this)</li>\n", tdb->track, tdb->type); } } if (allTrackSettings) { hPrintf(" <li><ul>\n"); trackSettings(tdb, countTracks); /* show all settings */ hPrintf(" </ul></li>\n"); } else if (tdb->subtracks) { hubSubTracks(hub, db, tdb, countTracks, chromCount, itemCount, chromName, chromSize, genome, errors->string); } return; } /* static void hubCountOneTdb(char *db, struct trackDb *tdb, * char *bigDataIndex, struct hash *countTracks, @@ -629,43 +629,43 @@ static void countOneTdb(char *db, struct trackDb *tdb, struct hash *countTracks, char *chromName, unsigned chromSize, char *errorString) /* for this tdb in this db, count it up and provide a sample */ { char *bigDataUrl = trackDbSetting(tdb, "bigDataUrl"); // char *compositeTrack = trackDbSetting(tdb, "compositeTrack"); boolean compositeContainer = tdbIsComposite(tdb); boolean compositeView = tdbIsCompositeView(tdb); // char *superTrack = trackDbSetting(tdb, "superTrack"); boolean superChild = tdbIsSuperTrackChild(tdb); boolean depthSearch = cartUsualBoolean(cart, "depthSearch", FALSE); hashCountTrack(tdb, countTracks); if (compositeContainer) - hPrintf(" <li>%s : %s : composite track container has %d subtracks</li>\n", tdb->track, tdb->type, slCount(tdb->subtracks)); + hPrintf(" <li><b>%s</b>: %s : composite track container has %d subtracks</li>\n", tdb->track, tdb->type, slCount(tdb->subtracks)); else if (compositeView) - hPrintf(" <li>%s : %s : composite view of parent: %s</li>\n", tdb->track, tdb->type, tdb->parent->track); + hPrintf(" <li><b>%s</b>: %s : composite view of parent: %s</li>\n", tdb->track, tdb->type, tdb->parent->track); else if (superChild) - hPrintf(" <li>%s : %s : superTrack child of parent: %s</li>\n", tdb->track, tdb->type, tdb->parent->track); + hPrintf(" <li><b>%s</b>: %s : superTrack child of parent: %s</li>\n", tdb->track, tdb->type, tdb->parent->track); else if (! depthSearch && bigDataUrl) - hPrintf(" <li>%s : %s : %s</li>\n", tdb->track, tdb->type, bigDataUrl); + hPrintf(" <li><b>%s</b>: %s : %s</li>\n", tdb->track, tdb->type, bigDataUrl); else { if (isSupportedType(tdb->type)) sampleUrl(NULL, db, tdb, chromName, chromSize, errorString); else - hPrintf(" <li>%s : %s</li>\n", tdb->track, tdb->type); + hPrintf(" <li><b>%s</b>: %s</li>\n", tdb->track, tdb->type); } if (allTrackSettings) { hPrintf(" <li><ul>\n"); trackSettings(tdb, countTracks); /* show all settings */ hPrintf(" </ul></li>\n"); } else if (tdb->subtracks) { showSubTracks(NULL, db, tdb, countTracks, chromName, chromSize, NULL); } return; } /* static void countOneTdb(char *db, struct trackDb *tdb, * struct hash *countTracks, char *chromName, @@ -708,149 +708,166 @@ struct trackDb *tdb = NULL; for ( tdb = topTrackDb; tdb; tdb = tdb->next ) { char *bigDataIndex = NULL; char *relIdxUrl = trackDbSetting(topTrackDb, "bigDataIndex"); if (relIdxUrl != NULL) bigDataIndex = trackHubRelativeUrl(genome->trackDbFile, relIdxUrl); char *defaultGenome = NULL; if (isNotEmpty(genome->name)) defaultGenome = genome->name; char *chromName = NULL; unsigned chromSize = 0; int chromCount = 0; if (isEmpty(genome->twoBitPath)) chromSize = largestChrom(defaultGenome, &chromName, &chromCount); - else - hPrintf(" <li>twoBitPath %s genome %s</li>\n", genome->twoBitPath, defaultGenome); hubCountOneTdb(hub, defaultGenome, tdb, bigDataIndex, countTracks, chromName, chromSize, defaultGenome); if (timeOutReached()) break; } /* for ( tdb = topTrackDb; tdb; tdb = tdb->next ) */ hPrintf(" <li>%d different track types</li>\n",countTracks->elCount - 1); /* add this single genome count to the overall multi-genome counts */ if (countTracks->elCount) { hPrintf(" <li><ol>\n"); struct hashEl *hel, *helList = hashElListHash(countTracks); slSort(&helList, hashElCmpIntValDesc); for (hel = helList; hel; hel = hel->next) { if (sameOk("track count", hel->name)) continue; int prevCount = ptToInt(hashFindVal(trackCounter, hel->name)); if (differentStringNullOk("track count", hel->name)) totalTracks += ptToInt(hel->val); hashReplace(trackCounter, hel->name, intToPt(prevCount + ptToInt(hel->val))); if (isSupportedType(hel->name)) hPrintf(" <li>%d - %s - supported</li>\n", ptToInt(hel->val), hel->name); else hPrintf(" <li>%d - %s</li>\n", ptToInt(hel->val), hel->name); } hPrintf(" </ol></li>\n"); } } else hPrintf(" <li>no trackTopDb ?</li>\n"); -hPrintf(" </ul><li>\n"); +hPrintf(" </ul></li>\n"); } /* static struct trackDb *hubTrackList() */ static void hubAssemblySettings(struct trackHub *hub, struct trackHubGenome *genome) /* display all the assembly 'settingsHash' */ { struct trackDb *tdb = obtainTdb(genome, NULL); hPrintf(" <li><ul>\n"); struct hashEl *hel; struct hashCookie hc = hashFirst(genome->settingsHash); while ((hel = hashNext(&hc)) != NULL) { - hPrintf(" <li>%s : %s</li>\n", hel->name, (char *)hel->val); + if (sameWord("description", hel->name) || + sameWord("defaultPos", hel->name) || + sameWord("organism", hel->name) || + sameWord("groups", hel->name) || + sameWord("twoBitPath", hel->name) || + sameWord("genome", hel->name) + ) + continue; // already output in header if (sameWord("trackDb", hel->name)) /* examine the trackDb structure */ { hubTrackList(hub, tdb, genome); } + else + hPrintf(" <li><b>%s</b>: %s</li>\n", hel->name, (char *)hel->val); if (timeOutReached()) break; } hPrintf(" </ul></li>\n"); } static unsigned largestChromInfo(struct chromInfo *ci, char **chromName) /* find largest chrom in this chromInfo, return name and size */ { unsigned size = 0; char *name = NULL; struct chromInfo *el; for (el = ci; el; el = el->next) { if (el->size > size) { size = el->size; name = el->chrom; } } if (chromName) *chromName = name; return size; } +static void hubInfo(char *tag, char *val) +/* print one list element with the given tag and value, show <empty> + * if not value present + */ +{ +if (isNotEmpty(val)) + hPrintf("<li><b>%s</b>: '%s'</li>\n", tag, val); +else + hPrintf("<li><b>%s</b>: <empty></li>\n", tag); +} + static void genomeList(struct trackHub *hubTop) /* follow the pointers from the trackHub to trackHubGenome and around * in a circle from one to the other to find all hub resources */ { long totalAssemblyCount = 0; struct trackHubGenome *genome = hubTop->genomeList; hPrintf("<h4>genome sequences (and tracks) present in this track hub</h4>\n"); if (NULL == genome) { hPrintf("<h4>odd error, can not find a gnomeList ? at url: '%s'</h4>\n", hubTop->url); return; } hPrintf("<ul>\n"); long lastTime = clock1000(); for ( ; genome; genome = genome->next ) { ++totalAssemblyCount; if (isNotEmpty(genome->twoBitPath)) { - hPrintf("<li>assembly hub %s twoBitPath: %s</li>\n", genome->name, genome->twoBitPath); + hPrintf("<li><b>Assembly genome</b> '%s' <b>twoBitPath</b>: '%s'</li>\n", genome->name, genome->twoBitPath); char *chromName = NULL; struct chromInfo *ci = trackHubAllChromInfo(genome->name); unsigned chromSize = largestChromInfo(ci, &chromName); char sizeString[64]; sprintLongWithCommas(sizeString, chromSize); - hPrintf("<li>%d chromosomes, largest %s at %s bases</li>\n", slCount(ci), chromName, sizeString); - } - if (genome->organism) - { - hPrintf("<li>%s - %s - %s</li>\n", genome->organism, genome->name, genome->description); - } - else - { /* can there be a description when organism is empty ? */ - hPrintf("<li>name: %s</li>\n", genome->name); - } + hPrintf("<li><b>Sequence count</b> %d, <b>largest</b>: %s at %s bases</li>\n", slCount(ci), chromName, sizeString); + } + hubInfo("organism", genome->organism); + hubInfo("name", genome->name); + hubInfo("description", genome->description); + hubInfo("groups", genome->groups); + hubInfo("defaultPos", genome->defaultPos); + hubInfo("trackDbFile", genome->trackDbFile); hubAssemblySettings(hubTop, genome); if (measureTiming || debug) { long thisTime = clock1000(); hPrintf("<li><em>processing time %s: %ld millis</em></li>\n", genome->name, thisTime - lastTime); + hPrintf("<hr>\n"); } if (timeOutReached()) break; } if (trackCounter->elCount) { hPrintf(" <li>total genome assembly count: %ld</li>\n", totalAssemblyCount); hPrintf(" <li>%ld total tracks counted, %d different track types:</li>\n", totalTracks, trackCounter->elCount); hPrintf(" <li><ol>\n"); struct hashEl *hel, *helList = hashElListHash(trackCounter); slSort(&helList, hashElCmpIntValDesc); for (hel = helList; hel; hel = hel->next) { hPrintf(" <li>%d - %s - total</li>\n", ptToInt(hel->val), hel->name); } @@ -1208,31 +1225,32 @@ if (commandError) { hPrintf("<h3>ERROR: no such command: '%s/%s' for endpoint '%s'</h3>", words[0], words[1], pathInfo); } long lastTime = clock1000(); struct trackHub *hub = errCatchTrackHubOpen(urlInput); if (measureTiming || debug) { long thisTime = clock1000(); if (debug) hPrintf("<em>hub open time: %ld millis</em><br>\n", thisTime - lastTime); } -hPrintf("<h3>Please refer to <a href='../../goldenPath/help/api.html'>API help</a> documentation for more information about data data API operation.</h3>\n"); +hPrintf("<h3>Please refer to <a href='../../goldenPath/help/api.html'>API help</a> documentation for more information about the JSON data API operation.</h3>\n"); +hPrintf("<h3>See also: <a href='../../goldenPath/help/trackDb/trackDbHub.html' target=_blank>Track definition document</a> for definitions of track settings.</h3>\n"); if (debug) showCartDump(); hPrintf("<h2>Explore hub or database assemblies and tracks</h2>\n"); hPrintf("<form action='%s' name='hubApiUrl' id='hubApiUrl' method='GET'>\n\n", urlPrefix); hPrintf("<b>Select public hub: </b>"); #define JBUFSIZE 2048 #define SMALLBUF 256 char javascript[JBUFSIZE]; struct slPair *events = NULL; safef(javascript, sizeof(javascript), "this.lastIndex=this.selectedIndex;"); slPairAdd(&events, "focus", cloneString(javascript)); @@ -1268,36 +1286,44 @@ hCheckBox("allTrackSettings", allTrackSettings); hPrintf(" display all track settings for each track<br>\n"); hPrintf("<br>\n"); // if (debug) // cgiMakeHiddenVar("debug", "1"); hPrintf("</form>\n"); hPrintf("<p>\n"); if (sameWord("go", goUcscDb)) /* requested UCSC db track list */ { tracksForUcscDb(ucscDb); } else { - hPrintf("<h4>Examine %s at: %s</h4>\n", sameWord("go",goPublicHub) ? "public hub" : "other hub", urlInput); + hPrintf("<h3>%s url: <em>%s</em></h3>\n", sameWord("go",goPublicHub) ? "Public hub" : "Other hub", urlInput); hPrintf("<ul>\n"); - hPrintf("<li>%s</li>\n", hub->shortLabel); - hPrintf("<li>%s</li>\n", hub->longLabel); - if (isNotEmpty(hub->defaultDb)) - hPrintf("<li>%s - default database</li>\n", hub->defaultDb); + hubInfo("hub name", hub->name); + hubInfo("short label", hub->shortLabel); + hubInfo("long label", hub->longLabel); + hubInfo("genomes file", hub->genomesFile); + hubInfo("default db", hub->defaultDb); + hubInfo("description url", hub->descriptionUrl); + hubInfo("email", hub->email); + if (debug) + { + hubInfo("version", hub->version); /* UCSC internal info */ + hubInfo("level", hub->level); /* UCSC internal info */ + } hPrintf("</ul>\n"); genomeList(hub); } if (timedOut) hPrintf("<h1>Reached time out %ld seconds</h1>", timeOutSeconds); if (measureTiming || debug) hPrintf("<em>Overall total time: %ld millis</em><br>\n", clock1000() - enteredMainTime); hPrintf("</p>\n"); hPrintf("</div> <!-- end this page contents -->\n"); webIncludeFile("inc/jWestFooter.html"); webEndJWest();