GROUP_NAME = 'babel.extractors'
-KEYWORDS = (
- '_', 'gettext', 'ngettext',
- 'dgettext', 'dngettext',
- 'ugettext', 'ungettext'
-)
+KEYWORDS = {
+ '_': None,
+ 'gettext': None,
+ 'ngettext': (1, 2),
+ 'ugettext': None,
+ 'ungettext': (1, 2),
+ 'dgettext': (2,),
+ 'dngettext': (2, 3),
+}
DEFAULT_MAPPING = {
'genshi': ['*.html', '**/*.html'],
'python': ['*.py', '**/*.py']
}
+
def extract_from_dir(dirname, mapping=DEFAULT_MAPPING, keywords=KEYWORDS,
options=None):
"""Extract messages from any source files found in the given directory.
... def run(argv):
... print _('Hello, world!')
... '''
-
+
>>> from StringIO import StringIO
>>> for message in extract('python', StringIO(source)):
... print message
"""
for entry_point in working_set.iter_entry_points(GROUP_NAME, method):
func = entry_point.load(require=True)
- return list(func(fileobj, keywords, options=options or {}))
+ m = []
+ for lineno, funcname, messages in func(fileobj, keywords.keys(),
+ options=options or {}):
+ if isinstance(messages, (list, tuple)):
+ indices = keywords[funcname]
+ msgs = []
+ for indice in indices:
+ msgs.append(messages[indice-1])
+ messages = tuple(msgs)
+ if len(messages) == 1:
+ messages = messages[0]
+ yield lineno, funcname, messages
+ return
raise ValueError('Unknown extraction method %r' % method)
def extract_genshi(fileobj, keywords, options):
...
cmdclass = {'extract_messages': extract_messages}
)
-
+
:see: `Integrating new distutils commands <http://docs.python.org/dist/node32.html>`_
:see: `setuptools <http://peak.telecommunity.com/DevCenter/setuptools>`_
"""
('charset=', None,
'charset to use in the output file'),
('keywords=', 'k',
- 'comma-separated list of keywords to look for in addition to the '
+ 'space-separated list of keywords to look for in addition to the '
'defaults'),
+ ('no-default-keywords', None,
+ 'do not include the default keywords defined by Babel'),
('no-location', None,
'do not include location comments with filename and line number'),
('omit-header', None,
('output-file=', 'o',
'name of the output file'),
]
- boolean_options = ['no-location', 'omit-header']
+ boolean_options = ['no-location', 'omit-header', 'no-default-keywords']
def initialize_options(self):
self.charset = 'utf-8'
self.omit_header = False
self.output_file = None
self.input_dirs = None
+ self.no_default_keywords = False
def finalize_options(self):
if not self.input_dirs:
for k in self.distribution.packages
]).keys()
if isinstance(self.keywords, basestring):
- new_keywords = [k.strip() for k in self.keywords.split(',')]
- self.keywords = list(KEYWORDS) + new_keywords
+ new_keywords = [k.strip() for k in self.keywords.split()]
+ self.keywords = build_gettext_functions(
+ new_keywords,
+ dont_include_default=self.no_default_keywords
+ )
def run(self):
outfile = open(self.output_file, 'w')
finally:
outfile.close()
-
+def build_gettext_functions(func_list=[], dont_include_default=False):
+ """Build the gettext function to parse."""
+ if dont_include_default:
+ func_dict = {}
+ else:
+ func_dict = KEYWORDS
+ for func in func_list:
+ if func.find(':') != -1:
+ func_name, func_args = func.split(':')
+ else:
+ func_name, func_args = func, None
+ if not func_dict.has_key(func_name):
+ if func_args:
+ str_indexes = [(int(x) -1 ) for x in func_args.split(',')]
+ else:
+ str_indexes = None
+ func_dict[func_name] = str_indexes
+ return func_dict
+
def main(argv=sys.argv):
"""Command-line interface.
parser.add_option('--charset', dest='charset', default='utf-8',
help='charset to use in the output')
parser.add_option('-k', '--keyword', dest='keywords',
- default=list(KEYWORDS), action='append',
+ default=[], action='append',
help='keywords to look for in addition to the defaults. '
'You can specify multiple -k flags on the command '
'line.')
+ parser.add_option('--no-default-keywords', dest='no_default_keywords',
+ action='store_true', default=False,
+ help="do not include the default keywords defined by "
+ "Babel")
parser.add_option('--no-location', dest='no_location', default=False,
action='store_true',
help='do not include location comments with filename and '
outfile = open(options.output, 'w')
else:
outfile = sys.stdout
+
+ if options.no_default_keywords and not options.keywords:
+ parser.error("you must pass keywords to disable the default ones")
+ elif options.no_default_keywords and options.keywords:
+ keywords = build_gettext_functions(options.keywords,
+ dont_include_default=options.no_default_keywords)
+ else:
+ keywords = build_gettext_functions()
try:
messages = []
for dirname in args:
if not os.path.isdir(dirname):
parser.error('%r is not a directory' % dirname)
- extracted = extract_from_dir(dirname, keywords=options.keywords)
+ extracted = extract_from_dir(dirname, keywords=keywords)
for filename, lineno, funcname, message in extracted:
messages.append((os.path.join(dirname, filename), lineno,
funcname, message, None))