dante-editor 0.0.10 → 0.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +4 -0
  3. data/app/assets/javascripts/dante.js +4 -0
  4. data/app/assets/javascripts/dante/editor.js.coffee +56 -25
  5. data/app/assets/javascripts/dante/tooltip.js.coffee +14 -304
  6. data/app/assets/javascripts/dante/tooltip_widget.js.coffee +10 -0
  7. data/app/assets/javascripts/dante/tooltip_widgets/embed.js.coffee +60 -0
  8. data/app/assets/javascripts/dante/tooltip_widgets/extract.js.coffee +64 -0
  9. data/app/assets/javascripts/dante/tooltip_widgets/uploader.js.coffee +224 -0
  10. data/app/assets/javascripts/dante/view.js.coffee +46 -1
  11. data/app/assets/stylesheets/{dante.css.scss → dante.scss} +0 -0
  12. data/bower.json +1 -1
  13. data/config.rb +2 -2
  14. data/dist/{0.0.10/css → css}/dante-editor.css +0 -0
  15. data/dist/{0.0.10/fonts → fonts}/dante/dante.eot +0 -0
  16. data/dist/{0.0.10/fonts → fonts}/dante/dante.svg +0 -0
  17. data/dist/{0.0.10/fonts → fonts}/dante/dante.ttf +0 -0
  18. data/dist/{0.0.10/fonts → fonts}/dante/dante.woff +0 -0
  19. data/dist/{0.0.10/fonts → fonts}/dante/fontello.eot +0 -0
  20. data/dist/{0.0.10/fonts → fonts}/dante/fontello.svg +0 -0
  21. data/dist/{0.0.10/fonts → fonts}/dante/fontello.ttf +0 -0
  22. data/dist/{0.0.10/fonts → fonts}/dante/fontello.woff +0 -0
  23. data/dist/{0.0.10/images → images}/dante/media-loading-placeholder.png +0 -0
  24. data/dist/{0.0.10/js → js}/dante-editor.js +355 -138
  25. data/lib/dante-editor/version.rb +1 -1
  26. data/source/assets/javascripts/examples/custom_toolbar.js.coffee +30 -0
  27. data/source/custom_toolbar.erb +29 -0
  28. data/source/layouts/layout.erb +1 -1
  29. metadata +20 -47
  30. data/dist/0.0.7/css/dante-editor.css +0 -1077
  31. data/dist/0.0.7/fonts/dante/dante.eot +0 -0
  32. data/dist/0.0.7/fonts/dante/dante.svg +0 -14
  33. data/dist/0.0.7/fonts/dante/dante.ttf +0 -0
  34. data/dist/0.0.7/fonts/dante/dante.woff +0 -0
  35. data/dist/0.0.7/fonts/dante/fontello.eot +0 -0
  36. data/dist/0.0.7/fonts/dante/fontello.svg +0 -36
  37. data/dist/0.0.7/fonts/dante/fontello.ttf +0 -0
  38. data/dist/0.0.7/fonts/dante/fontello.woff +0 -0
  39. data/dist/0.0.7/images/dante/media-loading-placeholder.png +0 -0
  40. data/dist/0.0.7/js/dante-editor.js +0 -2610
  41. data/dist/0.0.8/css/dante-editor.css +0 -1116
  42. data/dist/0.0.8/fonts/dante/dante.eot +0 -0
  43. data/dist/0.0.8/fonts/dante/dante.svg +0 -14
  44. data/dist/0.0.8/fonts/dante/dante.ttf +0 -0
  45. data/dist/0.0.8/fonts/dante/dante.woff +0 -0
  46. data/dist/0.0.8/fonts/dante/fontello.eot +0 -0
  47. data/dist/0.0.8/fonts/dante/fontello.svg +0 -36
  48. data/dist/0.0.8/fonts/dante/fontello.ttf +0 -0
  49. data/dist/0.0.8/fonts/dante/fontello.woff +0 -0
  50. data/dist/0.0.8/images/dante/media-loading-placeholder.png +0 -0
  51. data/dist/0.0.8/js/dante-editor.js +0 -2532
  52. data/dist/0.0.9/css/dante-editor.css +0 -1116
  53. data/dist/0.0.9/fonts/dante/dante.eot +0 -0
  54. data/dist/0.0.9/fonts/dante/dante.svg +0 -14
  55. data/dist/0.0.9/fonts/dante/dante.ttf +0 -0
  56. data/dist/0.0.9/fonts/dante/dante.woff +0 -0
  57. data/dist/0.0.9/fonts/dante/fontello.eot +0 -0
  58. data/dist/0.0.9/fonts/dante/fontello.svg +0 -36
  59. data/dist/0.0.9/fonts/dante/fontello.ttf +0 -0
  60. data/dist/0.0.9/fonts/dante/fontello.woff +0 -0
  61. data/dist/0.0.9/images/dante/media-loading-placeholder.png +0 -0
  62. data/dist/0.0.9/js/dante-editor.js +0 -2575
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7456f5632a27d75dad5e0f84de2e2c29110df0a3
4
- data.tar.gz: e8b977537e5797a5dc5de59dc7666514cbb5a38f
3
+ metadata.gz: ce93b6b016e569966678e24ff82312b27125a136
4
+ data.tar.gz: 4bc7081e9e6a17785e9f752ca7369001e82b9f5c
5
5
  SHA512:
6
- metadata.gz: f5c4603214ec83eba2c7df7bc5102b557524afb524db6a65a0fac70fd004725bc24c8787849622c5c07b64e34926f08b8fc9b0f4dc7206c3cea229d3003eccef
7
- data.tar.gz: 7c74ad5a1d3a1d29fdc2036ec9d1c8310e103c4978c20254b18adc8d72583bbf718f76dfa56ed468d813415ccf9b37b9f29dd36c2c98593284d10c544f500fe9
6
+ metadata.gz: 43c7c63ad8b016a22839fa7e7ccbf2def26ae11f1934466902dd8a4e0d9a38157a94f2f31b9d836f1388ba1ead630b8bef1772530ff6af3acaddb7629f164f7f
7
+ data.tar.gz: d0fb16dcc13f2b5956215328ebcc3c657b9fd4cc779ea0729f26dec30f426892b1a5abfbf2de26ff19476f7d1f659e49b9cd1e59337e43fe301db741fc905fed
data/README.md CHANGED
@@ -26,7 +26,9 @@ Until now I´ve been able to implement the following features:
26
26
  + Image Uploader with *preview* and caption option.
27
27
  + Embed data for pasted link through OEmbed services.
28
28
  + Embed media information for pasted links through OEmbed services.
29
+ + Add or remove tooltip buttons with ease with plugin system.
29
30
  + List creation with shorcuts ie:. 1. , - , 1) with spacebar or return key
31
+ + Custom tooltip bottons support
30
32
  + CSS tries to use the same fonts used in Medium, (if you have already setup those fonts) or fallbacks to open fonts (by Google fonts) or system fonts.
31
33
  + serif: freight-text-pro fallbacks to Merriweather or Georgia,
32
34
  + sans: jaf-bernino-sans fallbacks to Open Sans or Lucida Grande
@@ -75,6 +77,8 @@ Until now I´ve been able to implement the following features:
75
77
  + **body_placeholder** default: 'Tell your story…'
76
78
  + **embed_placeholder** default: 'Paste a YouTube, Vine, Vimeo, or other video link, and press Enter'
77
79
  + **extract_placeholder** default: 'Paste a link to embed content from another site (e.g. Twitter) and press Enter'
80
+ + **base_widgets:** default: ["uploader", "embed", "embed-extract"],
81
+ + **extra_tooltip_widgets:** and array of new Dante.TooltipWidget instances.
78
82
 
79
83
  ### Rails / AssetPippeline
80
84
 
@@ -3,6 +3,10 @@
3
3
  //= require dante/utils
4
4
  //= require dante/view
5
5
  //= require dante/editor
6
+ //= require dante/tooltip_widget
7
+ //= require dante/tooltip_widgets/uploader
8
+ //= require dante/tooltip_widgets/embed
9
+ //= require dante/tooltip_widgets/extract
6
10
  //= require dante/tooltip
7
11
  //= require dante/popover
8
12
  //= require dante/menu
@@ -4,13 +4,13 @@ utils = Dante.utils
4
4
  class Dante.Editor extends Dante.View
5
5
 
6
6
  events:
7
- "mouseup" : "handleMouseUp"
8
- "keydown" : "handleKeyDown"
9
- "keyup" : "handleKeyUp"
10
- "paste" : "handlePaste"
7
+ "mouseup" : "handleMouseUp"
8
+ "keydown" : "handleKeyDown"
9
+ "keyup" : "handleKeyUp"
10
+ "paste" : "handlePaste"
11
11
  "dblclick" : "handleDblclick"
12
12
  "dragstart": "handleDrag"
13
- "drop" : "handleDrag"
13
+ "drop" : "handleDrag"
14
14
  "click .graf--figure .aspectRatioPlaceholder" : "handleGrafFigureSelectImg"
15
15
  "click .graf--figure figcaption" : "handleGrafFigureSelectCaption"
16
16
 
@@ -38,8 +38,16 @@ class Dante.Editor extends Dante.View
38
38
  @disable_title = opts.disable_title || false
39
39
  @store_interval = opts.store_interval || 15000
40
40
  @paste_element_id = "#dante-paste-div"
41
+ @tooltip_class = opts.tooltip_class || Dante.Editor.Tooltip
42
+
43
+ opts.base_widgets ||= ["uploader", "embed", "embed_extract"]
44
+
45
+ @widgets = []
46
+
41
47
  window.debugMode = opts.debug || false
48
+
42
49
  $(@el).addClass("debug") if window.debugMode
50
+
43
51
  if (localStorage.getItem('contenteditable'))
44
52
  $(@el).html localStorage.getItem('contenteditable')
45
53
 
@@ -54,6 +62,31 @@ class Dante.Editor extends Dante.View
54
62
  extractplaceholder = opts.extract_placeholder|| "Paste a link to embed content from another site (e.g. Twitter) and press Enter"
55
63
  @extract_placeholder= "<span class='defaultValue defaultValue--root'>#{extractplaceholder}</span><br>"
56
64
 
65
+ @initializeWidgets(opts)
66
+
67
+
68
+ initializeWidgets: (opts)->
69
+ #TODO: this could be a hash to access widgets without var
70
+ #Base widgets
71
+ base_widgets = opts.base_widgets
72
+
73
+ if base_widgets.indexOf("uploader") >= 0
74
+ @uploader_widget = new Dante.View.TooltipWidget.Uploader(current_editor: @)
75
+ @widgets.push @uploader_widget
76
+
77
+ if base_widgets.indexOf("embed") >= 0
78
+ @embed_widget = new Dante.View.TooltipWidget.Embed(current_editor: @)
79
+ @widgets.push @embed_widget
80
+
81
+ if base_widgets.indexOf("embed_extract") >= 0
82
+ @embed_extract_widget = new Dante.View.TooltipWidget.EmbedExtract(current_editor: @)
83
+ @widgets.push @embed_extract_widget
84
+
85
+ #add extra widgets
86
+ if opts.extra_tooltip_widgets
87
+ _.each opts.extra_tooltip_widgets, (w)=>
88
+ @widgets.push w
89
+
57
90
  store: ()->
58
91
  #localStorage.setItem("contenteditable", $(@el).html() )
59
92
  return unless @store_url
@@ -107,7 +140,7 @@ class Dante.Editor extends Dante.View
107
140
  $("<div id='dante-menu' class='dante-menu'></div>").insertAfter(@el)
108
141
  $("<div class='inlineTooltip'></div>").insertAfter(@el)
109
142
  @editor_menu = new Dante.Editor.Menu(editor: @)
110
- @tooltip_view = new Dante.Editor.Tooltip(editor: @)
143
+ @tooltip_view = new @tooltip_class(editor: @ , widgets: @widgets)
111
144
  @pop_over = new Dante.Editor.PopOver(editor: @)
112
145
  @pop_over.render().hide()
113
146
  @tooltip_view.render().hide()
@@ -269,7 +302,6 @@ class Dante.Editor extends Dante.View
269
302
  else
270
303
  $(@getNode()).removeClass("is-defaultValue")
271
304
 
272
-
273
305
  #get text of selected and displays menu
274
306
  handleTextSelection: (anchor_node)->
275
307
  @editor_menu.hide()
@@ -511,7 +543,7 @@ class Dante.Editor extends Dante.View
511
543
  #http://stackoverflow.com/questions/4998908/convert-data-uri-to-file-then-append-to-formdata
512
544
  _.each elements.find("img"), (image)=>
513
545
  utils.log ("process image here!")
514
- @tooltip_view.uploadExistentImage(image)
546
+ @uploader_widget.uploadExistentImage(image)
515
547
 
516
548
  handleInmediateDeletion: (element)->
517
549
  @inmediateDeletion = false
@@ -607,7 +639,8 @@ class Dante.Editor extends Dante.View
607
639
  utils.log "KEYDOWN"
608
640
 
609
641
  anchor_node = @getNode() #current node on which cursor is positioned
610
- $node = $(anchor_node);
642
+ parent = $(anchor_node)
643
+
611
644
 
612
645
  @markAsSelected( anchor_node ) if anchor_node
613
646
 
@@ -621,22 +654,20 @@ class Dante.Editor extends Dante.View
621
654
  #removes previous selected nodes
622
655
  $(@el).find(".is-selected").removeClass("is-selected")
623
656
 
624
- parent = $(anchor_node)
625
-
626
657
  utils.log @isLastChar()
627
658
 
628
659
  #smart list support
629
- if $node.hasClass("graf--p")
630
- li = @handleSmartList($node, e)
660
+ if parent.hasClass("graf--p")
661
+ li = @handleSmartList(parent, e)
631
662
  anchor_node = li if li
632
- else if $node.hasClass("graf--li")
633
- @handleListLineBreak($node, e)
663
+ else if parent.hasClass("graf--li")
664
+ @handleListLineBreak(parent, e)
634
665
 
635
- #embeds or extracts
636
- if parent.hasClass("is-embedable")
637
- @tooltip_view.getEmbedFromNode($(anchor_node))
638
- else if parent.hasClass("is-extractable")
639
- @tooltip_view.getExtractFromNode($(anchor_node))
666
+ #handle keydowns for each widget
667
+ utils.log("HANDLING WIDGET KEYDOWNS");
668
+ _.each @widgets, (w)=>
669
+ if w.handleEnterKey
670
+ w.handleEnterKey(e, parent);
640
671
 
641
672
  #supress linebreak into embed page text unless last char
642
673
  if parent.hasClass("graf--mixtapeEmbed") or parent.hasClass("graf--iframe") or parent.hasClass("graf--figure")
@@ -695,8 +726,8 @@ class Dante.Editor extends Dante.View
695
726
  anchor_node = @getNode()
696
727
  utils_anchor_node = utils.getNode()
697
728
 
698
- if($node.hasClass("graf--li") and @getCharacterPrecedingCaret().length is 0)
699
- return this.handleListBackspace($node, e);
729
+ if(parent.hasClass("graf--li") and @getCharacterPrecedingCaret().length is 0)
730
+ return this.handleListBackspace(parent, e);
700
731
 
701
732
  if $(utils_anchor_node).hasClass("section-content") || $(utils_anchor_node).hasClass("graf--first")
702
733
  utils.log "SECTION DETECTED FROM KEYDOWN #{_.isEmpty($(utils_anchor_node).text())}"
@@ -728,8 +759,8 @@ class Dante.Editor extends Dante.View
728
759
  #spacebar
729
760
  if (e.which == 32)
730
761
  utils.log("SPACEBAR")
731
- if ($node.hasClass("graf--p"))
732
- @handleSmartList($node, e)
762
+ if (parent.hasClass("graf--p"))
763
+ @handleSmartList(parent, e)
733
764
  #arrows key
734
765
  #if _.contains([37,38,39,40], e.which)
735
766
  #up & down
@@ -894,7 +925,7 @@ class Dante.Editor extends Dante.View
894
925
 
895
926
  when "img"
896
927
  utils.log "images"
897
- @tooltip_view.uploadExistentImage(n)
928
+ @uploader_widget.uploadExistentImage(n)
898
929
  #set figure non editable
899
930
 
900
931
  when "a", 'strong', 'em', 'br', 'b', 'u', 'i'
@@ -9,17 +9,12 @@ class Dante.Editor.Tooltip extends Dante.View
9
9
 
10
10
  initialize: (opts = {})=>
11
11
  @current_editor = opts.editor
12
- @buttons = [
13
- {icon: "icon-image", title: "Add an image", action: "image"},
14
- {icon: "icon-video", title: "Add a video", action: "embed"},
15
- {icon: "icon-embed", title: "Add an embed", action: "embed-extract"}
16
- ]
17
- #TODO: include section splitter
18
- #icon: "fa-minus", title: "Add a new part", action: "hr"
12
+ @widgets = opts.widgets
19
13
 
20
14
  template: ()->
21
15
  menu = ""
22
- _.each @buttons, (b)->
16
+
17
+ _.each @widgets, (b)->
23
18
  data_action_value = if b.action_value then "data-action-value='#{b.action_value}'" else ""
24
19
  menu += "<button class='inlineTooltip-button scale' title='#{b.title}' data-action='inline-menu-#{b.action}' #{data_action_value}>
25
20
  <span class='tooltip-icon #{b.icon}'></span>
@@ -32,40 +27,11 @@ class Dante.Editor.Tooltip extends Dante.View
32
27
  #{menu}
33
28
  </div>"
34
29
 
35
- insertTemplate: ()->
36
- "<figure contenteditable='false' class='graf graf--figure is-defaultValue' name='#{utils.generateUniqueName()}' tabindex='0'>
37
- <div style='' class='aspectRatioPlaceholder is-locked'>
38
- <div style='padding-bottom: 100%;' class='aspect-ratio-fill'></div>
39
- <img src='' data-height='' data-width='' data-image-id='' class='graf-image' data-delayed-src=''>
40
- </div>
41
- <figcaption contenteditable='true' data-default-value='Type caption for image (optional)' class='imageCaption'>
42
- <span class='defaultValue'>Type caption for image (optional)</span>
43
- <br>
44
- </figcaption>
45
- </figure>"
46
-
47
- extractTemplate: ()->
48
- "<div class='graf graf--mixtapeEmbed is-selected' name=''>
49
- <a target='_blank' data-media-id='' class='js-mixtapeImage mixtapeImage mixtapeImage--empty u-ignoreBlock' href=''>
50
- </a>
51
- <a data-tooltip-type='link' data-tooltip-position='bottom' data-tooltip='' title='' class='markup--anchor markup--mixtapeEmbed-anchor' data-href='' href='' target='_blank'>
52
- <strong class='markup--strong markup--mixtapeEmbed-strong'></strong>
53
- <em class='markup--em markup--mixtapeEmbed-em'></em>
54
- </a>
55
- </div>"
56
-
57
- embedTemplate: ()->
58
- "<figure contenteditable='false' class='graf--figure graf--iframe graf--first' name='504e' tabindex='0'>
59
- <div class='iframeContainer'>
60
- <iframe frameborder='0' width='700' height='393' data-media-id='' src='' data-height='480' data-width='854'>
61
- </iframe>
62
- </div>
63
- <figcaption contenteditable='true' data-default-value='Type caption for embed (optional)' class='imageCaption'>
64
- <a rel='nofollow' class='markup--anchor markup--figure-anchor' data-href='' href='' target='_blank'>
30
+ findWidgetByAction: (name)->
65
31
 
66
- </a>
67
- </figcaption>
68
- </figure>"
32
+ _.find @widgets, (e)->
33
+ e.action == name
34
+
69
35
 
70
36
  render: ()=>
71
37
  $(@el).html(@template())
@@ -90,6 +56,7 @@ class Dante.Editor.Tooltip extends Dante.View
90
56
  handleClick: (ev)->
91
57
  name = $(ev.currentTarget).data('action')
92
58
  utils.log name
59
+ ###
93
60
  switch name
94
61
  when "inline-menu-image"
95
62
  @placeholder = "<p>PLACEHOLDER</p>"
@@ -100,270 +67,13 @@ class Dante.Editor.Tooltip extends Dante.View
100
67
  @displayExtractPlaceHolder()
101
68
  when "inline-menu-hr"
102
69
  @splitSection()
103
- return false
104
- #UPLOADER
105
-
106
- #replace existing img tag , and wrap it in insertTamplate
107
- #TODO: take the url and upload it
108
- uploadExistentImage: (image_element, opts = {})->
109
-
110
- utils.log ("process image here!")
111
- tmpl = $(@insertTemplate())
112
- tmpl.find("img").attr('src', @current_editor.default_loading_placeholder )
113
- #is a child element or a first level element ?
114
-
115
- if $(image_element).parents(".graf").length > 0
116
- #return if its already wrapped in graf--figure
117
- if $(image_element).parents(".graf").hasClass("graf--figure")
118
- return
119
- utils.log "UNO"
120
- tmpl.insertBefore( $(image_element).parents(".graf") )
121
- node = @current_editor.getNode()
122
- if node
123
- @current_editor.preCleanNode($(node))
124
- @current_editor.addClassesToElement(node)
125
- else
126
- utils.log "DOS"
127
- img = $(image_element).parentsUntil(".section-inner").first()
128
- $(img).replaceWith(tmpl)
129
-
130
- utils.log $("[name='#{tmpl.attr('name')}']").attr("name")
131
- @replaceImg(image_element, $("[name='#{tmpl.attr('name')}']"))
132
-
133
- #in case we found that graf--image is nested element, unwrap * nested times
134
- n = $("[name='#{tmpl.attr('name')}']").parentsUntil(".section-inner").length
135
- unless n is 0
136
- for i in [0..n-1] by 1
137
- $("[name='#{tmpl.attr('name')}']").unwrap()
138
-
139
- utils.log "FIG"
140
- #utils.log $("[name='#{tmpl.attr('name')}']").attr("name")
141
-
142
- replaceImg: (image_element, figure)->
143
- utils.log figure.attr("name")
144
- utils.log figure
145
- $(image_element).remove()
146
- img = new Image()
147
- img.src = image_element.src
148
- self = this
149
- img.onload = ()->
150
- utils.log "replace image with loaded info"
151
- utils.log figure.attr("name")
152
- utils.log(this.width + 'x' + this.height);
153
-
154
- ar = self.getAspectRatio(this.width, this.height)
155
- #debugger
156
- figure.find(".aspectRatioPlaceholder").css
157
- 'max-width': ar.width
158
- 'max-height': ar.height
159
-
160
- figure.find(".graf-image").attr
161
- "data-height": this.height
162
- "data-width": this.width
163
-
164
- figure.find(".aspect-ratio-fill").css
165
- "padding-bottom": "#{ar.ratio}%"
166
-
167
- #TODO: upload file to server
168
- #@uploadFile file, replaced_node
169
-
170
- figure.find("img").attr("src", image_element.src)
171
-
172
- displayAndUploadImages: (file)->
173
- @displayCachedImage file
174
-
175
- imageSelect: (ev)->
176
- $selectFile = $('<input type="file" multiple="multiple">').click()
177
- self = @
178
- $selectFile.change ()->
179
- t = this
180
- self.uploadFiles(t.files)
181
-
182
- displayCachedImage: (file)->
183
- @current_editor.tooltip_view.hide()
184
-
185
- reader = new FileReader()
186
- reader.onload = (e)=>
187
- img = new Image
188
- img.src = e.target.result
189
- node = @current_editor.getNode()
190
- self = this
191
- img.onload = ()->
192
- new_tmpl = $(self.insertTemplate())
193
-
194
- replaced_node = $( new_tmpl ).insertBefore($(node))
195
-
196
- img_tag = new_tmpl.find('img.graf-image').attr('src', e.target.result)
197
- img_tag.height = this.height
198
- img_tag.width = this.width
199
-
200
- utils.log "UPLOADED SHOW FROM CACHE"
201
-
202
- ar = self.getAspectRatio(this.width, this.height)
203
-
204
- replaced_node.find(".aspectRatioPlaceholder").css
205
- 'max-width': ar.width
206
- 'max-height': ar.height
207
-
208
- replaced_node.find(".graf-image").attr
209
- "data-height": this.height
210
- "data-width": this.width
70
+ ###
71
+ #debugger
72
+ sub_name = name.replace("inline-menu-", "")
73
+ if detected_widget = @findWidgetByAction(sub_name)
74
+ detected_widget.handleClick(ev)
211
75
 
212
- replaced_node.find(".aspect-ratio-fill").css
213
- "padding-bottom": "#{ar.ratio}%"
214
-
215
- self.uploadFile file, replaced_node
216
-
217
- reader.readAsDataURL(file)
218
-
219
- getAspectRatio: (w , h)->
220
- maxWidth = 700
221
- maxHeight = 700
222
- ratio = 0
223
- width = w # Current image width
224
- height = h # Current image height
225
-
226
- # Check if the current width is larger than the max
227
- if width > maxWidth
228
- ratio = maxWidth / width # get ratio for scaling image
229
- height = height * ratio # Reset height to match scaled image
230
- width = width * ratio # Reset width to match scaled image
231
-
232
- # Check if current height is larger than max
233
- else if height > maxHeight
234
- ratio = maxHeight / height # get ratio for scaling image
235
- width = width * ratio # Reset width to match scaled image
236
- height = height * ratio # Reset height to match scaled image
237
-
238
- fill_ratio = height / width * 100
239
- result = { width: width, height: height, ratio: fill_ratio }
240
- utils.log result
241
- result
242
-
243
- formatData: (file)->
244
- formData = new FormData()
245
- formData.append('file', file)
246
- return formData
247
-
248
- uploadFiles: (files)=>
249
- acceptedTypes =
250
- "image/png": true
251
- "image/jpeg": true
252
- "image/gif": true
253
-
254
- i = 0
255
- while i < files.length
256
- file = files[i]
257
- if acceptedTypes[file.type] is true
258
- $(@placeholder).append "<progress class=\"progress\" min=\"0\" max=\"100\" value=\"0\">0</progress>"
259
- @displayAndUploadImages(file)
260
- i++
261
-
262
- uploadFile: (file, node)=>
263
- n = node
264
- handleUp = (jqxhr)=>
265
- @uploadCompleted jqxhr, n
266
-
267
- $.ajax
268
- type: "post"
269
- url: @current_editor.upload_url
270
- xhr: =>
271
- xhr = new XMLHttpRequest()
272
- xhr.upload.onprogress = @updateProgressBar
273
- xhr
274
- cache: false
275
- contentType: false
276
-
277
- success: (response) =>
278
- response = @current_editor.upload_callback(response) if @current_editor.upload_callback
279
- handleUp(response)
280
- return
281
- error: (jqxhr)=>
282
- utils.log("ERROR: got error uploading file #{jqxhr.responseText}")
283
-
284
- processData: false
285
- data: @formatData(file)
286
-
287
- updateProgressBar: (e)=>
288
- $progress = $('.progress:first', this.$el)
289
- complete = ""
290
-
291
- if (e.lengthComputable)
292
- complete = e.loaded / e.total * 100
293
- complete = complete ? complete : 0
294
- #$progress.attr('value', complete)
295
- #$progress.html(complete)
296
- utils.log "complete"
297
- utils.log complete
298
-
299
- uploadCompleted: (url, node)=>
300
- node.find("img").attr("src", url)
301
- #return false
302
-
303
- ## EMBED
304
- displayEmbedPlaceHolder: ()->
305
- ph = @current_editor.embed_placeholder
306
- @node = @current_editor.getNode()
307
- $(@node).html(ph).addClass("is-embedable")
308
-
309
- @current_editor.setRangeAt(@node)
310
- @hide()
311
- false
312
-
313
- getEmbedFromNode: (node)=>
314
- @node = $(node)
315
- @node_name = @node.attr("name")
316
- @node.addClass("spinner")
317
-
318
- $.getJSON("#{@current_editor.oembed_url}#{$(@node).text()}")
319
- .success (data)=>
320
- @node = $("[name=#{@node_name}]")
321
- iframe_src = $(data.html).prop("src")
322
- tmpl = $(@embedTemplate())
323
- tmpl.attr("name", @node.attr("name"))
324
- $(@node).replaceWith(tmpl)
325
- replaced_node = $(".graf--iframe[name=#{@node.attr("name")}]")
326
- replaced_node.find("iframe").attr("src", iframe_src)
327
- url = data.url || data.author_url
328
- utils.log "URL IS #{url}"
329
- replaced_node.find(".markup--anchor").attr("href", url ).text(url)
330
- @hide()
331
-
332
- ##EXTRACT
333
- displayExtractPlaceHolder: ()->
334
- ph = @current_editor.extract_placeholder
335
- @node = @current_editor.getNode()
336
- $(@node).html(ph).addClass("is-extractable")
337
-
338
- @current_editor.setRangeAt(@node)
339
- @hide()
340
- false
341
-
342
- getExtractFromNode: (node)=>
343
- @node = $(node)
344
- @node_name = @node.attr("name")
345
- @node.addClass("spinner")
346
-
347
- $.getJSON("#{@current_editor.extract_url}#{$(@node).text()}").success (data)=>
348
- @node = $("[name=#{@node_name}]")
349
- iframe_src = $(data.html).prop("src")
350
- tmpl = $(@extractTemplate())
351
- tmpl.attr("name", @node.attr("name"))
352
- $(@node).replaceWith(tmpl)
353
- replaced_node = $(".graf--mixtapeEmbed[name=#{@node.attr("name")}]")
354
- replaced_node.find("strong").text(data.title)
355
- replaced_node.find("em").text(data.description)
356
- replaced_node.append(data.provider_url)
357
- replaced_node.find(".markup--anchor").attr("href", data.url )
358
- unless _.isEmpty data.images
359
- image_node = replaced_node.find(".mixtapeImage")
360
- image_node.css("background-image", "url(#{data.images[0].url})")
361
- image_node.removeClass("mixtapeImage--empty u-ignoreBlock")
362
- @hide()
363
-
364
- getExtract: (url)=>
365
- $.getJSON("#{@current_editor.extract_url}#{url}").done (data)->
366
- utils.log(data)
76
+ return false
367
77
 
368
78
  cleanOperationClasses: (node)->
369
79
  node.removeClass("is-embedable is-extractable")