1
19 package org.apache.batik.css.engine.value.css2;
20
21 import org.apache.batik.css.engine.CSSEngine;
22 import org.apache.batik.css.engine.value.IdentifierManager;
23 import org.apache.batik.css.engine.value.ListValue;
24 import org.apache.batik.css.engine.value.StringMap;
25 import org.apache.batik.css.engine.value.StringValue;
26 import org.apache.batik.css.engine.value.URIValue;
27 import org.apache.batik.css.engine.value.Value;
28 import org.apache.batik.css.engine.value.ValueConstants;
29 import org.apache.batik.css.engine.value.ValueManager;
30 import org.apache.batik.util.CSSConstants;
31 import org.apache.batik.util.SVGTypes;
32
33 import org.w3c.dom.css.CSSPrimitiveValue;
34 import org.w3c.dom.DOMException;
35 import org.w3c.css.sac.LexicalUnit;
36
37
45 public class SrcManager extends IdentifierManager {
46
47
50 protected static final StringMap values = new StringMap();
51 static {
52 values.put(CSSConstants.CSS_NONE_VALUE,
53 ValueConstants.NONE_VALUE);
54 }
55
56 public SrcManager() {
57 }
58
59
63 public boolean isInheritedProperty() {
64 return false;
65 }
66
67
70 public boolean isAnimatableProperty() {
71 return false;
72 }
73
74
77 public boolean isAdditiveProperty() {
78 return false;
79 }
80
81
84 public int getPropertyType() {
85 return SVGTypes.TYPE_FONT_DESCRIPTOR_SRC_VALUE;
86 }
87
88
92 public String getPropertyName() {
93 return CSSConstants.CSS_SRC_PROPERTY;
94 }
95
96
100 public Value getDefaultValue() {
101 return ValueConstants.NONE_VALUE;
102 }
103
104
105
108 public Value createValue(LexicalUnit lu, CSSEngine engine)
109 throws DOMException {
110
111 switch (lu.getLexicalUnitType()) {
112 case LexicalUnit.SAC_INHERIT:
113 return ValueConstants.INHERIT_VALUE;
114
115 default:
116 throw createInvalidLexicalUnitDOMException
117 (lu.getLexicalUnitType());
118
119 case LexicalUnit.SAC_IDENT:
120 case LexicalUnit.SAC_STRING_VALUE:
121 case LexicalUnit.SAC_URI:
122 }
123
124 ListValue result = new ListValue();
125 for (;;) {
126 switch (lu.getLexicalUnitType()) {
127 case LexicalUnit.SAC_STRING_VALUE:
128 result.append(new StringValue(CSSPrimitiveValue.CSS_STRING,
129 lu.getStringValue()));
130 lu = lu.getNextLexicalUnit();
131 break;
132
133 case LexicalUnit.SAC_URI:
134 String uri = resolveURI(engine.getCSSBaseURI(),
135 lu.getStringValue());
136
137 result.append(new URIValue(lu.getStringValue(), uri));
138 lu = lu.getNextLexicalUnit();
139 if ((lu != null) &&
140 (lu.getLexicalUnitType() == LexicalUnit.SAC_FUNCTION)) {
141 if (!lu.getFunctionName().equalsIgnoreCase("format")) {
142 break;
143 }
144
145
146
147
148 lu = lu.getNextLexicalUnit();
149 }
150 break;
151
152 case LexicalUnit.SAC_IDENT:
153 StringBuffer sb = new StringBuffer(lu.getStringValue());
154 lu = lu.getNextLexicalUnit();
155 if (lu != null &&
156 lu.getLexicalUnitType() == LexicalUnit.SAC_IDENT) {
157 do {
158 sb.append(' ');
159 sb.append(lu.getStringValue());
160 lu = lu.getNextLexicalUnit();
161 } while (lu != null &&
162 lu.getLexicalUnitType() == LexicalUnit.SAC_IDENT);
163 result.append(new StringValue(CSSPrimitiveValue.CSS_STRING,
164 sb.toString()));
165 } else {
166 String id = sb.toString();
167 String s = id.toLowerCase().intern();
168 Value v = (Value)values.get(s);
169 result.append((v != null)
170 ? v
171 : new StringValue
172 (CSSPrimitiveValue.CSS_STRING, id));
173 }
174 break;
175 }
176 if (lu == null) {
177 return result;
178 }
179 if (lu.getLexicalUnitType() != LexicalUnit.SAC_OPERATOR_COMMA) {
180 throw createInvalidLexicalUnitDOMException
181 (lu.getLexicalUnitType());
182 }
183 lu = lu.getNextLexicalUnit();
184 if (lu == null) {
185 throw createMalformedLexicalUnitDOMException();
186 }
187 }
188 }
189
190
193 public StringMap getIdentifiers() {
194 return values;
195 }
196 }
197