annotate .cms/lib/codemirror/src/line/pos.js @ 1:1d486627aa1e draft default tip

24.10
author Coffee CMS <info@coffee-cms.ru>
date Sat, 12 Oct 2024 02:51:39 +0000
parents 78edf6b517a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
1 import { getLine } from "./utils_line.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
2
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
3 // A Pos instance represents a position within the text.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
4 export function Pos(line, ch, sticky = null) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
5 if (!(this instanceof Pos)) return new Pos(line, ch, sticky)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
6 this.line = line
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
7 this.ch = ch
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
8 this.sticky = sticky
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
9 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
10
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
11 // Compare two positions, return 0 if they are the same, a negative
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
12 // number when a is less, and a positive number otherwise.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
13 export function cmp(a, b) { return a.line - b.line || a.ch - b.ch }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
14
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
15 export function equalCursorPos(a, b) { return a.sticky == b.sticky && cmp(a, b) == 0 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
16
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
17 export function copyPos(x) {return Pos(x.line, x.ch)}
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
18 export function maxPos(a, b) { return cmp(a, b) < 0 ? b : a }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
19 export function minPos(a, b) { return cmp(a, b) < 0 ? a : b }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
20
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
21 // Most of the external API clips given positions to make sure they
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
22 // actually exist within the document.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
23 export function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1))}
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
24 export function clipPos(doc, pos) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
25 if (pos.line < doc.first) return Pos(doc.first, 0)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
26 let last = doc.first + doc.size - 1
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
27 if (pos.line > last) return Pos(last, getLine(doc, last).text.length)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
28 return clipToLen(pos, getLine(doc, pos.line).text.length)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
29 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
30 function clipToLen(pos, linelen) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
31 let ch = pos.ch
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
32 if (ch == null || ch > linelen) return Pos(pos.line, linelen)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
33 else if (ch < 0) return Pos(pos.line, 0)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
34 else return pos
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
35 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
36 export function clipPosArray(doc, array) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
37 let out = []
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
38 for (let i = 0; i < array.length; i++) out[i] = clipPos(doc, array[i])
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
39 return out
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
40 }