/******************************************************************************* * 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 java.util.Enumeration; import java.util.Iterator; import org.eclipse.wst.css.core.internal.Logger; import org.eclipse.wst.css.core.internal.parser.CSSRegionUtil; import org.eclipse.wst.css.core.internal.parserz.CSSRegionContexts; import org.eclipse.wst.css.core.internal.parserz.CSSTextToken; import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion; import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegionList; import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion; import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList; public class CSSUtil { /** * */ public static void debugOut(String str) { Logger.log(Logger.WARNING, "css warning: " + str); //$NON-NLS-1$ } /** * */ // public static Vector extractMediaContents(Vector regions) { // Vector media = new Vector(); // if (regions == null) { return media; } // // boolean bReady = true; // for (Iterator i = regions.iterator(); i.hasNext(); ) { // ITextRegion region = (ITextRegion)i.next(); // if (region == null) { continue; } // String type = region.getType(); // if (bReady) { // if (type == IDENT) { // media.addElement(region.getText()); // bReady = false; // } // } else { // if (type == COMMA) { // bReady = true; // } // } // } // // return media; // } /** * */ public static String extractStringContents(String text) { return stripQuotes(text); } /** * */ public static String extractUriContents(String text) { String contents = text.trim(); if (contents.toLowerCase().startsWith("url(") && //$NON-NLS-1$ contents.toLowerCase().endsWith(")")) {//$NON-NLS-1$ // strip "url(", ")" contents = contents.substring(4, contents.length() - 1); } contents = stripQuotes(contents); return contents; } /** * */ public static IStructuredDocumentRegion findNextSignificantNode(IStructuredDocumentRegion startNode) { if (startNode == null) { return null; } IStructuredDocumentRegion node = startNode.getNext(); while (node != null) { String type = getStructuredDocumentRegionType(node); if (type != CSSRegionContexts.CSS_S && type != CSSRegionContexts.CSS_COMMENT && type != CSSRegionContexts.CSS_CDO && type != CSSRegionContexts.CSS_CDC) { return node; } node = node.getNext(); } return null; } /** * */ public static IStructuredDocumentRegion findNodeBackward(IStructuredDocumentRegion startNode, IStructuredDocumentRegion endNode, String type) { IStructuredDocumentRegion node; for (node = startNode; node != null; node = node.getPrevious()) { if (node.getStartOffset() < endNode.getStartOffset()) { node = null; break; } else if (getStructuredDocumentRegionType(node) == type) { break; } } return node; } /** * */ public static IStructuredDocumentRegion findNodeForward(IStructuredDocumentRegion startNode, IStructuredDocumentRegion endNode, String type) { IStructuredDocumentRegion node; for (node = startNode; node != null; node = node.getNext()) { if (endNode.getStartOffset() < node.getStartOffset()) { node = null; break; } else if (getStructuredDocumentRegionType(node) == type) { break; } } return node; } /** * */ public static IStructuredDocumentRegion findPreviousSignificantNode(IStructuredDocumentRegion startNode) { if (startNode == null) { return null; } IStructuredDocumentRegion node = startNode.getPrevious(); while (node != null) { String type = getStructuredDocumentRegionType(node); if (type != CSSRegionContexts.CSS_S && type != CSSRegionContexts.CSS_COMMENT && type != CSSRegionContexts.CSS_CDO && type != CSSRegionContexts.CSS_CDC) { return node; } node = node.getPrevious(); } return null; } /** * */ public static String getClassString(Object object) { if (object == null) { return "null"; //$NON-NLS-1$ } else { String name = object.getClass().toString(); int lastPeriod = name.lastIndexOf('.'); return name.substring(lastPeriod + 1); } } /** * */ public static String getStructuredDocumentRegionType(IStructuredDocumentRegion flatNode) { if (flatNode == null) { return CSSRegionContexts.CSS_UNDEFINED; } ITextRegionList regions = flatNode.getRegions(); if (regions == null || regions.size() == 0) { return CSSRegionContexts.CSS_UNDEFINED; } ITextRegion region = regions.get(0); return region.getType(); } /** * */ public static int getLengthDifference(IStructuredDocumentRegionList newNodes, IStructuredDocumentRegionList oldNodes) { int newLen = getTextLength(newNodes); int oldLen = getTextLength(oldNodes); return newLen - oldLen; } /** * */ public static String getRegionText(IStructuredDocumentRegion flatNode, ITextRegionList regions) { StringBuffer buf = new StringBuffer(); if (regions != null) { for (Iterator i = regions.iterator(); i.hasNext();) { ITextRegion region = (ITextRegion) i.next(); if (region == null) { continue; } buf.append(flatNode.getText(region)); } } return buf.toString(); } /** * */ public static int getTextLength(IStructuredDocumentRegionList nodes) { int length = 0; if (nodes != null) { for (Enumeration e = nodes.elements(); e.hasMoreElements();) { IStructuredDocumentRegion flatNode = (IStructuredDocumentRegion) e.nextElement(); if (flatNode != null) { length += flatNode.getText().length(); } } } return length; } /** * * @param token * @return */ public static boolean isLength(CSSTextToken token) { if (token == null) return false; if (token.kind == CSSRegionContexts.CSS_DECLARATION_VALUE_DIMENSION) return true; if (token.kind == CSSRegionContexts.CSS_DECLARATION_VALUE_NUMBER) { double number = Double.parseDouble(token.image); if (number == 0.0) return true; } return false; } /** * */ public static boolean isSelectorText(IStructuredDocumentRegion region) { String type = getStructuredDocumentRegionType(region); if (CSSRegionUtil.isSelectorBegginingType(type)) { return true; } else if (type == CSSRegionContexts.CSS_UNKNOWN) { // String text = flatNode.getText(); // if (text != null && text.indexOf('.') == 0) { return true; // } } return false; } /** * */ public static String stripQuotes(String text) { if (text == null) return null; String contents = text.trim(); if (2 <= contents.length()) { char first = contents.charAt(0); char last = contents.charAt(contents.length() - 1); if ((first == '\"' && last == '\"') || (first == '\'' && last == '\'')) { contents = contents.substring(1, contents.length() - 1); } } return contents; } public static String detectQuote(String source, String defaultQuote) { if (source == null) return defaultQuote; final String D_QUOTE = "\""; //$NON-NLS-1$ final String S_QUOTE = "\'"; //$NON-NLS-1$ int dIndex = source.indexOf(D_QUOTE); int sIndex = source.indexOf(S_QUOTE); if (dIndex < 0 && sIndex < 0) { return defaultQuote; } else if (dIndex < 0) { return D_QUOTE; } else if (sIndex < 0) { return S_QUOTE; } else if (dIndex < sIndex) { return S_QUOTE; } else { return D_QUOTE; } } /** * */ public static void stripSurroundingSpace(ITextRegionList regions) { if (regions == null) { return; } while (!regions.isEmpty()) { ITextRegion region = regions.get(0); String type = region.getType(); if (type == CSSRegionContexts.CSS_S || type == CSSRegionContexts.CSS_COMMENT) { regions.remove(0); } else { break; } } while (!regions.isEmpty()) { ITextRegion region = regions.get(regions.size() - 1); String type = region.getType(); if (type == CSSRegionContexts.CSS_S || type == CSSRegionContexts.CSS_COMMENT) { regions.remove(region); } else { break; } } } }