summaryrefslogtreecommitdiff
path: root/std/encoding/_yaml/mark.ts
diff options
context:
space:
mode:
Diffstat (limited to 'std/encoding/_yaml/mark.ts')
-rw-r--r--std/encoding/_yaml/mark.ts77
1 files changed, 77 insertions, 0 deletions
diff --git a/std/encoding/_yaml/mark.ts b/std/encoding/_yaml/mark.ts
new file mode 100644
index 000000000..44cf175a0
--- /dev/null
+++ b/std/encoding/_yaml/mark.ts
@@ -0,0 +1,77 @@
+// Ported from js-yaml v3.13.1:
+// https://github.com/nodeca/js-yaml/commit/665aadda42349dcae869f12040d9b10ef18d12da
+// Copyright 2011-2015 by Vitaly Puzrin. All rights reserved. MIT license.
+// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
+
+import { repeat } from "./utils.ts";
+
+export class Mark {
+ constructor(
+ public name: string,
+ public buffer: string,
+ public position: number,
+ public line: number,
+ public column: number
+ ) {}
+
+ public getSnippet(indent = 4, maxLength = 75): string | null {
+ if (!this.buffer) return null;
+
+ let head = "";
+ let 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;
+ }
+ }
+
+ let tail = "";
+ let 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;
+ }
+ }
+
+ const snippet = this.buffer.slice(start, end);
+ return `${repeat(" ", indent)}${head}${snippet}${tail}\n${repeat(
+ " ",
+ indent + this.position - start + head.length
+ )}^`;
+ }
+
+ public toString(compact?: boolean): string {
+ let 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;
+ }
+}