Wrapping text inside DocumentTextElement with DocumentNodeElement
[fnpeditor.git] / modules / documentCanvas / canvas / canvas.js
index 7d99f36..65cacca 100644 (file)
@@ -1,7 +1,8 @@
 define([
 'libs/jquery-1.9.1.min',
+'libs/underscore-min',
 'modules/documentCanvas/canvas/documentElement'
-], function($, documentElement) {
+], function($, _, documentElement) {
     
 'use strict';
 
@@ -15,7 +16,46 @@ $.extend(Canvas.prototype, {
     doc: function() {
         if(this.d === null)
             return null;
-        return documentElement.wrap(this.d.get(0)); //{wlxmlTag: this.d.prop('tagName')};
+        return documentElement.wrap(this.d.get(0), this); //{wlxmlTag: this.d.prop('tagName')};
+    },
+
+    wrapText: function(params) {
+        params = _.extend({textNodeIdx: 0}, params);
+        if(typeof params.textNodeIdx === 'number')
+            params.textNodeIdx = [params.textNodeIdx];
+        
+        //var container = params.inside.dom(),
+        var childrenInside = params.inside.children(),
+            idx1 = Math.min.apply(Math, params.textNodeIdx),
+            idx2 = Math.max.apply(Math, params.textNodeIdx),
+            textNode1 = childrenInside[idx1],
+            textNode2 = childrenInside[idx2],
+            sameNode = textNode1.sameNode(textNode2),
+            prefixOutside = textNode1.getText().substr(0, params.offsetStart),
+            prefixInside = textNode1.getText().substr(params.offsetStart),
+            suffixInside = textNode2.getText().substr(0, params.offsetEnd),
+            suffixOutside = textNode2.getText().substr(params.offsetEnd)
+        ;
+        
+        var wrapperElement = documentElement.DocumentNodeElement.create({tag: params._with.tag, klass: params._with.klass});
+        textNode1.after(wrapperElement);
+        textNode1.detach();
+        
+        wrapperElement.before({text:prefixOutside});
+        if(sameNode) {
+            var core = textNode1.getText().substr(params.offsetStart, params.offsetEnd - params.offsetStart);
+            wrapperElement.append({text: core});
+        } else {
+            textNode2.detach();
+            wrapperElement.append({text: prefixInside});
+            for(var i = idx1 + 1; i < idx2; i++) {
+                wrapperElement.append(childrenInside[i]);
+            }
+            
+            wrapperElement.append({text: suffixInside});
+        }
+        wrapperElement.after({text: suffixOutside});
+        return wrapperElement;
     }
 
 });