blob: 8dbfad34df14857fa5fea86fef318828d510caa4 [file] [log] [blame]
/*
* Copyright 2005 Sascha Weinreuter
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.intellij.lang.xpath.psi.impl;
import com.intellij.lang.ASTNode;
import org.intellij.lang.xpath.context.XPathVersion;
import org.intellij.lang.xpath.psi.XPathElementVisitor;
import org.intellij.lang.xpath.psi.XPathString;
import org.intellij.lang.xpath.psi.XPathType;
import org.jetbrains.annotations.NotNull;
public class XPathStringImpl extends XPathElementImpl implements XPathString {
public XPathStringImpl(ASTNode node) {
super(node);
}
@NotNull
public XPathType getType() {
return XPathType.STRING;
}
public boolean isWellFormed() {
final String text = getUnescapedText();
final char quoteChar = getQuoteChar();
if (!text.endsWith(String.valueOf(quoteChar)) || text.indexOf(quoteChar) == text.lastIndexOf(quoteChar)) {
return false;
}
if (getXPathVersion() == XPathVersion.V2) {
final String value = getStringBetweenQuotes();
final String unescaped = unescape(quoteChar, value);
return escape(quoteChar, unescaped).equals(value);
} else {
if (getValue().indexOf(quoteChar) != -1) {
return false;
}
}
return !textContains('\n') && !textContains('\r');
}
public String getValue() {
final String value = getStringBetweenQuotes();
if (getXPathVersion() == XPathVersion.V2) {
return unescape(getQuoteChar(), value);
}
return value;
}
private String getStringBetweenQuotes() {
final String text = getUnescapedText();
if (text.endsWith(String.valueOf(getQuoteChar())) && text.length() > 1) {
return text.substring(1, text.length() - 1);
} else {
return text.substring(1, text.length());
}
}
private char getQuoteChar() {
return getUnescapedText().charAt(0);
}
private static String unescape(char quote, String value) {
final String singleQuote = String.valueOf(quote);
final String escapedQuote = singleQuote + quote;
return value.replaceAll(escapedQuote, singleQuote);
}
private static String escape(char quote, String value) {
final String singleQuote = String.valueOf(quote);
final String escapedQuote = singleQuote + quote;
return value.replaceAll(singleQuote, escapedQuote);
}
public void accept(XPathElementVisitor visitor) {
visitor.visitXPathString(this);
}
}