blob: f7eef0476f3df68fae5e1ca9b99ab5571508285d [file] [log] [blame]
// 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;
}