annotate roundup/cgi/TAL/talgettext.py @ 8519:19152fd94fcf

bug: move import findargspec out of Permission __init__ method We have a few places where imports are done inside a method/function. For methods that are called once it's not an issue but the Permissions __init__ method is called often and accounts for > 10% of the time in the __init__ function when looking at wsgi-lineprof output. So move it to the module level.
author John Rouillard <rouilj@ieee.org>
date Mon, 02 Feb 2026 23:41:36 -0500
parents f2fade4552c5
children 9c3ec0a5c7fc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2352
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
1 #!/usr/bin/env python
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
2 ##############################################################################
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
3 #
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
4 # Copyright (c) 2002 Zope Corporation and Contributors.
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
5 # All Rights Reserved.
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
6 #
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
7 # This software is subject to the provisions of the Zope Public License,
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
8 # Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution.
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
9 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
10 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
11 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
12 # FOR A PARTICULAR PURPOSE.
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
13 #
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
14 ##############################################################################
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
15 # Modifications for Roundup:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
16 # 1. commented out ITALES references
2385
85cbfc4a5946 escape newlines
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2382
diff changeset
17 # 2. escape quotes and line feeds in msgids
2802
e816a232f988 don't collect empty msgids
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2385
diff changeset
18 # 3. don't collect empty msgids
2352
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
19
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
20 """Program to extract internationalization markup from Page Templates.
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
21
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
22 Once you have marked up a Page Template file with i18n: namespace tags, use
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
23 this program to extract GNU gettext .po file entries.
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
24
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
25 Usage: talgettext.py [options] files
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
26 Options:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
27 -h / --help
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
28 Print this message and exit.
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
29 -o / --output <file>
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
30 Output the translation .po file to <file>.
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
31 -u / --update <file>
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
32 Update the existing translation <file> with any new translation strings
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
33 found.
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
34 """
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
35
5376
64b05e24dbd8 Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5248
diff changeset
36 from __future__ import print_function
2352
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
37 import sys
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
38 import time
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
39 import getopt
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
40 import traceback
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
41
4572
3a407f0d5dad Add import for version info
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4570
diff changeset
42 from roundup import __version__
2352
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
43 from roundup.cgi.TAL.HTMLTALParser import HTMLTALParser
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
44 from roundup.cgi.TAL.TALInterpreter import TALInterpreter
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
45 from roundup.cgi.TAL.DummyEngine import DummyEngine
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
46 #from ITALES import ITALESEngine
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
47 from roundup.cgi.TAL.TALDefs import TALESError
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
48
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
49 pot_header = '''\
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
50 # SOME DESCRIPTIVE TITLE.
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
51 # Copyright (C) YEAR ORGANIZATION
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
52 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
53 #
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
54 msgid ""
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
55 msgstr ""
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
56 "Project-Id-Version: PACKAGE VERSION\\n"
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
57 "POT-Creation-Date: %(time)s\\n"
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
58 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\\n"
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
59 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\\n"
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
60 "Language-Team: LANGUAGE <LL@li.org>\\n"
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
61 "MIME-Version: 1.0\\n"
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
62 "Content-Type: text/plain; charset=CHARSET\\n"
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
63 "Content-Transfer-Encoding: ENCODING\\n"
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
64 "Generated-By: talgettext.py %(version)s\\n"
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
65 '''
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
66
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
67 NLSTR = '"\n"'
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
68
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
69 def usage(code, msg=''):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
70 # Python 2.1 required
5376
64b05e24dbd8 Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5248
diff changeset
71 print(__doc__, file=sys.stderr)
2352
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
72 if msg:
5376
64b05e24dbd8 Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5248
diff changeset
73 print(msg, file=sys.stderr)
2352
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
74 sys.exit(code)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
75
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
76
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
77 class POTALInterpreter(TALInterpreter):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
78 def translate(self, msgid, default, i18ndict=None, obj=None):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
79 # XXX is this right?
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
80 if i18ndict is None:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
81 i18ndict = {}
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
82 if obj:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
83 i18ndict.update(obj)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
84 # XXX Mmmh, it seems that sometimes the msgid is None; is that really
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
85 # possible?
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
86 if msgid is None:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
87 return None
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
88 # XXX We need to pass in one of context or target_language
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
89 return self.engine.translate(msgid, self.i18nContext.domain, i18ndict,
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
90 position=self.position, default=default)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
91
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
92
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
93 class POEngine(DummyEngine):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
94 #__implements__ = ITALESEngine
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
95
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
96 def __init__(self, macros=None):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
97 self.catalog = {}
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
98 DummyEngine.__init__(self, macros)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
99
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
100 def evaluate(*args):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
101 return '' # who cares
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
102
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
103 def evaluatePathOrVar(*args):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
104 return '' # who cares
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
105
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
106 def evaluateSequence(self, expr):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
107 return (0,) # dummy
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
108
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
109 def evaluateBoolean(self, expr):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
110 return True # dummy
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
111
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
112 def translate(self, msgid, domain=None, mapping=None, default=None,
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
113 # XXX position is not part of the ITALESEngine
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
114 # interface
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
115 position=None):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
116
2802
e816a232f988 don't collect empty msgids
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2385
diff changeset
117 if not msgid: return 'x'
e816a232f988 don't collect empty msgids
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2385
diff changeset
118
2352
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
119 if domain not in self.catalog:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
120 self.catalog[domain] = {}
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
121 domain = self.catalog[domain]
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
122
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
123 if msgid not in domain:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
124 domain[msgid] = []
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
125 domain[msgid].append((self.file, position))
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
126 return 'x'
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
127
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
128
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
129 class UpdatePOEngine(POEngine):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
130 """A slightly-less braindead POEngine which supports loading an existing
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
131 .po file first."""
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
132
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
133 def __init__ (self, macros=None, filename=None):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
134 POEngine.__init__(self, macros)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
135
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
136 self._filename = filename
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
137 self._loadFile()
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
138 self.base = self.catalog
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
139 self.catalog = {}
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
140
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
141 def __add(self, id, s, fuzzy):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
142 "Add a non-fuzzy translation to the dictionary."
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
143 if not fuzzy and str:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
144 # check for multi-line values and munge them appropriately
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
145 if '\n' in s:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
146 lines = s.rstrip().split('\n')
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
147 s = NLSTR.join(lines)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
148 self.catalog[id] = s
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
149
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
150 def _loadFile(self):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
151 # shamelessly cribbed from Python's Tools/i18n/msgfmt.py
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
152 # 25-Mar-2003 Nathan R. Yergler (nathan@zope.org)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
153 # 14-Apr-2003 Hacked by Barry Warsaw (barry@zope.com)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
154
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
155 ID = 1
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
156 STR = 2
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
157
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
158 try:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
159 lines = open(self._filename).readlines()
5248
198b6e810c67 Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents: 4572
diff changeset
160 except IOError as msg:
5376
64b05e24dbd8 Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5248
diff changeset
161 print(msg, file=sys.stderr)
2352
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
162 sys.exit(1)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
163
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
164 section = None
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
165 fuzzy = False
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
166
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
167 # Parse the catalog
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
168 lno = 0
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
169 for l in lines:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
170 lno += True
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
171 # If we get a comment line after a msgstr, this is a new entry
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
172 if l[0] == '#' and section == STR:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
173 self.__add(msgid, msgstr, fuzzy)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
174 section = None
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
175 fuzzy = False
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
176 # Record a fuzzy mark
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
177 if l[:2] == '#,' and l.find('fuzzy'):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
178 fuzzy = True
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
179 # Skip comments
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
180 if l[0] == '#':
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
181 continue
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
182 # Now we are in a msgid section, output previous section
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
183 if l.startswith('msgid'):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
184 if section == STR:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
185 self.__add(msgid, msgstr, fuzzy)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
186 section = ID
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
187 l = l[5:]
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
188 msgid = msgstr = ''
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
189 # Now we are in a msgstr section
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
190 elif l.startswith('msgstr'):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
191 section = STR
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
192 l = l[6:]
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
193 # Skip empty lines
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
194 if not l.strip():
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
195 continue
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
196 # XXX: Does this always follow Python escape semantics?
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
197 l = eval(l)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
198 if section == ID:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
199 msgid += l
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
200 elif section == STR:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
201 msgstr += '%s\n' % l
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
202 else:
5376
64b05e24dbd8 Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5248
diff changeset
203 print('Syntax error on %s:%d' % (infile, lno),
64b05e24dbd8 Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5248
diff changeset
204 'before:', file=sys.stderr)
64b05e24dbd8 Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5248
diff changeset
205 print(l, file=sys.stderr)
2352
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
206 sys.exit(1)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
207 # Add last entry
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
208 if section == STR:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
209 self.__add(msgid, msgstr, fuzzy)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
210
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
211 def evaluate(self, expression):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
212 try:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
213 return POEngine.evaluate(self, expression)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
214 except TALESError:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
215 pass
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
216
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
217 def evaluatePathOrVar(self, expr):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
218 return 'who cares'
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
219
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
220 def translate(self, msgid, domain=None, mapping=None, default=None,
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
221 position=None):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
222 if msgid not in self.base:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
223 POEngine.translate(self, msgid, domain, mapping, default, position)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
224 return 'x'
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
225
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
226
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
227 def main():
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
228 try:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
229 opts, args = getopt.getopt(
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
230 sys.argv[1:],
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
231 'ho:u:',
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
232 ['help', 'output=', 'update='])
5248
198b6e810c67 Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents: 4572
diff changeset
233 except getopt.error as msg:
2352
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
234 usage(1, msg)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
235
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
236 outfile = None
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
237 engine = None
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
238 update_mode = False
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
239 for opt, arg in opts:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
240 if opt in ('-h', '--help'):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
241 usage(0)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
242 elif opt in ('-o', '--output'):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
243 outfile = arg
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
244 elif opt in ('-u', '--update'):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
245 update_mode = True
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
246 if outfile is None:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
247 outfile = arg
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
248 engine = UpdatePOEngine(filename=arg)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
249
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
250 if not args:
5376
64b05e24dbd8 Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5248
diff changeset
251 print('nothing to do')
2352
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
252 return
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
253
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
254 # We don't care about the rendered output of the .pt file
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
255 class Devnull:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
256 def write(self, s):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
257 pass
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
258
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
259 # check if we've already instantiated an engine;
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
260 # if not, use the stupidest one available
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
261 if not engine:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
262 engine = POEngine()
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
263
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
264 # process each file specified
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
265 for filename in args:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
266 try:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
267 engine.file = filename
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
268 p = HTMLTALParser()
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
269 p.parseFile(filename)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
270 program, macros = p.getCode()
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
271 POTALInterpreter(program, macros, engine, stream=Devnull(),
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
272 metal=False)()
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
273 except: # Hee hee, I love bare excepts!
5376
64b05e24dbd8 Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5248
diff changeset
274 print('There was an error processing', filename)
2352
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
275 traceback.print_exc()
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
276
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
277 # Now output the keys in the engine. Write them to a file if --output or
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
278 # --update was specified; otherwise use standard out.
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
279 if (outfile is None):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
280 outfile = sys.stdout
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
281 else:
5383
6fbb7d52e38f Python 3 preparation: use open() instead of file().
Joseph Myers <jsm@polyomino.org.uk>
parents: 5376
diff changeset
282 outfile = open(outfile, update_mode and "a" or "w")
2352
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
283
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
284 catalog = {}
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
285 for domain in engine.catalog.keys():
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
286 catalog.update(engine.catalog[domain])
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
287
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
288 messages = catalog.copy()
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
289 try:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
290 messages.update(engine.base)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
291 except AttributeError:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
292 pass
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
293 if '' not in messages:
5376
64b05e24dbd8 Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5248
diff changeset
294 print(pot_header % {'time': time.ctime(),
64b05e24dbd8 Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5248
diff changeset
295 'version': __version__}, file=outfile)
2352
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
296
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
297 # XXX: You should not sort by msgid, but by filename and position. (SR)
5395
23b8e6067f7c Python 3 preparation: update calls to dict methods.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5383
diff changeset
298 msgids = sorted(catalog.keys())
2352
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
299 for msgid in msgids:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
300 positions = catalog[msgid]
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
301 for filename, position in positions:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
302 outfile.write('#: %s:%s\n' % (filename, position[0]))
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
303
2385
85cbfc4a5946 escape newlines
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2382
diff changeset
304 outfile.write('msgid "%s"\n'
85cbfc4a5946 escape newlines
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2382
diff changeset
305 % msgid.replace('"', '\\"').replace("\n", '\\n"\n"'))
2352
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
306 outfile.write('msgstr ""\n')
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
307 outfile.write('\n')
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
308
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
309
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
310 if __name__ == '__main__':
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
311 main()

Roundup Issue Tracker: http://roundup-tracker.org/