2a17d0be037117b42ee7c740fd98fadf0e58aff2 max Mon Sep 12 16:58:05 2016 -0700 changes after code review, refs #18067 diff --git src/hg/hgc/bigBedClick.c src/hg/hgc/bigBedClick.c index 7d12190..a350096 100644 --- src/hg/hgc/bigBedClick.c +++ src/hg/hgc/bigBedClick.c @@ -39,51 +39,48 @@ /* given two strings of same length, print . for every match and for mismatches, the letter of b */ { int i = 0; while (TRUE) { if (a[i]=='\0' || b[i]=='\0') break; if (a[i]==b[i]) printf("."); else printf("%c", (b[i])); i++; } } -static void detailsTabPrintSpecial(char *name, char *val, struct slPair *extraFields) -/* some extra fields require special printing code, they all start with '_' */ -{ -// crispr track: number of mismatches. A comma-sep string of integers -if (sameWord(name, "_mismatchCounts")) +static void extFieldMismatchCounts(char *val) +/* crispr track: number of mismatches. A comma-sep string of integers */ { printf("<tr><td>Number of potential off-targets</td>\n"); printf("<td>\n"); char *words[255]; int wordCount = chopByChar(val, ',', words, ArraySize(words)); int i; printf("<table style='border-style: hidden'><tr>\n"); for (i=0; i<wordCount; i++) printf("<td style='border:1px solid #CCCCCC; font-weight: normal; width:auto'><b>%d mismatches:</b><br>%s off-targets</td>", i, words[i]); printf("</tr></table>\n"); } -// crispr track: locations of off-targets. A |-separated string of coords, including strand and -// a score -// e.g. chr15;63615585-;71|chr16;8835640+;70 -if (sameWord(name, "_crisprOfftargets")) +static void extFieldCrisprOfftargets(char *val, struct slPair *extraFields) +/* crispr track: locations of off-targets. A |-separated string of coords, including strand and + a score + e.g. chr15;63615585-;71|chr16;8835640+;70 */ { printf("<tr><td>Potential Off-targets</td>\n"); printf("<td>\n"); char *coords[65536]; int coordCount = chopByChar(val, '|', coords, ArraySize(coords)); int i; struct subText *subList = NULL; slSafeAddHead(&subList, subTextNew("ig:", "intergenic ")); slSafeAddHead(&subList, subTextNew("ex:", "exon ")); slSafeAddHead(&subList, subTextNew("in:", "intron ")); slSafeAddHead(&subList, subTextNew("|", "-")); struct sqlConnection *conn = hAllocConn(database); @@ -170,30 +167,38 @@ if (collapsed) { printf("<p><a id='crisprShowAllLink' href='javascript:crisprShowAll()'>" "Show all %d off-targets...</a>\n", coordCount); // inline .js is bad style but why pollute our global .js files for such a rare // case? Maybe we should have a generic "collapsible" class, like bootstrap? printf("<script>\n"); printf("function crisprShowAll() {\n"); printf(" $('#crisprShowAllLink').hide();\n"); printf(" $('.crisprLinkHidden').show();\n"); printf(" return false;\n"); printf("}\n"); printf("</script>\n"); } } + +static void detailsTabPrintSpecial(char *name, char *val, struct slPair *extraFields) +/* some extra fields require special printing code, they all start with '_' */ +{ +if (sameWord(name, "_mismatchCounts")) + extFieldMismatchCounts(val); +else if (sameWord(name, "_crisprOfftargets")) + extFieldCrisprOfftargets(val, extraFields); } static void seekAndPrintTable(char *url, off_t offset, struct slPair *extraFields) /* seek to 0 at url, get headers, then seek to offset, read tab-sep fields and output * (extraFields are needed for some special field handlers) */ { char *detailsUrl = replaceChars(url, "$db", database); // open the URL struct lineFile *lf = lineFileUdcMayOpen(detailsUrl, FALSE); if (lf==NULL) { printf("Error: Could not open the URL referenced in detailsTabUrls, %s", detailsUrl); return; }