1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package org.htmlunit.javascript.host.css;
16
17 import static org.htmlunit.javascript.host.css.CSSStyleDeclaration.isLength;
18
19 import org.htmlunit.util.StringUtils;
20
21
22
23
24
25
26
27 final class ComputedFont {
28
29
30
31
32
33 static final int FONT_SIZE_INDEX = 3;
34 static final int LINE_HEIGHT_INDEX = 4;
35 static final int FONT_FAMILY_INDEX = 5;
36
37 static String[] getDetails(final String font) {
38 String fontName = font;
39 while (fontName.contains(" ")) {
40 fontName = fontName.replace(" ", " ");
41 }
42 final String[] tokens = StringUtils.splitAtBlank(fontName);
43 if (tokens.length > 1) {
44 final String[] fontSizeDetails = getFontSizeDetails(tokens[tokens.length - 2]);
45 if (fontSizeDetails == null) {
46 return null;
47 }
48 final String[] details = new String[6];
49 details[FONT_SIZE_INDEX] = fontSizeDetails[0];
50 details[LINE_HEIGHT_INDEX] = fontSizeDetails[1];
51 details[FONT_FAMILY_INDEX] = tokens[tokens.length - 1];
52 return details;
53 }
54 return null;
55 }
56
57
58
59
60
61
62
63
64 private static String[] getFontSizeDetails(final String fontSize) {
65 final int slash = fontSize.indexOf('/');
66 final String actualFontSize = slash == -1 ? fontSize : fontSize.substring(0, slash);
67 if (!isLength(actualFontSize)) {
68 return null;
69 }
70
71 String actualLineHeight = slash == -1 ? "" : fontSize.substring(slash + 1);
72 if (actualLineHeight.isEmpty()) {
73 actualLineHeight = null;
74 }
75 else if (!isValidLineHeight(actualLineHeight)) {
76 return null;
77 }
78 return new String[] {actualFontSize, actualLineHeight};
79 }
80
81 private static boolean isValidLineHeight(final String lineHeight) {
82 return isLength(lineHeight) || "normal".equals(lineHeight);
83 }
84
85 private ComputedFont() {
86
87 }
88
89 }