blob: 34d8910a8830ba0b23aa9b6945da892b7b747a31 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008 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
*
* Provisional API: This class/interface is part of an interim API that is still under development and expected to
* change significantly before reaching stability. It is being made available at this early stage to solicit feedback
* from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
* (repeatedly) as the API evolves.
*
*
*******************************************************************************/
package org.eclipse.wst.jsdt.web.core.javascript;
import java.util.Iterator;
import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
/**
*
* Provisional API: This class/interface is part of an interim API that is still under development and expected to
* change significantly before reaching stability. It is being made available at this early stage to solicit feedback
* from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
* (repeatedly) as the API evolves.
*/
public class NodeHelper {
protected static final char DOUBLE_QUOTE_CHAR = '\"';
protected static final String DOUBLE_QUOTE_ENTITY = """; //$NON-NLS-1$
protected static final char SINGLE_QUOTE_CHAR = '\'';
protected static final String SINGLE_QUOTE_ENTITY = "'"; //$NON-NLS-1$
public static boolean isInArray(String StringArray[], String text) {
if (StringArray == null || text == null) {
return false;
}
for (int i = 0; i < StringArray.length; i++) {
if (StringArray[i].equalsIgnoreCase(text.trim())) {
return true;
}
}
return false;
}
public static boolean isQuoted(String string) {
if ((string == null) || (string.length() < 2)) {
return false;
}
int lastIndex = string.length() - 1;
char firstChar = string.charAt(0);
char lastChar = string.charAt(lastIndex);
return (((firstChar == NodeHelper.SINGLE_QUOTE_CHAR) && (lastChar == NodeHelper.SINGLE_QUOTE_CHAR)) || ((firstChar == NodeHelper.DOUBLE_QUOTE_CHAR) && (lastChar == NodeHelper.DOUBLE_QUOTE_CHAR)));
}
protected IStructuredDocumentRegion region;
public NodeHelper(IStructuredDocumentRegion region) {
this.region = region;
}
public boolean attrEquals(String attribute, String value) {
String attValue = getAttributeValue(attribute);
if(attValue==null) return false;
return attValue.equalsIgnoreCase(value);
}
public String AttrToString() {
if (region == null) {
return null;
}
// For debugging
ITextRegionList t = region.getRegions();
ITextRegion r;
Iterator regionIterator = t.iterator();
String StructuredValue = Messages.NodeHelper00 + getTagName() + Messages.NodeHelper01; //$NON-NLS-1$ //$NON-NLS-2$
while (regionIterator.hasNext()) {
r = (ITextRegion) regionIterator.next();
if (r.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME) {
StructuredValue += "\t\t" + region.getText(r); //$NON-NLS-1$
/*
* Theres a XML_TAG_ATTRIBUTE_EQUALS after the
* XML_TAG_ATTRIBUTE_NAME we have to get rid of
*/
if (regionIterator.hasNext()) {
regionIterator.next();
}
if (r.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS) {
if (regionIterator.hasNext()) {
r = ((ITextRegion) regionIterator.next());
}
if (r.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE) {
StructuredValue += "\t\t" + stripEndQuotes(region.getText(r)) + "\n"; //$NON-NLS-1$ //$NON-NLS-2$
}
}
}
}
return StructuredValue;
}
public boolean containsAttribute(String name[]) {
if (name == null) {
return false;
}
if (region == null) {
return false;
}
ITextRegionList t = region.getRegions();
ITextRegion r;
Iterator regionIterator = t.iterator();
while (regionIterator.hasNext()) {
r = (ITextRegion) regionIterator.next();
if (r.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME) {
String tagname = region.getText(r).trim();
/* Attribute values aren't case sensative */
if (NodeHelper.isInArray(name, tagname)) {
return true;
}
}
}
return false;
}
public String getAttributeValue(String name) {
if (region == null) {
return null;
}
if (name == null) {
return null;
}
ITextRegionList t = region.getRegions();
ITextRegion r;
Iterator regionIterator = t.iterator();
while (regionIterator.hasNext()) {
r = (ITextRegion) regionIterator.next();
if (r.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME) {
String tagname = region.getText(r).trim();
/*
* Attribute values aren't case sensative, also make sure next
* region is attrib value
*/
if (tagname.equalsIgnoreCase(name)) {
if (regionIterator.hasNext()) {
regionIterator.next();
}
if (regionIterator.hasNext()) {
r = ((ITextRegion) regionIterator.next());
}
if (r.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE) {
return stripEndQuotes(region.getText(r));
}
}
}
}
return null;
}
public String getElementAsFlatString() {
/*
* Returns a full string of this element minus and 'illegal' characters
* (usefull for identifying the HTML element in a generic JS function)
*/
if (region == null) {
return null;
}
String fullRegionText = region.getFullText();
if (fullRegionText == null) {
return null;
}
return fullRegionText.replaceAll("[^a-zA-Z0-9]", ""); //$NON-NLS-1$ //$NON-NLS-2$
}
public String getTagName() {
if (region == null) {
return null;
}
ITextRegionList t = region.getRegions();
ITextRegion r;
Iterator regionIterator = t.iterator();
while (regionIterator.hasNext()) {
r = (ITextRegion) regionIterator.next();
if (r.getType() == DOMRegionContext.XML_TAG_NAME) {
return region.getText(r);
}
}
return null;
}
public boolean isEndTag() {
if (region == null) {
return false;
}
return DOMRegionContext.XML_END_TAG_OPEN.equals(region.getFirstRegion().getType());
}
public boolean isSelfClosingTag() {
if (region == null) {
return false;
}
return DOMRegionContext.XML_EMPTY_TAG_CLOSE.equals(region.getLastRegion().getType());
}
public boolean nameEquals(String name) {
if (region == null) {
return false;
}
String tagName;
return ((tagName = getTagName()) != null && tagName.equalsIgnoreCase(name));
}
public void setDocumentRegion(IStructuredDocumentRegion newRegion) {
if (newRegion == null)
throw new IllegalArgumentException();
region = newRegion;
}
public String stripEndQuotes(String text) {
if (text == null) {
return null;
}
if (NodeHelper.isQuoted(text)) {
return text.substring(1, text.length() - 1);
}
return text;
}
public String toString() {
ITextRegionList t = region.getRegions();
Iterator regionIterator = t.iterator();
String nodeText = new String();
while (regionIterator.hasNext()) {
ITextRegion r = (ITextRegion) regionIterator.next();
String nodeType = r.getType();
nodeText += (Messages.NodeHelper11 + nodeType + Messages.NodeHelper12 + region.getText(r) + "\n"); //$NON-NLS-1$
}
return nodeText;
}
}