various improvements
[smdp.git] / src / viewer.c
index 4031948..13ff6f6 100644 (file)
@@ -113,11 +113,11 @@ int ncurses_display(deck_t *deck, int notrans, int nofade, int invert) {
                         fprintf(stderr, "Error: Terminal width (%i columns) too small. Need at least %i columns.\n", COLS, i);
                         fprintf(stderr, "You may need to shorten some lines by inserting line breaks.\n");
 
-                        return(1);
+                        return 1;
                     }
 
                     // set max_cols
-                    max_cols = (i > max_cols) ? i : max_cols;
+                    max_cols = MAX(i, max_cols);
 
                     // iterate to next line
                     offset = prev_blank(line->text, offset + COLS);
@@ -125,16 +125,16 @@ int ncurses_display(deck_t *deck, int notrans, int nofade, int invert) {
                     lc++;
                 }
                 // set max_cols one last time
-                max_cols = (i > max_cols) ? i : max_cols;
+                max_cols = MAX(i, max_cols);
             } else {
                 // set max_cols
-                max_cols = (line->length > max_cols) ? line->length : max_cols;
+                max_cols = MAX(line->length, max_cols);
             }
             lc++;
             line = line->next;
         }
 
-        max_lines = (lc > max_lines) ? lc : max_lines;
+        max_lines = MAX(lc, max_lines);
 
         slide = slide->next;
     }
@@ -146,10 +146,10 @@ int ncurses_display(deck_t *deck, int notrans, int nofade, int invert) {
         endwin();
 
         // print error
-        fprintf(stderr, "Error: Terminal heigth (%i lines) too small. Need at least %i lines.\n", LINES, max_lines + bar_top + bar_bottom);
+        fprintf(stderr, "Error: Terminal height (%i lines) too small. Need at least %i lines.\n", LINES, max_lines + bar_top + bar_bottom);
         fprintf(stderr, "You may need to add additional horizontal rules ('***') to split your file in shorter slides.\n");
 
-        return(1);
+        return 1;
     }
 
     // disable cursor
@@ -194,7 +194,8 @@ int ncurses_display(deck_t *deck, int notrans, int nofade, int invert) {
             init_pair(CP_YELLOW, 208, trans);
 
             // enable color fading
-            if(!nofade) fade = 1;
+            if(!nofade)
+                fade = true;
 
         // 8 color mode
         } else {
@@ -273,8 +274,8 @@ int ncurses_display(deck_t *deck, int notrans, int nofade, int invert) {
         // print lines
         while(line) {
             add_line(content, l, (COLS - max_cols) / 2, line, max_cols, colors);
+            l += (line->length / COLS) + 1;
             line = line->next;
-            l++;
         }
 
         // make content visible
@@ -285,7 +286,8 @@ int ncurses_display(deck_t *deck, int notrans, int nofade, int invert) {
             fade_in(content, trans, colors, invert);
 
         // re-enable fading after any undefined key press
-        if(COLORS == 256 && !nofade) fade = 1;
+        if(COLORS == 256 && !nofade)
+            fade = true;
 
         // wait for user input
         c = getch();
@@ -307,7 +309,7 @@ int ncurses_display(deck_t *deck, int notrans, int nofade, int invert) {
                     slide = slide->prev;
                     sc--;
                 } else {
-                    fade = 0;
+                    fade = false;
                 }
                 break;
 
@@ -323,7 +325,7 @@ int ncurses_display(deck_t *deck, int notrans, int nofade, int invert) {
                     slide = slide->next;
                     sc++;
                 } else {
-                    fade = 0;
+                    fade = false;
                 }
                 break;
 
@@ -355,7 +357,7 @@ int ncurses_display(deck_t *deck, int notrans, int nofade, int invert) {
                     }
                 } else {
                     // disable fading if slide n doesn't exist
-                    fade = 0;
+                    fade = false;
                 }
                 break;
 
@@ -378,13 +380,13 @@ int ncurses_display(deck_t *deck, int notrans, int nofade, int invert) {
             // quit
             case 'q':
                 // do not fade out on exit
-                fade = 0;
+                fade = false;
                 slide = NULL;
                 break;
 
             default:
                 // disable fading on undefined key press
-                fade = 0;
+                fade = false;
                 break;
         }
 
@@ -395,7 +397,7 @@ int ncurses_display(deck_t *deck, int notrans, int nofade, int invert) {
 
     endwin();
 
-    return(0);
+    return 0;
 }
 
 void add_line(WINDOW *window, int y, int x, line_t *line, int max_cols, int colors) {
@@ -413,38 +415,63 @@ void add_line(WINDOW *window, int y, int x, line_t *line, int max_cols, int colo
     // IS_UNORDERED_LIST_3
     if(CHECK_BIT(line->bits, IS_UNORDERED_LIST_3)) {
         offset = next_nonblank(line->text, 0);
-        char prompt[10];
-        strcpy(&prompt[0], CHECK_BIT(line->bits, IS_UNORDERED_LIST_1)? "|  " : "   ");
-        strcpy(&prompt[3], CHECK_BIT(line->bits, IS_UNORDERED_LIST_2)? "|  " : "   ");
-        strcpy(&prompt[6], line->next && CHECK_BIT(line->next->bits, IS_UNORDERED_LIST_3)? "+- " : "`- ");
+        char prompt[13];
+        strcpy(&prompt[0], CHECK_BIT(line->bits, IS_UNORDERED_LIST_1)? " |  " : "    ");
+        strcpy(&prompt[4], CHECK_BIT(line->bits, IS_UNORDERED_LIST_2)? " |  " : "    ");
+
+        if(CHECK_BIT(line->bits, IS_UNORDERED_LIST_EXT)) {
+            strcpy(&prompt[8], line->next && CHECK_BIT(line->next->bits, IS_UNORDERED_LIST_3)? " |  " : "    ");
+        } else {
+            strcpy(&prompt[8], " +- ");
+            offset += 2;
+        }
+
         wprintw(window,
                 "%s", prompt);
 
-        inline_display(window, &line->text->text[offset + 2], colors);
+        if(!CHECK_BIT(line->bits, IS_CODE))
+            inline_display(window, &line->text->text[offset], colors);
 
     // IS_UNORDERED_LIST_2
     } else if(CHECK_BIT(line->bits, IS_UNORDERED_LIST_2)) {
         offset = next_nonblank(line->text, 0);
-        char prompt[7];
-        strcpy(&prompt[0], CHECK_BIT(line->bits, IS_UNORDERED_LIST_1)? "|  " : "   ");
-        strcpy(&prompt[3], line->next && CHECK_BIT(line->next->bits, IS_UNORDERED_LIST_2)? "+- " : "`- ");
+        char prompt[9];
+        strcpy(&prompt[0], CHECK_BIT(line->bits, IS_UNORDERED_LIST_1)? " |  " : "    ");
+
+        if(CHECK_BIT(line->bits, IS_UNORDERED_LIST_EXT)) {
+            strcpy(&prompt[4], line->next && CHECK_BIT(line->next->bits, IS_UNORDERED_LIST_2)? " |  " : "    ");
+        } else {
+            strcpy(&prompt[4], " +- ");
+            offset += 2;
+        }
+
         wprintw(window,
                 "%s", prompt);
 
-        inline_display(window, &line->text->text[offset + 2], colors);
+        if(!CHECK_BIT(line->bits, IS_CODE))
+            inline_display(window, &line->text->text[offset], colors);
 
     // IS_UNORDERED_LIST_1
     } else if(CHECK_BIT(line->bits, IS_UNORDERED_LIST_1)) {
         offset = next_nonblank(line->text, 0);
-        char prompt[4];
-        strcpy(&prompt[0], line->next && CHECK_BIT(line->next->bits, IS_UNORDERED_LIST_1)? "+- " : "`- ");
+        char prompt[5];
+
+        if(CHECK_BIT(line->bits, IS_UNORDERED_LIST_EXT)) {
+            strcpy(&prompt[0], line->next && CHECK_BIT(line->next->bits, IS_UNORDERED_LIST_1)? " |  " : "    ");
+        } else {
+            strcpy(&prompt[0], " +- ");
+            offset += 2;
+        }
+
         wprintw(window,
                 "%s", prompt);
 
-        inline_display(window, &line->text->text[offset + 2], colors);
+        if(!CHECK_BIT(line->bits, IS_CODE))
+            inline_display(window, &line->text->text[offset], colors);
+    }
 
     // IS_CODE
-    } else if(CHECK_BIT(line->bits, IS_CODE)) {
+    if(CHECK_BIT(line->bits, IS_CODE)) {
 
         // set static offset for code
         offset = CODE_INDENT;
@@ -456,29 +483,12 @@ void add_line(WINDOW *window, int y, int x, line_t *line, int max_cols, int colo
         // print whole lines
         wprintw(window,
                 "%s", &line->text->text[offset]);
+    }
 
-    // IS_H1 || IS_H2
-    } else if(CHECK_BIT(line->bits, IS_H1) || CHECK_BIT(line->bits, IS_H2)) {
-
-        // set headline color
-        if(colors)
-            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
-        wprintw(window,
-                "%s", &line->text->text[offset]);
-
-        wattroff(window, A_UNDERLINE);
-
-    } else {
+    if(!CHECK_BIT(line->bits, IS_UNORDERED_LIST_1) &&
+       !CHECK_BIT(line->bits, IS_UNORDERED_LIST_2) &&
+       !CHECK_BIT(line->bits, IS_UNORDERED_LIST_3) &&
+       !CHECK_BIT(line->bits, IS_CODE)) {
 
         // IS_QUOTE
         if(CHECK_BIT(line->bits, IS_QUOTE)) {
@@ -498,9 +508,44 @@ void add_line(WINDOW *window, int y, int x, line_t *line, int max_cols, int colo
                 if(line->text->text[offset] == ' ')
                     offset = next_word(line->text, offset);
             }
-        }
 
-        inline_display(window, &line->text->text[offset], colors);
+            inline_display(window, &line->text->text[offset], colors);
+        } else {
+
+            // IS_CENTER
+            if(CHECK_BIT(line->bits, IS_CENTER)) {
+                if(line->length < max_cols) {
+                    wmove(window, y, x + ((max_cols - line->length) / 2));
+                }
+            }
+
+            // IS_H1 || IS_H2
+            if(CHECK_BIT(line->bits, IS_H1) || CHECK_BIT(line->bits, IS_H2)) {
+
+                // set headline color
+                if(colors)
+                    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
+                wprintw(window,
+                        "%s", &line->text->text[offset]);
+
+                wattroff(window, A_UNDERLINE);
+
+            // no line-wide markdown
+            } else {
+
+                inline_display(window, &line->text->text[offset], colors);
+            }
+        }
     }
 
     // fill rest off line with spaces