annotate .cms/lib/codemirror/src/model/Doc.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 CodeMirror from "../edit/CodeMirror.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
2 import { docMethodOp } from "../display/operations.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
3 import { Line } from "../line/line_data.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
4 import { clipPos, clipPosArray, Pos } from "../line/pos.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
5 import { visualLine } from "../line/spans.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
6 import { getBetween, getLine, getLines, isLine, lineNo } from "../line/utils_line.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
7 import { classTest } from "../util/dom.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
8 import { splitLinesAuto } from "../util/feature_detection.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
9 import { createObj, map, isEmpty, sel_dontScroll } from "../util/misc.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
10 import { ensureCursorVisible, scrollToCoords } from "../display/scrolling.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
11
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
12 import { changeLine, makeChange, makeChangeFromHistory, replaceRange } from "./changes.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
13 import { computeReplacedSel } from "./change_measurement.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
14 import { BranchChunk, LeafChunk } from "./chunk.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
15 import { directionChanged, linkedDocs, updateDoc } from "./document_data.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
16 import { copyHistoryArray, History } from "./history.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
17 import { addLineWidget } from "./line_widget.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
18 import { copySharedMarkers, detachSharedMarkers, findSharedMarkers, markText } from "./mark_text.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
19 import { normalizeSelection, Range, simpleSelection } from "./selection.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
20 import { extendSelection, extendSelections, setSelection, setSelectionReplaceHistory, setSimpleSelection } from "./selection_updates.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
21
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
22 let nextDocId = 0
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
23 let Doc = function(text, mode, firstLine, lineSep, direction) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
24 if (!(this instanceof Doc)) return new Doc(text, mode, firstLine, lineSep, direction)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
25 if (firstLine == null) firstLine = 0
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
26
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
27 BranchChunk.call(this, [new LeafChunk([new Line("", null)])])
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
28 this.first = firstLine
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
29 this.scrollTop = this.scrollLeft = 0
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
30 this.cantEdit = false
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
31 this.cleanGeneration = 1
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
32 this.modeFrontier = this.highlightFrontier = firstLine
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
33 let start = Pos(firstLine, 0)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
34 this.sel = simpleSelection(start)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
35 this.history = new History(null)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
36 this.id = ++nextDocId
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
37 this.modeOption = mode
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
38 this.lineSep = lineSep
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
39 this.direction = (direction == "rtl") ? "rtl" : "ltr"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
40 this.extend = false
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
41
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
42 if (typeof text == "string") text = this.splitLines(text)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
43 updateDoc(this, {from: start, to: start, text: text})
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
44 setSelection(this, simpleSelection(start), sel_dontScroll)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
45 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
46
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
47 Doc.prototype = createObj(BranchChunk.prototype, {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
48 constructor: Doc,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
49 // Iterate over the document. Supports two forms -- with only one
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
50 // argument, it calls that for each line in the document. With
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
51 // three, it iterates over the range given by the first two (with
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
52 // the second being non-inclusive).
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
53 iter: function(from, to, op) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
54 if (op) this.iterN(from - this.first, to - from, op)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
55 else this.iterN(this.first, this.first + this.size, from)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
56 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
57
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
58 // Non-public interface for adding and removing lines.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
59 insert: function(at, lines) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
60 let height = 0
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
61 for (let i = 0; i < lines.length; ++i) height += lines[i].height
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
62 this.insertInner(at - this.first, lines, height)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
63 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
64 remove: function(at, n) { this.removeInner(at - this.first, n) },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
65
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
66 // From here, the methods are part of the public interface. Most
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
67 // are also available from CodeMirror (editor) instances.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
68
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
69 getValue: function(lineSep) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
70 let lines = getLines(this, this.first, this.first + this.size)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
71 if (lineSep === false) return lines
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
72 return lines.join(lineSep || this.lineSeparator())
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
73 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
74 setValue: docMethodOp(function(code) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
75 let top = Pos(this.first, 0), last = this.first + this.size - 1
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
76 makeChange(this, {from: top, to: Pos(last, getLine(this, last).text.length),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
77 text: this.splitLines(code), origin: "setValue", full: true}, true)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
78 if (this.cm) scrollToCoords(this.cm, 0, 0)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
79 setSelection(this, simpleSelection(top), sel_dontScroll)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
80 }),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
81 replaceRange: function(code, from, to, origin) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
82 from = clipPos(this, from)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
83 to = to ? clipPos(this, to) : from
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
84 replaceRange(this, code, from, to, origin)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
85 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
86 getRange: function(from, to, lineSep) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
87 let lines = getBetween(this, clipPos(this, from), clipPos(this, to))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
88 if (lineSep === false) return lines
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
89 if (lineSep === '') return lines.join('')
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
90 return lines.join(lineSep || this.lineSeparator())
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
91 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
92
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
93 getLine: function(line) {let l = this.getLineHandle(line); return l && l.text},
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
94
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
95 getLineHandle: function(line) {if (isLine(this, line)) return getLine(this, line)},
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
96 getLineNumber: function(line) {return lineNo(line)},
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
97
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
98 getLineHandleVisualStart: function(line) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
99 if (typeof line == "number") line = getLine(this, line)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
100 return visualLine(line)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
101 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
102
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
103 lineCount: function() {return this.size},
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
104 firstLine: function() {return this.first},
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
105 lastLine: function() {return this.first + this.size - 1},
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
106
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
107 clipPos: function(pos) {return clipPos(this, pos)},
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
108
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
109 getCursor: function(start) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
110 let range = this.sel.primary(), pos
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
111 if (start == null || start == "head") pos = range.head
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
112 else if (start == "anchor") pos = range.anchor
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
113 else if (start == "end" || start == "to" || start === false) pos = range.to()
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
114 else pos = range.from()
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
115 return pos
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
116 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
117 listSelections: function() { return this.sel.ranges },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
118 somethingSelected: function() {return this.sel.somethingSelected()},
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
119
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
120 setCursor: docMethodOp(function(line, ch, options) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
121 setSimpleSelection(this, clipPos(this, typeof line == "number" ? Pos(line, ch || 0) : line), null, options)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
122 }),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
123 setSelection: docMethodOp(function(anchor, head, options) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
124 setSimpleSelection(this, clipPos(this, anchor), clipPos(this, head || anchor), options)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
125 }),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
126 extendSelection: docMethodOp(function(head, other, options) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
127 extendSelection(this, clipPos(this, head), other && clipPos(this, other), options)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
128 }),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
129 extendSelections: docMethodOp(function(heads, options) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
130 extendSelections(this, clipPosArray(this, heads), options)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
131 }),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
132 extendSelectionsBy: docMethodOp(function(f, options) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
133 let heads = map(this.sel.ranges, f)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
134 extendSelections(this, clipPosArray(this, heads), options)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
135 }),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
136 setSelections: docMethodOp(function(ranges, primary, options) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
137 if (!ranges.length) return
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
138 let out = []
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
139 for (let i = 0; i < ranges.length; i++)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
140 out[i] = new Range(clipPos(this, ranges[i].anchor),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
141 clipPos(this, ranges[i].head || ranges[i].anchor))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
142 if (primary == null) primary = Math.min(ranges.length - 1, this.sel.primIndex)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
143 setSelection(this, normalizeSelection(this.cm, out, primary), options)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
144 }),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
145 addSelection: docMethodOp(function(anchor, head, options) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
146 let ranges = this.sel.ranges.slice(0)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
147 ranges.push(new Range(clipPos(this, anchor), clipPos(this, head || anchor)))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
148 setSelection(this, normalizeSelection(this.cm, ranges, ranges.length - 1), options)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
149 }),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
150
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
151 getSelection: function(lineSep) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
152 let ranges = this.sel.ranges, lines
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
153 for (let i = 0; i < ranges.length; i++) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
154 let sel = getBetween(this, ranges[i].from(), ranges[i].to())
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
155 lines = lines ? lines.concat(sel) : sel
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
156 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
157 if (lineSep === false) return lines
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
158 else return lines.join(lineSep || this.lineSeparator())
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
159 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
160 getSelections: function(lineSep) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
161 let parts = [], ranges = this.sel.ranges
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
162 for (let i = 0; i < ranges.length; i++) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
163 let sel = getBetween(this, ranges[i].from(), ranges[i].to())
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
164 if (lineSep !== false) sel = sel.join(lineSep || this.lineSeparator())
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
165 parts[i] = sel
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
166 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
167 return parts
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
168 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
169 replaceSelection: function(code, collapse, origin) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
170 let dup = []
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
171 for (let i = 0; i < this.sel.ranges.length; i++)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
172 dup[i] = code
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
173 this.replaceSelections(dup, collapse, origin || "+input")
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
174 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
175 replaceSelections: docMethodOp(function(code, collapse, origin) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
176 let changes = [], sel = this.sel
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
177 for (let i = 0; i < sel.ranges.length; i++) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
178 let range = sel.ranges[i]
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
179 changes[i] = {from: range.from(), to: range.to(), text: this.splitLines(code[i]), origin: origin}
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
180 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
181 let newSel = collapse && collapse != "end" && computeReplacedSel(this, changes, collapse)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
182 for (let i = changes.length - 1; i >= 0; i--)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
183 makeChange(this, changes[i])
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
184 if (newSel) setSelectionReplaceHistory(this, newSel)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
185 else if (this.cm) ensureCursorVisible(this.cm)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
186 }),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
187 undo: docMethodOp(function() {makeChangeFromHistory(this, "undo")}),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
188 redo: docMethodOp(function() {makeChangeFromHistory(this, "redo")}),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
189 undoSelection: docMethodOp(function() {makeChangeFromHistory(this, "undo", true)}),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
190 redoSelection: docMethodOp(function() {makeChangeFromHistory(this, "redo", true)}),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
191
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
192 setExtending: function(val) {this.extend = val},
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
193 getExtending: function() {return this.extend},
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
194
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
195 historySize: function() {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
196 let hist = this.history, done = 0, undone = 0
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
197 for (let i = 0; i < hist.done.length; i++) if (!hist.done[i].ranges) ++done
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
198 for (let i = 0; i < hist.undone.length; i++) if (!hist.undone[i].ranges) ++undone
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
199 return {undo: done, redo: undone}
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
200 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
201 clearHistory: function() {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
202 this.history = new History(this.history)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
203 linkedDocs(this, doc => doc.history = this.history, true)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
204 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
205
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
206 markClean: function() {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
207 this.cleanGeneration = this.changeGeneration(true)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
208 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
209 changeGeneration: function(forceSplit) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
210 if (forceSplit)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
211 this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
212 return this.history.generation
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
213 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
214 isClean: function (gen) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
215 return this.history.generation == (gen || this.cleanGeneration)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
216 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
217
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
218 getHistory: function() {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
219 return {done: copyHistoryArray(this.history.done),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
220 undone: copyHistoryArray(this.history.undone)}
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
221 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
222 setHistory: function(histData) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
223 let hist = this.history = new History(this.history)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
224 hist.done = copyHistoryArray(histData.done.slice(0), null, true)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
225 hist.undone = copyHistoryArray(histData.undone.slice(0), null, true)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
226 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
227
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
228 setGutterMarker: docMethodOp(function(line, gutterID, value) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
229 return changeLine(this, line, "gutter", line => {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
230 let markers = line.gutterMarkers || (line.gutterMarkers = {})
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
231 markers[gutterID] = value
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
232 if (!value && isEmpty(markers)) line.gutterMarkers = null
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
233 return true
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
234 })
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
235 }),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
236
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
237 clearGutter: docMethodOp(function(gutterID) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
238 this.iter(line => {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
239 if (line.gutterMarkers && line.gutterMarkers[gutterID]) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
240 changeLine(this, line, "gutter", () => {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
241 line.gutterMarkers[gutterID] = null
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
242 if (isEmpty(line.gutterMarkers)) line.gutterMarkers = null
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
243 return true
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
244 })
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
245 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
246 })
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
247 }),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
248
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
249 lineInfo: function(line) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
250 let n
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
251 if (typeof line == "number") {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
252 if (!isLine(this, line)) return null
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
253 n = line
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
254 line = getLine(this, line)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
255 if (!line) return null
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
256 } else {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
257 n = lineNo(line)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
258 if (n == null) return null
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
259 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
260 return {line: n, handle: line, text: line.text, gutterMarkers: line.gutterMarkers,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
261 textClass: line.textClass, bgClass: line.bgClass, wrapClass: line.wrapClass,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
262 widgets: line.widgets}
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
263 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
264
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
265 addLineClass: docMethodOp(function(handle, where, cls) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
266 return changeLine(this, handle, where == "gutter" ? "gutter" : "class", line => {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
267 let prop = where == "text" ? "textClass"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
268 : where == "background" ? "bgClass"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
269 : where == "gutter" ? "gutterClass" : "wrapClass"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
270 if (!line[prop]) line[prop] = cls
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
271 else if (classTest(cls).test(line[prop])) return false
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
272 else line[prop] += " " + cls
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
273 return true
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
274 })
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
275 }),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
276 removeLineClass: docMethodOp(function(handle, where, cls) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
277 return changeLine(this, handle, where == "gutter" ? "gutter" : "class", line => {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
278 let prop = where == "text" ? "textClass"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
279 : where == "background" ? "bgClass"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
280 : where == "gutter" ? "gutterClass" : "wrapClass"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
281 let cur = line[prop]
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
282 if (!cur) return false
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
283 else if (cls == null) line[prop] = null
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
284 else {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
285 let found = cur.match(classTest(cls))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
286 if (!found) return false
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
287 let end = found.index + found[0].length
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
288 line[prop] = cur.slice(0, found.index) + (!found.index || end == cur.length ? "" : " ") + cur.slice(end) || null
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
289 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
290 return true
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
291 })
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
292 }),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
293
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
294 addLineWidget: docMethodOp(function(handle, node, options) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
295 return addLineWidget(this, handle, node, options)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
296 }),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
297 removeLineWidget: function(widget) { widget.clear() },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
298
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
299 markText: function(from, to, options) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
300 return markText(this, clipPos(this, from), clipPos(this, to), options, options && options.type || "range")
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
301 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
302 setBookmark: function(pos, options) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
303 let realOpts = {replacedWith: options && (options.nodeType == null ? options.widget : options),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
304 insertLeft: options && options.insertLeft,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
305 clearWhenEmpty: false, shared: options && options.shared,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
306 handleMouseEvents: options && options.handleMouseEvents}
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
307 pos = clipPos(this, pos)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
308 return markText(this, pos, pos, realOpts, "bookmark")
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
309 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
310 findMarksAt: function(pos) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
311 pos = clipPos(this, pos)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
312 let markers = [], spans = getLine(this, pos.line).markedSpans
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
313 if (spans) for (let i = 0; i < spans.length; ++i) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
314 let span = spans[i]
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
315 if ((span.from == null || span.from <= pos.ch) &&
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
316 (span.to == null || span.to >= pos.ch))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
317 markers.push(span.marker.parent || span.marker)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
318 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
319 return markers
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
320 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
321 findMarks: function(from, to, filter) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
322 from = clipPos(this, from); to = clipPos(this, to)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
323 let found = [], lineNo = from.line
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
324 this.iter(from.line, to.line + 1, line => {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
325 let spans = line.markedSpans
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
326 if (spans) for (let i = 0; i < spans.length; i++) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
327 let span = spans[i]
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
328 if (!(span.to != null && lineNo == from.line && from.ch >= span.to ||
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
329 span.from == null && lineNo != from.line ||
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
330 span.from != null && lineNo == to.line && span.from >= to.ch) &&
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
331 (!filter || filter(span.marker)))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
332 found.push(span.marker.parent || span.marker)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
333 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
334 ++lineNo
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
335 })
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
336 return found
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
337 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
338 getAllMarks: function() {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
339 let markers = []
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
340 this.iter(line => {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
341 let sps = line.markedSpans
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
342 if (sps) for (let i = 0; i < sps.length; ++i)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
343 if (sps[i].from != null) markers.push(sps[i].marker)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
344 })
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
345 return markers
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
346 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
347
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
348 posFromIndex: function(off) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
349 let ch, lineNo = this.first, sepSize = this.lineSeparator().length
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
350 this.iter(line => {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
351 let sz = line.text.length + sepSize
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
352 if (sz > off) { ch = off; return true }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
353 off -= sz
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
354 ++lineNo
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
355 })
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
356 return clipPos(this, Pos(lineNo, ch))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
357 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
358 indexFromPos: function (coords) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
359 coords = clipPos(this, coords)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
360 let index = coords.ch
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
361 if (coords.line < this.first || coords.ch < 0) return 0
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
362 let sepSize = this.lineSeparator().length
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
363 this.iter(this.first, coords.line, line => { // iter aborts when callback returns a truthy value
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
364 index += line.text.length + sepSize
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
365 })
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
366 return index
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
367 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
368
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
369 copy: function(copyHistory) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
370 let doc = new Doc(getLines(this, this.first, this.first + this.size),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
371 this.modeOption, this.first, this.lineSep, this.direction)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
372 doc.scrollTop = this.scrollTop; doc.scrollLeft = this.scrollLeft
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
373 doc.sel = this.sel
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
374 doc.extend = false
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
375 if (copyHistory) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
376 doc.history.undoDepth = this.history.undoDepth
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
377 doc.setHistory(this.getHistory())
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
378 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
379 return doc
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
380 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
381
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
382 linkedDoc: function(options) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
383 if (!options) options = {}
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
384 let from = this.first, to = this.first + this.size
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
385 if (options.from != null && options.from > from) from = options.from
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
386 if (options.to != null && options.to < to) to = options.to
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
387 let copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from, this.lineSep, this.direction)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
388 if (options.sharedHist) copy.history = this.history
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
389 ;(this.linked || (this.linked = [])).push({doc: copy, sharedHist: options.sharedHist})
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
390 copy.linked = [{doc: this, isParent: true, sharedHist: options.sharedHist}]
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
391 copySharedMarkers(copy, findSharedMarkers(this))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
392 return copy
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
393 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
394 unlinkDoc: function(other) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
395 if (other instanceof CodeMirror) other = other.doc
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
396 if (this.linked) for (let i = 0; i < this.linked.length; ++i) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
397 let link = this.linked[i]
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
398 if (link.doc != other) continue
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
399 this.linked.splice(i, 1)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
400 other.unlinkDoc(this)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
401 detachSharedMarkers(findSharedMarkers(this))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
402 break
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
403 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
404 // If the histories were shared, split them again
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
405 if (other.history == this.history) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
406 let splitIds = [other.id]
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
407 linkedDocs(other, doc => splitIds.push(doc.id), true)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
408 other.history = new History(null)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
409 other.history.done = copyHistoryArray(this.history.done, splitIds)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
410 other.history.undone = copyHistoryArray(this.history.undone, splitIds)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
411 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
412 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
413 iterLinkedDocs: function(f) {linkedDocs(this, f)},
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
414
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
415 getMode: function() {return this.mode},
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
416 getEditor: function() {return this.cm},
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
417
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
418 splitLines: function(str) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
419 if (this.lineSep) return str.split(this.lineSep)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
420 return splitLinesAuto(str)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
421 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
422 lineSeparator: function() { return this.lineSep || "\n" },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
423
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
424 setDirection: docMethodOp(function (dir) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
425 if (dir != "rtl") dir = "ltr"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
426 if (dir == this.direction) return
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
427 this.direction = dir
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
428 this.iter(line => line.order = null)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
429 if (this.cm) directionChanged(this.cm)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
430 })
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
431 })
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
432
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
433 // Public alias.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
434 Doc.prototype.eachLine = Doc.prototype.iter
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
435
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
436 export default Doc