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