From e5d1c5a176607f8e4b2ee8a918734e8588d6a4b4 Mon Sep 17 00:00:00 2001 From: Willian Padovani Germano Date: Thu, 9 Oct 2008 22:28:44 +0000 Subject: [PATCH] == Python == 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 | 4 ++++ release/scripts/help_browser.py | 12 +++++++++-- source/blender/python/BPY_menus.c | 33 ++++++++++++++++++++----------- 3 files changed, 35 insertions(+), 14 deletions(-) diff --git a/release/scripts/config.py b/release/scripts/config.py index 4251bad8654..cbf8e272b91 100644 --- a/release/scripts/config.py +++ b/release/scripts/config.py @@ -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 diff --git a/release/scripts/help_browser.py b/release/scripts/help_browser.py index 696dfd3ca2b..b27e266f368 100644 --- a/release/scripts/help_browser.py +++ b/release/scripts/help_browser.py @@ -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 diff --git a/source/blender/python/BPY_menus.c b/source/blender/python/BPY_menus.c index 69b50e5c47a..9e7abc44657 100644 --- a/source/blender/python/BPY_menus.c +++ b/source/blender/python/BPY_menus.c @@ -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