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 "); } + 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, "B ", + 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("D ", 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 "); 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, "B ", + 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("D ", 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, ""); fprintf(f, " "); } + else + { + char *hubUrl = genarkUrl(dbOnly); + if (hubUrl != NULL) + { + fprintf(f, "B ", + hgTracksName(), dbOnly, cgiEncode(hubUrl), cgiEncode(chrom), s+1, e); + } else fprintf(f, " "); + } if (hDbExists(dbOnly)) { printf("D ", 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);