blob: c5c5a571689e315302c48bc7fb608d46ef0d05f5 [file] [log] [blame]
/*
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.apache.royale.compiler.internal.css;
import org.antlr.runtime.TokenStream;
import org.antlr.runtime.tree.CommonTree;
/**
* Implementation for CSS string property values. For example:<br>
* <code>{ fontFamily: "Sans Serif"; }</code>
*/
public class CSSStringPropertyValue extends CSSPropertyValue
{
protected CSSStringPropertyValue(final String stringWithQuotes,
final CommonTree tree,
final TokenStream tokenStream)
{
super(tree, tokenStream, CSSModelTreeType.PROPERTY_VALUE);
assert isQuoted(stringWithQuotes) : "Don't strip quotes in parser: [" + stringWithQuotes + "]";
this.value = convertEscapes(stripQuotes(stringWithQuotes));
}
private final String value;
/**
* @return The string value without the quotes.
*/
public String getValue()
{
return value;
}
@Override
public String toString()
{
return String.format("\"%s\"", value);
}
/**
* Check if the string is quoted with single quotes or double quotes.
*
* @param testString string to test
* @return True if the string is quoted.
*/
public static boolean isQuoted(final String testString)
{
return (testString.startsWith("\"") && testString.endsWith("\"")) ||
(testString.startsWith("'") && testString.endsWith("'"));
}
/**
* Strip one pair of quotes around the string.
*
* @param value string to strip
* @return Stripped string.
*/
public static String stripQuotes(final String value)
{
return value.substring(1, value.length() - 1);
}
private static String convertEscapes(String value)
{
int idx = 0;
int c = value.indexOf('\\');
while (c != -1 && c + 1 < value.length())
{
char cnext = value.charAt(c + 1);
if (cnext != '\\' && cnext != 'n' && cnext != 't' && cnext != 'r')
{
int n = value.length() - (c + 1);
if (n > 6)
n = 6;
StringBuilder sub = new StringBuilder();
int i = 0;
for (; i < n; i++)
{
char cc = value.charAt(c + i + 1);
if (cc != ' ') {
sub.append(cc);
idx++; //this represents each 'digit' char
}
else
break;
}
idx++; //this represents the first escape char
int ccode = Integer.parseInt(sub.toString(), 16);
String insert;
if (ccode == /* nbsp */ 0xA0) {
insert = "\\a0"; //restore nbsp as the encoded form
} else if (ccode == /* ZERO WIDTH SPACE */ 0x200B) {
insert = "\\200b"; //restore zero-width space as the encoded form
} else {
sub = new StringBuilder();
sub.append(Character.toChars(ccode));
insert = sub.toString();
}
value = value.substring(0, c) + insert + value.substring(c + i + 1);
}
else
idx += 2;
c = value.indexOf('\\', idx);
}
return value;
}
}