]> uap-core.de Git - note.git/commitdiff
fix markdown code block generation main
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Mon, 16 Mar 2026 18:42:42 +0000 (19:42 +0100)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Mon, 16 Mar 2026 18:42:42 +0000 (19:42 +0100)
application/gtk-text.c
application/tests/test-editor.c
application/tests/test-editor.h
application/tests/testmain.c

index 003822c3a2fd1889a9ab9f4dba3000b0502ac7e0..21e9d171d82ca4d7930932e49a41917cf8248c39 100644 (file)
@@ -55,6 +55,7 @@
 #define g_object_get_data g_object_get_data
 
 static CxMap *markdown_tags;
+static MDTag *code_block_tag;
 
 static void editor_set_cursor_cb(
         GtkTextBuffer *buffer,
@@ -135,6 +136,8 @@ void editor_global_init() {
     cxMapPut(markdown_tags, EDITOR_STYLE_EMPHASIS, &((MDTag){"*", "*"}));
     cxMapPut(markdown_tags, EDITOR_STYLE_UNDERLINE, &((MDTag){"_", "_"}));
     cxMapPut(markdown_tags, EDITOR_STYLE_CODE, &((MDTag){"`", "`"}));
+    
+    code_block_tag = cxMapGet(markdown_tags, EDITOR_STYLE_CODE_BLOCK);
 }
 
 void editor_init_textview(UiObject *obj, UIWIDGET textview) {
@@ -1240,6 +1243,7 @@ cxmutstr editor_get_markdown(UiText *text, const CxAllocator *a) {
         }
         
         gchar *text = gtk_text_buffer_get_text(buffer, &start, &iter, TRUE);
+        gboolean is_code_block = false;
         
         GSList *tags = gtk_text_iter_get_tags(&start);
         CxMap *begin_tags = tags2map(tags);
@@ -1258,6 +1262,10 @@ cxmutstr editor_get_markdown(UiText *text, const CxAllocator *a) {
         cx_foreach(CxMapEntry *, entry, i) {
             const char *name = entry->key->data;
             MDTag *t = cxMapGet(markdown_tags, *entry->key);
+            if(t == code_block_tag) {
+                is_code_block = true;
+                break;
+            }
             if(t && t->begin) {
                 cxBufferPutString(&out, t->begin);
             }
@@ -1274,7 +1282,19 @@ cxmutstr editor_get_markdown(UiText *text, const CxAllocator *a) {
         
         // add content
         printf("range: {%s}\n\n", text);
-        cxBufferPutString(&out, text);
+        if(!is_code_block) {
+            cxBufferPutString(&out, text);
+        } else {
+            int code_block_start = 0;
+            size_t text_len = strlen(text);
+            for(int i=0;i<text_len;i++) {
+                if(text[i] == '\n') {
+                    cxBufferPutString(&out, "    ");
+                    cxBufferPutString(&out, cx_strn(text + code_block_start, i - code_block_start + 1));
+                    code_block_start = i + 1;
+                }
+            }
+        }
         
         // get all tags that ended here
         tags = gtk_text_iter_get_tags(&iter);
index e84f31e46c224e3cc6d40eaac318a502c3cb0887..096d292ec5e955dca18189a46852155ced4d529a 100644 (file)
@@ -501,6 +501,19 @@ CX_TEST(test_editor_load_markdown_code1) {
     }
 }
 
+CX_TEST(test_editor_load_markdown_code2) {
+    CX_TEST_DO {
+        CX_TEST_CALL_SUBROUTINE(test_editor_markdown_load_get, cx_mutstr(
+                "Test Multiline code\n\n"
+                "    #include <stdio.h>\n"
+                "    \n"
+                "    int main() {"
+                "    }\n"
+                "\nend\n"));
+    }
+}
+
+
 CX_TEST(test_editor_load_markdown_link) {
     CX_TEST_DO {
         CX_TEST_CALL_SUBROUTINE(test_editor_markdown_load_get, cx_mutstr("Link [link1](https://example.com/link1)\n[link2][1]\n\n[1]: https://example.com/link2"));
index c983f9ab459b76e27572ea8e4bedfae4d77e5c62..e042b85538254ea0be31cbb1547344b34dcd7c43 100644 (file)
@@ -48,6 +48,7 @@ CX_TEST(test_editor_load_markdown_list1);
 CX_TEST(test_editor_load_markdown_list2);
 CX_TEST(test_editor_load_markdown_span1);
 CX_TEST(test_editor_load_markdown_code1);
+CX_TEST(test_editor_load_markdown_code2);
 CX_TEST(test_editor_load_markdown_link);
 
 #ifdef __cplusplus
index 8cacb25a9f56bd564205faf712137210b4dced8e..748909e80604fa419760326c4688f80e1a98137c 100644 (file)
@@ -89,6 +89,7 @@ int main(int argc, char **argv) {
     cx_test_register(suite, test_editor_load_markdown_list2);
     cx_test_register(suite, test_editor_load_markdown_span1);
     cx_test_register(suite, test_editor_load_markdown_code1);
+    cx_test_register(suite, test_editor_load_markdown_code2);
     cx_test_register(suite, test_editor_load_markdown_link);
     
     cx_test_register(suite, test_text_search_strcasestr);