@vivliostyle/core
Version:
Vivliostyle Core library for HTML+CSS typesetting with EPUB/Web publications support
593 lines (592 loc) • 16.9 kB
TypeScript
/**
* 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 Exprs - `-epubx-expr` Adaptive Layout expressions.
*/
import * as Base from "./base";
export declare type Preferences = {
fontFamily: string;
lineHeight: number;
margin: number;
hyphenate: boolean;
columnWidth: number;
horizontal: boolean;
nightMode: boolean;
spreadView: boolean;
pageBorder: number;
enabledMediaTypes: {
[key: string]: boolean;
};
defaultPaperSize?: {
[key: string]: number;
};
};
export declare function defaultPreferences(): Preferences;
export declare function clonePreferences(pref: Preferences): Preferences;
export declare const defaultPreferencesInstance: Preferences;
interface Pending {
}
declare type Special = Pending;
/**
* Special marker value that indicates that the expression result is being
* calculated.
*/
export declare const Special: {
PENDING: Pending;
};
export declare type Result = string | number | boolean | undefined;
export declare type PendingResult = Special | Result;
export declare function letterbox(viewW: number, viewH: number, objW: number, objH: number): string;
/**
* @return string that can be parsed as CSS string with value str
*/
export declare function cssString(str: string): string;
/**
* @return string that can be parsed as CSS name
*/
export declare function cssIdent(name: string): string;
export declare function makeQualifiedName(objName: string | null, memberName: string): string;
export declare let nextKeyIndex: number;
/**
* Lexical scope of the expression.
*/
export declare class LexicalScope {
parent: LexicalScope;
resolver?: (p1: string, p2: boolean) => Val;
scopeKey: string;
children: LexicalScope[];
zero: Const;
one: Const;
_true: Const;
_false: Const;
values: {
[key: string]: Val;
};
funcs: {
[key: string]: Val;
};
builtIns: {
[key: string]: (...p1: Result[]) => Result;
};
constructor(parent: LexicalScope, resolver?: (p1: string, p2: boolean) => Val);
defineBuiltInName(name: string, fn: () => Result): void;
defineName(qualifiedName: string, val: Val): void;
defineFunc(qualifiedName: string, val: Val): void;
defineBuiltIn(qualifiedName: string, fn: (...p1: Result[]) => Result): void;
}
export declare function isAbsoluteLengthUnit(unit: string): boolean;
export declare function isViewportRelativeLengthUnit(unit: string): boolean;
export declare function isFontRelativeLengthUnit(unit: string): boolean;
export declare const defaultUnitSizes: {
[key: string]: number;
};
/**
* Returns if a unit should be converted to px before applied to the raw DOM.
*/
export declare function needUnitConversion(unit: string): boolean;
export declare type ScopeContext = {
[key: string]: Result;
};
/**
* Run-time instance of a scope and its children.
*/
export declare class Context {
readonly rootScope: LexicalScope;
readonly viewportWidth: number;
readonly viewportHeight: number;
protected actualPageWidth: number | null;
pageWidth: () => number;
protected actualPageHeight: number | null;
pageHeight: () => number;
initialFontSize: number;
rootFontSize: number | null;
fontSize: () => number;
pref: Preferences;
scopes: {
[key: string]: ScopeContext;
};
pageAreaWidth: number | null;
pageAreaHeight: number | null;
pageVertical: boolean | null;
pubTitle: string | null;
docTitle: string | null;
constructor(rootScope: LexicalScope, viewportWidth: number, viewportHeight: number, fontSize: number);
private getScopeContext;
clearScope(scope: LexicalScope): void;
queryUnitSize(unit: string, isRoot: boolean): number;
evalName(scope: LexicalScope, qualifiedName: string): Val;
/**
* @param noBuiltInEval don't evaluate built-ins (for dependency calculations)
*/
evalCall(scope: LexicalScope, qualifiedName: string, params: Val[], noBuiltInEval: boolean): Val;
evalMediaName(name: string, not: boolean): boolean;
evalMediaTest(feature: string, value: Val): boolean;
queryVal(scope: LexicalScope, key: string): Result | undefined;
storeVal(scope: LexicalScope, key: string, val: Result): void;
}
export declare type DependencyCache = {
[key: string]: boolean | Special;
};
export declare class Val {
scope: LexicalScope;
key: string;
constructor(scope: LexicalScope);
/**
* @override
*/
toString(): string;
appendTo(buf: Base.StringBuffer, priority: number): void;
protected evaluateCore(context: Context): Result;
expand(context: Context, params: Val[]): Val;
dependCore(other: Val, context: Context, dependencyCache: DependencyCache): boolean;
dependOuter(other: Val, context: Context, dependencyCache: DependencyCache): boolean;
depend(other: Val, context: Context): boolean;
evaluate(context: Context): Result;
isMediaName(): boolean;
}
export declare class Prefix extends Val {
val: Val;
constructor(scope: LexicalScope, val: Val);
protected getOp(): string;
evalPrefix(val: Result): Result;
/**
* @override
*/
evaluateCore(context: Context): Result;
/**
* @override
*/
dependCore(other: Val, context: Context, dependencyCache: DependencyCache): boolean;
/**
* @override
*/
appendTo(buf: Base.StringBuffer, priority: number): void;
/**
* @override
*/
expand(context: Context, params: Val[]): Val;
}
export declare class Infix extends Val {
lhs: Val;
rhs: Val;
constructor(scope: LexicalScope, lhs: Val, rhs: Val);
getPriority(): number;
getOp(): string;
evalInfix(lhs: Result, rhs: Result): Result;
/**
* @override
*/
evaluateCore(context: Context): Result;
/**
* @override
*/
dependCore(other: Val, context: Context, dependencyCache: DependencyCache): boolean;
/**
* @override
*/
appendTo(buf: Base.StringBuffer, priority: number): void;
/**
* @override
*/
expand(context: Context, params: Val[]): Val;
}
export declare class Logical extends Infix {
constructor(scope: LexicalScope, lhs: Val, rhs: Val);
/**
* @override
*/
getPriority(): number;
}
export declare class Comparison extends Infix {
constructor(scope: LexicalScope, lhs: Val, rhs: Val);
/**
* @override
*/
getPriority(): number;
}
export declare class Additive extends Infix {
constructor(scope: LexicalScope, lhs: Val, rhs: Val);
/**
* @override
*/
getPriority(): number;
}
export declare class Multiplicative extends Infix {
constructor(scope: LexicalScope, lhs: Val, rhs: Val);
/**
* @override
*/
getPriority(): number;
}
export declare class Not extends Prefix {
constructor(scope: LexicalScope, val: Val);
/**
* @override
*/
getOp(): string;
/**
* @override
*/
evalPrefix(val: Result): Result;
}
export declare class Negate extends Prefix {
constructor(scope: LexicalScope, val: Val);
/**
* @override
*/
getOp(): string;
/**
* @override
*/
evalPrefix(val: Result): Result;
}
export declare class And extends Logical {
constructor(scope: LexicalScope, lhs: Val, rhs: Val);
/**
* @override
*/
getOp(): string;
/**
* @override
*/
evaluateCore(context: Context): Result;
}
export declare class AndMedia extends And {
constructor(scope: LexicalScope, lhs: Val, rhs: Val);
/**
* @override
*/
getOp(): string;
}
export declare class Or extends Logical {
constructor(scope: LexicalScope, lhs: Val, rhs: Val);
/**
* @override
*/
getOp(): string;
/**
* @override
*/
evaluateCore(context: Context): Result;
}
export declare class OrMedia extends Or {
constructor(scope: LexicalScope, lhs: Val, rhs: Val);
/**
* @override
*/
getOp(): string;
}
export declare class Lt extends Comparison {
constructor(scope: LexicalScope, lhs: Val, rhs: Val);
/**
* @override
*/
getOp(): string;
/**
* @override
*/
evalInfix(lhs: Result, rhs: Result): Result;
}
export declare class Le extends Comparison {
constructor(scope: LexicalScope, lhs: Val, rhs: Val);
/**
* @override
*/
getOp(): string;
/**
* @override
*/
evalInfix(lhs: Result, rhs: Result): Result;
}
export declare class Gt extends Comparison {
constructor(scope: LexicalScope, lhs: Val, rhs: Val);
/**
* @override
*/
getOp(): string;
/**
* @override
*/
evalInfix(lhs: Result, rhs: Result): Result;
}
export declare class Ge extends Comparison {
constructor(scope: LexicalScope, lhs: Val, rhs: Val);
/**
* @override
*/
getOp(): string;
/**
* @override
*/
evalInfix(lhs: Result, rhs: Result): Result;
}
export declare class Eq extends Comparison {
constructor(scope: LexicalScope, lhs: Val, rhs: Val);
/**
* @override
*/
getOp(): string;
/**
* @override
*/
evalInfix(lhs: Result, rhs: Result): Result;
}
export declare class Ne extends Comparison {
constructor(scope: LexicalScope, lhs: Val, rhs: Val);
/**
* @override
*/
getOp(): string;
/**
* @override
*/
evalInfix(lhs: Result, rhs: Result): Result;
}
export declare class Add extends Additive {
constructor(scope: LexicalScope, lhs: Val, rhs: Val);
/**
* @override
*/
getOp(): string;
/**
* @override
*/
evalInfix(lhs: Result, rhs: Result): Result;
}
export declare class Subtract extends Additive {
constructor(scope: LexicalScope, lhs: Val, rhs: Val);
/**
* @override
*/
getOp(): string;
/**
* @override
*/
evalInfix(lhs: Result, rhs: Result): Result;
}
export declare class Multiply extends Multiplicative {
constructor(scope: LexicalScope, lhs: Val, rhs: Val);
/**
* @override
*/
getOp(): string;
/**
* @override
*/
evalInfix(lhs: Result, rhs: Result): Result;
}
export declare class Divide extends Multiplicative {
constructor(scope: LexicalScope, lhs: Val, rhs: Val);
/**
* @override
*/
getOp(): string;
/**
* @override
*/
evalInfix(lhs: Result, rhs: Result): Result;
}
export declare class Modulo extends Multiplicative {
constructor(scope: LexicalScope, lhs: Val, rhs: Val);
/**
* @override
*/
getOp(): string;
/**
* @override
*/
evalInfix(lhs: Result, rhs: Result): Result;
}
/**
* Numerical value with a unit.
*/
export declare class Numeric extends Val {
num: number;
unit: string;
constructor(scope: LexicalScope, num: number, unit: string);
/**
* @override
*/
appendTo(buf: Base.StringBuffer, priority: number): void;
/**
* @override
*/
evaluateCore(context: Context): Result;
}
/**
* Named value.
* @param qualifiedName CSS-escaped name sequence separated by dots.
*/
export declare class Named extends Val {
qualifiedName: string;
constructor(scope: LexicalScope, qualifiedName: string);
/**
* @override
*/
appendTo(buf: Base.StringBuffer, priority: number): void;
/**
* @override
*/
evaluateCore(context: Context): Result;
/**
* @override
*/
dependCore(other: Val, context: Context, dependencyCache: DependencyCache): boolean;
}
/**
* Named value.
*/
export declare class MediaName extends Val {
not: boolean;
name: string;
value: Val;
constructor(scope: LexicalScope, not: boolean, name: string);
/**
* @override
*/
appendTo(buf: Base.StringBuffer, priority: number): void;
/**
* @override
*/
evaluateCore(context: Context): Result;
/**
* @override
*/
dependCore(other: Val, context: Context, dependencyCache: DependencyCache): boolean;
/**
* @override
*/
isMediaName(): boolean;
}
/**
* A value that is calculated by calling a JavaScript function. Note that the
* result is cached and this function will be called only once between any
* clears for its scope in the context.
* @param fn function to call.
* @param str a way to represent this value in toString() call.
*/
export declare class Native extends Val {
fn: () => Result;
str: string;
constructor(scope: LexicalScope, fn: () => Result, str: string);
/**
* @override
*/
appendTo(buf: Base.StringBuffer, priority: number): void;
/**
* @override
*/
evaluateCore(context: Context): Result;
}
export declare function appendValArray(buf: Base.StringBuffer, arr: Val[]): void;
export declare function expandValArray(context: Context, arr: Val[], params: Val[]): Val[];
export declare function evalValArray(context: Context, arr: Val[]): Result[];
export declare class Call extends Val {
qualifiedName: string;
params: Val[];
constructor(scope: LexicalScope, qualifiedName: string, params: Val[]);
/**
* @override
*/
appendTo(buf: Base.StringBuffer, priority: number): void;
/**
* @override
*/
evaluateCore(context: Context): Result;
/**
* @override
*/
dependCore(other: Val, context: Context, dependencyCache: DependencyCache): boolean;
/**
* @override
*/
expand(context: Context, params: Val[]): Val;
}
export declare class Cond extends Val {
cond: Val;
ifTrue: Val;
ifFalse: Val;
constructor(scope: LexicalScope, cond: Val, ifTrue: Val, ifFalse: Val);
/**
* @override
*/
appendTo(buf: Base.StringBuffer, priority: number): void;
/**
* @override
*/
evaluateCore(context: Context): Result;
/**
* @override
*/
dependCore(other: Val, context: Context, dependencyCache: DependencyCache): boolean;
/**
* @override
*/
expand(context: Context, params: Val[]): Val;
}
export declare class Const extends Val {
val: Result;
constructor(scope: LexicalScope, val: Result);
/**
* @override
*/
appendTo(buf: Base.StringBuffer, priority: number): void;
/**
* @override
*/
evaluateCore(context: Context): Result;
}
export declare class MediaTest extends Val {
name: MediaName;
value: Val;
constructor(scope: LexicalScope, name: MediaName, value: Val);
/**
* @override
*/
appendTo(buf: Base.StringBuffer, priority: number): void;
/**
* @override
*/
evaluateCore(context: Context): Result;
/**
* @override
*/
dependCore(other: Val, context: Context, dependencyCache: DependencyCache): boolean;
/**
* @override
*/
expand(context: Context, params: Val[]): Val;
}
export declare class Param extends Val {
index: number;
constructor(scope: LexicalScope, index: number);
/**
* @override
*/
appendTo(buf: Base.StringBuffer, priority: number): void;
/**
* @override
*/
expand(context: Context, params: Val[]): Val;
}
export declare function and(scope: LexicalScope, v1: Val, v2: Val): Val;
export declare function add(scope: LexicalScope, v1: Val, v2: Val): Val;
export declare function sub(scope: LexicalScope, v1: Val, v2: Val): Val;
export declare function mul(scope: LexicalScope, v1: Val, v2: Val): Val;
export declare function div(scope: LexicalScope, v1: Val, v2: Val): Val;
export {};