package org.develnext.jphp.core.tokenizer.token;
import org.develnext.jphp.core.tokenizer.TokenMeta;
import org.develnext.jphp.core.tokenizer.TokenType;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.StringReader;
public class CommentToken extends Token {
public enum Kind {
SIMPLE, BLOCK, DOCTYPE;
public static Kind isComment(char ch, char prev_ch){
if (ch == '/' && prev_ch == '/'){
return CommentToken.Kind.SIMPLE;
}
if (ch == '#') {
return CommentToken.Kind.SIMPLE;
}
if (ch == '*' && prev_ch == '/'){
return CommentToken.Kind.BLOCK;
}
return null;
}
}
private Kind kind;
private boolean oldStyle;
private String comment;
public CommentToken(TokenMeta meta) {
super(meta, TokenType.T_DOC_COMMENT);
if (meta.getWord().startsWith("/**")){
kind = Kind.DOCTYPE;
} else if (meta.getWord().startsWith("//")){
kind = Kind.SIMPLE;
} else if (meta.getWord().startsWith("#")) {
kind = Kind.SIMPLE;
oldStyle = true;
} else
kind = Kind.BLOCK;
this.comment = getComment();
}
public Kind getKind() {
return kind;
}
public String getComment(){
if (comment != null)
return comment;
switch (kind){
case DOCTYPE: {
int i = 0;
StringBuilder builder = new StringBuilder();
BufferedReader reader = new BufferedReader(new StringReader(getWord().substring(3)));
String line;
try {
while ((line = reader.readLine()) != null){
line = line.trim();
if (line.startsWith("*"))
line = line.substring(1).trim();
if (!line.isEmpty()){
if (i != 0)
builder.append("\n");
builder.append(line);
i++;
} else {
builder.append("\n");
}
}
} catch (IOException e) {
throw new RuntimeException(e);
}
return builder.toString();
}
default:
if (oldStyle) {
if (getWord().length() >= 1) {
return getWord().substring(1);
}
} else {
if (getWord().length() >= 2) {
return getWord().substring(2);
}
}
return "";
}
}
}