a9b6ad6611b2c3c72d76c82044393c024bbe9933
max
  Thu Apr 7 05:39:23 2022 -0700
allow assembly-specific info links that work with hubs, for CHM13, refs #29224

diff --git src/hg/hgTracks/hgTracks.c src/hg/hgTracks/hgTracks.c
index cc0f051..106bce3 100644
--- src/hg/hgTracks/hgTracks.c
+++ src/hg/hgTracks/hgTracks.c
@@ -8058,30 +8058,43 @@
     hPrintf("</A>");
 hPrintf("<BR>");
 }
 
 void printSearchHelpLink()
 /* print the little search help link next to the go button */
 {
 char *url = cfgOptionDefault("searchHelpUrl","../goldenPath/help/query.html");
 char *label = cfgOptionDefault("searchHelpLabel", "examples");
 if (!url || isEmpty(url))
     return;
 
 printf("<div id='searchHelp'><a target=_blank title='Documentation on what you can enter into the Genome Browser search box' href='%s'>%s</a></div>", url, label);
 }
 
+static void printDatabaseInfoHtml(char* database) 
+/* print database-specific piece of HTML defined in hg.conf, works also with Genark hubs */
+{
+char *cfgPrefix = database;
+if (trackHubDatabase(cfgPrefix))
+    // hub IDs look like hub_1234_GCA_1232.2, so skip the hub_1234 part
+    cfgPrefix = hubConnectSkipHubPrefix(cfgPrefix);
+char *cfgName = catTwoStrings(cfgPrefix,"_html");
+char *html = cfgOption(cfgName);
+if (html)
+    puts(html);
+}
+
 void doTrackForm(char *psOutput, struct tempName *ideoTn)
 /* Make the tracks display form with the zoom/scroll buttons and the active
  * image.  If the ideoTn parameter is not NULL, it is filled in if the
  * ideogram is created.  */
 {
 struct group *group;
 struct track *track;
 char *freezeName = NULL;
 boolean hideAll = cgiVarExists("hgt.hideAll");
 boolean hideTracks = cgiOptionalString( "hideTracks") != NULL;
 boolean defaultTracks = cgiVarExists("hgt.reset");
 boolean showedRuler = FALSE;
 boolean showTrackControls = cartUsualBoolean(cart, "trackControlsOnMain", TRUE);
 boolean multiRegionButtonTop = cfgOptionBooleanDefault(MULTI_REGION_CFG_BUTTON_TOP, TRUE);
 long thisTime = 0, lastTime = 0;
@@ -8610,30 +8623,32 @@
 	    hPrintf("%s %s on Archaeon %s Assembly",
 		organization, browserName, freezeName);
 	    }
 	else
 	    {
 	    if (stringIn(database, freezeName))
 		hPrintf("%s %s on %s %s",
 			organization, browserName, organism, freezeName);
 	    else
 		hPrintf("%s %s on %s %s (%s)",
 			organization, browserName, trackHubSkipHubName(organism), freezeName, trackHubSkipHubName(database));
 	    }
 	}
     hPrintf("</B></SPAN>");
 
+    printDatabaseInfoHtml(database);
+
     // Disable recommended track set panel when changing tracks, session, database
     char *sessionLabel = cartOptionalString(cart, hgsOtherUserSessionLabel);
     char *oldDb = hashFindVal(oldVars, "db");
     if (sessionLabel)
         {
         if (defaultTracks || hideAll || hideTracks ||
             (oldDb && differentString(database, oldDb)) ||
             !hasRecTrackSet(cart) ||
             sameString(sessionLabel, "off"))
                 cartRemove(cart, hgsOtherUserSessionLabel);
         }
     sessionLabel = cartOptionalString(cart, hgsOtherUserSessionLabel);
     if (sessionLabel)
         {
         char *panel = "recTrackSetsPanel";
@@ -8773,46 +8788,48 @@
 
         printSearchHelpLink();
 
 
 	if (!trackHubDatabase(database))
 	    {
             jsonObjectAdd(jsonForClient, "assemblySupportsGeneSuggest", newJsonBoolean(assemblySupportsGeneSuggest(database)));
             if (assemblySupportsGeneSuggest(database))
                 hPrintf("<input type='hidden' name='hgt.suggestTrack' id='suggestTrack' value='%s'>\n", assemblyGeneSuggestTrack(database));
 	    }
 
         // hg.conf controlled links
 
         // database-specific link: 2 hg.conf settings, format <db>_TopLink{Label}
         struct slName *dbLinks = cfgNamesWithPrefix(database);
+
         struct slName *link;
         char *dbTopLink = NULL, *dbTopLinkLabel = NULL;
         for (link = dbLinks; link != NULL; link = link->next)
             {
             char *name = cloneString(link->name);
             char *setting = chopPrefixAt(link->name, '_');
             if (sameString(setting, "TopLink"))
                 dbTopLink = cfgOption(name);
             else if (sameString(setting, "TopLinkLabel"))
                 dbTopLinkLabel = cfgOption(name);
             }
         if (dbTopLink && dbTopLinkLabel)
             {
             hPrintf("&nbsp;&nbsp;<a href='%s' target='_blank'><em><b>%s</em></b></a>\n",
                 dbTopLink, dbTopLinkLabel);
             }
+        
         // generic link
 	char *survey = cfgOptionEnv("HGDB_SURVEY", "survey");
 	char *surveyLabel = cfgOptionEnv("HGDB_SURVEY_LABEL", "surveyLabel");
 	if (survey && differentWord(survey, "off"))
             hPrintf("&nbsp;&nbsp;<span style='background-color:yellow;'>"
                     "<A HREF='%s' TARGET=_BLANK><EM><B>%s</EM></B></A></span>\n",
                     survey, surveyLabel ? surveyLabel : "Take survey");
 	hPutc('\n');
 	}
     }
 
 // TODO GALT  how to handle ideos?
 boolean nukeIdeoFromList = FALSE;
 for(window=windows;window;window=window->next)
     {