remove unnecessary blanks at the output
[smdp.git] / src / viewer.c
index 8d97139..97e62df 100644 (file)
@@ -73,6 +73,7 @@ int ncurses_display(deck_t *deck, int notrans, int nofade, int invert, int reloa
     int max_lines = 0;  // max lines per slide
     int max_cols = 0;   // max columns per line
     int offset;         // text offset
+    int stop = 0;       // passed stop bits per slide
 
     // header line 1 is displayed at the top
     int bar_top = (deck->headers > 0) ? 1 : 0;
@@ -92,11 +93,11 @@ int ncurses_display(deck_t *deck, int notrans, int nofade, int invert, int reloa
 
         while(line && line->text) {
 
-            if (line->text->text)
-                lc += url_count_inline(line->text->text);
+            if (line->text->value)
+                lc += url_count_inline(line->text->value);
 
-            if (line->text->text)
-                line->length -= url_len_inline(line->text->text);
+            if (line->text->value)
+                line->length -= url_len_inline(line->text->value);
 
             if(line->length > COLS) {
                 i = line->length;
@@ -268,7 +269,7 @@ int ncurses_display(deck_t *deck, int notrans, int nofade, int invert, int reloa
             // add text to header
             mvwaddwstr(stdscr,
                        0, (COLS - line->length + offset) / 2,
-                       &line->text->text[offset]);
+                       &line->text->value[offset]);
         }
 
         // setup footer
@@ -278,7 +279,7 @@ int ncurses_display(deck_t *deck, int notrans, int nofade, int invert, int reloa
             // add text to left footer
             mvwaddwstr(stdscr,
                        LINES - 1, 3,
-                       &line->text->text[offset]);
+                       &line->text->value[offset]);
         }
 
         // add slide number to right footer
@@ -291,21 +292,34 @@ int ncurses_display(deck_t *deck, int notrans, int nofade, int invert, int reloa
         wrefresh(stdscr);
 
         line = slide->line;
-        l = 0;
+        l = stop = 0;
 
         // print lines
         while(line) {
             add_line(content, l, (COLS - max_cols) / 2, line, max_cols, colors);
+
+            // raise stop counter if we pass a line having a stop bit
+            if(CHECK_BIT(line->bits, IS_STOP))
+                stop++;
+
             l += (line->length / COLS) + 1;
             line = line->next;
+
+            // only stop here if we didn't stop here recently
+            if(stop > slide->stop)
+                break;
         }
 
-        int i, ymax;
-        getmaxyx( content, ymax, i );
-        for (i = 0; i < url_get_amount(); i++) {
-            mvwprintw(content, ymax - url_get_amount() - 1 + i, 3,
-                      "[%d] ", i);
-            waddwstr(content, url_get_target(i));
+        // print pandoc URL references
+        // only if we already printed all lines of the current slide
+        if(!line) {
+            int i, ymax;
+            getmaxyx( content, ymax, i );
+            for (i = 0; i < url_get_amount(); i++) {
+                mvwprintw(content, ymax - url_get_amount() - 1 + i, 3,
+                          "[%d] ", i);
+                waddwstr(content, url_get_target(i));
+            }
         }
 
         // make content visible
@@ -326,7 +340,7 @@ int ncurses_display(deck_t *deck, int notrans, int nofade, int invert, int reloa
         i = 0;
         switch(c) {
 
-            // show previous slide
+            // show previous slide or stop bit
             case KEY_UP:
             case KEY_LEFT:
             case KEY_PPAGE:
@@ -335,15 +349,23 @@ int ncurses_display(deck_t *deck, int notrans, int nofade, int invert, int reloa
             case 263: // BACKSPACE (getty)
             case 'h':
             case 'k':
-                if(slide->prev) {
-                    slide = slide->prev;
-                    sc--;
+                if(stop > 1 || (stop == 1 && !line)) {
+                    // show current slide again
+                    // but stop one stop bit earlier
+                    slide->stop--;
                 } else {
-                    fade = false;
+                    if(slide->prev) {
+                        // show previous slide
+                        slide = slide->prev;
+                        sc--;
+                    } else {
+                        // do nothing
+                        fade = false;
+                    }
                 }
                 break;
 
-            // show next slide
+            // show next slide or stop bit
             case KEY_DOWN:
             case KEY_RIGHT:
             case KEY_NPAGE:
@@ -351,11 +373,19 @@ int ncurses_display(deck_t *deck, int notrans, int nofade, int invert, int reloa
             case ' ':  // SPACE
             case 'j':
             case 'l':
-                if(slide->next) {
-                    slide = slide->next;
-                    sc++;
+                if(stop && line) {
+                    // show current slide again
+                    // but stop one stop bit later (or at end of slide)
+                    slide->stop++;
                 } else {
-                    fade = false;
+                    if(slide->next) {
+                        // show next slide
+                        slide = slide->next;
+                        sc++;
+                    } else {
+                        // do nothing
+                        fade = false;
+                    }
                 }
                 break;
 
@@ -458,7 +488,7 @@ int ncurses_display(deck_t *deck, int notrans, int nofade, int invert, int reloa
 
 void add_line(WINDOW *window, int y, int x, line_t *line, int max_cols, int colors) {
 
-    if(!line->text->text) {
+    if(!line->text->value) {
         return;
     }
 
@@ -486,7 +516,7 @@ void add_line(WINDOW *window, int y, int x, line_t *line, int max_cols, int colo
                 "%s", prompt);
 
         if(!CHECK_BIT(line->bits, IS_CODE))
-            inline_display(window, &line->text->text[offset], colors);
+            inline_display(window, &line->text->value[offset], colors);
 
     // IS_UNORDERED_LIST_2
     } else if(CHECK_BIT(line->bits, IS_UNORDERED_LIST_2)) {
@@ -505,7 +535,7 @@ void add_line(WINDOW *window, int y, int x, line_t *line, int max_cols, int colo
                 "%s", prompt);
 
         if(!CHECK_BIT(line->bits, IS_CODE))
-            inline_display(window, &line->text->text[offset], colors);
+            inline_display(window, &line->text->value[offset], colors);
 
     // IS_UNORDERED_LIST_1
     } else if(CHECK_BIT(line->bits, IS_UNORDERED_LIST_1)) {
@@ -523,7 +553,7 @@ void add_line(WINDOW *window, int y, int x, line_t *line, int max_cols, int colo
                 "%s", prompt);
 
         if(!CHECK_BIT(line->bits, IS_CODE))
-            inline_display(window, &line->text->text[offset], colors);
+            inline_display(window, &line->text->value[offset], colors);
     }
 
     // IS_CODE
@@ -537,7 +567,7 @@ void add_line(WINDOW *window, int y, int x, line_t *line, int max_cols, int colo
             wattron(window, COLOR_PAIR(CP_BLACK));
 
         // print whole lines
-        waddwstr(window, &line->text->text[offset]);
+        waddwstr(window, &line->text->value[offset]);
     }
 
     if(!CHECK_BIT(line->bits, IS_UNORDERED_LIST_1) &&
@@ -547,7 +577,7 @@ void add_line(WINDOW *window, int y, int x, line_t *line, int max_cols, int colo
 
         // IS_QUOTE
         if(CHECK_BIT(line->bits, IS_QUOTE)) {
-            while(line->text->text[offset] == '>') {
+            while(line->text->value[offset] == '>') {
                 // print a reverse color block
                 if(colors) {
                     wattron(window, COLOR_PAIR(CP_BLACK));
@@ -560,11 +590,11 @@ void add_line(WINDOW *window, int y, int x, line_t *line, int max_cols, int colo
 
                 // find next quote or break
                 offset++;
-                if(line->text->text[offset] == ' ')
+                if(line->text->value[offset] == ' ')
                     offset = next_word(line->text, offset);
             }
 
-            inline_display(window, &line->text->text[offset], colors);
+            inline_display(window, &line->text->value[offset], colors);
         } else {
 
             // IS_CENTER
@@ -586,25 +616,28 @@ void add_line(WINDOW *window, int y, int x, line_t *line, int max_cols, int colo
                     wattron(window, A_UNDERLINE);
 
                 // skip hashes
-                while(line->text->text[offset] == '#')
+                while(line->text->value[offset] == '#')
                     offset = next_word(line->text, offset);
 
                 // print whole lines
-                waddwstr(window, &line->text->text[offset]);
+                waddwstr(window, &line->text->value[offset]);
 
                 wattroff(window, A_UNDERLINE);
 
             // no line-wide markdown
             } else {
 
-                inline_display(window, &line->text->text[offset], colors);
+                inline_display(window, &line->text->value[offset], colors);
             }
         }
     }
 
     // fill rest off line with spaces
-    for(i = getcurx(window) - x; i < max_cols; i++)
-        wprintw(window, "%s", " ");
+    // we only need this if the color is inverted (e.g. code-blocks),
+    // to ensure the background fades too
+    if(CHECK_BIT(line->bits, IS_CODE))
+        for(i = getcurx(window) - x; i < max_cols; i++)
+            wprintw(window, "%s", " ");
 
     // reset to default color
     if(colors)