0028868b72060a31d1ac6d35407f6d78c7ceb680
kate
  Tue Nov 7 10:00:48 2017 -0800
Implement text pennantIcon (for 'New' tag).  Simplify code while hood is up. refs #20270

diff --git src/hg/lib/hui.c src/hg/lib/hui.c
index 75611db..92bdd19 100644
--- src/hg/lib/hui.c
+++ src/hg/lib/hui.c
@@ -8384,133 +8384,129 @@
     count++;
     while (sources && sameString(sources->name, source->name))
         {
         source = slPopHead(&sources);
         fputs(", ", stdout);
         fputs(source->description, stdout);
         count++;
         }
     webPrintLinkCellEnd();
     }
 sqlFreeResult(&sr);
 webPrintLinkTableEnd();
 printf("Total: %d\n", count);
 }
 
-boolean printPennantIconNote(struct trackDb *tdb)
-// Returns TRUE and prints out the "pennantIcon" and note when found.
-//This is used by hgTrackUi and hgc before printing out trackDb "html"
+static char *makePennantIcon(struct trackDb *tdb, char **hintRet)
+// Builds a string with pennantIcon HTML and returns it. Also returns hint. */
 {
 char *setting = trackDbSetting(tdb, "pennantIcon");
-if (setting != NULL)
-    {
+if (setting == NULL)
+    return FALSE;
+
 setting = cloneString(setting);
 char *icon = nextWord(&setting);
 char buffer[4096];
 char *src = NULL;
+char *url = NULL, *hint = NULL, *color = NULL;
 
-    if (startsWith("http://", icon) || startsWith("ftp://", icon) ||
-        startsWith("https://", icon))
+boolean isTextIcon = FALSE;
+if (!(endsWith(icon, ".jpg") || endsWith(icon, ".png")))
+    {
+    isTextIcon = TRUE;
+    color = nextWord(&setting);
+    src = strLower(icon);
+    }
+else if (startsWith("http://", icon) || startsWith("https://", icon) ||
+        startsWith("ftp://", icon))
             src = htmlEncode(icon);
 else
     {
     safef(buffer, sizeof buffer, "../images/%s", icon);
     src = htmlEncode(buffer);
     }
 
-    char *url = NULL;
-    if (setting != NULL)
-	url = nextWord(&setting);
-    char *hint = NULL;
-    if (setting != NULL)
-	hint = htmlEncode(stripEnclosingDoubleQuotes(setting));
-
-    if (!isEmpty(url))
+if (setting)
     {
-	if (isEmpty(hint))
-	    printf("<P><a href='%s' TARGET=ucscHelp><img height='16' width='16' "
-		   "src='%s'></a>",url,src);
-	else
+    url = nextWord(&setting);
+    if (setting)
         {
-	    printf("<P><a title='%s' href='%s' TARGET=ucscHelp><img height='16' width='16' "
-		   "src='%s'></a>",hint,url,src);
-
-	    // Special case for liftOver from hg17 or hg18, but this should probably be generalized.
-	    if (sameString(icon,"18.jpg") && startsWithWord("lifted",hint))
-		printf("&nbsp;Note: these data have been converted via liftOver from the Mar. 2006 "
-		       "(NCBI36/hg18) version of the track.");
-	    else if (sameString(icon,"17.jpg") && startsWithWord("lifted",hint))
-		printf("&nbsp;Note: these data have been converted via liftOver from the May 2004 "
-		       "(NCBI35/hg17) version of the track.");
-	    else 
-		printf("&nbsp;Note: %s.",hint);
-	    printf("</P>\n");
+        hint = htmlEncode(stripEnclosingDoubleQuotes(setting));
         }
     }
+struct dyString *ds = dyStringNew(0);
+
+// generate markup
+if (url)
+    dyStringPrintf(ds, "<a class='pennantIconText' href='%s' target='ucscHelp' ", url);
+else if (isTextIcon)
+    dyStringAppend(ds, "<span class='pennantIconText' ");
+if (isTextIcon)
+    dyStringPrintf(ds, "style='color: %s;' ", color);
+if (hint)
+    dyStringPrintf(ds, "title='%s' ", hint);
+if (url || isTextIcon)
+    dyStringAppend(ds, ">");
+
+// add text or image
+if (isTextIcon) 
+    dyStringPrintf(ds, "%s", src);
 else
-        printf("<BR><img height='16' width='16' src='%s'>\n",src);
-    return TRUE;
-    }
-return FALSE;
+    dyStringPrintf(ds, "<img height='16' width='16' src='%s'>", src);
+
+// close tags
+if (url)
+   dyStringAppend(ds, "</a>");
+else if (isTextIcon)
+    dyStringAppend(ds, "</span>");
+dyStringAppend(ds, "\n");
+
+if (hint && hintRet)
+    *hintRet = cloneString(hint);
+return dyStringCannibalize(&ds);
 }
 
+
 boolean hPrintPennantIcon(struct trackDb *tdb)
 // Returns TRUE and prints out the "pennantIcon" when found.
 // Example: ENCODE tracks in hgTracks config list.
 {
-char *setting = trackDbSetting(tdb, "pennantIcon");
-if (setting != NULL)
-    {
-    setting = cloneString(setting);
-    char buffer[4096];
-    char *src = NULL;
-    char *icon = nextWord(&setting);
-    if (startsWith("http://", icon) || startsWith("ftp://", icon) ||
-        startsWith("https://", icon))
-        src = htmlEncode(icon);
-    else
-        {
-        safef(buffer, sizeof buffer, "../images/%s", icon);
-        src = htmlEncode(buffer);
-        }
-
-    if (setting)
-        {
-        char *url = nextWord(&setting);
-        if (setting)
-            {
-            char *hint = htmlEncode(stripEnclosingDoubleQuotes(setting));
-            hPrintf("<a title='%s' href='%s' TARGET=ucscHelp><img height='16' width='16' "
-                    "src='%s'></a>\n",hint,url,src);
-            freeMem(hint);
-            }
-        else
-            hPrintf("<a href='%s' TARGET=ucscHelp><img height='16' width='16' "
-                    "src='%s'></a>\n",url,src);
-        }
-    else
-        hPrintf("<img height='16' width='16' src='%s'>\n",icon);
-    freeMem(icon);
-    return TRUE;
-    }
-else if (trackDbSetting(tdb, "wgEncode") != NULL)
+if (trackDbSetting(tdb, "wgEncode") != NULL)
     {
     hPrintf("<a title='encode project' href='../ENCODE'><img height='16' width='16' "
             "src='../images/encodeThumbnail.jpg'></a>\n");
     return TRUE;
     }
+char *pennantIcon = makePennantIcon(tdb, NULL);
+if (!pennantIcon)
+    return FALSE;
+hPrintf("%s\n", pennantIcon);
+return TRUE;
+}
+
+boolean printPennantIconNote(struct trackDb *tdb)
+// Returns TRUE and prints out the "pennantIcon" and note when found.
+//This is used by hgTrackUi and hgc before printing out trackDb "html"
+{
+char *hintRet;
+char *pennantIcon = makePennantIcon(tdb, &hintRet);
+if (!pennantIcon)
     return FALSE;
+printf("<br>%s\n", pennantIcon);
+if (hintRet)
+    printf("<b>Note:</b> %s\n", hintRet);
+return TRUE;
 }
 
 void printUpdateTime(char *database, struct trackDb *tdb,
     struct customTrack *ct)
 /* display table update time */
 {
 if (trackHubDatabase(database))
     return;
 /* have not decided what to do for a composite container */
 if (tdbIsComposite(tdb) || tdbIsSuper(tdb))
     return;
 struct sqlConnection *conn = NULL;
 char *tableName = NULL;
 if (isCustomTrack(tdb->track))
     {