diff options
Diffstat (limited to 'o3d/samples/third_party/codemirror/js/codemirror.js')
-rw-r--r-- | o3d/samples/third_party/codemirror/js/codemirror.js | 189 |
1 files changed, 189 insertions, 0 deletions
diff --git a/o3d/samples/third_party/codemirror/js/codemirror.js b/o3d/samples/third_party/codemirror/js/codemirror.js new file mode 100644 index 0000000..9b7b5db --- /dev/null +++ b/o3d/samples/third_party/codemirror/js/codemirror.js @@ -0,0 +1,189 @@ +/* CodeMirror main module + * + * Implements the CodeMirror constructor and prototype, which take care + * of initializing the editor frame, and providing the outside interface. + */ + +// The CodeMirrorConfig object is used to specify a default +// configuration. If you specify such an object before loading this +// file, the values you put into it will override the defaults given +// below. You can also assign to it after loading. +var CodeMirrorConfig = window.CodeMirrorConfig || {}; + +var CodeMirror = (function(){ + function setDefaults(object, defaults) { + for (var option in defaults) { + if (!object.hasOwnProperty(option)) + object[option] = defaults[option]; + } + } + function forEach(array, action) { + for (var i = 0; i < array.length; i++) + action(array[i]); + } + + // These default options can be overridden by passing a set of + // options to a specific CodeMirror constructor. See manual.html for + // their meaning. + setDefaults(CodeMirrorConfig, { + stylesheet: "", + path: "", + parserfile: [], + basefiles: ["util.js", "stringstream.js", "select.js", "undo.js", "editor.js", "tokenize.js"], + linesPerPass: 15, + passDelay: 200, + continuousScanning: false, + saveFunction: null, + onChange: null, + undoDepth: 20, + undoDelay: 800, + disableSpellcheck: true, + textWrapping: true, + readOnly: false, + width: "100%", + height: "300px", + autoMatchParens: false, + parserConfig: null, + dumbTabs: false + }); + + function CodeMirror(place, options) { + // Use passed options, if any, to override defaults. + this.options = options = options || {}; + setDefaults(options, CodeMirrorConfig); + + var frame = this.frame = document.createElement("IFRAME"); + frame.style.border = "0"; + frame.style.width = options.width; + frame.style.height = options.height; + // display: block occasionally suppresses some Firefox bugs, so we + // always add it, redundant as it sounds. + frame.style.display = "block"; + + if (place.appendChild) + place.appendChild(frame); + else + place(frame); + + // Link back to this object, so that the editor can fetch options + // and add a reference to itself. + frame.CodeMirror = this; + this.win = frame.contentWindow; + + if (typeof options.parserfile == "string") + options.parserfile = [options.parserfile]; + if (typeof options.stylesheet == "string") + options.stylesheet = [options.stylesheet]; + + var html = ["<html><head>"]; + forEach(options.stylesheet, function(file) { + html.push("<link rel=\"stylesheet\" type=\"text/css\" href=\"" + file + "\"/>"); + }); + forEach(options.basefiles.concat(options.parserfile), function(file) { + html.push("<script type=\"text/javascript\" src=\"" + options.path + file + "\"></script>"); + }); + html.push("</head><body style=\"border-width: 0;\" class=\"editbox\" spellcheck=\"" + + (options.disableSpellcheck ? "false" : "true") + "\"></body></html>"); + + var doc = this.win.document; + doc.open(); + doc.write(html.join("")); + doc.close(); + } + + CodeMirror.prototype = { + getCode: function() { + return this.editor.getCode(); + }, + setCode: function(code) { + this.editor.importCode(code); + }, + focus: function() { + this.win.focus(); + }, + jumpToChar: function(start, end) { + this.editor.jumpToChar(start, end); + this.focus(); + }, + jumpToLine: function(line) { + this.editor.jumpToLine(line); + this.focus(); + }, + currentLine: function() { + return this.editor.currentLine(); + }, + selection: function() { + return this.editor.selectedText(); + }, + reindent: function() { + this.editor.reindent(); + }, + replaceSelection: function(text, focus) { + var result = this.editor.replaceSelection(text); + if (focus) this.focus(); + return result; + }, + replaceChars: function(text, start, end) { + this.editor.replaceChars(text, start, end); + }, + getSearchCursor: function(string, fromCursor) { + return this.editor.getSearchCursor(string, fromCursor); + } + }; + + CodeMirror.replace = function(element) { + if (typeof element == "string") + element = document.getElementById(element); + return function(newElement) { + element.parentNode.replaceChild(newElement, element); + }; + }; + + CodeMirror.fromTextArea = function(area, options) { + if (typeof area == "string") + area = document.getElementById(area); + + options = options || {}; + if (area.style.width) options.width = area.style.width; + if (area.style.height) options.height = area.style.height; + if (options.content == null) options.content = area.value; + + if (area.form) { + function updateField() { + area.value = mirror.getCode(); + } + if (typeof area.form.addEventListener == "function") + area.form.addEventListener("submit", updateField, false); + else + area.form.attachEvent("onsubmit", updateField); + } + + function insert(frame) { + if (area.nextSibling) + area.parentNode.insertBefore(frame, area.nextSibling); + else + area.parentNode.appendChild(frame); + } + + area.style.display = "none"; + var mirror = new CodeMirror(insert, options); + return mirror; + }; + + CodeMirror.isProbablySupported = function() { + // This is rather awful, but can be useful. + var match; + if (window.opera) + return Number(window.opera.version()) >= 9.52; + else if (/Apple Computers, Inc/.test(navigator.vendor) && (match = navigator.userAgent.match(/Version\/(\d+(?:\.\d+)?)\./))) + return Number(match[1]) >= 3; + else if (document.selection && window.ActiveXObject && (match = navigator.userAgent.match(/MSIE (\d+(?:\.\d*)?)\b/))) + return Number(match[1]) >= 6; + else if (match = navigator.userAgent.match(/gecko\/(\d{8})/i)) + return Number(match[1]) >= 20050901; + else + return null; + }; + + return CodeMirror; +})(); |