package de.neuland.jade4j.lexer;
import java.io.BufferedReader;
import java.io.LineNumberReader;
import java.io.Reader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.lang3.StringUtils;
public class Scanner {
private String input;
public Scanner(Reader reader) {
initFromReader(reader);
}
public Scanner(String input) {
this.input = input;
}
public void consume(int length) {
input = input.substring(length);
}
public String findInLine(String re) {
Pattern pattern = Pattern.compile(re);
Matcher matcher = pattern.matcher(input);
if (matcher.find(0)) {
int end = matcher.end();
return input.substring(0, end);
}
return null;
}
private void initFromReader(Reader reader) {
try {
StringBuilder sb = new StringBuilder();
LineNumberReader in = new LineNumberReader(reader);
String s = "";
boolean first = true;
// int c = 0;
// while ((c = in.read()) != -1) {
// if(c != '\uFEFF' && !first) {
// sb.append((char) c);
// }
// first = false;
// }
while ((s = in.readLine()) != null) {
if(!first) {
sb.append("\n");
}else{
s = s.replaceAll("^\\uFEFF", "");
}
first=false;
if (StringUtils.isNotEmpty(s)) {
sb.append(s);
}
}
input = sb.toString();
if (StringUtils.isNotBlank(input)) {
input = sb.toString().replaceAll("\\r\\n|\\r", "\\n");
}
in.close();
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public char charAt(int i) {
return input.charAt(i);
}
public boolean beginnsWithWhitespace() {
return (input.charAt(0) == ' ' || input.charAt(0) == '\t');
}
public boolean isNotEmpty() {
return StringUtils.isNotEmpty(input);
}
private boolean isEmpty() {
return !isNotEmpty();
}
public boolean isNotLineBreak() {
return isEmpty() || input.charAt(0) != '\n';
}
public String getPipelessText() {
int i = input.indexOf('\n');
if (-1 == i)
i = input.length();
String str = input.substring(0, i);
consume(str.length());
return str.trim();
}
public String getInput() {
return input;
}
public Matcher getMatcherForPattern(String regexp) {
Pattern pattern = Pattern.compile(regexp);
return pattern.matcher(input);
}
public boolean isIntendantionViolated() {
return input != null && input.length() > 0
&& (' ' == input.charAt(0) || '\t' == input.charAt(0));
}
public boolean isBlankLine() {
return input != null && input.length() > 0 && '\n' == input.charAt(0);
}
public boolean isAdditionalBlankline() {
return input.length() > 2 && input.charAt(0) == '\n' && input.charAt(1) == '\n';
}
}