X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/1c476cf2d7cf15901a233c86a41e64daba7e0b31..739242f6208f3e58570194fb1000086bafd527ef:/modules/documentCanvas/canvas/canvas.js diff --git a/modules/documentCanvas/canvas/canvas.js b/modules/documentCanvas/canvas/canvas.js index cb9fb69..318a22f 100644 --- a/modules/documentCanvas/canvas/canvas.js +++ b/modules/documentCanvas/canvas/canvas.js @@ -1,13 +1,15 @@ define([ 'libs/jquery-1.9.1.min', 'libs/underscore-min', +'libs/backbone-min', 'modules/documentCanvas/canvas/documentElement', 'modules/documentCanvas/canvas/utils' -], function($, _, documentElement, utils) { +], function($, _, Backbone, documentElement, utils) { 'use strict'; var Canvas = function(wlxml, publisher) { + this.eventBus = _.extend({}, Backbone.Events); this.loadWlxml(wlxml); this.publisher = publisher ? publisher : function() {}; }; @@ -19,7 +21,8 @@ $.extend(Canvas.prototype, { if(d) { this.wrapper = $('
').addClass('canvas-wrapper').attr('contenteditable', true); this.wrapper.append(d); - + var canvas = this; + this.wrapper.find('*').replaceWith(function() { var currentTag = $(this); if(currentTag.attr('wlxml-tag')) @@ -40,7 +43,7 @@ $.extend(Canvas.prototype, { meta: meta, others: others, rawChildren: currentTag.contents() - }); + }, canvas); ['orig-before', 'orig-after', 'orig-begin', 'orig-end'].forEach(function(attr) { element.data(attr, ''); @@ -137,14 +140,19 @@ $.extend(Canvas.prototype, { this.d = this.wrapper.children(0); - var canvas = this; this.wrapper.on('keydown', function(e) { if(e.which === 13) { e.preventDefault(); var cursor = canvas.getCursor(); if(!cursor.isSelecting()) { var position = cursor.getPosition(), - elements = position.element.split({offset: position.offset}), + element = position.element; + + if(!(element.parent().parent())) { + return false; // top level element is unsplittable + } + + var elements = position.element.split({offset: position.offset}), newEmpty, goto; @@ -255,6 +263,13 @@ $.extend(Canvas.prototype, { el.toggleLabel(false); }); + this.eventBus.on('elementToggled', function(toggle, element) { + if(!toggle) { + element = canvas.getDocumentElement(utils.nearestInDocumentOrder('[document-text-element]:visible', 'above', element.dom()[0])); + canvas.setCurrentElement(element); + } + }) + } else { this.d = null; } @@ -310,6 +325,59 @@ $.extend(Canvas.prototype, { wrapperElement.after({text: suffixOutside}); return wrapperElement; }, + + wrapElements: function(params) { + if(!(params.element1.parent().sameNode(params.element2.parent()))) + return; + + var parent = params.element1.parent(), + parentChildren = parent.children(), + wrapper = documentElement.DocumentNodeElement.create({ + tag: params._with.tag, + klass: params._with.klass}), + idx1 = parent.childIndex(params.element1), + idx2 = parent.childIndex(params.element2); + + if(idx1 > idx2) { + var tmp = idx1; + idx1 = idx2; + idx2 = tmp; + } + + var insertingMethod, insertingTarget; + if(idx1 === 0) { + insertingMethod = 'prepend'; + insertingTarget = parent; + } else { + insertingMethod = 'after'; + insertingTarget = parentChildren[idx1-1]; + } + + for(var i = idx1; i <= idx2; i++) { + wrapper.append(parentChildren[i].detach()); + } + + insertingTarget[insertingMethod](wrapper); + return wrapper; + }, + + getSiblingParents: function(params) { + var parents1 = [params.element1].concat(params.element1.parents()).reverse(), + parents2 = [params.element2].concat(params.element2.parents()).reverse(), + noSiblingParents = null; + + if(parents1.length === 0 || parents2.length === 0 || !(parents1[0].sameNode(parents2[0]))) + return noSiblingParents; + + var i; + for(i = 0; i < Math.min(parents1.length, parents2.length); i++) { + if(parents1[i].sameNode(parents2[i])) + continue; + break; + } + return {element1: parents1[i], element2: parents2[i]}; + }, + getDocumentElement: function(from) { if(from instanceof HTMLElement || from instanceof Text) { return documentElement.DocumentElement.fromHTMLElement(from, this); @@ -617,7 +685,7 @@ $.extend(Cursor.prototype, { element: focusElement, offset: getOffset('focus'), offsetAtBeginning: getOffset('focus') === 0, - offsetAtEnd: selection.focusElement.data.length === getOffset('focus') + offsetAtEnd: selection.focusNode.data.length === getOffset('focus') }; }