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,106 @@
1
+ CodeSync.AssetSelector = Backbone.View.extend
2
+ className: "codesync-asset-selector"
3
+
4
+ events:
5
+ "keyup input": "keyHandler"
6
+ "click .search-result": "selectSearchResult"
7
+
8
+ initialize:(options={})->
9
+ Backbone.View::initialize.apply(@, arguments)
10
+
11
+ @editor = options.editor
12
+
13
+ _.bindAll(@,"keyHandler","loadAsset")
14
+
15
+ @selected = new Backbone.Model(index: -1)
16
+
17
+ @selected.on "change:index", (model,value)=>
18
+ @$('.search-result').removeClass('active')
19
+ @$('.search-result').eq(value).addClass('active')
20
+
21
+ keyHandler: (e)->
22
+ switch e.keyCode
23
+ when 13
24
+ @openCurrentSearchResult()
25
+ when 27
26
+ @hide()
27
+ when 38
28
+ @previousSearchResult()
29
+ when 40
30
+ @nextSearchResult()
31
+ else
32
+ @filterAssetsBy @$('input').val()
33
+
34
+ openCurrentSearchResult: ()->
35
+ {index} = @selected.attributes
36
+
37
+ if asset = @searchResults[index]
38
+ @selected.set('index',0,silent:true)
39
+
40
+ _.delay ()=>
41
+ @loadAsset @searchResults[index].get('path')
42
+ , 10
43
+ @hide()
44
+
45
+ previousSearchResult: ()->
46
+ {index} = @selected.attributes
47
+ index -= 1
48
+ index = 0 if index < 0
49
+ @selected.set {index}
50
+
51
+ nextSearchResult: ()->
52
+ {index} = @selected.attributes
53
+ index += 1
54
+ index = 0 if index > @searchResults.length
55
+ @selected.set {index}
56
+
57
+ selectSearchResult: (e)->
58
+ @loadAsset $(e.target)?.data('path')
59
+
60
+ loadAsset: (path)->
61
+ @trigger "asset:selected", path
62
+
63
+ filterAssetsBy: (value)->
64
+ return if value.length <= 1
65
+
66
+ wrapper = @showSearchResults()
67
+ wrapper.empty()
68
+
69
+ @selected.set('index',-1, silent: true)
70
+
71
+ @searchResults = @collection.select (model)->
72
+ regex = new RegExp("#{value}")
73
+ model.get("description")?.match(regex) || model.get("path")?.match(regex)
74
+
75
+ @searchResults = @searchResults.slice(0,5)
76
+
77
+ for model,index in @searchResults
78
+ wrapper.append "<div data-path='#{ model.get('path') }' class='search-result'>#{ model.get('description') }</div>"
79
+
80
+ wrapper.height( @searchResults.length * 40 )
81
+
82
+ showSearchResults: ()->
83
+ @wrapper.show()
84
+
85
+ hideSearchResults: ()->
86
+ @wrapper.hide()
87
+
88
+ toggle: ()->
89
+ if @visible then @hide() else @show()
90
+
91
+ show: ()->
92
+ @wrapper.empty()
93
+ @visible = true
94
+ @$el.show()
95
+ @hideSearchResults()
96
+ @$('input').val('').focus()
97
+
98
+ hide: ()->
99
+ @$el.hide()
100
+ @visible = false
101
+ @editor.codeMirror.focus()
102
+
103
+ render: ()->
104
+ @$el.html JST["code_sync/editor/templates/asset_selector"]()
105
+ @wrapper ||= @$('.search-results-wrapper')
106
+ @
@@ -0,0 +1,83 @@
1
+ CodeSync.plugins.ColorPicker = Backbone.View.extend
2
+ className: "codesync-color-picker"
3
+
4
+ widget: false
5
+
6
+ spectrumOptions:
7
+ showAlpha: false
8
+ preferredFormat: "hex6"
9
+ flat: true
10
+ showInput: true
11
+ chooseText: "Choose"
12
+
13
+
14
+ initialize: (@options={})->
15
+ _.extend(@,@options)
16
+
17
+ @$el.append "<input type='color' class='color-picker-widget' />"
18
+
19
+ @widget = @$('.color-picker-widget')
20
+
21
+ remove: ()->
22
+ @widget.spectrum("destroy")
23
+ @$el.remove()
24
+
25
+ hide: ()->
26
+ @widget.spectrum("hide")
27
+ @$el.hide()
28
+
29
+ @off "color:change"
30
+
31
+ show: ()->
32
+ @widget.spectrum("show")
33
+ @$el.addClass('anchored') unless @widget
34
+ @$el.show()
35
+
36
+ syncWithToken: (token, cursor)->
37
+
38
+ cm = @editor.codeMirror
39
+
40
+ if @widget is true
41
+ @$el.removeClass('anchored')
42
+ cm.addWidget(cursor, @el)
43
+
44
+ @show()
45
+
46
+ line = cm.getLine(cursor.line)
47
+
48
+ startch = token.start
49
+ endch = token.end
50
+
51
+ @widget.spectrum("set",token.string)
52
+
53
+ @on "color:change", _.debounce (colorObject, hexValue)=>
54
+ cm.replaceRange("#"+hexValue, {line:cursor.line,ch:startch}, {line:cursor.line,ch:endch})
55
+ , 1200
56
+
57
+
58
+ render: ()->
59
+ opts = _.extend @spectrumOptions,
60
+ move: _.debounce((color)=>
61
+ @trigger "color:change", color, color.toHex()
62
+ ,200)
63
+
64
+ @widget.spectrum(@spectrumOptions)
65
+
66
+ @
67
+
68
+ CodeSync.plugins.ColorPicker.setup = (editor)->
69
+ @colorPicker = new CodeSync.plugins.ColorPicker(editor: editor)
70
+
71
+ @$el.append( editor.colorPicker.render().el )
72
+ @colorPicker.hide()
73
+
74
+ cm = editor.codeMirror
75
+
76
+ cm.on "cursorActivity", ->
77
+ cursor = cm.getCursor()
78
+ token = cm.getTokenAt(cursor)
79
+
80
+ if token.string?.match(/#[a-fA-F0-9]{3,6}/g) and token.string?.length >= 6
81
+ editor.colorPicker.syncWithToken(token, cursor)
82
+ else
83
+ editor.colorPicker.hide()
@@ -0,0 +1,55 @@
1
+ CodeSync.DocumentManager = Backbone.Model.extend
2
+ initialize: (@attributes={})->
3
+ @editor = @attributes.editor
4
+ delete @attributes.editor
5
+
6
+ @openDocuments = new CodeSync.Documents()
7
+
8
+ for trigger in ["add","remove","change:display","change:sticky"]
9
+ @openDocuments.on(trigger, @notify, @)
10
+
11
+ Backbone.Model::initialize.apply(@,arguments)
12
+
13
+ # In multiple setups with multiple editors
14
+ # the DocumentManager can act as a singleton
15
+ # and route documents to multiple editors
16
+ getEditor: ()->
17
+ @editor || _(CodeSync.AssetEditor.instances).values()[0]
18
+
19
+ detect: (iterator)->
20
+ @openDocuments.each(iterator)
21
+
22
+ each: (iterator)->
23
+ @openDocuments.each(iterator)
24
+
25
+ notify: ()->
26
+ @trigger "document:change"
27
+
28
+ openDocument: (doc, editor)->
29
+ editor ||= @getEditor()
30
+
31
+ @openDocuments.add(doc)
32
+ @setCurrentDocument(doc, editor)
33
+
34
+ setCurrentDocument: (@currentDocument, editor)->
35
+ editor ||= @editor
36
+ editor.loadDocument(@currentDocument)
37
+
38
+ saveDocument: ()->
39
+ if CodeSync.get("disableAssetSave")
40
+ @getEditor().showError("Saving is disabled.")
41
+ else
42
+ @currentDocument.saveToDisk()
43
+
44
+ createDocument: (editor)->
45
+ editor ||= @getEditor()
46
+ mode = editor.mode?.id || CodeSync.get("defaultFileType")
47
+ extension = CodeSync.Modes.guessExtensionFor(mode)
48
+
49
+ doc = new CodeSync.Document
50
+ name: "untitled"
51
+ display: "Untitled"
52
+ mode: mode
53
+ extension: extension
54
+
55
+ @openDocument(doc,editor)
@@ -0,0 +1,178 @@
1
+ CodeSync.plugins.DocumentTabs = Backbone.View.extend
2
+
3
+ # Save, Open, New tabs
4
+ includeActionTabs: true
5
+
6
+ allowNew: true
7
+
8
+ allowOpen: true
9
+
10
+ allowSave: (CodeSync.get("allowSaving") is true)
11
+
12
+ events:
13
+ "click .selectable" : "onDocumentTabSelection"
14
+ "click .closable .close-anchor": "closeTab"
15
+ "click .new-document" : "createDocument"
16
+ "click .save-document" : "saveDocument"
17
+ "click .open-document": "toggleAssetSelector"
18
+ "dblclick .editable": "onDoubleClickTab"
19
+ "blur .editable .contents": "onEditableTabBlur"
20
+ "keydown .editable .contents": "onEditableTabKeyPress"
21
+
22
+
23
+ tabTemplate: JST["code_sync/editor/templates/document_manager_tab"]
24
+
25
+ views: {}
26
+
27
+ initialize: (@options={})->
28
+ _.extend(@, options)
29
+
30
+ @editor = options.editor
31
+ @manager = @editor.documentManager
32
+ @docs = @manager.openDocuments
33
+
34
+ @manager.on "document:change", @renderTabs, @
35
+
36
+ @projectAssets = new CodeSync.ProjectAssets()
37
+
38
+ @on "editor:hidden", ()=>
39
+ @$('.document-tab.hideable').hide()
40
+
41
+ @on "editor:visible", ()=>
42
+ @$('.document-tab.hideable').show()
43
+
44
+ @views.assetSelector = new CodeSync.AssetSelector
45
+ collection: @projectAssets
46
+ documents: @docs
47
+ editor: @editor
48
+
49
+ @views.assetSelector.on "asset:selected", @onAssetSelection, @
50
+
51
+ Backbone.View::initialize.apply(@, arguments)
52
+
53
+ tabsContainer: ()->
54
+ el = @$('.document-tabs-container')
55
+
56
+ documentInTab: (tabElement)->
57
+ tabElement = tabElement.parents('.document-tab').eq(0) unless tabElement.is('.document-tab')
58
+
59
+ if cid = tabElement.data('document-cid')
60
+ doc = @docs.detect (model)->
61
+ model.cid == cid
62
+
63
+ renderTabs: ()->
64
+ container = @tabsContainer().empty()
65
+
66
+ tmpl = @tabTemplate
67
+
68
+ @docs.each (doc,index)=>
69
+ unless @skipTabForDefault is true and index is 0
70
+ container.append tmpl(doc: doc, index: index, closable: !!(index > 0))
71
+
72
+ if @includeActionTabs
73
+ @addOpenDocumentTab() if @allowOpen
74
+ @addNewDocumentTab() if @allowNew
75
+
76
+ addOpenDocumentTab: ()->
77
+ @tabsContainer().append @tabTemplate(display:"Open",cls:"open-document")
78
+
79
+ addNewDocumentTab: ()->
80
+ @tabsContainer().append @tabTemplate(display:"New",cls:"new-document")
81
+
82
+ addSaveDocumentTab: ()->
83
+ @tabsContainer().append @tabTemplate(display:"Save",cls:"save-document")
84
+
85
+ onAssetSelection: (path)->
86
+ @docs.findOrCreateForPath path, (doc)=>
87
+ @manager.openDocument(doc, @editor)
88
+
89
+ onEditableTabKeyPress: (e)->
90
+ target = @$(e.target).closest('.document-tab')
91
+ contents = target.children('.contents')
92
+
93
+ console.log "On Editable Tab Keypress", e.keyCode, e.which
94
+
95
+ if e.keyCode is 13 or e.keyCode is 27
96
+ e.preventDefault()
97
+
98
+ contents.attr('contenteditable', false)
99
+
100
+ if doc = @documentInTab(target)
101
+ if e.keyCode is 13
102
+ doc.set('name', contents.html() )
103
+
104
+ if e.keyCode is 27 and original = target.attr('data-original-value')
105
+ contents.html(original)
106
+
107
+ @restoreFocus()
108
+
109
+ restoreFocus: ()->
110
+ @editor.codeMirror.focus()
111
+
112
+ onEditableTabBlur: (e)->
113
+ console.log "On Editable Tab Blur"
114
+
115
+ target = @$(e.target).closest('.document-tab')
116
+ contents = target.children('.contents')
117
+
118
+ if doc = @documentInTab(target)
119
+ doc.set('name', contents.html() )
120
+ contents.attr('contenteditable', false)
121
+
122
+ onDoubleClickTab: (e)->
123
+ console.log "On Double Click Tab"
124
+
125
+ target = @$(e.target).closest('.document-tab')
126
+ contents = target.children('.contents')
127
+
128
+ target.attr('data-original-value', contents.html())
129
+ contents.attr('contenteditable',true)
130
+
131
+ onDocumentTabSelection: (e)->
132
+ @trigger "tab:click"
133
+ target = @$(e.target).closest('.document-tab')
134
+ doc = @documentInTab(target)
135
+
136
+ @manager.setCurrentDocument(doc, @editor)
137
+
138
+ closeTab: (e)->
139
+ target = @$(e.target)
140
+ doc = @documentInTab(target)
141
+
142
+ index = @docs.indexOf(doc)
143
+ @docs.remove(doc)
144
+
145
+ @manager.setCurrentDocument( @docs.at(index - 1) || @docs.at(0), @editor )
146
+
147
+ createDocument: ()->
148
+ @manager.createDocument()
149
+
150
+ toggleAssetSelector: ()->
151
+ @views.assetSelector.toggle()
152
+
153
+ render: ()->
154
+ @$el.append "<div class='document-tabs-container' />"
155
+ @$el.append( @views.assetSelector.render().el )
156
+
157
+ @
158
+
159
+
160
+ CodeSync.plugins.DocumentTabs.setup = (editor, options={})->
161
+ options.editor = editor
162
+
163
+ dm = @views.documentTabs = new CodeSync.plugins.DocumentTabs(options)
164
+
165
+ # _.extend editor.codeMirrorKeyBindings,
166
+ # "Ctrl-T": ()->
167
+ # dm.toggleAssetSelector()
168
+
169
+ # "Ctrl-S": ()->
170
+ # dm.getCurrentDocument().save()
171
+
172
+ # "Ctrl-N": ()->
173
+ # dm.createDocument()
174
+
175
+ @$el.append(dm.render().el)
176
+
177
+ dm.on "tab:click", ()=>
178
+ @show() if @visible is false
@@ -0,0 +1,111 @@
1
+ CodeSync.plugins.ElementSync = Backbone.View.extend
2
+
3
+ className : "codesync-element-sync toggleable-input"
4
+
5
+ action: "html"
6
+
7
+ events:
8
+ "keyup input" : ()->
9
+ @bindToSelector()
10
+
11
+ "change select": (e)->
12
+ @action = @$(e.target).val()
13
+
14
+ "click .hide-panel-button" : ()->
15
+ @hide()
16
+
17
+ "click .done-button" : ()->
18
+ @clear()
19
+
20
+ initialize: (@options={})->
21
+ _.extend(@,@options)
22
+
23
+ @bindToSelector = _.debounce ()=>
24
+ @selector = @getValue()
25
+ @$elementSync = $(@selector)
26
+ @status()
27
+ , 500
28
+
29
+
30
+ @editor.on "code:sync:template", @syncWithElement, @
31
+
32
+ @editor.on "change:mode", (mode)=>
33
+ if mode.isTemplate()
34
+ @toggleButton(true)
35
+ else
36
+ @hide()
37
+ @toggleButton(false)
38
+
39
+ @visible = false
40
+ @$el.hide()
41
+ @toggleButton(false)
42
+
43
+ syncWithElement: (doc, templateFn)->
44
+ @selector && @$elementSync?[@action || "html"]?(templateFn())
45
+
46
+ getSelectorContents: ()->
47
+ @$(@selector).html()
48
+
49
+ getValue: ()->
50
+ @$('input[name="css-selector"]').val()
51
+
52
+ clear: ()->
53
+ @$('input[name="css-selector"]').val('')
54
+ @$elementSync = undefined
55
+ @selector = ''
56
+ @$('.element-sync-status').html("")
57
+
58
+ existsInDocument: ()->
59
+ @$elementSync?.length > 0
60
+
61
+ status: ()->
62
+ length = @$elementSync?.length
63
+
64
+ msg = if length is 0 && @getValue().length > 0
65
+ "CSS Selector not found"
66
+ else if length is 1
67
+ "1 total element"
68
+ else if length > 0
69
+ "#{ length } total elements"
70
+ else
71
+ ""
72
+
73
+ @$('.element-sync-status').html(msg)
74
+
75
+ render: ()->
76
+ @$el.html JST["code_sync/editor/templates/element_sync"]()
77
+ @status()
78
+
79
+ @
80
+
81
+ show: ()->
82
+ @visible = true
83
+ @$el.show()
84
+
85
+ hide: ()->
86
+ @visible = false
87
+ @$el.hide()
88
+
89
+ toggle:()->
90
+ if @visible then @hide() else @show()
91
+
92
+ toggleButton: (show=true)->
93
+ if show
94
+ @editor.$('.toggle-element-sync').show()
95
+ else
96
+ @editor.$('.toggle-element-sync').hide()
97
+
98
+
99
+ CodeSync.plugins.ElementSync.setup = (editor)->
100
+ @$('.toolbar-wrapper').append "<div class='button toggle-element-sync'>Sync w/ Element</div>"
101
+
102
+ view = new CodeSync.plugins.ElementSync({editor})
103
+
104
+ editor.views.elementSync = view
105
+
106
+ @events["click .toggle-element-sync"] = ()=>
107
+ view.toggle()
108
+
109
+ @$el.append view.render().el
110
+
111
+