annotate .cms/lib/codemirror/src/edit/options.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 { onBlur } from "../display/focus.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
2 import { getGutters, updateGutters } from "../display/gutters.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
3 import { loadMode, resetModeState } from "../display/mode_state.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
4 import { initScrollbars, updateScrollbars } from "../display/scrollbars.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
5 import { updateSelection } from "../display/selection.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
6 import { regChange } from "../display/view_tracking.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
7 import { getKeyMap } from "../input/keymap.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
8 import { defaultSpecialCharPlaceholder } from "../line/line_data.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
9 import { Pos } from "../line/pos.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
10 import { findMaxLine } from "../line/spans.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
11 import { clearCaches, compensateForHScroll, estimateLineHeights } from "../measurement/position_measurement.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
12 import { replaceRange } from "../model/changes.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
13 import { mobile, windows } from "../util/browser.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
14 import { addClass, rmClass } from "../util/dom.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
15 import { off, on } from "../util/event.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
16
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
17 import { themeChanged } from "./utils.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
18
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
19 export let Init = {toString: function(){return "CodeMirror.Init"}}
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
20
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
21 export let defaults = {}
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
22 export let optionHandlers = {}
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
23
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
24 export function defineOptions(CodeMirror) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
25 let optionHandlers = CodeMirror.optionHandlers
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
26
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
27 function option(name, deflt, handle, notOnInit) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
28 CodeMirror.defaults[name] = deflt
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
29 if (handle) optionHandlers[name] =
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
30 notOnInit ? (cm, val, old) => {if (old != Init) handle(cm, val, old)} : handle
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
31 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
32
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
33 CodeMirror.defineOption = option
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
34
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
35 // Passed to option handlers when there is no old value.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
36 CodeMirror.Init = Init
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
37
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
38 // These two are, on init, called from the constructor because they
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
39 // have to be initialized before the editor can start at all.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
40 option("value", "", (cm, val) => cm.setValue(val), true)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
41 option("mode", null, (cm, val) => {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
42 cm.doc.modeOption = val
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
43 loadMode(cm)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
44 }, true)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
45
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
46 option("indentUnit", 2, loadMode, true)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
47 option("indentWithTabs", false)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
48 option("smartIndent", true)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
49 option("tabSize", 4, cm => {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
50 resetModeState(cm)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
51 clearCaches(cm)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
52 regChange(cm)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
53 }, true)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
54
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
55 option("lineSeparator", null, (cm, val) => {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
56 cm.doc.lineSep = val
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
57 if (!val) return
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
58 let newBreaks = [], lineNo = cm.doc.first
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
59 cm.doc.iter(line => {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
60 for (let pos = 0;;) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
61 let found = line.text.indexOf(val, pos)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
62 if (found == -1) break
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
63 pos = found + val.length
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
64 newBreaks.push(Pos(lineNo, found))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
65 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
66 lineNo++
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
67 })
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
68 for (let i = newBreaks.length - 1; i >= 0; i--)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
69 replaceRange(cm.doc, val, newBreaks[i], Pos(newBreaks[i].line, newBreaks[i].ch + val.length))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
70 })
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
71 option("specialChars", /[\u0000-\u001f\u007f-\u009f\u00ad\u061c\u200b\u200e\u200f\u2028\u2029\u202d\u202e\u2066\u2067\u2069\ufeff\ufff9-\ufffc]/g, (cm, val, old) => {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
72 cm.state.specialChars = new RegExp(val.source + (val.test("\t") ? "" : "|\t"), "g")
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
73 if (old != Init) cm.refresh()
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
74 })
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
75 option("specialCharPlaceholder", defaultSpecialCharPlaceholder, cm => cm.refresh(), true)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
76 option("electricChars", true)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
77 option("inputStyle", mobile ? "contenteditable" : "textarea", () => {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
78 throw new Error("inputStyle can not (yet) be changed in a running editor") // FIXME
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
79 }, true)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
80 option("spellcheck", false, (cm, val) => cm.getInputField().spellcheck = val, true)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
81 option("autocorrect", false, (cm, val) => cm.getInputField().autocorrect = val, true)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
82 option("autocapitalize", false, (cm, val) => cm.getInputField().autocapitalize = val, true)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
83 option("rtlMoveVisually", !windows)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
84 option("wholeLineUpdateBefore", true)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
85
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
86 option("theme", "default", cm => {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
87 themeChanged(cm)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
88 updateGutters(cm)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
89 }, true)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
90 option("keyMap", "default", (cm, val, old) => {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
91 let next = getKeyMap(val)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
92 let prev = old != Init && getKeyMap(old)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
93 if (prev && prev.detach) prev.detach(cm, next)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
94 if (next.attach) next.attach(cm, prev || null)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
95 })
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
96 option("extraKeys", null)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
97 option("configureMouse", null)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
98
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
99 option("lineWrapping", false, wrappingChanged, true)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
100 option("gutters", [], (cm, val) => {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
101 cm.display.gutterSpecs = getGutters(val, cm.options.lineNumbers)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
102 updateGutters(cm)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
103 }, true)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
104 option("fixedGutter", true, (cm, val) => {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
105 cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + "px" : "0"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
106 cm.refresh()
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
107 }, true)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
108 option("coverGutterNextToScrollbar", false, cm => updateScrollbars(cm), true)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
109 option("scrollbarStyle", "native", cm => {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
110 initScrollbars(cm)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
111 updateScrollbars(cm)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
112 cm.display.scrollbars.setScrollTop(cm.doc.scrollTop)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
113 cm.display.scrollbars.setScrollLeft(cm.doc.scrollLeft)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
114 }, true)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
115 option("lineNumbers", false, (cm, val) => {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
116 cm.display.gutterSpecs = getGutters(cm.options.gutters, val)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
117 updateGutters(cm)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
118 }, true)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
119 option("firstLineNumber", 1, updateGutters, true)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
120 option("lineNumberFormatter", integer => integer, updateGutters, true)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
121 option("showCursorWhenSelecting", false, updateSelection, true)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
122
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
123 option("resetSelectionOnContextMenu", true)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
124 option("lineWiseCopyCut", true)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
125 option("pasteLinesPerSelection", true)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
126 option("selectionsMayTouch", false)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
127
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
128 option("readOnly", false, (cm, val) => {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
129 if (val == "nocursor") {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
130 onBlur(cm)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
131 cm.display.input.blur()
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
132 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
133 cm.display.input.readOnlyChanged(val)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
134 })
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
135
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
136 option("screenReaderLabel", null, (cm, val) => {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
137 val = (val === '') ? null : val
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
138 cm.display.input.screenReaderLabelChanged(val)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
139 })
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
140
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
141 option("disableInput", false, (cm, val) => {if (!val) cm.display.input.reset()}, true)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
142 option("dragDrop", true, dragDropChanged)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
143 option("allowDropFileTypes", null)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
144
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
145 option("cursorBlinkRate", 530)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
146 option("cursorScrollMargin", 0)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
147 option("cursorHeight", 1, updateSelection, true)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
148 option("singleCursorHeightPerLine", true, updateSelection, true)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
149 option("workTime", 100)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
150 option("workDelay", 100)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
151 option("flattenSpans", true, resetModeState, true)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
152 option("addModeClass", false, resetModeState, true)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
153 option("pollInterval", 100)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
154 option("undoDepth", 200, (cm, val) => cm.doc.history.undoDepth = val)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
155 option("historyEventDelay", 1250)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
156 option("viewportMargin", 10, cm => cm.refresh(), true)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
157 option("maxHighlightLength", 10000, resetModeState, true)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
158 option("moveInputWithCursor", true, (cm, val) => {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
159 if (!val) cm.display.input.resetPosition()
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
160 })
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
161
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
162 option("tabindex", null, (cm, val) => cm.display.input.getField().tabIndex = val || "")
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
163 option("autofocus", null)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
164 option("direction", "ltr", (cm, val) => cm.doc.setDirection(val), true)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
165 option("phrases", null)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
166 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
167
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
168 function dragDropChanged(cm, value, old) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
169 let wasOn = old && old != Init
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
170 if (!value != !wasOn) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
171 let funcs = cm.display.dragFunctions
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
172 let toggle = value ? on : off
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
173 toggle(cm.display.scroller, "dragstart", funcs.start)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
174 toggle(cm.display.scroller, "dragenter", funcs.enter)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
175 toggle(cm.display.scroller, "dragover", funcs.over)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
176 toggle(cm.display.scroller, "dragleave", funcs.leave)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
177 toggle(cm.display.scroller, "drop", funcs.drop)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
178 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
179 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
180
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
181 function wrappingChanged(cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
182 if (cm.options.lineWrapping) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
183 addClass(cm.display.wrapper, "CodeMirror-wrap")
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
184 cm.display.sizer.style.minWidth = ""
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
185 cm.display.sizerWidth = null
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
186 } else {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
187 rmClass(cm.display.wrapper, "CodeMirror-wrap")
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
188 findMaxLine(cm)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
189 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
190 estimateLineHeights(cm)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
191 regChange(cm)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
192 clearCaches(cm)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
193 setTimeout(() => updateScrollbars(cm), 100)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
194 }