diff options
Diffstat (limited to 'bundles/org.eclipse.wst.css.core/src/org/eclipse/wst/css/core/internal/util/CSSUtil.java')
-rw-r--r-- | bundles/org.eclipse.wst.css.core/src/org/eclipse/wst/css/core/internal/util/CSSUtil.java | 335 |
1 files changed, 335 insertions, 0 deletions
diff --git a/bundles/org.eclipse.wst.css.core/src/org/eclipse/wst/css/core/internal/util/CSSUtil.java b/bundles/org.eclipse.wst.css.core/src/org/eclipse/wst/css/core/internal/util/CSSUtil.java new file mode 100644 index 0000000000..adfd9ea726 --- /dev/null +++ b/bundles/org.eclipse.wst.css.core/src/org/eclipse/wst/css/core/internal/util/CSSUtil.java @@ -0,0 +1,335 @@ +/******************************************************************************* + * 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.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.text.IStructuredDocumentRegion; +import org.eclipse.wst.sse.core.text.IStructuredDocumentRegionList; +import org.eclipse.wst.sse.core.text.ITextRegion; +import org.eclipse.wst.sse.core.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; + } + } + } +}
\ No newline at end of file |