5dab84a761280b1155aa58b756fa2c4ecf4baef5 angie Thu Jun 30 09:13:50 2016 -0700 Added optional CGI param to hgMenubar to specify a file other than inc/globalNavBar.inc, so the same correction of relative links can be applied to other files such as inc/jWestFooter.html. refs #17470 diff --git src/hg/hgMenubar/hgMenubar.c src/hg/hgMenubar/hgMenubar.c index 633a17b..5c98516 100644 --- src/hg/hgMenubar/hgMenubar.c +++ src/hg/hgMenubar/hgMenubar.c @@ -1,84 +1,85 @@ /* * This CGI is used by static html pages to show a menu bar. * On an Apache with activated SSI, a html statement like * * will include the menu bar into a static page. */ #include "common.h" +#include "cheapcgi.h" #include "dystring.h" #include "filePath.h" #include "linefile.h" #define CGI_NAME "cgi-bin/hgMenubar" +#define NAVBAR_INC_PATH "/inc/globalNavBar.inc" +#define OLD_HREF "href=\"../" -struct dyString *navBarFilePath(char *cgiPath, char *docRoot) +char *incFilePath(char *cgiPath, char *filePath, char *docRoot) +/* Replace CGI_NAME in cgiPath with docRoot/filePath. filePath must begin with "/" eg "/inc/..." */ { -struct dyString *navPath = dyStringCreate("%s", docRoot); -// Memory leak - replaceChars returns memory that is never freed -char *incPath = replaceChars(cgiPath, "/cgi-bin/hgMenubar", "/inc/globalNavBar.inc"); - -dyStringAppend(navPath, incPath); -return navPath; +char *incPath = replaceChars(cgiPath, "/"CGI_NAME, filePath); +return catTwoStrings(docRoot, incPath); } - void printIncludes(char* baseDir) { printf ("JavaScript is disabled in your web browserYou must have JavaScript enabled in your web browser to use the Genome Browser\n"); printf ("\n", baseDir); printf ("\n", baseDir); printf ("\n", baseDir); } -void printMenuBar(char *cgiPath, char *docRoot, char *pagePath) +void printMenuBar(char *cgiPath, char *docRoot, char *pagePath, char *filePath) { -struct dyString *navBarLoc = navBarFilePath(cgiPath, docRoot); -struct lineFile *menuFile = lineFileOpen(dyStringContents(navBarLoc), TRUE); +char *navBarLoc = incFilePath(cgiPath, filePath, docRoot); +struct lineFile *menuFile = lineFileOpen(navBarLoc, TRUE); char* oldLine = NULL; int lineSize = 0; char *cgiContainerPath = replaceChars(cgiPath, CGI_NAME, ""); char *newPath = makeRelativePath(pagePath, cgiContainerPath); -struct dyString *oldHref = dyStringCreate("href=\"../"); -struct dyString *newHref = dyStringCreate("href=\"%s", newPath); +char *newHref = catTwoStrings("href=\"", newPath); printf ("Content: text/html\r\n\r\n"); +if (sameString(filePath, NAVBAR_INC_PATH)) printIncludes(newPath); while (lineFileNext(menuFile, &oldLine, &lineSize)) { // Not quite as robust as perl search and replace - no variable whitespace handling // Also lots of memory leakage - every line is reallocated and forgotten - char *newLine = replaceChars(oldLine, dyStringContents(oldHref), dyStringContents(newHref)); + char *newLine = replaceChars(oldLine, OLD_HREF, newHref); printf("%s\n", newLine); } lineFileClose(&menuFile); } void parseEnvOrDie (char **cgiPath, char** docRoot, char** pagePath) { *cgiPath = getenv("SCRIPT_NAME"); *docRoot = getenv("DOCUMENT_ROOT"); *pagePath = getenv("REDIRECT_URL"); if (*pagePath == NULL) *pagePath = getenv("DOCUMENT_URI"); if ( (*cgiPath == NULL) || (*docRoot == NULL) || (*pagePath == NULL) ) { fprintf (stderr, "Error: bad invocation of menubar\n"); exit (1); } } int main(int argc, char *argv[]) /* Process command line. */ { char *cgiPath, *docRoot, *pagePath; parseEnvOrDie(&cgiPath, &docRoot, &pagePath); -printMenuBar(cgiPath, docRoot, pagePath); +cgiSpoof(&argc, argv); +char *incFile = cgiUsualString("incFile", NAVBAR_INC_PATH); +printMenuBar(cgiPath, docRoot, pagePath, incFile); return 0; }
JavaScript is disabled in your web browser
You must have JavaScript enabled in your web browser to use the Genome Browser