UNPKG

alpaca

Version:

Alpaca provides the easiest and fastest way to generate interactive forms for the web and mobile devices. It runs simply as HTML5 or more elaborately using Bootstrap, jQuery Mobile or jQuery UI. Alpaca uses Handlebars to process JSON schema and provide

217 lines (181 loc) 6.09 kB
define([ 'summernote/base/core/list', 'summernote/base/core/func', 'summernote/base/core/dom', 'summernote/base/core/range' ], function (list, func, dom, range) { /** * @class editing.Bullet * * @alternateClassName Bullet */ var Bullet = function () { var self = this; /** * toggle ordered list */ this.insertOrderedList = function (editable) { this.toggleList('OL', editable); }; /** * toggle unordered list */ this.insertUnorderedList = function (editable) { this.toggleList('UL', editable); }; /** * indent */ this.indent = function (editable) { var self = this; var rng = range.create(editable).wrapBodyInlineWithPara(); var paras = rng.nodes(dom.isPara, { includeAncestor: true }); var clustereds = list.clusterBy(paras, func.peq2('parentNode')); $.each(clustereds, function (idx, paras) { var head = list.head(paras); if (dom.isLi(head)) { self.wrapList(paras, head.parentNode.nodeName); } else { $.each(paras, function (idx, para) { $(para).css('marginLeft', function (idx, val) { return (parseInt(val, 10) || 0) + 25; }); }); } }); rng.select(); }; /** * outdent */ this.outdent = function (editable) { var self = this; var rng = range.create(editable).wrapBodyInlineWithPara(); var paras = rng.nodes(dom.isPara, { includeAncestor: true }); var clustereds = list.clusterBy(paras, func.peq2('parentNode')); $.each(clustereds, function (idx, paras) { var head = list.head(paras); if (dom.isLi(head)) { self.releaseList([paras]); } else { $.each(paras, function (idx, para) { $(para).css('marginLeft', function (idx, val) { val = (parseInt(val, 10) || 0); return val > 25 ? val - 25 : ''; }); }); } }); rng.select(); }; /** * toggle list * * @param {String} listName - OL or UL */ this.toggleList = function (listName, editable) { var rng = range.create(editable).wrapBodyInlineWithPara(); var paras = rng.nodes(dom.isPara, { includeAncestor: true }); var bookmark = rng.paraBookmark(paras); var clustereds = list.clusterBy(paras, func.peq2('parentNode')); // paragraph to list if (list.find(paras, dom.isPurePara)) { var wrappedParas = []; $.each(clustereds, function (idx, paras) { wrappedParas = wrappedParas.concat(self.wrapList(paras, listName)); }); paras = wrappedParas; // list to paragraph or change list style } else { var diffLists = rng.nodes(dom.isList, { includeAncestor: true }).filter(function (listNode) { return !$.nodeName(listNode, listName); }); if (diffLists.length) { $.each(diffLists, function (idx, listNode) { dom.replace(listNode, listName); }); } else { paras = this.releaseList(clustereds, true); } } range.createFromParaBookmark(bookmark, paras).select(); }; /** * @param {Node[]} paras * @param {String} listName * @return {Node[]} */ this.wrapList = function (paras, listName) { var head = list.head(paras); var last = list.last(paras); var prevList = dom.isList(head.previousSibling) && head.previousSibling; var nextList = dom.isList(last.nextSibling) && last.nextSibling; var listNode = prevList || dom.insertAfter(dom.create(listName || 'UL'), last); // P to LI paras = paras.map(function (para) { return dom.isPurePara(para) ? dom.replace(para, 'LI') : para; }); // append to list(<ul>, <ol>) dom.appendChildNodes(listNode, paras); if (nextList) { dom.appendChildNodes(listNode, list.from(nextList.childNodes)); dom.remove(nextList); } return paras; }; /** * @method releaseList * * @param {Array[]} clustereds * @param {Boolean} isEscapseToBody * @return {Node[]} */ this.releaseList = function (clustereds, isEscapseToBody) { var releasedParas = []; $.each(clustereds, function (idx, paras) { var head = list.head(paras); var last = list.last(paras); var headList = isEscapseToBody ? dom.lastAncestor(head, dom.isList) : head.parentNode; var lastList = headList.childNodes.length > 1 ? dom.splitTree(headList, { node: last.parentNode, offset: dom.position(last) + 1 }, { isSkipPaddingBlankHTML: true }) : null; var middleList = dom.splitTree(headList, { node: head.parentNode, offset: dom.position(head) }, { isSkipPaddingBlankHTML: true }); paras = isEscapseToBody ? dom.listDescendant(middleList, dom.isLi) : list.from(middleList.childNodes).filter(dom.isLi); // LI to P if (isEscapseToBody || !dom.isList(headList.parentNode)) { paras = paras.map(function (para) { return dom.replace(para, 'P'); }); } $.each(list.from(paras).reverse(), function (idx, para) { dom.insertAfter(para, headList); }); // remove empty lists var rootLists = list.compact([headList, middleList, lastList]); $.each(rootLists, function (idx, rootList) { var listNodes = [rootList].concat(dom.listDescendant(rootList, dom.isList)); $.each(listNodes.reverse(), function (idx, listNode) { if (!dom.nodeLength(listNode)) { dom.remove(listNode, true); } }); }); releasedParas = releasedParas.concat(paras); }); return releasedParas; }; }; return Bullet; });