Enlightenment CVS committal

Author  : dj2
Project : e17
Module  : libs/ewl

Dir     : e17/libs/ewl/src/bin


Modified Files:
        main.c 


Log Message:
- rewrite the tutorial parsing code

===================================================================
RCS file: /cvs/e/e17/libs/ewl/src/bin/main.c,v
retrieving revision 1.44
retrieving revision 1.45
diff -u -3 -r1.44 -r1.45
--- main.c      4 Jan 2007 05:09:39 -0000       1.44
+++ main.c      6 Jan 2007 13:22:25 -0000       1.45
@@ -7,6 +7,7 @@
 #include <limits.h>
 #include <dlfcn.h>
 #include <fcntl.h>
+#include <ctype.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <Ecore.h>
@@ -564,6 +565,7 @@
        ewl_container_child_append(EWL_CONTAINER(o2), o);
        ewl_widget_name_set(o, "source_text");
        ewl_text_selectable_set(EWL_TEXT(o), TRUE);
+       ewl_text_wrap_set(EWL_TEXT(o), EWL_TEXT_WRAP_WORD);
        ewl_widget_show(o);
 
        o2 = ewl_scrollpane_new();
@@ -575,6 +577,7 @@
        ewl_container_child_append(EWL_CONTAINER(o2), o);
        ewl_widget_name_set(o, "tutorial_text");
        ewl_text_selectable_set(EWL_TEXT(o), TRUE);
+       ewl_text_wrap_set(EWL_TEXT(o), EWL_TEXT_WRAP_WORD);
        ewl_widget_show(o);
 
        o = ewl_statusbar_new();
@@ -690,11 +693,11 @@
        if (!start)
        {
                ewl_text_text_set(EWL_TEXT(txt), str);
-               ewl_text_text_set(EWL_TEXT(tutorial),  "");
+               ewl_text_clear(EWL_TEXT(tutorial));
                return;
        }
 
-       end = strstr(str, "*/");
+       end = strstr(start, "*/");
        end++;
 
        while (*(start - 1) == '\n') start --;
@@ -706,123 +709,223 @@
        ewl_text_text_append(EWL_TEXT(txt), end + 1);
 
        *start = tmp;
-       tmp = *(end + 1);
-       *(end + 1) = '\0';
+       tmp = *end;
+       *end = '\0';
 
-       ewl_text_text_set(EWL_TEXT(tutorial), "");
+       ewl_text_clear(EWL_TEXT(tutorial)); 
        tutorial_parse(EWL_TEXT(tutorial), start);
 
-       *(end + 1) = tmp;
+       *end = tmp;
 }
 
 static void
 tutorial_parse(Ewl_Text *tutorial, char *str)
 {
-       char *ptr, *ptr2;
-
-       ptr = str;
-
-       /* move past the comment stuff to the start of the tutorial */
-       while ((*ptr == '/') || (*ptr == '*') || (*ptr == '\n')
-                       || (*ptr == ' '))
-               ptr ++;
-
-       /* while we've still got data */
-       while (ptr != NULL)
-       {
-               ptr2 = ptr;
-               while ((*ptr2 != '*') && (*ptr2 != '@') && (*ptr2 != '\0'))
-                       ptr2 ++;
-
-               if (ptr2 == NULL)
-               {
-                       ewl_text_text_append(tutorial, ptr);
-                       break;
-               }
-               else if (*ptr2 == '*')
-               {
-                       char *prev, tmp;
-
-                       prev = ptr2;
-                       while ((*ptr2 == '*') || (*ptr2 == ' ')) ptr2 --;
-
-                       if (*ptr2 != '\n')
-                               ptr2 = prev;
-
-                       tmp = *(++ptr2);
-                       *ptr2 = '\0';
-
-                       if (ptr2 > ptr)
-                               ewl_text_text_append(tutorial, ptr);
-
-                       *ptr2 = tmp;
-                       ptr2 = prev;
-
-                       /* we're done if we have a / */
-                       if (*(ptr2 + 1) == '/')
-                               break;
-
-                       while ((*ptr2 == '*') || (*ptr2 == ' ')) ptr2 ++;
-               }
-               else if (*ptr2 == '@')
-               {
-                       char *tmp;
-
-                       *ptr2 = '\0';
-                       ewl_text_text_append(tutorial, ptr);
-
-                       ptr2++;
-                       if ((!strncasecmp(ptr2, "addtogroup", 10))
-                                       || (!strncasecmp(ptr2, "section", 7)))
-                       {
-                               int size = 14;
-                               char t;
-
-                               if (!strncasecmp(ptr2, "addtogroup", 10))
-                                       size = 18;
-
-                               ptr2 = strstr(ptr2, "\n");
-                               tmp = ptr2;
-
-                               while (*tmp != ' ') tmp --;
-                               tmp ++;
-                               t = *ptr2;
-                               *ptr2 = '\0';
-
-                               ewl_text_font_size_set(tutorial, size);
-                               ewl_text_text_append(tutorial, tmp);
-                               ewl_text_text_append(tutorial, "\n");
-                               ewl_text_font_size_set(tutorial, 10);
-                       
-                               *ptr2 = t;
-                               ptr2 ++;
-                       }
-                       else if (!strncasecmp(ptr2, "code", 4))
-                       {
-                               ptr2 += strlen("code\n");
-                               ewl_text_color_set(tutorial, 
-                                               128, 128, 128, 255);
-                       }
-                       else if (!strncasecmp(ptr2, "endcode", 7))
-                       {
-                               ptr2 += strlen("endcode\n");
-                               ewl_text_color_set(tutorial,
-                                               0, 0, 0, 255);
-                       }
-                       else if (!strncasecmp(ptr2, "note", 4))
-                       {
-                               ewl_text_font_size_set(tutorial, 12);
-                               ewl_text_text_append(tutorial, "Note");
-                               ewl_text_text_append(tutorial, "\n");
-                               ewl_text_font_size_set(tutorial, 10);
-
-                               ptr2 += strlen("note");
-                       }
-                       else
-                               printf("Didn't match (%s)\n", ptr2);
-               }
-               ptr = ptr2;
-       }
+    char *start, *end;
+    int handled_newline = 0;
+    int in_codeblock = 0; 
+    int not_double = 0;
+    
+    start = str;
+    
+    /* skip the comment block start and any blank space after */
+    while ((*start == '/') || (*start == '*') || (isspace(*start))) start++;
+    end = start;
+    
+    while (start && (*start != '\0'))
+    {
+        int did_newline = 0;
+        
+        /* we strip out newlines so the text will wrap nicely */
+        if (*end == '\n')
+        {
+            /* we just handled a \n and got a second one so this is a new
+             * paragraph so actually insert the two \n's */
+            if (handled_newline)
+            {
+                if (in_codeblock || not_double)
+                    ewl_text_text_append(tutorial, "\n");
+                else
+                    ewl_text_text_append(tutorial, "\n\n");
+            }
+
+            /* append the text before and skip the newline */
+            else
+            {
+                char tmp;
+
+                tmp = *(end + 1);
+                *(end + 1) = '\0';
+
+                if (!in_codeblock)
+                    *end = ' ';
+
+                ewl_text_text_append(tutorial, start);
+
+                *(end + 1) = tmp;
+            }
+            start = ++end;
+            did_newline = 1;
+            not_double = 0;
+        }
+
+        /* The * is only special after a newline character */
+        else if ((*end == '*' || *end == ' ') && handled_newline)
+        {
+            if (*end == ' ') end++;
+            while (*end == '*') end++;
+
+            /* we only want ot skip "* " if in a code block */
+            if (in_codeblock)
+            {
+                if (*end == ' ') end ++;
+            }
+            /* otherwise skip the * and all spaces */
+            else
+            {
+                while ((*end == '*') || (*end == ' ') || (*end == '\t'))
+                    end++;
+            }
+
+            if (*end == '\n')
+            /* don't let the *'s at the begining of lines effect the \n
+             * handling */
+            did_newline = handled_newline;
+
+            start = end;
+        }
+        else if (*end == '@')
+        {
+            /* stick on everything before the @ symbol. If we don't have a
+             * keyword here we'll just end up sticking the next chunk onto
+             * this node so shouldn't be a big deal */
+            *end = '\0';
+
+            ewl_text_text_append(tutorial, start);
+            *end = '@';
+            start = end;
+
+            if ((!strncasecmp(end, "@addtogroup ", 12))
+                    || (!strncasecmp(end, "@section ", 9)))
+            {
+                char tmp, key;
+                int size = 14, prev_size = 0;
+
+                key = *(end + 1);
+                end += 9;
+
+                /* we increment end so that we can skip over the keyword and
+                 * the space after it */
+                if (key == 'a')
+                {
+                    size = 22;
+                    end += 3;
+                }
+
+                while (*end == ' ') end ++;
+                start = end;
+
+                /* skip to the end of the line */
+                end = strchr(end, '\n');
+
+                /* if this is the section header we need to skip the section 
name */
+                if (key == 's')
+                {
+                    while (!isspace(*start)) start ++;
+                    while (*start == ' ') start ++;
+                }
+
+                not_double = 1;
+
+                tmp = *(end + 1);
+                *(end + 1) = '\0';
+
+                prev_size = ewl_text_font_size_get(tutorial,
+                                ewl_text_cursor_position_get(tutorial));
+                ewl_text_font_size_set(tutorial, size);
+                ewl_text_text_append(tutorial, start);
+                ewl_text_font_size_set(tutorial, prev_size);
+
+                *(end + 1) = tmp;
+                start = ++end;
+
+                did_newline = 1;
+            }
+            else if (!strncasecmp(end, "@code", 5))
+            {
+                in_codeblock = 1;
+                end += 5;
+                while (*end == ' ') end ++;
+
+                /* if there is nothing after the @code we want to skip the
+                 * \n or we'll end up with too much space before the block */
+                if (*end == '\n')
+                {
+                    end ++;
+                    did_newline = 1;
+                }
+
+                ewl_text_color_set(tutorial, 32, 71, 109, 255);
+                start = end;
+            }
+            else if (!strncasecmp(end, "@endcode", 8))
+            {
+                *end = '\0';
+
+                ewl_text_text_append(tutorial, start);
+                ewl_text_color_set(tutorial, 0, 0, 0, 255);
+                in_codeblock = 0;
+
+                end += 8;
+                while (*end == ' ') end ++;
+
+                /* if there is nothing after the @code we want to skip the
+                 * \n or we'll end up with too much space before the block */
+                if (*end == '\n')
+                {
+                    end ++;
+                    did_newline = 1;
+                }
+                not_double = 1;
+                start = end;
+            }
+#if 0
+            else if (!strncasecmp(end, "@note", 5))
+            {
+
+            }
+            /* make next word bold */
+            else if (!strncasecmp(end, "@b ", 3))
+            {
+            }
+            /* supost to be typewriter font, make next word italic */
+            else if (!strncasecmp(end, "@c ", 3))
+            {
+            }
+#endif
+            /* if we don't know what it is just write it into the text */
+            else
+                end ++;
+        }
+        else if (*end == '<')
+        {
+            if (0)
+            {
+            }
+            /* skip it if we don't know what it is */
+            else
+                end ++;
+        }
+        else
+            end ++;
+
+        handled_newline = did_newline;
+        if (!end || (*end == '\0'))
+        {
+            ewl_text_text_append(tutorial, start);
+            start = end;
+        }
+    }
 }
 
 static void



-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to