ee211bfbeedc99ca157c71ba3ba04ae6346b263b max Tue Jul 21 02:11:14 2020 -0700 support the super old chrom:start-end syntax again (found by Jonathan), adding back possibility to have higlights on two different dbs by removing check for db-prefix in hgTracks (the db-filtering is done by the javascript code anyways) and clean up the code a little by introducing a function that creates the highlight string from the parts instead of copied code. refs #21384 diff --git src/hg/hgTracks/hgTracks.c src/hg/hgTracks/hgTracks.c index 7fe281e..80dc532 100644 --- src/hg/hgTracks/hgTracks.c +++ src/hg/hgTracks/hgTracks.c @@ -2132,62 +2132,68 @@ } struct highlightVar // store highlight information { struct highlightVar *next; char *db; char *chrom; long chromStart; long chromEnd; char *hexColor; }; struct highlightVar *parseHighlightInfo() // Parse highlight info from cart var to a linked list of highlightVar structs -// Accepts three input formats for the highlight variable: +// Accepts four input formats for the highlight variable: +// 0) chrom:start-end (format in very old carts) // 1) db.chrom:start-end (format in very old carts) // 2) db.chrom:start-end#hexColor|db.chrom:start-end#hexColor|... (old format) // 3) db#chrom#start#end#hexColor|db#chrom#start#end#hexColor|... (current format, to allow . in seq names) // { struct highlightVar *hlList = NULL; char *highlightDef = cartOptionalString(cart, "highlight"); if(highlightDef) { char *hlArr[256]; int hlCount = chopByChar(cloneString(highlightDef), '|', hlArr, ArraySize(hlArr)); int i; for (i=0; idb = cloneNextWordByDelimiter(&oneHl,'#'); h->chrom = cloneNextWordByDelimiter(&oneHl,'#'); chromStart = cloneNextWordByDelimiter(&oneHl,'#'); chromEnd = cloneNextWordByDelimiter(&oneHl,'#'); h->hexColor = cloneString(oneHl); } else // the syntax only used in old saved sessions // the old format: db.chr:start-end followed optionally by #color + // or just chr:start-end { + if (strchr(oneHl, '.')== NULL) + h->db = database; + else h->db = cloneNextWordByDelimiter(&oneHl,'.'); + h->chrom = cloneNextWordByDelimiter(&oneHl,':'); chromStart = cloneNextWordByDelimiter(&oneHl,'-'); chromEnd = cloneNextWordByDelimiter(&oneHl,'#'); if (oneHl && *oneHl != '\0') h->hexColor = cloneString(oneHl); } if (!isEmpty(chromStart) && !isEmpty(chromEnd) && isNumericString(chromStart) && isNumericString(chromEnd) && !isEmpty(h->db) && !isEmpty(h->chrom)) { // long to handle virt chrom coordinates h->chromStart = atol(chromStart); h->chromEnd = atol(chromEnd); h->chromStart--; // Not zero based @@ -10336,32 +10342,31 @@ else { tracksDisplay(); } if (cartVarExists(cart, "hgt.convertChromToVirtChrom")) { cartRemove(cart, "hgt.convertChromToVirtChrom"); return; } jsonObjectAdd(jsonForClient, "measureTiming", newJsonBoolean(measureTiming)); // js code needs to know if a highlightRegion is defined for this db checkAddHighlight(); // call again in case tracksDisplay's call to resolvePosition changed vars char *highlightDef = cartOptionalString(cart, "highlight"); -if (highlightDef && startsWith(database,highlightDef) && - (highlightDef[strlen(database)] == '.' || highlightDef[strlen(database)] == '#')) +if (highlightDef) jsonObjectAdd(jsonForClient, "highlight", newJsonString(highlightDef)); jsonObjectAdd(jsonForClient, "enableHighlightingDialog", newJsonBoolean(cartUsualBoolean(cart, "enableHighlightingDialog", TRUE))); struct dyString *dy = dyStringNew(1024); jsonDyStringPrint(dy, (struct jsonElement *) jsonForClient, "hgTracks", 0); jsInline(dy->string); dyStringFree(&dy); if (measureTiming) measureTime("Time at end of doMiddle, next up cart write"); if (cartOptionalString(cart, "udcTimeout")) { warn("The Genome Browser cart currently includes the \"udcTimeout\" string. "