| /******************************************************************************* |
| * Copyright (c) 2004 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.util; |
| |
| |
| |
| import org.eclipse.wst.css.core.document.ICSSImportRule; |
| import org.eclipse.wst.css.core.document.ICSSModel; |
| import org.eclipse.wst.css.core.document.ICSSNode; |
| import org.eclipse.wst.css.core.document.ICSSPrimitiveValue; |
| import org.eclipse.wst.css.core.preferences.CSSPreferenceHelper; |
| import org.eclipse.wst.sse.core.IStructuredModel; |
| import org.eclipse.wst.xml.core.document.XMLNode; |
| import org.w3c.dom.css.CSSPrimitiveValue; |
| import org.w3c.dom.css.CSSValue; |
| |
| |
| /** |
| * |
| */ |
| public class CSSLinkConverter extends org.eclipse.wst.css.core.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) { |
| XMLNode node = (XMLNode) ((ICSSModel) model).getOwnerDOMNode(); |
| baseModel = node.getModel(); |
| } |
| } |
| |
| /** |
| * |
| */ |
| public static String addFunc(String value) { |
| if (!value.trim().toLowerCase().startsWith(URL_BEGIN)) { |
| // pa_TODO css pref |
| CSSPreferenceHelper mgr = CSSPreferenceHelper.getInstance(); |
| String quote = mgr.getQuoteString(null); |
| value = CSSUtil.stripQuotes(value); |
| quote = CSSUtil.detectQuote(value, quote); |
| String str = URL_BEGIN; |
| if (mgr.isPropValueUpperCase()) |
| str = str.toUpperCase(); |
| StringBuffer buf = new StringBuffer(str); |
| buf.append(quote); |
| buf.append(value); |
| buf.append(quote); |
| buf.append(URL_END); |
| return buf.toString(); |
| } |
| else |
| return value; |
| } |
| |
| |
| |
| /** |
| * |
| */ |
| protected void begin(ICSSNode node) { |
| if (baseModel == null) { |
| baseModel = node.getOwnerDocument().getModel(); |
| if (baseModel instanceof ICSSModel && ((ICSSModel) baseModel).getStyleSheetType() != ICSSModel.EXTERNAL) { |
| XMLNode xmlNode = (XMLNode) ((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; |
| } |
| } |