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,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))
|