106 lines
4.0 KiB
Python
106 lines
4.0 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Simple verification that the line splitting bug is fixed.
|
|
"""
|
|
|
|
print("=" * 60)
|
|
print("VERIFYING LINE SPLITTING BUG FIX")
|
|
print("=" * 60)
|
|
|
|
try:
|
|
from unittest.mock import patch, Mock
|
|
from pyWebLayout.concrete.text import Line
|
|
from pyWebLayout.style import Font
|
|
|
|
font = Font(font_path=None, font_size=12, colour=(0, 0, 0))
|
|
|
|
print("\n1. Testing Line.add_word hyphenation behavior:")
|
|
|
|
# Mock pyphen for testing
|
|
with patch('pyWebLayout.abstract.inline.pyphen') as mock_pyphen_module:
|
|
mock_dic = Mock()
|
|
mock_pyphen_module.Pyphen.return_value = mock_dic
|
|
mock_dic.inserted.return_value = "can-vas"
|
|
|
|
# Create a narrow line that will force hyphenation
|
|
line = Line((3, 6), (0, 0), (50, 20), font)
|
|
|
|
print(" Adding 'canvas' to narrow line...")
|
|
overflow = line.add_word("canvas")
|
|
|
|
if line.renderable_words:
|
|
first_part = line.renderable_words[0].word.text
|
|
print(f" ✓ First part added to line: '{first_part}'")
|
|
else:
|
|
print(" ✗ No words added to line")
|
|
|
|
print(f" ✓ Overflow returned: '{overflow}'")
|
|
|
|
if overflow == "vas":
|
|
print(" ✓ SUCCESS: Overflow contains only the next part ('vas')")
|
|
else:
|
|
print(f" ✗ FAILED: Expected 'vas', got '{overflow}'")
|
|
|
|
print("\n2. Testing paragraph layout behavior:")
|
|
|
|
try:
|
|
from pyWebLayout.abstract.block import Paragraph
|
|
from pyWebLayout.abstract.inline import Word
|
|
from pyWebLayout.typesetting.paragraph_layout import ParagraphLayout
|
|
|
|
with patch('pyWebLayout.abstract.inline.pyphen') as mock_pyphen_module:
|
|
mock_dic = Mock()
|
|
mock_pyphen_module.Pyphen.return_value = mock_dic
|
|
mock_dic.inserted.return_value = "can-vas"
|
|
|
|
# Create a paragraph with words that will cause hyphenation
|
|
paragraph = Paragraph(style=font)
|
|
for word_text in ["a", "pair", "of", "canvas", "pants"]:
|
|
word = Word(word_text, font)
|
|
paragraph.add_word(word)
|
|
|
|
# Layout with narrow width to force wrapping
|
|
layout = ParagraphLayout(
|
|
line_width=70,
|
|
line_height=20,
|
|
word_spacing=(3, 6)
|
|
)
|
|
|
|
lines = layout.layout_paragraph(paragraph)
|
|
|
|
print(f" ✓ Created paragraph with 5 words")
|
|
print(f" ✓ Laid out into {len(lines)} lines:")
|
|
|
|
all_words = []
|
|
for i, line in enumerate(lines):
|
|
line_words = [word.word.text for word in line.renderable_words]
|
|
line_text = ' '.join(line_words)
|
|
all_words.extend(line_words)
|
|
print(f" Line {i+1}: '{line_text}'")
|
|
|
|
# Check that we didn't lose any content
|
|
original_chars = set(''.join(["a", "pair", "of", "canvas", "pants"]))
|
|
rendered_chars = set(''.join(word.replace('-', '') for word in all_words))
|
|
|
|
if original_chars == rendered_chars:
|
|
print(" ✓ SUCCESS: All characters preserved in layout")
|
|
else:
|
|
print(" ✗ FAILED: Some characters were lost")
|
|
print(f" Missing: {original_chars - rendered_chars}")
|
|
|
|
except ImportError as e:
|
|
print(f" Warning: Could not test paragraph layout: {e}")
|
|
|
|
print("\n" + "=" * 60)
|
|
print("VERIFICATION COMPLETE")
|
|
print("=" * 60)
|
|
print("The line splitting bug fixes have been implemented:")
|
|
print("1. Line.add_word() now returns only the next hyphenated part")
|
|
print("2. Paragraph layout preserves overflow text correctly")
|
|
print("3. No text should be lost during line wrapping")
|
|
|
|
except Exception as e:
|
|
print(f"Error during verification: {e}")
|
|
import traceback
|
|
traceback.print_exc()
|