7bd47bcce94043cc307b78f981363b5d9d24a970 max Wed Apr 5 05:06:38 2023 -0700 allowing multiple download URLs and allowing quotes, refs #30904 diff --git src/hg/lib/hui.c src/hg/lib/hui.c index 9266dc6..ddd7186 100644 --- src/hg/lib/hui.c +++ src/hg/lib/hui.c @@ -529,40 +529,58 @@ "%s=%s&" "%s=%s&" "%s=%s'>" "Display regions of interest (%d)</a>", MULTI_REGION_BED_WIN_FULL, tdb->track, cgiEncode(regionFile), tdb->track, hStringFromTv(vis), CT_CUSTOM_DOC_TEXT_VAR, cgiEncode(customHtml), CT_CUSTOM_TEXT_VAR, cgiEncode(dyStringCannibalize(&dsCustomText)), regionCount); printf(" in multi-region view (custom regions mode)"); printf(" "); printf("<a href=\"../goldenPath/help/multiRegionHelp.html\" target=_blank>(Help)</a>\n"); printf("</p>"); return TRUE; } -static void makeFileDownloads(char *fileDownloads) -/* print an additional file download link, file can be anywhere on the internet, useful e.g. for GTF files for gene tracks */ +static void printDownloadUrl(char *downloadUrl) +/* given a string <label><space><url>, print a nice download link */ { char *parts[2]; -int partCount = chopByWhite(fileDownloads, parts, 2); +int partCount = chopByWhiteRespectDoubleQuotes(downloadUrl, parts, 2); if (partCount!=2) puts("<b>Internal Error:</b> The downloadUrl trackDb statement needs exactly two arguments, the file type and the URL."); char* fileType = parts[0]; +stripString(fileType, "\""); // Remove any double quotes now and chop by commmas char* url = parts[1]; -printf("<br>Download: <a href=\"%s\">%s File</a>", url, fileType); +printf("<br>Download: <a href=\"%s\">%s</a>", url, fileType); +} + +static void makeFileDownloads(struct trackDb *tdb) +/* given either downloadUrl or downloadUrl.1/.2/... in trackDb, print links to these files. + * File can be anywhere on the internet, useful e.g. for GTF files for gene tracks */ +{ +char *downloadUrl = trackDbSetting(tdb, "downloadUrl"); +struct slName* tdbNames = trackDbSettingsWildMatch(tdb, "downloadUrl.*"); +if (downloadUrl) + printDownloadUrl(downloadUrl); + +while (tdbNames != NULL) + { + struct slName *tdbName = slPopHead(&tdbNames); + printDownloadUrl(trackDbSetting(tdb, tdbName->name)); + slNameFree(&tdbName); + } } void extraUiLinks(char *db, struct trackDb *tdb, struct cart *cart) // Show metadata, and downloads, schema links where appropriate { makeMultiRegionLink(db, tdb, cart); struct slPair *pairs = trackDbMetaPairs(tdb); if (pairs != NULL) printf("<b>Metadata:</b><br>%s\n", pairsAsHtmlTable( pairs, tdb, FALSE, FALSE)); else if (!tdbIsComposite(tdb) && !trackHubDatabase(db) && (metadataForTable(db, tdb, NULL) != NULL)) printf("<b>Metadata:</b><br>%s\n", metadataAsHtmlTable(db, tdb, FALSE, FALSE)); boolean schemaLink = trackDataAccessible(db, tdb); boolean downloadLink = (trackDbSetting(tdb, "wgEncode") != NULL && !tdbIsSuperTrack(tdb)); @@ -574,33 +592,31 @@ if (links > 0) cgiDown(0.7); if (links > 1) printf("<table><tr><td nowrap>View table: "); if (schemaLink && differentString("longTabix", tdb->type) && !isCustomComposite(tdb)) // FIXME: hgTables.showSchmaLongTabix is a currently a dummy routine, so let's not got here // until it's implemented { makeSchemaLink(db,tdb,(links > 1 ? "Data format":"Data schema/format description and download")); if (downloadLink) printf(", "); } -char *fileDownloads = trackDbSetting(tdb, "downloadUrl"); -if (fileDownloads) - makeFileDownloads(fileDownloads); +makeFileDownloads(tdb); if (downloadLink) { // special case exception (hg18:NHGRI BiPs are in 7 different dbs but only hg18 has downloads): char *targetDb = trackDbSetting(tdb, "compareGenomeLinks"); if (targetDb != NULL) { targetDb = cloneFirstWordByDelimiter(targetDb,'='); if (!startsWith("hg",targetDb)) freez(&targetDb); } if (targetDb == NULL) targetDb = cloneString(db); makeNamedDownloadsLink(targetDb, tdb, (links > 1 ? "downloads":"Downloads"));