changeset 10:4130d9c6cb34 trunk

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.
author palgarvio
date Wed, 30 May 2007 22:48:11 +0000
parents 9ed6cf5975a1
children a6278c6006d2
files babel/catalog/extract.py babel/catalog/frontend.py
diffstat 2 files changed, 68 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/babel/catalog/extract.py
+++ b/babel/catalog/extract.py
@@ -33,17 +33,22 @@
 
 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 run(argv):
     ...    print _('Hello, world!')
     ... '''
-
+    
     >>> from StringIO import StringIO
     >>> for message in extract('python', StringIO(source)):
     ...     print message
@@ -147,7 +152,19 @@
     """
     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):
--- a/babel/catalog/frontend.py
+++ b/babel/catalog/frontend.py
@@ -40,7 +40,7 @@
             ...
             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>`_
     """
@@ -50,8 +50,10 @@
         ('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 @@
         ('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 @@
         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 @@
                 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 @@
         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 @@
     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 @@
         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))
Copyright (C) 2012-2017 Edgewall Software