195d1e11e2b71aa1bcbf6f2e5f2bc2d1992bfac8
chmalee
  Mon Feb 23 15:38:22 2026 -0800
In right click menu for zoom to transcript, remove regex that parses chrom,start, and end from hgc/hgGene links and instead use the built-in url parser. This allows chrom names to have '.' in them like genark assemblies, refs #35905

diff --git src/hg/js/hgTracks.js src/hg/js/hgTracks.js
index b16c28aaf2c..b4140a29829 100644
--- src/hg/js/hgTracks.js
+++ src/hg/js/hgTracks.js
@@ -2348,57 +2348,46 @@
         var id = rightClick.selectedMenuItem.id;
         var url = null;  // TODO: Break this giant routine with shared vars into some sub-functions
         var href = null;
         var rec = null;
         var row = null;
         var rows = null;
         var selectUpdated = null;
                 function mySuccess() {}
         if (menuObject.shown) {
             // warn("Spinning: menu is still shown");
             setTimeout(function() { rightClick.hitFinish(menuItemClicked, menuObject, cmd); }, 10);
             return;
         }
         if (cmd === 'selectWholeGene' || cmd === 'getDna' || cmd === 'highlightItem' || cmd === 'highlightThisRegion') {
                 // bring whole gene into view or redirect to DNA screen.
-                href = rightClick.selectedMenuItem.href;
-                var chrom, chromStart, chromEnd;
+                let href = rightClick.selectedMenuItem.href;
+                let url = URL.parse(rightClick.selectedMenuItem.href);
+                let chrom = url.searchParams.get('hgg_chrom');
+                if (!chrom)
+                    chrom = url.searchParams.get('c');
+                let chromStart = url.searchParams.get('hgg_start');
+                if (!chromStart)
+                    chromStart = url.searchParams.get('o');
+                let chromEnd = url.searchParams.get('hgg_end');
+                if (!chromEnd)
+                    chromEnd = url.searchParams.get('t');
+                chromStart = parseInt(chromStart) + 1;
+                chromEnd = parseInt(chromEnd);
                 // Many links leave out the chrom (b/c it's in the server side cart as "c")
                 // var chrom = hgTracks.chromName; // This is no longer acceptable
                 // with multi-window capability drawing multiple positions on multiple chroms.
-                var a = /hgg_chrom=(\w+)&/.exec(href);
-                if (a) {
-                    if (a && a[1])
-                        chrom = a[1];
-                    a = /hgg_start=(\d+)/.exec(href);
-                    if (a && a[1])
-                        chromStart = parseInt(a[1]) + 1;
-                    a = /hgg_end=(\d+)/.exec(href);
-                    if (a && a[1])
-                        chromEnd = parseInt(a[1]);
-                } else {
-                    // a = /hgc.*\W+c=(\w+)/.exec(href);
-                    a = /hgc.*\W+c=(\w+)/.exec(href);
-                    if (a && a[1])
-                        chrom = a[1];
-                    a = /o=(\d+)/.exec(href);
-                    if (a && a[1])
-                        chromStart = parseInt(a[1]) + 1;
-                    a = /t=(\d+)/.exec(href);
-                    if (a && a[1])
-                        chromEnd = parseInt(a[1]);
-                }
                 if (!chrom || chrom.length === 0 || !chromStart || !chromEnd) {// 1-based chromStart
                     warn("couldn't parse out genomic coordinates");
                 } else {
                     if (cmd === 'getDna') {
                         // NOTE: this should be shared with URL generation for getDna blue bar menu
                         url = "../cgi-bin/hgc?g=getDna&i=mixed&c=" + chrom;
                         url += "&l=" + (chromStart - 1) + "&r=" + chromEnd;
                         url += "&db=" + getDb() + "&hgsid=" + getHgsid();
                         if ( ! window.open(url) ) {
                             rightClick.windowOpenFailedMsg();
                         }
                     } else if (cmd === 'highlightItem') {
                         if (hgTracks.windows && !hgTracks.virtualSingleChrom) {
                             // orig way only worked if the entire item was visible in the windows.
                             //var result = genomePos.chromToVirtChrom(chrom, parseInt(chromStart-1), parseInt(chromEnd));