codemirror-rails 2.24 → 2.32

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 (90) hide show
  1. data/.gitignore +1 -0
  2. data/Rakefile +19 -0
  3. data/codemirror-rails.gemspec +6 -1
  4. data/lib/codemirror/rails/version.rb +2 -2
  5. data/test/dummy/README.rdoc +261 -0
  6. data/test/dummy/Rakefile +7 -0
  7. data/test/dummy/app/assets/javascripts/application.js +15 -0
  8. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  9. data/test/dummy/app/controllers/application_controller.rb +3 -0
  10. data/test/dummy/app/helpers/application_helper.rb +2 -0
  11. data/test/dummy/app/mailers/.gitkeep +0 -0
  12. data/test/dummy/app/models/.gitkeep +0 -0
  13. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  14. data/test/dummy/config.ru +4 -0
  15. data/test/dummy/config/application.rb +56 -0
  16. data/test/dummy/config/boot.rb +10 -0
  17. data/test/dummy/config/environment.rb +5 -0
  18. data/test/dummy/config/environments/development.rb +37 -0
  19. data/test/dummy/config/environments/production.rb +67 -0
  20. data/test/dummy/config/environments/test.rb +37 -0
  21. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  22. data/test/dummy/config/initializers/inflections.rb +15 -0
  23. data/test/dummy/config/initializers/mime_types.rb +5 -0
  24. data/test/dummy/config/initializers/secret_token.rb +7 -0
  25. data/test/dummy/config/initializers/session_store.rb +8 -0
  26. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  27. data/test/dummy/config/locales/en.yml +5 -0
  28. data/test/dummy/config/routes.rb +58 -0
  29. data/test/dummy/lib/assets/.gitkeep +0 -0
  30. data/test/dummy/log/.gitkeep +0 -0
  31. data/test/dummy/public/404.html +26 -0
  32. data/test/dummy/public/422.html +26 -0
  33. data/test/dummy/public/500.html +25 -0
  34. data/test/dummy/public/favicon.ico +0 -0
  35. data/test/dummy/script/rails +6 -0
  36. data/test/integration/codemirror_rails_integration_test.rb +13 -0
  37. data/test/test_helper.rb +13 -0
  38. data/vendor/assets/javascripts/codemirror.js +381 -197
  39. data/vendor/assets/javascripts/codemirror/keymaps/emacs.js +1 -1
  40. data/vendor/assets/javascripts/codemirror/keymaps/vim.js +649 -94
  41. data/vendor/assets/javascripts/codemirror/modes/clike.js +53 -7
  42. data/vendor/assets/javascripts/codemirror/modes/coffeescript.js +12 -7
  43. data/vendor/assets/javascripts/codemirror/modes/diff.js +24 -5
  44. data/vendor/assets/javascripts/codemirror/modes/ecl.js +2 -2
  45. data/vendor/assets/javascripts/codemirror/modes/erlang.js +463 -0
  46. data/vendor/assets/javascripts/codemirror/modes/gfm.js +38 -2
  47. data/vendor/assets/javascripts/codemirror/modes/go.js +1 -1
  48. data/vendor/assets/javascripts/codemirror/modes/groovy.js +1 -1
  49. data/vendor/assets/javascripts/codemirror/modes/haxe.js +432 -0
  50. data/vendor/assets/javascripts/codemirror/modes/javascript.js +1 -1
  51. data/vendor/assets/javascripts/codemirror/modes/less.js +93 -93
  52. data/vendor/assets/javascripts/codemirror/modes/markdown.js +29 -6
  53. data/vendor/assets/javascripts/codemirror/modes/mysql.js +6 -8
  54. data/vendor/assets/javascripts/codemirror/modes/ocaml.js +114 -0
  55. data/vendor/assets/javascripts/codemirror/modes/pascal.js +1 -1
  56. data/vendor/assets/javascripts/codemirror/modes/pig.js +2 -2
  57. data/vendor/assets/javascripts/codemirror/modes/plsql.js +2 -2
  58. data/vendor/assets/javascripts/codemirror/modes/python.js +13 -16
  59. data/vendor/assets/javascripts/codemirror/modes/ruby.js +3 -8
  60. data/vendor/assets/javascripts/codemirror/modes/scheme.js +74 -46
  61. data/vendor/assets/javascripts/codemirror/modes/shell.js +22 -7
  62. data/vendor/assets/javascripts/codemirror/modes/stex.js +7 -5
  63. data/vendor/assets/javascripts/codemirror/modes/tiddlywiki.js +14 -14
  64. data/vendor/assets/javascripts/codemirror/modes/vb.js +260 -0
  65. data/vendor/assets/javascripts/codemirror/modes/verilog.js +1 -1
  66. data/vendor/assets/javascripts/codemirror/modes/xml.js +2 -1
  67. data/vendor/assets/javascripts/codemirror/modes/xquery.js +3 -3
  68. data/vendor/assets/javascripts/codemirror/utils/closetag.js +24 -34
  69. data/vendor/assets/javascripts/codemirror/utils/dialog.js +5 -1
  70. data/vendor/assets/javascripts/codemirror/utils/foldcode.js +10 -5
  71. data/vendor/assets/javascripts/codemirror/utils/formatting.js +8 -3
  72. data/vendor/assets/javascripts/codemirror/utils/loadmode.js +2 -1
  73. data/vendor/assets/javascripts/codemirror/utils/match-highlighter.js +1 -1
  74. data/vendor/assets/javascripts/codemirror/utils/multiplex.js +81 -0
  75. data/vendor/assets/javascripts/codemirror/utils/overlay.js +2 -1
  76. data/vendor/assets/javascripts/codemirror/utils/pig-hint.js +123 -0
  77. data/vendor/assets/javascripts/codemirror/utils/search.js +16 -12
  78. data/vendor/assets/javascripts/codemirror/utils/searchcursor.js +1 -1
  79. data/vendor/assets/javascripts/codemirror/utils/simple-hint.js +4 -0
  80. data/vendor/assets/javascripts/codemirror/utils/xml-hint.js +137 -0
  81. data/vendor/assets/stylesheets/codemirror.css +59 -4
  82. data/vendor/assets/stylesheets/codemirror/modes/tiddlywiki.css +14 -21
  83. data/vendor/assets/stylesheets/codemirror/themes/ambiance.css +1 -2
  84. data/vendor/assets/stylesheets/codemirror/themes/erlang-dark.css +21 -0
  85. data/vendor/assets/stylesheets/codemirror/themes/lesser-dark.css +2 -3
  86. data/vendor/assets/stylesheets/codemirror/themes/night.css +1 -1
  87. data/vendor/assets/stylesheets/codemirror/themes/vibrant-ink.css +27 -0
  88. data/vendor/assets/stylesheets/codemirror/utils/dialog.css +4 -0
  89. metadata +98 -5
  90. data/vendor/assets/javascripts/codemirror/modes/rpm-spec.css +0 -5
@@ -54,7 +54,7 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
54
54
  stream.eatWhile(/[\da-f]/i);
55
55
  return ret("number", "number");
56
56
  }
57
- else if (/\d/.test(ch)) {
57
+ else if (/\d/.test(ch) || ch == "-" && stream.eat(/\d/)) {
58
58
  stream.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/);
59
59
  return ret("number", "number");
60
60
  }
@@ -1,26 +1,26 @@
1
1
  /*
2
- LESS mode - http://www.lesscss.org/
3
- Ported to CodeMirror by Peter Kroon
2
+ LESS mode - http://www.lesscss.org/
3
+ Ported to CodeMirror by Peter Kroon
4
4
  */
5
5
 
6
- CodeMirror.defineMode("css", function(config) {
6
+ CodeMirror.defineMode("less", function(config) {
7
7
  var indentUnit = config.indentUnit, type;
8
8
  function ret(style, tp) {type = tp; return style;}
9
9
  //html5 tags
10
10
  var tags = ["a","abbr","acronym","address","applet","area","article","aside","audio","b","base","basefont","bdi","bdo","big","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","command","datalist","dd","del","details","dfn","dir","div","dl","dt","em","embed","fieldset","figcaption","figure","font","footer","form","frame","frameset","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","keygen","kbd","label","legend","li","link","map","mark","menu","meta","meter","nav","noframes","noscript","object","ol","optgroup","option","output","p","param","pre","progress","q","rp","rt","ruby","s","samp","script","section","select","small","source","span","strike","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","title","tr","track","tt","u","ul","var","video","wbr"];
11
11
 
12
12
  function inTagsArray(val){
13
- for(var i=0; i<tags.length; i++){
14
- if(val === tags[i]){
15
- return true;
16
- }
17
- }
13
+ for(var i=0; i<tags.length; i++){
14
+ if(val === tags[i]){
15
+ return true;
16
+ }
17
+ }
18
18
  }
19
19
 
20
20
  function tokenBase(stream, state) {
21
21
  var ch = stream.next();
22
22
 
23
- if (ch == "@") {stream.eatWhile(/[\w\-]/); return ret("meta", stream.current());}
23
+ if (ch == "@") {stream.eatWhile(/[\w\-]/); return ret("meta", stream.current());}
24
24
  else if (ch == "/" && stream.eat("*")) {
25
25
  state.tokenize = tokenCComment;
26
26
  return tokenCComment(stream, state);
@@ -35,15 +35,15 @@ CodeMirror.defineMode("css", function(config) {
35
35
  state.tokenize = tokenString(ch);
36
36
  return state.tokenize(stream, state);
37
37
  }
38
- else if (ch == "/") { // lesscss e.g.: .png will not be parsed as a class
39
- if(stream.eat("/")){
40
- state.tokenize = tokenSComment
41
- return tokenSComment(stream, state);
42
- }else{
43
- stream.eatWhile(/[\a-zA-Z0-9\-_.\s]/);
44
- if(/\/|\)|#/.test(stream.peek() || stream.eol() || (stream.eatSpace() && stream.peek() == ")")))return ret("string", "string");//let url(/images/logo.png) without quotes return as string
38
+ else if (ch == "/") { // lesscss e.g.: .png will not be parsed as a class
39
+ if(stream.eat("/")){
40
+ state.tokenize = tokenSComment;
41
+ return tokenSComment(stream, state);
42
+ }else{
43
+ stream.eatWhile(/[\a-zA-Z0-9\-_.\s]/);
44
+ if(/\/|\)|#/.test(stream.peek() || stream.eol() || (stream.eatSpace() && stream.peek() == ")")))return ret("string", "string");//let url(/images/logo.png) without quotes return as string
45
45
  return ret("number", "unit");
46
- }
46
+ }
47
47
  }
48
48
  else if (ch == "!") {
49
49
  stream.match(/^\s*\w*/);
@@ -58,93 +58,93 @@ CodeMirror.defineMode("css", function(config) {
58
58
  }
59
59
  else if (/[;{}:\[\]()]/.test(ch)) { //added () char for lesscss original was [;{}:\[\]]
60
60
  if(ch == ":"){
61
- stream.eatWhile(/[active|hover|link|visited]/);
62
- if( stream.current().match(/active|hover|link|visited/)){
63
- return ret("tag", "tag");
64
- }else{
65
- return ret(null, ch);
66
- }
67
- }else{
68
- return ret(null, ch);
69
- }
61
+ stream.eatWhile(/[active|hover|link|visited]/);
62
+ if( stream.current().match(/active|hover|link|visited/)){
63
+ return ret("tag", "tag");
64
+ }else{
65
+ return ret(null, ch);
66
+ }
67
+ }else{
68
+ return ret(null, ch);
69
+ }
70
70
  }
71
- else if (ch == ".") { // lesscss
72
- stream.eatWhile(/[\a-zA-Z0-9\-_]/);
71
+ else if (ch == ".") { // lesscss
72
+ stream.eatWhile(/[\a-zA-Z0-9\-_]/);
73
73
  return ret("tag", "tag");
74
74
  }
75
- else if (ch == "#") { // lesscss
76
- //we don't eat white-space, we want the hex color and or id only
77
- stream.eatWhile(/[A-Za-z0-9]/);
78
- //check if there is a proper hex color length e.g. #eee || #eeeEEE
79
- if(stream.current().length ===4 || stream.current().length ===7){
80
- if(stream.current().match(/[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}/,false) != null){//is there a valid hex color value present in the current stream
81
- //when not a valid hex value, parse as id
82
- if(stream.current().substring(1) != stream.current().match(/[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}/,false))return ret("atom", "tag");
83
- //eat white-space
84
- stream.eatSpace();
85
- //when hex value declaration doesn't end with [;,] but is does with a slash/cc comment treat it as an id, just like the other hex values that don't end with[;,]
86
- if( /[\/<>.(){!$%^&*_\-\\?=+\|#'~`]/.test(stream.peek()) )return ret("atom", "tag");
87
- //#time { color: #aaa }
88
- else if(stream.peek() == "}" )return ret("number", "unit");
89
- //we have a valid hex color value, parse as id whenever an element/class is defined after the hex(id) value e.g. #eee aaa || #eee .aaa
90
- else if( /[a-zA-Z\\]/.test(stream.peek()) )return ret("atom", "tag");
91
- //when a hex value is on the end of a line, parse as id
92
- else if(stream.eol())return ret("atom", "tag");
93
- //default
94
- else return ret("number", "unit");
95
- }else{//when not a valid hexvalue in the current stream e.g. #footer
96
- stream.eatWhile(/[\w\\\-]/);
97
- return ret("atom", "tag");
98
- }
99
- }else{
100
- stream.eatWhile(/[\w\\\-]/);
101
- return ret("atom", "tag");
102
- }
75
+ else if (ch == "#") { // lesscss
76
+ //we don't eat white-space, we want the hex color and or id only
77
+ stream.eatWhile(/[A-Za-z0-9]/);
78
+ //check if there is a proper hex color length e.g. #eee || #eeeEEE
79
+ if(stream.current().length ===4 || stream.current().length ===7){
80
+ if(stream.current().match(/[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}/,false) != null){//is there a valid hex color value present in the current stream
81
+ //when not a valid hex value, parse as id
82
+ if(stream.current().substring(1) != stream.current().match(/[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}/,false))return ret("atom", "tag");
83
+ //eat white-space
84
+ stream.eatSpace();
85
+ //when hex value declaration doesn't end with [;,] but is does with a slash/cc comment treat it as an id, just like the other hex values that don't end with[;,]
86
+ if( /[\/<>.(){!$%^&*_\-\\?=+\|#'~`]/.test(stream.peek()) )return ret("atom", "tag");
87
+ //#time { color: #aaa }
88
+ else if(stream.peek() == "}" )return ret("number", "unit");
89
+ //we have a valid hex color value, parse as id whenever an element/class is defined after the hex(id) value e.g. #eee aaa || #eee .aaa
90
+ else if( /[a-zA-Z\\]/.test(stream.peek()) )return ret("atom", "tag");
91
+ //when a hex value is on the end of a line, parse as id
92
+ else if(stream.eol())return ret("atom", "tag");
93
+ //default
94
+ else return ret("number", "unit");
95
+ }else{//when not a valid hexvalue in the current stream e.g. #footer
96
+ stream.eatWhile(/[\w\\\-]/);
97
+ return ret("atom", "tag");
98
+ }
99
+ }else{
100
+ stream.eatWhile(/[\w\\\-]/);
101
+ return ret("atom", "tag");
102
+ }
103
+ }
104
+ else if (ch == "&") {
105
+ stream.eatWhile(/[\w\-]/);
106
+ return ret(null, ch);
103
107
  }
104
- else if (ch == "&") {
105
- stream.eatWhile(/[\w\-]/);
106
- return ret(null, ch);
107
- }
108
108
  else {
109
109
  stream.eatWhile(/[\w\\\-_%.{]/);
110
- if(stream.current().match(/http|https/) != null){
111
- stream.eatWhile(/[\w\\\-_%.{:\/]/);
112
- return ret("string", "string");
113
- }else if(stream.peek() == "<" || stream.peek() == ">"){
114
- return ret("tag", "tag");
115
- }else if( stream.peek().match(/\(/) != null ){// lessc
116
- return ret(null, ch);
117
- }else if (stream.peek() == "/" && state.stack[state.stack.length-1] != undefined){ // url(dir/center/image.png)
118
- return ret("string", "string");
119
- }else if( stream.current().match(/\-\d|\-.\d/) ){ // lesscss match e.g.: -5px -0.4 etc... only colorize the minus sign
120
- //stream.backUp(stream.current().length-1); //commment out these 2 comment if you want the minus sign to be parsed as null -500px
121
- //return ret(null, ch);
122
- return ret("number", "unit");
123
- }else if( inTagsArray(stream.current()) ){ // lesscss match html tags
124
- return ret("tag", "tag");
125
- }else if( /\/|[\s\)]/.test(stream.peek() || stream.eol() || (stream.eatSpace() && stream.peek() == "/")) && stream.current().indexOf(".") !== -1){
126
- if(stream.current().substring(stream.current().length-1,stream.current().length) == "{"){
127
- stream.backUp(1);
128
- return ret("tag", "tag");
129
- }//end if
130
- if( (stream.eatSpace() && stream.peek().match(/[{<>.a-zA-Z]/) != null) || stream.eol() )return ret("tag", "tag");//e.g. button.icon-plus
131
- return ret("string", "string");//let url(/images/logo.png) without quotes return as string
132
- }else if( stream.eol() ){
133
- if(stream.current().substring(stream.current().length-1,stream.current().length) == "{")stream.backUp(1);
134
- return ret("tag", "tag");
135
- }else{
110
+ if(stream.current().match(/http|https/) != null){
111
+ stream.eatWhile(/[\w\\\-_%.{:\/]/);
112
+ return ret("string", "string");
113
+ }else if(stream.peek() == "<" || stream.peek() == ">"){
114
+ return ret("tag", "tag");
115
+ }else if( stream.peek().match(/\(/) != null ){// lessc
116
+ return ret(null, ch);
117
+ }else if (stream.peek() == "/" && state.stack[state.stack.length-1] != undefined){ // url(dir/center/image.png)
118
+ return ret("string", "string");
119
+ }else if( stream.current().match(/\-\d|\-.\d/) ){ // lesscss match e.g.: -5px -0.4 etc... only colorize the minus sign
120
+ //stream.backUp(stream.current().length-1); //commment out these 2 comment if you want the minus sign to be parsed as null -500px
121
+ //return ret(null, ch);
122
+ return ret("number", "unit");
123
+ }else if( inTagsArray(stream.current()) ){ // lesscss match html tags
124
+ return ret("tag", "tag");
125
+ }else if( /\/|[\s\)]/.test(stream.peek() || stream.eol() || (stream.eatSpace() && stream.peek() == "/")) && stream.current().indexOf(".") !== -1){
126
+ if(stream.current().substring(stream.current().length-1,stream.current().length) == "{"){
127
+ stream.backUp(1);
128
+ return ret("tag", "tag");
129
+ }//end if
130
+ if( (stream.eatSpace() && stream.peek().match(/[{<>.a-zA-Z]/) != null) || stream.eol() )return ret("tag", "tag");//e.g. button.icon-plus
131
+ return ret("string", "string");//let url(/images/logo.png) without quotes return as string
132
+ }else if( stream.eol() ){
133
+ if(stream.current().substring(stream.current().length-1,stream.current().length) == "{")stream.backUp(1);
134
+ return ret("tag", "tag");
135
+ }else{
136
136
  return ret("variable", "variable");
137
- }
137
+ }
138
138
  }
139
139
 
140
140
  }
141
141
 
142
142
  function tokenSComment(stream, state) {// SComment = Slash comment
143
143
  stream.skipToEnd();
144
- state.tokenize = tokenBase;
144
+ state.tokenize = tokenBase;
145
145
  return ret("comment", "comment");
146
146
  }
147
-
147
+
148
148
  function tokenCComment(stream, state) {
149
149
  var maybeEnd = false, ch;
150
150
  while ((ch = stream.next()) != null) {
@@ -198,10 +198,10 @@ CodeMirror.defineMode("css", function(config) {
198
198
  else if (style == "variable") {
199
199
  if (context == "rule") style = null; //"tag"
200
200
  else if (!context || context == "@media{"){
201
- style = stream.current() == "when" ? "variable" :
202
- stream.string.match(/#/g) != undefined ? null :
203
- /[\s,|\s\)]/.test(stream.peek()) ? "tag" : null;
204
- }
201
+ style = stream.current() == "when" ? "variable" :
202
+ stream.string.match(/#/g) != undefined ? null :
203
+ /[\s,|\s\)]/.test(stream.peek()) ? "tag" : null;
204
+ }
205
205
  }
206
206
 
207
207
  if (context == "rule" && /^[\{\};]$/.test(type))
@@ -1,6 +1,7 @@
1
1
  CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
2
2
 
3
- var htmlMode = CodeMirror.getMode(cmCfg, { name: 'xml', htmlMode: true });
3
+ var htmlFound = CodeMirror.mimeModes.hasOwnProperty("text/html");
4
+ var htmlMode = CodeMirror.getMode(cmCfg, htmlFound ? "text/html" : "text/plain");
4
5
 
5
6
  var header = 'header'
6
7
  , code = 'comment'
@@ -37,6 +38,10 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
37
38
  state.em = false;
38
39
  // Reset STRONG state
39
40
  state.strong = false;
41
+ if (!htmlFound && state.f == htmlBlock) {
42
+ state.f = inlineNormal;
43
+ state.block = blockNormal;
44
+ }
40
45
  return null;
41
46
  }
42
47
 
@@ -67,9 +72,14 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
67
72
 
68
73
  function htmlBlock(stream, state) {
69
74
  var style = htmlMode.token(stream, state.htmlState);
70
- if (style === 'tag' && state.htmlState.type !== 'openTag' && !state.htmlState.context) {
75
+ if (htmlFound && style === 'tag' && state.htmlState.type !== 'openTag' && !state.htmlState.context) {
76
+ state.f = inlineNormal;
77
+ state.block = blockNormal;
78
+ }
79
+ if (state.md_inside && stream.current().indexOf(">")!=-1) {
71
80
  state.f = inlineNormal;
72
81
  state.block = blockNormal;
82
+ state.htmlState.context = undefined;
73
83
  }
74
84
  return style;
75
85
  }
@@ -113,10 +123,22 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
113
123
  return switchInline(stream, state, linkText);
114
124
  }
115
125
  if (ch === '<' && stream.match(/^\w/, false)) {
126
+ var md_inside = false;
127
+ if (stream.string.indexOf(">")!=-1) {
128
+ var atts = stream.string.substring(1,stream.string.indexOf(">"));
129
+ if (/markdown\s*=\s*('|"){0,1}1('|"){0,1}/.test(atts)) {
130
+ state.md_inside = true;
131
+ }
132
+ }
116
133
  stream.backUp(1);
117
134
  return switchBlock(stream, state, htmlBlock);
118
135
  }
119
-
136
+
137
+ if (ch === '<' && stream.match(/^\/\w*?>/)) {
138
+ state.md_inside = false;
139
+ return "tag";
140
+ }
141
+
120
142
  var t = getType(state);
121
143
  if (ch === '*' || ch === '_') {
122
144
  if (stream.eat(ch)) {
@@ -188,7 +210,7 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
188
210
  f: blockNormal,
189
211
 
190
212
  block: blockNormal,
191
- htmlState: htmlMode.startState(),
213
+ htmlState: CodeMirror.startState(htmlMode),
192
214
  indentation: 0,
193
215
 
194
216
  inline: inlineNormal,
@@ -207,13 +229,14 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
207
229
  block: s.block,
208
230
  htmlState: CodeMirror.copyState(htmlMode, s.htmlState),
209
231
  indentation: s.indentation,
210
-
232
+
211
233
  inline: s.inline,
212
234
  text: s.text,
213
235
  em: s.em,
214
236
  strong: s.strong,
215
237
  header: s.header,
216
- quote: s.quote
238
+ quote: s.quote,
239
+ md_inside: s.md_inside
217
240
  };
218
241
  },
219
242
 
@@ -15,7 +15,7 @@ CodeMirror.defineMode("mysql", function(config) {
15
15
  var ops = wordRegexp(["str", "lang", "langmatches", "datatype", "bound", "sameterm", "isiri", "isuri",
16
16
  "isblank", "isliteral", "union", "a"]);
17
17
  var keywords = wordRegexp([
18
- ('ACCESSIBLE'),('ALTER'),('AS'),('BEFORE'),('BINARY'),('BY'),('CASE'),('CHARACTER'),('COLUMN'),('CONTINUE'),('CROSS'),('CURRENT_TIMESTAMP'),('DATABASE'),('DAY_MICROSECOND'),('DEC'),('DEFAULT'),
18
+ ('ACCESSIBLE'),('ALTER'),('AS'),('BEFORE'),('BINARY'),('BY'),('CASE'),('CHARACTER'),('COLUMN'),('CONTINUE'),('CROSS'),('CURRENT_TIMESTAMP'),('DATABASE'),('DAY_MICROSECOND'),('DEC'),('DEFAULT'),
19
19
  ('DESC'),('DISTINCT'),('DOUBLE'),('EACH'),('ENCLOSED'),('EXIT'),('FETCH'),('FLOAT8'),('FOREIGN'),('GRANT'),('HIGH_PRIORITY'),('HOUR_SECOND'),('IN'),('INNER'),('INSERT'),('INT2'),('INT8'),
20
20
  ('INTO'),('JOIN'),('KILL'),('LEFT'),('LINEAR'),('LOCALTIME'),('LONG'),('LOOP'),('MATCH'),('MEDIUMTEXT'),('MINUTE_SECOND'),('NATURAL'),('NULL'),('OPTIMIZE'),('OR'),('OUTER'),('PRIMARY'),
21
21
  ('RANGE'),('READ_WRITE'),('REGEXP'),('REPEAT'),('RESTRICT'),('RIGHT'),('SCHEMAS'),('SENSITIVE'),('SHOW'),('SPECIFIC'),('SQLSTATE'),('SQL_CALC_FOUND_ROWS'),('STARTING'),('TERMINATED'),
@@ -57,13 +57,11 @@ CodeMirror.defineMode("mysql", function(config) {
57
57
  return null;
58
58
  }
59
59
  else if (ch == "-") {
60
- ch2 = stream.next();
61
- if(ch2=="-")
62
- {
63
- stream.skipToEnd();
64
- return "comment";
65
- }
66
-
60
+ var ch2 = stream.next();
61
+ if (ch2=="-") {
62
+ stream.skipToEnd();
63
+ return "comment";
64
+ }
67
65
  }
68
66
  else if (operatorChars.test(ch)) {
69
67
  stream.eatWhile(operatorChars);
@@ -0,0 +1,114 @@
1
+ CodeMirror.defineMode('ocaml', function(config) {
2
+
3
+ var words = {
4
+ 'true': 'atom',
5
+ 'false': 'atom',
6
+ 'let': 'keyword',
7
+ 'rec': 'keyword',
8
+ 'in': 'keyword',
9
+ 'of': 'keyword',
10
+ 'and': 'keyword',
11
+ 'succ': 'keyword',
12
+ 'if': 'keyword',
13
+ 'then': 'keyword',
14
+ 'else': 'keyword',
15
+ 'for': 'keyword',
16
+ 'to': 'keyword',
17
+ 'while': 'keyword',
18
+ 'do': 'keyword',
19
+ 'done': 'keyword',
20
+ 'fun': 'keyword',
21
+ 'function': 'keyword',
22
+ 'val': 'keyword',
23
+ 'type': 'keyword',
24
+ 'mutable': 'keyword',
25
+ 'match': 'keyword',
26
+ 'with': 'keyword',
27
+ 'try': 'keyword',
28
+ 'raise': 'keyword',
29
+ 'begin': 'keyword',
30
+ 'end': 'keyword',
31
+ 'open': 'builtin',
32
+ 'trace': 'builtin',
33
+ 'ignore': 'builtin',
34
+ 'exit': 'builtin',
35
+ 'print_string': 'builtin',
36
+ 'print_endline': 'builtin'
37
+ };
38
+
39
+ function tokenBase(stream, state) {
40
+ var sol = stream.sol();
41
+ var ch = stream.next();
42
+
43
+ if (ch === '"') {
44
+ state.tokenize = tokenString;
45
+ return state.tokenize(stream, state);
46
+ }
47
+ if (ch === '(') {
48
+ if (stream.eat('*')) {
49
+ state.commentLevel++;
50
+ state.tokenize = tokenComment;
51
+ return state.tokenize(stream, state);
52
+ }
53
+ }
54
+ if (ch === '~') {
55
+ stream.eatWhile(/\w/);
56
+ return 'variable-2';
57
+ }
58
+ if (ch === '`') {
59
+ stream.eatWhile(/\w/);
60
+ return 'quote';
61
+ }
62
+ if (/\d/.test(ch)) {
63
+ stream.eatWhile(/[\d]/);
64
+ if (stream.eat('.')) {
65
+ stream.eatWhile(/[\d]/);
66
+ }
67
+ return 'number';
68
+ }
69
+ if ( /[+\-*&%=<>!?|]/.test(ch)) {
70
+ return 'operator';
71
+ }
72
+ stream.eatWhile(/\w/);
73
+ var cur = stream.current();
74
+ return words[cur] || 'variable';
75
+ }
76
+
77
+ function tokenString(stream, state) {
78
+ var next, end = false, escaped = false;
79
+ while ((next = stream.next()) != null) {
80
+ if (next === '"' && !escaped) {
81
+ end = true;
82
+ break;
83
+ }
84
+ escaped = !escaped && next === '\\';
85
+ }
86
+ if (end && !escaped) {
87
+ state.tokenize = tokenBase;
88
+ }
89
+ return 'string';
90
+ };
91
+
92
+ function tokenComment(stream, state) {
93
+ var prev, next;
94
+ while(state.commentLevel > 0 && (next = stream.next()) != null) {
95
+ if (prev === '(' && next === '*') state.commentLevel++;
96
+ if (prev === '*' && next === ')') state.commentLevel--;
97
+ prev = next;
98
+ }
99
+ if (state.commentLevel <= 0) {
100
+ state.tokenize = tokenBase;
101
+ }
102
+ return 'comment';
103
+ }
104
+
105
+ return {
106
+ startState: function() {return {tokenize: tokenBase, commentLevel: 0}},
107
+ token: function(stream, state) {
108
+ if (stream.eatSpace()) return null;
109
+ return state.tokenize(stream, state);
110
+ }
111
+ };
112
+ });
113
+
114
+ CodeMirror.defineMIME('text/x-ocaml', 'ocaml');