summaryrefslogtreecommitdiff
path: root/sphinx/builders
diff options
context:
space:
mode:
authorRobert Lehmann <mail@robertlehmann.de>2011-07-06 08:25:25 +0200
committerRobert Lehmann <mail@robertlehmann.de>2011-07-06 08:25:25 +0200
commitd52b544a3e40ce2fa8a57502a9af9e9895b13292 (patch)
tree88d93e0d0dbbca5b7c9b25e9a3296b18927cfdf6 /sphinx/builders
parentfdf0755fcb251ac1e6d4b6ead86266286138f611 (diff)
downloadsphinx-d52b544a3e40ce2fa8a57502a9af9e9895b13292.tar.gz
Close #630: Revamp data structures used for message catalogs.
Diffstat (limited to 'sphinx/builders')
-rw-r--r--sphinx/builders/gettext.py22
1 files changed, 16 insertions, 6 deletions
diff --git a/sphinx/builders/gettext.py b/sphinx/builders/gettext.py
index 89703e72..47336cad 100644
--- a/sphinx/builders/gettext.py
+++ b/sphinx/builders/gettext.py
@@ -43,6 +43,17 @@ msgstr ""
"""[1:]
+class Catalog(object):
+ def __init__(self):
+ self.messages = [] # retain order
+ self.metadata = {} # msgid -> file, line, uid
+ def add(self, msg, origin):
+ if msg not in self.metadata: # faster lookup in hash
+ self.messages.append(msg)
+ self.metadata[msg] = []
+ self.metadata[msg].append((origin.source, origin.line, origin.uid))
+
+
class I18nBuilder(Builder):
"""
General i18n builder.
@@ -52,7 +63,7 @@ class I18nBuilder(Builder):
def init(self):
Builder.init(self)
- self.catalogs = defaultdict(dict)
+ self.catalogs = defaultdict(Catalog)
def get_target_uri(self, docname, typ=None):
return ''
@@ -71,9 +82,7 @@ class I18nBuilder(Builder):
continue # built-in message
if isinstance(node, nodes.literal_block):
continue
- if not msg in catalog:
- catalog[msg] = []
- catalog[msg].append((node.source, node.line, node.uid))
+ catalog.add(msg, node)
class MessageCatalogBuilder(I18nBuilder):
@@ -91,7 +100,7 @@ class MessageCatalogBuilder(I18nBuilder):
# XXX should supply tz
ctime = datetime.now().strftime('%Y-%m-%d %H:%M%z'),
)
- for section, messages in self.status_iterator(
+ for section, catalog in self.status_iterator(
self.catalogs.iteritems(), "writing message catalogs... ",
lambda (section, _):darkgreen(section), len(self.catalogs)):
@@ -99,7 +108,8 @@ class MessageCatalogBuilder(I18nBuilder):
pofile = open(pofn, 'w', encoding='utf-8')
try:
pofile.write(POHEADER % data)
- for message, positions in messages.iteritems():
+ for message in catalog.messages:
+ positions = catalog.metadata[message]
if positions:
# generate "#: file1:line1 file2:line2 ..."
pofile.write(u"#: %s\n" % ", ".join("%s:%s" %