From 3a754133dbc138390503341fd2e9beba3e43aa4b Mon Sep 17 00:00:00 2001
From: Jose Antonio Marquez
Date: Fri, 27 Jan 2012 12:05:17 -0800
Subject: Merged old FileIO

---
 js/codemirror/mode/clike/clike.js           | 247 -------------
 js/codemirror/mode/clike/index.html         | 102 ------
 js/codemirror/mode/css/css.js               | 124 -------
 js/codemirror/mode/css/index.html           |  56 ---
 js/codemirror/mode/diff/diff.css            |   3 -
 js/codemirror/mode/diff/diff.js             |  13 -
 js/codemirror/mode/diff/index.html          |  99 ------
 js/codemirror/mode/haskell/haskell.js       | 242 -------------
 js/codemirror/mode/haskell/index.html       |  60 ----
 js/codemirror/mode/htmlmixed/htmlmixed.js   |  79 -----
 js/codemirror/mode/htmlmixed/index.html     |  52 ---
 js/codemirror/mode/javascript/index.html    |  78 -----
 js/codemirror/mode/javascript/javascript.js | 348 ------------------
 js/codemirror/mode/lua/index.html           |  72 ----
 js/codemirror/mode/lua/lua.js               | 138 --------
 js/codemirror/mode/php/index.html           |  49 ---
 js/codemirror/mode/php/php.js               | 110 ------
 js/codemirror/mode/plsql/index.html         |  63 ----
 js/codemirror/mode/plsql/plsql.js           | 217 ------------
 js/codemirror/mode/python/LICENSE.txt       |  21 --
 js/codemirror/mode/python/index.html        | 123 -------
 js/codemirror/mode/python/python.js         | 321 -----------------
 js/codemirror/mode/rst/index.html           | 526 ----------------------------
 js/codemirror/mode/rst/rst.css              |  75 ----
 js/codemirror/mode/rst/rst.js               | 333 ------------------
 js/codemirror/mode/scheme/index.html        |  65 ----
 js/codemirror/mode/scheme/scheme.js         | 181 ----------
 js/codemirror/mode/smalltalk/index.html     |  56 ---
 js/codemirror/mode/smalltalk/smalltalk.js   | 122 -------
 js/codemirror/mode/sparql/index.html        |  41 ---
 js/codemirror/mode/sparql/sparql.js         | 143 --------
 js/codemirror/mode/stex/index.html          |  96 -----
 js/codemirror/mode/stex/stex.js             | 167 ---------
 js/codemirror/mode/xml/index.html           |  42 ---
 js/codemirror/mode/xml/xml.js               | 231 ------------
 js/codemirror/mode/yaml/index.html          |  68 ----
 js/codemirror/mode/yaml/yaml.js             |  95 -----
 37 files changed, 4858 deletions(-)
 delete mode 100644 js/codemirror/mode/clike/clike.js
 delete mode 100644 js/codemirror/mode/clike/index.html
 delete mode 100644 js/codemirror/mode/css/css.js
 delete mode 100644 js/codemirror/mode/css/index.html
 delete mode 100644 js/codemirror/mode/diff/diff.css
 delete mode 100644 js/codemirror/mode/diff/diff.js
 delete mode 100644 js/codemirror/mode/diff/index.html
 delete mode 100644 js/codemirror/mode/haskell/haskell.js
 delete mode 100644 js/codemirror/mode/haskell/index.html
 delete mode 100644 js/codemirror/mode/htmlmixed/htmlmixed.js
 delete mode 100644 js/codemirror/mode/htmlmixed/index.html
 delete mode 100644 js/codemirror/mode/javascript/index.html
 delete mode 100644 js/codemirror/mode/javascript/javascript.js
 delete mode 100644 js/codemirror/mode/lua/index.html
 delete mode 100644 js/codemirror/mode/lua/lua.js
 delete mode 100644 js/codemirror/mode/php/index.html
 delete mode 100644 js/codemirror/mode/php/php.js
 delete mode 100644 js/codemirror/mode/plsql/index.html
 delete mode 100644 js/codemirror/mode/plsql/plsql.js
 delete mode 100644 js/codemirror/mode/python/LICENSE.txt
 delete mode 100644 js/codemirror/mode/python/index.html
 delete mode 100644 js/codemirror/mode/python/python.js
 delete mode 100644 js/codemirror/mode/rst/index.html
 delete mode 100644 js/codemirror/mode/rst/rst.css
 delete mode 100644 js/codemirror/mode/rst/rst.js
 delete mode 100644 js/codemirror/mode/scheme/index.html
 delete mode 100644 js/codemirror/mode/scheme/scheme.js
 delete mode 100644 js/codemirror/mode/smalltalk/index.html
 delete mode 100644 js/codemirror/mode/smalltalk/smalltalk.js
 delete mode 100644 js/codemirror/mode/sparql/index.html
 delete mode 100644 js/codemirror/mode/sparql/sparql.js
 delete mode 100644 js/codemirror/mode/stex/index.html
 delete mode 100644 js/codemirror/mode/stex/stex.js
 delete mode 100644 js/codemirror/mode/xml/index.html
 delete mode 100644 js/codemirror/mode/xml/xml.js
 delete mode 100644 js/codemirror/mode/yaml/index.html
 delete mode 100644 js/codemirror/mode/yaml/yaml.js

(limited to 'js/codemirror/mode')

diff --git a/js/codemirror/mode/clike/clike.js b/js/codemirror/mode/clike/clike.js
deleted file mode 100644
index 08b443a4..00000000
--- a/js/codemirror/mode/clike/clike.js
+++ /dev/null
@@ -1,247 +0,0 @@
-CodeMirror.defineMode("clike", function(config, parserConfig) {
-  var indentUnit = config.indentUnit,
-      keywords = parserConfig.keywords || {},
-      blockKeywords = parserConfig.blockKeywords || {},
-      atoms = parserConfig.atoms || {},
-      hooks = parserConfig.hooks || {},
-      multiLineStrings = parserConfig.multiLineStrings;
-  var isOperatorChar = /[+\-*&%=<>!?|\/]/;
-
-  var curPunc;
-
-  function tokenBase(stream, state) {
-    var ch = stream.next();
-    if (hooks[ch]) {
-      var result = hooks[ch](stream, state);
-      if (result !== false) return result;
-    }
-    if (ch == '"' || ch == "'") {
-      state.tokenize = tokenString(ch);
-      return state.tokenize(stream, state);
-    }
-    if (/[\[\]{}\(\),;\:\.]/.test(ch)) {
-      curPunc = ch;
-      return null
-    }
-    if (/\d/.test(ch)) {
-      stream.eatWhile(/[\w\.]/);
-      return "number";
-    }
-    if (ch == "/") {
-      if (stream.eat("*")) {
-        state.tokenize = tokenComment;
-        return tokenComment(stream, state);
-      }
-      if (stream.eat("/")) {
-        stream.skipToEnd();
-        return "comment";
-      }
-    }
-    if (isOperatorChar.test(ch)) {
-      stream.eatWhile(isOperatorChar);
-      return "operator";
-    }
-    stream.eatWhile(/[\w\$_]/);
-    var cur = stream.current();
-    if (keywords.propertyIsEnumerable(cur)) {
-      if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement";
-      return "keyword";
-    }
-    if (atoms.propertyIsEnumerable(cur)) return "atom";
-    return "word";
-  }
-
-  function tokenString(quote) {
-    return function(stream, state) {
-      var escaped = false, next, end = false;
-      while ((next = stream.next()) != null) {
-        if (next == quote && !escaped) {end = true; break;}
-        escaped = !escaped && next == "\\";
-      }
-      if (end || !(escaped || multiLineStrings))
-        state.tokenize = tokenBase;
-      return "string";
-    };
-  }
-
-  function tokenComment(stream, state) {
-    var maybeEnd = false, ch;
-    while (ch = stream.next()) {
-      if (ch == "/" && maybeEnd) {
-        state.tokenize = tokenBase;
-        break;
-      }
-      maybeEnd = (ch == "*");
-    }
-    return "comment";
-  }
-
-  function Context(indented, column, type, align, prev) {
-    this.indented = indented;
-    this.column = column;
-    this.type = type;
-    this.align = align;
-    this.prev = prev;
-  }
-  function pushContext(state, col, type) {
-    return state.context = new Context(state.indented, col, type, null, state.context);
-  }
-  function popContext(state) {
-    var t = state.context.type;
-    if (t == ")" || t == "]" || t == "}")
-      state.indented = state.context.indented;
-    return state.context = state.context.prev;
-  }
-
-  // Interface
-
-  return {
-    startState: function(basecolumn) {
-      return {
-        tokenize: null,
-        context: new Context((basecolumn || 0) - indentUnit, 0, "top", false),
-        indented: 0,
-        startOfLine: true
-      };
-    },
-
-    token: function(stream, state) {
-      var ctx = state.context;
-      if (stream.sol()) {
-        if (ctx.align == null) ctx.align = false;
-        state.indented = stream.indentation();
-        state.startOfLine = true;
-      }
-      if (stream.eatSpace()) return null;
-      curPunc = null;
-      var style = (state.tokenize || tokenBase)(stream, state);
-      if (style == "comment" || style == "meta") return style;
-      if (ctx.align == null) ctx.align = true;
-
-      if ((curPunc == ";" || curPunc == ":") && ctx.type == "statement") popContext(state);
-      else if (curPunc == "{") pushContext(state, stream.column(), "}");
-      else if (curPunc == "[") pushContext(state, stream.column(), "]");
-      else if (curPunc == "(") pushContext(state, stream.column(), ")");
-      else if (curPunc == "}") {
-        while (ctx.type == "statement") ctx = popContext(state);
-        if (ctx.type == "}") ctx = popContext(state);
-        while (ctx.type == "statement") ctx = popContext(state);
-      }
-      else if (curPunc == ctx.type) popContext(state);
-      else if (ctx.type == "}" || ctx.type == "top" || (ctx.type == "statement" && curPunc == "newstatement"))
-        pushContext(state, stream.column(), "statement");
-      state.startOfLine = false;
-      return style;
-    },
-
-    indent: function(state, textAfter) {
-      if (state.tokenize != tokenBase && state.tokenize != null) return 0;
-      var firstChar = textAfter && textAfter.charAt(0), ctx = state.context, closing = firstChar == ctx.type;
-      if (ctx.type == "statement") return ctx.indented + (firstChar == "{" ? 0 : indentUnit);
-      else if (ctx.align) return ctx.column + (closing ? 0 : 1);
-      else return ctx.indented + (closing ? 0 : indentUnit);
-    },
-
-    electricChars: "{}"
-  };
-});
-
-(function() {
-  function words(str) {
-    var obj = {}, words = str.split(" ");
-    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
-    return obj;
-  }
-  var cKeywords = "auto if break int case long char register continue return default short do sizeof " +
-    "double static else struct entry switch extern typedef float union for unsigned " +
-    "goto while enum void const signed volatile";
-
-  function cppHook(stream, state) {
-    if (!state.startOfLine) return false;
-    stream.skipToEnd();
-    return "meta";
-  }
-
-  // C#-style strings where "" escapes a quote.
-  function tokenAtString(stream, state) {
-    var next;
-    while ((next = stream.next()) != null) {
-      if (next == '"' && !stream.eat('"')) {
-        state.tokenize = null;
-        break;
-      }
-    }
-    return "string";
-  }
-
-  CodeMirror.defineMIME("text/x-csrc", {
-    name: "clike",
-    keywords: words(cKeywords),
-    blockKeywords: words("case do else for if switch while struct"),
-    atoms: words("null"),
-    hooks: {"#": cppHook}
-  });
-  CodeMirror.defineMIME("text/x-c++src", {
-    name: "clike",
-    keywords: words(cKeywords + " asm dynamic_cast namespace reinterpret_cast try bool explicit new " +
-                    "static_cast typeid catch operator template typename class friend private " +
-                    "this using const_cast inline public throw virtual delete mutable protected " +
-                    "wchar_t"),
-    blockKeywords: words("catch class do else finally for if struct switch try while"),
-    atoms: words("true false null"),
-    hooks: {"#": cppHook}
-  });
-  CodeMirror.defineMIME("text/x-java", {
-    name: "clike",
-    keywords: words("abstract assert boolean break byte case catch char class const continue default " + 
-                    "do double else enum extends final finally float for goto if implements import " +
-                    "instanceof int interface long native new package private protected public " +
-                    "return short static strictfp super switch synchronized this throw throws transient " +
-                    "try void volatile while"),
-    blockKeywords: words("catch class do else finally for if switch try while"),
-    atoms: words("true false null"),
-    hooks: {
-      "@": function(stream, state) {
-        stream.eatWhile(/[\w\$_]/);
-        return "meta";
-      }
-    }
-  });
-  CodeMirror.defineMIME("text/x-csharp", {
-    name: "clike",
-    keywords: words("abstract as base bool break byte case catch char checked class const continue decimal" + 
-                    " default delegate do double else enum event explicit extern finally fixed float for" + 
-                    " foreach goto if implicit in int interface internal is lock long namespace new object" + 
-                    " operator out override params private protected public readonly ref return sbyte sealed short" + 
-                    " sizeof stackalloc static string struct switch this throw try typeof uint ulong unchecked" + 
-                    " unsafe ushort using virtual void volatile while add alias ascending descending dynamic from get" + 
-                    " global group into join let orderby partial remove select set value var yield"),
-    blockKeywords: words("catch class do else finally for foreach if struct switch try while"),
-    atoms: words("true false null"),
-    hooks: {
-      "@": function(stream, state) {
-        if (stream.eat('"')) {
-          state.tokenize = tokenAtString;
-          return tokenAtString(stream, state);
-        }
-        stream.eatWhile(/[\w\$_]/);
-        return "meta";
-      }
-    }
-  });
-  CodeMirror.defineMIME("text/x-groovy", {
-    name: "clike",
-    keywords: words("abstract as assert boolean break byte case catch char class const continue def default " +
-                    "do double else enum extends final finally float for goto if implements import " +
-                    "in instanceof int interface long native new package property private protected public " +
-                    "return short static strictfp super switch synchronized this throw throws transient " +
-                    "try void volatile while"),
-    atoms: words("true false null"),
-    hooks: {
-      "@": function(stream, state) {
-        stream.eatWhile(/[\w\$_]/);
-        return "meta";
-      }
-    }
-  });
-}());
diff --git a/js/codemirror/mode/clike/index.html b/js/codemirror/mode/clike/index.html
deleted file mode 100644
index 89241c08..00000000
--- a/js/codemirror/mode/clike/index.html
+++ /dev/null
@@ -1,102 +0,0 @@
-<!doctype html>
-<html>
-  <head>
-    <title>CodeMirror 2: C-like mode</title>
-    <link rel="stylesheet" href="../../lib/codemirror.css">
-    <script src="../../lib/codemirror.js"></script>
-    <script src="clike.js"></script>
-    <link rel="stylesheet" href="../../theme/default.css">
-    <link rel="stylesheet" href="../../css/docs.css">
-    <style>.CodeMirror {border: 2px inset #dee;}</style>
-  </head>
-  <body>
-    <h1>CodeMirror 2: C-like mode</h1>
-
-<form><textarea id="code" name="code">
-/* C demo code */
-
-#include <zmq.h>
-#include <pthread.h>
-#include <semaphore.h>
-#include <time.h>
-#include <stdio.h>
-#include <fcntl.h>
-#include <malloc.h>
-
-typedef struct {
-  void* arg_socket;
-  zmq_msg_t* arg_msg;
-  char* arg_string;
-  unsigned long arg_len;
-  int arg_int, arg_command;
-
-  int signal_fd;
-  int pad;
-  void* context;
-  sem_t sem;
-} acl_zmq_context;
-
-#define p(X) (context->arg_##X)
-
-void* zmq_thread(void* context_pointer) {
-  acl_zmq_context* context = (acl_zmq_context*)context_pointer;
-  char ok = 'K', err = 'X';
-  int res;
-
-  while (1) {
-    while ((res = sem_wait(&amp;context->sem)) == EINTR);
-    if (res) {write(context->signal_fd, &amp;err, 1); goto cleanup;}
-    switch(p(command)) {
-    case 0: goto cleanup;
-    case 1: p(socket) = zmq_socket(context->context, p(int)); break;
-    case 2: p(int) = zmq_close(p(socket)); break;
-    case 3: p(int) = zmq_bind(p(socket), p(string)); break;
-    case 4: p(int) = zmq_connect(p(socket), p(string)); break;
-    case 5: p(int) = zmq_getsockopt(p(socket), p(int), (void*)p(string), &amp;p(len)); break;
-    case 6: p(int) = zmq_setsockopt(p(socket), p(int), (void*)p(string), p(len)); break;
-    case 7: p(int) = zmq_send(p(socket), p(msg), p(int)); break;
-    case 8: p(int) = zmq_recv(p(socket), p(msg), p(int)); break;
-    case 9: p(int) = zmq_poll(p(socket), p(int), p(len)); break;
-    }
-    p(command) = errno;
-    write(context->signal_fd, &amp;ok, 1);
-  }
- cleanup:
-  close(context->signal_fd);
-  free(context_pointer);
-  return 0;
-}
-
-void* zmq_thread_init(void* zmq_context, int signal_fd) {
-  acl_zmq_context* context = malloc(sizeof(acl_zmq_context));
-  pthread_t thread;
-
-  context->context = zmq_context;
-  context->signal_fd = signal_fd;
-  sem_init(&amp;context->sem, 1, 0);
-  pthread_create(&amp;thread, 0, &amp;zmq_thread, context);
-  pthread_detach(thread);
-  return context;
-}
-</textarea></form>
-
-    <script>
-      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
-        lineNumbers: true,
-        matchBrackets: true,
-        mode: "text/x-csrc"
-      });
-    </script>
-
-    <p>Simple mode that tries to handle C-like languages as well as it
-    can. Takes two configuration parameters: <code>keywords</code>, an
-    object whose property names are the keywords in the language,
-    and <code>useCPP</code>, which determines whether C preprocessor
-    directives are recognized.</p>
-
-    <p><strong>MIME types defined:</strong> <code>text/x-csrc</code>
-    (C code), <code>text/x-c++src</code> (C++
-    code), <code>text/x-java</code> (Java
-    code), <code>text/x-groovy</code> (Groovy code).</p>
-  </body>
-</html>
diff --git a/js/codemirror/mode/css/css.js b/js/codemirror/mode/css/css.js
deleted file mode 100644
index 6c239fcc..00000000
--- a/js/codemirror/mode/css/css.js
+++ /dev/null
@@ -1,124 +0,0 @@
-CodeMirror.defineMode("css", function(config) {
-  var indentUnit = config.indentUnit, type;
-  function ret(style, tp) {type = tp; return style;}
-
-  function tokenBase(stream, state) {
-    var ch = stream.next();
-    if (ch == "@") {stream.eatWhile(/\w/); return ret("meta", stream.current());}
-    else if (ch == "/" && stream.eat("*")) {
-      state.tokenize = tokenCComment;
-      return tokenCComment(stream, state);
-    }
-    else if (ch == "<" && stream.eat("!")) {
-      state.tokenize = tokenSGMLComment;
-      return tokenSGMLComment(stream, state);
-    }
-    else if (ch == "=") ret(null, "compare");
-    else if ((ch == "~" || ch == "|") && stream.eat("=")) return ret(null, "compare");
-    else if (ch == "\"" || ch == "'") {
-      state.tokenize = tokenString(ch);
-      return state.tokenize(stream, state);
-    }
-    else if (ch == "#") {
-      stream.eatWhile(/\w/);
-      return ret("atom", "hash");
-    }
-    else if (ch == "!") {
-      stream.match(/^\s*\w*/);
-      return ret("keyword", "important");
-    }
-    else if (/\d/.test(ch)) {
-      stream.eatWhile(/[\w.%]/);
-      return ret("number", "unit");
-    }
-    else if (/[,.+>*\/]/.test(ch)) {
-      return ret(null, "select-op");
-    }
-    else if (/[;{}:\[\]]/.test(ch)) {
-      return ret(null, ch);
-    }
-    else {
-      stream.eatWhile(/[\w\\\-_]/);
-      return ret("variable", "variable");
-    }
-  }
-
-  function tokenCComment(stream, state) {
-    var maybeEnd = false, ch;
-    while ((ch = stream.next()) != null) {
-      if (maybeEnd && ch == "/") {
-        state.tokenize = tokenBase;
-        break;
-      }
-      maybeEnd = (ch == "*");
-    }
-    return ret("comment", "comment");
-  }
-
-  function tokenSGMLComment(stream, state) {
-    var dashes = 0, ch;
-    while ((ch = stream.next()) != null) {
-      if (dashes >= 2 && ch == ">") {
-        state.tokenize = tokenBase;
-        break;
-      }
-      dashes = (ch == "-") ? dashes + 1 : 0;
-    }
-    return ret("comment", "comment");
-  }
-
-  function tokenString(quote) {
-    return function(stream, state) {
-      var escaped = false, ch;
-      while ((ch = stream.next()) != null) {
-        if (ch == quote && !escaped)
-          break;
-        escaped = !escaped && ch == "\\";
-      }
-      if (!escaped) state.tokenize = tokenBase;
-      return ret("string", "string");
-    };
-  }
-
-  return {
-    startState: function(base) {
-      return {tokenize: tokenBase,
-              baseIndent: base || 0,
-              stack: []};
-    },
-
-    token: function(stream, state) {
-      if (stream.eatSpace()) return null;
-      var style = state.tokenize(stream, state);
-
-      var context = state.stack[state.stack.length-1];
-      if (type == "hash" && context == "rule") style = "atom";
-      else if (style == "variable") {
-        if (context == "rule") style = "number";
-        else if (!context || context == "@media{") style = "tag";
-      }
-
-      if (context == "rule" && /^[\{\};]$/.test(type))
-        state.stack.pop();
-      if (type == "{") {
-        if (context == "@media") state.stack[state.stack.length-1] = "@media{";
-        else state.stack.push("{");
-      }
-      else if (type == "}") state.stack.pop();
-      else if (type == "@media") state.stack.push("@media");
-      else if (context == "{" && type != "comment") state.stack.push("rule");
-      return style;
-    },
-
-    indent: function(state, textAfter) {
-      var n = state.stack.length;
-      if (/^\}/.test(textAfter))
-        n -= state.stack[state.stack.length-1] == "rule" ? 2 : 1;
-      return state.baseIndent + n * indentUnit;
-    },
-
-    electricChars: "}"
-  };
-});
-
-CodeMirror.defineMIME("text/css", "css");
diff --git a/js/codemirror/mode/css/index.html b/js/codemirror/mode/css/index.html
deleted file mode 100644
index 7d01e366..00000000
--- a/js/codemirror/mode/css/index.html
+++ /dev/null
@@ -1,56 +0,0 @@
-<!doctype html>
-<html>
-  <head>
-    <title>CodeMirror 2: CSS mode</title>
-    <link rel="stylesheet" href="../../lib/codemirror.css">
-    <script src="../../lib/codemirror.js"></script>
-    <script src="css.js"></script>
-    <link rel="stylesheet" href="../../theme/default.css">
-    <style>.CodeMirror {background: #f8f8f8;}</style>
-    <link rel="stylesheet" href="../../css/docs.css">
-  </head>
-  <body>
-    <h1>CodeMirror 2: CSS mode</h1>
-    <form><textarea id="code" name="code">
-/* Some example CSS */
-
-@import url("something.css");
-
-body {
-  margin: 0;
-  padding: 3em 6em;
-  font-family: tahoma, arial, sans-serif;
-  color: #000;
-}
-
-#navigation a {
-  font-weight: bold;
-  text-decoration: none !important;
-}
-
-h1 {
-  font-size: 2.5em;
-}
-
-h2 {
-  font-size: 1.7em;
-}
-
-h1:before, h2:before {
-  content: "::";
-}
-
-code {
-  font-family: courier, monospace;
-  font-size: 80%;
-  color: #418A8A;
-}
-</textarea></form>
-    <script>
-      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {});
-    </script>
-
-    <p><strong>MIME types defined:</strong> <code>text/css</code>.</p>
-
-  </body>
-</html>
diff --git a/js/codemirror/mode/diff/diff.css b/js/codemirror/mode/diff/diff.css
deleted file mode 100644
index 16f8d335..00000000
--- a/js/codemirror/mode/diff/diff.css
+++ /dev/null
@@ -1,3 +0,0 @@
-.cm-s-default span.cm-rangeinfo {color: #a0b;}
-.cm-s-default span.cm-minus {color: #a22;}
-.cm-s-default span.cm-plus {color: #2b2;}
diff --git a/js/codemirror/mode/diff/diff.js b/js/codemirror/mode/diff/diff.js
deleted file mode 100644
index 725bb2c7..00000000
--- a/js/codemirror/mode/diff/diff.js
+++ /dev/null
@@ -1,13 +0,0 @@
-CodeMirror.defineMode("diff", function() {
-  return {
-    token: function(stream) {
-      var ch = stream.next();
-      stream.skipToEnd();
-      if (ch == "+") return "plus";
-      if (ch == "-") return "minus";
-      if (ch == "@") return "rangeinfo";
-    }
-  };
-});
-
-CodeMirror.defineMIME("text/x-diff", "diff");
diff --git a/js/codemirror/mode/diff/index.html b/js/codemirror/mode/diff/index.html
deleted file mode 100644
index 2748f2fa..00000000
--- a/js/codemirror/mode/diff/index.html
+++ /dev/null
@@ -1,99 +0,0 @@
-<!doctype html>
-<html>
-  <head>
-    <title>CodeMirror 2: Diff mode</title>
-    <link rel="stylesheet" href="../../lib/codemirror.css">
-    <script src="../../lib/codemirror.js"></script>
-    <script src="diff.js"></script>
-    <link rel="stylesheet" href="diff.css">
-    <style>.CodeMirror {border-top: 1px solid #ddd; border-bottom: 1px solid #ddd;}</style>
-    <link rel="stylesheet" href="../../css/docs.css">
-  </head>
-  <body>
-    <h1>CodeMirror 2: Diff mode</h1>
-    <form><textarea id="code" name="code">
-diff --git a/index.html b/index.html
-index c1d9156..7764744 100644
---- a/index.html
-+++ b/index.html
-@@ -95,7 +95,8 @@ StringStream.prototype = {
-     <script>
-       var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
-         lineNumbers: true,
--        autoMatchBrackets: true
-+        autoMatchBrackets: true,
-+      onGutterClick: function(x){console.log(x);}
-       });
-     </script>
-   </body>
-diff --git a/lib/codemirror.js b/lib/codemirror.js
-index 04646a9..9a39cc7 100644
---- a/lib/codemirror.js
-+++ b/lib/codemirror.js
-@@ -399,10 +399,16 @@ var CodeMirror = (function() {
-     }
- 
-     function onMouseDown(e) {
--      var start = posFromMouse(e), last = start;
-+      var start = posFromMouse(e), last = start, target = e.target();
-       if (!start) return;
-       setCursor(start.line, start.ch, false);
-       if (e.button() != 1) return;
-+      if (target.parentNode == gutter) {
-+        if (options.onGutterClick)
-+          options.onGutterClick(indexOf(gutter.childNodes, target) + showingFrom);
-+        return;
-+      }
-+
-       if (!focused) onFocus();
- 
-       e.stop();
-@@ -808,7 +814,7 @@ var CodeMirror = (function() {
-       for (var i = showingFrom; i < showingTo; ++i) {
-         var marker = lines[i].gutterMarker;
-         if (marker) html.push('<div class="' + marker.style + '">' + htmlEscape(marker.text) + '</div>');
--        else html.push("<div>" + (options.lineNumbers ? i + 1 : "\u00a0") + "</div>");
-+        else html.push("<div>" + (options.lineNumbers ? i + options.firstLineNumber : "\u00a0") + "</div>");
-       }
-       gutter.style.display = "none"; // TODO test whether this actually helps
-       gutter.innerHTML = html.join("");
-@@ -1371,10 +1377,8 @@ var CodeMirror = (function() {
-         if (option == "parser") setParser(value);
-         else if (option === "lineNumbers") setLineNumbers(value);
-         else if (option === "gutter") setGutter(value);
--        else if (option === "readOnly") options.readOnly = value;
--        else if (option === "indentUnit") {options.indentUnit = indentUnit = value; setParser(options.parser);}
--        else if (/^(?:enterMode|tabMode|indentWithTabs|readOnly|autoMatchBrackets|undoDepth)$/.test(option)) options[option] = value;
--        else throw new Error("Can't set option " + option);
-+        else if (option === "indentUnit") {options.indentUnit = value; setParser(options.parser);}
-+        else options[option] = value;
-       },
-       cursorCoords: cursorCoords,
-       undo: operation(undo),
-@@ -1402,7 +1406,8 @@ var CodeMirror = (function() {
-       replaceRange: operation(replaceRange),
- 
-       operation: function(f){return operation(f)();},
--      refresh: function(){updateDisplay([{from: 0, to: lines.length}]);}
-+      refresh: function(){updateDisplay([{from: 0, to: lines.length}]);},
-+      getInputField: function(){return input;}
-     };
-     return instance;
-   }
-@@ -1420,6 +1425,7 @@ var CodeMirror = (function() {
-     readOnly: false,
-     onChange: null,
-     onCursorActivity: null,
-+    onGutterClick: null,
-     autoMatchBrackets: false,
-     workTime: 200,
-     workDelay: 300,
-</textarea></form>
-    <script>
-      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {});
-    </script>
-
-    <p><strong>MIME types defined:</strong> <code>text/x-diff</code>.</p>
-
-  </body>
-</html>
diff --git a/js/codemirror/mode/haskell/haskell.js b/js/codemirror/mode/haskell/haskell.js
deleted file mode 100644
index aac50410..00000000
--- a/js/codemirror/mode/haskell/haskell.js
+++ /dev/null
@@ -1,242 +0,0 @@
-CodeMirror.defineMode("haskell", function(cmCfg, modeCfg) {
-
-  function switchState(source, setState, f) {
-    setState(f);
-    return f(source, setState);
-  }
-  
-  // These should all be Unicode extended, as per the Haskell 2010 report
-  var smallRE = /[a-z_]/;
-  var largeRE = /[A-Z]/;
-  var digitRE = /[0-9]/;
-  var hexitRE = /[0-9A-Fa-f]/;
-  var octitRE = /[0-7]/;
-  var idRE = /[a-z_A-Z0-9']/;
-  var symbolRE = /[-!#$%&*+.\/<=>?@\\^|~:]/;
-  var specialRE = /[(),;[\]`{}]/;
-  var whiteCharRE = /[ \t\v\f]/; // newlines are handled in tokenizer
-    
-  function normal(source, setState) {
-    if (source.eatWhile(whiteCharRE)) {
-      return null;
-    }
-      
-    var ch = source.next();
-    if (specialRE.test(ch)) {
-      if (ch == '{' && source.eat('-')) {
-        var t = "comment";
-        if (source.eat('#')) {
-          t = "meta";
-        }
-        return switchState(source, setState, ncomment(t, 1));
-      }
-      return null;
-    }
-    
-    if (ch == '\'') {
-      if (source.eat('\\')) {
-        source.next();  // should handle other escapes here
-      }
-      else {
-        source.next();
-      }
-      if (source.eat('\'')) {
-        return "string";
-      }
-      return "error";
-    }
-    
-    if (ch == '"') {
-      return switchState(source, setState, stringLiteral);
-    }
-      
-    if (largeRE.test(ch)) {
-      source.eatWhile(idRE);
-      if (source.eat('.')) {
-        return "qualifier";
-      }
-      return "variable-2";
-    }
-      
-    if (smallRE.test(ch)) {
-      source.eatWhile(idRE);
-      return "variable";
-    }
-      
-    if (digitRE.test(ch)) {
-      if (ch == '0') {
-        if (source.eat(/[xX]/)) {
-          source.eatWhile(hexitRE); // should require at least 1
-          return "integer";
-        }
-        if (source.eat(/[oO]/)) {
-          source.eatWhile(octitRE); // should require at least 1
-          return "number";
-        }
-      }
-      source.eatWhile(digitRE);
-      var t = "number";
-      if (source.eat('.')) {
-        t = "number";
-        source.eatWhile(digitRE); // should require at least 1
-      }
-      if (source.eat(/[eE]/)) {
-        t = "number";
-        source.eat(/[-+]/);
-        source.eatWhile(digitRE); // should require at least 1
-      }
-      return t;
-    }
-      
-    if (symbolRE.test(ch)) {
-      if (ch == '-' && source.eat(/-/)) {
-        source.eatWhile(/-/);
-        if (!source.eat(symbolRE)) {
-          source.skipToEnd();
-          return "comment";
-        }
-      }
-      var t = "variable";
-      if (ch == ':') {
-        t = "variable-2";
-      }
-      source.eatWhile(symbolRE);
-      return t;    
-    }
-      
-    return "error";
-  }
-    
-  function ncomment(type, nest) {
-    if (nest == 0) {
-      return normal;
-    }
-    return function(source, setState) {
-      var currNest = nest;
-      while (!source.eol()) {
-        var ch = source.next();
-        if (ch == '{' && source.eat('-')) {
-          ++currNest;
-        }
-        else if (ch == '-' && source.eat('}')) {
-          --currNest;
-          if (currNest == 0) {
-            setState(normal);
-            return type;
-          }
-        }
-      }
-      setState(ncomment(type, currNest));
-      return type;
-    }
-  }
-    
-  function stringLiteral(source, setState) {
-    while (!source.eol()) {
-      var ch = source.next();
-      if (ch == '"') {
-        setState(normal);
-        return "string";
-      }
-      if (ch == '\\') {
-        if (source.eol() || source.eat(whiteCharRE)) {
-          setState(stringGap);
-          return "string";
-        }
-        if (source.eat('&')) {
-        }
-        else {
-          source.next(); // should handle other escapes here
-        }
-      }
-    }
-    setState(normal);
-    return "error";
-  }
-  
-  function stringGap(source, setState) {
-    if (source.eat('\\')) {
-      return switchState(source, setState, stringLiteral);
-    }
-    source.next();
-    setState(normal);
-    return "error";
-  }
-  
-  
-  var wellKnownWords = (function() {
-    var wkw = {};
-    function setType(t) {
-      return function () {
-        for (var i = 0; i < arguments.length; i++)
-          wkw[arguments[i]] = t;
-      }
-    }
-    
-    setType("keyword")(
-      "case", "class", "data", "default", "deriving", "do", "else", "foreign",
-      "if", "import", "in", "infix", "infixl", "infixr", "instance", "let",
-      "module", "newtype", "of", "then", "type", "where", "_");
-      
-    setType("keyword")(
-      "\.\.", ":", "::", "=", "\\", "\"", "<-", "->", "@", "~", "=>");
-      
-    setType("builtin")(
-      "!!", "$!", "$", "&&", "+", "++", "-", ".", "/", "/=", "<", "<=", "=<<",
-      "==", ">", ">=", ">>", ">>=", "^", "^^", "||", "*", "**");
-      
-    setType("builtin")(
-      "Bool", "Bounded", "Char", "Double", "EQ", "Either", "Enum", "Eq",
-      "False", "FilePath", "Float", "Floating", "Fractional", "Functor", "GT",
-      "IO", "IOError", "Int", "Integer", "Integral", "Just", "LT", "Left",
-      "Maybe", "Monad", "Nothing", "Num", "Ord", "Ordering", "Rational", "Read",
-      "ReadS", "Real", "RealFloat", "RealFrac", "Right", "Show", "ShowS",
-      "String", "True");
-      
-    setType("builtin")(
-      "abs", "acos", "acosh", "all", "and", "any", "appendFile", "asTypeOf",
-      "asin", "asinh", "atan", "atan2", "atanh", "break", "catch", "ceiling",
-      "compare", "concat", "concatMap", "const", "cos", "cosh", "curry",
-      "cycle", "decodeFloat", "div", "divMod", "drop", "dropWhile", "either",
-      "elem", "encodeFloat", "enumFrom", "enumFromThen", "enumFromThenTo",
-      "enumFromTo", "error", "even", "exp", "exponent", "fail", "filter",
-      "flip", "floatDigits", "floatRadix", "floatRange", "floor", "fmap",
-      "foldl", "foldl1", "foldr", "foldr1", "fromEnum", "fromInteger",
-      "fromIntegral", "fromRational", "fst", "gcd", "getChar", "getContents",
-      "getLine", "head", "id", "init", "interact", "ioError", "isDenormalized",
-      "isIEEE", "isInfinite", "isNaN", "isNegativeZero", "iterate", "last",
-      "lcm", "length", "lex", "lines", "log", "logBase", "lookup", "map",
-      "mapM", "mapM_", "max", "maxBound", "maximum", "maybe", "min", "minBound",
-      "minimum", "mod", "negate", "not", "notElem", "null", "odd", "or",
-      "otherwise", "pi", "pred", "print", "product", "properFraction",
-      "putChar", "putStr", "putStrLn", "quot", "quotRem", "read", "readFile",
-      "readIO", "readList", "readLn", "readParen", "reads", "readsPrec",
-      "realToFrac", "recip", "rem", "repeat", "replicate", "return", "reverse",
-      "round", "scaleFloat", "scanl", "scanl1", "scanr", "scanr1", "seq",
-      "sequence", "sequence_", "show", "showChar", "showList", "showParen",
-      "showString", "shows", "showsPrec", "significand", "signum", "sin",
-      "sinh", "snd", "span", "splitAt", "sqrt", "subtract", "succ", "sum",
-      "tail", "take", "takeWhile", "tan", "tanh", "toEnum", "toInteger",
-      "toRational", "truncate", "uncurry", "undefined", "unlines", "until",
-      "unwords", "unzip", "unzip3", "userError", "words", "writeFile", "zip",
-      "zip3", "zipWith", "zipWith3");
-      
-    return wkw;
-  })();
-    
-  
-  
-  return {
-    startState: function ()  { return { f: normal }; },
-    copyState:  function (s) { return { f: s.f }; },
-    
-    token: function(stream, state) {
-      var t = state.f(stream, function(s) { state.f = s; });
-      var w = stream.current();
-      return (w in wellKnownWords) ? wellKnownWords[w] : t;
-    }
-  };
-
-});
-
-CodeMirror.defineMIME("text/x-haskell", "haskell");
diff --git a/js/codemirror/mode/haskell/index.html b/js/codemirror/mode/haskell/index.html
deleted file mode 100644
index 6ea7f5ed..00000000
--- a/js/codemirror/mode/haskell/index.html
+++ /dev/null
@@ -1,60 +0,0 @@
-<!doctype html>
-<html>
-  <head>
-    <title>CodeMirror 2: Haskell mode</title>
-    <link rel="stylesheet" href="../../lib/codemirror.css">
-    <script src="../../lib/codemirror.js"></script>
-    <script src="haskell.js"></script>
-    <link rel="stylesheet" href="../../theme/elegant.css">
-    <style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
-    <link rel="stylesheet" href="../../css/docs.css">
-  </head>
-  <body>
-    <h1>CodeMirror 2: Haskell mode</h1>
-
-<form><textarea id="code" name="code">
-module UniquePerms (
-    uniquePerms
-    )
-where
-
--- | Find all unique permutations of a list where there might be duplicates.
-uniquePerms :: (Eq a) => [a] -> [[a]]
-uniquePerms = permBag . makeBag
-
--- | An unordered collection where duplicate values are allowed,
--- but represented with a single value and a count.
-type Bag a = [(a, Int)]
-
-makeBag :: (Eq a) => [a] -> Bag a
-makeBag [] = []
-makeBag (a:as) = mix a $ makeBag as
-  where
-    mix a []                        = [(a,1)]
-    mix a (bn@(b,n):bs) | a == b    = (b,n+1):bs
-                        | otherwise = bn : mix a bs
-
-permBag :: Bag a -> [[a]]
-permBag [] = [[]]
-permBag bs = concatMap (\(f,cs) -> map (f:) $ permBag cs) . oneOfEach $ bs
-  where
-    oneOfEach [] = []
-    oneOfEach (an@(a,n):bs) =
-        let bs' = if n == 1 then bs else (a,n-1):bs
-        in (a,bs') : mapSnd (an:) (oneOfEach bs)
-    
-    apSnd f (a,b) = (a, f b)
-    mapSnd = map . apSnd
-</textarea></form>
-
-    <script>
-      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
-        lineNumbers: true,
-        matchBrackets: true,
-        theme: "elegant"
-      });
-    </script>
-
-    <p><strong>MIME types defined:</strong> <code>text/x-haskell</code>.</p>
-  </body>
-</html>
diff --git a/js/codemirror/mode/htmlmixed/htmlmixed.js b/js/codemirror/mode/htmlmixed/htmlmixed.js
deleted file mode 100644
index fa30a13f..00000000
--- a/js/codemirror/mode/htmlmixed/htmlmixed.js
+++ /dev/null
@@ -1,79 +0,0 @@
-CodeMirror.defineMode("htmlmixed", function(config, parserConfig) {
-  var htmlMode = CodeMirror.getMode(config, {name: "xml", htmlMode: true});
-  var jsMode = CodeMirror.getMode(config, "javascript");
-  var cssMode = CodeMirror.getMode(config, "css");
-
-  function html(stream, state) {
-    var style = htmlMode.token(stream, state.htmlState);
-    if (style == "tag" && stream.current() == ">" && state.htmlState.context) {
-      if (/^script$/i.test(state.htmlState.context.tagName)) {
-        state.token = javascript;
-        state.localState = jsMode.startState(htmlMode.indent(state.htmlState, ""));
-        state.mode = "javascript";
-      }
-      else if (/^style$/i.test(state.htmlState.context.tagName)) {
-        state.token = css;
-        state.localState = cssMode.startState(htmlMode.indent(state.htmlState, ""));
-        state.mode = "css";
-      }
-    }
-    return style;
-  }
-  function maybeBackup(stream, pat, style) {
-    var cur = stream.current();
-    var close = cur.search(pat);
-    if (close > -1) stream.backUp(cur.length - close);
-    return style;
-  }
-  function javascript(stream, state) {
-    if (stream.match(/^<\/\s*script\s*>/i, false)) {
-      state.token = html;
-      state.curState = null;
-      state.mode = "html";
-      return html(stream, state);
-    }
-    return maybeBackup(stream, /<\/\s*script\s*>/,
-                       jsMode.token(stream, state.localState));
-  }
-  function css(stream, state) {
-    if (stream.match(/^<\/\s*style\s*>/i, false)) {
-      state.token = html;
-      state.localState = null;
-      state.mode = "html";
-      return html(stream, state);
-    }
-    return maybeBackup(stream, /<\/\s*style\s*>/,
-                       cssMode.token(stream, state.localState));
-  }
-
-  return {
-    startState: function() {
-      var state = htmlMode.startState();
-      return {token: html, localState: null, mode: "html", htmlState: state};
-    },
-
-    copyState: function(state) {
-      if (state.localState)
-        var local = CodeMirror.copyState(state.token == css ? cssMode : jsMode, state.localState);
-      return {token: state.token, localState: local, mode: state.mode,
-              htmlState: CodeMirror.copyState(htmlMode, state.htmlState)};
-    },
-
-    token: function(stream, state) {
-      return state.token(stream, state);
-    },
-
-    indent: function(state, textAfter) {
-      if (state.token == html || /^\s*<\//.test(textAfter))
-        return htmlMode.indent(state.htmlState, textAfter);
-      else if (state.token == javascript)
-        return jsMode.indent(state.localState, textAfter);
-      else
-        return cssMode.indent(state.localState, textAfter);
-    },
-
-    electricChars: "/{}:"
-  }
-});
-
-CodeMirror.defineMIME("text/html", "htmlmixed");
diff --git a/js/codemirror/mode/htmlmixed/index.html b/js/codemirror/mode/htmlmixed/index.html
deleted file mode 100644
index 6d62b355..00000000
--- a/js/codemirror/mode/htmlmixed/index.html
+++ /dev/null
@@ -1,52 +0,0 @@
-<!doctype html>
-<html>
-  <head>
-    <title>CodeMirror 2: HTML mixed mode</title>
-    <link rel="stylesheet" href="../../lib/codemirror.css">
-    <script src="../../lib/codemirror.js"></script>
-    <script src="../xml/xml.js"></script>
-    <script src="../javascript/javascript.js"></script>
-    <script src="../css/css.js"></script>
-    <link rel="stylesheet" href="../../theme/default.css">
-    <script src="htmlmixed.js"></script>
-    <link rel="stylesheet" href="../../css/docs.css">
-    <style>.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
-  </head>
-  <body>
-    <h1>CodeMirror 2: HTML mixed mode</h1>
-    <form><textarea id="code" name="code">
-<html style="color: green">
-  <!-- this is a comment -->
-  <head>
-    <title>Mixed HTML Example</title>
-    <style type="text/css">
-      h1 {font-family: comic sans; color: #f0f;}
-      div {background: yellow !important;}
-      body {
-        max-width: 50em;
-        margin: 1em 2em 1em 5em;
-      }
-    </style>
-  </head>
-  <body>
-    <h1>Mixed HTML Example</h1>
-    <script>
-      function jsFunc(arg1, arg2) {
-        if (arg1 && arg2) document.body.innerHTML = "achoo";
-      }
-    </script>
-  </body>
-</html>
-</textarea></form>
-    <script>
-      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {mode: "text/html", tabMode: "indent"});
-    </script>
-
-    <p>The HTML mixed mode depends on the XML, JavaScript, and CSS modes.</p>
-
-    <p><strong>MIME types defined:</strong> <code>text/html</code>
-    (redefined, only takes effect if you load this parser after the
-    XML parser).</p>
-
-  </body>
-</html>
diff --git a/js/codemirror/mode/javascript/index.html b/js/codemirror/mode/javascript/index.html
deleted file mode 100644
index 2454c818..00000000
--- a/js/codemirror/mode/javascript/index.html
+++ /dev/null
@@ -1,78 +0,0 @@
-<!doctype html>
-<html>
-  <head>
-    <title>CodeMirror 2: JavaScript mode</title>
-    <link rel="stylesheet" href="../../lib/codemirror.css">
-    <script src="../../lib/codemirror.js"></script>
-    <script src="javascript.js"></script>
-    <link rel="stylesheet" href="../../theme/default.css">
-    <link rel="stylesheet" href="../../css/docs.css">
-    <style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
-  </head>
-  <body>
-    <h1>CodeMirror 2: JavaScript mode</h1>
-
-<div><textarea id="code" name="code">
-// Demo code (the actual new parser character stream implementation)
-
-function StringStream(string) {
-  this.pos = 0;
-  this.string = string;
-}
-
-StringStream.prototype = {
-  done: function() {return this.pos >= this.string.length;},
-  peek: function() {return this.string.charAt(this.pos);},
-  next: function() {
-    if (this.pos &lt; this.string.length)
-      return this.string.charAt(this.pos++);
-  },
-  eat: function(match) {
-    var ch = this.string.charAt(this.pos);
-    if (typeof match == "string") var ok = ch == match;
-    else var ok = ch &amp;&amp; match.test ? match.test(ch) : match(ch);
-    if (ok) {this.pos++; return ch;}
-  },
-  eatWhile: function(match) {
-    var start = this.pos;
-    while (this.eat(match));
-    if (this.pos > start) return this.string.slice(start, this.pos);
-  },
-  backUp: function(n) {this.pos -= n;},
-  column: function() {return this.pos;},
-  eatSpace: function() {
-    var start = this.pos;
-    while (/\s/.test(this.string.charAt(this.pos))) this.pos++;
-    return this.pos - start;
-  },
-  match: function(pattern, consume, caseInsensitive) {
-    if (typeof pattern == "string") {
-      function cased(str) {return caseInsensitive ? str.toLowerCase() : str;}
-      if (cased(this.string).indexOf(cased(pattern), this.pos) == this.pos) {
-        if (consume !== false) this.pos += str.length;
-        return true;
-      }
-    }
-    else {
-      var match = this.string.slice(this.pos).match(pattern);
-      if (match &amp;&amp; consume !== false) this.pos += match[0].length;
-      return match;
-    }
-  }
-};
-</textarea></div>
-
-    <script>
-      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
-        lineNumbers: true,
-        matchBrackets: true
-      });
-    </script>
-
-    <p>JavaScript mode supports a single configuration
-    option, <code>json</code>, which will set the mode to expect JSON
-    data rather than a JavaScript program.</p>
-
-    <p><strong>MIME types defined:</strong> <code>text/javascript</code>, <code>application/json</code>.</p>
-  </body>
-</html>
diff --git a/js/codemirror/mode/javascript/javascript.js b/js/codemirror/mode/javascript/javascript.js
deleted file mode 100644
index bdf99525..00000000
--- a/js/codemirror/mode/javascript/javascript.js
+++ /dev/null
@@ -1,348 +0,0 @@
-CodeMirror.defineMode("javascript", function(config, parserConfig) {
-  var indentUnit = config.indentUnit;
-  var jsonMode = parserConfig.json;
-
-  // Tokenizer
-
-  var keywords = function(){
-    function kw(type) {return {type: type, style: "keyword"};}
-    var A = kw("keyword a"), B = kw("keyword b"), C = kw("keyword c");
-    var operator = kw("operator"), atom = {type: "atom", style: "atom"};
-    return {
-      "if": A, "while": A, "with": A, "else": B, "do": B, "try": B, "finally": B,
-      "return": C, "break": C, "continue": C, "new": C, "delete": C, "throw": C,
-      "var": kw("var"), "function": kw("function"), "catch": kw("catch"),
-      "for": kw("for"), "switch": kw("switch"), "case": kw("case"), "default": kw("default"),
-      "in": operator, "typeof": operator, "instanceof": operator,
-      "true": atom, "false": atom, "null": atom, "undefined": atom, "NaN": atom, "Infinity": atom
-    };
-  }();
-
-  var isOperatorChar = /[+\-*&%=<>!?|]/;
-
-  function chain(stream, state, f) {
-    state.tokenize = f;
-    return f(stream, state);
-  }
-
-  function nextUntilUnescaped(stream, end) {
-    var escaped = false, next;
-    while ((next = stream.next()) != null) {
-      if (next == end && !escaped)
-        return false;
-      escaped = !escaped && next == "\\";
-    }
-    return escaped;
-  }
-
-  // Used as scratch variables to communicate multiple values without
-  // consing up tons of objects.
-  var type, content;
-  function ret(tp, style, cont) {
-    type = tp; content = cont;
-    return style;
-  }
-
-  function jsTokenBase(stream, state) {
-    var ch = stream.next();
-    if (ch == '"' || ch == "'")
-      return chain(stream, state, jsTokenString(ch));
-    else if (/[\[\]{}\(\),;\:\.]/.test(ch))
-      return ret(ch);
-    else if (ch == "0" && stream.eat(/x/i)) {
-      stream.eatWhile(/[\da-f]/i);
-      return ret("number", "number");
-    }      
-    else if (/\d/.test(ch)) {
-      stream.match(/^\d*(?:\.\d*)?(?:e[+\-]?\d+)?/);
-      return ret("number", "number");
-    }
-    else if (ch == "/") {
-      if (stream.eat("*")) {
-        return chain(stream, state, jsTokenComment);
-      }
-      else if (stream.eat("/")) {
-        stream.skipToEnd();
-        return ret("comment", "comment");
-      }
-      else if (state.reAllowed) {
-        nextUntilUnescaped(stream, "/");
-        stream.eatWhile(/[gimy]/); // 'y' is "sticky" option in Mozilla
-        return ret("regexp", "string");
-      }
-      else {
-        stream.eatWhile(isOperatorChar);
-        return ret("operator", null, stream.current());
-      }
-    }
-    else if (isOperatorChar.test(ch)) {
-      stream.eatWhile(isOperatorChar);
-      return ret("operator", null, stream.current());
-    }
-    else {
-      stream.eatWhile(/[\w\$_]/);
-      var word = stream.current(), known = keywords.propertyIsEnumerable(word) && keywords[word];
-      return known ? ret(known.type, known.style, word) :
-                     ret("variable", "variable", word);
-    }
-  }
-
-  function jsTokenString(quote) {
-    return function(stream, state) {
-      if (!nextUntilUnescaped(stream, quote))
-        state.tokenize = jsTokenBase;
-      return ret("string", "string");
-    };
-  }
-
-  function jsTokenComment(stream, state) {
-    var maybeEnd = false, ch;
-    while (ch = stream.next()) {
-      if (ch == "/" && maybeEnd) {
-        state.tokenize = jsTokenBase;
-        break;
-      }
-      maybeEnd = (ch == "*");
-    }
-    return ret("comment", "comment");
-  }
-
-  // Parser
-
-  var atomicTypes = {"atom": true, "number": true, "variable": true, "string": true, "regexp": true};
-
-  function JSLexical(indented, column, type, align, prev, info) {
-    this.indented = indented;
-    this.column = column;
-    this.type = type;
-    this.prev = prev;
-    this.info = info;
-    if (align != null) this.align = align;
-  }
-
-  function inScope(state, varname) {
-    for (var v = state.localVars; v; v = v.next)
-      if (v.name == varname) return true;
-  }
-
-  function parseJS(state, style, type, content, stream) {
-    var cc = state.cc;
-    // Communicate our context to the combinators.
-    // (Less wasteful than consing up a hundred closures on every call.)
-    cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc;
-  
-    if (!state.lexical.hasOwnProperty("align"))
-      state.lexical.align = true;
-
-    while(true) {
-      var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement;
-      if (combinator(type, content)) {
-        while(cc.length && cc[cc.length - 1].lex)
-          cc.pop()();
-        if (cx.marked) return cx.marked;
-        if (type == "variable" && inScope(state, content)) return "variable-2";
-        return style;
-      }
-    }
-  }
-
-  // Combinator utils
-
-  var cx = {state: null, column: null, marked: null, cc: null};
-  function pass() {
-    for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]);
-  }
-  function cont() {
-    pass.apply(null, arguments);
-    return true;
-  }
-  function register(varname) {
-    var state = cx.state;
-    if (state.context) {
-      cx.marked = "def";
-      for (var v = state.localVars; v; v = v.next)
-        if (v.name == varname) return;
-      state.localVars = {name: varname, next: state.localVars};
-    }
-  }
-
-  // Combinators
-
-  var defaultVars = {name: "this", next: {name: "arguments"}};
-  function pushcontext() {
-    if (!cx.state.context) cx.state.localVars = defaultVars;
-    cx.state.context = {prev: cx.state.context, vars: cx.state.localVars};
-  }
-  function popcontext() {
-    cx.state.localVars = cx.state.context.vars;
-    cx.state.context = cx.state.context.prev;
-  }
-  function pushlex(type, info) {
-    var result = function() {
-      var state = cx.state;
-      state.lexical = new JSLexical(state.indented, cx.stream.column(), type, null, state.lexical, info)
-    };
-    result.lex = true;
-    return result;
-  }
-  function poplex() {
-    var state = cx.state;
-    if (state.lexical.prev) {
-      if (state.lexical.type == ")")
-        state.indented = state.lexical.indented;
-      state.lexical = state.lexical.prev;
-    }
-  }
-  poplex.lex = true;
-
-  function expect(wanted) {
-    return function expecting(type) {
-      if (type == wanted) return cont();
-      else if (wanted == ";") return pass();
-      else return cont(arguments.callee);
-    };
-  }
-
-  function statement(type) {
-    if (type == "var") return cont(pushlex("vardef"), vardef1, expect(";"), poplex);
-    if (type == "keyword a") return cont(pushlex("form"), expression, statement, poplex);
-    if (type == "keyword b") return cont(pushlex("form"), statement, poplex);
-    if (type == "{") return cont(pushlex("}"), block, poplex);
-    if (type == ";") return cont();
-    if (type == "function") return cont(functiondef);
-    if (type == "for") return cont(pushlex("form"), expect("("), pushlex(")"), forspec1, expect(")"),
-                                      poplex, statement, poplex);
-    if (type == "variable") return cont(pushlex("stat"), maybelabel);
-    if (type == "switch") return cont(pushlex("form"), expression, pushlex("}", "switch"), expect("{"),
-                                         block, poplex, poplex);
-    if (type == "case") return cont(expression, expect(":"));
-    if (type == "default") return cont(expect(":"));
-    if (type == "catch") return cont(pushlex("form"), pushcontext, expect("("), funarg, expect(")"),
-                                        statement, poplex, popcontext);
-    return pass(pushlex("stat"), expression, expect(";"), poplex);
-  }
-  function expression(type) {
-    if (atomicTypes.hasOwnProperty(type)) return cont(maybeoperator);
-    if (type == "function") return cont(functiondef);
-    if (type == "keyword c") return cont(expression);
-    if (type == "(") return cont(pushlex(")"), expression, expect(")"), poplex, maybeoperator);
-    if (type == "operator") return cont(expression);
-    if (type == "[") return cont(pushlex("]"), commasep(expression, "]"), poplex, maybeoperator);
-    if (type == "{") return cont(pushlex("}"), commasep(objprop, "}"), poplex, maybeoperator);
-    return cont();
-  }
-  function maybeoperator(type, value) {
-    if (type == "operator" && /\+\+|--/.test(value)) return cont(maybeoperator);
-    if (type == "operator") return cont(expression);
-    if (type == ";") return;
-    if (type == "(") return cont(pushlex(")"), commasep(expression, ")"), poplex, maybeoperator);
-    if (type == ".") return cont(property, maybeoperator);
-    if (type == "[") return cont(pushlex("]"), expression, expect("]"), poplex, maybeoperator);
-  }
-  function maybelabel(type) {
-    if (type == ":") return cont(poplex, statement);
-    return pass(maybeoperator, expect(";"), poplex);
-  }
-  function property(type) {
-    if (type == "variable") {cx.marked = "property"; return cont();}
-  }
-  function objprop(type) {
-    if (type == "variable") cx.marked = "property";
-    if (atomicTypes.hasOwnProperty(type)) return cont(expect(":"), expression);
-  }
-  function commasep(what, end) {
-    function proceed(type) {
-      if (type == ",") return cont(what, proceed);
-      if (type == end) return cont();
-      return cont(expect(end));
-    }
-    return function commaSeparated(type) {
-      if (type == end) return cont();
-      else return pass(what, proceed);
-    };
-  }
-  function block(type) {
-    if (type == "}") return cont();
-    return pass(statement, block);
-  }
-  function vardef1(type, value) {
-    if (type == "variable"){register(value); return cont(vardef2);}
-    return cont();
-  }
-  function vardef2(type, value) {
-    if (value == "=") return cont(expression, vardef2);
-    if (type == ",") return cont(vardef1);
-  }
-  function forspec1(type) {
-    if (type == "var") return cont(vardef1, forspec2);
-    if (type == ";") return pass(forspec2);
-    if (type == "variable") return cont(formaybein);
-    return pass(forspec2);
-  }
-  function formaybein(type, value) {
-    if (value == "in") return cont(expression);
-    return cont(maybeoperator, forspec2);
-  }
-  function forspec2(type, value) {
-    if (type == ";") return cont(forspec3);
-    if (value == "in") return cont(expression);
-    return cont(expression, expect(";"), forspec3);
-  }
-  function forspec3(type) {
-    if (type != ")") cont(expression);
-  }
-  function functiondef(type, value) {
-    if (type == "variable") {register(value); return cont(functiondef);}
-    if (type == "(") return cont(pushlex(")"), pushcontext, commasep(funarg, ")"), poplex, statement, popcontext);
-  }
-  function funarg(type, value) {
-    if (type == "variable") {register(value); return cont();}
-  }
-
-  // Interface
-
-  return {
-    startState: function(basecolumn) {
-      return {
-        tokenize: jsTokenBase,
-        reAllowed: true,
-        cc: [],
-        lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, "block", false),
-        localVars: null,
-        context: null,
-        indented: 0
-      };
-    },
-
-    token: function(stream, state) {
-      if (stream.sol()) {
-        if (!state.lexical.hasOwnProperty("align"))
-          state.lexical.align = false;
-        state.indented = stream.indentation();
-      }
-      if (stream.eatSpace()) return null;
-      var style = state.tokenize(stream, state);
-      if (type == "comment") return style;
-      state.reAllowed = type == "operator" || type == "keyword c" || type.match(/^[\[{}\(,;:]$/);
-      return parseJS(state, style, type, content, stream);
-    },
-
-    indent: function(state, textAfter) {
-      if (state.tokenize != jsTokenBase) return 0;
-      var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical,
-          type = lexical.type, closing = firstChar == type;
-      if (type == "vardef") return lexical.indented + 4;
-      else if (type == "form" && firstChar == "{") return lexical.indented;
-      else if (type == "stat" || type == "form") return lexical.indented + indentUnit;
-      else if (lexical.info == "switch" && !closing)
-        return lexical.indented + (/^(?:case|default)\b/.test(textAfter) ? indentUnit : 2 * indentUnit);
-      else if (lexical.align) return lexical.column + (closing ? 0 : 1);
-      else return lexical.indented + (closing ? 0 : indentUnit);
-    },
-
-    electricChars: ":{}"
-  };
-});
-
-CodeMirror.defineMIME("text/javascript", "javascript");
-CodeMirror.defineMIME("application/json", {name: "javascript", json: true});
diff --git a/js/codemirror/mode/lua/index.html b/js/codemirror/mode/lua/index.html
deleted file mode 100644
index 532973a8..00000000
--- a/js/codemirror/mode/lua/index.html
+++ /dev/null
@@ -1,72 +0,0 @@
-<!doctype html>
-<html>
-  <head>
-    <title>CodeMirror 2: Lua mode</title>
-    <link rel="stylesheet" href="../../lib/codemirror.css">
-    <script src="../../lib/codemirror.js"></script>
-    <script src="lua.js"></script>
-    <link rel="stylesheet" href="../../theme/neat.css">
-    <style>.CodeMirror {border: 1px solid black;}</style>
-    <link rel="stylesheet" href="../../css/docs.css">
-  </head>
-  <body>
-    <h1>CodeMirror 2: Lua mode</h1>
-    <form><textarea id="code" name="code">
---[[
-example useless code to show lua syntax highlighting
-this is multiline comment
-]]
-
-function blahblahblah(x)
-
-  local table = {
-    "asd" = 123,
-    "x" = 0.34,  
-  }
-  if x ~= 3 then
-    print( x )
-  elseif x == "string"
-    my_custom_function( 0x34 )
-  else
-    unknown_function( "some string" )
-  end
-
-  --single line comment
-  
-end
-
-function blablabla3()
-
-  for k,v in ipairs( table ) do
-    --abcde..
-    y=[=[
-  x=[[
-      x is a multi line string
-   ]]
-  but its definition is iside a highest level string!
-  ]=]
-    print(" \"\" ")
-
-    s = math.sin( x )
-  end
-
-end
-</textarea></form>
-    <script>
-      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
-        tabMode: "indent",
-        matchBrackets: true,
-        theme: "neat"
-      });
-    </script>
-
-    <p>Loosely based on Franciszek
-    Wawrzak's <a href="http://codemirror.net/1/contrib/lua">CodeMirror
-    1 mode</a>. One configuration parameter is
-    supported, <code>specials</code>, to which you can provide an
-    array of strings to have those identifiers highlighted with
-    the <code>lua-special</code> style.</p>
-    <p><strong>MIME types defined:</strong> <code>text/x-lua</code>.</p>
-
-  </body>
-</html>
diff --git a/js/codemirror/mode/lua/lua.js b/js/codemirror/mode/lua/lua.js
deleted file mode 100644
index 491ad59a..00000000
--- a/js/codemirror/mode/lua/lua.js
+++ /dev/null
@@ -1,138 +0,0 @@
-// LUA mode. Ported to CodeMirror 2 from Franciszek Wawrzak's
-// CodeMirror 1 mode.
-// highlights keywords, strings, comments (no leveling supported! ("[==[")), tokens, basic indenting
- 
-CodeMirror.defineMode("lua", function(config, parserConfig) {
-  var indentUnit = config.indentUnit;
-
-  function prefixRE(words) {
-    return new RegExp("^(?:" + words.join("|") + ")", "i");
-  }
-  function wordRE(words) {
-    return new RegExp("^(?:" + words.join("|") + ")$", "i");
-  }
-  var specials = wordRE(parserConfig.specials || []);
- 
-  // long list of standard functions from lua manual
-  var builtins = wordRE([
-    "_G","_VERSION","assert","collectgarbage","dofile","error","getfenv","getmetatable","ipairs","load",
-    "loadfile","loadstring","module","next","pairs","pcall","print","rawequal","rawget","rawset","require",
-    "select","setfenv","setmetatable","tonumber","tostring","type","unpack","xpcall",
-
-    "coroutine.create","coroutine.resume","coroutine.running","coroutine.status","coroutine.wrap","coroutine.yield",
-
-    "debug.debug","debug.getfenv","debug.gethook","debug.getinfo","debug.getlocal","debug.getmetatable",
-    "debug.getregistry","debug.getupvalue","debug.setfenv","debug.sethook","debug.setlocal","debug.setmetatable",
-    "debug.setupvalue","debug.traceback",
-
-    "close","flush","lines","read","seek","setvbuf","write",
-
-    "io.close","io.flush","io.input","io.lines","io.open","io.output","io.popen","io.read","io.stderr","io.stdin",
-    "io.stdout","io.tmpfile","io.type","io.write",
-
-    "math.abs","math.acos","math.asin","math.atan","math.atan2","math.ceil","math.cos","math.cosh","math.deg",
-    "math.exp","math.floor","math.fmod","math.frexp","math.huge","math.ldexp","math.log","math.log10","math.max",
-    "math.min","math.modf","math.pi","math.pow","math.rad","math.random","math.randomseed","math.sin","math.sinh",
-    "math.sqrt","math.tan","math.tanh",
-
-    "os.clock","os.date","os.difftime","os.execute","os.exit","os.getenv","os.remove","os.rename","os.setlocale",
-    "os.time","os.tmpname",
-
-    "package.cpath","package.loaded","package.loaders","package.loadlib","package.path","package.preload",
-    "package.seeall",
-
-    "string.byte","string.char","string.dump","string.find","string.format","string.gmatch","string.gsub",
-    "string.len","string.lower","string.match","string.rep","string.reverse","string.sub","string.upper",
-
-    "table.concat","table.insert","table.maxn","table.remove","table.sort"
-  ]);
-  var keywords = wordRE(["and","break","elseif","false","nil","not","or","return",
-			 "true","function", "end", "if", "then", "else", "do", 
-			 "while", "repeat", "until", "for", "in", "local" ]);
-
-  var indentTokens = wordRE(["function", "if","repeat","for","while", "\\(", "{"]);
-  var dedentTokens = wordRE(["end", "until", "\\)", "}"]);
-  var dedentPartial = prefixRE(["end", "until", "\\)", "}", "else", "elseif"]);
-
-  function readBracket(stream) {
-    var level = 0;
-    while (stream.eat("=")) ++level;
-    stream.eat("[");
-    return level;
-  }
-
-  function normal(stream, state) {
-    var ch = stream.next();
-    if (ch == "-" && stream.eat("-")) {
-      if (stream.eat("["))
-        return (state.cur = bracketed(readBracket(stream), "comment"))(stream, state);
-      stream.skipToEnd();
-      return "comment";
-    } 
-    if (ch == "\"" || ch == "'")
-      return (state.cur = string(ch))(stream, state);
-    if (ch == "[" && /[\[=]/.test(stream.peek()))
-      return (state.cur = bracketed(readBracket(stream), "string"))(stream, state);
-    if (/\d/.test(ch)) {
-      stream.eatWhile(/[\w.%]/);
-      return "number";
-    }
-    if (/[\w_]/.test(ch)) {
-      stream.eatWhile(/[\w\\\-_.]/);
-      return "variable";
-    }
-    return null;
-  }
-
-  function bracketed(level, style) {
-    return function(stream, state) {
-      var curlev = null, ch;
-      while ((ch = stream.next()) != null) {
-        if (curlev == null) {if (ch == "]") curlev = 0;}
-        else if (ch == "=") ++curlev;
-        else if (ch == "]" && curlev == level) { state.cur = normal; break; }
-        else curlev = null;
-      }
-      return style;
-    };
-  }
-
-  function string(quote) {
-    return function(stream, state) {
-      var escaped = false, ch;
-      while ((ch = stream.next()) != null) {
-        if (ch == quote && !escaped) break;
-        escaped = !escaped && ch == "\\";
-      }
-      if (!escaped) state.cur = normal;
-      return "string";
-    };
-  }
-    
-  return {
-    startState: function(basecol) {
-      return {basecol: basecol || 0, indentDepth: 0, cur: normal};
-    },
-
-    tok