aab4f66a2aca5293f3536cc1d1438b17d2b09dfd tdreszer Thu May 5 16:14:15 2011 -0700 A large set of tiny changes. These fix a lot of discrepencies with bgcolor and font color declarations which were tripping up docttype 4.01. diff --git src/getgene/getgene.c src/getgene/getgene.c index 3082e87..1b97a0b 100644 --- src/getgene/getgene.c +++ src/getgene/getgene.c @@ -1,372 +1,372 @@ #include "common.h" #include "htmshell.h" #include "cheapcgi.h" #include "dnautil.h" #include "dnaseq.h" #include "wormdna.h" struct dfm /* Output formatter. */ { int wordLen, lineLen; int inWord, inLine; boolean lineNumbers; boolean hiliteRange; long startRange; long endRange; long charCount; FILE *out; }; void initDfm(struct dfm *dfm, int wordLen, int lineLen, boolean lineNumbers, boolean hiliteRange, long startRange, long endRange, FILE *out) /* Set up formatting. */ { dfm->inWord = dfm->inLine = dfm->charCount = 0; dfm->wordLen = wordLen; dfm->lineLen = lineLen; dfm->lineNumbers = lineNumbers; dfm->hiliteRange = hiliteRange; dfm->startRange = startRange; dfm->endRange = endRange; dfm->out = out; } void dfmOut(struct dfm *dfm, char c) /* Write out a byte, and depending on formatting extras */ { if (dfm->hiliteRange && dfm->charCount == dfm->startRange) { - fprintf(dfm->out, "<A NAME=\"CLICKED\"></A><FONT COLOR=\"#0033FF\">"); + fprintf(dfm->out, "<A NAME=\"CLICKED\"></A><span style='color:#0033FF;'>"); } ++dfm->charCount; fputc(c, dfm->out); if (dfm->hiliteRange && dfm->charCount == dfm->endRange) { - fprintf(dfm->out, "</FONT>"); + fprintf(dfm->out, "</span>"); } if (dfm->wordLen) { if (++dfm->inWord >= dfm->wordLen) { fputc(' ', dfm->out); dfm->inWord = 0; } } if (dfm->lineLen) { if (++dfm->inLine >= dfm->lineLen) { if (dfm->lineNumbers) fprintf(dfm->out, " %ld", dfm->charCount); fprintf(dfm->out, "<BR>\n"); dfm->inLine = 0; } } } boolean findLineInFile(char *fileName, char *start, char *lineBuf, int lineBufSize) /* Loop through each line in named file until come to one whose * first word (deliminated by a space) is start. Put the resulting * line in lineBuf. */ { FILE *f; int startLen = strlen(start); boolean foundIt = FALSE; f = mustOpen(fileName, "r"); for (;;) { if ((fgets(lineBuf, lineBufSize, f)) == NULL) break; if (strncmp(start, lineBuf, startLen) == 0 && lineBuf[startLen] == ' ') { foundIt = TRUE; break; } } fclose(f); return foundIt; } char *chopOutSecondWord(char *lineBuf) /* Return pointer to second word in line. Zero terminate this word. */ { char *s; int wordLen; s = skipLeadingSpaces(lineBuf); wordLen = strcspn(s,whiteSpaceChopper); s += wordLen; s = skipLeadingSpaces(s); wordLen = strcspn(s,whiteSpaceChopper); if (wordLen <= 0) return NULL; s[wordLen] = 0; return s; } void outputSeq(DNA *dna, int dnaSize, boolean hiliteRange, long startRange, long endRange, FILE *out) /* Write out sequence. */ { struct dfm dfm; int i; char *seq = dna; int size = dnaSize; if (cgiBoolean("translate")) { int utr5 = 0; int maxProtSize = (dnaSize+2)/3; char *prot = needMem(maxProtSize + 1); if (cgiVarExists("utr5")) utr5 = cgiInt("utr5")-1; startRange -= utr5; endRange -= utr5; startRange /= 3; endRange /= 3; dna += utr5; seq = prot; for (size = 0; size < maxProtSize; ++size) { if ((*prot++ = lookupCodon(dna)) == 0) break; dna += 3; } *prot = 0; } initDfm(&dfm, 10, 50, TRUE, hiliteRange, startRange, endRange, out); for (i=0; i<size; ++i) dfmOut(&dfm, seq[i]); } int countUpper(char *s) /* Count upper case chars */ { char c; int count = 0; while ((c = *s++) != '\0') if (isupper(c)) ++count; return count; } char *cloneUpperOnly(char *s) /* Return string that is only upper case bits of s. */ { char c; char *d; char *upper; int upSize = countUpper(s); upper = d = needMem(upSize+1); while ((c = *s++) != '\0') { if (isupper(c)) *d++ = c; } *d = 0; return upper; } void doMiddle() { char *seqName; boolean intronsLowerCase = TRUE; boolean intronsParenthesized = FALSE; boolean hiliteNear = FALSE; int startRange = 0; int endRange = 0; boolean gotRange = FALSE; struct dnaSeq *cdnaSeq; boolean isChromRange = FALSE; DNA *dna; char *translation = NULL; seqName = cgiString("geneName"); seqName = trimSpaces(seqName); if (cgiVarExists("intronsLowerCase")) intronsLowerCase = cgiBoolean("intronsLowerCase"); if (cgiVarExists("intronsParenthesized")) intronsParenthesized = cgiBoolean("intronsParenthesized"); if (cgiVarExists("startRange") && cgiVarExists("endRange" )) { startRange = cgiInt("startRange"); endRange = cgiInt("endRange"); gotRange = TRUE; } if (cgiVarExists("hiliteNear")) { hiliteNear = TRUE; } fprintf(stdout, "<P><TT>\n"); /* The logic here is a little complex to optimize speed. * If we can decide what type of thing the name refers to by * simply looking at the name we do. Otherwise we have to * search the database in various ways until we get a hit. */ if (wormIsNamelessCluster(seqName)) { isChromRange = TRUE; } else if (wormIsChromRange(seqName)) { isChromRange = TRUE; } else if (getWormGeneDna(seqName, &dna, TRUE)) { if (cgiBoolean("litLink")) { char nameBuf[64]; char *geneName = NULL; char *productName = NULL; char *coding; int transSize; struct wormCdnaInfo info; printf("<H3>Information and Links for %s</H3>\n", seqName); if (wormInfoForGene(seqName, &info)) { if (info.description) printf("<P>%s</P>\n", info.description); geneName = info.gene; productName = info.product; } else { if (wormIsGeneName(seqName)) geneName = seqName; else if (wormGeneForOrf(seqName, nameBuf, sizeof(nameBuf))) geneName = nameBuf; } coding = cloneUpperOnly(dna); transSize = 1 + (strlen(coding)+2)/3; translation = needMem(1+strlen(coding)/3); dnaTranslateSome(coding, translation, transSize); freez(&coding); if (geneName) { printf("<A HREF=\"http://www.ncbi.nlm.nih.gov/htbin-post/Entrez/query?form=4&db=m&term=C+elegans+%s&dispmax=50&relentrezdate=No+Limit\">", geneName); printf("PubMed search on gene: </A>%s<BR>\n", geneName); } if (productName) { char *encoded = cgiEncode(productName); printf("<A HREF=\"http://www.ncbi.nlm.nih.gov/htbin-post/Entrez/query?form=4&db=m&term=%s&dispmax=50&relentrezdate=No+Limit\">", encoded); printf("PubMed search on product:</A> %s<BR>\n", productName); freeMem(encoded); } /* Process name to get rid of isoform letter for Proteome. */ if (geneName) strcpy(nameBuf, geneName); else { strcpy(nameBuf, seqName); #ifdef NEVER /* Sometimes Proteome requires the letter after the orf name * in alt-spliced cases, sometimes it can't handle it.... */ nameLen = strlen(nameBuf); if (wormIsOrfName(nameBuf) && isalpha(nameBuf[nameLen-1])) { char *dotPos = strrchr(nameBuf, '.'); if (dotPos != NULL && isdigit(dotPos[1])) nameBuf[nameLen-1] = 0; } #endif /* NEVER */ } printf("<A HREF=\"http://www.wormbase.org/db/seq/sequence?name=%s;class=Sequence\">", seqName); printf("WormBase link on:</A> %s<BR>\n", seqName); printf("<A HREF=\"http://www.proteome.com/databases/WormPD/reports/%s.html\">", nameBuf); printf("Proteome link on:</A> %s<BR>\n<BR>\n", nameBuf); printf("<A HREF=#DNA>Genomic DNA Sequence</A><BR>\n"); if (hiliteNear) printf("<A HREF=\"#CLICKED\">Shortcut to where you clicked in gene</A><BR>"); printf("<A HREF=#protein>Translated Protein Sequence</A><BR>\n"); htmlHorizontalLine(); printf("<A NAME=DNA></A>"); printf("<H3>%s Genomic DNA sequence</H3>", seqName); } if (!intronsLowerCase) tolowers(dna); if (hiliteNear) { if (!gotRange) { double nearPos = cgiDouble("hiliteNear"); int rad = 5; int dnaSize = strlen(dna); long mid = (int)(dnaSize * nearPos); startRange = mid - rad; if (startRange < 0) startRange = 0; endRange = mid + rad; if (endRange >= dnaSize) endRange = dnaSize - 1; } } outputSeq(dna, strlen(dna), hiliteNear, startRange, endRange, stdout); freez(&dna); } else if (wormCdnaSeq(seqName, &cdnaSeq, NULL)) { outputSeq(cdnaSeq->dna, cdnaSeq->size, FALSE, 0, 0, stdout); } else { isChromRange = TRUE; } if (isChromRange) { char *chromId; int start, end; char strand = '+'; int size; if (!wormGeneRange(seqName, &chromId, &strand, &start, &end)) errAbort("Can't find %s",seqName); size = end - start; if (intronsLowerCase) dna = wormChromPartExonsUpper(chromId, start, size); else { dna = wormChromPart(chromId, start, size); touppers(dna); } if (cgiVarExists("strand")) strand = cgiString("strand")[0]; if (strand == '-') reverseComplement(dna, size); outputSeq(dna, size, FALSE, 0, 0, stdout); } if (translation != NULL) { htmlHorizontalLine(); printf("<A NAME=protein></A>"); printf("<H3>Translated Protein of %s</H3>\n", seqName); outputSeq(translation, strlen(translation), FALSE, 0, 0, stdout); freez(&translation); } fprintf(stdout, "</TT></P>\n"); } int main(int argc, char *argv[]) { char *geneName; char title[256]; if (argc == 2 && sameWord(argv[1], "test")) putenv("QUERY_STRING=geneName=I:4000-5500&hiliteNear=0.917112&intronsLowerCase=On"); geneName = cgiString("geneName"); sprintf(title, "%s DNA Sequence", geneName); dnaUtilOpen(); htmShell(title, doMiddle, "QUERY"); return 0; }