- From: Yves Lafon via cvs-syncmail <cvsmail@w3.org>
- Date: Thu, 08 Sep 2005 12:24:03 +0000
- To: www-validator-cvs@w3.org
Update of /sources/public/2002/css-validator/org/w3c/css/selectors
In directory hutz:/tmp/cvs-serv8236/org/w3c/css/selectors
Added Files:
AdjacentSelector.java AttributeSelector.java
ChildSelector.java ClassSelector.java DescendantSelector.java
IdSelector.java PseudoClassSelector.java
PseudoElementSelector.java PseudoFactory.java
PseudoFunctionSelector.java Selector.java SelectorsList.java
TypeSelector.java UniversalSelector.java
Log Message:
Changes from Jean-Guilhem Rouel
Bug fixed: 1174 845 160 766
See
http://www.w3.org/Bugs/Public/show_bug.cgi?id=1174
http://www.w3.org/Bugs/Public/show_bug.cgi?id=845
http://www.w3.org/Bugs/Public/show_bug.cgi?id=160
http://www.w3.org/Bugs/Public/show_bug.cgi?id=766
The handling of selectors has been redone almost entirely.
Also, changelog in files has been removed.
--- NEW FILE: UniversalSelector.java ---
// $Id: UniversalSelector.java,v 1.1 2005/09/08 12:24:01 ylafon Exp $
// 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;
/**
* Universal<br />
* Created: Sep 1, 2005 3:45:13 PM<br />
*/
public class UniversalSelector implements Selector {
/**
* @see Selector#toString()
*/
public String toString() {
return "*";
}
/**
* @see Selector#canApply(Selector)
*/
public boolean canApply(Selector other) {
return false;
}
/**
* @see Selector#getName()
*/
public String getName() {
return "*";
}
}
--- NEW FILE: SelectorsList.java ---
// $Id: SelectorsList.java,v 1.1 2005/09/08 12:24:01 ylafon Exp $
// 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;
import java.util.ArrayList;
import org.w3c.css.selectors.attributes.AttributeAny;
import org.w3c.css.selectors.attributes.AttributeBegin;
import org.w3c.css.selectors.attributes.AttributeExact;
import org.w3c.css.util.ApplContext;
import org.w3c.css.util.InvalidParamException;
/**
* SelectorsList<br />
* A class to manage a list of selectors. The following selectors exists:
* <ul>
* <li>Universal: *</li>
* <li>Type: E</li>
* <li>Descendant: E F</li>
* <li>Child: E > F</li>
* <li>Adjacent: E + F</li>
* <li>Attribute:
* <ul>
* <li>Any: E[foo]</li>
* <li>Begin: E[lang|=en]</li>
* <li>Exact: E[lang=en]</li>
* <li>One Of: E[lang~=en]</li>
* <li>Start: E[foo^=bar]</li>
* <li>Substring: E[foo*=bar]</li>
* <li>Suffix: E[foo$=bar]</li>
* </ul></li>
* <li>ID: E#myid</li>
* <li>Class: E.myclass</li>
* <li>Pseudo-class: E:first-child, ...</li>
* <li>Pseudo-element: E:first-line, ...</li>
* <li>Pseudo-function:
* <ul>
* <li>contains</li>
* <li>lang</li>
* <li>not</li>
* <li>nth-child</li>
* <li>nth-last-child</li>
* <li>nth-of-type</li>
* <li>nth-last-of-type</li>
* <li>...</li>
* </ul></li>
* </ul>
*
* Created: Sep 1, 2005 3:34:47 PM<br />
*/
public class SelectorsList {
// the list of selectors
private ArrayList selectors;
private ApplContext ac;
private int specificity;
/**
* Creates a new empty SelectorsList
*/
public SelectorsList() {
selectors = new ArrayList();
}
/**
* Creates a new SelectorsList given an context
* @param ac the context in which the selectors appear
*/
public SelectorsList(ApplContext ac) {
this.ac = ac;
selectors = new ArrayList();
}
/**
* Returns the selectors list
* @return Returns the selectors list.
*/
public ArrayList getSelectors() {
return selectors;
}
/**
* Sets the selectors list
* @param selectors The selectors list to set.
*/
public void setSelectors(ArrayList selectors) {
this.selectors = selectors;
}
/**
* Return the nth selector in this SelectorsList
* @param index the index of the selector to retreive
* @return the nth selector
*/
public Selector getSelector(int index) {
return (Selector) selectors.get(index);
}
/**
* The number of selectors in this SelectorsList
* @return the number of selectors in this SelectorsList
*/
public int size() {
return selectors.size();
}
/**
* Adds a selector to this SelectorsList
* @param selector the selector to add
* @throws InvalidParamException when trying to add a selector after a pseudo-element
*/
public void addSelector(Selector selector) throws InvalidParamException {
if(selectors.size() > 0) {
Selector last = (Selector) selectors.get(selectors.size() - 1);
if(last instanceof PseudoElementSelector) {
throw new InvalidParamException("pseudo-element", selector, ac);
}
}
selectors.add(selector);
}
/**
* Adds an attribute selector
* @param attribute the attribute selector to add
* @throws InvalidParamException when trying to add a selector after a pseudo-element
*/
public void addAttribute(AttributeSelector attribute)
throws InvalidParamException {
addSelector(attribute);
}
/**
* Adds an universal selector
* @param universal the universal selector to add
* @throws InvalidParamException when trying to add a selector after a pseudo-element
*/
public void addUniversal(UniversalSelector universal)
throws InvalidParamException {
addSelector(universal);
}
/**
* Adds a type selector
* @param type the type selector to add
* @throws InvalidParamException when trying to add a selector after a pseudo-element
*/
public void addType(TypeSelector type) throws InvalidParamException {
addSelector(type);
}
/**
* Adds a descendant selector
* @param descendant the descendant selector to add
* @throws InvalidParamException when trying to add a selector after a pseudo-element
*/
public void addDescendant(DescendantSelector descendant)
throws InvalidParamException {
addSelector(descendant);
}
/**
* Adds a child selector
* @param child the child selector to add
* @throws InvalidParamException when trying to add a selector after a pseudo-element
*/
public void addChild(ChildSelector child) throws InvalidParamException {
addSelector(child);
}
/**
* Adds a pseudo-class selector
* @param pc the pseudo-class to add
* @throws InvalidParamException when trying to add a selector after a pseudo-element
*/
public void addPseudoClass(PseudoClassSelector pc)
throws InvalidParamException {
addSelector(pc);
}
/**
* Adds a pseudo-element selector
* No other selector can be added after a pseudo-element
* @param pe the pseudo-element to add
* @throws InvalidParamException when trying to add a selector after a pseudo-element
*/
public void addPseudoElement(PseudoElementSelector pe)
throws InvalidParamException {
addSelector(pe);
}
/**
* Adds a pseudo-function selector
* @param pf the pseudo-function to add
* @throws InvalidParamException when trying to add a selector after a pseudo-element
*/
public void addPseudoFunction(PseudoFunctionSelector pf)
throws InvalidParamException {
addSelector(pf);
}
/**
* Adds an adjacent selector
* @param adjacent the adjacent selector to add
* @throws InvalidParamException when trying to add a selector after a pseudo-element
*/
public void addAdjacent(AdjacentSelector adjacent)
throws InvalidParamException {
addSelector(adjacent);
}
/**
* Adds a class selector
* @param cs the class selector to add
* @throws InvalidParamException when trying to add a selector after a pseudo-element
*/
public void addClass(ClassSelector cs) throws InvalidParamException {
addSelector(cs);
}
/**
* Adds an id selector
* @param id the id selector to add
* @throws InvalidParamException when trying to add a selector after a pseudo-element
*/
public void addId(IdSelector id) throws InvalidParamException {
addSelector(id);
}
/**
* Returns a String representation of this SelectorsList
* @return the String representation of this SelectorsList
*/
public String toString() {
StringBuffer res = new StringBuffer();
for(int i = 0; i < selectors.size(); i++) {
res.append(selectors.get(i));
}
return res.toString();
}
/**
* Sets the specificity of this SelectorsList
* @param specificity the specificity yo set
*/
public void setSpecificity(int specificity) {
this.specificity = specificity;
}
/**
* Gets (and computes) the specificity of this selector.
*/
public int getSpecificity() {
int a = 0;
int b = 0;
int c = 0;
for(int i = 0; i < size(); i++) {
Selector s = getSelector(i);
if(s instanceof IdSelector) {
a++;
}
else if(s instanceof ClassSelector ||
s instanceof PseudoClassSelector) {
b++;
}
else if(s instanceof TypeSelector ||
s instanceof AttributeSelector) {
c++;
}
// some pseudo-functions might influence the specificity
else if(s instanceof PseudoFunctionSelector) {
specificity += ((PseudoFunctionSelector)s).getSpecificity();
}
}
specificity += a * 100 + b * 10 + c;
return specificity;
}
/**
* Testing method
* @param args unused
*/
public static void main(String[] args) {
SelectorsList s = new SelectorsList();
try {
s.addType(new TypeSelector("E"));
s.addAttribute(new AttributeExact("foo", "warning"));
s.addChild(new ChildSelector());
s.addType(new TypeSelector("F"));
s.addAttribute(new AttributeBegin("lang", "en"));
s.addAttribute(new AttributeAny("bar"));
s.addAdjacent(new AdjacentSelector());
s.addType(new TypeSelector("G"));
s.addId(new IdSelector("id"));
s.addAttribute(new AttributeAny("blop"));
s.addDescendant(new DescendantSelector());
s.addType(new TypeSelector("H"));
System.out.println(s);
}
catch(InvalidParamException e) {
System.err.println(e.getMessage());
}
}
}
--- NEW FILE: AttributeSelector.java ---
// $Id: AttributeSelector.java,v 1.1 2005/09/08 12:24:01 ylafon Exp $
// 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;
import org.w3c.css.util.ApplContext;
/**
* Attribute<br />
* Created: Sep 1, 2005 3:39:15 PM<br />
*/
public abstract class AttributeSelector implements Selector {
private String name;
/**
* Creates a new empty attribute selector
*/
public AttributeSelector() {
}
/**
* Creates a new attribute selector given its name
* @param name the name of this attribute
*/
public AttributeSelector(String name) {
this.name = name;
}
/**
* Sets the name of this attribute selector
* @param name the name of this attribute
*/
public void setName(String name) {
this.name = name;
}
/**
* @see Selector#getName()
*/
public String getName() {
return name;
}
public abstract void applyAttribute(ApplContext ac, AttributeSelector attr);
/**
* @see Selector#toString()
*/
public String toString() {
return "[" + name + "]";
}
}
--- NEW FILE: ClassSelector.java ---
// $Id: ClassSelector.java,v 1.1 2005/09/08 12:24:01 ylafon Exp $
// 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;
/**
* ClassSelector<br />
* Created: Sep 1, 2005 3:59:42 PM<br />
*/
public class ClassSelector implements Selector {
String name;
/**
* Creates a new class selector given its name
* @param name the name of this class selector
*/
public ClassSelector(String name) {
this.name = name;
}
/**
* @see Selector#getName()
*/
public String getName() {
return name;
}
/**
* Sets the name of this class selector
* @param name The name to set.
*/
public void setName(String name) {
this.name = name;
}
/**
* @see Selector#toString()
*/
public String toString() {
return "." + name;
}
/**
* @see Selector#canApply(Selector)
*/
public boolean canApply(Selector other) {
return false;
}
}
--- NEW FILE: TypeSelector.java ---
// $Id: TypeSelector.java,v 1.1 2005/09/08 12:24:01 ylafon Exp $
// 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;
/**
* Type<br />
* Created: Sep 1, 2005 3:57:05 PM<br />
*/
public class TypeSelector implements Selector {
String name;
/**
* Creates a new TypeSelector which name name is type
* @param type the name of this type selector
*/
public TypeSelector(String type) {
this.name = type;
}
/**
* @see Selector#getName()
*/
public String getName() {
return name;
}
/**
* Sets the name of this selector
* @param type The name to set.
*/
public void setName(String type) {
this.name = type;
}
/**
* @see Selector#canApply(Selector)
*/
public boolean canApply(Selector other) {
return false;
}
/**
* @see Selector#toString()
*/
public String toString() {
return name;
}
}
--- NEW FILE: AdjacentSelector.java ---
// $Id: AdjacentSelector.java,v 1.1 2005/09/08 12:24:01 ylafon Exp $
// 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;
/**
* Adjacent<br />
* Created: Sep 1, 2005 3:59:08 PM<br />
*/
public class AdjacentSelector implements Selector {
/**
* @see Selector#toString()
*/
public String toString() {
return " + ";
}
/**
* @see Selector#getName()
*/
public String getName() {
return "+";
}
/**
* @see Selector#canApply(Selector)
*/
public boolean canApply(Selector other) {
return false;
}
}
--- NEW FILE: PseudoClassSelector.java ---
// $Id: PseudoClassSelector.java,v 1.1 2005/09/08 12:24:01 ylafon Exp $
// 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;
/**
* PseudoClass<br />
* Created: Sep 1, 2005 3:58:43 PM<br />
*/
public class PseudoClassSelector implements Selector {
String name;
/**
* Creates a new pseudo-class given its name
* @param name the name of this pseudo-class
*/
public PseudoClassSelector(String name) {
this.name = name;
}
/**
* @see Selector#getName()
*/
public String getName() {
return name;
}
/**
* Sets the name of this pseudo-class
* @param name The name to set.
*/
public void setName(String name) {
this.name = name;
}
/**
* @see Selector#toString()
*/
public String toString() {
return ":" + name;
}
/**
* @see Selector#canApply(Selector)
*/
public boolean canApply(Selector other) {
return false;
}
}
--- NEW FILE: ChildSelector.java ---
// $Id: ChildSelector.java,v 1.1 2005/09/08 12:24:01 ylafon Exp $
// 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;
/**
* Child<br />
* Created: Sep 1, 2005 3:58:00 PM<br />
*/
public class ChildSelector implements Selector {
/**
* @see Selector#toString()
*/
public String toString() {
return " > ";
}
/**
* @see Selector#getName()
*/
public String getName() {
return ">";
}
/**
* @see Selector#canApply(Selector)
*/
public boolean canApply(Selector other) {
return false;
}
}
--- NEW FILE: PseudoElementSelector.java ---
// $Id: PseudoElementSelector.java,v 1.1 2005/09/08 12:24:01 ylafon Exp $
// 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;
/**
* PseudoElement<br />
* Created: Sep 1, 2005 3:54:07 PM<br />
*/
public class PseudoElementSelector implements Selector {
String name;
/**
* Creates a new pseudo-element given it's name
* @param name the name of this pseudo-element
*/
public PseudoElementSelector(String name) {
this.name = name;
}
/**
* @see Selector#getName()
*/
public String getName() {
return name;
}
/**
* Sets the name of this pseudo-element
* @param name The name to set.
*/
public void setName(String name) {
this.name = name;
}
/**
* @see Selector#toString()
*/
public String toString() {
return ":" + name;
}
/**
* @see Selector#canApply(Selector)
*/
public boolean canApply(Selector other) {
return false;
}
}
--- NEW FILE: PseudoFunctionSelector.java ---
// $Id: PseudoFunctionSelector.java,v 1.1 2005/09/08 12:24:01 ylafon Exp $
// 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;
/**
* PseudoFunction<br />
* Created: Sep 2, 2005 4:04:45 PM<br />
*/
public class PseudoFunctionSelector implements Selector {
private String name;
private Object param;
/**
* Creates a new empty function selector
*/
public PseudoFunctionSelector() {
}
/**
* @see Selector#getName()
*/
public String getName() {
return name;
}
/**
* Sets the name of this pseudo-function
* @param name The name to set.
*/
public void setName(String name) {
this.name = name;
}
/**
* Returns the parameter of this pseudo-function.
* @return the parameter of this pseudo-function.
*/
public Object getParam() {
return param;
}
/**
* Sets the parameter of this pseudo-function
* @param param The param to set.
*/
public void setParam(Object param) {
this.param = param;
}
/**
* Returns the specifictiy of this pseudo-function
* @return
*/
public int getSpecificity() {
return 0;
}
/**
* @see Selector#canApply(Selector)
*/
public boolean canApply(Selector other) {
return false;
}
/**
* @see Selector#toString()
*/
public String toString() {
return ":" + name + "(" + param + ")";
}
}
--- NEW FILE: PseudoFactory.java ---
// $Id: PseudoFactory.java,v 1.1 2005/09/08 12:24:01 ylafon Exp $
// 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;
/**
* PseudoFactory<br />
* Created: Sep 2, 2005 2:41:09 PM<br />
*/
public class PseudoFactory {
private static final String[] PSEUDOCLASS_CONSTANTSCSS3 =
{ "link", "visited", "active", "focus", "target",
"hover", "first-child", "enabled", "disabled",
"checked", "indeterminate", "root", "last-child",
"first-of-type", "last-of-type", "only-of-type",
"only-child", "empty", "valid", "invalid", "required",
"optional", "read-only", "read-write",
"default", "in-range", "out-of-range"
};
private static final String[] PSEUDOCLASS_CONSTANTSCSS2 =
{
"link", "visited", "active", "target", "focus",
"hover", "first-child"
};
private static final String[] PSEUDOCLASS_CONSTANTSTV =
{
"link", "visited", "active", "focus", "first-child"
};
private static final String[] PSEUDOCLASS_CONSTANTSCSS1 =
{
"link", "visited", "active", "target"
};
private static final String[] PSEUDOCLASS_CONSTANTS_MOBILE =
{
"link", "visited", "active", "focus"
};
private static final String[] PSEUDOELEMENT_CONSTANTSCSS3 =
{
"first-line", "first-letter", "before", "after",
"selection", "marker", "value", "choices", "repeat-item",
"repeat-index"
};
private static final String[] PSEUDOELEMENT_CONSTANTSCSS2 =
{
"first-line", "first-letter", "before", "after"
};
private static final String[] PSEUDOELEMENT_CONSTANTSCSS1 =
{
"first-line", "first-letter"
};
private static final String[] PSEUDOFUNCTION_CONSTANTSCSS3 =
{
"nth-child", "nth-last-child", "nth-of-type", "nth-last-of-type",
"lang", "contains", "not"
};
private static final String[] PSEUDOFUNCTION_CONSTANTSCSS2 =
{
"lang"
};
/**
* Returns the possible pseudo-classes for a profile
* @param profile the profile to get associated pseudo-classes
* @return the possible pseudo-classes for the profile
*/
public static String[] getPseudoClass(String profile) {
if(profile == null || profile.equals("css2")) {
return PSEUDOCLASS_CONSTANTSCSS2;
}
if(profile.equals("css1")) {
return PSEUDOCLASS_CONSTANTSCSS1;
}
if(profile.equals("css3")) {
return PSEUDOCLASS_CONSTANTSCSS3;
}
if(profile.equals("tv")) {
return PSEUDOCLASS_CONSTANTSTV;
}
if(profile.equals("mobile")) {
return PSEUDOCLASS_CONSTANTS_MOBILE;
}
return null;
}
/**
* Returns the possible pseudo-elements for a profile
* @param profile the profile to get associated pseudo-elements
* @return the possible pseudo-elements for the profile
*/
public static String[] getPseudoElement(String profile) {
if(profile == null || profile.equals("css2") || profile.equals("tv")) {
return PSEUDOELEMENT_CONSTANTSCSS2;
}
if(profile.equals("css1")) {
return PSEUDOELEMENT_CONSTANTSCSS1;
}
if(profile.equals("css3")) {
return PSEUDOELEMENT_CONSTANTSCSS3;
}
return null;
}
/**
* Returns the possible pseudo-functions for a profile
* @param profile the profile to get associated pseudo-functions
* @return the possible pseudo-functions for the profile
*/
public static String[] getPseudoFunction(String profile) {
if(profile == null || profile.equals("css2") ||
profile.equals("mobile") || profile.equals("tv")) {
return PSEUDOFUNCTION_CONSTANTSCSS2;
}
if(profile.equals("css3")) {
return PSEUDOFUNCTION_CONSTANTSCSS3;
}
return null;
}
}
--- NEW FILE: IdSelector.java ---
// $Id: IdSelector.java,v 1.1 2005/09/08 12:24:01 ylafon Exp $
// 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;
/**
* IdSelector<br />
* Created: Sep 1, 2005 4:45:00 PM<br />
*/
public class IdSelector implements Selector {
String name;
/**
* Creates a new id selector given its name
* @param name
*/
public IdSelector(String name) {
this.name = name;
}
/**
* @see Selector#getName()
*/
public String getName() {
return name;
}
/**
* Sets the name of this id selector
* @param name The name to set.
*/
public void setName(String name) {
this.name = name;
}
/**
* @see Selector#toString()
*/
public String toString() {
return "#" + name;
}
/**
* @see Selector#canApply(Selector)
*/
public boolean canApply(Selector other) {
return false;
}
}
--- NEW FILE: Selector.java ---
// $Id: Selector.java,v 1.1 2005/09/08 12:24:01 ylafon Exp $
// 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;
/**
* Selector<br />
* Basic class for all the selectors
* Created: Sep 1, 2005 3:31:35 PM<br />
*/
public interface Selector {
/**
* Returns a String representation of this Selector
* @return the String representation of this Selector
*/
public String toString();
/**
* Returns the name of this selector
* @return
*/
public String getName();
/**
* Returns <code>true</code> if a selector can be applied to this selector
* @param other
* @return
*/
public boolean canApply(Selector other);
}
--- NEW FILE: DescendantSelector.java ---
// $Id: DescendantSelector.java,v 1.1 2005/09/08 12:24:01 ylafon Exp $
// 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;
/**
* Descendant<br />
* Created: Sep 1, 2005 3:57:40 PM<br />
*/
public class DescendantSelector implements Selector {
/**
* @see Selector#toString()
*/
public String toString() {
return " ";
}
/**
* @see Selector#getName()
*/
public String getName() {
return " ";
}
/**
* @see Selector#canApply(Selector)
*/
public boolean canApply(Selector other) {
return false;
}
}
Received on Thursday, 8 September 2005 12:24:11 UTC