NameHeuristics.java
7.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/*
* Decompiled with CFR 0_118.
*/
package com.adobe.fontengine.font.postscript;
import com.adobe.fontengine.inlineformatting.css20.CSS20Attribute;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public final class NameHeuristics {
private static final PatternToWeight[] weightPatterns = new PatternToWeight[21];
private static final PatternToStretch[] widthPatterns;
private static final Pattern smallCapsPattern;
private static final Pattern[] dingbatsPatterns;
public static int fullNameToWeight(String fullName) {
for (int i = 0; i < weightPatterns.length; ++i) {
if (!NameHeuristics.weightPatterns[i].pattern.matcher(fullName).find()) continue;
return NameHeuristics.weightPatterns[i].weight;
}
return 400;
}
public static int weightNameToWeight(String weightName) {
String s = "-" + weightName;
for (int i = 0; i < weightPatterns.length; ++i) {
if (!NameHeuristics.weightPatterns[i].pattern.matcher(s).lookingAt()) continue;
return NameHeuristics.weightPatterns[i].weight;
}
return 400;
}
public static CSS20Attribute.CSSStretchValue fullNameToWidth(String fullName, String familyName) {
Pattern pattern;
if (familyName != null && (pattern = Pattern.compile(Pattern.quote(familyName) + "[-\\s]*ultra\\s*condensed\\s*(italic|oblique)?", 2)).matcher(fullName).matches()) {
return CSS20Attribute.CSSStretchValue.CONDENSED;
}
for (int i = 0; i < widthPatterns.length; ++i) {
if (!NameHeuristics.widthPatterns[i].pattern.matcher(fullName).find()) continue;
return NameHeuristics.widthPatterns[i].stretch;
}
return CSS20Attribute.CSSStretchValue.NORMAL;
}
public static boolean fullNameIndicatesSmallCaps(String fullName) {
return smallCapsPattern.matcher(fullName).find();
}
public static boolean fullNameIndicatesDingbats(String name) {
if (name == null) {
return false;
}
for (int i = 0; i < dingbatsPatterns.length; ++i) {
if (!dingbatsPatterns[i].matcher(name).find()) continue;
return true;
}
return false;
}
static {
NameHeuristics.weightPatterns[0] = new PatternToWeight(Pattern.compile("[- ]extra\\s*light", 2), 100);
NameHeuristics.weightPatterns[1] = new PatternToWeight(Pattern.compile("[- ]ultra\\s*light", 2), 100);
NameHeuristics.weightPatterns[2] = new PatternToWeight(Pattern.compile("[- ]thin", 2), 200);
NameHeuristics.weightPatterns[3] = new PatternToWeight(Pattern.compile("[- ]highlight", 2), 400);
NameHeuristics.weightPatterns[4] = new PatternToWeight(Pattern.compile("[- ]light", 2), 300);
NameHeuristics.weightPatterns[5] = new PatternToWeight(Pattern.compile("[- ]medium", 2), 500);
NameHeuristics.weightPatterns[6] = new PatternToWeight(Pattern.compile("[- ]semi\\s*bold", 2), 600);
NameHeuristics.weightPatterns[7] = new PatternToWeight(Pattern.compile("[- ]demi\\s*bold", 2), 600);
NameHeuristics.weightPatterns[8] = new PatternToWeight(Pattern.compile("[- ]demi", 2), 600);
NameHeuristics.weightPatterns[9] = new PatternToWeight(Pattern.compile("[- ]extra\\s*bold", 2), 800);
NameHeuristics.weightPatterns[10] = new PatternToWeight(Pattern.compile("[- ]ultra\\s*bold", 2), 800);
NameHeuristics.weightPatterns[11] = new PatternToWeight(Pattern.compile("[- ]extra\\s*black", 2), 950);
NameHeuristics.weightPatterns[12] = new PatternToWeight(Pattern.compile("[- ]ext\\s*black", 2), 950);
NameHeuristics.weightPatterns[13] = new PatternToWeight(Pattern.compile("[- ]ultra\\s*black", 2), 950);
NameHeuristics.weightPatterns[14] = new PatternToWeight(Pattern.compile("[- ]ultra", 2), 900);
NameHeuristics.weightPatterns[15] = new PatternToWeight(Pattern.compile("[- ]super", 2), 800);
NameHeuristics.weightPatterns[16] = new PatternToWeight(Pattern.compile("[- ]bold", 2), 700);
NameHeuristics.weightPatterns[17] = new PatternToWeight(Pattern.compile("[- ]black", 2), 900);
NameHeuristics.weightPatterns[18] = new PatternToWeight(Pattern.compile("[- ]poster", 2), 900);
NameHeuristics.weightPatterns[19] = new PatternToWeight(Pattern.compile("[- ]heavy", 2), 850);
NameHeuristics.weightPatterns[20] = new PatternToWeight(Pattern.compile("[- ]nord", 2), 900);
widthPatterns = new PatternToStretch[17];
NameHeuristics.widthPatterns[0] = new PatternToStretch(Pattern.compile("[- ]ultra\\s*condensed", 2), CSS20Attribute.CSSStretchValue.ULTRACONDENSED);
NameHeuristics.widthPatterns[1] = new PatternToStretch(Pattern.compile("[- ]extra\\s*compressed", 2), CSS20Attribute.CSSStretchValue.ULTRACONDENSED);
NameHeuristics.widthPatterns[2] = new PatternToStretch(Pattern.compile("[- ]ultra\\s*compressed", 2), CSS20Attribute.CSSStretchValue.ULTRACONDENSED);
NameHeuristics.widthPatterns[3] = new PatternToStretch(Pattern.compile("[- ]extra\\s*condensed", 2), CSS20Attribute.CSSStretchValue.EXTRACONDENSED);
NameHeuristics.widthPatterns[4] = new PatternToStretch(Pattern.compile("[- ]compressed", 2), CSS20Attribute.CSSStretchValue.EXTRACONDENSED);
NameHeuristics.widthPatterns[5] = new PatternToStretch(Pattern.compile("[- ]semi\\s*condensed", 2), CSS20Attribute.CSSStretchValue.SEMICONDENSED);
NameHeuristics.widthPatterns[6] = new PatternToStretch(Pattern.compile("[- ]compact", 2), CSS20Attribute.CSSStretchValue.SEMICONDENSED);
NameHeuristics.widthPatterns[7] = new PatternToStretch(Pattern.compile("[- ]narrow", 2), CSS20Attribute.CSSStretchValue.SEMICONDENSED);
NameHeuristics.widthPatterns[8] = new PatternToStretch(Pattern.compile("[- ]condensed", 2), CSS20Attribute.CSSStretchValue.CONDENSED);
NameHeuristics.widthPatterns[9] = new PatternToStretch(Pattern.compile("[- ]semi\\s*expanded", 2), CSS20Attribute.CSSStretchValue.SEMIEXPANDED);
NameHeuristics.widthPatterns[10] = new PatternToStretch(Pattern.compile("[- ]semi\\s*extended", 2), CSS20Attribute.CSSStretchValue.SEMIEXPANDED);
NameHeuristics.widthPatterns[11] = new PatternToStretch(Pattern.compile("[- ]extra\\s*expanded", 2), CSS20Attribute.CSSStretchValue.EXTRAEXPANDED);
NameHeuristics.widthPatterns[12] = new PatternToStretch(Pattern.compile("[- ]extra\\s*extended", 2), CSS20Attribute.CSSStretchValue.EXTRAEXPANDED);
NameHeuristics.widthPatterns[13] = new PatternToStretch(Pattern.compile("[- ]ultra\\s*expanded", 2), CSS20Attribute.CSSStretchValue.ULTRAEXPANDED);
NameHeuristics.widthPatterns[14] = new PatternToStretch(Pattern.compile("[- ]ultra\\s*extended", 2), CSS20Attribute.CSSStretchValue.ULTRAEXPANDED);
NameHeuristics.widthPatterns[15] = new PatternToStretch(Pattern.compile("[- ]expanded", 2), CSS20Attribute.CSSStretchValue.EXPANDED);
NameHeuristics.widthPatterns[16] = new PatternToStretch(Pattern.compile("[- ]extended", 2), CSS20Attribute.CSSStretchValue.EXPANDED);
smallCapsPattern = Pattern.compile("[- ]small\\s*caps", 2);
dingbatsPatterns = new Pattern[]{Pattern.compile("Zapf\\s*Dingbats", 2), Pattern.compile("Adobe\\s*Pi", 2)};
}
private static class PatternToStretch {
final Pattern pattern;
final CSS20Attribute.CSSStretchValue stretch;
PatternToStretch(Pattern pat, CSS20Attribute.CSSStretchValue s) {
this.pattern = pat;
this.stretch = s;
}
}
private static class PatternToWeight {
final Pattern pattern;
final int weight;
PatternToWeight(Pattern pat, int i) {
this.pattern = pat;
this.weight = i;
}
}
}