diff babel/catalog/frontend.py @ 3:e9eaddab598e

Import of initial code base.
author cmlenz
date Tue, 29 May 2007 20:33:55 +0000
parents
children 8d7b3077e6d1
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/babel/catalog/frontend.py
@@ -0,0 +1,150 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007 Edgewall Software
+# All rights reserved.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at http://babel.edgewall.org/wiki/License.
+#
+# This software consists of voluntary contributions made by many
+# individuals. For the exact contribution history, see the revision
+# history and logs, available at http://babel.edgewall.org/log/.
+
+"""Frontends for the message extraction functionality."""
+
+from distutils import log
+from distutils.cmd import Command
+from optparse import OptionParser
+import os
+import sys
+
+from babel import __version__ as VERSION
+from babel.catalog.extract import extract_from_dir, KEYWORDS
+from babel.catalog.pofile import write_po
+
+__all__ = ['extract_messages', 'main']
+__docformat__ = 'restructuredtext en'
+
+
+class extract_messages(Command):
+    """Message extraction command for use in ``setup.py`` scripts.
+    
+    If correctly installed, this command is available to Setuptools-using
+    setup scripts automatically. For projects using plain old ``distutils``,
+    the command needs to be registered explicitly in ``setup.py``::
+    
+        from babel.catalog.frontend import extract_messages
+    
+        setup(
+            ...
+            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>`_
+    """
+
+    description = 'extract localizable strings from the project code'
+    user_options = [
+        ('charset=', None,
+         'charset to use in the output file'),
+        ('keywords=', 'k',
+         'comma-separated list of keywords to look for in addition to the '
+         'defaults'),
+        ('no-location', None,
+         'do not include location comments with filename and line number'),
+        ('omit-header', None,
+         'do not include msgid "" entry in header'),
+        ('output-file=', None,
+         'name of the output file'),
+    ]
+    boolean_options = ['no-location', 'omit-header']
+
+    def initialize_options(self):
+        self.charset = 'utf-8'
+        self.keywords = KEYWORDS
+        self.no_location = False
+        self.omit_header = False
+        self.output_file = None
+        self.input_dirs = None
+
+    def finalize_options(self):
+        if not self.input_dirs:
+            self.input_dirs = dict.fromkeys([k.split('.',1)[0]
+                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
+
+    def run(self):
+        outfile = open(self.output_file, 'w')
+        try:
+            messages = []
+            for dirname in self.input_dirs:
+                log.info('extracting messages from %r' % dirname)
+                extracted = extract_from_dir(dirname, keywords=self.keywords)
+                for filename, lineno, funcname, message in extracted:
+                    messages.append((os.path.join(dirname, filename), lineno,
+                                     funcname, message))
+            write_po(outfile, messages, charset=self.charset,
+                     no_location=self.no_location, omit_header=self.omit_header)
+            log.info('writing PO file to %s' % self.output_file)
+        finally:
+            outfile.close()
+
+
+def main(argv=sys.argv):
+    """Command-line interface.
+    
+    This function provides a simple command-line interface to the message
+    extraction and PO file generation functionality.
+    
+    :param argv: list of arguments passed on the command-line
+    """
+    parser = OptionParser(usage='%prog [options] dirname1 <dirname2> ...',
+                          version='%%prog %s' % VERSION)
+    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',
+                      help='keywords to look for in addition to the defaults. '
+                           'You can specify multiple -k flags on the command '
+                           'line.')
+    parser.add_option('--no-location', dest='no_location', default=False,
+                      action='store_true',
+                      help='do not include location comments with filename and '
+                           'line number')
+    parser.add_option('--omit-header', dest='omit_header', default=False,
+                      action='store_true',
+                      help='do not include msgid "" entry in header')
+    parser.add_option('-o', '--output', dest='output',
+                      help='path to the output POT file')
+    options, args = parser.parse_args(argv[1:])
+    if not args:
+        parser.error('incorrect number of arguments')
+
+    if options.output not in (None, '-'):
+        outfile = open(options.output, 'w')
+    else:
+        outfile = sys.stdout
+
+    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)
+            for filename, lineno, funcname, message in extracted:
+                messages.append((os.path.join(dirname, filename), lineno,
+                                 funcname, message))
+        write_po(outfile, messages,
+                 charset=options.charset, no_location=options.no_location,
+                 omit_header=options.omit_header)
+    finally:
+        if options.output:
+            outfile.close()
+
+if __name__ == '__main__':
+    main()
Copyright (C) 2012-2017 Edgewall Software