#!/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()