0bae2d58f02a994a23de767dfb2ac8e414253a88 galt Mon May 19 22:05:32 2025 -0700 Merging in simplifyBlatAlwaysCreateCT. Uses ajax and hg.conf setting. fixes #32751. diff --git src/hg/hgBlat/hgBlat.c src/hg/hgBlat/hgBlat.c index 220789493a5..3433e8ef2ec 100644 --- src/hg/hgBlat/hgBlat.c +++ src/hg/hgBlat/hgBlat.c @@ -31,30 +31,33 @@ #include "portable.h" #include "dystring.h" #include "chromInfo.h" #include "net.h" #include "fuzzyFind.h" #include "chromAlias.h" struct cart *cart; /* The user's ui state. */ struct hash *oldVars = NULL; boolean orgChange = FALSE; boolean dbChange = FALSE; boolean allGenomes = FALSE; boolean allResults = FALSE; static long enteredMainTime = 0; + +boolean autoBigPsl = FALSE; // DEFAULT VALUE change to TRUE in future + /* for earlyBotCheck() function at the beginning of main() */ #define delayFraction 0.5 /* standard penalty is 1.0 for most CGIs */ /* this one is 0.5 */ static boolean issueBotWarning = FALSE; struct gfResult /* Detailed gfServer results, this is a span of several nearby tiles, minimum 2 for dna. */ { struct gfResult *next; /* have to multiply translated coordinates by 3 */ int qStart; /* Query Start Coordinate */ int qEnd; /* Query End Coordinate */ char *chrom; /* Target Chrom Name */ int tStart; /* Target Start Coordinate */ int tEnd; /* Target End Coordinate */ @@ -489,47 +492,56 @@ } return same; } boolean allDigits(char *s) /* Return TRUE if s is all digits */ { char c; while ((c = *s++) != 0) if (!isdigit(c)) return FALSE; return TRUE; } - void printLuckyRedirect(char *browserUrl, struct psl *psl, char *database, char *pslName, char *faName, char *uiState, char *unhideTrack) /* Print out a very short page that redirects us. */ { char url[1024]; -safef(url, sizeof(url), "%s?position=%s:%d-%d&db=%s&ss=%s+%s&%s%s", - browserUrl, psl->tName, psl->tStart + 1, psl->tEnd, database, - pslName, faName, uiState, unhideTrack); /* htmlStart("Redirecting"); */ /* Odd it appears that we've already printed the Content-Typ:text/html line but I can't figure out where... */ +if (autoBigPsl) + { + // skip ss variable + safef(url, sizeof(url), "%s?position=%s:%d-%d&db=%s&%s%s", + browserUrl, psl->tName, psl->tStart + 1, psl->tEnd, database, + uiState, unhideTrack); + jsInlineF("luckyLocation = '%s';\n", url); + } +else + { + safef(url, sizeof(url), "%s?position=%s:%d-%d&db=%s&ss=%s+%s&%s%s", + browserUrl, psl->tName, psl->tStart + 1, psl->tEnd, database, + pslName, faName, uiState, unhideTrack); htmStart(stdout, "Redirecting"); jsInlineF("location.replace('%s');\n", url); printf("\n", url); htmlEnd(); - + } } /* forward declaration to reduce churn */ static void getCustomName(char *database, struct cart *cart, struct psl *psl, char **pName, char **pDescription); void showAliPlaces(char *pslName, char *faName, char *customText, char *database, enum gfType qType, enum gfType tType, char *organism, boolean feelingLucky) /* Show all the places that align. */ { boolean useBigPsl = cfgOptionBooleanDefault("useBlatBigPsl", TRUE); struct lineFile *lf = pslFileOpen(pslName); struct psl *pslList = NULL, *psl; char *browserUrl = hgTracksName(); @@ -558,31 +570,38 @@ if (psl->match >= minMatchShown) slAddHead(&pslList, psl); } lineFileClose(&lf); if (pslList == NULL && !jsonOut) { printf("
Sorry, no matches found"); if (!allResults) printf(" (with a score of at least %d)", minMatchShown); printf(" |
Go back to %s on the Genome Browser.
\n", browserUrl, posStr); - if (useBigPsl) + if (autoBigPsl) + { + char *trackName = NULL; + char *trackDescription = NULL; + getCustomName(database, cart, pslList, &trackName, &trackDescription); + + psl = pslList; + char item[1024]; + safef(item, sizeof item, "%s %s %s", pslName,faName,psl->qName); + + struct dyString *url = dyStringNew(256); + dyStringPrintf(url, "http%s://%s", sameString(getenv("HTTPS"), "on") ? "s" : "", getenv("HTTP_HOST")); + dyStringPrintf(url, "%s", hgcUrl+2); + dyStringPrintf(url, "?o=%d", psl->tStart); + dyStringPrintf(url, "&t=%d", psl->tEnd); + dyStringPrintf(url, "&g=%s", "buildBigPsl"); + dyStringPrintf(url, "&i=%s", cgiEncode(item)); + dyStringPrintf(url, "&c=%s", cgiEncode(psl->tName)); + dyStringPrintf(url, "&l=%d", psl->tStart); + dyStringPrintf(url, "&r=%d", psl->tEnd); + dyStringPrintf(url, "&%s=%s", cartSessionVarName(), cartSessionId(cart)); + dyStringPrintf(url, "&Submit=%s", cgiEncode("Create a stable custom track with these results")); + if (pslIsProtein(psl)) + dyStringPrintf(url, "&isProt=on"); + + // We will add them to the url later at runtime in js and ajax. + //dyStringPrintf(url, "&trackName=%s", cgiEncode(trackName)); + //dyStringPrintf(url, "&trackDescription=%s", cgiEncode(trackDescription)); + + //warn("GALT DEBUG hgsid = [%s]", cartSessionId(cart)); + + //warn("GALT DEBUG url = [%s]", url->string); + + jsInlineF( + "var luckyLocation = '';\n" + ); + if(feelingLucky) + { + /* If we found something jump browser to there. */ + if(slCount(pslList) > 0) + printLuckyRedirect(browserUrl, pslList, database, pslName, faName, uiState, unhideTrack); + } + + // RENAME BLAT CT FORM + // new re-submit code with new trackname and decription + if (!feelingLucky) // TODO GALT may revisit this condition + { + printf(" \n"); + + printf(" \n"); + } + + if (!feelingLucky) // TODO GALT may revisit this condition + { + // REMOVE CT BUTTON FORM. + printf(" \n"); + } + + + + //if (feelingLucky) + //warn("GALT DEBUG feelingLucky and autoBigPsl"); // REMOVE + + + jsInlineF( + + "var ct_blat = '';\n" + "\n" + "function buildBigPslCtSuccess (content, status)\n" + "{ // Finishes the succesful creation of blat ct bigPsl. Called by ajax return.\n" + " // saves the ct name so it can be used later for rename or delete.\n" + "//window.alert('status='+status); // debug remove\n" + "//window.alert('content='+content); // debug remove\n" + "\n" + "var matchWord = '&table=';\n" + "var ct_blatPos = content.indexOf(matchWord) + matchWord.length;\n" + "\n" + "if (ct_blatPos >= 0)\n" + " {\n" + " var ct_blatPosEnd = content.indexOf('\"', ct_blatPos);\n" + " ct_blat = content.slice(ct_blatPos, ct_blatPosEnd);\n" + " //window.alert('DEBUG GALT TEST ajax success hgc buildBigPsl called. ct_blat='+ct_blat);\n" + " if (luckyLocation == '')\n" + " {\n" + " $('input[name=\""CT_SELECTED_TABLE_VAR"\"]')[0].value = ct_blat;\n" + " $('input[name=\""CT_SELECTED_TABLE_VAR"\"]')[1].value = ct_blat;\n" + " }\n" + " }\n" + "}\n" + "\n" + "function buildBigPslCt (url, trackName, trackDescription)\n" + "{ // call hgc to buildBigPsl from blat result.\n" + "\n" + "var cgiVars = 'trackName='+encodeURIComponent(trackName)+'&trackDescription='+encodeURIComponent(trackDescription);\n" + "if (!ct_blat !== '')\n" + " {\n" + " cgiVars += '&"CT_DO_REMOVE_VAR"='+encodeURIComponent('Remove Custom Track');\n" + " cgiVars += '&"CT_SELECTED_TABLE_VAR"='+encodeURIComponent(ct_blat);\n" + " }\n" + "\n" + "$.ajax({\n" + " type: 'GET',\n" + " url: url,\n" + " data: cgiVars,\n" + " dataType: 'html',\n" + " trueSuccess: buildBigPslCtSuccess,\n" + " success: catchErrorOrDispatch,\n" + " error: errorHandler,\n" + " cache: false,\n" + " async: false\n" + " });\n" + "}\n" + "\n" + "var url='%s';\n" + "var trackName='%s';\n" + "var trackDescription='%s';\n" + "$(document).ready(function() {\n" + "//window.alert('DEBUG GALT TEST');\n" + "//window.alert('url='+url+' trackName='+trackName+' trackDescription='+trackDescription);\n" + "\n" + "buildBigPslCt(url, trackName, trackDescription);\n" + "//window.alert('result ct_blat = '+ ct_blat);\n" + "if (luckyLocation !== '')\n" + " {\n" + " //window.alert('luckyLocation = ' + luckyLocation);\n" + " location.replace(luckyLocation);\n" + " }\n" + "else\n" + " {\n" + " $('#renameFormItem')[0].style.display = 'block';\n" + " $('#deleteCtForm')[0].style.display = 'block';\n" + " }\n" + "});\n", url->string, trackName, trackDescription); + + + // RENAME CT JS CODE + if (!feelingLucky) + jsInline("$('#showRenameForm').click(function(){\n" + " $('#renameForm')[0].style.display = 'block';\n" + " $('#renameFormItem')[0].style.display = 'none';\n" + " $('#showRenameForm')[0].style.display = 'none';\n" + " $('input[name=\"trackName\"]')[0].value = trackName;\n" + " $('input[name=\"trackDescription\"]')[0].value = trackDescription;\n" + "return false;\n" + "});\n"); + + // RENAME CT JS CODE + if (!feelingLucky) + jsInline("$('#submitTrackNameDescr').click(function(){\n" + "//window.alert('DEBUG GALT TEST');\n" + " $('#renameForm')[0].style.display = 'none';\n" + " $('#renameFormItem')[0].style.display = 'block';\n" + " $('#showRenameForm')[0].style.display = 'block';\n" + " trackName = $('input[name=\"trackName\"]')[0].value;\n" + " trackDescription = $('input[name=\"trackDescription\"]')[0].value;\n" + "buildBigPslCt(url, trackName, trackDescription);\n" + "return false;\n" + "});\n"); + + dyStringFree(&url); + + + } + else if (useBigPsl) { char *trackName = NULL; char *trackDescription = NULL; getCustomName(database, cart, pslList, &trackName, &trackDescription); psl = pslList; printf( "