|
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module unless amdModuleId is set
define('simditor-checklist', ["jquery","simditor"], function (a0,b1) {
return (root['ChecklistButton'] = factory(a0,b1));
});
} else if (typeof exports === 'object') {
// Node. Does not work with strict CommonJS, but
// only CommonJS-like environments that support module.exports,
// like Node.
module.exports = factory(require("jquery"),require("simditor"));
} else {
root['ChecklistButton'] = factory(jQuery,Simditor);
}
}(this, function ($, Simditor) {
var ChecklistButton,
extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
hasProp = {}.hasOwnProperty,
slice = [].slice;
ChecklistButton = (function(superClass) {
extend(ChecklistButton, superClass);
ChecklistButton.prototype.type = 'ul.simditor-checklist';
ChecklistButton.prototype.name = 'checklist';
ChecklistButton.prototype.icon = 'checklist';
ChecklistButton.prototype.htmlTag = 'li';
ChecklistButton.prototype.disableTag = 'pre, table';
function ChecklistButton() {
var args;
args = 1 <= arguments.length ? slice.call(arguments, 0) : [];
ChecklistButton.__super__.constructor.apply(this, args);
if ('input' && $.inArray('input', this.editor.formatter._allowedTags) < 0) {
this.editor.formatter._allowedTags.push('input');
}
$.extend(this.editor.formatter._allowedAttributes, {
input: ['type', 'checked']
});
}
ChecklistButton.prototype._init = function() {
ChecklistButton.__super__._init.call(this);
this.editor.on('decorate', (function(_this) {
return function(e, $el) {
return $el.find('ul > li input[type=checkbox]').each(function(i, checkbox) {
return _this._decorate($(checkbox));
});
};
})(this));
this.editor.on('undecorate', (function(_this) {
return function(e, $el) {
return $el.find('.simditor-checklist > li').each(function(i, node) {
return _this._undecorate($(node));
});
};
})(this));
this.editor.body.on('click', '.simditor-checklist > li', (function(_this) {
return function(e) {
var $node, range;
e.preventDefault();
e.stopPropagation();
$node = $(e.currentTarget);
range = document.createRange();
_this.editor.selection.save();
range.setStart($node[0], 0);
range.setEnd($node[0], _this.editor.util.getNodeLength($node[0]));
_this.editor.selection.range(range);
document.execCommand('strikethrough');
$node.attr('checked', !$node.attr('checked'));
_this.editor.selection.restore();
return _this.editor.trigger('valuechanged');
};
})(this));
return this.editor.keystroke.add('13', 'li', (function(_this) {
return function(e, $node) {
return setTimeout(function() {
var $li;
$li = _this.editor.selection.blockNodes().last().next();
if ($li.length) {
$li[0].removeAttribute('checked');
if (document.queryCommandState('strikethrough')) {
return document.execCommand('strikethrough');
}
}
}, 0);
};
})(this));
};
ChecklistButton.prototype._status = function() {
var $node;
ChecklistButton.__super__._status.call(this);
$node = this.editor.selection.rootNodes();
if ($node.is('.simditor-checklist')) {
this.editor.toolbar.findButton('ul').setActive(false);
this.editor.toolbar.findButton('ol').setActive(false);
this.editor.toolbar.findButton('ul').setDisabled(true);
return this.editor.toolbar.findButton('ol').setDisabled(true);
} else {
return this.editor.toolbar.findButton('checklist').setActive(false);
}
};
ChecklistButton.prototype.command = function(param) {
var $list, $rootNodes;
$rootNodes = this.editor.selection.blockNodes();
this.editor.selection.save();
$list = null;
$rootNodes.each((function(_this) {
return function(i, node) {
var $node;
$node = $(node);
if ($node.is('blockquote, li') || $node.is(_this.disableTag) || !$.contains(document, node)) {
return;
}
if ($node.is('.simditor-checklist')) {
$node.children('li').each(function(i, li) {
var $childList, $li;
$li = $(li);
$childList = $li.children('ul, ol').insertAfter($node);
return $('<p/>').append($(li).html() || _this.editor.util.phBr).insertBefore($node);
});
return $node.remove();
} else if ($node.is('ul, ol')) {
return $('<ul class="simditor-checklist" />').append($node.contents()).replaceAll($node);
} else if ($list && $node.prev().is($list)) {
$('<li/>').append($node.html() || _this.editor.util.phBr).appendTo($list);
return $node.remove();
} else {
$list = $('<ul class="simditor-checklist"><li></li></ul>');
$list.find('li').append($node.html() || _this.editor.util.phBr);
return $list.replaceAll($node);
}
};
})(this));
this.editor.selection.restore();
return this.editor.trigger('valuechanged');
};
ChecklistButton.prototype._decorate = function($checkbox) {
var $node, checked;
checked = !!$checkbox.attr('checked');
$node = $checkbox.closest('li');
$checkbox.remove();
$node.attr('checked', checked);
return $node.closest('ul').addClass('simditor-checklist');
};
ChecklistButton.prototype._undecorate = function($node) {
var $checkbox, checked;
checked = !!$node.attr('checked');
$checkbox = $('<input type="checkbox">').attr('checked', checked);
return $node.attr('checked', '').prepend($checkbox);
};
return ChecklistButton;
})(Simditor.Button);
Simditor.Toolbar.addButton(ChecklistButton);
return ChecklistButton;
}));
|