annotate .cms/lib/codemirror/src/edit/fromTextArea.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 "./CodeMirror.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
2 import { activeElt, rootNode } from "../util/dom.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
3 import { off, on } from "../util/event.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
4 import { copyObj } from "../util/misc.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
5
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
6 export function fromTextArea(textarea, options) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
7 options = options ? copyObj(options) : {}
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
8 options.value = textarea.value
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
9 if (!options.tabindex && textarea.tabIndex)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
10 options.tabindex = textarea.tabIndex
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
11 if (!options.placeholder && textarea.placeholder)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
12 options.placeholder = textarea.placeholder
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
13 // Set autofocus to true if this textarea is focused, or if it has
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
14 // autofocus and no other element is focused.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
15 if (options.autofocus == null) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
16 let hasFocus = activeElt(rootNode(textarea))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
17 options.autofocus = hasFocus == textarea ||
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
18 textarea.getAttribute("autofocus") != null && hasFocus == document.body
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
19 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
20
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
21 function save() {textarea.value = cm.getValue()}
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
22
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
23 let realSubmit
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
24 if (textarea.form) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
25 on(textarea.form, "submit", save)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
26 // Deplorable hack to make the submit method do the right thing.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
27 if (!options.leaveSubmitMethodAlone) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
28 let form = textarea.form
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
29 realSubmit = form.submit
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
30 try {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
31 let wrappedSubmit = form.submit = () => {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
32 save()
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
33 form.submit = realSubmit
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
34 form.submit()
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
35 form.submit = wrappedSubmit
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
36 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
37 } catch(e) {}
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
38 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
39 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
40
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
41 options.finishInit = cm => {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
42 cm.save = save
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
43 cm.getTextArea = () => textarea
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
44 cm.toTextArea = () => {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
45 cm.toTextArea = isNaN // Prevent this from being ran twice
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
46 save()
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
47 textarea.parentNode.removeChild(cm.getWrapperElement())
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
48 textarea.style.display = ""
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
49 if (textarea.form) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
50 off(textarea.form, "submit", save)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
51 if (!options.leaveSubmitMethodAlone && typeof textarea.form.submit == "function")
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
52 textarea.form.submit = realSubmit
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
53 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
54 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
55 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
56
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
57 textarea.style.display = "none"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
58 let cm = CodeMirror(node => textarea.parentNode.insertBefore(node, textarea.nextSibling),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
59 options)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
60 return cm
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
61 }