122 lines
3.6 KiB
Python
122 lines
3.6 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Simple Table Text Wrapping Example
|
|
|
|
A minimal example showing text wrapping in table cells.
|
|
Perfect for quick testing and demonstration.
|
|
"""
|
|
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
# Add pyWebLayout to path
|
|
sys.path.insert(0, str(Path(__file__).parent.parent))
|
|
|
|
from pyWebLayout.io.readers.html_extraction import parse_html_string
|
|
from pyWebLayout.layout.document_layouter import DocumentLayouter
|
|
from pyWebLayout.style.page_style import PageStyle
|
|
from pyWebLayout.style import Font
|
|
from pyWebLayout.concrete.table import TableStyle
|
|
from pyWebLayout.concrete.page import Page
|
|
from pyWebLayout.abstract.block import Table
|
|
|
|
|
|
def main():
|
|
"""Create a simple table with text wrapping."""
|
|
print("\nSimple Table Text Wrapping Example")
|
|
print("=" * 50)
|
|
|
|
# HTML with a table containing long text
|
|
html = """
|
|
<table>
|
|
<caption>Text Wrapping Demonstration</caption>
|
|
<thead>
|
|
<tr>
|
|
<th>Column 1</th>
|
|
<th>Column 2</th>
|
|
<th>Column 3</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td>This is a cell with quite a lot of text that will need to wrap across multiple lines.</td>
|
|
<td>Short text</td>
|
|
<td>Another cell with enough content to demonstrate the automatic line wrapping functionality.</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Cell A</td>
|
|
<td>This middle cell contains a paragraph with several words that should wrap nicely within the available space.</td>
|
|
<td>Cell C</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Words like supercalifragilisticexpialidocious might need hyphenation.</td>
|
|
<td>Normal text</td>
|
|
<td>The wrapping algorithm handles both regular word wrapping and hyphenation seamlessly.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
"""
|
|
|
|
print("\n Parsing HTML and creating table...")
|
|
|
|
# Parse HTML
|
|
base_font = Font(font_size=12)
|
|
blocks = parse_html_string(html, base_font=base_font)
|
|
|
|
# Find table
|
|
table = None
|
|
for block in blocks:
|
|
if isinstance(block, Table):
|
|
table = block
|
|
break
|
|
|
|
if not table:
|
|
print(" ✗ No table found!")
|
|
return
|
|
|
|
print(" ✓ Table parsed successfully")
|
|
|
|
# Create page
|
|
page_style = PageStyle(
|
|
padding=(30, 30, 30, 30),
|
|
background_color=(255, 255, 255)
|
|
)
|
|
page = Page(size=(800, 600), style=page_style)
|
|
|
|
# Create table style
|
|
table_style = TableStyle(
|
|
border_width=2,
|
|
border_color=(70, 130, 180),
|
|
cell_padding=(10, 10, 10, 10),
|
|
header_bg_color=(176, 196, 222),
|
|
cell_bg_color=(245, 250, 255)
|
|
)
|
|
|
|
print(" Rendering table with text wrapping...")
|
|
|
|
# Layout and render
|
|
layouter = DocumentLayouter(page)
|
|
layouter.layout_table(table, style=table_style)
|
|
|
|
# Get rendered image
|
|
_ = page.draw
|
|
img = page._canvas
|
|
|
|
# Save output
|
|
output_path = Path(__file__).parent.parent / 'docs' / 'images' / 'example_11b_simple_wrapping.png'
|
|
output_path.parent.mkdir(parents=True, exist_ok=True)
|
|
img.save(str(output_path))
|
|
|
|
print(f"\n✓ Example completed!")
|
|
print(f" Output saved to: {output_path}")
|
|
print(f" Image size: {img.width}x{img.height} pixels")
|
|
print(f"\n The table demonstrates:")
|
|
print(f" • Automatic line wrapping in cells")
|
|
print(f" • Proper word spacing and alignment")
|
|
print(f" • Hyphenation for very long words")
|
|
print(f" • Multi-line text within cell boundaries")
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|