| 'use strict'; | 
|   | 
|   | 
| var common = require('./common'); | 
|   | 
|   | 
| function Mark(name, buffer, position, line, column) { | 
|   this.name     = name; | 
|   this.buffer   = buffer; | 
|   this.position = position; | 
|   this.line     = line; | 
|   this.column   = column; | 
| } | 
|   | 
|   | 
| Mark.prototype.getSnippet = function getSnippet(indent, maxLength) { | 
|   var head, start, tail, end, snippet; | 
|   | 
|   if (!this.buffer) return null; | 
|   | 
|   indent = indent || 4; | 
|   maxLength = maxLength || 75; | 
|   | 
|   head = ''; | 
|   start = this.position; | 
|   | 
|   while (start > 0 && '\x00\r\n\x85\u2028\u2029'.indexOf(this.buffer.charAt(start - 1)) === -1) { | 
|     start -= 1; | 
|     if (this.position - start > (maxLength / 2 - 1)) { | 
|       head = ' ... '; | 
|       start += 5; | 
|       break; | 
|     } | 
|   } | 
|   | 
|   tail = ''; | 
|   end = this.position; | 
|   | 
|   while (end < this.buffer.length && '\x00\r\n\x85\u2028\u2029'.indexOf(this.buffer.charAt(end)) === -1) { | 
|     end += 1; | 
|     if (end - this.position > (maxLength / 2 - 1)) { | 
|       tail = ' ... '; | 
|       end -= 5; | 
|       break; | 
|     } | 
|   } | 
|   | 
|   snippet = this.buffer.slice(start, end); | 
|   | 
|   return common.repeat(' ', indent) + head + snippet + tail + '\n' + | 
|          common.repeat(' ', indent + this.position - start + head.length) + '^'; | 
| }; | 
|   | 
|   | 
| Mark.prototype.toString = function toString(compact) { | 
|   var snippet, where = ''; | 
|   | 
|   if (this.name) { | 
|     where += 'in "' + this.name + '" '; | 
|   } | 
|   | 
|   where += 'at line ' + (this.line + 1) + ', column ' + (this.column + 1); | 
|   | 
|   if (!compact) { | 
|     snippet = this.getSnippet(); | 
|   | 
|     if (snippet) { | 
|       where += ':\n' + snippet; | 
|     } | 
|   } | 
|   | 
|   return where; | 
| }; | 
|   | 
|   | 
| module.exports = Mark; |