• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * Copyright (c) 2008, http://www.snakeyaml.org
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package org.yaml.snakeyaml.error;
17 
18 import org.yaml.snakeyaml.scanner.Constant;
19 
20 /**
21  * It's just a record and its only use is producing nice error messages. Parser
22  * does not use it for any other purposes.
23  */
24 public final class Mark {
25     private String name;
26     private int index;
27     private int line;
28     private int column;
29     private String buffer;
30     private int pointer;
31 
Mark(String name, int index, int line, int column, String buffer, int pointer)32     public Mark(String name, int index, int line, int column, String buffer, int pointer) {
33         super();
34         this.name = name;
35         this.index = index;
36         this.line = line;
37         this.column = column;
38         this.buffer = buffer;
39         this.pointer = pointer;
40     }
41 
isLineBreak(char ch)42     private boolean isLineBreak(char ch) {
43         return Constant.NULL_OR_LINEBR.has(ch);
44     }
45 
get_snippet(int indent, int max_length)46     public String get_snippet(int indent, int max_length) {
47         if (buffer == null) {
48             return null;
49         }
50         float half = max_length / 2 - 1;
51         int start = pointer;
52         String head = "";
53         while ((start > 0) && !isLineBreak(buffer.charAt(start - 1))) {
54             start -= 1;
55             if (pointer - start > half) {
56                 head = " ... ";
57                 start += 5;
58                 break;
59             }
60         }
61         String tail = "";
62         int end = pointer;
63         while ((end < buffer.length()) && !isLineBreak(buffer.charAt(end))) {
64             end += 1;
65             if (end - pointer > half) {
66                 tail = " ... ";
67                 end -= 5;
68                 break;
69             }
70         }
71         String snippet = buffer.substring(start, end);
72         StringBuilder result = new StringBuilder();
73         for (int i = 0; i < indent; i++) {
74             result.append(" ");
75         }
76         result.append(head);
77         result.append(snippet);
78         result.append(tail);
79         result.append("\n");
80         for (int i = 0; i < indent + pointer - start + head.length(); i++) {
81             result.append(" ");
82         }
83         result.append("^");
84         return result.toString();
85     }
86 
get_snippet()87     public String get_snippet() {
88         return get_snippet(4, 75);
89     }
90 
91     @Override
toString()92     public String toString() {
93         String snippet = get_snippet();
94         StringBuilder where = new StringBuilder(" in ");
95         where.append(name);
96         where.append(", line ");
97         where.append(line + 1);
98         where.append(", column ");
99         where.append(column + 1);
100         if (snippet != null) {
101             where.append(":\n");
102             where.append(snippet);
103         }
104         return where.toString();
105     }
106 
getName()107     public String getName() {
108         return name;
109     }
110 
111     /**
112      * starts with 0
113      */
getLine()114     public int getLine() {
115         return line;
116     }
117 
118     /**
119      * starts with 0
120      */
getColumn()121     public int getColumn() {
122         return column;
123     }
124 
125     /**
126      * starts with 0
127      */
getIndex()128     public int getIndex() {
129         return index;
130     }
131 
132 }
133