/**
* Copyright (c) 2008-2013, http://www.snakeyaml.org
*
* 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.yaml.snakeyaml.error;
import org.yaml.snakeyaml.scanner.Constant;
/**
* It's just a record and its only use is producing nice error messages. Parser
* does not use it for any other purposes.
*/
public final class Mark {
private String name;
private int index;
private int line;
private int column;
private String buffer;
private int pointer;
public Mark(String name, int index, int line, int column, String buffer, int pointer) {
super();
this.name = name;
this.index = index;
this.line = line;
this.column = column;
this.buffer = buffer;
this.pointer = pointer;
}
private boolean isLineBreak(char ch) {
return Constant.NULL_OR_LINEBR.has(ch);
}
public String get_snippet(int indent, int max_length) {
if (buffer == null) {
return null;
}
float half = max_length / 2 - 1;
int start = pointer;
String head = "";
while ((start > 0) && (!isLineBreak(buffer.charAt(start - 1)))) {
start -= 1;
if (pointer - start > half) {
head = " ... ";
start += 5;
break;
}
}
String tail = "";
int end = pointer;
while ((end < buffer.length()) && (!isLineBreak(buffer.charAt(end)))) {
end += 1;
if (end - pointer > half) {
tail = " ... ";
end -= 5;
break;
}
}
String snippet = buffer.substring(start, end);
StringBuilder result = new StringBuilder();
for (int i = 0; i < indent; i++) {
result.append(" ");
}
result.append(head);
result.append(snippet);
result.append(tail);
result.append("\n");
for (int i = 0; i < indent + pointer - start + head.length(); i++) {
result.append(" ");
}
result.append("^");
return result.toString();
}
public String get_snippet() {
return get_snippet(4, 75);
}
@Override
public String toString() {
String snippet = get_snippet();
StringBuilder where = new StringBuilder(" in ");
where.append(name);
where.append(", line ");
where.append(line + 1);
where.append(", column ");
where.append(column + 1);
if (snippet != null) {
where.append(":\n");
where.append(snippet);
}
return where.toString();
}
public String getName() {
return name;
}
/**
* starts with 0
*/
public int getLine() {
return line;
}
/**
* starts with 0
*/
public int getColumn() {
return column;
}
/**
* starts with 0
*/
public int getIndex() {
return index;
}
}