From: FreeBirdLjj Date: Mon, 29 Sep 2014 05:32:56 +0000 (+0800) Subject: Add inline_display(). X-Git-Url: https://git.danieliu.xyz/?p=smdp.git;a=commitdiff_plain;h=32c41cac57abc7887875b82c4b1511939ee4b5f1 Add inline_display(). --- diff --git a/include/viewer.h b/include/viewer.h index b790085..e498dfb 100644 --- a/include/viewer.h +++ b/include/viewer.h @@ -51,6 +51,7 @@ int ncurses_display(deck_t *deck, int notrans, int nofade, int invert); void add_line(WINDOW *window, int y, int x, line_t *line, int max_cols, int colors); +void inline_display(WINDOW *window, const char *c, const int colors); void fade_out(WINDOW *window, int trans, int colors, int invert); void fade_in(WINDOW *window, int trans, int colors, int invert); int int_length (int val); diff --git a/src/viewer.c b/src/viewer.c index 162477f..079cd3d 100644 --- a/src/viewer.c +++ b/src/viewer.c @@ -397,11 +397,8 @@ int ncurses_display(deck_t *deck, int notrans, int nofade, int invert) { } void add_line(WINDOW *window, int y, int x, line_t *line, int max_cols, int colors) { - int i = 0; // increment - char *c; // char pointer for iteration - char *special = "\\*_`"; // list of interpreted chars - cstack_t *stack = cstack_init(); - + int i; // increment + if(line->text->text) { int offset = 0; // text offset @@ -501,114 +498,120 @@ void add_line(WINDOW *window, int y, int x, line_t *line, int max_cols, int colo } } - // for each char in line - c = &line->text->text[offset]; - 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 '*': - if(colors) - wattron(window, COLOR_PAIR(CP_WHITE)); - break; - // disable underline - case '_': - wattroff(window, A_UNDERLINE); - break; - // disable inline code - case '`': - if(colors) - wattron(window, COLOR_PAIR(CP_WHITE)); - break; - } + inline_display(window, &line->text->text[offset], colors); + } + } - // remove top special char from stack - (stack->pop)(stack); + // fill rest off line with spaces + for(i = getcurx(window) - x; i < max_cols; i++) + wprintw(window, "%s", " "); - // treat special as regular char - } else if((stack->top)(stack, '\\')) { - wprintw(window, "%c", *c); + // reset to default color + if(colors) + wattron(window, COLOR_PAIR(CP_WHITE)); + wattroff(window, A_UNDERLINE); + } +} - // remove backslash from stack - (stack->pop)(stack); +void inline_display(WINDOW *window, const char *c, const int colors) { + const static char *special = "\\*_`"; // list of interpreted chars + cstack_t *stack = cstack_init(); - // opening special char - } else { - switch(*c) { - // enable highlight - case '*': - if(colors) - wattron(window, COLOR_PAIR(CP_RED)); - break; - // enable underline - case '_': - wattron(window, A_UNDERLINE); - break; - // enable inline code - case '`': - if(colors) - wattron(window, COLOR_PAIR(CP_BLACK)); - break; - // do nothing for backslashes - } + // for each char in line + while(*c) { - // push special char to stack - (stack->push)(stack, *c); - } + // if char is in special char list + if(strchr(special, *c)) { - } else { - // remove backslash from stack - if((stack->top)(stack, '\\')) - (stack->pop)(stack); + // closing special char (or second backslash) + if((stack->top)(stack, *c)) { - // print regular char + switch(*c) { + // print escaped backslash + case '\\': wprintw(window, "%c", *c); - } - - c++; + break; + // disable highlight + case '*': + if(colors) + wattron(window, COLOR_PAIR(CP_WHITE)); + break; + // disable underline + case '_': + wattroff(window, A_UNDERLINE); + break; + // disable inline code + case '`': + if(colors) + wattron(window, COLOR_PAIR(CP_WHITE)); + break; } - // pop stack until empty to prevent formated trailing spaces - while(!(stack->empty)(stack)) { - switch((stack->pop)(stack)) { - // disable highlight - case '*': - if(colors) - wattron(window, COLOR_PAIR(CP_WHITE)); - break; - // disable underline - case '_': - wattroff(window, A_UNDERLINE); - break; - // disable inline code - case '`': - if(colors) - wattron(window, COLOR_PAIR(CP_WHITE)); - break; - // do nothing for backslashes - } + // 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 '*': + if(colors) + wattron(window, COLOR_PAIR(CP_RED)); + break; + // enable underline + case '_': + wattron(window, A_UNDERLINE); + break; + // enable inline code + case '`': + if(colors) + wattron(window, COLOR_PAIR(CP_BLACK)); + break; + // do nothing for backslashes } + + // push special char to stack + (stack->push)(stack, *c); } + + } else { + // remove backslash from stack + if((stack->top)(stack, '\\')) + (stack->pop)(stack); + + // print regular char + wprintw(window, "%c", *c); } - // fill rest off line with spaces - for(i = getcurx(window) - x; i < max_cols; i++) - wprintw(window, "%s", " "); + c++; + } - // reset to default color - if(colors) - wattron(window, COLOR_PAIR(CP_WHITE)); - wattroff(window, A_UNDERLINE); + // pop stack until empty to prevent formated trailing spaces + while(!(stack->empty)(stack)) { + switch((stack->pop)(stack)) { + // disable highlight + case '*': + if(colors) + wattron(window, COLOR_PAIR(CP_WHITE)); + break; + // disable underline + case '_': + wattroff(window, A_UNDERLINE); + break; + // disable inline code + case '`': + if(colors) + wattron(window, COLOR_PAIR(CP_WHITE)); + break; + // do nothing for backslashes + } } (stack->delete)(stack);