X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=viewer.c;h=82d8d9928dc7722fc9b048587f02b8c724702b15;hb=338e24c049fcf14fd1d2e8ac3807177f049eec2e;hp=2d64b4eb43d4c81c89fdec22af4950363fe43045;hpb=31eb213da6e050f77ccaf59626484a03f1b95af6;p=smdp.git diff --git a/viewer.c b/viewer.c index 2d64b4e..82d8d99 100644 --- a/viewer.c +++ b/viewer.c @@ -1,9 +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, @@ -52,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); @@ -125,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; @@ -252,18 +279,9 @@ void add_line(WINDOW *window, int y, int x, line_t *line, int max_cols) { y, x, "%s", &line->text->text[offset]); - // IS_QUOTE - } else if(CHECK_BIT(line->bits, IS_QUOTE)) { - //TODO replace greater sign with color block - - //FIXME remove dummy print code - mvwprintw(window, - y, x, - "%s", &line->text->text[offset]); - } else { - // IF_H1 || IF_H2 + // IS_H1 || IS_H2 if(CHECK_BIT(line->bits, IS_H1) || CHECK_BIT(line->bits, IS_H2)) { // set headline color @@ -288,15 +306,25 @@ void add_line(WINDOW *window, int y, int x, line_t *line, int max_cols) { // move the cursor in position wmove(window, y, x); + // IS_QUOTE + if(CHECK_BIT(line->bits, IS_QUOTE)) { + // print a reverse color block + wattron(window, A_REVERSE); + wprintw(window, "%s", " "); + wattroff(window, A_REVERSE); + wprintw(window, "%s", " "); + offset += 2; + } + // for each char in line - c = line->text->text; + 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(is_attron(stack, *c)) { + if((stack->top)(stack, *c)) { switch(*c) { // print escaped backslash @@ -317,7 +345,7 @@ void add_line(WINDOW *window, int y, int x, line_t *line, int max_cols) { (stack->pop)(stack); // treat special as regular char - } else if(is_attron(stack, '\\')) { + } else if((stack->top)(stack, '\\')) { wprintw(window, "%c", *c); // remove backslash from stack @@ -349,7 +377,22 @@ void add_line(WINDOW *window, int y, int x, line_t *line, int max_cols) { c++; } - //TODO pop stack until empty + // 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; + } + } } } @@ -366,16 +409,6 @@ void add_line(WINDOW *window, int y, int x, line_t *line, int max_cols) { (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) { int i; // increment if(colors) {