Tab layout, first commit with new third party packages
[openemr.git] / public / assets / knockout-3-4-0 / src / templating / templateRewriting.js
blobefa46d0ece82700a16cc8eb48076ffc36236e339
2 ko.templateRewriting = (function () {
3     var memoizeDataBindingAttributeSyntaxRegex = /(<([a-z]+\d*)(?:\s+(?!data-bind\s*=\s*)[a-z0-9\-]+(?:=(?:\"[^\"]*\"|\'[^\']*\'|[^>]*))?)*\s+)data-bind\s*=\s*(["'])([\s\S]*?)\3/gi;
4     var memoizeVirtualContainerBindingSyntaxRegex = /<!--\s*ko\b\s*([\s\S]*?)\s*-->/g;
6     function validateDataBindValuesForRewriting(keyValueArray) {
7         var allValidators = ko.expressionRewriting.bindingRewriteValidators;
8         for (var i = 0; i < keyValueArray.length; i++) {
9             var key = keyValueArray[i]['key'];
10             if (allValidators.hasOwnProperty(key)) {
11                 var validator = allValidators[key];
13                 if (typeof validator === "function") {
14                     var possibleErrorMessage = validator(keyValueArray[i]['value']);
15                     if (possibleErrorMessage)
16                         throw new Error(possibleErrorMessage);
17                 } else if (!validator) {
18                     throw new Error("This template engine does not support the '" + key + "' binding within its templates");
19                 }
20             }
21         }
22     }
24     function constructMemoizedTagReplacement(dataBindAttributeValue, tagToRetain, nodeName, templateEngine) {
25         var dataBindKeyValueArray = ko.expressionRewriting.parseObjectLiteral(dataBindAttributeValue);
26         validateDataBindValuesForRewriting(dataBindKeyValueArray);
27         var rewrittenDataBindAttributeValue = ko.expressionRewriting.preProcessBindings(dataBindKeyValueArray, {'valueAccessors':true});
29         // For no obvious reason, Opera fails to evaluate rewrittenDataBindAttributeValue unless it's wrapped in an additional
30         // anonymous function, even though Opera's built-in debugger can evaluate it anyway. No other browser requires this
31         // extra indirection.
32         var applyBindingsToNextSiblingScript =
33             "ko.__tr_ambtns(function($context,$element){return(function(){return{ " + rewrittenDataBindAttributeValue + " } })()},'" + nodeName.toLowerCase() + "')";
34         return templateEngine['createJavaScriptEvaluatorBlock'](applyBindingsToNextSiblingScript) + tagToRetain;
35     }
37     return {
38         ensureTemplateIsRewritten: function (template, templateEngine, templateDocument) {
39             if (!templateEngine['isTemplateRewritten'](template, templateDocument))
40                 templateEngine['rewriteTemplate'](template, function (htmlString) {
41                     return ko.templateRewriting.memoizeBindingAttributeSyntax(htmlString, templateEngine);
42                 }, templateDocument);
43         },
45         memoizeBindingAttributeSyntax: function (htmlString, templateEngine) {
46             return htmlString.replace(memoizeDataBindingAttributeSyntaxRegex, function () {
47                 return constructMemoizedTagReplacement(/* dataBindAttributeValue: */ arguments[4], /* tagToRetain: */ arguments[1], /* nodeName: */ arguments[2], templateEngine);
48             }).replace(memoizeVirtualContainerBindingSyntaxRegex, function() {
49                 return constructMemoizedTagReplacement(/* dataBindAttributeValue: */ arguments[1], /* tagToRetain: */ "<!-- ko -->", /* nodeName: */ "#comment", templateEngine);
50             });
51         },
53         applyMemoizedBindingsToNextSibling: function (bindings, nodeName) {
54             return ko.memoization.memoize(function (domNode, bindingContext) {
55                 var nodeToBind = domNode.nextSibling;
56                 if (nodeToBind && nodeToBind.nodeName.toLowerCase() === nodeName) {
57                     ko.applyBindingAccessorsToNode(nodeToBind, bindings, bindingContext);
58                 }
59             });
60         }
61     }
62 })();
65 // Exported only because it has to be referenced by string lookup from within rewritten template
66 ko.exportSymbol('__tr_ambtns', ko.templateRewriting.applyMemoizedBindingsToNextSibling);