pyWebLayout/examples/08_bundled_fonts_demo.py
Duncan Tourolle 2b14517344
All checks were successful
Python CI / test (3.10) (push) Successful in 2m2s
Python CI / test (3.12) (push) Successful in 1m52s
Python CI / test (3.13) (push) Successful in 1m47s
adding more fonts
2025-11-09 21:17:26 +01:00

228 lines
7.6 KiB
Python

"""
Demonstration of bundled fonts in pyWebLayout.
This example shows:
1. How to use the bundled DejaVu font families
2. Different font variants (regular, bold, italic, bold-italic)
3. The three font families (Sans, Serif, Monospace)
4. Convenient Font.from_family() method for easy font selection
The demo creates a page showcasing all bundled fonts with different styles.
"""
from pyWebLayout.concrete import Page
from pyWebLayout.abstract import Paragraph, Word
from pyWebLayout.style import Font, FontWeight, FontStyle, BundledFont
from pyWebLayout.style.page_style import PageStyle
from pyWebLayout.layout.document_layouter import DocumentLayouter
def create_font_showcase_page():
"""
Create a page demonstrating all bundled fonts and variants.
"""
# Create page with some padding
page = Page(size=(800, 1000), style=PageStyle(border_width=20))
layouter = DocumentLayouter(page)
# Title
title_font = Font.from_family(
BundledFont.SANS,
font_size=32,
colour=(0, 0, 100),
weight=FontWeight.BOLD
)
title = Paragraph(title_font)
title.add_word(Word("Bundled", title_font))
title.add_word(Word("Fonts", title_font))
title.add_word(Word("Showcase", title_font))
layouter.layout_paragraph(title)
page._current_y_offset += 20
# Introduction
intro_font = Font.from_family(BundledFont.SANS, font_size=14, colour=(50, 50, 50))
intro = Paragraph(intro_font)
intro_text = "pyWebLayout bundles the DejaVu font family with three font types and four variants each."
for word in intro_text.split():
intro.add_word(Word(word, intro_font))
layouter.layout_paragraph(intro)
page._current_y_offset += 25
# --- Sans Serif Section ---
section_font = Font.from_family(
BundledFont.SANS,
font_size=20,
colour=(0, 100, 0),
weight=FontWeight.BOLD
)
sans_section = Paragraph(section_font)
sans_section.add_word(Word("Sans-Serif", section_font))
sans_section.add_word(Word("(DejaVu", section_font))
sans_section.add_word(Word("Sans)", section_font))
layouter.layout_paragraph(sans_section)
page._current_y_offset += 10
# Sans Regular
sans_regular = Font.from_family(BundledFont.SANS, font_size=16)
demo_text_paragraph(layouter, page, sans_regular, "Regular:")
# Sans Bold
sans_bold = Font.from_family(BundledFont.SANS, font_size=16, weight=FontWeight.BOLD)
demo_text_paragraph(layouter, page, sans_bold, "Bold:")
# Sans Italic
sans_italic = Font.from_family(BundledFont.SANS, font_size=16, style=FontStyle.ITALIC)
demo_text_paragraph(layouter, page, sans_italic, "Italic:")
# Sans Bold Italic
sans_bold_italic = Font.from_family(
BundledFont.SANS,
font_size=16,
weight=FontWeight.BOLD,
style=FontStyle.ITALIC
)
demo_text_paragraph(layouter, page, sans_bold_italic, "Bold Italic:")
page._current_y_offset += 20
# --- Serif Section ---
serif_section = Paragraph(section_font)
serif_section.add_word(Word("Serif", section_font))
serif_section.add_word(Word("(DejaVu", section_font))
serif_section.add_word(Word("Serif)", section_font))
layouter.layout_paragraph(serif_section)
page._current_y_offset += 10
# Serif Regular
serif_regular = Font.from_family(BundledFont.SERIF, font_size=16)
demo_text_paragraph(layouter, page, serif_regular, "Regular:")
# Serif Bold
serif_bold = Font.from_family(BundledFont.SERIF, font_size=16, weight=FontWeight.BOLD)
demo_text_paragraph(layouter, page, serif_bold, "Bold:")
# Serif Italic
serif_italic = Font.from_family(BundledFont.SERIF, font_size=16, style=FontStyle.ITALIC)
demo_text_paragraph(layouter, page, serif_italic, "Italic:")
# Serif Bold Italic
serif_bold_italic = Font.from_family(
BundledFont.SERIF,
font_size=16,
weight=FontWeight.BOLD,
style=FontStyle.ITALIC
)
demo_text_paragraph(layouter, page, serif_bold_italic, "Bold Italic:")
page._current_y_offset += 20
# --- Monospace Section ---
mono_section = Paragraph(section_font)
mono_section.add_word(Word("Monospace", section_font))
mono_section.add_word(Word("(DejaVu", section_font))
mono_section.add_word(Word("Sans", section_font))
mono_section.add_word(Word("Mono)", section_font))
layouter.layout_paragraph(mono_section)
page._current_y_offset += 10
# Mono Regular
mono_regular = Font.from_family(BundledFont.MONOSPACE, font_size=14)
demo_code_paragraph(layouter, page, mono_regular, "Regular:")
# Mono Bold
mono_bold = Font.from_family(BundledFont.MONOSPACE, font_size=14, weight=FontWeight.BOLD)
demo_code_paragraph(layouter, page, mono_bold, "Bold:")
# Mono Italic
mono_italic = Font.from_family(BundledFont.MONOSPACE, font_size=14, style=FontStyle.ITALIC)
demo_code_paragraph(layouter, page, mono_italic, "Italic:")
# Mono Bold Italic
mono_bold_italic = Font.from_family(
BundledFont.MONOSPACE,
font_size=14,
weight=FontWeight.BOLD,
style=FontStyle.ITALIC
)
demo_code_paragraph(layouter, page, mono_bold_italic, "Bold Italic:")
page._current_y_offset += 20
# Footer
footer_font = Font.from_family(BundledFont.SANS, font_size=12, colour=(100, 100, 100))
footer = Paragraph(footer_font)
footer_text = "All fonts are free and open source under the Bitstream Vera License."
for word in footer_text.split():
footer.add_word(Word(word, footer_font))
layouter.layout_paragraph(footer)
return page
def demo_text_paragraph(layouter, page, font, label):
"""Create a paragraph showing sample text with the given font."""
# Label in smaller font
label_font = Font.from_family(BundledFont.SANS, font_size=12, colour=(100, 100, 100))
label_para = Paragraph(label_font)
label_para.add_word(Word(label, label_font))
layouter.layout_paragraph(label_para)
page._current_y_offset += 5
# Sample text
para = Paragraph(font)
sample = "The quick brown fox jumps over the lazy dog. 0123456789"
for word in sample.split():
para.add_word(Word(word, font))
layouter.layout_paragraph(para)
page._current_y_offset += 8
def demo_code_paragraph(layouter, page, font, label):
"""Create a paragraph showing sample code with the given font."""
# Label in smaller font
label_font = Font.from_family(BundledFont.SANS, font_size=12, colour=(100, 100, 100))
label_para = Paragraph(label_font)
label_para.add_word(Word(label, label_font))
layouter.layout_paragraph(label_para)
page._current_y_offset += 5
# Sample code
para = Paragraph(font)
code = "def hello(): print('Hello, World!') # 0123456789"
for word in code.split():
para.add_word(Word(word, font))
layouter.layout_paragraph(para)
page._current_y_offset += 8
if __name__ == "__main__":
print("\n")
print("=" * 70)
print("Bundled Fonts Demonstration")
print("=" * 70)
print()
print("Creating font showcase page...")
page = create_font_showcase_page()
print("Rendering page...")
image = page.render()
output_file = "demo_08_bundled_fonts.png"
image.save(output_file)
print(f"Saved: {output_file}")
print()
print("=" * 70)
print("Demo complete!")
print()
print("The page showcases all bundled fonts:")
print(" - DejaVu Sans (Sans-serif)")
print(" - DejaVu Serif (Serif)")
print(" - DejaVu Sans Mono (Monospace)")
print()
print("Each family has 4 variants:")
print(" - Regular")
print(" - Bold")
print(" - Italic")
print(" - Bold Italic")
print("=" * 70)
print()