/** * 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; } }