/** | |
* Copyright (c) 2008-2011, 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; | |
} | |
} |