533112afe2a2005e80cdb1f82904ea65032d4302
braney
  Sat Oct 2 11:37:34 2021 -0700
split hg/lib into two separate libaries, one only used by the cgis

diff --git src/hg/cgilib/ensFace.c src/hg/cgilib/ensFace.c
new file mode 100644
index 0000000..3bf92fc
--- /dev/null
+++ src/hg/cgilib/ensFace.c
@@ -0,0 +1,152 @@
+/* ensFace - stuff to manage interface to Ensembl web site. */
+
+/* Copyright (C) 2014 The Regents of the University of California 
+ * See README in this or parent directory for licensing information. */
+
+#include "common.h"
+#include "dystring.h"
+#include "ensFace.h"
+#include "hCommon.h"
+#include "hdb.h"
+
+
+struct stringPair
+/* A pair of strings. */
+   {
+   char *a;	/* One string. */
+   char *b;	/* The other string */
+   };
+
+
+char *ensOrgNameFromScientificName(char *scientificName)
+/* Convert from ucsc to Ensembl organism name.
+ * This is scientific name, with underscore replacing spaces
+ * Caller must free returned string */
+{
+    char *p;
+    char *res;
+    if (scientificName == NULL) 
+        return NULL;
+    if (sameWord(scientificName, "Takifugu rubripes"))
+        {
+        /* special case for fugu, whose scientific name
+         * has been changed to Takifugu, but not at ensembl */
+        return "Fugu_rubripes";
+        }
+    if (sameWord(scientificName, "Pongo pygmaeus abelii"))
+        {
+        /* special case for Orangutan, different form of the same
+         * scientific name */
+        return "Pongo_pygmaeus";
+        }
+    if (sameWord(scientificName, "Canis lupus familiaris"))
+        {
+        /* special case for Dog, different form of the same
+         * scientific name */
+        return "Canis_familiaris";
+        }
+    if (sameWord(scientificName, "Gorilla gorilla gorilla"))
+        {
+        /* special case for Dog, different form of the same
+         * scientific name */
+        return "Gorilla_gorilla";
+        }
+    if (sameWord(scientificName, "Spermophilus tridecemlineatus"))
+        {
+        /* special case for squirrel, whose scientific name has been
+         * changed from Spermophilusv to Ictidomys at ensembl */
+        return "Ictidomys_tridecemlineatus";
+        }
+
+    /* replace spaces with underscores, assume max two spaces
+     * (species and sub-species).  */
+    res = cloneString(scientificName);
+    if ((p = index(res, ' ')) != NULL)
+        *p = '_';
+    if ((p = rindex(res, ' ')) != NULL)
+        *p = '_';
+    return res;
+}
+
+static char *ucscToEnsembl(char *database, char *chrom)
+/* if table UCSC_TO_ENSEMBL exists in the given database, return the
+   Ensembl name for this chrom */
+{
+static char ensemblName[256];
+struct sqlConnection *conn = hAllocConn(database);
+ensemblName[0] = 0;
+if (sqlTableExists(conn, UCSC_TO_ENSEMBL))
+    {
+    char query[256];
+    sqlSafef(query, ArraySize(query), "select ensembl from %s where ucsc='%s'",
+	UCSC_TO_ENSEMBL, chrom);
+    (void) sqlQuickQuery(conn,query,ensemblName,ArraySize(ensemblName));
+    }
+return ensemblName;
+}
+
+static int liftToEnsembl(char *database, char *chrom)
+/* if table ENSEMBL_LIFT exists in the given database, return the
+   offset for this chrom, else return zero */
+{
+int offset = 0;
+struct sqlConnection *conn = hAllocConn(database);
+
+if (sqlTableExists(conn, ENSEMBL_LIFT))
+    {
+    char query[256];
+    sqlSafef(query, ArraySize(query), "select offset from %s where chrom='%s'",
+	ENSEMBL_LIFT, chrom);
+    offset = sqlQuickNum(conn,query); // returns 0 for failed query
+    }
+return offset;
+}
+
+struct dyString *ensContigViewUrl(
+char *database, char *ensOrg, char *chrom, int chromSize,
+                            int winStart, int winEnd, char *archive)
+/* Return a URL that will take you to ensembl's contig view. */
+/* Not using chromSize.  archive is possibly a date reference */
+{
+struct dyString *dy = dyStringNew(0);
+char *chrName;
+char *ensemblName = ucscToEnsembl(database, chrom);
+int ensemblLift = 0;
+int start = winStart;
+int end = winEnd;
+
+if (isNotEmpty(ensemblName))
+    {
+    chrName = ensemblName;
+    ensemblLift = liftToEnsembl(database, ensemblName);
+    start += ensemblLift;
+    end += ensemblLift;
+    }
+else if (startsWith("scaffold", chrom))
+    chrName = chrom;
+else
+    chrName = skipChr(chrom);
+
+if (archive)
+    if (sameWord(archive,"ncbi36"))
+	{
+    dyStringPrintf(dy, 
+	   "http://%s.ensembl.org/%s/contigview?chr=%s&start=%d&end=%d",
+		    archive, ensOrg, chrName, start, end);
+	}
+    else
+	{
+    dyStringPrintf(dy, 
+	   "http://%s.archive.ensembl.org/%s/contigview?chr=%s&start=%d&end=%d",
+		    archive, ensOrg, chrName, start, end);
+	}
+else
+    if (sameWord(database, "hg19"))
+        // grch37 now has a special status within Ensembl, with a separate server that gets special updates
+        dyStringPrintf(dy, 
+               "http://grch37.ensembl.org/Homo_sapiens/contigview?chr=%s&start=%d&end=%d", chrName, start, end);
+    else
+        dyStringPrintf(dy, 
+               "http://www.ensembl.org/%s/contigview?chr=%s&start=%d&end=%d", ensOrg, chrName, start, end);
+return dy;
+}