// $Id$
// Author: Jean-Guilhem Rouel
// (c) COPYRIGHT MIT, ERCIM and Keio, 2005.
// Please first read the full copyright statement in file COPYRIGHT.html
package org.w3c.css.selectors.pseudofunctions;
import org.w3c.css.selectors.PseudoFunctionSelector;
import org.w3c.css.util.ApplContext;
import org.w3c.css.util.InvalidParamException;
import org.w3c.css.values.CssExpression;
import org.w3c.css.values.CssTypes;
import org.w3c.css.values.CssValue;
import java.util.IllformedLocaleException;
import java.util.Locale;
import java.util.Locale.Builder;
import java.util.MissingResourceException;
/**
* PseudoFunctionLang
* Created: Sep 2, 2005 4:24:48 PM
*/
public class PseudoFunctionLang extends PseudoFunctionSelector {
public PseudoFunctionLang(String name, CssExpression exp, ApplContext ac)
throws InvalidParamException {
setName(name);
setParam(parseLang(ac, exp, functionName()));
}
/**
* verify a language tag per BCP47
*
* @param ac the ApplContext
* @param exp the CssExpression containing the value
* @param caller the property/selector/context calling for verification
* @throws InvalidParamException if invalid
*/
public static final CssValue parseLang(ApplContext ac, CssExpression exp, String caller)
throws InvalidParamException {
String lang;
if (exp.getCount() != 1) {
throw new InvalidParamException("unrecognize", caller, ac);
}
CssValue val = exp.getValue();
switch (val.getType()) {
case CssTypes.CSS_IDENT:
lang = val.getIdent().toString();
break;
case CssTypes.CSS_STRING:
lang = val.getString().toString();
if (lang.charAt(0) == '"' || lang.charAt(0) == '\'') {
lang = lang.substring(1, lang.lastIndexOf(lang.charAt(0)));
}
break;
default:
throw new InvalidParamException("value", val.toString(), caller, ac);
}
try {
// FIXME validate ranges and not only TAGS.
if (lang.contains("*")) {
return val;
}
// use Locale builder parsing to check BCP 47 values
Builder builder = new Builder();
builder.setLanguageTag(lang);
Locale l = builder.build();
lang = l.getISO3Language();
return val;
} catch (MissingResourceException|IllformedLocaleException ex) {
throw new InvalidParamException("value", lang, caller, ac);
}
}
}