From 31eb213da6e050f77ccaf59626484a03f1b95af6 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Michael=20G=C3=B6hler?= Date: Fri, 12 Sep 2014 00:42:37 +0200 Subject: [PATCH] added cstack to viewer + implemented inline highlighting --- include/viewer.h | 3 ++ sample.md | 4 +-- viewer.c | 86 +++++++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 86 insertions(+), 7 deletions(-) diff --git a/include/viewer.h b/include/viewer.h index 52a2296..c4f4175 100644 --- a/include/viewer.h +++ b/include/viewer.h @@ -3,6 +3,8 @@ #include +#include "cstack.h" + #define CP_WHITE 1 // 255 #define CP_BLUE 2 // 123 #define CP_RED 3 // 213 @@ -12,6 +14,7 @@ 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 is_attron(cstack_t *stack, char c); void fade_out(WINDOW *window, int trans, int colors); void fade_in(WINDOW *window, int trans, int colors); diff --git a/sample.md b/sample.md index 2f83e53..afb8066 100644 --- a/sample.md +++ b/sample.md @@ -16,7 +16,7 @@ And two backslashes: \\\\ # Page 2 -This is another test page. +This is _another_ test page. * * * @@ -27,7 +27,7 @@ This is another test page. printf("%s\n", "hello"); } -Now with different indentation. +Now with *different* indentation. function expand_tab { printf("%s\n", "hello"); diff --git a/viewer.c b/viewer.c index 0f5d928..2d64b4e 100644 --- a/viewer.c +++ b/viewer.c @@ -1,5 +1,6 @@ #include #include +#include // strchr #include #include "include/parser.h" @@ -229,6 +230,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 +285,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(is_attron(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(is_attron(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 +362,18 @@ 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); +} + +int is_attron(cstack_t *stack, char c) { + // test if char is on top of stack + if(stack->head >= 0) { + if((stack->top)(stack) == c) { + return 1; + } + } + return 0; } void fade_out(WINDOW *window, int trans, int colors) { -- 2.20.1