1var extractImportUrlAndMedia = require('./extract-import-url-and-media'); 2var restoreImport = require('./restore-import'); 3var rewriteUrl = require('./rewrite-url'); 4 5var Token = require('../tokenizer/token'); 6var isImport = require('../utils/is-import'); 7 8var SOURCE_MAP_COMMENT_PATTERN = /^\/\*# sourceMappingURL=(\S+) \*\/$/; 9 10function rebase(tokens, rebaseAll, validator, rebaseConfig) { 11 return rebaseAll ? 12 rebaseEverything(tokens, validator, rebaseConfig) : 13 rebaseAtRules(tokens, validator, rebaseConfig); 14} 15 16function rebaseEverything(tokens, validator, rebaseConfig) { 17 var token; 18 var i, l; 19 20 for (i = 0, l = tokens.length; i < l; i++) { 21 token = tokens[i]; 22 23 switch (token[0]) { 24 case Token.AT_RULE: 25 rebaseAtRule(token, validator, rebaseConfig); 26 break; 27 case Token.AT_RULE_BLOCK: 28 rebaseProperties(token[2], validator, rebaseConfig); 29 break; 30 case Token.COMMENT: 31 rebaseSourceMapComment(token, rebaseConfig); 32 break; 33 case Token.NESTED_BLOCK: 34 rebaseEverything(token[2], validator, rebaseConfig); 35 break; 36 case Token.RULE: 37 rebaseProperties(token[2], validator, rebaseConfig); 38 break; 39 } 40 } 41 42 return tokens; 43} 44 45function rebaseAtRules(tokens, validator, rebaseConfig) { 46 var token; 47 var i, l; 48 49 for (i = 0, l = tokens.length; i < l; i++) { 50 token = tokens[i]; 51 52 switch (token[0]) { 53 case Token.AT_RULE: 54 rebaseAtRule(token, validator, rebaseConfig); 55 break; 56 } 57 } 58 59 return tokens; 60} 61 62function rebaseAtRule(token, validator, rebaseConfig) { 63 if (!isImport(token[1])) { 64 return; 65 } 66 67 var uriAndMediaQuery = extractImportUrlAndMedia(token[1]); 68 var newUrl = rewriteUrl(uriAndMediaQuery[0], rebaseConfig); 69 var mediaQuery = uriAndMediaQuery[1]; 70 71 token[1] = restoreImport(newUrl, mediaQuery); 72} 73 74function rebaseSourceMapComment(token, rebaseConfig) { 75 var matches = SOURCE_MAP_COMMENT_PATTERN.exec(token[1]); 76 77 if (matches && matches[1].indexOf('data:') === -1) { 78 token[1] = token[1].replace(matches[1], rewriteUrl(matches[1], rebaseConfig, true)); 79 } 80} 81 82function rebaseProperties(properties, validator, rebaseConfig) { 83 var property; 84 var value; 85 var i, l; 86 var j, m; 87 88 for (i = 0, l = properties.length; i < l; i++) { 89 property = properties[i]; 90 91 for (j = 2 /* 0 is Token.PROPERTY, 1 is name */, m = property.length; j < m; j++) { 92 value = property[j][1]; 93 94 if (validator.isUrl(value)) { 95 property[j][1] = rewriteUrl(value, rebaseConfig); 96 } 97 } 98 } 99} 100 101module.exports = rebase; 102