[why]
Some strings have broken format, because the string should contain a
verbatim backslash.
It seems this is a new warning for Python 3.12
[how]
Use raw strings or escape the escape character via '\\'
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
[why]
The keep-regular rule should add 'Regular' as weight if there is no
weight (e.g. Bold) or style (e.g. Italic).
But when a font does have neither but has a widths specifier it is also
not added.
[how]
Check for some conrete weight and not only any entry in the weight
token, because we - unfortunately - mix weights and widths in that token
set.
We do not need to check the styles because it is technically impossible
for it to comtain Regular and something else.
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
[why]
"RecMonoSemi" looks a bit broken.
[how]
Unchanged version "RecMonoSemicasual" is two chars too long for NFP.
This is independent on makegroups mode, because the PS name is affected.
Use "RecMonoSmCasual" which is just the right length and still the
original is discernible (I guess).
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
[why]
Modifier on their own are not allowed (except "Demi").
The previous commit where we changed the CodeClimate fix from
' ' to '' allowed any modifier to be a stand alone detected word.
This resulted in this font name:
RecMonoCasual Nerd Font Propo Semi
[how]
Remove the cumbesome CodeClimate kludge completely, it just makes the
code more complex without any real benefit. Codeclimate just complains
because our tables look so "similar" :rolleyes: That's data dude!
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
[why]
Usually we want the width before the weight:
ZedMono Nerd Font Extended ExtraBold Italic
but we get:
ZedMono Nerd Font ExtraBold Extended Italic
The reason is that we do not sort widths and weights and handle them as
one list, keeping the original order.
All fonts but Zed have the width before the weight and it never turned
up
[how]
Handle widths and weights on their own and only afterwards concattenate
width (first) to weights (second).
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
[why]
When we add a dummy we need to remove that later on.
Originally that has been introduces to avoid a wrong code duplication
warning.
See how the blank leaks into the name:
ERROR: ====-< Family (ID 1) too long (38 > 31): ZedMono Nerd Font Extended ExtraBold
DEBUG: =====> SubFamily (ID 2) ok ( 6 <=31): Italic
DEBUG: =====> Fullname (ID 4) ok (45 <=63): ZedMono Nerd Font Extended ExtraBold Italic
DEBUG: =====> PSN (ID 6) ok (33 <=63): ZedMonoNF-ExtendedExtraBoldItalic
DEBUG: =====> PrefFamily (ID 16) ok (17 <=31): ZedMono Nerd Font
DEBUG: =====> PrefStyles (ID 17) ok (27 <=31): Extended ExtraBold Italic
DEBUG: =====> PrefStyles (ID 17) ok (27 <=31): Extended ExtraBold Italic
DEBUG: =====> Filename 'ZedMonoNerdFont-ExtendedExtraBoldItalic.ttf'
(Note trailing blanks even in ID 1.)
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
'for Code' variants.
Rename RecMonoSemicausal to RecMonoSemi to avoid too long font names
after we add 'Nerd Font Mono' )or even (NFM) to it.
Fixes: #845
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>
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 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]
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]
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]
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]
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]
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]
Cognitive burden of shorten_style_name() is 13 (allowed 9).
Duplicate code
if self.use_short_families[1]:
weights = FontnameTools.short_styles(weights)
styles = FontnameTools.short_styles(styles)
[how]
I do not really buy the duplicate code issue (but circumvent it anyway).
shorten_style_name() was really hard to grasp, maybe use of a helper
function makes it more readable.
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
[why]
Some styles can not take modifiers. We handle the shortening as if they
can. That is not a problem but mighht be unexpected.
Do detect weights we have a fixed list, but that is missing a lot
weights that we would be able to shorten.
The shortening does not work for 'Retina', which is imho a more recent
'invention' (after the paper of the previous commit has been written).
[how]
Separate known weights and make them accessible from other functions.
Use these data tables also for weight detection.
Introduce 'Retina' in the weights table.
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
[why]
We really struggle to keep the font names below the length limits. To
achieve this some styles are abbreviated. The abbreviations have been
taken from Noto and were initially used to mimic Noto's naming scheme.
But a bit shorter names would help in some instances to produce short
enough name entries. Also some styles that are used by fonts other than
Noto are not abbreviated at all.
[how]
In document [1] Adobe gives examples of very short style abbreviations.
We just implement all these.
Example: 'ExtraCondensed' now becomes 'XCn' instead of the more readable
but longer 'ExtCond' that Noto uses.
[1] https://adobe-type-tools.github.io/font-tech-notes/pdfs/5088.FontNames.pdf
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
[why]
The font was always called 3270.
Having a big company's name in the fontname is scary 😬
See
https://github.com/rbanffy/3270font/issues/60
[how]
Add renaming rule.
Fixes: #1012
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
[why]
Somehow the `IBM 3270 SemiCondensed` font turn out as
`IBM3270Semi Nerd Font Condensed`.
The 3270 font always had the quirk to have a non-standard style with a
dash. We have specific code to circumvent that.
[how]
After updating 3270 the 'Narrow' had been renamed to 'Condensed' and so
our specific patch did not work anymore.
Adapt the regex to find the new style that needs correction.
[note]
https://github.com/ryanoasis/nerd-fonts/issues/1012#issuecomment-1385497230
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
[why]
The naming has bizarre blanks strewn in sometimes,
or is all caps. For example
`C a s k a y d i a C o v e` or
`CASKAYDIACOVE-Regular`
[how]
When run under Python2 all strings are unicode strings because
`unicode_literals` is imported by `font-patcher`.
Unfortunately the code checks for type str; but that will all become
type unicode with the import.
One check is suboptimal anyhow and can be dropped, while the other is
turned around.
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
DO NOT MERGE
[why]
A lot of the fonts have incorrect naming after patching. A completely
different approach can help to come up with a consistent naming scheme.
[how]
See bin/scripts/name-parser/README.md
Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>