blob: 14fb015443c01e97afe0edcf40d21cb97667ed35 [file] [log] [blame]
/**
* Specificity arrays always have 4 numbers (integers) for quick comparison
* comparing from left to right, the next number only has to be checked if
* two numbers of the same index are equal.
*/
export type SpecificityArray = [number, number, number, number];
/**
* A result of parsing a selector into an array of parts.
* Calculating a specificity array is a matter of summing
* over all the parts and adding the values to the right
* bucket in a specificity array.
*
* @interface Part
*/
export interface Part {
selector: string;
type: 'a' | 'b' | 'c';
index: number;
length: number;
}
/**
* Returned by the calculate function. Represents the results
* of parsing and calculating the specificity of a selector.
*
* @interface Specificity
*/
export interface Specificity {
selector: string;
specificity: string;
specificityArray: SpecificityArray;
parts: Array<Part>;
}
/**
* Calculates the specificity for the given selector string.
* If the string contains a comma, each selector will be parsed
* separately.
*
* @returns A list of specificity objects one for each selector in the
* selector string.
*/
export function calculate(selector: string): Array<Specificity>;
/**
* Compares two selectors. If a string, the string cannot contain a comma.
*
* @returns A value less than 0 if selector a is less specific than selector b.
* A value more than 0 if selector a is more specific than selector b.
* 0 if the two selectors have the same specificity.
*/
export function compare(a: string | SpecificityArray, b: string | SpecificityArray): -1 | 0 | 1;