== Python ==
authorWillian Padovani Germano <wpgermano@gmail.com>
Thu, 9 Oct 2008 22:28:44 +0000 (22:28 +0000)
committerWillian Padovani Germano <wpgermano@gmail.com>
Thu, 9 Oct 2008 22:28:44 +0000 (22:28 +0000)
Bug: [#17734] Loading a python script's help dosn't work

reported by Rian Tut (thanks).

Actual problem: scripts with spaces in their filenames were not supported by the code that registers scripts in menus and runs them. Added support w/o breaking eventual, rare scripts that parse the Bpymenus file. They will still need an update to support filenames with spaces, like done here for these scripts: Scripts Help Browser and Scripts Config Editor.

PS: tested on Linux. Please test on other platforms: just make sure scripts still appear in menus (the File->Export, for example), even after re-registering them (Scripts window -> Scripts Menu -> Update Menus) and that the Scripts Help Browser still works.

release/scripts/config.py
release/scripts/help_browser.py
source/blender/python/BPY_menus.c

index 4251bad86544e9ea9918d3a0321f107c9a305081..cbf8e272b9151194f1642396518a7df607361416 100644 (file)
@@ -246,6 +246,10 @@ information about how to fix this.
                        fields = fields[2].split()
                        if len(fields) > 1:
                                fname = fields[1].split(sep)[-1]
+                               i = 1
+                               while not fname.endswith('.py'):
+                                       i += 1
+                                       fname = "%s %s" % (fname, fields[i])
                                ALL_SCRIPTS[fname] = (menuname, group_len - 1)
        return True
 
index 696dfd3ca2b48f5395224c4e1e7d93ce76fbb630..b27e266f368aa5c9ccd0d7e5614360fc83d2f179 100644 (file)
@@ -448,11 +448,19 @@ def parse_help_info(script):
 
 def parse_script_line(l):
 
+       tip = 'No tooltip'
        try:
                pieces = l.split("'")
                name = pieces[1].replace('...','')
-               version, fname, userdir = pieces[2].strip().split()
-               tip = pieces[3]
+               data = pieces[2].strip().split()
+               version = data[0]
+               userdir = data[-1]
+               fname = data[1]
+               i = 1
+               while not fname.endswith('.py'):
+                       i += 1
+                       fname = '%s %s' % (fname, data[i])
+               if len(pieces) > 3: tip = pieces[3]
        except:
                return None
 
index 69b50e5c47abb944dfbaf231ffd62fef929798c2..9e7abc446575a870327c8fb681ec65cd2d595cc7 100644 (file)
@@ -479,7 +479,7 @@ static int bpymenu_CreateFromFile( void )
        char line[255], w1[255], w2[255], tooltip[255], *tip;
        char upythondir[FILE_MAX];
        char *homedir = NULL;
-       int parsing, version, is_userdir;
+       int parsing, version, w2_len, is_userdir;
        short group;
        BPyMenu *pymenu = NULL;
 
@@ -554,17 +554,32 @@ will use 'Misc'.\n", w1 );
                        else if( line[0] == '\n' )
                                continue;
                        else if( line[0] == '\'' ) {    /* menu entry */
-                               parsing =
+/*                             parsing =
                                        sscanf( line,
                                                "'%[^']' %d %s %d '%[^']'\n",
                                                w1, &version, w2, &is_userdir,
                                                tooltip );
-
-                               if( parsing <= 0 ) {    /* invalid line, get rid of it */
+*/
+                               /* previously filenames with spaces were not supported;
+                                * this adds support for that w/o breaking the existing
+                                * few, exotic scripts that parse the Bpymenus file */
+                               parsing = sscanf( line,
+                                               "'%[^']' %d %[^'\n] '%[^']'\n",
+                                               w1, &version, w2, tooltip );
+                               if( parsing <= 0 ) { /* invalid line, get rid of it */
                                        fgets( line, 255, fp );
-                               } else if( parsing == 5 )
+                               } else if( parsing == 4 )
                                        tip = tooltip;  /* has tooltip */
 
+                               w2_len = strlen(w2);
+                               if( w2[w2_len-1] == ' ') {
+                                       w2[w2_len-1] = '\0';
+                                       w2_len -= 1;
+                               }
+                               if( w2[w2_len-1] == '1') is_userdir = 1;
+                               else is_userdir = 0;
+                               w2[w2_len-2] = '\0';
+
                                pymenu = bpymenu_AddEntry( group,
                                                           ( short ) version,
                                                           w1, w2, is_userdir,
@@ -693,13 +708,7 @@ void BPyMenu_PrintAllEntries( void )
 }
 
 /* bpymenu_ParseFile:
- * recursively scans folders looking for scripts to register.
- *
- * This function scans the scripts directory looking for .py files with the
- * right header and menu info, using that to fill the bpymenu structs.
- * is_userdir defines if the script is in the default scripts dir or the
- * user defined one (U.pythondir: is_userdir == 1).
- * Speed is important.
+ * parse a given .py file looking for a proper header.
  *
  * The first line of the script must be '#!BPY'.
  * The header registration lines must appear between the first pair of