diff --git a/CodeMirror-2.25/keymap/emacs.js b/CodeMirror-2.25/keymap/emacs.js deleted file mode 100644 index 2a57e2f..0000000 --- a/CodeMirror-2.25/keymap/emacs.js +++ /dev/null @@ -1,29 +0,0 @@ -// TODO number prefixes -(function() { - // Really primitive kill-ring implementation. - var killRing = []; - function addToRing(str) { - killRing.push(str); - if (killRing.length > 50) killRing.shift(); - } - function getFromRing() { return killRing[killRing.length - 1] || ""; } - function popFromRing() { if (killRing.length > 1) killRing.pop(); return getFromRing(); } - - CodeMirror.keyMap.emacs = { - "Ctrl-X": function(cm) {cm.setOption("keyMap", "emacs-Ctrl-X");}, - "Ctrl-W": function(cm) {addToRing(cm.getSelection()); cm.replaceSelection("");}, - "Ctrl-Alt-W": function(cm) {addToRing(cm.getSelection()); cm.replaceSelection("");}, - "Alt-W": function(cm) {addToRing(cm.getSelection());}, - "Ctrl-Y": function(cm) {cm.replaceSelection(getFromRing());}, - "Alt-Y": function(cm) {cm.replaceSelection(popFromRing());}, - "Ctrl-/": "undo", "Shift-Ctrl--": "undo", "Shift-Alt-,": "goDocStart", "Shift-Alt-.": "goDocEnd", - "Ctrl-S": "findNext", "Ctrl-R": "findPrev", "Ctrl-G": "clearSearch", "Shift-Alt-5": "replace", - "Ctrl-Z": "undo", "Cmd-Z": "undo", "Alt-/": "autocomplete", - fallthrough: ["basic", "emacsy"] - }; - - CodeMirror.keyMap["emacs-Ctrl-X"] = { - "Ctrl-S": "save", "Ctrl-W": "save", "S": "saveAll", "F": "open", "U": "undo", "K": "close", - auto: "emacs", nofallthrough: true - }; -})(); diff --git a/CodeMirror-2.25/keymap/vim.js b/CodeMirror-2.25/keymap/vim.js deleted file mode 100644 index 6fbfcbc..0000000 --- a/CodeMirror-2.25/keymap/vim.js +++ /dev/null @@ -1,500 +0,0 @@ -// Supported keybindings: -// -// Cursor movement: -// h, j, k, l -// e, E, w, W, b, B -// Ctrl-f, Ctrl-b -// Ctrl-n, Ctrl-p -// $, ^, 0 -// G -// ge, gE -// gg -// f, F, t, T -// Ctrl-o, Ctrl-i TODO (FIXME - Ctrl-O wont work in Chrome) -// /, ?, n, N TODO (does not work) -// #, * TODO -// -// Entering insert mode: -// i, I, a, A, o, O -// s -// ce, cb (without support for number of actions like c3e - TODO) -// cc -// S, C TODO -// cf, cF, ct, cT -// -// Deleting text: -// x, X -// J -// dd, D -// de, db (without support for number of actions like d3e - TODO) -// df, dF, dt, dT -// -// Yanking and pasting: -// yy, Y -// p, P -// p' TODO - test -// y' TODO - test -// m TODO - test -// -// Changing text in place: -// ~ -// r -// -// Visual mode: -// v, V TODO -// -// Misc: -// . TODO -// - - -(function() { - var count = ""; - var sdir = "f"; - var buf = ""; - var yank = 0; - var mark = []; - function emptyBuffer() { buf = ""; } - function pushInBuffer(str) { buf += str; }; - function pushCountDigit(digit) { return function(cm) {count += digit;} } - function popCount() { var i = parseInt(count); count = ""; return i || 1; } - function iterTimes(func) { - for (var i = 0, c = popCount(); i < c; ++i) func(i, i == c - 1); - } - function countTimes(func) { - if (typeof func == "string") func = CodeMirror.commands[func]; - return function(cm) { iterTimes(function () { func(cm); }) }; - } - - function iterObj(o, f) { - for (var prop in o) if (o.hasOwnProperty(prop)) f(prop, o[prop]); - } - function iterList(l, f) { - for (var i in l) f(l[i]); - } - function toLetter(ch) { - // T -> t, Shift-T -> T, '*' -> *, "Space" -> " " - if (ch.slice(0, 6) == "Shift-") { - return ch.slice(0, 1); - } else { - if (ch == "Space") return " "; - if (ch.length == 3 && ch[0] == "'" && ch[2] == "'") return ch[1]; - return ch.toLowerCase(); - } - } - var SPECIAL_SYMBOLS = "~`!@#$%^&*()_-+=[{}]\\|/?.,<>:;\"\'1234567890"; - function toCombo(ch) { - // t -> T, T -> Shift-T, * -> '*', " " -> "Space" - if (ch == " ") return "Space"; - var specialIdx = SPECIAL_SYMBOLS.indexOf(ch); - if (specialIdx != -1) return "'" + ch + "'"; - if (ch.toLowerCase() == ch) return ch.toUpperCase(); - return "Shift-" + ch.toUpperCase(); - } - - var word = [/\w/, /[^\w\s]/], bigWord = [/\S/]; - function findWord(line, pos, dir, regexps) { - var stop = 0, next = -1; - if (dir > 0) { stop = line.length; next = 0; } - var start = stop, end = stop; - // Find bounds of next one. - outer: for (; pos != stop; pos += dir) { - for (var i = 0; i < regexps.length; ++i) { - if (regexps[i].test(line.charAt(pos + next))) { - start = pos; - for (; pos != stop; pos += dir) { - if (!regexps[i].test(line.charAt(pos + next))) break; - } - end = pos; - break outer; - } - } - } - return {from: Math.min(start, end), to: Math.max(start, end)}; - } - function moveToWord(cm, regexps, dir, where) { - var cur = cm.getCursor(), ch = cur.ch, line = cm.getLine(cur.line), word; - while (true) { - word = findWord(line, ch, dir, regexps); - ch = word[where == "end" ? "to" : "from"]; - if (ch == cur.ch && word.from != word.to) ch = word[dir < 0 ? "from" : "to"]; - else break; - } - cm.setCursor(cur.line, word[where == "end" ? "to" : "from"], true); - } - function joinLineNext(cm) { - var cur = cm.getCursor(), ch = cur.ch, line = cm.getLine(cur.line); - CodeMirror.commands.goLineEnd(cm); - if (cur.line != cm.lineCount()) { - CodeMirror.commands.goLineEnd(cm); - cm.replaceSelection(" ", "end"); - CodeMirror.commands.delCharRight(cm); - } - } - function delTillMark(cm, cHar) { - var i = mark[cHar]; - if (i === undefined) { - // console.log("Mark not set"); // TODO - show in status bar - return; - } - var l = cm.getCursor().line, start = i > l ? l : i, end = i > l ? i : l; - cm.setCursor(start); - for (var c = start; c <= end; c++) { - pushInBuffer("\n"+cm.getLine(start)); - cm.removeLine(start); - } - } - function yankTillMark(cm, cHar) { - var i = mark[cHar]; - if (i === undefined) { - // console.log("Mark not set"); // TODO - show in status bar - return; - } - var l = cm.getCursor().line, start = i > l ? l : i, end = i > l ? i : l; - for (var c = start; c <= end; c++) { - pushInBuffer("\n"+cm.getLine(c)); - } - cm.setCursor(start); - } - function goLineStartText(cm) { - // Go to the start of the line where the text begins, or the end for whitespace-only lines - var cur = cm.getCursor(), firstNonWS = cm.getLine(cur.line).search(/\S/); - cm.setCursor(cur.line, firstNonWS == -1 ? line.length : firstNonWS, true); - } - - function charIdxInLine(cm, cHar, motion_options) { - // Search for cHar in line. - // motion_options: {forward, inclusive} - // If inclusive = true, include it too. - // If forward = true, search forward, else search backwards. - // If char is not found on this line, do nothing - var cur = cm.getCursor(), line = cm.getLine(cur.line), idx; - var ch = toLetter(cHar), mo = motion_options; - if (mo.forward) { - idx = line.indexOf(ch, cur.ch + 1); - if (idx != -1 && mo.inclusive) idx += 1; - } else { - idx = line.lastIndexOf(ch, cur.ch); - if (idx != -1 && !mo.inclusive) idx += 1; - } - return idx; - } - - function moveTillChar(cm, cHar, motion_options) { - // Move to cHar in line, as found by charIdxInLine. - var idx = charIdxInLine(cm, cHar, motion_options), cur = cm.getCursor(); - if (idx != -1) cm.setCursor({line: cur.line, ch: idx}); - } - - function delTillChar(cm, cHar, motion_options) { - // delete text in this line, untill cHar is met, - // as found by charIdxInLine. - // If char is not found on this line, do nothing - var idx = charIdxInLine(cm, cHar, motion_options); - var cur = cm.getCursor(); - if (idx !== -1) { - if (motion_options.forward) { - cm.replaceRange("", {line: cur.line, ch: cur.ch}, {line: cur.line, ch: idx}); - } else { - cm.replaceRange("", {line: cur.line, ch: idx}, {line: cur.line, ch: cur.ch}); - } - } - } - - function enterInsertMode(cm) { - // enter insert mode: switch mode and cursor - if (!cm) console.log("call enterInsertMode with 'cm' as an argument"); - popCount(); - cm.setOption("keyMap", "vim-insert"); - } - - // main keymap - var map = CodeMirror.keyMap.vim = { - // Pipe (|); TODO: should be *screen* chars, so need a util function to turn tabs into spaces? - "'|'": function(cm) { - cm.setCursor(cm.getCursor().line, popCount() - 1, true); - }, - "'^'": function(cm) { popCount(); goLineStartText(cm);}, - "A": function(cm) { - cm.setCursor(cm.getCursor().line, cm.getCursor().ch+1, true); - enterInsertMode(cm); - }, - "Shift-A": function(cm) { CodeMirror.commands.goLineEnd(cm); enterInsertMode(cm);}, - "I": function(cm) { enterInsertMode(cm);}, - "Shift-I": function(cm) { goLineStartText(cm); enterInsertMode(cm);}, - "O": function(cm) { - CodeMirror.commands.goLineEnd(cm); - CodeMirror.commands.newlineAndIndent(cm); - enterInsertMode(cm); - }, - "Shift-O": function(cm) { - CodeMirror.commands.goLineStart(cm); - cm.replaceSelection("\n", "start"); - cm.indentLine(cm.getCursor().line); - enterInsertMode(cm); - }, - "G": function(cm) { cm.setOption("keyMap", "vim-prefix-g");}, - "Shift-D": function(cm) { - // commented out verions works, but I left original, cause maybe - // I don't know vim enouth to see what it does - /* var cur = cm.getCursor(); - var f = {line: cur.line, ch: cur.ch}, t = {line: cur.line}; - pushInBuffer(cm.getRange(f, t)); - cm.replaceRange("", f, t); - */ - emptyBuffer(); - mark["Shift-D"] = cm.getCursor(false).line; - cm.setCursor(cm.getCursor(true).line); - delTillMark(cm,"Shift-D"); mark = []; - }, - - "S": function (cm) { - countTimes(function (_cm) { - CodeMirror.commands.delCharRight(_cm); - })(cm); - enterInsertMode(cm); - }, - "M": function(cm) {cm.setOption("keyMap", "vim-prefix-m"); mark = [];}, - "Y": function(cm) {cm.setOption("keyMap", "vim-prefix-y"); emptyBuffer(); yank = 0;}, - "Shift-Y": function(cm) { - emptyBuffer(); - mark["Shift-D"] = cm.getCursor(false).line; - cm.setCursor(cm.getCursor(true).line); - yankTillMark(cm,"Shift-D"); mark = []; - }, - "/": function(cm) {var f = CodeMirror.commands.find; f && f(cm); sdir = "f";}, - "'?'": function(cm) { - var f = CodeMirror.commands.find; - if (f) { f(cm); CodeMirror.commands.findPrev(cm); sdir = "r"; } - }, - "N": function(cm) { - var fn = CodeMirror.commands.findNext; - if (fn) sdir != "r" ? fn(cm) : CodeMirror.commands.findPrev(cm); - }, - "Shift-N": function(cm) { - var fn = CodeMirror.commands.findNext; - if (fn) sdir != "r" ? CodeMirror.commands.findPrev(cm) : fn.findNext(cm); - }, - "Shift-G": function(cm) { - count == "" ? cm.setCursor(cm.lineCount()) : cm.setCursor(parseInt(count)-1); - popCount(); - CodeMirror.commands.goLineStart(cm); - }, - "'$'": function (cm) { - countTimes("goLineEnd")(cm); - if (cm.getCursor().ch) CodeMirror.commands.goColumnLeft(cm); - }, - nofallthrough: true, style: "fat-cursor" - }; - - // standard mode switching - iterList(["d", "t", "T", "f", "F", "c", "r"], - function (ch) { - CodeMirror.keyMap.vim[toCombo(ch)] = function (cm) { - cm.setOption("keyMap", "vim-prefix-" + ch); - emptyBuffer(); - }; - }); - - function addCountBindings(keyMap) { - // Add bindings for number keys - keyMap["0"] = function(cm) { - count.length > 0 ? pushCountDigit("0")(cm) : CodeMirror.commands.goLineStart(cm); - }; - for (var i = 1; i < 10; ++i) keyMap[i] = pushCountDigit(i); - } - addCountBindings(CodeMirror.keyMap.vim); - - // main num keymap - // Add bindings that are influenced by number keys - iterObj({ - "H": "goColumnLeft", "L": "goColumnRight", "J": "goLineDown", - "K": "goLineUp", "Left": "goColumnLeft", "Right": "goColumnRight", - "Down": "goLineDown", "Up": "goLineUp", "Backspace": "goCharLeft", - "Space": "goCharRight", - "B": function(cm) {moveToWord(cm, word, -1, "end");}, - "E": function(cm) {moveToWord(cm, word, 1, "end");}, - "W": function(cm) {moveToWord(cm, word, 1, "start");}, - "Shift-B": function(cm) {moveToWord(cm, bigWord, -1, "end");}, - "Shift-E": function(cm) {moveToWord(cm, bigWord, 1, "end");}, - "Shift-W": function(cm) {moveToWord(cm, bigWord, 1, "start");}, - "X": function(cm) {CodeMirror.commands.delCharRight(cm);}, - "P": function(cm) { - var cur = cm.getCursor().line; - if (buf!= "") { - CodeMirror.commands.goLineEnd(cm); - cm.replaceSelection(buf, "end"); - } - cm.setCursor(cur+1); - }, - "Shift-X": function(cm) {CodeMirror.commands.delCharLeft(cm);}, - "Shift-J": function(cm) {joinLineNext(cm);}, - "Shift-P": function(cm) { - var cur = cm.getCursor().line; - if (buf!= "") { - CodeMirror.commands.goLineUp(cm); - CodeMirror.commands.goLineEnd(cm); - cm.replaceSelection(buf, "end"); - } - cm.setCursor(cur+1); - }, - "'~'": function(cm) { - var cur = cm.getCursor(), cHar = cm.getRange({line: cur.line, ch: cur.ch}, {line: cur.line, ch: cur.ch+1}); - cHar = cHar != cHar.toLowerCase() ? cHar.toLowerCase() : cHar.toUpperCase(); - cm.replaceRange(cHar, {line: cur.line, ch: cur.ch}, {line: cur.line, ch: cur.ch+1}); - cm.setCursor(cur.line, cur.ch+1); - }, - "Ctrl-B": function(cm) {CodeMirror.commands.goPageUp(cm);}, - "Ctrl-F": function(cm) {CodeMirror.commands.goPageDown(cm);}, - "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown", - "U": "undo", "Ctrl-R": "redo" - }, function(key, cmd) { map[key] = countTimes(cmd); }); - - // empty key maps - iterList([ - "vim-prefix-d'", - "vim-prefix-y'", - "vim-prefix-df", - "vim-prefix-dF", - "vim-prefix-dt", - "vim-prefix-dT", - "vim-prefix-c", - "vim-prefix-cf", - "vim-prefix-cF", - "vim-prefix-ct", - "vim-prefix-cT", - "vim-prefix-", - "vim-prefix-f", - "vim-prefix-F", - "vim-prefix-t", - "vim-prefix-T", - "vim-prefix-r", - "vim-prefix-m" - ], - function (prefix) { - CodeMirror.keyMap[prefix] = { - auto: "vim", - nofallthrough: true - }; - }); - - CodeMirror.keyMap["vim-prefix-g"] = { - "E": countTimes(function(cm) { moveToWord(cm, word, -1, "start");}), - "Shift-E": countTimes(function(cm) { moveToWord(cm, bigWord, -1, "start");}), - "G": function (cm) { cm.setCursor({line: 0, ch: cm.getCursor().ch});}, - auto: "vim", nofallthrough: true, style: "fat-cursor" - }; - - CodeMirror.keyMap["vim-prefix-d"] = { - "D": countTimes(function(cm) { - pushInBuffer("\n"+cm.getLine(cm.getCursor().line)); - cm.removeLine(cm.getCursor().line); - }), - "'": function(cm) { - cm.setOption("keyMap", "vim-prefix-d'"); - emptyBuffer(); - }, - "E": countTimes("delWordRight"), - "B": countTimes("delWordLeft"), - auto: "vim", nofallthrough: true, style: "fat-cursor" - }; - // FIXME - does not work for bindings like "d3e" - addCountBindings(CodeMirror.keyMap["vim-prefix-d"]); - - CodeMirror.keyMap["vim-prefix-c"] = { - "E": function (cm) { - countTimes("delWordRight")(cm); - enterInsertMode(cm); - }, - "B": function (cm) { - countTimes("delWordLeft")(cm); - enterInsertMode(cm); - }, - "C": function (cm) { - iterTimes(function (i, last) { - CodeMirror.commands.deleteLine(cm); - if (i) { - CodeMirror.commands.delCharRight(cm); - if (last) CodeMirror.commands.deleteLine(cm); - } - }); - enterInsertMode(cm); - }, - auto: "vim", nofallthrough: true, style: "fat-cursor" - }; - - iterList(["vim-prefix-d", "vim-prefix-c", "vim-prefix-"], function (prefix) { - iterList(["f", "F", "T", "t"], - function (ch) { - CodeMirror.keyMap[prefix][toCombo(ch)] = function (cm) { - cm.setOption("keyMap", prefix + ch); - emptyBuffer(); - }; - }); - }); - - var MOTION_OPTIONS = { - "t": {inclusive: false, forward: true}, - "f": {inclusive: true, forward: true}, - "T": {inclusive: false, forward: false}, - "F": {inclusive: true, forward: false} - }; - - function setupPrefixBindingForKey(m) { - CodeMirror.keyMap["vim-prefix-m"][m] = function(cm) { - mark[m] = cm.getCursor().line; - }; - CodeMirror.keyMap["vim-prefix-d'"][m] = function(cm) { - delTillMark(cm,m); - }; - CodeMirror.keyMap["vim-prefix-y'"][m] = function(cm) { - yankTillMark(cm,m); - }; - CodeMirror.keyMap["vim-prefix-r"][m] = function (cm) { - var cur = cm.getCursor(); - cm.replaceRange(toLetter(m), - {line: cur.line, ch: cur.ch}, - {line: cur.line, ch: cur.ch + 1}); - CodeMirror.commands.goColumnLeft(cm); - }; - // all commands, related to motions till char in line - iterObj(MOTION_OPTIONS, function (ch, options) { - CodeMirror.keyMap["vim-prefix-" + ch][m] = function(cm) { - moveTillChar(cm, m, options); - }; - CodeMirror.keyMap["vim-prefix-d" + ch][m] = function(cm) { - delTillChar(cm, m, options); - }; - CodeMirror.keyMap["vim-prefix-c" + ch][m] = function(cm) { - delTillChar(cm, m, options); - enterInsertMode(cm); - }; - }); - }; - for (var i = 65; i < 65 + 26; i++) { // uppercase alphabet char codes - var ch = String.fromCharCode(i); - setupPrefixBindingForKey(toCombo(ch)); - setupPrefixBindingForKey(toCombo(ch.toLowerCase())); - } - iterList(SPECIAL_SYMBOLS, function (ch) { - setupPrefixBindingForKey(toCombo(ch)); - }); - setupPrefixBindingForKey("Space"); - - CodeMirror.keyMap["vim-prefix-y"] = { - "Y": countTimes(function(cm) { pushInBuffer("\n"+cm.getLine(cm.getCursor().line+yank)); yank++; }), - "'": function(cm) {cm.setOption("keyMap", "vim-prefix-y'"); emptyBuffer();}, - auto: "vim", nofallthrough: true, style: "fat-cursor" - }; - - CodeMirror.keyMap["vim-insert"] = { - // TODO: override navigation keys so that Esc will cancel automatic indentation from o, O, i_ - "Esc": function(cm) { - cm.setCursor(cm.getCursor().line, cm.getCursor().ch-1, true); - cm.setOption("keyMap", "vim"); - }, - "Ctrl-N": "autocomplete", - "Ctrl-P": "autocomplete", - fallthrough: ["default"] - }; -})(); diff --git a/CodeMirror-2.25/lib/util/closetag.js b/CodeMirror-2.25/lib/util/closetag.js deleted file mode 100644 index 819d259..0000000 --- a/CodeMirror-2.25/lib/util/closetag.js +++ /dev/null @@ -1,146 +0,0 @@ -/** - * Tag-closer extension for CodeMirror. - * - * This extension adds a "closeTag" utility function that can be used with key bindings to - * insert a matching end tag after the ">" character of a start tag has been typed. It can - * also complete " - * Contributed under the same license terms as CodeMirror. - */ -(function() { - /** Option that allows tag closing behavior to be toggled. Default is true. */ - CodeMirror.defaults['closeTagEnabled'] = true; - - /** Array of tag names to add indentation after the start tag for. Default is the list of block-level html tags. */ - CodeMirror.defaults['closeTagIndent'] = ['applet', 'blockquote', 'body', 'button', 'div', 'dl', 'fieldset', 'form', 'frameset', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'html', 'iframe', 'layer', 'legend', 'object', 'ol', 'p', 'select', 'table', 'ul']; - - /** - * Call during key processing to close tags. Handles the key event if the tag is closed, otherwise throws CodeMirror.Pass. - * - cm: The editor instance. - * - ch: The character being processed. - * - indent: Optional. Omit or pass true to use the default indentation tag list defined in the 'closeTagIndent' option. - * Pass false to disable indentation. Pass an array to override the default list of tag names. - */ - CodeMirror.defineExtension("closeTag", function(cm, ch, indent) { - if (!cm.getOption('closeTagEnabled')) { - throw CodeMirror.Pass; - } - - var mode = cm.getOption('mode'); - - if (mode == 'text/html') { - - /* - * Relevant structure of token: - * - * htmlmixed - * className - * state - * htmlState - * type - * context - * tagName - * mode - * - * xml - * className - * state - * tagName - * type - */ - - var pos = cm.getCursor(); - var tok = cm.getTokenAt(pos); - var state = tok.state; - - if (state.mode && state.mode != 'html') { - throw CodeMirror.Pass; // With htmlmixed, we only care about the html sub-mode. - } - - if (ch == '>') { - var type = state.htmlState ? state.htmlState.type : state.type; // htmlmixed : xml - - if (tok.className == 'tag' && type == 'closeTag') { - throw CodeMirror.Pass; // Don't process the '>' at the end of an end-tag. - } - - cm.replaceSelection('>'); // Mode state won't update until we finish the tag. - pos = {line: pos.line, ch: pos.ch + 1}; - cm.setCursor(pos); - - tok = cm.getTokenAt(cm.getCursor()); - state = tok.state; - type = state.htmlState ? state.htmlState.type : state.type; // htmlmixed : xml - - if (tok.className == 'tag' && type != 'selfcloseTag') { - var tagName = state.htmlState ? state.htmlState.context.tagName : state.tagName; // htmlmixed : xml - if (tagName.length > 0) { - insertEndTag(cm, indent, pos, tagName); - } - return; - } - - // Undo the '>' insert and allow cm to handle the key instead. - cm.setSelection({line: pos.line, ch: pos.ch - 1}, pos); - cm.replaceSelection(""); - - } else if (ch == '/') { - if (tok.className == 'tag' && tok.string == '<') { - var tagName = state.htmlState ? (state.htmlState.context ? state.htmlState.context.tagName : '') : state.context.tagName; // htmlmixed : xml # extra htmlmized check is for ' 0) { - completeEndTag(cm, pos, tagName); - return; - } - } - } - - } - - throw CodeMirror.Pass; // Bubble if not handled - }); - - function insertEndTag(cm, indent, pos, tagName) { - if (shouldIndent(cm, indent, tagName)) { - cm.replaceSelection('\n\n', 'end'); - cm.indentLine(pos.line + 1); - cm.indentLine(pos.line + 2); - cm.setCursor({line: pos.line + 1, ch: cm.getLine(pos.line + 1).length}); - } else { - cm.replaceSelection(''); - cm.setCursor(pos); - } - } - - function shouldIndent(cm, indent, tagName) { - if (typeof indent == 'undefined' || indent == null || indent == true) { - indent = cm.getOption('closeTagIndent'); - } - if (!indent) { - indent = []; - } - return indexOf(indent, tagName.toLowerCase()) != -1; - } - - // C&P from codemirror.js...would be nice if this were visible to utilities. - function indexOf(collection, elt) { - if (collection.indexOf) return collection.indexOf(elt); - for (var i = 0, e = collection.length; i < e; ++i) - if (collection[i] == elt) return i; - return -1; - } - - function completeEndTag(cm, pos, tagName) { - cm.replaceSelection('/' + tagName + '>'); - cm.setCursor({line: pos.line, ch: pos.ch + tagName.length + 2 }); - } - -})(); diff --git a/CodeMirror-2.25/lib/util/dialog.css b/CodeMirror-2.25/lib/util/dialog.css deleted file mode 100644 index 4cb467e..0000000 --- a/CodeMirror-2.25/lib/util/dialog.css +++ /dev/null @@ -1,23 +0,0 @@ -.CodeMirror-dialog { - position: relative; -} - -.CodeMirror-dialog > div { - position: absolute; - top: 0; left: 0; right: 0; - background: white; - border-bottom: 1px solid #eee; - z-index: 15; - padding: .1em .8em; - overflow: hidden; - color: #333; -} - -.CodeMirror-dialog input { - border: none; - outline: none; - background: transparent; - width: 20em; - color: inherit; - font-family: monospace; -} diff --git a/CodeMirror-2.25/lib/util/dialog.js b/CodeMirror-2.25/lib/util/dialog.js deleted file mode 100644 index 8950bf0..0000000 --- a/CodeMirror-2.25/lib/util/dialog.js +++ /dev/null @@ -1,63 +0,0 @@ -// Open simple dialogs on top of an editor. Relies on dialog.css. - -(function() { - function dialogDiv(cm, template) { - var wrap = cm.getWrapperElement(); - var dialog = wrap.insertBefore(document.createElement("div"), wrap.firstChild); - dialog.className = "CodeMirror-dialog"; - dialog.innerHTML = '
' + template + '
'; - return dialog; - } - - CodeMirror.defineExtension("openDialog", function(template, callback) { - var dialog = dialogDiv(this, template); - var closed = false, me = this; - function close() { - if (closed) return; - closed = true; - dialog.parentNode.removeChild(dialog); - } - var inp = dialog.getElementsByTagName("input")[0]; - if (inp) { - CodeMirror.connect(inp, "keydown", function(e) { - if (e.keyCode == 13 || e.keyCode == 27) { - CodeMirror.e_stop(e); - close(); - me.focus(); - if (e.keyCode == 13) callback(inp.value); - } - }); - inp.focus(); - CodeMirror.connect(inp, "blur", close); - } - return close; - }); - - CodeMirror.defineExtension("openConfirm", function(template, callbacks) { - var dialog = dialogDiv(this, template); - var buttons = dialog.getElementsByTagName("button"); - var closed = false, me = this, blurring = 1; - function close() { - if (closed) return; - closed = true; - dialog.parentNode.removeChild(dialog); - me.focus(); - } - buttons[0].focus(); - for (var i = 0; i < buttons.length; ++i) { - var b = buttons[i]; - (function(callback) { - CodeMirror.connect(b, "click", function(e) { - CodeMirror.e_preventDefault(e); - close(); - if (callback) callback(me); - }); - })(callbacks[i]); - CodeMirror.connect(b, "blur", function() { - --blurring; - setTimeout(function() { if (blurring <= 0) close(); }, 200); - }); - CodeMirror.connect(b, "focus", function() { ++blurring; }); - } - }); -})(); \ No newline at end of file diff --git a/CodeMirror-2.25/lib/util/formatting.js b/CodeMirror-2.25/lib/util/formatting.js deleted file mode 100644 index e189119..0000000 --- a/CodeMirror-2.25/lib/util/formatting.js +++ /dev/null @@ -1,294 +0,0 @@ -// ============== Formatting extensions ============================ -// A common storage for all mode-specific formatting features -if (!CodeMirror.modeExtensions) CodeMirror.modeExtensions = {}; - -// Returns the extension of the editor's current mode -CodeMirror.defineExtension("getModeExt", function () { - var mname = CodeMirror.resolveMode(this.getOption("mode")).name; - var ext = CodeMirror.modeExtensions[mname]; - if (!ext) throw new Error("No extensions found for mode " + mname); - return ext; -}); - -// If the current mode is 'htmlmixed', returns the extension of a mode located at -// the specified position (can be htmlmixed, css or javascript). Otherwise, simply -// returns the extension of the editor's current mode. -CodeMirror.defineExtension("getModeExtAtPos", function (pos) { - var token = this.getTokenAt(pos); - if (token && token.state && token.state.mode) - return CodeMirror.modeExtensions[token.state.mode == "html" ? "htmlmixed" : token.state.mode]; - else - return this.getModeExt(); -}); - -// Comment/uncomment the specified range -CodeMirror.defineExtension("commentRange", function (isComment, from, to) { - var curMode = this.getModeExtAtPos(this.getCursor()); - if (isComment) { // Comment range - var commentedText = this.getRange(from, to); - this.replaceRange(curMode.commentStart + this.getRange(from, to) + curMode.commentEnd - , from, to); - if (from.line == to.line && from.ch == to.ch) { // An empty comment inserted - put cursor inside - this.setCursor(from.line, from.ch + curMode.commentStart.length); - } - } - else { // Uncomment range - var selText = this.getRange(from, to); - var startIndex = selText.indexOf(curMode.commentStart); - var endIndex = selText.lastIndexOf(curMode.commentEnd); - if (startIndex > -1 && endIndex > -1 && endIndex > startIndex) { - // Take string till comment start - selText = selText.substr(0, startIndex) - // From comment start till comment end - + selText.substring(startIndex + curMode.commentStart.length, endIndex) - // From comment end till string end - + selText.substr(endIndex + curMode.commentEnd.length); - } - this.replaceRange(selText, from, to); - } -}); - -// Applies automatic mode-aware indentation to the specified range -CodeMirror.defineExtension("autoIndentRange", function (from, to) { - var cmInstance = this; - this.operation(function () { - for (var i = from.line; i <= to.line; i++) { - cmInstance.indentLine(i, "smart"); - } - }); -}); - -// Applies automatic formatting to the specified range -CodeMirror.defineExtension("autoFormatRange", function (from, to) { - var absStart = this.indexFromPos(from); - var absEnd = this.indexFromPos(to); - // Insert additional line breaks where necessary according to the - // mode's syntax - var res = this.getModeExt().autoFormatLineBreaks(this.getValue(), absStart, absEnd); - var cmInstance = this; - - // Replace and auto-indent the range - this.operation(function () { - cmInstance.replaceRange(res, from, to); - var startLine = cmInstance.posFromIndex(absStart).line; - var endLine = cmInstance.posFromIndex(absStart + res.length).line; - for (var i = startLine; i <= endLine; i++) { - cmInstance.indentLine(i, "smart"); - } - }); -}); - -// Define extensions for a few modes - -CodeMirror.modeExtensions["css"] = { - commentStart: "/*", - commentEnd: "*/", - wordWrapChars: [";", "\\{", "\\}"], - autoFormatLineBreaks: function (text) { - return text.replace(new RegExp("(;|\\{|\\})([^\r\n])", "g"), "$1\n$2"); - } -}; - -CodeMirror.modeExtensions["javascript"] = { - commentStart: "/*", - commentEnd: "*/", - wordWrapChars: [";", "\\{", "\\}"], - - getNonBreakableBlocks: function (text) { - var nonBreakableRegexes = [ - new RegExp("for\\s*?\\(([\\s\\S]*?)\\)"), - new RegExp("'([\\s\\S]*?)('|$)"), - new RegExp("\"([\\s\\S]*?)(\"|$)"), - new RegExp("//.*([\r\n]|$)") - ]; - var nonBreakableBlocks = new Array(); - for (var i = 0; i < nonBreakableRegexes.length; i++) { - var curPos = 0; - while (curPos < text.length) { - var m = text.substr(curPos).match(nonBreakableRegexes[i]); - if (m != null) { - nonBreakableBlocks.push({ - start: curPos + m.index, - end: curPos + m.index + m[0].length - }); - curPos += m.index + Math.max(1, m[0].length); - } - else { // No more matches - break; - } - } - } - nonBreakableBlocks.sort(function (a, b) { - return a.start - b.start; - }); - - return nonBreakableBlocks; - }, - - autoFormatLineBreaks: function (text) { - var curPos = 0; - var reLinesSplitter = new RegExp("(;|\\{|\\})([^\r\n])", "g"); - var nonBreakableBlocks = this.getNonBreakableBlocks(text); - if (nonBreakableBlocks != null) { - var res = ""; - for (var i = 0; i < nonBreakableBlocks.length; i++) { - if (nonBreakableBlocks[i].start > curPos) { // Break lines till the block - res += text.substring(curPos, nonBreakableBlocks[i].start).replace(reLinesSplitter, "$1\n$2"); - curPos = nonBreakableBlocks[i].start; - } - if (nonBreakableBlocks[i].start <= curPos - && nonBreakableBlocks[i].end >= curPos) { // Skip non-breakable block - res += text.substring(curPos, nonBreakableBlocks[i].end); - curPos = nonBreakableBlocks[i].end; - } - } - if (curPos < text.length - 1) { - res += text.substr(curPos).replace(reLinesSplitter, "$1\n$2"); - } - return res; - } - else { - return text.replace(reLinesSplitter, "$1\n$2"); - } - } -}; - -CodeMirror.modeExtensions["xml"] = { - commentStart: "", - wordWrapChars: [">"], - - autoFormatLineBreaks: function (text) { - var lines = text.split("\n"); - var reProcessedPortion = new RegExp("(^\\s*?<|^[^<]*?)(.+)(>\\s*?$|[^>]*?$)"); - var reOpenBrackets = new RegExp("<", "g"); - var reCloseBrackets = new RegExp("(>)([^\r\n])", "g"); - for (var i = 0; i < lines.length; i++) { - var mToProcess = lines[i].match(reProcessedPortion); - if (mToProcess != null && mToProcess.length > 3) { // The line starts with whitespaces and ends with whitespaces - lines[i] = mToProcess[1] - + mToProcess[2].replace(reOpenBrackets, "\n$&").replace(reCloseBrackets, "$1\n$2") - + mToProcess[3]; - continue; - } - } - - return lines.join("\n"); - } -}; - -CodeMirror.modeExtensions["htmlmixed"] = { - commentStart: "", - wordWrapChars: [">", ";", "\\{", "\\}"], - - getModeInfos: function (text, absPos) { - var modeInfos = new Array(); - modeInfos[0] = - { - pos: 0, - modeExt: CodeMirror.modeExtensions["xml"], - modeName: "xml" - }; - - var modeMatchers = new Array(); - modeMatchers[0] = - { - regex: new RegExp("]*>([\\s\\S]*?)(]*>|$)", "i"), - modeExt: CodeMirror.modeExtensions["css"], - modeName: "css" - }; - modeMatchers[1] = - { - regex: new RegExp("]*>([\\s\\S]*?)(]*>|$)", "i"), - modeExt: CodeMirror.modeExtensions["javascript"], - modeName: "javascript" - }; - - var lastCharPos = (typeof (absPos) !== "undefined" ? absPos : text.length - 1); - // Detect modes for the entire text - for (var i = 0; i < modeMatchers.length; i++) { - var curPos = 0; - while (curPos <= lastCharPos) { - var m = text.substr(curPos).match(modeMatchers[i].regex); - if (m != null) { - if (m.length > 1 && m[1].length > 0) { - // Push block begin pos - var blockBegin = curPos + m.index + m[0].indexOf(m[1]); - modeInfos.push( - { - pos: blockBegin, - modeExt: modeMatchers[i].modeExt, - modeName: modeMatchers[i].modeName - }); - // Push block end pos - modeInfos.push( - { - pos: blockBegin + m[1].length, - modeExt: modeInfos[0].modeExt, - modeName: modeInfos[0].modeName - }); - curPos += m.index + m[0].length; - continue; - } - else { - curPos += m.index + Math.max(m[0].length, 1); - } - } - else { // No more matches - break; - } - } - } - // Sort mode infos - modeInfos.sort(function sortModeInfo(a, b) { - return a.pos - b.pos; - }); - - return modeInfos; - }, - - autoFormatLineBreaks: function (text, startPos, endPos) { - var modeInfos = this.getModeInfos(text); - var reBlockStartsWithNewline = new RegExp("^\\s*?\n"); - var reBlockEndsWithNewline = new RegExp("\n\\s*?$"); - var res = ""; - // Use modes info to break lines correspondingly - if (modeInfos.length > 1) { // Deal with multi-mode text - for (var i = 1; i <= modeInfos.length; i++) { - var selStart = modeInfos[i - 1].pos; - var selEnd = (i < modeInfos.length ? modeInfos[i].pos : endPos); - - if (selStart >= endPos) { // The block starts later than the needed fragment - break; - } - if (selStart < startPos) { - if (selEnd <= startPos) { // The block starts earlier than the needed fragment - continue; - } - selStart = startPos; - } - if (selEnd > endPos) { - selEnd = endPos; - } - var textPortion = text.substring(selStart, selEnd); - if (modeInfos[i - 1].modeName != "xml") { // Starting a CSS or JavaScript block - if (!reBlockStartsWithNewline.test(textPortion) - && selStart > 0) { // The block does not start with a line break - textPortion = "\n" + textPortion; - } - if (!reBlockEndsWithNewline.test(textPortion) - && selEnd < text.length - 1) { // The block does not end with a line break - textPortion += "\n"; - } - } - res += modeInfos[i - 1].modeExt.autoFormatLineBreaks(textPortion); - } - } - else { // Single-mode text - res = modeInfos[0].modeExt.autoFormatLineBreaks(text.substring(startPos, endPos)); - } - - return res; - } -}; diff --git a/CodeMirror-2.25/lib/util/javascript-hint.js b/CodeMirror-2.25/lib/util/javascript-hint.js deleted file mode 100644 index 2117e5a..0000000 --- a/CodeMirror-2.25/lib/util/javascript-hint.js +++ /dev/null @@ -1,134 +0,0 @@ -(function () { - function forEach(arr, f) { - for (var i = 0, e = arr.length; i < e; ++i) f(arr[i]); - } - - function arrayContains(arr, item) { - if (!Array.prototype.indexOf) { - var i = arr.length; - while (i--) { - if (arr[i] === item) { - return true; - } - } - return false; - } - return arr.indexOf(item) != -1; - } - - function scriptHint(editor, keywords, getToken) { - // Find the token at the cursor - var cur = editor.getCursor(), token = getToken(editor, cur), tprop = token; - // If it's not a 'word-style' token, ignore the token. - if (!/^[\w$_]*$/.test(token.string)) { - token = tprop = {start: cur.ch, end: cur.ch, string: "", state: token.state, - className: token.string == "." ? "property" : null}; - } - // If it is a property, find out what it is a property of. - while (tprop.className == "property") { - tprop = getToken(editor, {line: cur.line, ch: tprop.start}); - if (tprop.string != ".") return; - tprop = getToken(editor, {line: cur.line, ch: tprop.start}); - if (tprop.string == ')') { - var level = 1; - do { - tprop = getToken(editor, {line: cur.line, ch: tprop.start}); - switch (tprop.string) { - case ')': level++; break; - case '(': level--; break; - default: break; - } - } while (level > 0) - tprop = getToken(editor, {line: cur.line, ch: tprop.start}); - if (tprop.className == 'variable') - tprop.className = 'function'; - else return; // no clue - } - if (!context) var context = []; - context.push(tprop); - } - return {list: getCompletions(token, context, keywords), - from: {line: cur.line, ch: token.start}, - to: {line: cur.line, ch: token.end}}; - } - - CodeMirror.javascriptHint = function(editor) { - return scriptHint(editor, javascriptKeywords, - function (e, cur) {return e.getTokenAt(cur);}); - } - - function getCoffeeScriptToken(editor, cur) { - // This getToken, it is for coffeescript, imitates the behavior of - // getTokenAt method in javascript.js, that is, returning "property" - // type and treat "." as indepenent token. - var token = editor.getTokenAt(cur); - if (cur.ch == token.start + 1 && token.string.charAt(0) == '.') { - token.end = token.start; - token.string = '.'; - token.className = "property"; - } - else if (/^\.[\w$_]*$/.test(token.string)) { - token.className = "property"; - token.start++; - token.string = token.string.replace(/\./, ''); - } - return token; - } - - CodeMirror.coffeescriptHint = function(editor) { - return scriptHint(editor, coffeescriptKeywords, getCoffeeScriptToken); - } - - var stringProps = ("charAt charCodeAt indexOf lastIndexOf substring substr slice trim trimLeft trimRight " + - "toUpperCase toLowerCase split concat match replace search").split(" "); - var arrayProps = ("length concat join splice push pop shift unshift slice reverse sort indexOf " + - "lastIndexOf every some filter forEach map reduce reduceRight ").split(" "); - var funcProps = "prototype apply call bind".split(" "); - var javascriptKeywords = ("break case catch continue debugger default delete do else false finally for function " + - "if in instanceof new null return switch throw true try typeof var void while with").split(" "); - var coffeescriptKeywords = ("and break catch class continue delete do else extends false finally for " + - "if in instanceof isnt new no not null of off on or return switch then throw true try typeof until void while with yes").split(" "); - - function getCompletions(token, context, keywords) { - var found = [], start = token.string; - function maybeAdd(str) { - if (str.indexOf(start) == 0 && !arrayContains(found, str)) found.push(str); - } - function gatherCompletions(obj) { - if (typeof obj == "string") forEach(stringProps, maybeAdd); - else if (obj instanceof Array) forEach(arrayProps, maybeAdd); - else if (obj instanceof Function) forEach(funcProps, maybeAdd); - for (var name in obj) maybeAdd(name); - } - - if (context) { - // If this is a property, see if it belongs to some object we can - // find in the current environment. - var obj = context.pop(), base; - if (obj.className == "variable") - base = window[obj.string]; - else if (obj.className == "string") - base = ""; - else if (obj.className == "atom") - base = 1; - else if (obj.className == "function") { - if (window.jQuery != null && (obj.string == '$' || obj.string == 'jQuery') && - (typeof window.jQuery == 'function')) - base = window.jQuery(); - else if (window._ != null && (obj.string == '_') && (typeof window._ == 'function')) - base = window._(); - } - while (base != null && context.length) - base = base[context.pop().string]; - if (base != null) gatherCompletions(base); - } - else { - // If not, just look in the window object and any local scope - // (reading into JS mode internals to get at the local variables) - for (var v = token.state.localVars; v; v = v.next) maybeAdd(v.name); - gatherCompletions(window); - forEach(keywords, maybeAdd); - } - return found; - } -})(); diff --git a/CodeMirror-2.25/lib/util/loadmode.js b/CodeMirror-2.25/lib/util/loadmode.js deleted file mode 100644 index 48d5a7a..0000000 --- a/CodeMirror-2.25/lib/util/loadmode.js +++ /dev/null @@ -1,51 +0,0 @@ -(function() { - if (!CodeMirror.modeURL) CodeMirror.modeURL = "../mode/%N/%N.js"; - - var loading = {}; - function splitCallback(cont, n) { - var countDown = n; - return function() { if (--countDown == 0) cont(); } - } - function ensureDeps(mode, cont) { - var deps = CodeMirror.modes[mode].dependencies; - if (!deps) return cont(); - var missing = []; - for (var i = 0; i < deps.length; ++i) { - if (!CodeMirror.modes.hasOwnProperty(deps[i])) - missing.push(deps[i]); - } - if (!missing.length) return cont(); - var split = splitCallback(cont, missing.length); - for (var i = 0; i < missing.length; ++i) - CodeMirror.requireMode(missing[i], split); - } - - CodeMirror.requireMode = function(mode, cont) { - if (typeof mode != "string") mode = mode.name; - if (CodeMirror.modes.hasOwnProperty(mode)) return ensureDeps(mode, cont); - if (loading.hasOwnProperty(mode)) return loading[mode].push(cont); - - var script = document.createElement("script"); - script.src = CodeMirror.modeURL.replace(/%N/g, mode); - var others = document.getElementsByTagName("script")[0]; - others.parentNode.insertBefore(script, others); - var list = loading[mode] = [cont]; - var count = 0, poll = setInterval(function() { - if (++count > 100) return clearInterval(poll); - if (CodeMirror.modes.hasOwnProperty(mode)) { - clearInterval(poll); - loading[mode] = null; - ensureDeps(mode, function() { - for (var i = 0; i < list.length; ++i) list[i](); - }); - } - }, 200); - }; - - CodeMirror.autoLoadMode = function(instance, mode) { - if (!CodeMirror.modes.hasOwnProperty(mode)) - CodeMirror.requireMode(mode, function() { - instance.setOption("mode", instance.getOption("mode")); - }); - }; -}()); diff --git a/CodeMirror-2.25/lib/util/overlay.js b/CodeMirror-2.25/lib/util/overlay.js deleted file mode 100644 index 6471a5e..0000000 --- a/CodeMirror-2.25/lib/util/overlay.js +++ /dev/null @@ -1,51 +0,0 @@ -// Utility function that allows modes to be combined. The mode given -// as the base argument takes care of most of the normal mode -// functionality, but a second (typically simple) mode is used, which -// can override the style of text. Both modes get to parse all of the -// text, but when both assign a non-null style to a piece of code, the -// overlay wins, unless the combine argument was true, in which case -// the styles are combined. - -CodeMirror.overlayParser = function(base, overlay, combine) { - return { - startState: function() { - return { - base: CodeMirror.startState(base), - overlay: CodeMirror.startState(overlay), - basePos: 0, baseCur: null, - overlayPos: 0, overlayCur: null - }; - }, - copyState: function(state) { - return { - base: CodeMirror.copyState(base, state.base), - overlay: CodeMirror.copyState(overlay, state.overlay), - basePos: state.basePos, baseCur: null, - overlayPos: state.overlayPos, overlayCur: null - }; - }, - - token: function(stream, state) { - if (stream.start == state.basePos) { - state.baseCur = base.token(stream, state.base); - state.basePos = stream.pos; - } - if (stream.start == state.overlayPos) { - stream.pos = stream.start; - state.overlayCur = overlay.token(stream, state.overlay); - state.overlayPos = stream.pos; - } - stream.pos = Math.min(state.basePos, state.overlayPos); - if (stream.eol()) state.basePos = state.overlayPos = 0; - - if (state.overlayCur == null) return state.baseCur; - if (state.baseCur != null && combine) return state.baseCur + " " + state.overlayCur; - else return state.overlayCur; - }, - - indent: base.indent && function(state, textAfter) { - return base.indent(state.base, textAfter); - }, - electricChars: base.electricChars - }; -}; diff --git a/CodeMirror-2.25/lib/util/runmode.js b/CodeMirror-2.25/lib/util/runmode.js deleted file mode 100644 index fc58d85..0000000 --- a/CodeMirror-2.25/lib/util/runmode.js +++ /dev/null @@ -1,49 +0,0 @@ -CodeMirror.runMode = function(string, modespec, callback, options) { - var mode = CodeMirror.getMode(CodeMirror.defaults, modespec); - var isNode = callback.nodeType == 1; - var tabSize = (options && options.tabSize) || CodeMirror.defaults.tabSize; - if (isNode) { - var node = callback, accum = [], col = 0; - callback = function(text, style) { - if (text == "\n") { - accum.push("
"); - col = 0; - return; - } - var escaped = ""; - // HTML-escape and replace tabs - for (var pos = 0;;) { - var idx = text.indexOf("\t", pos); - if (idx == -1) { - escaped += CodeMirror.htmlEscape(text.slice(pos)); - col += text.length - pos; - break; - } else { - col += idx - pos; - escaped += CodeMirror.htmlEscape(text.slice(pos, idx)); - var size = tabSize - col % tabSize; - col += size; - for (var i = 0; i < size; ++i) escaped += " "; - pos = idx + 1; - } - } - - if (style) - accum.push("" + escaped + ""); - else - accum.push(escaped); - } - } - var lines = CodeMirror.splitLines(string), state = CodeMirror.startState(mode); - for (var i = 0, e = lines.length; i < e; ++i) { - if (i) callback("\n"); - var stream = new CodeMirror.StringStream(lines[i]); - while (!stream.eol()) { - var style = mode.token(stream, state); - callback(stream.current(), style, i, stream.start); - stream.start = stream.pos; - } - } - if (isNode) - node.innerHTML = accum.join(""); -}; diff --git a/CodeMirror-2.25/lib/util/search.js b/CodeMirror-2.25/lib/util/search.js deleted file mode 100644 index f194c63..0000000 --- a/CodeMirror-2.25/lib/util/search.js +++ /dev/null @@ -1,114 +0,0 @@ -// Define search commands. Depends on dialog.js or another -// implementation of the openDialog method. - -// Replace works a little oddly -- it will do the replace on the next -// Ctrl-G (or whatever is bound to findNext) press. You prevent a -// replace by making sure the match is no longer selected when hitting -// Ctrl-G. - -(function() { - function SearchState() { - this.posFrom = this.posTo = this.query = null; - this.marked = []; - } - function getSearchState(cm) { - return cm._searchState || (cm._searchState = new SearchState()); - } - function dialog(cm, text, shortText, f) { - if (cm.openDialog) cm.openDialog(text, f); - else f(prompt(shortText, "")); - } - function confirmDialog(cm, text, shortText, fs) { - if (cm.openConfirm) cm.openConfirm(text, fs); - else if (confirm(shortText)) fs[0](); - } - function parseQuery(query) { - var isRE = query.match(/^\/(.*)\/$/); - return isRE ? new RegExp(isRE[1]) : query; - } - var queryDialog = - 'Search: (Use /re/ syntax for regexp search)'; - function doSearch(cm, rev) { - var state = getSearchState(cm); - if (state.query) return findNext(cm, rev); - dialog(cm, queryDialog, "Search for:", function(query) { - cm.operation(function() { - if (!query || state.query) return; - state.query = parseQuery(query); - if (cm.lineCount() < 2000) { // This is too expensive on big documents. - for (var cursor = cm.getSearchCursor(query); cursor.findNext();) - state.marked.push(cm.markText(cursor.from(), cursor.to(), "CodeMirror-searching")); - } - state.posFrom = state.posTo = cm.getCursor(); - findNext(cm, rev); - }); - }); - } - function findNext(cm, rev) {cm.operation(function() { - var state = getSearchState(cm); - var cursor = cm.getSearchCursor(state.query, rev ? state.posFrom : state.posTo); - if (!cursor.find(rev)) { - cursor = cm.getSearchCursor(state.query, rev ? {line: cm.lineCount() - 1} : {line: 0, ch: 0}); - if (!cursor.find(rev)) return; - } - cm.setSelection(cursor.from(), cursor.to()); - state.posFrom = cursor.from(); state.posTo = cursor.to(); - })} - function clearSearch(cm) {cm.operation(function() { - var state = getSearchState(cm); - if (!state.query) return; - state.query = null; - for (var i = 0; i < state.marked.length; ++i) state.marked[i].clear(); - state.marked.length = 0; - })} - - var replaceQueryDialog = - 'Replace: (Use /re/ syntax for regexp search)'; - var replacementQueryDialog = 'With: '; - var doReplaceConfirm = "Replace? "; - function replace(cm, all) { - dialog(cm, replaceQueryDialog, "Replace:", function(query) { - if (!query) return; - query = parseQuery(query); - dialog(cm, replacementQueryDialog, "Replace with:", function(text) { - if (all) { - cm.compoundChange(function() { cm.operation(function() { - for (var cursor = cm.getSearchCursor(query); cursor.findNext();) { - if (typeof query != "string") { - var match = cm.getRange(cursor.from(), cursor.to()).match(query); - cursor.replace(text.replace(/\$(\d)/, function(w, i) {return match[i];})); - } else cursor.replace(text); - } - })}); - } else { - clearSearch(cm); - var cursor = cm.getSearchCursor(query, cm.getCursor()); - function advance() { - var start = cursor.from(), match; - if (!(match = cursor.findNext())) { - cursor = cm.getSearchCursor(query); - if (!(match = cursor.findNext()) || - (cursor.from().line == start.line && cursor.from().ch == start.ch)) return; - } - cm.setSelection(cursor.from(), cursor.to()); - confirmDialog(cm, doReplaceConfirm, "Replace?", - [function() {doReplace(match);}, advance]); - } - function doReplace(match) { - cursor.replace(typeof query == "string" ? text : - text.replace(/\$(\d)/, function(w, i) {return match[i];})); - advance(); - } - advance(); - } - }); - }); - } - - CodeMirror.commands.find = function(cm) {clearSearch(cm); doSearch(cm);}; - CodeMirror.commands.findNext = doSearch; - CodeMirror.commands.findPrev = function(cm) {doSearch(cm, true);}; - CodeMirror.commands.clearSearch = clearSearch; - CodeMirror.commands.replace = replace; - CodeMirror.commands.replaceAll = function(cm) {replace(cm, true);}; -})(); diff --git a/CodeMirror-2.25/lib/util/simple-hint.css b/CodeMirror-2.25/lib/util/simple-hint.css deleted file mode 100644 index 4387cb9..0000000 --- a/CodeMirror-2.25/lib/util/simple-hint.css +++ /dev/null @@ -1,16 +0,0 @@ -.CodeMirror-completions { - position: absolute; - z-index: 10; - overflow: hidden; - -webkit-box-shadow: 2px 3px 5px rgba(0,0,0,.2); - -moz-box-shadow: 2px 3px 5px rgba(0,0,0,.2); - box-shadow: 2px 3px 5px rgba(0,0,0,.2); -} -.CodeMirror-completions select { - background: #fafafa; - outline: none; - border: none; - padding: 0; - margin: 0; - font-family: monospace; -} diff --git a/CodeMirror-2.25/lib/util/simple-hint.js b/CodeMirror-2.25/lib/util/simple-hint.js deleted file mode 100644 index 7decd58..0000000 --- a/CodeMirror-2.25/lib/util/simple-hint.js +++ /dev/null @@ -1,72 +0,0 @@ -(function() { - CodeMirror.simpleHint = function(editor, getHints) { - // We want a single cursor position. - if (editor.somethingSelected()) return; - var result = getHints(editor); - if (!result || !result.list.length) return; - var completions = result.list; - function insert(str) { - editor.replaceRange(str, result.from, result.to); - } - // When there is only one completion, use it directly. - if (completions.length == 1) {insert(completions[0]); return true;} - - // Build the select widget - var complete = document.createElement("div"); - complete.className = "CodeMirror-completions"; - var sel = complete.appendChild(document.createElement("select")); - // Opera doesn't move the selection when pressing up/down in a - // multi-select, but it does properly support the size property on - // single-selects, so no multi-select is necessary. - if (!window.opera) sel.multiple = true; - for (var i = 0; i < completions.length; ++i) { - var opt = sel.appendChild(document.createElement("option")); - opt.appendChild(document.createTextNode(completions[i])); - } - sel.firstChild.selected = true; - sel.size = Math.min(10, completions.length); - var pos = editor.cursorCoords(); - complete.style.left = pos.x + "px"; - complete.style.top = pos.yBot + "px"; - document.body.appendChild(complete); - // If we're at the edge of the screen, then we want the menu to appear on the left of the cursor. - var winW = window.innerWidth || Math.max(document.body.offsetWidth, document.documentElement.offsetWidth); - if(winW - pos.x < sel.clientWidth) - complete.style.left = (pos.x - sel.clientWidth) + "px"; - // Hack to hide the scrollbar. - if (completions.length <= 10) - complete.style.width = (sel.clientWidth - 1) + "px"; - - var done = false; - function close() { - if (done) return; - done = true; - complete.parentNode.removeChild(complete); - } - function pick() { - insert(completions[sel.selectedIndex]); - close(); - setTimeout(function(){editor.focus();}, 50); - } - CodeMirror.connect(sel, "blur", close); - CodeMirror.connect(sel, "keydown", function(event) { - var code = event.keyCode; - // Enter - if (code == 13) {CodeMirror.e_stop(event); pick();} - // Escape - else if (code == 27) {CodeMirror.e_stop(event); close(); editor.focus();} - else if (code != 38 && code != 40) { - close(); editor.focus(); - // Pass the event to the CodeMirror instance so that it can handle things like backspace properly. - editor.triggerOnKeyDown(event); - setTimeout(function(){CodeMirror.simpleHint(editor, getHints);}, 50); - } - }); - CodeMirror.connect(sel, "dblclick", pick); - - sel.focus(); - // Opera sometimes ignores focusing a freshly created node - if (window.opera) setTimeout(function(){if (!done) sel.focus();}, 100); - return true; - }; -})();