|
|
@@ -0,0 +1,70 @@
|
|
|
+// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
|
|
+// Distributed under an MIT license: http://codemirror.net/LICENSE
|
|
|
+
|
|
|
+(function(mod) {
|
|
|
+ if (typeof exports == "object" && typeof module == "object") // CommonJS
|
|
|
+ mod(require("codemirror/lib/codemirror"));
|
|
|
+ else if (typeof define == "function" && define.amd) // AMD
|
|
|
+ define(["codemirror/lib/codemirror"], mod);
|
|
|
+ else // Plain browser env
|
|
|
+ mod(CodeMirror);
|
|
|
+})(function(CodeMirror) {
|
|
|
+ "use strict";
|
|
|
+
|
|
|
+ var Pos = CodeMirror.Pos;
|
|
|
+ var listTokenRE = /^(\s*)(>[> ]*|[*+-] \[[x ]\]|[*+-]|(\d+)[.)])(\s*)$/;
|
|
|
+
|
|
|
+ function matchListToken(pos, cm) {
|
|
|
+ /* Get some info about the current state */
|
|
|
+ var eolState = cm.getStateAfter(pos.line);
|
|
|
+ var inList = eolState.list !== false;
|
|
|
+ var inQuote = eolState.quote !== 0;
|
|
|
+
|
|
|
+ /* Get the line from the start to where the cursor currently is */
|
|
|
+ var lineStart = cm.getRange(Pos(pos.line, 0), pos);
|
|
|
+
|
|
|
+ /* Matches the beginning of the list line with the list token RE */
|
|
|
+ var match = listTokenRE.exec(lineStart);
|
|
|
+
|
|
|
+ /* Not being in a list, or being in a list but not right after the list
|
|
|
+ * token, are both not considered a match */
|
|
|
+ if ((!inList && !inQuote) || !match)
|
|
|
+ return false
|
|
|
+ else
|
|
|
+ return true
|
|
|
+ }
|
|
|
+
|
|
|
+ CodeMirror.commands.autoIndentMarkdownList = function(cm) {
|
|
|
+ if (cm.getOption("disableInput")) return CodeMirror.Pass;
|
|
|
+ var ranges = cm.listSelections();
|
|
|
+ for (var i = 0; i < ranges.length; i++) {
|
|
|
+ var pos = ranges[i].head;
|
|
|
+
|
|
|
+ if (!ranges[i].empty() || !matchListToken(pos, cm)) {
|
|
|
+ /* If no match, call regular Tab handler */
|
|
|
+ cm.execCommand("defaultTab");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Select the whole list line and indent it by one unit */
|
|
|
+ cm.indentLine(pos.line, "add");
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ CodeMirror.commands.autoUnindentMarkdownList = function(cm) {
|
|
|
+ if (cm.getOption("disableInput")) return CodeMirror.Pass;
|
|
|
+ var ranges = cm.listSelections();
|
|
|
+ for (var i = 0; i < ranges.length; i++) {
|
|
|
+ var pos = ranges[i].head;
|
|
|
+
|
|
|
+ if (!ranges[i].empty() || !matchListToken(pos, cm)) {
|
|
|
+ /* If no match, call regular Shift-Tab handler */
|
|
|
+ cm.execCommand("indentAuto");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Select the whole list line and unindent it by one unit */
|
|
|
+ cm.indentLine(pos.line, "subtract");
|
|
|
+ }
|
|
|
+ };
|
|
|
+});
|