@adguard/agtree
Version:
Tool set for working with adblock filter lists
76 lines (73 loc) • 3.07 kB
JavaScript
/*
* AGTree v3.2.2 (build date: Tue, 08 Jul 2025 13:39:47 GMT)
* (c) 2025 Adguard Software Ltd.
* Released under the MIT license
* https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/agtree#readme
*/
import { StringUtils } from '../../utils/string.js';
import { COMMA } from '../../utils/constants.js';
import { defaultParserOptions } from '../options.js';
import { BaseParser } from '../base-parser.js';
import { ValueParser } from './value-parser.js';
/**
* Parser for parameter lists.
*/
class ParameterListParser extends BaseParser {
/**
* Parses a raw parameter list.
*
* @param raw Raw input to parse.
* @param options Global parser options.
* @param baseOffset Starting offset of the input. Node locations are calculated relative to this offset.
* @param separator Separator character (default: comma)
* @returns Parameter list AST
*/
static parse(raw, options = defaultParserOptions, baseOffset = 0, separator = COMMA) {
// Prepare the parameter list node
const params = {
type: 'ParameterList',
children: [],
};
const { length } = raw;
if (options.isLocIncluded) {
params.start = baseOffset;
params.end = baseOffset + length;
}
let offset = 0;
// Parse parameters: skip whitespace before and after each parameter, and
// split parameters by the separator character.
while (offset < length) {
// Skip whitespace before parameter
offset = StringUtils.skipWS(raw, offset);
// Parameter may only contain whitespace
// In this case, we reached the end of the parameter list
if (raw[offset] === separator || offset === length) {
// Add a null for empty parameter
params.children.push(null);
// Skip separator
offset += 1;
}
else {
// Get parameter start position
const paramStart = offset;
// Get next unescaped separator position
const nextSeparator = StringUtils.findUnescapedNonStringNonRegexChar(raw, separator, offset);
// Get parameter end position
const paramEnd = nextSeparator !== -1
? StringUtils.skipWSBack(raw, nextSeparator - 1)
: StringUtils.skipWSBack(raw);
// Add parameter to the list
const param = ValueParser.parse(raw.slice(paramStart, paramEnd + 1), options, baseOffset + paramStart);
params.children.push(param);
// Set offset to the next separator position + 1
offset = nextSeparator !== -1 ? nextSeparator + 1 : length;
}
}
// If the last character was a separator, add an additional null parameter
if (raw[length - 1] === separator) {
params.children.push(null);
}
return params;
}
}
export { ParameterListParser };