Added support for pandoc's fenced code blocks
authorMartin Alt <mnalt@gmx.de>
Tue, 27 Oct 2015 21:11:12 +0000 (22:11 +0100)
committerMartin Alt <mnalt@gmx.de>
Tue, 27 Oct 2015 21:11:12 +0000 (22:11 +0100)
Code blocks can be started using three or more ~ characters and stopped
by the same or higher number of ~s. Additionally, pandoc attributes can
be specified. They are ignored in mdp, but may be used to get much nicer
output when converting the md file to html or pdf using pandoc.

For Example:
~~~~ {.bash .linenumbers}
ls $HOME # this is a comment
~~~~

See http://pandoc.org/demo/example9/pandocs-markdown.html

include/markdown.h
include/parser.h
sample.md
src/parser.c
src/viewer.c

index b338154..3a85947 100644 (file)
@@ -47,6 +47,7 @@ enum line_bitmask {
     IS_H2_ATX,
     IS_QUOTE,
     IS_CODE,
+    IS_TILDE_CODE,
     IS_HR,
     IS_UNORDERED_LIST_1,
     IS_UNORDERED_LIST_2,
index 4140389..7a18377 100644 (file)
@@ -57,5 +57,6 @@ int next_nonblank(cstring_t *text, int i);
 int prev_blank(cstring_t *text, int i);
 int next_blank(cstring_t *text, int i);
 int next_word(cstring_t *text, int i);
+int next_nontilde(cstring_t *text, int i);
 
 #endif // !defined( PARSER_H )
index 3e3d62e..8f6b053 100644 (file)
--- a/sample.md
+++ b/sample.md
@@ -102,6 +102,32 @@ becomes
 
 -> # Supported markdown formatting <-
 
+You can also use [pandoc](http://pandoc.org/demo/example9/pandocs-markdown.html)'s fenced code block extension.
+Use at least three ~ chars to open and at least as many or 
+more ~ for closing.
+
+~~~~~
+~~~
+int main(int argc, char \*argv[]) {
+    printf("%s\\n", "Hello world!");
+}
+~~~
+~~~~~~~
+
+becomes
+
+~~~
+int main(int argc, char \*argv[]) {
+    printf("%s\\n", "Hello world!");
+}
+~~~
+
+Pandoc attributes (like ".numberlines" etc.) will be ignored
+
+-------------------------------------------------
+
+-> # Supported markdown formatting <-
+
 Quotes are auto-detected by preceding *>*.
 
 Multiple *>* are interpreted as nested quotes.
index 362a908..d81a2cb 100644 (file)
@@ -89,6 +89,9 @@ deck_t *markdown_load(FILE *input) {
                 slide = next_slide(slide);
                 sc++;
 
+            } else if(CHECK_BIT(bits, IS_TILDE_CODE) && CHECK_BIT(bits, IS_EMPTY)) {
+               // remove tilde code markers
+               (text->reset)(text);
             } else {
 
                 // if slide ! has line
@@ -319,6 +322,7 @@ int markdown_analyse(cstring_t *text, int prev) {
     // the program remembers their value on every function calls
     static int unordered_list_level = 0;
     static int unordered_list_level_offset[] = {-1, -1, -1, -1};
+    static int num_tilde_characters = 0;
 
     int i = 0;      // increment
     int bits = 0;   // markdown bits
@@ -340,6 +344,27 @@ int markdown_analyse(cstring_t *text, int prev) {
     // count leading spaces
     offset = next_nonblank(text, 0);
 
+    // IS_TILDE_CODE
+    if (wcsncmp(text->value, L"~~~", 3) == 0) {
+           int tildes_in_line = next_nontilde(text, 0);
+           if (tildes_in_line >= num_tilde_characters) {
+                   if (num_tilde_characters > 0) {
+                           num_tilde_characters = 0;
+                   } else {
+                           num_tilde_characters = tildes_in_line;
+                   }
+                   SET_BIT(bits, IS_EMPTY);
+                   SET_BIT(bits, IS_TILDE_CODE);
+                   return bits;
+           }
+    }
+
+    if (num_tilde_characters > 0) {
+           SET_BIT(bits, IS_CODE);
+           SET_BIT(bits, IS_TILDE_CODE);
+           return bits;
+    }
+
     // IS_STOP
     if((offset < CODE_INDENT || !CHECK_BIT(prev, IS_CODE)) &&
        (!wcsncmp(&text->value[offset], L"<br>", 4) ||
@@ -622,6 +647,7 @@ int next_nonblank(cstring_t *text, int i) {
     return i;
 }
 
+
 int prev_blank(cstring_t *text, int i) {
     while ((i > 0) && !iswspace((text->value)[i]))
         i--;
@@ -639,3 +665,11 @@ int next_blank(cstring_t *text, int i) {
 int next_word(cstring_t *text, int i) {
     return next_nonblank(text, next_blank(text, i));
 }
+
+int next_nontilde(cstring_t *text, int i) {
+    while ((i < text->size) && text->value[i] == L'~')
+        i++;
+
+    return i;
+}
+
index 13874d8..0021e79 100644 (file)
@@ -577,8 +577,10 @@ void add_line(WINDOW *window, int y, int x, line_t *line, int max_cols, int colo
     // IS_CODE
     if(CHECK_BIT(line->bits, IS_CODE)) {
 
-        // set static offset for code
-        offset = CODE_INDENT;
+       if (!CHECK_BIT(line->bits, IS_TILDE_CODE)) {
+               // set static offset for code
+               offset = CODE_INDENT;
+       }
 
         // reverse color for code blocks
         if(colors)