0a05f3e3c58ea53afa036c0d0be18d4eb79e11b5
hiram
  Mon May 4 15:28:20 2026 -0700
enable B links for maf clicks to GenArk browsers

diff --git src/hg/hgc/mafClick.c src/hg/hgc/mafClick.c
index 58b25be3afd..85c7551bfc4 100644
--- src/hg/hgc/mafClick.c
+++ src/hg/hgc/mafClick.c
@@ -6,30 +6,31 @@
 #include "common.h"
 #include "hash.h"
 #include "linefile.h"
 #include "hgc.h"
 #include "maf.h"
 #include "obscure.h"
 #include "cheapcgi.h"
 #include "genePred.h"
 #include "botDelay.h"
 #include "hgMaf.h"
 #include "hui.h"
 #include "hCommon.h"
 #include "hubConnect.h"
 #include "trackHub.h"
 #include "chromAlias.h"
+#include "genark.h"
 
 extern boolean issueBotWarning;
 
 #define ADDEXONCAPITAL
 
 /* Javascript to help make a selection from a drop-down
  * go back to the server. */
 static char *autoSubmit = "document.gpForm.submit();";
 
 static char *splitMafSrc(char *src, char *dbOnly, int dbOnlySize, struct hash *labelHash)
 /* Split a maf component src ("db.chrom") into db (in dbOnly) and chrom
  * (return value).  If labelHash has an entry whose key is a prefix of src
  * ending at a dot, prefer that.  This handles multi-dot db names like assembly
  * hub accessions ("GCF_000009085.1.NC_002163v1").
  * Falls back to chopping at the first dot when no labelHash hit. */
@@ -201,32 +202,43 @@
 	if (mc->strand == '-')
 	    reverseIntRange(&s, &e, mc->srcSize);
 
 
 	if (mc->text != NULL)
 	    {
             if (lineStart == 0)
 		{
 		if (hDbIsActive(dbOnly))
 		    {
 		    dyStringPrintf(dy, "%s Browser %s:%d-%d %c %*dbps",hOrganism(dbOnly),chrom, s+1, e, mc->strand,sizeChars, mc->size);
 		    linkToOtherBrowserTitle(dbOnly, chrom, s, e, dy->string);
 		    dyStringClear(dy);
 		    fprintf(f, "B</A> ");
 		    }
+		else
+		    {
+		    char *hubUrl = genarkUrl(dbOnly);
+		    if (hubUrl != NULL)
+			{
+			dyStringPrintf(dy, "%s Browser %s:%d-%d %c %*dbps", org, chrom, s+1, e, mc->strand, sizeChars, mc->size);
+			fprintf(f, "<A TITLE=\"%s\" TARGET=\"_blank\" HREF=\"%s?genome=%s&hubUrl=%s&position=%s%%3A%d-%d\">B</A> ",
+				dy->string, hgTracksName(), dbOnly, cgiEncode(hubUrl), cgiEncode(chrom), s+1, e);
+			dyStringClear(dy);
+			}
 		    else
 			fprintf(f, "  ");
+		    }
 
                 if (hDbExists(dbOnly))
                     {
                     dyStringPrintf(dy, "Get %s DNA %s:%d-%d %c %*dbps",hOrganism(dbOnly),chrom, s+1, e, mc->strand,sizeChars, mc->size);
                     printf("<A TITLE=\"%s\" TARGET=\"_blank\" HREF=\"%s?o=%d&g=getDna&i=%s&c=%s&l=%d&r=%d&db=%s%s\">D</A> ",  dy->string,hgcName(),
                        s, cgiEncode(chrom),
                        chrom, s, e, dbOnly, revComp);
                     }
                 else
                     fprintf(f, "  ");
                 }
             else
                 {
                 fprintf(f, "    ");
                 }
@@ -252,32 +264,43 @@
 		    int s = mc->start;
 		    int e = s + mc->rightLen;
 		    struct dyString *dy = dyStringNew(512);
 
 		    if (mc->strand == '-')
 			reverseIntRange(&s, &e, mc->srcSize);
 
 		    if ( hDbIsActive(dbOnly))
 			{
 			dyStringPrintf(dy, "%s Browser %s:%d-%d %c %d bps Unaligned",hOrganism(dbOnly),chrom, s+1, e, mc->strand, e-s);
 			linkToOtherBrowserTitle(dbOnly, chrom, s, e, dy->string);
 
 			fprintf(f,"B</A> ");
 			dyStringClear(dy);
 			}
+		    else
+			{
+			char *hubUrl = genarkUrl(dbOnly);
+			if (hubUrl != NULL)
+			    {
+			    dyStringPrintf(dy, "%s Browser %s:%d-%d %c %d bps Unaligned", org, chrom, s+1, e, mc->strand, e-s);
+			    fprintf(f, "<A TITLE=\"%s\" TARGET=\"_blank\" HREF=\"%s?genome=%s&hubUrl=%s&position=%s%%3A%d-%d\">B</A> ",
+				    dy->string, hgTracksName(), dbOnly, cgiEncode(hubUrl), cgiEncode(chrom), s+1, e);
+			    dyStringClear(dy);
+			    }
 			else
 			    fprintf(f,"  ");
+			}
 
                     if (hDbExists(dbOnly))
                         {
                         dyStringPrintf(dy, "Get %s DNA %s:%d-%d %c %d bps Unaligned",hOrganism(dbOnly),chrom, s+1, e, mc->strand, e-s);
 
                         printf("<A TITLE=\"%s\" TARGET=\"_blank\" HREF=\"%s?o=%d&g=getDna&i=%s&c=%s&l=%d&r=%d&db=%s%s\">D</A>  ", dy->string,  hgcName(),
                            s, cgiEncode(chrom),
                            chrom, s, e, dbOnly,revComp);
                         }
                     else
                         fprintf(f, "  ");
                     }
                 else
 		    fprintf(f, "     ");
 		initSummaryLine(summaryLine, size, ' ');
@@ -344,32 +367,41 @@
 	    if (hDbIsActive(dbOnly))
 		{
 		char strand = mc->strand;
 #ifdef REVERSESTRAND
 		if (cartCgiUsualBoolean(cart, COMPLEMENT_BASES_VAR, FALSE))
 		    strand = (strand == '+') ? '-' : '+';
 #endif
 		if (strand == '-') revComp = "&hgSeq.revComp=on";
 
 		linkToOtherBrowser(dbOnly, chrom, s, e);
 		fprintf(f,"B");
 		fprintf(f, "</A>");
 		fprintf(f, " ");
 
 		}
+	    else
+		{
+		char *hubUrl = genarkUrl(dbOnly);
+		if (hubUrl != NULL)
+		    {
+		    fprintf(f, "<A TARGET=\"_blank\" HREF=\"%s?genome=%s&hubUrl=%s&position=%s%%3A%d-%d\">B</A> ",
+			    hgTracksName(), dbOnly, cgiEncode(hubUrl), cgiEncode(chrom), s+1, e);
+		    }
 		else
 		    fprintf(f, "  ");
+		}
 
             if (hDbExists(dbOnly))
                 {
                 printf("<A TARGET=\"_blank\" HREF=\"%s?o=%d&g=getDna&i=%s&c=%s&l=%d&r=%d"
                        "&db=%s%s\">D</A> ",  hgcName(), s, cgiEncode(chrom), chrom,  s,
                        e, dbOnly,revComp);
                 }
             else
 		fprintf(f, "  ");
             fprintf(f, "%*s %dbp\n", srcChars, org,mc->rightLen);
 	    }
 	}
     fprintf(f, "\n");
     }
 freeMem(summaryLine);