codemirror-rails 5.3 → 5.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. checksums.yaml +4 -4
  2. data/lib/codemirror/rails/version.rb +2 -2
  3. data/vendor/assets/javascripts/codemirror.js +26 -36
  4. data/vendor/assets/javascripts/codemirror/addons/edit/continuelist.js +4 -4
  5. data/vendor/assets/javascripts/codemirror/addons/hint/sql-hint.js +3 -3
  6. data/vendor/assets/javascripts/codemirror/addons/runmode/runmode.node.js +69 -11
  7. data/vendor/assets/javascripts/codemirror/addons/tern/tern.js +4 -2
  8. data/vendor/assets/javascripts/codemirror/keymaps/vim.js +24 -3
  9. data/vendor/assets/javascripts/codemirror/modes/clike.js +60 -25
  10. data/vendor/assets/javascripts/codemirror/modes/elm.js +205 -0
  11. data/vendor/assets/javascripts/codemirror/modes/factor.js +83 -0
  12. data/vendor/assets/javascripts/codemirror/modes/groovy.js +8 -5
  13. data/vendor/assets/javascripts/codemirror/modes/javascript.js +5 -2
  14. data/vendor/assets/javascripts/codemirror/modes/kotlin.js +5 -2
  15. data/vendor/assets/javascripts/codemirror/modes/markdown.js +37 -23
  16. data/vendor/assets/javascripts/codemirror/modes/php.js +20 -17
  17. data/vendor/assets/javascripts/codemirror/modes/python.js +1 -1
  18. data/vendor/assets/javascripts/codemirror/modes/swift.js +203 -0
  19. data/vendor/assets/javascripts/codemirror/modes/twig.js +132 -0
  20. data/vendor/assets/javascripts/codemirror/modes/vb.js +2 -1
  21. data/vendor/assets/stylesheets/codemirror.css +9 -9
  22. data/vendor/assets/stylesheets/codemirror/themes/ambiance.css +3 -2
  23. data/vendor/assets/stylesheets/codemirror/themes/erlang-dark.css +1 -1
  24. data/vendor/assets/stylesheets/codemirror/themes/lesser-dark.css +2 -2
  25. data/vendor/assets/stylesheets/codemirror/themes/monokai.css +1 -0
  26. data/vendor/assets/stylesheets/codemirror/themes/solarized.css +2 -2
  27. data/vendor/assets/stylesheets/codemirror/themes/ttcn.css +9 -10
  28. metadata +6 -2
@@ -0,0 +1,205 @@
1
+ // CodeMirror, copyright (c) by Marijn Haverbeke and others
2
+ // Distributed under an MIT license: http://codemirror.net/LICENSE
3
+
4
+ (function(mod) {
5
+ if (typeof exports == "object" && typeof module == "object") // CommonJS
6
+ mod(require("../../lib/codemirror"));
7
+ else if (typeof define == "function" && define.amd) // AMD
8
+ define(["../../lib/codemirror"], mod);
9
+ else // Plain browser env
10
+ mod(CodeMirror);
11
+ })(function(CodeMirror) {
12
+ "use strict";
13
+
14
+ CodeMirror.defineMode("elm", function() {
15
+
16
+ function switchState(source, setState, f) {
17
+ setState(f);
18
+ return f(source, setState);
19
+ }
20
+
21
+ // These should all be Unicode extended, as per the Haskell 2010 report
22
+ var smallRE = /[a-z_]/;
23
+ var largeRE = /[A-Z]/;
24
+ var digitRE = /[0-9]/;
25
+ var hexitRE = /[0-9A-Fa-f]/;
26
+ var octitRE = /[0-7]/;
27
+ var idRE = /[a-z_A-Z0-9\']/;
28
+ var symbolRE = /[-!#$%&*+.\/<=>?@\\^|~:\u03BB\u2192]/;
29
+ var specialRE = /[(),;[\]`{}]/;
30
+ var whiteCharRE = /[ \t\v\f]/; // newlines are handled in tokenizer
31
+
32
+ function normal() {
33
+ return function (source, setState) {
34
+ if (source.eatWhile(whiteCharRE)) {
35
+ return null;
36
+ }
37
+
38
+ var ch = source.next();
39
+ if (specialRE.test(ch)) {
40
+ if (ch == '{' && source.eat('-')) {
41
+ var t = "comment";
42
+ if (source.eat('#')) t = "meta";
43
+ return switchState(source, setState, ncomment(t, 1));
44
+ }
45
+ return null;
46
+ }
47
+
48
+ if (ch == '\'') {
49
+ if (source.eat('\\'))
50
+ source.next(); // should handle other escapes here
51
+ else
52
+ source.next();
53
+
54
+ if (source.eat('\''))
55
+ return "string";
56
+ return "error";
57
+ }
58
+
59
+ if (ch == '"') {
60
+ return switchState(source, setState, stringLiteral);
61
+ }
62
+
63
+ if (largeRE.test(ch)) {
64
+ source.eatWhile(idRE);
65
+ if (source.eat('.'))
66
+ return "qualifier";
67
+ return "variable-2";
68
+ }
69
+
70
+ if (smallRE.test(ch)) {
71
+ var isDef = source.pos === 1;
72
+ source.eatWhile(idRE);
73
+ return isDef ? "variable-3" : "variable";
74
+ }
75
+
76
+ if (digitRE.test(ch)) {
77
+ if (ch == '0') {
78
+ if (source.eat(/[xX]/)) {
79
+ source.eatWhile(hexitRE); // should require at least 1
80
+ return "integer";
81
+ }
82
+ if (source.eat(/[oO]/)) {
83
+ source.eatWhile(octitRE); // should require at least 1
84
+ return "number";
85
+ }
86
+ }
87
+ source.eatWhile(digitRE);
88
+ var t = "number";
89
+ if (source.eat('.')) {
90
+ t = "number";
91
+ source.eatWhile(digitRE); // should require at least 1
92
+ }
93
+ if (source.eat(/[eE]/)) {
94
+ t = "number";
95
+ source.eat(/[-+]/);
96
+ source.eatWhile(digitRE); // should require at least 1
97
+ }
98
+ return t;
99
+ }
100
+
101
+ if (symbolRE.test(ch)) {
102
+ if (ch == '-' && source.eat(/-/)) {
103
+ source.eatWhile(/-/);
104
+ if (!source.eat(symbolRE)) {
105
+ source.skipToEnd();
106
+ return "comment";
107
+ }
108
+ }
109
+ source.eatWhile(symbolRE);
110
+ return "builtin";
111
+ }
112
+
113
+ return "error";
114
+ }
115
+ }
116
+
117
+ function ncomment(type, nest) {
118
+ if (nest == 0) {
119
+ return normal();
120
+ }
121
+ return function(source, setState) {
122
+ var currNest = nest;
123
+ while (!source.eol()) {
124
+ var ch = source.next();
125
+ if (ch == '{' && source.eat('-')) {
126
+ ++currNest;
127
+ } else if (ch == '-' && source.eat('}')) {
128
+ --currNest;
129
+ if (currNest == 0) {
130
+ setState(normal());
131
+ return type;
132
+ }
133
+ }
134
+ }
135
+ setState(ncomment(type, currNest));
136
+ return type;
137
+ }
138
+ }
139
+
140
+ function stringLiteral(source, setState) {
141
+ while (!source.eol()) {
142
+ var ch = source.next();
143
+ if (ch == '"') {
144
+ setState(normal());
145
+ return "string";
146
+ }
147
+ if (ch == '\\') {
148
+ if (source.eol() || source.eat(whiteCharRE)) {
149
+ setState(stringGap);
150
+ return "string";
151
+ }
152
+ if (!source.eat('&')) source.next(); // should handle other escapes here
153
+ }
154
+ }
155
+ setState(normal());
156
+ return "error";
157
+ }
158
+
159
+ function stringGap(source, setState) {
160
+ if (source.eat('\\')) {
161
+ return switchState(source, setState, stringLiteral);
162
+ }
163
+ source.next();
164
+ setState(normal());
165
+ return "error";
166
+ }
167
+
168
+
169
+ var wellKnownWords = (function() {
170
+ var wkw = {};
171
+
172
+ var keywords = [
173
+ "case", "of", "as",
174
+ "if", "then", "else",
175
+ "let", "in",
176
+ "infix", "infixl", "infixr",
177
+ "type", "alias",
178
+ "input", "output", "foreign", "loopback",
179
+ "module", "where", "import", "exposing",
180
+ "_", "..", "|", ":", "=", "\\", "\"", "->", "<-"
181
+ ];
182
+
183
+ for (var i = keywords.length; i--;)
184
+ wkw[keywords[i]] = "keyword";
185
+
186
+ return wkw;
187
+ })();
188
+
189
+
190
+
191
+ return {
192
+ startState: function () { return { f: normal() }; },
193
+ copyState: function (s) { return { f: s.f }; },
194
+
195
+ token: function(stream, state) {
196
+ var t = state.f(stream, function(s) { state.f = s; });
197
+ var w = stream.current();
198
+ return (wellKnownWords.hasOwnProperty(w)) ? wellKnownWords[w] : t;
199
+ }
200
+ };
201
+
202
+ });
203
+
204
+ CodeMirror.defineMIME("text/x-elm", "elm");
205
+ })();
@@ -0,0 +1,83 @@
1
+ // CodeMirror, copyright (c) by Marijn Haverbeke and others
2
+ // Distributed under an MIT license: http://codemirror.net/LICENSE
3
+
4
+ // Factor syntax highlight - simple mode
5
+ //
6
+ // by Dimage Sapelkin (https://github.com/kerabromsmu)
7
+
8
+ (function(mod) {
9
+ if (typeof exports == "object" && typeof module == "object") // CommonJS
10
+ mod(require("../../lib/codemirror"), require("../../addon/mode/simple"));
11
+ else if (typeof define == "function" && define.amd) // AMD
12
+ define(["../../lib/codemirror", "../../addon/mode/simple"], mod);
13
+ else // Plain browser env
14
+ mod(CodeMirror);
15
+ })(function(CodeMirror) {
16
+ "use strict";
17
+
18
+ CodeMirror.defineSimpleMode("factor", {
19
+ // The start state contains the rules that are intially used
20
+ start: [
21
+ // comments
22
+ {regex: /#?!.*/, token: "comment"},
23
+ // strings """, multiline --> state
24
+ {regex: /"""/, token: "string", next: "string3"},
25
+ {regex: /"/, token: "string", next: "string"},
26
+ // numbers: dec, hex, unicode, bin, fractional, complex
27
+ {regex: /(?:[+-]?)(?:0x[\d,a-f]+)|(?:0o[0-7]+)|(?:0b[0,1]+)|(?:\d+.?\d*)/, token: "number"},
28
+ //{regex: /[+-]?/} //fractional
29
+ // definition: defining word, defined word, etc
30
+ {regex: /(\:)(\s+)(\S+)(\s+)(\()/, token: ["keyword", null, "def", null, "keyword"], next: "stack"},
31
+ // vocabulary using --> state
32
+ {regex: /USING\:/, token: "keyword", next: "vocabulary"},
33
+ // vocabulary definition/use
34
+ {regex: /(USE\:|IN\:)(\s+)(\S+)/, token: ["keyword", null, "variable-2"]},
35
+ // <constructors>
36
+ {regex: /<\S+>/, token: "builtin"},
37
+ // "keywords", incl. ; t f . [ ] { } defining words
38
+ {regex: /;|t|f|if|\.|\[|\]|\{|\}|MAIN:/, token: "keyword"},
39
+ // any id (?)
40
+ {regex: /\S+/, token: "variable"},
41
+
42
+ {
43
+ regex: /./,
44
+ token: null
45
+ }
46
+ ],
47
+ vocabulary: [
48
+ {regex: /;/, token: "keyword", next: "start"},
49
+ {regex: /\S+/, token: "variable-2"},
50
+ {
51
+ regex: /./,
52
+ token: null
53
+ }
54
+ ],
55
+ string: [
56
+ {regex: /(?:[^\\]|\\.)*?"/, token: "string", next: "start"},
57
+ {regex: /.*/, token: "string"}
58
+ ],
59
+ string3: [
60
+ {regex: /(?:[^\\]|\\.)*?"""/, token: "string", next: "start"},
61
+ {regex: /.*/, token: "string"}
62
+ ],
63
+ stack: [
64
+ {regex: /\)/, token: "meta", next: "start"},
65
+ {regex: /--/, token: "meta"},
66
+ {regex: /\S+/, token: "variable-3"},
67
+ {
68
+ regex: /./,
69
+ token: null
70
+ }
71
+ ],
72
+ // The meta property contains global information about the mode. It
73
+ // can contain properties like lineComment, which are supported by
74
+ // all modes, and also directives like dontIndentStates, which are
75
+ // specific to simple modes.
76
+ meta: {
77
+ dontIndentStates: ["start", "vocabulary", "string", "string3", "stack"],
78
+ lineComment: [ "!", "#!" ]
79
+ }
80
+ });
81
+
82
+ CodeMirror.defineMIME("text/x-factor", "factor");
83
+ });
@@ -24,6 +24,7 @@ CodeMirror.defineMode("groovy", function(config) {
24
24
  "short static strictfp super switch synchronized threadsafe throw throws transient " +
25
25
  "try void volatile while");
26
26
  var blockKeywords = words("catch class do else finally for if switch try while enum interface def");
27
+ var standaloneKeywords = words("return break continue");
27
28
  var atoms = words("null true false this");
28
29
 
29
30
  var curPunc;
@@ -50,7 +51,7 @@ CodeMirror.defineMode("groovy", function(config) {
50
51
  stream.skipToEnd();
51
52
  return "comment";
52
53
  }
53
- if (expectExpression(state.lastToken)) {
54
+ if (expectExpression(state.lastToken, false)) {
54
55
  return startString(ch, stream, state);
55
56
  }
56
57
  }
@@ -70,6 +71,7 @@ CodeMirror.defineMode("groovy", function(config) {
70
71
  if (atoms.propertyIsEnumerable(cur)) { return "atom"; }
71
72
  if (keywords.propertyIsEnumerable(cur)) {
72
73
  if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement";
74
+ else if (standaloneKeywords.propertyIsEnumerable(cur)) curPunc = "standalone";
73
75
  return "keyword";
74
76
  }
75
77
  return "variable";
@@ -132,9 +134,10 @@ CodeMirror.defineMode("groovy", function(config) {
132
134
  return "comment";
133
135
  }
134
136
 
135
- function expectExpression(last) {
137
+ function expectExpression(last, newline) {
136
138
  return !last || last == "operator" || last == "->" || /[\.\[\{\(,;:]/.test(last) ||
137
- last == "newstatement" || last == "keyword" || last == "proplabel";
139
+ last == "newstatement" || last == "keyword" || last == "proplabel" ||
140
+ (last == "standalone" && !newline);
138
141
  }
139
142
 
140
143
  function Context(indented, column, type, align, prev) {
@@ -174,7 +177,7 @@ CodeMirror.defineMode("groovy", function(config) {
174
177
  state.indented = stream.indentation();
175
178
  state.startOfLine = true;
176
179
  // Automatic semicolon insertion
177
- if (ctx.type == "statement" && !expectExpression(state.lastToken)) {
180
+ if (ctx.type == "statement" && !expectExpression(state.lastToken, true)) {
178
181
  popContext(state); ctx = state.context;
179
182
  }
180
183
  }
@@ -209,7 +212,7 @@ CodeMirror.defineMode("groovy", function(config) {
209
212
  indent: function(state, textAfter) {
210
213
  if (!state.tokenize[state.tokenize.length-1].isBase) return 0;
211
214
  var firstChar = textAfter && textAfter.charAt(0), ctx = state.context;
212
- if (ctx.type == "statement" && !expectExpression(state.lastToken)) ctx = ctx.prev;
215
+ if (ctx.type == "statement" && !expectExpression(state.lastToken, true)) ctx = ctx.prev;
213
216
  var closing = firstChar == ctx.type;
214
217
  if (ctx.type == "statement") return ctx.indented + (firstChar == "{" ? 0 : config.indentUnit);
215
218
  else if (ctx.align) return ctx.column + (closing ? 0 : 1);
@@ -482,8 +482,11 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
482
482
  function maybetype(type) {
483
483
  if (isTS && type == ":") return cont(typedef);
484
484
  }
485
+ function maybedefault(_, value) {
486
+ if (value == "=") return cont(expressionNoComma);
487
+ }
485
488
  function typedef(type) {
486
- if (type == "variable"){cx.marked = "variable-3"; return cont();}
489
+ if (type == "variable") {cx.marked = "variable-3"; return cont();}
487
490
  }
488
491
  function vardef() {
489
492
  return pass(pattern, maybetype, maybeAssign, vardefCont);
@@ -538,7 +541,7 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
538
541
  }
539
542
  function funarg(type) {
540
543
  if (type == "spread") return cont(funarg);
541
- return pass(pattern, maybetype);
544
+ return pass(pattern, maybetype, maybedefault);
542
545
  }
543
546
  function className(type, value) {
544
547
  if (type == "variable") {register(value); return cont(classNameAfter);}
@@ -21,7 +21,7 @@ CodeMirror.defineMode("kotlin", function (config, parserConfig) {
21
21
  var multiLineStrings = parserConfig.multiLineStrings;
22
22
 
23
23
  var keywords = words(
24
- "package continue return object while break class data trait throw super" +
24
+ "package continue return object while break class data trait interface throw super" +
25
25
  " when type this else This try val var fun for is in if do as true false null get set");
26
26
  var softKeywords = words("import" +
27
27
  " where by get set abstract enum open annotation override private public internal" +
@@ -272,7 +272,10 @@ CodeMirror.defineMode("kotlin", function (config, parserConfig) {
272
272
  },
273
273
 
274
274
  closeBrackets: {triples: "'\""},
275
- electricChars: "{}"
275
+ electricChars: "{}",
276
+ blockCommentStart: "/*",
277
+ blockCommentEnd: "*/",
278
+ lineComment: "//"
276
279
  };
277
280
  });
278
281
 
@@ -68,12 +68,12 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
68
68
  , strong = 'strong'
69
69
  , strikethrough = 'strikethrough';
70
70
 
71
- var hrRE = /^([*\-=_])(?:\s*\1){2,}\s*$/
71
+ var hrRE = /^([*\-_])(?:\s*\1){2,}\s*$/
72
72
  , ulRE = /^[*\-+]\s+/
73
- , olRE = /^[0-9]+\.\s+/
73
+ , olRE = /^[0-9]+([.)])\s+/
74
74
  , taskListRE = /^\[(x| )\](?=\s)/ // Must follow ulRE or olRE
75
- , atxHeaderRE = /^#+ ?/
76
- , setextHeaderRE = /^(?:\={1,}|-{1,})$/
75
+ , atxHeaderRE = /^(#+)(?: |$)/
76
+ , setextHeaderRE = /^ *(?:\={1,}|-{1,})\s*$/
77
77
  , textRE = /^[^#!\[\]*_\\<>` "'(~]+/;
78
78
 
79
79
  function switchInline(stream, state, f) {
@@ -100,6 +100,8 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
100
100
  state.strikethrough = false;
101
101
  // Reset state.quote
102
102
  state.quote = 0;
103
+ // Reset state.indentedCode
104
+ state.indentedCode = false;
103
105
  if (!htmlFound && state.f == htmlBlock) {
104
106
  state.f = inlineNormal;
105
107
  state.block = blockNormal;
@@ -116,7 +118,11 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
116
118
 
117
119
  var sol = stream.sol();
118
120
 
119
- var prevLineIsList = state.list !== false;
121
+ var prevLineIsList = state.list !== false,
122
+ prevLineIsIndentedCode = state.indentedCode;
123
+
124
+ state.indentedCode = false;
125
+
120
126
  if (prevLineIsList) {
121
127
  if (state.indentationDiff >= 0) { // Continued list
122
128
  if (state.indentationDiff < 4) { // Only adjust indentation if *not* a code block
@@ -134,23 +140,27 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
134
140
 
135
141
  var match = null;
136
142
  if (state.indentationDiff >= 4) {
137
- state.indentation -= 4;
138
143
  stream.skipToEnd();
139
- return code;
144
+ if (prevLineIsIndentedCode || !state.prevLineHasContent) {
145
+ state.indentation -= 4;
146
+ state.indentedCode = true;
147
+ return code;
148
+ } else {
149
+ return null;
150
+ }
140
151
  } else if (stream.eatSpace()) {
141
152
  return null;
142
- } else if (match = stream.match(atxHeaderRE)) {
143
- state.header = Math.min(6, match[0].indexOf(" ") !== -1 ? match[0].length - 1 : match[0].length);
153
+ } else if ((match = stream.match(atxHeaderRE)) && match[1].length <= 6) {
154
+ state.header = match[1].length;
144
155
  if (modeCfg.highlightFormatting) state.formatting = "header";
145
156
  state.f = state.inline;
146
157
  return getType(state);
147
- } else if (state.prevLineHasContent && (match = stream.match(setextHeaderRE))) {
158
+ } else if (state.prevLineHasContent && !state.quote && !prevLineIsList && !prevLineIsIndentedCode && (match = stream.match(setextHeaderRE))) {
148
159
  state.header = match[0].charAt(0) == '=' ? 1 : 2;
149
160
  if (modeCfg.highlightFormatting) state.formatting = "header";
150
161
  state.f = state.inline;
151
162
  return getType(state);
152
163
  } else if (stream.eat('>')) {
153
- state.indentation++;
154
164
  state.quote = sol ? 1 : state.quote + 1;
155
165
  if (modeCfg.highlightFormatting) state.formatting = "quote";
156
166
  stream.eatSpace();
@@ -158,6 +168,7 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
158
168
  } else if (stream.peek() === '[') {
159
169
  return switchInline(stream, state, footnoteLink);
160
170
  } else if (stream.match(hrRE, true)) {
171
+ state.hr = true;
161
172
  return hr;
162
173
  } else if ((!state.prevLineHasContent || prevLineIsList) && (stream.match(ulRE, false) || stream.match(olRE, false))) {
163
174
  var listType = null;
@@ -262,17 +273,16 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
262
273
  }
263
274
 
264
275
  if (state.linkHref) {
265
- styles.push(linkhref);
266
- return styles.length ? styles.join(' ') : null;
267
- }
276
+ styles.push(linkhref, "url");
277
+ } else { // Only apply inline styles to non-url text
278
+ if (state.strong) { styles.push(strong); }
279
+ if (state.em) { styles.push(em); }
280
+ if (state.strikethrough) { styles.push(strikethrough); }
268
281
 
269
- if (state.strong) { styles.push(strong); }
270
- if (state.em) { styles.push(em); }
271
- if (state.strikethrough) { styles.push(strikethrough); }
282
+ if (state.linkText) { styles.push(linktext); }
272
283
 
273
- if (state.linkText) { styles.push(linktext); }
274
-
275
- if (state.code) { styles.push(code); }
284
+ if (state.code) { styles.push(code); }
285
+ }
276
286
 
277
287
  if (state.header) { styles.push(header); styles.push(header + "-" + state.header); }
278
288
 
@@ -626,7 +636,7 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
626
636
  stream.match(/^(?:\s+(?:"(?:[^"\\]|\\\\|\\.)+"|'(?:[^'\\]|\\\\|\\.)+'|\((?:[^)\\]|\\\\|\\.)+\)))?/, true);
627
637
  }
628
638
  state.f = state.inline = inlineNormal;
629
- return linkhref;
639
+ return linkhref + " url";
630
640
  }
631
641
 
632
642
  var savedInlineRE = [];
@@ -663,6 +673,7 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
663
673
  em: false,
664
674
  strong: false,
665
675
  header: 0,
676
+ hr: false,
666
677
  taskList: false,
667
678
  list: false,
668
679
  listDepth: 0,
@@ -695,10 +706,12 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
695
706
  strong: s.strong,
696
707
  strikethrough: s.strikethrough,
697
708
  header: s.header,
709
+ hr: s.hr,
698
710
  taskList: s.taskList,
699
711
  list: s.list,
700
712
  listDepth: s.listDepth,
701
713
  quote: s.quote,
714
+ indentedCode: s.indentedCode,
702
715
  trailingSpace: s.trailingSpace,
703
716
  trailingSpaceNewLine: s.trailingSpaceNewLine,
704
717
  md_inside: s.md_inside
@@ -711,10 +724,11 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
711
724
  state.formatting = false;
712
725
 
713
726
  if (stream.sol()) {
714
- var forceBlankLine = !!state.header;
727
+ var forceBlankLine = !!state.header || state.hr;
715
728
 
716
- // Reset state.header
729
+ // Reset state.header and state.hr
717
730
  state.header = 0;
731
+ state.hr = false;
718
732
 
719
733
  if (stream.match(/^\s*$/, true) || forceBlankLine) {
720
734
  state.prevLineHasContent = false;