dante-editor 0.0.15 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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