a2e996babf1ad91f08f6a1a3ceca8ec9af0fe2cf max Thu Apr 19 16:16:58 2012 -0700 changed almost all html in pubs hgc page to get rid of unnecessary tables (this part does not conform to kent style but really looks better) diff --git src/hg/hgc/pubs.c src/hg/hgc/pubs.c index b2a0cf1..3616e83 100644 --- src/hg/hgc/pubs.c +++ src/hg/hgc/pubs.c @@ -1,719 +1,858 @@ /* pubs.c - display details of publiations literature track (pubsxxx tables) */ #include "common.h" #include "jksql.h" #include "hdb.h" #include "hgc.h" #include "hgColors.h" #include "trackDb.h" #include "web.h" #include "hash.h" #include "obscure.h" #include "common.h" #include "string.h" //include "hgTrackUi.h" // cgi var to activate debug output static int pubsDebug = 0; // global var for printArticleInfo to indicate if article has suppl info // Most publishers have supp data bool pubsHasSupp = TRUE; // global var for printArticleInfo to indicate if article is elsevier bool pubsIsElsevier = FALSE; // internal section types in mysql table static char* pubsSecNames[] ={ "header", "abstract", "intro", "methods", "results", "discussion", "conclusions", "ack", "refs", "unknown" }; // // whether a checkbox is checked by default, have to correspond to pubsSecNames static int pubsSecChecked[] ={ 1, 1, 1, 1, 1, 1, 1, 0, 0, 1 }; static char* pubsSequenceTable; + +/* ------ START based on QA's suggestions, functions to replace old HTML tables */ + + +/* Suffix -S for "function accepts style parameter" + * Suffix -C for "function accepts class parameter" + * Suffix -CI for "function accepts class and id parameter" + */ + +static void web2Start(char* tag) +{ +printf("<%s>\n", tag); +} + +static void web2End(char* tag) +{ +printf("%s>\n", tag); +} + +static void web2StartS(char* style, char* tag) +{ +printf("<%s style=\"%s\">\n", tag, style); +} + +static void web2StartC(char* class, char* tag) +{ +printf("<%s class=\"%s\">\n", tag, class); +} + +static void web2StartCI(char* class, char* id, char* tag) +{ +if ((id==NULL) && (class==NULL)) + web2Start(tag); +else if (id==NULL) + web2StartC(class, tag); +else + printf("<%s class=\"%s\" id=\"%s\">\n", tag, class, id); +} + +static void web2PrintS(char* style, char* tag, char* label) +{ +printf("<%s style=\"%s\">%s%s>\n", tag, style, label, tag); +} + +//static void web2PrintC(char* class, char* tag, char* label) +//{ +//printf("<%s class=\"%s\">%s%s>\n", tag, class, label, tag); +//} + +//static void web2Print(char* tag, char* label) +//{ +//printf("<%s>%s%s>\n", tag, label, tag); +//} + +static void web2StartTableC(char* class) { web2StartC(class, "table"); } + +static void web2StartTheadC(char* class) { web2StartC(class, "thead"); } +static void web2EndThead() { web2End("thead"); } + +static void web2StartTbodyS(char* style) { web2StartS(style, "tbody"); } + +static void web2StartCell() { web2Start("td"); } +static void web2EndCell() { web2End("td"); } +static void web2StartCellS(char* style) { web2StartS(style, "td"); } +//static void web2PrintCell(char* label) { web2Print("td", label); } +static void web2PrintCellS(char* style, char *label) { web2PrintS(style, "td", label); } + +static void web2StartRow() { web2Start("tr"); } +static void web2EndRow() { web2End("tr"); } + +//static void web2StartTbody() { web2Start("tbody"); } +static void web2EndTbody() { web2End("tbody"); } + +//static void web2StartTable() { web2Start("table"); } +static void web2EndTable() { web2EndTbody(); web2End("table"); } + +static void web2StartDivCI(char* class, char* id) { web2StartCI(class, id, "div"); } +static void web2StartDivC(char* class) { web2StartC(class, "div"); } + +static void web2EndDiv(char* comment) +{ +printf(" \n", comment); +} + +static void web2PrintHeaderCell(char *label, int width) +/* Print th heading cell with given width in percent */ +{ +printf("
",
+ printf(
+ " ",
hgTracksPathAndSettings(), database, seqName, start+1, end, articleId, pslTrack, dispId);
+
printf("Show these sequence matches individually on genome browser (activates track \""
"Individual matches for article\") \n");
}
static void printLimitWarning(struct sqlConnection *conn, char* markerTable,
char* item, int itemLimit, char* sectionList)
{
char query[4000];
safef(query, sizeof(query), "SELECT COUNT(*) from %s WHERE markerId='%s' AND section in (%s) ", markerTable, item, sectionList);
if (sqlNeedQuickNum(conn, query) > itemLimit)
{
printf("This marker is mentioned more than %d times \n", itemLimit);
}
}
static void printMarkerSnippets(struct sqlConnection *conn, char* articleTable, char* markerTable, char* item)
{
/* do not show more snippets than this limit */
int itemLimit=1000;
printSectionCheckboxes();
char* sectionList = makeSqlMarkerList();
printLimitWarning(conn, markerTable, item, itemLimit, sectionList);
printf(" ", snippets);
printf(" %s %s", cit);
if (strlen(pmid)!=0 && strcmp(pmid, "0"))
printf(", PMID%s\n", pmid, pmid);
printf(" %s Copyright 2012 Elsevier B.V. All rights reserved. ");
+ printf(" Copyright 2012 Elsevier B.V. All rights reserved.
\n");
printf("
\n", itemLimit);
printf("The results would take too long to load in your browser and are "
"therefore limited to %d articles.Snippets from Publications:
");
struct sqlResult* sr = queryMarkerRows(conn, markerTable, articleTable, item, itemLimit, sectionList);
char **row;
while ((row = sqlNextRow(sr)) != NULL)
{
char* articleId = row[0];
char* url = row[1];
char* title = row[2];
char* authors = row[3];
char* citation = row[4];
char* pmid = row[5];
char* snippets = row[6];
url = mangleUrl(url);
printf("%s ", url, title);
printf("%s; ", authors);
printf("%s ", citation);
if (!isEmpty(pmid) && strcmp(pmid, "0")!=0 )
printf(", PMID%s\n", pmid, pmid);
printf("
\n");
if (pubsDebug)
printf("articleId=%s", articleId);
printf("%s
");
}
freeMem(sectionList);
sqlFreeResult(&sr);
}
static char* printArticleInfo(struct sqlConnection *conn, char* item, char* pubsArticleTable)
/* Header with information about paper, return documentId */
{
char query[512];
safef(query, sizeof(query), "SELECT articleId, url, title, authors, citation, abstract, pmid FROM %s WHERE articleId='%s'", pubsArticleTable, item);
struct sqlResult *sr = sqlGetResult(conn, query);
char **row;
char *articleId=NULL;
if ((row = sqlNextRow(sr)) == NULL)
{
printf("Could not resolve articleId %s, this is an internal error.\n", item);
printf("Please send an email to max@soe.ucsc.edu\n");
sqlFreeResult(&sr);
return NULL;
}
articleId = cloneString(row[0]);
char* url = row[1];
char* title = row[2];
char* authors = row[3];
char* cit = row[4];
char* abstract = row[5];
char* pmid = row[6];
url = mangleUrl(url);
if (strlen(abstract)==0)
abstract = "(No abstract available for this article. "
"Please follow the link to the fulltext above.)";
if (stringIn("sciencedirect.com", url))
{
pubsHasSupp = FALSE;
pubsIsElsevier = TRUE;
}
printf("
", query);
// split comma-sep list into parts
char* seqIdCoordString = sqlQuickString(conn, query);
char* seqIdCoords[1024];
int partCount = chopString(seqIdCoordString, ",", seqIdCoords, ArraySize(seqIdCoords));
int i;
struct hash *seqIdHash = NULL;
seqIdHash = newHash(0);
for (i=0; iArticle file \n");
-puts(" One row per sequence, with flanking text, sequence in bold \n");
+ web2PrintHeaderCell("Article file", 10);
+web2PrintHeaderCell("One row per sequence, with flanking text, sequence in bold", 60);
if (pubsDebug)
- puts(" Identifiers \n");
+ web2PrintHeaderCell("Identifiers", 30);
if (!isClickedSection && !pubsDebug)
- puts(" Chained matches with this sequence \n");
-puts("\n");
+ web2PrintHeaderCell("Chained matches with this sequence", 20);
+web2EndThead();
+web2StartTbodyS("font-family: Arial, Helvetica, sans-serif; line-height: 1.5em; font-size: 0.9em;");
}
static void printAddWbr(char* text, int distance)
/* a crazy hack for firefox/mozilla that is unable to break long words in tables
* We need to add a
");
+ printf("
");
freeMem(endStr); //XX why can't I free these?
freeMem(chrom);
freeMem(startStr);
freeMem(db);
}
}
+
+
+
static bool printSeqSection(char* articleId, char* title, bool showDesc, struct sqlConnection* conn, struct hash* clickedSeqs, bool isClickedSection, bool fasta, char* pslTable, char* articleTable)
-/* print a table of sequences, show only sequences with IDs in hash,
+/* print a section with a table of sequences, show only sequences with IDs in hash,
* There are two sections, respective sequences are shown depending on isClickedSection and clickedSeqs
* - seqs that were clicked on (isClickedSection=True) -> show only seqs in clickedSeqs
* - other seqs (isClickedSection=False) -> show all other seqs
*
* */
{
// get data from mysql
char query[4096];
safef(query, sizeof(query),
"SELECT fileDesc, snippet, locations, articleId, fileId, seqId, sequence "
"FROM %s WHERE articleId='%s';", pubsSequenceTable, articleId);
if (pubsDebug)
puts(query);
struct sqlResult *sr = sqlGetResult(conn, query);
// construct title for section
char* otherFormat = NULL;
if (fasta)
otherFormat = "table";
else
otherFormat = "fasta";
char fullTitle[5000];
safef(fullTitle, sizeof(fullTitle),
-"%s (%s format)",
+"%s (%s format)\n",
title, cartSidUrlString(cart), cgiString("o"), cgiString("t"), cgiString("g"), cgiString("i"),
!fasta, otherFormat);
-webNewSection("%s", fullTitle);
+web2StartSection("pubsSection", "%s", fullTitle);
+// print filtering link at start of table & table headers
if (isClickedSection)
- {
printFilterLink(pslTable, articleId, articleTable);
- printf("");
- }
-else
- printf(" ");
-
if (fasta)
- printf("");
if (!fasta)
printSeqHeaders(showDesc, isClickedSection);
+// output rows
char **row;
bool foundSkippedRows = FALSE;
while ((row = sqlNextRow(sr)) != NULL)
{
char* fileDesc = row[0];
char* snippet = row[1];
char* locString= row[2];
char* artId = row[3];
char* fileId = row[4];
char* seqId = row[5];
char* seq = row[6];
// annotation (=sequence) ID is a 64 bit int with 10 digits for
// article, 3 digits for file, 5 for annotation
char annotId[100];
safef(annotId, 100, "%010d%03d%05d", atoi(artId), atoi(fileId), atoi(seqId));
if (pubsDebug)
printf("%s", annotId);
// only display this sequence if we're in the right section
if (clickedSeqs!=NULL && ((hashLookup(clickedSeqs, annotId)!=NULL) != isClickedSection)) {
foundSkippedRows = TRUE;
continue;
}
- printf(" ", annotId, seq);
+ printf(">%s>%s
%s
%s
", annotId, seq);
else
{
- printf("\n");
+ web2StartRow();
+
+ // column 1: type of file (main or supp)
if (showDesc)
- printf(" \n");
+ web2EndRow();
}
}
-printf("\n"); // finish section
-webEndSectionTables();
+if (!fasta)
+ web2EndTable();
+
+web2EndSection();
sqlFreeResult(&sr);
return foundSkippedRows;
}
static void printSeqInfo(struct sqlConnection* conn, char* trackTable,
char* pslTable, char* articleId, char* item, char* seqName, int start,
bool fileDesc, bool fasta, char* articleTable)
/* print sequences, split into two sections
* two sections: one for sequences that were clicked, one for all others*/
{
struct hash* clickedSeqs = getSeqIdHash(conn, trackTable, articleId, item, seqName, start);
bool skippedRows;
if (clickedSeqs)
skippedRows = printSeqSection(articleId, "Sequences used to construct this feature", \
fileDesc, conn, clickedSeqs, 1, fasta, pslTable, articleTable);
else
skippedRows=1;
if (skippedRows)
printSeqSection(articleId, "Other Sequences in this article", \
fileDesc, conn, clickedSeqs, 0, fasta, pslTable, articleTable);
if (pubsIsElsevier)
- printf("%s\n", fileDesc);
- //printf(" %s \n", snippet);
- printf("");
+ web2PrintCellS(fileDesc, "word-break:break-all");
+
+ // column 2: snippet
+ web2StartCellS("word-break:break-all");
printAddWbr(snippet, 40);
- printf(" \n");
+ web2EndCell();
+
+ // optional debug info column
if (pubsDebug)
- printf("article %s, file %s, seq %s, annotId %s", artId, fileId, seqId, annotId);
+ web2PrintCellF("article %s, file %s, seq %s, annotId %s", artId, fileId, seqId, annotId);
- // print links to locations
+ // column 3: print links to locations, only print this in the 2nd section
if (!isClickedSection && !pubsDebug)
{
// format: hg19/chr1:300-400,mm9/chr1:60006-23234
// split on "," then split on "/"
//locs = charSepToSlNames(locString, ',');
+ web2StartCell();
char* locArr[1024];
int partCount = chopString(locString, ",", locArr, ArraySize(locArr));
- printf(" ");
if (partCount==0)
printf("No matches");
else
{
struct slName *locs;
locs = slNameListFromStringArray(locArr, partCount);
slUniqify(&locs, slNameCmp, slNameFree);
printGbLinks(locs);
- printf(" \n");
+ printf("
");
- printf("
");
slFreeList(&locs);
}
-
+ web2EndCell();
}
- printf("
\n", seqName, startBuf, endBuf);
long size = end - start;
sprintLongWithCommas(startBuf, size);
if (showSize)
printf("Genomic Size: %s
\n", startBuf);
}
static bioSeq *getSeq(struct sqlConnection *conn, char *table, char *id)
/* copied from otherOrgs.c */
{
char query[512];
struct sqlResult *sr;
char **row;
bioSeq *seq = NULL;
safef(query, sizeof(query),
"select sequence from %s where annotId = '%s'", table, id);
sr = sqlGetResult(conn, query);
if ((row = sqlNextRow(sr)) != NULL)
{
AllocVar(seq);
seq->name = cloneString(id);
seq->dna = cloneString(row[0]);
seq->size = strlen(seq->dna);
}
sqlFreeResult(&sr);
return seq;
}
void pubsAli(struct sqlConnection *conn, char *pslTable, char *seqTable, char *item)
/* this is just a ripoff from htcCdnaAli, similar to markd's transMapAli */
{
bioSeq *oSeq = NULL;
writeFramesetType();
puts("");
printf("\nGenomic Alignment with sequence found in publication fulltext
");
printAlignmentsSimple(psl, start, trackTable, trackTable, item);
}
}
else
{
printTrackVersion(tdb, conn, item);
if (stringIn("Marker", trackTable))
{
char* markerTable = trackDbRequiredSetting(tdb, "pubsMarkerTable");
printPositionAndSize(start, end, 0);
printMarkerSnippets(conn, articleTable, markerTable, item);
}
else
{
printPositionAndSize(start, end, 1);
pubsSequenceTable = trackDbRequiredSetting(tdb, "pubsSequenceTable");
char* articleId = printArticleInfo(conn, item, articleTable);
if (articleId!=NULL)
{
char *pslTable = trackDbRequiredSetting(tdb, "pubsPslTrack");
printSeqInfo(conn, trackTable, pslTable, articleId, item, seqName, start, pubsHasSupp, fasta, articleTable);
}
}
}
printTrackHtml(tdb);
hFreeConn(&conn);
}