code_sync 0.6.7
Sign up to get free protection for your applications and to get access to all the features.
- data/.rvmrc +1 -0
- data/CNAME +1 -0
- data/Gemfile +24 -0
- data/Gemfile.lock +117 -0
- data/LICENSE.md +22 -0
- data/ROADMAP.md +20 -0
- data/TODO.md +14 -0
- data/bin/codesync +11 -0
- data/code_sync.gemspec +30 -0
- data/config/routes.rb +26 -0
- data/lib/assets/javascripts/canvas.coffee +12 -0
- data/lib/assets/javascripts/canvas/editors.coffee +48 -0
- data/lib/assets/javascripts/canvas/index.coffee +15 -0
- data/lib/assets/javascripts/canvas/layer_controller.coffee +47 -0
- data/lib/assets/javascripts/code_sync.coffee +3 -0
- data/lib/assets/javascripts/code_sync/backends/gist.coffee +78 -0
- data/lib/assets/javascripts/code_sync/client/index.coffee +104 -0
- data/lib/assets/javascripts/code_sync/client/util.coffee +61 -0
- data/lib/assets/javascripts/code_sync/codemirror.coffee +12 -0
- data/lib/assets/javascripts/code_sync/config.js.coffee.erb +38 -0
- data/lib/assets/javascripts/code_sync/console/index.coffee +54 -0
- data/lib/assets/javascripts/code_sync/console/templates/console.jst.skim +10 -0
- data/lib/assets/javascripts/code_sync/dependencies.coffee +6 -0
- data/lib/assets/javascripts/code_sync/editor/advanced.coffee +0 -0
- data/lib/assets/javascripts/code_sync/editor/datasources/document.coffee +212 -0
- data/lib/assets/javascripts/code_sync/editor/datasources/gist_loader.coffee +7 -0
- data/lib/assets/javascripts/code_sync/editor/datasources/modes.coffee +117 -0
- data/lib/assets/javascripts/code_sync/editor/datasources/project_assets.coffee +14 -0
- data/lib/assets/javascripts/code_sync/editor/index.coffee +415 -0
- data/lib/assets/javascripts/code_sync/editor/plugins/asset_selector.coffee +106 -0
- data/lib/assets/javascripts/code_sync/editor/plugins/color_picker.coffee +83 -0
- data/lib/assets/javascripts/code_sync/editor/plugins/document_manager.coffee +55 -0
- data/lib/assets/javascripts/code_sync/editor/plugins/document_tabs.coffee +178 -0
- data/lib/assets/javascripts/code_sync/editor/plugins/element_sync.coffee +111 -0
- data/lib/assets/javascripts/code_sync/editor/plugins/keymap_selector.coffee +44 -0
- data/lib/assets/javascripts/code_sync/editor/plugins/mode_selector.coffee +53 -0
- data/lib/assets/javascripts/code_sync/editor/plugins/name_input.coffee +44 -0
- data/lib/assets/javascripts/code_sync/editor/plugins/preferences.coffee +71 -0
- data/lib/assets/javascripts/code_sync/editor/templates/asset_editor.jst.skim +2 -0
- data/lib/assets/javascripts/code_sync/editor/templates/asset_selector.jst.skim +5 -0
- data/lib/assets/javascripts/code_sync/editor/templates/document_manager_tab.jst.skim +15 -0
- data/lib/assets/javascripts/code_sync/editor/templates/element_sync.jst.skim +19 -0
- data/lib/assets/javascripts/code_sync/editor/templates/preferences_panel.jst.skim +38 -0
- data/lib/assets/javascripts/code_sync/editor/views/asset_selector.coffee +106 -0
- data/lib/assets/javascripts/code_sync/editor/views/color_picker.coffee +76 -0
- data/lib/assets/javascripts/code_sync/editor/views/document_manager.coffee +176 -0
- data/lib/assets/javascripts/code_sync/editor/views/keymap_selector.coffee +37 -0
- data/lib/assets/javascripts/code_sync/editor/views/mode_selector.coffee +47 -0
- data/lib/assets/javascripts/code_sync/editor/views/name_input.coffee +44 -0
- data/lib/assets/javascripts/code_sync/editor/views/preferences.coffee +71 -0
- data/lib/assets/javascripts/code_sync/index.coffee +4 -0
- data/lib/assets/javascripts/code_sync/reloader.coffee +2 -0
- data/lib/assets/javascripts/code_sync_basic.coffee +1 -0
- data/lib/assets/javascripts/demos.coffee +48 -0
- data/lib/assets/javascripts/demos/default-content.coffee +72 -0
- data/lib/assets/javascripts/demos/layout_selector.coffee +19 -0
- data/lib/assets/javascripts/demos/tour.coffee +70 -0
- data/lib/assets/javascripts/demos/tour.jst.skim +29 -0
- data/lib/assets/javascripts/marketing.coffee +0 -0
- data/lib/assets/javascripts/vendor/.DS_Store +0 -0
- data/lib/assets/javascripts/vendor/backbone-events.js +160 -0
- data/lib/assets/javascripts/vendor/backbone-min.js +4 -0
- data/lib/assets/javascripts/vendor/codemirror-coffeescript.js +346 -0
- data/lib/assets/javascripts/vendor/codemirror-css.js +570 -0
- data/lib/assets/javascripts/vendor/codemirror-haml.js +153 -0
- data/lib/assets/javascripts/vendor/codemirror-htmlmixed.js +104 -0
- data/lib/assets/javascripts/vendor/codemirror-javascript.js +468 -0
- data/lib/assets/javascripts/vendor/codemirror-markdown.js +526 -0
- data/lib/assets/javascripts/vendor/codemirror-ruby.js +194 -0
- data/lib/assets/javascripts/vendor/codemirror-sass.js +330 -0
- data/lib/assets/javascripts/vendor/codemirror-skim.js +330 -0
- data/lib/assets/javascripts/vendor/codemirror-vim.js +3159 -0
- data/lib/assets/javascripts/vendor/codemirror-xml.js +328 -0
- data/lib/assets/javascripts/vendor/console.js +339 -0
- data/lib/assets/javascripts/vendor/gisted.js +27 -0
- data/lib/assets/javascripts/vendor/jquery-ui-resize-drag.min.js +6 -0
- data/lib/assets/javascripts/vendor/jquery.js +5 -0
- data/lib/assets/javascripts/vendor/keylauncher.js +4 -0
- data/lib/assets/javascripts/vendor/keymaster.min.js +4 -0
- data/lib/assets/javascripts/vendor/spectrum.js +1868 -0
- data/lib/assets/javascripts/vendor/underscore-min.js +1 -0
- data/lib/assets/javascripts/vendor/underscore.string.min.js +1 -0
- data/lib/assets/javascripts/vendor/vendored_codemirror.js +5558 -0
- data/lib/assets/javascripts/vendor/zepto.js +2 -0
- data/lib/assets/stylesheets/canvas.css.scss +101 -0
- data/lib/assets/stylesheets/code_sync.css.scss +4 -0
- data/lib/assets/stylesheets/code_sync/codemirror.css +7 -0
- data/lib/assets/stylesheets/code_sync/console.css +86 -0
- data/lib/assets/stylesheets/code_sync/editor/asset-name-input.css.scss +12 -0
- data/lib/assets/stylesheets/code_sync/editor/asset-selector.css.scss +58 -0
- data/lib/assets/stylesheets/code_sync/editor/codesync-color-picker.css.sass +5 -0
- data/lib/assets/stylesheets/code_sync/editor/document-tabs.css.scss +61 -0
- data/lib/assets/stylesheets/code_sync/editor/element-sync.css.scss +72 -0
- data/lib/assets/stylesheets/code_sync/editor/mode-selector.css.scss +0 -0
- data/lib/assets/stylesheets/code_sync/editor/preferences-panel.css.scss +26 -0
- data/lib/assets/stylesheets/code_sync/index.css.scss +141 -0
- data/lib/assets/stylesheets/demos.css.scss +96 -0
- data/lib/assets/stylesheets/marketing.css.sass +46 -0
- data/lib/assets/stylesheets/marketing/syntax.css.scss +1 -0
- data/lib/assets/stylesheets/vendor/animate.css +1 -0
- data/lib/assets/stylesheets/vendor/codemirror-ambiance.css +75 -0
- data/lib/assets/stylesheets/vendor/codemirror-lesserdark.css +44 -0
- data/lib/assets/stylesheets/vendor/codemirror-monokai.css +28 -0
- data/lib/assets/stylesheets/vendor/codemirror-xq-light.css +43 -0
- data/lib/assets/stylesheets/vendor/grid-layout.css +1406 -0
- data/lib/assets/stylesheets/vendor/spectrum.css +481 -0
- data/lib/assets/stylesheets/vendor/vendored_codemirror.css +246 -0
- data/lib/code_sync.rb +41 -0
- data/lib/code_sync/cli.rb +73 -0
- data/lib/code_sync/manager.rb +238 -0
- data/lib/code_sync/processors.rb +18 -0
- data/lib/code_sync/processors/basic.rb +9 -0
- data/lib/code_sync/processors/jst_processor.rb +17 -0
- data/lib/code_sync/pry_console.rb +132 -0
- data/lib/code_sync/rails.rb +7 -0
- data/lib/code_sync/rails/engine.rb +12 -0
- data/lib/code_sync/server.rb +225 -0
- data/lib/code_sync/sprockets_adapter.rb +145 -0
- data/lib/code_sync/temp_asset.rb +20 -0
- data/lib/code_sync/version.rb +3 -0
- data/lib/middleman_extension.rb +43 -0
- data/readme.md +26 -0
- data/site/.gitignore +14 -0
- data/site/Gemfile +13 -0
- data/site/Gemfile.lock +183 -0
- data/site/config.rb +26 -0
- data/site/source/canvas.html.slim +21 -0
- data/site/source/codepen-style-demo.html.slim +21 -0
- data/site/source/demo.html.slim +30 -0
- data/site/source/index.html.slim +128 -0
- data/site/source/layouts/layout.slim +18 -0
- data/site/source/samples/_client.html.md +13 -0
- data/site/source/samples/_editor.html.md +19 -0
- data/site/source/samples/_hooks.html.md +8 -0
- data/site/source/samples/_middleman.html.md +7 -0
- data/site/source/samples/_rails.html.md +8 -0
- data/site/source/samples/_standalone.html.md +36 -0
- data/spec/lib/code_sync/sprockets_adapter_spec.rb +44 -0
- data/spec/spec_helper.rb +21 -0
- data/spec/support/.DS_Store +0 -0
- data/spec/support/dummy_middleman/.gitignore +14 -0
- data/spec/support/dummy_middleman/Gemfile +5 -0
- data/spec/support/dummy_middleman/Gemfile.lock +100 -0
- data/spec/support/dummy_middleman/config.rb +77 -0
- data/spec/support/dummy_middleman/source/images/background.png +0 -0
- data/spec/support/dummy_middleman/source/images/middleman.png +0 -0
- data/spec/support/dummy_middleman/source/index.html.erb +10 -0
- data/spec/support/dummy_middleman/source/javascripts/all.js +1 -0
- data/spec/support/dummy_middleman/source/layouts/layout.erb +19 -0
- data/spec/support/dummy_middleman/source/stylesheets/all.css +55 -0
- data/spec/support/dummy_middleman/source/stylesheets/normalize.css +375 -0
- data/spec/support/dummy_rails/.gitignore +15 -0
- data/spec/support/dummy_rails/Gemfile +38 -0
- data/spec/support/dummy_rails/Gemfile.lock +112 -0
- data/spec/support/dummy_rails/README.rdoc +261 -0
- data/spec/support/dummy_rails/Rakefile +7 -0
- data/spec/support/dummy_rails/app/assets/images/rails.png +0 -0
- data/spec/support/dummy_rails/app/assets/javascripts/application.js +15 -0
- data/spec/support/dummy_rails/app/assets/stylesheets/application.css +13 -0
- data/spec/support/dummy_rails/app/controllers/application_controller.rb +3 -0
- data/spec/support/dummy_rails/app/helpers/application_helper.rb +2 -0
- data/spec/support/dummy_rails/app/mailers/.gitkeep +0 -0
- data/spec/support/dummy_rails/app/models/.gitkeep +0 -0
- data/spec/support/dummy_rails/app/views/layouts/application.html.erb +14 -0
- data/spec/support/dummy_rails/config.ru +4 -0
- data/spec/support/dummy_rails/config/application.rb +62 -0
- data/spec/support/dummy_rails/config/boot.rb +6 -0
- data/spec/support/dummy_rails/config/database.yml +25 -0
- data/spec/support/dummy_rails/config/environment.rb +5 -0
- data/spec/support/dummy_rails/config/environments/development.rb +37 -0
- data/spec/support/dummy_rails/config/environments/production.rb +67 -0
- data/spec/support/dummy_rails/config/environments/test.rb +37 -0
- data/spec/support/dummy_rails/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/support/dummy_rails/config/initializers/inflections.rb +15 -0
- data/spec/support/dummy_rails/config/initializers/mime_types.rb +5 -0
- data/spec/support/dummy_rails/config/initializers/secret_token.rb +7 -0
- data/spec/support/dummy_rails/config/initializers/session_store.rb +8 -0
- data/spec/support/dummy_rails/config/initializers/wrap_parameters.rb +14 -0
- data/spec/support/dummy_rails/config/locales/en.yml +5 -0
- data/spec/support/dummy_rails/config/routes.rb +58 -0
- data/spec/support/dummy_rails/db/seeds.rb +7 -0
- data/spec/support/dummy_rails/doc/README_FOR_APP +2 -0
- data/spec/support/dummy_rails/lib/assets/.gitkeep +0 -0
- data/spec/support/dummy_rails/lib/tasks/.gitkeep +0 -0
- data/spec/support/dummy_rails/log/.gitkeep +0 -0
- data/spec/support/dummy_rails/public/404.html +26 -0
- data/spec/support/dummy_rails/public/422.html +26 -0
- data/spec/support/dummy_rails/public/500.html +25 -0
- data/spec/support/dummy_rails/public/favicon.ico +0 -0
- data/spec/support/dummy_rails/public/index.html +241 -0
- data/spec/support/dummy_rails/public/robots.txt +5 -0
- data/spec/support/dummy_rails/script/rails +6 -0
- data/spec/support/dummy_rails/test/fixtures/.gitkeep +0 -0
- data/spec/support/dummy_rails/test/functional/.gitkeep +0 -0
- data/spec/support/dummy_rails/test/integration/.gitkeep +0 -0
- data/spec/support/dummy_rails/test/performance/browsing_test.rb +12 -0
- data/spec/support/dummy_rails/test/test_helper.rb +13 -0
- data/spec/support/dummy_rails/test/unit/.gitkeep +0 -0
- data/spec/support/dummy_rails/vendor/assets/javascripts/.gitkeep +0 -0
- data/spec/support/dummy_rails/vendor/assets/stylesheets/.gitkeep +0 -0
- data/spec/support/dummy_rails/vendor/plugins/.gitkeep +0 -0
- data/spec/support/dummy_static/.DS_Store +0 -0
- data/spec/support/dummy_static/app/.DS_Store +0 -0
- data/spec/support/dummy_static/app/assets/.DS_Store +0 -0
- data/spec/support/dummy_static/app/assets/javascripts/manifest.coffee +4 -0
- data/spec/support/dummy_static/app/assets/javascripts/spec_application_javascript.coffee +4 -0
- data/spec/support/dummy_static/app/assets/stylesheets/spec_application_stylesheet.css.scss +5 -0
- data/spec/support/dummy_static/lib/assets/javascripts/spec_library_javascript.coffee +3 -0
- data/spec/support/dummy_static/lib/assets/stylesheets/spec_library_stylesheet.css.scss +5 -0
- data/spec/support/dummy_static/vendor/assets/javascripts/spec_vendor_javascript.js +5 -0
- data/spec/support/dummy_static/vendor/assets/stylesheets/spec_vendor_stylesheets.css +3 -0
- data/vendor/assets/stylesheets/code_sync.css +1 -0
- 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
|
+
|