move message.txt generator out of wm.py (which was loaded with blender always), into...
[blender.git] / po / update_msg.py
1 # $Id:
2 # ***** BEGIN GPL LICENSE BLOCK *****
3 #
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software Foundation,
16 # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 #
18 # ***** END GPL LICENSE BLOCK *****
19
20 # <pep8 compliant>
21
22 # Write out messages.txt from blender
23
24 # Execite:
25 #   blender --background --python po/update_msg.py
26
27 import os
28
29 CURRENT_DIR = os.path.dirname(__file__)
30 SOURCE_DIR = os.path.normpath(os.path.abspath(os.path.join(CURRENT_DIR, "..")))
31
32 FILE_NAME_MESSAGES = os.path.join(CURRENT_DIR, "messages.txt")
33
34
35 def dump_messages():
36     import bpy
37
38     # -------------------------------------------------------------------------
39     # Function definitions
40
41     def _putMessage(messages, msg):
42         if len(msg):
43             messages[msg] = True
44
45     def _walkProperties(properties, messages):
46         import bpy
47         for prop in properties:
48             _putMessage(messages, prop.name)
49             _putMessage(messages, prop.description)
50
51             if isinstance(prop, bpy.types.EnumProperty):
52                 for item in prop.enum_items:
53                     _putMessage(messages, item.name)
54                     _putMessage(messages, item.description)
55
56     def _walkRNA(bl_rna, messages):
57         if bl_rna.name and bl_rna.name != bl_rna.identifier:
58             _putMessage(messages, bl_rna.name)
59
60         if bl_rna.description:
61             _putMessage(messages, bl_rna.description)
62
63         _walkProperties(bl_rna.properties, messages)
64
65     def _walkClass(cls, messages):
66         _walkRNA(cls.bl_rna, messages)
67
68     def _walk_keymap_hierarchy(hier, messages):
69         for lvl in hier:
70             _putMessage(messages, lvl[0])
71
72             if lvl[3]:
73                 _walk_keymap_hierarchy(lvl[3], messages)
74
75     # -------------------------------------------------------------------------
76     # Dump Messages
77
78     messages = {}
79
80     for cls in type(bpy.context).__base__.__subclasses__():
81         _walkClass(cls, messages)
82
83     for cls in bpy.types.Space.__subclasses__():
84         _walkClass(cls, messages)
85
86     for cls in bpy.types.Operator.__subclasses__():
87         _walkClass(cls, messages)
88
89     from bl_ui.space_userpref_keymap import KM_HIERARCHY
90
91     _walk_keymap_hierarchy(KM_HIERARCHY, messages)
92
93     message_file = open(FILE_NAME_MESSAGES, 'w')
94     message_file.writelines("\n".join(messages))
95     message_file.close()
96     print("Written %d messages to: %r" % (len(messages), FILE_NAME_MESSAGES))
97
98     # XXX. what is this supposed to do, we wrote the file already???
99     _walkClass(bpy.types.SpaceDopeSheetEditor, messages)
100
101     return {'FINISHED'}
102
103
104 def main():
105
106     try:
107         import bpy
108     except ImportError:
109         print("This script must run from inside blender")
110         return
111
112     dump_messages()
113
114
115 if __name__ == "__main__":
116     print("\n\n *** Running %r *** \n" % __file__)
117     main()