You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@corinthia.apache.org by ja...@apache.org on 2015/08/16 12:58:23 UTC
[48/51] [partial] incubator-corinthia git commit: Added
editorFramework in experiments.
http://git-wip-us.apache.org/repos/asf/incubator-corinthia/blob/26f461e7/experiments/Editor/src/Figures.js
----------------------------------------------------------------------
diff --git a/experiments/Editor/src/Figures.js b/experiments/Editor/src/Figures.js
deleted file mode 100644
index dcda1fc..0000000
--- a/experiments/Editor/src/Figures.js
+++ /dev/null
@@ -1,125 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License. You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied. See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-var Figures_insertFigure;
-var Figures_getSelectedFigureId;
-var Figures_getProperties;
-var Figures_setProperties;
-var Figures_getGeometry;
-
-(function() {
-
- // public
- Figures_insertFigure = function(filename,width,numbered,caption)
- {
- UndoManager_newGroup("Insert figure");
-
- var figure = DOM_createElement(document,"FIGURE");
- var img = DOM_createElement(document,"IMG");
- DOM_setAttribute(img,"src",encodeURI(filename));
- DOM_setStyleProperties(img,{"width": width});
- DOM_appendChild(figure,img);
-
- if ((caption != null) && (caption != "")) {
- var figcaption = DOM_createElement(document,"FIGCAPTION");
- DOM_appendChild(figcaption,DOM_createTextNode(document,caption));
- DOM_appendChild(figure,figcaption);
- }
-
- Clipboard_pasteNodes([figure]);
-
- // Now that the figure has been inserted into the DOM tree, the outline code will
- // have noticed it and added an id attribute, as well as a caption giving the
- // table number.
- Outline_setNumbered(figure.getAttribute("id"),numbered);
-
- // Place the cursor directly after the figure
- var offset = DOM_nodeOffset(figure);
- var pos = new Position(figure.parentNode,offset);
- pos = Position_closestMatchForwards(pos,Position_okForMovement);
- Selection_set(pos.node,pos.offset,pos.node,pos.offset);
-
- PostponedActions_add(UndoManager_newGroup);
- }
-
- Figures_getSelectedFigureId = function()
- {
- var element = Cursor_getAdjacentNodeWithType(HTML_FIGURE);
- return element ? element.getAttribute("id") : null;
- }
-
- // public
- Figures_getProperties = function(itemId)
- {
- var figure = document.getElementById(itemId);
- if (figure == null)
- return null;
- var rect = figure.getBoundingClientRect();
- var result = { width: null, src: null };
-
- var img = firstDescendantOfType(figure,HTML_IMG);
- if (img != null) {
- result.src = decodeURI(img.getAttribute("src"));
- result.width = img.style.width;
-
- if ((result.width == null) || (result.width == ""))
- result.width = DOM_getAttribute(img,"width");
- }
- return result;
- }
-
- // public
- Figures_setProperties = function(itemId,width,src)
- {
- var figure = document.getElementById(itemId);
- if (figure == null)
- return null;
- var img = firstDescendantOfType(figure,HTML_IMG);
- if (img != null) {
- if (src == null)
- DOM_removeAttribute(img,"src");
- else
- DOM_setAttribute(img,"src",encodeURI(src));
-
- DOM_setStyleProperties(img,{"width": width});
- if (img.getAttribute("style") == "")
- DOM_removeAttribute(img,"style");
- Selection_update();
- }
- }
-
- // public
- Figures_getGeometry = function(itemId)
- {
- var figure = document.getElementById(itemId);
- if ((figure == null) || (figure.parentNode == null))
- return null;
- var img = firstDescendantOfType(figure,HTML_IMG);
- if (img == null)
- return null;
-
- var figcaption = firstChildOfType(figure,HTML_FIGCAPTION);
-
- var result = new Object();
- result.contentRect = xywhAbsElementRect(img);
- result.fullRect = xywhAbsElementRect(figure);
- result.parentRect = xywhAbsElementRect(figure.parentNode);
- result.hasCaption = (figcaption != null);
- return result;
- }
-
-})();
http://git-wip-us.apache.org/repos/asf/incubator-corinthia/blob/26f461e7/experiments/Editor/src/Formatting.js
----------------------------------------------------------------------
diff --git a/experiments/Editor/src/Formatting.js b/experiments/Editor/src/Formatting.js
deleted file mode 100644
index 51bc5d3..0000000
--- a/experiments/Editor/src/Formatting.js
+++ /dev/null
@@ -1,1281 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License. You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied. See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-var Formatting_splitTextBefore;
-var Formatting_splitTextAfter;
-var Formatting_movePreceding;
-var Formatting_moveFollowing;
-var Formatting_splitAroundSelection;
-var Formatting_mergeUpwards;
-var Formatting_mergeWithNeighbours;
-var Formatting_paragraphTextUpToPosition;
-var Formatting_getAllNodeProperties;
-var Formatting_getFormatting;
-var Formatting_pushDownInlineProperties;
-var Formatting_applyFormattingChanges;
-var Formatting_formatInlineNode;
-
-var Formatting_MERGEABLE_INLINE;
-var Formatting_MERGEABLE_BLOCK;
-var Formatting_MERGEABLE_BLOCK_AND_INLINE;
-
-(function() {
-
- // Some properties in CSS, such as 'margin', 'border', and 'padding', are shorthands which
- // set multiple, more fine-grained properties. The CSS spec outlines what these are - e.g.
- // an assignment to the 'margin' property is considered a simultaneous assignment to
- // 'margin-left', 'margin-right', 'margin-top', and 'margin-bottom' properties.
-
- // However, Firefox contains a bug (https://bugzilla.mozilla.org/show_bug.cgi?id=241234),
- // which has gone unfixed for more than six years, whereby it actually sets different
- // properties for *-left and *-right, which are reflected when examining the style property
- // of an element. Additionally, it also gives an error if you try to set these, so if you simply
- // get all the style properties and try to set them again it won't work.
-
- // To get around this problem, we record the following set of replacements. When getting the
- // style properties of an element, we replace any properties with the names given below with
- // their corresponding spec name. A null entry means that property should be ignored altogether.
-
- // You should always use getStyleProperties() instead of accessing element.style directly.
-
- var CSS_PROPERTY_REPLACEMENTS = {
- "margin-left-value": "margin-left",
- "margin-left-ltr-source": null,
- "margin-left-rtl-source": null,
- "margin-right-value": "margin-right",
- "margin-right-ltr-source": null,
- "margin-right-rtl-source": null,
- "padding-left-value": "padding-left",
- "padding-left-ltr-source": null,
- "padding-left-rtl-source": null,
- "padding-right-value": "padding-right",
- "padding-right-ltr-source": null,
- "padding-right-rtl-source": null,
- "border-right-width-value": "border-right-width",
- "border-right-width-ltr-source": null,
- "border-right-width-rtl-source": null,
- "border-left-width-value": "border-left-width",
- "border-left-width-ltr-source": null,
- "border-left-width-rtl-source": null,
- "border-right-color-value": "border-right-color",
- "border-right-color-ltr-source": null,
- "border-right-color-rtl-source": null,
- "border-left-color-value": "border-left-color",
- "border-left-color-ltr-source": null,
- "border-left-color-rtl-source": null,
- "border-right-style-value": "border-right-style",
- "border-right-style-ltr-source": null,
- "border-right-style-rtl-source": null,
- "border-left-style-value": "border-left-style",
- "border-left-style-ltr-source": null,
- "border-left-style-rtl-source": null,
- };
-
- // private
- function getStyleProperties(element,dontReplace)
- {
- var properties = new Object();
-
- for (var i = 0; i < element.style.length; i++) {
- var name = element.style[i];
- var value = element.style.getPropertyValue(name);
-
- var replacement;
- if (dontReplace) {
- replacement = name;
- }
- else {
- replacement = CSS_PROPERTY_REPLACEMENTS[name];
- if (typeof(replacement) == "undefined")
- replacement = name;
- }
-
- if (replacement != null)
- properties[replacement] = value;
- }
- return properties;
- }
-
- // public (for testing purposes only)
- Formatting_splitAroundSelection = function(range,allowDirectInline)
- {
- Range_trackWhileExecuting(range,function() {
- if (!allowDirectInline)
- Range_ensureInlineNodesInParagraph(range);
- Range_ensureValidHierarchy(range);
-
- if ((range.start.node.nodeType == Node.TEXT_NODE) &&
- (range.start.offset > 0)) {
- Formatting_splitTextBefore(range.start);
- if (range.end.node == range.start.node)
- range.end.offset -= range.start.offset;
- range.start.offset = 0;
- }
- else if (range.start.node.nodeType == Node.ELEMENT_NODE) {
- Formatting_movePreceding(range.start,isBlockOrNoteNode);
- }
- else {
- Formatting_movePreceding(new Position(range.start.node.parentNode,
- DOM_nodeOffset(range.start.node)),
- isBlockOrNoteNode);
- }
-
- // Save the start and end position of the range. The mutation listeners will move it
- // when the following node is moved, which we don't actually want in this case.
- var startNode = range.start.node;
- var startOffset = range.start.offset;
- var endNode = range.end.node;
- var endOffset = range.end.offset;
-
- if ((range.end.node.nodeType == Node.TEXT_NODE) &&
- (range.end.offset < range.end.node.nodeValue.length)) {
- Formatting_splitTextAfter(range.end);
- }
- else if (range.end.node.nodeType == Node.ELEMENT_NODE) {
- Formatting_moveFollowing(range.end,isBlockOrNoteNode);
- }
- else {
- Formatting_moveFollowing(new Position(range.end.node.parentNode,
- DOM_nodeOffset(range.end.node)+1),
- isBlockOrNoteNode);
- }
-
- range.start.node = startNode;
- range.start.offset = startOffset;
- range.end.node = endNode;
- range.end.offset = endOffset;
- });
- }
-
- // public
- Formatting_mergeUpwards = function(node,whiteList)
- {
- while ((node != null) && whiteList[node._type]) {
- var parent = node.parentNode;
- Formatting_mergeWithNeighbours(node,whiteList,true);
- node = parent;
- }
- }
-
- function isDiscardable(node)
- {
- if (node.nodeType != Node.ELEMENT_NODE)
- return false;
-
- if (!isInlineNode(node))
- return false;
-
- if (isOpaqueNode(node))
- return false;
-
- for (var child = node.firstChild; child != null; child = child.nextSibling) {
- if (!isDiscardable(child))
- return false;
- }
-
- return true;
- }
-
- // public (for use by tests)
- Formatting_mergeWithNeighbours = function(node,whiteList,trim)
- {
- var parent = node.parentNode;
- if (parent == null)
- return;
-
- var start = node;
- var end = node;
-
- while ((start.previousSibling != null) &&
- DOM_nodesMergeable(start.previousSibling,start,whiteList))
- start = start.previousSibling;
-
- while ((end.nextSibling != null) &&
- DOM_nodesMergeable(end,end.nextSibling,whiteList))
- end = end.nextSibling;
-
- if (trim) {
- while ((start.previousSibling != null) && isDiscardable(start.previousSibling))
- DOM_deleteNode(start.previousSibling);
- while ((end.nextSibling != null) && isDiscardable(end.nextSibling))
- DOM_deleteNode(end.nextSibling);
- }
-
- if (start != end) {
- var lastMerge;
- do {
- lastMerge = (start.nextSibling == end);
-
- var lastChild = null;
- if (start.nodeType == Node.ELEMENT_NODE)
- lastChild = start.lastChild;
-
- DOM_mergeWithNextSibling(start,whiteList);
-
- if (lastChild != null)
- Formatting_mergeWithNeighbours(lastChild,whiteList);
- } while (!lastMerge);
- }
- }
-
- // private
- function mergeRange(range,whiteList)
- {
- var nodes = Range_getAllNodes(range);
- for (var i = 0; i < nodes.length; i++) {
- var next;
- for (var p = nodes[i]; p != null; p = next) {
- next = p.parentNode;
- Formatting_mergeWithNeighbours(p,whiteList);
- }
- }
- }
-
- // public (called from cursor.js)
- Formatting_splitTextBefore = function(pos,parentCheckFn,force)
- {
- var node = pos.node;
- var offset = pos.offset;
- if (parentCheckFn == null)
- parentCheckFn = isBlockNode;
-
- if (force || (offset > 0)) {
- var before = DOM_createTextNode(document,"");
- DOM_insertBefore(node.parentNode,before,node);
- DOM_moveCharacters(node,0,offset,before,0,false,true);
- Formatting_movePreceding(new Position(node.parentNode,DOM_nodeOffset(node)),
- parentCheckFn,force);
- return new Position(before,before.nodeValue.length);
- }
- else {
- Formatting_movePreceding(new Position(node.parentNode,DOM_nodeOffset(node)),
- parentCheckFn,force);
- return pos;
- }
- }
-
- // public
- Formatting_splitTextAfter = function(pos,parentCheckFn,force)
- {
- var node = pos.node;
- var offset = pos.offset;
- if (parentCheckFn == null)
- parentCheckFn = isBlockNode;
-
- if (force || (offset < pos.node.nodeValue.length)) {
- var after = DOM_createTextNode(document,"");
- DOM_insertBefore(node.parentNode,after,node.nextSibling);
- DOM_moveCharacters(node,offset,node.nodeValue.length,after,0,true,false);
- Formatting_moveFollowing(new Position(node.parentNode,DOM_nodeOffset(node)+1),
- parentCheckFn,force);
- return new Position(after,0);
- }
- else {
- Formatting_moveFollowing(new Position(node.parentNode,DOM_nodeOffset(node)+1),
- parentCheckFn,force);
- return pos;
- }
- }
-
- // FIXME: movePreceding and moveNext could possibly be optimised by passing in a (parent,child)
- // pair instead of (node,offset), i.e. parent is the same as node, but rather than passing the
- // index of a child, we pass the child itself (or null if the offset is equal to
- // childNodes.length)
- // public
- Formatting_movePreceding = function(pos,parentCheckFn,force)
- {
- var node = pos.node;
- var offset = pos.offset;
- if (parentCheckFn(node) || (node == document.body))
- return new Position(node,offset);
-
- var toMove = new Array();
- var justWhitespace = true;
- var result = new Position(node,offset);
- for (var i = 0; i < offset; i++) {
- if (!isWhitespaceTextNode(node.childNodes[i]))
- justWhitespace = false;
- toMove.push(node.childNodes[i]);
- }
-
- if ((toMove.length > 0) || force) {
- if (justWhitespace && !force) {
- for (var i = 0; i < toMove.length; i++)
- DOM_insertBefore(node.parentNode,toMove[i],node);
- }
- else {
- var copy = DOM_shallowCopyElement(node);
- DOM_insertBefore(node.parentNode,copy,node);
-
- for (var i = 0; i < toMove.length; i++)
- DOM_insertBefore(copy,toMove[i],null);
- result = new Position(copy,copy.childNodes.length);
- }
- }
-
- Formatting_movePreceding(new Position(node.parentNode,DOM_nodeOffset(node)),
- parentCheckFn,force);
- return result;
- }
-
- // public
- Formatting_moveFollowing = function(pos,parentCheckFn,force)
- {
- var node = pos.node;
- var offset = pos.offset;
- if (parentCheckFn(node) || (node == document.body))
- return new Position(node,offset);
-
- var toMove = new Array();
- var justWhitespace = true;
- var result = new Position(node,offset);
- for (var i = offset; i < node.childNodes.length; i++) {
- if (!isWhitespaceTextNode(node.childNodes[i]))
- justWhitespace = false;
- toMove.push(node.childNodes[i]);
- }
-
- if ((toMove.length > 0) || force) {
- if (justWhitespace && !force) {
- for (var i = 0; i < toMove.length; i++)
- DOM_insertBefore(node.parentNode,toMove[i],node.nextSibling);
- }
- else {
- var copy = DOM_shallowCopyElement(node);
- DOM_insertBefore(node.parentNode,copy,node.nextSibling);
-
- for (var i = 0; i < toMove.length; i++)
- DOM_insertBefore(copy,toMove[i],null);
- result = new Position(copy,0);
- }
- }
-
- Formatting_moveFollowing(new Position(node.parentNode,DOM_nodeOffset(node)+1),
- parentCheckFn,force);
- return result;
- }
-
- // public
- Formatting_paragraphTextUpToPosition = function(pos)
- {
- if (pos.node.nodeType == Node.TEXT_NODE) {
- return stringToStartOfParagraph(pos.node,pos.offset);
- }
- else {
- return stringToStartOfParagraph(Position_closestActualNode(pos),0);
- }
-
- function stringToStartOfParagraph(node,offset)
- {
- var start = node;
- var components = new Array();
- while (isInlineNode(node)) {
- if (node.nodeType == Node.TEXT_NODE) {
- if (node == start)
- components.push(node.nodeValue.slice(0,offset));
- else
- components.push(node.nodeValue);
- }
-
- if (node.previousSibling != null) {
- node = node.previousSibling;
- while (isInlineNode(node) && (node.lastChild != null))
- node = node.lastChild;
- }
- else {
- node = node.parentNode;
- }
- }
- return components.reverse().join("");
- }
- }
-
- // public
- Formatting_getFormatting = function()
- {
- // FIXME: implement a more efficient version of this algorithm which avoids duplicate checks
-
- var range = Selection_get();
- if (range == null)
- return {};
-
- Range_assertValid(range,"Selection");
-
- var outermost = Range_getOutermostNodes(range,true);
-
- var leafNodes = new Array();
- for (var i = 0; i < outermost.length; i++) {
- findLeafNodes(outermost[i],leafNodes);
- }
- var empty = Range_isEmpty(range);
-
- var commonProperties = null;
- for (var i = 0; i < leafNodes.length; i++) {
- if (!isWhitespaceTextNode(leafNodes[i]) || empty) {
- var leafNodeProperties = Formatting_getAllNodeProperties(leafNodes[i]);
- if (leafNodeProperties["-uxwrite-paragraph-style"] == null)
- leafNodeProperties["-uxwrite-paragraph-style"] = Keys.NONE_STYLE;
- if (commonProperties == null)
- commonProperties = leafNodeProperties;
- else
- commonProperties = intersection(commonProperties,leafNodeProperties);
- }
- }
-
- if (commonProperties == null)
- commonProperties = {"-uxwrite-paragraph-style": Keys.NONE_STYLE};
-
- for (var i = 0; i < leafNodes.length; i++) {
- var leaf = leafNodes[i];
- if (leaf._type == HTML_LI) {
- switch (leaf.parentNode._type) {
- case HTML_UL:
- commonProperties["-uxwrite-in-ul"] = "true";
- break;
- case HTML_OL:
- commonProperties["-uxwrite-in-ol"] = "true";
- break;
- }
- }
- else {
- for (var ancestor = leaf;
- ancestor.parentNode != null;
- ancestor = ancestor.parentNode) {
-
- if (ancestor.parentNode._type == HTML_LI) {
- var havePrev = false;
- for (var c = ancestor.previousSibling; c != null; c = c.previousSibling) {
- if (!isWhitespaceTextNode(c)) {
- havePrev = true;
- break;
- }
- }
- if (!havePrev) {
- var listNode = ancestor.parentNode.parentNode;
- switch (listNode._type) {
- case HTML_UL:
- commonProperties["-uxwrite-in-ul"] = "true";
- break;
- case HTML_OL:
- commonProperties["-uxwrite-in-ol"] = "true";
- break;
- }
- }
- }
- }
- }
- }
-
- getFlags(range.start,commonProperties);
-
- return commonProperties;
-
- function getFlags(pos,commonProperties)
- {
- var strBeforeCursor = Formatting_paragraphTextUpToPosition(pos);
-
- if (isWhitespaceString(strBeforeCursor)) {
- var firstInParagraph = true;
- for (var p = pos.node; isInlineNode(p); p = p.parentNode) {
- if (p.previousSibling != null)
- firstInParagraph = false;
- }
- if (firstInParagraph)
- commonProperties["-uxwrite-shift"] = "true";
- }
- if (strBeforeCursor.match(/\.\s*$/))
- commonProperties["-uxwrite-shift"] = "true";
- if (strBeforeCursor.match(/\([^\)]*$/))
- commonProperties["-uxwrite-in-brackets"] = "true";
- if (strBeforeCursor.match(/\u201c[^\u201d]*$/))
- commonProperties["-uxwrite-in-quotes"] = "true";
- }
-
- function intersection(a,b)
- {
- var result = new Object();
- for (var name in a) {
- if (a[name] == b[name])
- result[name] = a[name];
- }
- return result;
- }
-
- function findLeafNodes(node,result)
- {
- if (node.firstChild == null) {
- result.push(node);
- }
- else {
- for (var child = node.firstChild; child != null; child = child.nextSibling)
- findLeafNodes(child,result);
- }
- }
- }
-
- // public
- Formatting_getAllNodeProperties = function(node)
- {
- if (node == null)
- throw new Error("Node is not in tree");
-
- if (node == node.ownerDocument.body)
- return new Object();
-
- var properties = Formatting_getAllNodeProperties(node.parentNode);
-
- if (node.nodeType == Node.ELEMENT_NODE) {
- // Note: Style names corresponding to element names must be in lowercase, because
- // canonicaliseSelector() in Styles.js always converts selectors to lowercase.
- if (node.hasAttribute("STYLE")) {
- var nodeProperties = getStyleProperties(node);
- for (var name in nodeProperties)
- properties[name] = nodeProperties[name];
- }
-
- var type = node._type;
- switch (type) {
- case HTML_B:
- properties["font-weight"] = "bold";
- break;
- case HTML_I:
- properties["font-style"] = "italic";
- break;
- case HTML_U: {
- var components = [];
- if (properties["text-decoration"] != null) {
- var components = properties["text-decoration"].toLowerCase().split(/\s+/);
- if (components.indexOf("underline") == -1)
- properties["text-decoration"] += " underline";
- }
- else {
- properties["text-decoration"] = "underline";
- }
- break;
- }
-// case HTML_TT:
-// properties["-uxwrite-in-tt"] = "true";
-// break;
- case HTML_IMG:
- properties["-uxwrite-in-image"] = "true";
- break;
- case HTML_FIGURE:
- properties["-uxwrite-in-figure"] = "true";
- break;
- case HTML_TABLE:
- properties["-uxwrite-in-table"] = "true";
- break;
- case HTML_A:
- if (node.hasAttribute("href")) {
- var href = node.getAttribute("href");
- if (href.charAt(0) == "#")
- properties["-uxwrite-in-reference"] = "true";
- else
- properties["-uxwrite-in-link"] = "true";
- }
- break;
- case HTML_NAV: {
- var className = DOM_getAttribute(node,"class");
- if ((className == Keys.SECTION_TOC) ||
- (className == Keys.FIGURE_TOC) ||
- (className == Keys.TABLE_TOC))
- properties["-uxwrite-in-toc"] = "true";
- break;
- }
- default:
- if (PARAGRAPH_ELEMENTS[type]) {
- var name = node.nodeName.toLowerCase();
- var selector;
- if (node.hasAttribute("class"))
- selector = name + "." + node.getAttribute("class");
- else
- selector = name;
- properties["-uxwrite-paragraph-style"] = selector;
- }
- break;
- }
-
- if (OUTLINE_TITLE_ELEMENTS[type] && node.hasAttribute("id"))
- properties["-uxwrite-in-item-title"] = node.getAttribute("id");
- }
-
- return properties;
- }
-
- var PARAGRAPH_PROPERTIES = {
- "margin-left": true,
- "margin-right": true,
- "margin-top": true,
- "margin-bottom": true,
-
- "padding-left": true,
- "padding-right": true,
- "padding-top": true,
- "padding-bottom": true,
-
- "border-left-width": true,
- "border-right-width": true,
- "border-top-width": true,
- "border-bottom-width": true,
-
- "border-left-style": true,
- "border-right-style": true,
- "border-top-style": true,
- "border-bottom-style": true,
-
- "border-left-color": true,
- "border-right-color": true,
- "border-top-color": true,
- "border-bottom-color": true,
-
- "border-top-left-radius": true,
- "border-top-right-radius": true,
- "border-bottom-left-radius": true,
- "border-bottom-right-radius": true,
-
- "text-align": true,
- "text-indent": true,
- "line-height": true,
- "display": true,
-
- "width": true,
- "height": true,
- };
-
- var SPECIAL_PROPERTIES = {
- "-webkit-text-size-adjust": true, // set on HTML element for text scaling purposes
- };
-
- function isParagraphProperty(name)
- {
- return PARAGRAPH_PROPERTIES[name];
- }
-
- function isInlineProperty(name)
- {
- return !PARAGRAPH_PROPERTIES[name] && !SPECIAL_PROPERTIES[name];
- }
-
- // private
- function putDirectInlineChildrenInParagraphs(parent)
- {
- var inlineChildren = new Array();
- for (var child = parent.firstChild; child != null; child = child.nextSibling)
- if (isInlineNode(child))
- inlineChildren.push(child);
- for (var i = 0; i < inlineChildren.length; i++) {
- if (inlineChildren[i].parentNode == parent) { // may already have been moved
- if (!isWhitespaceTextNode(inlineChildren[i]))
- Hierarchy_wrapInlineNodesInParagraph(inlineChildren[i]);
- }
- }
- }
-
- // private
- function getParagraphs(nodes)
- {
- var array = new Array();
- var set = new NodeSet();
- for (var i = 0; i < nodes.length; i++) {
- for (var anc = nodes[i].parentNode; anc != null; anc = anc.parentNode) {
- if (anc._type == HTML_LI)
- putDirectInlineChildrenInParagraphs(anc);
- }
- recurse(nodes[i]);
- }
-
- var remove = new NodeSet();
- for (var i = 0; i < array.length; i++) {
- for (var anc = array[i].parentNode; anc != null; anc = anc.parentNode)
- remove.add(anc);
- }
-
- var modified = new Array();
- for (var i = 0; i < array.length; i++) {
- if (!remove.contains(array[i]))
- modified.push(array[i]);
- }
-
- return modified;
-
- function recurse(node)
- {
- if (node._type == HTML_LI)
- putDirectInlineChildrenInParagraphs(node);
- if (node.firstChild == null) {
- // Leaf node
- for (var anc = node; anc != null; anc = anc.parentNode)
- if (isParagraphNode(anc)) {
- add(anc);
- }
- }
- else {
- for (var child = node.firstChild; child != null; child = child.nextSibling)
- recurse(child);
- }
- }
-
- function add(node)
- {
- if (!set.contains(node)) {
- array.push(node);
- set.add(node);
- }
- }
- }
-
- // private
- function setParagraphStyle(paragraph,selector)
- {
- var wasHeading = isHeadingNode(paragraph);
- DOM_removeAttribute(paragraph,"class");
- if (selector == "") {
- if (paragraph._type != HTML_P)
- paragraph = DOM_replaceElement(paragraph,"P");
- }
- else {
- var elementClassRegex = /^([a-zA-Z0-9]+)?(\.(.+))?$/;
- var result = elementClassRegex.exec(selector);
- if ((result != null) && (result.length == 4)) {
- var elementName = result[1];
- var className = result[3];
-
- if (elementName == null)
- elementName = "P";
- else
- elementName = elementName.toUpperCase();
-
- var elementType = ElementTypes[elementName];
-
- if (!PARAGRAPH_ELEMENTS[elementType])
- return; // better than throwing an exception
-
- if (paragraph._type != elementType)
- paragraph = DOM_replaceElement(paragraph,elementName);
-
- if (className != null)
- DOM_setAttribute(paragraph,"class",className);
- else
- DOM_removeAttribute(paragraph,"class");
- }
- }
-
- // FIXME: this will need to change when we add Word/ODF support, because the ids serve
- // a purpose other than simply being targets for references
- var isHeading = isHeadingNode(paragraph);
- if (wasHeading && !isHeading)
- DOM_removeAttribute(paragraph,"id");
- }
-
- // public
- Formatting_pushDownInlineProperties = function(outermost)
- {
- for (var i = 0; i < outermost.length; i++)
- outermost[i] = pushDownInlinePropertiesSingle(outermost[i]);
- }
-
- // private
- function pushDownInlinePropertiesSingle(target)
- {
- recurse(target.parentNode);
- return target;
-
- function recurse(node)
- {
- if (node.nodeType == Node.DOCUMENT_NODE)
- return;
-
- if (node.parentNode != null)
- recurse(node.parentNode);
-
- var inlineProperties = new Object();
- var nodeProperties = getStyleProperties(node);
- for (var name in nodeProperties) {
- if (isInlineProperty(name)) {
- inlineProperties[name] = nodeProperties[name];
- }
- }
-
- var remove = new Object();
- for (var name in inlineProperties)
- remove[name] = null;
- DOM_setStyleProperties(node,remove);
-
- var type = node._type;
- switch (type) {
- case HTML_B:
- inlineProperties["font-weight"] = "bold";
- break;
- case HTML_I:
- inlineProperties["font-style"] = "italic";
- break;
- case HTML_U:
- if (inlineProperties["text-decoration"] != null)
- inlineProperties["text-decoration"] += " underline";
- else
- inlineProperties["text-decoration"] = "underline";
- break;
- }
-
- var special = extractSpecial(inlineProperties);
- var count = Object.getOwnPropertyNames(inlineProperties).length;
-
- if ((count > 0) || special.bold || special.italic || special.underline) {
-
- var next;
- for (var child = node.firstChild; child != null; child = next) {
- next = child.nextSibling;
-
- if (isWhitespaceTextNode(child))
- continue;
-
- var replacement = applyInlineFormatting(child,inlineProperties,special);
- if (target == child)
- target = replacement;
- }
- }
-
- if (node.hasAttribute("style") && (node.style.length == 0))
- DOM_removeAttribute(node,"style");
-
- switch (type) {
- case HTML_B:
- case HTML_I:
- case HTML_U:
- DOM_removeNodeButKeepChildren(node);
- break;
- }
- }
- }
-
- // private
- function wrapInline(node,elementName)
- {
- if (!isInlineNode(node) || isAbstractSpan(node)) {
- var next;
- for (var child = node.firstChild; child != null; child = next) {
- next = child.nextSibling;
- wrapInline(child,elementName);
- }
- return node;
- }
- else {
- return DOM_wrapNode(node,elementName);
- }
- }
-
- // private
- function applyInlineFormatting(target,inlineProperties,special,applyToWhitespace)
- {
- if (!applyToWhitespace && isWhitespaceTextNode(target))
- return;
-
- if (special.underline)
- target = wrapInline(target,"U");
- if (special.italic)
- target = wrapInline(target,"I");
- if (special.bold)
- target = wrapInline(target,"B");
-
- var isbiu = false;
- switch (target._type) {
- case HTML_B:
- case HTML_I:
- case HTML_U:
- isbiu = true;
- break;
- }
-
- if ((Object.getOwnPropertyNames(inlineProperties).length > 0) &&
- ((target.nodeType != Node.ELEMENT_NODE) ||
- isbiu || isSpecialSpan(target))) {
- target = wrapInline(target,"SPAN");
- }
-
-
- var propertiesToSet = new Object();
- for (var name in inlineProperties) {
- var existing = target.style.getPropertyValue(name);
- if ((existing == null) || (existing == ""))
- propertiesToSet[name] = inlineProperties[name];
- }
- DOM_setStyleProperties(target,propertiesToSet);
-
- return target;
- }
-
- // private
- function extractSpecial(properties)
- {
- var special = { bold: null, italic: null, underline: null };
- var fontWeight = properties["font-weight"];
- var fontStyle = properties["font-style"];
- var textDecoration = properties["text-decoration"];
-
- if (typeof(fontWeight) != "undefined") {
- special.bold = false;
- if ((fontWeight != null) &&
- (fontWeight.toLowerCase() == "bold")) {
- special.bold = true;
- delete properties["font-weight"];
- }
- }
-
- if (typeof(fontStyle) != "undefined") {
- special.italic = false;
- if ((fontStyle != null) &&
- (fontStyle.toLowerCase() == "italic")) {
- special.italic = true;
- delete properties["font-style"];
- }
- }
-
- if (typeof(textDecoration) != "undefined") {
- special.underline = false;
- if (textDecoration != null) {
- var values = textDecoration.toLowerCase().split(/\s+/);
- var index;
- while ((index = values.indexOf("underline")) >= 0) {
- values.splice(index,1);
- special.underline = true;
- }
- if (values.length == 0)
- delete properties["text-decoration"];
- else
- properties["text-decoration"] = values.join(" ");
- }
- }
- return special;
- }
-
- // private
- function removeProperties(outermost,properties)
- {
- properties = clone(properties);
- var special = extractSpecial(properties);
- var remaining = new Array();
- for (var i = 0; i < outermost.length; i++) {
- removePropertiesSingle(outermost[i],properties,special,remaining);
- }
- return remaining;
- }
-
- // private
- function getOutermostParagraphs(paragraphs)
- {
- var all = new NodeSet();
- for (var i = 0; i < paragraphs.length; i++)
- all.add(paragraphs[i]);
-
- var result = new Array();
- for (var i = 0; i < paragraphs.length; i++) {
- var haveAncestor = false;
- for (var p = paragraphs[i].parentNode; p != null; p = p.parentNode) {
- if (all.contains(p)) {
- haveAncestor = true;
- break;
- }
- }
- if (!haveAncestor)
- result.push(paragraphs[i]);
- }
- return result;
- }
-
- // private
- function removePropertiesSingle(node,properties,special,remaining)
- {
- if ((node.nodeType == Node.ELEMENT_NODE) && (node.hasAttribute("style"))) {
- var remove = new Object();
- for (var name in properties)
- remove[name] = null;
- DOM_setStyleProperties(node,remove);
- }
-
- var willRemove = false;
- switch (node._type) {
- case HTML_B:
- willRemove = (special.bold != null);
- break;
- case HTML_I:
- willRemove = (special.italic != null);
- break;
- case HTML_U:
- willRemove = (special.underline != null);
- break;
- case HTML_SPAN:
- willRemove = (!node.hasAttribute("style") && !isSpecialSpan(node));
- break;
- }
-
- var childRemaining = willRemove ? remaining : null;
-
- var next;
- for (var child = node.firstChild; child != null; child = next) {
- next = child.nextSibling;
- removePropertiesSingle(child,properties,special,childRemaining);
- }
-
- if (willRemove)
- DOM_removeNodeButKeepChildren(node);
- else if (remaining != null)
- remaining.push(node);
- }
-
- function isSpecialSpan(span)
- {
- if (span._type == HTML_SPAN) {
- if (span.hasAttribute(Keys.ABSTRACT_ELEMENT))
- return true;
- var className = DOM_getStringAttribute(span,"class");
- if (className.indexOf(Keys.UXWRITE_PREFIX) == 0)
- return true;
- if ((className == "footnote") || (className == "endnote"))
- return true;
- }
- return false;
- }
-
- // private
- function containsOnlyWhitespace(ancestor)
- {
- for (child = ancestor.firstChild; child != null; child = child.nextSibling) {
- if (!isWhitespaceTextNode(child))
- return false;
- }
- return true;
- }
-
- // public
- Formatting_applyFormattingChanges = function(style,properties)
- {
- debug("JS: applyFormattingChanges: style = "+JSON.stringify(style));
- if (properties != null) {
- var names = Object.getOwnPropertyNames(properties).sort();
- for (var i = 0; i < names.length; i++) {
- debug(" "+names[i]+" = "+properties[names[i]]);
- }
- }
- UndoManager_newGroup("Apply formatting changes");
-
- if (properties == null)
- properties = new Object();
-
- if (style == Keys.NONE_STYLE)
- style = null;
-
- var paragraphProperties = new Object();
- var inlineProperties = new Object();
-
- for (var name in properties) {
- if (isParagraphProperty(name))
- paragraphProperties[name] = properties[name];
- else if (isInlineProperty(name))
- inlineProperties[name] = properties[name];
- }
-
- var selectionRange = Selection_get();
- if (selectionRange == null)
- return;
-
- // If we're applying formatting properties to an empty selection, and the node of the
- // selection start & end is an element, add an empty text node so that we have something
- // to apply the formatting to.
- if (Range_isEmpty(selectionRange) &&
- (selectionRange.start.node.nodeType == Node.ELEMENT_NODE)) {
- var node = selectionRange.start.node;
- var offset = selectionRange.start.offset;
- var text = DOM_createTextNode(document,"");
- DOM_insertBefore(node,text,node.childNodes[offset]);
- Selection_set(text,0,text,0);
- selectionRange = Selection_get();
- }
-
- // If the cursor is in a container (such as BODY OR FIGCAPTION), and not inside a paragraph,
- // put it in one so we can set a paragraph style
-
- if ((style != null) && Range_isEmpty(selectionRange)) {
- var node = Range_singleNode(selectionRange);
- while (isInlineNode(node))
- node = node.parentNode;
- if (isContainerNode(node) && containsOnlyInlineChildren(node)) {
- var p = DOM_createElement(document,"P");
- DOM_appendChild(node,p);
- while (node.firstChild != p)
- DOM_appendChild(p,node.firstChild);
- Cursor_updateBRAtEndOfParagraph(p);
- }
- }
-
-
- var range = new Range(selectionRange.start.node,selectionRange.start.offset,
- selectionRange.end.node,selectionRange.end.offset);
- var positions = [selectionRange.start,selectionRange.end,
- range.start,range.end];
-
- var allowDirectInline = (style == null);
- Position_trackWhileExecuting(positions,function() {
- Formatting_splitAroundSelection(range,allowDirectInline);
- Range_expand(range);
- if (!allowDirectInline)
- Range_ensureInlineNodesInParagraph(range);
- Range_ensureValidHierarchy(range);
- Range_expand(range);
- var outermost = Range_getOutermostNodes(range);
- var target = null;
-
- var paragraphs;
- if (outermost.length > 0)
- paragraphs = getParagraphs(outermost);
- else
- paragraphs = getParagraphs([Range_singleNode(range)]);
-
- // Push down inline properties
- Formatting_pushDownInlineProperties(outermost);
-
- outermost = removeProperties(outermost,inlineProperties);
-
- // Set properties on inline nodes
- for (var i = 0; i < outermost.length; i++) {
- var existing = Formatting_getAllNodeProperties(outermost[i]);
- var toSet = new Object();
- for (var name in inlineProperties) {
- if ((inlineProperties[name] != null) &&
- (existing[name] != inlineProperties[name])) {
- toSet[name] = inlineProperties[name];
- }
- }
-
- var special = extractSpecial(toSet);
- var applyToWhitespace = (outermost.length == 1);
- applyInlineFormatting(outermost[i],toSet,special,applyToWhitespace);
- }
-
- // Remove properties from paragraph nodes
- paragraphs = removeProperties(paragraphs,paragraphProperties,{});
-
- // Set properties on paragraph nodes
- var paragraphPropertiesToSet = new Object();
- for (var name in paragraphProperties) {
- if (paragraphProperties[name] != null)
- paragraphPropertiesToSet[name] = paragraphProperties[name];
- }
-
- var outermostParagraphs = getOutermostParagraphs(paragraphs);
- for (var i = 0; i < outermostParagraphs.length; i++)
- DOM_setStyleProperties(outermostParagraphs[i],paragraphPropertiesToSet);
-
- // Set style on paragraph nodes
- if (style != null) {
- for (var i = 0; i < paragraphs.length; i++) {
- setParagraphStyle(paragraphs[i],style);
- }
- }
-
- mergeRange(range,Formatting_MERGEABLE_INLINE);
-
- if (target != null) {
- for (var p = target; p != null; p = next) {
- next = p.parentNode;
- Formatting_mergeWithNeighbours(p,Formatting_MERGEABLE_INLINE);
- }
- }
- });
-
- // The current cursor position may no longer be valid, e.g. if a heading span was inserted
- // and the cursor is at a position that is now immediately before the span.
- var start = Position_closestMatchForwards(selectionRange.start,Position_okForInsertion);
- var end = Position_closestMatchBackwards(selectionRange.end,Position_okForInsertion);
- var tempRange = new Range(start.node,start.offset,end.node,end.offset);
- tempRange = Range_forwards(tempRange);
- Range_ensureValidHierarchy(tempRange);
- start = tempRange.start;
- end = tempRange.end;
- Selection_set(start.node,start.offset,end.node,end.offset);
-
- function containsOnlyInlineChildren(node)
- {
- for (var child = node.firstChild; child != null; child = child.nextSibling) {
- if (!isInlineNode(child))
- return false;
- }
- return true;
- }
- }
-
- Formatting_formatInlineNode = function(node,properties)
- {
- properties = clone(properties);
- var special = extractSpecial(properties);
- return applyInlineFormatting(node,properties,special,true);
- }
-
- Formatting_MERGEABLE_INLINE = new Array(HTML_COUNT);
-
- Formatting_MERGEABLE_INLINE[HTML_TEXT] = true;
-
- Formatting_MERGEABLE_INLINE[HTML_SPAN] = true;
- Formatting_MERGEABLE_INLINE[HTML_A] = true;
- Formatting_MERGEABLE_INLINE[HTML_Q] = true;
-
- // HTML 4.01 Section 9.2.1: Phrase elements
- Formatting_MERGEABLE_INLINE[HTML_EM] = true;
- Formatting_MERGEABLE_INLINE[HTML_STRONG] = true;
- Formatting_MERGEABLE_INLINE[HTML_DFN] = true;
- Formatting_MERGEABLE_INLINE[HTML_CODE] = true;
- Formatting_MERGEABLE_INLINE[HTML_SAMP] = true;
- Formatting_MERGEABLE_INLINE[HTML_KBD] = true;
- Formatting_MERGEABLE_INLINE[HTML_VAR] = true;
- Formatting_MERGEABLE_INLINE[HTML_CITE] = true;
- Formatting_MERGEABLE_INLINE[HTML_ABBR] = true;
-
- // HTML 4.01 Section 9.2.3: Subscripts and superscripts
- Formatting_MERGEABLE_INLINE[HTML_SUB] = true;
- Formatting_MERGEABLE_INLINE[HTML_SUP] = true;
-
- // HTML 4.01 Section 15.2.1: Font style elements
- Formatting_MERGEABLE_INLINE[HTML_I] = true;
- Formatting_MERGEABLE_INLINE[HTML_B] = true;
- Formatting_MERGEABLE_INLINE[HTML_SMALL] = true;
- Formatting_MERGEABLE_INLINE[HTML_S] = true;
- Formatting_MERGEABLE_INLINE[HTML_U] = true;
-
- Formatting_MERGEABLE_BLOCK = new Array(HTML_COUNT);
-
- Formatting_MERGEABLE_BLOCK[HTML_P] = true;
- Formatting_MERGEABLE_BLOCK[HTML_H1] = true;
- Formatting_MERGEABLE_BLOCK[HTML_H2] = true;
- Formatting_MERGEABLE_BLOCK[HTML_H3] = true;
- Formatting_MERGEABLE_BLOCK[HTML_H4] = true;
- Formatting_MERGEABLE_BLOCK[HTML_H5] = true;
- Formatting_MERGEABLE_BLOCK[HTML_H6] = true;
- Formatting_MERGEABLE_BLOCK[HTML_DIV] = true;
- Formatting_MERGEABLE_BLOCK[HTML_PRE] = true;
- Formatting_MERGEABLE_BLOCK[HTML_BLOCKQUOTE] = true;
-
- Formatting_MERGEABLE_BLOCK[HTML_UL] = true;
- Formatting_MERGEABLE_BLOCK[HTML_OL] = true;
- Formatting_MERGEABLE_BLOCK[HTML_LI] = true;
-
- Formatting_MERGEABLE_BLOCK_AND_INLINE = new Array(HTML_COUNT);
- for (var i = 0; i < HTML_COUNT; i++) {
- if (Formatting_MERGEABLE_INLINE[i] || Formatting_MERGEABLE_BLOCK[i])
- Formatting_MERGEABLE_BLOCK_AND_INLINE[i] = true;
- Formatting_MERGEABLE_BLOCK_AND_INLINE["force"] = true;
- }
-
-})();
http://git-wip-us.apache.org/repos/asf/incubator-corinthia/blob/26f461e7/experiments/Editor/src/Hierarchy.js
----------------------------------------------------------------------
diff --git a/experiments/Editor/src/Hierarchy.js b/experiments/Editor/src/Hierarchy.js
deleted file mode 100644
index 07c0526..0000000
--- a/experiments/Editor/src/Hierarchy.js
+++ /dev/null
@@ -1,284 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License. You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied. See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-var Hierarchy_ensureValidHierarchy;
-var Hierarchy_ensureInlineNodesInParagraph;
-var Hierarchy_wrapInlineNodesInParagraph;
-var Hierarchy_avoidInlineChildren;
-
-(function() {
-
- // private
- function wrapInlineChildren(first,last,ancestors)
- {
- var haveNonWhitespace = false;
- for (var node = first; node != last.nextSibling; node = node.nextSibling) {
- if (!isWhitespaceTextNode(node))
- haveNonWhitespace = true;
- }
- if (!haveNonWhitespace)
- return false;
-
- var parentNode = first.parentNode;
- var nextSibling = first;
- for (var i = ancestors.length-1; i >= 0; i--) {
- var ancestorCopy = DOM_shallowCopyElement(ancestors[i]);
- DOM_insertBefore(parentNode,ancestorCopy,nextSibling);
- parentNode = ancestorCopy;
- nextSibling = null;
-
- var node = first;
- while (true) {
- var next = node.nextSibling;
- DOM_insertBefore(parentNode,node,null);
- if (node == last)
- break;
- node = next;
- }
- }
- }
-
- // private
- function wrapInlineChildrenInAncestors(node,ancestors)
- {
- var firstInline = null;
- var lastInline = null;
-
- var child = node.firstChild;
- while (true) {
- var next = (child != null) ? child.nextSibling : null;
- if ((child == null) || !isInlineNode(child)) {
-
- if ((firstInline != null) && (lastInline != null)) {
- wrapInlineChildren(firstInline,lastInline,ancestors);
- }
- firstInline = null;
- lastInline = null;
- if (child != null)
- wrapInlineChildrenInAncestors(child,ancestors);
- }
- else {
- if (firstInline == null)
- firstInline = child;
- lastInline = child;
- }
- if (child == null)
- break;
- child = next;
- }
- }
-
- function checkInvalidNesting(node)
- {
- var parent = node.parentNode;
- if ((parent._type == HTML_DIV) &&
- (DOM_getAttribute(parent,"class") == Keys.SELECTION_CLASS)) {
- parent = parent.parentNode;
- }
-
- var invalidNesting = !isContainerNode(parent);
- switch (parent._type) {
- case HTML_DIV:
- if (isParagraphNode(node) || isListNode(node))
- invalidNesting = false; // this case is ok
- break;
- case HTML_CAPTION:
- case HTML_FIGCAPTION:
- case HTML_TABLE:
- case HTML_FIGURE:
- switch (node._type) {
- case HTML_FIGURE:
- case HTML_TABLE:
- case HTML_H1:
- case HTML_H2:
- case HTML_H3:
- case HTML_H4:
- case HTML_H5:
- case HTML_H6:
- return true;
- }
- break;
- }
-
- return invalidNesting;
- }
-
- function checkInvalidHeadingNesting(node)
- {
- switch (node._type) {
- case HTML_H1:
- case HTML_H2:
- case HTML_H3:
- case HTML_H4:
- case HTML_H5:
- case HTML_H6:
- switch (node.parentNode._type) {
- case HTML_BODY:
- case HTML_NAV:
- case HTML_DIV:
- return false;
- default:
- return true;
- }
- break;
- default:
- return false;
- }
- }
-
- function nodeHasSignificantChildren(node)
- {
- for (var child = node.firstChild; child != null; child = child.nextSibling) {
- if (!isWhitespaceTextNode(child))
- return true;
- }
- return false;
- }
-
- // Enforce the restriction that any path from the root to a given node must be of the form
- // container+ paragraph inline
- // or container+ paragraph
- // or container+
- // public
- Hierarchy_ensureValidHierarchy = function(node,recursive,allowDirectInline)
- {
- var count = 0;
- while ((node != null) && (node.parentNode != null) && (node != document.body)) {
- count++;
- if (count > 200)
- throw new Error("too many iterations");
-
- if (checkInvalidHeadingNesting(node)) {
- var offset = DOM_nodeOffset(node);
- var parent = node.parentNode;
- Formatting_moveFollowing(new Position(node.parentNode,offset+1),
- function() { return false; });
- DOM_insertBefore(node.parentNode.parentNode,
- node,
- node.parentNode.nextSibling);
-
- while ((parent != document.body) && !nodeHasSignificantChildren(parent)) {
- var grandParent = parent.parentNode;
- DOM_deleteNode(parent);
- parent = grandParent;
- }
-
- continue;
- }
- else if (isContainerNode(node) || isParagraphNode(node)) {
- var invalidNesting = checkInvalidNesting(node);
- if (invalidNesting) {
- var ancestors = new Array();
- var child = node;
- while (!isContainerNode(child.parentNode)) {
- if (isInlineNode(child.parentNode)) {
- var keep = false;
- if (child.parentNode._type == HTML_SPAN) {
- for (var i = 0; i < child.attributes.length; i++) {
- var attr = child.attributes[i];
- if (attr.nodeName.toUpperCase() != "ID")
- keep = true;
- }
- if (keep)
- ancestors.push(child.parentNode);
- }
- else {
- ancestors.push(child.parentNode);
- }
- }
- child = child.parentNode;
- }
-
- while (checkInvalidNesting(node)) {
- var offset = DOM_nodeOffset(node);
- var parent = node.parentNode;
- Formatting_moveFollowing(new Position(node.parentNode,offset+1),
- isContainerNode);
- DOM_insertBefore(node.parentNode.parentNode,
- node,
- node.parentNode.nextSibling);
- if (!nodeHasSignificantChildren(parent))
- DOM_deleteNode(parent);
-
- }
- wrapInlineChildrenInAncestors(node,ancestors);
- }
- }
-
- node = node.parentNode;
- }
- }
-
- Hierarchy_ensureInlineNodesInParagraph = function(node,weak)
- {
- var count = 0;
- while ((node != null) && (node.parentNode != null) && (node != document.body)) {
- count++;
- if (count > 200)
- throw new Error("too many iterations");
- if (isInlineNode(node) &&
- isContainerNode(node.parentNode) && (node.parentNode._type != HTML_LI) &&
- (!weak || !isTableCell(node.parentNode)) &&
- !isWhitespaceTextNode(node)) {
- Hierarchy_wrapInlineNodesInParagraph(node);
- return;
- }
- node = node.parentNode;
- }
- }
-
- // public
- Hierarchy_wrapInlineNodesInParagraph = function(node)
- {
- var start = node;
- var end = node;
-
- while ((start.previousSibling != null) && isInlineNode(start.previousSibling))
- start = start.previousSibling;
- while ((end.nextSibling != null) && isInlineNode(end.nextSibling))
- end = end.nextSibling;
-
- return DOM_wrapSiblings(start,end,"P");
- }
-
- Hierarchy_avoidInlineChildren = function(parent)
- {
- var child = parent.firstChild;
-
- while (child != null) {
- if (isInlineNode(child)) {
- var start = child;
- var end = child;
- var haveContent = nodeHasContent(end);
- while ((end.nextSibling != null) && isInlineNode(end.nextSibling)) {
- end = end.nextSibling;
- if (nodeHasContent(end))
- haveContent = true;
- }
- child = DOM_wrapSiblings(start,end,"P");
- var next = child.nextSibling;
- if (!nodeHasContent(child))
- DOM_deleteNode(child);
- child = next;
- }
- else {
- child = child.nextSibling;
- }
- }
- }
-
-})();