dante-editor 0.0.13 → 0.0.14
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.
- checksums.yaml +4 -4
- data/Gemfile.lock +4 -1
- data/app/assets/javascripts/dante/editor.js.coffee +71 -56
- data/app/assets/javascripts/dante/tooltip_widgets/uploader.js.coffee +22 -15
- data/app/assets/stylesheets/dante/_scaffold.scss +4 -0
- data/bower.json +1 -1
- data/dist/css/dante-editor.css +156 -152
- data/dist/js/dante-editor.js +76 -56
- data/lib/dante-editor/version.rb +1 -1
- metadata +3 -3
    
        data/dist/js/dante-editor.js
    CHANGED
    
    | @@ -8,7 +8,7 @@ | |
| 8 8 | 
             
                defaults: {
         | 
| 9 9 | 
             
                  image_placeholder: '../images/dante/media-loading-placeholder.png'
         | 
| 10 10 | 
             
                },
         | 
| 11 | 
            -
                version: "0.0. | 
| 11 | 
            +
                version: "0.0.14"
         | 
| 12 12 | 
             
              };
         | 
| 13 13 |  | 
| 14 14 | 
             
            }).call(this);
         | 
| @@ -747,24 +747,24 @@ | |
| 747 747 | 
             
                  return a === b;
         | 
| 748 748 | 
             
                };
         | 
| 749 749 |  | 
| 750 | 
            -
                Editor.prototype.setRangeAt = function(element,  | 
| 750 | 
            +
                Editor.prototype.setRangeAt = function(element, pos) {
         | 
| 751 751 | 
             
                  var range, sel;
         | 
| 752 | 
            -
                  if ( | 
| 753 | 
            -
                     | 
| 752 | 
            +
                  if (pos == null) {
         | 
| 753 | 
            +
                    pos = 0;
         | 
| 754 754 | 
             
                  }
         | 
| 755 755 | 
             
                  range = document.createRange();
         | 
| 756 756 | 
             
                  sel = window.getSelection();
         | 
| 757 | 
            -
                  range.setStart(element,  | 
| 757 | 
            +
                  range.setStart(element, pos);
         | 
| 758 758 | 
             
                  range.collapse(true);
         | 
| 759 759 | 
             
                  sel.removeAllRanges();
         | 
| 760 760 | 
             
                  sel.addRange(range);
         | 
| 761 761 | 
             
                  return element.focus();
         | 
| 762 762 | 
             
                };
         | 
| 763 763 |  | 
| 764 | 
            -
                Editor.prototype.setRangeAtText = function(element,  | 
| 764 | 
            +
                Editor.prototype.setRangeAtText = function(element, pos) {
         | 
| 765 765 | 
             
                  var node, range, sel;
         | 
| 766 | 
            -
                  if ( | 
| 767 | 
            -
                     | 
| 766 | 
            +
                  if (pos == null) {
         | 
| 767 | 
            +
                    pos = 0;
         | 
| 768 768 | 
             
                  }
         | 
| 769 769 | 
             
                  range = document.createRange();
         | 
| 770 770 | 
             
                  sel = window.getSelection();
         | 
| @@ -1002,7 +1002,7 @@ | |
| 1002 1002 | 
             
                      break;
         | 
| 1003 1003 | 
             
                    case "Up":
         | 
| 1004 1004 | 
             
                      prev_node = current_node.prev();
         | 
| 1005 | 
            -
                      utils.log("PREV NODE IS " + (prev_node.attr('class')));
         | 
| 1005 | 
            +
                      utils.log("PREV NODE IS " + (prev_node.attr('class')) + " " + (prev_node.attr('name')));
         | 
| 1006 1006 | 
             
                      utils.log("CURRENT NODE IS up " + (current_node.attr('class')));
         | 
| 1007 1007 | 
             
                      if (!$(current_node).hasClass("graf")) {
         | 
| 1008 1008 | 
             
                        return;
         | 
| @@ -1047,8 +1047,8 @@ | |
| 1047 1047 |  | 
| 1048 1048 | 
             
                Editor.prototype.parseInitialMess = function() {
         | 
| 1049 1049 | 
             
                  return this.setupElementsClasses($(this.el).find('.section-inner'), (function(_this) {
         | 
| 1050 | 
            -
                    return function() {
         | 
| 1051 | 
            -
                      return _this.handleUnwrappedImages( | 
| 1050 | 
            +
                    return function(e) {
         | 
| 1051 | 
            +
                      return _this.handleUnwrappedImages(e);
         | 
| 1052 1052 | 
             
                    };
         | 
| 1053 1053 | 
             
                  })(this));
         | 
| 1054 1054 | 
             
                };
         | 
| @@ -1079,24 +1079,24 @@ | |
| 1079 1079 | 
             
                    utils.log("HTML DETECTED ON PASTE");
         | 
| 1080 1080 | 
             
                    pastedText = pastedText.replace(/&.*;/g, "");
         | 
| 1081 1081 | 
             
                    pastedText = pastedText.replace(/<div>([\w\W]*?)<\/div>/gi, '<p>$1</p>');
         | 
| 1082 | 
            -
                    document.body.appendChild($("<div id='" + (this.paste_element_id.replace('#', '')) + "'></div>")[0]);
         | 
| 1082 | 
            +
                    document.body.appendChild($("<div id='" + (this.paste_element_id.replace('#', '')) + "' class='dante-paste'></div>")[0]);
         | 
| 1083 1083 | 
             
                    $(this.paste_element_id).html("<span>" + pastedText + "</span>");
         | 
| 1084 1084 | 
             
                    this.setupElementsClasses($(this.paste_element_id), (function(_this) {
         | 
| 1085 | 
            -
                      return function() {
         | 
| 1085 | 
            +
                      return function(e) {
         | 
| 1086 1086 | 
             
                        var last_node, new_node, nodes, num, top;
         | 
| 1087 | 
            -
                        nodes = $( | 
| 1088 | 
            -
                         | 
| 1087 | 
            +
                        nodes = $(e.html()).insertAfter($(_this.aa));
         | 
| 1088 | 
            +
                        e.remove();
         | 
| 1089 1089 | 
             
                        last_node = nodes.last()[0];
         | 
| 1090 1090 | 
             
                        num = last_node.childNodes.length;
         | 
| 1091 1091 | 
             
                        _this.setRangeAt(last_node, num);
         | 
| 1092 1092 | 
             
                        new_node = $(_this.getNode());
         | 
| 1093 | 
            -
                        top = new_node.offset().top;
         | 
| 1094 1093 | 
             
                        _this.markAsSelected(new_node);
         | 
| 1095 1094 | 
             
                        _this.displayTooltipAt($(_this.el).find(".is-selected"));
         | 
| 1096 1095 | 
             
                        _this.handleUnwrappedImages(nodes);
         | 
| 1096 | 
            +
                        top = new_node.offset().top;
         | 
| 1097 1097 | 
             
                        return $('html, body').animate({
         | 
| 1098 1098 | 
             
                          scrollTop: top
         | 
| 1099 | 
            -
                        },  | 
| 1099 | 
            +
                        }, 20);
         | 
| 1100 1100 | 
             
                      };
         | 
| 1101 1101 | 
             
                    })(this));
         | 
| 1102 1102 | 
             
                    return false;
         | 
| @@ -1156,6 +1156,7 @@ | |
| 1156 1156 | 
             
                    node = $(range.commonAncestorContainer);
         | 
| 1157 1157 | 
             
                    prev = node.prev();
         | 
| 1158 1158 | 
             
                    num = prev[0].childNodes.length;
         | 
| 1159 | 
            +
                    utils.log("PREV NODE");
         | 
| 1159 1160 | 
             
                    utils.log(prev);
         | 
| 1160 1161 | 
             
                    if (prev.hasClass("graf")) {
         | 
| 1161 1162 | 
             
                      this.setRangeAt(prev[0], num);
         | 
| @@ -1165,6 +1166,8 @@ | |
| 1165 1166 | 
             
                      this.setRangeAt(prev[0], num);
         | 
| 1166 1167 | 
             
                      node.remove();
         | 
| 1167 1168 | 
             
                      this.markAsSelected(this.getNode());
         | 
| 1169 | 
            +
                    } else if (prev.hasClass("postList")) {
         | 
| 1170 | 
            +
                      this.setRangeAt(prev.find("li").last()[0]);
         | 
| 1168 1171 | 
             
                    } else if (!prev) {
         | 
| 1169 1172 | 
             
                      this.setRangeAt(this.$el.find(".section-inner p")[0]);
         | 
| 1170 1173 | 
             
                    }
         | 
| @@ -1304,21 +1307,22 @@ | |
| 1304 1307 | 
             
                    utils.log("HANDLING WIDGET BACKSPACES");
         | 
| 1305 1308 | 
             
                    _.each(this.widgets, (function(_this) {
         | 
| 1306 1309 | 
             
                      return function(w) {
         | 
| 1307 | 
            -
                         | 
| 1308 | 
            -
             | 
| 1309 | 
            -
                          return  | 
| 1310 | 
            +
                        if (_.isFunction(w.handleBackspaceKey) && !eventHandled) {
         | 
| 1311 | 
            +
                          eventHandled = w.handleBackspaceKey(e, anchor_node);
         | 
| 1312 | 
            +
                          return utils.log(eventHandled);
         | 
| 1310 1313 | 
             
                        }
         | 
| 1311 1314 | 
             
                      };
         | 
| 1312 1315 | 
             
                    })(this));
         | 
| 1313 1316 | 
             
                    if (eventHandled) {
         | 
| 1314 1317 | 
             
                      e.preventDefault();
         | 
| 1318 | 
            +
                      utils.log("SCAPE FROM BACKSPACE HANDLER");
         | 
| 1315 1319 | 
             
                      return false;
         | 
| 1316 1320 | 
             
                    }
         | 
| 1317 1321 | 
             
                    if (parent.hasClass("graf--li") && this.getCharacterPrecedingCaret().length === 0) {
         | 
| 1318 1322 | 
             
                      return this.handleListBackspace(parent, e);
         | 
| 1319 1323 | 
             
                    }
         | 
| 1320 | 
            -
                    if ($(anchor_node).hasClass("graf--p") && this.isFirstChar) {
         | 
| 1321 | 
            -
                      if ($(anchor_node).prev().hasClass("graf--figure")) {
         | 
| 1324 | 
            +
                    if ($(anchor_node).hasClass("graf--p") && this.isFirstChar()) {
         | 
| 1325 | 
            +
                      if ($(anchor_node).prev().hasClass("graf--figure") && this.getSelectedText().length === 0) {
         | 
| 1322 1326 | 
             
                        e.preventDefault();
         | 
| 1323 1327 | 
             
                        $(anchor_node).prev().find("img").click();
         | 
| 1324 1328 | 
             
                        utils.log("Focus on the previous image");
         | 
| @@ -1468,6 +1472,7 @@ | |
| 1468 1472 | 
             
                };
         | 
| 1469 1473 |  | 
| 1470 1474 | 
             
                Editor.prototype.markAsSelected = function(element) {
         | 
| 1475 | 
            +
                  utils.log(element);
         | 
| 1471 1476 | 
             
                  if (_.isUndefined(element)) {
         | 
| 1472 1477 | 
             
                    return;
         | 
| 1473 1478 | 
             
                  }
         | 
| @@ -1555,36 +1560,37 @@ | |
| 1555 1560 |  | 
| 1556 1561 | 
             
                Editor.prototype.setupElementsClasses = function(element, cb) {
         | 
| 1557 1562 | 
             
                  if (_.isUndefined(element)) {
         | 
| 1558 | 
            -
                     | 
| 1563 | 
            +
                    element = $(this.el).find('.section-inner');
         | 
| 1559 1564 | 
             
                  } else {
         | 
| 1560 | 
            -
                     | 
| 1565 | 
            +
                    element = element;
         | 
| 1561 1566 | 
             
                  }
         | 
| 1562 | 
            -
                   | 
| 1563 | 
            -
             | 
| 1564 | 
            -
             | 
| 1565 | 
            -
             | 
| 1566 | 
            -
                       | 
| 1567 | 
            -
             | 
| 1568 | 
            -
             | 
| 1569 | 
            -
             | 
| 1570 | 
            -
                        return _this.setElementName(n);
         | 
| 1571 | 
            -
                      });
         | 
| 1572 | 
            -
                      _this.setupLinks(_this.element.find("a"));
         | 
| 1573 | 
            -
                      _this.setupFirstAndLast();
         | 
| 1574 | 
            -
                      if (_.isFunction(cb)) {
         | 
| 1575 | 
            -
                        return cb();
         | 
| 1576 | 
            -
                      }
         | 
| 1567 | 
            +
                  this.cleanContents(element);
         | 
| 1568 | 
            +
                  this.wrapTextNodes(element);
         | 
| 1569 | 
            +
                  _.each(element.children(), (function(_this) {
         | 
| 1570 | 
            +
                    return function(n) {
         | 
| 1571 | 
            +
                      var name;
         | 
| 1572 | 
            +
                      name = $(n).prop("tagName").toLowerCase();
         | 
| 1573 | 
            +
                      n = _this.addClassesToElement(n);
         | 
| 1574 | 
            +
                      return _this.setElementName(n);
         | 
| 1577 1575 | 
             
                    };
         | 
| 1578 | 
            -
                  })(this) | 
| 1576 | 
            +
                  })(this));
         | 
| 1577 | 
            +
                  this.setupLinks(element.find("a"));
         | 
| 1578 | 
            +
                  this.setupFirstAndLast();
         | 
| 1579 | 
            +
                  if (_.isFunction(cb)) {
         | 
| 1580 | 
            +
                    return cb(element);
         | 
| 1581 | 
            +
                  }
         | 
| 1579 1582 | 
             
                };
         | 
| 1580 1583 |  | 
| 1581 1584 | 
             
                Editor.prototype.cleanContents = function(element) {
         | 
| 1582 | 
            -
                  var s;
         | 
| 1585 | 
            +
                  var paste_div, s;
         | 
| 1586 | 
            +
                  utils.log("ti");
         | 
| 1587 | 
            +
                  utils.log(element);
         | 
| 1583 1588 | 
             
                  if (_.isUndefined(element)) {
         | 
| 1584 | 
            -
                     | 
| 1589 | 
            +
                    element = $(this.el).find('.section-inner');
         | 
| 1585 1590 | 
             
                  } else {
         | 
| 1586 | 
            -
                     | 
| 1591 | 
            +
                    element = element;
         | 
| 1587 1592 | 
             
                  }
         | 
| 1593 | 
            +
                  paste_div = this.paste_element_id;
         | 
| 1588 1594 | 
             
                  s = new Sanitize({
         | 
| 1589 1595 | 
             
                    elements: ['strong', 'img', 'em', 'br', 'a', 'blockquote', 'b', 'u', 'i', 'pre', 'p', 'h1', 'h2', 'h3', 'h4', 'ul', 'ol', 'li'],
         | 
| 1590 1596 | 
             
                    attributes: {
         | 
| @@ -1603,6 +1609,11 @@ | |
| 1603 1609 | 
             
                          return {
         | 
| 1604 1610 | 
             
                            whitelist_nodes: [input.node]
         | 
| 1605 1611 | 
             
                          };
         | 
| 1612 | 
            +
                        }
         | 
| 1613 | 
            +
                        if ($(input.node).hasClass("dante-paste")) {
         | 
| 1614 | 
            +
                          return {
         | 
| 1615 | 
            +
                            whitelist_nodes: [input.node]
         | 
| 1616 | 
            +
                          };
         | 
| 1606 1617 | 
             
                        } else {
         | 
| 1607 1618 | 
             
                          return null;
         | 
| 1608 1619 | 
             
                        }
         | 
| @@ -1673,9 +1684,9 @@ | |
| 1673 1684 | 
             
                      }
         | 
| 1674 1685 | 
             
                    ]
         | 
| 1675 1686 | 
             
                  });
         | 
| 1676 | 
            -
                  if ( | 
| 1677 | 
            -
                    utils.log("CLEAN HTML " +  | 
| 1678 | 
            -
                    return  | 
| 1687 | 
            +
                  if (element.exists()) {
         | 
| 1688 | 
            +
                    utils.log("CLEAN HTML " + element[0].tagName);
         | 
| 1689 | 
            +
                    return element.html(s.clean_node(element[0]));
         | 
| 1679 1690 | 
             
                  }
         | 
| 1680 1691 | 
             
                };
         | 
| 1681 1692 |  | 
| @@ -1835,7 +1846,7 @@ | |
| 1835 1846 | 
             
                    content = $li.html();
         | 
| 1836 1847 | 
             
                    this.replaceWith("p", $li);
         | 
| 1837 1848 | 
             
                    $paragraph = $(".is-selected");
         | 
| 1838 | 
            -
                    $paragraph.removeClass("graf--empty").html(content);
         | 
| 1849 | 
            +
                    $paragraph.removeClass("graf--empty").html(content).attr("name", utils.generateUniqueName());
         | 
| 1839 1850 | 
             
                    if ($list.children().length === 0) {
         | 
| 1840 1851 | 
             
                      $list.remove();
         | 
| 1841 1852 | 
             
                    }
         | 
| @@ -1930,7 +1941,7 @@ | |
| 1930 1941 | 
             
                };
         | 
| 1931 1942 |  | 
| 1932 1943 | 
             
                Uploader.prototype.uploadExistentImage = function(image_element, opts) {
         | 
| 1933 | 
            -
                  var i,  | 
| 1944 | 
            +
                  var i, n, node, tmpl, _i, _ref, _results;
         | 
| 1934 1945 | 
             
                  if (opts == null) {
         | 
| 1935 1946 | 
             
                    opts = {};
         | 
| 1936 1947 | 
             
                  }
         | 
| @@ -1950,18 +1961,18 @@ | |
| 1950 1961 | 
             
                    }
         | 
| 1951 1962 | 
             
                  } else {
         | 
| 1952 1963 | 
             
                    utils.log("DOS");
         | 
| 1953 | 
            -
                     | 
| 1954 | 
            -
                    $(img).replaceWith(tmpl);
         | 
| 1964 | 
            +
                    $(image_element).replaceWith(tmpl);
         | 
| 1955 1965 | 
             
                  }
         | 
| 1956 1966 | 
             
                  utils.log($("[name='" + (tmpl.attr('name')) + "']").attr("name"));
         | 
| 1957 1967 | 
             
                  this.replaceImg(image_element, $("[name='" + (tmpl.attr('name')) + "']"));
         | 
| 1958 1968 | 
             
                  n = $("[name='" + (tmpl.attr('name')) + "']").parentsUntil(".section-inner").length;
         | 
| 1959 1969 | 
             
                  if (n !== 0) {
         | 
| 1970 | 
            +
                    _results = [];
         | 
| 1960 1971 | 
             
                    for (i = _i = 0, _ref = n - 1; _i <= _ref; i = _i += 1) {
         | 
| 1961 | 
            -
                      $("[name='" + (tmpl.attr('name')) + "']").unwrap();
         | 
| 1972 | 
            +
                      _results.push($("[name='" + (tmpl.attr('name')) + "']").unwrap());
         | 
| 1962 1973 | 
             
                    }
         | 
| 1974 | 
            +
                    return _results;
         | 
| 1963 1975 | 
             
                  }
         | 
| 1964 | 
            -
                  return utils.log("FIG");
         | 
| 1965 1976 | 
             
                };
         | 
| 1966 1977 |  | 
| 1967 1978 | 
             
                Uploader.prototype.replaceImg = function(image_element, figure) {
         | 
| @@ -2163,18 +2174,27 @@ | |
| 2163 2174 | 
             
                 * @param {Event} e    - The backspace event that is being handled
         | 
| 2164 2175 | 
             
                 * @param {Node}  node - The node the backspace was used in, assumed to be from te editor's getNode() function
         | 
| 2165 2176 | 
             
                 *
         | 
| 2166 | 
            -
                 * @return {Boolean} true if this function  | 
| 2177 | 
            +
                 * @return {Boolean} true if this function should scape the default behavior
         | 
| 2167 2178 | 
             
                 */
         | 
| 2168 2179 |  | 
| 2169 2180 | 
             
                Uploader.prototype.handleBackspaceKey = function(e, node) {
         | 
| 2170 | 
            -
                   | 
| 2181 | 
            +
                  var anchor_node;
         | 
| 2182 | 
            +
                  utils.log("handleBackspaceKey on uploader widget");
         | 
| 2183 | 
            +
                  if ($(node).hasClass("is-selected") && $(node).hasClass("graf--figure")) {
         | 
| 2184 | 
            +
                    anchor_node = this.current_editor.selection().anchorNode;
         | 
| 2185 | 
            +
                    if ((anchor_node != null) && $(anchor_node.parentNode).hasClass("imageCaption")) {
         | 
| 2186 | 
            +
                      if (this.current_editor.isFirstChar()) {
         | 
| 2187 | 
            +
                        return true;
         | 
| 2188 | 
            +
                      } else {
         | 
| 2189 | 
            +
                        return false;
         | 
| 2190 | 
            +
                      }
         | 
| 2191 | 
            +
                    }
         | 
| 2192 | 
            +
                  } else if ($(".is-selected").hasClass("is-mediaFocused")) {
         | 
| 2171 2193 | 
             
                    utils.log("Replacing selected node");
         | 
| 2172 2194 | 
             
                    this.current_editor.replaceWith("p", $(".is-selected"));
         | 
| 2173 | 
            -
                    e.preventDefault();
         | 
| 2174 2195 | 
             
                    this.current_editor.setRangeAt($(".is-selected")[0]);
         | 
| 2175 2196 | 
             
                    return true;
         | 
| 2176 2197 | 
             
                  }
         | 
| 2177 | 
            -
                  return false;
         | 
| 2178 2198 | 
             
                };
         | 
| 2179 2199 |  | 
| 2180 2200 | 
             
                return Uploader;
         | 
    
        data/lib/dante-editor/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: dante-editor
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.0. | 
| 4 | 
            +
              version: 0.0.14
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Miguel Michelson
         | 
| @@ -9,7 +9,7 @@ authors: | |
| 9 9 | 
             
            autorequire: 
         | 
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date: 2015- | 
| 12 | 
            +
            date: 2015-08-10 00:00:00.000000000 Z
         | 
| 13 13 | 
             
            dependencies: []
         | 
| 14 14 | 
             
            description: dante-editor yet another Medium editor clone.
         | 
| 15 15 | 
             
            email:
         | 
| @@ -141,7 +141,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 141 141 | 
             
                  version: '0'
         | 
| 142 142 | 
             
            requirements: []
         | 
| 143 143 | 
             
            rubyforge_project: 
         | 
| 144 | 
            -
            rubygems_version: 2. | 
| 144 | 
            +
            rubygems_version: 2.4.8
         | 
| 145 145 | 
             
            signing_key: 
         | 
| 146 146 | 
             
            specification_version: 4
         | 
| 147 147 | 
             
            summary: dante-editor yet another Medium editor clone.
         |