w3c.css.values.CssURL Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of cssvalidator Show documentation
Show all versions of cssvalidator Show documentation
Backend for the W3C CSS Validation Service
//
// $Id$
// From Philippe Le Hegaret ([email protected])
//
// (c) COPYRIGHT MIT and INRIA, 1997.
// Please first read the full copyright statement in file COPYRIGHT.html
package org.w3c.css.values;
import org.w3c.css.util.ApplContext;
import org.w3c.css.util.HTTPURL;
import org.w3c.css.util.InvalidParamException;
import java.net.MalformedURLException;
import java.net.URL;
/**
*
* URL
*
*
* A Uniform Resource Locator (URL) is identified with a functional notation:
*
* BODY { background: url(http://www.bg.com/pinkish.gif) }
*
*
* The format of a URL value is 'url(' followed by optional white space followed
* by an optional single quote (') or double quote (") character followed by
* the URL itself (as defined in [11]) followed by an optional
* single quote (') or double quote (") character followed by optional whitespace
* followed by ')'. Quote characters that are not part of the URL itself must
* be balanced.
*
* Parentheses, commas, whitespace characters, single quotes (') and double
* quotes (") appearing in a URL must be escaped with a backslash: '\(', '\)',
* '\,'.
*
* Partial URLs are interpreted relative to the source of the style sheet, not
* relative to the document:
*
* BODY { background: url(yellow) }
*
* See also
*
* [11] T Berners-Lee, L Masinter, M McCahill: "Uniform
* Resource Locators (URL)", RFC
* 1738, CERN, Xerox Corporation, University of Minnesota, December 1994
*
* @version $Revision$
*/
public class CssURL extends CssValue {
public static final int type = CssTypes.CSS_URL;
public final int getType() {
return type;
}
String value;
String full = null;
URL base;
URL urlValue = null;
/**
* Set the value of this URL.
*
* @param s the string representation of the URL.
* @param ac For errors and warnings reports.
* @throws InvalidParamException The unit is incorrect
* @deprecated
*/
public void set(String s, ApplContext ac)
throws InvalidParamException {
throw new InvalidParamException("Deprecated method invocation", ac);
}
/**
* Set the value of this URL.
*
* @param s the string representation of the URL.
* @param ac For errors and warnings reports.
* @param base the base location of the style sheet
* @throws InvalidParamException The unit is incorrect
*/
public void set(String s, ApplContext ac, URL base)
throws InvalidParamException {
String urlHeading = s.substring(0, 3).toLowerCase();
String urlname = s.substring(4, s.length() - 1).trim();
this.base = base;
value = urlname;
full = null;
if (!urlHeading.startsWith("url"))
throw new InvalidParamException("url", s, ac);
// special case for data url...
if (urlname.startsWith("data:")) {
// no more processing.
value = checkDataURL(urlname);
return;
}
// now add the URL to the list of seen URLs in the context
try {
ac.addLinkedURI(getURL());
} catch (MalformedURLException mex) {
// error? throw an exception
throw new InvalidParamException("url", s, ac);
}
}
private String checkDataURL(String source) {
StringBuilder sb = new StringBuilder();
// here we just escape < and >, we might do more validation
// like base64 encoding checks, when necessary
for (char c : source.toCharArray()) {
switch (c) {
case '<':
sb.append("%3c");
break;
case '>':
sb.append("%3e");
break;
default:
sb.append(c);
}
}
return sb.toString();
}
/**
* Get the internal value.
*/
public Object get() {
return value;
}
/**
* Returns the URL
*
* @return the URL
* @throws java.net.MalformedURLException (self explanatory)
*/
public URL getURL() throws MalformedURLException {
if (urlValue == null) {
urlValue = HTTPURL.getURL(base, value);
}
return urlValue;
}
/**
* Returns a string representation of the object.
*/
public String toString() {
if (full != null) {
return full;
}
StringBuilder sb = new StringBuilder("url(");
sb.append(value).append(')');
return full = sb.toString();
}
/**
* Compares two values for equality.
*
* @param url The other value.
*/
public boolean equals(Object url) {
return (url instanceof CssURL && value.equals(((CssURL) url).value));
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy