Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Lib/idlelib/NEWS.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ Released on 2019-??-??
======================================


bpo-35208: Squeezer now counts wrapped lines before newlines.

bpo-35555: Gray out Code Context menu entry when it's not applicable.

bpo-22703: Improve the Code Context and Zoom Height menu labels.
Expand Down
23 changes: 23 additions & 0 deletions Lib/idlelib/idle_test/test_squeezer.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from collections import namedtuple
from textwrap import dedent
from tkinter import Text, Tk
import unittest
from unittest.mock import Mock, NonCallableMagicMock, patch, sentinel, ANY
Expand Down Expand Up @@ -77,6 +78,28 @@ def test_tab_width(self):
self.check(expected=3, text='\t' * 6, linewidth=11, tabwidth=4)
self.check(expected=2, text='\t' * 6, linewidth=13, tabwidth=4)

def test_empty_lines(self):
self.check(expected=1, text='\n', linewidth=80, tabwidth=8)
self.check(expected=2, text='\n\n', linewidth=80, tabwidth=8)
self.check(expected=10, text='\n' * 10, linewidth=80, tabwidth=8)

def test_long_line(self):
self.check(expected=3, text='a' * 200, linewidth=80, tabwidth=8)
self.check(expected=3, text='a' * 200 + '\n', linewidth=80, tabwidth=8)

def test_several_lines_different_lengths(self):
text = dedent("""\
13 characters
43 is the number of characters on this line

7 chars
13 characters""")
self.check(expected=5, text=text, linewidth=80, tabwidth=8)
self.check(expected=5, text=text + '\n', linewidth=80, tabwidth=8)
self.check(expected=6, text=text, linewidth=40, tabwidth=8)
self.check(expected=7, text=text, linewidth=20, tabwidth=8)
self.check(expected=11, text=text, linewidth=10, tabwidth=8)


class SqueezerTest(unittest.TestCase):
"""Tests for the Squeezer class."""
Expand Down
22 changes: 10 additions & 12 deletions Lib/idlelib/squeezer.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,14 @@ def count_lines_with_wrapping(s, linewidth=80, tabwidth=8):

# deal with tab or newline
if s[pos] == '\n':
# Avoid the `current_column == 0` edge-case, and while we're at it,
# don't bother adding 0.
if current_column > linewidth:
# If the current column was exactly linewidth, divmod would give
# (1,0), even though a new line hadn't yet been started. The same
# is true if length is any exact multiple of linewidth. Therefore,
# subtract 1 before dividing a non-empty line.
linecount += (current_column - 1) // linewidth
linecount += 1
current_column = 0
else:
Expand All @@ -60,17 +68,6 @@ def count_lines_with_wrapping(s, linewidth=80, tabwidth=8):

pos += 1 # after the tab or newline

# avoid divmod(-1, linewidth)
if current_column > 0:
# If the length was exactly linewidth, divmod would give (1,0),
# even though a new line hadn't yet been started. The same is true
# if length is any exact multiple of linewidth. Therefore, subtract
# 1 before doing divmod, and later add 1 to the column to
# compensate.
lines, column = divmod(current_column - 1, linewidth)
linecount += lines
current_column = column + 1

# process remaining chars (no more tabs or newlines)
current_column += len(s) - pos
# avoid divmod(-1, linewidth)
Expand Down Expand Up @@ -106,7 +103,8 @@ def __init__(self, s, tags, numoflines, squeezer):
# before the iomark
self.base_text = editwin.per.bottom

button_text = "Squeezed text (%d lines)." % self.numoflines
line_plurality = "lines" if numoflines != 1 else "line"
button_text = f"Squeezed text ({numoflines} {line_plurality})."
tk.Button.__init__(self, text, text=button_text,
background="#FFFFC0", activebackground="#FFFFE0")

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Squeezer now properly counts wrapped lines before newlines.