/*
* Copyright (C) 2012-2016 NS Solutions Corporation
*
* 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 com.htmlhifive.tools.rhino.comment;
import java.util.regex.Pattern;
import org.apache.commons.lang.ArrayUtils;
import com.htmlhifive.tools.rhino.comment.js.JSTag;
public final class TokenUtil {
private static final String JSDOC_START = "/**";
private static final String JSDOC_END = "*/";
private static final String[] SYMBOLS = { "+", "-", "*", "/", "(", ")", "{", "}", };
private static Pattern HTMLTAG_PATTERN = Pattern.compile("<(\"[^\"]*\"|'[^']*'|[^'\">])*>");
public static TokenType resolveType(String str) {
if (str == null) {
return null;
} else if (str.startsWith("{") && str.endsWith("}")) {
return TokenType.TYPE;
} else if (str.startsWith("@")) {
return TokenType.ANNOTATION;
} else if (str.equals(JSDOC_START)) {
return TokenType.START;
} else if (str.equals(JSDOC_END)) {
return TokenType.END;
} else if (str.length() == 1 && ArrayUtils.contains(SYMBOLS, str)) {
return TokenType.SYMBOL;
}
return TokenType.STRING_LITERAL;
}
public static JSTag resolveTagType(Token token) {
if (token == null || token.getType() != TokenType.ANNOTATION) {
return null;
}
String str = token.getValue();
if (str.equals("@augments")) {
return JSTag.AUGMENTS;
} else if (str.equals("@author")) {
return JSTag.AUTHOR;
} else if (str.equals("@argument")) {
return JSTag.ARGUMENT;
} else if (str.equals("@borrows")) {
return JSTag.BORROWS;
} else if (str.equals("@class")) {
return JSTag.CLASS;
} else if (str.equals("@constant") || str.equals("@const")) {
return JSTag.CONSTANT;
} else if (str.equals("@constructor")) {
return JSTag.CONSTRUCTOR;
} else if (str.equals("@constructs")) {
return JSTag.CONSTRUCTS;
} else if (str.equals("@default")) {
return JSTag.DEFAULT;
} else if (str.equals("@deprecated")) {
return JSTag.DEPRECATED;
} else if (str.equals("@description")) {
return JSTag.DESCRIPTION;
} else if (str.equals("@event")) {
return JSTag.EVENT;
} else if (str.equals("@example")) {
return JSTag.EXAMPLE;
} else if (str.equals("@exports")) {
return JSTag.EXPORTS;
} else if (str.equals("@extends")) {
return JSTag.EXTENDS;
} else if (str.equals("@field")) {
return JSTag.FIELD;
} else if (str.equals("@fieldOf")) {
return JSTag.FIELDOF;
} else if (str.equals("@fileOverview")) {
return JSTag.FILEOVERVIEW;
} else if (str.equals("@function")) {
return JSTag.FUNCTION;
} else if (str.equals("@ignore")) {
return JSTag.IGNORE;
} else if (str.equals("@inner")) {
return JSTag.INNER;
} else if (str.equals("@lends")) {
return JSTag.LENDS;
} else if (str.equals("@link")) {
return JSTag.LINK;
} else if (str.equals("@memberOf")) {
return JSTag.MEMBEROF;
} else if (str.equals("@methodOf")) {
return JSTag.METHODOF;
} else if (str.equals("@name")) {
return JSTag.NAME;
} else if (str.equals("@namespace")) {
return JSTag.NAMESPACE;
} else if (str.equals("@param")) {
return JSTag.PARAM;
} else if (str.equals("@private")) {
return JSTag.PRIVATE;
} else if (str.equals("@property")) {
return JSTag.PROPERTY;
} else if (str.equals("@public")) {
return JSTag.PUBLIC;
} else if (str.equals("@requires")) {
return JSTag.REQUIRES;
} else if (str.equals("@returns") || str.equals("@return")) {
return JSTag.RETURNS;
} else if (str.equals("@see")) {
return JSTag.SEE;
} else if (str.equals("@since")) {
return JSTag.SINCE;
} else if (str.equals("@static")) {
return JSTag.STATIC;
} else if (str.equals("@throws")) {
return JSTag.THROWS;
} else if (str.equals("@type")) {
return JSTag.TYPE;
} else if (str.equals("@version")) {
return JSTag.VERSION;
} else if (str.equals("@todo") || str.equals("@member") || str.equals("@params")) {
return null;
}
throw new IllegalArgumentException(str);
}
private TokenUtil() {
}
public static boolean isSymbolType(TokenType type) {
if (type == TokenType.START || type == TokenType.END || type == TokenType.SYMBOL) {
return true;
}
return false;
}
public static String escapeHtml(String str) {
StringBuilder sb = new StringBuilder();
char[] charArray = str.toCharArray();
for (char c : charArray) {
switch (c) {
case '<':
sb.append("<");
break;
case '>':
sb.append(">");
break;
case '&':
sb.append("&");
break;
case '"':
sb.append(""");
break;
case '\'':
sb.append("'");
break;
default:
sb.append(c);
break;
}
}
return sb.toString();
}
public static String removeHtmlTag(String nextToken) {
return HTMLTAG_PATTERN.matcher(nextToken).replaceAll("");
}
}