Mercurial > babel > old > babel-test
annotate babel/messages/extract.py @ 138:2071e375cf29
Genshi extraction method has moved to Genshi project. Closes #13.
author | cmlenz |
---|---|
date | Wed, 20 Jun 2007 10:02:04 +0000 |
parents | bfe7357a4754 |
children | a5914ba672d1 |
rev | line source |
---|---|
1 | 1 # -*- coding: utf-8 -*- |
2 # | |
3 # Copyright (C) 2007 Edgewall Software | |
4 # All rights reserved. | |
5 # | |
6 # This software is licensed as described in the file COPYING, which | |
7 # you should have received as part of this distribution. The terms | |
8 # are also available at http://babel.edgewall.org/wiki/License. | |
9 # | |
10 # This software consists of voluntary contributions made by many | |
11 # individuals. For the exact contribution history, see the revision | |
12 # history and logs, available at http://babel.edgewall.org/log/. | |
13 | |
14 """Basic infrastructure for extracting localizable messages from source files. | |
15 | |
16 This module defines an extensible system for collecting localizable message | |
17 strings from a variety of sources. A native extractor for Python source files | |
18 is builtin, extractors for other sources can be added using very simple plugins. | |
19 | |
20 The main entry points into the extraction functionality are the functions | |
21 `extract_from_dir` and `extract_from_file`. | |
22 """ | |
23 | |
24 import os | |
44 | 25 try: |
26 set | |
27 except NameError: | |
28 from sets import Set as set | |
1 | 29 import sys |
80
9c84b9fa5d30
Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents:
75
diff
changeset
|
30 from tokenize import generate_tokens, NAME, OP, STRING, COMMENT |
1 | 31 |
44 | 32 from babel.util import pathmatch, relpath |
1 | 33 |
34 __all__ = ['extract', 'extract_from_dir', 'extract_from_file'] | |
35 __docformat__ = 'restructuredtext en' | |
36 | |
37 GROUP_NAME = 'babel.extractors' | |
38 | |
12
a2c54ef107c2
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
10
diff
changeset
|
39 DEFAULT_KEYWORDS = { |
10
b24987f7318d
Both Babel's [source:trunk/babel/catalog/frontend.py frontend] and [source:trunk/babel/catalog/extract.py extract] now handle keyword indices. Also added an extra boolean flag so that the default keywords defined by Babel are not included in the keywords to search for when extracting strings.
palgarvio
parents:
1
diff
changeset
|
40 '_': None, |
b24987f7318d
Both Babel's [source:trunk/babel/catalog/frontend.py frontend] and [source:trunk/babel/catalog/extract.py extract] now handle keyword indices. Also added an extra boolean flag so that the default keywords defined by Babel are not included in the keywords to search for when extracting strings.
palgarvio
parents:
1
diff
changeset
|
41 'gettext': None, |
b24987f7318d
Both Babel's [source:trunk/babel/catalog/frontend.py frontend] and [source:trunk/babel/catalog/extract.py extract] now handle keyword indices. Also added an extra boolean flag so that the default keywords defined by Babel are not included in the keywords to search for when extracting strings.
palgarvio
parents:
1
diff
changeset
|
42 'ngettext': (1, 2), |
b24987f7318d
Both Babel's [source:trunk/babel/catalog/frontend.py frontend] and [source:trunk/babel/catalog/extract.py extract] now handle keyword indices. Also added an extra boolean flag so that the default keywords defined by Babel are not included in the keywords to search for when extracting strings.
palgarvio
parents:
1
diff
changeset
|
43 'ugettext': None, |
b24987f7318d
Both Babel's [source:trunk/babel/catalog/frontend.py frontend] and [source:trunk/babel/catalog/extract.py extract] now handle keyword indices. Also added an extra boolean flag so that the default keywords defined by Babel are not included in the keywords to search for when extracting strings.
palgarvio
parents:
1
diff
changeset
|
44 'ungettext': (1, 2), |
b24987f7318d
Both Babel's [source:trunk/babel/catalog/frontend.py frontend] and [source:trunk/babel/catalog/extract.py extract] now handle keyword indices. Also added an extra boolean flag so that the default keywords defined by Babel are not included in the keywords to search for when extracting strings.
palgarvio
parents:
1
diff
changeset
|
45 'dgettext': (2,), |
b24987f7318d
Both Babel's [source:trunk/babel/catalog/frontend.py frontend] and [source:trunk/babel/catalog/extract.py extract] now handle keyword indices. Also added an extra boolean flag so that the default keywords defined by Babel are not included in the keywords to search for when extracting strings.
palgarvio
parents:
1
diff
changeset
|
46 'dngettext': (2, 3), |
b24987f7318d
Both Babel's [source:trunk/babel/catalog/frontend.py frontend] and [source:trunk/babel/catalog/extract.py extract] now handle keyword indices. Also added an extra boolean flag so that the default keywords defined by Babel are not included in the keywords to search for when extracting strings.
palgarvio
parents:
1
diff
changeset
|
47 } |
1 | 48 |
62
84d400066b71
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
57
diff
changeset
|
49 DEFAULT_MAPPING = [('**.py', 'python')] |
1 | 50 |
47
76381d4b3635
Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents:
44
diff
changeset
|
51 def extract_from_dir(dirname=os.getcwd(), method_map=DEFAULT_MAPPING, |
76381d4b3635
Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents:
44
diff
changeset
|
52 options_map=None, keywords=DEFAULT_KEYWORDS, |
84
4ff9cc26c11b
Some cosmetic changes for the new translator comments support.
cmlenz
parents:
82
diff
changeset
|
53 comment_tags=(), callback=None): |
1 | 54 """Extract messages from any source files found in the given directory. |
55 | |
56 This function generates tuples of the form: | |
57 | |
82
0b5d604399b8
Missed some param's documentation regarding translator comments.
palgarvio
parents:
81
diff
changeset
|
58 ``(filename, lineno, message, comments)`` |
1 | 59 |
44 | 60 Which extraction method is used per file is determined by the `method_map` |
61 parameter, which maps extended glob patterns to extraction method names. | |
62 For example, the following is the default mapping: | |
1 | 63 |
62
84d400066b71
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
57
diff
changeset
|
64 >>> method_map = [ |
84d400066b71
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
57
diff
changeset
|
65 ... ('**.py', 'python') |
84d400066b71
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
57
diff
changeset
|
66 ... ] |
1 | 67 |
68 This basically says that files with the filename extension ".py" at any | |
69 level inside the directory should be processed by the "python" extraction | |
44 | 70 method. Files that don't match any of the mapping patterns are ignored. See |
71 the documentation of the `pathmatch` function for details on the pattern | |
72 syntax. | |
1 | 73 |
62
84d400066b71
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
57
diff
changeset
|
74 The following extended mapping would also use the "genshi" extraction |
84d400066b71
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
57
diff
changeset
|
75 method on any file in "templates" subdirectory: |
1 | 76 |
62
84d400066b71
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
57
diff
changeset
|
77 >>> method_map = [ |
84d400066b71
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
57
diff
changeset
|
78 ... ('**/templates/**.*', 'genshi'), |
84d400066b71
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
57
diff
changeset
|
79 ... ('**.py', 'python') |
84d400066b71
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
57
diff
changeset
|
80 ... ] |
44 | 81 |
82 The dictionary provided by the optional `options_map` parameter augments | |
62
84d400066b71
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
57
diff
changeset
|
83 these mappings. It uses extended glob patterns as keys, and the values are |
84d400066b71
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
57
diff
changeset
|
84 dictionaries mapping options names to option values (both strings). |
44 | 85 |
86 The glob patterns of the `options_map` do not necessarily need to be the | |
62
84d400066b71
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
57
diff
changeset
|
87 same as those used in the method mapping. For example, while all files in |
84d400066b71
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
57
diff
changeset
|
88 the ``templates`` folders in an application may be Genshi applications, the |
44 | 89 options for those files may differ based on extension: |
90 | |
91 >>> options_map = { | |
92 ... '**/templates/**.txt': { | |
93 ... 'template_class': 'genshi.template.text.TextTemplate', | |
94 ... 'encoding': 'latin-1' | |
95 ... }, | |
96 ... '**/templates/**.html': { | |
97 ... 'include_attrs': '' | |
98 ... } | |
1 | 99 ... } |
100 | |
101 :param dirname: the path to the directory to extract messages from | |
62
84d400066b71
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
57
diff
changeset
|
102 :param method_map: a list of ``(pattern, method)`` tuples that maps of |
84d400066b71
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
57
diff
changeset
|
103 extraction method names to extended glob patterns |
44 | 104 :param options_map: a dictionary of additional options (optional) |
12
a2c54ef107c2
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
10
diff
changeset
|
105 :param keywords: a dictionary mapping keywords (i.e. names of functions |
a2c54ef107c2
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
10
diff
changeset
|
106 that should be recognized as translation functions) to |
a2c54ef107c2
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
10
diff
changeset
|
107 tuples that specify which of their arguments contain |
a2c54ef107c2
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
10
diff
changeset
|
108 localizable strings |
84
4ff9cc26c11b
Some cosmetic changes for the new translator comments support.
cmlenz
parents:
82
diff
changeset
|
109 :param comment_tags: a list of tags of translator comments to search for |
4ff9cc26c11b
Some cosmetic changes for the new translator comments support.
cmlenz
parents:
82
diff
changeset
|
110 and include in the results |
47
76381d4b3635
Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents:
44
diff
changeset
|
111 :param callback: a function that is called for every file that message are |
76381d4b3635
Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents:
44
diff
changeset
|
112 extracted from, just before the extraction itself is |
75 | 113 performed; the function is passed the filename, the name |
114 of the extraction method and and the options dictionary as | |
115 positional arguments, in that order | |
1 | 116 :return: an iterator over ``(filename, lineno, funcname, message)`` tuples |
117 :rtype: ``iterator`` | |
44 | 118 :see: `pathmatch` |
1 | 119 """ |
44 | 120 if options_map is None: |
121 options_map = {} | |
56
27fba894d3ca
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
54
diff
changeset
|
122 |
44 | 123 absname = os.path.abspath(dirname) |
124 for root, dirnames, filenames in os.walk(absname): | |
125 for subdir in dirnames: | |
126 if subdir.startswith('.') or subdir.startswith('_'): | |
127 dirnames.remove(subdir) | |
128 for filename in filenames: | |
129 filename = relpath( | |
130 os.path.join(root, filename).replace(os.sep, '/'), | |
131 dirname | |
132 ) | |
62
84d400066b71
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
57
diff
changeset
|
133 for pattern, method in method_map: |
44 | 134 if pathmatch(pattern, filename): |
135 filepath = os.path.join(absname, filename) | |
136 options = {} | |
137 for opattern, odict in options_map.items(): | |
138 if pathmatch(opattern, filename): | |
139 options = odict | |
47
76381d4b3635
Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents:
44
diff
changeset
|
140 if callback: |
57
a6183d300a6e
* The `extract_messages` distutils command now operators on configurable input directories again, instead of the complete current directory. The `input_dirs` default to the package directories.
cmlenz
parents:
56
diff
changeset
|
141 callback(filename, method, options) |
80
9c84b9fa5d30
Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents:
75
diff
changeset
|
142 for lineno, message, comments in \ |
9c84b9fa5d30
Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents:
75
diff
changeset
|
143 extract_from_file(method, filepath, |
9c84b9fa5d30
Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents:
75
diff
changeset
|
144 keywords=keywords, |
84
4ff9cc26c11b
Some cosmetic changes for the new translator comments support.
cmlenz
parents:
82
diff
changeset
|
145 comment_tags=comment_tags, |
80
9c84b9fa5d30
Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents:
75
diff
changeset
|
146 options=options): |
9c84b9fa5d30
Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents:
75
diff
changeset
|
147 yield filename, lineno, message, comments |
57
a6183d300a6e
* The `extract_messages` distutils command now operators on configurable input directories again, instead of the complete current directory. The `input_dirs` default to the package directories.
cmlenz
parents:
56
diff
changeset
|
148 break |
1 | 149 |
12
a2c54ef107c2
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
10
diff
changeset
|
150 def extract_from_file(method, filename, keywords=DEFAULT_KEYWORDS, |
84
4ff9cc26c11b
Some cosmetic changes for the new translator comments support.
cmlenz
parents:
82
diff
changeset
|
151 comment_tags=(), options=None): |
1 | 152 """Extract messages from a specific file. |
153 | |
154 This function returns a list of tuples of the form: | |
155 | |
156 ``(lineno, funcname, message)`` | |
157 | |
158 :param filename: the path to the file to extract messages from | |
159 :param method: a string specifying the extraction method (.e.g. "python") | |
12
a2c54ef107c2
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
10
diff
changeset
|
160 :param keywords: a dictionary mapping keywords (i.e. names of functions |
a2c54ef107c2
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
10
diff
changeset
|
161 that should be recognized as translation functions) to |
a2c54ef107c2
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
10
diff
changeset
|
162 tuples that specify which of their arguments contain |
a2c54ef107c2
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
10
diff
changeset
|
163 localizable strings |
84
4ff9cc26c11b
Some cosmetic changes for the new translator comments support.
cmlenz
parents:
82
diff
changeset
|
164 :param comment_tags: a list of translator tags to search for and include |
4ff9cc26c11b
Some cosmetic changes for the new translator comments support.
cmlenz
parents:
82
diff
changeset
|
165 in the results |
1 | 166 :param options: a dictionary of additional options (optional) |
167 :return: the list of extracted messages | |
168 :rtype: `list` | |
169 """ | |
170 fileobj = open(filename, 'U') | |
171 try: | |
84
4ff9cc26c11b
Some cosmetic changes for the new translator comments support.
cmlenz
parents:
82
diff
changeset
|
172 return list(extract(method, fileobj, keywords, comment_tags, options)) |
1 | 173 finally: |
174 fileobj.close() | |
175 | |
84
4ff9cc26c11b
Some cosmetic changes for the new translator comments support.
cmlenz
parents:
82
diff
changeset
|
176 def extract(method, fileobj, keywords=DEFAULT_KEYWORDS, comment_tags=(), |
80
9c84b9fa5d30
Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents:
75
diff
changeset
|
177 options=None): |
1 | 178 """Extract messages from the given file-like object using the specified |
179 extraction method. | |
180 | |
181 This function returns a list of tuples of the form: | |
182 | |
80
9c84b9fa5d30
Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents:
75
diff
changeset
|
183 ``(lineno, message, comments)`` |
1 | 184 |
185 The implementation dispatches the actual extraction to plugins, based on the | |
186 value of the ``method`` parameter. | |
187 | |
188 >>> source = '''# foo module | |
189 ... def run(argv): | |
190 ... print _('Hello, world!') | |
191 ... ''' | |
10
b24987f7318d
Both Babel's [source:trunk/babel/catalog/frontend.py frontend] and [source:trunk/babel/catalog/extract.py extract] now handle keyword indices. Also added an extra boolean flag so that the default keywords defined by Babel are not included in the keywords to search for when extracting strings.
palgarvio
parents:
1
diff
changeset
|
192 |
1 | 193 >>> from StringIO import StringIO |
194 >>> for message in extract('python', StringIO(source)): | |
195 ... print message | |
80
9c84b9fa5d30
Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents:
75
diff
changeset
|
196 (3, 'Hello, world!', []) |
1 | 197 |
198 :param method: a string specifying the extraction method (.e.g. "python") | |
199 :param fileobj: the file-like object the messages should be extracted from | |
12
a2c54ef107c2
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
10
diff
changeset
|
200 :param keywords: a dictionary mapping keywords (i.e. names of functions |
a2c54ef107c2
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
10
diff
changeset
|
201 that should be recognized as translation functions) to |
a2c54ef107c2
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
10
diff
changeset
|
202 tuples that specify which of their arguments contain |
a2c54ef107c2
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
10
diff
changeset
|
203 localizable strings |
84
4ff9cc26c11b
Some cosmetic changes for the new translator comments support.
cmlenz
parents:
82
diff
changeset
|
204 :param comment_tags: a list of translator tags to search for and include |
4ff9cc26c11b
Some cosmetic changes for the new translator comments support.
cmlenz
parents:
82
diff
changeset
|
205 in the results |
1 | 206 :param options: a dictionary of additional options (optional) |
207 :return: the list of extracted messages | |
208 :rtype: `list` | |
209 :raise ValueError: if the extraction method is not registered | |
210 """ | |
12
a2c54ef107c2
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
10
diff
changeset
|
211 from pkg_resources import working_set |
a2c54ef107c2
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
10
diff
changeset
|
212 |
1 | 213 for entry_point in working_set.iter_entry_points(GROUP_NAME, method): |
214 func = entry_point.load(require=True) | |
84
4ff9cc26c11b
Some cosmetic changes for the new translator comments support.
cmlenz
parents:
82
diff
changeset
|
215 results = func(fileobj, keywords.keys(), comment_tags, |
4ff9cc26c11b
Some cosmetic changes for the new translator comments support.
cmlenz
parents:
82
diff
changeset
|
216 options=options or {}) |
4ff9cc26c11b
Some cosmetic changes for the new translator comments support.
cmlenz
parents:
82
diff
changeset
|
217 for lineno, funcname, messages, comments in results: |
10
b24987f7318d
Both Babel's [source:trunk/babel/catalog/frontend.py frontend] and [source:trunk/babel/catalog/extract.py extract] now handle keyword indices. Also added an extra boolean flag so that the default keywords defined by Babel are not included in the keywords to search for when extracting strings.
palgarvio
parents:
1
diff
changeset
|
218 if isinstance(messages, (list, tuple)): |
b24987f7318d
Both Babel's [source:trunk/babel/catalog/frontend.py frontend] and [source:trunk/babel/catalog/extract.py extract] now handle keyword indices. Also added an extra boolean flag so that the default keywords defined by Babel are not included in the keywords to search for when extracting strings.
palgarvio
parents:
1
diff
changeset
|
219 msgs = [] |
12
a2c54ef107c2
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
10
diff
changeset
|
220 for index in keywords[funcname]: |
a2c54ef107c2
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
10
diff
changeset
|
221 msgs.append(messages[index - 1]) |
10
b24987f7318d
Both Babel's [source:trunk/babel/catalog/frontend.py frontend] and [source:trunk/babel/catalog/extract.py extract] now handle keyword indices. Also added an extra boolean flag so that the default keywords defined by Babel are not included in the keywords to search for when extracting strings.
palgarvio
parents:
1
diff
changeset
|
222 messages = tuple(msgs) |
b24987f7318d
Both Babel's [source:trunk/babel/catalog/frontend.py frontend] and [source:trunk/babel/catalog/extract.py extract] now handle keyword indices. Also added an extra boolean flag so that the default keywords defined by Babel are not included in the keywords to search for when extracting strings.
palgarvio
parents:
1
diff
changeset
|
223 if len(messages) == 1: |
b24987f7318d
Both Babel's [source:trunk/babel/catalog/frontend.py frontend] and [source:trunk/babel/catalog/extract.py extract] now handle keyword indices. Also added an extra boolean flag so that the default keywords defined by Babel are not included in the keywords to search for when extracting strings.
palgarvio
parents:
1
diff
changeset
|
224 messages = messages[0] |
80
9c84b9fa5d30
Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents:
75
diff
changeset
|
225 yield lineno, messages, comments |
10
b24987f7318d
Both Babel's [source:trunk/babel/catalog/frontend.py frontend] and [source:trunk/babel/catalog/extract.py extract] now handle keyword indices. Also added an extra boolean flag so that the default keywords defined by Babel are not included in the keywords to search for when extracting strings.
palgarvio
parents:
1
diff
changeset
|
226 return |
12
a2c54ef107c2
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
10
diff
changeset
|
227 |
1 | 228 raise ValueError('Unknown extraction method %r' % method) |
229 | |
84
4ff9cc26c11b
Some cosmetic changes for the new translator comments support.
cmlenz
parents:
82
diff
changeset
|
230 def extract_nothing(fileobj, keywords, comment_tags, options): |
57
a6183d300a6e
* The `extract_messages` distutils command now operators on configurable input directories again, instead of the complete current directory. The `input_dirs` default to the package directories.
cmlenz
parents:
56
diff
changeset
|
231 """Pseudo extractor that does not actually extract anything, but simply |
a6183d300a6e
* The `extract_messages` distutils command now operators on configurable input directories again, instead of the complete current directory. The `input_dirs` default to the package directories.
cmlenz
parents:
56
diff
changeset
|
232 returns an empty list. |
a6183d300a6e
* The `extract_messages` distutils command now operators on configurable input directories again, instead of the complete current directory. The `input_dirs` default to the package directories.
cmlenz
parents:
56
diff
changeset
|
233 """ |
a6183d300a6e
* The `extract_messages` distutils command now operators on configurable input directories again, instead of the complete current directory. The `input_dirs` default to the package directories.
cmlenz
parents:
56
diff
changeset
|
234 return [] |
a6183d300a6e
* The `extract_messages` distutils command now operators on configurable input directories again, instead of the complete current directory. The `input_dirs` default to the package directories.
cmlenz
parents:
56
diff
changeset
|
235 |
84
4ff9cc26c11b
Some cosmetic changes for the new translator comments support.
cmlenz
parents:
82
diff
changeset
|
236 def extract_python(fileobj, keywords, comment_tags, options): |
1 | 237 """Extract messages from Python source code. |
238 | |
239 :param fileobj: the file-like object the messages should be extracted from | |
240 :param keywords: a list of keywords (i.e. function names) that should be | |
241 recognized as translation functions | |
84
4ff9cc26c11b
Some cosmetic changes for the new translator comments support.
cmlenz
parents:
82
diff
changeset
|
242 :param comment_tags: a list of translator tags to search for and include |
4ff9cc26c11b
Some cosmetic changes for the new translator comments support.
cmlenz
parents:
82
diff
changeset
|
243 in the results |
1 | 244 :param options: a dictionary of additional options (optional) |
81
1e89661e6b26
Fixed and added some documentation about the translator comments implemented in [81].
palgarvio
parents:
80
diff
changeset
|
245 :return: an iterator over ``(lineno, funcname, message, comments)`` tuples |
1 | 246 :rtype: ``iterator`` |
247 """ | |
248 funcname = None | |
249 lineno = None | |
250 buf = [] | |
251 messages = [] | |
80
9c84b9fa5d30
Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents:
75
diff
changeset
|
252 translator_comments = [] |
1 | 253 in_args = False |
80
9c84b9fa5d30
Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents:
75
diff
changeset
|
254 in_translator_comments = False |
1 | 255 |
256 tokens = generate_tokens(fileobj.readline) | |
257 for tok, value, (lineno, _), _, _ in tokens: | |
258 if funcname and tok == OP and value == '(': | |
259 in_args = True | |
80
9c84b9fa5d30
Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents:
75
diff
changeset
|
260 elif tok == COMMENT: |
92
5bac3678e60d
Fixed bug introduced in [92], bad use of `lstrip()`. Added a unittest to test multiple translator comment tags.
palgarvio
parents:
91
diff
changeset
|
261 # Strip the comment token from the line |
5bac3678e60d
Fixed bug introduced in [92], bad use of `lstrip()`. Added a unittest to test multiple translator comment tags.
palgarvio
parents:
91
diff
changeset
|
262 value = value[1:].strip() |
93
1ce6692ed625
Commiting patch provided by pjenvey: Translator comments don't apply unless they immediately preceed the message.
palgarvio
parents:
92
diff
changeset
|
263 if in_translator_comments is True and \ |
1ce6692ed625
Commiting patch provided by pjenvey: Translator comments don't apply unless they immediately preceed the message.
palgarvio
parents:
92
diff
changeset
|
264 translator_comments[-1][0] == lineno - 1: |
92
5bac3678e60d
Fixed bug introduced in [92], bad use of `lstrip()`. Added a unittest to test multiple translator comment tags.
palgarvio
parents:
91
diff
changeset
|
265 # We're already inside a translator comment, continue appending |
5bac3678e60d
Fixed bug introduced in [92], bad use of `lstrip()`. Added a unittest to test multiple translator comment tags.
palgarvio
parents:
91
diff
changeset
|
266 # XXX: Should we check if the programmer keeps adding the |
5bac3678e60d
Fixed bug introduced in [92], bad use of `lstrip()`. Added a unittest to test multiple translator comment tags.
palgarvio
parents:
91
diff
changeset
|
267 # comment_tag for every comment line??? probably not! |
93
1ce6692ed625
Commiting patch provided by pjenvey: Translator comments don't apply unless they immediately preceed the message.
palgarvio
parents:
92
diff
changeset
|
268 translator_comments.append((lineno, value)) |
92
5bac3678e60d
Fixed bug introduced in [92], bad use of `lstrip()`. Added a unittest to test multiple translator comment tags.
palgarvio
parents:
91
diff
changeset
|
269 continue |
5bac3678e60d
Fixed bug introduced in [92], bad use of `lstrip()`. Added a unittest to test multiple translator comment tags.
palgarvio
parents:
91
diff
changeset
|
270 # If execution reaches this point, let's see if comment line |
5bac3678e60d
Fixed bug introduced in [92], bad use of `lstrip()`. Added a unittest to test multiple translator comment tags.
palgarvio
parents:
91
diff
changeset
|
271 # starts with one of the comment tags |
85
dc260efaed34
Fixed de-pluralization bug introduced in [85] regarding the extraction of translator comments.
palgarvio
parents:
84
diff
changeset
|
272 for comment_tag in comment_tags: |
92
5bac3678e60d
Fixed bug introduced in [92], bad use of `lstrip()`. Added a unittest to test multiple translator comment tags.
palgarvio
parents:
91
diff
changeset
|
273 if value.startswith(comment_tag): |
80
9c84b9fa5d30
Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents:
75
diff
changeset
|
274 if in_translator_comments is not True: |
9c84b9fa5d30
Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents:
75
diff
changeset
|
275 in_translator_comments = True |
92
5bac3678e60d
Fixed bug introduced in [92], bad use of `lstrip()`. Added a unittest to test multiple translator comment tags.
palgarvio
parents:
91
diff
changeset
|
276 comment = value[len(comment_tag):].strip() |
93
1ce6692ed625
Commiting patch provided by pjenvey: Translator comments don't apply unless they immediately preceed the message.
palgarvio
parents:
92
diff
changeset
|
277 translator_comments.append((lineno, comment)) |
92
5bac3678e60d
Fixed bug introduced in [92], bad use of `lstrip()`. Added a unittest to test multiple translator comment tags.
palgarvio
parents:
91
diff
changeset
|
278 break |
1 | 279 elif funcname and in_args: |
280 if tok == OP and value == ')': | |
80
9c84b9fa5d30
Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents:
75
diff
changeset
|
281 in_args = in_translator_comments = False |
1 | 282 if buf: |
283 messages.append(''.join(buf)) | |
284 del buf[:] | |
285 if filter(None, messages): | |
286 if len(messages) > 1: | |
287 messages = tuple(messages) | |
288 else: | |
289 messages = messages[0] | |
93
1ce6692ed625
Commiting patch provided by pjenvey: Translator comments don't apply unless they immediately preceed the message.
palgarvio
parents:
92
diff
changeset
|
290 # Comments don't apply unless they immediately preceed the |
1ce6692ed625
Commiting patch provided by pjenvey: Translator comments don't apply unless they immediately preceed the message.
palgarvio
parents:
92
diff
changeset
|
291 # message |
1ce6692ed625
Commiting patch provided by pjenvey: Translator comments don't apply unless they immediately preceed the message.
palgarvio
parents:
92
diff
changeset
|
292 if translator_comments and \ |
1ce6692ed625
Commiting patch provided by pjenvey: Translator comments don't apply unless they immediately preceed the message.
palgarvio
parents:
92
diff
changeset
|
293 translator_comments[-1][0] < lineno - 1: |
1ce6692ed625
Commiting patch provided by pjenvey: Translator comments don't apply unless they immediately preceed the message.
palgarvio
parents:
92
diff
changeset
|
294 translator_comments = [] |
1ce6692ed625
Commiting patch provided by pjenvey: Translator comments don't apply unless they immediately preceed the message.
palgarvio
parents:
92
diff
changeset
|
295 |
1ce6692ed625
Commiting patch provided by pjenvey: Translator comments don't apply unless they immediately preceed the message.
palgarvio
parents:
92
diff
changeset
|
296 yield (lineno, funcname, messages, |
1ce6692ed625
Commiting patch provided by pjenvey: Translator comments don't apply unless they immediately preceed the message.
palgarvio
parents:
92
diff
changeset
|
297 [comment[1] for comment in translator_comments]) |
1 | 298 funcname = lineno = None |
299 messages = [] | |
80
9c84b9fa5d30
Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents:
75
diff
changeset
|
300 translator_comments = [] |
1 | 301 elif tok == STRING: |
36
56b931b23d5b
Fix for #8: fix extraction of strings from Python source using prefixes ('u' or 'r') or triple quotes.
cmlenz
parents:
12
diff
changeset
|
302 # Unwrap quotes in a safe manner |
56b931b23d5b
Fix for #8: fix extraction of strings from Python source using prefixes ('u' or 'r') or triple quotes.
cmlenz
parents:
12
diff
changeset
|
303 buf.append(eval(value, {'__builtins__':{}}, {})) |
1 | 304 elif tok == OP and value == ',': |
305 messages.append(''.join(buf)) | |
306 del buf[:] | |
307 elif funcname: | |
308 funcname = None | |
309 elif tok == NAME and value in keywords: | |
310 funcname = value |