dep-e36486f6.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531
  1. 'use strict';
  2. var openParentheses = "(".charCodeAt(0);
  3. var closeParentheses = ")".charCodeAt(0);
  4. var singleQuote = "'".charCodeAt(0);
  5. var doubleQuote = '"'.charCodeAt(0);
  6. var backslash = "\\".charCodeAt(0);
  7. var slash = "/".charCodeAt(0);
  8. var comma = ",".charCodeAt(0);
  9. var colon = ":".charCodeAt(0);
  10. var star = "*".charCodeAt(0);
  11. var uLower = "u".charCodeAt(0);
  12. var uUpper = "U".charCodeAt(0);
  13. var plus$1 = "+".charCodeAt(0);
  14. var isUnicodeRange = /^[a-f0-9?-]+$/i;
  15. var parse$1 = function(input) {
  16. var tokens = [];
  17. var value = input;
  18. var next,
  19. quote,
  20. prev,
  21. token,
  22. escape,
  23. escapePos,
  24. whitespacePos,
  25. parenthesesOpenPos;
  26. var pos = 0;
  27. var code = value.charCodeAt(pos);
  28. var max = value.length;
  29. var stack = [{ nodes: tokens }];
  30. var balanced = 0;
  31. var parent;
  32. var name = "";
  33. var before = "";
  34. var after = "";
  35. while (pos < max) {
  36. // Whitespaces
  37. if (code <= 32) {
  38. next = pos;
  39. do {
  40. next += 1;
  41. code = value.charCodeAt(next);
  42. } while (code <= 32);
  43. token = value.slice(pos, next);
  44. prev = tokens[tokens.length - 1];
  45. if (code === closeParentheses && balanced) {
  46. after = token;
  47. } else if (prev && prev.type === "div") {
  48. prev.after = token;
  49. } else if (
  50. code === comma ||
  51. code === colon ||
  52. (code === slash &&
  53. value.charCodeAt(next + 1) !== star &&
  54. (!parent ||
  55. (parent && parent.type === "function" && parent.value !== "calc")))
  56. ) {
  57. before = token;
  58. } else {
  59. tokens.push({
  60. type: "space",
  61. sourceIndex: pos,
  62. value: token
  63. });
  64. }
  65. pos = next;
  66. // Quotes
  67. } else if (code === singleQuote || code === doubleQuote) {
  68. next = pos;
  69. quote = code === singleQuote ? "'" : '"';
  70. token = {
  71. type: "string",
  72. sourceIndex: pos,
  73. quote: quote
  74. };
  75. do {
  76. escape = false;
  77. next = value.indexOf(quote, next + 1);
  78. if (~next) {
  79. escapePos = next;
  80. while (value.charCodeAt(escapePos - 1) === backslash) {
  81. escapePos -= 1;
  82. escape = !escape;
  83. }
  84. } else {
  85. value += quote;
  86. next = value.length - 1;
  87. token.unclosed = true;
  88. }
  89. } while (escape);
  90. token.value = value.slice(pos + 1, next);
  91. tokens.push(token);
  92. pos = next + 1;
  93. code = value.charCodeAt(pos);
  94. // Comments
  95. } else if (code === slash && value.charCodeAt(pos + 1) === star) {
  96. token = {
  97. type: "comment",
  98. sourceIndex: pos
  99. };
  100. next = value.indexOf("*/", pos);
  101. if (next === -1) {
  102. token.unclosed = true;
  103. next = value.length;
  104. }
  105. token.value = value.slice(pos + 2, next);
  106. tokens.push(token);
  107. pos = next + 2;
  108. code = value.charCodeAt(pos);
  109. // Operation within calc
  110. } else if (
  111. (code === slash || code === star) &&
  112. parent &&
  113. parent.type === "function" &&
  114. parent.value === "calc"
  115. ) {
  116. token = value[pos];
  117. tokens.push({
  118. type: "word",
  119. sourceIndex: pos - before.length,
  120. value: token
  121. });
  122. pos += 1;
  123. code = value.charCodeAt(pos);
  124. // Dividers
  125. } else if (code === slash || code === comma || code === colon) {
  126. token = value[pos];
  127. tokens.push({
  128. type: "div",
  129. sourceIndex: pos - before.length,
  130. value: token,
  131. before: before,
  132. after: ""
  133. });
  134. before = "";
  135. pos += 1;
  136. code = value.charCodeAt(pos);
  137. // Open parentheses
  138. } else if (openParentheses === code) {
  139. // Whitespaces after open parentheses
  140. next = pos;
  141. do {
  142. next += 1;
  143. code = value.charCodeAt(next);
  144. } while (code <= 32);
  145. parenthesesOpenPos = pos;
  146. token = {
  147. type: "function",
  148. sourceIndex: pos - name.length,
  149. value: name,
  150. before: value.slice(parenthesesOpenPos + 1, next)
  151. };
  152. pos = next;
  153. if (name === "url" && code !== singleQuote && code !== doubleQuote) {
  154. next -= 1;
  155. do {
  156. escape = false;
  157. next = value.indexOf(")", next + 1);
  158. if (~next) {
  159. escapePos = next;
  160. while (value.charCodeAt(escapePos - 1) === backslash) {
  161. escapePos -= 1;
  162. escape = !escape;
  163. }
  164. } else {
  165. value += ")";
  166. next = value.length - 1;
  167. token.unclosed = true;
  168. }
  169. } while (escape);
  170. // Whitespaces before closed
  171. whitespacePos = next;
  172. do {
  173. whitespacePos -= 1;
  174. code = value.charCodeAt(whitespacePos);
  175. } while (code <= 32);
  176. if (parenthesesOpenPos < whitespacePos) {
  177. if (pos !== whitespacePos + 1) {
  178. token.nodes = [
  179. {
  180. type: "word",
  181. sourceIndex: pos,
  182. value: value.slice(pos, whitespacePos + 1)
  183. }
  184. ];
  185. } else {
  186. token.nodes = [];
  187. }
  188. if (token.unclosed && whitespacePos + 1 !== next) {
  189. token.after = "";
  190. token.nodes.push({
  191. type: "space",
  192. sourceIndex: whitespacePos + 1,
  193. value: value.slice(whitespacePos + 1, next)
  194. });
  195. } else {
  196. token.after = value.slice(whitespacePos + 1, next);
  197. }
  198. } else {
  199. token.after = "";
  200. token.nodes = [];
  201. }
  202. pos = next + 1;
  203. code = value.charCodeAt(pos);
  204. tokens.push(token);
  205. } else {
  206. balanced += 1;
  207. token.after = "";
  208. tokens.push(token);
  209. stack.push(token);
  210. tokens = token.nodes = [];
  211. parent = token;
  212. }
  213. name = "";
  214. // Close parentheses
  215. } else if (closeParentheses === code && balanced) {
  216. pos += 1;
  217. code = value.charCodeAt(pos);
  218. parent.after = after;
  219. after = "";
  220. balanced -= 1;
  221. stack.pop();
  222. parent = stack[balanced];
  223. tokens = parent.nodes;
  224. // Words
  225. } else {
  226. next = pos;
  227. do {
  228. if (code === backslash) {
  229. next += 1;
  230. }
  231. next += 1;
  232. code = value.charCodeAt(next);
  233. } while (
  234. next < max &&
  235. !(
  236. code <= 32 ||
  237. code === singleQuote ||
  238. code === doubleQuote ||
  239. code === comma ||
  240. code === colon ||
  241. code === slash ||
  242. code === openParentheses ||
  243. (code === star &&
  244. parent &&
  245. parent.type === "function" &&
  246. parent.value === "calc") ||
  247. (code === slash &&
  248. parent.type === "function" &&
  249. parent.value === "calc") ||
  250. (code === closeParentheses && balanced)
  251. )
  252. );
  253. token = value.slice(pos, next);
  254. if (openParentheses === code) {
  255. name = token;
  256. } else if (
  257. (uLower === token.charCodeAt(0) || uUpper === token.charCodeAt(0)) &&
  258. plus$1 === token.charCodeAt(1) &&
  259. isUnicodeRange.test(token.slice(2))
  260. ) {
  261. tokens.push({
  262. type: "unicode-range",
  263. sourceIndex: pos,
  264. value: token
  265. });
  266. } else {
  267. tokens.push({
  268. type: "word",
  269. sourceIndex: pos,
  270. value: token
  271. });
  272. }
  273. pos = next;
  274. }
  275. }
  276. for (pos = stack.length - 1; pos; pos -= 1) {
  277. stack[pos].unclosed = true;
  278. }
  279. return stack[0].nodes;
  280. };
  281. var walk$1 = function walk(nodes, cb, bubble) {
  282. var i, max, node, result;
  283. for (i = 0, max = nodes.length; i < max; i += 1) {
  284. node = nodes[i];
  285. if (!bubble) {
  286. result = cb(node, i, nodes);
  287. }
  288. if (
  289. result !== false &&
  290. node.type === "function" &&
  291. Array.isArray(node.nodes)
  292. ) {
  293. walk(node.nodes, cb, bubble);
  294. }
  295. if (bubble) {
  296. cb(node, i, nodes);
  297. }
  298. }
  299. };
  300. function stringifyNode(node, custom) {
  301. var type = node.type;
  302. var value = node.value;
  303. var buf;
  304. var customResult;
  305. if (custom && (customResult = custom(node)) !== undefined) {
  306. return customResult;
  307. } else if (type === "word" || type === "space") {
  308. return value;
  309. } else if (type === "string") {
  310. buf = node.quote || "";
  311. return buf + value + (node.unclosed ? "" : buf);
  312. } else if (type === "comment") {
  313. return "/*" + value + (node.unclosed ? "" : "*/");
  314. } else if (type === "div") {
  315. return (node.before || "") + value + (node.after || "");
  316. } else if (Array.isArray(node.nodes)) {
  317. buf = stringify$1(node.nodes, custom);
  318. if (type !== "function") {
  319. return buf;
  320. }
  321. return (
  322. value +
  323. "(" +
  324. (node.before || "") +
  325. buf +
  326. (node.after || "") +
  327. (node.unclosed ? "" : ")")
  328. );
  329. }
  330. return value;
  331. }
  332. function stringify$1(nodes, custom) {
  333. var result, i;
  334. if (Array.isArray(nodes)) {
  335. result = "";
  336. for (i = nodes.length - 1; ~i; i -= 1) {
  337. result = stringifyNode(nodes[i], custom) + result;
  338. }
  339. return result;
  340. }
  341. return stringifyNode(nodes, custom);
  342. }
  343. var stringify_1 = stringify$1;
  344. var minus = "-".charCodeAt(0);
  345. var plus = "+".charCodeAt(0);
  346. var dot = ".".charCodeAt(0);
  347. var exp = "e".charCodeAt(0);
  348. var EXP = "E".charCodeAt(0);
  349. // Check if three code points would start a number
  350. // https://www.w3.org/TR/css-syntax-3/#starts-with-a-number
  351. function likeNumber(value) {
  352. var code = value.charCodeAt(0);
  353. var nextCode;
  354. if (code === plus || code === minus) {
  355. nextCode = value.charCodeAt(1);
  356. if (nextCode >= 48 && nextCode <= 57) {
  357. return true;
  358. }
  359. var nextNextCode = value.charCodeAt(2);
  360. if (nextCode === dot && nextNextCode >= 48 && nextNextCode <= 57) {
  361. return true;
  362. }
  363. return false;
  364. }
  365. if (code === dot) {
  366. nextCode = value.charCodeAt(1);
  367. if (nextCode >= 48 && nextCode <= 57) {
  368. return true;
  369. }
  370. return false;
  371. }
  372. if (code >= 48 && code <= 57) {
  373. return true;
  374. }
  375. return false;
  376. }
  377. // Consume a number
  378. // https://www.w3.org/TR/css-syntax-3/#consume-number
  379. var unit = function(value) {
  380. var pos = 0;
  381. var length = value.length;
  382. var code;
  383. var nextCode;
  384. var nextNextCode;
  385. if (length === 0 || !likeNumber(value)) {
  386. return false;
  387. }
  388. code = value.charCodeAt(pos);
  389. if (code === plus || code === minus) {
  390. pos++;
  391. }
  392. while (pos < length) {
  393. code = value.charCodeAt(pos);
  394. if (code < 48 || code > 57) {
  395. break;
  396. }
  397. pos += 1;
  398. }
  399. code = value.charCodeAt(pos);
  400. nextCode = value.charCodeAt(pos + 1);
  401. if (code === dot && nextCode >= 48 && nextCode <= 57) {
  402. pos += 2;
  403. while (pos < length) {
  404. code = value.charCodeAt(pos);
  405. if (code < 48 || code > 57) {
  406. break;
  407. }
  408. pos += 1;
  409. }
  410. }
  411. code = value.charCodeAt(pos);
  412. nextCode = value.charCodeAt(pos + 1);
  413. nextNextCode = value.charCodeAt(pos + 2);
  414. if (
  415. (code === exp || code === EXP) &&
  416. ((nextCode >= 48 && nextCode <= 57) ||
  417. ((nextCode === plus || nextCode === minus) &&
  418. nextNextCode >= 48 &&
  419. nextNextCode <= 57))
  420. ) {
  421. pos += nextCode === plus || nextCode === minus ? 3 : 2;
  422. while (pos < length) {
  423. code = value.charCodeAt(pos);
  424. if (code < 48 || code > 57) {
  425. break;
  426. }
  427. pos += 1;
  428. }
  429. }
  430. return {
  431. number: value.slice(0, pos),
  432. unit: value.slice(pos)
  433. };
  434. };
  435. var parse = parse$1;
  436. var walk = walk$1;
  437. var stringify = stringify_1;
  438. function ValueParser(value) {
  439. if (this instanceof ValueParser) {
  440. this.nodes = parse(value);
  441. return this;
  442. }
  443. return new ValueParser(value);
  444. }
  445. ValueParser.prototype.toString = function() {
  446. return Array.isArray(this.nodes) ? stringify(this.nodes) : "";
  447. };
  448. ValueParser.prototype.walk = function(cb, bubble) {
  449. walk(this.nodes, cb, bubble);
  450. return this;
  451. };
  452. ValueParser.unit = unit;
  453. ValueParser.walk = walk;
  454. ValueParser.stringify = stringify;
  455. var lib = ValueParser;
  456. exports.lib = lib;
  457. //# sourceMappingURL=dep-e36486f6.js.map