Merge pull request #40 from FreeBirdLjj/issue#16
authorMichael Göhler <somebody.here@gmx.de>
Tue, 30 Sep 2014 10:55:38 +0000 (12:55 +0200)
committerMichael Göhler <somebody.here@gmx.de>
Tue, 30 Sep 2014 10:55:38 +0000 (12:55 +0200)
Add sublime Text 3 project settings.
Replace ((void*)0) with NULL.
Add inline_display().
Update for inline markdown support of unordered list.
Support for inline markdown in unordered list.
Use for loop to iterate.
Remove unused block.

1  2 
Makefile
include/viewer.h
mdp.sublime-project
src/viewer.c

diff --combined Makefile
+++ b/Makefile
  # along with this program. If not, see <http://www.gnu.org/licenses/>.
  #
  
 -CURSES   = ncursesw
 -ifeq (Windows_NT, $(OS))
 -OSTYPE  := $(shell uname -o)
 -ifneq (Cygwin, $(OSTYPE))
 -CURSES  := pdcurses
 -endif
 +UNAME_S := $(shell uname -s 2>/dev/null || echo not)
 +
 +SOURCES = $(wildcard src/*.c)
 +OBJECTS = $(SOURCES:.c=.o)
 +TARGET  = mdp
 +DESTDIR = /usr/bin
 +
 +CURSES  = ncursesw
 +LDFLAGS = -s
 +
 +ifeq (Windows_NT,$(OS))
 +      ifeq (,$(findstring CYGWIN,$(UNAME_S)))
 +              CURSES := pdcurses
 +      endif
  endif
  
 -LDFLAGS  = -s
 -LDLIBS   = -l$(CURSES)
 -SOURCES  = $(wildcard src/*.c)
 -OBJECTS  = $(SOURCES:.c=.o)
 -TARGET   = mdp
 -DESTDIR  = /usr/bin
 +ifeq ($(UNAME_S),Darwin)
 +      CURSES := ncurses
 +      LDFLAGS :=
 +endif
  
  ifeq ($(DEBUG),1)
 -LDFLAGS :=
 +      LDFLAGS :=
  endif
  
 +LDLIBS   = -l$(CURSES)
 +
  all: $(TARGET)
  
  $(TARGET): src
@@@ -65,4 -57,3 +65,3 @@@ uninstall
        $(RM) $(PREFIX)$(DESTDIR)/$(TARGET)
  
  .PHONY: all clean install src uninstall
diff --combined include/viewer.h
   *
   */
  
 -#if WIN32 == 1
 -# include <curses.h>
 +#if defined( WIN32 )
 +#include <curses.h>
  #else
 -# include <ncurses.h>
 +#include <ncurses.h>
  #endif
  
  #include "parser.h"
@@@ -51,6 -51,7 +51,7 @@@
  
  int ncurses_display(deck_t *deck, int notrans, int nofade, int invert);
  void add_line(WINDOW *window, int y, int x, line_t *line, int max_cols, int colors);
+ void inline_display(WINDOW *window, const char *c, const int colors);
  void fade_out(WINDOW *window, int trans, int colors, int invert);
  void fade_in(WINDOW *window, int trans, int colors, int invert);
  int int_length (int val);
diff --combined mdp.sublime-project
index 0000000,17711a0..e20eca6
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,15 +1,16 @@@
 -      "settings":
 -      {
 -              "tab_size": 4,
 -              "translate_tabs_to_spaces": true,
 -              "use_tab_stops": false,
 -      }
 -      ,"folders":
 -      [
 -      {
 -              "follow_symlinks": true,
 -              "path": "."
 -      }
 -      ]
 -}
+ {
++    "settings":
++    {
++        "tab_size": 4,
++        "translate_tabs_to_spaces": true,
++        "use_tab_stops": false
++    }
++    ,"folders":
++    [
++    {
++        "follow_symlinks": true,
++        "path": ".",
++        "file_exclude_patterns": [".*", "mdp", "mdp.sublime-project"]
++    }
++    ]
++}
diff --combined src/viewer.c
@@@ -297,7 -297,6 +297,7 @@@ int ncurses_display(deck_t *deck, int n
              // show previous slide
              case KEY_UP:
              case KEY_LEFT:
 +            case KEY_PPAGE:
              case 8:   // BACKSPACE (ascii)
              case 127: // BACKSPACE (xterm)
              case 263: // BACKSPACE (getty)
              // show next slide
              case KEY_DOWN:
              case KEY_RIGHT:
 +            case KEY_NPAGE:
              case '\n': // ENTER
              case ' ':  // SPACE
              case 'j':
  }
  
  void add_line(WINDOW *window, int y, int x, line_t *line, int max_cols, int colors) {
-     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
-         // IS_UNORDERED_LIST_3
-         if(CHECK_BIT(line->bits, IS_UNORDERED_LIST_3)) {
-             offset = next_nonblank(line->text, 0);
-             char format_s[15];
-             strcpy(&format_s[0], CHECK_BIT(line->bits, IS_UNORDERED_LIST_1)? " |  " : "    ");
-             strcpy(&format_s[4], CHECK_BIT(line->bits, IS_UNORDERED_LIST_2)? " |  " : "    ");
-             strcpy(&format_s[8], line->next && CHECK_BIT(line->next->bits, IS_UNORDERED_LIST_3)? " +- %s" : " `- %s");
-             mvwprintw(window,
-                       y, x,
-                       format_s,
-                       &line->text->text[offset + 2]);
-         // IS_UNORDERED_LIST_2
-         } else if(CHECK_BIT(line->bits, IS_UNORDERED_LIST_2)) {
-             offset = next_nonblank(line->text, 0);
-             char format_s[11];
-             strcpy(&format_s[0], CHECK_BIT(line->bits, IS_UNORDERED_LIST_1)? " |  " : "    ");
-             strcpy(&format_s[4], line->next && CHECK_BIT(line->next->bits, IS_UNORDERED_LIST_2)? " +- %s" : " `- %s");
-             mvwprintw(window,
-                       y, x,
-                       format_s,
-                       &line->text->text[offset + 2]);
-         // IS_UNORDERED_LIST_1
-         } else if(CHECK_BIT(line->bits, IS_UNORDERED_LIST_1)) {
-             offset = next_nonblank(line->text, 0);
-             char format_s[7];
-             strcpy(&format_s[0], line->next && CHECK_BIT(line->next->bits, IS_UNORDERED_LIST_1)? " +- %s" : " `- %s");
-             mvwprintw(window,
-                       y, x,
-                       format_s,
-                       &line->text->text[offset + 2]);
-         // IS_CODE
-         } else if(CHECK_BIT(line->bits, IS_CODE)) {
-             // set static offset for code
-             offset = CODE_INDENT;
-             // reverse color for code blocks
-             if(colors)
-                 wattron(window, COLOR_PAIR(CP_BLACK));
-             // print whole lines
-             mvwprintw(window,
-                       y, x,
-                       "%s", &line->text->text[offset]);
+     if(!line->text->text) {
+         return;
+     }
  
-         } else {
+     int i; // increment
+     int offset = 0; // text offset
+     // move the cursor in position
+     wmove(window, y, x);
+     // 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)? "+- " : "`- ");
+         wprintw(window,
+                 "%s", prompt);
+         inline_display(window, &line->text->text[offset + 2], 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)? "+- " : "`- ");
+         wprintw(window,
+                 "%s", prompt);
+         inline_display(window, &line->text->text[offset + 2], 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)? "+- " : "`- ");
+         wprintw(window,
+                 "%s", prompt);
+         inline_display(window, &line->text->text[offset + 2], colors);
+     // IS_CODE
+     } else if(CHECK_BIT(line->bits, IS_CODE)) {
+         // set static offset for code
+         offset = CODE_INDENT;
+         // reverse color for code blocks
+         if(colors)
+             wattron(window, COLOR_PAIR(CP_BLACK));
  
-             // IS_H1 || IS_H2
-             if(CHECK_BIT(line->bits, IS_H1) || CHECK_BIT(line->bits, IS_H2)) {
+         // print whole lines
+         wprintw(window,
+                 "%s", &line->text->text[offset]);
  
-                 // set headline color
-                 if(colors)
-                     wattron(window, COLOR_PAIR(CP_BLUE));
+     // IS_H1 || IS_H2
+     } else if(CHECK_BIT(line->bits, IS_H1) || CHECK_BIT(line->bits, IS_H2)) {
  
-                 // enable underline for H1
-                 if(CHECK_BIT(line->bits, IS_H1))
-                     wattron(window, A_UNDERLINE);
+         // set headline color
+         if(colors)
+             wattron(window, COLOR_PAIR(CP_BLUE));
  
-                 // skip hashes
-                 while(line->text->text[offset] == '#')
-                     offset = next_word(line->text, offset);
+         // enable underline for H1
+         if(CHECK_BIT(line->bits, IS_H1))
+             wattron(window, A_UNDERLINE);
  
-                 // print whole lines
-                 mvwprintw(window,
-                       y, x,
-                       "%s", &line->text->text[offset]);
+         // skip hashes
+         while(line->text->text[offset] == '#')
+             offset = next_word(line->text, offset);
  
-                 wattroff(window, A_UNDERLINE);
+         // print whole lines
+         wprintw(window,
+                 "%s", &line->text->text[offset]);
  
-             } 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
-                         if(colors) {
-                             wattron(window, COLOR_PAIR(CP_BLACK));
-                             wprintw(window, "%s", " ");
-                             wattron(window, COLOR_PAIR(CP_WHITE));
-                             wprintw(window, "%s", " ");
-                         } else {
-                             wprintw(window, "%s", ">");
-                         }
+         wattroff(window, A_UNDERLINE);
  
-                         // find next quote or break
-                         offset++;
-                         if(line->text->text[offset] == ' ')
-                             offset = next_word(line->text, offset);
-                     }
+     } else {
+         // IS_QUOTE
+         if(CHECK_BIT(line->bits, IS_QUOTE)) {
+             while(line->text->text[offset] == '>') {
+                 // print a reverse color block
+                 if(colors) {
+                     wattron(window, COLOR_PAIR(CP_BLACK));
+                     wprintw(window, "%s", " ");
+                     wattron(window, COLOR_PAIR(CP_WHITE));
+                     wprintw(window, "%s", " ");
+                 } else {
+                     wprintw(window, "%s", ">");
                  }
  
-                 // 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 '*':
-                                     if(colors)
-                                         wattron(window, COLOR_PAIR(CP_WHITE));
-                                     break;
-                                 // disable underline
-                                 case '_':
-                                     wattroff(window, A_UNDERLINE);
-                                     break;
-                                 // disable inline code
-                                 case '`':
-                                     if(colors)
-                                         wattron(window, COLOR_PAIR(CP_WHITE));
-                                     break;
-                             }
+                 // find next quote or break
+                 offset++;
+                 if(line->text->text[offset] == ' ')
+                     offset = next_word(line->text, offset);
+             }
+         }
  
-                             // remove top special char from stack
-                             (stack->pop)(stack);
+         inline_display(window, &line->text->text[offset], colors);
+     }
  
-                         // treat special as regular char
-                         } else if((stack->top)(stack, '\\')) {
-                             wprintw(window, "%c", *c);
+     // fill rest off line with spaces
+     for(i = getcurx(window) - x; i < max_cols; i++)
+         wprintw(window, "%s", " ");
  
-                             // remove backslash from stack
-                             (stack->pop)(stack);
+     // reset to default color
+     if(colors)
+         wattron(window, COLOR_PAIR(CP_WHITE));
+     wattroff(window, A_UNDERLINE);
+ }
  
-                         // opening special char
-                         } else {
-                             switch(*c) {
-                                 // enable highlight
-                                 case '*':
-                                     if(colors)
-                                         wattron(window, COLOR_PAIR(CP_RED));
-                                     break;
-                                 // enable underline
-                                 case '_':
-                                     wattron(window, A_UNDERLINE);
-                                     break;
-                                 // enable inline code
-                                 case '`':
-                                     if(colors)
-                                         wattron(window, COLOR_PAIR(CP_BLACK));
-                                     break;
-                                 // do nothing for backslashes
-                             }
+ void inline_display(WINDOW *window, const char *c, const int colors) {
+     const static char *special = "\\*_`"; // list of interpreted chars
+     cstack_t *stack = cstack_init();
  
-                             // push special char to stack
-                             (stack->push)(stack, *c);
-                         }
+     // for each char in line
+     for(; *c; c++) {
  
-                     } else {
-                         // remove backslash from stack
-                         if((stack->top)(stack, '\\'))
-                             (stack->pop)(stack);
+         // if char is in special char list
+         if(strchr(special, *c)) {
  
-                         // print regular char
-                         wprintw(window, "%c", *c);
-                     }
+             // closing special char (or second backslash)
+             if((stack->top)(stack, *c)) {
  
-                     c++;
+                 switch(*c) {
+                     // print escaped backslash
+                     case '\\':
+                         wprintw(window, "%c", *c);
+                         break;
+                     // disable highlight
+                     case '*':
+                         if(colors)
+                             wattron(window, COLOR_PAIR(CP_WHITE));
+                         break;
+                     // disable underline
+                     case '_':
+                         wattroff(window, A_UNDERLINE);
+                         break;
+                     // disable inline code
+                     case '`':
+                         if(colors)
+                             wattron(window, COLOR_PAIR(CP_WHITE));
+                         break;
                  }
  
-                 // pop stack until empty to prevent formated trailing spaces
-                 while(!(stack->empty)(stack)) {
-                     switch((stack->pop)(stack)) {
-                         // disable highlight
-                         case '*':
-                             if(colors)
-                                 wattron(window, COLOR_PAIR(CP_WHITE));
-                             break;
-                         // disable underline
-                         case '_':
-                             wattroff(window, A_UNDERLINE);
-                             break;
-                         // disable inline code
-                         case '`':
-                             if(colors)
-                                 wattron(window, COLOR_PAIR(CP_WHITE));
-                             break;
-                         // do nothing for backslashes
-                     }
+                 // 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 '*':
+                         if(colors)
+                             wattron(window, COLOR_PAIR(CP_RED));
+                         break;
+                     // enable underline
+                     case '_':
+                         wattron(window, A_UNDERLINE);
+                         break;
+                     // enable inline code
+                     case '`':
+                         if(colors)
+                             wattron(window, COLOR_PAIR(CP_BLACK));
+                         break;
+                     // do nothing for backslashes
                  }
+                 // push special char to stack
+                 (stack->push)(stack, *c);
              }
-         }
  
-         // fill rest off line with spaces
-         for(i = getcurx(window) - x; i < max_cols; i++)
-             wprintw(window, "%s", " ");
+         } else {
+             // remove backslash from stack
+             if((stack->top)(stack, '\\'))
+                 (stack->pop)(stack);
  
-         // reset to default color
-         if(colors)
-             wattron(window, COLOR_PAIR(CP_WHITE));
-         wattroff(window, A_UNDERLINE);
+             // print regular char
+             wprintw(window, "%c", *c);
+         }
+     }
+     // pop stack until empty to prevent formated trailing spaces
+     while(!(stack->empty)(stack)) {
+         switch((stack->pop)(stack)) {
+             // disable highlight
+             case '*':
+                 if(colors)
+                     wattron(window, COLOR_PAIR(CP_WHITE));
+                 break;
+             // disable underline
+             case '_':
+                 wattroff(window, A_UNDERLINE);
+                 break;
+             // disable inline code
+             case '`':
+                 if(colors)
+                     wattron(window, COLOR_PAIR(CP_WHITE));
+                 break;
+             // do nothing for backslashes
+         }
      }
  
      (stack->delete)(stack);