annotate babel/catalog/frontend.py @ 1:f71ca60f2a4a

Import of initial code base.
author cmlenz
date Tue, 29 May 2007 20:33:55 +0000
parents
children 50ad95bee876
rev   line source
1
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
1 # -*- coding: utf-8 -*-
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
2 #
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
3 # Copyright (C) 2007 Edgewall Software
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
4 # All rights reserved.
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
5 #
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
6 # This software is licensed as described in the file COPYING, which
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
7 # you should have received as part of this distribution. The terms
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
8 # are also available at http://babel.edgewall.org/wiki/License.
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
9 #
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
10 # This software consists of voluntary contributions made by many
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
11 # individuals. For the exact contribution history, see the revision
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
12 # history and logs, available at http://babel.edgewall.org/log/.
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
13
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
14 """Frontends for the message extraction functionality."""
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
15
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
16 from distutils import log
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
17 from distutils.cmd import Command
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
18 from optparse import OptionParser
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
19 import os
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
20 import sys
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
21
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
22 from babel import __version__ as VERSION
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
23 from babel.catalog.extract import extract_from_dir, KEYWORDS
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
24 from babel.catalog.pofile import write_po
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
25
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
26 __all__ = ['extract_messages', 'main']
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
27 __docformat__ = 'restructuredtext en'
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
28
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
29
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
30 class extract_messages(Command):
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
31 """Message extraction command for use in ``setup.py`` scripts.
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
32
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
33 If correctly installed, this command is available to Setuptools-using
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
34 setup scripts automatically. For projects using plain old ``distutils``,
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
35 the command needs to be registered explicitly in ``setup.py``::
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
36
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
37 from babel.catalog.frontend import extract_messages
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
38
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
39 setup(
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
40 ...
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
41 cmdclass = {'extract_messages': extract_messages}
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
42 )
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
43
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
44 :see: `Integrating new distutils commands <http://docs.python.org/dist/node32.html>`_
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
45 :see: `setuptools <http://peak.telecommunity.com/DevCenter/setuptools>`_
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
46 """
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
47
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
48 description = 'extract localizable strings from the project code'
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
49 user_options = [
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
50 ('charset=', None,
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
51 'charset to use in the output file'),
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
52 ('keywords=', 'k',
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
53 'comma-separated list of keywords to look for in addition to the '
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
54 'defaults'),
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
55 ('no-location', None,
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
56 'do not include location comments with filename and line number'),
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
57 ('omit-header', None,
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
58 'do not include msgid "" entry in header'),
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
59 ('output-file=', None,
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
60 'name of the output file'),
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
61 ]
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
62 boolean_options = ['no-location', 'omit-header']
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
63
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
64 def initialize_options(self):
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
65 self.charset = 'utf-8'
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
66 self.keywords = KEYWORDS
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
67 self.no_location = False
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
68 self.omit_header = False
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
69 self.output_file = None
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
70 self.input_dirs = None
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
71
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
72 def finalize_options(self):
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
73 if not self.input_dirs:
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
74 self.input_dirs = dict.fromkeys([k.split('.',1)[0]
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
75 for k in self.distribution.packages
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
76 ]).keys()
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
77 if isinstance(self.keywords, basestring):
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
78 new_keywords = [k.strip() for k in self.keywords.split(',')]
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
79 self.keywords = list(KEYWORDS) + new_keywords
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
80
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
81 def run(self):
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
82 outfile = open(self.output_file, 'w')
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
83 try:
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
84 messages = []
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
85 for dirname in self.input_dirs:
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
86 log.info('extracting messages from %r' % dirname)
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
87 extracted = extract_from_dir(dirname, keywords=self.keywords)
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
88 for filename, lineno, funcname, message in extracted:
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
89 messages.append((os.path.join(dirname, filename), lineno,
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
90 funcname, message))
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
91 write_po(outfile, messages, charset=self.charset,
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
92 no_location=self.no_location, omit_header=self.omit_header)
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
93 log.info('writing PO file to %s' % self.output_file)
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
94 finally:
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
95 outfile.close()
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
96
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
97
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
98 def main(argv=sys.argv):
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
99 """Command-line interface.
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
100
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
101 This function provides a simple command-line interface to the message
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
102 extraction and PO file generation functionality.
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
103
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
104 :param argv: list of arguments passed on the command-line
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
105 """
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
106 parser = OptionParser(usage='%prog [options] dirname1 <dirname2> ...',
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
107 version='%%prog %s' % VERSION)
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
108 parser.add_option('--charset', dest='charset', default='utf-8',
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
109 help='charset to use in the output')
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
110 parser.add_option('-k', '--keyword', dest='keywords',
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
111 default=list(KEYWORDS), action='append',
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
112 help='keywords to look for in addition to the defaults. '
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
113 'You can specify multiple -k flags on the command '
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
114 'line.')
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
115 parser.add_option('--no-location', dest='no_location', default=False,
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
116 action='store_true',
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
117 help='do not include location comments with filename and '
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
118 'line number')
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
119 parser.add_option('--omit-header', dest='omit_header', default=False,
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
120 action='store_true',
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
121 help='do not include msgid "" entry in header')
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
122 parser.add_option('-o', '--output', dest='output',
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
123 help='path to the output POT file')
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
124 options, args = parser.parse_args(argv[1:])
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
125 if not args:
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
126 parser.error('incorrect number of arguments')
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
127
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
128 if options.output not in (None, '-'):
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
129 outfile = open(options.output, 'w')
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
130 else:
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
131 outfile = sys.stdout
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
132
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
133 try:
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
134 messages = []
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
135 for dirname in args:
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
136 if not os.path.isdir(dirname):
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
137 parser.error('%r is not a directory' % dirname)
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
138 extracted = extract_from_dir(dirname, keywords=options.keywords)
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
139 for filename, lineno, funcname, message in extracted:
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
140 messages.append((os.path.join(dirname, filename), lineno,
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
141 funcname, message))
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
142 write_po(outfile, messages,
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
143 charset=options.charset, no_location=options.no_location,
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
144 omit_header=options.omit_header)
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
145 finally:
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
146 if options.output:
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
147 outfile.close()
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
148
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
149 if __name__ == '__main__':
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
150 main()
Copyright (C) 2012-2017 Edgewall Software