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,7 @@
1
+ CodeSync.Gist = Backbone.Model.extend
2
+ initialize: (@attributes={})->
3
+
4
+ url: ()->
5
+
6
+ toDocuments:()->
7
+
@@ -0,0 +1,117 @@
1
+ CodeSync.Modes = Backbone.Collection.extend
2
+ model: Backbone.Model.extend
3
+ isTemplate: ()->
4
+ @get("template") is true
5
+
6
+ initialize: (models=[], options={})->
7
+ models = for key, value of modes
8
+ attributes =
9
+ id: key
10
+ name: value.name || key
11
+ codeMirrorMode: value.codeMirrorMode || key
12
+ extension: value.extension
13
+ extensionRegex: new RegExp("#{ value.extension }")
14
+ template: (value.template is true || key is "skim" || value.extension?.match(/jst/))
15
+ defaultContent: value.defaultContent
16
+
17
+ Backbone.Collection::initialize.apply(@, arguments)
18
+
19
+ @reset(models, silent: true)
20
+
21
+ findModeFor: (pathOrFilename="")->
22
+ pathOrFilename = ".#{ pathOrFilename }" unless pathOrFilename.match(/\./)
23
+
24
+ mode = @detect (model)=>
25
+ regex = model.get("extensionRegex")
26
+ regex.exec(pathOrFilename)
27
+
28
+ mode?.get("codeMirrorMode")
29
+
30
+ findExtensionFor: (mode)->
31
+ mode = @detect (model)->
32
+ model.get('codeMirrorMode') is mode || model.get('id') is mode
33
+
34
+ mode?.get("extension")
35
+
36
+ defaultMode: ()->
37
+ @get(CodeSync.get("defaultFileType")) || @first()
38
+
39
+
40
+ CodeSync.Modes.getMode = (id)->
41
+ CodeSync.Modes.get().get(id)
42
+
43
+ CodeSync.Modes.guessModeFor = (pathOrFilename)->
44
+ CodeSync.Modes.get().findModeFor(pathOrFilename)
45
+
46
+ CodeSync.Modes.guessExtensionFor = (mode)->
47
+ CodeSync.Modes.get().findExtensionFor(mode)
48
+
49
+ CodeSync.Modes.get = ()->
50
+ CodeSync.Modes.singleton ||= new CodeSync.Modes()
51
+
52
+ CodeSync.Modes.defaultMode = ()->
53
+ CodeSync.Modes.get().defaultMode()
54
+
55
+ modes =
56
+ coffeescript:
57
+ extension: ".coffee"
58
+ codeMirrorOptions:
59
+ indentUnit: 2
60
+ smartIndent: true
61
+ tabSize: 2
62
+ indentWithTabs: false
63
+
64
+ defaultContent: """
65
+ # You are currently in Coffeescript Mode
66
+ #
67
+ # Any coffeescript you type in here will be evaluated.
68
+ #
69
+ # defining this function will allow you to respond
70
+ # to code and template changes that happen in this editor.
71
+ #
72
+ #
73
+ # CodeSync.onScriptChange = (changeObject)->
74
+ # console.log "Detected new code from CodeSync", changeObject
75
+ #
76
+ #
77
+ """
78
+
79
+ sass:
80
+ name: "Sass"
81
+ extension: ".css.sass"
82
+ defaultContent: "// You are currently in Sass mode."
83
+
84
+ codeMirrorOptions:
85
+ indentUnit: 2
86
+ smartIndent: true
87
+ tabSize: 2
88
+ indentWithTabs: false
89
+
90
+ scss:
91
+ codeMirrorMode: "css"
92
+ extension: ".css.scss"
93
+ name: "SCSS"
94
+ defaultContent: "/* You are currently in SCSS mode. */"
95
+
96
+ skim:
97
+ extension: ".jst.skim"
98
+ defaultContent: "// You are currently in Skim mode.\n// The contents of this template will be available on the JST object."
99
+ template: true
100
+ codeMirrorOptions:
101
+ indentUnit: 2
102
+ smartIndent: true
103
+ tabSize: 2
104
+ indentWithTabs: false
105
+
106
+ css:
107
+ name: "CSS"
108
+ extension: ".css"
109
+ defaultContent: "/* You are currently in raw CSS mode. */"
110
+
111
+ javascript:
112
+ name: "Javascript"
113
+ extension: ".js"
114
+ defaultContent: "/* You are currently in raw JS mode. */"
115
+
116
+
117
+
@@ -0,0 +1,14 @@
1
+ CodeSync.ProjectAssets = Backbone.Collection.extend
2
+ url: ()->
3
+ CodeSync.get("serverInfoEndpoint")
4
+
5
+ parse: (response)->
6
+ models = for path in _.uniq(response.project_assets)
7
+ description = path.replace(response.root,'')
8
+ {path,description}
9
+
10
+ models
11
+
12
+ initialize: ()->
13
+ @fetch()
14
+ Backbone.Collection::initialize.apply(@, arguments)
@@ -0,0 +1,415 @@
1
+ #= require skim
2
+ #= require_tree ./templates
3
+ #= require_tree ./datasources
4
+ #= require_tree ./plugins
5
+ #= require_self
6
+
7
+ CodeSync.AssetEditor = Backbone.View.extend
8
+ name: "code_sync"
9
+ className: "codesync-editor"
10
+
11
+ # Valid options are top, bottom, static
12
+ position: "top"
13
+
14
+ # Controls whether or not a toolbar element
15
+ # should be displayed. Certain plugins will
16
+ # render their buttons etc in the toolbar
17
+ enableToolbar: true
18
+
19
+ # Valid options are: true, "all", "success", "error"
20
+ enableStatusMessages: true
21
+
22
+ autoRender: true
23
+ autoAppend: true
24
+ appendTo: "body"
25
+
26
+ renderVisible: true
27
+
28
+ effect: "slide"
29
+ effectDuration: 400
30
+
31
+ editorChangeThrottle: 800
32
+
33
+ visible: false
34
+ showVisibleTab: true
35
+ hideable: true
36
+
37
+ startMode: "scss"
38
+ theme: "ambiance"
39
+
40
+ keyBindings: ""
41
+
42
+ events:
43
+ "click .status-message" : "removeStatusMessages"
44
+ "click .hide-button" : "hide"
45
+
46
+ plugins:[
47
+ "DocumentTabs"
48
+ "ModeSelector"
49
+ "PreferencesPanel"
50
+ "ElementSync"
51
+ "KeymapSelector"
52
+ ]
53
+
54
+ pluginOptions: {}
55
+
56
+ views: {}
57
+
58
+ initialize: (@options={})->
59
+ _.extend(@, @options)
60
+
61
+ Backbone.View::initialize.apply(@, arguments)
62
+
63
+ console.log "Creatin Instance", @name, @cid, @
64
+
65
+ CodeSync.AssetEditor.instances[@name || @cid] = @
66
+
67
+ _.bindAll(@, "editorChangeHandler")
68
+
69
+ @modes = CodeSync.Modes.get()
70
+ @documentManager = new CodeSync.DocumentManager(editor: @)
71
+
72
+ @startMode = @modes.get(@startMode) || CodeSync.Modes.defaultMode()
73
+
74
+
75
+ @on "editor:change", _.debounce(@editorChangeHandler, @editorChangeThrottle), @
76
+
77
+ @on "codemirror:setup", ()=> @loadDefaultDocument()
78
+
79
+ @$el.html JST["code_sync/editor/templates/asset_editor"]()
80
+
81
+ @$el.attr('data-codesync', @name) if @name?
82
+
83
+ @loadPlugins()
84
+
85
+ @setPosition(@position, false)
86
+
87
+ @render() unless @autoRender is false
88
+
89
+ addPlugin: (plugin)->
90
+ CodeSync.plugins[plugin]?.setup.call(@,@)
91
+
92
+ loadPlugins: ()->
93
+ for plugin in @plugins when CodeSync.plugins[plugin]?
94
+ options = @pluginOptions[plugin] || {}
95
+ PluginClass = CodeSync.plugins[plugin]
96
+
97
+ PluginClass.setup.call(@,@,options)
98
+
99
+ render: ()->
100
+ return @ if @rendered is true
101
+
102
+ @setupToolbar()
103
+
104
+ @delegateEvents()
105
+
106
+ @rendered = true
107
+
108
+ if @autoAppend is true
109
+ $(@appendTo).prepend(@el)
110
+
111
+ if @renderHidden is true
112
+ @show()
113
+
114
+ setTimeout ()=>
115
+ @hide()
116
+ , 900
117
+
118
+ if @renderVisible is true
119
+ @show()
120
+
121
+ @
122
+
123
+ setupCodeMirror: ()->
124
+ return if @codeMirror?
125
+
126
+ @height ||= @$el.height()
127
+ @codeMirror = CodeMirror(@$('.codesync-asset-editor')[0], @getCodeMirrorOptions())
128
+
129
+ @on "initial:document:load", ()=>
130
+ if @startMode
131
+ @setMode(@startMode)
132
+
133
+ if @keyBindings
134
+ @setKeyMap(@keyBindings)
135
+
136
+ if @theme ||= localStorage.getItem("codesync:theme")
137
+ @setTheme(@theme)
138
+
139
+ changeHandler = (changeObj)=>
140
+ @trigger "editor:change", @codeMirror.getValue(), changeObj
141
+
142
+ @codeMirror.on "change", _.debounce(changeHandler, @editorChangeThrottle)
143
+
144
+ @trigger "codemirror:setup", @codeMirror
145
+
146
+ @
147
+
148
+ codeMirrorKeyBindings:
149
+ "Ctrl+Command+1": ()->
150
+ CodeSync.get("commandOne")?.call?(@)
151
+
152
+ "Ctrl+Command+2": ()->
153
+ CodeSync.get("commandTwo")?.call?(@)
154
+
155
+ "Ctrl+Command+3": ()->
156
+ CodeSync.get("commandThree")?.call(@)
157
+
158
+ getCodeMirrorOptions: ()->
159
+ passthrough = {}
160
+
161
+ for keyCommand, handler of @codeMirrorKeyBindings
162
+ passthrough[keyCommand] = false
163
+ key(keyCommand,_.bind(handler, @))
164
+
165
+ options =
166
+ theme: 'lesser-dark'
167
+ lineNumbers: true
168
+ mode: (@startMode?.get("codeMirrorMode") || CodeSync.get("defaultFileType"))
169
+ extraKeys: passthrough
170
+
171
+ editorChangeHandler: (editorContents)->
172
+ @currentDocument.set("contents", editorContents)
173
+
174
+ setPosition: (@position="top", show=true)->
175
+ for available in ["top","bottom","static"] when available isnt @position
176
+ @$el.removeClass("#{ available }-positioned")
177
+
178
+ @$el.addClass("#{ @position }-positioned")
179
+ @$el.removeAttr('style')
180
+
181
+ @show() if show is true
182
+
183
+ @
184
+
185
+ setKeyMap: (keyMap)->
186
+ if @keyMap? and keyMap isnt @keyMap
187
+ @trigger "change:keyMap", keyMap, @keyMap
188
+ @onKeyMapChange?.call(@,keyMap,@keyMap)
189
+
190
+ @codeMirror.setOption 'keyMap', @keyMap = keyMap
191
+
192
+ setTheme: (theme)->
193
+ if @theme? and theme isnt @theme
194
+ @trigger "change:theme", theme, @theme
195
+ @onThemeChange?.call(@,theme,@theme)
196
+
197
+ @$el.attr("data-codesync-theme", @theme = theme)
198
+ @codeMirror.setOption 'theme', @theme = theme
199
+
200
+ setMode: (newMode)->
201
+
202
+ if @mode? and (newMode isnt @mode)
203
+ @trigger "change:mode", newMode, newMode.id
204
+ @onModeChange?.call(@,newMode,@mode)
205
+
206
+ @mode = newMode
207
+
208
+ @$el.attr("data-codesync-mode", @mode.id)
209
+
210
+ if @mode?.get?
211
+ @codeMirror.setOption 'mode', @mode.get("codeMirrorMode")
212
+ @currentDocument.set('mode', @mode.id)
213
+ @currentDocument.set('extension', CodeSync.Modes.guessExtensionFor(@mode.id) )
214
+
215
+ @
216
+
217
+ setCodeMirrorOptions: (options={})->
218
+ for option,value of options
219
+ @codeMirror.setOption(option,value)
220
+
221
+ setupToolbar: ()->
222
+ @$('.toolbar-wrapper').hide() unless @enableToolbar
223
+
224
+ if @hideable is true
225
+ @$('.toolbar-wrapper').append "<div class='button hide-button'>Hide</div>"
226
+
227
+ getDefaultDocument: ()->
228
+ defaultOptions =
229
+ mode: @options.startMode || CodeSync.get("defaultFileType")
230
+ sticky: true
231
+ doNotSave: true
232
+ name: @defaultDocumentName || "codesync"
233
+ display: "CodeSync"
234
+
235
+ options = _.extend(defaultOptions, @document)
236
+
237
+ defaultDocument = new CodeSync.Document(options)
238
+
239
+ # This is broken apart into separate methods
240
+ # so that plugins can tap in
241
+ loadDefaultDocument: ()->
242
+ @documentManager.openDocument(@getDefaultDocument(), @)
243
+
244
+ loadDocument: (doc)->
245
+ if current = @currentDocument
246
+ current.off "status", @showStatusMessage
247
+ current.off "change:compiled", @applyDocumentContentToPage
248
+ current.off "change:mode", @applyDocumentContentToPage, @
249
+
250
+ @previousDocument = current
251
+ else
252
+ @trigger "initial:document:load", @currentDocument = doc
253
+
254
+ doc.on "status", @showStatusMessage, @
255
+ doc.on "change:compiled", @applyDocumentContentToPage, @
256
+ doc.on "change:mode", @syncEditorModeWithDocument, @
257
+
258
+ @codeMirror.swapDoc doc.toCodeMirrorDocument()
259
+ @trigger "document:loaded", doc, @previousDocument
260
+
261
+ @setCodeMirrorOptions doc.toCodeMirrorOptions()
262
+
263
+ @currentDocument = doc
264
+
265
+ syncEditorModeWithDocument: ()->
266
+ if @currentDocument? && (@currentDocument.toMode() isnt @mode)
267
+ @setMode @currentDocument.toMode()
268
+
269
+ applyDocumentContentToPage: ()->
270
+ @currentDocument?.loadInPage complete: ()=>
271
+ if @currentDocument.type() is "script" or @currentDocument.type() is "template"
272
+ CodeSync.onScriptChange?.call(window, @currentDocument.attributes)
273
+
274
+ if @currentDocument.type() is "stylesheet"
275
+ CodeSync.onStylesheetChange?.call(window, @currentDocument.attributes)
276
+
277
+ @trigger "code:sync", @currentDocument
278
+ @trigger "code:sync:#{ @currentDocument.type() }", @currentDocument, JST?[@currentDocument.nameWithoutExtension()]
279
+
280
+ removeStatusMessages: ()->
281
+ @$('.status-message').remove()
282
+
283
+ showError: (message)->
284
+ @showStatusMessage type:"error", message: message
285
+
286
+ showStatusMessage:(options={})->
287
+ @removeStatusMessages()
288
+
289
+ allowedTypes = switch @enableStatusMessages
290
+ when false
291
+ []
292
+ when true, "all"
293
+ ["success","error","notice"]
294
+ else
295
+ [@enableStatusMessages]
296
+
297
+ return unless _(allowedTypes).indexOf(options.type) >= 0
298
+
299
+ if options.message?.length > 0
300
+ @$el.prepend "<div class='status-message #{ options.type }'>#{ options.message }</div>"
301
+
302
+ if options.type is "success"
303
+ _.delay ()=>
304
+ @$('.status-message.success').animate({opacity:0}, duration: 400, complete: ()=> @$('.status-message.success').remove())
305
+ , 1200
306
+
307
+ hintHeight: ()->
308
+ offset = if @showVisibleTab then @$('.document-tabs-container').height() else 0
309
+
310
+ visibleStyleSettings: ()->
311
+ if @position is "static"
312
+ settings = {}
313
+
314
+ if @position is "top"
315
+ settings =
316
+ top: '0px'
317
+
318
+ if @position is "bottom"
319
+ settings =
320
+ bottom: '0px'
321
+ height: '400px'
322
+
323
+ settings
324
+
325
+ hiddenStyleSettings: ()->
326
+ if @position is "static"
327
+ settings = {}
328
+
329
+ if @position is "top"
330
+ settings =
331
+ top: ((@$el.height() + 8) * -1 ) + @hintHeight()
332
+ bottom: 'auto'
333
+
334
+ if @position is "bottom"
335
+ settings =
336
+ bottom: '0px'
337
+ height: "#{ @hintHeight() - 8 }px"
338
+
339
+ settings
340
+
341
+ hide: (withEffect=true)->
342
+ console.trace()
343
+
344
+ @animating = true
345
+
346
+ view.trigger("editor:hidden") for viewName, view of @views
347
+ @$el.removeAttr('data-visible') if @hideable
348
+
349
+ completeFn = _.debounce ()=>
350
+ @visible = false
351
+ @animating = false
352
+ , @effectDuration + 20
353
+
354
+ if withEffect isnt false
355
+ @$el.animate @hiddenStyleSettings(), duration: @effectDuration, complete: completeFn
356
+ _.delay(completeFn, @effectDuration)
357
+ else
358
+ completeFn()
359
+
360
+ @
361
+
362
+ show: (withEffect=true)->
363
+ @setupCodeMirror()
364
+
365
+ @animating = true
366
+
367
+ view.trigger("editor:visible") for viewName, view of @views
368
+ @$el.attr('data-visible',true) if @hideable
369
+
370
+ completeFn = _.debounce ()=>
371
+ @visible = true
372
+ @animating = false
373
+ , @effectDuration
374
+
375
+ if withEffect isnt false
376
+ @$el.removeAttr('style').css('top','').css('bottom','')
377
+ @$el.animate @visibleStyleSettings(), duration: @effectDuration, complete: completeFn
378
+ _.delay(completeFn, @effectDuration)
379
+ else
380
+ completeFn()
381
+
382
+ @
383
+
384
+ toggle: ()->
385
+ return if @animating is true
386
+
387
+ if @visible is true
388
+ @hide(true)
389
+ else
390
+ @show(true)
391
+
392
+ CodeSync.AssetEditor.instances = {}
393
+
394
+ # Private Helpers
395
+ CodeSync.commands =
396
+ commandOne: ->
397
+ commandTwo: ->
398
+ commandThree: ->
399
+
400
+ CodeSync.AssetEditor.keyboardShortcutInfo = """
401
+ ctrl+j: toggle editor ctrl+t: open asset
402
+ """
403
+
404
+ CodeSync.AssetEditor.toggleEditor = _.debounce (options={})->
405
+ if window.codeSyncEditor?
406
+ window.codeSyncEditor.toggle()
407
+ else
408
+ window.codeSyncEditor = new CodeSync.AssetEditor(options)
409
+ $('body').prepend(window.codeSyncEditor.render().el)
410
+ window.codeSyncEditor.show()
411
+ , 1
412
+
413
+ CodeSync.AssetEditor.setHotKey = (hotKey, options={})->
414
+ CodeSync.set("editorToggleHotkey", hotKey)
415
+ key(hotKey, ()-> CodeSync.AssetEditor.toggleEditor(options))