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 |
|
111 | module.exports = Object.assign(exports.default, exports);
|