| 79 | |
| 80 | export namespace FontVariationSettings { |
| 81 | export function parse(fontVariationSettings: string): Array<FontVariationSettingsType> | null { |
| 82 | if (!fontVariationSettings) { |
| 83 | return null; |
| 84 | } |
| 85 | |
| 86 | const excluded = ['normal', 'revert-layer']; |
| 87 | const variationSettingsValue: string = fontVariationSettings.trim(); |
| 88 | |
| 89 | if (excluded.indexOf(variationSettingsValue.toLowerCase()) !== -1) { |
| 90 | return null; |
| 91 | } |
| 92 | |
| 93 | const chunks = variationSettingsValue.split(','); |
| 94 | if (chunks.length) { |
| 95 | const parsed: Array<FontVariationSettingsType> = []; |
| 96 | for (const chunk of chunks) { |
| 97 | const trimmedChunk = chunk.trim(); |
| 98 | const axisChunks = trimmedChunk.split(' '); |
| 99 | if (axisChunks.length === 2) { |
| 100 | const axisName = axisChunks[0].trim(); |
| 101 | const axisValue = parseFloat(axisChunks[1]); |
| 102 | // See https://drafts.csswg.org/css-fonts/#font-variation-settings-def. |
| 103 | // Axis name strings longer or shorter than four characters are invalid. |
| 104 | if (!isNaN(axisValue) && axisName.length === 6 && ((axisName.startsWith("'") && axisName.endsWith("'")) || (axisName.startsWith('"') && axisName.endsWith('"')))) { |
| 105 | // Remove quotes as they might cause problems when using name as an object key |
| 106 | const unquotedAxisName = axisName.substring(1, axisName.length - 1); |
| 107 | parsed.push({ axis: unquotedAxisName, value: axisValue }); |
| 108 | } else { |
| 109 | Trace.write('Invalid value (font-variation-settings): ' + variationSettingsValue, Trace.categories.Error, Trace.messageType.error); |
| 110 | } |
| 111 | } else { |
| 112 | Trace.write('Invalid value (font-variation-settings): ' + variationSettingsValue, Trace.categories.Error, Trace.messageType.error); |
| 113 | } |
| 114 | } |
| 115 | |
| 116 | return parsed; |
| 117 | } |
| 118 | |
| 119 | Trace.write('Invalid value (font-variation-settings): ' + variationSettingsValue, Trace.categories.Error, Trace.messageType.error); |
| 120 | } |
| 121 | |
| 122 | export function toString(fontVariationSettings: FontVariationSettingsType[] | null): string | null { |
| 123 | if (fontVariationSettings?.length) { |