| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 | (function() {  CodeMirror.defineOption("placeholder", "", function(cm, val, old) {    var prev = old && old != CodeMirror.Init;    if (val && !prev) {      cm.on("focus", onFocus);      cm.on("blur", onBlur);      cm.on("change", onChange);      onChange(cm);    } else if (!val && prev) {      cm.off("focus", onFocus);      cm.off("blur", onBlur);      cm.off("change", onChange);      clearPlaceholder(cm);      var wrapper = cm.getWrapperElement();      wrapper.className = wrapper.className.replace(" CodeMirror-empty", "");    }    if (val && !cm.hasFocus()) onBlur(cm);  });  function clearPlaceholder(cm) {    if (cm._placeholder) {      cm._placeholder.parentNode.removeChild(cm._placeholder);      cm._placeholder = null;    }  }  function setPlaceholder(cm) {    clearPlaceholder(cm);    var elt = cm._placeholder = document.createElement("pre");    elt.style.cssText = "height: 0; overflow: visible";    elt.className = "CodeMirror-placeholder";    elt.appendChild(document.createTextNode(cm.getOption("placeholder")));    cm.display.lineSpace.insertBefore(elt, cm.display.lineSpace.firstChild);  }  function onFocus(cm) {    clearPlaceholder(cm);  }  function onBlur(cm) {    if (isEmpty(cm)) setPlaceholder(cm);  }  function onChange(cm) {    var wrapper = cm.getWrapperElement(), empty = isEmpty(cm);    wrapper.className = wrapper.className.replace(" CodeMirror-empty", "") + (empty ? " CodeMirror-empty" : "");    if (cm.hasFocus()) return;    if (empty) setPlaceholder(cm);    else clearPlaceholder(cm);  }  function isEmpty(cm) {    return (cm.lineCount() === 1) && (cm.getLine(0) === "");  }})();
 |