]> git.ipfire.org Git - thirdparty/babel.git/commitdiff
Optimize keyword parsing
authorAarni Koskela <akx@iki.fi>
Mon, 17 Mar 2025 11:06:12 +0000 (13:06 +0200)
committerAarni Koskela <akx@iki.fi>
Fri, 21 Mar 2025 06:23:57 +0000 (08:23 +0200)
babel/messages/pofile.py

index 02f1e64f564a9f5710554a37e7e5a28bc2715d77..ff6e23522b93ace7f08d8bbd230a3747db913071 100644 (file)
@@ -155,13 +155,6 @@ class PoFileParser:
     See `read_po` for simple cases.
     """
 
-    _keywords = [
-        'msgid',
-        'msgstr',
-        'msgctxt',
-        'msgid_plural',
-    ]
-
     def __init__(self, catalog: Catalog, ignore_obsolete: bool = False, abort_invalid: bool = False) -> None:
         self.catalog = catalog
         self.ignore_obsolete = ignore_obsolete
@@ -228,17 +221,7 @@ class PoFileParser:
             self._process_keyword_line(lineno, line, obsolete)
 
     def _process_keyword_line(self, lineno, line, obsolete=False) -> None:
-
-        for keyword in self._keywords:
-            try:
-                if line.startswith(keyword) and line[len(keyword)] in [' ', '[']:
-                    arg = line[len(keyword):]
-                    break
-            except IndexError:
-                self._invalid_pofile(line, lineno, "Keyword must be followed by a string")
-        else:
-            self._invalid_pofile(line, lineno, "Start of line didn't match any expected keyword.")
-            return
+        keyword, _, arg = line.partition(' ')
 
         if keyword in ['msgid', 'msgctxt']:
             self._finish_current_message()
@@ -254,22 +237,23 @@ class PoFileParser:
             self.in_msgctxt = False
             self.in_msgid = True
             self.messages.append(_NormalizedString(arg))
+            return
+
+        if keyword == 'msgctxt':
+            self.in_msgctxt = True
+            self.context = _NormalizedString(arg)
+            return
 
-        elif keyword == 'msgstr':
+        if keyword == 'msgstr' or keyword.startswith('msgstr['):
             self.in_msgid = False
             self.in_msgstr = True
-            if arg.startswith('['):
-                idx, msg = arg[1:].split(']', 1)
-                idx = int(idx)
-            else:
-                idx = 0
-                msg = arg
-            s = _NormalizedString(msg) if msg != '""' else _NormalizedString()
+            kwarg, has_bracket, idxarg = keyword.partition('[')
+            idx = int(idxarg[:-1]) if has_bracket else 0
+            s = _NormalizedString(arg) if arg != '""' else _NormalizedString()
             self.translations.append([idx, s])
+            return
 
-        elif keyword == 'msgctxt':
-            self.in_msgctxt = True
-            self.context = _NormalizedString(arg)
+        self._invalid_pofile(line, lineno, "Unknown or misformatted keyword")
 
     def _process_string_continuation_line(self, line, lineno) -> None:
         if self.in_msgid: