dante-editor 0.0.15 → 0.1.0

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 (45) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/README.md +49 -10
  4. data/app/assets/fonts/dante/dante.eot +0 -0
  5. data/app/assets/fonts/dante/dante.svg +9 -5
  6. data/app/assets/fonts/dante/dante.ttf +0 -0
  7. data/app/assets/fonts/dante/dante.woff +0 -0
  8. data/app/assets/javascripts/dante/behavior.js.coffee +2 -0
  9. data/app/assets/javascripts/dante/behaviors/image.js.coffee +56 -0
  10. data/app/assets/javascripts/dante/behaviors/list.js.coffee +150 -0
  11. data/app/assets/javascripts/dante/behaviors/save.js.coffee +40 -0
  12. data/app/assets/javascripts/dante/behaviors/suggest.js.coffee +118 -0
  13. data/app/assets/javascripts/dante/editor.js.coffee +110 -228
  14. data/app/assets/javascripts/dante/popover.js.coffee +350 -11
  15. data/app/assets/javascripts/dante/tooltip_widgets/uploader.js.coffee +2 -2
  16. data/app/assets/javascripts/dante.js +5 -0
  17. data/app/assets/stylesheets/dante/_blame.scss +209 -0
  18. data/app/assets/stylesheets/dante/_caption.scss +14 -0
  19. data/app/assets/stylesheets/dante/_icons.scss +10 -5
  20. data/app/assets/stylesheets/dante/_menu.scss +7 -7
  21. data/app/assets/stylesheets/dante/_popover.scss +122 -44
  22. data/app/assets/stylesheets/dante/_utilities.scss +5 -1
  23. data/app/assets/stylesheets/dante/_variables.scss +7 -3
  24. data/app/assets/stylesheets/dante.scss +2 -0
  25. data/config.rb +5 -4
  26. data/dist/css/dante-editor.css +246 -44
  27. data/dist/fonts/dante/dante.eot +0 -0
  28. data/dist/fonts/dante/dante.svg +9 -5
  29. data/dist/fonts/dante/dante.ttf +0 -0
  30. data/dist/fonts/dante/dante.woff +0 -0
  31. data/dist/js/dante-editor.js +1015 -283
  32. data/lib/dante-editor/version.rb +1 -1
  33. data/source/api/cristian.json.erb +8 -0
  34. data/source/api/miguel.json.erb +8 -0
  35. data/source/api/resource.json.erb +8 -0
  36. data/source/api/save.json.erb +1 -0
  37. data/source/api/suggest.json.erb +22 -0
  38. data/source/assets/images/dante-demo.png +0 -0
  39. data/source/icons/image-center.svg +12 -0
  40. data/source/icons/image-fill.svg +11 -0
  41. data/source/icons/image-left.svg +15 -0
  42. data/source/icons/image-wide.svg +12 -0
  43. data/source/index.html.erb +6 -0
  44. data/source/partials/_readme.markdown +2 -2
  45. metadata +18 -2
@@ -17,17 +17,13 @@ class Dante.Editor extends Dante.View
17
17
  "mouseup" : "handleMouseUp"
18
18
  "keydown" : "handleKeyDown"
19
19
  "keyup" : "handleKeyUp"
20
+ "keypress" : "handleKeyPress"
20
21
  "paste" : "handlePaste"
21
22
  "dblclick" : "handleDblclick"
22
23
  "dragstart": "handleDrag"
23
24
  "drop" : "handleDrag"
24
- "click .graf--figure .aspectRatioPlaceholder" : "handleGrafFigureSelectImg"
25
- "click .graf--figure figcaption" : "handleGrafFigureSelectCaption"
26
-
27
- "mouseover .graf--figure.graf--iframe" : "handleGrafFigureSelectIframe"
28
- "mouseleave .graf--figure.graf--iframe" : "handleGrafFigureUnSelectIframe"
29
- "keyup .graf--figure figcaption" : "handleGrafCaptionTyping"
30
-
25
+
26
+ # TODO: this events should be in tooltip class
31
27
  "mouseover .markup--anchor" : "displayPopOver"
32
28
  "mouseout .markup--anchor" : "hidePopOver"
33
29
 
@@ -37,33 +33,42 @@ class Dante.Editor extends Dante.View
37
33
  @initial_html = $(@el).html()
38
34
  @current_range = null
39
35
  @current_node = null
36
+
40
37
  @el = opts.el || "#editor"
38
+
41
39
  @upload_url = opts.upload_url || "/uploads.json"
42
40
  @upload_callback = opts.upload_callback
43
41
  @oembed_url = opts.oembed_url || "http://api.embed.ly/1/oembed?url="
44
42
  @extract_url = opts.extract_url || "http://api.embed.ly/1/extract?key=86c28a410a104c8bb58848733c82f840&url="
45
43
  @default_loading_placeholder = opts.default_loading_placeholder || Dante.defaults.image_placeholder
44
+
46
45
  @store_url = opts.store_url
47
46
  @store_method = opts.store_method || "POST"
47
+ @store_success_handler = opts.store_success_handler
48
+
48
49
  @spell_check = opts.spellcheck || false
49
50
  @disable_title = opts.disable_title || false
50
- @store_interval = opts.store_interval || 15000
51
+ @store_interval = opts.store_interval || 1500
51
52
  @paste_element_id = "#dante-paste-div"
52
53
  @tooltip_class = opts.tooltip_class || Dante.Editor.Tooltip
54
+
55
+ # suggest feature options
56
+ @suggest_url = opts.suggest_url || "/api/suggest.json"
57
+ @suggest_query_param = opts.suggest_query_param || "q"
58
+ @suggest_query_timeout = opts.suggest_query_timeout || 300
59
+ @suggest_handler = opts.suggest_handler || null
60
+ @suggest_resource_handler = opts.suggest_resource_handler || null
61
+
62
+ opts.base_widgets ||= ["uploader", "embed", "embed_extract"]
63
+ opts.base_behaviors ||= ["save", "image","list", "suggest"]
53
64
 
54
- opts.base_widgets ||= ["uploader", "embed", "embed_extract"]
55
-
56
- @widgets = []
65
+ @widgets = []
66
+ @behaviors = []
57
67
 
58
68
  window.debugMode = opts.debug || false
59
69
 
60
70
  $(@el).addClass("debug") if window.debugMode
61
71
 
62
- if (localStorage.getItem('contenteditable'))
63
- $(@el).html localStorage.getItem('contenteditable')
64
-
65
- @store()
66
-
67
72
  titleplaceholder = opts.title_placeholder || 'Title'
68
73
  @title_placeholder = "<span class='defaultValue defaultValue--root'>#{titleplaceholder}</span><br>"
69
74
  title = opts.title || ''
@@ -74,9 +79,36 @@ class Dante.Editor extends Dante.View
74
79
  @embed_placeholder = "<span class='defaultValue defaultValue--root'>#{embedplaceholder}</span><br>"
75
80
  extractplaceholder = opts.extract_placeholder|| "Paste a link to embed content from another site (e.g. Twitter) and press Enter"
76
81
  @extract_placeholder= "<span class='defaultValue defaultValue--root'>#{extractplaceholder}</span><br>"
77
-
82
+
78
83
  @initializeWidgets(opts)
79
84
 
85
+ initializeBehaviors: (opts)->
86
+ base_behaviors = opts.base_behaviors
87
+ self = @
88
+
89
+ if base_behaviors.indexOf("suggest") >= 0
90
+ @suggest_behavior = new Dante.View.Behavior.Suggest(current_editor: @, el: @el)
91
+ @behaviors.push @suggest_behavior
92
+
93
+ if base_behaviors.indexOf("save") >= 0
94
+ @save_behavior = new Dante.View.Behavior.Save(current_editor: @, el: @el)
95
+ @behaviors.push @save_behavior
96
+
97
+ if base_behaviors.indexOf("image") >= 0
98
+ @save_behavior = new Dante.View.Behavior.Image(current_editor: @, el: @el)
99
+ @behaviors.push @save_behavior
100
+
101
+ if base_behaviors.indexOf("list") >= 0
102
+ @save_behavior = new Dante.View.Behavior.List(current_editor: @, el: @el)
103
+ @behaviors.push @save_behavior
104
+
105
+ #add extra behaviors
106
+ if opts.extra_behaviors
107
+ _.each opts.extra_behaviors, (w)=>
108
+ if !w.current_editor
109
+ w.current_editor = self
110
+ @behaviors.push w
111
+
80
112
  initializeWidgets: (opts)->
81
113
  #TODO: this could be a hash to access widgets without var
82
114
  #Base widgets
@@ -102,31 +134,6 @@ class Dante.Editor extends Dante.View
102
134
  w.current_editor = self
103
135
  @widgets.push w
104
136
 
105
- store: ()->
106
- #localStorage.setItem("contenteditable", $(@el).html() )
107
- return unless @store_url
108
- setTimeout ()=>
109
- @checkforStore()
110
- , @store_interval
111
-
112
- checkforStore: ()->
113
- if @content is @getContent()
114
- utils.log "content not changed skip store"
115
- @store()
116
- else
117
- utils.log "content changed! update"
118
- @content = @getContent()
119
- $.ajax
120
- url: @store_url
121
- method: @store_method
122
- data:
123
- body: @getContent()
124
- success: (res)->
125
- utils.log "store!"
126
- utils.log res
127
- complete: (jxhr) =>
128
- @store()
129
-
130
137
  getContent: ()->
131
138
  $(@el).find(".section-inner").html()
132
139
 
@@ -159,6 +166,17 @@ class Dante.Editor extends Dante.View
159
166
  @tooltip_view = new @tooltip_class(editor: @ , widgets: @widgets)
160
167
  @pop_over = new Dante.Editor.PopOver(editor: @)
161
168
  @pop_over.render().hide()
169
+
170
+ # TODO: this has to be pluggable too!
171
+ @pop_over_typeahead = new Dante.Editor.PopOverTypeAhead(editor: @)
172
+ @pop_over_typeahead.render().hide()
173
+
174
+ @pop_over_card = new Dante.Editor.PopOverCard(editor: @)
175
+ @pop_over_card.render().hide()
176
+
177
+ @pop_over_align = new Dante.Editor.ImageTooltip(editor: @)
178
+ @pop_over_align.render().hide()
179
+
162
180
  @tooltip_view.render().hide()
163
181
 
164
182
  appendInitialContent: ()=>
@@ -173,6 +191,7 @@ class Dante.Editor extends Dante.View
173
191
  @appendMenus()
174
192
  @appendInitialContent() unless _.isEmpty @initial_html.trim()
175
193
  @parseInitialMess()
194
+ @initializeBehaviors(@editor_options)
176
195
 
177
196
  restart: ()=>
178
197
  @render()
@@ -196,6 +215,10 @@ class Dante.Editor extends Dante.View
196
215
  else if (document.selection && document.selection.type != "Control")
197
216
  selection = document.selection
198
217
 
218
+ getSelectionStart: ->
219
+ node = document.getSelection().anchorNode
220
+ if node.nodeType == 3 then node.parentNode else node
221
+
199
222
  getRange: () ->
200
223
  editor = $(@el)[0]
201
224
  range = selection && selection.rangeCount && selection.getRangeAt(0)
@@ -290,12 +313,12 @@ class Dante.Editor extends Dante.View
290
313
  return if @selection().rangeCount < 1
291
314
  range = @selection().getRangeAt(0)
292
315
  node = range.commonAncestorContainer
293
- return null if not node or node is root
316
+ return null if not node or node is root
294
317
 
295
318
  #node = node.parentNode while node and (node.nodeType isnt 1) and (node.parentNode isnt root)
296
319
  #node = node.parentNode while node and (node.parentNode isnt root)
297
320
 
298
- node = node.parentNode while node and (node.nodeType isnt 1 or not $(node).hasClass("graf")) and (node.parentNode isnt root)
321
+ node = node.parentNode while node and (node.nodeType isnt 1 or not $(node).hasClass("graf")) and (node.parentNode isnt root)
299
322
  if not $(node).hasClass("graf--li")
300
323
  node = node.parentNode while node and (node.parentNode isnt root)
301
324
 
@@ -312,19 +335,13 @@ class Dante.Editor extends Dante.View
312
335
  handleDrag: ()->
313
336
  return false
314
337
 
315
- handleGrafCaptionTyping: (ev)->
316
- if _.isEmpty(utils.getNode().textContent.trim())
317
- $(@getNode()).addClass("is-defaultValue")
318
- else
319
- $(@getNode()).removeClass("is-defaultValue")
320
-
321
- #get text of selected and displays menu
338
+ # get text of selected and displays menu
322
339
  handleTextSelection: (anchor_node)->
323
340
  @editor_menu.hide()
324
341
  text = @getSelectedText()
325
342
  if !$(anchor_node).is(".graf--mixtapeEmbed, .graf--figure") && !_.isEmpty text.trim()
326
- @current_node = anchor_node
327
- @.displayMenu()
343
+ @current_node = anchor_node
344
+ @.displayMenu()
328
345
 
329
346
  relocateMenu: (position)->
330
347
  height = @editor_menu.$el.outerHeight()
@@ -346,32 +363,6 @@ class Dante.Editor extends Dante.View
346
363
  hidePopOver: (ev)->
347
364
  @pop_over.hide(ev)
348
365
 
349
- handleGrafFigureSelectImg: (ev)->
350
- utils.log "FIGURE SELECT"
351
- element = ev.currentTarget
352
- @markAsSelected( element )
353
- $(element).parent(".graf--figure").addClass("is-selected is-mediaFocused")
354
- @selection().removeAllRanges()
355
-
356
- handleGrafFigureSelectIframe: (ev)->
357
- utils.log "FIGURE IFRAME SELECT"
358
- element = ev.currentTarget
359
- @iframeSelected = element
360
- @markAsSelected( element )
361
- $(element).addClass("is-selected is-mediaFocused")
362
- @selection().removeAllRanges()
363
-
364
- handleGrafFigureUnSelectIframe: (ev)->
365
- utils.log "FIGURE IFRAME UNSELECT"
366
- element = ev.currentTarget
367
- @iframeSelected = null
368
- $(element).removeClass("is-selected is-mediaFocused")
369
-
370
- handleGrafFigureSelectCaption: (ev)->
371
- utils.log "FIGCAPTION"
372
- element = ev.currentTarget
373
- $(element).parent(".graf--figure").removeClass("is-mediaFocused")
374
-
375
366
  handleMouseUp: (ev)=>
376
367
  utils.log "MOUSE UP"
377
368
  anchor_node = @getNode()
@@ -566,7 +557,7 @@ class Dante.Editor extends Dante.View
566
557
  return false # Prevent the default handler from running.
567
558
 
568
559
  handleUnwrappedImages: (elements)->
569
- #http://stackoverflow.com/questions/4998908/convert-data-uri-to-file-then-append-to-formdata
560
+ # http://stackoverflow.com/questions/4998908/convert-data-uri-to-file-then-append-to-formdata
570
561
  _.each elements.find("img"), (image)=>
571
562
  utils.log ("process image here!")
572
563
  @uploader_widget.uploadExistentImage(image)
@@ -578,9 +569,9 @@ class Dante.Editor extends Dante.View
578
569
  @setRangeAt($(element).prev()[0])
579
570
  $(element).remove()
580
571
 
581
- #TODO: not used anymore, remove this
582
- #when found that the current node is text node
583
- #create a new <p> and focus
572
+ # TODO: not used anymore, remove this
573
+ # when found that the current node is text node
574
+ # create a new <p> and focus
584
575
  handleUnwrappedNode: (element)->
585
576
  tmpl = $(@baseParagraphTmpl())
586
577
  @setElementName(tmpl)
@@ -672,6 +663,13 @@ class Dante.Editor extends Dante.View
672
663
 
673
664
  @markAsSelected( anchor_node ) if anchor_node
674
665
 
666
+ #handle keyups for each widget
667
+ utils.log("HANDLING Behavior KEYDOWN");
668
+
669
+ _.each @behaviors, (b)=>
670
+ if b.handleKeyDown
671
+ b.handleKeyDown(e, parent);
672
+
675
673
  if e.which is TAB
676
674
  @handleTab(anchor_node)
677
675
  return false
@@ -683,13 +681,6 @@ class Dante.Editor extends Dante.View
683
681
 
684
682
  utils.log @isLastChar()
685
683
 
686
- #smart list support
687
- if parent.hasClass("graf--p")
688
- li = @handleSmartList(parent, e)
689
- anchor_node = li if li
690
- else if parent.hasClass("graf--li")
691
- @handleListLineBreak(parent, e)
692
-
693
684
  #handle keydowns for each widget
694
685
  utils.log("HANDLING WIDGET KEYDOWNS");
695
686
  _.each @widgets, (w)=>
@@ -724,7 +715,7 @@ class Dante.Editor extends Dante.View
724
715
  setTimeout ()=>
725
716
  node = @getNode()
726
717
  return if _.isUndefined(node)
727
- #set name on new element
718
+ # set name on new element
728
719
  @setElementName($(node))
729
720
 
730
721
  if node.nodeName.toLowerCase() is "div"
@@ -732,17 +723,17 @@ class Dante.Editor extends Dante.View
732
723
  @markAsSelected( $(node) ) #if anchor_node
733
724
  @setupFirstAndLast()
734
725
 
735
- #empty childs if text is empty
726
+ # empty childs if text is empty
736
727
  if _.isEmpty $(node).text().trim()
737
728
  _.each $(node).children(), (n)->
738
729
  $(n).remove()
739
730
  $(node).append("<br>")
740
731
 
741
- #shows tooltip
732
+ # shows tooltip
742
733
  @displayTooltipAt($(@el).find(".is-selected"))
743
734
  , 2
744
735
 
745
- #delete key
736
+ # delete key
746
737
  if (e.which is BACKSPACE)
747
738
  eventHandled = false;
748
739
  @tooltip_view.hide()
@@ -769,9 +760,6 @@ class Dante.Editor extends Dante.View
769
760
  utils.log("SCAPE FROM BACKSPACE HANDLER")
770
761
  return false;
771
762
 
772
- if(parent.hasClass("graf--li") and @getCharacterPrecedingCaret().length is 0)
773
- return this.handleListBackspace(parent, e);
774
-
775
763
  #select an image if backspacing into it from a paragraph
776
764
  if($(anchor_node).hasClass("graf--p") && @isFirstChar() )
777
765
  if($(anchor_node).prev().hasClass("graf--figure") && @getSelectedText().length == 0)
@@ -784,11 +772,11 @@ class Dante.Editor extends Dante.View
784
772
  return false if _.isEmpty($(utils_anchor_node).text())
785
773
 
786
774
  if anchor_node && anchor_node.nodeType is 3
787
- #@displayEmptyPlaceholder()
775
+ # @displayEmptyPlaceholder()
788
776
  utils.log("TextNode detected from Down!")
789
777
  #return false
790
778
 
791
- #supress del into & delete embed if empty content found on delete key
779
+ # supress del into & delete embed if empty content found on delete key
792
780
  if $(anchor_node).hasClass("graf--mixtapeEmbed") or $(anchor_node).hasClass("graf--iframe")
793
781
  if _.isEmpty $(anchor_node).text().trim() or @isFirstChar()
794
782
  utils.log("Check for inmediate deletion on empty embed text")
@@ -796,16 +784,10 @@ class Dante.Editor extends Dante.View
796
784
  @handleInmediateDeletion($(anchor_node)) if @inmediateDeletion
797
785
  return false
798
786
 
799
- #TODO: supress del when the prev el is embed and current_node is at first char
787
+ # TODO: supress del when the prev el is embed and current_node is at first char
800
788
  if $(anchor_node).prev().hasClass("graf--mixtapeEmbed")
801
789
  return false if @isFirstChar() && !_.isEmpty( $(anchor_node).text().trim() )
802
790
 
803
- #spacebar
804
- if (e.which is SPACEBAR)
805
- utils.log("SPACEBAR")
806
- if (parent.hasClass("graf--p"))
807
- @handleSmartList(parent, e)
808
-
809
791
  #arrows key
810
792
  #up & down
811
793
  if _.contains([UPARROW, DOWNARROW], e.which)
@@ -833,7 +815,7 @@ class Dante.Editor extends Dante.View
833
815
  utils.log "SKIP KEYUP"
834
816
  return false
835
817
 
836
- utils.log "KEYUP"
818
+ utils.log "ENTER KEYUP"
837
819
 
838
820
  @editor_menu.hide() #hides menu just in case
839
821
  @reachedTop = false
@@ -842,9 +824,11 @@ class Dante.Editor extends Dante.View
842
824
 
843
825
  @handleTextSelection(anchor_node)
844
826
 
845
- if (_.contains([BACKSPACE, SPACEBAR, ENTER], e.which))
846
- if $(anchor_node).hasClass("graf--li")
847
- @removeSpanTag($(anchor_node));
827
+ # handle keyups for each widget
828
+ utils.log("HANDLING Behavior KEYUPS");
829
+ _.each @behaviors, (b)=>
830
+ if b.handleKeyUp
831
+ b.handleKeyUp(e)
848
832
 
849
833
  if (e.which == BACKSPACE)
850
834
 
@@ -886,13 +870,20 @@ class Dante.Editor extends Dante.View
886
870
  # @setupFirstAndLast()
887
871
  # @displayTooltipAt($(@el).find(".is-selected"))
888
872
 
889
-
890
873
  #arrows key
891
874
  if _.contains([LEFTARROW, UPARROW, RIGHTARROW, DOWNARROW], e.which)
892
875
  @handleArrow(e)
893
876
  #return false
894
877
 
895
- #TODO: Separate in little functions
878
+ handleKeyPress: (e, node)->
879
+ anchor_node = @getNode()
880
+ parent = $(anchor_node)
881
+ #handle keyups for each widget
882
+ utils.log("HANDLING Behavior KEYPRESS");
883
+ _.each @behaviors, (b)=>
884
+ if b.handleKeyPress
885
+ b.handleKeyPress(e, parent);
886
+
896
887
  handleLineBreakWith: (element_type, from_element)->
897
888
  new_paragraph = $("<#{element_type} class='graf graf--#{element_type} graf--empty is-selected'><br/></#{element_type}>")
898
889
  if from_element.parent().is('[class^="graf--"]')
@@ -1017,9 +1008,7 @@ class Dante.Editor extends Dante.View
1017
1008
  #, 20
1018
1009
 
1019
1010
  cleanContents: (element)->
1020
- #TODO: should config tags
1021
- utils.log "ti"
1022
- utils.log element
1011
+ # TODO: should config tags
1023
1012
  if _.isUndefined(element)
1024
1013
  element = $(@el).find('.section-inner')
1025
1014
  else
@@ -1031,7 +1020,7 @@ class Dante.Editor extends Dante.View
1031
1020
 
1032
1021
  attributes:
1033
1022
  '__ALL__': ['class']
1034
- a: ['href', 'title', 'target']
1023
+ a: ['href', 'title', 'target', 'data-id', 'data-type', 'data-href', 'data-avatar']
1035
1024
  img: ['src']
1036
1025
 
1037
1026
  protocols:
@@ -1102,9 +1091,10 @@ class Dante.Editor extends Dante.View
1102
1091
 
1103
1092
  setupLink: (n)->
1104
1093
  parent_name = $(n).parent().prop("tagName").toLowerCase()
1105
- $(n).addClass("markup--anchor markup--#{parent_name}-anchor")
1106
- href = $(n).attr("href")
1107
- $(n).attr("data-href", href)
1094
+ unless $(n).data("type") is "user"
1095
+ $(n).addClass("markup--anchor markup--#{parent_name}-anchor")
1096
+ href = $(n).attr("href")
1097
+ $(n).attr("data-href", href)
1108
1098
 
1109
1099
  preCleanNode: (element)->
1110
1100
  s = new Sanitize
@@ -1141,116 +1131,8 @@ class Dante.Editor extends Dante.View
1141
1131
  setElementName: (element)->
1142
1132
  $(element).attr("name", utils.generateUniqueName())
1143
1133
 
1144
- # LIST METHODS
1145
-
1146
- listify: ($paragraph, listType, regex)->
1147
-
1148
- utils.log "LISTIFY PARAGRAPH"
1149
-
1150
- @removeSpanTag($paragraph);
1151
-
1152
- content = $paragraph.html().replace(/&nbsp;/g, " ").replace(regex, "")
1153
-
1154
- switch(listType)
1155
- when "ul" then $list = $("<ul></ul>")
1156
- when "ol" then $list = $("<ol></ol>")
1157
- else return false
1158
-
1159
- @addClassesToElement($list[0])
1160
- @replaceWith("li", $paragraph)
1161
- $li = $(".is-selected")
1162
-
1163
- @setElementName($li[0])
1164
-
1165
- $li.html(content).wrap($list)
1166
-
1167
- if($li.find("br").length == 0)
1168
- $li.append("<br/>")
1169
-
1170
- @setRangeAt($li[0])
1171
-
1172
- $li[0]
1173
-
1174
- handleSmartList: ($item, e)->
1175
- utils.log("HANDLE A SMART LIST")
1176
-
1177
- chars = @getCharacterPrecedingCaret()
1178
- match = chars.match(/^\s*(\-|\*)\s*$/)
1179
- if(match)
1180
- utils.log("CREATING LIST ITEM")
1181
- e.preventDefault()
1182
- regex = new RegExp(/\s*(\-|\*)\s*/)
1183
- $li = @listify($item, "ul", regex)
1184
- else
1185
- match = chars.match(/^\s*1(\.|\))\s*$/)
1186
- if(match)
1187
- utils.log("CREATING LIST ITEM")
1188
- e.preventDefault()
1189
-
1190
- regex = new RegExp(/\s*1(\.|\))\s*/)
1191
- $li = @listify($item, "ol", regex)
1192
- $li
1193
-
1194
- handleListLineBreak: ($li, e)->
1195
- utils.log("LIST LINE BREAK")
1196
- @tooltip_view.hide()
1197
- $list = $li.parent("ol, ul")
1198
- $paragraph = $("<p></p>")
1199
- utils.log($li.prev());
1200
- if($list.children().length is 1 and $li.text() is "")
1201
- @replaceWith("p", $list)
1202
-
1203
- else if $li.text() is "" and ($li.next().length isnt 0)
1204
- e.preventDefault()
1205
-
1206
- else if ($li.next().length is 0)
1207
- if($li.text() is "")
1208
- e.preventDefault()
1209
- utils.log("BREAK FROM LIST")
1210
- $list.after($paragraph)
1211
- $li.addClass("graf--removed").remove()
1212
-
1213
- else if ($li.prev().length isnt 0 and $li.prev().text() is "" and @getCharacterPrecedingCaret() is "")
1214
- e.preventDefault()
1215
- utils.log("PREV IS EMPTY")
1216
- content = $li.html()
1217
- $list.after($paragraph)
1218
- $li.prev().remove()
1219
- $li.addClass("graf--removed").remove()
1220
- $paragraph.html(content)
1221
-
1222
- if $list and $list.children().length is 0 then $list.remove()
1223
-
1224
- utils.log($li);
1225
- if ($li.hasClass("graf--removed"))
1226
- utils.log("ELEMENT REMOVED")
1227
- @addClassesToElement($paragraph[0])
1228
- @setRangeAt($paragraph[0])
1229
- @markAsSelected($paragraph[0])
1230
- @scrollTo($paragraph)
1231
-
1232
- handleListBackspace: ($li, e)->
1233
-
1234
- $list = $li.parent("ol, ul")
1235
- utils.log("LIST BACKSPACE")
1236
-
1237
- if($li.prev().length is 0)
1238
- e.preventDefault()
1239
-
1240
- $list.before($li)
1241
- content = $li.html()
1242
- @replaceWith("p", $li)
1243
- $paragraph = $(".is-selected")
1244
- $paragraph.removeClass("graf--empty").html(content).attr("name", utils.generateUniqueName());
1245
-
1246
- if($list.children().length is 0)
1247
- $list.remove()
1248
-
1249
- @setupFirstAndLast()
1250
-
1251
- #Remove Non-default Spans From Elements
1134
+ # Remove Non-default Spans From Elements
1252
1135
  removeSpanTag: ($item)->
1253
-
1254
1136
  $spans = $item.find("span")
1255
1137
  $(span).replaceWith($(span).html()) for span in $spans when not $(span).hasClass("defaultValue")
1256
1138
  $item