Skip to content

Commit 2fb51af

Browse files
committed
support case-insensitively syntax for attribute values (https://www.w3.org/TR/selectors-4/#attribute-case)
1 parent 9796b49 commit 2fb51af

15 files changed

+2879
-2643
lines changed

src/main/java/com/gargoylesoftware/css/parser/AbstractCSSParser.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,9 @@ public abstract class AbstractCSSParser {
8181
parserMessages_.put("invalidPagePseudoClass",
8282
"Invalid page pseudo class \"{0}\"; valid values are \"blank\", \"first\", \"left\", and \"right\".");
8383

84+
parserMessages_.put("invalidCaseInSensitivelyIdentifier",
85+
"Invalid case-insensitively identifier \"{0}\" found; valid values are \"i\", and \"s\".");
86+
8487
parserMessages_.put("ignoringRule", "Ignoring the whole rule.");
8588
parserMessages_.put("ignoringFollowingDeclarations", "Ignoring the following declarations in this rule.");
8689

src/main/java/com/gargoylesoftware/css/parser/condition/AttributeCondition.java

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,18 @@ public class AttributeCondition extends AbstractLocatable implements Condition,
2525

2626
private final String localName_;
2727
private final String value_;
28+
private final Boolean caseInSensitive_;
2829

2930
/**
3031
* Ctor.
3132
* @param localName the local value
3233
* @param value the value
34+
* @param caseInSensitive null if not set, true/false for i/s
3335
*/
34-
public AttributeCondition(final String localName, final String value) {
36+
public AttributeCondition(final String localName, final String value, final Boolean caseInSensitive) {
3537
localName_ = localName;
3638
value_ = value;
39+
caseInSensitive_ = caseInSensitive;
3740
}
3841

3942
@Override
@@ -57,12 +60,33 @@ public String getValue() {
5760
return value_;
5861
}
5962

63+
/**
64+
* @return true if the caseInsensitive option was set
65+
*/
66+
public boolean isCaseInSensitive() {
67+
return caseInSensitive_ != null && caseInSensitive_.booleanValue();
68+
}
69+
70+
public String getOperator() {
71+
return "=";
72+
}
73+
6074
@Override
6175
public String toString() {
76+
String insensitive = "";
77+
if (caseInSensitive_ != null) {
78+
if (caseInSensitive_.booleanValue()) {
79+
insensitive = " i";
80+
}
81+
else {
82+
insensitive = " s";
83+
}
84+
}
85+
6286
final String value = getValue();
6387
if (value != null) {
64-
return "[" + getLocalName() + "=\"" + value + "\"]";
88+
return "[" + getLocalName() + getOperator() + "\"" + value + "\"" + insensitive + "]";
6589
}
66-
return "[" + getLocalName() + "]";
90+
return "[" + getLocalName() + "" + insensitive + "]";
6791
}
6892
}

src/main/java/com/gargoylesoftware/css/parser/condition/BeginHyphenAttributeCondition.java

Lines changed: 7 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -14,56 +14,29 @@
1414
*/
1515
package com.gargoylesoftware.css.parser.condition;
1616

17-
import java.io.Serializable;
18-
19-
import com.gargoylesoftware.css.parser.AbstractLocatable;
20-
2117
/**
2218
* @author Ronald Brill
2319
*/
24-
public class BeginHyphenAttributeCondition extends AbstractLocatable implements Condition, Serializable {
25-
26-
private final String localName_;
27-
private final String value_;
20+
public class BeginHyphenAttributeCondition extends AttributeCondition {
2821

2922
/**
3023
* Ctor.
31-
* @param localName the local name
24+
* @param localName the local value
3225
* @param value the value
26+
* @param caseInSensitive null if not set, true/false for i/s
3327
*/
34-
public BeginHyphenAttributeCondition(final String localName, final String value) {
35-
localName_ = localName;
36-
value_ = value;
28+
public BeginHyphenAttributeCondition(final String localName, final String value, final Boolean caseInSensitive) {
29+
super(localName, value, caseInSensitive);
3730
}
3831

3932
@Override
4033
public ConditionType getConditionType() {
4134
return ConditionType.BEGIN_HYPHEN_ATTRIBUTE_CONDITION;
4235
}
4336

44-
/**
45-
* {@inheritDoc}
46-
*/
47-
@Override
48-
public String getLocalName() {
49-
return localName_;
50-
}
51-
52-
/**
53-
* {@inheritDoc}
54-
*/
55-
@Override
56-
public String getValue() {
57-
return value_;
58-
}
59-
6037
@Override
61-
public String toString() {
62-
final String value = getValue();
63-
if (value != null) {
64-
return "[" + getLocalName() + "|=\"" + value + "\"]";
65-
}
66-
return "[" + getLocalName() + "]";
38+
public String getOperator() {
39+
return "|=";
6740
}
6841
}
6942

src/main/java/com/gargoylesoftware/css/parser/condition/OneOfAttributeCondition.java

Lines changed: 7 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -14,55 +14,28 @@
1414
*/
1515
package com.gargoylesoftware.css.parser.condition;
1616

17-
import java.io.Serializable;
18-
19-
import com.gargoylesoftware.css.parser.AbstractLocatable;
20-
2117
/**
2218
* @author Ronald Brill
2319
*/
24-
public class OneOfAttributeCondition extends AbstractLocatable implements Condition, Serializable {
25-
26-
private final String localName_;
27-
private final String value_;
20+
public class OneOfAttributeCondition extends AttributeCondition {
2821

2922
/**
3023
* Ctor.
31-
* @param localName the local name
24+
* @param localName the local value
3225
* @param value the value
26+
* @param caseInSensitive null if not set, true/false for i/s
3327
*/
34-
public OneOfAttributeCondition(final String localName, final String value) {
35-
localName_ = localName;
36-
value_ = value;
28+
public OneOfAttributeCondition(final String localName, final String value, final Boolean caseInSensitive) {
29+
super(localName, value, caseInSensitive);
3730
}
3831

3932
@Override
4033
public ConditionType getConditionType() {
4134
return ConditionType.ONE_OF_ATTRIBUTE_CONDITION;
4235
}
4336

44-
/**
45-
* {@inheritDoc}
46-
*/
47-
@Override
48-
public String getLocalName() {
49-
return localName_;
50-
}
51-
52-
/**
53-
* {@inheritDoc}
54-
*/
55-
@Override
56-
public String getValue() {
57-
return value_;
58-
}
59-
6037
@Override
61-
public String toString() {
62-
final String value = getValue();
63-
if (value != null) {
64-
return "[" + getLocalName() + "~=\"" + value + "\"]";
65-
}
66-
return "[" + getLocalName() + "]";
38+
public String getOperator() {
39+
return "~=";
6740
}
6841
}

src/main/java/com/gargoylesoftware/css/parser/condition/PrefixAttributeCondition.java

Lines changed: 7 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -14,55 +14,28 @@
1414
*/
1515
package com.gargoylesoftware.css.parser.condition;
1616

17-
import java.io.Serializable;
18-
19-
import com.gargoylesoftware.css.parser.AbstractLocatable;
20-
2117
/**
2218
* @author Ronlad Brill
2319
*/
24-
public class PrefixAttributeCondition extends AbstractLocatable implements Condition, Serializable {
25-
26-
private final String localName_;
27-
private final String value_;
20+
public class PrefixAttributeCondition extends AttributeCondition {
2821

2922
/**
3023
* Ctor.
31-
* @param localName the loacl value
24+
* @param localName the local value
3225
* @param value the value
26+
* @param caseInSensitive null if not set, true/false for i/s
3327
*/
34-
public PrefixAttributeCondition(final String localName, final String value) {
35-
localName_ = localName;
36-
value_ = value;
28+
public PrefixAttributeCondition(final String localName, final String value, final Boolean caseInSensitive) {
29+
super(localName, value, caseInSensitive);
3730
}
3831

3932
@Override
4033
public ConditionType getConditionType() {
4134
return ConditionType.PREFIX_ATTRIBUTE_CONDITION; //for now
4235
}
4336

44-
/**
45-
* {@inheritDoc}
46-
*/
47-
@Override
48-
public String getLocalName() {
49-
return localName_;
50-
}
51-
52-
/**
53-
* {@inheritDoc}
54-
*/
55-
@Override
56-
public String getValue() {
57-
return value_;
58-
}
59-
6037
@Override
61-
public String toString() {
62-
final String value = getValue();
63-
if (value != null) {
64-
return "[" + getLocalName() + "^=\"" + value + "\"]";
65-
}
66-
return "[" + getLocalName() + "]";
38+
public String getOperator() {
39+
return "^=";
6740
}
6841
}

src/main/java/com/gargoylesoftware/css/parser/condition/SubstringAttributeCondition.java

Lines changed: 7 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -14,55 +14,28 @@
1414
*/
1515
package com.gargoylesoftware.css.parser.condition;
1616

17-
import java.io.Serializable;
18-
19-
import com.gargoylesoftware.css.parser.AbstractLocatable;
20-
2117
/**
2218
* @author Ronald Brill
2319
*/
24-
public class SubstringAttributeCondition extends AbstractLocatable implements Condition, Serializable {
25-
26-
private final String localName_;
27-
private final String value_;
20+
public class SubstringAttributeCondition extends AttributeCondition {
2821

2922
/**
3023
* Ctor.
31-
* @param localName the loacl value
24+
* @param localName the local value
3225
* @param value the value
26+
* @param caseInSensitive null if not set, true/false for i/s
3327
*/
34-
public SubstringAttributeCondition(final String localName, final String value) {
35-
localName_ = localName;
36-
value_ = value;
28+
public SubstringAttributeCondition(final String localName, final String value, final Boolean caseInSensitive) {
29+
super(localName, value, caseInSensitive);
3730
}
3831

3932
@Override
4033
public ConditionType getConditionType() {
4134
return ConditionType.SUBSTRING_ATTRIBUTE_CONDITION; //for now
4235
}
4336

44-
/**
45-
* {@inheritDoc}
46-
*/
47-
@Override
48-
public String getLocalName() {
49-
return localName_;
50-
}
51-
52-
/**
53-
* {@inheritDoc}
54-
*/
55-
@Override
56-
public String getValue() {
57-
return value_;
58-
}
59-
6037
@Override
61-
public String toString() {
62-
final String value = getValue();
63-
if (value != null) {
64-
return "[" + getLocalName() + "*=\"" + value + "\"]";
65-
}
66-
return "[" + getLocalName() + "]";
38+
public String getOperator() {
39+
return "*=";
6740
}
6841
}

src/main/java/com/gargoylesoftware/css/parser/condition/SuffixAttributeCondition.java

Lines changed: 7 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -14,55 +14,28 @@
1414
*/
1515
package com.gargoylesoftware.css.parser.condition;
1616

17-
import java.io.Serializable;
18-
19-
import com.gargoylesoftware.css.parser.AbstractLocatable;
20-
2117
/**
2218
* @author Ronald Brill
2319
*/
24-
public class SuffixAttributeCondition extends AbstractLocatable implements Condition, Serializable {
25-
26-
private final String localName_;
27-
private final String value_;
20+
public class SuffixAttributeCondition extends AttributeCondition {
2821

2922
/**
3023
* Ctor.
31-
* @param localName the loacl value
24+
* @param localName the local value
3225
* @param value the value
26+
* @param caseInSensitive null if not set, true/false for i/s
3327
*/
34-
public SuffixAttributeCondition(final String localName, final String value) {
35-
localName_ = localName;
36-
value_ = value;
28+
public SuffixAttributeCondition(final String localName, final String value, final Boolean caseInSensitive) {
29+
super(localName, value, caseInSensitive);
3730
}
3831

3932
@Override
4033
public ConditionType getConditionType() {
4134
return ConditionType.SUFFIX_ATTRIBUTE_CONDITION; //for now
4235
}
4336

44-
/**
45-
* {@inheritDoc}
46-
*/
47-
@Override
48-
public String getLocalName() {
49-
return localName_;
50-
}
51-
52-
/**
53-
* {@inheritDoc}
54-
*/
55-
@Override
56-
public String getValue() {
57-
return value_;
58-
}
59-
6037
@Override
61-
public String toString() {
62-
final String value = getValue();
63-
if (value != null) {
64-
return "[" + getLocalName() + "$=\"" + value + "\"]";
65-
}
66-
return "[" + getLocalName() + "]";
38+
public String getOperator() {
39+
return "$=";
6740
}
6841
}

0 commit comments

Comments
 (0)