117 lines
3.0 KiB
JavaScript
117 lines
3.0 KiB
JavaScript
|
/*
|
||
|
MIT License http://www.opensource.org/licenses/mit-license.php
|
||
|
Author Tobias Koppers @sokra
|
||
|
*/
|
||
|
var stylesInDom = {};
|
||
|
|
||
|
module.exports = function(list) {
|
||
|
if(typeof DEBUG !== "undefined" && DEBUG) {
|
||
|
if(typeof document !== "object") throw new Error("The style-loader cannot be used in a non-browser environment");
|
||
|
}
|
||
|
var styles = listToStyles(list);
|
||
|
addStylesToDom(styles);
|
||
|
return function update(newList) {
|
||
|
var mayRemove = [];
|
||
|
for(var i = 0; i < styles.length; i++) {
|
||
|
var item = styles[i];
|
||
|
var domStyle = stylesInDom[item.id];
|
||
|
domStyle.refs--;
|
||
|
mayRemove.push(domStyle);
|
||
|
}
|
||
|
if(newList) {
|
||
|
var newStyles = listToStyles(newList);
|
||
|
addStylesToDom(newStyles);
|
||
|
}
|
||
|
for(var i = 0; i < mayRemove.length; i++) {
|
||
|
var domStyle = mayRemove[i];
|
||
|
if(domStyle.refs === 0) {
|
||
|
for(var j = 0; j < domStyle.parts.length; j++)
|
||
|
domStyle.parts[j]();
|
||
|
delete stylesInDom[domStyle.id];
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
|
||
|
function addStylesToDom(styles) {
|
||
|
for(var i = 0; i < styles.length; i++) {
|
||
|
var item = styles[i];
|
||
|
var domStyle = stylesInDom[item.id];
|
||
|
if(domStyle) {
|
||
|
domStyle.refs++;
|
||
|
for(var j = 0; j < domStyle.parts.length; j++) {
|
||
|
domStyle.parts[j](item.parts[j]);
|
||
|
}
|
||
|
for(; j < item.parts.length; j++) {
|
||
|
domStyle.parts.push(addStyle(item.parts[j]));
|
||
|
}
|
||
|
} else {
|
||
|
var parts = [];
|
||
|
for(var j = 0; j < item.parts.length; j++) {
|
||
|
parts.push(addStyle(item.parts[j]));
|
||
|
}
|
||
|
stylesInDom[item.id] = {id: item.id, refs: 1, parts: parts};
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function listToStyles(list) {
|
||
|
var styles = [];
|
||
|
var newStyles = {};
|
||
|
for(var i = 0; i < list.length; i++) {
|
||
|
var item = list[i];
|
||
|
var id = item[0];
|
||
|
var css = item[1];
|
||
|
var media = item[2];
|
||
|
// var sourceMap = item[3];
|
||
|
var part = {css: css, media: media/*, sourceMap: sourceMap*/};
|
||
|
if(!newStyles[id])
|
||
|
styles.push(newStyles[id] = {id: id, parts: [part]});
|
||
|
else
|
||
|
newStyles[id].parts.push(part);
|
||
|
}
|
||
|
return styles;
|
||
|
}
|
||
|
|
||
|
function addStyle(obj) {
|
||
|
var styleElement = document.createElement("style");
|
||
|
var head = document.head || document.getElementsByTagName("head")[0];
|
||
|
styleElement.type = "text/css";
|
||
|
head.appendChild(styleElement);
|
||
|
applyToTag(styleElement, obj);
|
||
|
return function(newObj) {
|
||
|
if(newObj) {
|
||
|
if(newObj.css === obj.css && newObj.media === obj.media /*&& newObj.sourceMap === obj.sourceMap*/)
|
||
|
return;
|
||
|
applyToTag(styleElement, obj = newObj);
|
||
|
} else {
|
||
|
head.removeChild(styleElement);
|
||
|
}
|
||
|
};
|
||
|
};
|
||
|
|
||
|
function applyToTag(styleElement, obj) {
|
||
|
var css = obj.css;
|
||
|
var media = obj.media;
|
||
|
// var sourceMap = obj.sourceMap;
|
||
|
|
||
|
// No browser support
|
||
|
// if(sourceMap && typeof btoa === "function") {
|
||
|
// try {
|
||
|
// css += "\n/*# sourceMappingURL=data:application/json;base64," + btoa(JSON.stringify(sourceMap)) + " */";
|
||
|
// } catch(e) {}
|
||
|
// }
|
||
|
if(media) {
|
||
|
styleElement.setAttribute("media", media)
|
||
|
}
|
||
|
if (styleElement.styleSheet) {
|
||
|
styleElement.styleSheet.cssText = css;
|
||
|
} else {
|
||
|
while(styleElement.firstChild) {
|
||
|
styleElement.removeChild(styleElement.firstChild);
|
||
|
}
|
||
|
styleElement.appendChild(document.createTextNode(css));
|
||
|
}
|
||
|
|
||
|
}
|