X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=viewer.c;h=15b5e6a84f8dd2f321f248e725c0b1a8c4808654;hb=5e77cd8cc9723829ce6fcd09e4a52207d6112d70;hp=a6cf53c7209d6c5f9f04c1502124aeacbf576079;hpb=66f6ce722f0d763efbf66ca6f8a958bc75ab854e;p=smdp.git diff --git a/viewer.c b/viewer.c index a6cf53c..15b5e6a 100644 --- a/viewer.c +++ b/viewer.c @@ -1,8 +1,32 @@ +/* + * Functions necessary to display a deck of slides in different color modes + * using ncurses. Only white, red, and blue are supported, as they can be + * faded in 256 color mode. + * Copyright (C) 2014 Michael Goehler + * + * This file is part of mpd. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include // setlocale #include #include +#include // strchr #include -#include "include/parser.h" #include "include/viewer.h" static short white_ramp[24] = { 16, 232, 233, 234, 235, 236, @@ -51,6 +75,9 @@ int ncurses_display(deck_t *deck, int notrans, int nofade) { slide = slide->next; } + // set locale to display UTF-8 correctly in ncurses + setlocale(LC_CTYPE, ""); + // replace stdin with current tty if markdown input was piped freopen("/dev/tty", "rw", stdin); @@ -124,6 +151,7 @@ int ncurses_display(deck_t *deck, int notrans, int nofade) { } // setup footer + //TODO display slide number in footer if(bar_bottom) { line = deck->header->next; offset = next_blank(line->text, 0) + 1; @@ -160,7 +188,7 @@ int ncurses_display(deck_t *deck, int notrans, int nofade) { // print lines while(line) { - add_line(content, l, (COLS - max_cols) / 2, line); + add_line(content, l, (COLS - max_cols) / 2, line, max_cols); line = line->next; l++; } @@ -227,15 +255,163 @@ int ncurses_display(deck_t *deck, int notrans, int nofade) { return(0); } -void add_line(WINDOW *window, int y, int x, line_t *line) { +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 offset = next_nonblank(line->text, 0); - // print line to window - mvwprintw(window, - y, x, - "%s", &line->text->text[offset]); + + // IS_CODE + if(CHECK_BIT(line->bits, IS_CODE)) { + + // set static offset for code + offset = CODE_INDENT; + + // reverse color for code blocks + wattron(window, A_REVERSE); + + // print whole lines + mvwprintw(window, + y, x, + "%s", &line->text->text[offset]); + + } else { + + // IS_H1 || IS_H2 + if(CHECK_BIT(line->bits, IS_H1) || CHECK_BIT(line->bits, IS_H2)) { + + // set headline color + wattron(window, COLOR_PAIR(CP_BLUE)); + + // enable underline for H1 + if(CHECK_BIT(line->bits, IS_H1)) + wattron(window, A_UNDERLINE); + + // skip hashes + while(line->text->text[offset] == '#') + offset = next_word(line->text, offset); + + // print whole lines + mvwprintw(window, + y, x, + "%s", &line->text->text[offset]); + + wattroff(window, A_UNDERLINE); + + } else { + // move the cursor in position + wmove(window, y, x); + + // IS_QUOTE + if(CHECK_BIT(line->bits, IS_QUOTE)) { + while(line->text->text[offset] == '>') { + // print a reverse color block + wattron(window, A_REVERSE); + wprintw(window, "%s", " "); + wattroff(window, A_REVERSE); + wprintw(window, "%s", " "); + // find next quote or break + offset++; + if(line->text->text[offset] == ' ') + offset = next_word(line->text, offset); + } + } + + // 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 '*': + 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++; + } + + // pop stack until empty to prevent formated trailing spaces + while(!(stack->empty)(stack)) { + switch((stack->pop)(stack)) { + case '\\': + wprintw(window, "%c", '\\'); + break; + // disable highlight + case '*': + wattron(window, COLOR_PAIR(CP_WHITE)); + break; + // disable underline + case '_': + wattroff(window, A_UNDERLINE); + break; + } + } + } + } + + // fill rest off line with spaces + for(i = getcurx(window) - x; i < max_cols; i++) + wprintw(window, "%s", " "); + + // reset to default color + wattron(window, COLOR_PAIR(CP_WHITE)); + wattroff(window, A_UNDERLINE); + wattroff(window, A_REVERSE); } + + (stack->delete)(stack); } void fade_out(WINDOW *window, int trans, int colors) {