encode(): Fixed the handling of soft line breaks for lines over 76
characters in length. Remember that when calculating the soft breaks, the trailing `=' sign counts against the max length!
This commit is contained in:
parent
fb3e54fd99
commit
dac67ac8bf
|
@ -48,7 +48,6 @@ def encode(input, output, quotetabs):
|
||||||
output.write(s + lineEnd)
|
output.write(s + lineEnd)
|
||||||
|
|
||||||
prevline = None
|
prevline = None
|
||||||
linelen = 0
|
|
||||||
while 1:
|
while 1:
|
||||||
line = input.readline()
|
line = input.readline()
|
||||||
if not line:
|
if not line:
|
||||||
|
@ -59,25 +58,24 @@ def encode(input, output, quotetabs):
|
||||||
if line[-1:] == '\n':
|
if line[-1:] == '\n':
|
||||||
line = line[:-1]
|
line = line[:-1]
|
||||||
stripped = '\n'
|
stripped = '\n'
|
||||||
|
# Calculate the un-length-limited encoded line
|
||||||
for c in line:
|
for c in line:
|
||||||
if needsquoting(c, quotetabs):
|
if needsquoting(c, quotetabs):
|
||||||
c = quote(c)
|
c = quote(c)
|
||||||
# Have we hit the RFC 1521 encoded line maximum?
|
|
||||||
if linelen + len(c) >= MAXLINESIZE:
|
|
||||||
# Write out the previous line
|
|
||||||
if prevline is not None:
|
|
||||||
write(prevline)
|
|
||||||
prevline = EMPTYSTRING.join(outline)
|
|
||||||
linelen = 0
|
|
||||||
outline = []
|
|
||||||
outline.append(c)
|
outline.append(c)
|
||||||
linelen += len(c)
|
# First, write out the previous line
|
||||||
# Write out the current line
|
|
||||||
if prevline is not None:
|
if prevline is not None:
|
||||||
write(prevline)
|
write(prevline)
|
||||||
prevline = EMPTYSTRING.join(outline)
|
# Now see if we need any soft line breaks because of RFC-imposed
|
||||||
linelen = 0
|
# length limitations. Then do the thisline->prevline dance.
|
||||||
outline = []
|
thisline = EMPTYSTRING.join(outline)
|
||||||
|
while len(thisline) > MAXLINESIZE:
|
||||||
|
# Don't forget to include the soft line break `=' sign in the
|
||||||
|
# length calculation!
|
||||||
|
write(thisline[:MAXLINESIZE-1], lineEnd='=\n')
|
||||||
|
thisline = thisline[MAXLINESIZE-1:]
|
||||||
|
# Write out the current line
|
||||||
|
prevline = thisline
|
||||||
# Write out the last line, without a trailing newline
|
# Write out the last line, without a trailing newline
|
||||||
if prevline is not None:
|
if prevline is not None:
|
||||||
write(prevline, lineEnd=stripped)
|
write(prevline, lineEnd=stripped)
|
||||||
|
|
Loading…
Reference in New Issue