d156aaa50bbe78b0c05da8cde9cd837d88d659fc
chmalee
  Wed Aug 19 12:03:49 2020 -0700
hgc and hgTrackUi can query a 'relatedTrack' table to print a list of related tracks to the one being looked at along with a reason for the relation, refs #25721

diff --git src/hg/hgc/hgc.c src/hg/hgc/hgc.c
index 4675e88..f5650bc 100644
--- src/hg/hgc/hgc.c
+++ src/hg/hgc/hgc.c
@@ -3122,132 +3122,57 @@
 {
 trackDbPrintOrigAssembly(tdb, database);
 }
 
 static char *getHtmlFromSelfOrParent(struct trackDb *tdb)
 /* Get html from self or from parent if not in self. */
 {
 for (;tdb != NULL; tdb = tdb->parent)
     {
     if (tdb->html != NULL && tdb->html[0] != 0)
         return tdb->html;
     }
 return NULL;
 }
 
-void printHtmlAddRelated(struct trackDb *tdb, char *html)
-/* print the track description html and try to inject the "related track" section */
-{
-struct sqlConnection *conn = hAllocConn(database);
-if (!sqlTableExists(conn, "relatedTrack"))
-    {
-    puts(html);
-    hFreeConn(&conn);
-    return;
-    }
-
-char query[256];
-sqlSafef(query, sizeof(query),
-    "select track1, track2, why from relatedTrack where track1='%s' or track2='%s'",  tdb->track, tdb->track);
-
-char **row;
-struct sqlResult *sr;
-sr = sqlGetResult(conn, query);
-row = sqlNextRow(sr);
-if (row == NULL)
-    {
-    puts(html);
-    hFreeConn(&conn);
-    sqlFreeResult(&sr);
-    return;
-    }
-
-char *lines[10000];
-int lineCount = chopByChar(html, '\n', lines, ArraySize(lines));
-
-char* refLine1 = "<H2>References</H2>";
-char* refLine2 = "<h2>References</h2>";
-
-int lineIdx;
-for (lineIdx = 0; lineIdx < lineCount; lineIdx++)
-    {
-    char *line = lines[lineIdx];
-    if ( !sameWord(line, "<RELATED>") && !sameWord(line, refLine1) && !sameWord(line, refLine2))
-        {
-        puts(line);
-        continue;
-        } 
-
-    puts("<H2>Related tracks</H2>\n");
-    puts("<ul>\n");
-    do
-        {
-        char *track1 = row[0];
-        char *track2 = row[1];
-        char *why    = row[2];
-
-        char* otherTrack;
-        if (sameWord(track1, tdb->track))
-            otherTrack = track2;
-        else
-            otherTrack = track1;
-
-        struct trackDb *otherTdb = hashFindVal(trackHash, otherTrack);
-        puts("<li>");
-        puts(otherTdb->shortLabel);
-        puts(": ");
-        puts(why);
-        } while ((row = sqlNextRow(sr)) != NULL);
-    puts("</ul>\n");
-
-    if (sameWord(line, refLine1) || sameWord(line, refLine2))
-        puts(line);
-    }
-
-hFreeConn(&conn);
-sqlFreeResult(&sr);
-}
-
 void printTrackHtml(struct trackDb *tdb)
 /* If there's some html associated with track print it out. Also print
  * last update time for data table and make a link
  * to the TB table schema page for this table. */
 {
 if (!isCustomTrack(tdb->track))
     {
+    printRelatedTracks(database, trackHash, tdb, cart);
     extraUiLinks(database, tdb);
     printTrackUiLink(tdb);
     printOrigAssembly(tdb);
     printDataVersion(database, tdb);
     printUpdateTime(database, tdb, NULL);
     printDataRestrictionDate(tdb);
     }
 char *html = getHtmlFromSelfOrParent(tdb);
 if (html != NULL && html[0] != 0)
     {
     htmlHorizontalLine();
 
     // Add pennantIcon
     printPennantIconNote(tdb);
 
     // Wrap description html in div with limited width, so when the page is very wide
     // due to long details, the user doesn't have to scroll right to read the description.
     puts("<div class='readableWidth'>");
-    if (trackHubDatabase(database))
     puts(html);
-    else
-        printHtmlAddRelated(tdb, html);
     puts("</div>");
     }
 hPrintf("<BR>\n");
 }
 
 void qChainRangePlusStrand(struct chain *chain, int *retQs, int *retQe)
 /* Return range of bases covered by chain on q side on the plus
  * strand. */
 {
 if (chain == NULL)
     errAbort("Can't find range in null query chain.");
 if (chain->qStrand == '-')
     {
     *retQs = chain->qSize - chain->qEnd+1;
     *retQe = chain->qSize - chain->qStart;