annotate .cms/lib/codemirror/src/model/change_measurement.js @ 0:78edf6b517a0 draft

24.10
author Coffee CMS <info@coffee-cms.ru>
date Fri, 11 Oct 2024 22:40:23 +0000
parents
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 { cmp, Pos } from "../line/pos.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
2 import { lst } from "../util/misc.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
3
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
4 import { normalizeSelection, Range, Selection } from "./selection.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
5
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
6 // Compute the position of the end of a change (its 'to' property
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
7 // refers to the pre-change end).
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
8 export function changeEnd(change) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
9 if (!change.text) return change.to
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
10 return Pos(change.from.line + change.text.length - 1,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
11 lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
12 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
13
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
14 // Adjust a position to refer to the post-change position of the
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
15 // same text, or the end of the change if the change covers it.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
16 function adjustForChange(pos, change) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
17 if (cmp(pos, change.from) < 0) return pos
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
18 if (cmp(pos, change.to) <= 0) return changeEnd(change)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
19
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
20 let line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, ch = pos.ch
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
21 if (pos.line == change.to.line) ch += changeEnd(change).ch - change.to.ch
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
22 return Pos(line, ch)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
23 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
24
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
25 export function computeSelAfterChange(doc, change) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
26 let out = []
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
27 for (let i = 0; i < doc.sel.ranges.length; i++) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
28 let range = doc.sel.ranges[i]
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
29 out.push(new Range(adjustForChange(range.anchor, change),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
30 adjustForChange(range.head, change)))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
31 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
32 return normalizeSelection(doc.cm, out, doc.sel.primIndex)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
33 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
34
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
35 function offsetPos(pos, old, nw) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
36 if (pos.line == old.line)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
37 return Pos(nw.line, pos.ch - old.ch + nw.ch)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
38 else
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
39 return Pos(nw.line + (pos.line - old.line), pos.ch)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
40 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
41
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
42 // Used by replaceSelections to allow moving the selection to the
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
43 // start or around the replaced test. Hint may be "start" or "around".
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
44 export function computeReplacedSel(doc, changes, hint) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
45 let out = []
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
46 let oldPrev = Pos(doc.first, 0), newPrev = oldPrev
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
47 for (let i = 0; i < changes.length; i++) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
48 let change = changes[i]
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
49 let from = offsetPos(change.from, oldPrev, newPrev)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
50 let to = offsetPos(changeEnd(change), oldPrev, newPrev)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
51 oldPrev = change.to
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
52 newPrev = to
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
53 if (hint == "around") {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
54 let range = doc.sel.ranges[i], inv = cmp(range.head, range.anchor) < 0
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
55 out[i] = new Range(inv ? to : from, inv ? from : to)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
56 } else {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
57 out[i] = new Range(from, from)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
58 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
59 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
60 return new Selection(out, doc.sel.primIndex)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
61 }