interface Selector {
  value: string;
  selectorStarts: number;
  selectorEnds: number;
}
type TokenType = "text" | "tag" | "rule" | "at" | "comment" | "esp";
type TokenKind = "simplet" | "not" | "doctype" | "cdata" | "xml" | "inline";
type CommentKind = "simple" | "only" | "not" | "block" | "line" | "simplet";
interface TextToken {
  type: "text";
  start: number;
  end: number;
  value: string;
}
interface CommentToken {
  type: "comment";
  start: number;
  end: number;
  value: string;
  closing: null | boolean;
  kind: CommentKind;
  language: "html" | "css";
}
interface EspToken {
  type: "esp";
  start: number;
  end: number;
  value: string;
  head: null | string;
  headStartsAt: null | number;
  headEndsAt: null | number;
  tail: null | string;
  tailStartsAt: null | number;
  tailEndsAt: null | number;
}
type PropertyValueWithinArray = TextToken | EspToken;
interface Property {
  property: null | string;
  propertyStarts: null | number;
  propertyEnds: null | number;
  colon: null | number;
  value: string | PropertyValueWithinArray[];
  valueStarts: null | number;
  valueEnds: null | number;
  importantStarts: null | number;
  importantEnds: null | number;
  important: null | string;
  semi: null | number;
  start: number;
  end: number;
}
interface Attrib {
  attribName: string;
  attribNameRecognised: boolean;
  attribNameStartsAt: number;
  attribNameEndsAt: number;
  attribOpeningQuoteAt: null | number;
  attribClosingQuoteAt: null | number;
  attribValueRaw: string;
  attribValue: (TextToken | Property | CommentToken | EspToken)[];
  attribValueStartsAt: null | number;
  attribValueEndsAt: null | number;
  attribStarts: number;
  attribEnds: number;
  attribLeft: number;
}
interface RuleToken {
  type: "rule";
  start: number;
  end: number;
  value: string;
  left: null | number;
  nested: null | boolean;
  openingCurlyAt: null | number;
  closingCurlyAt: null | number;
  selectorsStart: null | number;
  selectorsEnd: null | number;
  selectors: Selector[];
  properties: (Property | TextToken)[];
}
interface TagToken {
  type: "tag";
  start: number;
  end: number;
  value: string;
  tagNameStartsAt: number;
  tagNameEndsAt: number;
  tagName: string;
  recognised: null | boolean;
  closing: null | boolean;
  void: null | boolean;
  pureHTML: null | boolean;
  kind: null | TokenKind;
  attribs: Attrib[];
}
interface AtToken {
  type: "at";
  start: number;
  end: number;
  value: string;
  left: null | number;
  nested: null | false;
  identifier: null | string;
  identifierStartsAt: null | number;
  identifierEndsAt: null | number;
  query: string;
  queryStartsAt: number;
  queryEndsAt: number;
  openingCurlyAt: null | number;
  closingCurlyAt: null | number;
  rules: (RuleToken | TextToken)[];
}
type Token =
  | TextToken
  | TagToken
  | RuleToken
  | AtToken
  | CommentToken
  | EspToken;
interface LayerKindAt {
  type: "at";
  token: AtToken;
}
interface LayerSimple {
  type: "simple" | "block";
  value: string;
  position: number;
}
interface LayerEsp {
  type: "esp";
  openingLump: string;
  guessedClosingLump: string;
  position: number;
}
type Layer = LayerKindAt | LayerSimple | LayerEsp;
interface CharacterToken {
  chr: string;
  i: number;
  type: TokenType;
}
type TokenCb = (token: Token, next: Token[]) => void;
type CharCb = (token: CharacterToken, next: CharacterToken[]) => void;
interface Opts {
  tagCb: null | TokenCb;
  tagCbLookahead: number;
  charCb: null | CharCb;
  charCbLookahead: number;
  reportProgressFunc: null | ((percDone: number) => void);
  reportProgressFuncFrom: number;
  reportProgressFuncTo: number;
}

declare function matchLayerLast(
  wholeEspTagLump: string,
  layers: Layer[],
  matchFirstInstead?: boolean,
): undefined | number;

declare const version: string;
declare const defaults: Opts;
interface Res {
  timeTakenInMilliseconds: number;
}
/**
 * HTML and CSS lexer aimed at code with fatal errors, accepts mixed coding languages
 */
declare function tokenizer(str: string, opts?: Partial<Opts>): Res;
declare const util: {
  matchLayerLast: typeof matchLayerLast;
};

export {
  type AtToken,
  type CharCb,
  type CommentToken,
  type EspToken,
  type Opts,
  type Res,
  type RuleToken,
  type TagToken,
  type TextToken,
  defaults,
  tokenizer,
  util,
  version,
};
