index.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. var unquote = require('unquote');
  4. var systemFontKeywords = require('css-system-font-keywords');
  5. var fontWeightKeywords = require('css-font-weight-keywords');
  6. var fontStyleKeywords = require('css-font-style-keywords');
  7. var fontStretchKeywords = require('css-font-stretch-keywords');
  8. var cssListHelpers = require("css-list-helpers");
  9. var helpers = require("./helpers");
  10. var errorPrefix = '[parse-css-font]';
  11. var firstDeclarations = [
  12. 'style',
  13. 'weight',
  14. 'stretch',
  15. 'variant',
  16. ];
  17. function parseCSSFont(value) {
  18. if (typeof value !== 'string') {
  19. throw error('Expected a string.', TypeError);
  20. }
  21. if (value === '') {
  22. throw error('Cannot parse an empty string.');
  23. }
  24. if (systemFontKeywords.indexOf(value) !== -1) {
  25. return { system: value };
  26. }
  27. var font = {
  28. lineHeight: 'normal',
  29. stretch: '',
  30. style: '',
  31. variant: '',
  32. weight: '',
  33. };
  34. var consumers = [style, weight, stretch, variant];
  35. var tokens = cssListHelpers.splitBySpaces(value);
  36. nextToken: for (var token = tokens.shift(); !!token; token = tokens.shift()) {
  37. if (token === 'normal') {
  38. continue;
  39. }
  40. for (var _i = 0, consumers_1 = consumers; _i < consumers_1.length; _i++) {
  41. var consume = consumers_1[_i];
  42. if (consume(token)) {
  43. continue nextToken;
  44. }
  45. }
  46. var parts = cssListHelpers.split(token, ['/']);
  47. font.size = parts[0];
  48. if (!!parts[1]) {
  49. font.lineHeight = parseLineHeight(parts[1]);
  50. }
  51. else if (tokens[0] === '/') {
  52. tokens.shift();
  53. font.lineHeight = parseLineHeight(tokens.shift());
  54. }
  55. if (!tokens.length) {
  56. throw error('Missing required font-family.');
  57. }
  58. font.family = cssListHelpers.splitByCommas(tokens.join(' ')).map(unquote);
  59. for (var _a = 0, firstDeclarations_1 = firstDeclarations; _a < firstDeclarations_1.length; _a++) {
  60. var name_1 = firstDeclarations_1[_a];
  61. font[name_1] = font[name_1] || 'normal';
  62. }
  63. return font;
  64. }
  65. throw error('Missing required font-size.');
  66. function style(token) {
  67. if (fontStyleKeywords.indexOf(token) === -1) {
  68. return;
  69. }
  70. if (font.style) {
  71. throw error('Font style already defined.');
  72. }
  73. return (font.style = token);
  74. }
  75. function weight(token) {
  76. if (fontWeightKeywords.indexOf(token) === -1) {
  77. return;
  78. }
  79. if (font.weight) {
  80. throw error('Font weight already defined.');
  81. }
  82. return (font.weight = token);
  83. }
  84. function stretch(token) {
  85. if (fontStretchKeywords.indexOf(token) === -1) {
  86. return;
  87. }
  88. if (font.stretch) {
  89. throw error('Font stretch already defined.');
  90. }
  91. return (font.stretch = token);
  92. }
  93. function variant(token) {
  94. return (!helpers.isSize(token) &&
  95. (font.variant = font.variant ? [font.variant, token].join(' ') : token));
  96. }
  97. }
  98. exports.default = parseCSSFont;
  99. function error(message, ErrorType) {
  100. if (ErrorType === void 0) { ErrorType = Error; }
  101. return new ErrorType(errorPrefix + " " + message);
  102. }
  103. function parseLineHeight(value) {
  104. var parsed = parseFloat(value);
  105. if (parsed.toString() === value) {
  106. return parsed;
  107. }
  108. return value;
  109. }
  110. // @ts-ignore
  111. module.exports = Object.assign(exports.default, exports);