Added sys.path module search to BPyTextPlugin module and fixed IndentationError when...
authorIan Thompson <quornian@googlemail.com>
Sun, 10 Aug 2008 17:00:25 +0000 (17:00 +0000)
committerIan Thompson <quornian@googlemail.com>
Sun, 10 Aug 2008 17:00:25 +0000 (17:00 +0000)
release/scripts/bpymodules/BPyTextPlugin.py

index 870194880b32d16d80498106f93628aca6eeb5df..94a2b8be38a3c9666910acc4c1dbdf46855192b5 100644 (file)
@@ -1,4 +1,4 @@
-import bpy, sys
+import bpy, sys, os
 import __builtin__, tokenize
 from Blender.sys import time
 from tokenize import generate_tokens, TokenError, \
@@ -65,7 +65,7 @@ CTX_DOUBLE_QUOTE = 2
 CTX_COMMENT = 3
 
 # Special time period constants
-AUTO = -1
+TP_AUTO = -1
 
 # Python keywords
 KEYWORDS = ['and', 'del', 'from', 'not', 'while', 'as', 'elif', 'global',
@@ -74,25 +74,49 @@ KEYWORDS = ['and', 'del', 'from', 'not', 'while', 'as', 'elif', 'global',
                        'raise', 'continue', 'finally', 'is', 'return', 'def', 'for',
                        'lambda', 'try' ]
 
+# Module file extensions
+MODULE_EXTS = ['.py', '.pyc', '.pyo', '.pyw', '.pyd']
+
 ModuleType = type(__builtin__)
 NoneScriptDesc = ScriptDesc('', dict(), dict(), dict(), dict(), True)
 
-_modules = dict([(n, None) for n in sys.builtin_module_names])
+_modules = {}
 _modules_updated = 0
 _parse_cache = dict()
 
-def get_cached_descriptor(txt, period=AUTO):
+def _load_module_names():
+       """Searches the sys.path for module files and lists them, along with
+       sys.builtin_module_names, in the global dict _modules.
+       """
+       
+       global _modules
+       
+       for n in sys.builtin_module_names:
+               _modules[n] = None
+       for p in sys.path:
+               if p == '': p = os.curdir
+               if not os.path.isdir(p): continue
+               for f in os.listdir(p):
+                       for ext in MODULE_EXTS:
+                               if f.endswith(ext):
+                                       _modules[f[:-len(ext)]] = None
+                                       break
+
+_load_module_names()
+
+
+def get_cached_descriptor(txt, period=TP_AUTO):
        """Returns the cached ScriptDesc for the specified Text object 'txt'. If the
        script has not been parsed in the last 'period' seconds it will be reparsed
        to obtain this descriptor.
        
-       Specifying AUTO for the period (default) will choose a period based on the
+       Specifying TP_AUTO for the period (default) will choose a period based on the
        size of the Text object. Larger texts are parsed less often.
        """
        
-       global _parse_cache, NoneScriptDesc, AUTO
+       global _parse_cache
        
-       if period == AUTO:
+       if period == TP_AUTO:
                m = txt.nlines
                r = 1
                while True:
@@ -155,7 +179,7 @@ def parse_text(txt):
                        type, string, start, end, line = tokens.next()
                except StopIteration:
                        break
-               except TokenError:
+               except TokenError, IndentationError:
                        incomplete = True
                        break