code_sync 0.6.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (213) hide show
  1. data/.rvmrc +1 -0
  2. data/CNAME +1 -0
  3. data/Gemfile +24 -0
  4. data/Gemfile.lock +117 -0
  5. data/LICENSE.md +22 -0
  6. data/ROADMAP.md +20 -0
  7. data/TODO.md +14 -0
  8. data/bin/codesync +11 -0
  9. data/code_sync.gemspec +30 -0
  10. data/config/routes.rb +26 -0
  11. data/lib/assets/javascripts/canvas.coffee +12 -0
  12. data/lib/assets/javascripts/canvas/editors.coffee +48 -0
  13. data/lib/assets/javascripts/canvas/index.coffee +15 -0
  14. data/lib/assets/javascripts/canvas/layer_controller.coffee +47 -0
  15. data/lib/assets/javascripts/code_sync.coffee +3 -0
  16. data/lib/assets/javascripts/code_sync/backends/gist.coffee +78 -0
  17. data/lib/assets/javascripts/code_sync/client/index.coffee +104 -0
  18. data/lib/assets/javascripts/code_sync/client/util.coffee +61 -0
  19. data/lib/assets/javascripts/code_sync/codemirror.coffee +12 -0
  20. data/lib/assets/javascripts/code_sync/config.js.coffee.erb +38 -0
  21. data/lib/assets/javascripts/code_sync/console/index.coffee +54 -0
  22. data/lib/assets/javascripts/code_sync/console/templates/console.jst.skim +10 -0
  23. data/lib/assets/javascripts/code_sync/dependencies.coffee +6 -0
  24. data/lib/assets/javascripts/code_sync/editor/advanced.coffee +0 -0
  25. data/lib/assets/javascripts/code_sync/editor/datasources/document.coffee +212 -0
  26. data/lib/assets/javascripts/code_sync/editor/datasources/gist_loader.coffee +7 -0
  27. data/lib/assets/javascripts/code_sync/editor/datasources/modes.coffee +117 -0
  28. data/lib/assets/javascripts/code_sync/editor/datasources/project_assets.coffee +14 -0
  29. data/lib/assets/javascripts/code_sync/editor/index.coffee +415 -0
  30. data/lib/assets/javascripts/code_sync/editor/plugins/asset_selector.coffee +106 -0
  31. data/lib/assets/javascripts/code_sync/editor/plugins/color_picker.coffee +83 -0
  32. data/lib/assets/javascripts/code_sync/editor/plugins/document_manager.coffee +55 -0
  33. data/lib/assets/javascripts/code_sync/editor/plugins/document_tabs.coffee +178 -0
  34. data/lib/assets/javascripts/code_sync/editor/plugins/element_sync.coffee +111 -0
  35. data/lib/assets/javascripts/code_sync/editor/plugins/keymap_selector.coffee +44 -0
  36. data/lib/assets/javascripts/code_sync/editor/plugins/mode_selector.coffee +53 -0
  37. data/lib/assets/javascripts/code_sync/editor/plugins/name_input.coffee +44 -0
  38. data/lib/assets/javascripts/code_sync/editor/plugins/preferences.coffee +71 -0
  39. data/lib/assets/javascripts/code_sync/editor/templates/asset_editor.jst.skim +2 -0
  40. data/lib/assets/javascripts/code_sync/editor/templates/asset_selector.jst.skim +5 -0
  41. data/lib/assets/javascripts/code_sync/editor/templates/document_manager_tab.jst.skim +15 -0
  42. data/lib/assets/javascripts/code_sync/editor/templates/element_sync.jst.skim +19 -0
  43. data/lib/assets/javascripts/code_sync/editor/templates/preferences_panel.jst.skim +38 -0
  44. data/lib/assets/javascripts/code_sync/editor/views/asset_selector.coffee +106 -0
  45. data/lib/assets/javascripts/code_sync/editor/views/color_picker.coffee +76 -0
  46. data/lib/assets/javascripts/code_sync/editor/views/document_manager.coffee +176 -0
  47. data/lib/assets/javascripts/code_sync/editor/views/keymap_selector.coffee +37 -0
  48. data/lib/assets/javascripts/code_sync/editor/views/mode_selector.coffee +47 -0
  49. data/lib/assets/javascripts/code_sync/editor/views/name_input.coffee +44 -0
  50. data/lib/assets/javascripts/code_sync/editor/views/preferences.coffee +71 -0
  51. data/lib/assets/javascripts/code_sync/index.coffee +4 -0
  52. data/lib/assets/javascripts/code_sync/reloader.coffee +2 -0
  53. data/lib/assets/javascripts/code_sync_basic.coffee +1 -0
  54. data/lib/assets/javascripts/demos.coffee +48 -0
  55. data/lib/assets/javascripts/demos/default-content.coffee +72 -0
  56. data/lib/assets/javascripts/demos/layout_selector.coffee +19 -0
  57. data/lib/assets/javascripts/demos/tour.coffee +70 -0
  58. data/lib/assets/javascripts/demos/tour.jst.skim +29 -0
  59. data/lib/assets/javascripts/marketing.coffee +0 -0
  60. data/lib/assets/javascripts/vendor/.DS_Store +0 -0
  61. data/lib/assets/javascripts/vendor/backbone-events.js +160 -0
  62. data/lib/assets/javascripts/vendor/backbone-min.js +4 -0
  63. data/lib/assets/javascripts/vendor/codemirror-coffeescript.js +346 -0
  64. data/lib/assets/javascripts/vendor/codemirror-css.js +570 -0
  65. data/lib/assets/javascripts/vendor/codemirror-haml.js +153 -0
  66. data/lib/assets/javascripts/vendor/codemirror-htmlmixed.js +104 -0
  67. data/lib/assets/javascripts/vendor/codemirror-javascript.js +468 -0
  68. data/lib/assets/javascripts/vendor/codemirror-markdown.js +526 -0
  69. data/lib/assets/javascripts/vendor/codemirror-ruby.js +194 -0
  70. data/lib/assets/javascripts/vendor/codemirror-sass.js +330 -0
  71. data/lib/assets/javascripts/vendor/codemirror-skim.js +330 -0
  72. data/lib/assets/javascripts/vendor/codemirror-vim.js +3159 -0
  73. data/lib/assets/javascripts/vendor/codemirror-xml.js +328 -0
  74. data/lib/assets/javascripts/vendor/console.js +339 -0
  75. data/lib/assets/javascripts/vendor/gisted.js +27 -0
  76. data/lib/assets/javascripts/vendor/jquery-ui-resize-drag.min.js +6 -0
  77. data/lib/assets/javascripts/vendor/jquery.js +5 -0
  78. data/lib/assets/javascripts/vendor/keylauncher.js +4 -0
  79. data/lib/assets/javascripts/vendor/keymaster.min.js +4 -0
  80. data/lib/assets/javascripts/vendor/spectrum.js +1868 -0
  81. data/lib/assets/javascripts/vendor/underscore-min.js +1 -0
  82. data/lib/assets/javascripts/vendor/underscore.string.min.js +1 -0
  83. data/lib/assets/javascripts/vendor/vendored_codemirror.js +5558 -0
  84. data/lib/assets/javascripts/vendor/zepto.js +2 -0
  85. data/lib/assets/stylesheets/canvas.css.scss +101 -0
  86. data/lib/assets/stylesheets/code_sync.css.scss +4 -0
  87. data/lib/assets/stylesheets/code_sync/codemirror.css +7 -0
  88. data/lib/assets/stylesheets/code_sync/console.css +86 -0
  89. data/lib/assets/stylesheets/code_sync/editor/asset-name-input.css.scss +12 -0
  90. data/lib/assets/stylesheets/code_sync/editor/asset-selector.css.scss +58 -0
  91. data/lib/assets/stylesheets/code_sync/editor/codesync-color-picker.css.sass +5 -0
  92. data/lib/assets/stylesheets/code_sync/editor/document-tabs.css.scss +61 -0
  93. data/lib/assets/stylesheets/code_sync/editor/element-sync.css.scss +72 -0
  94. data/lib/assets/stylesheets/code_sync/editor/mode-selector.css.scss +0 -0
  95. data/lib/assets/stylesheets/code_sync/editor/preferences-panel.css.scss +26 -0
  96. data/lib/assets/stylesheets/code_sync/index.css.scss +141 -0
  97. data/lib/assets/stylesheets/demos.css.scss +96 -0
  98. data/lib/assets/stylesheets/marketing.css.sass +46 -0
  99. data/lib/assets/stylesheets/marketing/syntax.css.scss +1 -0
  100. data/lib/assets/stylesheets/vendor/animate.css +1 -0
  101. data/lib/assets/stylesheets/vendor/codemirror-ambiance.css +75 -0
  102. data/lib/assets/stylesheets/vendor/codemirror-lesserdark.css +44 -0
  103. data/lib/assets/stylesheets/vendor/codemirror-monokai.css +28 -0
  104. data/lib/assets/stylesheets/vendor/codemirror-xq-light.css +43 -0
  105. data/lib/assets/stylesheets/vendor/grid-layout.css +1406 -0
  106. data/lib/assets/stylesheets/vendor/spectrum.css +481 -0
  107. data/lib/assets/stylesheets/vendor/vendored_codemirror.css +246 -0
  108. data/lib/code_sync.rb +41 -0
  109. data/lib/code_sync/cli.rb +73 -0
  110. data/lib/code_sync/manager.rb +238 -0
  111. data/lib/code_sync/processors.rb +18 -0
  112. data/lib/code_sync/processors/basic.rb +9 -0
  113. data/lib/code_sync/processors/jst_processor.rb +17 -0
  114. data/lib/code_sync/pry_console.rb +132 -0
  115. data/lib/code_sync/rails.rb +7 -0
  116. data/lib/code_sync/rails/engine.rb +12 -0
  117. data/lib/code_sync/server.rb +225 -0
  118. data/lib/code_sync/sprockets_adapter.rb +145 -0
  119. data/lib/code_sync/temp_asset.rb +20 -0
  120. data/lib/code_sync/version.rb +3 -0
  121. data/lib/middleman_extension.rb +43 -0
  122. data/readme.md +26 -0
  123. data/site/.gitignore +14 -0
  124. data/site/Gemfile +13 -0
  125. data/site/Gemfile.lock +183 -0
  126. data/site/config.rb +26 -0
  127. data/site/source/canvas.html.slim +21 -0
  128. data/site/source/codepen-style-demo.html.slim +21 -0
  129. data/site/source/demo.html.slim +30 -0
  130. data/site/source/index.html.slim +128 -0
  131. data/site/source/layouts/layout.slim +18 -0
  132. data/site/source/samples/_client.html.md +13 -0
  133. data/site/source/samples/_editor.html.md +19 -0
  134. data/site/source/samples/_hooks.html.md +8 -0
  135. data/site/source/samples/_middleman.html.md +7 -0
  136. data/site/source/samples/_rails.html.md +8 -0
  137. data/site/source/samples/_standalone.html.md +36 -0
  138. data/spec/lib/code_sync/sprockets_adapter_spec.rb +44 -0
  139. data/spec/spec_helper.rb +21 -0
  140. data/spec/support/.DS_Store +0 -0
  141. data/spec/support/dummy_middleman/.gitignore +14 -0
  142. data/spec/support/dummy_middleman/Gemfile +5 -0
  143. data/spec/support/dummy_middleman/Gemfile.lock +100 -0
  144. data/spec/support/dummy_middleman/config.rb +77 -0
  145. data/spec/support/dummy_middleman/source/images/background.png +0 -0
  146. data/spec/support/dummy_middleman/source/images/middleman.png +0 -0
  147. data/spec/support/dummy_middleman/source/index.html.erb +10 -0
  148. data/spec/support/dummy_middleman/source/javascripts/all.js +1 -0
  149. data/spec/support/dummy_middleman/source/layouts/layout.erb +19 -0
  150. data/spec/support/dummy_middleman/source/stylesheets/all.css +55 -0
  151. data/spec/support/dummy_middleman/source/stylesheets/normalize.css +375 -0
  152. data/spec/support/dummy_rails/.gitignore +15 -0
  153. data/spec/support/dummy_rails/Gemfile +38 -0
  154. data/spec/support/dummy_rails/Gemfile.lock +112 -0
  155. data/spec/support/dummy_rails/README.rdoc +261 -0
  156. data/spec/support/dummy_rails/Rakefile +7 -0
  157. data/spec/support/dummy_rails/app/assets/images/rails.png +0 -0
  158. data/spec/support/dummy_rails/app/assets/javascripts/application.js +15 -0
  159. data/spec/support/dummy_rails/app/assets/stylesheets/application.css +13 -0
  160. data/spec/support/dummy_rails/app/controllers/application_controller.rb +3 -0
  161. data/spec/support/dummy_rails/app/helpers/application_helper.rb +2 -0
  162. data/spec/support/dummy_rails/app/mailers/.gitkeep +0 -0
  163. data/spec/support/dummy_rails/app/models/.gitkeep +0 -0
  164. data/spec/support/dummy_rails/app/views/layouts/application.html.erb +14 -0
  165. data/spec/support/dummy_rails/config.ru +4 -0
  166. data/spec/support/dummy_rails/config/application.rb +62 -0
  167. data/spec/support/dummy_rails/config/boot.rb +6 -0
  168. data/spec/support/dummy_rails/config/database.yml +25 -0
  169. data/spec/support/dummy_rails/config/environment.rb +5 -0
  170. data/spec/support/dummy_rails/config/environments/development.rb +37 -0
  171. data/spec/support/dummy_rails/config/environments/production.rb +67 -0
  172. data/spec/support/dummy_rails/config/environments/test.rb +37 -0
  173. data/spec/support/dummy_rails/config/initializers/backtrace_silencers.rb +7 -0
  174. data/spec/support/dummy_rails/config/initializers/inflections.rb +15 -0
  175. data/spec/support/dummy_rails/config/initializers/mime_types.rb +5 -0
  176. data/spec/support/dummy_rails/config/initializers/secret_token.rb +7 -0
  177. data/spec/support/dummy_rails/config/initializers/session_store.rb +8 -0
  178. data/spec/support/dummy_rails/config/initializers/wrap_parameters.rb +14 -0
  179. data/spec/support/dummy_rails/config/locales/en.yml +5 -0
  180. data/spec/support/dummy_rails/config/routes.rb +58 -0
  181. data/spec/support/dummy_rails/db/seeds.rb +7 -0
  182. data/spec/support/dummy_rails/doc/README_FOR_APP +2 -0
  183. data/spec/support/dummy_rails/lib/assets/.gitkeep +0 -0
  184. data/spec/support/dummy_rails/lib/tasks/.gitkeep +0 -0
  185. data/spec/support/dummy_rails/log/.gitkeep +0 -0
  186. data/spec/support/dummy_rails/public/404.html +26 -0
  187. data/spec/support/dummy_rails/public/422.html +26 -0
  188. data/spec/support/dummy_rails/public/500.html +25 -0
  189. data/spec/support/dummy_rails/public/favicon.ico +0 -0
  190. data/spec/support/dummy_rails/public/index.html +241 -0
  191. data/spec/support/dummy_rails/public/robots.txt +5 -0
  192. data/spec/support/dummy_rails/script/rails +6 -0
  193. data/spec/support/dummy_rails/test/fixtures/.gitkeep +0 -0
  194. data/spec/support/dummy_rails/test/functional/.gitkeep +0 -0
  195. data/spec/support/dummy_rails/test/integration/.gitkeep +0 -0
  196. data/spec/support/dummy_rails/test/performance/browsing_test.rb +12 -0
  197. data/spec/support/dummy_rails/test/test_helper.rb +13 -0
  198. data/spec/support/dummy_rails/test/unit/.gitkeep +0 -0
  199. data/spec/support/dummy_rails/vendor/assets/javascripts/.gitkeep +0 -0
  200. data/spec/support/dummy_rails/vendor/assets/stylesheets/.gitkeep +0 -0
  201. data/spec/support/dummy_rails/vendor/plugins/.gitkeep +0 -0
  202. data/spec/support/dummy_static/.DS_Store +0 -0
  203. data/spec/support/dummy_static/app/.DS_Store +0 -0
  204. data/spec/support/dummy_static/app/assets/.DS_Store +0 -0
  205. data/spec/support/dummy_static/app/assets/javascripts/manifest.coffee +4 -0
  206. data/spec/support/dummy_static/app/assets/javascripts/spec_application_javascript.coffee +4 -0
  207. data/spec/support/dummy_static/app/assets/stylesheets/spec_application_stylesheet.css.scss +5 -0
  208. data/spec/support/dummy_static/lib/assets/javascripts/spec_library_javascript.coffee +3 -0
  209. data/spec/support/dummy_static/lib/assets/stylesheets/spec_library_stylesheet.css.scss +5 -0
  210. data/spec/support/dummy_static/vendor/assets/javascripts/spec_vendor_javascript.js +5 -0
  211. data/spec/support/dummy_static/vendor/assets/stylesheets/spec_vendor_stylesheets.css +3 -0
  212. data/vendor/assets/stylesheets/code_sync.css +1 -0
  213. metadata +492 -0
@@ -0,0 +1,194 @@
1
+ CodeMirror.defineMode("ruby", function(config) {
2
+ function wordObj(words) {
3
+ var o = {};
4
+ for (var i = 0, e = words.length; i < e; ++i) o[words[i]] = true;
5
+ return o;
6
+ }
7
+ var keywords = wordObj([
8
+ "alias", "and", "BEGIN", "begin", "break", "case", "class", "def", "defined?", "do", "else",
9
+ "elsif", "END", "end", "ensure", "false", "for", "if", "in", "module", "next", "not", "or",
10
+ "redo", "rescue", "retry", "return", "self", "super", "then", "true", "undef", "unless",
11
+ "until", "when", "while", "yield", "nil", "raise", "throw", "catch", "fail", "loop", "callcc",
12
+ "caller", "lambda", "proc", "public", "protected", "private", "require", "load",
13
+ "require_relative", "extend", "autoload"
14
+ ]);
15
+ var indentWords = wordObj(["def", "class", "case", "for", "while", "do", "module", "then",
16
+ "catch", "loop", "proc", "begin"]);
17
+ var dedentWords = wordObj(["end", "until"]);
18
+ var matching = {"[": "]", "{": "}", "(": ")"};
19
+ var curPunc;
20
+
21
+ function chain(newtok, stream, state) {
22
+ state.tokenize.push(newtok);
23
+ return newtok(stream, state);
24
+ }
25
+
26
+ function tokenBase(stream, state) {
27
+ curPunc = null;
28
+ if (stream.sol() && stream.match("=begin") && stream.eol()) {
29
+ state.tokenize.push(readBlockComment);
30
+ return "comment";
31
+ }
32
+ if (stream.eatSpace()) return null;
33
+ var ch = stream.next(), m;
34
+ if (ch == "`" || ch == "'" || ch == '"' ||
35
+ (ch == "/" && !stream.eol() && stream.peek() != " ")) {
36
+ return chain(readQuoted(ch, "string", ch == '"' || ch == "`"), stream, state);
37
+ } else if (ch == "%") {
38
+ var style, embed = false;
39
+ if (stream.eat("s")) style = "atom";
40
+ else if (stream.eat(/[WQ]/)) { style = "string"; embed = true; }
41
+ else if (stream.eat(/[wxqr]/)) style = "string";
42
+ var delim = stream.eat(/[^\w\s]/);
43
+ if (!delim) return "operator";
44
+ if (matching.propertyIsEnumerable(delim)) delim = matching[delim];
45
+ return chain(readQuoted(delim, style, embed, true), stream, state);
46
+ } else if (ch == "#") {
47
+ stream.skipToEnd();
48
+ return "comment";
49
+ } else if (ch == "<" && (m = stream.match(/^<-?[\`\"\']?([a-zA-Z_?]\w*)[\`\"\']?(?:;|$)/))) {
50
+ return chain(readHereDoc(m[1]), stream, state);
51
+ } else if (ch == "0") {
52
+ if (stream.eat("x")) stream.eatWhile(/[\da-fA-F]/);
53
+ else if (stream.eat("b")) stream.eatWhile(/[01]/);
54
+ else stream.eatWhile(/[0-7]/);
55
+ return "number";
56
+ } else if (/\d/.test(ch)) {
57
+ stream.match(/^[\d_]*(?:\.[\d_]+)?(?:[eE][+\-]?[\d_]+)?/);
58
+ return "number";
59
+ } else if (ch == "?") {
60
+ while (stream.match(/^\\[CM]-/)) {}
61
+ if (stream.eat("\\")) stream.eatWhile(/\w/);
62
+ else stream.next();
63
+ return "string";
64
+ } else if (ch == ":") {
65
+ if (stream.eat("'")) return chain(readQuoted("'", "atom", false), stream, state);
66
+ if (stream.eat('"')) return chain(readQuoted('"', "atom", true), stream, state);
67
+ stream.eatWhile(/[\w\?]/);
68
+ return "atom";
69
+ } else if (ch == "@") {
70
+ stream.eat("@");
71
+ stream.eatWhile(/[\w\?]/);
72
+ return "variable-2";
73
+ } else if (ch == "$") {
74
+ stream.next();
75
+ stream.eatWhile(/[\w\?]/);
76
+ return "variable-3";
77
+ } else if (/\w/.test(ch)) {
78
+ stream.eatWhile(/[\w\?]/);
79
+ if (stream.eat(":")) return "atom";
80
+ return "ident";
81
+ } else if (ch == "|" && (state.varList || state.lastTok == "{" || state.lastTok == "do")) {
82
+ curPunc = "|";
83
+ return null;
84
+ } else if (/[\(\)\[\]{}\\;]/.test(ch)) {
85
+ curPunc = ch;
86
+ return null;
87
+ } else if (ch == "-" && stream.eat(">")) {
88
+ return "arrow";
89
+ } else if (/[=+\-\/*:\.^%<>~|]/.test(ch)) {
90
+ stream.eatWhile(/[=+\-\/*:\.^%<>~|]/);
91
+ return "operator";
92
+ } else {
93
+ return null;
94
+ }
95
+ }
96
+
97
+ function tokenBaseUntilBrace() {
98
+ var depth = 1;
99
+ return function(stream, state) {
100
+ if (stream.peek() == "}") {
101
+ depth--;
102
+ if (depth == 0) {
103
+ state.tokenize.pop();
104
+ return state.tokenize[state.tokenize.length-1](stream, state);
105
+ }
106
+ } else if (stream.peek() == "{") {
107
+ depth++;
108
+ }
109
+ return tokenBase(stream, state);
110
+ };
111
+ }
112
+ function readQuoted(quote, style, embed, unescaped) {
113
+ return function(stream, state) {
114
+ var escaped = false, ch;
115
+ while ((ch = stream.next()) != null) {
116
+ if (ch == quote && (unescaped || !escaped)) {
117
+ state.tokenize.pop();
118
+ break;
119
+ }
120
+ if (embed && ch == "#" && !escaped && stream.eat("{")) {
121
+ state.tokenize.push(tokenBaseUntilBrace(arguments.callee));
122
+ break;
123
+ }
124
+ escaped = !escaped && ch == "\\";
125
+ }
126
+ return style;
127
+ };
128
+ }
129
+ function readHereDoc(phrase) {
130
+ return function(stream, state) {
131
+ if (stream.match(phrase)) state.tokenize.pop();
132
+ else stream.skipToEnd();
133
+ return "string";
134
+ };
135
+ }
136
+ function readBlockComment(stream, state) {
137
+ if (stream.sol() && stream.match("=end") && stream.eol())
138
+ state.tokenize.pop();
139
+ stream.skipToEnd();
140
+ return "comment";
141
+ }
142
+
143
+ return {
144
+ startState: function() {
145
+ return {tokenize: [tokenBase],
146
+ indented: 0,
147
+ context: {type: "top", indented: -config.indentUnit},
148
+ continuedLine: false,
149
+ lastTok: null,
150
+ varList: false};
151
+ },
152
+
153
+ token: function(stream, state) {
154
+ if (stream.sol()) state.indented = stream.indentation();
155
+ var style = state.tokenize[state.tokenize.length-1](stream, state), kwtype;
156
+ if (style == "ident") {
157
+ var word = stream.current();
158
+ style = keywords.propertyIsEnumerable(stream.current()) ? "keyword"
159
+ : /^[A-Z]/.test(word) ? "tag"
160
+ : (state.lastTok == "def" || state.lastTok == "class" || state.varList) ? "def"
161
+ : "variable";
162
+ if (indentWords.propertyIsEnumerable(word)) kwtype = "indent";
163
+ else if (dedentWords.propertyIsEnumerable(word)) kwtype = "dedent";
164
+ else if ((word == "if" || word == "unless") && stream.column() == stream.indentation())
165
+ kwtype = "indent";
166
+ }
167
+ if (curPunc || (style && style != "comment")) state.lastTok = word || curPunc || style;
168
+ if (curPunc == "|") state.varList = !state.varList;
169
+
170
+ if (kwtype == "indent" || /[\(\[\{]/.test(curPunc))
171
+ state.context = {prev: state.context, type: curPunc || style, indented: state.indented};
172
+ else if ((kwtype == "dedent" || /[\)\]\}]/.test(curPunc)) && state.context.prev)
173
+ state.context = state.context.prev;
174
+
175
+ if (stream.eol())
176
+ state.continuedLine = (curPunc == "\\" || style == "operator");
177
+ return style;
178
+ },
179
+
180
+ indent: function(state, textAfter) {
181
+ if (state.tokenize[state.tokenize.length-1] != tokenBase) return 0;
182
+ var firstChar = textAfter && textAfter.charAt(0);
183
+ var ct = state.context;
184
+ var closing = ct.type == matching[firstChar] ||
185
+ ct.type == "keyword" && /^(?:end|until|else|elsif|when|rescue)\b/.test(textAfter);
186
+ return ct.indented + (closing ? 0 : config.indentUnit) +
187
+ (state.continuedLine ? config.indentUnit : 0);
188
+ },
189
+ electricChars: "}de" // enD and rescuE
190
+
191
+ };
192
+ });
193
+
194
+ CodeMirror.defineMIME("text/x-ruby", "ruby");
@@ -0,0 +1,330 @@
1
+ CodeMirror.defineMode("sass", function(config) {
2
+ var tokenRegexp = function(words){
3
+ return new RegExp("^" + words.join("|"));
4
+ };
5
+
6
+ var keywords = ["true", "false", "null", "auto"];
7
+ var keywordsRegexp = new RegExp("^" + keywords.join("|"));
8
+
9
+ var operators = ["\\(", "\\)", "=", ">", "<", "==", ">=", "<=", "\\+", "-", "\\!=", "/", "\\*", "%", "and", "or", "not"];
10
+ var opRegexp = tokenRegexp(operators);
11
+
12
+ var pseudoElementsRegexp = /^::?[\w\-]+/;
13
+
14
+ var urlTokens = function(stream, state){
15
+ var ch = stream.peek();
16
+
17
+ if (ch === ")"){
18
+ stream.next();
19
+ state.tokenizer = tokenBase;
20
+ return "operator";
21
+ }else if (ch === "("){
22
+ stream.next();
23
+ stream.eatSpace();
24
+
25
+ return "operator";
26
+ }else if (ch === "'" || ch === '"'){
27
+ state.tokenizer = buildStringTokenizer(stream.next());
28
+ return "string";
29
+ }else{
30
+ state.tokenizer = buildStringTokenizer(")", false);
31
+ return "string";
32
+ }
33
+ };
34
+ var multilineComment = function(stream, state) {
35
+ if (stream.skipTo("*/")){
36
+ stream.next();
37
+ stream.next();
38
+ state.tokenizer = tokenBase;
39
+ }else {
40
+ stream.next();
41
+ }
42
+
43
+ return "comment";
44
+ };
45
+
46
+ var buildStringTokenizer = function(quote, greedy){
47
+ if(greedy == null){ greedy = true; }
48
+
49
+ function stringTokenizer(stream, state){
50
+ var nextChar = stream.next();
51
+ var peekChar = stream.peek();
52
+ var previousChar = stream.string.charAt(stream.pos-2);
53
+
54
+ var endingString = ((nextChar !== "\\" && peekChar === quote) || (nextChar === quote && previousChar !== "\\"));
55
+
56
+ /*
57
+ console.log("previousChar: " + previousChar);
58
+ console.log("nextChar: " + nextChar);
59
+ console.log("peekChar: " + peekChar);
60
+ console.log("ending: " + endingString);
61
+ */
62
+
63
+ if (endingString){
64
+ if (nextChar !== quote && greedy) { stream.next(); }
65
+ state.tokenizer = tokenBase;
66
+ return "string";
67
+ }else if (nextChar === "#" && peekChar === "{"){
68
+ state.tokenizer = buildInterpolationTokenizer(stringTokenizer);
69
+ stream.next();
70
+ return "operator";
71
+ }else {
72
+ return "string";
73
+ }
74
+ }
75
+
76
+ return stringTokenizer;
77
+ };
78
+
79
+ var buildInterpolationTokenizer = function(currentTokenizer){
80
+ return function(stream, state){
81
+ if (stream.peek() === "}"){
82
+ stream.next();
83
+ state.tokenizer = currentTokenizer;
84
+ return "operator";
85
+ }else{
86
+ return tokenBase(stream, state);
87
+ }
88
+ };
89
+ };
90
+
91
+ var indent = function(state){
92
+ if (state.indentCount == 0){
93
+ state.indentCount++;
94
+ var lastScopeOffset = state.scopes[0].offset;
95
+ var currentOffset = lastScopeOffset + config.indentUnit;
96
+ state.scopes.unshift({ offset:currentOffset });
97
+ }
98
+ };
99
+
100
+ var dedent = function(state){
101
+ if (state.scopes.length == 1) { return; }
102
+
103
+ state.scopes.shift();
104
+ };
105
+
106
+ var tokenBase = function(stream, state) {
107
+ var ch = stream.peek();
108
+
109
+ // Single line Comment
110
+ if (stream.match('//')) {
111
+ stream.skipToEnd();
112
+ return "comment";
113
+ }
114
+
115
+ // Multiline Comment
116
+ if (stream.match('/*')){
117
+ state.tokenizer = multilineComment;
118
+ return state.tokenizer(stream, state);
119
+ }
120
+
121
+ // Interpolation
122
+ if (stream.match('#{')){
123
+ state.tokenizer = buildInterpolationTokenizer(tokenBase);
124
+ return "operator";
125
+ }
126
+
127
+ if (ch === "."){
128
+ stream.next();
129
+
130
+ // Match class selectors
131
+ if (stream.match(/^[\w-]+/)){
132
+ indent(state);
133
+ return "atom";
134
+ }else if (stream.peek() === "#"){
135
+ indent(state);
136
+ return "atom";
137
+ }else{
138
+ return "operator";
139
+ }
140
+ }
141
+
142
+ if (ch === "#"){
143
+ stream.next();
144
+
145
+ // Hex numbers
146
+ if (stream.match(/[0-9a-fA-F]{6}|[0-9a-fA-F]{3}/)){
147
+ return "number";
148
+ }
149
+
150
+ // ID selectors
151
+ if (stream.match(/^[\w-]+/)){
152
+ indent(state);
153
+ return "atom";
154
+ }
155
+
156
+ if (stream.peek() === "#"){
157
+ indent(state);
158
+ return "atom";
159
+ }
160
+ }
161
+
162
+ // Numbers
163
+ if (stream.match(/^-?[0-9\.]+/)){
164
+ return "number";
165
+ }
166
+
167
+ // Units
168
+ if (stream.match(/^(px|em|in)\b/)){
169
+ return "unit";
170
+ }
171
+
172
+ if (stream.match(keywordsRegexp)){
173
+ return "keyword";
174
+ }
175
+
176
+ if (stream.match(/^url/) && stream.peek() === "("){
177
+ state.tokenizer = urlTokens;
178
+ return "atom";
179
+ }
180
+
181
+ // Variables
182
+ if (ch === "$"){
183
+ stream.next();
184
+ stream.eatWhile(/[\w-]/);
185
+
186
+ if (stream.peek() === ":"){
187
+ stream.next();
188
+ return "variable-2";
189
+ }else{
190
+ return "variable-3";
191
+ }
192
+ }
193
+
194
+ if (ch === "!"){
195
+ stream.next();
196
+
197
+ if (stream.match(/^[\w]+/)){
198
+ return "keyword";
199
+ }
200
+
201
+ return "operator";
202
+ }
203
+
204
+ if (ch === "="){
205
+ stream.next();
206
+
207
+ // Match shortcut mixin definition
208
+ if (stream.match(/^[\w-]+/)){
209
+ indent(state);
210
+ return "meta";
211
+ }else {
212
+ return "operator";
213
+ }
214
+ }
215
+
216
+ if (ch === "+"){
217
+ stream.next();
218
+
219
+ // Match shortcut mixin definition
220
+ if (stream.match(/^[\w-]+/)){
221
+ return "variable-3";
222
+ }else {
223
+ return "operator";
224
+ }
225
+ }
226
+
227
+ // Indent Directives
228
+ if (stream.match(/^@(else if|if|media|else|for|each|while|mixin|function)/)){
229
+ indent(state);
230
+ return "meta";
231
+ }
232
+
233
+ // Other Directives
234
+ if (ch === "@"){
235
+ stream.next();
236
+ stream.eatWhile(/[\w-]/);
237
+ return "meta";
238
+ }
239
+
240
+ // Strings
241
+ if (ch === '"' || ch === "'"){
242
+ stream.next();
243
+ state.tokenizer = buildStringTokenizer(ch);
244
+ return "string";
245
+ }
246
+
247
+ // Pseudo element selectors
248
+ if (ch == ':' && stream.match(pseudoElementsRegexp)){
249
+ return "keyword";
250
+ }
251
+
252
+ // atoms
253
+ if (stream.eatWhile(/[\w-&]/)){
254
+ // matches a property definition
255
+ if (stream.peek() === ":" && !stream.match(pseudoElementsRegexp, false))
256
+ return "property";
257
+ else
258
+ return "atom";
259
+ }
260
+
261
+ if (stream.match(opRegexp)){
262
+ return "operator";
263
+ }
264
+
265
+ // If we haven't returned by now, we move 1 character
266
+ // and return an error
267
+ stream.next();
268
+ return null;
269
+ };
270
+
271
+ var tokenLexer = function(stream, state) {
272
+ if (stream.sol()){
273
+ state.indentCount = 0;
274
+ }
275
+ var style = state.tokenizer(stream, state);
276
+ var current = stream.current();
277
+
278
+ if (current === "@return"){
279
+ dedent(state);
280
+ }
281
+
282
+ if (style === "atom"){
283
+ indent(state);
284
+ }
285
+
286
+ if (style !== null){
287
+ var startOfToken = stream.pos - current.length;
288
+ var withCurrentIndent = startOfToken + (config.indentUnit * state.indentCount);
289
+
290
+ var newScopes = [];
291
+
292
+ for (var i = 0; i < state.scopes.length; i++){
293
+ var scope = state.scopes[i];
294
+
295
+ if (scope.offset <= withCurrentIndent){
296
+ newScopes.push(scope);
297
+ }
298
+ }
299
+
300
+ state.scopes = newScopes;
301
+ }
302
+
303
+
304
+ return style;
305
+ };
306
+
307
+ return {
308
+ startState: function() {
309
+ return {
310
+ tokenizer: tokenBase,
311
+ scopes: [{offset: 0, type: 'sass'}],
312
+ definedVars: [],
313
+ definedMixins: []
314
+ };
315
+ },
316
+ token: function(stream, state) {
317
+ var style = tokenLexer(stream, state);
318
+
319
+ state.lastToken = { style: style, content: stream.current() };
320
+
321
+ return style;
322
+ },
323
+
324
+ indent: function(state) {
325
+ return state.scopes[0].offset;
326
+ }
327
+ };
328
+ });
329
+
330
+ CodeMirror.defineMIME("text/x-sass", "sass");