diff --git a/COPYRIGHT b/COPYRIGHT new file mode 100644 index 0000000..042222a --- /dev/null +++ b/COPYRIGHT @@ -0,0 +1,6 @@ +Newsreader (c) 2020 The Newsreader Project Authors (http://github.com/productiontype/Newsreader) +Readerly (c) 2026 Nico Verbruggen (https://github.com/nicoverbruggen/readerly) + +Readerly is originally based on the OFL version of Newsreader (9pt) with some alterations, +and is also available under the same OFL license; for legal reasons it is considered a +modified version of the original Newsreader with a new name. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..c322272 --- /dev/null +++ b/LICENSE @@ -0,0 +1,93 @@ +Newsreader (c) 2020 The Newsreader Project Authors (http://github.com/productiontype/Newsreader) +Readerly (c) 2026 Nico Verbruggen (https://github.com/nicoverbruggen/readerly) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +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 THE +COPYRIGHT HOLDER 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. diff --git a/README.md b/README.md index 25f1d51..5b31441 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,7 @@ To accomplish this, I wanted to start from the 9pt font, which I exported. Then, - `metrics.py`: sets vertical metrics (OS/2 Typo, Win, hhea) - `lineheight.py`: adjusts OS/2 Typo metrics to control line spacing - `rename.py`: updates font name metadata from Newsreader to Readerly + - `version.py`: sets the font version from `./VERSION` - `./src_processed`: intermediate files after instancing/processing (generated) - `./out`: final TTF fonts (generated) diff --git a/VERSION b/VERSION new file mode 100644 index 0000000..9459d4b --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +1.1 diff --git a/build.py b/build.py index cc8a547..ed86ef8 100755 --- a/build.py +++ b/build.py @@ -34,11 +34,17 @@ FLATPAK_APP = "org.fontforge.FontForge" REGULAR_VF = os.path.join(SRC_DIR, "Newsreader-VariableFont_opsz,wght.ttf") ITALIC_VF = os.path.join(SRC_DIR, "Newsreader-Italic-VariableFont_opsz,wght.ttf") +with open(os.path.join(ROOT_DIR, "VERSION")) as _vf: + FONT_VERSION = _vf.read().strip() + +with open(os.path.join(ROOT_DIR, "COPYRIGHT")) as _cf: + COPYRIGHT_TEXT = _cf.read().strip() + VARIANTS = [ # (output_name, source_vf, wght, opsz) - ("Readerly-Regular", REGULAR_VF, 430, 9), + ("Readerly-Regular", REGULAR_VF, 450, 9), ("Readerly-Bold", REGULAR_VF, 550, 9), - ("Readerly-Italic", ITALIC_VF, 430, 9), + ("Readerly-Italic", ITALIC_VF, 450, 9), ("Readerly-BoldItalic", ITALIC_VF, 550, 9), ] @@ -187,6 +193,8 @@ def main(): metrics_code = load_script_as_function(os.path.join(SCRIPTS_DIR, "metrics.py")) lineheight_code = load_script_as_function(os.path.join(SCRIPTS_DIR, "lineheight.py")) rename_code = load_script_as_function(os.path.join(SCRIPTS_DIR, "rename.py")) + version_code = load_script_as_function(os.path.join(SCRIPTS_DIR, "version.py")) + license_code = load_script_as_function(os.path.join(SCRIPTS_DIR, "license.py")) for name in variant_names: sfd_path = os.path.join(MUTATED_DIR, f"{name}.sfd") @@ -195,12 +203,16 @@ def main(): # Set fontname so rename.py can detect the correct style suffix set_fontname = f'f.fontname = {name!r}' + set_version = f'VERSION = {FONT_VERSION!r}' + set_license = f'COPYRIGHT_TEXT = {COPYRIGHT_TEXT!r}' script = build_per_font_script(sfd_path, sfd_path, [ ("Setting vertical metrics", metrics_code), ("Adjusting line height", lineheight_code), ("Setting fontname for rename", set_fontname), ("Updating font names", rename_code), + ("Setting version", set_version + "\n" + version_code), + ("Setting license", set_license + "\n" + license_code), ]) run_fontforge_script(script) diff --git a/scripts/license.py b/scripts/license.py new file mode 100644 index 0000000..59af464 --- /dev/null +++ b/scripts/license.py @@ -0,0 +1,21 @@ +""" +FontForge: Set copyright information +───────────────────────────────────── +Sets the copyright notice from COPYRIGHT_TEXT injected by build.py. + +Run inside FontForge (or via build.py which sets `f` and `COPYRIGHT_TEXT` before running this). +""" + +import fontforge + +f = fontforge.activeFont() + +# COPYRIGHT_TEXT is injected by build.py before this script runs + +lang = "English (US)" + +f.copyright = COPYRIGHT_TEXT +f.appendSFNTName(lang, "Copyright", COPYRIGHT_TEXT) + +print(f" Copyright: {COPYRIGHT_TEXT.splitlines()[0]}") +print("Done.") diff --git a/scripts/rename.py b/scripts/rename.py index d056a67..8c83a81 100644 --- a/scripts/rename.py +++ b/scripts/rename.py @@ -17,12 +17,12 @@ f = fontforge.activeFont() FAMILY = "Readerly" -# Map style suffixes to weight strings +# Map style suffixes to display names, PS weight strings, and OS/2 weight classes STYLE_MAP = { - "Regular": "Regular", - "Bold": "Bold", - "Italic": "Italic", - "BoldItalic": "Bold Italic", + "Regular": ("Regular", "Book", 400), + "Bold": ("Bold", "Bold", 700), + "Italic": ("Italic", "Book", 400), + "BoldItalic": ("Bold Italic", "Bold", 700), } # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ @@ -31,7 +31,7 @@ STYLE_MAP = { # Determine style from the current fontname (e.g. "Readerly-BoldItalic") style_suffix = f.fontname.split("-")[-1] if "-" in f.fontname else "Regular" -style_display = STYLE_MAP.get(style_suffix, style_suffix) +style_display, ps_weight, os2_weight = STYLE_MAP.get(style_suffix, (style_suffix, "Book", 400)) # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ # UPDATE FONT PROPERTIES @@ -40,6 +40,8 @@ style_display = STYLE_MAP.get(style_suffix, style_suffix) f.fontname = f"{FAMILY}-{style_suffix}" f.familyname = FAMILY f.fullname = f"{FAMILY} {style_display}" +f.weight = ps_weight +f.os2_weight = os2_weight # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ # UPDATE SFNT NAME TABLE @@ -67,4 +69,5 @@ count = 0 for name in f.sfnt_names: count += 1 print(f" Updated {count} name entries for {FAMILY} {style_display}") +print(f" PS weight: {ps_weight}, OS/2 usWeightClass: {os2_weight}") print("Done.") diff --git a/scripts/version.py b/scripts/version.py new file mode 100644 index 0000000..2b02d98 --- /dev/null +++ b/scripts/version.py @@ -0,0 +1,24 @@ +""" +FontForge: Set font version +──────────────────────────── +Sets the font version from a VERSION variable injected by build.py. + +Run inside FontForge (or via build.py which sets `f` and `VERSION` before running this). +""" + +import fontforge + +f = fontforge.activeFont() + +# VERSION is injected by build.py before this script runs +# e.g. VERSION = "1.0" + +version_str = "Version " + VERSION + +f.version = VERSION +f.sfntRevision = float(VERSION) +f.appendSFNTName("English (US)", "Version", version_str) + +print(f" Version set to: {version_str}") +print(f" head.fontRevision set to: {float(VERSION)}") +print("Done.")