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
94 lines (79 loc) • 2.69 kB
JavaScript
define([
'summernote/base/core/dom',
'summernote/base/core/range',
'summernote/base/editing/Bullet'
], function (dom, range, Bullet) {
/**
* @class editing.Typing
*
* Typing
*
*/
var Typing = function () {
// a Bullet instance to toggle lists off
var bullet = new Bullet();
/**
* insert tab
*
* @param {WrappedRange} rng
* @param {Number} tabsize
*/
this.insertTab = function (rng, tabsize) {
var tab = dom.createText(new Array(tabsize + 1).join(dom.NBSP_CHAR));
rng = rng.deleteContents();
rng.insertNode(tab, true);
rng = range.create(tab, tabsize);
rng.select();
};
/**
* insert paragraph
*/
this.insertParagraph = function (editable) {
var rng = range.create(editable);
// deleteContents on range.
rng = rng.deleteContents();
// Wrap range if it needs to be wrapped by paragraph
rng = rng.wrapBodyInlineWithPara();
// finding paragraph
var splitRoot = dom.ancestor(rng.sc, dom.isPara);
var nextPara;
// on paragraph: split paragraph
if (splitRoot) {
// if it is an empty line with li
if (dom.isEmpty(splitRoot) && dom.isLi(splitRoot)) {
// toogle UL/OL and escape
bullet.toggleList(splitRoot.parentNode.nodeName);
return;
// if it is an empty line with para on blockquote
} else if (dom.isEmpty(splitRoot) && dom.isPara(splitRoot) && dom.isBlockquote(splitRoot.parentNode)) {
// escape blockquote
dom.insertAfter(splitRoot, splitRoot.parentNode);
nextPara = splitRoot;
// if new line has content (not a line break)
} else {
nextPara = dom.splitTree(splitRoot, rng.getStartPoint());
var emptyAnchors = dom.listDescendant(splitRoot, dom.isEmptyAnchor);
emptyAnchors = emptyAnchors.concat(dom.listDescendant(nextPara, dom.isEmptyAnchor));
$.each(emptyAnchors, function (idx, anchor) {
dom.remove(anchor);
});
// replace empty heading or pre with P tag
if ((dom.isHeading(nextPara) || dom.isPre(nextPara)) && dom.isEmpty(nextPara)) {
nextPara = dom.replace(nextPara, 'p');
}
}
// no paragraph: insert empty paragraph
} else {
var next = rng.sc.childNodes[rng.so];
nextPara = $(dom.emptyPara)[0];
if (next) {
rng.sc.insertBefore(nextPara, next);
} else {
rng.sc.appendChild(nextPara);
}
}
range.create(nextPara, 0).normalize().select().scrollIntoView(editable);
};
};
return Typing;
});