Next version of JABA
[jabaws.git] / binaries / src / muscle / html.cpp
1 #include "muscle.h"\r
2 #include <stdio.h>\r
3 #include <ctype.h>\r
4 #include "msa.h"\r
5 #include "textfile.h"\r
6 \r
7 const unsigned uCharsPerLine = 60;\r
8 const int MIN_NAME = 10;\r
9 const int MAX_NAME = 32;\r
10 \r
11 extern void AssignColors(const MSA &a, int **Colors);\r
12 \r
13 static int **MakeColors(const MSA &a)\r
14         {\r
15         const unsigned uSeqCount = a.GetSeqCount();\r
16         const unsigned uColCount = a.GetColCount();\r
17 \r
18         int **Colors = new int *[uSeqCount];\r
19         for (unsigned i = 0; i < uSeqCount; ++i)\r
20                 {\r
21                 Colors[i] = new int[uColCount];\r
22                 memset(Colors[i], 0, uColCount*sizeof(int));\r
23                 }\r
24         AssignColors(a, Colors);\r
25         return Colors;\r
26         }\r
27 \r
28 static void ChangeColor(TextFile &File, int From, int To)\r
29         {\r
30         if (From == To)\r
31                 return;\r
32 \r
33 #define COLOR_WHITE             "FFFFFF"\r
34 #define COLOR_GRAY              "C0C0C0"\r
35 #define COLOR_BLACK             "000000"\r
36 #define COLOR_RED               "FF0000"\r
37 #define COLOR_GREEN             "00FF00"\r
38 #define COLOR_BLUE              "5590FF"\r
39 #define COLOR_LIGHTBLUE "77FFFF"\r
40 \r
41 #define X(c)    File.PutString("</SPAN><SPAN STYLE=\"background-color:#" c "\">");\r
42         switch (To)\r
43                 {\r
44         case 0:\r
45                 X(COLOR_WHITE)\r
46                 break;\r
47         case 1:\r
48                 X(COLOR_GRAY)\r
49                 break;\r
50         case 2:\r
51                 X(COLOR_BLUE)\r
52                 break;\r
53         case 3:\r
54                 X(COLOR_LIGHTBLUE)\r
55                 break;\r
56                 }\r
57         }\r
58 \r
59 #define COLOR_WINDOW "FFEEE0"\r
60 \r
61 void MSA::ToHTMLFile(TextFile &File) const\r
62         {\r
63         File.PutString("<HTML>\n");\r
64         File.PutString("<BODY BGCOLOR=\"#" COLOR_WINDOW "\">\n");\r
65         File.PutString("<PRE>");\r
66 \r
67         int **Colors = MakeColors(*this);\r
68 \r
69         int iLongestNameLength = 0;\r
70         for (unsigned uSeqIndex = 0; uSeqIndex < GetSeqCount(); ++uSeqIndex)\r
71                 {\r
72                 const char *ptrName = GetSeqName(uSeqIndex);\r
73                 const char *ptrBlank = strchr(ptrName, ' ');\r
74                 int iLength;\r
75                 if (0 != ptrBlank)\r
76                         iLength = (int) (ptrBlank - ptrName);\r
77                 else\r
78                         iLength = (int) strlen(ptrName);\r
79                 if (iLength > iLongestNameLength)\r
80                         iLongestNameLength = iLength;\r
81                 }\r
82         if (iLongestNameLength > MAX_NAME)\r
83                 iLongestNameLength = MAX_NAME;\r
84         if (iLongestNameLength < MIN_NAME)\r
85                 iLongestNameLength = MIN_NAME;\r
86 \r
87         unsigned uLineCount = (GetColCount() - 1)/uCharsPerLine + 1;\r
88         int CurrentColor = -1;\r
89         for (unsigned uLineIndex = 0; uLineIndex < uLineCount; ++uLineIndex)\r
90                 {\r
91                 File.PutString("\n");\r
92                 unsigned uStartColIndex = uLineIndex*uCharsPerLine;\r
93                 unsigned uEndColIndex = uStartColIndex + uCharsPerLine - 1;\r
94                 if (uEndColIndex >= GetColCount())\r
95                         uEndColIndex = GetColCount() - 1;\r
96                 char Name[MAX_NAME+1];\r
97                 for (unsigned uSeqIndex = 0; uSeqIndex < GetSeqCount(); ++uSeqIndex)\r
98                         {\r
99                         const char *ptrName = GetSeqName(uSeqIndex);\r
100                         const char *ptrBlank = strchr(ptrName, ' ');\r
101                         int iLength;\r
102                         if (0 != ptrBlank)\r
103                                 iLength = (int) (ptrBlank - ptrName);\r
104                         else\r
105                                 iLength = (int) strlen(ptrName);\r
106                         if (iLength > MAX_NAME)\r
107                                 iLength = MAX_NAME;\r
108                         memset(Name, ' ', MAX_NAME);\r
109                         memcpy(Name, ptrName, iLength);\r
110                         Name[iLongestNameLength] = 0;\r
111 \r
112 //                      File.PutString("<FONT COLOR=\"#000000\">");\r
113                         CurrentColor = -1;\r
114                         File.PutString("<SPAN STYLE=\"background-color:#" COLOR_WINDOW "\">");\r
115                         File.PutFormat("%s      ", Name);\r
116                         File.PutString("<SPAN STYLE=\"background-color:#FFFFFF\">");\r
117                         for (unsigned uColIndex = uStartColIndex; uColIndex <= uEndColIndex;\r
118                           ++uColIndex)\r
119                                 {\r
120                                 const int Color = Colors[uSeqIndex][uColIndex];\r
121                                 ChangeColor(File, CurrentColor, Color);\r
122                                 CurrentColor = Color;\r
123                                 const char c = GetChar(uSeqIndex, uColIndex);\r
124                                 if (Color == 0)\r
125                                         File.PutFormat("%c", tolower(c));\r
126                                 else\r
127                                         File.PutFormat("%c", toupper(c));\r
128                                 }\r
129                         File.PutString("\n");\r
130                         }\r
131                 }\r
132         File.PutString("</SPAN>\n");\r
133         File.PutString("</PRE>\n");\r
134         File.PutString("</BODY>\n");\r
135         File.PutString("</HTML>\n");\r
136         }\r