src/pyams_skin/resources/js/ext/tinymce/dev/classes/ForceBlocks.js
changeset 69 a361355b55c7
equal deleted inserted replaced
68:fd8fb93e1b6a 69:a361355b55c7
       
     1 /**
       
     2  * ForceBlocks.js
       
     3  *
       
     4  * Copyright, Moxiecode Systems AB
       
     5  * Released under LGPL License.
       
     6  *
       
     7  * License: http://www.tinymce.com/license
       
     8  * Contributing: http://www.tinymce.com/contributing
       
     9  */
       
    10 
       
    11 define("tinymce/ForceBlocks", [], function() {
       
    12 	return function(editor) {
       
    13 		var settings = editor.settings, dom = editor.dom, selection = editor.selection;
       
    14 		var schema = editor.schema, blockElements = schema.getBlockElements();
       
    15 
       
    16 		function addRootBlocks() {
       
    17 			var node = selection.getStart(), rootNode = editor.getBody(), rng;
       
    18 			var startContainer, startOffset, endContainer, endOffset, rootBlockNode;
       
    19 			var tempNode, offset = -0xFFFFFF, wrapped, restoreSelection;
       
    20 			var tmpRng, rootNodeName, forcedRootBlock;
       
    21 
       
    22 			forcedRootBlock = settings.forced_root_block;
       
    23 
       
    24 			if (!node || node.nodeType !== 1 || !forcedRootBlock) {
       
    25 				return;
       
    26 			}
       
    27 
       
    28 			// Check if node is wrapped in block
       
    29 			while (node && node != rootNode) {
       
    30 				if (blockElements[node.nodeName]) {
       
    31 					return;
       
    32 				}
       
    33 
       
    34 				node = node.parentNode;
       
    35 			}
       
    36 
       
    37 			// Get current selection
       
    38 			rng = selection.getRng();
       
    39 			if (rng.setStart) {
       
    40 				startContainer = rng.startContainer;
       
    41 				startOffset = rng.startOffset;
       
    42 				endContainer = rng.endContainer;
       
    43 				endOffset = rng.endOffset;
       
    44 
       
    45 				try {
       
    46 					restoreSelection = editor.getDoc().activeElement === rootNode;
       
    47 				} catch (ex) {
       
    48 					// IE throws unspecified error here sometimes
       
    49 				}
       
    50 			} else {
       
    51 				// Force control range into text range
       
    52 				if (rng.item) {
       
    53 					node = rng.item(0);
       
    54 					rng = editor.getDoc().body.createTextRange();
       
    55 					rng.moveToElementText(node);
       
    56 				}
       
    57 
       
    58 				restoreSelection = rng.parentElement().ownerDocument === editor.getDoc();
       
    59 				tmpRng = rng.duplicate();
       
    60 				tmpRng.collapse(true);
       
    61 				startOffset = tmpRng.move('character', offset) * -1;
       
    62 
       
    63 				if (!tmpRng.collapsed) {
       
    64 					tmpRng = rng.duplicate();
       
    65 					tmpRng.collapse(false);
       
    66 					endOffset = (tmpRng.move('character', offset) * -1) - startOffset;
       
    67 				}
       
    68 			}
       
    69 
       
    70 			// Wrap non block elements and text nodes
       
    71 			node = rootNode.firstChild;
       
    72 			rootNodeName = rootNode.nodeName.toLowerCase();
       
    73 			while (node) {
       
    74 				// TODO: Break this up, too complex
       
    75 				if (((node.nodeType === 3 || (node.nodeType == 1 && !blockElements[node.nodeName]))) &&
       
    76 					schema.isValidChild(rootNodeName, forcedRootBlock.toLowerCase())) {
       
    77 					// Remove empty text nodes
       
    78 					if (node.nodeType === 3 && node.nodeValue.length === 0) {
       
    79 						tempNode = node;
       
    80 						node = node.nextSibling;
       
    81 						dom.remove(tempNode);
       
    82 						continue;
       
    83 					}
       
    84 
       
    85 					if (!rootBlockNode) {
       
    86 						rootBlockNode = dom.create(forcedRootBlock, editor.settings.forced_root_block_attrs);
       
    87 						node.parentNode.insertBefore(rootBlockNode, node);
       
    88 						wrapped = true;
       
    89 					}
       
    90 
       
    91 					tempNode = node;
       
    92 					node = node.nextSibling;
       
    93 					rootBlockNode.appendChild(tempNode);
       
    94 				} else {
       
    95 					rootBlockNode = null;
       
    96 					node = node.nextSibling;
       
    97 				}
       
    98 			}
       
    99 
       
   100 			if (wrapped && restoreSelection) {
       
   101 				if (rng.setStart) {
       
   102 					rng.setStart(startContainer, startOffset);
       
   103 					rng.setEnd(endContainer, endOffset);
       
   104 					selection.setRng(rng);
       
   105 				} else {
       
   106 					// Only select if the previous selection was inside the document to prevent auto focus in quirks mode
       
   107 					try {
       
   108 						rng = editor.getDoc().body.createTextRange();
       
   109 						rng.moveToElementText(rootNode);
       
   110 						rng.collapse(true);
       
   111 						rng.moveStart('character', startOffset);
       
   112 
       
   113 						if (endOffset > 0) {
       
   114 							rng.moveEnd('character', endOffset);
       
   115 						}
       
   116 
       
   117 						rng.select();
       
   118 					} catch (ex) {
       
   119 						// Ignore
       
   120 					}
       
   121 				}
       
   122 
       
   123 				editor.nodeChanged();
       
   124 			}
       
   125 		}
       
   126 
       
   127 		// Force root blocks
       
   128 		if (settings.forced_root_block) {
       
   129 			editor.on('NodeChange', addRootBlocks);
       
   130 		}
       
   131 	};
       
   132 });