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,104 @@
1
+ #= require_self
2
+ #= require ./util
3
+
4
+ class CodeSync.Client
5
+
6
+ @_clients: []
7
+
8
+ @get: ()->
9
+ CodeSync.Client._clients[0]
10
+
11
+ VERSION: CodeSync.VERSION
12
+
13
+ logLevel: 0
14
+
15
+ constructor: (options={})->
16
+
17
+ @logLevel = options.logLevel || 0
18
+
19
+ CodeSync.Client._clients.push(@)
20
+
21
+ CodeSync.util.loadScript "#{ CodeSync.get("socketEndpoint") }/client.js", ()=>
22
+ return if @clientLoaded is true
23
+
24
+ setTimeout ()=>
25
+ try
26
+ @setupSocket()
27
+ catch e
28
+ console.log "Error setting up codesync client"
29
+ , 25
30
+
31
+ @clientLoaded = true
32
+
33
+ subscribeWith: (cb)->
34
+ @socket?.subscribe "/code-sync/outbound", cb
35
+
36
+ setupSocket: ()->
37
+ return unless Faye?
38
+
39
+ @socket = new Faye.Client(CodeSync.get("socketEndpoint"))
40
+
41
+ @subscribeWith (notification)=>
42
+ if @logLevel > 0
43
+ console.log "Received notification on outbound channel", notification
44
+
45
+ @onNotification?.call?(@, notification)
46
+
47
+ if notification.name?.match(/\.js$/)
48
+ @onJavascriptNotification.call(@,notification)
49
+
50
+ if notification.name?.match(/\.css$/)
51
+ @onStylesheetNotification.call(@, notification)
52
+
53
+ javascriptCallbacks: []
54
+
55
+ stylesheetCallbacks: []
56
+
57
+ removeJavascriptCallbacks: ()->
58
+ @javascriptCallbacks = []
59
+
60
+ removeStylesheetCallbacks: ()->
61
+ @stylesheetCalbacks = []
62
+
63
+ afterJavascriptChange: (callback, clearExisting=false)->
64
+ @javascriptCallbacks ||= []
65
+ @javascriptCallbacks = [] if clearExisting is true
66
+ @javascriptCallbacks.push(callback)
67
+
68
+ afterStylesheetChange: (callback, clearExisting=false)->
69
+ @stylesheetCallbacks ||= []
70
+ @stylesheetCallbacks = [] if clearExisting is true
71
+ @stylesheetCallbacks.push(callback)
72
+
73
+ onJavascriptNotification: (notification)->
74
+ client = @
75
+
76
+ CodeSync.processing = true
77
+
78
+ if notification.source
79
+ sourceEval.call(window, notification.source)
80
+
81
+ for callback in client.javascriptCallbacks when callback.call?
82
+ callback.call(client, notification)
83
+
84
+ CodeSync.processing = false
85
+
86
+ return
87
+
88
+ if notification.path
89
+ console.log "notification", notification.path
90
+ CodeSync.util.loadScript "#{ CodeSync.get("sprocketsEndpoint") }/#{ notification.path }", ()->
91
+ for callback in client.javascriptCallbacks when callback.call?
92
+ callback.call(@, notification)
93
+
94
+ onStylesheetNotification: (notification)->
95
+ client = @
96
+
97
+ if notification.path && notification.name
98
+ CodeSync.util.loadStylesheet "#{ CodeSync.get("sprocketsEndpoint") }/#{ notification.path }", tracker: notification.name, ()->
99
+ for callback in client.stylesheetCallbacks when callback.call?
100
+ callback.call(@, notification)
101
+
102
+
103
+ sourceEval = (source)->
104
+ eval(source)
@@ -0,0 +1,61 @@
1
+ CodeSync.util ||= {}
2
+
3
+ loadedScripts = {}
4
+ scriptTimers = {}
5
+
6
+ CodeSync.util.loadStylesheet = (url, options={}, callback)->
7
+ ss = document.createElement("link")
8
+ ss.type = "text/css"
9
+ ss.rel = "stylesheet"
10
+ ss.href = url
11
+ ss.className = "code-sync-asset"
12
+
13
+ if options.tracker
14
+ $("link[data-tracker='#{ options.tracker }']").remove()
15
+ ss.setAttribute("data-tracker", options.tracker )
16
+
17
+ document.getElementsByTagName("head")[0].appendChild(ss);
18
+
19
+ callback?.call?(@)
20
+
21
+ CodeSync.util.loadScript = (url, options={}, callback) ->
22
+ loaded = loadedScripts
23
+ timers = scriptTimers
24
+
25
+ if typeof(options) is "function" and !callback?
26
+ callback = options
27
+ options = {}
28
+
29
+ head= document.getElementsByTagName('head')[0];
30
+ script = document.createElement("script")
31
+ script.src = url
32
+ script.type = "text/javascript"
33
+
34
+ that = @
35
+ onLoad = ()->
36
+ if typeof(callback) is "function"
37
+ callback.call(that, url, options, script)
38
+
39
+ try
40
+ head.removeChild(script)
41
+ catch e
42
+ true
43
+
44
+ loaded[url] = true
45
+
46
+ if options.once is true && loaded[url]
47
+ return false
48
+
49
+ head.appendChild(script)
50
+
51
+ script.onreadystatechange = ()->
52
+ if script.readyState is "loaded" or script.readyState is "complete"
53
+ onLoad()
54
+
55
+ script.onload = onLoad
56
+
57
+ if navigator?.userAgent.match(/WebKit/)
58
+ timers[url] = setInterval ()->
59
+ onLoad()
60
+ clearInterval(timers[url])
61
+ , 10
@@ -0,0 +1,12 @@
1
+ #= require ../vendor/vendored_codemirror
2
+ #= require ../vendor/codemirror-ruby
3
+ #= require ../vendor/codemirror-coffeescript
4
+ #= require ../vendor/codemirror-css
5
+ #= require ../vendor/codemirror-xml
6
+ #= require ../vendor/codemirror-javascript
7
+ #= require ../vendor/codemirror-htmlmixed
8
+ #= require ../vendor/codemirror-sass
9
+ #= require ../vendor/codemirror-haml
10
+ #= require ../vendor/codemirror-skim
11
+ #= require ../vendor/codemirror-vim
12
+ #= require ../vendor/codemirror-markdown
@@ -0,0 +1,38 @@
1
+ root = @
2
+
3
+ if typeof(exports) isnt "undefined"
4
+ CodeSync = exports
5
+ else
6
+ CodeSync = root.CodeSync = {}
7
+
8
+ CodeSync.VERSION = "<%= CodeSync::Version %>"
9
+
10
+ CodeSync.backends = {}
11
+
12
+ CodeSync.util = {}
13
+ CodeSync.plugins = {}
14
+
15
+ CodeSync._config ||=
16
+ defaultFileType: "coffeescript"
17
+ assetCompilationEndpoint: "http://localhost:9295/source"
18
+ serverInfoEndpoint: "http://localhost:9295/info"
19
+ sprocketsEndpoint: "http://localhost:9295/assets"
20
+ socketEndpoint: "http://localhost:9295/faye"
21
+ editorToggleHotkey: "ctrl+j"
22
+ debugMode: false
23
+
24
+ CodeSync.set = (setting, value)->
25
+ CodeSync._config[setting] = value
26
+
27
+ CodeSync.get = (setting)->
28
+ CodeSync._config[setting]
29
+
30
+ CodeSync.enableLogging = ()->
31
+ CodeSync.set("debugMode", true)
32
+
33
+ CodeSync.log = (args...)->
34
+ if CodeSync.get("debugMode") isnt false
35
+ args.unshift "CodeSync Log:"
36
+ console.log args...
37
+
38
+ _originalSetOption = CodeMirror::setOption
@@ -0,0 +1,54 @@
1
+ #= require_tree ./templates
2
+ #= require_self
3
+
4
+ CodeSync.PryConsole = Backbone.View.extend
5
+ className: "codesync-pry-console"
6
+
7
+ endpoint: "http://localhost:9295/pry-console"
8
+
9
+ rendered: false
10
+
11
+ events:
12
+ "keydown input" : "processInput"
13
+ "submit form" : (e)->
14
+ e.preventDefault()
15
+
16
+ initialize: (@options={})->
17
+ _.extend(@, @options)
18
+ Backbone.View::initialize.apply(@,arguments)
19
+
20
+ processInput: (e)->
21
+ if e.keyCode is 13 and @getCode().length > 0
22
+ @sendCode(true)
23
+
24
+
25
+ sendCode: ()->
26
+ $.ajax
27
+ url: @endpoint
28
+
29
+ type: "POST"
30
+
31
+ success: (response)=>
32
+ console.log("Success", response)
33
+
34
+ error: (response)=>
35
+ console.log("Error", response)
36
+
37
+ data:
38
+ code: @getCode()
39
+
40
+
41
+ getCode: ()->
42
+ @$('input#code').val()
43
+
44
+ render: ()->
45
+ @$el.html JST["code_sync/console/templates/console"](endpoint: @endpoint)
46
+ @rendered = true
47
+ @
48
+
49
+ CodeSync.PryConsole.renderSingleton = (renderToElement)->
50
+ renderToElement ||= $('body')
51
+
52
+ window.codeSyncConsole?.remove()
53
+ window.codeSyncConsole = new CodeSync.PryConsole()
54
+ $(renderToElement).html(codeSyncConsole.render().el)
@@ -0,0 +1,10 @@
1
+ form accept-charset="UTF-8" action="#{ @consoleEndpoint }" method="POST"
2
+ input name="utf8" type="hidden" value="✓"
3
+
4
+ .results_wrapper
5
+ .results
6
+
7
+ .input
8
+ span.prompt >>>
9
+ span.input_box
10
+ input#code name="code" type="text"
@@ -0,0 +1,6 @@
1
+ #= require ../vendor/keymaster.min
2
+ #= require ../vendor/jquery
3
+ #= require ../vendor/underscore-min
4
+ #= require ../vendor/underscore.string.min
5
+ #= require ../vendor/backbone-min
6
+ #= require ../vendor/spectrum
@@ -0,0 +1,212 @@
1
+ # Triggers
2
+ #
3
+ # status:
4
+ # - success
5
+
6
+ CodeSync.Document = Backbone.Model.extend
7
+ callbackDelay: 150
8
+
9
+ initialize: (@attributes,options)->
10
+ if localKey = @attributes.localStorageKey
11
+ @attributes.contents ||= localStorage.getItem(localKey)
12
+
13
+ Backbone.Model::initialize.apply(@, arguments)
14
+
15
+ _.bindAll @, "onContentChange"
16
+
17
+ @on "change:contents", @onContentChange
18
+
19
+ @on "change:name", ()=>
20
+ @set("mode", @determineMode())
21
+ @set("display", @nameWithoutExtension() )
22
+
23
+ @on "change:mode", ()=>
24
+ @set('extension', @determineExtension(), silent: true)
25
+
26
+ url: ()->
27
+ CodeSync.get("assetCompilationEndpoint")
28
+
29
+ saveToDisk: ()->
30
+ if @isSaveable()
31
+ @sendToServer(true, "saveToDisk")
32
+
33
+ saveToLocalStorage: (path)->
34
+ if path?
35
+ localStorage.setItem(path, @get("contents"))
36
+
37
+ loadSourceFromDisk: (callback)->
38
+ $.ajax
39
+ url: "#{ @url() }?path=#{ @get('path') }"
40
+ type: "GET"
41
+ success: (response={})=>
42
+ if response.success is true and response.contents?
43
+ @set("contents", response.contents, silent: true)
44
+ callback(@)
45
+
46
+ toJSON: ()->
47
+ name: @nameWithoutExtension()
48
+ path: @get('path')
49
+ extension: @get('extension') || @determineExtension()
50
+ contents: @toContent()
51
+
52
+ nameWithoutExtension: ()->
53
+ extension = @get('extension') || @determineExtension()
54
+ (@get("name") || "untitled").replace(extension,'')
55
+
56
+ toMode: ()->
57
+ mode = @get("mode") || @determineMode()
58
+ modeModel = CodeSync.Modes.getMode(mode)
59
+
60
+ toCodeMirrorMode: ()->
61
+ @toMode()?.get("codeMirrorMode")
62
+
63
+ toCodeMirrorDocument: ()->
64
+ CodeMirror.Doc @toContent(), @toCodeMirrorMode(), 0
65
+
66
+ toCodeMirrorOptions: ()->
67
+ @toMode().get("codeMirrorOptions")
68
+
69
+ toContent: ()->
70
+ "#{ @get("contents") || @toMode()?.get("defaultContent") || " " }"
71
+
72
+ onContentChange: ()->
73
+ localKey = @get("localStorageKey")
74
+ localKey = if localKey? && _.isFunction(localKey) then localKey.call(@) else localKey
75
+ localStorage.setItem(localKey, @get("contents"))
76
+
77
+ @sendToServer(false, "onContentChange")
78
+
79
+ sendToServer: (allowSaveToDisk=false, reason="")->
80
+ allowSaveToDisk = false unless @isSaveable()
81
+
82
+ data = if allowSaveToDisk is true then @toJSON() else _(@toJSON()).pick('name','extension','contents')
83
+
84
+ CodeSync.log("Sending Data To #{ CodeSync.get("assetCompilationEndpoint") }", data)
85
+
86
+ $.ajax
87
+ type: "POST"
88
+ url: CodeSync.get("assetCompilationEndpoint")
89
+ data: JSON.stringify(data)
90
+ error: (response)=>
91
+ CodeSync.log("Document Process Error", arguments)
92
+
93
+ success: (response)=>
94
+ CodeSync.log("Document Process Response", response)
95
+
96
+ if response.success is true
97
+ @trigger "status", type: "success", message: @successMessage(reason), compiled: response.compiled
98
+
99
+ if response.success is true and response.compiled?
100
+ @set("compiled", response.compiled)
101
+
102
+ if response.success is false and response.error?
103
+ @set("error", response.error?.message)
104
+ @trigger "status", type: "error", message: response.error?.message
105
+
106
+ loadInPage: (options={})->
107
+ if @type() is "stylesheet"
108
+ helpers.processStyleContent.call(@, @get('compiled'))
109
+ else if (@type() is "script" or @type() is "template")
110
+ helpers.processScriptContent.call(@, @get('compiled'))
111
+
112
+ if options.complete
113
+ _.delay(options.complete, (options.delay||@callbackDelay))
114
+
115
+ # Determines how we will handle the compiled assets when loading in the page
116
+ type: ()->
117
+ switch @get("mode")
118
+ when "css","sass","scss","less"
119
+ "stylesheet"
120
+ when "coffeescript","javascript"
121
+ "script"
122
+ when "skim","mustache","jst","haml","eco"
123
+ "template"
124
+
125
+ missingFileName: ()->
126
+ name = (@get('path') || @get('name'))
127
+ !name? || name.length is 0
128
+
129
+ # If this is an adHoc document that is not being saved to disk, or rather
130
+ # pulled from an existing asset on disk, then we will need to create an extension
131
+ # that is appropriate for the CodeMirror mode, for the purposes of on the fly compilation
132
+ determineExtension: ()->
133
+ filename = @get("path") || @get("name")
134
+
135
+ if extension = CodeSync.Document.getExtensionFor(filename)
136
+ return extension
137
+
138
+ if @get("mode")?
139
+ return CodeSync.Modes.guessExtensionFor( @get('mode') || CodeSync.get("defaultFileType") )
140
+
141
+ # Determine a CodeMirror mode setting appropriate for the file extension
142
+ determineMode: ->
143
+ path = @get("path") || @get("name") || @get("extension")
144
+ CodeSync.Modes.guessModeFor(path)
145
+
146
+ successMessage: (reason)->
147
+ if @type() is "template"
148
+ "Success. Template will be available as JST[\"#{ @nameWithoutExtension() }\"]"
149
+
150
+ isSticky: ()->
151
+ @get("sticky")? is true
152
+
153
+ isSaveable: ()->
154
+ @get("path")?.length > 0 && !@get("doNotSave")
155
+
156
+ CodeSync.Document.getFileNameFrom = (string="")->
157
+ string.split('/').pop()
158
+
159
+ CodeSync.Document.getExtensionFor = (string="")->
160
+ filename = CodeSync.Document.getFileNameFrom(string)
161
+
162
+ [fname,rest...] = filename.split('.')
163
+
164
+ if val = rest.length > 0 && rest.join('.')
165
+ ".#{ val }"
166
+
167
+ CodeSync.Documents = Backbone.Collection.extend
168
+ model: CodeSync.Document
169
+
170
+ initialize: (models,options)->
171
+ Backbone.Collection::initialize.apply(@, arguments)
172
+
173
+ if client = CodeSync.Client.get() && client?.socket?
174
+ client.subscribeWith (notification)->
175
+ console.log "Documents", notification
176
+
177
+ nextId: ()->
178
+ @models.length + 1
179
+
180
+ findByPath: (path)->
181
+ documentModel = @detect (documentModel)->
182
+ documentModel.get('path')?.match(path)
183
+
184
+ findOrCreateForPath: (path="", callback)->
185
+ if documentModel = @findByPath(path)
186
+ callback?(documentModel)
187
+ else
188
+ name = CodeSync.Document.getFileNameFrom(path)
189
+ extension = CodeSync.Document.getExtensionFor(name)
190
+ display = name.replace(extension,'')
191
+ id = @nextId()
192
+
193
+ documentModel = new CodeSync.Document({name,extension,display,path,id})
194
+
195
+ documentModel.loadSourceFromDisk ()=>
196
+ callback?(documentModel)
197
+
198
+ helpers =
199
+ processStyleContent: (content)->
200
+ $('head style[data-codesync-document]').remove()
201
+ $('head').append "<style type='text/css' data-codesync-document=true>#{ content }</style>"
202
+
203
+ processScriptContent: (code)->
204
+ doc = @
205
+ evalRunner = (code)->
206
+ try
207
+ eval(code)
208
+ catch e
209
+ doc.trigger "status", type: "error", message: "JS Error: #{ e.message }", sticky: true
210
+ throw(e)
211
+
212
+ evalRunner.call(window, code)