From: Pedro Algarvio Date: Wed, 30 May 2007 22:48:11 +0000 (+0000) Subject: Both Babel's [source:trunk/babel/catalog/frontend.py frontend] and [source:trunk... X-Git-Tag: 1.0~618 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=aaf1af101e6e4645a715d38165a350851648beb7;p=thirdparty%2Fbabel.git 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. --- diff --git a/babel/catalog/extract.py b/babel/catalog/extract.py index 8aaa1fe1..ec26a88f 100644 --- a/babel/catalog/extract.py +++ b/babel/catalog/extract.py @@ -33,17 +33,22 @@ __docformat__ = 'restructuredtext en' 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. @@ -130,7 +135,7 @@ def extract(method, fileobj, keywords=KEYWORDS, options=None): ... def run(argv): ... print _('Hello, world!') ... ''' - + >>> from StringIO import StringIO >>> for message in extract('python', StringIO(source)): ... print message @@ -147,7 +152,19 @@ def extract(method, fileobj, keywords=KEYWORDS, options=None): """ 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): diff --git a/babel/catalog/frontend.py b/babel/catalog/frontend.py index c5e9c6e3..00ca8ac5 100644 --- a/babel/catalog/frontend.py +++ b/babel/catalog/frontend.py @@ -40,7 +40,7 @@ class extract_messages(Command): ... cmdclass = {'extract_messages': extract_messages} ) - + :see: `Integrating new distutils commands `_ :see: `setuptools `_ """ @@ -50,8 +50,10 @@ class extract_messages(Command): ('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, @@ -59,7 +61,7 @@ class extract_messages(Command): ('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' @@ -68,6 +70,7 @@ class extract_messages(Command): 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: @@ -75,8 +78,11 @@ class extract_messages(Command): 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') @@ -96,7 +102,25 @@ class extract_messages(Command): 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. @@ -110,10 +134,14 @@ def main(argv=sys.argv): 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 ' @@ -131,13 +159,21 @@ def main(argv=sys.argv): 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))