blob: 377dcd38cc5c76f8186f6b3e6fee23bf66d25825 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2005 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.wst.css.core.internal.util;
import org.eclipse.core.runtime.Preferences;
import org.eclipse.wst.css.core.internal.CSSCorePlugin;
import org.eclipse.wst.css.core.internal.preferences.CSSCorePreferenceNames;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSImportRule;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSModel;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSNode;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSPrimitiveValue;
import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
import org.w3c.dom.css.CSSPrimitiveValue;
import org.w3c.dom.css.CSSValue;
/**
*
*/
public class CSSLinkConverter extends org.eclipse.wst.css.core.internal.util.AbstractCssTraverser {
private static final String URL_BEGIN = "url("; //$NON-NLS-1$
private static final String URL_END = ")"; //$NON-NLS-1$
private static final String EMPTY = ""; //$NON-NLS-1$
private static final String D_QUOTE = "\""; //$NON-NLS-1$
private static final String S_QUOTE = "\'"; //$NON-NLS-1$
IStructuredModel baseModel;
/**
*
*/
public CSSLinkConverter(IStructuredModel model) {
super();
baseModel = model;
if (model instanceof ICSSModel && ((ICSSModel) model).getStyleSheetType() != ICSSModel.EXTERNAL) {
IDOMNode node = (IDOMNode) ((ICSSModel) model).getOwnerDOMNode();
baseModel = node.getModel();
}
}
/**
*
*/
public static String addFunc(String value) {
if (!value.trim().toLowerCase().startsWith(URL_BEGIN)) {
// pa_TODO css pref
Preferences preferences = CSSCorePlugin.getDefault().getPluginPreferences();
String quote = preferences.getString(CSSCorePreferenceNames.FORMAT_QUOTE);
value = CSSUtil.stripQuotes(value);
quote = CSSUtil.detectQuote(value, quote);
String str = URL_BEGIN;
if (preferences.getInt(CSSCorePreferenceNames.CASE_PROPERTY_VALUE) == CSSCorePreferenceNames.UPPER)
str = str.toUpperCase();
StringBuffer buf = new StringBuffer(str);
buf.append(quote);
buf.append(value);
buf.append(quote);
buf.append(URL_END);
return buf.toString();
}
return value;
}
/**
*
*/
protected void begin(ICSSNode node) {
if (baseModel == null) {
baseModel = node.getOwnerDocument().getModel();
if (baseModel instanceof ICSSModel && ((ICSSModel) baseModel).getStyleSheetType() != ICSSModel.EXTERNAL) {
IDOMNode xmlNode = (IDOMNode) ((ICSSModel) baseModel).getOwnerDOMNode();
baseModel = xmlNode.getModel();
}
}
}
/**
*
*/
private static boolean isUrl(String source) {
if (source == null)
return false;
source = source.trim().toLowerCase();
return source.startsWith(URL_BEGIN);
}
/**
*
*/
protected short preNode(ICSSNode node) {
if (node.getNodeType() == ICSSNode.PRIMITIVEVALUE_NODE) {
toAbsolute((CSSValue) node);
} else if (node.getNodeType() == ICSSNode.IMPORTRULE_NODE) {
ICSSImportRule iRule = (ICSSImportRule) node;
iRule.setHref(toAbsolute(addFunc(iRule.getHref())));
}
return TRAV_CONT;
}
/**
*
* @return java.lang.String
* @param value
* java.lang.String
*/
public static String removeFunc(String value) {
if (value == null)
return EMPTY;
String field = value.trim();
// first : tear "url(....)"
if (field.toLowerCase().startsWith(URL_BEGIN)) {
int url = field.toLowerCase().indexOf(URL_BEGIN);
int endParenthesis = field.lastIndexOf(URL_END);
if (endParenthesis > url) {
field = field.substring(url + 4, endParenthesis);
} else
field = field.substring(url + 4);
}
return field.trim();
}
/**
*
*/
public static String stripFunc(String value) {
if (value == null)
return EMPTY;
// first : tear "url(....)"
String field = removeFunc(value);
// second : tear quotations
if (field.toLowerCase().startsWith(D_QUOTE)) {
int quote = field.indexOf(D_QUOTE);
int end = field.lastIndexOf(D_QUOTE);
if (end > quote) {
field = field.substring(quote + 1, end);
} else
field = field.substring(quote + 1);
} else if (field.toLowerCase().startsWith(S_QUOTE)) {
int quote = field.indexOf(S_QUOTE);
int end = field.lastIndexOf(S_QUOTE);
if (end > quote) {
field = field.substring(quote + 1, end);
} else
field = field.substring(quote + 1);
}
return field.trim();
}
/**
*
*/
public String toAbsolute(String source) {
if (isUrl(source)) {
String url = CSSPathService.getAbsoluteURL(baseModel, stripFunc(source));
return (url != null) ? addFunc(url) : (URL_BEGIN + URL_END);
}
return source;
}
/**
*
*/
public boolean toAbsolute(CSSValue node) {
if (node instanceof ICSSPrimitiveValue) {
ICSSPrimitiveValue value = (ICSSPrimitiveValue) node;
if (value.getPrimitiveType() == CSSPrimitiveValue.CSS_URI) {
value.setValue(stripFunc(toAbsolute(URL_BEGIN + value.getStringValue() + URL_END)));
return true;
}
}
return false;
}
}