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