UNPKG

@vivliostyle/core

Version:

Vivliostyle Core library for HTML+CSS typesetting with EPUB/Web publications support

481 lines (480 loc) 13.5 kB
/** * Copyright 2013 Google, Inc. * Copyright 2015 Trim-marks Inc. * Copyright 2019 Vivliostyle Foundation * * Vivliostyle.js is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Vivliostyle.js is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>. * * @fileoverview CssValidator - Parse validation rules (validation.txt), validate * properties and shorthands. */ import * as Css from "./css"; export interface PropertyReceiver { unknownProperty(name: string, value: Css.Val): void; invalidPropertyValue(name: string, value: Css.Val): void; simpleProperty(name: string, value: Css.Val, important: any): void; } export declare class Node { validator: PropertyValidator; success: Node; failure: Node; code: number; constructor(validator: PropertyValidator); isSpecial(): boolean; markAsStartGroup(): void; isStartGroup(): boolean; markAsEndGroup(): void; isEndGroup(): boolean; markAsStartAlternate(index: number): void; isStartAlternate(): boolean; markAsEndAlternate(index: number): void; isEndAlternate(): boolean; getAlternate(): number; } export declare class Connection { where: number; success: boolean; what: number; constructor(where: number, success: boolean); } /** * @enum {number} */ export declare enum Add { FOLLOW = 1, OPTIONAL = 2, REPEATED = 3, ALTERNATE = 4 } /** * A class to build a list validator from other validators. */ export declare class ValidatingGroup { nodes: Node[]; connections: Connection[]; match: number[]; nomatch: number[]; error: number[]; emptyHead: boolean; connect(arr: number[], nodeIndex: number): void; clone(): ValidatingGroup; /** * Add "special" validation node to a given array (match, nomatch, or error). * @param start if this a start or the end of a clause/group * @param clause 0 indicates group start/end, otherwise clause index */ private addSpecialToArr; endSpecialGroup(): void; startSpecialGroup(): void; endClause(clause: number): void; startClause(clause: number): void; addPrimitive(validator: PropertyValidator): void; isSimple(): boolean; isPrimitive(): boolean; addGroup(group: ValidatingGroup, how: Add): void; /** * @return how */ finish(successTerminal: Node, failTerminal: Node): Node; } export declare const ALLOW_EMPTY = 1; export declare const ALLOW_STR = 2; export declare const ALLOW_IDENT = 4; export declare const ALLOW_POS_NUMERIC = 8; export declare const ALLOW_POS_NUM = 16; export declare const ALLOW_POS_INT = 32; export declare const ALLOW_COLOR = 64; export declare const ALLOW_URL = 128; export declare const ALLOW_NEGATIVE = 256; export declare const ALLOW_ZERO = 512; export declare const ALLOW_ZERO_PERCENT = 1024; export declare const ALLOW_SLASH = 2048; export declare type ValueMap = { [key: string]: Css.Val; }; /** * Abstract class to validate simple CSS property value (not a shorthand) */ export declare class PropertyValidator extends Css.Visitor { constructor(); /** * Validate a subsequence of the given values from the given index. Return the * list of matched values or null if there is no match. */ validateForShorthand(values: Css.Val[], index: number): Css.Val[]; } /** * Validate a primitive CSS value (not a list or function). * @param allowed mask of ALLOW_*** constants. */ export declare class PrimitiveValidator extends PropertyValidator { readonly allowed: number; readonly idents: ValueMap; readonly units: ValueMap; constructor(allowed: number, idents: ValueMap, units: ValueMap); /** * @override */ visitEmpty(empty: Css.Val): Css.Val; /** * @override */ visitSlash(slash: Css.Val): Css.Val; /** * @override */ visitStr(str: Css.Str): Css.Val; /** * @override */ visitIdent(ident: Css.Ident): Css.Val; /** * @override */ visitNumeric(numeric: Css.Numeric): Css.Val; /** * @override */ visitNum(num: Css.Num): Css.Val; /** * @override */ visitInt(num: Css.Int): Css.Val; /** * @override */ visitColor(color: Css.Color): Css.Val; /** * @override */ visitURL(url: Css.URL): Css.Val; /** * @override */ visitSpaceList(list: Css.SpaceList): Css.Val; /** * @override */ visitCommaList(list: Css.CommaList): Css.Val; /** * @override */ visitFunc(func: Css.Func): Css.Val; /** * @override */ visitExpr(expr: Css.Expr): Css.Val; combine(other: PrimitiveValidator): PrimitiveValidator; } export declare const ALWAYS_FAIL: PrimitiveValidator; /** * Base class for list validation. */ export declare class ListValidator extends PropertyValidator { successTerminal: Node; failureTerminal: Node; first: Node; constructor(group: ValidatingGroup); validateList(arr: Css.Val[], slice: boolean, startIndex: number): Css.Val[]; validateSingle(inval: Css.Val): Css.Val; /** * @override */ visitEmpty(empty: Css.Val): Css.Val; /** * @override */ visitSlash(slash: Css.Val): Css.Val; /** * @override */ visitStr(str: Css.Str): Css.Val; /** * @override */ visitIdent(ident: Css.Ident): Css.Val; /** * @override */ visitNumeric(numeric: Css.Numeric): Css.Val; /** * @override */ visitNum(num: Css.Num): Css.Val; /** * @override */ visitInt(num: Css.Int): Css.Val; /** * @override */ visitColor(color: Css.Color): Css.Val; /** * @override */ visitURL(url: Css.URL): Css.Val; /** * @override */ visitSpaceList(list: Css.SpaceList): Css.Val; /** * @override */ visitCommaList(list: Css.CommaList): Css.Val; /** * @override */ visitFunc(func: Css.Func): Css.Val; /** * @override */ visitExpr(expr: Css.Expr): Css.Val; } export declare class SpaceListValidator extends ListValidator { constructor(group: ValidatingGroup); /** * @override */ visitSpaceList(list: Css.SpaceList): Css.Val; /** * @override */ visitCommaList(list: Css.CommaList): Css.Val; /** * @override */ validateForShorthand(values: Css.Val[], index: number): Css.Val[]; } export declare class CommaListValidator extends ListValidator { constructor(group: ValidatingGroup); /** * @override */ visitSpaceList(list: Css.SpaceList): Css.Val; /** * @override */ visitCommaList(list: Css.CommaList): Css.Val; /** * @override */ validateForShorthand(values: Css.Val[], index: number): Css.Val[]; } export declare class FuncValidator extends ListValidator { readonly name: string; constructor(name: string, group: ValidatingGroup); /** * @override */ validateSingle(inval: Css.Val): Css.Val; /** * @override */ visitFunc(func: Css.Func): Css.Val; } export declare class ShorthandSyntaxNode { /** * @return new index. */ tryParse(values: Css.Val[], index: number, shorthandValidator: ShorthandValidator): number; success(rval: Css.Val, shorthandValidator: ShorthandValidator): void; } export declare class ShorthandSyntaxProperty extends ShorthandSyntaxNode { readonly name: string; validator: PropertyValidator; constructor(validatorSet: ValidatorSet, name: string); /** * @override */ tryParse(values: Css.Val[], index: number, shorthandValidator: ShorthandValidator): number; /** * @override */ success(rval: Css.Val, shorthandValidator: ShorthandValidator): void; } export declare class ShorthandSyntaxPropertyN extends ShorthandSyntaxProperty { readonly names: string[]; constructor(validatorSet: ValidatorSet, names: string[]); /** * @override */ success(rval: Css.Val, shorthandValidator: ShorthandValidator): void; } export declare class ShorthandSyntaxCompound extends ShorthandSyntaxNode { readonly nodes: ShorthandSyntaxNode[]; readonly slash: boolean; constructor(nodes: ShorthandSyntaxNode[], slash: boolean); /** * @override */ tryParse(values: Css.Val[], index: number, shorthandValidator: ShorthandValidator): number; } export declare class ShorthandValidator extends Css.Visitor { syntax: ShorthandSyntaxNode[]; propList: string[]; error: boolean; values: ValueMap; validatorSet: ValidatorSet; setOwner(validatorSet: ValidatorSet): void; syntaxNodeForProperty(name: string): ShorthandSyntaxNode; clone(): this; init(syntax: ShorthandSyntaxNode[], propList: string[]): void; finish(important: boolean, receiver: PropertyReceiver): boolean; propagateInherit(important: boolean, receiver: PropertyReceiver): void; validateList(list: Css.Val[]): number; validateSingle(val: Css.Val): Css.Val; /** * @override */ visitEmpty(empty: Css.Val): Css.Val; /** * @override */ visitStr(str: Css.Str): Css.Val; /** * @override */ visitIdent(ident: Css.Ident): Css.Val; /** * @override */ visitNumeric(numeric: Css.Numeric): Css.Val; /** * @override */ visitNum(num: Css.Num): Css.Val; /** * @override */ visitInt(num: Css.Int): Css.Val; /** * @override */ visitColor(color: Css.Color): Css.Val; /** * @override */ visitURL(url: Css.URL): Css.Val; /** * @override */ visitSpaceList(list: Css.SpaceList): Css.Val; /** * @override */ visitCommaList(list: Css.CommaList): Css.Val; /** * @override */ visitFunc(func: Css.Func): Css.Val; /** * @override */ visitExpr(expr: Css.Expr): Css.Val; } export declare class SimpleShorthandValidator extends ShorthandValidator { constructor(); /** * @override */ validateList(list: Css.Val[]): number; } export declare class InsetsShorthandValidator extends ShorthandValidator { constructor(); /** * @override */ validateList(list: Css.Val[]): number; createSyntaxNode(): ShorthandSyntaxPropertyN; } export declare class InsetsSlashShorthandValidator extends ShorthandValidator { constructor(); /** * @override */ validateList(list: Css.Val[]): number; } export declare class CommaShorthandValidator extends SimpleShorthandValidator { constructor(); mergeIn(acc: { [key: string]: Css.Val[]; }, values: ValueMap): void; /** * @override */ visitCommaList(list: Css.CommaList): Css.Val; } export declare class FontShorthandValidator extends SimpleShorthandValidator { constructor(); /** * @override */ init(syntax: ShorthandSyntaxNode[], propList: string[]): void; /** * @override */ validateList(list: Css.Val[]): number; /** * @override */ visitCommaList(list: Css.CommaList): Css.Val; /** * @override */ visitIdent(ident: Css.Ident): Css.Val; } export declare const shorthandValidators: { [key: string]: typeof ShorthandValidator; }; /** * Object that validates simple and shorthand properties, breaking up shorthand * properties into corresponding simple ones, also stripping property prefixes. */ export declare class ValidatorSet { validators: { [key: string]: PropertyValidator; }; prefixes: { [key: string]: { [key: string]: boolean; }; }; defaultValues: ValueMap; namedValidators: { [key: string]: ValidatingGroup; }; systemFonts: { [key: string]: ValueMap; }; shorthands: { [key: string]: ShorthandValidator; }; layoutProps: ValueMap; backgroundProps: ValueMap; private addReplacement; private newGroup; private addCounts; private primitive; private newFunc; initBuiltInValidators(): void; private isBuiltIn; private readNameAndPrefixes; private parseValidators; private parseDefaults; private parseShorthands; parse(text: string): void; makePropSet(propList: string[]): ValueMap; validatePropertyAndHandleShorthand(name: string, value: Css.Val, important: boolean, receiver: PropertyReceiver): void; } export declare function baseValidatorSet(): ValidatorSet;