File: //usr/share/nodejs/turbolinks/src/turbolinks/head_details.js
// Generated by CoffeeScript 1.12.8
(function() {
Turbolinks.HeadDetails = (function() {
var elementIsMetaElementWithName, elementIsScript, elementIsStylesheet, elementIsTracked, elementType;
HeadDetails.fromHeadElement = function(headElement) {
var ref;
return new this((ref = headElement != null ? headElement.childNodes : void 0) != null ? ref : []);
};
function HeadDetails(childNodes) {
var base, data, i, key, len, node;
this.elements = {};
for (i = 0, len = childNodes.length; i < len; i++) {
node = childNodes[i];
if (!(node.nodeType === Node.ELEMENT_NODE)) {
continue;
}
key = node.outerHTML;
data = (base = this.elements)[key] != null ? base[key] : base[key] = {
type: elementType(node),
tracked: elementIsTracked(node),
elements: []
};
data.elements.push(node);
}
}
HeadDetails.prototype.hasElementWithKey = function(key) {
return key in this.elements;
};
HeadDetails.prototype.getTrackedElementSignature = function() {
var key, tracked;
return ((function() {
var ref, results;
ref = this.elements;
results = [];
for (key in ref) {
tracked = ref[key].tracked;
if (tracked) {
results.push(key);
}
}
return results;
}).call(this)).join("");
};
HeadDetails.prototype.getScriptElementsNotInDetails = function(headDetails) {
return this.getElementsMatchingTypeNotInDetails("script", headDetails);
};
HeadDetails.prototype.getStylesheetElementsNotInDetails = function(headDetails) {
return this.getElementsMatchingTypeNotInDetails("stylesheet", headDetails);
};
HeadDetails.prototype.getElementsMatchingTypeNotInDetails = function(matchedType, headDetails) {
var elements, key, ref, ref1, results, type;
ref = this.elements;
results = [];
for (key in ref) {
ref1 = ref[key], type = ref1.type, elements = ref1.elements;
if (type === matchedType && !headDetails.hasElementWithKey(key)) {
results.push(elements[0]);
}
}
return results;
};
HeadDetails.prototype.getProvisionalElements = function() {
var elements, key, provisionalElements, ref, ref1, tracked, type;
provisionalElements = [];
ref = this.elements;
for (key in ref) {
ref1 = ref[key], type = ref1.type, tracked = ref1.tracked, elements = ref1.elements;
if ((type == null) && !tracked) {
provisionalElements.push.apply(provisionalElements, elements);
} else if (elements.length > 1) {
provisionalElements.push.apply(provisionalElements, elements.slice(1));
}
}
return provisionalElements;
};
HeadDetails.prototype.getMetaValue = function(name) {
var ref;
return (ref = this.findMetaElementByName(name)) != null ? ref.getAttribute("content") : void 0;
};
HeadDetails.prototype.findMetaElementByName = function(name) {
var element, elements, key, ref;
element = void 0;
ref = this.elements;
for (key in ref) {
elements = ref[key].elements;
if (elementIsMetaElementWithName(elements[0], name)) {
element = elements[0];
}
}
return element;
};
elementType = function(element) {
if (elementIsScript(element)) {
return "script";
} else if (elementIsStylesheet(element)) {
return "stylesheet";
}
};
elementIsTracked = function(element) {
return element.getAttribute("data-turbolinks-track") === "reload";
};
elementIsScript = function(element) {
var tagName;
tagName = element.tagName.toLowerCase();
return tagName === "script";
};
elementIsStylesheet = function(element) {
var tagName;
tagName = element.tagName.toLowerCase();
return tagName === "style" || (tagName === "link" && element.getAttribute("rel") === "stylesheet");
};
elementIsMetaElementWithName = function(element, name) {
var tagName;
tagName = element.tagName.toLowerCase();
return tagName === "meta" && element.getAttribute("name") === name;
};
return HeadDetails;
})();
}).call(this);