adding more fonts
This commit is contained in:
parent
849ba2f60f
commit
2b14517344
227
examples/08_bundled_fonts_demo.py
Normal file
227
examples/08_bundled_fonts_demo.py
Normal file
@ -0,0 +1,227 @@
|
||||
"""
|
||||
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()
|
||||
187
pyWebLayout/assets/fonts/DEJAVU_LICENSE.txt
Normal file
187
pyWebLayout/assets/fonts/DEJAVU_LICENSE.txt
Normal file
@ -0,0 +1,187 @@
|
||||
Fonts are (c) Bitstream (see below). DejaVu changes are in public domain.
|
||||
Glyphs imported from Arev fonts are (c) Tavmjong Bah (see below)
|
||||
|
||||
|
||||
Bitstream Vera Fonts Copyright
|
||||
------------------------------
|
||||
|
||||
Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is
|
||||
a trademark of Bitstream, Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of the fonts accompanying this license ("Fonts") and associated
|
||||
documentation files (the "Font Software"), to reproduce and distribute the
|
||||
Font Software, including without limitation the rights to use, copy, merge,
|
||||
publish, distribute, and/or sell copies of the Font Software, and to permit
|
||||
persons to whom the Font Software is furnished to do so, subject to the
|
||||
following conditions:
|
||||
|
||||
The above copyright and trademark notices and this permission notice shall
|
||||
be included in all copies of one or more of the Font Software typefaces.
|
||||
|
||||
The Font Software may be modified, altered, or added to, and in particular
|
||||
the designs of glyphs or characters in the Fonts may be modified and
|
||||
additional glyphs or characters may be added to the Fonts, only if the fonts
|
||||
are renamed to names not containing either the words "Bitstream" or the word
|
||||
"Vera".
|
||||
|
||||
This License becomes null and void to the extent applicable to Fonts or Font
|
||||
Software that has been modified and is distributed under the "Bitstream
|
||||
Vera" names.
|
||||
|
||||
The Font Software may be sold as part of a larger software package but no
|
||||
copy of one or more of the Font Software typefaces may be sold by itself.
|
||||
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT,
|
||||
TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME
|
||||
FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING
|
||||
ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,
|
||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
|
||||
THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE
|
||||
FONT SOFTWARE.
|
||||
|
||||
Except as contained in this notice, the names of Gnome, the Gnome
|
||||
Foundation, and Bitstream Inc., shall not be used in advertising or
|
||||
otherwise to promote the sale, use or other dealings in this Font Software
|
||||
without prior written authorization from the Gnome Foundation or Bitstream
|
||||
Inc., respectively. For further information, contact: fonts at gnome dot
|
||||
org.
|
||||
|
||||
Arev Fonts Copyright
|
||||
------------------------------
|
||||
|
||||
Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the fonts accompanying this license ("Fonts") and
|
||||
associated documentation files (the "Font Software"), to reproduce
|
||||
and distribute the modifications to the Bitstream Vera Font Software,
|
||||
including without limitation the rights to use, copy, merge, publish,
|
||||
distribute, and/or sell copies of the Font Software, and to permit
|
||||
persons to whom the Font Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright and trademark notices and this permission notice
|
||||
shall be included in all copies of one or more of the Font Software
|
||||
typefaces.
|
||||
|
||||
The Font Software may be modified, altered, or added to, and in
|
||||
particular the designs of glyphs or characters in the Fonts may be
|
||||
modified and additional glyphs or characters may be added to the
|
||||
Fonts, only if the fonts are renamed to names not containing either
|
||||
the words "Tavmjong Bah" or the word "Arev".
|
||||
|
||||
This License becomes null and void to the extent applicable to Fonts
|
||||
or Font Software that has been modified and is distributed under the
|
||||
"Tavmjong Bah Arev" names.
|
||||
|
||||
The Font Software may be sold as part of a larger software package but
|
||||
no copy of one or more of the Font Software typefaces may be sold by
|
||||
itself.
|
||||
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL
|
||||
TAVMJONG BAH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||
|
||||
Except as contained in this notice, the name of Tavmjong Bah shall not
|
||||
be used in advertising or otherwise to promote the sale, use or other
|
||||
dealings in this Font Software without prior written authorization
|
||||
from Tavmjong Bah. For further information, contact: tavmjong @ free
|
||||
. fr.
|
||||
|
||||
TeX Gyre DJV Math
|
||||
-----------------
|
||||
Fonts are (c) Bitstream (see below). DejaVu changes are in public domain.
|
||||
|
||||
Math extensions done by B. Jackowski, P. Strzelczyk and P. Pianowski
|
||||
(on behalf of TeX users groups) are in public domain.
|
||||
|
||||
Letters imported from Euler Fraktur from AMSfonts are (c) American
|
||||
Mathematical Society (see below).
|
||||
Bitstream Vera Fonts Copyright
|
||||
Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera
|
||||
is a trademark of Bitstream, Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of the fonts accompanying this license (“Fonts”) and associated
|
||||
documentation
|
||||
files (the “Font Software”), to reproduce and distribute the Font Software,
|
||||
including without limitation the rights to use, copy, merge, publish,
|
||||
distribute,
|
||||
and/or sell copies of the Font Software, and to permit persons to whom
|
||||
the Font Software is furnished to do so, subject to the following
|
||||
conditions:
|
||||
|
||||
The above copyright and trademark notices and this permission notice
|
||||
shall be
|
||||
included in all copies of one or more of the Font Software typefaces.
|
||||
|
||||
The Font Software may be modified, altered, or added to, and in particular
|
||||
the designs of glyphs or characters in the Fonts may be modified and
|
||||
additional
|
||||
glyphs or characters may be added to the Fonts, only if the fonts are
|
||||
renamed
|
||||
to names not containing either the words “Bitstream” or the word “Vera”.
|
||||
|
||||
This License becomes null and void to the extent applicable to Fonts or
|
||||
Font Software
|
||||
that has been modified and is distributed under the “Bitstream Vera”
|
||||
names.
|
||||
|
||||
The Font Software may be sold as part of a larger software package but
|
||||
no copy
|
||||
of one or more of the Font Software typefaces may be sold by itself.
|
||||
|
||||
THE FONT SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT,
|
||||
TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME
|
||||
FOUNDATION
|
||||
BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL,
|
||||
SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN
|
||||
ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR
|
||||
INABILITY TO USE
|
||||
THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||
Except as contained in this notice, the names of GNOME, the GNOME
|
||||
Foundation,
|
||||
and Bitstream Inc., shall not be used in advertising or otherwise to promote
|
||||
the sale, use or other dealings in this Font Software without prior written
|
||||
authorization from the GNOME Foundation or Bitstream Inc., respectively.
|
||||
For further information, contact: fonts at gnome dot org.
|
||||
|
||||
AMSFonts (v. 2.2) copyright
|
||||
|
||||
The PostScript Type 1 implementation of the AMSFonts produced by and
|
||||
previously distributed by Blue Sky Research and Y&Y, Inc. are now freely
|
||||
available for general use. This has been accomplished through the
|
||||
cooperation
|
||||
of a consortium of scientific publishers with Blue Sky Research and Y&Y.
|
||||
Members of this consortium include:
|
||||
|
||||
Elsevier Science IBM Corporation Society for Industrial and Applied
|
||||
Mathematics (SIAM) Springer-Verlag American Mathematical Society (AMS)
|
||||
|
||||
In order to assure the authenticity of these fonts, copyright will be
|
||||
held by
|
||||
the American Mathematical Society. This is not meant to restrict in any way
|
||||
the legitimate use of the fonts, such as (but not limited to) electronic
|
||||
distribution of documents containing these fonts, inclusion of these fonts
|
||||
into other public domain or commercial font collections or computer
|
||||
applications, use of the outline data to create derivative fonts and/or
|
||||
faces, etc. However, the AMS does require that the AMS copyright notice be
|
||||
removed from any derivative versions of the fonts which have been altered in
|
||||
any way. In addition, to ensure the fidelity of TeX documents using Computer
|
||||
Modern fonts, Professor Donald Knuth, creator of the Computer Modern faces,
|
||||
has requested that any alterations which yield different font metrics be
|
||||
given a different name.
|
||||
|
||||
$Id$
|
||||
67
pyWebLayout/assets/fonts/DEJAVU_README.md
Normal file
67
pyWebLayout/assets/fonts/DEJAVU_README.md
Normal file
@ -0,0 +1,67 @@
|
||||
[](https://travis-ci.org/dejavu-fonts/dejavu-fonts)
|
||||
|
||||
DejaVu fonts 2.37 (c)2004-2016 DejaVu fonts team
|
||||
------------------------------------------------
|
||||
|
||||
The DejaVu fonts are a font family based on the Bitstream Vera Fonts
|
||||
(http://gnome.org/fonts/). Its purpose is to provide a wider range of
|
||||
characters (see status.txt for more information) while maintaining the
|
||||
original look and feel.
|
||||
|
||||
DejaVu fonts are based on Bitstream Vera fonts version 1.10.
|
||||
|
||||
Available fonts (Sans = sans serif, Mono = monospaced):
|
||||
|
||||
DejaVu Sans Mono
|
||||
DejaVu Sans Mono Bold
|
||||
DejaVu Sans Mono Bold Oblique
|
||||
DejaVu Sans Mono Oblique
|
||||
DejaVu Sans
|
||||
DejaVu Sans Bold
|
||||
DejaVu Sans Bold Oblique
|
||||
DejaVu Sans Oblique
|
||||
DejaVu Sans ExtraLight (experimental)
|
||||
DejaVu Serif
|
||||
DejaVu Serif Bold
|
||||
DejaVu Serif Bold Italic (experimental)
|
||||
DejaVu Serif Italic (experimental)
|
||||
DejaVu Sans Condensed (experimental)
|
||||
DejaVu Sans Condensed Bold (experimental)
|
||||
DejaVu Sans Condensed Bold Oblique (experimental)
|
||||
DejaVu Sans Condensed Oblique (experimental)
|
||||
DejaVu Serif Condensed (experimental)
|
||||
DejaVu Serif Condensed Bold (experimental)
|
||||
DejaVu Serif Condensed Bold Italic (experimental)
|
||||
DejaVu Serif Condensed Italic (experimental)
|
||||
DejaVu Math TeX Gyre
|
||||
|
||||
All fonts are also available as derivative called DejaVu LGC with support
|
||||
only for Latin, Greek and Cyrillic scripts.
|
||||
|
||||
For license information see LICENSE. What's new is described in NEWS. Known
|
||||
bugs are in BUGS. All authors are mentioned in AUTHORS.
|
||||
|
||||
Fonts are published in source form as SFD files (Spline Font Database from
|
||||
FontForge - http://fontforge.sf.net/) and in compiled form as TTF files
|
||||
(TrueType fonts).
|
||||
|
||||
For more information go to http://dejavu.sourceforge.net/.
|
||||
|
||||
Characters from Arev fonts, Copyright (c) 2006 by Tavmjong Bah:
|
||||
---------------------------
|
||||
U+01BA, U+01BF, U+01F7, U+021C-U+021D, U+0220, U+0222-U+0223,
|
||||
U+02B9, U+02BA, U+02BD, U+02C2-U+02C5, U+02d4-U+02D5,
|
||||
U+02D7, U+02EC-U+02EE, U+0346-U+034E, U+0360, U+0362,
|
||||
U+03E2-03EF, U+0460-0463, U+0466-U+0486, U+0488-U+0489, U+04A8-U+04A9,
|
||||
U+0500-U+050F, U+2055-205E, U+20B0, U+20B2-U+20B3, U+2102, U+210D, U+210F,
|
||||
U+2111, U+2113, U+2115, U+2118-U+211A, U+211C-U+211D, U+2124, U+2135,
|
||||
U+213C-U+2140, U+2295-U+2298, U+2308-U+230B, U+26A2-U+26B1, U+2701-U+2704,
|
||||
U+2706-U+2709, U+270C-U+274B, U+2758-U+275A, U+2761-U+2775, U+2780-U+2794,
|
||||
U+2798-U+27AF, U+27B1-U+27BE, U+FB05-U+FB06
|
||||
|
||||
DejaVu Math TeX Gyre
|
||||
--------------------
|
||||
TeX Gyre DJV Math by B. Jackowski, P. Strzelczyk and P. Pianowski
|
||||
(on behalf of TeX users groups).
|
||||
|
||||
$Id$
|
||||
BIN
pyWebLayout/assets/fonts/DejaVuSans-Bold.ttf
Normal file
BIN
pyWebLayout/assets/fonts/DejaVuSans-Bold.ttf
Normal file
Binary file not shown.
BIN
pyWebLayout/assets/fonts/DejaVuSans-BoldOblique.ttf
Normal file
BIN
pyWebLayout/assets/fonts/DejaVuSans-BoldOblique.ttf
Normal file
Binary file not shown.
BIN
pyWebLayout/assets/fonts/DejaVuSans-Oblique.ttf
Normal file
BIN
pyWebLayout/assets/fonts/DejaVuSans-Oblique.ttf
Normal file
Binary file not shown.
Binary file not shown.
BIN
pyWebLayout/assets/fonts/DejaVuSansMono-Bold.ttf
Normal file
BIN
pyWebLayout/assets/fonts/DejaVuSansMono-Bold.ttf
Normal file
Binary file not shown.
BIN
pyWebLayout/assets/fonts/DejaVuSansMono-BoldOblique.ttf
Normal file
BIN
pyWebLayout/assets/fonts/DejaVuSansMono-BoldOblique.ttf
Normal file
Binary file not shown.
BIN
pyWebLayout/assets/fonts/DejaVuSansMono-Oblique.ttf
Normal file
BIN
pyWebLayout/assets/fonts/DejaVuSansMono-Oblique.ttf
Normal file
Binary file not shown.
BIN
pyWebLayout/assets/fonts/DejaVuSansMono.ttf
Normal file
BIN
pyWebLayout/assets/fonts/DejaVuSansMono.ttf
Normal file
Binary file not shown.
BIN
pyWebLayout/assets/fonts/DejaVuSerif-Bold.ttf
Normal file
BIN
pyWebLayout/assets/fonts/DejaVuSerif-Bold.ttf
Normal file
Binary file not shown.
BIN
pyWebLayout/assets/fonts/DejaVuSerif-BoldItalic.ttf
Normal file
BIN
pyWebLayout/assets/fonts/DejaVuSerif-BoldItalic.ttf
Normal file
Binary file not shown.
BIN
pyWebLayout/assets/fonts/DejaVuSerif-Italic.ttf
Normal file
BIN
pyWebLayout/assets/fonts/DejaVuSerif-Italic.ttf
Normal file
Binary file not shown.
BIN
pyWebLayout/assets/fonts/DejaVuSerif.ttf
Normal file
BIN
pyWebLayout/assets/fonts/DejaVuSerif.ttf
Normal file
Binary file not shown.
129
pyWebLayout/assets/fonts/README.md
Normal file
129
pyWebLayout/assets/fonts/README.md
Normal file
@ -0,0 +1,129 @@
|
||||
# Bundled Fonts
|
||||
|
||||
This directory contains free, open-source TrueType fonts bundled with pyWebLayout for consistent rendering across all platforms.
|
||||
|
||||
## Font Families
|
||||
|
||||
### DejaVu Sans (Sans-serif)
|
||||
A modern, clean sans-serif font excellent for body text and UI elements.
|
||||
|
||||
- `DejaVuSans.ttf` - Regular
|
||||
- `DejaVuSans-Bold.ttf` - Bold
|
||||
- `DejaVuSans-Oblique.ttf` - Italic
|
||||
- `DejaVuSans-BoldOblique.ttf` - Bold Italic
|
||||
|
||||
### DejaVu Serif (Serif)
|
||||
A classic serif font ideal for formal documents and traditional layouts.
|
||||
|
||||
- `DejaVuSerif.ttf` - Regular
|
||||
- `DejaVuSerif-Bold.ttf` - Bold
|
||||
- `DejaVuSerif-Italic.ttf` - Italic
|
||||
- `DejaVuSerif-BoldItalic.ttf` - Bold Italic
|
||||
|
||||
### DejaVu Sans Mono (Monospace)
|
||||
A fixed-width font perfect for code blocks and technical content.
|
||||
|
||||
- `DejaVuSansMono.ttf` - Regular
|
||||
- `DejaVuSansMono-Bold.ttf` - Bold
|
||||
- `DejaVuSansMono-Oblique.ttf` - Italic
|
||||
- `DejaVuSansMono-BoldOblique.ttf` - Bold Italic
|
||||
|
||||
## Usage
|
||||
|
||||
### Easy Way: Using Font.from_family() (Recommended)
|
||||
|
||||
The easiest way to use bundled fonts is with the `Font.from_family()` class method:
|
||||
|
||||
```python
|
||||
from pyWebLayout.style import Font, BundledFont, FontWeight, FontStyle
|
||||
|
||||
# Create a sans-serif font
|
||||
sans_font = Font.from_family(
|
||||
BundledFont.SANS,
|
||||
font_size=16
|
||||
)
|
||||
|
||||
# Create a bold serif font
|
||||
serif_bold = Font.from_family(
|
||||
BundledFont.SERIF,
|
||||
font_size=18,
|
||||
weight=FontWeight.BOLD
|
||||
)
|
||||
|
||||
# Create an italic monospace font
|
||||
mono_italic = Font.from_family(
|
||||
BundledFont.MONOSPACE,
|
||||
font_size=14,
|
||||
style=FontStyle.ITALIC
|
||||
)
|
||||
|
||||
# Create a bold italic sans font
|
||||
sans_bold_italic = Font.from_family(
|
||||
BundledFont.SANS,
|
||||
font_size=16,
|
||||
weight=FontWeight.BOLD,
|
||||
style=FontStyle.ITALIC
|
||||
)
|
||||
```
|
||||
|
||||
### Manual Way: Using get_bundled_font_path()
|
||||
|
||||
You can also get the path to bundled fonts directly:
|
||||
|
||||
```python
|
||||
from pyWebLayout.style import Font, BundledFont, FontWeight, FontStyle, get_bundled_font_path
|
||||
|
||||
# Get the path to a specific font
|
||||
font_path = get_bundled_font_path(
|
||||
BundledFont.SERIF,
|
||||
weight=FontWeight.BOLD,
|
||||
style=FontStyle.ITALIC
|
||||
)
|
||||
|
||||
# Create a font with that path
|
||||
font = Font(font_path=font_path, font_size=16)
|
||||
```
|
||||
|
||||
### Low-level Way: Direct Paths
|
||||
|
||||
If you prefer to specify paths directly:
|
||||
|
||||
```python
|
||||
import os
|
||||
from pyWebLayout.style import Font, get_bundled_fonts_dir
|
||||
|
||||
# Get the fonts directory
|
||||
fonts_dir = get_bundled_fonts_dir()
|
||||
|
||||
# Use specific font files
|
||||
sans_font = Font(
|
||||
font_path=os.path.join(fonts_dir, 'DejaVuSans.ttf'),
|
||||
font_size=16
|
||||
)
|
||||
|
||||
serif_bold = Font(
|
||||
font_path=os.path.join(fonts_dir, 'DejaVuSerif-Bold.ttf'),
|
||||
font_size=18
|
||||
)
|
||||
|
||||
mono_italic = Font(
|
||||
font_path=os.path.join(fonts_dir, 'DejaVuSansMono-Oblique.ttf'),
|
||||
font_size=14
|
||||
)
|
||||
```
|
||||
|
||||
## License
|
||||
|
||||
The DejaVu fonts are free software under the terms of the Bitstream Vera Fonts Copyright and the Arev Fonts Copyright.
|
||||
|
||||
See `DEJAVU_LICENSE.txt` for full license details.
|
||||
|
||||
## About DejaVu Fonts
|
||||
|
||||
DejaVu fonts are a font family based on the Bitstream Vera Fonts. Its purpose is to provide a wider range of characters while maintaining the original look and feel through the process of collaborative development.
|
||||
|
||||
- **Version**: 2.37
|
||||
- **Website**: https://dejavu-fonts.github.io/
|
||||
- **Repository**: https://github.com/dejavu-fonts/dejavu-fonts
|
||||
|
||||
The fonts provide excellent Unicode coverage and are widely used in open-source projects.
|
||||
@ -4,7 +4,10 @@ Style system for the pyWebLayout library.
|
||||
This module provides the core styling components used throughout the library.
|
||||
"""
|
||||
|
||||
from .fonts import Font, FontWeight, FontStyle, TextDecoration
|
||||
from .fonts import (
|
||||
Font, FontWeight, FontStyle, TextDecoration,
|
||||
BundledFont, get_bundled_font_path, get_bundled_fonts_dir
|
||||
)
|
||||
from .abstract_style import (
|
||||
AbstractStyle, AbstractStyleRegistry, FontFamily, FontSize
|
||||
)
|
||||
@ -14,6 +17,7 @@ from .alignment import Alignment
|
||||
|
||||
__all__ = [
|
||||
"Font", "FontWeight", "FontStyle", "TextDecoration",
|
||||
"BundledFont", "get_bundled_font_path", "get_bundled_fonts_dir",
|
||||
"AbstractStyle", "AbstractStyleRegistry", "FontFamily", "FontSize",
|
||||
"ConcreteStyle", "PageStyle", "Alignment"
|
||||
]
|
||||
|
||||
@ -16,6 +16,9 @@ _FONT_CACHE: Dict[Tuple[Optional[str], int], ImageFont.FreeTypeFont] = {}
|
||||
# Cache for bundled font path to avoid repeated filesystem lookups
|
||||
_BUNDLED_FONT_PATH: Optional[str] = None
|
||||
|
||||
# Cache for bundled fonts directory
|
||||
_BUNDLED_FONTS_DIR: Optional[str] = None
|
||||
|
||||
|
||||
class FontWeight(Enum):
|
||||
NORMAL = "normal"
|
||||
@ -33,6 +36,105 @@ class TextDecoration(Enum):
|
||||
STRIKETHROUGH = "strikethrough"
|
||||
|
||||
|
||||
class BundledFont(Enum):
|
||||
"""Bundled font families available in pyWebLayout"""
|
||||
SANS = "sans" # DejaVu Sans - modern sans-serif
|
||||
SERIF = "serif" # DejaVu Serif - classic serif
|
||||
MONOSPACE = "monospace" # DejaVu Sans Mono - fixed-width
|
||||
|
||||
|
||||
def get_bundled_fonts_dir():
|
||||
"""
|
||||
Get the directory containing bundled fonts (cached).
|
||||
|
||||
Returns:
|
||||
str: Path to the fonts directory, or None if not found
|
||||
"""
|
||||
global _BUNDLED_FONTS_DIR
|
||||
|
||||
# Return cached path if available
|
||||
if _BUNDLED_FONTS_DIR is not None:
|
||||
return _BUNDLED_FONTS_DIR
|
||||
|
||||
# First time - determine the path and cache it
|
||||
current_dir = os.path.dirname(os.path.abspath(__file__))
|
||||
fonts_dir = os.path.join(os.path.dirname(current_dir), 'assets', 'fonts')
|
||||
|
||||
if os.path.exists(fonts_dir) and os.path.isdir(fonts_dir):
|
||||
_BUNDLED_FONTS_DIR = fonts_dir
|
||||
logger.debug(f"Found bundled fonts directory at: {fonts_dir}")
|
||||
return fonts_dir
|
||||
else:
|
||||
logger.warning(f"Bundled fonts directory not found at: {fonts_dir}")
|
||||
_BUNDLED_FONTS_DIR = "" # Empty string to indicate "checked but not found"
|
||||
return None
|
||||
|
||||
|
||||
def get_bundled_font_path(
|
||||
family: BundledFont = BundledFont.SANS,
|
||||
weight: FontWeight = FontWeight.NORMAL,
|
||||
style: FontStyle = FontStyle.NORMAL
|
||||
) -> Optional[str]:
|
||||
"""
|
||||
Get the path to a specific bundled font file.
|
||||
|
||||
Args:
|
||||
family: The font family (SANS, SERIF, or MONOSPACE)
|
||||
weight: The font weight (NORMAL or BOLD)
|
||||
style: The font style (NORMAL or ITALIC)
|
||||
|
||||
Returns:
|
||||
str: Full path to the font file, or None if not found
|
||||
|
||||
Example:
|
||||
>>> # Get bold italic sans font
|
||||
>>> path = get_bundled_font_path(BundledFont.SANS, FontWeight.BOLD, FontStyle.ITALIC)
|
||||
>>> font = Font(font_path=path, font_size=16)
|
||||
"""
|
||||
fonts_dir = get_bundled_fonts_dir()
|
||||
if not fonts_dir:
|
||||
return None
|
||||
|
||||
# Map font parameters to filename
|
||||
family_map = {
|
||||
BundledFont.SANS: "DejaVuSans",
|
||||
BundledFont.SERIF: "DejaVuSerif",
|
||||
BundledFont.MONOSPACE: "DejaVuSansMono"
|
||||
}
|
||||
|
||||
base_name = family_map.get(family, "DejaVuSans")
|
||||
|
||||
# Build the font file name
|
||||
parts = [base_name]
|
||||
|
||||
if weight == FontWeight.BOLD and style == FontStyle.ITALIC:
|
||||
# Special case: both bold and italic
|
||||
if family == BundledFont.MONOSPACE:
|
||||
parts.append("BoldOblique")
|
||||
elif family == BundledFont.SERIF:
|
||||
parts.append("BoldItalic")
|
||||
else: # SANS
|
||||
parts.append("BoldOblique")
|
||||
elif weight == FontWeight.BOLD:
|
||||
parts.append("Bold")
|
||||
elif style == FontStyle.ITALIC:
|
||||
# Italic naming differs by family
|
||||
if family == BundledFont.MONOSPACE or family == BundledFont.SANS:
|
||||
parts.append("Oblique")
|
||||
else: # SERIF
|
||||
parts.append("Italic")
|
||||
|
||||
filename = "-".join(parts) + ".ttf"
|
||||
font_path = os.path.join(fonts_dir, filename)
|
||||
|
||||
if os.path.exists(font_path):
|
||||
logger.debug(f"Found bundled font: {filename}")
|
||||
return font_path
|
||||
else:
|
||||
logger.warning(f"Bundled font not found: {filename}")
|
||||
return None
|
||||
|
||||
|
||||
class Font:
|
||||
"""
|
||||
Font class to manage text rendering properties including font face, size, color, and styling.
|
||||
@ -53,7 +155,7 @@ class Font:
|
||||
Initialize a Font object with the specified properties.
|
||||
|
||||
Args:
|
||||
font_path: Path to the font file (.ttf, .otf). If None, uses default font.
|
||||
font_path: Path to the font file (.ttf, .otf). If None, uses default bundled font.
|
||||
font_size: Size of the font in points.
|
||||
colour: RGB color tuple for the text.
|
||||
weight: Font weight (normal or bold).
|
||||
@ -76,6 +178,57 @@ class Font:
|
||||
# Load the font file or use default
|
||||
self._load_font()
|
||||
|
||||
@classmethod
|
||||
def from_family(cls,
|
||||
family: BundledFont = BundledFont.SANS,
|
||||
font_size: int = 16,
|
||||
colour: Tuple[int, int, int] = (0, 0, 0),
|
||||
weight: FontWeight = FontWeight.NORMAL,
|
||||
style: FontStyle = FontStyle.NORMAL,
|
||||
decoration: TextDecoration = TextDecoration.NONE,
|
||||
background: Optional[Tuple[int, int, int, int]] = None,
|
||||
language: str = "en_EN",
|
||||
min_hyphenation_width: Optional[int] = None) -> 'Font':
|
||||
"""
|
||||
Create a Font using a bundled font family.
|
||||
|
||||
This is a convenient way to use the bundled DejaVu fonts without needing to
|
||||
specify paths manually.
|
||||
|
||||
Args:
|
||||
family: The font family to use (SANS, SERIF, or MONOSPACE)
|
||||
font_size: Size of the font in points.
|
||||
colour: RGB color tuple for the text.
|
||||
weight: Font weight (normal or bold).
|
||||
style: Font style (normal or italic).
|
||||
decoration: Text decoration (none, underline, or strikethrough).
|
||||
background: RGBA background color for the text. If None, transparent background.
|
||||
language: Language code for hyphenation and text processing.
|
||||
min_hyphenation_width: Minimum width in pixels required for hyphenation.
|
||||
|
||||
Returns:
|
||||
Font object configured with the bundled font
|
||||
|
||||
Example:
|
||||
>>> # Create a bold serif font
|
||||
>>> font = Font.from_family(BundledFont.SERIF, font_size=18, weight=FontWeight.BOLD)
|
||||
>>>
|
||||
>>> # Create an italic monospace font
|
||||
>>> code_font = Font.from_family(BundledFont.MONOSPACE, style=FontStyle.ITALIC)
|
||||
"""
|
||||
font_path = get_bundled_font_path(family, weight, style)
|
||||
return cls(
|
||||
font_path=font_path,
|
||||
font_size=font_size,
|
||||
colour=colour,
|
||||
weight=weight,
|
||||
style=style,
|
||||
decoration=decoration,
|
||||
background=background,
|
||||
language=language,
|
||||
min_hyphenation_width=min_hyphenation_width
|
||||
)
|
||||
|
||||
def _get_bundled_font_path(self):
|
||||
"""Get the path to the bundled font (cached)"""
|
||||
global _BUNDLED_FONT_PATH
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user