mirror of
https://github.com/python/cpython.git
synced 2025-07-24 11:44:31 +00:00
More internal refinements of the ascii splitting algorithm.
_encode_chunks(): Pass maxlinelen in instead of always using self._maxlinelen, so we can adjust for shorter initial lines. Pass this value through to _max_append(). encode(): Weave maxlinelen through to the _encode_chunks() call. _split_ascii(): When recursively splitting a line on spaces (i.e. lower level syntactic split), don't append the whole returned string. Instead, split it on linejoiners and extend the lines up to the last line (for proper packing). Calculate the linelen based on the last element in the this list.
This commit is contained in:
parent
c4d6bdd58a
commit
9f3fcd9c23
1 changed files with 10 additions and 7 deletions
|
@ -342,7 +342,7 @@ class Header:
|
|||
lines = line.splitlines()
|
||||
return zip(lines, [charset]*len(lines))
|
||||
|
||||
def _encode_chunks(self, newchunks):
|
||||
def _encode_chunks(self, newchunks, maxlinelen):
|
||||
# MIME-encode a header with many different charsets and/or encodings.
|
||||
#
|
||||
# Given a list of pairs (string, charset), return a MIME-encoded
|
||||
|
@ -367,7 +367,7 @@ class Header:
|
|||
s = header
|
||||
else:
|
||||
s = charset.header_encode(header)
|
||||
_max_append(chunks, s, self._maxlinelen, ' ')
|
||||
_max_append(chunks, s, maxlinelen, ' ')
|
||||
joiner = NL + self._continuation_ws
|
||||
return joiner.join(chunks)
|
||||
|
||||
|
@ -407,11 +407,12 @@ class Header:
|
|||
newchunks += self._split(s, charset, targetlen, splitchars)
|
||||
lastchunk, lastcharset = newchunks[-1]
|
||||
lastlen = lastcharset.encoded_header_len(lastchunk)
|
||||
return self._encode_chunks(newchunks)
|
||||
return self._encode_chunks(newchunks, maxlinelen)
|
||||
|
||||
|
||||
|
||||
def _split_ascii(s, firstlen, restlen, continuation_ws, splitchars):
|
||||
linejoiner = '\n' + continuation_ws
|
||||
lines = []
|
||||
maxlen = firstlen
|
||||
for line in s.splitlines():
|
||||
|
@ -460,11 +461,14 @@ def _split_ascii(s, firstlen, restlen, continuation_ws, splitchars):
|
|||
# splitting on whitespace, try to recursively split this line
|
||||
# on whitespace.
|
||||
if partlen > maxlen and ch <> ' ':
|
||||
this = [_split_ascii(part, maxlen, restlen,
|
||||
continuation_ws, ' ')]
|
||||
subs = _split_ascii(part, maxlen, restlen,
|
||||
continuation_ws, ' ')
|
||||
subl = re.split(linejoiner, subs)
|
||||
lines.extend(subl[:-1])
|
||||
this = [subl[-1]]
|
||||
else:
|
||||
this = [part]
|
||||
linelen = wslen + partlen
|
||||
linelen = wslen + len(this[-1])
|
||||
maxlen = restlen
|
||||
else:
|
||||
this.append(part)
|
||||
|
@ -472,7 +476,6 @@ def _split_ascii(s, firstlen, restlen, continuation_ws, splitchars):
|
|||
# Put any left over parts on a line by themselves
|
||||
if this:
|
||||
lines.append(joiner.join(this))
|
||||
linejoiner = '\n' + continuation_ws
|
||||
return linejoiner.join(lines)
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue