d9cf6657a2590774ba4f39dc60e6bad829f567fc
[blender.git] / release / scripts / textplugin_functiondocs.py
1 #!BPY
2 """
3 Name: 'Function Documentation | Ctrl I'
4 Blender: 246
5 Group: 'TextPlugin'
6 Shortcut: 'Ctrl+I'
7 Tooltip: 'Attempts to display documentation about the function preceding the cursor.'
8 """
9
10 # Only run if we have the required modules
11 try:
12         import bpy
13         from BPyTextPlugin import *
14 except ImportError:
15         OK = False
16 else:
17         OK = True
18
19 def main():
20         txt = bpy.data.texts.active
21         if not txt:
22                 return
23         
24         (line, c) = current_line(txt)
25         
26         # Check we are in a normal context
27         if get_context(txt) != CTX_NORMAL:
28                 return
29         
30         # Look backwards for first '(' without ')'
31         b = 0
32         found = False
33         for i in range(c-1, -1, -1):
34                 if line[i] == ')': b += 1
35                 elif line[i] == '(':
36                         b -= 1
37                         if b < 0:
38                                 found = True
39                                 c = i
40                                 break
41         
42         # Otherwise identify the name under the cursor
43         if not found:
44                 llen = len(line)
45                 while c<llen and (line[c].isalnum() or line[c]=='_'):
46                         c += 1
47         
48         pre = get_targets(line, c)
49         
50         if len(pre) == 0:
51                 return
52         
53         imports = get_imports(txt)
54         builtins = get_builtins()
55         
56         # Identify the root (root.sub.sub.)
57         if imports.has_key(pre[0]):
58                 obj = imports[pre[0]]
59         elif builtins.has_key(pre[0]):
60                 obj = builtins[pre[0]]
61         else:
62                 return
63         
64         # Step through sub-attributes
65         try:
66                 for name in pre[1:]:
67                         obj = getattr(obj, name)
68         except AttributeError:
69                 print "Attribute not found '%s' in '%s'" % (name, '.'.join(pre))
70                 return
71         
72         if hasattr(obj, '__doc__') and obj.__doc__:
73                 txt.showDocs(obj.__doc__)
74
75 # Check we are running as a script and not imported as a module
76 if __name__ == "__main__" and OK:
77         main()