X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=viewer.c;h=4e91b71390c6cec4b109c61b5dee5bb008beb68e;hb=b416f18295f7edcb5474396a6b26a59fd5ddb1f5;hp=0f5d92896ec14c047fc8701b3cf70f01fe4b4726;hpb=f92a7609f7b4a6c72a892b16d371528213eca283;p=smdp.git diff --git a/viewer.c b/viewer.c index 0f5d928..4e91b71 100644 --- a/viewer.c +++ b/viewer.c @@ -1,8 +1,8 @@ #include #include +#include // strchr #include -#include "include/parser.h" #include "include/viewer.h" static short white_ramp[24] = { 16, 232, 233, 234, 235, 236, @@ -229,6 +229,9 @@ int ncurses_display(deck_t *deck, int notrans, int nofade) { void add_line(WINDOW *window, int y, int x, line_t *line, int max_cols) { int i = 0; // increment + char *c; // char pointer for iteration + char *special = "\\*_"; // list of interpreted chars + cstack_t *stack = cstack_init(); if(line->text->text) { int offset = 0; // text offset @@ -281,11 +284,71 @@ void add_line(WINDOW *window, int y, int x, line_t *line, int max_cols) { wattroff(window, A_UNDERLINE); } else { - //TODO for each char in line - //TODO if *|_ highlight (maybe use a stack here?) - mvwprintw(window, - y, x, - "%s", &line->text->text[offset]); + // move the cursor in position + wmove(window, y, x); + + // for each char in line + c = line->text->text; + while(*c) { + + // if char is in special char list + if(strchr(special, *c)) { + + // closing special char (or second backslash) + if((stack->top)(stack, *c)) { + + switch(*c) { + // print escaped backslash + case '\\': + wprintw(window, "%c", *c); + break; + // disable highlight + case '*': + wattron(window, COLOR_PAIR(CP_WHITE)); + break; + // disable underline + case '_': + wattroff(window, A_UNDERLINE); + break; + } + + // remove top special char from stack + (stack->pop)(stack); + + // treat special as regular char + } else if((stack->top)(stack, '\\')) { + wprintw(window, "%c", *c); + + // remove backslash from stack + (stack->pop)(stack); + + // opening special char + } else { + switch(*c) { + // enable highlight + case '*': + wattron(window, COLOR_PAIR(CP_RED)); + break; + // enable underline + case '_': + wattron(window, A_UNDERLINE); + break; + // do nothing for backslashes + } + + // push special char to stack + (stack->push)(stack, *c); + } + + } else { + // print regular char + wprintw(window, "%c", *c); + } + + c++; + } + + //TODO pop stack until empty } } @@ -298,6 +361,8 @@ void add_line(WINDOW *window, int y, int x, line_t *line, int max_cols) { wattroff(window, A_UNDERLINE); wattroff(window, A_REVERSE); } + + (stack->delete)(stack); } void fade_out(WINDOW *window, int trans, int colors) {