Mercurial > repos > lsong10 > psiclass
comparison PsiCLASS-1.0.2/samtools-0.1.19/bam_tview_html.c @ 0:903fc43d6227 draft default tip
Uploaded
author | lsong10 |
---|---|
date | Fri, 26 Mar 2021 16:52:45 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:903fc43d6227 |
---|---|
1 #include <unistd.h> | |
2 #include "bam_tview.h" | |
3 | |
4 #define UNDERLINE_FLAG 10 | |
5 | |
6 typedef struct HtmlTview { | |
7 tview_t view; | |
8 int row_count; | |
9 tixel_t** screen; | |
10 FILE* out; | |
11 int attributes;/* color... */ | |
12 } html_tview_t; | |
13 | |
14 #define FROM_TV(ptr) ((html_tview_t*)ptr) | |
15 | |
16 static void html_destroy(tview_t* base) | |
17 { | |
18 int i; | |
19 html_tview_t* tv=(html_tview_t*)base; | |
20 if(tv->screen!=NULL) | |
21 { | |
22 for(i=0;i< tv->row_count;++i) free(tv->screen[i]); | |
23 free(tv->screen); | |
24 } | |
25 base_tv_destroy(base); | |
26 free(tv); | |
27 } | |
28 | |
29 /* | |
30 void (*my_mvprintw)(struct AbstractTview* ,int,int,const char*,...); | |
31 void (*my_)(struct AbstractTview*,int,int,int); | |
32 void (*my_attron)(struct AbstractTview*,int); | |
33 void (*my_attroff)(struct AbstractTview*,int); | |
34 void (*my_clear)(struct AbstractTview*); | |
35 int (*my_colorpair)(struct AbstractTview*,int); | |
36 */ | |
37 | |
38 static void html_mvprintw(struct AbstractTview* tv,int y ,int x,const char* fmt,...) | |
39 { | |
40 int i,nchars=0; | |
41 unsigned int size=tv->mcol+2; | |
42 char* str=malloc(size); | |
43 if(str==0) exit(EXIT_FAILURE); | |
44 va_list argptr; | |
45 va_start(argptr, fmt); | |
46 nchars=vsnprintf(str,size, fmt, argptr); | |
47 va_end(argptr); | |
48 | |
49 for(i=0;i< nchars;++i) | |
50 { | |
51 tv->my_mvaddch(tv,y,x+i,str[i]); | |
52 } | |
53 free(str); | |
54 } | |
55 | |
56 static void html_mvaddch(struct AbstractTview* tv,int y,int x,int ch) | |
57 { | |
58 tixel_t* row=NULL; | |
59 html_tview_t* ptr=FROM_TV(tv); | |
60 if( x >= tv->mcol ) return; //out of screen | |
61 while(ptr->row_count<=y) | |
62 { | |
63 int x; | |
64 row=(tixel_t*)calloc(tv->mcol,sizeof(tixel_t)); | |
65 if(row==0) exit(EXIT_FAILURE); | |
66 for(x=0;x<tv->mcol;++x) {row[x].ch=' ';row[x].attributes=0;} | |
67 ptr->screen=(tixel_t**)realloc(ptr->screen,sizeof(tixel_t*)*(ptr->row_count+1)); | |
68 ptr->screen[ptr->row_count++]=row; | |
69 } | |
70 row=ptr->screen[y]; | |
71 row[x].ch=ch; | |
72 row[x].attributes=ptr->attributes; | |
73 } | |
74 | |
75 static void html_attron(struct AbstractTview* tv,int flag) | |
76 { | |
77 html_tview_t* ptr=FROM_TV(tv); | |
78 ptr->attributes |= flag; | |
79 | |
80 | |
81 } | |
82 | |
83 static void html_attroff(struct AbstractTview* tv,int flag) | |
84 { | |
85 html_tview_t* ptr=FROM_TV(tv); | |
86 ptr->attributes &= ~(flag); | |
87 } | |
88 | |
89 static void html_clear(struct AbstractTview* tv) | |
90 { | |
91 html_tview_t* ptr=FROM_TV(tv); | |
92 if(ptr->screen!=NULL) | |
93 { | |
94 int i; | |
95 for(i=0;i< ptr->row_count;++i) free(ptr->screen[i]); | |
96 free(ptr->screen); | |
97 ptr->screen=NULL; | |
98 } | |
99 ptr->row_count=0; | |
100 ptr->attributes=0; | |
101 } | |
102 | |
103 static int html_colorpair(struct AbstractTview* tv,int flag) | |
104 { | |
105 return (1 << (flag)); | |
106 } | |
107 | |
108 static int html_drawaln(struct AbstractTview* tv, int tid, int pos) | |
109 { | |
110 int y,x; | |
111 html_tview_t* ptr=FROM_TV(tv); | |
112 html_clear(tv); | |
113 base_draw_aln(tv, tid, pos); | |
114 fputs("<html><head>",ptr->out); | |
115 fprintf(ptr->out,"<title>%s:%d</title>", | |
116 tv->header->target_name[tid], | |
117 pos+1 | |
118 ); | |
119 //style | |
120 | |
121 fputs("<style type='text/css'>\n",ptr->out); | |
122 fputs(".tviewbody { margin:5px; background-color:white;text-align:center;}\n",ptr->out); | |
123 fputs(".tviewtitle {text-align:center;}\n",ptr->out); | |
124 fputs(".tviewpre { margin:5px; background-color:white;}\n",ptr->out); | |
125 #define CSS(id,col) fprintf(ptr->out,".tviewc%d {color:%s;}\n.tviewcu%d {color:%s;text-decoration:underline;}\n",id,col,id,col); | |
126 CSS(0, "black"); | |
127 CSS(1, "blue"); | |
128 CSS(2, "green"); | |
129 CSS(3, "yellow"); | |
130 CSS(4, "black"); | |
131 CSS(5, "green"); | |
132 CSS(6, "cyan"); | |
133 CSS(7, "yellow"); | |
134 CSS(8, "red"); | |
135 CSS(9, "blue"); | |
136 #undef CSS | |
137 fputs("</style>",ptr->out); | |
138 | |
139 fputs("</head><body>",ptr->out); | |
140 | |
141 fprintf(ptr->out,"<div class='tviewbody'><div class='tviewtitle'>%s:%d</div>", | |
142 tv->header->target_name[tid], | |
143 pos+1 | |
144 ); | |
145 | |
146 fputs("<pre class='tviewpre'>",ptr->out); | |
147 for(y=0;y< ptr->row_count;++y) | |
148 { | |
149 | |
150 for(x=0;x< tv->mcol;++x) | |
151 { | |
152 | |
153 | |
154 if(x== 0 || ptr->screen[y][x].attributes != ptr->screen[y][x-1].attributes) | |
155 { | |
156 int css=0; | |
157 fprintf(ptr->out,"<span"); | |
158 while(css<32) | |
159 { | |
160 //if(y>1) fprintf(stderr,"css=%d pow2=%d vs %d\n",css,(1 << (css)),ptr->screen[y][x].attributes); | |
161 if(( (ptr->screen[y][x].attributes) & (1 << (css)))!=0) | |
162 { | |
163 | |
164 fprintf(ptr->out," class='tviewc%s%d'", | |
165 (( (ptr->screen[y][x].attributes) & (1 << (UNDERLINE_FLAG)) )!=0?"u":""), | |
166 css); | |
167 break; | |
168 } | |
169 ++css; | |
170 } | |
171 | |
172 | |
173 fputs(">",ptr->out); | |
174 } | |
175 | |
176 int ch=ptr->screen[y][x].ch; | |
177 switch(ch) | |
178 { | |
179 case '<': fputs("<",ptr->out);break; | |
180 case '>': fputs(">",ptr->out);break; | |
181 case '&': fputs("&",ptr->out);break; | |
182 default: fputc(ch,ptr->out); break; | |
183 } | |
184 | |
185 | |
186 if(x+1 == tv->mcol || ptr->screen[y][x].attributes!=ptr->screen[y][x+1].attributes) | |
187 { | |
188 fputs("</span>",ptr->out); | |
189 } | |
190 } | |
191 if(y+1 < ptr->row_count) fputs("<br/>",ptr->out); | |
192 } | |
193 fputs("</pre></div></body></html>",ptr->out); | |
194 return 0; | |
195 } | |
196 | |
197 | |
198 #define ANSI_COLOR_RED "\x1b[31m" | |
199 #define ANSI_COLOR_GREEN "\x1b[32m" | |
200 #define ANSI_COLOR_YELLOW "\x1b[33m" | |
201 #define ANSI_COLOR_BLUE "\x1b[34m" | |
202 #define ANSI_COLOR_MAGENTA "\x1b[35m" | |
203 #define ANSI_COLOR_CYAN "\x1b[36m" | |
204 #define ANSI_COLOR_BLACK "\x1b[0m" | |
205 #define ANSI_COLOR_RESET ANSI_COLOR_BLACK | |
206 | |
207 #define ANSI_UNDERLINE_SET "\033[4m" | |
208 #define ANSI_UNDERLINE_UNSET "\033[0m" | |
209 | |
210 static int text_drawaln(struct AbstractTview* tv, int tid, int pos) | |
211 { | |
212 int y,x; | |
213 html_tview_t* ptr=FROM_TV(tv); | |
214 html_clear(tv); | |
215 base_draw_aln(tv, tid, pos); | |
216 int is_term= isatty(fileno(ptr->out)); | |
217 | |
218 for(y=0;y< ptr->row_count;++y) | |
219 { | |
220 for(x=0;x< tv->mcol;++x) | |
221 { | |
222 if(is_term) | |
223 { | |
224 int css=0; | |
225 while(css<32) | |
226 { | |
227 if(( (ptr->screen[y][x].attributes) & (1 << (css)))!=0) | |
228 { | |
229 break; | |
230 } | |
231 ++css; | |
232 } | |
233 switch(css) | |
234 { | |
235 //CSS(0, "black"); | |
236 case 1: fputs(ANSI_COLOR_BLUE,ptr->out); break; | |
237 case 2: fputs(ANSI_COLOR_GREEN,ptr->out); break; | |
238 case 3: fputs(ANSI_COLOR_YELLOW,ptr->out); break; | |
239 //CSS(4, "black"); | |
240 case 5: fputs(ANSI_COLOR_GREEN,ptr->out); break; | |
241 case 6: fputs(ANSI_COLOR_CYAN,ptr->out); break; | |
242 case 7: fputs(ANSI_COLOR_YELLOW,ptr->out); break; | |
243 case 8: fputs(ANSI_COLOR_RED,ptr->out); break; | |
244 case 9: fputs(ANSI_COLOR_BLUE,ptr->out); break; | |
245 default:break; | |
246 } | |
247 if(( (ptr->screen[y][x].attributes) & (1 << (UNDERLINE_FLAG)))!=0) | |
248 { | |
249 fputs(ANSI_UNDERLINE_SET,ptr->out); | |
250 } | |
251 | |
252 } | |
253 | |
254 | |
255 int ch=ptr->screen[y][x].ch; | |
256 | |
257 fputc(ch,ptr->out); | |
258 if(is_term) | |
259 { | |
260 fputs(ANSI_COLOR_RESET,ptr->out); | |
261 if(( (ptr->screen[y][x].attributes) & (1 << (UNDERLINE_FLAG)))!=0) | |
262 { | |
263 fputs(ANSI_UNDERLINE_UNSET,ptr->out); | |
264 } | |
265 } | |
266 } | |
267 fputc('\n',ptr->out); | |
268 } | |
269 return 0; | |
270 } | |
271 | |
272 | |
273 static int html_loop(tview_t* tv) | |
274 { | |
275 //tv->my_drawaln(tv, tv->curr_tid, tv->left_pos); | |
276 return 0; | |
277 } | |
278 | |
279 static int html_underline(tview_t* tv) | |
280 { | |
281 return (1 << UNDERLINE_FLAG); | |
282 } | |
283 | |
284 /* | |
285 static void init_pair(html_tview_t *tv,int id_ge_1, const char* pen, const char* paper) | |
286 { | |
287 | |
288 } | |
289 */ | |
290 | |
291 tview_t* html_tv_init(const char *fn, const char *fn_fa, const char *samples) | |
292 { | |
293 char* colstr=getenv("COLUMNS"); | |
294 html_tview_t *tv = (html_tview_t*)calloc(1, sizeof(html_tview_t)); | |
295 tview_t* base=(tview_t*)tv; | |
296 if(tv==0) | |
297 { | |
298 fprintf(stderr,"Calloc failed\n"); | |
299 return 0; | |
300 } | |
301 tv->row_count=0; | |
302 tv->screen=NULL; | |
303 tv->out=stdout; | |
304 tv->attributes=0; | |
305 base_tv_init(base,fn,fn_fa,samples); | |
306 /* initialize callbacks */ | |
307 #define SET_CALLBACK(fun) base->my_##fun=html_##fun; | |
308 SET_CALLBACK(destroy); | |
309 SET_CALLBACK(mvprintw); | |
310 SET_CALLBACK(mvaddch); | |
311 SET_CALLBACK(attron); | |
312 SET_CALLBACK(attroff); | |
313 SET_CALLBACK(clear); | |
314 SET_CALLBACK(colorpair); | |
315 SET_CALLBACK(drawaln); | |
316 SET_CALLBACK(loop); | |
317 SET_CALLBACK(underline); | |
318 #undef SET_CALLBACK | |
319 | |
320 | |
321 if(colstr!=0) | |
322 { | |
323 base->mcol=atoi(colstr); | |
324 if(base->mcol<10) base->mcol=80; | |
325 } | |
326 base->mrow=99999; | |
327 | |
328 /* | |
329 init_pair(tv,1, "blue", "white"); | |
330 init_pair(tv,2, "green", "white"); | |
331 init_pair(tv,3, "yellow", "white"); | |
332 init_pair(tv,4, "white", "white"); | |
333 init_pair(tv,5, "green", "white"); | |
334 init_pair(tv,6, "cyan", "white"); | |
335 init_pair(tv,7, "yellow", "white"); | |
336 init_pair(tv,8, "red", "white"); | |
337 init_pair(tv,9, "blue", "white"); | |
338 */ | |
339 return base; | |
340 } | |
341 | |
342 | |
343 tview_t* text_tv_init(const char *fn, const char *fn_fa, const char *samples) | |
344 { | |
345 tview_t* tv=html_tv_init(fn,fn_fa,samples); | |
346 tv->my_drawaln=text_drawaln; | |
347 return tv; | |
348 } | |
349 |