in batik-css/src/main/java/org/apache/batik/css/engine/value/css2/FontShorthandManager.java [144:335]
public void setValues(CSSEngine eng,
ShorthandManager.PropertyHandler ph,
LexicalUnit lu,
boolean imp) {
switch (lu.getLexicalUnitType()) {
case LexicalUnit.SAC_INHERIT: return;
case LexicalUnit.SAC_IDENT: {
String s = lu.getStringValue().toLowerCase();
if (values.contains(s)) {
handleSystemFont(eng, ph, s, imp);
return;
}
}
}
LexicalUnit fontStyle = null;
LexicalUnit fontVariant = null;
LexicalUnit fontWeight = null;
LexicalUnit fontSize = null;
LexicalUnit lineHeight = null;
LexicalUnit fontFamily = null;
ValueManager[]vMgrs = eng.getValueManagers();
int fst, fv, fw, fsz, lh;
fst = eng.getPropertyIndex(CSSConstants.CSS_FONT_STYLE_PROPERTY);
fv = eng.getPropertyIndex(CSSConstants.CSS_FONT_VARIANT_PROPERTY);
fw = eng.getPropertyIndex(CSSConstants.CSS_FONT_WEIGHT_PROPERTY);
fsz = eng.getPropertyIndex(CSSConstants.CSS_FONT_SIZE_PROPERTY);
lh = eng.getPropertyIndex(CSSConstants.CSS_LINE_HEIGHT_PROPERTY);
IdentifierManager fstVM = (IdentifierManager)vMgrs[fst];
IdentifierManager fvVM = (IdentifierManager)vMgrs[fv];
IdentifierManager fwVM = (IdentifierManager)vMgrs[fw];
FontSizeManager fszVM = (FontSizeManager)vMgrs[fsz];
StringMap fstSM = fstVM.getIdentifiers();
StringMap fvSM = fvVM.getIdentifiers();
StringMap fwSM = fwVM.getIdentifiers();
StringMap fszSM = fszVM.getIdentifiers();
// Check for font-style, font-variant, & font-weight
// These are all optional.
boolean svwDone= false;
LexicalUnit intLU = null;
while (!svwDone && (lu != null)) {
switch (lu.getLexicalUnitType()) {
case LexicalUnit.SAC_IDENT: {
String s = lu.getStringValue().toLowerCase().intern();
if (fontStyle == null && fstSM.get(s) != null) {
fontStyle = lu;
if (intLU != null) {
if (fontWeight == null) {
fontWeight = intLU;
intLU = null;
} else {
throw createInvalidLexicalUnitDOMException
(intLU.getLexicalUnitType());
}
}
break;
}
if (fontVariant == null && fvSM.get(s) != null) {
fontVariant = lu;
if (intLU != null) {
if (fontWeight == null) {
fontWeight = intLU;
intLU = null;
} else {
throw createInvalidLexicalUnitDOMException
(intLU.getLexicalUnitType());
}
}
break;
}
if (intLU == null && fontWeight == null
&& fwSM.get(s) != null) {
fontWeight = lu;
break;
}
svwDone = true;
break;
}
case LexicalUnit.SAC_INTEGER:
if (intLU == null && fontWeight == null) {
intLU = lu;
break;
}
svwDone = true;
break;
default: // All other must be size,'/line-height', family
svwDone = true;
break;
}
if (!svwDone) lu = lu.getNextLexicalUnit();
}
// Must have font-size.
if (lu == null)
throw createMalformedLexicalUnitDOMException();
// Now we need to get font-size
switch (lu.getLexicalUnitType()) {
case LexicalUnit.SAC_IDENT: {
String s= lu.getStringValue().toLowerCase().intern();
if (fszSM.get(s) != null) {
fontSize = lu; // This is a font-size ident.
lu = lu.getNextLexicalUnit();
}
}
break;
case LexicalUnit.SAC_EM:
case LexicalUnit.SAC_EX:
case LexicalUnit.SAC_PIXEL:
case LexicalUnit.SAC_CENTIMETER:
case LexicalUnit.SAC_MILLIMETER:
case LexicalUnit.SAC_INCH:
case LexicalUnit.SAC_POINT:
case LexicalUnit.SAC_PICA:
case LexicalUnit.SAC_INTEGER:
case LexicalUnit.SAC_REAL:
case LexicalUnit.SAC_PERCENTAGE:
fontSize = lu;
lu = lu.getNextLexicalUnit();
break;
}
if (fontSize == null) {
// We must have a font-size so see if we can use intLU...
if (intLU != null) {
fontSize = intLU; // Yup!
intLU = null;
} else {
throw createInvalidLexicalUnitDOMException
(lu.getLexicalUnitType());
}
}
if (intLU != null) {
// We have a intLU left see if we can use it as font-weight
if (fontWeight == null) {
fontWeight = intLU; // use intLU as font-weight.
} else {
// we have an 'extra' integer in property.
throw createInvalidLexicalUnitDOMException
(intLU.getLexicalUnitType());
}
}
// Must have Font-Family, so if it's null now we are done!
if (lu == null)
throw createMalformedLexicalUnitDOMException();
// Now at this point we want to look for
// line-height.
switch (lu.getLexicalUnitType()) {
case LexicalUnit.SAC_OPERATOR_SLASH: // we have line-height
lu = lu.getNextLexicalUnit();
if (lu == null) // OOPS!
throw createMalformedLexicalUnitDOMException();
lineHeight = lu;
lu = lu.getNextLexicalUnit();
break;
}
// Must have Font-Family, so if it's null now we are done!
if (lu == null)
throw createMalformedLexicalUnitDOMException();
fontFamily = lu;
if (fontStyle == null) fontStyle = NORMAL_LU;
if (fontVariant == null) fontVariant = NORMAL_LU;
if (fontWeight == null) fontWeight = NORMAL_LU;
if (lineHeight == null) lineHeight = NORMAL_LU;
ph.property(CSSConstants.CSS_FONT_FAMILY_PROPERTY, fontFamily, imp);
ph.property(CSSConstants.CSS_FONT_STYLE_PROPERTY, fontStyle, imp);
ph.property(CSSConstants.CSS_FONT_VARIANT_PROPERTY, fontVariant, imp);
ph.property(CSSConstants.CSS_FONT_WEIGHT_PROPERTY, fontWeight, imp);
ph.property(CSSConstants.CSS_FONT_SIZE_PROPERTY, fontSize, imp);
if (lh != -1) {
ph.property(CSSConstants.CSS_LINE_HEIGHT_PROPERTY,
lineHeight, imp);
}
}