62 lines
1.9 KiB
JavaScript
62 lines
1.9 KiB
JavaScript
|
import { CodeMirror } from "./CodeMirror.js"
|
||
|
import { activeElt } from "../util/dom.js"
|
||
|
import { off, on } from "../util/event.js"
|
||
|
import { copyObj } from "../util/misc.js"
|
||
|
|
||
|
export function fromTextArea(textarea, options) {
|
||
|
options = options ? copyObj(options) : {}
|
||
|
options.value = textarea.value
|
||
|
if (!options.tabindex && textarea.tabIndex)
|
||
|
options.tabindex = textarea.tabIndex
|
||
|
if (!options.placeholder && textarea.placeholder)
|
||
|
options.placeholder = textarea.placeholder
|
||
|
// Set autofocus to true if this textarea is focused, or if it has
|
||
|
// autofocus and no other element is focused.
|
||
|
if (options.autofocus == null) {
|
||
|
let hasFocus = activeElt()
|
||
|
options.autofocus = hasFocus == textarea ||
|
||
|
textarea.getAttribute("autofocus") != null && hasFocus == document.body
|
||
|
}
|
||
|
|
||
|
function save() {textarea.value = cm.getValue()}
|
||
|
|
||
|
let realSubmit
|
||
|
if (textarea.form) {
|
||
|
on(textarea.form, "submit", save)
|
||
|
// Deplorable hack to make the submit method do the right thing.
|
||
|
if (!options.leaveSubmitMethodAlone) {
|
||
|
let form = textarea.form
|
||
|
realSubmit = form.submit
|
||
|
try {
|
||
|
let wrappedSubmit = form.submit = () => {
|
||
|
save()
|
||
|
form.submit = realSubmit
|
||
|
form.submit()
|
||
|
form.submit = wrappedSubmit
|
||
|
}
|
||
|
} catch(e) {}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
options.finishInit = cm => {
|
||
|
cm.save = save
|
||
|
cm.getTextArea = () => textarea
|
||
|
cm.toTextArea = () => {
|
||
|
cm.toTextArea = isNaN // Prevent this from being ran twice
|
||
|
save()
|
||
|
textarea.parentNode.removeChild(cm.getWrapperElement())
|
||
|
textarea.style.display = ""
|
||
|
if (textarea.form) {
|
||
|
off(textarea.form, "submit", save)
|
||
|
if (typeof textarea.form.submit == "function")
|
||
|
textarea.form.submit = realSubmit
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
textarea.style.display = "none"
|
||
|
let cm = CodeMirror(node => textarea.parentNode.insertBefore(node, textarea.nextSibling),
|
||
|
options)
|
||
|
return cm
|
||
|
}
|