| 1 |
// CodeMirror, copyright (c) by Marijn Haverbeke and others |
| 2 |
// Distributed under an MIT license: http://codemirror.net/LICENSE |
| 3 |
|
| 4 |
(function(mod) { |
| 5 |
if (typeof exports == "object" && typeof module == "object") // CommonJS |
| 6 |
mod(require("../../lib/codemirror")); |
| 7 |
else if (typeof define == "function" && define.amd) // AMD |
| 8 |
define(["../../lib/codemirror"], mod); |
| 9 |
else // Plain browser env |
| 10 |
mod(CodeMirror); |
| 11 |
})(function(CodeMirror) { |
| 12 |
CodeMirror.defineOption("placeholder", "", function(cm, val, old) { |
| 13 |
var prev = old && old != CodeMirror.Init; |
| 14 |
if (val && !prev) { |
| 15 |
cm.on("blur", onBlur); |
| 16 |
cm.on("change", onChange); |
| 17 |
cm.on("swapDoc", onChange); |
| 18 |
onChange(cm); |
| 19 |
} else if (!val && prev) { |
| 20 |
cm.off("blur", onBlur); |
| 21 |
cm.off("change", onChange); |
| 22 |
cm.off("swapDoc", onChange); |
| 23 |
clearPlaceholder(cm); |
| 24 |
var wrapper = cm.getWrapperElement(); |
| 25 |
wrapper.className = wrapper.className.replace(" CodeMirror-empty", ""); |
| 26 |
} |
| 27 |
|
| 28 |
if (val && !cm.hasFocus()) onBlur(cm); |
| 29 |
}); |
| 30 |
|
| 31 |
function clearPlaceholder(cm) { |
| 32 |
if (cm.state.placeholder) { |
| 33 |
cm.state.placeholder.parentNode.removeChild(cm.state.placeholder); |
| 34 |
cm.state.placeholder = null; |
| 35 |
} |
| 36 |
} |
| 37 |
function setPlaceholder(cm) { |
| 38 |
clearPlaceholder(cm); |
| 39 |
var elt = cm.state.placeholder = document.createElement("pre"); |
| 40 |
elt.style.cssText = "height: 0; overflow: visible"; |
| 41 |
elt.className = "CodeMirror-placeholder"; |
| 42 |
var placeHolder = cm.getOption("placeholder") |
| 43 |
if (typeof placeHolder == "string") placeHolder = document.createTextNode(placeHolder) |
| 44 |
elt.appendChild(placeHolder) |
| 45 |
cm.display.lineSpace.insertBefore(elt, cm.display.lineSpace.firstChild); |
| 46 |
} |
| 47 |
|
| 48 |
function onBlur(cm) { |
| 49 |
if (isEmpty(cm)) setPlaceholder(cm); |
| 50 |
} |
| 51 |
function onChange(cm) { |
| 52 |
var wrapper = cm.getWrapperElement(), empty = isEmpty(cm); |
| 53 |
wrapper.className = wrapper.className.replace(" CodeMirror-empty", "") + (empty ? " CodeMirror-empty" : ""); |
| 54 |
|
| 55 |
if (empty) setPlaceholder(cm); |
| 56 |
else clearPlaceholder(cm); |
| 57 |
} |
| 58 |
|
| 59 |
function isEmpty(cm) { |
| 60 |
return (cm.lineCount() === 1) && (cm.getLine(0) === ""); |
| 61 |
} |
| 62 |
}); |
| 63 |
|