mirror of
https://github.com/the-djmaze/snappymail.git
synced 2026-09-04 15:07:02 +03:00
Clone 3.5.1 from github
This commit is contained in:
parent
5d281486d0
commit
091c4ec811
65 changed files with 6957 additions and 7 deletions
134
vendors/knockout/src/utils.domManipulation.js
vendored
Normal file
134
vendors/knockout/src/utils.domManipulation.js
vendored
Normal file
|
|
@ -0,0 +1,134 @@
|
|||
(function () {
|
||||
var none = [0, "", ""],
|
||||
table = [1, "<table>", "</table>"],
|
||||
tbody = [2, "<table><tbody>", "</tbody></table>"],
|
||||
tr = [3, "<table><tbody><tr>", "</tr></tbody></table>"],
|
||||
select = [1, "<select multiple='multiple'>", "</select>"],
|
||||
lookup = {
|
||||
'thead': table,
|
||||
'tbody': table,
|
||||
'tfoot': table,
|
||||
'tr': tbody,
|
||||
'td': tr,
|
||||
'th': tr,
|
||||
'option': select,
|
||||
'optgroup': select
|
||||
},
|
||||
|
||||
// This is needed for old IE if you're *not* using either jQuery or innerShiv. Doesn't affect other cases.
|
||||
mayRequireCreateElementHack = ko.utils.ieVersion <= 8;
|
||||
|
||||
function getWrap(tags) {
|
||||
var m = tags.match(/^(?:<!--.*?-->\s*?)*?<([a-z]+)[\s>]/);
|
||||
return (m && lookup[m[1]]) || none;
|
||||
}
|
||||
|
||||
function simpleHtmlParse(html, documentContext) {
|
||||
documentContext || (documentContext = document);
|
||||
var windowContext = documentContext['parentWindow'] || documentContext['defaultView'] || window;
|
||||
|
||||
// Based on jQuery's "clean" function, but only accounting for table-related elements.
|
||||
// If you have referenced jQuery, this won't be used anyway - KO will use jQuery's "clean" function directly
|
||||
|
||||
// Note that there's still an issue in IE < 9 whereby it will discard comment nodes that are the first child of
|
||||
// a descendant node. For example: "<div><!-- mycomment -->abc</div>" will get parsed as "<div>abc</div>"
|
||||
// This won't affect anyone who has referenced jQuery, and there's always the workaround of inserting a dummy node
|
||||
// (possibly a text node) in front of the comment. So, KO does not attempt to workaround this IE issue automatically at present.
|
||||
|
||||
// Trim whitespace, otherwise indexOf won't work as expected
|
||||
var tags = ko.utils.stringTrim(html).toLowerCase(), div = documentContext.createElement("div"),
|
||||
wrap = getWrap(tags),
|
||||
depth = wrap[0];
|
||||
|
||||
// Go to html and back, then peel off extra wrappers
|
||||
// Note that we always prefix with some dummy text, because otherwise, IE<9 will strip out leading comment nodes in descendants. Total madness.
|
||||
var markup = "ignored<div>" + wrap[1] + html + wrap[2] + "</div>";
|
||||
if (typeof windowContext['innerShiv'] == "function") {
|
||||
// Note that innerShiv is deprecated in favour of html5shiv. We should consider adding
|
||||
// support for html5shiv (except if no explicit support is needed, e.g., if html5shiv
|
||||
// somehow shims the native APIs so it just works anyway)
|
||||
div.appendChild(windowContext['innerShiv'](markup));
|
||||
} else {
|
||||
if (mayRequireCreateElementHack) {
|
||||
// The document.createElement('my-element') trick to enable custom elements in IE6-8
|
||||
// only works if we assign innerHTML on an element associated with that document.
|
||||
documentContext.body.appendChild(div);
|
||||
}
|
||||
|
||||
div.innerHTML = markup;
|
||||
|
||||
if (mayRequireCreateElementHack) {
|
||||
div.parentNode.removeChild(div);
|
||||
}
|
||||
}
|
||||
|
||||
// Move to the right depth
|
||||
while (depth--)
|
||||
div = div.lastChild;
|
||||
|
||||
return ko.utils.makeArray(div.lastChild.childNodes);
|
||||
}
|
||||
|
||||
function jQueryHtmlParse(html, documentContext) {
|
||||
// jQuery's "parseHTML" function was introduced in jQuery 1.8.0 and is a documented public API.
|
||||
if (jQueryInstance['parseHTML']) {
|
||||
return jQueryInstance['parseHTML'](html, documentContext) || []; // Ensure we always return an array and never null
|
||||
} else {
|
||||
// For jQuery < 1.8.0, we fall back on the undocumented internal "clean" function.
|
||||
var elems = jQueryInstance['clean']([html], documentContext);
|
||||
|
||||
// As of jQuery 1.7.1, jQuery parses the HTML by appending it to some dummy parent nodes held in an in-memory document fragment.
|
||||
// Unfortunately, it never clears the dummy parent nodes from the document fragment, so it leaks memory over time.
|
||||
// Fix this by finding the top-most dummy parent element, and detaching it from its owner fragment.
|
||||
if (elems && elems[0]) {
|
||||
// Find the top-most parent element that's a direct child of a document fragment
|
||||
var elem = elems[0];
|
||||
while (elem.parentNode && elem.parentNode.nodeType !== 11 /* i.e., DocumentFragment */)
|
||||
elem = elem.parentNode;
|
||||
// ... then detach it
|
||||
if (elem.parentNode)
|
||||
elem.parentNode.removeChild(elem);
|
||||
}
|
||||
|
||||
return elems;
|
||||
}
|
||||
}
|
||||
|
||||
ko.utils.parseHtmlFragment = function(html, documentContext) {
|
||||
return jQueryInstance ?
|
||||
jQueryHtmlParse(html, documentContext) : // As below, benefit from jQuery's optimisations where possible
|
||||
simpleHtmlParse(html, documentContext); // ... otherwise, this simple logic will do in most common cases.
|
||||
};
|
||||
|
||||
ko.utils.parseHtmlForTemplateNodes = function(html, documentContext) {
|
||||
var nodes = ko.utils.parseHtmlFragment(html, documentContext);
|
||||
return (nodes.length && nodes[0].parentElement) || ko.utils.moveCleanedNodesToContainerElement(nodes);
|
||||
};
|
||||
|
||||
ko.utils.setHtml = function(node, html) {
|
||||
ko.utils.emptyDomNode(node);
|
||||
|
||||
// There's no legitimate reason to display a stringified observable without unwrapping it, so we'll unwrap it
|
||||
html = ko.utils.unwrapObservable(html);
|
||||
|
||||
if ((html !== null) && (html !== undefined)) {
|
||||
if (typeof html != 'string')
|
||||
html = html.toString();
|
||||
|
||||
// jQuery contains a lot of sophisticated code to parse arbitrary HTML fragments,
|
||||
// for example <tr> elements which are not normally allowed to exist on their own.
|
||||
// If you've referenced jQuery we'll use that rather than duplicating its code.
|
||||
if (jQueryInstance) {
|
||||
jQueryInstance(node)['html'](html);
|
||||
} else {
|
||||
// ... otherwise, use KO's own parsing logic.
|
||||
var parsedNodes = ko.utils.parseHtmlFragment(html, node.ownerDocument);
|
||||
for (var i = 0; i < parsedNodes.length; i++)
|
||||
node.appendChild(parsedNodes[i]);
|
||||
}
|
||||
}
|
||||
};
|
||||
})();
|
||||
|
||||
ko.exportSymbol('utils.parseHtmlFragment', ko.utils.parseHtmlFragment);
|
||||
ko.exportSymbol('utils.setHtml', ko.utils.setHtml);
|
||||
Loading…
Add table
Add a link
Reference in a new issue