Index: CookHeaders.py
===================================================================
RCS file: /cvsroot/mailman/mailman/Mailman/Handlers/CookHeaders.py,v
retrieving revision 2.9
diff -u -r2.9 CookHeaders.py
--- CookHeaders.py	2001/12/19 07:01:49	2.9
+++ CookHeaders.py	2002/02/04 07:07:38
@@ -19,6 +19,8 @@
 
 import re
 
+from email.Charset import Charset
+from email.Header import Header, decode_header
 import email.Utils
 
 from Mailman import mm_cfg
@@ -28,8 +30,8 @@
 
 CONTINUATION = ',\n\t'
 COMMASPACE = ', '
+MAXLINELEN = 78
 
-
 
 def process(mlist, msg, msgdata):
     # Set the "X-Ack: no" header if noack flag is set.
@@ -51,13 +53,37 @@
         # such as the list admin).  We assume all digests have an appropriate
         # subject header added by the ToDigest module.
         prefix = mlist.subject_prefix
+        # The header may be multilingual; decode it from base64/quopri and
+        # search each chunk for the prefix.
+        has_prefix = 0
+        if prefix and subject:
+            for s, e in decode_header(msg['subject']):
+                if re.search(re.escape(prefix.strip()), s, re.I):
+                    has_prefix = 1
+        cset = Charset(Utils.GetCharSet(mlist.preferred_language))
         # We purposefully leave no space b/w prefix and subject!
         if not subject:
             del msg['subject']
-            msg['Subject'] = prefix + _('(no subject)')
-        elif prefix and not re.search(re.escape(prefix), subject, re.I):
+            new_subject = Header(prefix + _('(no subject)'),
+                                 cset, header_name="Subject")
+            msg['Subject'] = new_subject.encode()
+        elif prefix and not has_prefix:
             del msg['subject']
-            msg['Subject'] = prefix + subject
+            # We'll encode the new prefix (just in case) but leave the old
+            # subject alone, in case it was already encoded.
+            new_subject = Header(prefix, cset, header_name="Subject").encode()
+            # If we go over 76 characters with the prefix, just put the
+            # old subject on its own line.
+            first = subject.split("\n")[0]
+            if len(new_subject + first) + 1 >= MAXLINELEN - len("Subject: "):
+                new_subject += '\n '
+            # We might have to add a space because the prefix and old
+            # subject may both be MIME-encoded, losing the space at
+            # the end of the prefix.
+            elif new_subject[-1] <> ' ':
+                new_subject += ' '
+            new_subject += subject
+            msg['Subject'] = new_subject
     # get rid of duplicate headers
     del msg['sender']
     del msg['errors-to']
