[why]
The code is rather convoluted and one can not follow what is done.
[how]
Add function that abstracts some steps away.
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
[why]
This sets out to circumvent a problem with VisualStudio 2022. That
application seems to have problems with fonts when the ID16 is not a
prefix in ID1.
We have this when --makegroups >= 4, because
ID1 has the short name suffix 'NF'
ID16 has the long suffix 'Nerd Font'
These fonts can be selected in VisualStudio 2022, and the preview works
ok, but once active some replacement default font is used instead.
The problem vanishes if ID16 and ID1 have the same stem, or rather ID1
has someting added on top of ID16; but ID16 is a substring of ID1.
See more discussions in #1442
[how]
Write both forms in ID16 fields, 'NF' and 'Nerd Font' suffixes. This
works as long as the application considers all languages equal.
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
[why]
Albeight documented in the comment not all non English-US entries are
removed but just al TO_DEL ones.
[how]
Put the conditional in the right position.
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
[why]
When shortening the rare gases names to the element symbol
Radon is named 'Rd' while it should be 'Rn'.
Atomic number 86 on the periodic table.
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
After the working draft name Monispace the final patched font name will
be Monaspice.
* It keeps the characteristic `Mona` in the beginning
* It changes just one character
* The replacement is still a real word
* The replacements sounds very similar
Also other very good names have been suggested, thank you all for the
input!
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
[why]
It is better to have a not-abbreviated file name so that one can make
sense out of the name parts, especially when doing a partial patch.
With the previous commit we ended up with all abbreviated names.
The filename length is hopefully not limited, at least not as severe as
the SFNT table entries.
[how]
We need to store the answers somewhere because the naming is only
understood by the FontnameParser object which we throw away soon.
As fallback we still can parse the SFNT table, for example when the old
renaming is used.
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
[why]
Because the newer Preferred/Typographic names ID 16 and ID 17 have not
a very demanding length limit we add the long form of the name
addendum (i.e. Nerd Font, Nerd Font Mono, Nerd Font Propo).
In the more restricted old names ID 1 and ID 2 we use the short forms
(i.e. NF, NFM, NFP).
This seems to be problematic with Visual Studio (Community) 2022 and the
fonts can be selected but are not really used.
The Postscript family name is never shortened which seems to be of no
consequence, but still is different than the other.
[how]
When creating the Preferred/Typographic Family (ID 16) we check the
shortening mode first and abbreviate the parts as needed and alike ID 1.
This will also change the filenames, because they base on the SFNT
table. We can not change that without changing the whole mechanism.
[note]
Also add new tool that lists all names of fonts, including the
Postscript ones.
Fixes: #1242
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
They renamed
M Plus Code Latin -> M Plus Code Latin50
M Plus Code Latin Expanded -> M Plus Code Latin60
The versioning is rather divers, add more information into the font
specific README file.
Fixes: #1333
Reported-by: LeoniePhiline
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
[why]
Monaspace has an RFN that individually protects 'Monaspace' and all the
face names of noble gases 'Xenon' etc. Both must not be used on patched
fonts.
[how]
Just add the rule(s). The concrete naming is not decided yet.
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
[why]
Some PS weights have a dash in the weight, like 'Extra-Light' in
Iosevka. The parser can not parse it because it expects 'ExtraLight'.
[how]
Filter out all '-' and ' ' from the PS weight string before actually
parsing the string.
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
[why]
When the weight check fails for some input the reason is not shown
correctly (i.e. not the string that actually failed).
[how]
Display exactly the failed string in the warning.
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
[why]
When the font does not have a PSweight string the font-patcher bugs.
[how]
Rewrite the code to be more robust against unexpected weight values.
Also make detected problems non-fatal.
Reported-by: František Hanzlík <frantisek_hanzlik@protonmail.com>
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
[why]
Windows seems to construct the font names including the PS weight.
We have some sourcefonts that are broken (i.e. have in fact different
weights but have the same PS weight and/or OS2 weight.
That raises problems with the fonts on Windows.
[how]
Check and compare all weight metadata (except CID) and issue a warning
if they differ too much. That might fail with unusual weight names,
though.
See Issue #1333 and PR #1358.
Reported-by: LeoniePhiline
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
[why]
IBM Plex uses some abbreviations also in the fullname and we do not try
abbreviations when resolving weights.
[how]
As this is the only font that has such specials we handle it beforehand
and do not try all combinations of abbreviated and long keywords.
And then their abbreviations are also not standard - at least not used
by us or Adobe, etc.
For such a small amount of affected font files it seems in order to
specifically just fix them instead of a general solution.
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
[why]
The 'Text' weight of Plex is handled as 'other', means that this is
added to the font's name and is a distrinct own family.
But in the original font it is used as weight.
[how]
Remove special handling of 'text' in the font name.
Add 'Text' to known_weights list.
"Text" is not a standard naming, but I see no problems when we handle it
as one. This keeps the family relationships in Blex like Plex.
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
[why]
Function get_name_token has a Cognitive Complexity of 12 (exceeds 9 allowed).
Consider refactoring.
[how]
Remove not really needed special case.
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
[why]
Some fonts might have a non-standard (i.e. broken) weight naming scheme:
They put a blank or a dash between the modifier and the weight, for
example "Extra Bold" or "Demi-Condensed", when they mean "ExtraBold"
resp "DemiCondensed".
The former happens with CartographCF, the later with IBM3270.
[how]
Automatically allow a dash between modifier and weight, which comes up
as CamelCase boundary. Insert an optional dash (r'-?') into such
boundaries.
For the further lookup we need to remove the dash in the found keyword,
if there is any, to get back to standard naming.
This might break if the font name ends in a modifier. So we can not
really distinguish
Font Name Extra Bold Italic
=> Font Name - ExtraBold Italic
=> Font Name Extra - Bold Italic
The known modifiers are 'Demi', 'Ultra', 'Semi', 'Extra'.
It is possible but unlikely that a font name ends in one of these.
For example "Modern Ultra - Bold".
[note]
The question arises if we should not parse the PSname instead of the
Fullname; and stick to the dash there as boundary.
The problem might be prepatched fonts with broken naming, that would be
parsed completely wrong then. So maybe the current approach is still the
best, with the caveat given above (fontnames ending in a modifier).
[note 2]
Funny enough the variable allow_regex_token was not used at all :->
Some leftover? Anyhow we use it now.
[note 3]
We can still not remove the special handling for IBM3270, because the
font initially looks like a PSname and this is parsed as such, which
breaks the name in the incorrect place:
PSname template = "Name-StylesWeights"
Fullname of 3270 = "IBM 3270 Semi-Condensed"
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
[why]
The code is obviously wrong. No effect has been seen, though.
First we check if a certain string is a key in the dict.
If it is, we retrieve the value with the string lower-cased as key.
This does not make sense.
[how]
All the keys are lower case anyhow, so the code seems unneeded. Maybe it
is a leftover. The styles that go into it _and are in the dict_ all come
from a regex-enabled search and thus are lower-cased.
Whatever, to have the correct code we use the lower-cased string for
both, checking for existance and retrieving the value - this is the only
sane approach.
Also change to dict.get() method instead of a self made if code.
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
[why]
Patching CartographCF-Bold.ttf creates this naming:
Family (ID 1) : CartographF Nerd Font Condensed
SubFamily (ID 2) : Bold
Fullname (ID 4) : CartographF Nerd Font Condensed Bold
PSN (ID 6) : CartographFNF-CondensedBold
PrefFamily (ID 16) : CartographF Nerd Font
PrefStyles (ID 17) : Condensed Bold
CartographF Nerd Font Condensed Bold
\===> 'CartographFNerdFont-CondensedBold.ttf'
[how]
The font-patcher historically used the file name of the to-be-patched
font to come up with the new name. When the FontnameParser has been
developed that mechanics has been copied at least for fallback. The
earliest tests compared old and new naming with all the filenames.
Later, when the FontnameParser has been used to really apply name
changes it has always based the parsing on the Fullname or the PSname,
because they really hold the information (or at least should hold);
while the filename might be completely random.
Still code the dealt with specific problems in FILEnames prevailed. The
Ubuntu font for example has a file name like 'Ubuntu-C.ttf', and we
needed to convert the C to Condensed.
As that requirement vanished we can drop all the code that has been
added specifically only for parsing the Ubuntu font filenames.
Side note: USUALLY font filenames should be roughly equal to the PSname.
Fixes: #1258
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
[why]
For fonts that have no Italic but an Oblique - i.e. when Oblique shall
replace the Italic role in RIBBI font grouping (classic group of 4) -
that grouping fails.
This affects DejaVu on Putty.
[how]
For RIBBI grouping only the classic bits are considered. That means that
for fonts that have Oblique instead of Italic (and not additionally) we
need to set the ITALIC bit and the OBLIQUE bit. This has been
overlooked.
Cite from the specs:
> This bit, unlike the ITALIC bit (bit 0), is not related to style-linking
> in applications that assume a four-member font-family model comprised
> of regular, italic, bold and bold italic. It may be set or unset
> independently of the ITALIC bit. In most cases, if OBLIQUE is set, then
> ITALIC will also be set, though this is not required.
[note]
Also increase font-patcher version.
Fixes: #1249
Reported-by: Huifeng Shen <liaoya@gmail.com>
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
[why]
The intend was to drop 'Sans Mono' in the renaming process, because the
name is just too long.
ERROR: VeraMono-Italic.ttf ====-< Shortening too long PS family name: BitstromWeraSansM Nerd Font Mono -> BitstromWeraSansM Nerd Font Mon
ERROR: VeraMono-Italic.ttf ====-< Family (ID 1) too long (32 > 31): BitstromWeraSansM Nerd Font Mono
[how]
Include the whole name in the replacement pattern.
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
[why]
The license of Bitstream Vera requires patched fonts to contain neither
"Bitstream" nor "Vera" in the name. It explicitly requires that also
for fonts that (only) add some glyphs.
Yes, we are rather late to notice this :-( Sorry.
[how]
Rename Bitstream Vera to BitstromWera, and also drop the Sans Mono part
of the name. The new name looks and sounds similar enough to get the
reference, while being shorter and somewhat logical.
Fixes: #1173
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
[why]
Because we do not know if a complete family of fonts has an italic face
we must always assume it does. To get clean RIBBI families in ID1/2 we
create a different family for the oblique slant.
But that is not needed if the font does not have an italic slant, but
just an oblique one (like Bitstream Vera and descendants).
[how]
Add new command line option for font-patcher that specifies if the
family of fonts should be patched under the assumption that there might
be an italic face (default), or if we are sure there is none (and we can
leave oblique in the RIBBI group).
This is then applied to the config.cfg files.
Note that this does not take into account any other of the known_slants.
But they are not encountered in any of our prepatched fonts.
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
[why]
Oblique is not detected correctly anymore.
[how]
With commit
ae656bad8 name-parser: Further formalize style handling
'Oblique' has been taken out of the direct 'known_names' which has been
replaced by a more detailed list of known name parts. It ended up in
known_slopes.
But known_sloped is not taken into consideration as 'weight' when parsing
the font name - no it ends up in 'rest'.
This has been obviously overlooked.
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
[why]
It's not nessecary to shorten the PSname so much when no shortening is
in place otherwise. This has been thought of as a good idea, because
noone really cares about the PSname and we can avoid any problems. But
checking with the current set of sourcefonts and using the current
shortening options, keeping it longer is never a problem.
It would be a problem for the Fullname ID4 before, and so we always
shorten more.
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
[why]
The systematic evaluation of all fonts is finished and we do not need
any comparison with the old naming anymore.
This can partially replaced by something like
NERDFONTS='--debug --dry --makegroups 1' ./gotta-patch-em-all-font-patcher\!.sh -cv /iA-Writer | grep '==='
[note]
Also update query_names helper to what I used recently with length
indicators.
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
[why]
We have both
iA Writer Duospace
iA Writer Duo S
These are the same fonts, Duospace is just the former name of Duo S.
Duospace is version 1.005
Duo S (and Mono and Quattro) is version 2.000
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
[why]
It is hard to grep for all naming related errors, because there is no
common format.
[how]
Make them also visually similar and error cases easily spotted.
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
[why]
Some fonts have so long base names that we can not, even very
abbreviated as 'NF', add the Nerd Font designator anymore.
In this case we need to rename the font even if it has no RFN just to
make it shorter.
[note]
As '(TTF)' is dropped now from Terminus we do not need to handle it
specifically anymore.
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
[why]
We use a prepatched font not the original Anonymous Pro.
The prepatched font contains no bitmaps and is thus like
Anonymous Pro Minus. Also some font internals that fontforge does not
copy out of the box are differing.
And we miss the Bold and Italic variants.
[how]
Crossgrade to original Anonymous Pro as source and add the missing
weight/style.
Add Anonymous to SIL.
Handle 'Pro' naming parts (do not detect 'r' as short for 'Regular').
[note]
Maybe related: #1174
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
[why]
If the font name is changed in a way where it now ends in a blank (for
example because 'Name Momo' got 'Momo' dropped: 'Name '), that blank is
not removed immediately.
Well, it is later on, but anyhow.
This can only happen on malformed SIL entries. But we want to have a
correct replacement anyhow.
[how]
Remove trailing whitespace after replacements.
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
[why]
CodeClimate does not allow 'complicated' functions. In a previous commit
we added more if-s to a function that afterwards was rejected by
CodeClimate. To fix that the if-s have been replaced with arithmetic.
That is
a) less readable than if-s
b) has a bug
[how]
Change the code back to if-s but put them into yet another function.
Hopefully we do not blow up CodeClimate's maximum number of functions
per file limit now...
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
[why]
The shortened name is not as expected "BigBlueTerminal437 Nerd Font"
but some obscure "c7 Nerd Font".
[how]
The backreference marker `\1` is directly in front of the string `437`
which yields the replacement `\1437`. Python is not smart enough to
correctly handle that (but 'sed' for example is).
Instead use a named backreference which does not clash with the
following digits.
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
[why]
When we have a weight/width that can take a modifier, and a modifier is
present we always take the shortest form of the weight/width.
This is not how it is customarily done.
Experienced:
ExtraCondensed ExtraBold -> ExtCd ExtBd
Expected:
ExtraCondensed ExtraBold -> ExtCond ExtBd
[how]
In case a modifier is present:
Use the shortest form for weights.
Use the longer short form for widths.
[note]
Also circumvent CodeClimate issue by replacing if-s with formulas.
And adding one nonsense entry to the data tables, because they were
too 'similar' :rolleyes:
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
[why]
We want to keep "Nerd Font" in the font name if possible and instead
shorten the weight part with accepted abbreviations. But these abbrevs
are hard to read and sometimes a more mild abbreviating might be
sufficient to get the desired name length.
[how]
Introduce a new shortening method for the weight parts of a family name.
It takes a longer word (often un-shortened) when a weight stands on its
own, but when a modifier is used together with the weight the more
aggressive two-letter abbreviations are used.
That new shortening method becomes the default and all the functions get
a new parameter to enforce completely aggressive shortening, i.e. always
use the shortest possible form.
The new way to shorten is exposed all the way out to the font-patcher
user who can select the shortening method as parameter to the
--makegroups option. That option is undocumented because I expect some
changes later on, still.
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
[why]
Some name parts occur in several fonts but they take too much length
that we need to add 'Nerd Font' to the font name.
This can be handled as 'generic' SIL table parts, but the algorithm
stops searching for replacements one it has found one.
[how]
Always evaluate all rules of the SIL table.
Add entries for generics to the SIL table.
Add rule for BigBlueTerminal (437TT).
Also fix rule for MPlus that underwent a naming change with its update.
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
[why]
In a lot fonts when Oblique is moved to the base part of the name the
family gets too long. Since the base part is never shortened it will
stay there and make some fonts will end up with too ong bas families:
DejaVuSansMonoOblique
IosevkaTermOblique
OpenDyslexicOblique
ProggyCleanOblique
[how]
If the name is shortened, take the short form of oblique and add that to
the base name.
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
[why]
The name parts of a font are rather restricted in length. Most
systems/applications do not have any problems with long strings, but
some will complain or ignore such fonts.
At the moment each font needs to be checked individually manually after
patching for length violations, which is hard.
[how]
Issue a message if one name in longer than endorsed.
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>