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 private static String[] getFontSizeDetails(final String fontSize) {
61 final int slash = fontSize.indexOf('/');
62 final String actualFontSize = slash == -1 ? fontSize : fontSize.substring(0, slash);
63 if (!isLength(actualFontSize)) {
64 return null;
65 }
66
67 String actualLineHeight = slash == -1 ? "" : fontSize.substring(slash + 1);
68 if (actualLineHeight.isEmpty()) {
69 actualLineHeight = null;
70 }
71 else if (!isValidLineHeight(actualLineHeight)) {
72 return null;
73 }
74 return new String[] {actualFontSize, actualLineHeight};
75 }
76
77 private static boolean isValidLineHeight(final String lineHeight) {
78 return isLength(lineHeight) || "normal".equals(lineHeight);
79 }
80
81 private ComputedFont() {
82
83 }
84
85 }