#include <cx/buffer.h>
 #include <cx/hash_map.h>
 
+#include <ctype.h>
+#include <string.h>
+
 // workaround for netbeans bug
 #define g_object_set g_object_set
 #define g_object_get_property g_object_get_property
     cxMapPut(markdown_tags, EDITOR_STYLE_HEADING4, &((MDTag){"#### ", NULL}));
     cxMapPut(markdown_tags, EDITOR_STYLE_HEADING5, &((MDTag){"##### ", NULL}));
     cxMapPut(markdown_tags, EDITOR_STYLE_HEADING6, &((MDTag){"###### ", NULL}));
+    cxMapPut(markdown_tags, EDITOR_STYLE_CODE_BLOCK, &((MDTag){"    ", NULL}));
     cxMapPut(markdown_tags, EDITOR_STYLE_STRONG, &((MDTag){"**", "**"}));
     cxMapPut(markdown_tags, EDITOR_STYLE_EMPHASIS, &((MDTag){"*", "*"}));
     cxMapPut(markdown_tags, EDITOR_STYLE_CODE, &((MDTag){"`", "`"}));
     GtkTextBuffer *buffer = text->data1;
     NoteEditor *editor = g_object_get_data(text->obj, "editor");
     
+    int begin_line, end_line;
+    
     // currently changing the selection's paragraph style is not supported
     if(gtk_text_buffer_get_has_selection(buffer)) {
         update_cursor_paragraph_style(editor, buffer);
     }
     GtkTextIter pos;
     gtk_text_buffer_get_iter_at_mark(buffer, &pos, cursor);
-    GtkTextIter begin = pos;
-    GtkTextIter end = pos;
-    gtk_text_iter_set_line_offset(&begin, 0);
-    gtk_text_iter_forward_to_line_end(&end);
     
-    remove_paragraph_styles(buffer, &begin, &end);
-    gtk_text_buffer_apply_tag_by_name(buffer, style, &begin, &end);
+    begin_line = gtk_text_iter_get_line(&pos);
+    end_line = begin_line;
+    
+    // check if the next line is still part of this paragraph
+    // paragraphs are separated by blank lines
+    GtkTextIter next_line = pos;
+    while(gtk_text_iter_forward_line(&next_line)) {
+        GtkTextIter begin = next_line;
+        GtkTextIter end = next_line;
+        gtk_text_iter_set_line_offset(&begin, 0);
+        gtk_text_iter_forward_to_line_end(&end);
+        
+        char *line_str = gtk_text_buffer_get_slice(buffer, &begin, &end, TRUE);
+        char *str = line_str;
+        int blank = TRUE;
+        while(*str) {
+            char c = *str;
+            if(!isspace(*str)) {
+                blank = FALSE;
+                break;
+            }
+            
+            str++;
+        }
+        g_free(line_str);
+        if(blank) {
+            break;
+        }
+        
+        end_line++;
+    }
+    
+    
+    
+    for(int i=begin_line;i<=end_line;i++) {
+        GtkTextIter begin = pos;
+        GtkTextIter end = pos;
+        gtk_text_iter_set_line_offset(&begin, 0);
+        gtk_text_iter_forward_to_line_end(&end);
+
+        remove_paragraph_styles(buffer, &begin, &end);
+        gtk_text_buffer_apply_tag_by_name(buffer, style, &begin, &end);
+        
+        gtk_text_iter_forward_line(&pos);
+    }
 }