summaryrefslogtreecommitdiff
path: root/node_modules/morphdom/src/util.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/morphdom/src/util.js')
-rw-r--r--node_modules/morphdom/src/util.js113
1 files changed, 113 insertions, 0 deletions
diff --git a/node_modules/morphdom/src/util.js b/node_modules/morphdom/src/util.js
new file mode 100644
index 0000000..3ed233c
--- /dev/null
+++ b/node_modules/morphdom/src/util.js
@@ -0,0 +1,113 @@
+var range; // Create a range object for efficently rendering strings to elements.
+var NS_XHTML = 'http://www.w3.org/1999/xhtml';
+
+export var doc = typeof document === 'undefined' ? undefined : document;
+var HAS_TEMPLATE_SUPPORT = !!doc && 'content' in doc.createElement('template');
+var HAS_RANGE_SUPPORT = !!doc && doc.createRange && 'createContextualFragment' in doc.createRange();
+
+function createFragmentFromTemplate(str) {
+ var template = doc.createElement('template');
+ template.innerHTML = str;
+ return template.content.childNodes[0];
+}
+
+function createFragmentFromRange(str) {
+ if (!range) {
+ range = doc.createRange();
+ range.selectNode(doc.body);
+ }
+
+ var fragment = range.createContextualFragment(str);
+ return fragment.childNodes[0];
+}
+
+function createFragmentFromWrap(str) {
+ var fragment = doc.createElement('body');
+ fragment.innerHTML = str;
+ return fragment.childNodes[0];
+}
+
+/**
+ * This is about the same
+ * var html = new DOMParser().parseFromString(str, 'text/html');
+ * return html.body.firstChild;
+ *
+ * @method toElement
+ * @param {String} str
+ */
+export function toElement(str) {
+ str = str.trim();
+ if (HAS_TEMPLATE_SUPPORT) {
+ // avoid restrictions on content for things like `<tr><th>Hi</th></tr>` which
+ // createContextualFragment doesn't support
+ // <template> support not available in IE
+ return createFragmentFromTemplate(str);
+ } else if (HAS_RANGE_SUPPORT) {
+ return createFragmentFromRange(str);
+ }
+
+ return createFragmentFromWrap(str);
+}
+
+/**
+ * Returns true if two node's names are the same.
+ *
+ * NOTE: We don't bother checking `namespaceURI` because you will never find two HTML elements with the same
+ * nodeName and different namespace URIs.
+ *
+ * @param {Element} a
+ * @param {Element} b The target element
+ * @return {boolean}
+ */
+export function compareNodeNames(fromEl, toEl) {
+ var fromNodeName = fromEl.nodeName;
+ var toNodeName = toEl.nodeName;
+ var fromCodeStart, toCodeStart;
+
+ if (fromNodeName === toNodeName) {
+ return true;
+ }
+
+ fromCodeStart = fromNodeName.charCodeAt(0);
+ toCodeStart = toNodeName.charCodeAt(0);
+
+ // If the target element is a virtual DOM node or SVG node then we may
+ // need to normalize the tag name before comparing. Normal HTML elements that are
+ // in the "http://www.w3.org/1999/xhtml"
+ // are converted to upper case
+ if (fromCodeStart <= 90 && toCodeStart >= 97) { // from is upper and to is lower
+ return fromNodeName === toNodeName.toUpperCase();
+ } else if (toCodeStart <= 90 && fromCodeStart >= 97) { // to is upper and from is lower
+ return toNodeName === fromNodeName.toUpperCase();
+ } else {
+ return false;
+ }
+}
+
+/**
+ * Create an element, optionally with a known namespace URI.
+ *
+ * @param {string} name the element name, e.g. 'div' or 'svg'
+ * @param {string} [namespaceURI] the element's namespace URI, i.e. the value of
+ * its `xmlns` attribute or its inferred namespace.
+ *
+ * @return {Element}
+ */
+export function createElementNS(name, namespaceURI) {
+ return !namespaceURI || namespaceURI === NS_XHTML ?
+ doc.createElement(name) :
+ doc.createElementNS(namespaceURI, name);
+}
+
+/**
+ * Copies the children of one DOM element to another DOM element
+ */
+export function moveChildren(fromEl, toEl) {
+ var curChild = fromEl.firstChild;
+ while (curChild) {
+ var nextChild = curChild.nextSibling;
+ toEl.appendChild(curChild);
+ curChild = nextChild;
+ }
+ return toEl;
+}