/**
 * @file HTML filtering rule converter.
 */
import { type HtmlFilteringRule } from '../../nodes/index.js';
import { type NodeConversionResult } from '../base-interfaces/conversion-result.js';
import { RuleConverterBase } from '../base-interfaces/rule-converter-base.js';
/**
 * Error messages used in HTML filtering rule conversion.
 */
export declare const ERROR_MESSAGES: {
    readonly ABP_NOT_SUPPORTED: "Invalid rule, ABP does not support HTML filtering rules";
    readonly INVALID_RULE: "Invalid HTML filtering rule: %s";
    readonly MIXED_SYNTAX_ADG_UBO: "Mixed AdGuard and uBlock syntax";
    readonly EMPTY_SELECTOR_LIST: "Selector list of HTML filtering rule must not be empty";
    readonly EMPTY_COMPLEX_SELECTOR: "Complex selector of selector list must not be empty";
    readonly INVALID_SELECTOR_COMBINATOR: "Invalid selector combinator '%s' used between selectors";
    readonly UNKNOWN_SELECTOR_TYPE: "Unknown selector type '%s' found during conversion";
    readonly SPECIAL_ATTRIBUTE_SELECTOR_OPERATOR_INVALID: "Special attribute selector '%s' has invalid operator '%s'";
    readonly SPECIAL_ATTRIBUTE_SELECTOR_FLAG_NOT_SUPPORTED: "Special attribute selector '%s' does not support flags";
    readonly SPECIAL_ATTRIBUTE_SELECTOR_VALUE_REQUIRED: "Special attribute selector '%s' requires a value";
    readonly SPECIAL_ATTRIBUTE_SELECTOR_VALUE_INT: "Value of special attribute selector '%s' must be an integer, got '%s'";
    readonly SPECIAL_ATTRIBUTE_SELECTOR_VALUE_POSITIVE: "Value of special attribute selector '%s' must be a positive integer, got '%s'";
    readonly SPECIAL_ATTRIBUTE_SELECTOR_NOT_SUPPORTED: "Special attribute selector '%s' is not supported in conversion";
    readonly SPECIAL_PSEUDO_CLASS_SELECTOR_ARGUMENT_REQUIRED: "Special pseudo-class selector '%s' requires an argument";
    readonly SPECIAL_PSEUDO_CLASS_SELECTOR_ARGUMENT_INT: "Argument of special pseudo-class selector '%s' must be an integer, got '%s'";
    readonly SPECIAL_PSEUDO_CLASS_SELECTOR_ARGUMENT_POSITIVE: "Argument of special pseudo-class selector '%s' must be a positive integer, got '%s'";
    readonly SPECIAL_PSEUDO_CLASS_SELECTOR_NOT_SUPPORTED: "Special pseudo-class selector '%s' is not supported in conversion";
};
/**
 * HTML filtering rule converter class.
 *
 * @todo Implement `convertToUbo` (ABP currently doesn't support HTML filtering rules).
 */
export declare class HtmlRuleConverter extends RuleConverterBase {
    /**
     * Converts a HTML rule to AdGuard syntax, if possible.
     * Also can be used to convert AdGuard rules to AdGuard syntax to validate them.
     *
     * @param rule Rule node to convert.
     *
     * @returns An object which follows the {@link NodeConversionResult} interface. Its `result` property contains
     * the array of converted rule nodes, and its `isConverted` flag indicates whether the original rule was converted.
     * If the rule was not converted, the result array will contain the original node with the same object reference.
     *
     * @throws If the rule is invalid or cannot be converted.
     */
    static convertToAdg(rule: HtmlFilteringRule): NodeConversionResult<HtmlFilteringRule>;
    /**
     * Converts a HTML rule to uBlock syntax, if possible.
     * Also can be used to convert uBlock rules to uBlock syntax to validate them.
     *
     * @param rule Rule node to convert.
     *
     * @returns An object which follows the {@link NodeConversionResult} interface. Its `result` property contains
     * the array of converted rule nodes, and its `isConverted` flag indicates whether the original rule was converted.
     * If the rule was not converted, the result array will contain the original node with the same object reference.
     *
     * @throws Error if the rule is invalid or cannot be converted.
     */
    static convertToUbo(rule: HtmlFilteringRule): NodeConversionResult<HtmlFilteringRule>;
    /**
     * Handles special attribute selectors during AdGuard to AdGuard conversion:
     * - `[tag-content="content"]` -> `:contains(content)`
     *   direct conversion, no changes to value
     * - `[wildcard="*content*"]` -> `:contains(/*.content*./s)`
     *   convert search pattern to regular expression
     * - `[min-length="min"]` -> `:contains(/^(?=.{min,}$).*\/s)`
     *   converts to a length-matching regular expression.
     * - `[max-length="max"]` -> `:contains(/^(?=.{0,max}$).*\/s)`
     *   converts to a length-matching regular expression.
     *
     * Note: This attribute selector to pseudo-class selector conversion
     * is needed because AdGuard special attribute selectors are going
     * to be deprecated and removed soon.
     *
     * @param name Name of the special attribute selector.
     * @param value Value of the special attribute selector.
     *
     * @returns A {@link SimpleSelector} to add to the current complex selector.
     */
    private static convertSpecialAttributeSelectorAdgToAdg;
    /**
     * Since special pseudo-class selectors do not need conversion
     * in AdGuard to AdGuard conversion, we simply return `true` to keep them as-is.
     *
     * @param name Name of the special pseudo-class selector.
     *
     * @returns `true` to keep the special pseudo-class selector as-is.
     *
     * @throws Rule conversion error for mixed syntax.
     */
    private static convertSpecialPseudoClassSelectorAdgToAdg;
    /**
     * Since special attribute selectors only AdGuard-specific,
     * we should never encounter them in uBlock rules.
     *
     * @throws Rule conversion error for mixed syntax.
     */
    private static convertSpecialAttributeSelectorUboToAdg;
    /**
     * Handles special pseudo-class selectors during uBlock to AdGuard conversion:
     * - `:has-text(text)` -> `:contains(text)`
     *   direct conversion, no changes to argument
     * - `:min-text-length(min)` -> `:contains(/^(?=.{min,MAX_CONVERSION_DEFAULT}$).*\/s)`
     *   converts to a length-matching regular expression.
     *
     * @param name Name of the special pseudo-class selector.
     * @param argument Argument of the special pseudo-class selector.
     *
     * @returns A {@link SimpleSelector} to add to the current complex selector.
     *
     * @throws If AdGuard-specific pseudo-class selector is found in uBlock rule.
     */
    private static convertSpecialPseudoClassSelectorUboToAdg;
    /**
     * Handles special attribute selectors during AdGuard to uBlock conversion:
     * - `[tag-content="content"]` -> `:has-text(content)`
     *   direct conversion, no changes to value
     * - `[wildcard="*content*"]` -> `:has-text(/*.content*./s)`
     *   convert search pattern to regular expression
     * - `[min-length="min"]` -> `:min-text-length(min)`
     *   direct conversion, no changes to value
     * - `[max-length]` is skipped.
     *
     * @param name Name of the special attribute selector.
     * @param value Value of the special attribute selector.
     *
     * @returns A {@link SimpleSelector} to add to the current complex selector, or `false` to skip it.
     */
    private static convertSpecialAttributeSelectorAdgToUbo;
    /**
     * Handles special pseudo-class selectors during AdGuard to uBlock conversion:
     * - `:contains(text)` -> `:has-text(text)`
     *   direct conversion, no changes to argument.
     *
     * @param name Name of the special pseudo-class selector.
     * @param argument Argument of the special pseudo-class selector.
     *
     * @returns A {@link SimpleSelector} to add to the current complex selector.
     *
     * @throws If uBlock-specific pseudo-class selector is found in AdGuard rule.
     */
    private static convertSpecialPseudoClassSelectorAdgToUbo;
    /**
     * Pre-scans a complex selector's child selectors
     * for {@link AdgAttributeSelectors.MinLength}
     * and {@link AdgAttributeSelectors.MaxLength} attribute selectors.
     *
     * Resolves duplicates to the most *restrictive* value:
     * - for multiple `[min-length]` selectors, the largest value is selected;
     * - for multiple `[max-length]` selectors, the smallest value is selected.
     *
     * Logs a warning when duplicate length selectors are found.
     *
     * @param selectors Child selectors of a complex selector to scan.
     *
     * @returns Resolved length constraints,
     * or `null` if no length selectors were found.
     */
    private static collectLengthConstraints;
    /**
     * Converts a HTML filtering rule body by handling special simple selectors via callbacks.
     * Special simple selectors are skipped in the converted selector list and should be handled from callee.
     *
     * @param body HTML filtering rule body to convert.
     * @param parser HTML filtering rule body parser used for parsing raw value bodies.
     * @param generator HTML filtering rule body generator used for generating raw value bodies.
     * @param onSpecialAttributeSelector Callback invoked when a special attribute selector is found.
     * @param onSpecialPseudoClassSelector Callback invoked when a special pseudo-class selector is found.
     * @param shouldMergeLengthSelectors If true, `[min-length]` and `[max-length]` attribute
     * selectors within the same complex selector are merged into a single `:contains()` pseudo-class.
     * Defaults to `false`.
     *
     * @returns Converted selector list without special simple selectors.
     */
    private static convertBody;
    /**
     * Clones a simple selector or selector combinator node.
     *
     * @param selector Simple selector or selector combinator node to clone.
     *
     * @returns Cloned simple selector or selector combinator node.
     */
    private static cloneSelector;
    /**
     * Creates a CSS pseudo-class selector node.
     *
     * @param name The name of the pseudo-class selector.
     * @param argument Optional argument of the pseudo-class selector.
     *
     * @returns CSS pseudo-class selector node.
     */
    private static getPseudoClassSelectorNode;
    /**
     * Asserts that the given array is not empty.
     *
     * @param array Array to check.
     * @param errorMessage Error message to use if the array is empty.
     *
     * @throws If the array is empty.
     */
    private static assertNotEmpty;
    /**
     * Asserts that the given special attribute / pseudo-class length value is valid.
     *
     * @param name Name of the attribute or pseudo-class.
     * @param value Value to parse.
     * @param notIntErrorMessage Error message when the value is not an integer.
     * @param notPositiveErrorMessage Error message when the value is not positive.
     *
     * @throws If the value is not a valid number or not positive.
     */
    private static assertValidLengthValue;
}
