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,526 @@
1
+ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
2
+
3
+ var htmlFound = CodeMirror.modes.hasOwnProperty("xml");
4
+ var htmlMode = CodeMirror.getMode(cmCfg, htmlFound ? {name: "xml", htmlMode: true} : "text/plain");
5
+ var aliases = {
6
+ html: "htmlmixed",
7
+ js: "javascript",
8
+ json: "application/json",
9
+ c: "text/x-csrc",
10
+ "c++": "text/x-c++src",
11
+ java: "text/x-java",
12
+ csharp: "text/x-csharp",
13
+ "c#": "text/x-csharp",
14
+ scala: "text/x-scala"
15
+ };
16
+
17
+ var getMode = (function () {
18
+ var i, modes = {}, mimes = {}, mime;
19
+
20
+ var list = [];
21
+ for (var m in CodeMirror.modes)
22
+ if (CodeMirror.modes.propertyIsEnumerable(m)) list.push(m);
23
+ for (i = 0; i < list.length; i++) {
24
+ modes[list[i]] = list[i];
25
+ }
26
+ var mimesList = [];
27
+ for (var m in CodeMirror.mimeModes)
28
+ if (CodeMirror.mimeModes.propertyIsEnumerable(m))
29
+ mimesList.push({mime: m, mode: CodeMirror.mimeModes[m]});
30
+ for (i = 0; i < mimesList.length; i++) {
31
+ mime = mimesList[i].mime;
32
+ mimes[mime] = mimesList[i].mime;
33
+ }
34
+
35
+ for (var a in aliases) {
36
+ if (aliases[a] in modes || aliases[a] in mimes)
37
+ modes[a] = aliases[a];
38
+ }
39
+
40
+ return function (lang) {
41
+ return modes[lang] ? CodeMirror.getMode(cmCfg, modes[lang]) : null;
42
+ };
43
+ }());
44
+
45
+ // Should underscores in words open/close em/strong?
46
+ if (modeCfg.underscoresBreakWords === undefined)
47
+ modeCfg.underscoresBreakWords = true;
48
+
49
+ // Turn on fenced code blocks? ("```" to start/end)
50
+ if (modeCfg.fencedCodeBlocks === undefined) modeCfg.fencedCodeBlocks = false;
51
+
52
+ // Turn on task lists? ("- [ ] " and "- [x] ")
53
+ if (modeCfg.taskLists === undefined) modeCfg.taskLists = false;
54
+
55
+ var codeDepth = 0;
56
+
57
+ var header = 'header'
58
+ , code = 'comment'
59
+ , quote1 = 'atom'
60
+ , quote2 = 'number'
61
+ , list1 = 'variable-2'
62
+ , list2 = 'variable-3'
63
+ , list3 = 'keyword'
64
+ , hr = 'hr'
65
+ , image = 'tag'
66
+ , linkinline = 'link'
67
+ , linkemail = 'link'
68
+ , linktext = 'link'
69
+ , linkhref = 'string'
70
+ , em = 'em'
71
+ , strong = 'strong';
72
+
73
+ var hrRE = /^([*\-=_])(?:\s*\1){2,}\s*$/
74
+ , ulRE = /^[*\-+]\s+/
75
+ , olRE = /^[0-9]+\.\s+/
76
+ , taskListRE = /^\[(x| )\](?=\s)/ // Must follow ulRE or olRE
77
+ , headerRE = /^(?:\={1,}|-{1,})$/
78
+ , textRE = /^[^!\[\]*_\\<>` "'(]+/;
79
+
80
+ function switchInline(stream, state, f) {
81
+ state.f = state.inline = f;
82
+ return f(stream, state);
83
+ }
84
+
85
+ function switchBlock(stream, state, f) {
86
+ state.f = state.block = f;
87
+ return f(stream, state);
88
+ }
89
+
90
+
91
+ // Blocks
92
+
93
+ function blankLine(state) {
94
+ // Reset linkTitle state
95
+ state.linkTitle = false;
96
+ // Reset EM state
97
+ state.em = false;
98
+ // Reset STRONG state
99
+ state.strong = false;
100
+ // Reset state.quote
101
+ state.quote = 0;
102
+ if (!htmlFound && state.f == htmlBlock) {
103
+ state.f = inlineNormal;
104
+ state.block = blockNormal;
105
+ }
106
+ // Mark this line as blank
107
+ state.thisLineHasContent = false;
108
+ return null;
109
+ }
110
+
111
+ function blockNormal(stream, state) {
112
+
113
+ var prevLineIsList = (state.list !== false);
114
+ if (state.list !== false && state.indentationDiff >= 0) { // Continued list
115
+ if (state.indentationDiff < 4) { // Only adjust indentation if *not* a code block
116
+ state.indentation -= state.indentationDiff;
117
+ }
118
+ state.list = null;
119
+ } else if (state.list !== false && state.indentation > 0) {
120
+ state.list = null;
121
+ state.listDepth = Math.floor(state.indentation / 4);
122
+ } else if (state.list !== false) { // No longer a list
123
+ state.list = false;
124
+ state.listDepth = 0;
125
+ }
126
+
127
+ if (state.indentationDiff >= 4) {
128
+ state.indentation -= 4;
129
+ stream.skipToEnd();
130
+ return code;
131
+ } else if (stream.eatSpace()) {
132
+ return null;
133
+ } else if (stream.peek() === '#' || (state.prevLineHasContent && stream.match(headerRE)) ) {
134
+ state.header = true;
135
+ } else if (stream.eat('>')) {
136
+ state.indentation++;
137
+ state.quote = 1;
138
+ stream.eatSpace();
139
+ while (stream.eat('>')) {
140
+ stream.eatSpace();
141
+ state.quote++;
142
+ }
143
+ } else if (stream.peek() === '[') {
144
+ return switchInline(stream, state, footnoteLink);
145
+ } else if (stream.match(hrRE, true)) {
146
+ return hr;
147
+ } else if ((!state.prevLineHasContent || prevLineIsList) && (stream.match(ulRE, true) || stream.match(olRE, true))) {
148
+ state.indentation += 4;
149
+ state.list = true;
150
+ state.listDepth++;
151
+ if (modeCfg.taskLists && stream.match(taskListRE, false)) {
152
+ state.taskList = true;
153
+ }
154
+ } else if (modeCfg.fencedCodeBlocks && stream.match(/^```([\w+#]*)/, true)) {
155
+ // try switching mode
156
+ state.localMode = getMode(RegExp.$1);
157
+ if (state.localMode) state.localState = state.localMode.startState();
158
+ switchBlock(stream, state, local);
159
+ return code;
160
+ }
161
+
162
+ return switchInline(stream, state, state.inline);
163
+ }
164
+
165
+ function htmlBlock(stream, state) {
166
+ var style = htmlMode.token(stream, state.htmlState);
167
+ if (htmlFound && style === 'tag' && state.htmlState.type !== 'openTag' && !state.htmlState.context) {
168
+ state.f = inlineNormal;
169
+ state.block = blockNormal;
170
+ }
171
+ if (state.md_inside && stream.current().indexOf(">")!=-1) {
172
+ state.f = inlineNormal;
173
+ state.block = blockNormal;
174
+ state.htmlState.context = undefined;
175
+ }
176
+ return style;
177
+ }
178
+
179
+ function local(stream, state) {
180
+ if (stream.sol() && stream.match(/^```/, true)) {
181
+ state.localMode = state.localState = null;
182
+ state.f = inlineNormal;
183
+ state.block = blockNormal;
184
+ return code;
185
+ } else if (state.localMode) {
186
+ return state.localMode.token(stream, state.localState);
187
+ } else {
188
+ stream.skipToEnd();
189
+ return code;
190
+ }
191
+ }
192
+
193
+ // Inline
194
+ function getType(state) {
195
+ var styles = [];
196
+
197
+ if (state.taskOpen) { return "meta"; }
198
+ if (state.taskClosed) { return "property"; }
199
+
200
+ if (state.strong) { styles.push(strong); }
201
+ if (state.em) { styles.push(em); }
202
+
203
+ if (state.linkText) { styles.push(linktext); }
204
+
205
+ if (state.code) { styles.push(code); }
206
+
207
+ if (state.header) { styles.push(header); }
208
+ if (state.quote) { styles.push(state.quote % 2 ? quote1 : quote2); }
209
+ if (state.list !== false) {
210
+ var listMod = (state.listDepth - 1) % 3;
211
+ if (!listMod) {
212
+ styles.push(list1);
213
+ } else if (listMod === 1) {
214
+ styles.push(list2);
215
+ } else {
216
+ styles.push(list3);
217
+ }
218
+ }
219
+
220
+ return styles.length ? styles.join(' ') : null;
221
+ }
222
+
223
+ function handleText(stream, state) {
224
+ if (stream.match(textRE, true)) {
225
+ return getType(state);
226
+ }
227
+ return undefined;
228
+ }
229
+
230
+ function inlineNormal(stream, state) {
231
+ var style = state.text(stream, state);
232
+ if (typeof style !== 'undefined')
233
+ return style;
234
+
235
+ if (state.list) { // List marker (*, +, -, 1., etc)
236
+ state.list = null;
237
+ return getType(state);
238
+ }
239
+
240
+ if (state.taskList) {
241
+ var taskOpen = stream.match(taskListRE, true)[1] !== "x";
242
+ if (taskOpen) state.taskOpen = true;
243
+ else state.taskClosed = true;
244
+ state.taskList = false;
245
+ return getType(state);
246
+ }
247
+
248
+ state.taskOpen = false;
249
+ state.taskClosed = false;
250
+
251
+ var ch = stream.next();
252
+
253
+ if (ch === '\\') {
254
+ stream.next();
255
+ return getType(state);
256
+ }
257
+
258
+ // Matches link titles present on next line
259
+ if (state.linkTitle) {
260
+ state.linkTitle = false;
261
+ var matchCh = ch;
262
+ if (ch === '(') {
263
+ matchCh = ')';
264
+ }
265
+ matchCh = (matchCh+'').replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1");
266
+ var regex = '^\\s*(?:[^' + matchCh + '\\\\]+|\\\\\\\\|\\\\.)' + matchCh;
267
+ if (stream.match(new RegExp(regex), true)) {
268
+ return linkhref;
269
+ }
270
+ }
271
+
272
+ // If this block is changed, it may need to be updated in GFM mode
273
+ if (ch === '`') {
274
+ var t = getType(state);
275
+ var before = stream.pos;
276
+ stream.eatWhile('`');
277
+ var difference = 1 + stream.pos - before;
278
+ if (!state.code) {
279
+ codeDepth = difference;
280
+ state.code = true;
281
+ return getType(state);
282
+ } else {
283
+ if (difference === codeDepth) { // Must be exact
284
+ state.code = false;
285
+ return t;
286
+ }
287
+ return getType(state);
288
+ }
289
+ } else if (state.code) {
290
+ return getType(state);
291
+ }
292
+
293
+ if (ch === '!' && stream.match(/\[[^\]]*\] ?(?:\(|\[)/, false)) {
294
+ stream.match(/\[[^\]]*\]/);
295
+ state.inline = state.f = linkHref;
296
+ return image;
297
+ }
298
+
299
+ if (ch === '[' && stream.match(/.*\](\(| ?\[)/, false)) {
300
+ state.linkText = true;
301
+ return getType(state);
302
+ }
303
+
304
+ if (ch === ']' && state.linkText) {
305
+ var type = getType(state);
306
+ state.linkText = false;
307
+ state.inline = state.f = linkHref;
308
+ return type;
309
+ }
310
+
311
+ if (ch === '<' && stream.match(/^(https?|ftps?):\/\/(?:[^\\>]|\\.)+>/, true)) {
312
+ return switchInline(stream, state, inlineElement(linkinline, '>'));
313
+ }
314
+
315
+ if (ch === '<' && stream.match(/^[^> \\]+@(?:[^\\>]|\\.)+>/, true)) {
316
+ return switchInline(stream, state, inlineElement(linkemail, '>'));
317
+ }
318
+
319
+ if (ch === '<' && stream.match(/^\w/, false)) {
320
+ if (stream.string.indexOf(">")!=-1) {
321
+ var atts = stream.string.substring(1,stream.string.indexOf(">"));
322
+ if (/markdown\s*=\s*('|"){0,1}1('|"){0,1}/.test(atts)) {
323
+ state.md_inside = true;
324
+ }
325
+ }
326
+ stream.backUp(1);
327
+ return switchBlock(stream, state, htmlBlock);
328
+ }
329
+
330
+ if (ch === '<' && stream.match(/^\/\w*?>/)) {
331
+ state.md_inside = false;
332
+ return "tag";
333
+ }
334
+
335
+ var ignoreUnderscore = false;
336
+ if (!modeCfg.underscoresBreakWords) {
337
+ if (ch === '_' && stream.peek() !== '_' && stream.match(/(\w)/, false)) {
338
+ var prevPos = stream.pos - 2;
339
+ if (prevPos >= 0) {
340
+ var prevCh = stream.string.charAt(prevPos);
341
+ if (prevCh !== '_' && prevCh.match(/(\w)/, false)) {
342
+ ignoreUnderscore = true;
343
+ }
344
+ }
345
+ }
346
+ }
347
+ var t = getType(state);
348
+ if (ch === '*' || (ch === '_' && !ignoreUnderscore)) {
349
+ if (state.strong === ch && stream.eat(ch)) { // Remove STRONG
350
+ state.strong = false;
351
+ return t;
352
+ } else if (!state.strong && stream.eat(ch)) { // Add STRONG
353
+ state.strong = ch;
354
+ return getType(state);
355
+ } else if (state.em === ch) { // Remove EM
356
+ state.em = false;
357
+ return t;
358
+ } else if (!state.em) { // Add EM
359
+ state.em = ch;
360
+ return getType(state);
361
+ }
362
+ } else if (ch === ' ') {
363
+ if (stream.eat('*') || stream.eat('_')) { // Probably surrounded by spaces
364
+ if (stream.peek() === ' ') { // Surrounded by spaces, ignore
365
+ return getType(state);
366
+ } else { // Not surrounded by spaces, back up pointer
367
+ stream.backUp(1);
368
+ }
369
+ }
370
+ }
371
+
372
+ return getType(state);
373
+ }
374
+
375
+ function linkHref(stream, state) {
376
+ // Check if space, and return NULL if so (to avoid marking the space)
377
+ if(stream.eatSpace()){
378
+ return null;
379
+ }
380
+ var ch = stream.next();
381
+ if (ch === '(' || ch === '[') {
382
+ return switchInline(stream, state, inlineElement(linkhref, ch === '(' ? ')' : ']'));
383
+ }
384
+ return 'error';
385
+ }
386
+
387
+ function footnoteLink(stream, state) {
388
+ if (stream.match(/^[^\]]*\]:/, true)) {
389
+ state.f = footnoteUrl;
390
+ return linktext;
391
+ }
392
+ return switchInline(stream, state, inlineNormal);
393
+ }
394
+
395
+ function footnoteUrl(stream, state) {
396
+ // Check if space, and return NULL if so (to avoid marking the space)
397
+ if(stream.eatSpace()){
398
+ return null;
399
+ }
400
+ // Match URL
401
+ stream.match(/^[^\s]+/, true);
402
+ // Check for link title
403
+ if (stream.peek() === undefined) { // End of line, set flag to check next line
404
+ state.linkTitle = true;
405
+ } else { // More content on line, check if link title
406
+ stream.match(/^(?:\s+(?:"(?:[^"\\]|\\\\|\\.)+"|'(?:[^'\\]|\\\\|\\.)+'|\((?:[^)\\]|\\\\|\\.)+\)))?/, true);
407
+ }
408
+ state.f = state.inline = inlineNormal;
409
+ return linkhref;
410
+ }
411
+
412
+ var savedInlineRE = [];
413
+ function inlineRE(endChar) {
414
+ if (!savedInlineRE[endChar]) {
415
+ // Escape endChar for RegExp (taken from http://stackoverflow.com/a/494122/526741)
416
+ endChar = (endChar+'').replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1");
417
+ // Match any non-endChar, escaped character, as well as the closing
418
+ // endChar.
419
+ savedInlineRE[endChar] = new RegExp('^(?:[^\\\\]|\\\\.)*?(' + endChar + ')');
420
+ }
421
+ return savedInlineRE[endChar];
422
+ }
423
+
424
+ function inlineElement(type, endChar, next) {
425
+ next = next || inlineNormal;
426
+ return function(stream, state) {
427
+ stream.match(inlineRE(endChar));
428
+ state.inline = state.f = next;
429
+ return type;
430
+ };
431
+ }
432
+
433
+ return {
434
+ startState: function() {
435
+ return {
436
+ f: blockNormal,
437
+
438
+ prevLineHasContent: false,
439
+ thisLineHasContent: false,
440
+
441
+ block: blockNormal,
442
+ htmlState: CodeMirror.startState(htmlMode),
443
+ indentation: 0,
444
+
445
+ inline: inlineNormal,
446
+ text: handleText,
447
+
448
+ linkText: false,
449
+ linkTitle: false,
450
+ em: false,
451
+ strong: false,
452
+ header: false,
453
+ taskList: false,
454
+ list: false,
455
+ listDepth: 0,
456
+ quote: 0
457
+ };
458
+ },
459
+
460
+ copyState: function(s) {
461
+ return {
462
+ f: s.f,
463
+
464
+ prevLineHasContent: s.prevLineHasContent,
465
+ thisLineHasContent: s.thisLineHasContent,
466
+
467
+ block: s.block,
468
+ htmlState: CodeMirror.copyState(htmlMode, s.htmlState),
469
+ indentation: s.indentation,
470
+
471
+ localMode: s.localMode,
472
+ localState: s.localMode ? CodeMirror.copyState(s.localMode, s.localState) : null,
473
+
474
+ inline: s.inline,
475
+ text: s.text,
476
+ linkTitle: s.linkTitle,
477
+ em: s.em,
478
+ strong: s.strong,
479
+ header: s.header,
480
+ taskList: s.taskList,
481
+ list: s.list,
482
+ listDepth: s.listDepth,
483
+ quote: s.quote,
484
+ md_inside: s.md_inside
485
+ };
486
+ },
487
+
488
+ token: function(stream, state) {
489
+ if (stream.sol()) {
490
+ if (stream.match(/^\s*$/, true)) {
491
+ state.prevLineHasContent = false;
492
+ return blankLine(state);
493
+ } else {
494
+ state.prevLineHasContent = state.thisLineHasContent;
495
+ state.thisLineHasContent = true;
496
+ }
497
+
498
+ // Reset state.header
499
+ state.header = false;
500
+
501
+ // Reset state.taskList
502
+ state.taskList = false;
503
+
504
+ // Reset state.code
505
+ state.code = false;
506
+
507
+ state.f = state.block;
508
+ var indentation = stream.match(/^\s*/, true)[0].replace(/\t/g, ' ').length;
509
+ var difference = Math.floor((indentation - state.indentation) / 4) * 4;
510
+ if (difference > 4) difference = 4;
511
+ var adjustedIndentation = state.indentation + difference;
512
+ state.indentationDiff = adjustedIndentation - state.indentation;
513
+ state.indentation = adjustedIndentation;
514
+ if (indentation > 0) return null;
515
+ }
516
+ return state.f(stream, state);
517
+ },
518
+
519
+ blankLine: blankLine,
520
+
521
+ getType: getType
522
+ };
523
+
524
+ }, "xml");
525
+
526
+ CodeMirror.defineMIME("text/x-markdown", "markdown");