| // Copyright 2026 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| export const enum TokenType { |
| LITERAL = 0, |
| URL = 1 |
| } |
| |
| export interface Token { |
| type: TokenType; |
| value: string; |
| } |
| |
| /** |
| * Parsing of |
| * https://html.spec.whatwg.org/multipage/images.html#srcset-attribute and href |
| * attributes to identify URLs vs other text in the srcset. |
| * |
| * Note: this is probably not spec compliant. |
| */ |
| export function parseSrcset(value: string): Token[] { |
| const result: Token[] = []; |
| let i = 0; |
| while (value.length) { |
| if (i++ > 0) { |
| result.push({value: ' ', type: TokenType.LITERAL}); |
| } |
| value = value.trim(); |
| let url = ''; |
| let descriptor = ''; |
| const indexOfSpace = value.search(/\s/); |
| if (indexOfSpace === -1) { |
| url = value; |
| } else if (indexOfSpace > 0 && value[indexOfSpace - 1] === ',') { |
| url = value.substring(0, indexOfSpace); |
| } else { |
| url = value.substring(0, indexOfSpace); |
| const indexOfComma = value.indexOf(',', indexOfSpace); |
| if (indexOfComma !== -1) { |
| descriptor = value.substring(indexOfSpace, indexOfComma + 1); |
| } else { |
| descriptor = value.substring(indexOfSpace); |
| } |
| } |
| |
| if (url) { |
| if (url.endsWith(',')) { |
| result.push({value: url.substring(0, url.length - 1), type: TokenType.URL}); |
| result.push({type: TokenType.LITERAL, value: ','}); |
| } else { |
| result.push({value: url, type: TokenType.URL}); |
| } |
| } |
| if (descriptor) { |
| result.push({type: TokenType.LITERAL, value: descriptor}); |
| } |
| value = value.substring(url.length + descriptor.length); |
| } |
| return result; |
| } |