UNPKG

2.2 MBSource Map (JSON)View Raw
1{"version":3,"file":"vivliostyle.js","sources":["../src/vivliostyle/constants.ts","../src/vivliostyle/logging.ts","../src/vivliostyle/plugin.ts","../src/vivliostyle/profile.ts","../src/vivliostyle/base.ts","../src/vivliostyle/cfi.ts","../src/vivliostyle/exprs.ts","../src/vivliostyle/css.ts","../src/vivliostyle/geometry-util.ts","../src/vivliostyle/css-prop.ts","../src/vivliostyle/counters.ts","../src/vivliostyle/css-tokenizer.ts","../src/vivliostyle/task.ts","../src/vivliostyle/task-util.ts","../src/vivliostyle/assets.ts","../src/vivliostyle/net.ts","../src/vivliostyle/css-parser.ts","../src/vivliostyle/matchers.ts","../src/vivliostyle/types.ts","../src/vivliostyle/diff.ts","../src/vivliostyle/vtree.ts","../src/vivliostyle/css-cascade.ts","../src/vivliostyle/css-logical-util.ts","../src/vivliostyle/sizing.ts","../src/vivliostyle/page-floats.ts","../src/vivliostyle/footnotes.ts","../src/vivliostyle/break.ts","../src/vivliostyle/layout-helper.ts","../src/vivliostyle/break-position.ts","../src/vivliostyle/display.ts","../src/vivliostyle/layout-processor.ts","../src/vivliostyle/layout-retryers.ts","../src/vivliostyle/layout-util.ts","../src/vivliostyle/shared.ts","../src/vivliostyle/pseudo-element.ts","../src/vivliostyle/layout.ts","../src/vivliostyle/repetitive-element.ts","../src/vivliostyle/table.ts","../src/vivliostyle/math-util.ts","../src/vivliostyle/columns.ts","../src/vivliostyle/css-validator.ts","../src/vivliostyle/css-styler.ts","../src/vivliostyle/font.ts","../src/vivliostyle/page-master.ts","../src/vivliostyle/css-page.ts","../src/vivliostyle/urls.ts","../src/vivliostyle/vgen.ts","../src/vivliostyle/xml-doc.ts","../src/vivliostyle/ops.ts","../src/vivliostyle/sha1.ts","../src/vivliostyle/toc.ts","../src/vivliostyle/epub.ts","../src/vivliostyle/adaptive-viewer.ts","../src/vivliostyle/core-viewer.ts","../src/vivliostyle/print.ts"],"sourcesContent":["/**\n * Copyright 2015 Trim-marks Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Constants\n */\n\n/**\n * Debug flag.\n */\nexport let isDebug: boolean = false;\nexport function setDebug(value: boolean): void {\n isDebug = value;\n}\n\n/**\n * Page progression direction.\n * @enum {string}\n */\nexport enum PageProgression {\n LTR = \"ltr\",\n RTL = \"rtl\",\n}\n\n/**\n * Return PageProgression corresponding to the specified string\n */\nexport function pageProgressionOf(str: string): PageProgression {\n switch (str) {\n case \"ltr\":\n return PageProgression.LTR;\n case \"rtl\":\n return PageProgression.RTL;\n default:\n throw new Error(`unknown PageProgression: ${str}`);\n }\n}\n\n/**\n * Page side (left/right).\n * @enum {string}\n */\nexport enum PageSide {\n LEFT = \"left\",\n RIGHT = \"right\",\n}\n\n/**\n * Viewer ready state.\n * @enum {string}\n */\nexport enum ReadyState {\n LOADING = \"loading\",\n INTERACTIVE = \"interactive\",\n COMPLETE = \"complete\",\n}\n","/**\n * Copyright 2015 Trim-marks Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Logging - Logging utility\n */\n\n/**\n * Log level.\n * @enum {number}\n */\nexport enum LogLevel {\n DEBUG = 1,\n INFO,\n WARN,\n ERROR,\n}\n\nexport type ErrorInfo = {\n error: Error;\n messages: any[];\n};\n\n/**\n * Class logging error, warning, information or debug messages.\n */\nexport class Logger {\n private listeners: { [key in LogLevel]?: ((p1: ErrorInfo) => void)[] } = {};\n\n constructor(private opt_console?: Console) {}\n\n private consoleDebug(msg: any[]) {\n if (this.opt_console) {\n if (this.opt_console.debug) {\n this.opt_console.debug(...msg);\n } else {\n this.opt_console.log(...msg);\n }\n } else {\n console.debug(...msg); // eslint-disable-line no-console\n }\n }\n\n private consoleInfo(msg: any[]) {\n if (this.opt_console) {\n if (this.opt_console.info) {\n this.opt_console.info(...msg);\n } else {\n this.opt_console.log(...msg);\n }\n } else {\n console.info(...msg); // eslint-disable-line no-console\n }\n }\n\n private consoleWarn(msg: any[]) {\n if (this.opt_console) {\n if (this.opt_console.warn) {\n this.opt_console.warn(...msg);\n } else {\n this.opt_console.log(...msg);\n }\n } else {\n console.warn(...msg); // eslint-disable-line no-console\n }\n }\n\n private consoleError(msg: any[]) {\n if (this.opt_console) {\n if (this.opt_console.error) {\n this.opt_console.error(...msg);\n } else {\n this.opt_console.log(...msg);\n }\n } else {\n console.error(...msg); // eslint-disable-line no-console\n }\n }\n\n private triggerListeners(level: LogLevel, args: ErrorInfo) {\n const listeners = this.listeners[level];\n if (listeners) {\n listeners.forEach((listener) => {\n listener(args);\n });\n }\n }\n\n /**\n * Add a listener function invoked when a log event with the specified level\n * occurs.\n */\n addListener(level: LogLevel, listener: (p1: ErrorInfo) => void) {\n let listeners = this.listeners[level];\n if (!listeners) {\n listeners = this.listeners[level] = [];\n }\n listeners.push(listener);\n }\n\n debug(...var_args: any[]) {\n const args = argumentsToErrorInfo(arguments);\n this.consoleDebug(buildMessageAndStackTrace(args));\n this.triggerListeners(LogLevel.DEBUG, args);\n }\n\n info(...var_args: any[]) {\n const args = argumentsToErrorInfo(arguments);\n this.consoleInfo(buildMessageAndStackTrace(args));\n this.triggerListeners(LogLevel.INFO, args);\n }\n\n warn(...var_args: any[]) {\n const args = argumentsToErrorInfo(arguments);\n this.consoleWarn(buildMessageAndStackTrace(args));\n this.triggerListeners(LogLevel.WARN, args);\n }\n\n error(...var_args: any[]) {\n const args = argumentsToErrorInfo(arguments);\n this.consoleError(buildMessageAndStackTrace(args));\n this.triggerListeners(LogLevel.ERROR, args);\n }\n}\n\n/**\n * @param args\n */\nfunction argumentsToErrorInfo(args: IArguments): ErrorInfo {\n const a = Array.from(args);\n let e: Error = null;\n if (a[0] instanceof Error) {\n e = a.shift();\n }\n return { error: e, messages: a };\n}\n\nfunction buildMessageAndStackTrace(args: ErrorInfo): string[] {\n const e = args.error;\n const stack = e && (e[\"frameTrace\"] || e[\"stack\"]);\n let messages = [].concat(args[\"messages\"]);\n if (e) {\n if (messages.length > 0) {\n messages = messages.concat([\"\\n\"]);\n }\n messages = messages.concat([e[\"toString\"]()]);\n if (stack) {\n messages = messages.concat([\"\\n\"]).concat(stack);\n }\n }\n return messages;\n}\n\nexport const logger = new Logger();\n","/**\n * Copyright 2016 Trim-marks Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Plugin - Plugin mechanism\n */\nimport * as Base from \"./base\";\nimport * as Css from \"./css\";\nimport * as LayoutProcessor from \"./layout-processor\";\nimport * as Logging from \"./logging\";\nimport * as Task from \"./task\";\nimport { Layout, Vtree } from \"./types\";\n\n/**\n * Type of implemented hooks.\n * @enum {string}\n */\nexport enum HOOKS {\n /**\n * Called when a single property declaration is parsed.\n *\n * The hook is called with an object with the following properties:\n * {string} name: Property name\n * {!Css.Val} value: Property value\n * {boolean} important: Whether '!important' flag is present or not\n * Functions called by this hook are expected to return a value with the same\n * type as the above. The declaration is then replaced by the returned value.\n *\n * Note that a shorthand declaration is not directly passed to this hook.\n * After the shorthand declaration is interpreted and broken into\n * non-shorthand declarations, the hook is called for each of the\n * non-shorthand declarations.\n */\n SIMPLE_PROPERTY = \"SIMPLE_PROPERTY\",\n\n /**\n * Called when a single document (i.e. a single spine item) has been fetched,\n * before parsing.\n *\n * The hook is called with the Document object.\n */\n PREPROCESS_SINGLE_DOCUMENT = \"PREPROCESS_SINGLE_DOCUMENT\",\n\n /**\n * Called before creating a text node for modifying a text content.\n *\n * The hook is called with an object with the following properties:\n * {Vtree.NodeContext} nodeContext\n * {string} sourceTextContent\n *\n * Functions called by this hook are expected to return a\n * Task.Result.<string>. The text content is then replaced by the\n * returned value.\n */\n PREPROCESS_TEXT_CONTENT = \"PREPROCESS_TEXT_CONTENT\",\n\n /**\n * Called before creating a element for modifying a element style.\n *\n * The hook is called with an object with the following properties:\n * {Vtree.NodeContext} nodeContext\n * {!Object} style\n */\n PREPROCESS_ELEMENT_STYLE = \"PREPROCESS_ELEMENT_STYLE\",\n\n /**\n * Called before geting CssCascade.polyfilledInheritedProps.\n *\n * The hook return a array of polyfilled inherited property name.\n */\n POLYFILLED_INHERITED_PROPS = \"POLYFILLED_INHERITED_PROPS\",\n\n /**\n * Called when a Viewer is configured.\n *\n * The hook is called with an object with the following properties:\n * {Base.JSON} command\n */\n CONFIGURATION = \"CONFIGURATION\",\n\n /**\n * Called when resolving a text node breaker\n * which detects an acceptable breakpoint and break text node at this point.\n *\n * The hook is called with an object with the following properties:\n * {Vtree.NodeContext} nodeContext\n *\n * Functions called by this hook are expected to\n * return an instnce of {Layout.TextNodeBreaker} or null.\n */\n RESOLVE_TEXT_NODE_BREAKER = \"RESOLVE_TEXT_NODE_BREAKER\",\n\n /**\n * Called when resolving a formatting context.\n *\n * The hook is called with the following parameters:\n * nodeContext: a NodeContext object\n * firstTime: a boolean flag representing whether this node is encountered\n * for the first time or not display: an Css.Ident value representing\n * 'display' value of the node position: an Css.Ident value representing\n * 'position' value of the node float: an Css.Ident value representing\n * 'float' value of the node isRoot: a boolean flag representing whether this\n * node is a root (of a flow) or not Functions called by this hook are\n * expected to return a formatting context for the NodeContext.\n */\n RESOLVE_FORMATTING_CONTEXT = \"RESOLVE_FORMATTING_CONTEXT\",\n\n /**\n * Called when resolving a layout processor (LayoutProcessor) for\n * a formatting context.\n *\n * The hook is called with a formatting context\n * (Vtree.FormattingContext). Functions called by this hook are expected\n * to return a layout processor corresponding to the formatting context.\n */\n RESOLVE_LAYOUT_PROCESSOR = \"RESOLVE_LAYOUT_PROCESSOR\",\n\n /**\n * Called after laid out a block contents.\n *\n * The hook is called with an object with the following properties:\n * {Vtree.NodeContext} nodeContext\n * {Array.<Vtree.NodeContext>} checkPoints\n * {Layout.Column} column\n */\n POST_LAYOUT_BLOCK = \"POST_LAYOUT_BLOCK\",\n}\n\nexport type PreProcessSingleDocumentHook = (p1: Document) => any;\n\nexport type PreProcessTextContentHook = (\n p1: Vtree.NodeContext,\n p2: string,\n) => Task.Result<string>;\n\nexport type PreProcessElementStyleHook = (\n p1: Vtree.NodeContext,\n p2: object,\n) => void;\n\nexport type PolyfilledInheritedPropsHook = () => string[];\n\nexport type ConfigurationHook = (\n p1: Base.JSON,\n) => {\n needResize: boolean | null | undefined;\n needRefresh: boolean | null | undefined;\n};\n\nexport type ResolveTextNodeBreakerHook = (\n p1: Vtree.NodeContext,\n) => Layout.TextNodeBreaker;\n\nexport type ResolveFormattingContextHook = (\n p1: Vtree.NodeContext,\n p2: boolean,\n p3: Css.Ident,\n p4: Css.Ident,\n p5: Css.Ident,\n p6: boolean,\n) => Vtree.FormattingContext;\n\nexport type ResolveLayoutProcessorHook = (\n p1: Vtree.FormattingContext,\n) => LayoutProcessor.LayoutProcessor;\n\nexport type PostLayoutBlockHook = (\n p1: Vtree.NodeContext,\n p2: Vtree.NodeContext[],\n p3: Layout.Column,\n) => void;\n\nconst hooks = {};\n\n/**\n * Register a function to a hook with the specified name.\n * The registered function is called at appropriate timings by the core code.\n * Arguments passed to the function depend on the hook.\n * When multiple functions are registered, they are called by the order in which\n * they are registered.\n * @param name Name of the hook.\n * @param fn Function to be registered to the hook.\n */\nexport function registerHook(name: string, fn: (...p1) => any): void {\n if (!HOOKS[name]) {\n Logging.logger.warn(new Error(`Skipping unknown plugin hook '${name}'.`));\n } else {\n let hooksForName = hooks[name];\n if (!hooksForName) {\n hooksForName = hooks[name] = [];\n }\n hooksForName.push(fn);\n }\n}\n\n/**\n * Remove a function already registered to the specified name.\n * Note that even if the same function are registered multiple times, this\n * method removes only the first one.\n * @param name Name of the hook.\n * @param fn Function to be removed from the hook.\n */\nexport function removeHook(name: string, fn: (...p1) => any): void {\n if (!HOOKS[name]) {\n Logging.logger.warn(new Error(`Ignoring unknown plugin hook '${name}'.`));\n } else {\n const hooksForName = hooks[name];\n if (hooksForName) {\n const index = hooksForName.indexOf(fn);\n if (index >= 0) {\n hooksForName.splice(index, 1);\n }\n }\n }\n}\n\n/**\n * Get all hooks registered to the specified name.\n * This method is for internal use (from the core code).\n */\nexport function getHooksForName(name: string): ((...p1) => any)[] {\n const hooksForName = hooks[name];\n return hooksForName || [];\n}\n\n/**\n * Pubilc members of the bundled library.\n */\nexport const plugin = {\n registerHook,\n removeHook,\n};\n","/**\n * Copyright 2015 Trim-marks Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Profile - Utility for profiling\n */\nimport * as Logging from \"./logging\";\n\n/**\n * Performance profiler measuring execution time of the script.\n */\nexport class Profiler {\n timestamps: { [key: string]: { [key: string]: number } } = {};\n private registerTiming: (p1: string, p2: string, p3?: number) => any;\n registerStartTiming: (name: string, timestamp?: number) => any;\n registerEndTiming: (name: string, timestamp?: number) => any;\n\n constructor(public readonly performanceInstance: Performance) {\n this.registerTiming = noop;\n\n // hack to export (non-prototype) methods\n this[\"registerStartTiming\"] = this.registerStartTiming = noop;\n this[\"registerEndTiming\"] = this.registerEndTiming = noop;\n }\n\n /**\n * Registers start timing of some event, even if profile is disabled.\n * @param name Name of event\n * @param timestamp Used as the actual timestamp of the event if specified,\n * instead of \"now\"\n */\n forceRegisterStartTiming(name: string, timestamp?: number) {\n registerTiming.call(this, name, \"start\", timestamp);\n }\n\n /**\n * Registers end timing of some event, even if profile is disabled.\n * @param name Name of event\n * @param timestamp Used as the actual timestamp of the event if specified,\n * instead of \"now\"\n */\n forceRegisterEndTiming(name: string, timestamp?: number) {\n registerTiming.call(this, name, \"end\", timestamp);\n }\n\n /**\n * Log registered timings (start/end/duration).\n * All values are printed in ms unit.\n */\n printTimings() {\n const timestamps = this.timestamps;\n let st = \"\";\n Object.keys(timestamps).forEach((name) => {\n const stamps = timestamps[name];\n const l = stamps.length;\n for (let i = 0; i < l; i++) {\n const t = stamps[i];\n st += name;\n if (l > 1) {\n st += `(${i})`;\n }\n st += ` => start: ${t[\"start\"]}, end: ${t[\"end\"]}, duration: ${\n t[\"end\"] - t[\"start\"]\n }\\n`;\n }\n });\n Logging.logger.info(st);\n }\n\n /**\n * Disable profiling.\n */\n disable() {\n this.registerTiming = noop;\n\n // hack to export (non-prototype) methods\n this[\"registerStartTiming\"] = this.registerStartTiming = noop;\n this[\"registerEndTiming\"] = this.registerEndTiming = noop;\n }\n\n /**\n * Enable profiling.\n */\n enable() {\n this.registerTiming = registerTiming;\n\n // hack to export (non-prototype) methods\n this[\n \"registerStartTiming\"\n ] = this.registerStartTiming = registerStartTiming;\n this[\"registerEndTiming\"] = this.registerEndTiming = registerEndTiming;\n }\n\n /**\n * Returns if profiling is enabled or not.\n */\n isEnabled(): boolean {\n return this.registerStartTiming === registerStartTiming;\n }\n}\n\nfunction noop(): void {}\n\n/**\n * Registers start/end timing of some event.\n * @this {Profile.Profiler}\n * @param name Name of event\n * @param startEnd Either of \"start\" or \"end\"\n * @param timestamp Used as the actual timestamp of the event if specified,\n * instead of \"now\"\n */\nfunction registerTiming(\n name: string,\n startEnd: string,\n timestamp?: number,\n): void {\n if (!timestamp) {\n timestamp = this.performanceInstance.now();\n }\n let timestamps = this.timestamps[name];\n if (!timestamps) {\n timestamps = this.timestamps[name] = [];\n }\n let t;\n const l = timestamps.length;\n for (let i = l - 1; i >= 0; i--) {\n t = timestamps[i];\n if (t && !t[startEnd]) {\n break;\n }\n t = null;\n }\n if (!t) {\n t = {};\n timestamps.push(t);\n }\n t[startEnd] = timestamp;\n}\n\n/**\n * Registers start timing of some event.\n * @this {Profile.Profiler}\n * @param name Name of event\n * @param timestamp Used as the actual timestamp of the event if specified,\n * instead of \"now\"\n */\nfunction registerStartTiming(name: string, timestamp?: number): void {\n this.registerTiming(name, \"start\", timestamp);\n}\n\n/**\n * Registers end timing of some event.\n * @this {Profile.Profiler}\n * @param name Name of event\n * @param timestamp Used as the actual timestamp of the event if specified,\n * instead of \"now\"\n */\nfunction registerEndTiming(name: string, timestamp?: number): void {\n this.registerTiming(name, \"end\", timestamp);\n}\nconst fallbackPerformanceInstance = { now: Date.now } as Performance;\nconst performanceInstance = window && window.performance;\nexport const profiler = new Profiler(\n performanceInstance || fallbackPerformanceInstance,\n);\nprofiler.forceRegisterStartTiming(\"load_vivliostyle\");\n\n/**\n * Pubilc members of the bundled library.\n */\nexport const profile = {\n profiler: {\n registerStartTiming: profiler.registerStartTiming,\n registerEndTiming: profiler.registerEndTiming,\n printTimings: profiler.printTimings,\n disable: profiler.disable,\n enable: profiler.enable,\n },\n};\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2015 Trim-marks Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Base - Common utilities.\n */\nimport * as Logging from \"./logging\";\nimport * as Asserts from \"./asserts\";\n\n/**\n * RegExp pattern for ::first-letter pseudo element:\n * https://drafts.csswg.org/css-pseudo-4/#first-letter-pseudo\n */\nexport const firstLetterPattern = /^[\\p{Zs}\\p{P}\\p{Mn}]*[\\p{L}\\p{N}]\\p{Mn}*(?:\\p{Zs}*\\p{P}\\p{Mn}*)*/u;\n/**\n * Indicates the offset position of an element in a document\n */\nexport const ELEMENT_OFFSET_ATTR = \"data-adapt-eloff\";\n\nexport let emptyObj = {};\n\nexport type JSON = any;\n\nexport function jsonToString(json: JSON): string {\n return JSON.stringify(json);\n}\n\nexport function stringToJSON(str: string): JSON {\n return JSON.parse(str);\n}\n\nexport function stripFragment(url: string): string {\n const r = url.match(/^([^#]*)/);\n if (r) {\n return r[1];\n }\n return url;\n}\n\nexport function stripFragmentAndQuery(url: string): string {\n const r = url.match(/^([^#?]*)/);\n if (r) {\n return r[1];\n }\n return url;\n}\n\n/**\n * Base URL relative to which URLs of resources are resolved.\n */\nexport let baseURL = window.location.href;\nexport function setBaseURL(value: string): void {\n baseURL = value;\n}\n\n/**\n * Base URL relative to which URLs of resources such as validation.txt and\n * user-agent.css are resolved.\n */\nexport let resourceBaseURL = window.location.href;\nexport function setResourceBaseURL(value: string): void {\n resourceBaseURL = value;\n}\n\n/**\n * @param relURL relative URL\n * @param baseURL base (absolute) URL\n * @return resolved (absolute) URL\n */\nexport function resolveURL(relURL: string, baseURL: string): string {\n if (/^data:/i.test(baseURL)) {\n return relURL || baseURL;\n }\n if (!baseURL || relURL.match(/^\\w{2,}:/)) {\n if (relURL.toLowerCase().match(\"^javascript:\")) {\n return \"#\";\n }\n if (relURL.match(/^\\w{2,}:\\/\\/[^\\/]+$/)) {\n relURL = `${relURL}/`;\n }\n return relURL;\n }\n if (baseURL.match(/^\\w{2,}:\\/\\/[^\\/]+$/)) {\n baseURL = `${baseURL}/`;\n }\n let r: string[];\n if (relURL.match(/^\\/\\//)) {\n r = baseURL.match(/^(\\w{2,}:)\\/\\//);\n if (r) {\n return r[1] + relURL;\n }\n return relURL;\n }\n if (relURL.match(/^\\//)) {\n r = baseURL.match(/^(\\w{2,}:\\/\\/[^\\/]+)\\//);\n if (r) {\n return r[1] + relURL;\n }\n return relURL;\n }\n if (relURL.match(/^\\.(\\/|$)/)) {\n relURL = relURL.substr(2); // './foo' => 'foo'\n }\n baseURL = stripFragmentAndQuery(baseURL);\n if (relURL.match(/^#/)) {\n return baseURL + relURL;\n }\n let i = baseURL.lastIndexOf(\"/\");\n if (i < 0) {\n return relURL;\n }\n if (i < baseURL.length - 1) {\n const j = baseURL.lastIndexOf(\".\");\n if (j < i) {\n // Assume the last part without '.' to be a directory name.\n if (relURL == \"\") {\n return baseURL;\n }\n baseURL += \"/\";\n i = baseURL.length - 1;\n }\n }\n let url = baseURL.substr(0, i + 1) + relURL;\n let urlOption = \"\";\n r = url.match(/^([^?#]*)([?#].*)$/);\n if (r) {\n url = r[1];\n urlOption = r[2];\n }\n\n while (true) {\n i = url.indexOf(\"/../\");\n if (i <= 0) {\n break;\n }\n const j = url.lastIndexOf(\"/\", i - 1);\n if (j <= 0) {\n break;\n }\n url = url.substr(0, j) + url.substr(i + 3);\n }\n return url.replace(/\\/(\\.\\/)+/g, \"/\") + urlOption;\n}\n\n/**\n * @return converted URL\n */\nexport function convertSpecialURL(url: string): string {\n let r: RegExpMatchArray;\n if (\n (r = /^(https?:)\\/\\/github\\.com\\/([^/]+\\/[^/]+)\\/(blob\\/|tree\\/|raw\\/)?(.*)$/.exec(\n url,\n ))\n ) {\n // Convert GitHub URL to GitHub raw URL\n url = `${r[1]}//raw.githubusercontent.com/${r[2]}/${r[3] ? \"\" : \"master/\"}${\n r[4]\n }`;\n } else if (\n (r = /^(https?:)\\/\\/www\\.aozora\\.gr\\.jp\\/(cards\\/[^/]+\\/files\\/[^/.]+\\.html)$/.exec(\n url,\n ))\n ) {\n // Convert Aozorabunko (X)HTML URL to GitHub raw URL\n url = `${r[1]}//raw.githubusercontent.com/aozorabunko/aozorabunko/master/${r[2]}`;\n } else if (\n (r = /^(https?:)\\/\\/gist\\.github\\.com\\/([^/]+\\/\\w+)(\\/|$)(raw(\\/|$))?(.*)$/.exec(\n url,\n ))\n ) {\n // Convert Gist URL to Gist raw URL\n url = `${r[1]}//gist.githubusercontent.com/${r[2]}/raw/${r[6]}`;\n } else if (\n (r = /^(https?:)\\/\\/(?:[^/.]+\\.)?jsbin\\.com\\/(?!(?:blog|help)\\b)(\\w+)((\\/\\d+)?).*$/.exec(\n url,\n ))\n ) {\n // Convert JS Bin URL to JS Bin output URL\n url = `${r[1]}//output.jsbin.com/${r[2]}${r[3]}/`;\n }\n return url;\n}\n\nexport interface DocumentURLTransformer {\n transformFragment(fragment: string, baseURL: string): string;\n\n transformURL(url: string, baseURL: string): string;\n\n restoreURL(encoded: string): string[];\n}\n\n/**\n * Various namespaces.\n * @enum {string}\n */\nexport enum NS {\n epub = \"http://www.idpf.org/2007/ops\",\n EV = \"http://www.w3.org/2001/xml-events\",\n MATHML = \"http://www.w3.org/1998/Math/MathML\",\n XML = \"http://www.w3.org/XML/1998/namespace\",\n XHTML = \"http://www.w3.org/1999/xhtml\",\n XLINK = \"http://www.w3.org/1999/xlink\",\n SHADOW = \"http://www.pyroxy.com/ns/shadow\",\n SVG = \"http://www.w3.org/2000/svg\",\n DC = \"http://purl.org/dc/elements/1.1/\",\n NCX = \"http://www.daisy.org/z3986/2005/ncx/\",\n}\n\n/**\n * @param name parameter name\n * @param opt_url URL; window.location.href is used if not provided\n * @return parameter value\n */\nexport function getURLParam(name: string, opt_url?: string): string | null {\n const rg = new RegExp(`#(.*&)?${escapeRegExp(name)}=([^#&]*)`);\n const url = opt_url || window.location.href;\n const r = url.match(rg);\n if (r) {\n return r[2];\n }\n return null;\n}\n\n/**\n * @param name parameter name\n * @param value parameter value\n * @return new url\n */\nexport function setURLParam(url: string, name: string, value: string): string {\n const rg = new RegExp(`#(.*&)?${escapeRegExp(name)}=([^#&]*)`);\n const r = url.match(rg);\n if (r) {\n const length = r[2].length;\n const index = r.index + r[0].length - length;\n return url.substr(0, index) + value + url.substr(index + length);\n }\n if (!url.match(/#/)) {\n return `${url}#${name}=${value}`;\n } else {\n return `${url}&${name}=${value}`;\n }\n}\n\n/**\n * @return ?string\n */\nexport function asString(v: any): any {\n if (v == null) {\n return v;\n }\n return v.toString();\n}\n\nexport interface Comparable {\n /**\n * @return -1 when this less then other, 0 when this equals other\n */\n compare(other: Comparable): number;\n}\n\n/**\n * A priority queue.\n */\nexport class PriorityQueue {\n queue: Comparable[] = [null];\n\n length(): number {\n return this.queue.length - 1;\n }\n\n add(item: Comparable): void {\n let index = this.queue.length;\n while (index > 1) {\n const parentIndex = Math.floor(index / 2);\n const parent = this.queue[parentIndex];\n if (parent.compare(item) > 0) {\n this.queue[index] = item;\n return;\n }\n this.queue[index] = parent;\n index = parentIndex;\n }\n this.queue[1] = item;\n }\n\n /**\n * @return highest priority Comparable.\n */\n peek(): Comparable {\n return this.queue[1];\n }\n\n /**\n * Remove the highest-priority item from the queue.\n * @return removed item.\n */\n remove(): Comparable {\n const result = this.queue[1] as Comparable;\n const curr = this.queue.pop() as Comparable;\n const size = this.queue.length;\n if (size > 1) {\n let index = 1;\n while (true) {\n let childIndex = index * 2;\n if (childIndex >= size) {\n break;\n }\n if (this.queue[childIndex].compare(curr) > 0) {\n if (\n childIndex + 1 < size &&\n this.queue[childIndex + 1].compare(\n this.queue[childIndex] as Comparable,\n ) > 0\n ) {\n childIndex++;\n }\n } else if (\n childIndex + 1 < size &&\n this.queue[childIndex + 1].compare(curr) > 0\n ) {\n childIndex++;\n } else {\n break;\n }\n this.queue[index] = this.queue[childIndex];\n index = childIndex;\n }\n this.queue[index] = curr;\n }\n return result;\n }\n}\n\n/**\n * @param prefix Prefix (containing leading and trailing hyphens)\n * @param cssPropName CSS property name\n * @return JavaScript property name\n */\nexport function cssToJSProp(prefix: string, cssPropName: string): string {\n if (prefix) {\n cssPropName = `-${cssPropName}`;\n prefix = prefix.replace(/-/g, \"\");\n if (prefix === \"moz\") {\n prefix = \"Moz\";\n }\n }\n return (\n prefix +\n cssPropName.replace(/-[a-z]/g, (txt) => txt.substr(1).toUpperCase())\n );\n}\n\nexport const knownPrefixes = [\"\", \"-webkit-\", \"-moz-\", \"-ms-\", \"-o-\", \"-epub-\"];\n\nexport const propNameMap = {};\n\nexport function checkIfPropertySupported(\n prefix: string,\n prop: string,\n): boolean {\n // Special case\n if (prop === \"writing-mode\") {\n const probe = document.createElement(\"span\");\n if (prefix === \"-ms-\") {\n probe.style.setProperty(prefix + prop, \"tb-rl\");\n return probe.style[\"writing-mode\"] === \"tb-rl\";\n } else {\n probe.style.setProperty(prefix + prop, \"vertical-rl\");\n return probe.style[prefix + prop] === \"vertical-rl\";\n }\n } else {\n const style = document.documentElement.style;\n return typeof style[cssToJSProp(prefix, prop)] === \"string\";\n }\n}\n\nexport function getPrefixedPropertyNames(prop: string): string[] | null {\n let prefixed = propNameMap[prop];\n if (prefixed || prefixed === null) {\n // null means the browser does not support the property\n return prefixed;\n }\n switch (prop) {\n case \"text-combine-upright\":\n // Special case for Safari\n if (\n checkIfPropertySupported(\"-webkit-\", \"text-combine\") &&\n !checkIfPropertySupported(\"\", \"text-combine-upright\")\n ) {\n propNameMap[prop] = [\"-webkit-text-combine\"];\n return [\"-webkit-text-combine\"];\n }\n break;\n case \"writing-mode\":\n // Special case: prefer '-ms-writing-mode' to 'writing-mode'\n if (checkIfPropertySupported(\"-ms-\", \"writing-mode\")) {\n propNameMap[prop] = [\"-ms-writing-mode\"];\n return [\"-ms-writing-mode\"];\n }\n break;\n case \"filter\":\n // Special case: prefer '-webkit-filter' to 'filter'\n if (checkIfPropertySupported(\"-webkit-\", \"filter\")) {\n propNameMap[prop] = [\"-webkit-filter\"];\n return [\"-webkit-filter\"];\n }\n break;\n case \"clip-path\":\n // Special case for chrome.\n if (checkIfPropertySupported(\"-webkit-\", \"clip-path\")) {\n return (propNameMap[prop] = [\"-webkit-clip-path\", \"clip-path\"]);\n }\n break;\n case \"margin-inline-start\":\n if (checkIfPropertySupported(\"-webkit-\", \"margin-start\")) {\n propNameMap[prop] = [\"-webkit-margin-start\"];\n return [\"-webkit-margin-start\"];\n }\n break;\n case \"margin-inline-end\":\n if (checkIfPropertySupported(\"-webkit-\", \"margin-end\")) {\n propNameMap[prop] = [\"-webkit-margin-end\"];\n return [\"-webkit-margin-end\"];\n }\n break;\n case \"padding-inline-start\":\n if (checkIfPropertySupported(\"-webkit-\", \"padding-start\")) {\n propNameMap[prop] = [\"-webkit-padding-start\"];\n return [\"-webkit-padding-start\"];\n }\n break;\n case \"padding-inline-end\":\n if (checkIfPropertySupported(\"-webkit-\", \"padding-end\")) {\n propNameMap[prop] = [\"-webkit-padding-end\"];\n return [\"-webkit-padding-end\"];\n }\n break;\n }\n for (const prefix of knownPrefixes) {\n if (checkIfPropertySupported(prefix, prop)) {\n prefixed = prefix + prop;\n propNameMap[prop] = [prefixed];\n return [prefixed];\n }\n }\n\n // Not supported by the browser\n Logging.logger.warn(\"Property not supported by the browser: \", prop);\n propNameMap[prop] = null;\n return null;\n}\n\nexport function setCSSProperty(\n elem: Element,\n prop: string,\n value: string,\n): void {\n try {\n const prefixedPropertyNames = getPrefixedPropertyNames(prop);\n if (!prefixedPropertyNames) {\n return;\n }\n prefixedPropertyNames.forEach((prefixed) => {\n if (prefixed === \"-ms-writing-mode\") {\n switch (value) {\n case \"horizontal-tb\":\n value = \"lr-tb\";\n break;\n case \"vertical-rl\":\n value = \"tb-rl\";\n break;\n case \"vertical-lr\":\n value = \"tb-lr\";\n break;\n }\n } else if (prefixed === \"-webkit-text-combine\") {\n switch (value) {\n case \"all\":\n value = \"horizontal\";\n break;\n }\n }\n if (elem && (elem as HTMLElement).style) {\n (elem as HTMLElement).style.setProperty(prefixed, value);\n }\n });\n } catch (err) {\n Logging.logger.warn(err);\n }\n}\n\nexport function getCSSProperty(\n elem: Element,\n prop: string,\n opt_value?: string,\n): string {\n try {\n const propertyNames = propNameMap[prop];\n return (elem as HTMLElement).style.getPropertyValue(\n propertyNames ? propertyNames[0] : prop,\n );\n } catch (err) {}\n return opt_value || \"\";\n}\n\nexport function getLangAttribute(element: Element): string {\n let lang = element.getAttributeNS(NS.XML, \"lang\");\n if (!lang && element.namespaceURI == NS.XHTML) {\n lang = element.getAttribute(\"lang\");\n }\n return lang;\n}\n\nexport class StringBuffer {\n list: string[] = [];\n\n append(str: string): StringBuffer {\n this.list.push(str);\n return this;\n }\n\n clear(): void {\n this.list = [];\n }\n\n /**\n * @override\n */\n toString(): string {\n const str = this.list.join(\"\");\n this.list = [str];\n return str;\n }\n}\n\nexport function escapeChar(str: string): string {\n // not called for surrogate pairs, no need to worry about them\n return `\\\\${str.charCodeAt(0).toString(16)} `;\n}\n\nexport function escapeCSSIdent(name: string): string {\n return name.replace(/[^-_a-zA-Z0-9\\u0080-\\uFFFF]/g, escapeChar);\n}\n\nexport function escapeCSSStr(str: string): string {\n return str.replace(/[\\u0000-\\u001F\"\\\\]/g, escapeChar);\n}\n\nexport function lightURLEncode(str: string): string {\n return str.replace(/[\\s+&?=#\\u007F-\\uFFFF]+/g, encodeURIComponent);\n}\n\nexport function isLetter(ch: string): boolean {\n return !!ch.match(\n /^[a-zA-Z\\u009E\\u009F\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u024F\\u037B-\\u037D\\u0386\\u0388-\\u0482\\u048A-\\u0527]$/,\n );\n}\n\nexport function escapeCharToHex(str: string, prefix?: string): string {\n prefix = typeof prefix === \"string\" ? prefix : \"\\\\u\";\n return prefix + (65536 | str.charCodeAt(0)).toString(16).substr(1);\n}\n\nexport function escapeNameStrToHex(str: string, prefix?: string): string {\n function escapeChar(s) {\n return escapeCharToHex(s, prefix);\n }\n return str.replace(/[^-a-zA-Z0-9_]/g, escapeChar);\n}\n\nexport function escapeRegExp(str: string): string {\n return escapeNameStrToHex(str);\n}\n\nexport function unescapeCharFromHex(str: string, prefix?: string): string {\n prefix = typeof prefix === \"string\" ? prefix : \"\\\\u\";\n if (str.indexOf(prefix) === 0) {\n return String.fromCharCode(parseInt(str.substring(prefix.length), 16));\n } else {\n return str;\n }\n}\n\nexport function unescapeStrFromHex(str: string, prefix?: string): string {\n prefix = typeof prefix === \"string\" ? prefix : \"\\\\u\";\n\n function unescapeChar(s) {\n return unescapeCharFromHex(s, prefix);\n }\n const regexp = new RegExp(`${escapeRegExp(prefix)}[0-9a-fA-F]{4}`, \"g\");\n return str.replace(regexp, unescapeChar);\n}\n\n/**\n * Function good is defined for ints from 0 to high-1. It is such that for\n * each i between 1 and high-1 !good(i-1) || good(i) is true. In other words,\n * it goes like false ... false true ... true.\n * Find i such that (i == 0 || !good(i-1)) && (i == h || good(i))\n * In other words, good(i) is the \"first\" good = true.\n */\nexport function binarySearch(\n high: number,\n good: (p1: number) => boolean,\n): number {\n let l = 0;\n let h = high;\n while (true) {\n Asserts.assert(l <= h);\n Asserts.assert(l == 0 || !good(l - 1));\n Asserts.assert(h == high || good(h));\n if (l == h) {\n return l;\n }\n const m = (l + h) >> 1;\n if (good(m)) {\n h = m;\n } else {\n l = m + 1;\n }\n }\n}\n\n/**\n * Function to sort numbers low to high\n */\nexport function numberCompare(a: number, b: number): number {\n return a - b;\n}\n\nexport const base64Chars =\n \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\nexport function appendBase64(sb: StringBuffer, data: string): void {\n const length = data.length;\n const length3 = Math.floor(length / 3) * 3;\n for (let i = 0; i < length3; i += 3) {\n const c1 = data.charCodeAt(i) & 255;\n const c2 = data.charCodeAt(i + 1) & 255;\n const c3 = data.charCodeAt(i + 2) & 255;\n sb.append(base64Chars.charAt(c1 >> 2));\n sb.append(base64Chars.charAt(((c1 << 4) | (c2 >> 4)) & 63));\n sb.append(base64Chars.charAt(((c2 << 2) | (c3 >> 6)) & 63));\n sb.append(base64Chars.charAt(c3 & 63));\n }\n switch (length - length3) {\n case 1: {\n const p1 = data.charCodeAt(length3) & 255;\n sb.append(base64Chars.charAt(p1 >> 2));\n sb.append(base64Chars.charAt((p1 << 4) & 63));\n sb.append(\"==\");\n break;\n }\n case 2: {\n const q1 = data.charCodeAt(length3) & 255;\n const q2 = data.charCodeAt(length3 + 1) & 255;\n sb.append(base64Chars.charAt(q1 >> 2));\n sb.append(base64Chars.charAt(((q1 << 4) | (q2 >> 4)) & 63));\n sb.append(base64Chars.charAt((q2 << 2) & 63));\n sb.append(\"=\");\n break;\n }\n }\n}\n\n/**\n * Index array using key function. First encountered item wins on collision.\n * Elements with empty and null keys are dropped.\n */\nexport function indexArray<T>(\n arr: T[],\n key: (p1: T) => string | null,\n): { [key: string]: T } {\n const map: { [key: string]: T } = {};\n for (const v of arr) {\n const k: string | null = key(v);\n if (k && !map[k]) {\n map[k] = v;\n }\n }\n return map;\n}\n\n/**\n * Convert array of strings to an object with the values in the array set to\n * true.\n */\nexport function arrayToSet(arr: string[]): { [key: string]: boolean } {\n const set = {};\n for (let i = 0; i < arr.length; i++) {\n set[arr[i]] = true;\n }\n return set;\n}\n\n/**\n * Index array using key function. Repeated indices are all combined into\n * arrays. Elements with empty and null keys are dropped. Ordering of the\n * elements in arrays is preserved.\n */\nexport function multiIndexArray<T>(\n arr: T[],\n key: (p1: T) => string | null,\n): { [key: string]: T[] } {\n const map: { [key: string]: T[] } = {};\n for (const v of arr) {\n const k = key(v);\n if (k) {\n if (map[k]) {\n map[k].push(v);\n } else {\n map[k] = [v];\n }\n }\n }\n return map;\n}\n\n/**\n * Apply function to each value of the object\n * @param fn second parameter is the key\n */\nexport function mapObj<P, R>(\n obj: { [key: string]: P },\n fn: (p1: P, p2: string) => R,\n): { [key: string]: R } {\n const res: { [key: string]: R } = {};\n for (const n in obj) {\n res[n] = fn(obj[n], n);\n }\n return res;\n}\n\nexport function mapSize(obj: object): number {\n let n = 0;\n for (const key in obj) {\n n++;\n }\n return n;\n}\n\nexport type Event = {\n type: string;\n target?;\n currentTarget?;\n preventDefault?;\n newPage?;\n anchorElement?;\n href?;\n content?;\n};\n\nexport type EventListener = (p1: Event) => void;\n\n/**\n * Extemely simple-minded EventTarget implementation. Consider using\n * goog.events.EventTarget if you are using Closure library.\n */\nexport class SimpleEventTarget {\n listeners: { [key: string]: EventListener[] } = {};\n\n dispatchEvent(evt: Event): void {\n const list = this.listeners[evt.type];\n if (list) {\n evt.target = this;\n evt.currentTarget = this;\n for (let i = 0; i < list.length; i++) {\n list[i](evt);\n }\n }\n }\n\n addEventListener(\n type: string,\n listener: EventListener,\n capture?: boolean,\n ): void {\n if (capture) {\n return;\n }\n const list = this.listeners[type];\n if (list) {\n list.push(listener);\n } else {\n this.listeners[type] = [listener];\n }\n }\n\n removeEventListener(\n type: string,\n listener: EventListener,\n capture?: boolean,\n ): void {\n if (capture) {\n return;\n }\n const list = this.listeners[type];\n if (list) {\n const index = list.indexOf(listener);\n if (index >= 0) {\n list.splice(index, 1);\n }\n }\n }\n}\nexport type EventTarget = SimpleEventTarget;\n\nexport let hasLShapeFloatBug: boolean | null = null;\n\n/**\n * Check if there is a bug with L-shape floats overlapping text.\n */\nexport function checkLShapeFloatBug(body: HTMLElement): boolean {\n if (hasLShapeFloatBug == null) {\n const doc = body.ownerDocument;\n const container = doc.createElement(\"div\") as HTMLElement;\n container.style.position = \"absolute\";\n container.style.top = \"0px\";\n container.style.left = \"0px\";\n container.style.width = \"100px\";\n container.style.height = \"100px\";\n container.style.overflow = \"hidden\";\n container.style.lineHeight = \"16px\";\n container.style.fontSize = \"16px\";\n body.appendChild(container);\n const f1 = doc.createElement(\"div\") as HTMLElement;\n f1.style.width = \"0px\";\n f1.style.height = \"14px\";\n f1.style.cssFloat = \"left\";\n container.appendChild(f1);\n const f2 = doc.createElement(\"div\") as HTMLElement;\n f2.style.width = \"50px\";\n f2.style.height = \"50px\";\n f2.style.cssFloat = \"left\";\n f2.style.clear = \"left\";\n container.appendChild(f2);\n const t = doc.createTextNode(\"a a a a a a a a a a a a a a a a\");\n container.appendChild(t);\n const range = doc.createRange();\n range.setStart(t, 0);\n range.setEnd(t, 1);\n const leftEdge = range.getBoundingClientRect().left;\n hasLShapeFloatBug = leftEdge < 40;\n body.removeChild(container);\n }\n return hasLShapeFloatBug;\n}\n\nexport let hasVerticalBBoxBug: boolean | null = null;\n\n/**\n * Check if there is a bug with the bounding boxes of vertical text characters.\n * Though method used to be used check Chrome bug, it seems that the bug has\n * been already fixed:\n * https://bugs.chromium.org/p/chromium/issues/detail?id=297808\n * We now use this method to check Firefox bug:\n * https://bugzilla.mozilla.org/show_bug.cgi?id=1159309\n */\nexport function checkVerticalBBoxBug(body: HTMLElement): boolean {\n if (hasVerticalBBoxBug == null) {\n const doc = body.ownerDocument;\n const container = doc.createElement(\"div\") as HTMLElement;\n container.style.position = \"absolute\";\n container.style.top = \"0px\";\n container.style.left = \"0px\";\n container.style.width = \"100px\";\n container.style.height = \"100px\";\n container.style.overflow = \"hidden\";\n container.style.lineHeight = \"16px\";\n container.style.fontSize = \"16px\";\n setCSSProperty(container, \"writing-mode\", \"vertical-rl\");\n body.appendChild(container);\n const t = doc.createTextNode(\"a a a a a a a a a a a a a a a a\");\n container.appendChild(t);\n const range = doc.createRange();\n range.setStart(t, 0);\n range.setEnd(t, 1);\n const box = range.getBoundingClientRect();\n hasVerticalBBoxBug = box.right - box.left < 10;\n body.removeChild(container);\n }\n return hasVerticalBBoxBug;\n}\n\nexport let hasInlineBlockJustificationBug: boolean | null = null;\n\nexport function checkInlineBlockJustificationBug(body: HTMLElement): boolean {\n if (hasInlineBlockJustificationBug === null) {\n const doc = body.ownerDocument;\n const container = doc.createElement(\"div\") as HTMLElement;\n container.style.position = \"absolute\";\n container.style.top = \"0px\";\n container.style.left = \"0px\";\n container.style.width = \"30px\";\n container.style.height = \"100px\";\n container.style.lineHeight = \"16px\";\n container.style.fontSize = \"16px\";\n container.style.textAlign = \"justify\";\n body.appendChild(container);\n const t = doc.createTextNode(\"a | \");\n container.appendChild(t);\n const inlineBlock = doc.createElement(\"span\");\n inlineBlock.style.display = \"inline-block\";\n inlineBlock.style.width = \"30px\";\n container.appendChild(inlineBlock);\n const range = doc.createRange();\n range.setStart(t, 0);\n range.setEnd(t, 3);\n const box = range.getBoundingClientRect();\n hasInlineBlockJustificationBug = box.right < 27;\n body.removeChild(container);\n }\n return hasInlineBlockJustificationBug;\n}\n\nexport let hasSoftWrapOpportunityAfterHyphenBug: boolean | null = null;\n\nexport function checkSoftWrapOpportunityAfterHyphenBug(\n body: HTMLElement,\n): boolean {\n if (hasSoftWrapOpportunityAfterHyphenBug === null) {\n const doc = body.ownerDocument;\n const container = doc.createElement(\"div\") as HTMLElement;\n container.style.position = \"absolute\";\n container.style.top = \"0px\";\n container.style.left = \"0px\";\n container.style.width = \"40px\";\n container.style.height = \"100px\";\n container.style.lineHeight = \"16px\";\n container.style.fontSize = \"16px\";\n container.style.textAlign = \"justify\";\n body.appendChild(container);\n const t = doc.createTextNode(\"a a-\");\n container.appendChild(t);\n const inlineBlock = doc.createElement(\"span\");\n inlineBlock.style.display = \"inline-block\";\n inlineBlock.style.width = \"40px\";\n container.appendChild(inlineBlock);\n const range = doc.createRange();\n range.setStart(t, 2);\n range.setEnd(t, 4);\n const box = range.getBoundingClientRect();\n hasSoftWrapOpportunityAfterHyphenBug = box.right < 37;\n body.removeChild(container);\n }\n return hasSoftWrapOpportunityAfterHyphenBug;\n}\n\nexport let hasSoftWrapOpportunityByWbrBug: boolean | null = null;\n\nexport function checkSoftWrapOpportunityByWbrBug(body: HTMLElement): boolean {\n if (hasSoftWrapOpportunityByWbrBug === null) {\n const doc = body.ownerDocument;\n const container = doc.createElement(\"div\") as HTMLElement;\n container.style.position = \"absolute\";\n container.style.top = \"0px\";\n container.style.left = \"0px\";\n container.style.width = \"40px\";\n container.style.height = \"100px\";\n container.style.lineHeight = \"16px\";\n container.style.fontSize = \"16px\";\n container.style.textAlign = \"justify\";\n body.appendChild(container);\n const t = doc.createTextNode(\"a a-\");\n container.appendChild(t);\n container.appendChild(doc.createElement(\"wbr\"));\n const inlineBlock = doc.createElement(\"span\");\n inlineBlock.style.display = \"inline-block\";\n inlineBlock.style.width = \"40px\";\n container.appendChild(inlineBlock);\n const range = doc.createRange();\n range.setStart(t, 2);\n range.setEnd(t, 4);\n const box = range.getBoundingClientRect();\n hasSoftWrapOpportunityByWbrBug = box.right < 37;\n body.removeChild(container);\n }\n return hasSoftWrapOpportunityByWbrBug;\n}\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2015 Trim-marks Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Cfi - Support for EPUB Canonical Fragment Identifiers.\n */\nimport * as Base from \"./base\";\n\nexport type Position = {\n node: Node;\n offset: number;\n after: boolean;\n sideBias: string | null;\n ref: Fragment;\n};\n\nexport function getId(node: Node): string | null {\n if (node.nodeType == 1) {\n const idtxt = (node as Element).getAttribute(\"id\");\n if (idtxt) {\n return idtxt;\n }\n }\n return null;\n}\n\nexport function escapeChar(ch: string): string {\n return `^${ch}`;\n}\n\nexport function escape(str: string): string {\n return str.replace(/[\\[\\]\\(\\),=;^]/g, escapeChar);\n}\n\nexport function unescapeChar(str: string): string {\n return str.substr(1);\n}\n\nexport function unescape(str: string): string {\n if (!str) {\n return str;\n }\n return str.replace(/\\^[\\[\\]\\(\\),=;^]/g, unescapeChar);\n}\n\nexport function parseExtVal(extstr: string): string | string[] {\n const result = [];\n do {\n const r = extstr.match(/^(\\^,|[^,])*/);\n const p = unescape(r[0]);\n extstr = extstr.substr(r[0].length + 1);\n if (!extstr && !result.length) {\n return p;\n }\n result.push(p);\n } while (extstr);\n return result;\n}\n\nexport function parseExt(extstr: string): { [key: string]: string | string[] } {\n const ext = {};\n while (extstr) {\n const r = extstr.match(/^;([^;=]+)=(([^;]|\\^;)*)/);\n if (!r) {\n return ext;\n }\n ext[r[1]] = parseExtVal(r[2]);\n extstr = extstr.substr(r[0].length);\n }\n return ext;\n}\n\nexport interface Step {\n appendTo(sb: Base.StringBuffer): void;\n\n applyTo(pos: Position): boolean;\n}\n\nexport class RefStep implements Step {\n appendTo(sb: Base.StringBuffer) {\n sb.append(\"!\");\n }\n\n /**\n * @override\n */\n applyTo(pos: Position): boolean {\n return false;\n }\n}\n\nexport class ChildStep implements Step {\n constructor(\n public readonly index: number,\n public readonly id: string | null,\n public readonly sideBias: string | null,\n ) {}\n\n /**\n * @override\n */\n appendTo(sb: Base.StringBuffer): void {\n sb.append(\"/\");\n sb.append(this.index.toString());\n if (this.id || this.sideBias) {\n sb.append(\"[\");\n if (this.id) {\n sb.append(this.id);\n }\n if (this.sideBias) {\n sb.append(\";s=\");\n sb.append(this.sideBias);\n }\n sb.append(\"]\");\n }\n }\n\n /**\n * @override\n */\n applyTo(pos: Position): boolean {\n if (pos.node.nodeType != 1) {\n throw new Error(\"E_CFI_NOT_ELEMENT\");\n }\n const elem = pos.node as Element;\n const childElements = elem.children;\n const childElementCount = childElements.length;\n let child: Node;\n const childIndex = Math.floor(this.index / 2) - 1;\n if (childIndex < 0 || childElementCount == 0) {\n child = elem.firstChild;\n pos.node = child || elem;\n } else {\n child = childElements[Math.min(childIndex, childElementCount - 1)];\n if (this.index & 1) {\n const next = child.nextSibling;\n if (!next || next.nodeType == 1) {\n pos.after = true;\n } else {\n child = next;\n }\n }\n pos.node = child;\n }\n if (this.id && (pos.after || this.id != getId(pos.node))) {\n throw new Error(\"E_CFI_ID_MISMATCH\");\n }\n pos.sideBias = this.sideBias;\n return true;\n }\n}\n\nexport class OffsetStep implements Step {\n constructor(\n public readonly offset: number,\n public readonly textBefore: string | null,\n public readonly textAfter: string | null,\n public readonly sideBias: string | null,\n ) {}\n\n applyTo(pos: Position): boolean {\n if (this.offset > 0 && !pos.after) {\n let offset = this.offset;\n let node = pos.node;\n while (true) {\n const nodeType = node.nodeType;\n if (nodeType == 1) {\n break;\n }\n const next = node.nextSibling;\n if (3 <= nodeType && nodeType <= 5) {\n const textLength = node.textContent.length;\n if (offset <= textLength) {\n break;\n }\n if (!next) {\n offset = textLength;\n break;\n }\n offset -= textLength;\n }\n if (!next) {\n offset = 0;\n break;\n }\n node = next;\n }\n pos.node = node;\n pos.offset = offset;\n }\n pos.sideBias = this.sideBias;\n return true;\n }\n\n /**\n * @override\n */\n appendTo(sb: Base.StringBuffer): void {\n sb.append(\":\");\n sb.append(this.offset.toString());\n if (this.textBefore || this.textAfter || this.sideBias) {\n sb.append(\"[\");\n if (this.textBefore || this.textAfter) {\n if (this.textBefore) {\n sb.append(escape(this.textBefore));\n }\n sb.append(\",\");\n if (this.textAfter) {\n sb.append(escape(this.textAfter));\n }\n }\n if (this.sideBias) {\n sb.append(\";s=\");\n sb.append(this.sideBias);\n }\n sb.append(\"]\");\n }\n }\n}\n\nexport class Fragment {\n steps: Step[] = null;\n\n fromString(fragstr: string): void {\n let r = fragstr.match(/^#?epubcfi\\((.*)\\)$/);\n if (!r) {\n throw new Error(\"E_CFI_NOT_CFI\");\n }\n const str = decodeURIComponent(r[1]);\n let i = 0;\n const steps = [];\n while (true) {\n let ext: {\n [key: string]: string | string[];\n };\n switch (str.charAt(i)) {\n case \"/\": {\n i++;\n r = str\n .substr(i)\n .match(/^(0|[1-9][0-9]*)(\\[(.*?)(;([^\\]]|\\^\\])*)?\\])?/);\n if (!r) {\n throw new Error(\"E_CFI_NUMBER_EXPECTED\");\n }\n i += r[0].length;\n const index = parseInt(r[1], 10);\n const id = r[3];\n ext = parseExt(r[4]);\n steps.push(new ChildStep(index, id, Base.asString(ext[\"s\"])));\n break;\n }\n case \":\": {\n i++;\n r = str\n .substr(i)\n .match(\n /^(0|[1-9][0-9]*)(\\[((([^\\];,]|\\^[\\];,])*)(,(([^\\];,]|\\^[\\];,])*))?)(;([^]]|\\^\\])*)?\\])?/,\n );\n if (!r) {\n throw new Error(\"E_CFI_NUMBER_EXPECTED\");\n }\n i += r[0].length;\n const offset = parseInt(r[1], 10);\n let textBefore = r[4];\n if (textBefore) {\n textBefore = unescape(textBefore);\n }\n let textAfter = r[7];\n if (textAfter) {\n textAfter = unescape(textAfter);\n }\n ext = parseExt(r[10]);\n steps.push(\n new OffsetStep(\n offset,\n textBefore,\n textAfter,\n Base.asString(ext[\"s\"]),\n ),\n );\n break;\n }\n case \"!\":\n i++;\n steps.push(new RefStep());\n break;\n case \"~\":\n case \"@\":\n\n // Time/space terminus; only useful for highlights/selections which are\n // not yet supported, skip for now. fall through\n case \"\":\n this.steps = steps;\n return;\n default:\n throw new Error(\"E_CFI_PARSE_ERROR\");\n }\n }\n }\n\n navigate(doc: Document): Position {\n const pos = {\n node: doc.documentElement,\n offset: 0,\n after: false,\n sideBias: null,\n ref: null,\n };\n for (let i = 0; i < this.steps.length; i++) {\n if (!this.steps[i].applyTo(pos)) {\n pos.ref = new Fragment();\n pos.ref.steps = this.steps.slice(i + 1);\n break;\n }\n }\n return pos;\n }\n\n trim(text: string, after: boolean): string {\n return text\n .replace(/\\s+/g, \" \")\n .match(\n after\n ? /^[ -\\uD7FF\\uE000-\\uFFFF]{0,8}/\n : /[ -\\uD7FF\\uE000-\\uFFFF]{0,8}$/,\n )[0]\n .replace(/^\\s/, \"\")\n .replace(/\\s$/, \"\");\n }\n\n /**\n * Initialize from a node and an offset.\n */\n prependPathFromNode(\n node: Node,\n offset: number,\n after: boolean,\n sideBias: string | null,\n ) {\n const steps = [];\n let parent = node.parentNode;\n let textBefore = \"\";\n let textAfter = \"\";\n while (node) {\n switch (node.nodeType) {\n case 3: // Text nodes\n case 4:\n case 5: {\n const text = node.textContent;\n const textLength = text.length;\n if (after) {\n offset += textLength;\n if (!textBefore) {\n textBefore = text;\n }\n } else {\n if (offset > textLength) {\n offset = textLength;\n }\n after = true;\n textBefore = text.substr(0, offset);\n textAfter = text.substr(offset);\n }\n node = node.previousSibling;\n continue;\n }\n case 8: // Comment Node\n node = node.previousSibling;\n continue;\n }\n break;\n }\n if (offset > 0 || textBefore || textAfter) {\n textBefore = this.trim(textBefore, false);\n textAfter = this.trim(textAfter, true);\n steps.push(new OffsetStep(offset, textBefore, textAfter, sideBias));\n sideBias = null;\n }\n while (parent) {\n if (!parent || parent.nodeType == 9) {\n break;\n }\n const id = after ? null : getId(node);\n let index = after ? 1 : 0;\n while (node) {\n if (node.nodeType == 1) {\n index += 2;\n }\n node = node.previousSibling;\n }\n steps.push(new ChildStep(index, id, sideBias));\n sideBias = null;\n node = parent;\n parent = parent.parentNode;\n after = false;\n }\n steps.reverse();\n if (this.steps) {\n steps.push(new RefStep());\n this.steps = steps.concat(this.steps);\n } else {\n this.steps = steps;\n }\n }\n\n toString(): string {\n if (!this.steps) {\n return \"\";\n }\n const sb = new Base.StringBuffer();\n sb.append(\"epubcfi(\");\n for (let i = 0; i < this.steps.length; i++) {\n this.steps[i].appendTo(sb);\n }\n sb.append(\")\");\n return sb.toString().replace(/%/g, \"%25\");\n }\n}\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2015 Trim-marks Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Exprs - `-epubx-expr` Adaptive Layout expressions.\n */\nimport * as Base from \"./base\";\n\nexport type Preferences = {\n fontFamily: string;\n lineHeight: number;\n margin: number;\n hyphenate: boolean;\n columnWidth: number;\n horizontal: boolean;\n nightMode: boolean;\n spreadView: boolean;\n pageBorder: number;\n enabledMediaTypes: { [key: string]: boolean };\n defaultPaperSize?: { [key: string]: number };\n};\n\nexport function defaultPreferences(): Preferences {\n return {\n fontFamily: \"serif\",\n lineHeight: 1.25,\n margin: 8,\n hyphenate: false,\n columnWidth: 25,\n horizontal: false,\n nightMode: false,\n spreadView: false,\n pageBorder: 1,\n enabledMediaTypes: { vivliostyle: true, print: true },\n defaultPaperSize: undefined,\n };\n}\n\nexport function clonePreferences(pref: Preferences): Preferences {\n return {\n fontFamily: pref.fontFamily,\n lineHeight: pref.lineHeight,\n margin: pref.margin,\n hyphenate: pref.hyphenate,\n columnWidth: pref.columnWidth,\n horizontal: pref.horizontal,\n nightMode: pref.nightMode,\n spreadView: pref.spreadView,\n pageBorder: pref.pageBorder,\n enabledMediaTypes: Object.assign({}, pref.enabledMediaTypes),\n defaultPaperSize: pref.defaultPaperSize\n ? Object.assign({}, pref.defaultPaperSize)\n : undefined,\n };\n}\n\nexport const defaultPreferencesInstance = defaultPreferences();\n\ninterface Pending {}\ntype Special = Pending;\n\n/**\n * Special marker value that indicates that the expression result is being\n * calculated.\n */\n// eslint-disable-next-line no-redeclare\nexport const Special = {\n PENDING: {} as Pending,\n};\n\nexport type Result = string | number | boolean | undefined;\n\nexport type PendingResult = Special | Result;\n\nexport function letterbox(\n viewW: number,\n viewH: number,\n objW: number,\n objH: number,\n): string {\n const scale = Math.min((viewW - 0) / objW, (viewH - 0) / objH);\n return `matrix(${scale},0,0,${scale},0,0)`;\n}\n\n/**\n * @return string that can be parsed as CSS string with value str\n */\nexport function cssString(str: string): string {\n return `\"${Base.escapeCSSStr(`${str}`)}\"`;\n}\n\n/**\n * @return string that can be parsed as CSS name\n */\nexport function cssIdent(name: string): string {\n return Base.escapeCSSIdent(`${name}`);\n}\n\nexport function makeQualifiedName(\n objName: string | null,\n memberName: string,\n): string {\n if (objName) {\n return `${Base.escapeCSSIdent(objName)}.${Base.escapeCSSIdent(memberName)}`;\n }\n return Base.escapeCSSIdent(memberName);\n}\n\nexport let nextKeyIndex: number = 0;\n\n/**\n * Lexical scope of the expression.\n */\nexport class LexicalScope {\n scopeKey: string;\n children: LexicalScope[] = [];\n zero: Const;\n one: Const;\n _true: Const;\n _false: Const;\n values: { [key: string]: Val } = {};\n funcs: { [key: string]: Val } = {};\n builtIns: { [key: string]: (...p1: Result[]) => Result } = {};\n\n constructor(\n public parent: LexicalScope,\n public resolver?: (p1: string, p2: boolean) => Val,\n ) {\n this.scopeKey = `S${nextKeyIndex++}`;\n this.zero = new Const(this, 0);\n this.one = new Const(this, 1);\n this._true = new Const(this, true);\n this._false = new Const(this, false);\n if (parent) {\n parent.children.push(this);\n }\n if (!parent) {\n // root scope\n const builtIns = this.builtIns;\n builtIns[\"floor\"] = Math.floor;\n builtIns[\"ceil\"] = Math.ceil;\n builtIns[\"round\"] = Math.round;\n builtIns[\"sqrt\"] = Math.sqrt;\n builtIns[\"min\"] = Math.min;\n builtIns[\"max\"] = Math.max;\n builtIns[\"letterbox\"] = letterbox;\n builtIns[\"css-string\"] = cssString;\n builtIns[\"css-name\"] = cssIdent;\n builtIns[\"typeof\"] = (x) => typeof x;\n this.defineBuiltInName(\"page-width\", function () {\n return this.pageWidth();\n });\n this.defineBuiltInName(\"page-height\", function () {\n return this.pageHeight();\n });\n this.defineBuiltInName(\"pref-font-family\", function () {\n return this.pref.fontFamily;\n });\n this.defineBuiltInName(\"pref-night-mode\", function () {\n return this.pref.nightMode;\n });\n this.defineBuiltInName(\"pref-hyphenate\", function () {\n return this.pref.hyphenate;\n });\n this.defineBuiltInName(\"pref-margin\", function () {\n return this.pref.margin;\n });\n this.defineBuiltInName(\"pref-line-height\", function () {\n return this.pref.lineHeight;\n });\n this.defineBuiltInName(\"pref-column-width\", function () {\n return this.pref.columnWidth * this.fontSize;\n });\n this.defineBuiltInName(\"pref-horizontal\", function () {\n return this.pref.horizontal;\n });\n this.defineBuiltInName(\"pref-spread-view\", function () {\n return this.pref.spreadView;\n });\n\n // For env(pub-title) and env(doc-title)\n this.defineBuiltInName(\"pub-title\", function () {\n return cssString(this.pubTitle ? this.pubTitle : \"\");\n });\n this.defineBuiltInName(\"doc-title\", function () {\n return cssString(this.docTitle ? this.docTitle : \"\");\n });\n }\n }\n\n defineBuiltInName(name: string, fn: () => Result) {\n this.values[name] = new Native(this, fn, name);\n }\n\n defineName(qualifiedName: string, val: Val): void {\n this.values[qualifiedName] = val;\n }\n\n defineFunc(qualifiedName: string, val: Val): void {\n this.funcs[qualifiedName] = val;\n }\n\n defineBuiltIn(qualifiedName: string, fn: (...p1: Result[]) => Result): void {\n this.builtIns[qualifiedName] = fn;\n }\n}\n\nexport function isAbsoluteLengthUnit(unit: string): boolean {\n switch (unit.toLowerCase()) {\n case \"px\":\n case \"in\":\n case \"pt\":\n case \"pc\":\n case \"cm\":\n case \"mm\":\n case \"q\":\n return true;\n default:\n return false;\n }\n}\n\nexport function isViewportRelativeLengthUnit(unit: string): boolean {\n switch (unit.toLowerCase()) {\n case \"vw\":\n case \"vh\":\n case \"vi\":\n case \"vb\":\n case \"vmin\":\n case \"vmax\":\n case \"pvw\":\n case \"pvh\":\n case \"pvi\":\n case \"pvb\":\n case \"pvmin\":\n case \"pvmax\":\n return true;\n default:\n return false;\n }\n}\n\nexport function isFontRelativeLengthUnit(unit: string): boolean {\n switch (unit.toLowerCase()) {\n case \"em\":\n case \"ex\":\n case \"rem\":\n return true;\n default:\n return false;\n }\n}\n\nexport const defaultUnitSizes: { [key: string]: number } = {\n px: 1,\n in: 96,\n pt: 4 / 3,\n pc: 96 / 6,\n cm: 96 / 2.54,\n mm: 96 / 25.4,\n q: 96 / 2.54 / 40,\n em: 16,\n rem: 16,\n ex: 8,\n // <resolution>\n dppx: 1,\n dpi: 1 / 96,\n dpcm: 2.54 / 96,\n};\n\n/**\n * Returns if a unit should be converted to px before applied to the raw DOM.\n */\nexport function needUnitConversion(unit: string): boolean {\n switch (unit) {\n case \"q\":\n case \"rem\":\n return true;\n default:\n return false;\n }\n}\n\nexport type ScopeContext = {\n [key: string]: Result;\n};\n\n/**\n * Run-time instance of a scope and its children.\n */\nexport class Context {\n protected actualPageWidth: number | null = null;\n pageWidth: () => number;\n protected actualPageHeight: number | null = null;\n pageHeight: () => number;\n initialFontSize: number;\n rootFontSize: number | null = null;\n fontSize: () => number;\n pref: Preferences;\n scopes: { [key: string]: ScopeContext } = {};\n pageAreaWidth: number | null = null;\n pageAreaHeight: number | null = null;\n pageVertical: boolean | null = null;\n pubTitle: string | null = null;\n docTitle: string | null = null;\n\n constructor(\n public readonly rootScope: LexicalScope,\n public readonly viewportWidth: number,\n public readonly viewportHeight: number,\n fontSize: number,\n ) {\n this.pageWidth = function () {\n if (this.actualPageWidth) {\n return this.actualPageWidth;\n } else {\n return this.pref.spreadView\n ? Math.floor(viewportWidth / 2) - this.pref.pageBorder\n : viewportWidth;\n }\n };\n this.pageHeight = function () {\n if (this.actualPageHeight) {\n return this.actualPageHeight;\n } else {\n return viewportHeight;\n }\n };\n this.initialFontSize = fontSize;\n this.fontSize = function () {\n if (this.rootFontSize) {\n return this.rootFontSize;\n } else {\n return fontSize;\n }\n };\n this.pref = defaultPreferencesInstance;\n }\n\n private getScopeContext(scope: LexicalScope): ScopeContext {\n let s = this.scopes[scope.scopeKey];\n if (!s) {\n s = {};\n this.scopes[scope.scopeKey] = s;\n }\n return s;\n }\n\n clearScope(scope: LexicalScope): void {\n this.scopes[scope.scopeKey] = {};\n for (let k = 0; k < scope.children.length; k++) {\n this.clearScope(scope.children[k]);\n }\n }\n\n queryUnitSize(unit: string, isRoot: boolean): number {\n if (isViewportRelativeLengthUnit(unit)) {\n const pvw = this.pageWidth() / 100;\n const pvh = this.pageHeight() / 100;\n const vw = this.pageAreaWidth != null ? this.pageAreaWidth / 100 : pvw;\n const vh = this.pageAreaHeight != null ? this.pageAreaHeight / 100 : pvh;\n\n switch (unit) {\n case \"vw\":\n return vw;\n case \"vh\":\n return vh;\n case \"vi\":\n return this.pageVertical ? vh : vw;\n case \"vb\":\n return this.pageVertical ? vw : vh;\n case \"vmin\":\n return vw < vh ? vw : vh;\n case \"vmax\":\n return vw > vh ? vw : vh;\n case \"pvw\":\n return pvw;\n case \"pvh\":\n return pvh;\n case \"pvi\":\n return this.pageVertical ? pvh : pvw;\n case \"pvb\":\n return this.pageVertical ? pvw : pvh;\n case \"pvmin\":\n return pvw < pvh ? pvw : pvh;\n case \"pvmax\":\n return pvw > pvh ? pvw : pvh;\n }\n }\n if (unit == \"em\" || unit == \"rem\") {\n return isRoot ? this.initialFontSize : this.fontSize();\n }\n if (unit == \"ex\") {\n return (\n (defaultUnitSizes[\"ex\"] *\n (isRoot ? this.initialFontSize : this.fontSize())) /\n defaultUnitSizes[\"em\"]\n );\n }\n return defaultUnitSizes[unit];\n }\n\n evalName(scope: LexicalScope, qualifiedName: string): Val {\n do {\n let val = scope.values[qualifiedName];\n if (val) {\n return val;\n }\n if (scope.resolver) {\n val = scope.resolver.call(this, qualifiedName, false);\n if (val) {\n return val;\n }\n }\n scope = scope.parent;\n } while (scope);\n throw new Error(`Name '${qualifiedName}' is undefined`);\n }\n\n /**\n * @param noBuiltInEval don't evaluate built-ins (for dependency calculations)\n */\n evalCall(\n scope: LexicalScope,\n qualifiedName: string,\n params: Val[],\n noBuiltInEval: boolean,\n ): Val {\n do {\n let body = scope.funcs[qualifiedName];\n if (body) {\n return body; // will be expanded by callee\n }\n if (scope.resolver) {\n body = scope.resolver.call(this, qualifiedName, true);\n if (body) {\n return body;\n }\n }\n const fn = scope.builtIns[qualifiedName];\n if (fn) {\n if (noBuiltInEval) {\n return scope.zero;\n }\n const args = Array(params.length);\n for (let i = 0; i < params.length; i++) {\n args[i] = params[i].evaluate(this);\n }\n return new Const(scope, fn.apply(this, args));\n }\n scope = scope.parent;\n } while (scope);\n throw new Error(`Function '${qualifiedName}' is undefined`);\n }\n\n evalMediaName(name: string, not: boolean): boolean {\n const enabled = name === \"all\" || !!this.pref.enabledMediaTypes[name];\n return not ? !enabled : enabled;\n }\n\n evalMediaTest(feature: string, value: Val): boolean {\n let prefix = \"\";\n const r = feature.match(/^(min|max)-(.*)$/);\n if (r) {\n prefix = r[1];\n feature = r[2];\n }\n let req: Result | null = null;\n let actual: number | null = null;\n switch (feature) {\n case \"width\":\n case \"height\":\n case \"device-width\":\n case \"device-height\":\n case \"color\":\n if (value) {\n req = value.evaluate(this);\n }\n break;\n }\n switch (feature) {\n case \"width\":\n actual = this.pageWidth();\n break;\n case \"height\":\n actual = this.pageHeight();\n break;\n case \"device-width\":\n actual = window.screen.availWidth;\n break;\n case \"device-height\":\n actual = window.screen.availHeight;\n break;\n case \"color\":\n actual = window.screen.pixelDepth;\n break;\n }\n if (actual != null && req != null) {\n switch (prefix) {\n case \"min\":\n return actual >= req;\n case \"max\":\n return actual <= req;\n default:\n return actual == req;\n }\n } else if (actual != null && value == null) {\n return actual !== 0;\n }\n return false;\n }\n\n queryVal(scope: LexicalScope, key: string): Result | undefined {\n const s = this.scopes[scope.scopeKey];\n return s ? s[key] : undefined;\n }\n\n storeVal(scope: LexicalScope, key: string, val: Result): void {\n this.getScopeContext(scope)[key] = val;\n }\n}\n\n//---------- name resolution --------------\nexport type DependencyCache = {\n [key: string]: boolean | Special;\n};\n\nexport class Val {\n key: string;\n\n constructor(public scope: LexicalScope) {\n this.scope = scope;\n this.key = `_${nextKeyIndex++}`;\n }\n\n /**\n * @override\n */\n toString(): string {\n const buf = new Base.StringBuffer();\n this.appendTo(buf, 0);\n return buf.toString();\n }\n\n appendTo(buf: Base.StringBuffer, priority: number): void {\n throw new Error(\"F_ABSTRACT\");\n }\n\n protected evaluateCore(context: Context): Result {\n throw new Error(\"F_ABSTRACT\");\n }\n\n expand(context: Context, params: Val[]): Val {\n return this;\n }\n\n dependCore(\n other: Val,\n context: Context,\n dependencyCache: DependencyCache,\n ): boolean {\n return other === this;\n }\n\n dependOuter(\n other: Val,\n context: Context,\n dependencyCache: DependencyCache,\n ): boolean {\n const cached = dependencyCache[this.key];\n if (cached != null) {\n if (cached === Special.PENDING) {\n return false;\n }\n return cached as boolean;\n } else {\n dependencyCache[this.key] = Special.PENDING;\n const result = this.dependCore(other, context, dependencyCache);\n dependencyCache[this.key] = result;\n return result;\n }\n }\n\n depend(other: Val, context: Context): boolean {\n return this.dependOuter(other, context, {});\n }\n\n evaluate(context: Context): Result {\n let result = context.queryVal(this.scope, this.key);\n if (typeof result != \"undefined\") {\n return result;\n }\n result = this.evaluateCore(context);\n context.storeVal(this.scope, this.key, result);\n return result;\n }\n\n isMediaName(): boolean {\n return false;\n }\n}\n\nexport class Prefix extends Val {\n constructor(scope: LexicalScope, public val: Val) {\n super(scope);\n }\n\n protected getOp(): string {\n throw new Error(\"F_ABSTRACT\");\n }\n\n evalPrefix(val: Result): Result {\n throw new Error(\"F_ABSTRACT\");\n }\n\n /**\n * @override\n */\n evaluateCore(context: Context): Result {\n const val = this.val.evaluate(context);\n return this.evalPrefix(val);\n }\n\n /**\n * @override\n */\n dependCore(\n other: Val,\n context: Context,\n dependencyCache: DependencyCache,\n ): boolean {\n return (\n other === this || this.val.dependOuter(other, context, dependencyCache)\n );\n }\n\n /**\n * @override\n */\n appendTo(buf: Base.StringBuffer, priority: number): void {\n if (10 < priority) {\n buf.append(\"(\");\n }\n buf.append(this.getOp());\n this.val.appendTo(buf, 10);\n if (10 < priority) {\n buf.append(\")\");\n }\n }\n\n /**\n * @override\n */\n expand(context: Context, params: Val[]): Val {\n const val = this.val.expand(context, params);\n if (val === this.val) {\n return this;\n }\n const r = new (this.constructor as any)(this.scope, val);\n return r;\n }\n}\n\nexport class Infix extends Val {\n constructor(scope: LexicalScope, public lhs: Val, public rhs: Val) {\n super(scope);\n }\n\n getPriority(): number {\n throw new Error(\"F_ABSTRACT\");\n }\n\n getOp(): string {\n throw new Error(\"F_ABSTRACT\");\n }\n\n evalInfix(lhs: Result, rhs: Result): Result {\n throw new Error(\"F_ABSTRACT\");\n }\n\n /**\n * @override\n */\n evaluateCore(context: Context): Result {\n const lhs = this.lhs.evaluate(context);\n const rhs = this.rhs.evaluate(context);\n return this.evalInfix(lhs, rhs);\n }\n\n /**\n * @override\n */\n dependCore(\n other: Val,\n context: Context,\n dependencyCache: DependencyCache,\n ): boolean {\n return (\n other === this ||\n this.lhs.dependOuter(other, context, dependencyCache) ||\n this.rhs.dependOuter(other, context, dependencyCache)\n );\n }\n\n /**\n * @override\n */\n appendTo(buf: Base.StringBuffer, priority: number): void {\n const thisPriority = this.getPriority();\n if (thisPriority <= priority) {\n buf.append(\"(\");\n }\n this.lhs.appendTo(buf, thisPriority);\n buf.append(this.getOp());\n this.rhs.appendTo(buf, thisPriority);\n if (thisPriority <= priority) {\n buf.append(\")\");\n }\n }\n\n /**\n * @override\n */\n expand(context: Context, params: Val[]): Val {\n const lhs = this.lhs.expand(context, params);\n const rhs = this.rhs.expand(context, params);\n if (lhs === this.lhs && rhs === this.rhs) {\n return this;\n }\n const r = new (this.constructor as any)(this.scope, lhs, rhs);\n return r;\n }\n}\n\nexport class Logical extends Infix {\n constructor(scope: LexicalScope, lhs: Val, rhs: Val) {\n super(scope, lhs, rhs);\n }\n\n /**\n * @override\n */\n getPriority(): number {\n return 1;\n }\n}\n\nexport class Comparison extends Infix {\n constructor(scope: LexicalScope, lhs: Val, rhs: Val) {\n super(scope, lhs, rhs);\n }\n\n /**\n * @override\n */\n getPriority(): number {\n return 2;\n }\n}\n\nexport class Additive extends Infix {\n constructor(scope: LexicalScope, lhs: Val, rhs: Val) {\n super(scope, lhs, rhs);\n }\n\n /**\n * @override\n */\n getPriority(): number {\n return 3;\n }\n}\n\nexport class Multiplicative extends Infix {\n constructor(scope: LexicalScope, lhs: Val, rhs: Val) {\n super(scope, lhs, rhs);\n }\n\n /**\n * @override\n */\n getPriority(): number {\n return 4;\n }\n}\n\nexport class Not extends Prefix {\n constructor(scope: LexicalScope, val: Val) {\n super(scope, val);\n }\n\n /**\n * @override\n */\n getOp(): string {\n return \"!\";\n }\n\n /**\n * @override\n */\n evalPrefix(val: Result): Result {\n return !val;\n }\n}\n\nexport class Negate extends Prefix {\n constructor(scope: LexicalScope, val: Val) {\n super(scope, val);\n }\n\n /**\n * @override\n */\n getOp(): string {\n return \"-\";\n }\n\n /**\n * @override\n */\n evalPrefix(val: Result): Result {\n return -val;\n }\n}\n\nexport class And extends Logical {\n constructor(scope: LexicalScope, lhs: Val, rhs: Val) {\n super(scope, lhs, rhs);\n }\n\n /**\n * @override\n */\n getOp(): string {\n return \"&&\";\n }\n\n /**\n * @override\n */\n evaluateCore(context: Context): Result {\n return this.lhs.evaluate(context) && this.rhs.evaluate(context);\n }\n}\n\nexport class AndMedia extends And {\n constructor(scope: LexicalScope, lhs: Val, rhs: Val) {\n super(scope, lhs, rhs);\n }\n\n /**\n * @override\n */\n getOp(): string {\n return \" and \";\n }\n}\n\nexport class Or extends Logical {\n constructor(scope: LexicalScope, lhs: Val, rhs: Val) {\n super(scope, lhs, rhs);\n }\n\n /**\n * @override\n */\n getOp(): string {\n return \"||\";\n }\n\n /**\n * @override\n */\n evaluateCore(context: Context): Result {\n return this.lhs.evaluate(context) || this.rhs.evaluate(context);\n }\n}\n\nexport class OrMedia extends Or {\n constructor(scope: LexicalScope, lhs: Val, rhs: Val) {\n super(scope, lhs, rhs);\n }\n\n /**\n * @override\n */\n getOp(): string {\n return \", \";\n }\n}\n\nexport class Lt extends Comparison {\n constructor(scope: LexicalScope, lhs: Val, rhs: Val) {\n super(scope, lhs, rhs);\n }\n\n /**\n * @override\n */\n getOp(): string {\n return \"<\";\n }\n\n /**\n * @override\n */\n evalInfix(lhs: Result, rhs: Result): Result {\n return lhs < rhs;\n }\n}\n\nexport class Le extends Comparison {\n constructor(scope: LexicalScope, lhs: Val, rhs: Val) {\n super(scope, lhs, rhs);\n }\n\n /**\n * @override\n */\n getOp(): string {\n return \"<=\";\n }\n\n /**\n * @override\n */\n evalInfix(lhs: Result, rhs: Result): Result {\n return lhs <= rhs;\n }\n}\n\nexport class Gt extends Comparison {\n constructor(scope: LexicalScope, lhs: Val, rhs: Val) {\n super(scope, lhs, rhs);\n }\n\n /**\n * @override\n */\n getOp(): string {\n return \">\";\n }\n\n /**\n * @override\n */\n evalInfix(lhs: Result, rhs: Result): Result {\n return lhs > rhs;\n }\n}\n\nexport class Ge extends Comparison {\n constructor(scope: LexicalScope, lhs: Val, rhs: Val) {\n super(scope, lhs, rhs);\n }\n\n /**\n * @override\n */\n getOp(): string {\n return \">=\";\n }\n\n /**\n * @override\n */\n evalInfix(lhs: Result, rhs: Result): Result {\n return lhs >= rhs;\n }\n}\n\nexport class Eq extends Comparison {\n constructor(scope: LexicalScope, lhs: Val, rhs: Val) {\n super(scope, lhs, rhs);\n }\n\n /**\n * @override\n */\n getOp(): string {\n return \"==\";\n }\n\n /**\n * @override\n */\n evalInfix(lhs: Result, rhs: Result): Result {\n return lhs == rhs;\n }\n}\n\nexport class Ne extends Comparison {\n constructor(scope: LexicalScope, lhs: Val, rhs: Val) {\n super(scope, lhs, rhs);\n }\n\n /**\n * @override\n */\n getOp(): string {\n return \"!=\";\n }\n\n /**\n * @override\n */\n evalInfix(lhs: Result, rhs: Result): Result {\n return lhs != rhs;\n }\n}\n\nexport class Add extends Additive {\n constructor(scope: LexicalScope, lhs: Val, rhs: Val) {\n super(scope, lhs, rhs);\n }\n\n /**\n * @override\n */\n getOp(): string {\n return \"+\";\n }\n\n /**\n * @override\n */\n evalInfix(lhs: Result, rhs: Result): Result {\n return (lhs as any) + rhs;\n }\n}\n\nexport class Subtract extends Additive {\n constructor(scope: LexicalScope, lhs: Val, rhs: Val) {\n super(scope, lhs, rhs);\n }\n\n /**\n * @override\n */\n getOp(): string {\n return \" - \";\n }\n\n /**\n * @override\n */\n evalInfix(lhs: Result, rhs: Result): Result {\n return (lhs as any) - (rhs as any);\n }\n}\n\nexport class Multiply extends Multiplicative {\n constructor(scope: LexicalScope, lhs: Val, rhs: Val) {\n super(scope, lhs, rhs);\n }\n\n /**\n * @override\n */\n getOp(): string {\n return \"*\";\n }\n\n /**\n * @override\n */\n evalInfix(lhs: Result, rhs: Result): Result {\n return (lhs as any) * (rhs as any);\n }\n}\n\nexport class Divide extends Multiplicative {\n constructor(scope: LexicalScope, lhs: Val, rhs: Val) {\n super(scope, lhs, rhs);\n }\n\n /**\n * @override\n */\n getOp(): string {\n return \"/\";\n }\n\n /**\n * @override\n */\n evalInfix(lhs: Result, rhs: Result): Result {\n return (lhs as any) / (rhs as any);\n }\n}\n\nexport class Modulo extends Multiplicative {\n constructor(scope: LexicalScope, lhs: Val, rhs: Val) {\n super(scope, lhs, rhs);\n }\n\n /**\n * @override\n */\n getOp(): string {\n return \"%\";\n }\n\n /**\n * @override\n */\n evalInfix(lhs: Result, rhs: Result): Result {\n return (lhs as any) % (rhs as any);\n }\n}\n\n/**\n * Numerical value with a unit.\n */\nexport class Numeric extends Val {\n unit: string;\n\n constructor(scope: LexicalScope, public num: number, unit: string) {\n super(scope);\n this.unit = unit.toLowerCase();\n }\n\n /**\n * @override\n */\n appendTo(buf: Base.StringBuffer, priority: number): void {\n buf.append(this.num.toString());\n buf.append(Base.escapeCSSIdent(this.unit));\n }\n\n /**\n * @override\n */\n evaluateCore(context: Context): Result {\n return this.num * context.queryUnitSize(this.unit, false);\n }\n}\n\n/**\n * Named value.\n * @param qualifiedName CSS-escaped name sequence separated by dots.\n */\nexport class Named extends Val {\n constructor(scope: LexicalScope, public qualifiedName: string) {\n super(scope);\n }\n\n /**\n * @override\n */\n appendTo(buf: Base.StringBuffer, priority: number): void {\n buf.append(this.qualifiedName);\n }\n\n /**\n * @override\n */\n evaluateCore(context: Context): Result {\n return context.evalName(this.scope, this.qualifiedName).evaluate(context);\n }\n\n /**\n * @override\n */\n dependCore(\n other: Val,\n context: Context,\n dependencyCache: DependencyCache,\n ): boolean {\n return (\n other === this ||\n context\n .evalName(this.scope, this.qualifiedName)\n .dependOuter(other, context, dependencyCache)\n );\n }\n}\n\n/**\n * Named value.\n */\nexport class MediaName extends Val {\n // FIXME: This property is added to reduce TypeScript error on `dependCore`\n // but it is never initialized. Is it really correct code?\n value: Val;\n\n constructor(scope: LexicalScope, public not: boolean, public name: string) {\n super(scope);\n }\n\n /**\n * @override\n */\n appendTo(buf: Base.StringBuffer, priority: number): void {\n if (this.not) {\n buf.append(\"not \");\n }\n buf.append(Base.escapeCSSIdent(this.name));\n }\n\n /**\n * @override\n */\n evaluateCore(context: Context): Result {\n return context.evalMediaName(this.name, this.not);\n }\n\n /**\n * @override\n */\n dependCore(\n other: Val,\n context: Context,\n dependencyCache: DependencyCache,\n ): boolean {\n return (\n other === this || this.value.dependOuter(other, context, dependencyCache)\n );\n }\n\n /**\n * @override\n */\n isMediaName(): boolean {\n return true;\n }\n}\n\n/**\n * A value that is calculated by calling a JavaScript function. Note that the\n * result is cached and this function will be called only once between any\n * clears for its scope in the context.\n * @param fn function to call.\n * @param str a way to represent this value in toString() call.\n */\nexport class Native extends Val {\n constructor(\n scope: LexicalScope,\n public fn: () => Result,\n public str: string,\n ) {\n super(scope);\n }\n\n /**\n * @override\n */\n appendTo(buf: Base.StringBuffer, priority: number): void {\n buf.append(this.str);\n }\n\n /**\n * @override\n */\n evaluateCore(context: Context): Result {\n return this.fn.call(context);\n }\n}\n\nexport function appendValArray(buf: Base.StringBuffer, arr: Val[]): void {\n buf.append(\"(\");\n for (let i = 0; i < arr.length; i++) {\n if (i) {\n buf.append(\",\");\n }\n arr[i].appendTo(buf, 0);\n }\n buf.append(\")\");\n}\n\nexport function expandValArray(\n context: Context,\n arr: Val[],\n params: Val[],\n): Val[] {\n let expanded: Val[] = arr;\n for (let i = 0; i < arr.length; i++) {\n const p = arr[i].expand(context, params);\n if (arr !== expanded) {\n expanded[i] = p;\n } else if (p !== arr[i]) {\n expanded = Array(arr.length);\n for (let j = 0; j < i; j++) {\n expanded[j] = arr[j];\n }\n expanded[i] = p;\n }\n }\n return expanded;\n}\n\nexport function evalValArray(context: Context, arr: Val[]): Result[] {\n const result: Result[] = Array(arr.length);\n for (let i = 0; i < arr.length; i++) {\n result[i] = arr[i].evaluate(context);\n }\n return result;\n}\n\nexport class Call extends Val {\n constructor(\n scope: LexicalScope,\n public qualifiedName: string,\n public params: Val[],\n ) {\n super(scope);\n }\n\n /**\n * @override\n */\n appendTo(buf: Base.StringBuffer, priority: number): void {\n buf.append(this.qualifiedName);\n appendValArray(buf, this.params);\n }\n\n /**\n * @override\n */\n evaluateCore(context: Context): Result {\n const body = context.evalCall(\n this.scope,\n this.qualifiedName,\n this.params,\n false,\n );\n return body.expand(context, this.params).evaluate(context);\n }\n\n /**\n * @override\n */\n dependCore(\n other: Val,\n context: Context,\n dependencyCache: DependencyCache,\n ): boolean {\n if (other === this) {\n return true;\n }\n for (let i = 0; i < this.params.length; i++) {\n if (this.params[i].dependOuter(other, context, dependencyCache)) {\n return true;\n }\n }\n const body = context.evalCall(\n this.scope,\n this.qualifiedName,\n this.params,\n true,\n );\n\n // No expansion here!\n return body.dependOuter(other, context, dependencyCache);\n }\n\n /**\n * @override\n */\n expand(context: Context, params: Val[]): Val {\n const expandedParams = expandValArray(context, this.params, params);\n if (expandedParams === this.params) {\n return this;\n }\n return new Call(this.scope, this.qualifiedName, expandedParams);\n }\n}\n\nexport class Cond extends Val {\n constructor(\n scope: LexicalScope,\n public cond: Val,\n public ifTrue: Val,\n public ifFalse: Val,\n ) {\n super(scope);\n }\n\n /**\n * @override\n */\n appendTo(buf: Base.StringBuffer, priority: number): void {\n if (priority > 0) {\n buf.append(\"(\");\n }\n this.cond.appendTo(buf, 0);\n buf.append(\"?\");\n this.ifTrue.appendTo(buf, 0);\n buf.append(\":\");\n this.ifFalse.appendTo(buf, 0);\n if (priority > 0) {\n buf.append(\")\");\n }\n }\n\n /**\n * @override\n */\n evaluateCore(context: Context): Result {\n if (this.cond.evaluate(context)) {\n return this.ifTrue.evaluate(context);\n } else {\n return this.ifFalse.evaluate(context);\n }\n }\n\n /**\n * @override\n */\n dependCore(\n other: Val,\n context: Context,\n dependencyCache: DependencyCache,\n ): boolean {\n return (\n other === this ||\n this.cond.dependOuter(other, context, dependencyCache) ||\n this.ifTrue.dependOuter(other, context, dependencyCache) ||\n this.ifFalse.dependOuter(other, context, dependencyCache)\n );\n }\n\n /**\n * @override\n */\n expand(context: Context, params: Val[]): Val {\n const cond = this.cond.expand(context, params);\n const ifTrue = this.ifTrue.expand(context, params);\n const ifFalse = this.ifFalse.expand(context, params);\n if (\n cond === this.cond &&\n ifTrue === this.ifTrue &&\n ifFalse === this.ifFalse\n ) {\n return this;\n }\n const r = new Cond(this.scope, cond, ifTrue, ifFalse);\n return r;\n }\n}\n\nexport class Const extends Val {\n constructor(scope: LexicalScope, public val: Result) {\n super(scope);\n }\n\n /**\n * @override\n */\n appendTo(buf: Base.StringBuffer, priority: number): void {\n switch (typeof this.val) {\n case \"number\":\n case \"boolean\":\n buf.append(this.val.toString());\n break;\n case \"string\":\n buf.append('\"');\n buf.append(Base.escapeCSSStr(this.val));\n buf.append('\"');\n break;\n default:\n throw new Error(\"F_UNEXPECTED_STATE\");\n }\n }\n\n /**\n * @override\n */\n evaluateCore(context: Context): Result {\n return this.val;\n }\n}\n\nexport class MediaTest extends Val {\n constructor(scope: LexicalScope, public name: MediaName, public value: Val) {\n super(scope);\n }\n\n /**\n * @override\n */\n appendTo(buf: Base.StringBuffer, priority: number): void {\n buf.append(\"(\");\n buf.append(Base.escapeCSSStr(this.name.name));\n buf.append(\":\");\n this.value.appendTo(buf, 0);\n buf.append(\")\");\n }\n\n /**\n * @override\n */\n evaluateCore(context: Context): Result {\n return context.evalMediaTest(this.name.name, this.value);\n }\n\n /**\n * @override\n */\n dependCore(\n other: Val,\n context: Context,\n dependencyCache: DependencyCache,\n ): boolean {\n return (\n other === this || this.value.dependOuter(other, context, dependencyCache)\n );\n }\n\n /**\n * @override\n */\n expand(context: Context, params: Val[]): Val {\n const value = this.value.expand(context, params);\n if (value === this.value) {\n return this;\n }\n const r = new MediaTest(this.scope, this.name, value);\n return r;\n }\n}\n\nexport class Param extends Val {\n constructor(scope: LexicalScope, public index: number) {\n super(scope);\n }\n\n /**\n * @override\n */\n appendTo(buf: Base.StringBuffer, priority: number): void {\n buf.append(\"$\");\n buf.append(this.index.toString());\n }\n\n /**\n * @override\n */\n expand(context: Context, params: Val[]): Val {\n const v = params[this.index];\n if (!v) {\n throw new Error(`Parameter missing: ${this.index}`);\n }\n return v as Val;\n }\n}\n\nexport function and(scope: LexicalScope, v1: Val, v2: Val): Val {\n if (\n v1 === scope._false ||\n v1 === scope.zero ||\n v2 == scope._false ||\n v2 == scope.zero\n ) {\n return scope._false;\n }\n if (v1 === scope._true || v1 === scope.one) {\n return v2;\n }\n if (v2 === scope._true || v2 === scope.one) {\n return v1;\n }\n return new And(scope, v1, v2);\n}\n\nexport function add(scope: LexicalScope, v1: Val, v2: Val): Val {\n if (v1 === scope.zero) {\n return v2;\n }\n if (v2 === scope.zero) {\n return v1;\n }\n return new Add(scope, v1, v2);\n}\n\nexport function sub(scope: LexicalScope, v1: Val, v2: Val): Val {\n if (v1 === scope.zero) {\n return new Negate(scope, v2);\n }\n if (v2 === scope.zero) {\n return v1;\n }\n return new Subtract(scope, v1, v2);\n}\n\nexport function mul(scope: LexicalScope, v1: Val, v2: Val): Val {\n if (v1 === scope.zero || v2 === scope.zero) {\n return scope.zero;\n }\n if (v1 === scope.one) {\n return v2;\n }\n if (v2 === scope.one) {\n return v1;\n }\n return new Multiply(scope, v1, v2);\n}\n\nexport function div(scope: LexicalScope, v1: Val, v2: Val): Val {\n if (v1 === scope.zero) {\n return scope.zero;\n }\n if (v2 === scope.one) {\n return v1;\n }\n return new Divide(scope, v1, v2);\n}\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2015 Trim-marks Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Css - CSS Values and utilities to handle them.\n */\nimport * as Base from \"./base\";\nimport * as Exprs from \"./exprs\";\n\nexport class Visitor {\n /**\n * @return void\n */\n visitValues(values: Val[]): any {\n for (let i = 0; i < values.length; i++) {\n values[i].visit(this);\n }\n }\n\n visitEmpty(empty: Val): Val {\n throw new Error(\"E_CSS_EMPTY_NOT_ALLOWED\");\n }\n\n visitSlash(slash: Val): Val {\n throw new Error(\"E_CSS_SLASH_NOT_ALLOWED\");\n }\n\n visitStr(str: Str): Val {\n throw new Error(\"E_CSS_STR_NOT_ALLOWED\");\n }\n\n visitIdent(ident: Ident): Val {\n throw new Error(\"E_CSS_IDENT_NOT_ALLOWED\");\n }\n\n visitNumeric(numeric: Numeric): Val {\n throw new Error(\"E_CSS_NUMERIC_NOT_ALLOWED\");\n }\n\n visitNum(num: Num): Val {\n throw new Error(\"E_CSS_NUM_NOT_ALLOWED\");\n }\n\n visitInt(num: Int): Val {\n return this.visitNum(num);\n }\n\n visitColor(color: Color): Val {\n throw new Error(\"E_CSS_COLOR_NOT_ALLOWED\");\n }\n\n visitURL(url: URL): Val {\n throw new Error(\"E_CSS_URL_NOT_ALLOWED\");\n }\n\n visitSpaceList(list: SpaceList): Val {\n throw new Error(\"E_CSS_LIST_NOT_ALLOWED\");\n }\n\n visitCommaList(list: CommaList): Val {\n throw new Error(\"E_CSS_COMMA_NOT_ALLOWED\");\n }\n\n visitFunc(func: Func): Val {\n throw new Error(\"E_CSS_FUNC_NOT_ALLOWED\");\n }\n\n visitExpr(expr: Expr): Val {\n throw new Error(\"E_CSS_EXPR_NOT_ALLOWED\");\n }\n}\n\nexport class FilterVisitor extends Visitor {\n constructor() {\n super();\n }\n\n visitValues(values: Val[]): Val[] {\n let arr: Val[] = null;\n for (let i = 0; i < values.length; i++) {\n const before = values[i];\n const after = before.visit(this);\n if (arr) {\n arr[i] = after;\n } else if (before !== after) {\n arr = new Array(values.length);\n for (let k = 0; k < i; k++) {\n arr[k] = values[k];\n }\n arr[i] = after;\n }\n }\n return arr || values;\n }\n\n /**\n * @override\n */\n visitStr(str: Str): Val {\n return str;\n }\n\n /**\n * @override\n */\n visitIdent(ident: Ident): Val {\n return ident;\n }\n\n /**\n * @override\n */\n visitSlash(slash: Val): Val {\n return slash;\n }\n\n /**\n * @override\n */\n visitNumeric(numeric: Numeric): Val {\n return numeric;\n }\n\n /**\n * @override\n */\n visitNum(num: Num): Val {\n return num;\n }\n\n /**\n * @override\n */\n visitInt(num: Int): Val {\n return num;\n }\n\n /**\n * @override\n */\n visitColor(color: Color): Val {\n return color;\n }\n\n /**\n * @override\n */\n visitURL(url: URL): Val {\n return url;\n }\n\n /**\n * @override\n */\n visitSpaceList(list: SpaceList): Val {\n const values = this.visitValues(list.values);\n if (values === list.values) {\n return list;\n }\n return new SpaceList(values);\n }\n\n /**\n * @override\n */\n visitCommaList(list: CommaList): Val {\n const values = this.visitValues(list.values);\n if (values === list.values) {\n return list;\n }\n return new CommaList(values);\n }\n\n /**\n * @override\n */\n visitFunc(func: Func): Val {\n const values = this.visitValues(func.values);\n if (values === func.values) {\n return func;\n }\n return new Func(func.name, values);\n }\n\n /**\n * @override\n */\n visitExpr(expr: Expr): Val {\n return expr;\n }\n}\n\nexport class Val {\n /**\n * @override\n */\n toString(): string {\n const buf = new Base.StringBuffer();\n this.appendTo(buf, true);\n return buf.toString();\n }\n\n stringValue(): string {\n const buf = new Base.StringBuffer();\n this.appendTo(buf, false);\n return buf.toString();\n }\n\n toExpr(scope: Exprs.LexicalScope, ref: Exprs.Val): Exprs.Val {\n throw new Error(\"F_ABSTRACT\");\n }\n\n appendTo(buf: Base.StringBuffer, toString: boolean): void {\n buf.append(\"[error]\");\n }\n\n isExpr(): boolean {\n return false;\n }\n\n isNumeric(): boolean {\n return false;\n }\n\n isNum(): boolean {\n return false;\n }\n\n isIdent(): boolean {\n return false;\n }\n\n isSpaceList(): boolean {\n return false;\n }\n\n visit(visitor: any): any {\n throw new Error(\"F_ABSTRACT\");\n }\n}\n\nexport class Empty extends Val {\n private static empty: Empty;\n\n public static get instance(): Empty {\n if (!this.empty) {\n this.empty = new Empty();\n }\n return this.empty;\n }\n\n private constructor() {\n super();\n }\n\n /**\n * @override\n */\n toExpr(scope: Exprs.LexicalScope, ref: Exprs.Val): Exprs.Val {\n return new Exprs.Const(scope, \"\");\n }\n\n /**\n * @override\n */\n appendTo(buf: Base.StringBuffer, toString: boolean): void {}\n\n /**\n * @override\n */\n visit(visitor: any): any {\n return visitor.visitEmpty(this);\n }\n}\n\nexport const empty: Empty = Empty.instance;\n\nexport class Slash extends Val {\n private static slash: Slash;\n\n public static get instance(): Slash {\n if (!this.slash) {\n this.slash = new Slash();\n }\n return this.slash;\n }\n\n private constructor() {\n super();\n }\n\n /**\n * @override\n */\n toExpr(scope: Exprs.LexicalScope, ref: Exprs.Val): Exprs.Val {\n return new Exprs.Const(scope, \"/\");\n }\n\n /**\n * @override\n */\n appendTo(buf: Base.StringBuffer, toString: boolean): void {\n buf.append(\"/\");\n }\n\n /**\n * @override\n */\n visit(visitor: any): any {\n return visitor.visitSlash(this);\n }\n}\n\nexport const slash: Slash = Slash.instance;\n\nexport class Str extends Val {\n constructor(public str: string) {\n super();\n }\n\n /**\n * @override\n */\n toExpr(scope: Exprs.LexicalScope, ref: Exprs.Val): Exprs.Val {\n return new Exprs.Const(scope, this.str);\n }\n\n /**\n * @override\n */\n appendTo(buf: Base.StringBuffer, toString: boolean): void {\n if (toString) {\n buf.append('\"');\n buf.append(Base.escapeCSSStr(this.str));\n buf.append('\"');\n } else {\n buf.append(this.str);\n }\n }\n\n /**\n * @override\n */\n visit(visitor: any): any {\n return visitor.visitStr(this);\n }\n}\n\nconst nameTable = {};\n\nexport class Ident extends Val {\n constructor(public name: string) {\n super();\n if (nameTable[name]) {\n throw new Error(\"E_INVALID_CALL\");\n }\n nameTable[name] = this;\n }\n\n /**\n * @override\n */\n toExpr(scope: Exprs.LexicalScope, ref: Exprs.Val): Exprs.Val {\n return new Exprs.Const(scope, this.name);\n }\n\n /**\n * @override\n */\n appendTo(buf: Base.StringBuffer, toString: boolean): void {\n if (toString) {\n buf.append(Base.escapeCSSIdent(this.name));\n } else {\n buf.append(this.name);\n }\n }\n\n /**\n * @override\n */\n visit(visitor: any): any {\n return visitor.visitIdent(this);\n }\n\n /**\n * @override\n */\n isIdent(): boolean {\n return true;\n }\n}\n\nexport function getName(name: string): Ident {\n let r = nameTable[name];\n if (!r) {\n r = new Ident(name);\n }\n return r;\n}\n\nexport class Numeric extends Val {\n unit: string;\n\n constructor(public num: number, unit: string) {\n super();\n this.unit = unit.toLowerCase(); // units are case-insensitive in CSS\n }\n\n /**\n * @override\n */\n toExpr(scope: Exprs.LexicalScope, ref: Exprs.Val): Exprs.Val {\n if (this.num == 0) {\n return scope.zero;\n }\n if (ref && this.unit == \"%\") {\n if (this.num == 100) {\n return ref;\n }\n return new Exprs.Multiply(\n scope,\n ref,\n new Exprs.Const(scope, this.num / 100),\n );\n }\n return new Exprs.Numeric(scope, this.num, this.unit);\n }\n\n /**\n * @override\n */\n appendTo(buf: Base.StringBuffer, toString: boolean): void {\n buf.append(this.num.toString());\n buf.append(this.unit);\n }\n\n /**\n * @override\n */\n visit(visitor: any): any {\n return visitor.visitNumeric(this);\n }\n\n /**\n * @override\n */\n isNumeric(): boolean {\n return true;\n }\n}\n\nexport class Num extends Val {\n constructor(public num: number) {\n super();\n }\n\n /**\n * @override\n */\n toExpr(scope: Exprs.LexicalScope, ref: Exprs.Val): Exprs.Val {\n if (this.num == 0) {\n return scope.zero;\n }\n if (this.num == 1) {\n return scope.one;\n }\n return new Exprs.Const(scope, this.num);\n }\n\n /**\n * @override\n */\n appendTo(buf: Base.StringBuffer, toString: boolean): void {\n buf.append(this.num.toString());\n }\n\n /**\n * @override\n */\n visit(visitor: any): any {\n return visitor.visitNum(this);\n }\n\n /**\n * @override\n */\n isNum(): boolean {\n return true;\n }\n}\n\nexport class Int extends Num {\n constructor(num: number) {\n super(num);\n }\n\n /**\n * @override\n */\n visit(visitor: any): any {\n return visitor.visitInt(this);\n }\n}\n\nexport class Color extends Val {\n constructor(public rgb: number) {\n super();\n }\n\n /**\n * @override\n */\n appendTo(buf: Base.StringBuffer, toString: boolean): void {\n buf.append(\"#\");\n const str = this.rgb.toString(16);\n buf.append(\"000000\".substr(str.length));\n buf.append(str);\n }\n\n /**\n * @override\n */\n visit(visitor: any): any {\n return visitor.visitColor(this);\n }\n}\n\nexport class URL extends Val {\n constructor(public url: string) {\n super();\n }\n\n /**\n * @override\n */\n appendTo(buf: Base.StringBuffer, toString: boolean): void {\n buf.append('url(\"');\n buf.append(Base.escapeCSSStr(this.url));\n buf.append('\")');\n }\n\n /**\n * @override\n */\n visit(visitor: any): any {\n return visitor.visitURL(this);\n }\n}\n\nexport function appendList(\n buf: Base.StringBuffer,\n values: Val[],\n separator: string,\n toString: boolean,\n): void {\n const length = values.length;\n if (length > 0) {\n values[0].appendTo(buf, toString);\n for (let i = 1; i < length; i++) {\n buf.append(separator);\n values[i].appendTo(buf, toString);\n }\n }\n}\n\nexport class SpaceList extends Val {\n constructor(public values: Val[]) {\n super();\n }\n\n /**\n * @override\n */\n appendTo(buf: Base.StringBuffer, toString: boolean): void {\n appendList(buf, this.values, \" \", toString);\n }\n\n /**\n * @override\n */\n visit(visitor: any): any {\n return visitor.visitSpaceList(this);\n }\n\n /**\n * @override\n */\n isSpaceList(): boolean {\n return true;\n }\n}\n\nexport class CommaList extends Val {\n constructor(public values: Val[]) {\n super();\n }\n\n /**\n * @override\n */\n appendTo(buf: Base.StringBuffer, toString: boolean): void {\n appendList(buf, this.values, \",\", toString);\n }\n\n /**\n * @override\n */\n visit(visitor: any): any {\n return visitor.visitCommaList(this);\n }\n}\n\nexport class Func extends Val {\n constructor(public name: string, public values: Val[]) {\n super();\n }\n\n /**\n * @override\n */\n appendTo(buf: Base.StringBuffer, toString: boolean): void {\n buf.append(Base.escapeCSSIdent(this.name));\n buf.append(\"(\");\n appendList(buf, this.values, \",\", toString);\n buf.append(\")\");\n }\n\n /**\n * @override\n */\n visit(visitor: any): any {\n return visitor.visitFunc(this);\n }\n}\n\nexport class Expr extends Val {\n constructor(public expr: Exprs.Val) {\n super();\n }\n\n /**\n * @override\n */\n toExpr(): Exprs.Val {\n return this.expr;\n }\n\n /**\n * @override\n */\n appendTo(buf: Base.StringBuffer, toString: boolean): void {\n buf.append(\"-epubx-expr(\");\n this.expr.appendTo(buf, 0);\n buf.append(\")\");\n }\n\n /**\n * @override\n */\n visit(visitor: any): any {\n return visitor.visitExpr(this);\n }\n\n /**\n * @override\n */\n isExpr(): boolean {\n return true;\n }\n}\n\nexport function toNumber(val: Val, context: Exprs.Context): number {\n if (val) {\n if (val.isNumeric()) {\n const numeric = val as Numeric;\n return context.queryUnitSize(numeric.unit, false) * numeric.num;\n }\n if (val.isNum()) {\n return (val as Num).num;\n }\n }\n return 0;\n}\n\n/**\n * Convert numeric value to px\n */\nexport function convertNumericToPx(val: Val, context: Exprs.Context): Numeric {\n return new Numeric(toNumber(val, context), \"px\");\n}\n\nexport const ident: { [key: string]: Ident } = {\n absolute: getName(\"absolute\"),\n all: getName(\"all\"),\n always: getName(\"always\"),\n auto: getName(\"auto\"),\n avoid: getName(\"avoid\"),\n balance: getName(\"balance\"),\n balance_all: getName(\"balance-all\"),\n block: getName(\"block\"),\n block_end: getName(\"block-end\"),\n block_start: getName(\"block-start\"),\n both: getName(\"both\"),\n bottom: getName(\"bottom\"),\n border_box: getName(\"border-box\"),\n break_all: getName(\"break-all\"),\n break_word: getName(\"break-word\"),\n crop: getName(\"crop\"),\n cross: getName(\"cross\"),\n column: getName(\"column\"),\n exclusive: getName(\"exclusive\"),\n _false: getName(\"false\"),\n fixed: getName(\"fixed\"),\n flex: getName(\"flex\"),\n footnote: getName(\"footnote\"),\n footer: getName(\"footer\"),\n header: getName(\"header\"),\n hidden: getName(\"hidden\"),\n horizontal_tb: getName(\"horizontal-tb\"),\n inherit: getName(\"inherit\"),\n inline: getName(\"inline\"),\n inline_block: getName(\"inline-block\"),\n inline_end: getName(\"inline-end\"),\n inline_start: getName(\"inline-start\"),\n landscape: getName(\"landscape\"),\n left: getName(\"left\"),\n line: getName(\"line\"),\n list_item: getName(\"list-item\"),\n ltr: getName(\"ltr\"),\n manual: getName(\"manual\"),\n none: getName(\"none\"),\n normal: getName(\"normal\"),\n oeb_page_foot: getName(\"oeb-page-foot\"),\n oeb_page_head: getName(\"oeb-page-head\"),\n page: getName(\"page\"),\n relative: getName(\"relative\"),\n right: getName(\"right\"),\n same: getName(\"same\"),\n scale: getName(\"scale\"),\n snap_block: getName(\"snap-block\"),\n spread: getName(\"spread\"),\n _static: getName(\"static\"),\n rtl: getName(\"rtl\"),\n table: getName(\"table\"),\n table_caption: getName(\"table-caption\"),\n table_cell: getName(\"table-cell\"),\n table_footer_group: getName(\"table-footer-group\"),\n table_header_group: getName(\"table-header-group\"),\n table_row: getName(\"table-row\"),\n top: getName(\"top\"),\n transparent: getName(\"transparent\"),\n vertical_lr: getName(\"vertical-lr\"),\n vertical_rl: getName(\"vertical-rl\"),\n visible: getName(\"visible\"),\n _true: getName(\"true\"),\n};\n\nexport const hundredPercent: Numeric = new Numeric(100, \"%\");\n\nexport const fullWidth: Numeric = new Numeric(100, \"pvw\");\n\nexport const fullHeight: Numeric = new Numeric(100, \"pvh\");\n\nexport const numericZero: Numeric = new Numeric(0, \"px\");\n\nexport const processingOrder = {\n \"font-size\": 1,\n color: 2,\n};\n\n/**\n * Function to sort property names in the order they should be processed\n */\nexport function processingOrderFn(name1: string, name2: string): number {\n const n1 = processingOrder[name1] || Number.MAX_VALUE;\n const n2 = processingOrder[name2] || Number.MAX_VALUE;\n return n1 - n2;\n}\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2016 Trim-marks Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview GeometryUtil - Geometric utilities.\n */\nimport * as Logging from \"./logging\";\n\nexport class Rect {\n constructor(\n public x1: number,\n public y1: number,\n public x2: number,\n public y2: number,\n ) {}\n}\n\nexport class Point {\n constructor(public x: number, public y: number) {}\n}\n\nexport class Insets {\n constructor(\n public left: number,\n public top: number,\n public right: number,\n public bottom: number,\n ) {}\n}\n\nexport class Segment {\n constructor(\n public low: Point,\n public high: Point,\n public winding: number,\n public shapeId: number,\n ) {}\n}\n\n/**\n * A single band for exclusion result. Left float is from the left box edge\n * to x1. Right float is from x2 to the right box edge.\n */\nexport class Band {\n /** Left float. */\n left: Element | null = null;\n\n /** Right float. */\n right: Element | null = null;\n\n constructor(\n public y1: number,\n public y2: number,\n public x1: number,\n public x2: number,\n ) {}\n}\n\nexport function segmentCompare(s1: Segment, s2: Segment): number {\n return s1.low.y - s2.low.y || s1.low.x - s2.low.x;\n}\n\nexport class Shape {\n constructor(public points: Point[]) {}\n\n /**\n * Converts this shape to a sequence of Segments and adds segments to the\n * given array.\n * @param arr array to add segments.\n * @param id shapeId to write into segments.\n */\n addSegments(arr: Segment[], id: number): void {\n const points = this.points;\n const length = points.length;\n let prev = points[length - 1];\n for (let i = 0; i < length; i++) {\n const curr = points[i];\n let s: Segment;\n if (prev.y < curr.y) {\n s = new Segment(prev, curr, 1, id);\n } else {\n s = new Segment(curr, prev, -1, id);\n }\n arr.push(s);\n prev = curr;\n }\n }\n\n withOffset(offsetX: number, offsetY: number): Shape {\n const points = [];\n for (const p of this.points) {\n points.push(new Point(p.x + offsetX, p.y + offsetY));\n }\n return new Shape(points);\n }\n}\n\nexport function shapeForEllipse(\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n): Shape {\n const count = 20;\n const points: Point[] = [];\n for (let i = 0; i < count; i++) {\n const a = (i * 2 * Math.PI) / count;\n points.push(new Point(cx + rx * Math.sin(a), cy + ry * Math.cos(a)));\n }\n return new Shape(points);\n}\n\nexport function shapeForRect(\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n): Shape {\n return new Shape([\n new Point(x1, y1),\n new Point(x2, y1),\n new Point(x2, y2),\n new Point(x1, y2),\n ]);\n}\n\nexport function shapeForRectObj(r: Rect): Shape {\n return new Shape([\n new Point(r.x1, r.y1),\n new Point(r.x2, r.y1),\n new Point(r.x2, r.y2),\n new Point(r.x1, r.y2),\n ]);\n}\n\nexport class BandIntersection {\n constructor(\n public x: number,\n public winding: number,\n public shapeId: number,\n public lowOrHigh: number,\n ) {}\n}\n\nexport function intersectY(s: Segment, y: number): number {\n const x =\n s.low.x + ((s.high.x - s.low.x) * (y - s.low.y)) / (s.high.y - s.low.y);\n if (isNaN(x)) {\n throw new Error(\"Bad intersection\");\n }\n return x;\n}\n\nexport function addBandIntersections(\n intersections: BandIntersection[],\n s: Segment,\n y1: number,\n y2: number,\n): void {\n let x1: number;\n let w1: number;\n let x2: number;\n let w2: number;\n if (s.high.y < y1) {\n Logging.logger.warn(\"Error: inconsistent segment (1)\");\n }\n if (s.low.y <= y1) {\n // outside\n x1 = intersectY(s, y1);\n w1 = s.winding;\n } else {\n x1 = s.low.x;\n w1 = 0;\n }\n if (s.high.y >= y2) {\n // outside\n x2 = intersectY(s, y2);\n w2 = s.winding;\n } else {\n x2 = s.high.x;\n w2 = 0;\n }\n if (x1 < x2) {\n intersections.push(new BandIntersection(x1, w1, s.shapeId, -1));\n intersections.push(new BandIntersection(x2, w2, s.shapeId, 1));\n } else {\n intersections.push(new BandIntersection(x2, w2, s.shapeId, -1));\n intersections.push(new BandIntersection(x1, w1, s.shapeId, 1));\n }\n}\n\nexport function mergeIntersections(\n intersections: BandIntersection[],\n includeCount: number,\n excludeCount: number,\n): number[] {\n const shapeCount = includeCount + excludeCount;\n const windings1: number[] = Array(shapeCount);\n const windings2: number[] = Array(shapeCount);\n let i: number;\n for (i = 0; i <= shapeCount; i++) {\n windings1[i] = 0;\n windings2[i] = 0;\n }\n const xranges: number[] = [];\n let inside: boolean = false;\n const intersectionCount = intersections.length;\n for (let k = 0; k < intersectionCount; k++) {\n const intersection = intersections[k];\n windings1[intersection.shapeId] += intersection.winding;\n windings2[intersection.shapeId] += intersection.lowOrHigh;\n let stillInside = false;\n for (i = 0; i < includeCount; i++) {\n if (windings1[i] && !windings2[i]) {\n stillInside = true;\n break;\n }\n }\n if (stillInside) {\n for (i = includeCount; i <= shapeCount; i++) {\n if (windings1[i] || windings2[i]) {\n stillInside = false;\n break;\n }\n }\n }\n if (inside != stillInside) {\n xranges.push(intersection.x);\n inside = stillInside;\n }\n }\n return xranges;\n}\n\n/**\n * Round v up to make it a multiple of unit. If unit is zero, return v.\n */\nexport function ceil(v: number, unit: number): number {\n return unit ? Math.ceil(v / unit) * unit : v;\n}\n\n/**\n * Round v down to make it a multiple of unit. If unit is zero, return v.\n */\nexport function floor(v: number, unit: number): number {\n return unit ? Math.floor(v / unit) * unit : v;\n}\n\nexport function rotatePoint(point: Point): Point {\n return new Point(point.y, -point.x);\n}\n\n/**\n * Vertical box to pseudo-horizontal coords.\n */\nexport function rotateBox(box: Rect): Rect {\n return new Rect(box.y1, -box.x2, box.y2, -box.x1);\n}\n\n/**\n * Pseudo-horizontal coords to vertical.\n */\nexport function unrotateBox(box: Rect): Rect {\n return new Rect(-box.y2, box.x1, -box.y1, box.x2);\n}\n\nexport function rotateShape(shape: Shape): Shape {\n return new Shape(shape.points.map((point) => rotatePoint(point)));\n}\n\nexport function shapesToBands(\n box: Rect,\n include: Shape[],\n exclude: Shape[],\n granularity: number,\n snapHeight: number,\n vertical: boolean,\n): Band[] {\n if (vertical) {\n box = rotateBox(box);\n include = include.map((shape) => rotateShape(shape));\n exclude = exclude.map((shape) => rotateShape(shape));\n }\n const includeCount = include.length;\n const excludeCount = exclude ? exclude.length : 0;\n const result: Band[] = [];\n const segments: Segment[] = [];\n let i: number;\n let k: number;\n let segment: Segment;\n for (i = 0; i < includeCount; i++) {\n include[i].addSegments(segments, i);\n }\n for (i = 0; i < excludeCount; i++) {\n exclude[i].addSegments(segments, i + includeCount);\n }\n const segmentCount = segments.length;\n segments.sort(segmentCompare);\n let lowestIncludeIndex = 0;\n while (segments[lowestIncludeIndex].shapeId >= includeCount) {\n lowestIncludeIndex++;\n }\n let y = segments[lowestIncludeIndex].low.y;\n if (y > box.y1) {\n result.push(new Band(box.y1, y, box.x2, box.x2));\n }\n let segmentIndex = 0;\n const activeSegments: Segment[] = [];\n while (\n segmentIndex < segmentCount &&\n (segment = segments[segmentIndex]).low.y < y\n ) {\n if (segment.high.y > y) {\n activeSegments.push(segment);\n }\n segmentIndex++;\n }\n\n // process the segments from low to high y values\n while (segmentIndex < segmentCount || activeSegments.length > 0) {\n // calculate the height of the band to work with\n let y2 = box.y2; // band bottom\n // min possible y2\n const y2min = Math.min(\n ceil(Math.ceil(y + granularity), snapHeight),\n box.y2,\n );\n for (k = 0; k < activeSegments.length && y2 > y2min; k++) {\n segment = activeSegments[k];\n if (segment.low.x == segment.high.x) {\n // vertical\n if (segment.high.y < y2) {\n y2 = Math.max(floor(segment.high.y, snapHeight), y2min);\n }\n } else if (segment.low.x != segment.high.x) {\n // TODO: should we compare y???\n // slanted (not horizontal)\n y2 = y2min;\n }\n }\n if (y2 > box.y2) {\n y2 = box.y2;\n }\n\n // include new segments, decreasing y2 if needed\n while (\n segmentIndex < segmentCount &&\n (segment = segments[segmentIndex]).low.y < y2\n ) {\n if (segment.high.y < y) {\n segmentIndex++;\n continue;\n }\n if (segment.low.y < y2min) {\n if (segment.low.y == segment.high.y && segment.low.y == y) {\n // Horizontal segment that goes right at y is not active,\n // but consume it anyway\n } else {\n activeSegments.push(segment);\n y2 = y2min;\n }\n segmentIndex++;\n } else {\n // Do not consume it, consider bottom edge \"outside\"\n const yn = floor(segment.low.y, snapHeight);\n if (yn < y2) {\n y2 = yn;\n }\n break;\n }\n }\n\n // now look at the band with top at y and bottom at y2\n // activeSegments should list all segments that intersect that band\n\n // find all intersections with the band\n const bandIntersections: BandIntersection[] = [];\n for (k = 0; k < activeSegments.length; k++) {\n addBandIntersections(bandIntersections, activeSegments[k], y, y2);\n }\n bandIntersections.sort(\n (bi1, bi2) => bi1.x - bi2.x || bi1.lowOrHigh - bi2.lowOrHigh,\n );\n const xranges = mergeIntersections(\n bandIntersections,\n includeCount,\n excludeCount,\n );\n if (xranges.length == 0) {\n result.push(new Band(y, y2, box.x2, box.x2));\n } else {\n // get the widest\n let width = 0;\n let x = box.x1;\n for (k = 0; k < xranges.length; k += 2) {\n const rx = Math.max(box.x1, xranges[k]);\n const rw = Math.min(box.x2, xranges[k + 1]) - rx;\n if (rw > width) {\n width = rw;\n x = rx;\n }\n }\n if (width == 0) {\n // no space left\n result.push(new Band(y, y2, box.x2, box.x2));\n } else {\n result.push(\n new Band(y, y2, Math.max(x, box.x1), Math.min(x + width, box.x2)),\n );\n }\n }\n if (y2 == box.y2) {\n break;\n }\n y = y2;\n for (k = activeSegments.length - 1; k >= 0; k--) {\n if (activeSegments[k].high.y <= y2) {\n activeSegments.splice(k, 1);\n }\n }\n }\n normalize(box, result);\n return result;\n}\n\nexport function normalize(box: Rect, bands: Band[]): void {\n let k = bands.length - 1;\n\n // Merge bands with the same x1, x2 and remove unneeded bands at the end.\n // Create fictious last band to merge unneeded bands at the end\n let currBand = new Band(box.y2, box.y2, box.x1, box.x2);\n while (k >= 0) {\n const prevBand = currBand; // result[k+1]\n currBand = bands[k];\n if (\n currBand.y2 - currBand.y1 < 1 || // Remove bands with height less than 1px\n (currBand.x1 == prevBand.x1 && currBand.x2 == prevBand.x2)\n ) {\n prevBand.y1 = currBand.y1; // merge\n bands.splice(k, 1);\n currBand = prevBand;\n }\n k--;\n }\n}\n\n/**\n * Find the index of the bottommost band so that y < band.y2\n */\nexport function findBand(bands: Band[], y: number): number {\n let low = 0;\n let high = bands.length;\n while (low < high) {\n const mid = Math.floor((low + high) / 2);\n if (y >= bands[mid].y2) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n return low;\n}\n\n/**\n * Find the uppermost rectangle contained in the specified rect which occupies\n * full width of the rect without overlapping with any band in the specified\n * bands.\n * @returns Returns null if such rectangle does not exist.\n */\nexport function findUppermostFullyOpenRect(\n bands: Band[],\n rect: Rect,\n): Rect | null {\n if (!bands.length) {\n return rect;\n }\n let topEdge = rect.y1;\n let band: Band;\n let i: number;\n for (i = 0; i < bands.length; i++) {\n band = bands[i];\n if (\n band.y2 > rect.y1 &&\n band.x1 - 0.1 <= rect.x1 &&\n band.x2 + 0.1 >= rect.x2\n ) {\n break;\n } else {\n topEdge = Math.max(topEdge, band.y2);\n }\n }\n let bottomEdge = topEdge;\n for (; i < bands.length; i++) {\n band = bands[i];\n if (\n band.y1 >= rect.y2 ||\n band.x1 - 0.1 > rect.x1 ||\n band.x2 + 0.1 < rect.x2\n ) {\n break;\n } else {\n bottomEdge = band.y2;\n }\n }\n if (i === bands.length) {\n bottomEdge = rect.y2;\n } else {\n bottomEdge = Math.min(bottomEdge, rect.y2);\n }\n if (bottomEdge <= topEdge) {\n return null;\n } else {\n return new Rect(rect.x1, topEdge, rect.x2, bottomEdge);\n }\n}\n\n/**\n * Find the bottommost rectangle contained in the specified rect which occupies\n * full width of the rect without overlapping with any band in the specified\n * bands.\n * @returns Returns null if such rectangle does not exist.\n */\nexport function findBottommostFullyOpenRect(\n bands: Band[],\n rect: Rect,\n): Rect | null {\n if (!bands.length) {\n return rect;\n }\n let bottomEdge = rect.y2;\n let band: Band;\n let i: number;\n for (i = bands.length - 1; i >= 0; i--) {\n band = bands[i];\n if (i === bands.length - 1 && band.y2 < rect.y2) {\n break;\n } else if (\n band.y1 < rect.y2 &&\n band.x1 - 0.1 <= rect.x1 &&\n band.x2 + 0.1 >= rect.x2\n ) {\n break;\n } else {\n bottomEdge = Math.min(bottomEdge, band.y1);\n }\n }\n let topEdge = Math.min(bottomEdge, band.y2);\n for (; i >= 0; i--) {\n band = bands[i];\n if (\n band.y2 <= rect.y1 ||\n band.x1 - 0.1 > rect.x1 ||\n band.x2 + 0.1 < rect.x2\n ) {\n break;\n } else {\n topEdge = band.y1;\n }\n }\n topEdge = Math.max(topEdge, rect.y1);\n if (bottomEdge <= topEdge) {\n return null;\n } else {\n return new Rect(rect.x1, topEdge, rect.x2, bottomEdge);\n }\n}\n\n/**\n * @param side either \"left\" or \"right\"\n */\nexport function positionFloat(\n box: Rect,\n bands: Band[],\n floatBox: Rect,\n side: string,\n): boolean {\n let y = floatBox.y1;\n const floatWidth = floatBox.x2 - floatBox.x1;\n const floatHeight = floatBox.y2 - floatBox.y1;\n let index = findBand(bands, y);\n while (true) {\n // Check if it fits\n const floatBottom = y + floatHeight;\n if (floatBottom > box.y2) {\n return false;\n }\n\n // does not fit vertically\n let x1 = box.x1;\n let x2 = box.x2;\n for (let i = index; i < bands.length && bands[i].y1 < floatBottom; i++) {\n const band = bands[i];\n if (band.x1 > x1) {\n x1 = band.x1;\n }\n if (band.x2 < x2) {\n x2 = band.x2;\n }\n }\n if (x1 + floatWidth <= x2 || index >= bands.length) {\n if (side == \"left\") {\n floatBox.x1 = x1;\n floatBox.x2 = x1 + floatWidth;\n } else {\n floatBox.x1 = x2 - floatWidth;\n floatBox.x2 = x2;\n }\n floatBox.y2 += y - floatBox.y1;\n floatBox.y1 = y;\n return true;\n }\n y = bands[index].y2;\n index++;\n }\n}\n\nexport function addFloatToBands(\n box: Rect,\n bands: Band[],\n floatBox: Rect,\n floatBands: Band[],\n side: string,\n): void {\n if (!floatBands) {\n floatBands = [new Band(floatBox.y1, floatBox.y2, floatBox.x1, floatBox.x2)];\n }\n while (floatBands.length > 0 && floatBands[0].y2 <= box.y1) {\n floatBands.shift();\n }\n if (floatBands.length == 0) {\n return;\n }\n if (floatBands[0].y1 < box.y1) {\n floatBands[0].y1 = box.y1;\n }\n let band: Band;\n const lastY = bands.length == 0 ? box.y1 : bands[bands.length - 1].y2;\n if (lastY < box.y2) {\n // add the tail band that we typically don't keep, it will be cleared by\n // normalize()\n bands.push(new Band(lastY, box.y2, box.x1, box.x2));\n }\n let index = findBand(bands, floatBands[0].y1);\n for (const floatBand of floatBands) {\n if (index == bands.length) {\n break;\n }\n if (bands[index].y1 < floatBand.y1) {\n // split it\n band = bands[index];\n index++;\n bands.splice(index, 0, new Band(floatBand.y1, band.y2, band.x1, band.x2));\n band.y2 = floatBand.y1;\n }\n while (index < bands.length) {\n band = bands[index++];\n if (band.y2 > floatBand.y2) {\n // split it\n bands.splice(\n index,\n 0,\n new Band(floatBand.y2, band.y2, band.x1, band.x2),\n );\n band.y2 = floatBand.y2;\n }\n if (floatBand.x1 != floatBand.x2) {\n // non-empty floatBand\n if (side == \"left\") {\n band.x1 = Math.min(floatBand.x2, box.x2);\n } else {\n band.x2 = Math.max(floatBand.x1, box.x1);\n }\n }\n if (band.y2 == floatBand.y2) {\n break;\n }\n }\n }\n normalize(box, bands);\n}\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2015 Trim-marks Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview CssProp - Support utilities to extract information\n * from various (parsed) CSS values.\n */\nimport * as Base from \"./base\";\nimport * as Css from \"./css\";\nimport * as Exprs from \"./exprs\";\nimport * as GeometryUtil from \"./geometry-util\";\nimport * as Logging from \"./logging\";\n\n//---------------------- value parsers ----------------------------------\nexport class SetVisitor extends Css.Visitor {\n propSet: { [key: string]: boolean } = {};\n\n constructor() {\n super();\n }\n\n /**\n * @override\n */\n visitIdent(ident: Css.Ident): Css.Val {\n this.propSet[ident.name] = true;\n return ident;\n }\n\n /**\n * @override\n */\n visitSpaceList(list: Css.SpaceList): Css.Val {\n this.visitValues(list.values);\n return list;\n }\n}\n\nexport function toSet(val: Css.Val): { [key: string]: boolean } {\n if (val) {\n const visitor = new SetVisitor();\n try {\n val.visit(visitor);\n return visitor.propSet;\n } catch (err) {\n Logging.logger.warn(err, \"toSet:\");\n }\n }\n return {};\n}\n\nexport class IntVisitor extends Css.Visitor {\n constructor(public value: number) {\n super();\n }\n\n /**\n * @override\n */\n visitInt(num: Css.Int): Css.Val {\n this.value = num.num;\n return num;\n }\n}\n\nexport function toInt(val: Css.Val, def: number): number {\n if (val) {\n const visitor = new IntVisitor(def);\n try {\n val.visit(visitor);\n return visitor.value;\n } catch (err) {\n Logging.logger.warn(err, \"toInt: \");\n }\n }\n return def;\n}\n\nexport class ShapeVisitor extends Css.Visitor {\n collect: boolean = false;\n coords: Css.Numeric[] = [];\n name: string | null = null;\n\n constructor() {\n super();\n }\n\n /**\n * @override\n */\n visitNumeric(numeric: Css.Numeric): Css.Val {\n if (this.collect) {\n this.coords.push(numeric);\n }\n return null;\n }\n\n /**\n * @override\n */\n visitNum(num: Css.Num): Css.Val {\n if (this.collect && num.num == 0) {\n this.coords.push(new Css.Numeric(0, \"px\"));\n }\n return null;\n }\n\n /**\n * @override\n */\n visitSpaceList(list: Css.SpaceList): Css.Val {\n this.visitValues(list.values);\n return null;\n }\n\n /**\n * @override\n */\n visitFunc(func: Css.Func): Css.Val {\n if (!this.collect) {\n this.collect = true;\n this.visitValues(func.values);\n this.collect = false;\n this.name = func.name.toLowerCase();\n }\n return null;\n }\n\n getShape(\n x: number,\n y: number,\n width: number,\n height: number,\n context: Exprs.Context,\n ): GeometryUtil.Shape {\n if (this.coords.length > 0) {\n const numbers: number[] = [];\n this.coords.forEach((coord, i) => {\n if (coord.unit == \"%\") {\n let ref = i % 2 == 0 ? width : height;\n if (i == 3 && this.name == \"circle\") {\n ref = Math.sqrt((width * width + height * height) / 2);\n }\n numbers.push((coord.num * ref) / 100);\n } else {\n numbers.push(coord.num * context.queryUnitSize(coord.unit, false));\n }\n });\n switch (this.name) {\n case \"polygon\":\n if (numbers.length % 2 == 0) {\n const points: GeometryUtil.Point[] = [];\n for (let k = 0; k < numbers.length; k += 2) {\n points.push(\n new GeometryUtil.Point(x + numbers[k], y + numbers[k + 1]),\n );\n }\n return new GeometryUtil.Shape(points);\n }\n break;\n case \"rectangle\":\n if (numbers.length == 4) {\n return GeometryUtil.shapeForRect(\n x + numbers[0],\n y + numbers[1],\n x + numbers[0] + numbers[2],\n y + numbers[1] + numbers[3],\n );\n }\n break;\n case \"ellipse\":\n if (numbers.length == 4) {\n return GeometryUtil.shapeForEllipse(\n x + numbers[0],\n y + numbers[1],\n numbers[2],\n numbers[3],\n );\n }\n break;\n case \"circle\":\n if (numbers.length == 3) {\n return GeometryUtil.shapeForEllipse(\n x + numbers[0],\n y + numbers[1],\n numbers[2],\n numbers[2],\n );\n }\n break;\n }\n }\n return null;\n }\n}\n\nexport function toShape(\n val: Css.Val,\n x: number,\n y: number,\n width: number,\n height: number,\n context: Exprs.Context,\n): GeometryUtil.Shape {\n if (val) {\n const visitor = new ShapeVisitor();\n try {\n val.visit(visitor);\n return visitor.getShape(x, y, width, height, context);\n } catch (err) {\n Logging.logger.warn(err, \"toShape:\");\n }\n }\n return GeometryUtil.shapeForRect(x, y, x + width, y + height);\n}\n\nexport class CountersVisitor extends Css.Visitor {\n counters: { [key: string]: number } = {};\n name: string | null = null;\n\n constructor(public readonly reset: boolean) {\n super();\n }\n\n /** @override */\n visitIdent(ident: Css.Ident): Css.Val {\n this.name = ident.toString();\n if (this.reset) {\n this.counters[this.name] = 0;\n } else {\n this.counters[this.name] = (this.counters[this.name] || 0) + 1;\n }\n return ident;\n }\n\n /** @override */\n visitInt(num: Css.Int): Css.Val {\n if (this.name) {\n this.counters[this.name] += num.num - (this.reset ? 0 : 1);\n }\n return num;\n }\n\n /** @override */\n visitSpaceList(list: Css.SpaceList): Css.Val {\n this.visitValues(list.values);\n return list;\n }\n}\n\nexport function toCounters(\n val: Css.Val,\n reset: boolean,\n): { [key: string]: number } {\n const visitor = new CountersVisitor(reset);\n try {\n val.visit(visitor);\n } catch (err) {\n Logging.logger.warn(err, \"toCounters:\");\n }\n return visitor.counters;\n}\n\nexport class UrlTransformVisitor extends Css.FilterVisitor {\n constructor(\n public baseUrl: string,\n public transformer: Base.DocumentURLTransformer,\n ) {\n super();\n }\n\n /** @override */\n visitURL(url: Css.URL): Css.Val {\n return new Css.URL(this.transformer.transformURL(url.url, this.baseUrl));\n }\n}\n","/**\n * Copyright 2016 Trim-marks Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Counters and named strings\n */\nimport * as Asserts from \"./asserts\";\nimport * as Base from \"./base\";\nimport * as CssCascade from \"./css-cascade\";\nimport * as CssProp from \"./css-prop\";\nimport * as CssStyler from \"./css-styler\";\nimport * as Exprs from \"./exprs\";\nimport * as Vgen from \"./vgen\";\nimport * as Vtree from \"./vtree\";\nimport { Layout } from \"./types\";\n\n/**\n * Clone counter values.\n */\nfunction cloneCounterValues(\n counters: CssCascade.CounterValues,\n): CssCascade.CounterValues {\n const result = {};\n Object.keys(counters).forEach((name) => {\n result[name] = Array.from(counters[name]);\n });\n return result;\n}\n\n/**\n * Class representing a reference by target-counter(s).\n * @param targetId ID of the referenced element (transformed by\n * DocumentURLTransformer to handle a reference across multiple source\n * documents)\n * @param resolved If the reference is already resolved or not\n */\nexport class TargetCounterReference {\n pageCounters: CssCascade.CounterValues = null;\n spineIndex: number = -1;\n pageIndex: number = -1;\n\n constructor(public readonly targetId: string, public resolved: boolean) {}\n\n equals(other: TargetCounterReference): boolean {\n if (this === other) {\n return true;\n }\n if (!other) {\n return false;\n }\n return (\n this.targetId === other.targetId &&\n this.resolved === other.resolved &&\n this.spineIndex === other.spineIndex &&\n this.pageIndex === other.pageIndex\n );\n }\n\n /**\n * Returns if the reference is resolved or not.\n */\n isResolved(): boolean {\n return this.resolved;\n }\n\n /**\n * Marks that this reference is resolved.\n */\n resolve() {\n this.resolved = true;\n }\n\n /**\n * Marks that this reference is unresolved.\n */\n unresolve() {\n this.resolved = false;\n }\n}\n\nclass CounterListener implements CssCascade.CounterListener {\n constructor(\n public readonly counterStore: CounterStore,\n public readonly baseURL: string,\n ) {}\n\n /**\n * @override\n */\n countersOfId(id: string, counters: CssCascade.CounterValues) {\n id = this.counterStore.documentURLTransformer.transformFragment(\n id,\n this.baseURL,\n );\n this.counterStore.countersById[id] = counters;\n }\n\n getExprContentListener(): Vtree.ExprContentListener {\n return this.counterStore.getExprContentListener();\n }\n}\n\n/**\n * Map for named string name, element offset, and the string value\n */\ntype NamedStringValues = {\n [name: string]: { [elementOffset: number]: string };\n};\n\nclass CounterResolver implements CssCascade.CounterResolver {\n styler: CssStyler.Styler | null = null;\n namedStringValues: NamedStringValues = {};\n\n constructor(\n public readonly counterStore: CounterStore,\n public readonly baseURL: string,\n public readonly rootScope: Exprs.LexicalScope,\n public readonly pageScope: Exprs.LexicalScope,\n ) {}\n\n setStyler(styler: CssStyler.Styler): void {\n this.styler = styler;\n }\n\n private getFragment(url: string): string | null {\n const r = url.match(/^[^#]*#(.*)$/);\n return r ? r[1] : null;\n }\n\n private getTransformedId(url: string): string {\n let transformedId = this.counterStore.documentURLTransformer.transformURL(\n Base.resolveURL(url, this.baseURL),\n this.baseURL,\n );\n if (transformedId.charAt(0) === \"#\") {\n transformedId = transformedId.substring(1);\n }\n return transformedId;\n }\n\n /**\n * @override\n */\n getPageCounterVal(\n name: string,\n format: (p1: number | null) => string,\n ): Exprs.Val {\n const getCounterNumber = () => {\n const values = this.counterStore.currentPageCounters[name];\n return values && values.length ? values[values.length - 1] : null;\n };\n\n const expr = new Exprs.Native(\n this.pageScope,\n () => format(getCounterNumber()),\n `page-counter-${name}`,\n );\n\n const arrayFormat = (arr) => {\n return format(arr[0]);\n };\n\n this.counterStore.registerPageCounterExpr(name, arrayFormat, expr);\n return expr;\n }\n\n /**\n * @override\n */\n getPageCountersVal(\n name: string,\n format: (p1: number[]) => string,\n ): Exprs.Val {\n const getCounterNumbers = () => {\n return this.counterStore.currentPageCounters[name] || [];\n };\n\n const expr = new Exprs.Native(\n this.pageScope,\n () => format(getCounterNumbers()),\n `page-counters-${name}`,\n );\n this.counterStore.registerPageCounterExpr(name, format, expr);\n return expr;\n }\n\n /**\n * Returns (non page-based) counter values for an element with the specified\n * ID. Returns null if the style of the elements has not been calculated yet\n * (i.e. the element does not exit or it is in a source document which is not\n * loaded yet).\n * @param id Original ID value\n * @param transformedId ID transformed by DocumentURLTransformer to handle a\n * reference across multiple source documents\n * @param lookForElement If true, look ahead for an element with the ID in the\n * current source document when such an element has not appeared yet. Do\n * not set to true during Styler.styleUntil is being called, since in that\n * case Styler.styleUntil can be called again and may lead to internal\n * inconsistency.\n */\n private getTargetCounters(\n id: string | null,\n transformedId: string,\n lookForElement: boolean,\n ): CssCascade.CounterValues | null {\n let targetCounters = this.counterStore.countersById[transformedId];\n if (!targetCounters && lookForElement && id) {\n this.styler.styleUntilIdIsReached(id);\n targetCounters = this.counterStore.countersById[transformedId];\n }\n return targetCounters || null;\n }\n\n /**\n * Returns page-based counter values for an element with the specified ID.\n * Returns null if the element has not been laid out yet.\n * @param transformedId ID transformed by DocumentURLTransformer to handle a\n * reference across multiple source documents\n */\n private getTargetPageCounters(\n transformedId: string,\n ): CssCascade.CounterValues | null {\n if (this.counterStore.currentPage.elementsById[transformedId]) {\n return this.counterStore.currentPageCounters;\n } else {\n return this.counterStore.pageCountersById[transformedId] || null;\n }\n }\n\n /**\n * @override\n */\n getTargetCounterVal(\n url: string,\n name: string,\n format: (p1: number | null) => string,\n ): Exprs.Val {\n const id = this.getFragment(url);\n const transformedId = this.getTransformedId(url);\n\n // Since this method is executed during Styler.styleUntil is being called,\n // set false to lookForElement argument.\n let counters = this.getTargetCounters(id, transformedId, false);\n if (counters && counters[name]) {\n // Since an element-based counter is defined, any page-based counter is\n // obscured even if it exists.\n const countersOfName = counters[name];\n return new Exprs.Const(\n this.rootScope,\n format(countersOfName[countersOfName.length - 1] || null),\n );\n }\n return new Exprs.Native(\n this.pageScope,\n () => {\n // Since This block is evaluated during layout, lookForElement\n // argument can be set to true.\n counters = this.getTargetCounters(id, transformedId, true);\n\n if (counters) {\n if (counters[name]) {\n // Since an element-based counter is defined, any page-based\n // counter is obscured even if it exists.\n const countersOfName = counters[name];\n return format(countersOfName[countersOfName.length - 1] || null);\n } else {\n const pageCounters = this.getTargetPageCounters(transformedId);\n if (pageCounters) {\n // The target element has already been laid out.\n this.counterStore.resolveReference(transformedId);\n if (pageCounters[name]) {\n const pageCountersOfName = pageCounters[name];\n return format(\n pageCountersOfName[pageCountersOfName.length - 1] || null,\n );\n } else {\n // No corresponding counter with the name.\n return format(0);\n }\n } else {\n // The target element has not been laid out yet.\n this.counterStore.saveReferenceOfCurrentPage(\n transformedId,\n false,\n );\n return \"??\"; // TODO more reasonable placeholder?\n }\n }\n } else {\n // The style of target element has not been calculated yet.\n // (The element is in another source document that is not parsed\n // yet)\n this.counterStore.saveReferenceOfCurrentPage(transformedId, false);\n return \"??\"; // TODO more reasonable placeholder?\n }\n },\n `target-counter-${name}-of-${url}`,\n );\n }\n\n /**\n * @override\n */\n getTargetCountersVal(\n url: string,\n name: string,\n format: (p1: number[]) => string,\n ): Exprs.Val {\n const id = this.getFragment(url);\n const transformedId = this.getTransformedId(url);\n return new Exprs.Native(\n this.pageScope,\n () => {\n const pageCounters = this.getTargetPageCounters(transformedId);\n\n if (!pageCounters) {\n // The target element has not been laid out yet.\n this.counterStore.saveReferenceOfCurrentPage(transformedId, false);\n return \"??\"; // TODO more reasonable placeholder?\n } else {\n this.counterStore.resolveReference(transformedId);\n const pageCountersOfName = pageCounters[name] || [];\n const elementCounters = this.getTargetCounters(\n id,\n transformedId,\n true,\n );\n const elementCountersOfName = elementCounters[name] || [];\n return format(pageCountersOfName.concat(elementCountersOfName));\n }\n },\n `target-counters-${name}-of-${url}`,\n );\n }\n\n /**\n * Get value of the CSS string() function\n * https://drafts.csswg.org/css-gcpm-3/#using-named-strings\n */\n getNamedStringVal(name: string, retrievePosition: string): Exprs.Val {\n return new Exprs.Native(\n this.pageScope,\n () => {\n const stringValues = this.namedStringValues[name];\n if (!stringValues) {\n return \"\";\n }\n const offsets = Object.keys(stringValues)\n .map((a) => parseInt(a, 10))\n .sort(Base.numberCompare);\n\n const currentPage = this.counterStore.currentPage;\n const pageStartOffset = currentPage.offset;\n const pageLastOffset = Math.max(\n pageStartOffset,\n ...Array.from(\n currentPage.container.querySelectorAll(\n `[${Base.ELEMENT_OFFSET_ATTR}]`,\n ),\n ).map((e) => parseInt(e.getAttribute(Base.ELEMENT_OFFSET_ATTR), 10)),\n );\n\n let firstOffset = -1;\n let startOffset = -1;\n let lastOffset = -1;\n let firstExceptOffset = -1;\n\n for (let i = 0; i < offsets.length; i++) {\n const offset = offsets[i];\n const offsetPrev = i > 0 ? offsets[i - 1] : -1;\n const offsetNext = i < offsets.length - 1 ? offsets[i + 1] : -1;\n if (offset > pageLastOffset) {\n break;\n }\n if (offset >= pageStartOffset) {\n if (firstOffset < 0) {\n firstOffset = offset;\n firstExceptOffset = -1;\n }\n if (startOffset < 0) {\n if (offset === pageStartOffset) {\n startOffset = offset;\n } else {\n if (offsetPrev < firstOffset) {\n startOffset = offsetPrev;\n }\n // Check if the element at the offset is at beginning of the page\n const elementAtOffset = currentPage.container.querySelector(\n `[${Base.ELEMENT_OFFSET_ATTR}=\"${offset}\"]`,\n );\n if (!elementAtOffset) {\n // title or meta elements are not output, but should be treated as start\n if (startOffset < 0) {\n startOffset = offset;\n }\n } else {\n let elementAtPageStartOffset = currentPage.container.querySelector(\n `[${Base.ELEMENT_OFFSET_ATTR}=\"${pageStartOffset}\"]`,\n );\n if (!elementAtPageStartOffset) {\n // The element at pageStartOffset is not found when page break occured\n // within an element, so use the ancestor element with offset 0 instead.\n elementAtPageStartOffset = currentPage.container.querySelector(\n `[${Base.ELEMENT_OFFSET_ATTR}=\"0\"]`,\n );\n }\n if (elementAtPageStartOffset) {\n // Find if the element at the offset is (the first child of)* the element at page start\n for (\n let element = elementAtPageStartOffset;\n element;\n element = element.firstElementChild\n ) {\n if (element === elementAtOffset) {\n startOffset = offset;\n break;\n }\n }\n }\n }\n }\n }\n lastOffset = offset;\n } else if (offsetNext > pageLastOffset || offsetNext < 0) {\n firstOffset = startOffset = lastOffset = firstExceptOffset = offset;\n }\n }\n\n const stringValue =\n stringValues[\n {\n first: firstOffset,\n start: startOffset,\n last: lastOffset,\n \"first-except\": firstExceptOffset,\n }[retrievePosition]\n ] || \"\";\n\n return stringValue;\n },\n `named-string-${retrievePosition}-${name}`,\n );\n }\n\n /**\n * Set named string for the CSS string-set property\n * https://drafts.csswg.org/css-gcpm-3/#setting-named-strings-the-string-set-pro\n */\n setNamedString(\n name: string,\n stringValue: string,\n cascadeInstance: CssCascade.CascadeInstance,\n ): void {\n const values =\n this.namedStringValues[name] || (this.namedStringValues[name] = {});\n values[cascadeInstance.currentElementOffset] = stringValue;\n }\n}\n\nexport class CounterStore {\n countersById: { [key: string]: CssCascade.CounterValues } = {};\n pageCountersById: { [key: string]: CssCascade.CounterValues } = {};\n currentPageCounters: CssCascade.CounterValues = {};\n previousPageCounters: CssCascade.CounterValues = {};\n currentPageCountersStack: CssCascade.CounterValues[] = [];\n pageIndicesById: {\n [key: string]: { spineIndex: number; pageIndex: number };\n } = {};\n currentPage: Vtree.Page = null;\n newReferencesOfCurrentPage: TargetCounterReference[] = [];\n referencesToSolve: TargetCounterReference[] = [];\n referencesToSolveStack: TargetCounterReference[][] = [];\n unresolvedReferences: { [key: string]: TargetCounterReference[] } = {};\n resolvedReferences: { [key: string]: TargetCounterReference[] } = {};\n private pagesCounterExprs: {\n expr: Exprs.Val;\n format: (p1: number[]) => string;\n }[] = [];\n\n constructor(\n public readonly documentURLTransformer: Base.DocumentURLTransformer,\n ) {\n this.currentPageCounters[\"page\"] = [0];\n }\n\n createCounterListener(baseURL: string): CssCascade.CounterListener {\n return new CounterListener(this, baseURL);\n }\n\n createCounterResolver(\n baseURL: string,\n rootScope: Exprs.LexicalScope,\n pageScope: Exprs.LexicalScope,\n ): CssCascade.CounterResolver {\n return new CounterResolver(this, baseURL, rootScope, pageScope);\n }\n\n setCurrentPage(page: Vtree.Page) {\n this.currentPage = page;\n }\n\n private definePageCounter(counterName: string, value: number) {\n if (this.currentPageCounters[counterName]) {\n this.currentPageCounters[counterName].push(value);\n } else {\n this.currentPageCounters[counterName] = [value];\n }\n }\n\n /**\n * Forcefully set the `page` page-based counter to the specified value.\n */\n forceSetPageCounter(pageNumber: number) {\n const counters = this.currentPageCounters[\"page\"];\n if (!counters || !counters.length) {\n this.currentPageCounters[\"page\"] = [pageNumber];\n } else {\n counters[counters.length - 1] = pageNumber;\n }\n }\n\n /**\n * Update the page-based counters with 'counter-reset' and 'counter-increment'\n * properties within the page context. Call before starting layout of the\n * page.\n */\n updatePageCounters(\n cascadedPageStyle: CssCascade.ElementStyle,\n context: Exprs.Context,\n ) {\n // Save page counters to previousPageCounters before updating\n this.previousPageCounters = cloneCounterValues(this.currentPageCounters);\n let resetMap: { [key: string]: number };\n const reset = cascadedPageStyle[\"counter-reset\"];\n if (reset) {\n const resetVal = reset.evaluate(context);\n if (resetVal) {\n resetMap = CssProp.toCounters(resetVal, true);\n }\n }\n if (resetMap) {\n for (const resetCounterName in resetMap) {\n this.definePageCounter(resetCounterName, resetMap[resetCounterName]);\n }\n }\n let incrementMap: { [key: string]: number };\n const increment = cascadedPageStyle[\"counter-increment\"];\n if (increment) {\n const incrementVal = increment.evaluate(context);\n if (incrementVal) {\n incrementMap = CssProp.toCounters(incrementVal, false);\n }\n }\n\n // If 'counter-increment' for the builtin 'page' counter is absent, add it\n // with value 1.\n if (incrementMap) {\n if (!(\"page\" in incrementMap)) {\n incrementMap[\"page\"] = 1;\n }\n } else {\n incrementMap = {};\n incrementMap[\"page\"] = 1;\n }\n for (const incrementCounterName in incrementMap) {\n if (!this.currentPageCounters[incrementCounterName]) {\n this.definePageCounter(incrementCounterName, 0);\n }\n const counterValues = this.currentPageCounters[incrementCounterName];\n counterValues[counterValues.length - 1] +=\n incrementMap[incrementCounterName];\n }\n }\n\n /**\n * Save current page-based counters values and set them to the values passed\n * in. The saved counter values can be restored by popPageCounters method.\n */\n pushPageCounters(counters: CssCascade.CounterValues) {\n this.currentPageCountersStack.push(this.currentPageCounters);\n this.currentPageCounters = cloneCounterValues(counters);\n }\n\n /**\n * Restore previously saved page-based counter values.\n */\n popPageCounters() {\n this.currentPageCounters = this.currentPageCountersStack.pop();\n }\n\n /**\n * Resolve a reference with the specified ID.\n */\n resolveReference(id: string) {\n const unresolvedRefs = this.unresolvedReferences[id];\n let resolvedRefs = this.resolvedReferences[id];\n if (!resolvedRefs) {\n resolvedRefs = this.resolvedReferences[id] = [];\n }\n let pushed = false;\n for (let i = 0; i < this.referencesToSolve.length; ) {\n const ref = this.referencesToSolve[i];\n if (ref.targetId === id) {\n ref.resolve();\n this.referencesToSolve.splice(i, 1);\n if (unresolvedRefs) {\n const j = unresolvedRefs.indexOf(ref);\n if (j >= 0) {\n unresolvedRefs.splice(j, 1);\n }\n }\n resolvedRefs.push(ref);\n pushed = true;\n } else {\n i++;\n }\n }\n if (!pushed) {\n this.saveReferenceOfCurrentPage(id, true);\n }\n }\n\n /**\n * Save a reference appeared in the current page.\n * @param resolved If the reference is already resolved or not.\n */\n saveReferenceOfCurrentPage(id: string, resolved: boolean) {\n if (!this.newReferencesOfCurrentPage.some((ref) => ref.targetId === id)) {\n const ref = new TargetCounterReference(id, resolved);\n this.newReferencesOfCurrentPage.push(ref);\n }\n }\n\n /**\n * Finish the current page; elements with ID are collected and saved with\n * current page-based counter values internally.\n * @param spineIndex Index of the currently laid out spine item\n * @param pageIndex Index of the currently laid out page in its spine item\n */\n finishPage(spineIndex: number, pageIndex: number) {\n const ids = Object.keys(this.currentPage.elementsById);\n if (ids.length > 0) {\n const currentPageCounters = cloneCounterValues(this.currentPageCounters);\n ids.forEach((id) => {\n this.pageCountersById[id] = currentPageCounters;\n const oldPageIndex = this.pageIndicesById[id];\n if (oldPageIndex && oldPageIndex.pageIndex < pageIndex) {\n const resolvedRefs = this.resolvedReferences[id];\n if (resolvedRefs) {\n let unresolvedRefs = this.unresolvedReferences[id];\n if (!unresolvedRefs) {\n unresolvedRefs = this.unresolvedReferences[id] = [];\n }\n let ref: TargetCounterReference;\n while ((ref = resolvedRefs.shift())) {\n ref.unresolve();\n unresolvedRefs.push(ref);\n }\n }\n }\n this.pageIndicesById[id] = { spineIndex, pageIndex };\n });\n }\n const prevPageCounters = this.previousPageCounters;\n let ref: TargetCounterReference;\n while ((ref = this.newReferencesOfCurrentPage.shift())) {\n ref.pageCounters = prevPageCounters;\n ref.spineIndex = spineIndex;\n ref.pageIndex = pageIndex;\n let arr: TargetCounterReference[];\n if (ref.isResolved()) {\n arr = this.resolvedReferences[ref.targetId];\n if (!arr) {\n arr = this.resolvedReferences[ref.targetId] = [];\n }\n } else {\n arr = this.unresolvedReferences[ref.targetId];\n if (!arr) {\n arr = this.unresolvedReferences[ref.targetId] = [];\n }\n }\n if (arr.every((r) => !ref.equals(r))) {\n arr.push(ref);\n }\n }\n this.currentPage = null;\n }\n\n /**\n * Returns unresolved references pointing to the specified page.\n */\n getUnresolvedRefsToPage(\n page: Vtree.Page,\n ): {\n spineIndex: number;\n pageIndex: number;\n pageCounters: CssCascade.CounterValues;\n refs: TargetCounterReference[];\n }[] {\n let refs: TargetCounterReference[] = [];\n const ids = Object.keys(page.elementsById);\n ids.forEach((id) => {\n const idRefs = this.unresolvedReferences[id];\n if (idRefs) {\n refs = refs.concat(idRefs);\n }\n });\n refs.sort(\n (r1, r2) => r1.spineIndex - r2.spineIndex || r1.pageIndex - r2.pageIndex,\n );\n const result: {\n spineIndex: number;\n pageIndex: number;\n pageCounters: CssCascade.CounterValues;\n refs: TargetCounterReference[];\n }[] = [];\n let o: {\n spineIndex: number;\n pageIndex: number;\n pageCounters: CssCascade.CounterValues;\n refs: TargetCounterReference[];\n } = null;\n refs.forEach((ref) => {\n if (\n !o ||\n o.spineIndex !== ref.spineIndex ||\n o.pageIndex !== ref.pageIndex\n ) {\n o = {\n spineIndex: ref.spineIndex,\n pageIndex: ref.pageIndex,\n pageCounters: ref.pageCounters,\n refs: [ref],\n };\n result.push(o);\n } else {\n o.refs.push(ref);\n }\n });\n return result;\n }\n\n /**\n * Save current references to solve and set them to the values passed in.\n * The saved references can be restored by popReferencesToSolve method.\n */\n pushReferencesToSolve(refs: TargetCounterReference[]) {\n this.referencesToSolveStack.push(this.referencesToSolve);\n this.referencesToSolve = refs;\n }\n\n /**\n * Restore previously saved references to solve.\n */\n popReferencesToSolve() {\n this.referencesToSolve = this.referencesToSolveStack.pop();\n }\n\n registerPageCounterExpr(\n name: string,\n format: (p1: number[]) => string,\n expr: Exprs.Val,\n ) {\n if (name === \"pages\") {\n this.pagesCounterExprs.push({ expr, format });\n }\n }\n\n getExprContentListener(): Vtree.ExprContentListener {\n return this.exprContentListener.bind(this);\n }\n\n private exprContentListener(expr, val, document) {\n const found = this.pagesCounterExprs.findIndex((o) => o.expr === expr) >= 0;\n if (found) {\n const node = document.createElement(\"span\");\n node.textContent = val;\n node.setAttribute(PAGES_COUNTER_ATTR, expr.key);\n return node;\n } else {\n return null;\n }\n }\n\n finishLastPage(viewport: Vgen.Viewport) {\n const nodes = viewport.root.querySelectorAll(`[${PAGES_COUNTER_ATTR}]`);\n const pages = this.currentPageCounters[\"page\"][0];\n for (const node of nodes) {\n const key = node.getAttribute(PAGES_COUNTER_ATTR);\n const i = this.pagesCounterExprs.findIndex((o) => o.expr.key === key);\n Asserts.assert(i >= 0);\n node.textContent = this.pagesCounterExprs[i].format([pages]);\n }\n }\n\n createLayoutConstraint(pageIndex: number): Layout.LayoutConstraint {\n return new LayoutConstraint(this, pageIndex);\n }\n}\n\nexport const PAGES_COUNTER_ATTR = \"data-vivliostyle-pages-counter\";\n\nclass LayoutConstraint implements Layout.LayoutConstraint {\n constructor(\n public readonly counterStore: CounterStore,\n public readonly pageIndex: number,\n ) {}\n\n /**\n * @override\n */\n allowLayout(nodeContext: Vtree.NodeContext): boolean {\n if (!nodeContext || nodeContext.after) {\n return true;\n }\n const viewNode = nodeContext.viewNode;\n if (!viewNode || viewNode.nodeType !== 1) {\n return true;\n }\n const id =\n (viewNode as Element).getAttribute(\"id\") ||\n (viewNode as Element).getAttribute(\"name\");\n if (!id) {\n return true;\n }\n if (\n !this.counterStore.resolvedReferences[id] &&\n !this.counterStore.unresolvedReferences[id]\n ) {\n return true;\n }\n const pageIndex = this.counterStore.pageIndicesById[id];\n if (!pageIndex) {\n return true;\n }\n return this.pageIndex >= pageIndex.pageIndex;\n }\n}\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2017 Trim-marks Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview CssTokenizer - CSS Tokenizer.\n */\n\nexport interface TokenizerHandler {\n error(mnemonics: string, token: Token): void;\n}\n\nexport function escapeParseSingle(str: string): string {\n str = str.substr(1);\n if (str.match(/^[^0-9a-fA-F\\n\\r]$/)) {\n return str;\n }\n const code = parseInt(str, 16);\n if (isNaN(code)) {\n return \"\";\n }\n if (code <= 65535) {\n return String.fromCharCode(code);\n }\n if (code <= 1114111) {\n // non-BMP characters: convert to a surrogate pair\n return String.fromCharCode(\n 55296 | ((code >> 10) & 1023),\n 56320 | (code & 1023),\n );\n }\n\n // not a valid Unicode value\n return \"\\ufffd\";\n}\n\nexport function escapeParse(str: string): string {\n return str.replace(\n /\\\\([0-9a-fA-F]{0,6}(\\r\\n|[ \\n\\r\\t\\f])?|[^0-9a-fA-F\\n\\r])/g,\n escapeParseSingle,\n );\n}\n\n/**\n * @enum {number}\n */\nexport enum TokenType {\n EOF,\n IDENT,\n STR,\n NUMERIC,\n NUM,\n INT,\n FUNC,\n HASH,\n URL,\n CLASS,\n O_PAR,\n C_PAR,\n O_BRC,\n C_BRC,\n O_BRK,\n C_BRK,\n COMMA,\n SEMICOL,\n COLON,\n SLASH,\n AT,\n PERCENT,\n QMARK,\n PLUS,\n MINUS,\n BAR_BAR,\n AMP_AMP,\n\n // those can have \"=\" at the end\n BANG = 31,\n DOLLAR,\n HAT,\n BAR,\n TILDE,\n STAR,\n GT,\n LT,\n EQ,\n\n // tokens above plus \"=\" at the end, order must be the same\n BANG_EQ = 41,\n DOLLAR_EQ,\n HAT_EQ,\n BAR_EQ,\n TILDE_EQ,\n STAR_EQ,\n GT_EQ,\n LT_EQ,\n EQ_EQ,\n COL_COL,\n INVALID,\n LAST = 51,\n}\n\nexport class Token {\n type: TokenType;\n precededBySpace: boolean = false;\n num: number = 0;\n text: string = \"\";\n position: number = 0;\n\n constructor() {\n this.type = TokenType.EOF;\n }\n}\n\n/**\n * @enum {number}\n */\nexport enum Action {\n SPACE = 1,\n INT,\n IDENT,\n BANG,\n HASH = 6,\n DOLLAR,\n PERCENT,\n AMP,\n O_PAR,\n C_PAR,\n STAR,\n PLUS,\n COMMA,\n MINUS,\n DOT,\n SLASH,\n COLON,\n SEMICOL,\n LT,\n EQ,\n GT,\n QMARK,\n AT,\n O_BRK,\n C_BRK,\n O_BRC,\n C_BRC,\n BSLASH,\n HAT,\n BAR,\n TILDE,\n STR1,\n STR2,\n END,\n EQTAIL,\n ENDINT,\n ENDNUM,\n CONT,\n UNIT,\n PCUNIT,\n NUMBER,\n ENDIDNT,\n IDNTESC,\n ENDIDES,\n\n // end of identifier with escapes\n ENDSTR,\n ENDESTR,\n\n // end of string with escapes\n STR1ESC,\n STR2ESC,\n BAR_BAR,\n AMP_AMP,\n FUNC,\n FUNCES,\n COMMENT,\n COMMST,\n ENDNOTK,\n MINMIN,\n TOINT,\n TONUM,\n TOIDENT,\n TOIDES,\n KILL1,\n KILL2,\n URL,\n URL1,\n URL2,\n ENDURL,\n TERMURL,\n FINURL,\n LT_BG,\n LT_BG_M,\n INVALID,\n CHKPOSS,\n CHKPOSN,\n URLESC,\n IDESCH,\n COL_COL,\n TOCLASS,\n CHKSP,\n EOF,\n}\n\nexport function makeActions(def: Action, spec: Action[]): Action[] {\n const a: number[] = Array(128);\n let i: number;\n for (i = 0; i < 128; i++) {\n a[i] = def;\n }\n a[NaN] = def == Action.END ? Action.END : Action.INVALID;\n for (i = 0; i < spec.length; i += 2) {\n a[spec[i]] = spec[i + 1];\n }\n return a;\n}\n\n/**\n * Start of the token.\n */\nexport const actionsNormal: Action[] = [\n Action.INVALID,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID, // 0x00-0x07\n Action.INVALID,\n Action.SPACE,\n Action.SPACE,\n Action.INVALID,\n Action.SPACE,\n Action.SPACE,\n Action.INVALID,\n Action.INVALID, // 0x08-0x0F\n Action.INVALID,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID, // 0x10-0x17\n Action.INVALID,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID, // 0x18-0x1F\n Action.SPACE,\n Action.BANG,\n Action.STR2,\n Action.HASH,\n Action.DOLLAR,\n Action.PERCENT,\n Action.AMP,\n Action.STR1, // 0x20-0x27\n Action.O_PAR,\n Action.C_PAR,\n Action.STAR,\n Action.PLUS,\n Action.COMMA,\n Action.MINUS,\n Action.DOT,\n Action.SLASH, // 0x28-0x2F\n Action.INT,\n Action.INT,\n Action.INT,\n Action.INT,\n Action.INT,\n Action.INT,\n Action.INT,\n Action.INT, // 0x30-0x37\n Action.INT,\n Action.INT,\n Action.COLON,\n Action.SEMICOL,\n Action.LT,\n Action.EQ,\n Action.GT,\n Action.QMARK, // 0x38-0x3F\n Action.AT,\n Action.IDENT,\n Action.IDENT,\n Action.IDENT,\n Action.IDENT,\n Action.IDENT,\n Action.IDENT,\n Action.IDENT, // 0x40-0x47\n Action.IDENT,\n Action.IDENT,\n Action.IDENT,\n Action.IDENT,\n Action.IDENT,\n Action.IDENT,\n Action.IDENT,\n Action.IDENT, // 0x48-0x4F\n Action.IDENT,\n Action.IDENT,\n Action.IDENT,\n Action.IDENT,\n Action.IDENT,\n Action.IDENT,\n Action.IDENT,\n Action.IDENT, // 0x50-0x57\n Action.IDENT,\n Action.IDENT,\n Action.IDENT,\n Action.O_BRK,\n Action.BSLASH,\n Action.C_BRK,\n Action.HAT,\n Action.IDENT, // 0x58-0x5F\n Action.INVALID,\n Action.IDENT,\n Action.IDENT,\n Action.IDENT,\n Action.IDENT,\n Action.IDENT,\n Action.IDENT,\n Action.IDENT, // 0x60-0x67\n Action.IDENT,\n Action.IDENT,\n Action.IDENT,\n Action.IDENT,\n Action.IDENT,\n Action.IDENT,\n Action.IDENT,\n Action.IDENT, // 0x68-0x6F\n Action.IDENT,\n Action.IDENT,\n Action.IDENT,\n Action.IDENT,\n Action.IDENT,\n Action.IDENT,\n Action.IDENT,\n Action.IDENT, // 0x70-0x77\n Action.IDENT,\n Action.IDENT,\n Action.IDENT,\n Action.O_BRC,\n Action.BAR,\n Action.C_BRC,\n Action.TILDE,\n Action.INVALID, // 0x78-0x7F\n];\n\nactionsNormal[NaN] = Action.EOF;\n\n/**\n * Inside identifier.\n */\nexport const actionsIdent: Action[] = [\n Action.ENDIDNT,\n Action.ENDIDNT,\n Action.ENDIDNT,\n Action.ENDIDNT,\n Action.ENDIDNT,\n Action.ENDIDNT,\n Action.ENDIDNT,\n Action.ENDIDNT, // 0x00-0x07\n Action.ENDIDNT,\n Action.ENDIDNT,\n Action.ENDIDNT,\n Action.ENDIDNT,\n Action.ENDIDNT,\n Action.ENDIDNT,\n Action.ENDIDNT,\n Action.ENDIDNT, // 0x08-0x0F\n Action.ENDIDNT,\n Action.ENDIDNT,\n Action.ENDIDNT,\n Action.ENDIDNT,\n Action.ENDIDNT,\n Action.ENDIDNT,\n Action.ENDIDNT,\n Action.ENDIDNT, // 0x10-0x17\n Action.ENDIDNT,\n Action.ENDIDNT,\n Action.ENDIDNT,\n Action.ENDIDNT,\n Action.ENDIDNT,\n Action.ENDIDNT,\n Action.ENDIDNT,\n Action.ENDIDNT, // 0x18-0x1F\n Action.ENDIDNT,\n Action.ENDIDNT,\n Action.ENDIDNT,\n Action.ENDIDNT,\n Action.ENDIDNT,\n Action.ENDIDNT,\n Action.ENDIDNT,\n Action.ENDIDNT, // 0x20-0x27\n Action.FUNC,\n Action.ENDIDNT,\n Action.ENDIDNT,\n Action.ENDIDNT,\n Action.ENDIDNT,\n Action.CONT,\n Action.ENDIDNT,\n Action.ENDIDNT, // 0x28-0x2F\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT, // 0x30-0x37\n Action.CONT,\n Action.CONT,\n Action.ENDIDNT,\n Action.ENDIDNT,\n Action.ENDIDNT,\n Action.ENDIDNT,\n Action.ENDIDNT,\n Action.ENDIDNT, // 0x38-0x3F\n Action.ENDIDNT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT, // 0x40-0x47\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT, // 0x48-0x4F\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT, // 0x50-0x57\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.ENDIDNT,\n Action.IDNTESC,\n Action.ENDIDNT,\n Action.ENDIDNT,\n Action.CONT, // 0x58-0x5F\n Action.ENDIDNT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT, // 0x60-0x67\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT, // 0x68-0x6F\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT, // 0x70-0x77\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.ENDIDNT,\n Action.ENDIDNT,\n Action.ENDIDNT,\n Action.ENDIDNT,\n Action.ENDIDNT, // 0x78-0x7F\n];\n\nactionsIdent[NaN] = Action.ENDIDNT;\n\n/**\n * After dot (either .class or .123)\n */\nexport const actionsNumOrClass: Action[] = [\n Action.INVALID,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID, // 0x00-0x07\n Action.INVALID,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID, // 0x08-0x0F\n Action.INVALID,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID, // 0x10-0x17\n Action.INVALID,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID, // 0x18-0x1F\n Action.INVALID,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID, // 0x20-0x27\n Action.INVALID,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID,\n Action.TOCLASS,\n Action.TONUM,\n Action.INVALID, // 0x28-0x2F\n Action.TONUM,\n Action.TONUM,\n Action.TONUM,\n Action.TONUM,\n Action.TONUM,\n Action.TONUM,\n Action.TONUM,\n Action.TONUM, // 0x30-0x37\n Action.TONUM,\n Action.TONUM,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID, // 0x38-0x3F\n Action.INVALID,\n Action.TOCLASS,\n Action.TOCLASS,\n Action.TOCLASS,\n Action.TOCLASS,\n Action.TOCLASS,\n Action.TOCLASS,\n Action.TOCLASS, // 0x40-0x47\n Action.TOCLASS,\n Action.TOCLASS,\n Action.TOCLASS,\n Action.TOCLASS,\n Action.TOCLASS,\n Action.TOCLASS,\n Action.TOCLASS,\n Action.TOCLASS, // 0x48-0x4F\n Action.TOCLASS,\n Action.TOCLASS,\n Action.TOCLASS,\n Action.TOCLASS,\n Action.TOCLASS,\n Action.TOCLASS,\n Action.TOCLASS,\n Action.TOCLASS, // 0x50-0x57\n Action.TOCLASS,\n Action.TOCLASS,\n Action.TOCLASS,\n Action.INVALID,\n Action.TOIDES,\n Action.INVALID,\n Action.INVALID,\n Action.TOCLASS, // 0x58-0x5F\n Action.INVALID,\n Action.TOCLASS,\n Action.TOCLASS,\n Action.TOCLASS,\n Action.TOCLASS,\n Action.TOCLASS,\n Action.TOCLASS,\n Action.TOCLASS, // 0x60-0x67\n Action.TOCLASS,\n Action.TOCLASS,\n Action.TOCLASS,\n Action.TOCLASS,\n Action.TOCLASS,\n Action.TOCLASS,\n Action.TOCLASS,\n Action.TOCLASS, // 0x68-0x6F\n Action.TOCLASS,\n Action.TOCLASS,\n Action.TOCLASS,\n Action.TOCLASS,\n Action.TOCLASS,\n Action.TOCLASS,\n Action.TOCLASS,\n Action.TOCLASS, // 0x70-0x77\n Action.TOCLASS,\n Action.TOCLASS,\n Action.TOCLASS,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID,\n Action.INVALID, // 0x78-0x7F\n];\n\nactionsIdent[NaN] = Action.ENDIDNT;\n\n/**\n * after '-'\n */\nexport const actionsMinus: Action[] = [\n Action.END,\n Action.END,\n Action.END,\n Action.END,\n Action.END,\n Action.END,\n Action.END,\n Action.END, // 0x00-0x07\n Action.END,\n Action.END,\n Action.END,\n Action.END,\n Action.END,\n Action.END,\n Action.END,\n Action.END, // 0x08-0x0F\n Action.END,\n Action.END,\n Action.END,\n Action.END,\n Action.END,\n Action.END,\n Action.END,\n Action.END, // 0x10-0x17\n Action.END,\n Action.END,\n Action.END,\n Action.END,\n Action.END,\n Action.END,\n Action.END,\n Action.END, // 0x18-0x1F\n Action.END,\n Action.END,\n Action.END,\n Action.END,\n Action.END,\n Action.END,\n Action.END,\n Action.END, // 0x20-0x27\n Action.END,\n Action.END,\n Action.END,\n Action.END,\n Action.END,\n Action.MINMIN,\n Action.TONUM,\n Action.END, // 0x28-0x2F\n Action.TOINT,\n Action.TOINT,\n Action.TOINT,\n Action.TOINT,\n Action.TOINT,\n Action.TOINT,\n Action.TOINT,\n Action.TOINT, // 0x30-0x37\n Action.TOINT,\n Action.TOINT,\n Action.END,\n Action.END,\n Action.END,\n Action.END,\n Action.END,\n Action.END, // 0x38-0x3F\n Action.END,\n Action.TOIDENT,\n Action.TOIDENT,\n Action.TOIDENT,\n Action.TOIDENT,\n Action.TOIDENT,\n Action.TOIDENT,\n Action.TOIDENT, // 0x40-0x47\n Action.TOIDENT,\n Action.TOIDENT,\n Action.TOIDENT,\n Action.TOIDENT,\n Action.TOIDENT,\n Action.TOIDENT,\n Action.TOIDENT,\n Action.TOIDENT, // 0x48-0x4F\n Action.TOIDENT,\n Action.TOIDENT,\n Action.TOIDENT,\n Action.TOIDENT,\n Action.TOIDENT,\n Action.TOIDENT,\n Action.TOIDENT,\n Action.TOIDENT, // 0x50-0x57\n Action.TOIDENT,\n Action.TOIDENT,\n Action.TOIDENT,\n Action.END,\n Action.TOIDES,\n Action.END,\n Action.END,\n Action.TOIDENT, // 0x58-0x5F\n Action.END,\n Action.TOIDENT,\n Action.TOIDENT,\n Action.TOIDENT,\n Action.TOIDENT,\n Action.TOIDENT,\n Action.TOIDENT,\n Action.TOIDENT, // 0x60-0x67\n Action.TOIDENT,\n Action.TOIDENT,\n Action.TOIDENT,\n Action.TOIDENT,\n Action.TOIDENT,\n Action.TOIDENT,\n Action.TOIDENT,\n Action.TOIDENT, // 0x68-0x6F\n Action.TOIDENT,\n Action.TOIDENT,\n Action.TOIDENT,\n Action.TOIDENT,\n Action.TOIDENT,\n Action.TOIDENT,\n Action.TOIDENT,\n Action.TOIDENT, // 0x70-0x77\n Action.TOIDENT,\n Action.TOIDENT,\n Action.TOIDENT,\n Action.END,\n Action.END,\n Action.END,\n Action.END,\n Action.END, // 0x78-0x7F\n];\n\nactionsMinus[NaN] = Action.END;\n\n/**\n * Inside identifier with escape sequence\n */\nexport const actionsIdentEsc: Action[] = [\n Action.ENDIDES,\n Action.ENDIDES,\n Action.ENDIDES,\n Action.ENDIDES,\n Action.ENDIDES,\n Action.ENDIDES,\n Action.ENDIDES,\n Action.ENDIDES, // 0x00-0x07\n Action.ENDIDES,\n Action.CHKPOSS,\n Action.ENDIDES,\n Action.ENDIDES,\n Action.ENDIDES,\n Action.ENDIDES,\n Action.ENDIDES,\n Action.ENDIDES, // 0x08-0x0F\n Action.ENDIDES,\n Action.ENDIDES,\n Action.ENDIDES,\n Action.ENDIDES,\n Action.ENDIDES,\n Action.ENDIDES,\n Action.ENDIDES,\n Action.ENDIDES, // 0x10-0x17\n Action.ENDIDES,\n Action.ENDIDES,\n Action.ENDIDES,\n Action.ENDIDES,\n Action.ENDIDES,\n Action.ENDIDES,\n Action.ENDIDES,\n Action.ENDIDES, // 0x18-0x1F\n Action.CHKPOSS,\n Action.ENDIDES,\n Action.ENDIDES,\n Action.ENDIDES,\n Action.ENDIDES,\n Action.ENDIDES,\n Action.ENDIDES,\n Action.ENDIDES, // 0x20-0x27\n Action.FUNCES,\n Action.ENDIDES,\n Action.ENDIDES,\n Action.ENDIDES,\n Action.ENDIDES,\n Action.ENDIDES,\n Action.ENDIDES,\n Action.ENDIDES, // 0x28-0x2F\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT, // 0x30-0x37\n Action.CONT,\n Action.CONT,\n Action.ENDIDES,\n Action.ENDIDES,\n Action.ENDIDES,\n Action.ENDIDES,\n Action.ENDIDES,\n Action.ENDIDES, // 0x38-0x3F\n Action.ENDIDES,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT, // 0x40-0x47\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT, // 0x48-0x4F\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT, // 0x50-0x57\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.ENDIDES,\n Action.IDNTESC,\n Action.ENDIDES,\n Action.ENDIDES,\n Action.CONT, // 0x58-0x5F\n Action.ENDIDES,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT, // 0x60-0x67\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT, // 0x68-0x6F\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT, // 0x70-0x77\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.ENDIDES,\n Action.ENDIDES,\n Action.ENDIDES,\n Action.ENDIDES,\n Action.ENDIDES, // 0x78-0x7F\n];\n\nactionsIdentEsc[NaN] = Action.ENDIDES;\n\n/**\n * Inside integer\n */\nexport const actionsInt: Action[] = [\n Action.ENDINT,\n Action.ENDINT,\n Action.ENDINT,\n Action.ENDINT,\n Action.ENDINT,\n Action.ENDINT,\n Action.ENDINT,\n Action.ENDINT, // 0x00-0x07\n Action.ENDINT,\n Action.ENDINT,\n Action.ENDINT,\n Action.ENDINT,\n Action.ENDINT,\n Action.ENDINT,\n Action.ENDINT,\n Action.ENDINT, // 0x08-0x0F\n Action.ENDINT,\n Action.ENDINT,\n Action.ENDINT,\n Action.ENDINT,\n Action.ENDINT,\n Action.ENDINT,\n Action.ENDINT,\n Action.ENDINT, // 0x10-0x17\n Action.ENDINT,\n Action.ENDINT,\n Action.ENDINT,\n Action.ENDINT,\n Action.ENDINT,\n Action.ENDINT,\n Action.ENDINT,\n Action.ENDINT, // 0x18-0x1F\n Action.ENDINT,\n Action.ENDINT,\n Action.ENDINT,\n Action.ENDINT,\n Action.ENDINT,\n Action.PCUNIT,\n Action.ENDINT,\n Action.ENDINT, // 0x20-0x27\n Action.ENDINT,\n Action.ENDINT,\n Action.ENDINT,\n Action.ENDINT,\n Action.ENDINT,\n Action.ENDINT,\n Action.NUMBER,\n Action.ENDINT, // 0x28-0x2F\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT, // 0x30-0x37\n Action.CONT,\n Action.CONT,\n Action.ENDINT,\n Action.ENDINT,\n Action.ENDINT,\n Action.ENDINT,\n Action.ENDINT,\n Action.ENDINT, // 0x38-0x3F\n Action.ENDINT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT, // 0x40-0x47\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT, // 0x48-0x4F\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT, // 0x50-0x57\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.ENDINT,\n Action.ENDINT,\n Action.ENDINT,\n Action.ENDINT,\n Action.UNIT, // 0x58-0x5F\n Action.ENDINT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT, // 0x60-0x67\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT, // 0x68-0x6F\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT, // 0x70-0x77\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.ENDINT,\n Action.ENDINT,\n Action.ENDINT,\n Action.ENDINT,\n Action.ENDINT, // 0x78-0x7F\n];\n\nactionsInt[NaN] = Action.ENDINT;\n\n/**\n * inside real, after dot\n */\nexport const actionsNumber: Action[] = [\n Action.ENDNUM,\n Action.ENDNUM,\n Action.ENDNUM,\n Action.ENDNUM,\n Action.ENDNUM,\n Action.ENDNUM,\n Action.ENDNUM,\n Action.ENDNUM, // 0x00-0x07\n Action.ENDNUM,\n Action.ENDNUM,\n Action.ENDNUM,\n Action.ENDNUM,\n Action.ENDNUM,\n Action.ENDNUM,\n Action.ENDNUM,\n Action.ENDNUM, // 0x08-0x0F\n Action.ENDNUM,\n Action.ENDNUM,\n Action.ENDNUM,\n Action.ENDNUM,\n Action.ENDNUM,\n Action.ENDNUM,\n Action.ENDNUM,\n Action.ENDNUM, // 0x10-0x17\n Action.ENDNUM,\n Action.ENDNUM,\n Action.ENDNUM,\n Action.ENDNUM,\n Action.ENDNUM,\n Action.ENDNUM,\n Action.ENDNUM,\n Action.ENDNUM, // 0x18-0x1F\n Action.ENDNUM,\n Action.ENDNUM,\n Action.ENDNUM,\n Action.ENDNUM,\n Action.ENDNUM,\n Action.PCUNIT,\n Action.ENDNUM,\n Action.ENDNUM, // 0x20-0x27\n Action.ENDNUM,\n Action.ENDNUM,\n Action.ENDNUM,\n Action.ENDNUM,\n Action.ENDNUM,\n Action.ENDNUM,\n Action.ENDNUM,\n Action.ENDNUM, // 0x28-0x2F\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT,\n Action.CONT, // 0x30-0x37\n Action.CONT,\n Action.CONT,\n Action.ENDNUM,\n Action.ENDNUM,\n Action.ENDNUM,\n Action.ENDNUM,\n Action.ENDNUM,\n Action.ENDNUM, // 0x38-0x3F\n Action.ENDNUM,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT, // 0x40-0x47\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT, // 0x48-0x4F\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT, // 0x50-0x57\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.ENDNUM,\n Action.ENDNUM,\n Action.ENDNUM,\n Action.ENDNUM,\n Action.UNIT, // 0x58-0x5F\n Action.ENDNUM,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT, // 0x60-0x67\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT, // 0x68-0x6F\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.UNIT, // 0x70-0x77\n Action.UNIT,\n Action.UNIT,\n Action.UNIT,\n Action.ENDNUM,\n Action.ENDNUM,\n Action.ENDNUM,\n Action.ENDNUM,\n Action.ENDNUM, // 0x78-0x7F\n];\n\nactionsNumber[NaN] = Action.ENDNUM;\n\nexport const actionsCheckEq: Action[] = makeActions(Action.END, [\n 61 /*=*/,\n Action.EQTAIL,\n]);\n\nexport const actionsColon: Action[] = makeActions(Action.END, [\n 58 /*:*/,\n Action.COL_COL,\n]);\n\nexport const actionsBar: Action[] = makeActions(Action.END, [\n 61 /*=*/,\n Action.EQTAIL,\n 124 /*|*/,\n Action.BAR_BAR,\n]);\n\nexport const actionsAmp: Action[] = makeActions(Action.END, [\n 38 /*&*/,\n Action.AMP_AMP,\n]);\n\nexport const actionsSlash: Action[] = makeActions(Action.END, [\n 42 /* * */,\n Action.COMMENT,\n]);\n\nexport const actionsComment: Action[] = makeActions(Action.CONT, [\n 42 /* * */,\n Action.COMMST,\n]);\n\nexport const actionsCommentStar: Action[] = makeActions(Action.COMMENT, [\n 42 /* * */,\n Action.COMMST,\n 47 /* / */,\n Action.ENDNOTK,\n]);\n\nexport const actionsMinusMinus: Action[] = makeActions(Action.KILL1, [\n 62 /* > */,\n Action.ENDNOTK,\n]);\n\nexport const actionsLt: Action[] = makeActions(Action.END, [\n 61 /*=*/,\n Action.EQTAIL,\n 33 /*!*/,\n Action.LT_BG,\n]);\n\nexport const actionsLtBang: Action[] = makeActions(Action.KILL1, [\n 45 /*-*/,\n Action.LT_BG_M,\n]);\n\nexport const actionsLtBangMinus: Action[] = makeActions(Action.KILL2, [\n 45 /*-*/,\n Action.ENDNOTK,\n]);\n\nexport const actionsIdentEscChr: Action[] = makeActions(Action.IDESCH, [\n 9 /*tab*/,\n Action.INVALID,\n 10 /*LF*/,\n Action.INVALID,\n 13 /*CR*/,\n Action.INVALID,\n 32 /*sp*/,\n Action.INVALID,\n]);\n\nexport const actionsStr1: Action[] = makeActions(Action.CONT, [\n 39 /*'*/,\n Action.ENDSTR,\n 10 /*LF*/,\n Action.INVALID,\n 13 /*CR*/,\n Action.INVALID,\n 92 /*\\*/,\n Action.STR1ESC,\n]);\n\nexport const actionsStr2: Action[] = makeActions(Action.CONT, [\n 34 /*\"*/,\n Action.ENDSTR,\n 10 /*LF*/,\n Action.INVALID,\n 13 /*CR*/,\n Action.INVALID,\n 92 /*\\*/,\n Action.STR2ESC,\n]);\n\nexport const actionsStr1Esc: Action[] = makeActions(Action.CONT, [\n 39 /*'*/,\n Action.ENDESTR,\n 10 /*LF*/,\n Action.CHKPOSN,\n 13 /*CR*/,\n Action.CHKPOSN,\n 92 /*\\*/,\n Action.STR1ESC,\n]);\n\nexport const actionsStr2Esc: Action[] = makeActions(Action.CONT, [\n 34 /*\"*/,\n Action.ENDESTR,\n 10 /*LF*/,\n Action.CHKPOSN,\n 13 /*CR*/,\n Action.CHKPOSN,\n 92 /*\\*/,\n Action.STR2ESC,\n]);\n\nexport const actionsURL: Action[] = makeActions(Action.URL, [\n 9 /*tab*/,\n Action.CONT,\n 32 /*sp*/,\n Action.CONT,\n 34 /*\"*/,\n Action.URL2,\n 39 /*'*/,\n Action.URL1,\n 41 /*)*/,\n Action.INVALID,\n 10 /*LF*/,\n Action.CONT,\n 13 /*CR*/,\n Action.CONT,\n]);\n\nexport const actionsURLInside: Action[] = makeActions(Action.CONT, [\n 41 /*)*/,\n Action.ENDURL,\n 9 /*TAB*/,\n Action.CHKSP,\n 10 /*LF*/,\n Action.CHKSP,\n 13 /*CR*/,\n Action.CHKSP,\n 32 /*sp*/,\n Action.CHKSP,\n 92 /*\\*/,\n Action.URLESC,\n 40 /*(*/,\n Action.INVALID,\n 91 /*[*/,\n Action.INVALID,\n 93 /*]*/,\n Action.INVALID,\n 123 /*{*/,\n Action.INVALID,\n 125 /*}*/,\n Action.INVALID,\n NaN,\n Action.ENDURL,\n]);\n\nexport const actionsURLInside1: Action[] = makeActions(Action.CONT, [\n 39 /*'*/,\n Action.TERMURL,\n 10 /*LF*/,\n Action.CHKPOSN,\n 13 /*CR*/,\n Action.CHKPOSN,\n 92 /*\\*/,\n Action.URLESC,\n NaN,\n Action.ENDURL,\n]);\n\nexport const actionsURLInside2: Action[] = makeActions(Action.CONT, [\n 34 /*\"*/,\n Action.TERMURL,\n 10 /*LF*/,\n Action.CHKPOSN,\n 13 /*CR*/,\n Action.CHKPOSN,\n 92 /*\\*/,\n Action.URLESC,\n NaN,\n Action.ENDURL,\n]);\n\nexport const actionsURLTail: Action[] = makeActions(Action.INVALID, [\n 9 /*tab*/,\n Action.CONT,\n 10 /*LF*/,\n Action.CONT,\n 13 /*CR*/,\n Action.CONT,\n 32 /*sp*/,\n Action.CONT,\n 41 /*)*/,\n Action.FINURL,\n]);\n\nexport const INITIAL_INDEX_MASK = 15;\n\nexport class Tokenizer {\n indexMask: number;\n buffer: Token[];\n head: number = -1; // saved, occupied if >= 0\n tail: number = 0; // available, ready to write\n curr: number = 0; // ready to read\n position: number = 0;\n\n constructor(public input: string, public readonly handler: TokenizerHandler) {\n this.indexMask = INITIAL_INDEX_MASK;\n this.buffer = Array(this.indexMask + 1);\n for (let i = 0; i <= this.indexMask; i++) {\n this.buffer[i] = new Token();\n }\n }\n\n token(): Token {\n if (this.tail == this.curr) {\n this.fillBuffer();\n }\n return this.buffer[this.curr];\n }\n\n nthToken(n: number): Token {\n if (((this.tail - this.curr) & this.indexMask) <= n) {\n this.fillBuffer();\n }\n return this.buffer[(this.curr + n) & this.indexMask];\n }\n\n consume(): void {\n this.curr = (this.curr + 1) & this.indexMask;\n }\n\n mark(): void {\n if (this.head >= 0) {\n throw new Error(\"F_CSSTOK_BAD_CALL mark\");\n }\n this.head = this.curr;\n }\n\n reset(): void {\n if (this.head < 0) {\n throw new Error(\"F_CSSTOK_BAD_CALL reset\");\n }\n this.curr = this.head;\n this.head = -1;\n }\n\n unmark(): void {\n this.head = -1;\n }\n\n hasMark(): boolean {\n return this.head >= 0;\n }\n\n private reallocate(): void {\n const newIndexMask = 2 * (this.indexMask + 1) - 1;\n const newBuffer: Token[] = Array(newIndexMask + 1);\n let oldIndex = this.head;\n let newIndex = 0;\n while (oldIndex != this.tail) {\n newBuffer[newIndex] = this.buffer[oldIndex];\n if (oldIndex == this.curr) {\n this.curr = newIndex;\n }\n oldIndex = (oldIndex + 1) & this.indexMask;\n newIndex++;\n }\n this.head = 0;\n this.tail = newIndex;\n this.indexMask = newIndexMask;\n this.buffer = newBuffer;\n while (newIndex <= newIndexMask) {\n newBuffer[newIndex++] = new Token();\n }\n }\n\n private error(position, token, mnemonics) {\n if (this.handler) {\n this.handler.error(mnemonics, token);\n }\n }\n\n private fillBuffer(): void {\n let tail = this.tail;\n let head = this.head >= 0 ? this.head : this.curr;\n let indexMask = this.indexMask;\n if (tail >= head) {\n head += indexMask;\n } else {\n head--;\n }\n if (head == tail) {\n // only expect to get here when mark is in effect\n if (this.head < 0) {\n throw new Error(\"F_CSSTOK_INTERNAL\");\n }\n this.reallocate();\n tail = this.tail;\n indexMask = this.indexMask;\n head = indexMask; // this.head is zero\n }\n let actions = actionsNormal;\n const input = this.input;\n let position = this.position;\n const buffer = this.buffer;\n let tokenType: TokenType = TokenType.EOF;\n let tokenPosition: number = 0;\n let tokenText: string = \"\";\n let tokenNum: number = 0;\n let seenSpace = false;\n let token: Token = buffer[tail];\n let backslashPos = -9; // far enough before the start of the string\n while (true) {\n const charCode = input.charCodeAt(position);\n switch (actions[charCode] || actions[65] /*A*/) {\n case Action.INVALID:\n tokenType = TokenType.INVALID;\n if (isNaN(charCode)) {\n tokenText = \"E_CSS_UNEXPECTED_EOF\";\n } else {\n tokenText = \"E_CSS_UNEXPECTED_CHAR\";\n }\n actions = actionsNormal;\n position++;\n break;\n case Action.SPACE:\n position++;\n seenSpace = true;\n continue;\n case Action.INT:\n tokenPosition = position++;\n actions = actionsInt;\n continue;\n case Action.IDENT:\n tokenType = TokenType.IDENT;\n tokenPosition = position++;\n actions = actionsIdent;\n continue;\n case Action.BANG:\n tokenPosition = position++;\n tokenType = TokenType.BANG;\n actions = actionsCheckEq;\n continue;\n case Action.STR1:\n tokenType = TokenType.STR;\n tokenPosition = ++position; // after quote\n actions = actionsStr1;\n continue;\n case Action.STR2:\n tokenType = TokenType.STR;\n tokenPosition = ++position; // after quote\n actions = actionsStr2;\n continue;\n case Action.HASH:\n tokenPosition = ++position; // after hash\n tokenType = TokenType.HASH;\n actions = actionsIdent;\n continue;\n case Action.DOLLAR:\n tokenPosition = position++;\n tokenType = TokenType.DOLLAR;\n actions = actionsCheckEq;\n continue;\n case Action.PERCENT:\n tokenPosition = position++;\n tokenType = TokenType.PERCENT;\n break;\n case Action.AMP:\n tokenPosition = position++;\n tokenType = TokenType.DOLLAR;\n actions = actionsAmp;\n continue;\n case Action.O_PAR:\n tokenPosition = position++;\n tokenType = TokenType.O_PAR;\n break;\n case Action.C_PAR:\n tokenPosition = position++;\n tokenType = TokenType.C_PAR;\n break;\n case Action.STAR:\n tokenPosition = position++;\n tokenType = TokenType.STAR;\n actions = actionsCheckEq;\n continue;\n case Action.PLUS:\n tokenPosition = position++;\n tokenType = TokenType.PLUS;\n break;\n case Action.COMMA:\n tokenPosition = position++;\n tokenType = TokenType.COMMA;\n break;\n case Action.MINUS:\n tokenType = TokenType.MINUS;\n tokenPosition = position++;\n actions = actionsMinus;\n continue;\n case Action.DOT:\n tokenPosition = position++;\n actions = actionsNumOrClass;\n continue;\n case Action.TOCLASS:\n tokenPosition = position++;\n tokenType = TokenType.CLASS;\n actions = actionsIdent;\n continue;\n case Action.SLASH:\n tokenPosition = position++;\n tokenType = TokenType.SLASH;\n actions = actionsSlash;\n continue;\n case Action.COLON:\n tokenPosition = position++;\n tokenType = TokenType.COLON;\n actions = actionsColon;\n continue;\n case Action.COL_COL:\n position++;\n tokenType = TokenType.COL_COL;\n break;\n case Action.SEMICOL:\n tokenPosition = position++;\n tokenType = TokenType.SEMICOL;\n break;\n case Action.LT:\n tokenPosition = position++;\n tokenType = TokenType.LT;\n actions = actionsLt;\n continue;\n case Action.EQ:\n tokenPosition = position++;\n tokenType = TokenType.EQ;\n actions = actionsCheckEq;\n continue;\n case Action.GT:\n tokenPosition = position++;\n tokenType = TokenType.GT;\n actions = actionsCheckEq;\n continue;\n case Action.QMARK:\n tokenPosition = position++;\n tokenType = TokenType.QMARK;\n break;\n case Action.AT:\n tokenPosition = ++position; // after \"at\" sign\n tokenType = TokenType.AT;\n actions = actionsIdent;\n continue;\n case Action.O_BRK:\n tokenPosition = position++;\n tokenType = TokenType.O_BRK;\n break;\n case Action.C_BRK:\n tokenPosition = position++;\n tokenType = TokenType.C_BRK;\n break;\n case Action.O_BRC:\n tokenPosition = position++;\n tokenType = TokenType.O_BRC;\n break;\n case Action.C_BRC:\n tokenPosition = position++;\n tokenType = TokenType.C_BRC;\n break;\n case Action.BSLASH:\n tokenPosition = position++;\n backslashPos = tokenPosition;\n tokenType = TokenType.IDENT;\n actions = actionsIdentEscChr;\n continue;\n case Action.HAT:\n tokenPosition = position++;\n tokenType = TokenType.HAT;\n actions = actionsCheckEq;\n continue;\n case Action.BAR:\n tokenPosition = position++;\n tokenType = TokenType.BAR;\n actions = actionsBar;\n continue;\n case Action.TILDE:\n tokenPosition = position++;\n tokenType = TokenType.TILDE;\n actions = actionsCheckEq;\n continue;\n case Action.END:\n // don't consume current char\n break;\n case Action.EQTAIL:\n position++;\n tokenType = (tokenType +\n TokenType.BANG_EQ -\n TokenType.BANG) as TokenType;\n break;\n case Action.ENDINT:\n // don't consume current char\n tokenType = TokenType.INT;\n tokenNum = parseInt(input.substring(tokenPosition, position), 10);\n break;\n case Action.ENDNUM:\n // don't consume current char\n tokenType = TokenType.NUM;\n tokenNum = parseFloat(input.substring(tokenPosition, position));\n break;\n case Action.CONT:\n // just consume current char\n position++;\n continue;\n case Action.UNIT:\n tokenType = TokenType.NUMERIC;\n tokenNum = parseFloat(input.substring(tokenPosition, position));\n tokenPosition = position++;\n actions = actionsIdent;\n continue;\n case Action.PCUNIT:\n tokenType = TokenType.NUMERIC;\n tokenNum = parseFloat(input.substring(tokenPosition, position));\n tokenText = \"%\";\n tokenPosition = position++; // for consistency with alphabetic units\n break;\n case Action.NUMBER:\n position++;\n actions = actionsNumber;\n continue;\n case Action.ENDIDNT:\n // don't consume current char\n // tokenType should be set already\n tokenText = input.substring(tokenPosition, position);\n break;\n case Action.IDNTESC:\n backslashPos = position++;\n actions = actionsIdentEscChr;\n continue;\n case Action.ENDIDES:\n // end of identifier with escapes\n // don't consume current char\n // tokenType should be set already\n tokenText = escapeParse(input.substring(tokenPosition, position));\n break;\n case Action.ENDSTR:\n tokenText = input.substring(tokenPosition, position); // consume closing quote\n position++;\n break;\n case Action.ENDESTR:\n tokenText = escapeParse(input.substring(tokenPosition, position)); // consume closing quote\n position++;\n break;\n case Action.STR1ESC:\n backslashPos = position;\n position += 2; // consume character after backslash in any case\n actions = actionsStr1Esc;\n continue;\n case Action.STR2ESC:\n backslashPos = position;\n position += 2; // consume character after backslash in any case\n actions = actionsStr2Esc;\n continue;\n case Action.BAR_BAR:\n position++;\n tokenType = TokenType.BAR_BAR;\n break;\n case Action.AMP_AMP:\n position++;\n tokenType = TokenType.AMP_AMP;\n break;\n case Action.FUNC:\n // tokenType can be TokenType.IDENT,\n // TokenType.CLASS, TokenType.AT,\n // TokenType.HASH, TokenType.NUMERIC\n tokenText = input.substring(tokenPosition, position);\n if (tokenType == TokenType.IDENT) {\n position++; // consume\n if (tokenText.toLowerCase() == \"url\") {\n actions = actionsURL;\n continue;\n }\n tokenType = TokenType.FUNC;\n }\n break;\n case Action.FUNCES:\n // tokenType can be TokenType.IDENT,\n // TokenType.CLASS, TokenType.AT,\n // TokenType.HASH, T_NUMERIC\n tokenText = escapeParse(input.substring(tokenPosition, position));\n if (tokenType == TokenType.IDENT) {\n position++; // consume\n if (tokenText.toLowerCase() == \"url\") {\n actions = actionsURL;\n continue;\n }\n tokenType = TokenType.FUNC;\n }\n break;\n case Action.COMMENT:\n actions = actionsComment;\n position++;\n continue;\n case Action.COMMST:\n actions = actionsCommentStar;\n position++;\n continue;\n case Action.ENDNOTK:\n actions = actionsNormal;\n position++;\n continue;\n case Action.MINMIN:\n actions = actionsMinusMinus;\n position++;\n continue;\n case Action.TOINT:\n tokenType = TokenType.INT;\n actions = actionsInt;\n position++;\n continue;\n case Action.TONUM:\n tokenType = TokenType.NUM;\n actions = actionsNumber;\n position++;\n continue;\n case Action.TOIDENT:\n tokenType = TokenType.IDENT;\n actions = actionsIdent;\n position++;\n continue;\n case Action.TOIDES:\n tokenType = TokenType.IDENT;\n actions = actionsIdentEscChr;\n backslashPos = position++;\n continue;\n case Action.KILL1:\n position--;\n break;\n case Action.KILL2:\n position -= 2;\n break;\n case Action.URL:\n tokenPosition = position++;\n actions = actionsURLInside;\n continue;\n case Action.URL1:\n tokenPosition = ++position; // skip quote\n actions = actionsURLInside1;\n continue;\n case Action.URL2:\n tokenPosition = ++position; // skip quote\n actions = actionsURLInside2;\n continue;\n case Action.ENDURL:\n tokenType = TokenType.URL;\n tokenText = escapeParse(input.substring(tokenPosition, position));\n position++; // skip ')'\n break;\n case Action.FINURL:\n position++; // skip ')'\n break;\n case Action.LT_BG:\n actions = actionsLtBang;\n position++;\n continue;\n case Action.LT_BG_M:\n actions = actionsLtBangMinus;\n position++;\n continue;\n case Action.CHKSP:\n // newline in non-quoted URL - check if end of url\n if (position - backslashPos < 8) {\n // close enough: may be valid\n if (\n input\n .substring(backslashPos + 1, position + 1)\n .match(/^[0-9a-fA-F]{0,6}(\\r\\n|[\\n\\r])|[ \\t]$/)\n ) {\n // valid, keep going\n position++;\n continue;\n }\n }\n\n // end of url\n // fall through\n case Action.TERMURL:\n tokenType = TokenType.URL;\n tokenText = escapeParse(input.substring(tokenPosition, position));\n position++; // skip quote (or newline)\n actions = actionsURLTail;\n continue;\n case Action.CHKPOSN:\n // newline in string or quoted URL - check validity\n position++;\n if (position - backslashPos < 9) {\n // close enough: may be valid\n if (\n input\n .substring(backslashPos + 1, position)\n .match(/^[0-9a-fA-F]{0,6}(\\r\\n|[\\n\\r])$/)\n ) {\n // valid, keep going\n continue;\n }\n }\n\n // invalid token\n tokenType = TokenType.INVALID;\n tokenText = \"E_CSS_UNEXPECTED_NEWLINE\";\n actions = actionsNormal;\n break;\n case Action.CHKPOSS:\n // space in identifier - check validity\n if (position - backslashPos < 9) {\n // close enough: may be valid\n if (\n input\n .substring(backslashPos + 1, position + 1)\n .match(/^[0-9a-fA-F]{0,6}[ \\t]$/)\n ) {\n // valid, keep going\n position++;\n continue;\n }\n }\n\n // end of identifier\n // don't consume current char\n // tokenType should be set already\n tokenText = escapeParse(input.substring(tokenPosition, position));\n break;\n case Action.URLESC:\n backslashPos = position++;\n continue;\n case Action.IDESCH:\n position++;\n actions = actionsIdentEsc;\n continue;\n default:\n // EOF\n if (actions !== actionsNormal) {\n tokenType = TokenType.INVALID;\n tokenText = \"E_CSS_UNEXPECTED_STATE\";\n break;\n }\n tokenPosition = position;\n tokenType = TokenType.EOF;\n }\n token.type = tokenType;\n token.precededBySpace = seenSpace;\n token.num = tokenNum;\n token.text = tokenText;\n token.position = tokenPosition;\n tail++;\n if (tail >= head) {\n break;\n }\n actions = actionsNormal;\n seenSpace = false;\n token = buffer[tail & indexMask];\n }\n this.position = position;\n this.tail = tail & indexMask;\n }\n}\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2015 Trim-marks Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Task - Support for asynchronous execution and cooperative\n * multitasking.\n */\nimport * as Base from \"./base\";\nimport * as Logging from \"./logging\";\n\n/**\n * External timer. Only needed for testing.\n */\nexport interface Timer {\n /**\n * @return current time in milliseconds.\n */\n currentTime(): number;\n\n /**\n * Calls function after a given timeout.\n * @param fn function to call.\n * @param delay timeout in milliseconds.\n * @return unique number that can be used to clear the timeout.\n */\n setTimeout(fn: () => void, delay: number): number;\n\n /**\n * Calls function after a given timeout.\n * @param token timeout token.\n * @return.\n */\n clearTimeout(token: number): void;\n}\n\n/**\n * Result of an asynchronous function that may be available immediately or\n * some time later. Similar to Deferred.\n * @template T\n */\nexport interface Result<T> {\n /**\n * Call the given function when asynchronous function is finished. Callback\n * is executed in the task's context.\n */\n then(callback: (p1: T) => void): void;\n\n /**\n * Call the given asynchronous function when some asynchronous function is\n * finished. Callback is executed in the task's context.\n * @template T1\n */\n thenAsync<T1>(callback: (p1: T) => Result<T1>): Result<T1>;\n\n /**\n * Produce a Result that resolves to the given value when this Result is\n * resolved.\n * @template T1\n */\n thenReturn<T1>(result: T1): Result<T1>;\n\n /**\n * Finish given frame with the result value when result becomes ready.\n */\n thenFinish(frame: Frame<T>): void;\n\n /**\n * Check if this Result is still pending.\n */\n isPending(): boolean;\n\n /**\n * If this Result is resolved, return the value that it holds.\n */\n get(): T | null;\n}\n\nexport let privateCurrentTask: Task | null = null;\n\nexport let primaryScheduler: Scheduler | null = null;\n\n/**\n * Returns current task.\n */\nexport function currentTask(): Task | null {\n return privateCurrentTask;\n}\n\n/**\n * Create and return a new frame with the given name.\n */\nexport function newFrame<T>(name: string): Frame<T> {\n if (!privateCurrentTask) {\n throw new Error(\"E_TASK_NO_CONTEXT\");\n }\n if (!privateCurrentTask.name) {\n privateCurrentTask.name = name;\n }\n const task = privateCurrentTask;\n const frame = new Frame<T>(task, task.top, name);\n task.top = frame;\n frame.state = FrameState.ACTIVE;\n return frame;\n}\n\nexport function newEventSource(): EventSource {\n return new EventSource();\n}\n\nexport function newScheduler(opt_timer?: Timer): Scheduler {\n return new Scheduler(opt_timer || new TimerImpl());\n}\n\n/**\n * @template T\n */\nexport function newResult<T>(opt_value: T): Result<T> {\n return new SyncResultImpl<T>(opt_value);\n}\n\n/**\n * Creates a new frame and runs code in its context, catching synchronous and\n * asynchronous errors. If an error occurs, onErr is run (in the context of\n * the same frame). As usual, onErr is supposed either produce a result or raise\n * an exception.\n */\nexport function handle<T>(\n name: any,\n code: (p1: Frame<T>) => void,\n onErr: (p1: Frame<T>, p2: Error) => void,\n): Result<T> {\n const frame = newFrame<T>(name);\n frame.handler = onErr;\n try {\n code(frame);\n } catch (err) {\n // synchronous exception\n frame.task.raise(err, frame);\n }\n return frame.result();\n}\n\nexport function start<T>(func: () => Result<T>, opt_name?: string): Task {\n const scheduler = privateCurrentTask\n ? privateCurrentTask.getScheduler()\n : primaryScheduler || newScheduler();\n return scheduler.run(func, opt_name);\n}\n\n/**\n * Frame state.\n * @enum {number}\n */\nexport enum FrameState {\n INIT, // before newFrame call\n ACTIVE, // before finish call\n FINISHED, // before callback complete\n DEAD, // when callback is complete\n}\nexport class TimerImpl implements Timer {\n /**\n * @override\n */\n currentTime(): number {\n return new Date().valueOf();\n }\n\n /**\n * @override\n */\n setTimeout(fn: () => void, delay: number) {\n // HACK: casting to unknown type to prevent TypeScript error\n // [TS2352] Conversion of type 'Timer' to type 'number' may be a mistake because neither type sufficiently overlaps with the other.\n const timer: unknown = setTimeout(fn, delay);\n return timer as number;\n }\n\n /**\n * @override\n */\n clearTimeout(token: number): void {\n clearTimeout(token);\n }\n}\n\n/**\n * A class to create tasks.\n */\nexport class Scheduler {\n timeout: number = 1;\n slice: number = 25;\n sliceOverTime: number = 0;\n queue: Base.PriorityQueue;\n wakeupTime: number | null = null;\n timeoutToken: number | null = null;\n inTimeSlice: boolean = false;\n order: number = 0;\n\n constructor(public timer: Timer) {\n this.queue = new Base.PriorityQueue();\n if (!primaryScheduler) {\n primaryScheduler = this;\n }\n }\n\n /**\n * Sets time slice length.\n * @param slice length in milliseconds.\n */\n setSlice(slice: number) {\n this.slice = slice;\n }\n\n /**\n * Sets timeout between time slices.\n * @param timeout in milliseconds.\n */\n setTimeout(timeout: number) {\n this.timeout = timeout;\n }\n\n /**\n * Checks if the current time slice is over.\n */\n isTimeSliceOver(): boolean {\n const now = this.timer.currentTime();\n return now >= this.sliceOverTime;\n }\n\n private arm(): void {\n if (this.inTimeSlice) {\n return;\n }\n const nextInQueue = this.queue.peek() as Continuation<any>;\n const newTime = nextInQueue.scheduledTime;\n const now = this.timer.currentTime();\n if (this.timeoutToken != null) {\n if (now + this.timeout > this.wakeupTime) {\n return; // no use re-arming\n }\n this.timer.clearTimeout(this.timeoutToken);\n }\n let timeout = newTime - now;\n if (timeout <= this.timeout) {\n timeout = this.timeout;\n }\n this.wakeupTime = now + timeout;\n this.timeoutToken = this.timer.setTimeout(() => {\n this.timeoutToken = null;\n this.doTimeSlice();\n }, timeout);\n }\n\n schedule(continuation: Continuation<any>, opt_delay?: number): void {\n const c = continuation as Continuation<any>;\n const now = this.timer.currentTime();\n c.order = this.order++;\n c.scheduledTime = now + (opt_delay || 0);\n this.queue.add(c);\n this.arm();\n }\n\n private doTimeSlice(): void {\n if (this.timeoutToken != null) {\n this.timer.clearTimeout(this.timeoutToken);\n this.timeoutToken = null;\n }\n this.inTimeSlice = true;\n try {\n let now = this.timer.currentTime();\n this.sliceOverTime = now + this.slice;\n while (this.queue.length()) {\n const continuation = this.queue.peek() as Continuation<any>;\n if (continuation.scheduledTime > now) {\n break; // too early\n }\n this.queue.remove();\n if (!continuation.canceled) {\n continuation.resumeInternal();\n }\n now = this.timer.currentTime();\n if (now >= this.sliceOverTime) {\n break;\n }\n }\n } catch (err) {\n Logging.logger.error(err);\n }\n this.inTimeSlice = false;\n if (this.queue.length()) {\n this.arm();\n }\n }\n\n run(func: () => Result<any>, opt_name?: string): Task {\n const task = new Task(this, opt_name || \"\");\n task.top = new Frame<any>(task, null, \"bootstrap\");\n task.top.state = FrameState.ACTIVE;\n task.top.then(() => {\n const done = () => {\n task.running = false;\n for (const callback of task.callbacks) {\n try {\n callback();\n } catch (err) {\n Logging.logger.error(err);\n }\n }\n };\n try {\n func().then((result) => {\n task.result = result;\n done();\n });\n } catch (err) {\n task.raise(err);\n done();\n }\n });\n const savedTask = privateCurrentTask;\n privateCurrentTask = task;\n this.schedule(task.top.suspend(\"bootstrap\"));\n privateCurrentTask = savedTask;\n return task;\n }\n}\n\n/**\n * Task suspension point.\n * @template T\n */\nexport class Continuation<T> implements Base.Comparable {\n scheduledTime: number = 0;\n order: number = 0;\n result: T = null;\n canceled: boolean = false;\n\n constructor(public task: Task) {}\n\n /**\n * @override\n */\n compare(otherComp: Base.Comparable): number {\n // earlier wins\n const other = otherComp as Continuation<any>;\n return other.scheduledTime - this.scheduledTime || other.order - this.order;\n }\n\n /**\n * Continuation's task\n */\n getTask(): Task {\n return this.task;\n }\n\n /**\n * Schedule task continuation after the given (optional) delay.\n * @param opt_delay optional delay in milliseconds.\n */\n schedule(result: T, opt_delay?: number) {\n this.result = result;\n this.task.scheduler.schedule(this, opt_delay);\n }\n\n resumeInternal(): boolean {\n const task = this.task;\n this.task = null;\n if (task && task.continuation == this) {\n task.continuation = null;\n const savedTask = privateCurrentTask;\n privateCurrentTask = task;\n task.top.finish(this.result);\n privateCurrentTask = savedTask;\n return true;\n }\n return false;\n }\n\n /**\n * Cancel continuation\n */\n cancel() {\n this.canceled = true;\n }\n}\n\n/**\n * An asynchronous, time-sliced task.\n */\nexport class Task {\n callbacks: (() => void)[] = [];\n exception: Error | null = null;\n running: boolean = true;\n result: any = null;\n waitTarget: string | null = null;\n top: Frame<any> | null = null;\n continuation: Continuation<any> | null = null;\n\n constructor(public scheduler: Scheduler, public name: string) {}\n\n /**\n * @return task name.\n */\n getName(): string {\n return this.name;\n }\n\n /**\n * @param err exception to throw in the task's context.\n */\n interrupt(err: Error): void {\n this.raise(err || new Error(\"E_TASK_INTERRUPT\"));\n if (this !== privateCurrentTask && this.continuation) {\n // blocked on something\n this.continuation.cancel();\n const continuation = new Continuation(this);\n this.waitTarget = \"interrupt\";\n this.continuation = continuation;\n this.scheduler.schedule(continuation);\n }\n }\n\n /**\n * @return this task's scheduler.\n */\n getScheduler(): Scheduler {\n return this.scheduler;\n }\n\n /**\n * @return true if task is still running.\n */\n isRunning(): boolean {\n return this.running;\n }\n\n /**\n * Register a callback to be called when the task is done. Callback is not\n * executed in any task context. Multiple callbacks can be registered and\n * they will be called in the registration order.\n */\n whenDone(callback: () => void): void {\n this.callbacks.push(callback);\n }\n\n /**\n * Wait for task to finish (from another task).\n */\n join(): Result<any> {\n const frame = newFrame<any>(\"Task.join\");\n if (!this.running) {\n frame.finish(this.result);\n } else {\n const continuation = frame.suspend(this);\n this.whenDone(() => {\n continuation.schedule(this.result);\n });\n }\n return frame.result();\n }\n\n /**\n * Unwind the stack. We have two stacks: async (maintained by frame\n * parent link) and sync (regular JavaScript stack).\n */\n unwind() {\n // We have a sequence of frames on the stack.\n while (this.top && !this.top.handler) {\n this.top = this.top.parent;\n }\n if (this.top && this.top.handler && this.exception) {\n // found a handler\n const err = this.exception;\n this.exception = null;\n this.top.handler(this.top, err);\n } else {\n if (this.exception) {\n Logging.logger.error(\n this.exception,\n \"Unhandled exception in task\",\n this.name,\n );\n }\n }\n }\n\n raise(err: Error, opt_frame?: Frame<any>): void {\n this.fillStack(err);\n if (opt_frame) {\n let f = this.top;\n while (f && f != opt_frame) {\n f = f.parent;\n }\n if (f == opt_frame) {\n this.top = f;\n }\n }\n this.exception = err;\n this.unwind();\n }\n\n /**\n * Fill the stack trace in the exception\n * @param err exception\n */\n fillStack(err: Error) {\n let out = err[\"frameTrace\"];\n if (!out) {\n out = err[\"stack\"] ? `${err[\"stack\"]}\\n\\t---- async ---\\n` : \"\";\n for (let f = this.top; f; f = f.parent) {\n out += \"\\t\";\n out += f.getName();\n out += \"\\n\";\n }\n err[\"frameTrace\"] = out;\n }\n }\n}\n\n/**\n * @template T\n */\nexport class SyncResultImpl<T> implements Result<T> {\n constructor(public value: T) {}\n\n /**\n * @override\n */\n then(callback: (T: any) => void) {\n callback(this.value);\n }\n\n /**\n * @override\n */\n thenAsync<T1>(callback: (p1: T) => Result<T1>) {\n return callback(this.value);\n }\n\n /**\n * @override\n */\n thenReturn<T1>(result: T1) {\n return new SyncResultImpl(result);\n }\n\n /**\n * @override\n */\n thenFinish(frame: Frame<T>): void {\n frame.finish(this.value);\n }\n\n /**\n * @override\n */\n isPending(): boolean {\n return false;\n }\n\n /**\n * @override\n */\n get(): T | null {\n return this.value;\n }\n}\n\n/**\n * @template T\n */\nexport class ResultImpl<T> implements Result<T> {\n constructor(public readonly frame: Frame<T>) {}\n\n /**\n * @override\n */\n then(callback: (p1: T) => void): void {\n this.frame.then(callback);\n }\n\n /**\n * @override\n */\n thenAsync<T1>(callback: (p1: T) => Result<T1>): Result<T1> {\n if (this.isPending()) {\n // thenAsync is special, do the trick with the context\n const frame = new Frame<T | T1>(\n this.frame.task,\n this.frame.parent,\n \"AsyncResult.thenAsync\",\n );\n frame.state = FrameState.ACTIVE;\n this.frame.parent = frame as Frame<T>;\n this.frame.then((res1) => {\n callback(res1).then((res2) => {\n frame.finish(res2);\n });\n });\n return frame.result() as Result<T1>;\n } else {\n return callback(this.frame.res);\n }\n }\n\n /**\n * @override\n */\n thenReturn<T1>(result: T1) {\n if (this.isPending()) {\n return this.thenAsync(() => new SyncResultImpl(result));\n } else {\n return new SyncResultImpl(result);\n }\n }\n\n /**\n * @override\n */\n thenFinish(frame: Frame<T>): void {\n if (this.isPending()) {\n this.then((res) => {\n frame.finish(res);\n });\n } else {\n frame.finish(this.frame.res);\n }\n }\n\n /**\n * @override\n */\n isPending(): boolean {\n return this.frame.state == FrameState.ACTIVE;\n }\n\n /**\n * @override\n */\n get(): T | null {\n if (this.isPending()) {\n throw new Error(\"Result is pending\");\n }\n return this.frame.res;\n }\n}\n\n/**\n * Asynchronous execution frame. Corresponds to an asynchronous function\n * invocation.\n * @template T\n */\nexport class Frame<T> {\n res: T = null;\n state: FrameState;\n callback: ((p1: any) => void) | null = null;\n handler: ((p1: Frame<any>, p2: Error) => void) | null = null;\n\n constructor(public task: Task, public parent: Frame<T>, public name: string) {\n this.state = FrameState.INIT;\n }\n\n private checkEnvironment(): void {\n if (!privateCurrentTask) {\n throw new Error(\"F_TASK_NO_CONTEXT\");\n }\n if (this !== privateCurrentTask.top) {\n throw new Error(\"F_TASK_NOT_TOP_FRAME\");\n }\n }\n\n /**\n * @return to be returned as this asynchronous function return value.\n */\n result(): Result<T> {\n return new ResultImpl<T>(this);\n }\n\n finish(res: T) {\n this.checkEnvironment();\n if (privateCurrentTask && !privateCurrentTask.exception) {\n this.res = res;\n }\n this.state = FrameState.FINISHED;\n const frame = this.parent;\n if (privateCurrentTask) {\n privateCurrentTask.top = frame;\n }\n if (this.callback) {\n try {\n this.callback(res);\n } catch (err) {\n this.task.raise(err, frame);\n }\n\n // callback was called\n this.state = FrameState.DEAD;\n }\n }\n\n getTask(): Task {\n return this.task;\n }\n\n /**\n * @return frame name.\n */\n getName(): string {\n return this.name;\n }\n\n getScheduler(): Scheduler {\n return this.task.scheduler;\n }\n\n then(callback: (p1: T) => void): void {\n // legal to call when currentTask is null\n switch (this.state) {\n case FrameState.ACTIVE:\n if (this.callback) {\n throw new Error(\"F_TASK_FRAME_ALREADY_HAS_CALLBACK\");\n } else {\n this.callback = callback;\n }\n break;\n case FrameState.FINISHED: {\n const task = this.task;\n const frame = this.parent;\n try {\n callback(this.res);\n this.state = FrameState.DEAD;\n } catch (err) {\n this.state = FrameState.DEAD;\n task.raise(err, frame);\n }\n break;\n }\n case FrameState.DEAD:\n throw new Error(\"F_TASK_DEAD_FRAME\");\n default:\n throw new Error(`F_TASK_UNEXPECTED_FRAME_STATE ${this.state}`);\n }\n }\n\n /**\n * If this task was executed longer than task's slice parameter.\n * @return holds true\n */\n timeSlice(): Result<boolean> {\n const frame = newFrame<boolean>(\"Frame.timeSlice\");\n const scheduler = frame.getScheduler();\n if (scheduler.isTimeSliceOver()) {\n Logging.logger.debug(\"-- time slice --\");\n frame.suspend().schedule(true);\n } else {\n frame.finish(true);\n }\n return frame.result();\n }\n\n /**\n * Yield to other tasks for the specified time.\n * @param delay in milliseconds.\n * @return holds true\n */\n sleep(delay: number): Result<boolean> {\n const frame = newFrame<boolean>(\"Frame.sleep\");\n frame.suspend().schedule(true, delay);\n return frame.result();\n }\n\n /**\n * Repeatedly execute the given function asynchronously until it returns\n * false.\n * @return holds true.\n */\n loop(func: () => Result<boolean>): Result<boolean> {\n const frame = newFrame<boolean>(\"Frame.loop\");\n const step = (more) => {\n try {\n while (more) {\n const result = func();\n if (result.isPending()) {\n result.then(step);\n return;\n } else {\n result.then((m) => {\n more = m;\n });\n }\n }\n frame.finish(true);\n } catch (err) {\n frame.task.raise(err, frame);\n }\n };\n step(true);\n return frame.result();\n }\n\n /**\n * Similar to loop(), but provides a Frame for loop body function.\n * @return holds true.\n */\n loopWithFrame(func: (p1: LoopBodyFrame) => void): Result<boolean> {\n const task = privateCurrentTask;\n if (!task) {\n throw new Error(\"E_TASK_NO_CONTEXT\");\n }\n return this.loop(() => {\n let result: Result<boolean>;\n do {\n const frame = new LoopBodyFrame(task as Task, task.top);\n task.top = frame;\n frame.state = FrameState.ACTIVE;\n func(frame);\n result = frame.result();\n } while (!result.isPending() && result.get());\n return result;\n });\n }\n\n suspend(opt_waitTarget?: any): Continuation<T> {\n this.checkEnvironment();\n if (this.task.continuation) {\n throw new Error(\"E_TASK_ALREADY_SUSPENDED\");\n }\n const continuation: Continuation<T> = new Continuation(this.task);\n this.task.continuation = continuation;\n privateCurrentTask = null;\n this.task.waitTarget = opt_waitTarget || null;\n return continuation;\n }\n}\n\nexport class LoopBodyFrame extends Frame<boolean> {\n constructor(task: Task, parent: Frame<boolean>) {\n super(task, parent, \"loop\");\n }\n\n continueLoop(): void {\n this.finish(true);\n }\n\n breakLoop(): void {\n this.finish(false);\n }\n}\n\nexport class EventItem {\n next: EventItem = null;\n\n constructor(public event: Base.Event) {}\n}\n\n/**\n * An class to listen to evens and present them as a readable asynchronous\n * stream to tasks.\n */\nexport class EventSource {\n continuation: Continuation<boolean> = null;\n listeners: {\n target: Base.EventTarget;\n type: string;\n listener: Base.EventListener;\n }[] = [];\n head: EventItem;\n tail: EventItem;\n\n constructor() {\n this.head = new EventItem(null);\n this.tail = this.head;\n }\n\n /**\n * Attaches as an event listener to an EventTarget.\n */\n attach(\n target: Base.EventTarget,\n type: string,\n opt_preventDefault?: boolean,\n ): void {\n const listener = (event) => {\n if (opt_preventDefault) {\n event.preventDefault();\n }\n if (this.tail.event) {\n this.tail.next = new EventItem(event);\n this.tail = this.tail.next;\n } else {\n this.tail.event = event;\n const continuation = this.continuation;\n if (continuation) {\n this.continuation = null;\n continuation.schedule(true);\n }\n }\n };\n target.addEventListener(type, listener, false);\n this.listeners.push({ target, type, listener });\n }\n\n detach(target: Base.EventTarget, type: string): void {\n let i = 0;\n let item: {\n target: Base.SimpleEventTarget;\n type: string;\n listener: Base.EventListener;\n } = null;\n while (i < this.listeners.length) {\n item = this.listeners[i];\n if (item.type == type && item.target === target) {\n this.listeners.splice(i, 1);\n item.target.removeEventListener(item.type, item.listener, false);\n return;\n }\n i++;\n }\n throw new Error(\"E_TASK_EVENT_SOURCE_NOT_ATTACHED\");\n }\n\n /**\n * Read next dispatched event, blocking the current task if needed.\n */\n nextEvent(): Result<Base.Event> {\n const frame: Frame<Base.Event> = newFrame(\"EventSource.nextEvent\");\n const readEvent = () => {\n if (this.head.event) {\n const event = this.head.event;\n if (this.head.next) {\n this.head = this.head.next;\n } else {\n this.head.event = null;\n }\n frame.finish(event);\n } else if (this.continuation) {\n throw new Error(\"E_TASK_EVENT_SOURCE_OTHER_TASK_WAITING\");\n } else {\n const frameInternal: Frame<boolean> = newFrame(\n \"EventSource.nextEventInternal\",\n );\n this.continuation = frameInternal.suspend(this);\n frameInternal.result().then(readEvent);\n }\n };\n readEvent();\n return frame.result();\n }\n}\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2015 Trim-marks Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview TaskUtil - Utilities asynchronous execution and cooperative\n * multitasking.\n */\nimport * as Base from \"./base\";\nimport * as Logging from \"./logging\";\nimport * as Task from \"./task\";\n\n/**\n * A class that can fetch or compute a resource that may be needed by multiple\n * tasks. The first time a resource is requested, it is fetched and then given\n * to everyone requesting it.\n * @template T\n * @param fetch function that fetches/computes\n * a resource; it will be run in a separate task.\n */\nexport class Fetcher<T> {\n name: string;\n arrived: boolean = false;\n resource: T = null;\n task: Task.Task = null;\n piggybacks: ((p1: any) => void)[] | null = [];\n\n constructor(public readonly fetch: () => Task.Result<T>, opt_name?: string) {\n this.name = opt_name;\n }\n\n /**\n * Start fetching/computing a resource, don't block current task.\n */\n start(): void {\n if (!this.task) {\n this.task = Task.currentTask()\n .getScheduler()\n .run(() => {\n const frame = Task.newFrame(\"Fetcher.run\");\n this.fetch().then((resource) => {\n const piggibacks = this.piggybacks;\n this.arrived = true;\n this.resource = resource;\n this.task = null;\n this.piggybacks = [];\n if (piggibacks) {\n for (let i = 0; i < piggibacks.length; i++) {\n try {\n piggibacks[i](resource);\n } catch (err) {\n Logging.logger.error(err, \"Error:\");\n }\n }\n }\n frame.finish(resource);\n });\n return frame.result();\n }, this.name);\n }\n }\n\n piggyback(fn: (p1: T) => void): void {\n if (this.arrived) {\n fn(this.resource);\n } else {\n this.piggybacks.push(fn);\n }\n }\n\n /**\n * Fetches the resource, waits for it to arrive if it is already being\n * fetched.\n */\n get(): Task.Result<T> {\n if (this.arrived) {\n return Task.newResult(this.resource);\n }\n this.start();\n return this.task.join() as Task.Result<T>;\n }\n\n hasArrived(): boolean {\n return this.arrived;\n }\n}\n\n/**\n * Wait for all Fetcher objects in the array to arrive\n */\nexport const waitForFetchers = <T>(\n fetchers: Fetcher<T>[],\n): Task.Result<boolean> => {\n if (fetchers.length == 0) {\n return Task.newResult(true);\n }\n if (fetchers.length == 1) {\n return fetchers[0].get().thenReturn(true);\n }\n const frame = Task.newFrame<boolean>(\"waitForFetches\");\n let i = 0;\n frame\n .loop(() => {\n while (i < fetchers.length) {\n const fetcher = fetchers[i++];\n if (!fetcher.hasArrived()) {\n return fetcher.get().thenReturn(true);\n }\n }\n return Task.newResult(false);\n })\n .then(() => {\n frame.finish(true);\n });\n return frame.result();\n};\n\n/**\n * @return holding event type (load/error/abort)\n */\nexport function loadElement(elem: Element, src: string): Fetcher<string> {\n let width: string | null = null;\n let height: string | null = null;\n if (elem.localName == \"img\") {\n width = elem.getAttribute(\"width\");\n height = elem.getAttribute(\"height\");\n }\n const fetcher = new Fetcher(() => {\n const frame: Task.Frame<string> = Task.newFrame(\"loadImage\");\n const continuation = frame.suspend(elem);\n let done = false;\n const handler = (evt: Event) => {\n if (done) {\n return;\n } else {\n done = true;\n }\n if (elem.localName == \"img\") {\n // IE puts these bogus attributes, even if they were not present\n if (!width) {\n elem.removeAttribute(\"width\");\n }\n if (!height) {\n elem.removeAttribute(\"height\");\n }\n }\n continuation.schedule(evt ? evt.type : \"timeout\");\n };\n elem.addEventListener(\"load\", handler, false);\n elem.addEventListener(\"error\", handler, false);\n elem.addEventListener(\"abort\", handler, false);\n if (elem.namespaceURI == Base.NS.SVG) {\n elem.setAttributeNS(Base.NS.XLINK, \"xlink:href\", src);\n\n // SVG handlers are not reliable\n setTimeout(handler, 300);\n } else {\n (elem as any).src = src;\n }\n return frame.result();\n }, `loadElement ${src}`);\n fetcher.start();\n return fetcher;\n}\n","/**\n * Copyright 2015 Trim-marks Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Assets - Bundle resources\n */\n\n// vivliostyle-viewport-screen.css\nexport const VivliostyleViewportScreenCss = `\n@media screen {\n [data-vivliostyle-viewer-viewport] {\n background: #aaaaaa;\n }\n\n [data-vivliostyle-page-container] {\n background: white;\n z-index: 0;\n }\n\n [data-vivliostyle-viewer-viewport] {\n display: -webkit-flex;\n display: flex;\n overflow: auto;\n position: relative;\n }\n\n [data-vivliostyle-outer-zoom-box] {\n margin: auto;\n overflow: hidden;\n -webkit-flex: none;\n flex: none;\n }\n\n [data-vivliostyle-viewer-viewport] [data-vivliostyle-spread-container] {\n display: -webkit-flex;\n display: flex;\n -webkit-flex: none;\n flex: none;\n -webkit-justify-content: center;\n justify-content: center;\n -moz-transform-origin: left top;\n -ms-transform-origin: left top;\n -webkit-transform-origin: left top;\n transform-origin: left top;\n }\n\n [data-vivliostyle-viewer-viewport][data-vivliostyle-page-progression=\"ltr\"]\n [data-vivliostyle-spread-container] {\n -webkit-flex-direction: row;\n flex-direction: row;\n }\n\n [data-vivliostyle-viewer-viewport][data-vivliostyle-page-progression=\"rtl\"]\n [data-vivliostyle-spread-container] {\n -webkit-flex-direction: row-reverse;\n flex-direction: row-reverse;\n }\n\n [data-vivliostyle-viewer-viewport] [data-vivliostyle-page-container] {\n margin: 0 auto;\n -webkit-flex: none;\n flex: none;\n transform-origin: center top;\n }\n\n [data-vivliostyle-viewer-viewport][data-vivliostyle-spread-view=\"true\"]\n [data-vivliostyle-page-container][data-vivliostyle-page-side=\"left\"] {\n margin-right: 1px;\n transform-origin: right top;\n }\n\n [data-vivliostyle-viewer-viewport][data-vivliostyle-spread-view=\"true\"]\n [data-vivliostyle-page-container][data-vivliostyle-page-side=\"right\"] {\n margin-left: 1px;\n transform-origin: left top;\n }\n\n [data-vivliostyle-viewer-viewport][data-vivliostyle-spread-view=\"true\"]\n [data-vivliostyle-page-container][data-vivliostyle-unpaired-page=\"true\"] {\n margin-left: auto;\n margin-right: auto;\n transform-origin: center top;\n }\n}\n`;\n\n// vivliostyle-viewport.css\nexport const VivliostyleViewportCss = `\n[data-vivliostyle-layout-box] {\n position: absolute;\n left: 0;\n top: 0;\n right: 0;\n bottom: 0;\n overflow: hidden;\n z-index: -1;\n}\n\n[data-vivliostyle-debug] [data-vivliostyle-layout-box] {\n right: auto;\n bottom: auto;\n overflow: visible;\n z-index: auto;\n}\n\n[data-vivliostyle-page-container] {\n position: relative;\n overflow: hidden;\n}\n\n[data-vivliostyle-bleed-box] {\n position: absolute;\n overflow: hidden;\n max-width: 100%;\n max-height: 100%;\n box-sizing: border-box;\n}\n\n[data-vivliostyle-page-box] ~ [data-vivliostyle-page-box] {\n display: none;\n}\n\n[data-vivliostyle-toc-box] {\n position: absolute;\n left: 3px;\n top: 3px;\n overflow: scroll;\n overflow-x: hidden;\n background: rgba(248, 248, 248, 0.9);\n border-radius: 2px;\n box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.4);\n}\n\n@media print {\n [data-vivliostyle-toc-box] {\n display: none;\n }\n\n [data-vivliostyle-outer-zoom-box],\n [data-vivliostyle-spread-container] {\n width: 100% !important;\n height: 100% !important;\n }\n\n [data-vivliostyle-spread-container],\n [data-vivliostyle-page-container] {\n -moz-transform: none !important;\n -ms-transform: none !important;\n -webkit-transform: none !important;\n transform: none !important;\n }\n\n [data-vivliostyle-page-container] {\n display: block !important;\n max-width: 100%;\n height: 100% !important;\n max-height: 100%;\n }\n\n /* Workaround for Chrome printing problem */\n /* [data-vivliostyle-page-box] {\n padding-bottom: 0 !important;\n overflow: visible !important;\n } */\n [data-vivliostyle-bleed-box] > div > div::before {\n display: block;\n content: \"\";\n padding-top: 0.015625px;\n margin-bottom: -0.015625px;\n }\n\n /* Gecko-only hack, see https://bugzilla.mozilla.org/show_bug.cgi?id=267029#c17 */\n @-moz-document regexp('.*') {\n [data-vivliostyle-page-container]:nth-last-child(n + 2) {\n top: -1px;\n margin-top: 1px;\n margin-bottom: -1px;\n }\n }\n}\n`;\n\n// validation.txt\nexport const ValidationTxt = `\n/*\n * Copyright 2013 Google, Inc.\n * Copyright 2015 Trim-marks Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * CSS property validation.\n */\nNUM = POS_NUM | ZERO | NEGATIVE;\nNNEG_NUM = POS_NUM | ZERO;\nINT = POS_INT | ZERO | NEGATIVE;\nNNEG_INT = POS_INT | ZERO;\nPERCENTAGE = POS_PERCENTAGE | ZERO | NEGATIVE;\nSTRICT_PERCENTAGE = POS_PERCENTAGE | ZERO_PERCENTAGE | NEGATIVE;\nNNEG_PERCENTAGE = POS_PERCENTAGE | ZERO;\nLENGTH = POS_LENGTH | ZERO | NEGATIVE;\nNNEG_LENGTH = POS_LENGTH | ZERO | NEGATIVE;\nPLENGTH = LENGTH | PERCENTAGE;\nPPLENGTH = POS_LENGTH | ZERO | POS_PERCENTAGE;\nALENGTH = LENGTH | auto;\nAPLENGTH = PLENGTH | auto;\nPAPLENGTH = PPLENGTH | auto;\nANGLE = POS_ANGLE | ZERO | NEGATIVE;\nLENGTH_OR_NUM = LENGTH | NUM;\nANGLE_OR_NUM = ANGLE | NUM;\nSCOLOR = HASHCOLOR | aliceblue: #F0F8FF | antiquewhite: #FAEBD7 | aqua: #00FFFF | aquamarine: #7FFFD4 | azure: #F0FFFF |\n beige: #F5F5DC | bisque: #FFE4C4 | black: #000000 | blanchedalmond: #FFEBCD | blue: #0000FF | blueviolet: #8A2BE2 | brown: #A52A2A |\n burlywood: #DEB887 | cadetblue: #5F9EA0 | chartreuse: #7FFF00 | chocolate: #D2691E | coral: #FF7F50 | cornflowerblue: #6495ED |\n cornsilk: #FFF8DC | crimson: #DC143C | cyan: #00FFFF | darkblue: #00008B | darkcyan: #008B8B | darkgoldenrod: #B8860B |\n darkgray: #A9A9A9 | darkgreen: #006400 | darkgrey: #A9A9A9 | darkkhaki: #BDB76B | darkmagenta: #8B008B | darkolivegreen: #556B2F |\n darkorange: #FF8C00 | darkorchid: #9932CC | darkred: #8B0000 | darksalmon: #E9967A | darkseagreen: #8FBC8F | darkslateblue: #483D8B |\n darkslategray: #2F4F4F | darkslategrey: #2F4F4F | darkturquoise: #00CED1 | darkviolet: #9400D3 | deeppink: #FF1493 |\n deepskyblue: #00BFFF | dimgray: #696969 | dimgrey: #696969 | dodgerblue: #1E90FF | firebrick: #B22222 | floralwhite: #FFFAF0 |\n forestgreen: #228B22 | fuchsia: #FF00FF | gainsboro: #DCDCDC | ghostwhite: #F8F8FF | gold: #FFD700 | goldenrod: #DAA520 |\n gray: #808080 | green: #008000 | greenyellow: #ADFF2F | grey: #808080 | honeydew: #F0FFF0 | hotpink: #FF69B4 | indianred: #CD5C5C |\n indigo: #4B0082 | ivory: #FFFFF0 | khaki: #F0E68C | lavender: #E6E6FA | lavenderblush: #FFF0F5 | lawngreen: #7CFC00 |\n lemonchiffon: #FFFACD | lightblue: #ADD8E6 | lightcoral: #F08080 | lightcyan: #E0FFFF | lightgoldenrodyellow: #FAFAD2 |\n lightgray: #D3D3D3 | lightgreen: #90EE90 | lightgrey: #D3D3D3 | lightpink: #FFB6C1 | lightsalmon: #FFA07A | lightseagreen: #20B2AA |\n lightskyblue: #87CEFA | lightslategray: #778899 | lightslategrey: #778899 | lightsteelblue: #B0C4DE | lightyellow: #FFFFE0 |\n lime: #00FF00 | limegreen: #32CD32 | linen: #FAF0E6 | magenta: #FF00FF | maroon: #800000 | mediumaquamarine: #66CDAA |\n mediumblue: #0000CD | mediumorchid: #BA55D3 | mediumpurple: #9370DB | mediumseagreen: #3CB371 | mediumslateblue: #7B68EE |\n mediumspringgreen: #00FA9A | mediumturquoise: #48D1CC | mediumvioletred: #C71585 | midnightblue: #191970 | mintcream: #F5FFFA |\n mistyrose: #FFE4E1 | moccasin: #FFE4B5 | navajowhite: #FFDEAD | navy: #000080 | oldlace: #FDF5E6 | olive: #808000 |\n olivedrab: #6B8E23 | orange: #FFA500 | orangered: #FF4500 | orchid: #DA70D6 | palegoldenrod: #EEE8AA | palegreen: #98FB98 |\n paleturquoise: #AFEEEE | palevioletred: #DB7093 | papayawhip: #FFEFD5 | peachpuff: #FFDAB9 | peru: #CD853F | pink: #FFC0CB |\n plum: #DDA0DD | powderblue: #B0E0E6 | purple: #800080 | rebeccapurple: #663399 | red: #FF0000 | rosybrown: #BC8F8F | royalblue: #4169E1 |\n saddlebrown: #8B4513 | salmon: #FA8072 | sandybrown: #F4A460 | seagreen: #2E8B57 | seashell: #FFF5EE | sienna: #A0522D |\n silver: #C0C0C0 | skyblue: #87CEEB | slateblue: #6A5ACD | slategray: #708090 | slategrey: #708090 | snow: #FFFAFA |\n springgreen: #00FF7F | steelblue: #4682B4 | tan: #D2B48C | teal: #008080 | thistle: #D8BFD8 | tomato: #FF6347 |\n turquoise: #40E0D0 | violet: #EE82EE | wheat: #F5DEB3 | white: #FFFFFF | whitesmoke: #F5F5F5 | yellow: #FFFF00 |\n yellowgreen: #9ACD32 | transparent | currentcolor;\nRGBCOLOR = rgb(INT{3}) | rgb(STRICT_PERCENTAGE{3});\nRGBACOLOR = rgba(NUM{4}) | rgba(STRICT_PERCENTAGE{3} NUM);\nHSLCOLOR = hsl(NUM PERCENTAGE{2});\nHSLACOLOR = hsl(NUM PERCENTAGE{2} NUM);\nCOLOR = SCOLOR | RGBCOLOR | RGBACOLOR | HSLCOLOR | HSLACOLOR;\nBG_POSITION_TERM = PLENGTH | left | center | right | top | bottom;\nSIDE_OR_CORNER = [left | right] || [top | bottom];\nCOLOR_STOP = SPACE(COLOR [PERCENTAGE | LENGTH]?);\nLINEAR_GRADIENT = linear-gradient([ANGLE | SPACE(to SIDE_OR_CORNER)]? COLOR_STOP+) |\n repeating-linear-gradient([ANGLE | SPACE(to SIDE_OR_CORNER)]? COLOR_STOP+) |;\nGRADIENT_EXTENT = closest-corner | closest-side | farthest-corner | farthest-side;\nGRADIENT_POSITION = at BG_POSITION_TERM{1,4};\nGRADIENT_SHAPE = SPACE(circle LENGTH? GRADIENT_POSITION?) | SPACE(ellipse PLENGTH{2}? GRADIENT_POSITION?)| SPACE([circle | ellipse] GRADIENT_EXTENT? GRADIENT_POSITION?);\nRADIAL_GRADIENT = radial-gradient([GRADIENT_SHAPE | SPACE(GRADIENT_POSITION)]? COLOR_STOP+) |\n repeating-radial-gradient([GRADIENT_SHAPE | SPACE(GRADIENT_POSITION)]? COLOR_STOP+);\nURI_OR_NONE = URI | none;\nIMAGE = URI | LINEAR_GRADIENT | RADIAL_GRADIENT | none;\nazimuth = ANGLE | [[ left-side | far-left | left | center-left | center | center-right | right | far-right | right-side ] || behind ] | leftwards | rightwards;\nbackground-attachment = COMMA( [scroll | fixed | local]+ );\nbackground-color = COLOR;\nbackground-image = COMMA( IMAGE+ );\nbackground-position = COMMA( SPACE(BG_POSITION_TERM{1,4})+ ); /* relaxed */\nbackground-repeat = COMMA( [repeat | repeat-x | repeat-y | no-repeat]+ );\nborder-collapse = collapse | separate;\nBORDER_SIDE_COLOR = COLOR;\nBORDER_SIDE_STYLE = none | hidden | dotted | dashed | solid | double | groove | ridge | inset | outset;\nBORDER_SIDE_WIDTH = thin: 1px | medium: 3px | thick: 5px | NNEG_LENGTH;\nborder-spacing = LENGTH LENGTH?;\nborder-top-color = BORDER_SIDE_COLOR;\nborder-right-color = BORDER_SIDE_COLOR;\nborder-bottom-color = BORDER_SIDE_COLOR;\nborder-left-color = BORDER_SIDE_COLOR;\nborder-top-style = BORDER_SIDE_STYLE;\nborder-right-style = BORDER_SIDE_STYLE;\nborder-bottom-style = BORDER_SIDE_STYLE;\nborder-left-style = BORDER_SIDE_STYLE;\nborder-top-width = BORDER_SIDE_WIDTH;\nborder-right-width = BORDER_SIDE_WIDTH;\nborder-bottom-width = BORDER_SIDE_WIDTH;\nborder-left-width = BORDER_SIDE_WIDTH;\nBORDER_RADIUS = PLENGTH{1,2};\nborder-top-left-radius = BORDER_RADIUS;\nborder-top-right-radius = BORDER_RADIUS;\nborder-bottom-right-radius = BORDER_RADIUS;\nborder-bottom-left-radius = BORDER_RADIUS;\nborder-image-source = IMAGE;\nborder-image-slice = [NUM | PERCENTAGE]{1,4} || fill; /* relaxed */\nborder-image-width = [NUM | PLENGTH | auto]{1,4};\nborder-image-outset = [NUM | LENGTH]{1,4};\nborder-image-repeat = [ stretch | repeat | round | space ]{1,2};\nbottom = APLENGTH;\ncaption-side = top | bottom;\nclear = none | left | right | top | bottom | both | all | same;\nclip = rect(ALENGTH{4}) | rect(SPACE(ALENGTH{4})) | auto;\ncolor = COLOR;\nLIST_STYLE_TYPE = disc | circle | square | decimal | decimal-leading-zero | lower-roman |\n upper-roman | lower-greek | lower-latin | upper-latin | armenian | georgian | lower-alpha |\n upper-alpha | russian | upper-russian | lower-russian | cjk-ideographic | trad-chinese-informal |\n hebrew | none;\nTYPE_OR_UNIT_IN_ATTR = string | color | url | integer | number | length | angle | time | frequency;\nATTR = attr(SPACE(IDENT TYPE_OR_UNIT_IN_ATTR?) [ STRING | IDENT | COLOR | INT | NUM | PLENGTH | ANGLE | POS_TIME | FREQUENCY]?);\nCONTENT_LIST = [ STRING | URI | counter(IDENT LIST_STYLE_TYPE?) |\n counters(IDENT STRING LIST_STYLE_TYPE?) | ATTR |\n target-counter([ STRING | URI ] IDENT LIST_STYLE_TYPE?) |\n target-counter(ATTR IDENT LIST_STYLE_TYPE?) |\n target-counters([ STRING | URI ] IDENT STRING LIST_STYLE_TYPE?) |\n target-counters(ATTR IDENT STRING LIST_STYLE_TYPE?) |\n open-quote | close-quote | no-open-quote | no-close-quote |\n content([ text | before | after | first-letter ]?) |\n string(IDENT [first | start | last | first-except]?) ]+;\nCONTENT = normal | none | CONTENT_LIST;\ncontent = CONTENT;\nCOUNTER = [ IDENT INT? ]+ | none;\ncounter-increment = COUNTER;\ncounter-reset = COUNTER;\ncounter-set = COUNTER;\ncue-after = URI_OR_NONE;\ncue-before = URI_OR_NONE;\ncursor = COMMA(URI* [ auto | crosshair | default | pointer | move | e-resize | ne-resize | nw-resize |\n n-resize | se-resize | sw-resize | s-resize | w-resize | text | wait | help | progress ]);\ndirection = ltr | rtl;\ndisplay = inline | block | list-item | inline-block | table | inline-table | table-row-group |\n table-header-group | table-footer-group | table-row | table-column-group | table-column |\n table-cell | table-caption | none | oeb-page-head | oeb-page-foot | flex | inline-flex |\n ruby | ruby-base | ruby-text | ruby-base-container | ruby-text-container | run-in | compact | marker;\nelevation = ANGLE | below | level | above | higher | lower;\nempty-cells = show | hide;\nFAMILY = SPACE(IDENT+) | STRING;\nFAMILY_LIST = COMMA( FAMILY+ );\nfont-family = FAMILY_LIST;\nfont-size = xx-small | x-small | small | medium | large | x-large | xx-large | larger | smaller | PPLENGTH | POS_NUM;\nfont-style = normal | italic | oblique;\nfont-variant = normal | small-caps;\nfont-weight = normal | bold | bolder | lighter | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900;\nheight = PAPLENGTH | POS_NUM ;\nleft = APLENGTH;\nletter-spacing = normal | LENGTH_OR_NUM;\nline-height = normal | POS_NUM | PPLENGTH;\nlist-style-image = IMAGE;\nlist-style-position = inside | outside;\nlist-style-type = LIST_STYLE_TYPE;\nmargin-right = APLENGTH;\nmargin-left = APLENGTH;\nmargin-top = APLENGTH;\nmargin-bottom = APLENGTH;\nNPLENGTH = none | PLENGTH;\nmax-height = NPLENGTH;\nmax-width = NPLENGTH;\nmin-height = auto | PLENGTH;\nmin-width = auto | PLENGTH;\norphans = POS_INT;\noutline-offset = LENGTH;\noutline-color = COLOR | invert;\noutline-style = BORDER_SIDE_STYLE;\noutline-width = BORDER_SIDE_WIDTH;\noverflow = visible | hidden | scroll | auto;\npadding-right = PPLENGTH;\npadding-left = PPLENGTH;\npadding-top = PPLENGTH;\npadding-bottom = PPLENGTH;\nPAGE_BREAK = auto | always | avoid | left | right | recto | verso;\npage-break-after = PAGE_BREAK;\npage-break-before = PAGE_BREAK;\npage-break-inside = avoid | auto;\nPAUSE = POS_TIME | ZERO | POS_PERCENTAGE;\npause-after = PAUSE;\npause-before = PAUSE;\npitch-range = NUM;\npitch = FREQUENCY | x-low | low | medium | high | x-high;\nplay-during = [URI [ mix || repeat ]?] | auto | none;\nposition = static | relative | absolute | fixed;\nquotes = [STRING STRING]+ | none;\nrichness = NUM;\nright = APLENGTH;\nspeak-header = once | always;\nspeak-numeral = digits | continuous;\nspeak-punctuation = code | none;\nspeech-rate = NUM | x-slow | slow | medium | fast | x-fast | faster | slower;\nstress = NUM;\ntable-layout = auto | fixed;\ntext-align = left | right | center | justify | start | end;\ntext-decoration = none | [ underline || overline || line-through || blink ];\ntext-indent = PLENGTH;\ntext-transform = capitalize | uppercase | lowercase | none;\ntop = APLENGTH;\nvertical-align = baseline | sub | super | top | text-top | middle | bottom | text-bottom | PLENGTH;\nvisibility = visible | hidden | collapse;\nvoice-family = FAMILY_LIST;\nvolume = NUM | PERCENTAGE | silent | x-soft | soft | medium | loud | x-loud;\nwhite-space = normal | pre | nowrap | pre-wrap | pre-line;\nwidows = POS_INT;\nwidth = PAPLENGTH | POS_NUM ;\nword-spacing = normal | LENGTH_OR_NUM;\nz-index = auto | INT;\n\n[epub,moz,ms,webkit]hyphens = auto | manual | none;\n[webkit]hyphenate-character = auto | STRING;\n\n/* css-logical */\nmargin-block-start = APLENGTH;\nmargin-block-end = APLENGTH;\nmargin-inline-start = APLENGTH;\nmargin-inline-end = APLENGTH;\npadding-block-start = APLENGTH;\npadding-block-end = APLENGTH;\npadding-inline-start = APLENGTH;\npadding-inline-end = APLENGTH;\nborder-block-start-color = BORDER_SIDE_COLOR;\nborder-block-end-color = BORDER_SIDE_COLOR;\nborder-inline-start-color = BORDER_SIDE_COLOR;\nborder-inline-end-color = BORDER_SIDE_COLOR;\nborder-block-start-style = BORDER_SIDE_STYLE;\nborder-block-end-style = BORDER_SIDE_STYLE;\nborder-inline-start-style = BORDER_SIDE_STYLE;\nborder-inline-end-style = BORDER_SIDE_STYLE;\nborder-block-start-width = BORDER_SIDE_WIDTH;\nborder-block-end-width = BORDER_SIDE_WIDTH;\nborder-inline-start-width = BORDER_SIDE_WIDTH;\nborder-inline-end-width = BORDER_SIDE_WIDTH;\nblock-start = APLENGTH;\nblock-end = APLENGTH;\ninline-start = APLENGTH;\ninline-end = APLENGTH;\nblock-size = PAPLENGTH | POS_NUM;\ninline-size = PAPLENGTH | POS_NUM;\nmax-block-size = NPLENGTH;\nmax-inline-size = NPLENGTH;\nmin-block-size = auto | PLENGTH;\nmin-inline-size = auto | PLENGTH;\n\nSHAPE = auto | rectangle( PLENGTH{4} ) | ellipse( PLENGTH{4} ) | circle( PLENGTH{3} ) |\n polygon( SPACE(PLENGTH+)+ );\n[epubx]shape-inside = SHAPE;\n[epubx,webkit]shape-outside = SHAPE;\n[epubx,ms]wrap-flow = auto | both | start | end | maximum | clear | around /* epub al */;\n\nTRANSFORM_FUNCTION = matrix(NUM{6}) | translate(PLENGTH{1,2}) | translateX(PLENGTH) | translateY(PLENGTH) |\n scale(NUM{1,2}) | scaleX(NUM) | scaleY(NUM) | rotate(ANGLE) | skewX(ANGLE) | skewY(ANGLE);\n[epub,ms]transform = none | TRANSFORM_FUNCTION+;\n[epub,ms]transform-origin = [[[ top | bottom | left | right] PLENGTH?] | center | PLENGTH]{1,2}; /* relaxed */\n\nBOX = border-box | padding-box | content-box;\nSHADOW = SPACE(inset || LENGTH{2,4} || COLOR); /* relaxed */\n[webkit]background-size = COMMA( SPACE( [PLENGTH | auto ]{1,2} | cover | contain)+ );\n[webkit]background-origin = COMMA( BOX+ );\n[webkit]background-clip = COMMA( BOX+ );\n[webkit]box-shadow = none | COMMA( SHADOW+ );\ntext-shadow = none | COMMA( SHADOW+ );\n[webkit]box-decoration-break = slice | clone;\nFILTER_FUNCTION = blur(LENGTH) | brightness(NUM | PERCENTAGE) | contrast(NUM | PERCENTAGE) | drop-shadow(SPACE(LENGTH{2,3} COLOR?))\n | grayscale(NUM | PERCENTAGE) | hue-rotate(ANGLE) | invert(NUM | PERCENTAGE) | opacity(NUM | PERCENTAGE)\n | saturate(NUM | PERCENTAGE) | sepia(NUM | PERCENTAGE);\nFILTER_FUNCTION_LIST = FILTER_FUNCTION+;\n[webkit]filter = none | FILTER_FUNCTION_LIST;\n\nopacity = NUM;\n\n[moz,webkit]column-width = LENGTH | auto;\n[moz,webkit]column-count = INT | auto;\n[moz,webkit]column-gap = LENGTH | normal;\n[moz,webkit]column-rule-color = COLOR;\n[moz,webkit]column-rule-style = BORDER_SIDE_STYLE;\n[moz,webkit]column-rule-width = BORDER_SIDE_WIDTH;\nBREAK = auto | avoid | avoid-page | page | left | right | recto | verso | avoid-column | column | avoid-region | region;\nbreak-before = BREAK;\nbreak-after = BREAK;\nbreak-inside = auto | avoid | avoid-page | avoid-column | avoid-region;\n[webkit]column-span = none | auto | all;\n[moz]column-fill = auto | balance | balance-all;\n\nsrc = COMMA([SPACE(URI format(STRING+)?) | local(FAMILY)]+); /* for font-face */\n\n[epubx,webkit]flow-from = IDENT;\n[epubx,webkit]flow-into = IDENT;\n[epubx]flow-linger = INT | none;\n[epubx]flow-priority = INT;\n[epubx]flow-options = none | [ exclusive || last || static ];\n[epubx]page = INT | auto;\n[epubx]min-page-width = LENGTH;\n[epubx]min-page-height = LENGTH;\n[epubx]required = true | false;\n[epubx]enabled = true | false;\n[epubx]conflicting-partitions = COMMA(IDENT+);\n[epubx]required-partitions = COMMA(IDENT+);\n[epubx]snap-height = LENGTH | none;\n[epubx]snap-width = LENGTH | none;\n[epubx]flow-consume = all | some;\n[epubx]utilization = NUM;\n[epubx]text-zoom = font-size | scale;\n\n[adapt]template = URI_OR_NONE;\n[adapt]behavior = IDENT;\n\n/* CSS Fonts */\nfont-size-adjust = none | NNEG_NUM;\n[webkit]font-kerning = auto | normal | none;\nfont-variant-east-asian = normal | [[ jis78 | jis83 | jis90 | jis04 | simplified | traditional ] || [ full-width | proportional-width ] || ruby];\nfont-feature-settings = COMMA( normal | SPACE( STRING [ on | off | INT ]? )+ );\nfont-stretch = normal | wider | narrower | ultra-condensed | extra-condensed | condensed | semi-condensed | semi-expanded | expanded | extra-expanded | ultra-expanded;\n\n/* CSS Images */\nimage-resolution = RESOLUTION;\nobject-fit = fill | contain | cover | none | scale-down;\nobject-position = COMMA( SPACE(BG_POSITION_TERM{1,4})+ ); /* relaxed */\n\n/* CSS Paged Media */\nPAGE_SIZE = a5 | a4 | a3 | b5 | b4 | jis-b5 | jis-b4 | letter | legal | ledger;\nbleed = auto | LENGTH;\nmarks = none | [ crop || cross ];\nsize = POS_LENGTH{1,2} | auto | [ PAGE_SIZE || [ portrait | landscape ] ];\n\n/* CSS Page Floats */\nfloat-reference = inline | column | region | page;\nfloat = block-start | block-end | inline-start | inline-end | snap-block | snap-inline | left | right | top | bottom | none | footnote;\nfloat-min-wrap-block = PPLENGTH;\n\n/* CSS Ruby */\nruby-align = start | center | space-between | space-around;\nruby-position = over | under | inter-character;\n\n/* CSS Size Adjust */\n[moz,ms]text-size-adjust = auto | none | POS_PERCENTAGE;\n\n/* CSS Text */\n[ms,webkit]line-break = auto | loose | normal | strict;\noverflow-wrap = normal | break-word;\n[moz]tab-size = NNEG_INT | NNEG_LENGTH;\n[moz,ms]text-align-last = auto | start | end | left | right | center | justify;\n[ms]text-justify = auto | none | inter-word | inter-character | inter-ideograph /* specified in UA stylesheet for IE */;\n[ms]word-break = normal | keep-all | break-all | break-word;\n[ms]word-wrap = normal | break-word;\n\n/* CSS Text Decoration */\n[webkit]text-decoration-color = COLOR;\n[webkit]text-decoration-line = none | [ underline || overline || line-through || blink ];\n[webkit]text-decoration-skip = none | [ objects || spaces || ink || edges || box-decoration ];\n[webkit]text-decoration-style = solid | double | dotted | dashed | wavy;\n[epub,webkit]text-emphasis-color = COLOR;\n[webkit]text-emphasis-position = [ over | under ] [ right | left ];\n[epub,webkit]text-emphasis-style = none | [[ filled | open ] || [ dot | circle | double-circle | triangle | sesame ]] | STRING;\n[ms,webkit]text-underline-position = auto | [ under || [ left | right ]];\n\n/* CSS Transforms */\n[ms,webkit]backface-visibility = visible | hidden;\n\n/* CSS UI */\nbox-sizing = content-box | padding-box | border-box;\n[ms]text-overflow = [clip | ellipsis | STRING]{1,2};\n\n/* CSS Writing Modes */\n[webkit]text-combine = none | horizontal;\n[epub,ms]text-combine-horizontal = none | all | [ digits POS_INT? ]; /* relaxed */\ntext-combine-upright = none | all | [ digits POS_INT? ]; /* relaxed */\n[epub,webkit]text-orientation = mixed | upright | sideways-right | sideways-left | sideways | use-glyph-orientation /* the following values are kept for backward-compatibility */ | vertical-right | rotate-right | rotate-left | rotate-normal | auto;\nunicode-bidi = normal | embed | isolate | bidi-override | isolate-override | plaintext;\n[epub,webkit]writing-mode = horizontal-tb | vertical-rl | lr-tb | rl-tb | tb-rl | lr | rl | tb;\n\n/* CSS Flex box */\nFLEX_BASIS = content | PAPLENGTH;\nflex-direction = row | row-reverse | column | column-reverse;\nflex-wrap = nowrap | wrap | wrap-reverse;\norder = INT;\nflex-grow = NNEG_NUM;\nflex-shrink = NNEG_NUM;\nflex-basis = FLEX_BASIS;\nflex = none | [ [ NNEG_NUM NNEG_NUM? ] || FLEX_BASIS ];\njustify-content = flex-start | flex-end | center | space-between | space-around;\nalign-items = flex-start | flex-end | center | baseline | stretch;\nalign-self = auto | flex-start | flex-end | center | baseline | stretch;\nalign-content = flex-start | flex-end | center | space-between | space-around | stretch;\n\n/* Pointer Events */\n[ms]touch-action = auto | none | [ pan-x || pan-y ] | manipulation;\n\n/* SVG 2 */\nOPACITY_VALUE = NUM | PERCENTAGE;\nDASH_ARRAY = COMMA( SPACE( [ LENGTH | PERCENTAGE | NUM ]+ )+ );\nPAINT = none | child | child(INT) | COLOR | SPACE( URI [none | COLOR]? ) | context-fill | context-stroke;\ncolor-interpolation = auto | sRGB | linearRGB;\ncolor-rendering = auto | optimizeSpeed | optimizeQuality;\nfill = PAINT;\nfill-opacity = OPACITY_VALUE;\nfill-rule = nonzero | evenodd;\nglyph-orientation-vertical = auto | NUM | ANGLE;\nimage-rendering = auto | optimizeSpeed | optimizeQuality | crisp-edges | pixelated;\nmarker-start = none | URI;\nmarker-mid = none | URI;\nmarker-end = none | URI;\npointer-events = bounding-box | visiblePainted | visibleFill | visibleStroke | visible | painted | fill | stroke | all | none;\npaint-order = normal | [ fill || stroke || markers ];\nshape-rendering = auto | optimizeSpeed | crispEdges | geometricPrecision;\nstop-color = COLOR;\nstop-opacity = OPACITY_VALUE;\nstroke = PAINT;\nstroke-dasharray = none | DASH_ARRAY;\nstroke-dashoffset = PERCENTAGE | LENGTH_OR_NUM;\nstroke-linecap = butt | round | square;\nstroke-linejoin = miter | round | bevel;\nstroke-miterlimit = NUM;\nstroke-opacity = OPACITY_VALUE;\nstroke-width = PERCENTAGE | LENGTH_OR_NUM;\ntext-anchor = start | middle | end;\ntext-rendering = auto | optimizeSpeed | optimizeLegibility | geometricPrecision;\nvector-effect = none | SPACE( [ non-scaling-stroke | non-scaling-size | non-rotation | fixed-position ]+ [ viewport | screen ]? );\n\n/* SVG 1.1 */\nalignment-baseline = auto | baseline | before-edge | text-before-edge | middle | central | after-edge | text-after-edge | ideographic | alphabetic | hanging | mathematical;\nbaseline-shift = baseline | sub | super | PERCENTAGE | LENGTH_OR_NUM;\ndominant-baseline = auto | use-script | no-change | reset-size | ideographic | alphabetic | hanging | mathematical | central | middle | text-after-edge | text-before-edge;\nmask = none | URI;\n\n/* css-masking-1 */\nSHAPE_RADIUS = PLENGTH | closest-side | farthest-side;\nFILL_RULE = nonzero | evenodd;\nSHAPE_BOX = BOX | margin-box;\nGEOMETRY_BOX = SHAPE_BOX | fill-box | stroke-box | view-box;\nBASIC_SHAPE =\n inset( SPACE( PLENGTH{1,4} [ round PLENGTH{1,4} [ SLASH PLENGTH{1,4} ]? ]? ) )\n | circle( SPACE( [SHAPE_RADIUS]? [at BG_POSITION_TERM{1,4}]? ) )\n | ellipse( SPACE( SHAPE_RADIUS{2}? [at BG_POSITION_TERM{1,4}]? ) )\n | polygon( FILL_RULE? COMMA( SPACE( PLENGTH{2} )+ )+ );\n[webkit]clip-path = none | URI | [ BASIC_SHAPE || GEOMETRY_BOX ];\nclip-rule = nonzero | evenodd;\n\n/* filters */\nflood-color = COLOR;\nflood-opacity = OPACITY_VALUE;\nlighting-color = COLOR;\n\n/* compositing-1 */\nBLEND_MODE = normal | multiply | screen | overlay | darken | lighten | color-dodge | color-burn | hard-light | soft-light | difference | exclusion | hue | saturation | color | luminosity;\nmix-blend-mode = BLEND_MODE;\nisolation = auto | isolate;\nbackground-blend-mode = COMMA( BLEND_MODE+ );\n\n/* CSS GCPM */\nstring-set = COMMA( SPACE( IDENT CONTENT_LIST )+ | none );\nfootnote-policy = auto | line;\n\n/* CSS Repeated Headers and Footers */\n[viv]repeat-on-break = auto | none | header | footer;\n\nDEFAULTS\n\nbackground-attachment: scroll;\nbackground-color: transparent;\nbackground-image: none;\nbackground-repeat: repeat;\nbackground-position: 0% 0%;\nbackground-clip: border-box;\nbackground-origin: padding-box;\nbackground-size: auto;\nborder-top-color: currentColor;\nborder-right-color: currentColor;\nborder-bottom-color: currentColor;\nborder-left-color: currentColor;\nborder-top-style: none;\nborder-right-style: none;\nborder-bottom-style: none;\nborder-left-style: none;\nborder-top-width: 3px;\nborder-right-width: 3px;\nborder-bottom-width: 3px;\nborder-left-width: 3px;\nborder-top-left-radius: 0;\nborder-top-right-radius: 0;\nborder-bottom-right-radius: 0;\nborder-bottom-left-radius: 0;\nborder-image-source: none;\nborder-image-slice: 100%;\nborder-image-width: 1;\nborder-image-outset: 0;\nborder-image-repeat: stretch;\ncolumn-count: auto;\ncolumn-gap: normal;\ncolumn-width: auto;\ncolumn-rule-color: currentColor;\ncolumn-rule-style: none;\ncolumn-rule-width: 3px;\ncolumn-fill: balance;\noutline-color: currentColor;\noutline-style: none;\noutline-width: 3px;\nflex-direction: row;\nflex-wrap: nowrap;\nfont-family: serif;\nfont-style: normal;\nfont-size: medium;\nfont-variant: normal;\nfont-weight: normal;\nfont-stretch: normal;\nline-height: normal;\nlist-style-image: none;\nlist-style-position: outside;\nlist-style-type: disc;\nmargin-bottom: auto;\nmargin-left: auto;\nmargin-right: auto;\nmargin-top: auto;\npadding-bottom: auto;\npadding-left: auto;\npadding-right: auto;\npadding-top: auto;\ntext-emphasis-color: currentColor;\ntext-emphasis-style: none;\nmarker-start: none;\nmarker-mid: none;\nmarker-end: none;\n\n/* css-logical */\nborder-block-start-color: currentColor;\nborder-block-end-color: currentColor;\nborder-inline-start-color: currentColor;\nborder-inline-end-color: currentColor;\nborder-block-start-style: none;\nborder-block-end-style: none;\nborder-inline-start-style: none;\nborder-inline-end-style: none;\nborder-block-start-width: 3px;\nborder-block-end-width: 3px;\nborder-inline-start-width: 3px;\nborder-inline-end-width: 3px;\n\nSHORTHANDS\n\nbackground = COMMA background-image [background-position [ / background-size ]] background-repeat\n background-attachment [background-origin background-clip] background-color; /* background-color is a special case, see the code */\nborder-top = border-top-width border-top-style border-top-color;\nborder-right = border-right-width border-right-style border-right-color;\nborder-bottom = border-bottom-width border-bottom-style border-bottom-color;\nborder-left = border-left-width border-left-style border-left-color;\nborder-width = INSETS border-top-width border-right-width border-bottom-width border-left-width;\nborder-style = INSETS border-top-style border-right-style border-bottom-style border-left-style;\nborder-color = INSETS border-top-color border-right-color border-bottom-color border-left-color;\nborder = border-width border-style border-color;\nborder-image = border-image-source border-image-slice [ / border-image-width [ / border-image-outset ] ]\n border-image-repeat;\nborder-radius = INSETS_SLASH border-top-left-radius border-top-right-radius\n border-bottom-right-radius border-bottom-left-radius;\n[moz,webkit]columns = column-width column-count;\n[moz,webkit]column-rule = column-rule-width column-rule-style column-rule-color;\nflex-flow = flex-direction flex-wrap;\noeb-column-number = column-count;\noutline = outline-width outline-style outline-color;\nlist-style = list-style-type list-style-position list-style-image;\nmargin = INSETS margin-top margin-right margin-bottom margin-left;\npadding = INSETS padding-top padding-right padding-bottom padding-left;\npause = INSETS pause-before pause-after;\nfont = FONT font-style font-variant font-weight font-stretch /* font-size line-height font-family are special-cased */;\n[epub,webkit]text-emphasis = text-emphasis-style text-emphasis-color;\nmarker = INSETS marker-start marker-mid marker-end;\n\n/* css-logical */\nmargin-block = INSETS margin-block-start margin-block-end;\nmargin-inline = INSETS margin-inline-start margin-inline-end;\npadding-block = INSETS padding-block-start padding-block-end;\npadding-inline = INSETS padding-inline-start padding-inline-end;\nborder-block-width = INSETS border-block-start-width border-block-end-width;\nborder-block-style = INSETS border-block-start-style border-block-end-style;\nborder-block-color = INSETS border-block-start-color border-block-end-color;\nborder-inline-width = INSETS border-inline-start-width border-inline-end-width;\nborder-inline-style = INSETS border-inline-start-style border-inline-end-style;\nborder-inline-color = INSETS border-inline-start-color border-inline-end-color;\nborder-block = border-block-width border-block-style border-block-color;\nborder-inline = border-inline-width border-inline-style border-inline-color;\nborder-block-start = border-block-start-width border-block-start-style border-block-start-color;\nborder-block-end = border-block-end-width border-block-end-style border-block-end-color;\nborder-inline-start = border-inline-start-width border-inline-start-style border-inline-start-color;\nborder-inline-end = border-inline-end-width border-inline-end-style border-inline-end-color;\ninset-block-start = block-start;\ninset-block-end = block-end;\ninset-inline-start = inline-start;\ninset-inline-end = inline-end;\ninset-block = INSETS block-start block-end;\ninset-inline = INSETS inline-start inline-end;\n\n/* old names */\n[adapt,webkit]margin-before = margin-block-start;\n[adapt,webkit]margin-after = margin-block-end;\n[adapt,webkit]margin-start = margin-inline-start;\n[adapt,webkit]margin-end = margin-inline-end;\n[adapt,webkit]padding-before = padding-block-start;\n[adapt,webkit]padding-after = padding-block-end;\n[adapt,webkit]padding-start = padding-inline-start;\n[adapt,webkit]padding-end = padding-inline-end;\n[adapt,webkit]border-before-color = border-block-start-color;\n[adapt,webkit]border-after-color = border-block-end-color;\n[adapt,webkit]border-start-color = border-inline-start-color;\n[adapt,webkit]border-end-color = border-inline-end-color;\n[adapt,webkit]border-before-style = border-block-start-style;\n[adapt,webkit]border-after-style = border-block-end-style;\n[adapt,webkit]border-start-style = border-inline-start-style;\n[adapt,webkit]border-end-style = border-inline-end-style;\n[adapt,webkit]border-before-width = border-block-start-width;\n[adapt,webkit]border-after-width = border-block-end-width;\n[adapt,webkit]border-start-width = border-inline-start-width;\n[adapt,webkit]border-end-width = border-inline-end-width;\n[adapt,webkit]before = block-start;\n[adapt,webkit]after = block-end;\n[adapt,webkit]start = inline-start;\n[adapt,webkit]end = inline-end;\n\n`;\n\n// user-agent.xml\nexport const UserAgentXml = `\n<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:s=\"http://www.pyroxy.com/ns/shadow\">\n<head>\n<style><![CDATA[\n\n.footnote-content {\n float: footnote;\n}\n\n.table-cell-container {\n display: block;\n}\n\n]]></style>\n</head>\n<body>\n\n<s:template id=\"footnote\"><s:content/><s:include class=\"footnote-content\"/></s:template>\n\n<s:template id=\"table-cell\"><div data-vivliostyle-flow-root=\"true\" class=\"table-cell-container\"><s:content/></div></s:template>\n\n</body>\n</html>`;\n\n// user-agent-page.css\nexport const UserAgentPageCss = `\n@namespace html \"http://www.w3.org/1999/xhtml\";\n\n:root {\n hyphens: -epubx-expr(pref-hyphenate? \"auto\": \"manual\");\n}\n:root[data-vivliostyle-epub-spine-properties~=\"page-spread-left\"] {\n break-before: left;\n}\n:root[data-vivliostyle-epub-spine-properties~=\"page-spread-right\"] {\n break-before: right;\n}\n\n@-adapt-footnote-area {\n display: block;\n margin-block-start: 0.5em;\n margin-block-end: 0.5em;\n}\n\n@-adapt-footnote-area ::before {\n display: block;\n border-block-start-width: 1px;\n border-block-start-style: solid;\n border-block-start-color: black;\n margin-block-end: 0.4em;\n margin-inline-start: 0;\n margin-inline-end: 60%;\n}\n\n/* default page master */\n@-epubx-page-master :background-host {\n @-epubx-partition :layout-host {\n -epubx-flow-from: body;\n top: -epubx-expr(header.margin-bottom-edge);\n bottom: -epubx-expr(page-height - footer.margin-top-edge);\n left: 0px;\n right: 0px;\n column-width: 25em;\n }\n @-epubx-partition footer :oeb-page-foot {\n writing-mode: horizontal-tb;\n -epubx-flow-from: oeb-page-foot;\n bottom: 0px;\n left: 0px;\n right: 0px;\n }\n @-epubx-partition header :oeb-page-head {\n writing-mode: horizontal-tb;\n -epubx-flow-from: oeb-page-head;\n top: 0px;\n left: 0px;\n right: 0px;\n }\n}\n\n@page {\n @top-left-corner {\n text-align: right;\n vertical-align: middle;\n }\n @top-left {\n text-align: left;\n vertical-align: middle;\n }\n @top-center {\n text-align: center;\n vertical-align: middle;\n }\n @top-right {\n text-align: right;\n vertical-align: middle;\n }\n @top-right-corner {\n text-align: left;\n vertical-align: middle;\n }\n @left-top {\n text-align: center;\n vertical-align: top;\n }\n @left-middle {\n text-align: center;\n vertical-align: middle;\n }\n @left-bottom {\n text-align: center;\n vertical-align: bottom;\n }\n @right-top {\n text-align: center;\n vertical-align: top;\n }\n @right-middle {\n text-align: center;\n vertical-align: middle;\n }\n @right-bottom {\n text-align: center;\n vertical-align: bottom;\n }\n @bottom-left-corner {\n text-align: right;\n vertical-align: middle;\n }\n @bottom-left {\n text-align: left;\n vertical-align: middle;\n }\n @bottom-center {\n text-align: center;\n vertical-align: middle;\n }\n @bottom-right {\n text-align: right;\n vertical-align: middle;\n }\n @bottom-right-corner {\n text-align: left;\n vertical-align: middle;\n }\n}\n\n@media print {\n @page {\n margin: 10%;\n }\n}\n`;\n\n// user-agent-base.css\nexport const UserAgentBaseCss = `\n@namespace html \"http://www.w3.org/1999/xhtml\";\n\nhtml|html,\nhtml|address,\nhtml|blockquote,\nhtml|body,\nhtml|dd,\nhtml|div,\nhtml|dl,\nhtml|dt,\nhtml|fieldset,\nhtml|form,\nhtml|frame,\nhtml|frameset,\nhtml|h1,\nhtml|h2,\nhtml|h3,\nhtml|h4,\nhtml|h5,\nhtml|h6,\nhtml|noframes,\nhtml|ol,\nhtml|p,\nhtml|ul,\nhtml|center,\nhtml|dir,\nhtml|hr,\nhtml|menu,\nhtml|pre,\nhtml|article,\nhtml|section,\nhtml|nav,\nhtml|aside,\nhtml|hgroup,\nhtml|footer,\nhtml|header,\nhtml|figure,\nhtml|figcaption,\nhtml|main {\n display: block;\n unicode-bidi: normal;\n}\nhtml|li {\n display: list-item;\n}\nhtml|head {\n display: none !important;\n}\nhtml|table {\n display: table;\n}\nhtml|tr {\n display: table-row;\n}\nhtml|thead {\n display: table-header-group;\n break-after: avoid;\n}\nhtml|tbody {\n display: table-row-group;\n}\nhtml|tfoot {\n display: table-footer-group;\n break-before: avoid;\n}\nhtml|col {\n display: table-column;\n}\nhtml|colgroup {\n display: table-column-group;\n}\nhtml|td,\nhtml|th {\n display: table-cell;\n}\nhtml|caption {\n display: table-caption;\n text-align: center;\n}\nhtml|th {\n font-weight: bolder;\n text-align: center;\n}\nhtml|*[hidden],\nhtml|link,\nhtml|style,\nhtml|script {\n display: none;\n}\nhtml|body {\n margin: 8px;\n}\nhtml|h1 {\n font-size: 2em;\n margin-block-start: 0.67em;\n margin-block-end: 0.67em;\n margin-inline-start: 0em;\n margin-inline-end: 0em;\n}\nhtml|h2 {\n font-size: 1.5em;\n margin-block-start: 0.75em;\n margin-block-end: 0.75em;\n margin-inline-start: 0em;\n margin-inline-end: 0em;\n}\nhtml|h3 {\n font-size: 1.17em;\n margin-block-start: 0.83em;\n margin-block-end: 0.83em;\n margin-inline-start: 0em;\n margin-inline-end: 0em;\n}\nhtml|h4,\nhtml|p,\nhtml|blockquote,\nhtml|ul,\nhtml|fieldset,\nhtml|form,\nhtml|ol,\nhtml|dl,\nhtml|dir,\nhtml|menu,\nhtml|h5,\nhtml|h6 {\n margin-block-start: 1em;\n margin-block-end: 1em;\n margin-inline-start: 0em;\n margin-inline-end: 0em;\n}\nhtml|h5 {\n font-size: 0.83em;\n}\nhtml|h6 {\n font-size: 0.75em;\n}\nhtml|h1,\nhtml|h2,\nhtml|h3,\nhtml|h4,\nhtml|h5,\nhtml|h6,\nhtml|b,\nhtml|strong {\n font-weight: bolder;\n}\nhtml|h1,\nhtml|h2,\nhtml|h3,\nhtml|h4,\nhtml|h5,\nhtml|h6 {\n break-after: avoid;\n}\nhtml|blockquote {\n margin-block-start: 0px;\n margin-block-end: 0px;\n margin-inline-start: 40px;\n margin-inline-end: 40px;\n}\nhtml|i,\nhtml|cite,\nhtml|em,\nhtml|var,\nhtml|address {\n font-style: italic;\n}\nhtml|pre,\nhtml|tt,\nhtml|code,\nhtml|kbd,\nhtml|samp {\n font-family: monospace;\n}\nhtml|pre {\n white-space: pre;\n}\nhtml|button,\nhtml|textarea,\nhtml|input,\nhtml|select {\n display: inline-block;\n}\nhtml|big {\n font-size: 1.17em;\n}\nhtml|small,\nhtml|sub,\nhtml|sup {\n font-size: 0.83em;\n}\nhtml|sub {\n vertical-align: sub;\n}\nhtml|sup {\n vertical-align: super;\n}\nhtml|table {\n border-spacing: 2px;\n}\nhtml|thead,\nhtml|tbody,\nhtml|tfoot {\n vertical-align: middle;\n}\n/* for XHTML tables without tbody */\nhtml|table > html|tr {\n vertical-align: middle;\n}\nhtml|td,\nhtml|th {\n vertical-align: inherit;\n}\nhtml|s,\nhtml|strike,\nhtml|del {\n text-decoration: line-through;\n}\nhtml|hr {\n border: 1px inset;\n}\nhtml|ol,\nhtml|ul,\nhtml|dir,\nhtml|menu,\nhtml|dd {\n margin: 0px;\n margin-inline-start: 40px;\n}\nhtml|ol html|ul,\nhtml|ul html|ol,\nhtml|ul html|ul,\nhtml|ol html|ol {\n margin-block-start: 0;\n margin-block-end: 0;\n}\nhtml|u,\nhtml|ins {\n text-decoration: underline;\n}\nhtml|center {\n text-align: center;\n}\nhtml|q:before {\n content: open-quote;\n}\nhtml|q:after {\n content: close-quote;\n}\n\nhtml|audio,\nhtml|video {\n break-inside: avoid;\n}\n\nhtml|ruby {\n display: ruby;\n}\nhtml|rp {\n display: none;\n}\nhtml|rbc {\n display: ruby-base-container;\n}\nhtml|rtc {\n display: ruby-text-container;\n}\nhtml|rb {\n display: ruby-base;\n white-space: nowrap;\n}\nhtml|rt {\n display: ruby-text;\n}\nhtml|ruby,\nhtml|rb,\nhtml|rt,\nhtml|rbc,\nhtml|rtc {\n unicode-bidi: isolate;\n}\n\nhtml|rtc,\nhtml|rt {\n font-variant-east-asian: ruby;\n text-emphasis: none;\n white-space: nowrap;\n line-height: 1;\n}\n\nhtml|rtc:lang(zh),\nhtml|rt:lang(zh) {\n ruby-align: center;\n}\n\nhtml|rtc,\nhtml|rt {\n font-size: 50%;\n}\n\nhtml|rtc:lang(zh-TW),\nhtml|rt:lang(zh-TW) {\n font-size: 30%;\n}\n\nhtml|rtc > html|rt,\nhtml|rtc > html|rt:lang(zh-TW) {\n font-size: 100%;\n}\n\n/* Bidi settings */\nhtml|bdo[dir=\"ltr\"] {\n direction: ltr;\n unicode-bidi: bidi-override;\n}\nhtml|bdo[dir=\"rtl\"] {\n direction: rtl;\n unicode-bidi: bidi-override;\n}\nhtml|*[dir=\"ltr\"] {\n direction: ltr;\n unicode-bidi: embed;\n}\nhtml|*[dir=\"rtl\"] {\n direction: rtl;\n unicode-bidi: embed;\n}\n\n/*------------------ epub-specific ---------------------*/\n\n@namespace epub \"http://www.idpf.org/2007/ops\";\n\nhtml|a[epub|type=\"noteref\"] {\n font-size: 0.75em;\n vertical-align: super;\n line-height: 0.01;\n}\n\nhtml|a[epub|type=\"noteref\"]:href-epub-type(footnote) {\n -adapt-template: url(user-agent.xml#footnote);\n text-decoration: none;\n}\n\nhtml|aside[epub|type=\"footnote\"] {\n display: none;\n}\n\nhtml|aside[epub|type=\"footnote\"]:footnote-content {\n display: block;\n margin: 0.25em;\n font-size: 1.2em;\n line-height: 1.2;\n}\n\nepub|trigger {\n display: none;\n}\n\nepub|switch {\n display: inline;\n}\n\nepub|default {\n display: inline;\n}\n\nepub|case {\n display: none;\n}\n\nepub|case[required-namespace::supported] {\n display: inline;\n}\n\nepub|case[required-namespace::supported] ~ epub|case {\n display: none;\n}\n\nepub|case[required-namespace::supported] ~ epub|default {\n display: none;\n}\n\n/*--------------- ncx and toc ----------------------*/\n\n@namespace ncx \"http://www.daisy.org/z3986/2005/ncx/\";\n\nncx|ncx {\n display: block;\n padding-top: 10px;\n padding-bottom: 10px;\n}\n\nncx|content {\n display: none;\n}\n\nbody > * {\n -adapt-behavior: body-child;\n}\n\n[role=\"doc-toc\"],\n[role=\"directory\"],\nnav,\n.toc,\n#toc,\n#table-of-contents,\n#contents {\n -adapt-behavior: toc-root;\n}\n\n[role=\"doc-toc\"] a,\n[role=\"directory\"] a,\nnav a,\n.toc a,\n#toc a,\nncx|navLabel {\n -adapt-behavior: toc-node-anchor;\n}\n\n[role=\"doc-toc\"] li,\n[role=\"directory\"] li,\nnav li,\n.toc li,\n#toc li,\nncx|navPoint {\n -adapt-behavior: toc-node;\n}\n\n[role=\"doc-toc\"] li > *:first-child,\n[role=\"directory\"] li > *:first-child,\nnav li > *:first-child,\n.toc li > *:first-child,\n#toc li > *:first-child {\n -adapt-behavior: toc-node-first-child;\n}\n\n[role=\"doc-toc\"] ol,\n[role=\"directory\"] ol,\nnav ol,\n.toc ol,\n#toc ol,\n[role=\"doc-toc\"] ul,\n[role=\"directory\"] ul,\nnav ul,\n.toc ul,\n#toc ul,\nol[role=\"doc-toc\"],\nol[role=\"directory\"],\nol.toc,\nol#toc,\nul[role=\"doc-toc\"],\nul[role=\"directory\"],\nul.toc,\nul#toc {\n -adapt-behavior: toc-container;\n}\n`;\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2015 Trim-marks Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Net - Fetch resource from a URL.\n */\nimport * as Base from \"./base\";\nimport * as Logging from \"./logging\";\nimport * as Task from \"./task\";\nimport * as TaskUtil from \"./task-util\";\nimport { Net, XmlDoc } from \"./types\";\nimport { UserAgentXml } from \"./assets\";\n\n/**\n * @enum {string}\n */\nexport enum XMLHttpRequestResponseType {\n DEFAULT = \"\",\n ARRAYBUFFER = \"arraybuffer\",\n BLOB = \"blob\",\n DOCUMENT = \"document\",\n JSON = \"json\",\n TEXT = \"text\",\n}\n\nexport type Response = Net.Response;\n\nexport function ajax(\n url: string,\n opt_type?: XMLHttpRequestResponseType,\n opt_method?: string,\n opt_data?: string,\n opt_contentType?: string,\n): Task.Result<Response> {\n const frame: Task.Frame<Response> = Task.newFrame(\"ajax\");\n const request = new XMLHttpRequest();\n const continuation = frame.suspend(request);\n const response: Response = {\n status: 0,\n statusText: \"\",\n url,\n contentType: null,\n responseText: null,\n responseXML: null,\n responseBlob: null,\n };\n request.open(opt_method || \"GET\", url, true);\n if (opt_type) {\n request.responseType = opt_type;\n }\n request.onreadystatechange = () => {\n if (request.readyState === 4) {\n response.status = request.status;\n response.statusText =\n request.statusText || (request.status == 404 && \"Not Found\") || \"\";\n if (response.status == 200 || response.status == 0) {\n if (\n (!opt_type || opt_type === XMLHttpRequestResponseType.DOCUMENT) &&\n request.responseXML &&\n request.responseXML.documentElement.localName != \"parsererror\"\n ) {\n response.responseXML = request.responseXML;\n response.contentType = (request.responseXML as any).contentType;\n } else if (\n (!opt_type || opt_type === XMLHttpRequestResponseType.DOCUMENT) &&\n request.response instanceof HTMLDocument\n ) {\n response.responseXML = request.response;\n response.contentType = (request.response as any).contentType;\n } else {\n const text = request.response;\n if (\n (!opt_type || opt_type === XMLHttpRequestResponseType.TEXT) &&\n typeof text == \"string\"\n ) {\n response.responseText = text;\n } else if (!text) {\n Logging.logger.warn(\"Unexpected empty success response for\", url);\n } else {\n if (typeof text == \"string\") {\n response.responseBlob = makeBlob([text]);\n } else {\n response.responseBlob = text as Blob;\n }\n }\n const contentTypeHeader = request.getResponseHeader(\"Content-Type\");\n if (contentTypeHeader) {\n response.contentType = contentTypeHeader.replace(/(.*);.*$/, \"$1\");\n }\n }\n }\n continuation.schedule(response);\n }\n };\n try {\n if (opt_data) {\n request.setRequestHeader(\n \"Content-Type\",\n opt_contentType || \"text/plain; charset=UTF-8\",\n );\n request.send(opt_data);\n } else {\n if (\n /^file:|^https?:\\/\\/[^/]+\\.githubusercontent\\.com|\\.(xhtml|xht|opf)$/i.test(\n url,\n )\n ) {\n // File or GitHub raw URL or .xht(ml) or .opf\n if (\n /\\/aozorabunko\\/[^/]+\\/cards\\/[^/]+\\/files\\/[^/.]+\\.html$/.test(url)\n ) {\n // Aozorabunko's (X)HTML support\n request.overrideMimeType(\"text/html; charset=Shift_JIS\");\n } else if (/\\.(html|htm)$/i.test(url)) {\n request.overrideMimeType(\"text/html; charset=UTF-8\");\n } else if (/\\.(xhtml|xht|xml|opf)$/i.test(url)) {\n request.overrideMimeType(\"application/xml; charset=UTF-8\");\n } else if (/\\.(txt|css)$/i.test(url)) {\n request.overrideMimeType(\"text/plain; charset=UTF-8\");\n } else {\n // fallback to HTML\n request.overrideMimeType(\"text/html; charset=UTF-8\");\n }\n } else if (/^data:,(<|%3c)/i.test(url)) {\n request.overrideMimeType(\"text/html; charset=UTF-8\");\n } else if (/^data:,/i.test(url)) {\n request.overrideMimeType(\"text/plain; charset=UTF-8\");\n }\n request.send(null);\n }\n } catch (e) {\n Logging.logger.warn(e, `Error fetching ${url}`);\n continuation.schedule(response);\n }\n return frame.result();\n}\n\n/**\n * @return Blob\n */\nexport function makeBlob(\n parts: (string | Blob | ArrayBuffer | ArrayBufferView)[],\n opt_type?: string,\n): any {\n const type = opt_type || \"application/octet-stream\";\n const builderCtr = window[\"WebKitBlobBuilder\"] || window[\"MSBlobBuilder\"]; // deprecated\n if (builderCtr) {\n const builder = new builderCtr();\n for (let i = 0; i < parts.length; i++) {\n builder.append(parts[i]);\n }\n return builder.getBlob(type);\n }\n return new Blob(parts, { type });\n}\n\n/**\n * @return Task.Result.<ArrayBuffer>\n */\nexport function readBlob(blob: Blob): any {\n const frame: Task.Frame<ArrayBuffer> = Task.newFrame(\"readBlob\");\n const fileReader = new FileReader();\n const continuation = frame.suspend(fileReader);\n fileReader.addEventListener(\n \"load\",\n () => {\n continuation.schedule(fileReader.result as ArrayBuffer);\n },\n false,\n );\n fileReader.readAsArrayBuffer(blob);\n return frame.result();\n}\n\nexport function revokeObjectURL(url: string): void {\n (window[\"URL\"] || window[\"webkitURL\"]).revokeObjectURL(url);\n}\n\n/**\n * @return url\n */\nexport function createObjectURL(blob: Blob): string {\n return (window[\"URL\"] || window[\"webkitURL\"]).createObjectURL(blob);\n}\n\n/**\n * @template Resource\n */\nexport class ResourceStore<Resource> implements Net.ResourceStore<Resource> {\n resources: { [key: string]: Resource } = {};\n fetchers: { [key: string]: TaskUtil.Fetcher<Resource> } = {};\n\n constructor(\n public readonly parser: (\n p1: Response,\n p2: ResourceStore<Resource>,\n ) => Task.Result<Resource>,\n public readonly type: XMLHttpRequestResponseType,\n ) {}\n\n /**\n * @return resource for the given URL\n */\n load(\n url: string,\n opt_required?: boolean,\n opt_message?: string,\n ): Task.Result<Resource> {\n url = Base.stripFragment(url);\n const resource = this.resources[url];\n if (typeof resource != \"undefined\") {\n return Task.newResult(resource);\n }\n return this.fetch(url, opt_required, opt_message).get();\n }\n\n private fetchInner(\n url: string,\n opt_required?: boolean,\n opt_message?: string,\n ): Task.Result<Resource> {\n const frame: Task.Frame<Resource> = Task.newFrame(\"fetch\");\n\n // Hack for TOCView.showTOC()\n const isTocBox = url.endsWith(\"?viv-toc-box\");\n if (isTocBox) {\n url = url.replace(\"?viv-toc-box\", \"\");\n }\n const userAgentXmlUrl = Base.resolveURL(\n \"user-agent.xml\",\n Base.resourceBaseURL,\n );\n const isUserAgentXml = !isTocBox && url === userAgentXmlUrl;\n if (isUserAgentXml) {\n // Change \"user-agent.xml\" URL to data URL\n url = `data:application/xml,${encodeURIComponent(UserAgentXml)}`;\n }\n\n ajax(url, this.type).then((response) => {\n if (response.status >= 400) {\n if (opt_required) {\n throw new Error(\n (opt_message || `Failed to fetch required resource: ${url}`) +\n ` (${response.status}${\n response.statusText ? \" \" + response.statusText : \"\"\n })`,\n );\n }\n }\n if (isTocBox) {\n // Hack for TOCView.showTOC()\n url += \"?viv-toc-box\";\n response.url += \"?viv-toc-box\";\n } else if (isUserAgentXml) {\n // Restore \"user-agent.xml\" URL\n response.url = url = userAgentXmlUrl;\n }\n this.parser(response, this).then((resource) => {\n delete this.fetchers[url];\n this.resources[url] = resource;\n frame.finish(resource);\n });\n });\n return frame.result();\n }\n\n /**\n * @return fetcher for the resource for the given URL\n */\n fetch(\n url: string,\n opt_required?: boolean,\n opt_message?: string,\n ): TaskUtil.Fetcher<Resource> {\n url = Base.stripFragment(url);\n const resource = this.resources[url];\n if (resource) {\n return null;\n }\n let fetcher = this.fetchers[url];\n if (!fetcher) {\n fetcher = new TaskUtil.Fetcher(\n () => this.fetchInner(url, opt_required, opt_message),\n `Fetch ${url}`,\n );\n this.fetchers[url] = fetcher;\n fetcher.start();\n }\n return fetcher;\n }\n\n get(url: string): XmlDoc.XMLDocHolder {\n const resource: unknown = this.resources[Base.stripFragment(url)];\n return resource as XmlDoc.XMLDocHolder;\n }\n\n delete(url: string) {\n delete this.resources[Base.stripFragment(url)];\n }\n}\n\nexport type JSONStore = ResourceStore<Base.JSON>;\n\nexport function parseJSONResource(\n response: Response,\n store: JSONStore,\n): Task.Result<Base.JSON> {\n const text = response.responseText;\n return Task.newResult(text ? Base.stringToJSON(text) : null);\n}\n\nexport function newJSONStore(): JSONStore {\n return new ResourceStore(parseJSONResource, XMLHttpRequestResponseType.TEXT);\n}\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2015 Trim-marks Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview CssParser - CSS Parser.\n */\nimport * as Base from \"./base\";\nimport * as Css from \"./css\";\nimport * as CssTokenizer from \"./css-tokenizer\";\nimport * as Exprs from \"./exprs\";\nimport * as Logging from \"./logging\";\nimport * as Net from \"./net\";\nimport * as Task from \"./task\";\n\n/**\n * User agent stylesheet base specificity.\n */\nexport const SPECIFICITY_USER_AGENT: number = 0;\n\n/**\n * User stylesheet base specificity.\n */\nexport const SPECIFICITY_USER: number = 16777216;\n\n/**\n * Author stylesheet (\"normal\" stylesheet) base specificity.\n */\nexport const SPECIFICITY_AUTHOR: number = 33554432;\n\n/**\n * Style attribute base specificity.\n */\nexport const SPECIFICITY_STYLE: number = 50331648;\n\n/**\n * Style attribute base specificity when !important is used.\n */\nexport const SPECIFICITY_STYLE_IMPORTANT: number = 67108864;\n\n/**\n * Author stylesheet base specificity when !important is used.\n */\nexport const SPECIFICITY_AUTHOR_IMPORTANT: number = 83886080;\n\n/**\n * User stylesheet base specificity when !important is used.\n */\nexport const SPECIFICITY_USER_IMPORTANT: number = 100663296;\n\n/**\n * @enum {string}\n */\nexport enum StylesheetFlavor {\n USER_AGENT = \"UA\",\n USER = \"User\",\n AUTHOR = \"Author\",\n}\n\n/**\n * CSS Color value from hash text (without '#' character).\n */\nexport function colorFromHash(text: string): Css.Color {\n let num = parseInt(text, 16);\n if (isNaN(num)) {\n throw new Error(\"E_CSS_COLOR\");\n }\n if (text.length == 6) {\n return new Css.Color(num);\n }\n if (text.length == 3) {\n num =\n (num & 15) |\n ((num & 15) << 4) |\n ((num & 240) << 4) |\n ((num & 240) << 8) |\n ((num & 3840) << 8) |\n ((num & 3840) << 12);\n return new Css.Color(num);\n }\n throw new Error(\"E_CSS_COLOR\");\n}\n\nexport class ParserHandler implements CssTokenizer.TokenizerHandler {\n flavor: StylesheetFlavor;\n\n constructor(public scope: Exprs.LexicalScope) {\n this.flavor = StylesheetFlavor.AUTHOR;\n }\n\n getCurrentToken(): CssTokenizer.Token {\n return null;\n }\n\n getScope(): Exprs.LexicalScope {\n return this.scope;\n }\n\n error(mnemonics: string, token: CssTokenizer.Token): void {}\n\n startStylesheet(flavor: StylesheetFlavor): void {\n this.flavor = flavor;\n }\n\n tagSelector(ns: string | null, name: string | null): void {}\n\n classSelector(name: string): void {}\n\n pseudoclassSelector(name: string, params: (number | string)[]): void {}\n\n pseudoelementSelector(name: string, params: (number | string)[]): void {}\n\n idSelector(id: string): void {}\n\n attributeSelector(\n ns: string,\n name: string,\n op: CssTokenizer.TokenType,\n value: string | null,\n ): void {}\n\n descendantSelector(): void {}\n\n childSelector(): void {}\n\n adjacentSiblingSelector(): void {}\n\n followingSiblingSelector(): void {}\n\n nextSelector(): void {}\n\n startSelectorRule(): void {}\n\n startFontFaceRule(): void {}\n\n startFootnoteRule(pseudoelem: string | null): void {}\n\n startViewportRule(): void {}\n\n startDefineRule(): void {}\n\n startRegionRule(): void {}\n\n startPageRule(): void {}\n\n startPageMarginBoxRule(name: string): void {}\n\n startWhenRule(expr: Css.Expr): void {}\n\n startMediaRule(expr: Css.Expr): void {\n this.startWhenRule(expr);\n }\n\n startFlowRule(flowName: string): void {}\n\n startPageTemplateRule(): void {}\n\n startPageMasterRule(\n name: string | null,\n pseudoName: string | null,\n classes: string[],\n ): void {}\n\n startPartitionRule(\n name: string | null,\n pseudoName: string | null,\n classes: string[],\n ): void {}\n\n startPartitionGroupRule(\n name: string | null,\n pseudoName: string | null,\n classes: string[],\n ): void {}\n\n startRuleBody(): void {}\n\n property(name: string, value: Css.Val, important: boolean): void {}\n\n endRule(): void {}\n\n /**\n * @param funcName The name of the function taking a selector list as an\n * argument\n */\n startFuncWithSelector(funcName: string): void {}\n\n endFuncWithSelector(): void {}\n\n getImportantSpecificity(): number {\n switch (this.flavor) {\n case StylesheetFlavor.USER_AGENT:\n return SPECIFICITY_USER_AGENT;\n case StylesheetFlavor.USER:\n return SPECIFICITY_USER_IMPORTANT;\n default:\n return SPECIFICITY_AUTHOR_IMPORTANT;\n }\n }\n\n getBaseSpecificity(): number {\n switch (this.flavor) {\n case StylesheetFlavor.USER_AGENT:\n return SPECIFICITY_USER_AGENT;\n case StylesheetFlavor.USER:\n return SPECIFICITY_USER;\n default:\n return SPECIFICITY_AUTHOR;\n }\n }\n}\n\nexport class DispatchParserHandler extends ParserHandler {\n stack: ParserHandler[] = [];\n tokenizer: CssTokenizer.Tokenizer = null;\n slave: ParserHandler = null;\n\n constructor() {\n super(null);\n }\n\n pushHandler(slave: ParserHandler): void {\n this.stack.push(this.slave);\n this.slave = slave;\n }\n\n popHandler(): void {\n this.slave = this.stack.pop();\n }\n\n /**\n * @override\n */\n getCurrentToken(): CssTokenizer.Token {\n if (this.tokenizer) {\n return this.tokenizer.token();\n }\n return null;\n }\n\n /**\n * @override\n */\n getScope(): Exprs.LexicalScope {\n return this.slave.getScope();\n }\n\n /**\n * Forwards call to slave.\n * @override\n */\n error(mnemonics: string, token: CssTokenizer.Token): void {\n this.slave.error(mnemonics, token);\n }\n\n /**\n * Called by a slave.\n */\n errorMsg(mnemonics: string, token: CssTokenizer.Token): void {\n Logging.logger.warn(mnemonics);\n }\n\n /**\n * @override\n */\n startStylesheet(flavor: StylesheetFlavor): void {\n super.startStylesheet(flavor);\n if (this.stack.length > 0) {\n // This can occur as a result of an error\n this.slave = this.stack[0];\n this.stack = [];\n }\n this.slave.startStylesheet(flavor);\n }\n\n /**\n * @override\n */\n tagSelector(ns: string | null, name: string | null): void {\n this.slave.tagSelector(ns, name);\n }\n\n /**\n * @override\n */\n classSelector(name: string): void {\n this.slave.classSelector(name);\n }\n\n /**\n * @override\n */\n pseudoclassSelector(name: string, params: (number | string)[]): void {\n this.slave.pseudoclassSelector(name, params);\n }\n\n /**\n * @override\n */\n pseudoelementSelector(name: string, params: (number | string)[]): void {\n this.slave.pseudoelementSelector(name, params);\n }\n\n /**\n * @override\n */\n idSelector(id: string): void {\n this.slave.idSelector(id);\n }\n\n /**\n * @override\n */\n attributeSelector(\n ns: string,\n name: string,\n op: CssTokenizer.TokenType,\n value: string | null,\n ): void {\n this.slave.attributeSelector(ns, name, op, value);\n }\n\n /**\n * @override\n */\n descendantSelector(): void {\n this.slave.descendantSelector();\n }\n\n /**\n * @override\n */\n childSelector(): void {\n this.slave.childSelector();\n }\n\n /**\n * @override\n */\n adjacentSiblingSelector(): void {\n this.slave.adjacentSiblingSelector();\n }\n\n /**\n * @override\n */\n followingSiblingSelector(): void {\n this.slave.followingSiblingSelector();\n }\n\n /**\n * @override\n */\n nextSelector(): void {\n this.slave.nextSelector();\n }\n\n /**\n * @override\n */\n startSelectorRule(): void {\n this.slave.startSelectorRule();\n }\n\n /**\n * @override\n */\n startFontFaceRule(): void {\n this.slave.startFontFaceRule();\n }\n\n /**\n * @override\n */\n startFootnoteRule(pseudoelem: string | null): void {\n this.slave.startFootnoteRule(pseudoelem);\n }\n\n /**\n * @override\n */\n startViewportRule(): void {\n this.slave.startViewportRule();\n }\n\n /**\n * @override\n */\n startDefineRule(): void {\n this.slave.startDefineRule();\n }\n\n /**\n * @override\n */\n startRegionRule(): void {\n this.slave.startRegionRule();\n }\n\n /**\n * @override\n */\n startPageRule(): void {\n this.slave.startPageRule();\n }\n\n /**\n * @override\n */\n startPageMarginBoxRule(name: string): void {\n this.slave.startPageMarginBoxRule(name);\n }\n\n /**\n * @override\n */\n startWhenRule(expr: Css.Expr): void {\n this.slave.startWhenRule(expr);\n }\n\n /**\n * @override\n */\n startFlowRule(flowName: string): void {\n this.slave.startFlowRule(flowName);\n }\n\n /**\n * @override\n */\n startPageTemplateRule(): void {\n this.slave.startPageTemplateRule();\n }\n\n /**\n * @override\n */\n startPageMasterRule(\n name: string | null,\n pseudoName: string | null,\n classes: string[],\n ): void {\n this.slave.startPageMasterRule(name, pseudoName, classes);\n }\n\n /**\n * @override\n */\n startPartitionRule(\n name: string | null,\n pseudoName: string | null,\n classes: string[],\n ): void {\n this.slave.startPartitionRule(name, pseudoName, classes);\n }\n\n /**\n * @override\n */\n startPartitionGroupRule(\n name: string | null,\n pseudoName: string | null,\n classes: string[],\n ): void {\n this.slave.startPartitionGroupRule(name, pseudoName, classes);\n }\n\n /**\n * @override\n */\n startRuleBody(): void {\n this.slave.startRuleBody();\n }\n\n /**\n * @override\n */\n property(name: string, value: Css.Val, important: boolean): void {\n this.slave.property(name, value, important);\n }\n\n /**\n * @override\n */\n endRule(): void {\n this.slave.endRule();\n }\n\n /**\n * @override\n */\n startFuncWithSelector(funcName: string): void {\n this.slave.startFuncWithSelector(funcName);\n }\n\n /**\n * @override\n */\n endFuncWithSelector(): void {\n this.slave.endFuncWithSelector();\n }\n}\n\nexport class SkippingParserHandler extends ParserHandler {\n depth: number = 0;\n flavor: StylesheetFlavor;\n\n constructor(\n scope: Exprs.LexicalScope,\n public owner: DispatchParserHandler,\n public readonly topLevel,\n ) {\n super(scope);\n if (owner) {\n this.flavor = owner.flavor;\n }\n }\n\n /**\n * @override\n */\n getCurrentToken(): CssTokenizer.Token {\n return this.owner.getCurrentToken();\n }\n\n /**\n * @override\n */\n error(mnemonics: string, token: CssTokenizer.Token): void {\n this.owner.errorMsg(mnemonics, token);\n }\n\n /**\n * @override\n */\n startRuleBody(): void {\n this.depth++;\n }\n\n /**\n * @override\n */\n endRule(): void {\n if (--this.depth == 0 && !this.topLevel) {\n this.owner.popHandler();\n }\n }\n}\n\nexport class SlaveParserHandler extends SkippingParserHandler {\n constructor(\n scope: Exprs.LexicalScope,\n owner: DispatchParserHandler,\n topLevel: boolean,\n ) {\n super(scope, owner, topLevel);\n }\n\n report(message: string): void {\n this.error(message, this.getCurrentToken());\n }\n\n reportAndSkip(message: string): void {\n this.report(message);\n this.owner.pushHandler(\n new SkippingParserHandler(this.scope, this.owner, false),\n );\n }\n\n /**\n * @override\n */\n startSelectorRule(): void {\n this.reportAndSkip(\"E_CSS_UNEXPECTED_SELECTOR\");\n }\n\n /**\n * @override\n */\n startFontFaceRule(): void {\n this.reportAndSkip(\"E_CSS_UNEXPECTED_FONT_FACE\");\n }\n\n /**\n * @override\n */\n startFootnoteRule(pseudoelem: string | null): void {\n this.reportAndSkip(\"E_CSS_UNEXPECTED_FOOTNOTE\");\n }\n\n /**\n * @override\n */\n startViewportRule(): void {\n this.reportAndSkip(\"E_CSS_UNEXPECTED_VIEWPORT\");\n }\n\n /**\n * @override\n */\n startDefineRule(): void {\n this.reportAndSkip(\"E_CSS_UNEXPECTED_DEFINE\");\n }\n\n /**\n * @override\n */\n startRegionRule(): void {\n this.reportAndSkip(\"E_CSS_UNEXPECTED_REGION\");\n }\n\n /**\n * @override\n */\n startPageRule(): void {\n this.reportAndSkip(\"E_CSS_UNEXPECTED_PAGE\");\n }\n\n /**\n * @override\n */\n startWhenRule(expr: Css.Expr): void {\n this.reportAndSkip(\"E_CSS_UNEXPECTED_WHEN\");\n }\n\n /**\n * @override\n */\n startFlowRule(flowName: string): void {\n this.reportAndSkip(\"E_CSS_UNEXPECTED_FLOW\");\n }\n\n /**\n * @override\n */\n startPageTemplateRule(): void {\n this.reportAndSkip(\"E_CSS_UNEXPECTED_PAGE_TEMPLATE\");\n }\n\n /**\n * @override\n */\n startPageMasterRule(\n name: string | null,\n pseudoName: string | null,\n classes: string[],\n ): void {\n this.reportAndSkip(\"E_CSS_UNEXPECTED_PAGE_MASTER\");\n }\n\n /**\n * @override\n */\n startPartitionRule(\n name: string | null,\n pseudoName: string | null,\n classes: string[],\n ): void {\n this.reportAndSkip(\"E_CSS_UNEXPECTED_PARTITION\");\n }\n\n /**\n * @override\n */\n startPartitionGroupRule(\n name: string | null,\n pseudoName: string | null,\n classes: string[],\n ): void {\n this.reportAndSkip(\"E_CSS_UNEXPECTED_PARTITION_GROUP\");\n }\n\n /**\n * @override\n */\n startFuncWithSelector(funcName: string): void {\n this.reportAndSkip(\"E_CSS_UNEXPECTED_SELECTOR_FUNC\");\n }\n\n /**\n * @override\n */\n endFuncWithSelector(): void {\n this.reportAndSkip(\"E_CSS_UNEXPECTED_END_SELECTOR_FUNC\");\n }\n\n /**\n * @override\n */\n property(name: string, value: Css.Val, important: boolean): void {\n this.error(\"E_CSS_UNEXPECTED_PROPERTY\", this.getCurrentToken());\n }\n}\n\nexport const actionsBase: Action[] = [];\n\nexport const actionsStyleAttribute: Action[] = [];\n\nexport const actionsSelector: Action[] = [];\n\nexport const actionsSelectorInFunc: Action[] = [];\n\nexport const actionsSelectorCont: Action[] = [];\n\nexport const actionsSelectorStart: Action[] = [];\n\nexport const actionsPropVal: Action[] = [];\n\nexport const actionsExprVal: Action[] = [];\n\nexport const actionsExprOp: Action[] = [];\n\nexport const actionsError: Action[] = [];\n\nexport const actionsErrorDecl: Action[] = [];\n\nexport const actionsErrorSelector: Action[] = [];\n\nexport const priority: number[] = [];\n\n/**\n * @enum {number}\n */\nexport enum Action {\n SELECTOR_NAME_1 = 1,\n SELECTOR_NAME,\n SELECTOR_ANY_1,\n SELECTOR_ANY,\n SELECTOR_ID_1,\n SELECTOR_ID,\n SELECTOR_CLASS_1,\n SELECTOR_CLASS,\n SELECTOR_ATTR_1,\n SELECTOR_ATTR,\n SELECTOR_CHILD,\n SELECTOR_SIBLING,\n SELECTOR_BODY,\n SELECTOR_PSEUDOCLASS,\n VAL_IDENT,\n VAL_HASH,\n VAL_NUM,\n VAL_INT,\n VAL_NUMERIC,\n VAL_STR,\n VAL_URL,\n VAL_COMMA,\n VAL_SLASH,\n VAL_FUNC,\n VAL_C_PAR,\n VAL_END,\n RULE_END,\n IDENT,\n SELECTOR_START,\n AT,\n EXPR_IDENT,\n EXPR_NUM,\n EXPR_NUMERIC,\n EXPR_STR,\n EXPR_PARAM,\n EXPR_PREFIX,\n EXPR_INFIX,\n EXPR_FUNC,\n EXPR_C_PAR,\n EXPR_O_PAR,\n SELECTOR_NEXT,\n SELECTOR_PSEUDOELEM,\n EXPR_O_BRC,\n VAL_FINISH,\n EXPR_INFIX_NAME,\n PROP,\n VAL_BANG,\n VAL_BRC,\n EXPR_SEMICOL,\n ERROR_PUSH,\n ERROR_POP,\n ERROR_POP_DECL,\n ERROR_SEMICOL,\n VAL_PLUS,\n SELECTOR_PSEUDOCLASS_1,\n SELECTOR_FOLLOWING_SIBLING,\n DONE = 200,\n}\n\nexport const OP_MEDIA_AND: number = CssTokenizer.TokenType.LAST + 1;\n\n(() => {\n actionsBase[CssTokenizer.TokenType.IDENT] = Action.IDENT;\n actionsBase[CssTokenizer.TokenType.STAR] = Action.SELECTOR_START;\n actionsBase[CssTokenizer.TokenType.HASH] = Action.SELECTOR_START;\n actionsBase[CssTokenizer.TokenType.CLASS] = Action.SELECTOR_START;\n actionsBase[CssTokenizer.TokenType.O_BRK] = Action.SELECTOR_START;\n actionsBase[CssTokenizer.TokenType.COLON] = Action.SELECTOR_START;\n actionsBase[CssTokenizer.TokenType.AT] = Action.AT;\n actionsBase[CssTokenizer.TokenType.C_BRC] = Action.RULE_END;\n actionsBase[CssTokenizer.TokenType.EOF] = Action.DONE;\n actionsStyleAttribute[CssTokenizer.TokenType.IDENT] = Action.PROP;\n actionsStyleAttribute[CssTokenizer.TokenType.EOF] = Action.DONE;\n actionsSelectorStart[CssTokenizer.TokenType.IDENT] = Action.SELECTOR_NAME;\n actionsSelectorStart[CssTokenizer.TokenType.STAR] = Action.SELECTOR_ANY;\n actionsSelectorStart[CssTokenizer.TokenType.HASH] = Action.SELECTOR_ID;\n actionsSelectorStart[CssTokenizer.TokenType.CLASS] = Action.SELECTOR_CLASS;\n actionsSelectorStart[CssTokenizer.TokenType.O_BRK] = Action.SELECTOR_ATTR;\n actionsSelectorStart[CssTokenizer.TokenType.COLON] =\n Action.SELECTOR_PSEUDOCLASS;\n\n actionsSelector[CssTokenizer.TokenType.GT] = Action.SELECTOR_CHILD;\n actionsSelector[CssTokenizer.TokenType.PLUS] = Action.SELECTOR_SIBLING;\n actionsSelector[CssTokenizer.TokenType.TILDE] =\n Action.SELECTOR_FOLLOWING_SIBLING;\n actionsSelector[CssTokenizer.TokenType.IDENT] = Action.SELECTOR_NAME_1;\n actionsSelector[CssTokenizer.TokenType.STAR] = Action.SELECTOR_ANY_1;\n actionsSelector[CssTokenizer.TokenType.HASH] = Action.SELECTOR_ID_1;\n actionsSelector[CssTokenizer.TokenType.CLASS] = Action.SELECTOR_CLASS_1;\n actionsSelector[CssTokenizer.TokenType.O_BRK] = Action.SELECTOR_ATTR_1;\n actionsSelector[CssTokenizer.TokenType.O_BRC] = Action.SELECTOR_BODY;\n actionsSelector[CssTokenizer.TokenType.COLON] = Action.SELECTOR_PSEUDOCLASS_1;\n actionsSelector[CssTokenizer.TokenType.COL_COL] = Action.SELECTOR_PSEUDOELEM;\n actionsSelector[CssTokenizer.TokenType.COMMA] = Action.SELECTOR_NEXT;\n actionsSelectorInFunc[CssTokenizer.TokenType.IDENT] = Action.SELECTOR_NAME_1;\n actionsSelectorInFunc[CssTokenizer.TokenType.STAR] = Action.SELECTOR_ANY_1;\n actionsSelectorInFunc[CssTokenizer.TokenType.HASH] = Action.SELECTOR_ID_1;\n actionsSelectorInFunc[CssTokenizer.TokenType.CLASS] = Action.SELECTOR_CLASS_1;\n actionsSelectorInFunc[CssTokenizer.TokenType.O_BRK] = Action.SELECTOR_ATTR_1;\n actionsSelectorInFunc[CssTokenizer.TokenType.C_PAR] = Action.DONE;\n actionsSelectorInFunc[CssTokenizer.TokenType.COLON] =\n Action.SELECTOR_PSEUDOCLASS_1;\n actionsSelectorCont[CssTokenizer.TokenType.IDENT] = Action.SELECTOR_NAME;\n actionsSelectorCont[CssTokenizer.TokenType.STAR] = Action.SELECTOR_ANY;\n actionsSelectorCont[CssTokenizer.TokenType.HASH] = Action.SELECTOR_ID;\n actionsSelectorCont[CssTokenizer.TokenType.CLASS] = Action.SELECTOR_CLASS;\n actionsSelectorCont[CssTokenizer.TokenType.COLON] =\n Action.SELECTOR_PSEUDOCLASS;\n actionsSelectorCont[CssTokenizer.TokenType.COL_COL] =\n Action.SELECTOR_PSEUDOELEM;\n actionsSelectorCont[CssTokenizer.TokenType.O_BRK] = Action.SELECTOR_ATTR;\n actionsSelectorCont[CssTokenizer.TokenType.O_BRC] = Action.SELECTOR_BODY;\n actionsPropVal[CssTokenizer.TokenType.IDENT] = Action.VAL_IDENT;\n actionsPropVal[CssTokenizer.TokenType.HASH] = Action.VAL_HASH;\n actionsPropVal[CssTokenizer.TokenType.NUM] = Action.VAL_NUM;\n actionsPropVal[CssTokenizer.TokenType.INT] = Action.VAL_INT;\n actionsPropVal[CssTokenizer.TokenType.NUMERIC] = Action.VAL_NUMERIC;\n actionsPropVal[CssTokenizer.TokenType.STR] = Action.VAL_STR;\n actionsPropVal[CssTokenizer.TokenType.URL] = Action.VAL_URL;\n actionsPropVal[CssTokenizer.TokenType.COMMA] = Action.VAL_COMMA;\n actionsPropVal[CssTokenizer.TokenType.SLASH] = Action.VAL_SLASH;\n actionsPropVal[CssTokenizer.TokenType.FUNC] = Action.VAL_FUNC;\n actionsPropVal[CssTokenizer.TokenType.C_PAR] = Action.VAL_C_PAR;\n actionsPropVal[CssTokenizer.TokenType.SEMICOL] = Action.VAL_END;\n actionsPropVal[CssTokenizer.TokenType.C_BRC] = Action.VAL_BRC;\n actionsPropVal[CssTokenizer.TokenType.BANG] = Action.VAL_BANG;\n actionsPropVal[CssTokenizer.TokenType.PLUS] = Action.VAL_PLUS;\n actionsPropVal[CssTokenizer.TokenType.EOF] = Action.VAL_FINISH;\n actionsExprVal[CssTokenizer.TokenType.IDENT] = Action.EXPR_IDENT;\n actionsExprVal[CssTokenizer.TokenType.NUM] = Action.EXPR_NUM;\n actionsExprVal[CssTokenizer.TokenType.INT] = Action.EXPR_NUM;\n actionsExprVal[CssTokenizer.TokenType.NUMERIC] = Action.EXPR_NUMERIC;\n actionsExprVal[CssTokenizer.TokenType.STR] = Action.EXPR_STR;\n actionsExprVal[CssTokenizer.TokenType.O_PAR] = Action.EXPR_O_PAR;\n actionsExprVal[CssTokenizer.TokenType.FUNC] = Action.EXPR_FUNC;\n actionsExprVal[CssTokenizer.TokenType.BANG] = Action.EXPR_PREFIX;\n actionsExprVal[CssTokenizer.TokenType.MINUS] = Action.EXPR_PREFIX;\n actionsExprVal[CssTokenizer.TokenType.DOLLAR] = Action.EXPR_PARAM;\n actionsExprOp[CssTokenizer.TokenType.IDENT] = Action.EXPR_INFIX_NAME;\n actionsExprOp[CssTokenizer.TokenType.COMMA] = Action.EXPR_INFIX;\n actionsExprOp[CssTokenizer.TokenType.GT] = Action.EXPR_INFIX;\n actionsExprOp[CssTokenizer.TokenType.LT] = Action.EXPR_INFIX;\n actionsExprOp[CssTokenizer.TokenType.GT_EQ] = Action.EXPR_INFIX;\n actionsExprOp[CssTokenizer.TokenType.LT_EQ] = Action.EXPR_INFIX;\n actionsExprOp[CssTokenizer.TokenType.EQ] = Action.EXPR_INFIX;\n actionsExprOp[CssTokenizer.TokenType.EQ_EQ] = Action.EXPR_INFIX;\n actionsExprOp[CssTokenizer.TokenType.BANG_EQ] = Action.EXPR_INFIX;\n actionsExprOp[CssTokenizer.TokenType.AMP_AMP] = Action.EXPR_INFIX;\n actionsExprOp[CssTokenizer.TokenType.BAR_BAR] = Action.EXPR_INFIX;\n actionsExprOp[CssTokenizer.TokenType.PLUS] = Action.EXPR_INFIX;\n actionsExprOp[CssTokenizer.TokenType.MINUS] = Action.EXPR_INFIX;\n actionsExprOp[CssTokenizer.TokenType.SLASH] = Action.EXPR_INFIX;\n actionsExprOp[CssTokenizer.TokenType.PERCENT] = Action.EXPR_INFIX;\n actionsExprOp[CssTokenizer.TokenType.STAR] = Action.EXPR_INFIX;\n actionsExprOp[CssTokenizer.TokenType.COLON] = Action.EXPR_INFIX;\n actionsExprOp[CssTokenizer.TokenType.QMARK] = Action.EXPR_INFIX;\n actionsExprOp[CssTokenizer.TokenType.C_PAR] = Action.EXPR_C_PAR;\n actionsExprOp[CssTokenizer.TokenType.O_BRC] = Action.EXPR_O_BRC;\n actionsExprOp[CssTokenizer.TokenType.SEMICOL] = Action.EXPR_SEMICOL;\n actionsError[CssTokenizer.TokenType.EOF] = Action.DONE;\n actionsError[CssTokenizer.TokenType.O_BRC] = Action.ERROR_PUSH;\n actionsError[CssTokenizer.TokenType.C_BRC] = Action.ERROR_POP;\n actionsError[CssTokenizer.TokenType.O_BRK] = Action.ERROR_PUSH;\n actionsError[CssTokenizer.TokenType.C_BRK] = Action.ERROR_POP;\n actionsError[CssTokenizer.TokenType.O_PAR] = Action.ERROR_PUSH;\n actionsError[CssTokenizer.TokenType.C_PAR] = Action.ERROR_POP;\n actionsError[CssTokenizer.TokenType.SEMICOL] = Action.ERROR_SEMICOL;\n actionsErrorDecl[CssTokenizer.TokenType.EOF] = Action.DONE;\n actionsErrorDecl[CssTokenizer.TokenType.O_BRC] = Action.ERROR_PUSH;\n actionsErrorDecl[CssTokenizer.TokenType.C_BRC] = Action.ERROR_POP_DECL;\n actionsErrorDecl[CssTokenizer.TokenType.O_BRK] = Action.ERROR_PUSH;\n actionsErrorDecl[CssTokenizer.TokenType.C_BRK] = Action.ERROR_POP;\n actionsErrorDecl[CssTokenizer.TokenType.O_PAR] = Action.ERROR_PUSH;\n actionsErrorDecl[CssTokenizer.TokenType.C_PAR] = Action.ERROR_POP;\n actionsErrorDecl[CssTokenizer.TokenType.SEMICOL] = Action.ERROR_SEMICOL;\n actionsErrorSelector[CssTokenizer.TokenType.EOF] = Action.DONE;\n actionsErrorSelector[CssTokenizer.TokenType.O_BRC] = Action.ERROR_PUSH;\n actionsErrorSelector[CssTokenizer.TokenType.C_BRC] = Action.ERROR_POP;\n actionsErrorSelector[CssTokenizer.TokenType.O_BRK] = Action.ERROR_PUSH;\n actionsErrorSelector[CssTokenizer.TokenType.C_BRK] = Action.ERROR_POP;\n actionsErrorSelector[CssTokenizer.TokenType.O_PAR] = Action.ERROR_PUSH;\n actionsErrorSelector[CssTokenizer.TokenType.C_PAR] = Action.ERROR_POP;\n priority[CssTokenizer.TokenType.C_PAR] = 0;\n priority[CssTokenizer.TokenType.COMMA] = 0;\n priority[CssTokenizer.TokenType.QMARK] = 1;\n priority[CssTokenizer.TokenType.COLON] = 1;\n priority[CssTokenizer.TokenType.AMP_AMP] = 2;\n priority[CssTokenizer.TokenType.BAR_BAR] = 2;\n priority[CssTokenizer.TokenType.LT] = 3;\n priority[CssTokenizer.TokenType.GT] = 3;\n priority[CssTokenizer.TokenType.LT_EQ] = 3;\n priority[CssTokenizer.TokenType.GT_EQ] = 3;\n priority[CssTokenizer.TokenType.EQ] = 3;\n priority[CssTokenizer.TokenType.EQ_EQ] = 3;\n priority[CssTokenizer.TokenType.BANG_EQ] = 3;\n priority[CssTokenizer.TokenType.PLUS] = 4;\n priority[CssTokenizer.TokenType.MINUS] = 4;\n priority[CssTokenizer.TokenType.STAR] = 5;\n priority[CssTokenizer.TokenType.SLASH] = 5;\n priority[CssTokenizer.TokenType.PERCENT] = 5;\n priority[CssTokenizer.TokenType.EOF] = 6;\n priority[OP_MEDIA_AND] = 2;\n})();\n\n/**\n * @enum {number}\n */\nexport enum ExprContext {\n PROP,\n WHEN,\n MEDIA,\n IMPORT,\n}\n\nexport class Parser {\n valStack: any[] = [];\n namespacePrefixToURI: { [key: string]: string } = {};\n defaultNamespaceURI: string | null = null;\n propName: string | null = null;\n propImportant: boolean = false;\n exprContext: ExprContext;\n result: Css.Val = null;\n importReady: boolean = false;\n importURL: string | null = null;\n importCondition: Css.Expr = null;\n errorBrackets: number[] = [];\n ruleStack: string[] = [];\n regionRule: boolean = false;\n pageRule: boolean = false;\n\n constructor(\n public actions: Action[],\n public tokenizer: CssTokenizer.Tokenizer,\n public readonly handler: ParserHandler,\n public baseURL: string,\n ) {\n this.exprContext = ExprContext.MEDIA;\n }\n\n extractVals(sep: string, index: number): Css.Val[] {\n const arr: Css.Val[] = [];\n const valStack = this.valStack;\n while (index < valStack.length) {\n arr.push(valStack[index++] as Css.Val);\n if (index == valStack.length) {\n break;\n }\n if (valStack[index++] != sep) {\n throw new Error(\"Unexpected state\");\n }\n }\n return arr;\n }\n\n valStackReduce(sep: string, token: CssTokenizer.Token): Css.Val {\n const valStack = this.valStack;\n let index = valStack.length;\n let v;\n do {\n v = valStack[--index];\n } while (typeof v != \"undefined\" && typeof v != \"string\");\n let count = valStack.length - (index + 1);\n if (count > 1) {\n valStack.splice(\n index + 1,\n count,\n new Css.SpaceList(valStack.slice(index + 1, valStack.length)),\n );\n }\n if (sep == \",\") {\n return null;\n }\n index++;\n do {\n v = valStack[--index];\n } while (typeof v != \"undefined\" && (typeof v != \"string\" || v == \",\"));\n count = valStack.length - (index + 1);\n if (v == \"(\") {\n if (sep != \")\") {\n this.handler.error(\"E_CSS_MISMATCHED_C_PAR\", token);\n this.actions = actionsErrorDecl;\n return null;\n }\n const func = new Css.Func(\n valStack[index - 1] as string,\n this.extractVals(\",\", index + 1),\n );\n valStack.splice(index - 1, count + 2, func);\n return null;\n }\n if (sep != \";\" || index >= 0) {\n this.handler.error(\"E_CSS_UNEXPECTED_VAL_END\", token);\n this.actions = actionsErrorDecl;\n return null;\n }\n if (count > 1) {\n return new Css.CommaList(this.extractVals(\",\", index + 1));\n }\n return valStack[0] as Css.Val;\n }\n\n exprError(mnemonics: string, token: CssTokenizer.Token) {\n this.actions = this.propName ? actionsErrorDecl : actionsError;\n this.handler.error(mnemonics, token);\n }\n\n exprStackReduce(op: number, token: CssTokenizer.Token): boolean {\n const valStack = this.valStack;\n const handler = this.handler;\n let val = valStack.pop() as Exprs.Val;\n let val2: Exprs.Val;\n while (true) {\n let tok = valStack.pop();\n if (op == CssTokenizer.TokenType.C_PAR) {\n const args: Exprs.Val[] = [val];\n while (tok == CssTokenizer.TokenType.COMMA) {\n args.unshift(valStack.pop());\n tok = valStack.pop();\n }\n if (typeof tok == \"string\") {\n if (tok == \"{\") {\n // reached CSS portion of the stack\n while (args.length >= 2) {\n const e1 = args.shift();\n const e2 = args.shift();\n const er = new Exprs.OrMedia(handler.getScope(), e1, e2);\n args.unshift(er);\n }\n valStack.push(new Css.Expr(args[0]));\n return true;\n } else if (tok == \"(\") {\n // call\n const name2 = valStack.pop() as string;\n const name1 = valStack.pop() as string | null;\n val = new Exprs.Call(\n handler.getScope(),\n Exprs.makeQualifiedName(name1, name2),\n args,\n );\n op = CssTokenizer.TokenType.EOF;\n continue;\n }\n }\n if (tok == CssTokenizer.TokenType.O_PAR) {\n if (val.isMediaName()) {\n val = new Exprs.MediaTest(\n handler.getScope(),\n val as Exprs.MediaName,\n null,\n );\n }\n op = CssTokenizer.TokenType.EOF;\n continue;\n }\n } else {\n if (typeof tok == \"string\") {\n // reached CSS portion of the stack or a call\n valStack.push(tok);\n break;\n }\n }\n if ((tok as number) < 0) {\n // prefix\n if (tok == -CssTokenizer.TokenType.BANG) {\n val = new Exprs.Not(handler.getScope(), val);\n } else if (tok == -CssTokenizer.TokenType.MINUS) {\n val = new Exprs.Negate(handler.getScope(), val);\n } else {\n this.exprError(\"F_UNEXPECTED_STATE\", token);\n return false;\n }\n } else {\n // infix\n if (priority[op] > priority[tok as number]) {\n valStack.push(tok);\n break;\n }\n val2 = valStack.pop() as Exprs.Val;\n switch (tok) {\n case CssTokenizer.TokenType.AMP_AMP:\n val = new Exprs.And(handler.getScope(), val2, val);\n break;\n case OP_MEDIA_AND:\n val = new Exprs.AndMedia(handler.getScope(), val2, val);\n break;\n case CssTokenizer.TokenType.BAR_BAR:\n val = new Exprs.Or(handler.getScope(), val2, val);\n break;\n case CssTokenizer.TokenType.LT:\n val = new Exprs.Lt(handler.getScope(), val2, val);\n break;\n case CssTokenizer.TokenType.GT:\n val = new Exprs.Gt(handler.getScope(), val2, val);\n break;\n case CssTokenizer.TokenType.LT_EQ:\n val = new Exprs.Le(handler.getScope(), val2, val);\n break;\n case CssTokenizer.TokenType.GT_EQ:\n val = new Exprs.Ge(handler.getScope(), val2, val);\n break;\n case CssTokenizer.TokenType.EQ:\n case CssTokenizer.TokenType.EQ_EQ:\n val = new Exprs.Eq(handler.getScope(), val2, val);\n break;\n case CssTokenizer.TokenType.BANG_EQ:\n val = new Exprs.Ne(handler.getScope(), val2, val);\n break;\n case CssTokenizer.TokenType.PLUS:\n val = new Exprs.Add(handler.getScope(), val2, val);\n break;\n case CssTokenizer.TokenType.MINUS:\n val = new Exprs.Subtract(handler.getScope(), val2, val);\n break;\n case CssTokenizer.TokenType.STAR:\n val = new Exprs.Multiply(handler.getScope(), val2, val);\n break;\n case CssTokenizer.TokenType.SLASH:\n val = new Exprs.Divide(handler.getScope(), val2, val);\n break;\n case CssTokenizer.TokenType.PERCENT:\n val = new Exprs.Modulo(handler.getScope(), val2, val);\n break;\n case CssTokenizer.TokenType.COLON:\n if (valStack.length > 1) {\n switch (valStack[valStack.length - 1]) {\n case CssTokenizer.TokenType.QMARK:\n valStack.pop();\n val = new Exprs.Cond(\n handler.getScope(),\n valStack.pop() as Exprs.Val,\n val2,\n val,\n );\n break;\n case CssTokenizer.TokenType.O_PAR:\n if (val2.isMediaName()) {\n val = new Exprs.MediaTest(\n handler.getScope(),\n val2 as Exprs.MediaName,\n val,\n );\n } else {\n this.exprError(\"E_CSS_MEDIA_TEST\", token);\n return false;\n }\n break;\n }\n } else {\n this.exprError(\"E_CSS_EXPR_COND\", token);\n return false;\n }\n break;\n case CssTokenizer.TokenType.QMARK:\n if (op != CssTokenizer.TokenType.COLON) {\n this.exprError(\"E_CSS_EXPR_COND\", token);\n return false;\n }\n\n // fall through\n case CssTokenizer.TokenType.O_PAR:\n // don't reduce\n valStack.push(val2);\n valStack.push(tok);\n valStack.push(val);\n return false;\n default:\n this.exprError(\"F_UNEXPECTED_STATE\", token);\n return false;\n }\n }\n }\n valStack.push(val);\n return false;\n }\n\n readPseudoParams(): (number | string)[] {\n const arr = [];\n while (true) {\n const token = this.tokenizer.token();\n switch (token.type) {\n case CssTokenizer.TokenType.IDENT:\n arr.push(token.text);\n break;\n case CssTokenizer.TokenType.PLUS:\n arr.push(\"+\");\n break;\n case CssTokenizer.TokenType.NUM:\n case CssTokenizer.TokenType.INT:\n arr.push(token.num);\n break;\n default:\n return arr;\n }\n this.tokenizer.consume();\n }\n }\n\n /**\n * Read `an+b` argument of pseudoclasses. Roughly based on the algorithm at\n * https://drafts.csswg.org/css-syntax/#the-anb-type\n */\n private readNthPseudoParams(): number[] | null {\n let hasLeadingPlus = false;\n let token = this.tokenizer.token();\n if (token.type === CssTokenizer.TokenType.PLUS) {\n // '+'\n hasLeadingPlus = true;\n this.tokenizer.consume();\n token = this.tokenizer.token();\n } else if (\n token.type === CssTokenizer.TokenType.IDENT &&\n (token.text === \"even\" || token.text === \"odd\")\n ) {\n // 'even' or 'odd'\n this.tokenizer.consume();\n return [2, token.text === \"odd\" ? 1 : 0];\n }\n switch (token.type) {\n case CssTokenizer.TokenType.NUMERIC:\n if (hasLeadingPlus && token.num < 0) {\n // reject '+-an'\n return null;\n }\n\n // FALLTHROUGH\n case CssTokenizer.TokenType.IDENT:\n if (hasLeadingPlus && token.text.charAt(0) === \"-\") {\n // reject '+-n'\n return null;\n }\n if (token.text === \"n\" || token.text === \"-n\") {\n // 'an', 'an +b', 'an -b', 'n', 'n +b', 'n -b', '-n', '-n +b' '-n -b'\n if (hasLeadingPlus && token.precededBySpace) {\n // reject '+ an'\n return null;\n }\n let a = token.text === \"-n\" ? -1 : 1;\n if (token.type === CssTokenizer.TokenType.NUMERIC) {\n a = token.num;\n }\n let b = 0;\n this.tokenizer.consume();\n token = this.tokenizer.token();\n const hasMinusSign = token.type === CssTokenizer.TokenType.MINUS;\n const hasSign =\n token.type === CssTokenizer.TokenType.PLUS || hasMinusSign;\n if (hasSign) {\n // 'an +b', 'an - b'\n this.tokenizer.consume();\n token = this.tokenizer.token();\n }\n if (token.type === CssTokenizer.TokenType.INT) {\n b = token.num;\n\n if (1 / b === 1 / -0) {\n // negative zero: 'an -0'\n b = 0;\n if (hasSign) {\n return null; // reject 'an + -0', 'an - -0'\n }\n } else if (b < 0) {\n // negative: 'an -b'\n if (hasSign) {\n return null; // reject 'an + -b', 'an - -b'\n }\n } else if (b >= 0) {\n // positive or positive zero: 'an +b'\n if (!hasSign) {\n return null;\n }\n }\n this.tokenizer.consume();\n } else if (hasSign) {\n // reject 'an + (non-integer)'\n return null;\n }\n return [a, hasMinusSign && b > 0 ? -b : b];\n } else if (token.text === \"n-\" || token.text === \"-n-\") {\n // 'an- b', '-n- b'\n if (hasLeadingPlus && token.precededBySpace) {\n // reject '+ an- b'\n return null;\n }\n let a = token.text === \"-n-\" ? -1 : 1;\n if (token.type === CssTokenizer.TokenType.NUMERIC) {\n a = token.num;\n }\n this.tokenizer.consume();\n token = this.tokenizer.token();\n if (token.type === CssTokenizer.TokenType.INT) {\n if (token.num < 0 || 1 / token.num === 1 / -0) {\n // reject 'an- -b', 'an- -0'\n return null;\n } else {\n this.tokenizer.consume();\n return [a, token.num];\n }\n }\n } else {\n let r = token.text.match(/^n(-[0-9]+)$/);\n if (r) {\n // 'n-b', 'an-b'\n if (hasLeadingPlus && token.precededBySpace) {\n // reject '+ an-b'\n return null;\n }\n this.tokenizer.consume();\n return [\n token.type === CssTokenizer.TokenType.NUMERIC ? token.num : 1,\n parseInt(r[1], 10),\n ];\n }\n r = token.text.match(/^-n(-[0-9]+)$/);\n\n // '-n-b'\n if (r) {\n this.tokenizer.consume();\n return [-1, parseInt(r[1], 10)];\n }\n }\n return null;\n case CssTokenizer.TokenType.INT:\n if (hasLeadingPlus && (token.precededBySpace || token.num < 0)) {\n return null;\n }\n this.tokenizer.consume();\n return [0, token.num];\n }\n return null;\n }\n\n makeCondition(classes: string | null, condition: Exprs.Val): Css.Expr {\n const scope = this.handler.getScope();\n if (!scope) {\n return null;\n }\n condition = condition || scope._true;\n if (classes) {\n const classList = classes.split(/\\s+/);\n for (const className of classList) {\n switch (className) {\n case \"vertical\":\n condition = Exprs.and(\n scope,\n condition,\n new Exprs.Not(scope, new Exprs.Named(scope, \"pref-horizontal\")),\n );\n break;\n case \"horizontal\":\n condition = Exprs.and(\n scope,\n condition,\n new Exprs.Named(scope, \"pref-horizontal\"),\n );\n break;\n case \"day\":\n condition = Exprs.and(\n scope,\n condition,\n new Exprs.Not(scope, new Exprs.Named(scope, \"pref-night-mode\")),\n );\n break;\n case \"night\":\n condition = Exprs.and(\n scope,\n condition,\n new Exprs.Named(scope, \"pref-night-mode\"),\n );\n break;\n default:\n condition = scope._false;\n }\n }\n }\n if (condition === scope._true) {\n return null;\n }\n return new Css.Expr(condition);\n }\n\n isInsidePropertyOnlyRule(): boolean {\n switch (this.ruleStack[this.ruleStack.length - 1]) {\n case \"[selector]\":\n case \"font-face\":\n case \"-epubx-flow\":\n case \"-epubx-viewport\":\n case \"-epubx-define\":\n case \"-adapt-footnote-area\":\n return true;\n }\n return false;\n }\n\n runParser(\n count: number,\n parsingValue,\n parsingStyleAttr: boolean,\n parsingMediaQuery,\n parsingFunctionParam,\n ): boolean {\n const handler = this.handler;\n const tokenizer = this.tokenizer;\n const valStack = this.valStack;\n let token: CssTokenizer.Token;\n let token1: CssTokenizer.Token;\n let ns: string | null;\n let text: string | null;\n let num: number;\n let val: Css.Val;\n let params: (number | string)[];\n if (parsingMediaQuery) {\n this.exprContext = ExprContext.MEDIA;\n this.valStack.push(\"{\");\n }\n parserLoop: for (; count > 0; --count) {\n token = tokenizer.token();\n switch (this.actions[token.type]) {\n case Action.IDENT:\n // figure out if this is a property assignment or selector\n if (tokenizer.nthToken(1).type != CssTokenizer.TokenType.COLON) {\n // cannot be property assignment\n if (this.isInsidePropertyOnlyRule()) {\n handler.error(\"E_CSS_COLON_EXPECTED\", tokenizer.nthToken(1));\n this.actions = actionsErrorDecl;\n } else {\n this.actions = actionsSelectorStart;\n handler.startSelectorRule();\n }\n continue;\n }\n token1 = tokenizer.nthToken(2);\n if (\n token1.precededBySpace ||\n (token1.type != CssTokenizer.TokenType.IDENT &&\n token1.type != CssTokenizer.TokenType.FUNC)\n ) {\n // cannot be a selector\n } else {\n // can be either a selector or a property assignment\n tokenizer.mark();\n }\n this.propName = token.text;\n this.propImportant = false;\n tokenizer.consume();\n tokenizer.consume();\n this.actions = actionsPropVal;\n valStack.splice(0, valStack.length);\n continue;\n case Action.PROP:\n // figure out if this is a property assignment or selector\n if (tokenizer.nthToken(1).type != CssTokenizer.TokenType.COLON) {\n // cannot be property assignment\n this.actions = actionsErrorDecl;\n handler.error(\"E_CSS_COLON_EXPECTED\", tokenizer.nthToken(1));\n continue;\n }\n this.propName = token.text;\n this.propImportant = false;\n tokenizer.consume();\n tokenizer.consume();\n this.actions = actionsPropVal;\n valStack.splice(0, valStack.length);\n continue;\n case Action.SELECTOR_START:\n // don't consume, process again\n this.actions = actionsSelectorStart;\n handler.startSelectorRule();\n continue;\n case Action.SELECTOR_NAME_1:\n if (!token.precededBySpace) {\n this.actions = actionsErrorSelector;\n handler.error(\"E_CSS_SPACE_EXPECTED\", token);\n continue;\n }\n handler.descendantSelector();\n\n // fall through\n case Action.SELECTOR_NAME:\n if (tokenizer.nthToken(1).type == CssTokenizer.TokenType.BAR) {\n tokenizer.consume();\n tokenizer.consume();\n ns = this.namespacePrefixToURI[token.text];\n if (ns != null) {\n token = tokenizer.token();\n switch (token.type) {\n case CssTokenizer.TokenType.IDENT:\n handler.tagSelector(ns, token.text);\n if (parsingFunctionParam) {\n this.actions = actionsSelectorInFunc;\n } else {\n this.actions = actionsSelector;\n }\n tokenizer.consume();\n break;\n case CssTokenizer.TokenType.STAR:\n handler.tagSelector(ns, null);\n if (parsingFunctionParam) {\n this.actions = actionsSelectorInFunc;\n } else {\n this.actions = actionsSelector;\n }\n tokenizer.consume();\n break;\n default:\n this.actions = actionsError;\n handler.error(\"E_CSS_NAMESPACE\", token);\n }\n } else {\n this.actions = actionsError;\n handler.error(\"E_CSS_UNDECLARED_PREFIX\", token);\n }\n } else {\n handler.tagSelector(this.defaultNamespaceURI, token.text);\n if (parsingFunctionParam) {\n this.actions = actionsSelectorInFunc;\n } else {\n this.actions = actionsSelector;\n }\n tokenizer.consume();\n }\n continue;\n case Action.SELECTOR_ANY_1:\n if (!token.precededBySpace) {\n this.actions = actionsErrorSelector;\n handler.error(\"E_CSS_SPACE_EXPECTED\", token);\n continue;\n }\n handler.descendantSelector();\n\n // fall through\n case Action.SELECTOR_ANY:\n if (tokenizer.nthToken(1).type == CssTokenizer.TokenType.BAR) {\n tokenizer.consume();\n tokenizer.consume();\n token = tokenizer.token();\n switch (token.type) {\n case CssTokenizer.TokenType.IDENT:\n handler.tagSelector(null, token.text);\n if (parsingFunctionParam) {\n this.actions = actionsSelectorInFunc;\n } else {\n this.actions = actionsSelector;\n }\n tokenizer.consume();\n break;\n case CssTokenizer.TokenType.STAR:\n handler.tagSelector(null, null);\n if (parsingFunctionParam) {\n this.actions = actionsSelectorInFunc;\n } else {\n this.actions = actionsSelector;\n }\n tokenizer.consume();\n break;\n default:\n this.actions = actionsError;\n handler.error(\"E_CSS_NAMESPACE\", token);\n }\n } else {\n handler.tagSelector(this.defaultNamespaceURI, null);\n if (parsingFunctionParam) {\n this.actions = actionsSelectorInFunc;\n } else {\n this.actions = actionsSelector;\n }\n tokenizer.consume();\n }\n continue;\n case Action.SELECTOR_ID_1:\n if (token.precededBySpace) {\n handler.descendantSelector();\n }\n\n // fall through\n case Action.SELECTOR_ID:\n handler.idSelector(token.text);\n if (parsingFunctionParam) {\n this.actions = actionsSelectorInFunc;\n } else {\n this.actions = actionsSelector;\n }\n tokenizer.consume();\n continue;\n case Action.SELECTOR_CLASS_1:\n if (token.precededBySpace) {\n handler.descendantSelector();\n }\n\n // fall through\n case Action.SELECTOR_CLASS:\n handler.classSelector(token.text);\n if (parsingFunctionParam) {\n this.actions = actionsSelectorInFunc;\n } else {\n this.actions = actionsSelector;\n }\n tokenizer.consume();\n continue;\n case Action.SELECTOR_PSEUDOCLASS_1:\n if (token.precededBySpace) {\n handler.descendantSelector();\n }\n\n // fall through\n case Action.SELECTOR_PSEUDOCLASS:\n tokenizer.consume();\n token = tokenizer.token();\n pseudoclassType: switch (token.type) {\n case CssTokenizer.TokenType.IDENT:\n handler.pseudoclassSelector(token.text, null);\n tokenizer.consume();\n if (parsingFunctionParam) {\n this.actions = actionsSelectorInFunc;\n } else {\n this.actions = actionsSelector;\n }\n continue;\n case CssTokenizer.TokenType.FUNC:\n text = token.text;\n tokenizer.consume();\n switch (text) {\n case \"not\":\n this.actions = actionsSelectorStart;\n handler.startFuncWithSelector(\"not\");\n if (\n this.runParser(\n Number.POSITIVE_INFINITY,\n false,\n false,\n false,\n true,\n )\n ) {\n this.actions = actionsSelector;\n } else {\n this.actions = actionsErrorSelector;\n }\n break parserLoop;\n case \"lang\":\n case \"href-epub-type\":\n token = tokenizer.token();\n if (token.type === CssTokenizer.TokenType.IDENT) {\n params = [token.text];\n tokenizer.consume();\n break;\n } else {\n break pseudoclassType;\n }\n case \"nth-child\":\n case \"nth-of-type\":\n case \"nth-last-child\":\n case \"nth-last-of-type\":\n case \"nth\":\n params = this.readNthPseudoParams();\n if (!params) {\n break pseudoclassType;\n } else {\n break;\n }\n default:\n // TODO\n params = this.readPseudoParams();\n }\n token = tokenizer.token();\n if (token.type == CssTokenizer.TokenType.C_PAR) {\n handler.pseudoclassSelector(text as string, params);\n tokenizer.consume();\n if (parsingFunctionParam) {\n this.actions = actionsSelectorInFunc;\n } else {\n this.actions = actionsSelector;\n }\n continue;\n }\n break;\n }\n handler.error(\"E_CSS_PSEUDOCLASS_SYNTAX\", token);\n this.actions = actionsError;\n continue;\n case Action.SELECTOR_PSEUDOELEM:\n tokenizer.consume();\n token = tokenizer.token();\n switch (token.type) {\n case CssTokenizer.TokenType.IDENT:\n handler.pseudoelementSelector(token.text, null);\n if (parsingFunctionParam) {\n this.actions = actionsSelectorInFunc;\n } else {\n this.actions = actionsSelector;\n }\n tokenizer.consume();\n continue;\n case CssTokenizer.TokenType.FUNC:\n text = token.text;\n tokenizer.consume();\n if (text == \"nth-fragment\") {\n params = this.readNthPseudoParams();\n if (params === null) {\n break;\n }\n } else {\n params = this.readPseudoParams();\n }\n token = tokenizer.token();\n if (token.type == CssTokenizer.TokenType.C_PAR) {\n handler.pseudoelementSelector(text as string, params);\n if (parsingFunctionParam) {\n this.actions = actionsSelectorInFunc;\n } else {\n this.actions = actionsSelector;\n }\n tokenizer.consume();\n continue;\n }\n break;\n }\n handler.error(\"E_CSS_PSEUDOELEM_SYNTAX\", token);\n this.actions = actionsError;\n continue;\n case Action.SELECTOR_ATTR_1:\n if (token.precededBySpace) {\n handler.descendantSelector();\n }\n\n // fall through\n case Action.SELECTOR_ATTR:\n tokenizer.consume();\n token = tokenizer.token();\n if (token.type == CssTokenizer.TokenType.IDENT) {\n text = token.text;\n tokenizer.consume();\n } else if (token.type == CssTokenizer.TokenType.STAR) {\n text = null;\n tokenizer.consume();\n } else if (token.type == CssTokenizer.TokenType.BAR) {\n text = \"\";\n } else {\n this.actions = actionsErrorSelector;\n handler.error(\"E_CSS_ATTR\", token);\n tokenizer.consume();\n continue;\n }\n token = tokenizer.token();\n if (token.type == CssTokenizer.TokenType.BAR) {\n ns = text ? this.namespacePrefixToURI[text] : text;\n if (ns == null) {\n this.actions = actionsErrorSelector;\n handler.error(\"E_CSS_UNDECLARED_PREFIX\", token);\n tokenizer.consume();\n continue;\n }\n tokenizer.consume();\n token = tokenizer.token();\n if (token.type != CssTokenizer.TokenType.IDENT) {\n this.actions = actionsErrorSelector;\n handler.error(\"E_CSS_ATTR_NAME_EXPECTED\", token);\n continue;\n }\n text = token.text;\n tokenizer.consume();\n token = tokenizer.token();\n } else {\n ns = \"\";\n }\n switch (token.type) {\n case CssTokenizer.TokenType.EQ:\n case CssTokenizer.TokenType.TILDE_EQ:\n case CssTokenizer.TokenType.BAR_EQ:\n case CssTokenizer.TokenType.HAT_EQ:\n case CssTokenizer.TokenType.DOLLAR_EQ:\n case CssTokenizer.TokenType.STAR_EQ:\n case CssTokenizer.TokenType.COL_COL:\n num = token.type;\n tokenizer.consume();\n token = tokenizer.token();\n break;\n case CssTokenizer.TokenType.C_BRK:\n handler.attributeSelector(\n ns as string,\n text as string,\n CssTokenizer.TokenType.EOF,\n null,\n );\n if (parsingFunctionParam) {\n this.actions = actionsSelectorInFunc;\n } else {\n this.actions = actionsSelector;\n }\n tokenizer.consume();\n continue;\n default:\n this.actions = actionsErrorSelector;\n handler.error(\"E_CSS_ATTR_OP_EXPECTED\", token);\n continue;\n }\n switch (token.type) {\n case CssTokenizer.TokenType.IDENT:\n case CssTokenizer.TokenType.STR:\n handler.attributeSelector(\n ns as string,\n text as string,\n num,\n token.text,\n );\n tokenizer.consume();\n token = tokenizer.token();\n break;\n default:\n this.actions = actionsErrorSelector;\n handler.error(\"E_CSS_ATTR_VAL_EXPECTED\", token);\n continue;\n }\n if (token.type != CssTokenizer.TokenType.C_BRK) {\n this.actions = actionsErrorSelector;\n handler.error(\"E_CSS_ATTR\", token);\n continue;\n }\n if (parsingFunctionParam) {\n this.actions = actionsSelectorInFunc;\n } else {\n this.actions = actionsSelector;\n }\n tokenizer.consume();\n continue;\n case Action.SELECTOR_CHILD:\n handler.childSelector();\n this.actions = actionsSelectorCont;\n tokenizer.consume();\n continue;\n case Action.SELECTOR_SIBLING:\n handler.adjacentSiblingSelector();\n this.actions = actionsSelectorCont;\n tokenizer.consume();\n continue;\n case Action.SELECTOR_FOLLOWING_SIBLING:\n handler.followingSiblingSelector();\n this.actions = actionsSelectorCont;\n tokenizer.consume();\n continue;\n case Action.SELECTOR_BODY:\n if (this.regionRule) {\n this.ruleStack.push(\"-epubx-region\");\n this.regionRule = false;\n } else if (this.pageRule) {\n this.ruleStack.push(\"page\");\n this.pageRule = false;\n } else {\n this.ruleStack.push(\"[selector]\");\n }\n handler.startRuleBody();\n this.actions = actionsBase;\n tokenizer.consume();\n continue;\n case Action.SELECTOR_NEXT:\n handler.nextSelector();\n this.actions = actionsSelectorStart;\n tokenizer.consume();\n continue;\n case Action.VAL_IDENT:\n valStack.push(Css.getName(token.text));\n tokenizer.consume();\n continue;\n case Action.VAL_HASH:\n num = parseInt(token.text, 16);\n try {\n valStack.push(colorFromHash(token.text));\n } catch (err) {\n handler.error(\"E_CSS_COLOR\", token);\n this.actions = actionsError;\n }\n tokenizer.consume();\n continue;\n case Action.VAL_NUM:\n valStack.push(new Css.Num(token.num));\n tokenizer.consume();\n continue;\n case Action.VAL_INT:\n valStack.push(new Css.Int(token.num));\n tokenizer.consume();\n continue;\n case Action.VAL_NUMERIC:\n if (Exprs.isViewportRelativeLengthUnit(token.text)) {\n // Treat numeric value with viewport unit as numeric in expr.\n valStack.push(\n new Css.Expr(\n new Exprs.Numeric(handler.getScope(), token.num, token.text),\n ),\n );\n } else {\n valStack.push(new Css.Numeric(token.num, token.text));\n }\n tokenizer.consume();\n continue;\n case Action.VAL_STR:\n valStack.push(new Css.Str(token.text));\n tokenizer.consume();\n continue;\n case Action.VAL_URL:\n valStack.push(new Css.URL(Base.resolveURL(token.text, this.baseURL)));\n tokenizer.consume();\n continue;\n case Action.VAL_COMMA:\n this.valStackReduce(\",\", token);\n valStack.push(\",\");\n tokenizer.consume();\n continue;\n case Action.VAL_SLASH:\n valStack.push(Css.slash);\n tokenizer.consume();\n continue;\n case Action.VAL_FUNC:\n text = token.text.toLowerCase();\n if (text == \"-epubx-expr\" || text == \"calc\" || text == \"env\") {\n // special case\n this.actions = actionsExprVal;\n this.exprContext = ExprContext.PROP;\n valStack.push(\"{\");\n } else {\n valStack.push(text);\n valStack.push(\"(\");\n }\n tokenizer.consume();\n continue;\n case Action.VAL_C_PAR:\n this.valStackReduce(\")\", token);\n tokenizer.consume();\n continue;\n case Action.VAL_BANG:\n tokenizer.consume();\n token = tokenizer.token();\n token1 = tokenizer.nthToken(1);\n if (\n token.type == CssTokenizer.TokenType.IDENT &&\n token.text.toLowerCase() == \"important\" &&\n (token1.type == CssTokenizer.TokenType.SEMICOL ||\n token1.type == CssTokenizer.TokenType.EOF ||\n token1.type == CssTokenizer.TokenType.C_BRC)\n ) {\n tokenizer.consume();\n this.propImportant = true;\n continue;\n }\n this.exprError(\"E_CSS_SYNTAX\", token);\n continue;\n case Action.VAL_PLUS:\n token1 = tokenizer.nthToken(1);\n switch (token1.type) {\n case CssTokenizer.TokenType.NUM:\n case CssTokenizer.TokenType.NUMERIC:\n case CssTokenizer.TokenType.INT:\n if (!token1.precededBySpace) {\n // Plus before number, ignore\n tokenizer.consume();\n continue;\n }\n }\n if (this.actions === actionsPropVal && tokenizer.hasMark()) {\n tokenizer.reset();\n this.actions = actionsSelectorStart;\n handler.startSelectorRule();\n continue;\n } else {\n this.exprError(\"E_CSS_UNEXPECTED_PLUS\", token);\n continue;\n }\n case Action.VAL_END:\n tokenizer.consume();\n\n // fall through\n case Action.VAL_BRC:\n tokenizer.unmark();\n val = this.valStackReduce(\";\", token);\n if (val && this.propName) {\n handler.property(this.propName as string, val, this.propImportant);\n }\n this.actions = parsingStyleAttr ? actionsStyleAttribute : actionsBase;\n continue;\n case Action.VAL_FINISH:\n tokenizer.consume();\n tokenizer.unmark();\n val = this.valStackReduce(\";\", token);\n if (parsingValue) {\n this.result = val;\n return true;\n }\n if (this.propName && val) {\n handler.property(this.propName as string, val, this.propImportant);\n }\n if (parsingStyleAttr) {\n return true;\n }\n this.exprError(\"E_CSS_SYNTAX\", token);\n continue;\n case Action.EXPR_IDENT:\n token1 = tokenizer.nthToken(1);\n if (token1.type == CssTokenizer.TokenType.CLASS) {\n if (\n tokenizer.nthToken(2).type == CssTokenizer.TokenType.O_PAR &&\n !tokenizer.nthToken(2).precededBySpace\n ) {\n valStack.push(token.text, token1.text, \"(\");\n tokenizer.consume();\n } else {\n valStack.push(\n new Exprs.Named(\n handler.getScope(),\n Exprs.makeQualifiedName(token.text, token1.text),\n ),\n );\n this.actions = actionsExprOp;\n }\n tokenizer.consume();\n } else {\n if (\n this.exprContext == ExprContext.MEDIA ||\n this.exprContext == ExprContext.IMPORT\n ) {\n if (token.text.toLowerCase() == \"not\") {\n tokenizer.consume();\n valStack.push(\n new Exprs.MediaName(handler.getScope(), true, token1.text),\n );\n } else {\n if (token.text.toLowerCase() == \"only\") {\n tokenizer.consume();\n token = token1;\n }\n valStack.push(\n new Exprs.MediaName(handler.getScope(), false, token.text),\n );\n }\n } else {\n valStack.push(new Exprs.Named(handler.getScope(), token.text));\n }\n this.actions = actionsExprOp;\n }\n tokenizer.consume();\n continue;\n case Action.EXPR_FUNC:\n valStack.push(null, token.text, \"(\");\n tokenizer.consume();\n continue;\n case Action.EXPR_NUM:\n valStack.push(new Exprs.Const(handler.getScope(), token.num));\n tokenizer.consume();\n this.actions = actionsExprOp;\n continue;\n case Action.EXPR_NUMERIC:\n text = token.text;\n if (text == \"%\") {\n if (this.propName && this.propName.match(/height|^(top|bottom)$/)) {\n text = \"vh\";\n } else {\n text = \"vw\";\n }\n }\n valStack.push(new Exprs.Numeric(handler.getScope(), token.num, text));\n tokenizer.consume();\n this.actions = actionsExprOp;\n continue;\n case Action.EXPR_STR:\n valStack.push(new Exprs.Const(handler.getScope(), token.text));\n tokenizer.consume();\n this.actions = actionsExprOp;\n continue;\n case Action.EXPR_PARAM:\n tokenizer.consume();\n token = tokenizer.token();\n if (\n token.type != CssTokenizer.TokenType.INT ||\n token.precededBySpace\n ) {\n this.exprError(\"E_CSS_SYNTAX\", token);\n } else {\n valStack.push(new Exprs.Param(handler.getScope(), token.num));\n tokenizer.consume();\n this.actions = actionsExprOp;\n }\n continue;\n case Action.EXPR_PREFIX:\n valStack.push(-token.type);\n tokenizer.consume();\n continue;\n case Action.EXPR_INFIX:\n this.actions = actionsExprVal;\n this.exprStackReduce(token.type, token);\n valStack.push(token.type);\n tokenizer.consume();\n continue;\n case Action.EXPR_INFIX_NAME:\n if (token.text.toLowerCase() == \"and\") {\n this.actions = actionsExprVal;\n this.exprStackReduce(OP_MEDIA_AND, token);\n valStack.push(OP_MEDIA_AND);\n tokenizer.consume();\n } else {\n this.exprError(\"E_CSS_SYNTAX\", token);\n }\n continue;\n case Action.EXPR_C_PAR:\n if (this.exprStackReduce(token.type, token)) {\n if (this.propName) {\n this.actions = actionsPropVal;\n } else {\n this.exprError(\"E_CSS_UNBALANCED_PAR\", token);\n }\n }\n tokenizer.consume();\n continue;\n case Action.EXPR_O_BRC:\n if (this.exprStackReduce(CssTokenizer.TokenType.C_PAR, token)) {\n if (this.propName || this.exprContext == ExprContext.IMPORT) {\n this.exprError(\"E_CSS_UNEXPECTED_BRC\", token);\n } else {\n if (this.exprContext == ExprContext.WHEN) {\n handler.startWhenRule(valStack.pop() as Css.Expr);\n } else {\n handler.startMediaRule(valStack.pop() as Css.Expr);\n }\n this.ruleStack.push(\"media\");\n handler.startRuleBody();\n this.actions = actionsBase;\n }\n }\n tokenizer.consume();\n continue;\n case Action.EXPR_SEMICOL:\n if (this.exprStackReduce(CssTokenizer.TokenType.C_PAR, token)) {\n if (this.propName || this.exprContext != ExprContext.IMPORT) {\n this.exprError(\"E_CSS_UNEXPECTED_SEMICOL\", token);\n } else {\n this.importCondition = valStack.pop() as Css.Expr;\n this.importReady = true;\n this.actions = actionsBase;\n tokenizer.consume();\n return false;\n }\n }\n tokenizer.consume();\n continue;\n case Action.EXPR_O_PAR:\n valStack.push(token.type);\n tokenizer.consume();\n continue;\n case Action.RULE_END:\n this.actions = actionsBase;\n tokenizer.consume();\n handler.endRule();\n if (this.ruleStack.length) {\n this.ruleStack.pop();\n }\n continue;\n case Action.AT:\n text = token.text.toLowerCase();\n switch (text) {\n case \"import\":\n tokenizer.consume();\n token = tokenizer.token();\n if (\n token.type == CssTokenizer.TokenType.STR ||\n token.type == CssTokenizer.TokenType.URL\n ) {\n this.importURL = token.text;\n tokenizer.consume();\n token = tokenizer.token();\n if (\n token.type == CssTokenizer.TokenType.SEMICOL ||\n token.type == CssTokenizer.TokenType.EOF\n ) {\n this.importReady = true;\n tokenizer.consume();\n return false;\n } else {\n this.propName = null; // signals @ rule\n this.exprContext = ExprContext.IMPORT;\n this.actions = actionsExprVal;\n valStack.push(\"{\");\n continue;\n }\n }\n handler.error(\"E_CSS_IMPORT_SYNTAX\", token);\n this.actions = actionsError;\n continue;\n case \"namespace\":\n tokenizer.consume();\n token = tokenizer.token();\n switch (token.type) {\n case CssTokenizer.TokenType.IDENT:\n text = token.text; // Prefix\n tokenizer.consume();\n token = tokenizer.token();\n if (\n (token.type == CssTokenizer.TokenType.STR ||\n token.type == CssTokenizer.TokenType.URL) &&\n tokenizer.nthToken(1).type == CssTokenizer.TokenType.SEMICOL\n ) {\n this.namespacePrefixToURI[text] = token.text;\n tokenizer.consume();\n tokenizer.consume();\n continue;\n }\n break;\n case CssTokenizer.TokenType.STR:\n case CssTokenizer.TokenType.URL:\n if (\n tokenizer.nthToken(1).type == CssTokenizer.TokenType.SEMICOL\n ) {\n this.defaultNamespaceURI = token.text;\n tokenizer.consume();\n tokenizer.consume();\n continue;\n }\n break;\n }\n handler.error(\"E_CSS_NAMESPACE_SYNTAX\", token);\n this.actions = actionsError;\n continue;\n case \"charset\":\n // Useless in EPUB (only UTF-8 or UTF-16 is allowed anyway and\n // we are at the mercy of the browser charset handling anyway).\n tokenizer.consume();\n token = tokenizer.token();\n if (\n token.type == CssTokenizer.TokenType.STR &&\n tokenizer.nthToken(1).type == CssTokenizer.TokenType.SEMICOL\n ) {\n text = token.text.toLowerCase();\n if (text != \"utf-8\" && text != \"utf-16\") {\n handler.error(`E_CSS_UNEXPECTED_CHARSET ${text}`, token);\n }\n tokenizer.consume();\n tokenizer.consume();\n continue;\n }\n handler.error(\"E_CSS_CHARSET_SYNTAX\", token);\n this.actions = actionsError;\n continue;\n case \"font-face\":\n case \"-epubx-page-template\":\n case \"-epubx-define\":\n case \"-epubx-viewport\":\n if (tokenizer.nthToken(1).type == CssTokenizer.TokenType.O_BRC) {\n tokenizer.consume();\n tokenizer.consume();\n switch (text) {\n case \"font-face\":\n handler.startFontFaceRule();\n break;\n case \"-epubx-page-template\":\n handler.startPageTemplateRule();\n break;\n case \"-epubx-define\":\n handler.startDefineRule();\n break;\n case \"-epubx-viewport\":\n handler.startViewportRule();\n break;\n }\n this.ruleStack.push(text);\n handler.startRuleBody();\n continue;\n }\n break;\n case \"-adapt-footnote-area\":\n tokenizer.consume();\n token = tokenizer.token();\n switch (token.type) {\n case CssTokenizer.TokenType.O_BRC:\n tokenizer.consume();\n handler.startFootnoteRule(null);\n this.ruleStack.push(text);\n handler.startRuleBody();\n continue;\n case CssTokenizer.TokenType.COL_COL:\n tokenizer.consume();\n token = tokenizer.token();\n if (\n token.type == CssTokenizer.TokenType.IDENT &&\n tokenizer.nthToken(1).type == CssTokenizer.TokenType.O_BRC\n ) {\n text = token.text;\n tokenizer.consume();\n tokenizer.consume();\n handler.startFootnoteRule(text);\n this.ruleStack.push(\"-adapt-footnote-area\");\n handler.startRuleBody();\n continue;\n }\n break;\n }\n break;\n case \"-epubx-region\":\n tokenizer.consume();\n handler.startRegionRule();\n this.regionRule = true;\n this.actions = actionsSelectorStart;\n continue;\n case \"page\":\n tokenizer.consume();\n handler.startPageRule();\n this.pageRule = true;\n this.actions = actionsSelectorCont;\n continue;\n case \"top-left-corner\":\n case \"top-left\":\n case \"top-center\":\n case \"top-right\":\n case \"top-right-corner\":\n case \"right-top\":\n case \"right-middle\":\n case \"right-bottom\":\n case \"bottom-right-corner\":\n case \"bottom-right\":\n case \"bottom-center\":\n case \"bottom-left\":\n case \"bottom-left-corner\":\n case \"left-bottom\":\n case \"left-middle\":\n case \"left-top\":\n tokenizer.consume();\n token = tokenizer.token();\n if (token.type == CssTokenizer.TokenType.O_BRC) {\n tokenizer.consume();\n handler.startPageMarginBoxRule(text);\n this.ruleStack.push(text);\n handler.startRuleBody();\n continue;\n }\n break;\n case \"-epubx-when\":\n tokenizer.consume();\n this.propName = null; // signals @ rule\n this.exprContext = ExprContext.WHEN;\n this.actions = actionsExprVal;\n valStack.push(\"{\");\n continue;\n case \"media\":\n tokenizer.consume();\n this.propName = null; // signals @ rule\n this.exprContext = ExprContext.MEDIA;\n this.actions = actionsExprVal;\n valStack.push(\"{\");\n continue;\n case \"-epubx-flow\":\n if (\n tokenizer.nthToken(1).type == CssTokenizer.TokenType.IDENT &&\n tokenizer.nthToken(2).type == CssTokenizer.TokenType.O_BRC\n ) {\n handler.startFlowRule(tokenizer.nthToken(1).text);\n tokenizer.consume();\n tokenizer.consume();\n tokenizer.consume();\n this.ruleStack.push(text);\n handler.startRuleBody();\n continue;\n }\n break;\n case \"-epubx-page-master\":\n case \"-epubx-partition\":\n case \"-epubx-partition-group\": {\n tokenizer.consume();\n token = tokenizer.token();\n let ruleName: string | null = null;\n let rulePseudoName: string | null = null;\n const classes: string[] = [];\n if (token.type == CssTokenizer.TokenType.IDENT) {\n ruleName = token.text;\n tokenizer.consume();\n token = tokenizer.token();\n }\n if (\n token.type == CssTokenizer.TokenType.COLON &&\n tokenizer.nthToken(1).type == CssTokenizer.TokenType.IDENT\n ) {\n rulePseudoName = tokenizer.nthToken(1).text;\n tokenizer.consume();\n tokenizer.consume();\n token = tokenizer.token();\n }\n while (\n token.type == CssTokenizer.TokenType.FUNC &&\n token.text.toLowerCase() == \"class\" &&\n tokenizer.nthToken(1).type == CssTokenizer.TokenType.IDENT &&\n tokenizer.nthToken(2).type == CssTokenizer.TokenType.C_PAR\n ) {\n classes.push(tokenizer.nthToken(1).text);\n tokenizer.consume();\n tokenizer.consume();\n tokenizer.consume();\n token = tokenizer.token();\n }\n if (token.type == CssTokenizer.TokenType.O_BRC) {\n tokenizer.consume();\n switch (text) {\n case \"-epubx-page-master\":\n handler.startPageMasterRule(\n ruleName,\n rulePseudoName,\n classes,\n );\n break;\n case \"-epubx-partition\":\n handler.startPartitionRule(\n ruleName,\n rulePseudoName,\n classes,\n );\n break;\n case \"-epubx-partition-group\":\n handler.startPartitionGroupRule(\n ruleName,\n rulePseudoName,\n classes,\n );\n break;\n }\n this.ruleStack.push(text);\n handler.startRuleBody();\n continue;\n }\n break;\n }\n case \"\":\n // No text after @\n handler.error(`E_CSS_UNEXPECTED_AT${text}`, token);\n\n // Error recovery using selector rules.\n this.actions = actionsErrorSelector;\n continue;\n default:\n handler.error(`E_CSS_AT_UNKNOWN ${text}`, token);\n this.actions = actionsError;\n continue;\n }\n handler.error(`E_CSS_AT_SYNTAX ${text}`, token);\n this.actions = actionsError;\n continue;\n case Action.ERROR_PUSH:\n // Open bracket while skipping error syntax\n if (parsingValue || parsingStyleAttr) {\n return true;\n }\n this.errorBrackets.push(token.type + 1);\n\n // Expected closing bracket\n tokenizer.consume();\n continue;\n case Action.ERROR_POP_DECL:\n // Close bracket while skipping error syntax in declaration\n if (parsingValue || parsingStyleAttr) {\n return true;\n }\n if (this.errorBrackets.length == 0) {\n this.actions = actionsBase;\n\n // Don't consume closing brace\n continue;\n }\n\n // fall through\n case Action.ERROR_POP:\n // Close bracket while skipping error syntax\n if (\n this.errorBrackets.length > 0 &&\n this.errorBrackets[this.errorBrackets.length - 1] == token.type\n ) {\n this.errorBrackets.pop();\n }\n if (\n this.errorBrackets.length == 0 &&\n token.type == CssTokenizer.TokenType.C_BRC\n ) {\n this.actions = actionsBase;\n }\n tokenizer.consume();\n continue;\n case Action.ERROR_SEMICOL:\n if (parsingValue || parsingStyleAttr) {\n return true;\n }\n if (this.errorBrackets.length == 0) {\n this.actions = actionsBase;\n }\n tokenizer.consume();\n continue;\n case Action.DONE:\n if (parsingFunctionParam) {\n tokenizer.consume();\n handler.endFuncWithSelector();\n }\n return true;\n default:\n if (parsingValue || parsingStyleAttr) {\n return true;\n }\n if (parsingMediaQuery) {\n if (this.exprStackReduce(CssTokenizer.TokenType.C_PAR, token)) {\n this.result = valStack.pop() as Css.Val;\n return true;\n }\n return false;\n }\n if (parsingFunctionParam) {\n if (token.type == CssTokenizer.TokenType.INVALID) {\n handler.error(token.text, token);\n } else {\n handler.error(\"E_CSS_SYNTAX\", token);\n }\n return false;\n }\n if (this.actions === actionsPropVal && tokenizer.hasMark()) {\n tokenizer.reset();\n this.actions = actionsSelectorStart;\n handler.startSelectorRule();\n continue;\n }\n if (\n this.actions !== actionsError &&\n this.actions !== actionsErrorSelector &&\n this.actions !== actionsErrorDecl\n ) {\n if (token.type == CssTokenizer.TokenType.INVALID) {\n handler.error(token.text, token);\n } else {\n handler.error(\"E_CSS_SYNTAX\", token);\n }\n if (this.isInsidePropertyOnlyRule()) {\n this.actions = actionsErrorDecl;\n } else {\n this.actions = actionsErrorSelector;\n }\n continue; // Let error-recovery to re-process the offending token\n }\n tokenizer.consume();\n continue;\n }\n }\n return false; // Not done yet.\n }\n}\n\nexport class ErrorHandler extends ParserHandler {\n constructor(public readonly scope: Exprs.LexicalScope) {\n super(null);\n }\n\n /**\n * @override\n */\n error(mnemonics: string, token: CssTokenizer.Token): void {\n throw new Error(mnemonics);\n }\n\n /**\n * @override\n */\n getScope(): Exprs.LexicalScope {\n return this.scope;\n }\n}\n\nexport function parseStylesheet(\n tokenizer: CssTokenizer.Tokenizer,\n handler: ParserHandler,\n baseURL: string,\n classes: string | null,\n media: string | null,\n): Task.Result<boolean> {\n const frame: Task.Frame<boolean> = Task.newFrame(\"parseStylesheet\");\n const parser = new Parser(actionsBase, tokenizer, handler, baseURL);\n let condition: Css.Expr = null;\n if (media) {\n condition = parseMediaQuery(\n new CssTokenizer.Tokenizer(media, handler),\n handler,\n baseURL,\n );\n }\n condition = parser.makeCondition(classes, condition && condition.toExpr());\n if (condition) {\n handler.startMediaRule(condition);\n handler.startRuleBody();\n }\n frame\n .loop(() => {\n while (!parser.runParser(100, false, false, false, false)) {\n if (parser.importReady) {\n const resolvedURL = Base.resolveURL(\n parser.importURL as string,\n baseURL,\n );\n if (parser.importCondition) {\n handler.startMediaRule(parser.importCondition);\n handler.startRuleBody();\n }\n const innerFrame: Task.Frame<boolean> = Task.newFrame(\n \"parseStylesheet.import\",\n );\n parseStylesheetFromURL(resolvedURL, handler, null, null).then(() => {\n if (parser.importCondition) {\n handler.endRule();\n }\n parser.importReady = false;\n parser.importURL = null;\n parser.importCondition = null;\n innerFrame.finish(true);\n });\n return innerFrame.result();\n }\n const r = frame.timeSlice();\n if (r.isPending) {\n return r;\n }\n }\n return Task.newResult(false);\n })\n .then(() => {\n if (condition) {\n handler.endRule();\n }\n frame.finish(true);\n });\n return frame.result();\n}\n\nexport function parseStylesheetFromText(\n text: string,\n handler: ParserHandler,\n baseURL: string,\n classes: string | null,\n media: string | null,\n): Task.Result<boolean> {\n return Task.handle(\n \"parseStylesheetFromText\",\n (frame) => {\n const tok = new CssTokenizer.Tokenizer(text, handler);\n parseStylesheet(tok, handler, baseURL, classes, media).thenFinish(frame);\n },\n (frame, err) => {\n Logging.logger.warn(err, `Failed to parse stylesheet text: ${text}`);\n frame.finish(false);\n },\n );\n}\n\nexport function parseStylesheetFromURL(\n url: string,\n handler: ParserHandler,\n classes: string | null,\n media: string | null,\n): Task.Result<boolean> {\n return Task.handle(\n \"parseStylesheetFromURL\",\n (frame) => {\n Net.ajax(url).then((xhr) => {\n if (!xhr.responseText) {\n frame.finish(true);\n } else {\n parseStylesheetFromText(\n xhr.responseText,\n handler,\n url,\n classes,\n media,\n ).then((result) => {\n if (!result) {\n Logging.logger.warn(`Failed to parse stylesheet from ${url}`);\n }\n frame.finish(true);\n });\n }\n });\n },\n (frame, err) => {\n Logging.logger.warn(err, \"Exception while fetching and parsing:\", url);\n frame.finish(true);\n },\n );\n}\n\nexport function parseValue(\n scope: Exprs.LexicalScope,\n tokenizer: CssTokenizer.Tokenizer,\n baseURL: string,\n): Css.Val {\n const parser = new Parser(\n actionsPropVal,\n tokenizer,\n new ErrorHandler(scope),\n baseURL,\n );\n parser.runParser(Number.POSITIVE_INFINITY, true, false, false, false);\n return parser.result;\n}\n\nexport function parseStyleAttribute(\n tokenizer: CssTokenizer.Tokenizer,\n handler: ParserHandler,\n baseURL: string,\n): void {\n const parser = new Parser(actionsStyleAttribute, tokenizer, handler, baseURL);\n parser.runParser(Number.POSITIVE_INFINITY, false, true, false, false);\n}\n\nexport function parseMediaQuery(\n tokenizer: CssTokenizer.Tokenizer,\n handler: ParserHandler,\n baseURL: string,\n): Css.Expr {\n const parser = new Parser(actionsExprVal, tokenizer, handler, baseURL);\n parser.runParser(Number.POSITIVE_INFINITY, false, false, true, false);\n return parser.result as Css.Expr;\n}\n\nexport const numProp: { [key: string]: boolean } = {\n \"z-index\": true,\n \"column-count\": true,\n \"flow-linger\": true,\n opacity: true,\n page: true,\n \"flow-priority\": true,\n utilization: true,\n};\n\nexport function takesOnlyNum(propName: string): boolean {\n return !!numProp[propName];\n}\n\n/**\n * @return val\n */\nexport function evaluateExprToCSS(\n context: Exprs.Context,\n val: Exprs.Val,\n propName: string,\n): Css.Val {\n const result = val.evaluate(context);\n switch (typeof result) {\n case \"number\":\n if (!takesOnlyNum(propName)) {\n return new Css.Numeric(result as number, \"px\");\n } else if (result == Math.round(result as number)) {\n return new Css.Int(result as number);\n } else {\n return new Css.Num(result as number);\n }\n case \"string\":\n if (!result) {\n return Css.empty;\n }\n\n // TODO: where baseURL should come from???\n return parseValue(\n val.scope,\n new CssTokenizer.Tokenizer(result as string, null),\n \"\",\n );\n case \"boolean\":\n return result ? Css.ident._true : Css.ident._false;\n case \"undefined\":\n return Css.empty;\n }\n throw new Error(\"E_UNEXPECTED\");\n}\n\n/**\n * @return val\n */\nexport function evaluateCSSToCSS(\n context: Exprs.Context,\n val: Css.Val,\n propName: string,\n): Css.Val {\n if (val.isExpr()) {\n return evaluateExprToCSS(context, (val as Css.Expr).expr, propName);\n }\n return val;\n}\n","/**\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Matchers - Definitions of Matcher.\n */\nimport * as Asserts from \"./asserts\";\n\n/**\n * Checkes whether given order can be represented as an+b with a non-negative\n * interger n\n */\nexport function matchANPlusB(order: number, a: number, b: number): boolean {\n order -= b;\n if (a === 0) {\n return order === 0;\n } else {\n return order % a === 0 && order / a >= 0;\n }\n}\n\nexport interface Matcher {\n matches(): boolean;\n}\n\nexport class AnyMatcher implements Matcher {\n constructor(public readonly matchers: Matcher[]) {}\n\n /** @override */\n matches(): boolean {\n return this.matchers.some((matcher) => matcher.matches());\n }\n}\n\nexport class AllMatcher implements Matcher {\n constructor(public readonly matchers: Matcher[]) {}\n\n /** @override */\n matches(): boolean {\n return this.matchers.every((matcher) => matcher.matches());\n }\n}\n\nexport class NthFragmentMatcher implements Matcher {\n static fragmentIndices = {};\n\n static registerFragmentIndex(\n elementOffset: number,\n fragmentIndex: number,\n priority: number,\n ) {\n const indices = NthFragmentMatcher.fragmentIndices;\n if (\n !indices[elementOffset] ||\n indices[elementOffset].priority <= priority\n ) {\n indices[elementOffset] = { fragmentIndex, priority };\n }\n }\n\n static clearFragmentIndices() {\n NthFragmentMatcher.fragmentIndices = {};\n }\n\n constructor(\n public readonly elementOffset: number,\n public readonly a: number,\n public readonly b: number,\n ) {}\n\n /** @override */\n matches(): boolean {\n const entry = NthFragmentMatcher.fragmentIndices[this.elementOffset];\n return (\n entry != null &&\n entry.fragmentIndex != null &&\n matchANPlusB(entry.fragmentIndex, this.a, this.b)\n );\n }\n}\n\nexport class MatcherBuilder {\n static buildViewConditionMatcher(\n elementOffset: number,\n viewCondition: string,\n ): Matcher {\n const strs = viewCondition.split(\"_\");\n if (strs[0] == \"NFS\") {\n return new NthFragmentMatcher(\n elementOffset,\n parseInt(strs[1], 10),\n parseInt(strs[2], 10),\n );\n } else {\n Asserts.fail(`unknown view condition. condition=${viewCondition}`);\n return null;\n }\n }\n\n static buildAllMatcher(matchers: Matcher[]): Matcher {\n return new AllMatcher(matchers);\n }\n\n static buildAnyMatcher(matchers: Matcher[]): Matcher {\n return new AnyMatcher(matchers);\n }\n}\n","/**\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Types - Type definiions.\n */\nimport * as Base from \"./base\";\nimport * as Css from \"./css\";\nimport * as Diff from \"./diff\";\nimport * as Exprs from \"./exprs\";\nimport * as GeometryUtil from \"./geometry-util\";\nimport * as Task from \"./task\";\nimport * as TaskUtil from \"./task-util\";\n\nexport type FormattingContextType =\n | \"Block\"\n | \"RepetitiveElementsOwner\"\n | \"Table\";\n\nexport type FragmentLayoutConstraintType =\n | \"AfterIfContinue\"\n | \"EntireTable\"\n | \"RepetitiveElementsOwner\"\n | \"TableRow\";\n\nexport namespace CssCascade {\n export interface ElementStyle {}\n}\n\nexport namespace CssStyler {\n export interface AbstractStyler {\n getStyle(element: Element, deep: boolean): CssCascade.ElementStyle;\n processContent(element: Element, styles: { [key: string]: Css.Val });\n }\n}\n\nexport namespace Layout {\n /**\n * Represents a constraint on layout\n */\n export interface LayoutConstraint {\n /**\n * Returns if this constraint allows the node context to be laid out at the\n * current position.\n */\n allowLayout(nodeContext: Vtree.NodeContext): boolean;\n }\n /**\n * Represents constraints on laying out fragments\n */\n export interface FragmentLayoutConstraint {\n flagmentLayoutConstraintType: FragmentLayoutConstraintType;\n allowLayout(\n nodeContext: Vtree.NodeContext,\n overflownNodeContext: Vtree.NodeContext,\n column: Column,\n ): boolean;\n nextCandidate(nodeContext: Vtree.NodeContext): boolean;\n postLayout(\n allowed: boolean,\n positionAfter: Vtree.NodeContext,\n initialPosition: Vtree.NodeContext,\n column: Column,\n );\n finishBreak(\n nodeContext: Vtree.NodeContext,\n column: Column,\n ): Task.Result<boolean>;\n equalsTo(constraint: FragmentLayoutConstraint): boolean;\n getPriorityOfFinishBreak(): number;\n }\n\n /**\n * Potential breaking position.\n */\n export interface BreakPosition {\n /**\n * @return break position, if found\n */\n findAcceptableBreak(column: Column, penalty: number): Vtree.NodeContext;\n /**\n * @return penalty for this break position\n */\n getMinBreakPenalty(): number;\n calculateOffset(column: Column): { current: number; minimum: number };\n breakPositionChosen(column: Column): void;\n }\n\n export interface AbstractBreakPosition extends BreakPosition {\n getNodeContext(): Vtree.NodeContext;\n }\n\n export type BreakPositionAndNodeContext = {\n breakPosition: BreakPosition;\n nodeContext: Vtree.NodeContext;\n };\n\n /**\n * Potential breaking position inside CSS box (between lines).\n * @param checkPoints array of breaking points for\n * breakable block\n */\n export interface BoxBreakPosition extends AbstractBreakPosition {\n breakNodeContext: Vtree.NodeContext;\n readonly checkPoints: Vtree.NodeContext[];\n readonly penalty: number;\n }\n\n /**\n * Potential edge breaking position.\n */\n export interface EdgeBreakPosition extends AbstractBreakPosition {\n overflowIfRepetitiveElementsDropped: boolean;\n readonly position: Vtree.NodeContext;\n readonly breakOnEdge: string | null;\n overflows: boolean;\n readonly computedBlockSize: number;\n }\n\n export interface Column extends Vtree.Container {\n last: Node;\n viewDocument: Document;\n flowRootFormattingContext: Vtree.FormattingContext;\n isFloat: boolean;\n isFootnote: boolean;\n startEdge: number;\n endEdge: number;\n beforeEdge: number;\n afterEdge: number;\n footnoteEdge: number;\n box: GeometryUtil.Rect;\n chunkPositions: Vtree.ChunkPosition[];\n bands: GeometryUtil.Band[];\n overflown: boolean;\n breakPositions: BreakPosition[];\n pageBreakType: string | null;\n forceNonfitting: boolean;\n leftFloatEdge: number;\n /**\n * bottom of the bottommost left float\n */\n rightFloatEdge: number;\n /**\n * bottom of the bottommost right float\n */\n bottommostFloatTop: number;\n /**\n * Top of the bottommost float\n */\n stopAtOverflow: boolean;\n lastAfterPosition: Vtree.NodePosition | null;\n fragmentLayoutConstraints: FragmentLayoutConstraint[];\n pseudoParent: Column;\n nodeContextOverflowingDueToRepetitiveElements: Vtree.NodeContext | null;\n blockDistanceToBlockEndFloats: number;\n computedBlockSize: number;\n\n layoutContext: Vtree.LayoutContext;\n clientLayout: Vtree.ClientLayout;\n readonly layoutConstraint: LayoutConstraint;\n readonly pageFloatLayoutContext: PageFloats.PageFloatLayoutContext;\n\n getTopEdge(): number;\n getBottomEdge(): number;\n getLeftEdge(): number;\n getRightEdge(): number;\n isFloatNodeContext(nodeContext: Vtree.NodeContext): boolean;\n stopByOverflow(nodeContext: Vtree.NodeContext): boolean;\n isOverflown(edge: number): boolean;\n getExclusions(): GeometryUtil.Shape[];\n openAllViews(position: Vtree.NodePosition): Task.Result<Vtree.NodeContext>;\n calculateOffsetInNodeForNodeContext(position: Vtree.NodePosition): number;\n /**\n * @param count first-XXX nesting identifier\n */\n maybePeelOff(\n position: Vtree.NodeContext,\n count: number,\n ): Task.Result<Vtree.NodeContext>;\n /**\n * Builds the view until a CSS box edge is reached.\n * @param position start source position.\n * @param checkPoints array to append possible breaking points.\n * @return holding box edge position reached or null if the source is exhausted.\n */\n buildViewToNextBlockEdge(\n position: Vtree.NodeContext,\n checkPoints: Vtree.NodeContext[],\n ): Task.Result<Vtree.NodeContext>;\n nextInTree(\n position: Vtree.NodeContext,\n atUnforcedBreak?: boolean,\n ): Task.Result<Vtree.NodeContext>;\n /**\n * Builds the view for a single unbreakable element.\n * @param position start source position.\n * @return holding box edge position reached or null if the source is exhausted.\n */\n buildDeepElementView(\n position: Vtree.NodeContext,\n ): Task.Result<Vtree.NodeContext>;\n\n /**\n * Create a single floating element (for exclusion areas).\n * @param ref container's child to insert float before (can be null).\n * @param side float side (\"left\" or \"right\").\n * @param width float inline dimension.\n * @param height float box progression dimension.\n * @return newly created float element.\n */\n createFloat(\n ref: Node,\n side: string,\n width: number,\n height: number,\n ): Element;\n /**\n * Remove all the exclusion floats.\n */\n killFloats(): void;\n /**\n * Create exclusion floats for a column.\n */\n createFloats(): void;\n /**\n * @param nodeContext position after the block\n * @param checkPoints array of possible breaking points.\n * @param index index of the breaking point\n * @param boxOffset box offset\n * @return edge position\n */\n calculateEdge(\n nodeContext: Vtree.NodeContext,\n checkPoints: Vtree.NodeContext[],\n index: number,\n boxOffset: number,\n ): number;\n /**\n * Parse CSS computed length (in pixels)\n * @param val CSS length in \"px\" units or a number.\n * @return value in pixels or 0 if not parsable\n */\n parseComputedLength(val: string | number): number;\n /**\n * Reads element's computed CSS margin.\n */\n getComputedMargin(element: Element): GeometryUtil.Insets;\n /**\n * Reads element's computed padding + borders.\n */\n getComputedPaddingBorder(element: Element): GeometryUtil.Insets;\n /**\n * Reads element's computed CSS insets(margins + border + padding or margins :\n * depends on box-sizing)\n */\n getComputedInsets(element: Element): GeometryUtil.Insets;\n /**\n * Set element's computed CSS insets to Column Container\n */\n setComputedInsets(element: Element, container: Column): void;\n /**\n * Set element's computed width and height to Column Container\n */\n setComputedWidthAndHeight(element: Element, container: Column): void;\n /**\n * Layout a single unbreakable element.\n */\n layoutUnbreakable(\n nodeContextIn: Vtree.NodeContext,\n ): Task.Result<Vtree.NodeContext>;\n /**\n * Layout a single float element.\n */\n layoutFloat(nodeContext: Vtree.NodeContext): Task.Result<Vtree.NodeContext>;\n\n setupFloatArea(\n area: PageFloatArea,\n floatReference: PageFloats.FloatReference,\n floatSide: string,\n anchorEdge: number | null,\n strategy: PageFloats.PageFloatLayoutStrategy,\n condition: PageFloats.PageFloatPlacementCondition,\n ): boolean;\n createPageFloatArea(\n float: PageFloats.PageFloat | null,\n floatSide: string,\n anchorEdge: number | null,\n strategy: PageFloats.PageFloatLayoutStrategy,\n condition: PageFloats.PageFloatPlacementCondition,\n ): PageFloatArea | null;\n layoutSinglePageFloatFragment(\n continuations: PageFloats.PageFloatContinuation[],\n floatSide: string,\n clearSide: string | null,\n allowFragmented: boolean,\n strategy: PageFloats.PageFloatLayoutStrategy,\n anchorEdge: number | null,\n pageFloatFragment?: PageFloats.PageFloatFragment | null,\n ): Task.Result<SinglePageFloatLayoutResult>;\n layoutPageFloatInner(\n continuation: PageFloats.PageFloatContinuation,\n strategy: PageFloats.PageFloatLayoutStrategy,\n anchorEdge: number | null,\n pageFloatFragment?: PageFloats.PageFloatFragment,\n ): Task.Result<boolean>;\n setFloatAnchorViewNode(nodeContext: Vtree.NodeContext): Vtree.NodeContext;\n resolveFloatReferenceFromColumnSpan(\n floatReference: PageFloats.FloatReference,\n columnSpan: Css.Val,\n nodeContext: Vtree.NodeContext,\n ): Task.Result<PageFloats.FloatReference>;\n layoutPageFloat(\n nodeContext: Vtree.NodeContext,\n ): Task.Result<Vtree.NodeContext>;\n createJustificationAdjustmentElement(\n insertionPoint: Node,\n doc: Document,\n parentNode: Node,\n vertical: boolean,\n ): HTMLElement;\n addAndAdjustJustificationElement(\n nodeContext: Vtree.NodeContext,\n insertAfter: boolean,\n node: Node,\n insertionPoint: Node,\n doc: Document,\n parentNode: Node,\n ): HTMLElement;\n compensateJustificationLineHeight(\n span: Element,\n br: Element,\n nodeContext: Vtree.NodeContext,\n ): void;\n /**\n * Fix justification of the last line of text broken across pages (if\n * needed).\n */\n fixJustificationIfNeeded(\n nodeContext: Vtree.NodeContext,\n endOfColumn: boolean,\n ): void;\n processLineStyling(\n nodeContext: Vtree.NodeContext,\n resNodeContext: Vtree.NodeContext,\n checkPoints: Vtree.NodeContext[],\n ): Task.Result<Vtree.NodeContext>;\n isLoneImage(checkPoints: Vtree.NodeContext[]): boolean;\n getTrailingMarginEdgeAdjustment(\n trailingEdgeContexts: Vtree.NodeContext[],\n ): number;\n /**\n * Layout a single CSS box.\n */\n layoutBreakableBlock(\n nodeContext: Vtree.NodeContext,\n ): Task.Result<Vtree.NodeContext>;\n postLayoutBlock(\n nodeContext: Vtree.NodeContext,\n checkPoints: Vtree.NodeContext[],\n ): void;\n findEndOfLine(\n linePosition: number,\n checkPoints: Vtree.NodeContext[],\n isUpdateMaxReachedAfterEdge: boolean,\n ): {\n nodeContext: Vtree.NodeContext;\n index: number;\n checkPointIndex: number;\n };\n findAcceptableBreakInside(\n checkPoints: Vtree.NodeContext[],\n edgePosition: number,\n force: boolean,\n ): Vtree.NodeContext;\n resolveTextNodeBreaker(nodeContext: Vtree.NodeContext): TextNodeBreaker;\n /**\n * Read ranges skipping special elments\n */\n getRangeBoxes(start: Node, end: Node): Vtree.ClientRect[];\n /**\n * Give block's initial and final nodes, find positions of the line bottoms.\n * This is, of course, somewhat hacky implementation.\n * @return position of line breaks\n */\n findLinePositions(checkPoints: Vtree.NodeContext[]): number[];\n calculateClonedPaddingBorder(nodeContext: Vtree.NodeContext): number;\n findBoxBreakPosition(\n bp: BoxBreakPosition,\n force: boolean,\n ): Vtree.NodeContext;\n getAfterEdgeOfBlockContainer(nodeContext: Vtree.NodeContext): number;\n findFirstOverflowingEdgeAndCheckPoint(\n checkPoints: Vtree.NodeContext[],\n ): { edge: number; checkPoint: Vtree.NodeContext | null };\n findEdgeBreakPosition(bp: EdgeBreakPosition): Vtree.NodeContext;\n /**\n * Finalize a line break.\n * @return holing true\n */\n finishBreak(\n nodeContext: Vtree.NodeContext,\n forceRemoveSelf: boolean,\n endOfColumn: boolean,\n ): Task.Result<boolean>;\n findAcceptableBreakPosition(): BreakPositionAndNodeContext;\n doFinishBreak(\n nodeContext: Vtree.NodeContext,\n overflownNodeContext: Vtree.NodeContext,\n initialNodeContext: Vtree.NodeContext,\n initialComputedBlockSize: number,\n ): Task.Result<Vtree.NodeContext>;\n /**\n * Determines if a page break is acceptable at this position\n */\n isBreakable(flowPosition: Vtree.NodeContext): boolean;\n /**\n * Determines if an indent value is zero\n */\n zeroIndent(val: string | number): boolean;\n /**\n * @return true if overflows\n */\n checkOverflowAndSaveEdge(\n nodeContext: Vtree.NodeContext,\n trailingEdgeContexts: Vtree.NodeContext[],\n ): boolean;\n /**\n * Save a possible page break position on a CSS block edge. Check if it\n * overflows.\n * @return true if overflows\n */\n checkOverflowAndSaveEdgeAndBreakPosition(\n nodeContext: Vtree.NodeContext,\n trailingEdgeContexts: Vtree.NodeContext[],\n saveEvenOverflown: boolean,\n breakAtTheEdge: string | null,\n ): boolean;\n applyClearance(nodeContext: Vtree.NodeContext): boolean;\n isBFC(formattingContext: Vtree.FormattingContext): boolean;\n /**\n * Skips positions until either the start of unbreakable block or inline\n * content. Also sets breakBefore on the result combining break-before and\n * break-after properties from all elements that meet at the edge.\n */\n skipEdges(\n nodeContext: Vtree.NodeContext,\n leadingEdge: boolean,\n forcedBreakValue: string | null,\n ): Task.Result<Vtree.NodeContext>;\n /**\n * Skips non-renderable positions until it hits the end of the flow or some\n * renderable content. Returns the nodeContext that was passed in if some\n * content remains and null if all content could be skipped.\n */\n skipTailEdges(\n nodeContext: Vtree.NodeContext,\n ): Task.Result<Vtree.NodeContext>;\n layoutFloatOrFootnote(\n nodeContext: Vtree.NodeContext,\n ): Task.Result<Vtree.NodeContext>;\n /**\n * Layout next portion of the source.\n */\n layoutNext(\n nodeContext: Vtree.NodeContext,\n leadingEdge: boolean,\n forcedBreakValue?: string | null,\n ): Task.Result<Vtree.NodeContext>;\n clearOverflownViewNodes(\n nodeContext: Vtree.NodeContext,\n removeSelf: boolean,\n ): void;\n initGeom(): void;\n init(): void;\n /**\n * Save the potential breaking position at the edge. Should, in general, save\n * \"after\" position but only after skipping all of the \"before\" ones and\n * getting to the non-empty content (to get breakAtEdge right).\n */\n saveEdgeBreakPosition(\n position: Vtree.NodeContext,\n breakAtEdge: string | null,\n overflows: boolean,\n ): void;\n /**\n * @param checkPoints array of breaking points for breakable block\n */\n saveBoxBreakPosition(checkPoints: Vtree.NodeContext[]): void;\n updateMaxReachedAfterEdge(afterEdge: number): void;\n /**\n * @param chunkPosition starting position.\n * @return holding end position.\n */\n layout(\n chunkPosition: Vtree.ChunkPosition,\n leadingEdge: boolean,\n breakAfter?: string | null,\n ): Task.Result<Vtree.ChunkPosition>;\n isFullWithPageFloats(): boolean;\n getMaxBlockSizeOfPageFloats(): number;\n doFinishBreakOfFragmentLayoutConstraints(nodeContext): void;\n /**\n * @param nodeContext starting position.\n * @return holding end position.\n */\n doLayout(\n nodeContext: Vtree.NodeContext,\n leadingEdge: boolean,\n breakAfter?: string | null,\n ): Task.Result<{\n nodeContext: Vtree.NodeContext;\n overflownNodeContext: Vtree.NodeContext;\n }>;\n /**\n * Re-layout already laid-out chunks. Return the position of the last flow if\n * there is an overflow.\n * TODO: deal with chunks that did not fit at all.\n * @return holding end position.\n */\n redoLayout(): Task.Result<Vtree.ChunkPosition>;\n saveDistanceToBlockEndFloats(): void;\n collectElementsOffset(): RepetitiveElement.ElementsOffset[];\n }\n\n export type SinglePageFloatLayoutResult = {\n floatArea: PageFloatArea | null;\n pageFloatFragment: PageFloats.PageFloatFragment | null;\n newPosition: Vtree.ChunkPosition | null;\n };\n\n /**\n * breaking point resolver for Text Node.\n */\n export interface TextNodeBreaker {\n breakTextNode(\n textNode: Text,\n nodeContext: Vtree.NodeContext,\n low: number,\n checkPoints: Vtree.NodeContext[],\n checkpointIndex: number,\n force: boolean,\n ): Vtree.NodeContext;\n breakAfterSoftHyphen(\n textNode: Text,\n text: string,\n viewIndex: number,\n nodeContext: Vtree.NodeContext,\n ): number;\n breakAfterOtherCharacter(\n textNode: Text,\n text: string,\n viewIndex: number,\n nodeContext: Vtree.NodeContext,\n ): number;\n updateNodeContext(\n nodeContext: Vtree.NodeContext,\n viewIndex: number,\n textNode: Text,\n ): Vtree.NodeContext;\n }\n\n export interface LayoutMode {\n doLayout(\n nodeContext: Vtree.NodeContext,\n column: Layout.Column,\n ): Task.Result<Vtree.NodeContext>;\n accept(nodeContext: Vtree.NodeContext, column: Layout.Column): boolean;\n postLayout(\n positionAfter: Vtree.NodeContext,\n initialPosition: Vtree.NodeContext,\n column: Layout.Column,\n accepted: boolean,\n ): boolean;\n }\n\n export interface PageFloatArea extends Column {\n adjustContentRelativeSize: boolean;\n readonly floatSide: string;\n readonly parentContainer: Vtree.Container;\n\n convertPercentageSizesToPx(target: Element): void;\n fixFloatSizeAndPosition(nodeContext: Vtree.NodeContext): void;\n getContentInlineSize(): number;\n }\n}\n\nexport namespace LayoutProcessor {\n export interface BlockFormattingContext extends Vtree.FormattingContext {}\n\n export function isInstanceOfBlockFormattingContext(\n object: Vtree.FormattingContext,\n ): object is BlockFormattingContext {\n return object && object.formattingContextType === \"Block\";\n }\n}\n\nexport namespace Net {\n export type Response = {\n status: number;\n statusText: string | null;\n url: string;\n contentType: string | null;\n responseText: string | null;\n responseXML: Document;\n responseBlob: Blob;\n };\n\n export interface ResourceStore<Resource> {\n resources: { [key: string]: Resource };\n fetchers: { [key: string]: TaskUtil.Fetcher<Resource> };\n readonly parser: (\n p1: Response,\n p2: ResourceStore<Resource>,\n ) => Task.Result<Resource>;\n readonly type: XMLHttpRequestResponseType;\n\n /**\n * @return resource for the given URL\n */\n load(\n url: string,\n opt_required?: boolean,\n opt_message?: string,\n ): Task.Result<Resource>;\n /**\n * @return fetcher for the resource for the given URL\n */\n fetch(\n url: string,\n opt_required?: boolean,\n opt_message?: string,\n ): TaskUtil.Fetcher<Resource>;\n get(url: string): XmlDoc.XMLDocHolder;\n delete(url: string): void;\n }\n}\n\nexport namespace PageFloats {\n /**\n * @enum {string}\n */\n export enum FloatReference {\n INLINE = \"inline\",\n COLUMN = \"column\",\n REGION = \"region\",\n PAGE = \"page\",\n }\n\n export type PageFloatID = string;\n\n export interface PageFloat {\n order: number | null;\n id: PageFloatID | null;\n readonly nodePosition: Vtree.NodePosition;\n readonly floatReference: FloatReference;\n readonly floatSide: string;\n readonly clearSide: string | null;\n readonly flowName: string;\n readonly floatMinWrapBlock: Css.Numeric | null;\n\n getOrder(): number;\n getId(): PageFloatID;\n isAllowedOnContext(pageFloatLayoutContext: PageFloatLayoutContext): boolean;\n isAllowedToPrecede(other: PageFloat): boolean;\n }\n\n export interface PageFloatFragment {\n readonly floatReference: FloatReference;\n readonly floatSide: string;\n readonly continuations: PageFloatContinuation[];\n readonly area: Vtree.Container;\n readonly continues: boolean;\n\n hasFloat(float: PageFloat): boolean;\n findNotAllowedFloat(context: PageFloatLayoutContext): PageFloat | null;\n getOuterShape(): GeometryUtil.Shape;\n getOuterRect(): GeometryUtil.Rect;\n getOrder(): number;\n shouldBeStashedBefore(float: PageFloat): boolean;\n addContinuations(continuations: PageFloatContinuation[]): void;\n getFlowName(): string;\n }\n\n export interface PageFloatContinuation {\n readonly float: PageFloat;\n readonly nodePosition: Vtree.NodePosition;\n\n equals(other: PageFloatContinuation | null): boolean;\n }\n\n export type PageFloatPlacementCondition = {\n [key: string]: boolean;\n };\n\n export interface PageFloatLayoutContext {\n writingMode: Css.Val;\n direction: Css.Val;\n floatFragments: PageFloatFragment[];\n readonly parent: PageFloatLayoutContext;\n readonly flowName: string | null;\n readonly generatingNodePosition: Vtree.NodePosition | null;\n\n getContainer(floatReference?: FloatReference): Vtree.Container;\n setContainer(container: Vtree.Container);\n addPageFloat(float: PageFloat): void;\n getPageFloatLayoutContext(\n floatReference: FloatReference,\n ): PageFloatLayoutContext;\n findPageFloatByNodePosition(\n nodePosition: Vtree.NodePosition,\n ): PageFloat | null;\n isForbidden(float: PageFloat): boolean;\n addPageFloatFragment(\n floatFragment: PageFloatFragment,\n dontInvalidate?: boolean,\n ): void;\n removePageFloatFragment(\n floatFragment: PageFloatFragment,\n dontInvalidate?: boolean,\n ): void;\n findPageFloatFragment(float: PageFloat): PageFloatFragment | null;\n hasFloatFragments(condition?: (p1: PageFloatFragment) => boolean): boolean;\n hasContinuingFloatFragmentsInFlow(flowName: string): boolean;\n registerPageFloatAnchor(float: PageFloat, anchorViewNode: Node): void;\n collectPageFloatAnchors(): any;\n isAnchorAlreadyAppeared(floatId: PageFloatID): boolean;\n deferPageFloat(continuation: PageFloatContinuation): void;\n hasPrecedingFloatsDeferredToNext(\n float: PageFloat,\n ignoreReference?: boolean,\n ): boolean;\n getLastFollowingFloatInFragments(float: PageFloat): PageFloat | null;\n getDeferredPageFloatContinuations(\n flowName?: string | null,\n ): PageFloatContinuation[];\n getPageFloatContinuationsDeferredToNext(\n flowName?: string | null,\n ): PageFloatContinuation[];\n getFloatsDeferredToNextInChildContexts(): PageFloat[];\n checkAndForbidNotAllowedFloat(): boolean;\n checkAndForbidFloatFollowingDeferredFloat(): boolean;\n finish(): void;\n hasSameContainerAs(other: PageFloatLayoutContext): boolean;\n invalidate(): void;\n detachChildren(): PageFloatLayoutContext[];\n attachChildren(children: PageFloatLayoutContext[]): void;\n isInvalidated(): boolean;\n validate(): void;\n removeEndFloatFragments(floatSide: string): void;\n stashEndFloatFragments(float: PageFloat): void;\n restoreStashedFragments(floatReference: FloatReference): void;\n discardStashedFragments(floatReference: FloatReference): void;\n getStashedFloatFragments(\n floatReference: FloatReference,\n ): PageFloatFragment[];\n /**\n * @param anchorEdge Null indicates that the anchor is not in the current\n * container.\n * @return Logical float side (snap-block is resolved when init=false). Null\n * indicates that the float area does not fit inside the container\n */\n setFloatAreaDimensions(\n area: Layout.PageFloatArea,\n floatReference: FloatReference,\n floatSide: string,\n anchorEdge: number | null,\n init: boolean,\n force: boolean,\n condition: PageFloatPlacementCondition,\n ): string | null;\n getFloatFragmentExclusions(): GeometryUtil.Shape[];\n getMaxReachedAfterEdge(): number;\n getBlockStartEdgeOfBlockEndFloats(): number;\n getPageFloatClearEdge(clear: string, column: Layout.Column): number;\n getPageFloatPlacementCondition(\n float: PageFloat,\n floatSide: string,\n clearSide: string | null,\n ): PageFloatPlacementCondition;\n getLayoutConstraints(): Layout.LayoutConstraint[];\n addLayoutConstraint(\n layoutConstraint: Layout.LayoutConstraint,\n floatReference: FloatReference,\n ): void;\n getMaxBlockSizeOfPageFloats(): number;\n lock(): void;\n unlock(): void;\n isLocked(): boolean;\n }\n\n export interface PageFloatLayoutStrategy {\n appliesToNodeContext(nodeContext: Vtree.NodeContext): boolean;\n appliesToFloat(float: PageFloat): boolean;\n createPageFloat(\n nodeContext: Vtree.NodeContext,\n pageFloatLayoutContext: PageFloatLayoutContext,\n column: Layout.Column,\n ): Task.Result<PageFloat>;\n createPageFloatFragment(\n continuations: PageFloatContinuation[],\n floatSide: string,\n floatArea: Layout.PageFloatArea,\n continues: boolean,\n ): PageFloatFragment;\n findPageFloatFragment(\n float: PageFloat,\n pageFloatLayoutContext: PageFloatLayoutContext,\n ): PageFloatFragment | null;\n adjustPageFloatArea(\n floatArea: Layout.PageFloatArea,\n floatContainer: Vtree.Container,\n column: Layout.Column,\n );\n forbid(float: PageFloat, pageFloatLayoutContext: PageFloatLayoutContext);\n }\n}\n\nexport namespace Selectors {\n export interface AfterIfContinues {\n readonly sourceNode: Element;\n readonly styler: PseudoElement.PseudoelementStyler;\n\n createElement(\n column: Layout.Column,\n parentNodeContext: Vtree.NodeContext,\n ): Task.Result<Element>;\n }\n\n export interface AfterIfContinuesLayoutConstraint\n extends Layout.FragmentLayoutConstraint {\n nodeContext: Vtree.NodeContext;\n afterIfContinues: AfterIfContinues;\n pseudoElementHeight: number;\n\n getRepetitiveElements(): AfterIfContinuesElementsOffset;\n }\n\n export function isInstanceOfAfterIfContinuesLayoutConstraint(\n object: Layout.FragmentLayoutConstraint,\n ): object is AfterIfContinuesLayoutConstraint {\n return object && object.flagmentLayoutConstraintType == \"AfterIfContinue\";\n }\n\n export interface AfterIfContinuesElementsOffset\n extends RepetitiveElement.ElementsOffset {\n nodeContext: Vtree.NodeContext;\n pseudoElementHeight: number;\n\n affectTo(nodeContext: Vtree.NodeContext): boolean;\n }\n}\n\nexport namespace PseudoElement {\n export interface PseudoelementStyler extends CssStyler.AbstractStyler {\n contentProcessed: { [key: string]: boolean };\n readonly element: Element;\n style: CssCascade.ElementStyle;\n styler: CssStyler.AbstractStyler;\n readonly context: Exprs.Context;\n readonly exprContentListener: Vtree.ExprContentListener;\n }\n}\n\nexport namespace RepetitiveElement {\n export interface RepetitiveElementsOwnerFormattingContext\n extends Vtree.FormattingContext {\n isRoot: boolean;\n repetitiveElements: RepetitiveElements;\n readonly parent: Vtree.FormattingContext;\n readonly rootSourceNode: Element;\n getRepetitiveElements(): RepetitiveElements;\n getRootViewNode(position: Vtree.NodeContext): Element | null;\n getRootNodeContext(\n nodeContext: Vtree.NodeContext,\n ): Vtree.NodeContext | null;\n initializeRepetitiveElements(vertical: boolean): void;\n }\n\n export function isInstanceOfRepetitiveElementsOwnerFormattingContext(\n object: Vtree.FormattingContext,\n ): object is RepetitiveElementsOwnerFormattingContext {\n if (!object) {\n return false;\n }\n const type = object.formattingContextType;\n return (\n type === \"RepetitiveElementsOwner\" ||\n Table.isInstanceOfTableFormattingContext(object)\n ); // subset\n }\n\n export interface ElementsOffset {\n calculateOffset(nodeContext: Vtree.NodeContext): number;\n calculateMinimumOffset(nodeContext: Vtree.NodeContext): number;\n }\n\n export interface RepetitiveElements extends ElementsOffset {\n isSkipHeader: boolean;\n isSkipFooter: boolean;\n enableSkippingFooter: boolean;\n enableSkippingHeader: boolean;\n doneInitialLayout: boolean;\n firstContentSourceNode: Element | null;\n lastContentSourceNode: Element | null;\n allowInsert: boolean;\n allowInsertRepeatitiveElements: boolean;\n ownerSourceNode: Element;\n\n setHeaderNodeContext(nodeContext: Vtree.NodeContext): void;\n setFooterNodeContext(nodeContext: Vtree.NodeContext): void;\n updateHeight(column: Layout.Column): void;\n prepareLayoutFragment(): void;\n appendHeaderToFragment(\n rootNodeContext: Vtree.NodeContext,\n firstChild: Node | null,\n column: Layout.Column,\n ): Task.Result<boolean>;\n appendFooterToFragment(\n rootNodeContext: Vtree.NodeContext,\n firstChild: Node | null,\n column: Layout.Column,\n ): Task.Result<boolean>;\n appendElementToFragment(\n nodePosition: Vtree.NodePosition,\n rootNodeContext: Vtree.NodeContext,\n firstChild: Node | null,\n column: Layout.Column,\n ): Task.Result<boolean>;\n moveChildren(from: Element, to: Element, firstChild: Node | null): void;\n isAfterLastContent(nodeContext: Vtree.NodeContext): boolean;\n isFirstContentNode(nodeContext: Vtree.NodeContext): boolean;\n isEnableToUpdateState(): boolean;\n updateState(): void;\n preventSkippingHeader(): void;\n preventSkippingFooter(): void;\n isHeaderRegistered(): boolean;\n isFooterRegistered(): boolean;\n isHeaderSourceNode(node: Node): boolean;\n isFooterSourceNode(node: Node): boolean;\n }\n\n export interface RepetitiveElementsOwnerLayoutConstraint\n extends Layout.FragmentLayoutConstraint {\n getRepetitiveElements(): RepetitiveElements;\n }\n\n export function isInstanceOfRepetitiveElementsOwnerLayoutConstraint(\n object: Layout.FragmentLayoutConstraint,\n ): object is RepetitiveElementsOwnerLayoutConstraint {\n if (!object) {\n return false;\n }\n const type = object.flagmentLayoutConstraintType;\n return (\n type === \"RepetitiveElementsOwner\" ||\n Table.isInstanceOfTableRowLayoutConstraint(object)\n ); // subset\n }\n}\n\nexport namespace Table {\n export interface TableFormattingContext\n extends RepetitiveElement.RepetitiveElementsOwnerFormattingContext {\n // FIXME\n }\n\n export function isInstanceOfTableFormattingContext(\n object: Vtree.FormattingContext,\n ): object is TableFormattingContext {\n return object && object.formattingContextType === \"Table\";\n }\n\n export interface TableRowLayoutConstraint\n extends RepetitiveElement.RepetitiveElementsOwnerLayoutConstraint {\n cellFragmentLayoutConstraints: {\n constraints: Layout.FragmentLayoutConstraint[];\n breakPosition: Vtree.NodeContext;\n }[];\n\n removeDummyRowNodes(nodeContext: Vtree.NodeContext): void;\n getElementsOffsetsForTableCell(\n column: Layout.Column,\n ): RepetitiveElement.ElementsOffset[];\n }\n\n export function isInstanceOfTableRowLayoutConstraint(\n object: Layout.FragmentLayoutConstraint,\n ): object is TableRowLayoutConstraint {\n return object && object.flagmentLayoutConstraintType === \"TableRow\";\n }\n}\n\nexport namespace Vtree {\n export type ClientRect = {\n left: number;\n top: number;\n right: number;\n bottom: number;\n width: number;\n height: number;\n };\n\n /**\n * Interface to read the position assigned to the elements and ranges by the\n * browser.\n */\n export interface ClientLayout {\n getRangeClientRects(range: Range): ClientRect[];\n getElementClientRect(element: Element): ClientRect;\n /**\n * @return element's computed style\n */\n getElementComputedStyle(element: Element): CSSStyleDeclaration;\n }\n\n /**\n * Styling, creating a single node's view, etc.\n */\n export interface LayoutContext {\n /**\n * Creates a functionally equivalent, but uninitialized layout context,\n * suitable for building a separate column.\n */\n clone(): LayoutContext;\n /**\n * Set the current source node and create a view. Parameter firstTime\n * is true (and possibly offsetInNode > 0) if node was broken on\n * the previous page.\n * @return true if children should be processed as well\n */\n setCurrent(\n nodeContext: NodeContext,\n firstTime: boolean,\n atUnforcedBreak?: boolean,\n ): Task.Result<boolean>;\n /**\n * Set the container element that holds view elements produced from the\n * source.\n */\n setViewRoot(viewRoot: Element, isFootnote: boolean);\n /**\n * Moves to the next view node, creating it and appending it to the view tree\n * if needed.\n * @return that corresponds to the next view node\n */\n nextInTree(\n nodeContext: NodeContext,\n atUnforcedBreak?: boolean,\n ): Task.Result<NodeContext>;\n /**\n * Apply pseudo-element styles (if any).\n * @param target element to apply styles to\n */\n applyPseudoelementStyle(\n nodeContext: NodeContext,\n pseudoName: string,\n target: Element,\n ): void;\n /**\n * Apply styles to footnote container.\n * @param target element to apply styles to\n * @return vertical\n */\n applyFootnoteStyle(\n vertical: boolean,\n rtl: boolean,\n target: Element,\n ): boolean;\n /**\n * Peel off innermost first-XXX pseudoelement, create and create view nodes\n * after the end of that pseudoelement.\n */\n peelOff(\n nodeContext: NodeContext,\n nodeOffset: number,\n ): Task.Result<NodeContext>;\n /**\n * Process a block-end edge of a fragmented block.\n */\n processFragmentedBlockEdge(nodeContext: NodeContext);\n convertLengthToPx(\n numeric: Css.Numeric,\n viewNode: Node,\n clientLayout: ClientLayout,\n ): number | Css.Numeric;\n /**\n * Returns if two NodePositions represents the same position in the document.\n */\n isSameNodePosition(\n nodePosition1: NodePosition,\n nodePosition2: NodePosition,\n ): boolean;\n addEventListener(\n type: string,\n listener: Base.EventListener,\n capture?: boolean,\n ): void;\n removeEventListener(\n type: string,\n listener: Base.EventListener,\n capture?: boolean,\n ): void;\n dispatchEvent(evt: Base.Event): void;\n }\n\n /**\n * Formatting context.\n */\n export interface FormattingContext {\n formattingContextType: FormattingContextType;\n getName(): string;\n isFirstTime(nodeContext: NodeContext, firstTime: boolean): boolean;\n getParent(): FormattingContext;\n saveState(): any;\n restoreState(state: any);\n }\n\n export type NodePositionStep = {\n node: Node;\n shadowType: ShadowType;\n shadowContext: ShadowContext | null;\n nodeShadow: ShadowContext | null;\n shadowSibling: NodePositionStep | null;\n formattingContext: FormattingContext | null;\n fragmentIndex: number;\n };\n\n export type NodePosition = {\n steps: NodePositionStep[];\n offsetInNode: number;\n after: boolean;\n preprocessedTextContent: Diff.Change[] | null;\n };\n\n /**\n * Handling of purely whitespace sequences between blocks\n * @enum {number}\n */\n export enum Whitespace {\n /**\n * Whitespace sequence between blocks is ignored\n */\n IGNORE,\n /**\n * Whitespace sequence between blocks is ignored unless it containes newline\n */\n NEWLINE,\n /**\n * Whitespace sequence between blocks is preserved\n */\n PRESERVE,\n }\n\n export interface Container {\n left: number;\n top: number;\n marginLeft: number;\n marginRight: number;\n marginTop: number;\n marginBottom: number;\n borderLeft: number;\n borderRight: number;\n borderTop: number;\n borderBottom: number;\n paddingLeft: number;\n paddingRight: number;\n paddingTop: number;\n paddingBottom: number;\n width: number;\n height: number;\n originX: number;\n originY: number;\n exclusions: GeometryUtil.Shape[];\n innerShape: GeometryUtil.Shape;\n computedBlockSize: number;\n snapWidth: number;\n snapHeight: number;\n snapOffsetX: number;\n snapOffsetY: number;\n vertical: boolean; // vertical writing\n element: Element;\n\n getInsetTop(): number;\n getInsetBottom(): number;\n getInsetLeft(): number;\n getInsetRight(): number;\n getInsetBefore(): number;\n getInsetAfter(): number;\n getInsetStart(): number;\n getInsetEnd(): number;\n getBeforeEdge(box: ClientRect): number;\n getAfterEdge(box: ClientRect): number;\n getStartEdge(box: ClientRect): number;\n getEndEdge(box: ClientRect): number;\n getInlineSize(box: ClientRect): number;\n getBoxSize(box: ClientRect): number;\n getBoxDir(): number;\n getInlineDir(): number;\n copyFrom(other: Container): void;\n setVerticalPosition(top: number, height: number): void;\n setHorizontalPosition(left: number, width: number): void;\n setBlockPosition(start: number, extent: number): void;\n setInlinePosition(start: number, extent: number): void;\n clear(): void;\n getInnerShape(): GeometryUtil.Shape;\n getInnerRect(): GeometryUtil.Rect;\n getPaddingRect(): GeometryUtil.Rect;\n getOuterShape(\n outerShapeProp: Css.Val,\n context: Exprs.Context,\n ): GeometryUtil.Shape;\n getOuterRect(): GeometryUtil.Rect;\n }\n\n /**\n * @enum {number}\n */\n export enum ShadowType {\n NONE,\n CONTENT,\n ROOTLESS,\n ROOTED,\n }\n\n /**\n * Data about shadow tree instance.\n */\n export interface ShadowContext {\n readonly owner: Element;\n readonly root: Element;\n readonly xmldoc: XmlDoc.XMLDocHolder;\n readonly parentShadow: ShadowContext;\n subShadow: ShadowContext;\n readonly type: Vtree.ShadowType;\n readonly styler: object;\n\n equals(other: ShadowContext): boolean;\n }\n\n /**\n * Information about :first-letter or :first-line pseudoelements\n * @param count 0 - first-letter, 1 or more - first line(s)\n */\n export interface FirstPseudo {\n readonly outer: FirstPseudo;\n readonly count: number;\n }\n\n /**\n * NodeContext represents a position in the document + layout-related\n * information attached to it. When after=false and offsetInNode=0, the\n * position is inside the element (node), but just before its first child.\n * When offsetInNode>0 it represents offset in the textual content of the\n * node. When after=true it represents position right after the last child\n * of the node. boxOffset is incremented by 1 for any valid node position.\n */\n export interface NodeContext {\n // position itself\n offsetInNode: number;\n after: boolean;\n shadowType: ShadowType; // parent's shadow type\n shadowContext: Vtree.ShadowContext;\n nodeShadow: Vtree.ShadowContext;\n shadowSibling: NodeContext; // next \"sibling\" in the shadow tree\n // other stuff\n shared: boolean;\n inline: boolean;\n overflow: boolean;\n breakPenalty: number;\n display: string | null;\n floatReference: PageFloats.FloatReference;\n floatSide: string | null;\n clearSide: string | null;\n floatMinWrapBlock: Css.Numeric | null;\n columnSpan: Css.Val | null;\n verticalAlign: string;\n captionSide: string;\n inlineBorderSpacing: number;\n blockBorderSpacing: number;\n flexContainer: boolean;\n whitespace: Whitespace;\n hyphenateCharacter: string | null;\n breakWord: boolean;\n establishesBFC: boolean;\n containingBlockForAbsolute: boolean;\n breakBefore: string | null;\n breakAfter: string | null;\n viewNode: Node;\n clearSpacer: Node;\n inheritedProps: { [key: string]: number | string | Css.Val };\n vertical: boolean;\n direction: string;\n firstPseudo: FirstPseudo;\n lang: string | null;\n preprocessedTextContent: Diff.Change[] | null;\n formattingContext: FormattingContext;\n repeatOnBreak: string | null;\n pluginProps: {\n [key: string]: string | number | undefined | null | (number | null)[];\n };\n fragmentIndex: number;\n afterIfContinues: Selectors.AfterIfContinues;\n footnotePolicy: Css.Ident | null;\n\n sourceNode: Node;\n parent: NodeContext;\n boxOffset: number;\n\n resetView(): void;\n modify(): NodeContext;\n copy(): NodeContext;\n clone(): NodeContext;\n toNodePositionStep(): NodePositionStep;\n toNodePosition(): NodePosition;\n isInsideBFC(): boolean;\n getContainingBlockForAbsolute(): NodeContext;\n /**\n * Walk up NodeContext tree (starting from itself) and call the callback for\n * each block.\n */\n walkUpBlocks(callback: (p1: NodeContext) => any): void;\n belongsTo(formattingContext: FormattingContext): boolean;\n }\n\n export interface ChunkPosition {\n floats: NodePosition[];\n primary: NodePosition;\n\n clone(): ChunkPosition;\n isSamePosition(other: ChunkPosition): boolean;\n }\n\n export type ExprContentListener = (\n p1: Exprs.Val,\n p2: string,\n p3: Document,\n ) => Node | null;\n}\n\nexport namespace XmlDoc {\n export interface XMLDocHolder {\n lang: string | null;\n totalOffset: number;\n root: Element;\n body: Element;\n head: Element;\n last: Element;\n lastOffset: number;\n idMap: { [key: string]: Element };\n readonly store: XMLDocStore;\n readonly url: string;\n readonly document: Document;\n\n doc(): NodeList;\n getElementOffset(element: Element): number;\n getNodeOffset(srcNode: Node, offsetInNode: number, after: boolean): number;\n getTotalOffset(): number;\n /**\n * @return last node such that its offset is less or equal to the given\n */\n getNodeByOffset(offset: number): Node;\n /**\n * Get element by URL in the source document(s). URL must be in either '#id'\n * or 'url#id' form.\n */\n getElement(url: string): Element | null;\n }\n\n export interface Predicate {\n readonly fn: (p1: Node) => boolean;\n\n check(node: Node): boolean;\n withAttribute(name: string, value: string): Predicate;\n withChild(name: string, opt_childPredicate?: Predicate): Predicate;\n }\n\n export interface NodeList {\n readonly nodes: Node[];\n\n asArray(): Node[];\n size(): number;\n /**\n * Filter with predicate\n */\n predicate(pr: Predicate): NodeList;\n forEachNode(fn: (p1: Node, p2: (p1: Node) => void) => void): NodeList;\n forEach<T>(fn: (p1: Node) => T): T[];\n forEachNonNull<T>(fn: (p1: Node) => T): T[];\n child(tag: string): NodeList;\n childElements(): NodeList;\n attribute(name: string): (string | null)[];\n textContent(): (string | null)[];\n }\n\n export type XMLDocStore = Net.ResourceStore<XMLDocHolder>;\n}\n","/**\n * Copyright 2016 Trim-marks Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Diff utility\n */\n\nimport fastdiff from \"fast-diff\";\n\nexport type Change = (number | string)[];\n\nexport function diffChars(originalText: string, newText: string): Change[] {\n return fastdiff(originalText, newText, 0);\n}\n\n/**\n * @returns string\n */\nexport function restoreOriginalText(changes: Change[]): any {\n return changes.reduce((result, item) => {\n if (item[0] === fastdiff.INSERT) {\n return result;\n }\n return result + item[1];\n }, \"\");\n}\n\n/**\n * @returns string\n */\nexport function restoreNewText(changes: Change[]): any {\n return changes.reduce((result, item) => {\n if (item[0] === fastdiff.DELETE) {\n return result;\n }\n return result + item[1];\n }, \"\");\n}\n\nexport function resolveNewIndex(changes: Change[], oldIndex: number): number {\n return resolveIndex(changes, oldIndex, 1);\n}\n\nexport function resolveOriginalIndex(\n changes: Change[],\n newIndex: number,\n): number {\n return resolveIndex(changes, newIndex, -1);\n}\n\nexport function resolveIndex(\n changes: Change[],\n index: number,\n coef: number,\n): number {\n let diff = 0;\n let current = 0;\n changes.some((change) => {\n for (let i = 0; i < (change[1] as string).length; i++) {\n switch ((change[0] as number) * coef) {\n case fastdiff.INSERT:\n diff++;\n break;\n case fastdiff.DELETE:\n diff--;\n current++;\n break;\n case fastdiff.EQUAL:\n current++;\n break;\n }\n if (current > index) {\n return true;\n }\n }\n return false;\n });\n return Math.max(Math.min(index, current - 1) + diff, 0);\n}\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2015 Trim-marks Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Vtree - Basic view tree data structures and support utilities.\n */\nimport * as Base from \"./base\";\nimport * as Constants from \"./constants\";\nimport * as Css from \"./css\";\nimport * as CssParser from \"./css-parser\";\nimport * as CssProp from \"./css-prop\";\nimport * as CssTokenizer from \"./css-tokenizer\";\nimport * as Diff from \"./diff\";\nimport * as Exprs from \"./exprs\";\nimport * as GeometryUtil from \"./geometry-util\";\nimport * as TaskUtil from \"./task-util\";\nimport { assert } from \"./asserts\";\nimport { PageFloats, Selectors, Vtree, XmlDoc } from \"./types\";\n\nexport const delayedProps = {\n transform: true,\n \"transform-origin\": true,\n};\n\nexport const delayedPropsIfRelativePositioned = {\n top: true,\n bottom: true,\n left: true,\n right: true,\n};\n\nexport class DelayedItem {\n constructor(\n public target: Element,\n public name: string,\n public value: Css.Val,\n ) {}\n}\n\nexport type PageHyperlinkEvent = {\n type: string;\n target;\n currentTarget;\n anchorElement: Element;\n href: string;\n};\n\nexport type Trigger = {\n observer: string;\n event: string;\n action: string;\n ref: string;\n};\n\nexport const actions = {\n show: function (obj) {\n obj.style.visibility = \"visible\";\n },\n hide: function (obj) {\n obj.style.visibility = \"hidden\";\n },\n play: function (obj) {\n obj.currentTime = 0;\n obj.play();\n },\n pause: function (obj) {\n obj.pause();\n },\n resume: function (obj) {\n obj.play();\n },\n mute: function (obj) {\n obj.muted = true;\n },\n unmute: function (obj) {\n obj.muted = false;\n },\n};\n\nexport function makeListener(\n refs: Element[],\n action: string,\n): EventListener | null {\n const actionFn = actions[action];\n if (actionFn) {\n return () => {\n for (let k = 0; k < refs.length; k++) {\n try {\n actionFn(refs[k]);\n } catch (err) {}\n }\n };\n }\n return null;\n}\n\nexport class Page extends Base.SimpleEventTarget {\n private static AUTO_PAGE_WIDTH_ATTRIBUTE: string =\n \"data-vivliostyle-auto-page-width\";\n private static AUTO_PAGE_HEIGHT_ATTRIBUTE: string =\n \"data-vivliostyle-auto-page-height\";\n pageAreaElement: HTMLElement | null = null;\n delayedItems: DelayedItem[] = [];\n hrefHandler: (e: Event) => void;\n elementsById: { [key: string]: Element[] } = {};\n dimensions: { width: number; height: number } = { width: 0, height: 0 };\n isFirstPage: boolean = false;\n isLastPage: boolean = false;\n isAutoPageWidth: boolean = true;\n isAutoPageHeight: boolean = true;\n spineIndex: number = 0;\n position: LayoutPosition = null;\n offset: number = -1;\n side: Constants.PageSide | null = null;\n fetchers: TaskUtil.Fetcher<{}>[] = [];\n marginBoxes: {\n top: { [key: string]: Container };\n bottom: { [key: string]: Container };\n left: { [key: string]: Container };\n right: { [key: string]: Container };\n } = { top: {}, bottom: {}, left: {}, right: {} };\n\n constructor(\n public readonly container: HTMLElement,\n public readonly bleedBox: HTMLElement,\n ) {\n super();\n this.hrefHandler = (e: Event) => {\n const anchorElement = e.currentTarget as Element;\n const href =\n anchorElement.getAttribute(\"href\") ||\n anchorElement.getAttributeNS(Base.NS.XLINK, \"href\");\n if (href) {\n const evt = {\n type: \"hyperlink\",\n target: null,\n currentTarget: null,\n anchorElement,\n href,\n preventDefault() {\n e.preventDefault();\n },\n };\n this.dispatchEvent(evt);\n }\n };\n }\n\n setAutoPageWidth(isAuto: boolean) {\n this.isAutoPageWidth = isAuto;\n if (isAuto) {\n this.container.setAttribute(Page.AUTO_PAGE_WIDTH_ATTRIBUTE, \"true\");\n } else {\n this.container.removeAttribute(Page.AUTO_PAGE_WIDTH_ATTRIBUTE);\n }\n }\n\n setAutoPageHeight(isAuto: boolean) {\n this.isAutoPageHeight = isAuto;\n if (isAuto) {\n this.container.setAttribute(Page.AUTO_PAGE_HEIGHT_ATTRIBUTE, \"true\");\n } else {\n this.container.removeAttribute(Page.AUTO_PAGE_HEIGHT_ATTRIBUTE);\n }\n }\n\n registerElementWithId(element: Element, id: string) {\n const arr = this.elementsById[id];\n if (!arr) {\n this.elementsById[id] = [element];\n } else {\n arr.push(element);\n }\n }\n\n finish(triggers: Trigger[], clientLayout: ClientLayout): void {\n // Remove ID of elements which eventually did not fit in the page\n // (Some nodes may have been removed after registration if they did not fit\n // in the page)\n Object.keys(this.elementsById).forEach((id) => {\n const elems = this.elementsById[id];\n for (let i = 0; i < elems.length; ) {\n if (this.container.contains(elems[i])) {\n i++;\n } else {\n elems.splice(i, 1);\n }\n }\n if (elems.length === 0) {\n delete this.elementsById[id];\n }\n });\n const list = this.delayedItems;\n for (let i = 0; i < list.length; i++) {\n const item = list[i];\n if (\n item.target === this.container &&\n item.name === \"transform\" &&\n !this.isAutoPageWidth &&\n !this.isAutoPageHeight\n ) {\n // When fixed page size is specified, cancel the transform property\n // set at OPFView.makePage() for the specified viewport size\n // (e.g. `<meta name=\"viewport\" content=\"width=1307, height=1920\"/>`)\n // to avoid wrong page resizing.\n continue;\n }\n Base.setCSSProperty(item.target, item.name, item.value.toString());\n }\n\n // use size of the container of the PageMasterInstance\n const rect = clientLayout.getElementClientRect(this.container);\n this.dimensions.width = rect.width;\n this.dimensions.height = rect.height;\n for (let i = 0; i < triggers.length; i++) {\n const trigger = triggers[i];\n const refs = this.elementsById[trigger.ref];\n const observers = this.elementsById[trigger.observer];\n if (refs && observers) {\n const listener = makeListener(refs, trigger.action);\n if (listener) {\n for (let k = 0; k < observers.length; k++) {\n observers[k].addEventListener(trigger.event, listener, false);\n }\n }\n }\n }\n }\n\n /**\n * Zoom page.\n * @param scale Factor to which the page will be scaled.\n */\n zoom(scale: number) {\n Base.setCSSProperty(this.container, \"transform\", `scale(${scale})`);\n }\n\n /**\n * Returns the page area element.\n */\n getPageAreaElement(): HTMLElement {\n return this.pageAreaElement || this.container;\n }\n}\n\nexport type Spread = {\n left: Page;\n right: Page;\n};\n\n/**\n * Marks an element as \"special\". It should not be used in bbox calculations.\n */\nexport const SPECIAL_ATTR = \"data-adapt-spec\";\n\nexport const Whitespace = Vtree.Whitespace;\nexport type Whitespace = Vtree.Whitespace; // eslint-disable-line no-redeclare\n\n/**\n * Resolves Whitespace value from a value of 'white-space' property\n * @param whitespace The value of 'white-space' property\n */\nexport function whitespaceFromPropertyValue(\n whitespace: string,\n): Whitespace | null {\n switch (whitespace) {\n case \"normal\":\n case \"nowrap\":\n return Whitespace.IGNORE;\n case \"pre-line\":\n return Whitespace.NEWLINE;\n case \"pre\":\n case \"pre-wrap\":\n return Whitespace.PRESERVE;\n default:\n return null;\n }\n}\n\nexport function canIgnore(node: Node, whitespace: Whitespace): boolean {\n if (node.nodeType == 1) {\n return false;\n }\n const text = node.textContent;\n switch (whitespace) {\n case Whitespace.IGNORE:\n return !!text.match(/^\\s*$/);\n case Whitespace.NEWLINE:\n return !!text.match(/^[ \\t\\f]*$/);\n case Whitespace.PRESERVE:\n return text.length == 0;\n }\n throw new Error(`Unexpected whitespace: ${whitespace}`);\n}\n\nexport class Flow {\n forcedBreakOffsets = [] as number[];\n formattingContext: FormattingContext | null = null;\n\n constructor(\n public readonly flowName: string,\n public readonly parentFlowName: string | null,\n ) {}\n}\n\nexport class FlowChunk {\n startPage: number = -1;\n\n constructor(\n public flowName: string,\n public element: Element,\n public startOffset: number,\n public priority: number,\n public linger: number,\n public exclusive: boolean,\n public repeated: boolean,\n public last: boolean,\n public breakBefore: string | null,\n ) {}\n\n isBetter(other: FlowChunk): boolean {\n if (!this.exclusive) {\n return false;\n }\n if (!other.exclusive) {\n return true;\n }\n if (this.priority > other.priority) {\n return true;\n }\n return this.last;\n }\n}\n\nexport type ClientRect = Vtree.ClientRect;\n\nexport function clientrectIncreasingTop(\n r1: ClientRect,\n r2: ClientRect,\n): number {\n return r1.top - r2.top;\n}\n\nexport function clientrectDecreasingRight(\n r1: ClientRect,\n r2: ClientRect,\n): number {\n return r2.right - r1.right;\n}\n\n/**\n * Interface to read the position assigned to the elements and ranges by the\n * browser.\n */\nexport type ClientLayout = Vtree.ClientLayout;\n\n/**\n * Styling, creating a single node's view, etc.\n */\nexport type LayoutContext = Vtree.LayoutContext;\n\n/**\n * Formatting context.\n */\nexport type FormattingContext = Vtree.FormattingContext;\n\nexport function eachAncestorFormattingContext(\n nodeContext: NodeContext,\n callback: (p1: FormattingContext) => any,\n): void {\n if (!nodeContext) {\n return;\n }\n for (let fc = nodeContext.formattingContext; fc; fc = fc.getParent()) {\n callback(fc);\n }\n}\n\nexport type NodePositionStep = Vtree.NodePositionStep;\n\nexport function isSameNodePositionStep(\n nps1: NodePositionStep,\n nps2: NodePositionStep,\n): boolean {\n if (nps1 === nps2) {\n return true;\n }\n if (!nps1 || !nps2) {\n return false;\n }\n return (\n nps1.node === nps2.node &&\n nps1.shadowType === nps2.shadowType &&\n isSameShadowContext(nps1.shadowContext, nps2.shadowContext) &&\n isSameShadowContext(nps1.nodeShadow, nps2.nodeShadow) &&\n isSameNodePositionStep(nps1.shadowSibling, nps2.shadowSibling)\n );\n}\n\nexport type NodePosition = Vtree.NodePosition;\n\nexport function isSameNodePosition(\n np1: NodePosition | null,\n np2: NodePosition | null,\n): boolean {\n if (np1 === np2) {\n return true;\n }\n if (!np1 || !np2) {\n return false;\n }\n if (\n np1.offsetInNode !== np2.offsetInNode ||\n np1.after !== np2.after ||\n np1.steps.length !== np2.steps.length\n ) {\n return false;\n }\n for (let i = 0; i < np1.steps.length; i++) {\n if (!isSameNodePositionStep(np1.steps[i], np2.steps[i])) {\n return false;\n }\n }\n return true;\n}\n\nexport function newNodePositionFromNode(node: Node): NodePosition {\n const step: NodePositionStep = {\n node,\n shadowType: ShadowType.NONE,\n shadowContext: null,\n nodeShadow: null,\n shadowSibling: null,\n formattingContext: null,\n fragmentIndex: 0,\n };\n return {\n steps: [step],\n offsetInNode: 0,\n after: false,\n preprocessedTextContent: null,\n };\n}\n\nexport function newNodePositionFromNodeContext(\n nodeContext: Vtree.NodeContext,\n initialFragmentIndex: number | null,\n): NodePosition {\n const step: NodePositionStep = {\n node: nodeContext.sourceNode,\n shadowType: ShadowType.NONE,\n shadowContext: nodeContext.shadowContext,\n nodeShadow: null,\n shadowSibling: null,\n formattingContext: null,\n fragmentIndex:\n initialFragmentIndex != null\n ? initialFragmentIndex\n : nodeContext.fragmentIndex,\n };\n return {\n steps: [step],\n offsetInNode: 0,\n after: false,\n preprocessedTextContent: nodeContext.preprocessedTextContent,\n };\n}\n\nexport function makeNodeContextFromNodePositionStep(\n step: NodePositionStep,\n parent: Vtree.NodeContext,\n): NodeContext {\n const nodeContext = new NodeContext(step.node, parent as NodeContext, 0);\n nodeContext.shadowType = step.shadowType;\n nodeContext.shadowContext = step.shadowContext;\n nodeContext.nodeShadow = step.nodeShadow;\n nodeContext.shadowSibling = step.shadowSibling\n ? makeNodeContextFromNodePositionStep(step.shadowSibling, parent.copy())\n : null;\n nodeContext.formattingContext = step.formattingContext;\n nodeContext.fragmentIndex = step.fragmentIndex + 1;\n return nodeContext;\n}\n\nexport const ShadowType = Vtree.ShadowType;\nexport type ShadowType = Vtree.ShadowType; // eslint-disable-line no-redeclare\n\n/**\n * Data about shadow tree instance.\n */\nexport class ShadowContext implements Vtree.ShadowContext {\n subShadow: ShadowContext = null;\n\n constructor(\n public readonly owner: Element,\n public readonly root: Element,\n public readonly xmldoc: XmlDoc.XMLDocHolder,\n public readonly parentShadow: ShadowContext,\n superShadow: ShadowContext,\n public readonly type: ShadowType,\n public readonly styler: object,\n ) {\n if (superShadow) {\n superShadow.subShadow = this;\n }\n }\n\n equals(other: ShadowContext): boolean {\n if (!other) {\n return false;\n }\n return (\n this.owner === other.owner &&\n this.xmldoc === other.xmldoc &&\n this.type === other.type &&\n isSameShadowContext(this.parentShadow, other.parentShadow)\n );\n }\n}\n\nexport function isSameShadowContext(\n sc1: ShadowContext,\n sc2: ShadowContext,\n): boolean {\n return sc1 === sc2 || (!!sc1 && !!sc2 && sc1.equals(sc2));\n}\n\n/**\n * Information about :first-letter or :first-line pseudoelements\n * @param count 0 - first-letter, 1 or more - first line(s)\n */\nexport class FirstPseudo implements Vtree.FirstPseudo {\n constructor(\n public readonly outer: FirstPseudo,\n public readonly count: number,\n ) {}\n}\n\n/**\n * NodeContext represents a position in the document + layout-related\n * information attached to it. When after=false and offsetInNode=0, the\n * position is inside the element (node), but just before its first child.\n * When offsetInNode>0 it represents offset in the textual content of the\n * node. When after=true it represents position right after the last child\n * of the node. boxOffset is incremented by 1 for any valid node position.\n */\nexport class NodeContext implements Vtree.NodeContext {\n // position itself\n offsetInNode: number = 0;\n after: boolean = false;\n shadowType: ShadowType;\n\n // parent's shadow type\n shadowContext: ShadowContext;\n nodeShadow: ShadowContext = null;\n shadowSibling: NodeContext = null;\n\n // next \"sibling\" in the shadow tree\n // other stuff\n shared: boolean = false;\n inline: boolean = true;\n overflow: boolean = false;\n breakPenalty: number;\n display: string | null = null;\n floatReference: PageFloats.FloatReference;\n floatSide: string | null = null;\n clearSide: string | null = null;\n floatMinWrapBlock: Css.Numeric | null = null;\n columnSpan: Css.Val | null = null;\n verticalAlign: string = \"baseline\";\n captionSide: string = \"top\";\n inlineBorderSpacing: number = 0;\n blockBorderSpacing: number = 0;\n flexContainer: boolean = false;\n whitespace: Whitespace;\n hyphenateCharacter: string | null;\n breakWord: boolean;\n establishesBFC: boolean = false;\n containingBlockForAbsolute: boolean = false;\n breakBefore: string | null = null;\n breakAfter: string | null = null;\n viewNode: Node = null;\n clearSpacer: Node = null;\n inheritedProps: { [key: string]: number | string | Css.Val };\n vertical: boolean;\n direction: string;\n firstPseudo: FirstPseudo;\n lang: string | null = null;\n preprocessedTextContent: Diff.Change[] | null = null;\n formattingContext: FormattingContext;\n repeatOnBreak: string | null = null;\n pluginProps: {\n [key: string]: string | number | undefined | null | (number | null)[];\n } = {};\n fragmentIndex: number = 1;\n afterIfContinues: Selectors.AfterIfContinues = null;\n footnotePolicy: Css.Ident | null = null;\n\n constructor(\n public sourceNode: Node,\n public parent: NodeContext,\n public boxOffset: number,\n ) {\n this.shadowType = ShadowType.NONE;\n this.shadowContext = parent ? parent.shadowContext : null;\n this.breakPenalty = parent ? parent.breakPenalty : 0;\n this.floatReference = PageFloats.FloatReference.INLINE;\n this.whitespace = parent ? parent.whitespace : Whitespace.IGNORE;\n this.hyphenateCharacter = parent ? parent.hyphenateCharacter : null;\n this.breakWord = parent ? parent.breakWord : false;\n this.inheritedProps = parent ? parent.inheritedProps : {};\n this.vertical = parent ? parent.vertical : false;\n this.direction = parent ? parent.direction : \"ltr\";\n this.firstPseudo = parent ? parent.firstPseudo : null;\n this.formattingContext = parent ? parent.formattingContext : null;\n }\n\n resetView(): void {\n this.inline = true;\n this.breakPenalty = this.parent ? this.parent.breakPenalty : 0;\n this.viewNode = null;\n this.clearSpacer = null;\n this.offsetInNode = 0;\n this.after = false;\n this.display = null;\n this.floatReference = PageFloats.FloatReference.INLINE;\n this.floatSide = null;\n this.clearSide = null;\n this.floatMinWrapBlock = null;\n this.columnSpan = null;\n this.verticalAlign = \"baseline\";\n this.flexContainer = false;\n this.whitespace = this.parent ? this.parent.whitespace : Whitespace.IGNORE;\n this.hyphenateCharacter = this.parent\n ? this.parent.hyphenateCharacter\n : null;\n this.breakWord = this.parent ? this.parent.breakWord : false;\n this.breakBefore = null;\n this.breakAfter = null;\n this.nodeShadow = null;\n this.establishesBFC = false;\n this.containingBlockForAbsolute = false;\n this.vertical = this.parent ? this.parent.vertical : false;\n this.nodeShadow = null;\n this.preprocessedTextContent = null;\n this.formattingContext = this.parent ? this.parent.formattingContext : null;\n this.repeatOnBreak = null;\n this.pluginProps = {};\n this.fragmentIndex = 1;\n this.afterIfContinues = null;\n this.footnotePolicy = null;\n }\n\n private cloneItem(): NodeContext {\n const np = new NodeContext(this.sourceNode, this.parent, this.boxOffset);\n np.offsetInNode = this.offsetInNode;\n np.after = this.after;\n np.nodeShadow = this.nodeShadow;\n np.shadowType = this.shadowType;\n np.shadowContext = this.shadowContext;\n np.shadowSibling = this.shadowSibling;\n np.inline = this.inline;\n np.breakPenalty = this.breakPenalty;\n np.display = this.display;\n np.floatReference = this.floatReference;\n np.floatSide = this.floatSide;\n np.clearSide = this.clearSide;\n np.floatMinWrapBlock = this.floatMinWrapBlock;\n np.columnSpan = this.columnSpan;\n np.verticalAlign = this.verticalAlign;\n np.captionSide = this.captionSide;\n np.inlineBorderSpacing = this.inlineBorderSpacing;\n np.blockBorderSpacing = this.blockBorderSpacing;\n np.establishesBFC = this.establishesBFC;\n np.containingBlockForAbsolute = this.containingBlockForAbsolute;\n np.flexContainer = this.flexContainer;\n np.whitespace = this.whitespace;\n np.hyphenateCharacter = this.hyphenateCharacter;\n np.breakWord = this.breakWord;\n np.breakBefore = this.breakBefore;\n np.breakAfter = this.breakAfter;\n np.viewNode = this.viewNode;\n np.clearSpacer = this.clearSpacer;\n np.firstPseudo = this.firstPseudo;\n np.vertical = this.vertical;\n np.overflow = this.overflow;\n np.preprocessedTextContent = this.preprocessedTextContent;\n np.formattingContext = this.formattingContext;\n np.repeatOnBreak = this.repeatOnBreak;\n np.pluginProps = Object.create(this.pluginProps);\n np.fragmentIndex = this.fragmentIndex;\n np.afterIfContinues = this.afterIfContinues;\n np.footnotePolicy = this.footnotePolicy;\n return np;\n }\n\n modify(): NodeContext {\n if (!this.shared) {\n return this;\n }\n return this.cloneItem();\n }\n\n copy(): NodeContext {\n let np: NodeContext = this;\n do {\n if (np.shared) {\n break;\n }\n np.shared = true;\n np = np.parent;\n } while (np);\n return this;\n }\n\n clone(): NodeContext {\n const np = this.cloneItem();\n let npc = np;\n let npp: NodeContext;\n while ((npp = npc.parent) != null) {\n npp = npp.cloneItem();\n npc.parent = npp;\n npc = npp;\n }\n return np;\n }\n\n toNodePositionStep(): NodePositionStep {\n return {\n node: this.sourceNode,\n shadowType: this.shadowType,\n shadowContext: this.shadowContext,\n nodeShadow: this.nodeShadow,\n shadowSibling: this.shadowSibling\n ? this.shadowSibling.toNodePositionStep()\n : null,\n formattingContext: this.formattingContext,\n fragmentIndex: this.fragmentIndex,\n };\n }\n\n toNodePosition(): NodePosition {\n let nc: NodeContext = this;\n const steps = [];\n do {\n // We need fully \"peeled\" path, so don't record first-XXX pseudoelement\n // containers\n if (\n !nc.firstPseudo ||\n !nc.parent ||\n nc.parent.firstPseudo === nc.firstPseudo\n ) {\n steps.push(nc.toNodePositionStep());\n }\n nc = nc.parent;\n } while (nc);\n const actualOffsetInNode = this.preprocessedTextContent\n ? Diff.resolveOriginalIndex(\n this.preprocessedTextContent,\n this.offsetInNode,\n )\n : this.offsetInNode;\n return {\n steps,\n offsetInNode: actualOffsetInNode,\n after: this.after,\n preprocessedTextContent: this.preprocessedTextContent,\n };\n }\n\n isInsideBFC(): boolean {\n let parent = this.parent;\n while (parent) {\n if (parent.establishesBFC) {\n return true;\n }\n parent = parent.parent;\n }\n return false;\n }\n\n getContainingBlockForAbsolute(): NodeContext {\n let parent = this.parent;\n while (parent) {\n if (parent.containingBlockForAbsolute) {\n return parent;\n }\n parent = parent.parent;\n }\n return null;\n }\n\n /**\n * Walk up NodeContext tree (starting from itself) and call the callback for\n * each block.\n */\n walkUpBlocks(callback: (p1: NodeContext) => any) {\n let nodeContext: NodeContext = this;\n while (nodeContext) {\n if (!nodeContext.inline) {\n callback(nodeContext);\n }\n nodeContext = nodeContext.parent;\n }\n }\n\n belongsTo(formattingContext: FormattingContext): boolean {\n return (\n this.formattingContext === formattingContext &&\n !!this.parent &&\n this.parent.formattingContext === formattingContext\n );\n }\n}\n\nexport class ChunkPosition implements Vtree.ChunkPosition {\n floats: NodePosition[] = null;\n\n constructor(public primary: NodePosition) {}\n\n clone(): ChunkPosition {\n const result = new ChunkPosition(this.primary);\n if (this.floats) {\n result.floats = [];\n for (let i = 0; i < this.floats.length; ++i) {\n result.floats[i] = this.floats[i];\n }\n }\n return result;\n }\n\n isSamePosition(other: ChunkPosition): boolean {\n if (!other) {\n return false;\n }\n if (this === other) {\n return true;\n }\n if (!isSameNodePosition(this.primary, other.primary)) {\n return false;\n }\n if (this.floats) {\n if (!other.floats || this.floats.length !== other.floats.length) {\n return false;\n }\n for (let i = 0; i < this.floats.length; i++) {\n if (!isSameNodePosition(this.floats[i], other.floats[i])) {\n return false;\n }\n }\n } else if (other.floats) {\n return false;\n }\n return true;\n }\n}\n\nexport class FlowChunkPosition {\n constructor(\n public chunkPosition: ChunkPosition,\n public readonly flowChunk: FlowChunk,\n ) {}\n\n clone(): FlowChunkPosition {\n return new FlowChunkPosition(this.chunkPosition.clone(), this.flowChunk);\n }\n\n isSamePosition(other: FlowChunkPosition): boolean {\n return (\n !!other &&\n (this === other || this.chunkPosition.isSamePosition(other.chunkPosition))\n );\n }\n}\n\nexport class FlowPosition {\n positions: FlowChunkPosition[] = [];\n startSide: string = \"any\";\n breakAfter: string | null = null;\n\n clone(): FlowPosition {\n const newfp = new FlowPosition();\n const arr = this.positions;\n const newarr = newfp.positions;\n for (let i = 0; i < arr.length; i++) {\n newarr[i] = arr[i].clone();\n }\n newfp.startSide = this.startSide;\n newfp.breakAfter = this.breakAfter;\n return newfp;\n }\n\n isSamePosition(other: FlowPosition): boolean {\n if (this === other) {\n return true;\n }\n if (!other || this.positions.length !== other.positions.length) {\n return false;\n }\n for (let i = 0; i < this.positions.length; i++) {\n if (!this.positions[i].isSamePosition(other.positions[i])) {\n return false;\n }\n }\n return true;\n }\n\n hasContent(offset: number): boolean {\n return (\n this.positions.length > 0 &&\n this.positions[0].flowChunk.startOffset <= offset\n );\n }\n}\n\nexport class LayoutPosition {\n /**\n * One-based, incremented before layout.\n */\n page: number = 0;\n flows: { [key: string]: Flow } = {};\n flowPositions: { [key: string]: FlowPosition } = {};\n\n /**\n * flowPositions is built up to this offset.\n */\n highestSeenOffset: number = 0;\n\n // FIXME: This properties seem to be not used\n highestSeenNode: Node;\n lookupPositionOffset: number;\n\n clone(): LayoutPosition {\n const newcp = new LayoutPosition();\n newcp.page = this.page;\n newcp.highestSeenNode = this.highestSeenNode;\n newcp.highestSeenOffset = this.highestSeenOffset;\n newcp.lookupPositionOffset = this.lookupPositionOffset;\n newcp.flows = this.flows;\n for (const name in this.flowPositions) {\n newcp.flowPositions[name] = this.flowPositions[name].clone();\n }\n return newcp;\n }\n\n isSamePosition(other: LayoutPosition): boolean {\n if (this === other) {\n return true;\n }\n if (\n !other ||\n this.page !== other.page ||\n this.highestSeenOffset !== other.highestSeenOffset\n ) {\n return false;\n }\n const thisFlowNames = Object.keys(this.flowPositions);\n const otherFlowNames = Object.keys(other.flowPositions);\n if (thisFlowNames.length !== otherFlowNames.length) {\n return false;\n }\n for (const flowName of thisFlowNames) {\n if (\n !this.flowPositions[flowName].isSamePosition(\n other.flowPositions[flowName],\n )\n ) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * @param name flow name.\n */\n hasContent(name: string, offset: number): boolean {\n const flowPos = this.flowPositions[name];\n if (!flowPos) {\n return false;\n }\n return flowPos.hasContent(offset);\n }\n\n startSideOfFlow(name: string): string {\n const flowPos = this.flowPositions[name];\n if (!flowPos) {\n return \"any\";\n }\n return flowPos.startSide;\n }\n\n firstFlowChunkOfFlow(name: string): FlowChunk | null {\n const flowPos = this.flowPositions[name];\n if (!flowPos) {\n return null;\n }\n const flowChunkPosition = flowPos.positions[0];\n if (!flowChunkPosition) {\n return null;\n }\n return flowChunkPosition.flowChunk;\n }\n}\n\nexport class Container implements Vtree.Container {\n left: number = 0;\n top: number = 0;\n marginLeft: number = 0;\n marginRight: number = 0;\n marginTop: number = 0;\n marginBottom: number = 0;\n borderLeft: number = 0;\n borderRight: number = 0;\n borderTop: number = 0;\n borderBottom: number = 0;\n paddingLeft: number = 0;\n paddingRight: number = 0;\n paddingTop: number = 0;\n paddingBottom: number = 0;\n width: number = 0;\n height: number = 0;\n originX: number = 0;\n originY: number = 0;\n exclusions: GeometryUtil.Shape[] = null;\n innerShape: GeometryUtil.Shape = null;\n computedBlockSize: number = 0;\n snapWidth: number = 0;\n snapHeight: number = 0;\n snapOffsetX: number = 0;\n snapOffsetY: number = 0;\n vertical: boolean = false; // vertical writing\n\n constructor(public element: Element) {}\n\n getInsetTop() {\n return this.marginTop + this.borderTop + this.paddingTop;\n }\n\n getInsetBottom() {\n return this.marginBottom + this.borderBottom + this.paddingBottom;\n }\n\n getInsetLeft() {\n return this.marginLeft + this.borderLeft + this.paddingLeft;\n }\n\n getInsetRight() {\n return this.marginRight + this.borderRight + this.paddingRight;\n }\n\n getInsetBefore() {\n if (this.vertical) {\n return this.getInsetRight();\n } else {\n return this.getInsetTop();\n }\n }\n\n getInsetAfter() {\n if (this.vertical) {\n return this.getInsetLeft();\n } else {\n return this.getInsetBottom();\n }\n }\n\n getInsetStart() {\n if (this.vertical) {\n return this.getInsetTop();\n } else {\n return this.getInsetLeft();\n }\n }\n\n getInsetEnd() {\n if (this.vertical) {\n return this.getInsetBottom();\n } else {\n return this.getInsetRight();\n }\n }\n\n getBeforeEdge(box: ClientRect): number {\n return this.vertical ? box.right : box.top;\n }\n\n getAfterEdge(box: ClientRect): number {\n return this.vertical ? box.left : box.bottom;\n }\n\n getStartEdge(box: ClientRect): number {\n return this.vertical ? box.top : box.left;\n }\n\n getEndEdge(box: ClientRect): number {\n return this.vertical ? box.bottom : box.right;\n }\n\n getInlineSize(box: ClientRect): number {\n return this.vertical ? box.bottom - box.top : box.right - box.left;\n }\n\n getBoxSize(box: ClientRect): number {\n return this.vertical ? box.right - box.left : box.bottom - box.top;\n }\n\n getBoxDir(): number {\n return this.vertical ? -1 : 1;\n }\n\n getInlineDir(): number {\n return 1;\n }\n\n copyFrom(other: Container): void {\n this.element = other.element;\n this.left = other.left;\n this.top = other.top;\n this.marginLeft = other.marginLeft;\n this.marginRight = other.marginRight;\n this.marginTop = other.marginTop;\n this.marginBottom = other.marginBottom;\n this.borderLeft = other.borderLeft;\n this.borderRight = other.borderRight;\n this.borderTop = other.borderTop;\n this.borderBottom = other.borderBottom;\n this.paddingLeft = other.paddingLeft;\n this.paddingRight = other.paddingRight;\n this.paddingTop = other.paddingTop;\n this.paddingBottom = other.paddingBottom;\n this.width = other.width;\n this.height = other.height;\n this.originX = other.originX;\n this.originY = other.originY;\n this.innerShape = other.innerShape;\n this.exclusions = other.exclusions;\n this.computedBlockSize = other.computedBlockSize;\n this.snapWidth = other.snapWidth;\n this.snapHeight = other.snapHeight;\n this.vertical = other.vertical;\n }\n\n setVerticalPosition(top: number, height: number): void {\n this.top = top;\n this.height = height;\n Base.setCSSProperty(this.element, \"top\", `${top}px`);\n Base.setCSSProperty(this.element, \"height\", `${height}px`);\n }\n\n setHorizontalPosition(left: number, width: number): void {\n this.left = left;\n this.width = width;\n Base.setCSSProperty(this.element, \"left\", `${left}px`);\n Base.setCSSProperty(this.element, \"width\", `${width}px`);\n }\n\n setBlockPosition(start: number, extent: number): void {\n if (this.vertical) {\n this.setHorizontalPosition(start + extent * this.getBoxDir(), extent);\n } else {\n this.setVerticalPosition(start, extent);\n }\n }\n\n setInlinePosition(start: number, extent: number): void {\n if (this.vertical) {\n this.setVerticalPosition(start, extent);\n } else {\n this.setHorizontalPosition(start, extent);\n }\n }\n\n clear() {\n const parent = this.element;\n let c: Node;\n while ((c = parent.lastChild)) {\n parent.removeChild(c);\n }\n }\n\n getInnerShape(): GeometryUtil.Shape {\n const rect = this.getInnerRect();\n if (this.innerShape) {\n return this.innerShape.withOffset(rect.x1, rect.y1);\n }\n return GeometryUtil.shapeForRect(rect.x1, rect.y1, rect.x2, rect.y2);\n }\n\n getInnerRect(): GeometryUtil.Rect {\n const offsetX = this.originX + this.left + this.getInsetLeft();\n const offsetY = this.originY + this.top + this.getInsetTop();\n return new GeometryUtil.Rect(\n offsetX,\n offsetY,\n offsetX + this.width,\n offsetY + this.height,\n );\n }\n\n getPaddingRect(): GeometryUtil.Rect {\n const paddingX =\n this.originX + this.left + this.marginLeft + this.borderLeft;\n const paddingY = this.originY + this.top + this.marginTop + this.borderTop;\n const paddingWidth = this.paddingLeft + this.width + this.paddingRight;\n const paddingHeight = this.paddingTop + this.height + this.paddingBottom;\n return new GeometryUtil.Rect(\n paddingX,\n paddingY,\n paddingX + paddingWidth,\n paddingY + paddingHeight,\n );\n }\n\n getOuterShape(\n outerShapeProp: Css.Val,\n context: Exprs.Context,\n ): GeometryUtil.Shape {\n const rect = this.getOuterRect();\n return CssProp.toShape(\n outerShapeProp,\n rect.x1,\n rect.y1,\n rect.x2 - rect.x1,\n rect.y2 - rect.y1,\n context,\n );\n }\n\n getOuterRect(): GeometryUtil.Rect {\n const outerX = this.originX + this.left;\n const outerY = this.originY + this.top;\n const outerWidth = this.getInsetLeft() + this.width + this.getInsetRight();\n const outerHeight =\n this.getInsetTop() + this.height + this.getInsetBottom();\n return new GeometryUtil.Rect(\n outerX,\n outerY,\n outerX + outerWidth,\n outerY + outerHeight,\n );\n }\n}\n\nexport type ExprContentListener = Vtree.ExprContentListener;\n\nexport class ContentPropertyHandler extends Css.Visitor {\n constructor(\n public readonly elem: Element,\n public readonly context: Exprs.Context,\n public readonly rootContentValue: Css.Val,\n public readonly exprContentListener: ExprContentListener,\n ) {\n super();\n }\n\n private visitStrInner(str: string, node?: Node | null) {\n if (!node) {\n node = this.elem.ownerDocument.createTextNode(str);\n }\n this.elem.appendChild(node);\n }\n\n /** @override */\n visitStr(str: Css.Str): Css.Val {\n this.visitStrInner(str.str);\n return null;\n }\n\n /** @override */\n visitURL(url: Css.URL): Css.Val {\n if ((this.rootContentValue as any).url) {\n this.elem.setAttribute(\"src\", url.url);\n } else {\n const img = this.elem.ownerDocument.createElementNS(Base.NS.XHTML, \"img\");\n img.setAttribute(\"src\", url.url);\n this.elem.appendChild(img);\n }\n return null;\n }\n\n /** @override */\n visitSpaceList(list: Css.SpaceList): Css.Val {\n this.visitValues(list.values);\n return null;\n }\n\n /** @override */\n visitExpr(expr: Css.Expr): Css.Val {\n const ex = expr.toExpr();\n let val = ex.evaluate(this.context);\n if (typeof val === \"string\") {\n if (ex instanceof Exprs.Named) {\n // For env(pub-title) and env(doc-title)\n // Need to unquote the result. To be consistent with cssparse.evaluateExprToCSS()\n val = CssParser.parseValue(\n ex.scope,\n new CssTokenizer.Tokenizer(val, null),\n \"\",\n ).stringValue();\n }\n assert(this.elem.ownerDocument);\n const node = this.exprContentListener(ex, val, this.elem.ownerDocument);\n this.visitStrInner(val, node);\n }\n return null;\n }\n}\n\nexport function nonTrivialContent(val: Css.Val): boolean {\n return (\n val != null &&\n val !== Css.ident.normal &&\n val !== Css.ident.none &&\n val !== Css.ident.inherit\n );\n}\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2015 Trim-marks Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview CssCascade - CSS Cascade.\n */\nimport * as Asserts from \"./asserts\";\nimport * as Base from \"./base\";\nimport * as Css from \"./css\";\nimport * as CssParser from \"./css-parser\";\nimport * as CssProp from \"./css-prop\";\nimport * as CssTokenizer from \"./css-tokenizer\";\nimport * as CssValidator from \"./css-validator\";\nimport * as Exprs from \"./exprs\";\nimport * as Logging from \"./logging\";\nimport * as Matchers from \"./matchers\";\nimport * as Plugin from \"./plugin\";\nimport * as Vtree from \"./vtree\";\nimport { CssCascade } from \"./types\";\n\nexport interface ElementStyle extends CssCascade.ElementStyle {}\n\nexport const inheritedProps = {\n azimuth: true,\n \"border-collapse\": true,\n \"border-spacing\": true,\n \"caption-side\": true,\n \"clip-rule\": true,\n color: true,\n \"color-interpolation\": true,\n \"color-rendering\": true,\n cursor: true,\n direction: true,\n elevation: true,\n \"empty-cells\": true,\n fill: true,\n \"fill-opacity\": true,\n \"fill-rule\": true,\n \"font-kerning\": true,\n \"font-size\": true,\n \"font-size-adjust\": true,\n \"font-family\": true,\n \"font-feature-settings\": true,\n \"font-style\": true,\n \"font-stretch\": true,\n \"font-variant\": true,\n \"font-weight\": true,\n \"glyph-orientation-vertical\": true,\n hyphens: true,\n \"hyphenate-character\": true,\n \"hyphenate-limit-chars\": true,\n \"hyphenate-limit-last\": true,\n \"image-rendering\": true,\n \"image-resolution\": true,\n \"letter-spacing\": true,\n \"line-break\": true,\n \"line-height\": true,\n \"list-style-image\": true,\n \"list-style-position\": true,\n \"list-style-type\": true,\n marker: true,\n \"marker-end\": true,\n \"marker-mid\": true,\n \"marker-start\": true,\n orphans: true,\n \"overflow-wrap\": true,\n \"paint-order\": true,\n \"pointer-events\": true,\n \"pitch-range\": true,\n quotes: true,\n richness: true,\n \"ruby-align\": true,\n \"ruby-position\": true,\n \"speak-header\": true,\n \"speak-numeral\": true,\n \"speak-punctuation\": true,\n \"speech-rate\": true,\n \"shape-rendering\": true,\n stress: true,\n stroke: true,\n \"stroke-dasharray\": true,\n \"stroke-dashoffset\": true,\n \"stroke-linecap\": true,\n \"stroke-linejoin\": true,\n \"stroke-miterlimit\": true,\n \"stroke-opacity\": true,\n \"stroke-width\": true,\n \"tab-size\": true,\n \"text-align\": true,\n \"text-align-last\": true,\n \"text-anchor\": true,\n \"text-decoration-skip\": true,\n \"text-emphasis-color\": true,\n \"text-emphasis-position\": true,\n \"text-emphasis-style\": true,\n \"text-combine-upright\": true,\n \"text-indent\": true,\n \"text-justify\": true,\n \"text-rendering\": true,\n \"text-size-adjust\": true,\n \"text-transform\": true,\n \"text-underline-position\": true,\n visibility: true,\n \"voice-family\": true,\n volume: true,\n \"white-space\": true,\n widows: true,\n \"word-break\": true,\n \"word-spacing\": true,\n \"word-wrap\": true,\n \"writing-mode\": true,\n};\n\nexport const polyfilledInheritedProps = [\n \"box-decoration-break\",\n // TODO: box-decoration-block should not be inherited.\n // https://github.com/vivliostyle/vivliostyle.js/issues/259\n \"image-resolution\",\n \"orphans\",\n \"widows\",\n];\n\nexport function getPolyfilledInheritedProps(): string[] {\n const hooks: Plugin.PolyfilledInheritedPropsHook[] = Plugin.getHooksForName(\n Plugin.HOOKS.POLYFILLED_INHERITED_PROPS,\n );\n return hooks.reduce(\n (props, f) => props.concat(f()),\n [].concat(polyfilledInheritedProps),\n );\n}\n\nexport const supportedNamespaces = {\n \"http://www.idpf.org/2007/ops\": true,\n \"http://www.w3.org/1999/xhtml\": true,\n \"http://www.w3.org/2000/svg\": true,\n};\n\nexport const coupledPatterns = [\n \"margin-%\",\n \"padding-%\",\n \"border-%-width\",\n \"border-%-style\",\n \"border-%-color\",\n \"%\",\n];\n\nexport const coupledExtentPatterns = [\"max-%\", \"min-%\", \"%\"];\n\nexport const geomNames: { [key: string]: boolean } = (() => {\n const sides = [\"left\", \"right\", \"top\", \"bottom\"];\n const names = {\n width: true,\n height: true,\n \"max-width\": true,\n \"max-height\": true,\n \"min-width\": true,\n \"min-height\": true,\n };\n for (let i = 0; i < coupledPatterns.length; i++) {\n for (let k = 0; k < sides.length; k++) {\n const name = coupledPatterns[i].replace(\"%\", sides[k]);\n names[name] = true;\n }\n }\n return names;\n})();\n\nexport function buildCouplingMap(\n sideMap: { [key: string]: string },\n extentMap: { [key: string]: string },\n): { [key: string]: string } {\n const map = {};\n for (const pattern of coupledPatterns) {\n for (const side in sideMap) {\n const name1 = pattern.replace(\"%\", side);\n const name2 = pattern.replace(\"%\", sideMap[side]);\n map[name1] = name2;\n map[name2] = name1;\n }\n }\n for (const extentPattern of coupledExtentPatterns) {\n for (const extent in extentMap) {\n const name1 = extentPattern.replace(\"%\", extent);\n const name2 = extentPattern.replace(\"%\", extentMap[extent]);\n map[name1] = name2;\n map[name2] = name1;\n }\n }\n return map;\n}\n\nexport const couplingMapVert = buildCouplingMap(\n {\n \"block-start\": \"right\",\n \"block-end\": \"left\",\n \"inline-start\": \"top\",\n \"inline-end\": \"bottom\",\n },\n { \"block-size\": \"width\", \"inline-size\": \"height\" },\n);\n\nexport const couplingMapHor = buildCouplingMap(\n {\n \"block-start\": \"top\",\n \"block-end\": \"bottom\",\n \"inline-start\": \"left\",\n \"inline-end\": \"right\",\n },\n { \"block-size\": \"height\", \"inline-size\": \"width\" },\n);\n\nexport const couplingMapVertRtl = buildCouplingMap(\n {\n \"block-start\": \"right\",\n \"block-end\": \"left\",\n \"inline-start\": \"bottom\",\n \"inline-end\": \"top\",\n },\n { \"block-size\": \"width\", \"inline-size\": \"height\" },\n);\n\nexport const couplingMapHorRtl = buildCouplingMap(\n {\n \"block-start\": \"top\",\n \"block-end\": \"bottom\",\n \"inline-start\": \"right\",\n \"inline-end\": \"left\",\n },\n { \"block-size\": \"height\", \"inline-size\": \"width\" },\n);\n\nexport class CascadeValue {\n constructor(\n public readonly value: Css.Val,\n public readonly priority: number,\n ) {}\n\n getBaseValue(): CascadeValue {\n return this;\n }\n\n filterValue(visitor: Css.Visitor): CascadeValue {\n const value = this.value.visit(visitor);\n if (value === this.value) {\n return this;\n }\n return new CascadeValue(value, this.priority);\n }\n\n increaseSpecificity(specificity: number): CascadeValue {\n if (specificity == 0) {\n return this;\n }\n return new CascadeValue(this.value, this.priority + specificity);\n }\n\n evaluate(context: Exprs.Context, propName: string): Css.Val {\n return CssParser.evaluateCSSToCSS(context, this.value, propName);\n }\n\n isEnabled(context: Exprs.Context): boolean {\n return true;\n }\n}\n\n/**\n * Internal subclass of CascadeValue. Should never be seen outside of the\n * cascade engine.\n */\nexport class ConditionalCascadeValue extends CascadeValue {\n constructor(\n value: Css.Val,\n priority: number,\n public readonly condition: Exprs.Val,\n ) {\n super(value, priority);\n }\n\n /**\n * @override\n */\n getBaseValue(): CascadeValue {\n return new CascadeValue(this.value, this.priority);\n }\n\n /**\n * @override\n */\n filterValue(visitor: Css.Visitor): CascadeValue {\n const value = this.value.visit(visitor);\n if (value === this.value) {\n return this;\n }\n return new ConditionalCascadeValue(value, this.priority, this.condition);\n }\n\n /**\n * @override\n */\n increaseSpecificity(specificity: number): CascadeValue {\n if (specificity == 0) {\n return this;\n }\n return new ConditionalCascadeValue(\n this.value,\n this.priority + specificity,\n this.condition,\n );\n }\n\n isEnabled(context: Exprs.Context): boolean {\n return !!this.condition.evaluate(context);\n }\n}\n\n/**\n * @param tv current value (cannot be conditional)\n * @param av cascaded value (can be conditional)\n */\nexport function cascadeValues(\n context: Exprs.Context,\n tv: CascadeValue,\n av: CascadeValue,\n): CascadeValue {\n if ((tv == null || av.priority > tv.priority) && av.isEnabled(context)) {\n return av.getBaseValue();\n }\n return tv;\n}\n\nexport type ElementStyleMap = {\n [key: string]: ElementStyle;\n};\n\nexport const SPECIALS = {\n \"region-id\": true,\n \"fragment-selector-id\": true,\n};\n\nexport function isSpecialName(name: string): boolean {\n return !!SPECIALS[name];\n}\n\nexport function isMapName(name: string): boolean {\n return name.charAt(0) == \"_\";\n}\n\nexport function isPropName(name: string): boolean {\n return name.charAt(0) != \"_\" && !SPECIALS[name];\n}\n\nexport function isInherited(name: string): boolean {\n return !!inheritedProps[name];\n}\n\nexport function getProp(style: ElementStyle, name: string): CascadeValue {\n return style[name] as CascadeValue;\n}\n\n/**\n * @return void\n */\nexport function setProp(\n style: ElementStyle,\n name: string,\n value: CascadeValue,\n): any {\n if (!value) {\n delete style[name];\n } else {\n style[name] = value;\n }\n}\n\nexport function getStyleMap(\n style: ElementStyle,\n name: string,\n): ElementStyleMap {\n return style[name] as ElementStyleMap;\n}\n\nexport function getMutableStyleMap(\n style: ElementStyle,\n name: string,\n): ElementStyleMap {\n let r = style[name] as ElementStyleMap;\n if (!r) {\n r = {};\n style[name] = r;\n }\n return r;\n}\n\nexport const getViewConditionalStyleMap = (\n style: ElementStyle,\n): { matcher: Matchers.Matcher; styles: ElementStyleMap }[] => {\n let r = style[\"_viewConditionalStyles\"] as {\n matcher: Matchers.Matcher;\n styles: ElementStyleMap;\n }[];\n if (!r) {\n r = [];\n style[\"_viewConditionalStyles\"] = r;\n }\n return r;\n};\n\nexport function getSpecial(style: ElementStyle, name: string): CascadeValue[] {\n return style[name] as CascadeValue[];\n}\n\nexport function getMutableSpecial(\n style: ElementStyle,\n name: string,\n): CascadeValue[] {\n let r = style[name] as CascadeValue[];\n if (!r) {\n r = [];\n style[name] = r;\n }\n return r;\n}\n\nexport function mergeIn(\n context: Exprs.Context,\n target: ElementStyle,\n style: ElementStyle,\n specificity: number,\n pseudoelement: string | null,\n regionId: string | null,\n viewConditionMatcher: Matchers.Matcher | null,\n): void {\n const hierarchy = [\n { id: pseudoelement, styleKey: \"_pseudos\" },\n { id: regionId, styleKey: \"_regions\" },\n ];\n hierarchy.forEach((item) => {\n if (item.id) {\n const styleMap = getMutableStyleMap(target, item.styleKey);\n target = styleMap[item.id];\n if (!target) {\n target = {} as ElementStyle;\n styleMap[item.id] = target;\n }\n }\n });\n if (viewConditionMatcher) {\n const styleMap = getViewConditionalStyleMap(target);\n target = {} as ElementStyle;\n styleMap.push({\n styles: target as ElementStyleMap,\n matcher: viewConditionMatcher,\n });\n }\n for (const prop in style) {\n if (isMapName(prop)) {\n continue;\n }\n if (isSpecialName(prop)) {\n // special properties: list of all assigned values\n const as = getSpecial(style, prop);\n const ts = getMutableSpecial(target, prop);\n Array.prototype.push.apply(ts, as);\n } else {\n // regular properties: higher priority wins\n const av = getProp(style, prop).increaseSpecificity(specificity);\n const tv = getProp(target, prop);\n setProp(target, prop, cascadeValues(context, tv, av));\n }\n }\n}\n\nexport function mergeAll(\n context: Exprs.Context,\n styles: ElementStyle[],\n): ElementStyle {\n const target = {} as ElementStyle;\n for (let k = 0; k < styles.length; k++) {\n mergeIn(context, target, styles[k], 0, null, null, null);\n }\n return target;\n}\n\nexport function chainActions(\n chain: ChainedAction[],\n action: CascadeAction,\n): CascadeAction {\n if (chain.length > 0) {\n chain.sort((a, b) => b.getPriority() - a.getPriority());\n let chained: ChainedAction | null = null;\n for (let i = chain.length - 1; i >= 0; i--) {\n chained = chain[i];\n chained.chained = action;\n action = chained;\n }\n return chained;\n }\n return action;\n}\n\nexport class InheritanceVisitor extends Css.FilterVisitor {\n propName: string = \"\";\n\n constructor(\n public readonly props: ElementStyle,\n public readonly context: Exprs.Context,\n ) {\n super();\n }\n\n setPropName(name: string): void {\n this.propName = name;\n }\n\n private getFontSize() {\n const cascval = getProp(this.props, \"font-size\");\n const n = cascval.value as Css.Numeric;\n if (!Exprs.isAbsoluteLengthUnit(n.unit)) {\n throw new Error(\"Unexpected state\");\n }\n return n.num * Exprs.defaultUnitSizes[n.unit];\n }\n\n /**\n * @override\n */\n visitNumeric(numeric: Css.Numeric): Css.Val {\n Asserts.assert(this.context);\n if (this.propName === \"font-size\") {\n return convertFontSizeToPx(numeric, this.getFontSize(), this.context);\n } else if (\n numeric.unit == \"em\" ||\n numeric.unit == \"ex\" ||\n numeric.unit == \"rem\"\n ) {\n return convertFontRelativeLengthToPx(\n numeric,\n this.getFontSize(),\n this.context,\n );\n } else if (numeric.unit == \"%\") {\n if (this.propName === \"line-height\") {\n return numeric;\n }\n const unit = this.propName.match(/height|^(top|bottom)$/) ? \"vh\" : \"vw\";\n return new Css.Numeric(numeric.num, unit);\n }\n return numeric;\n }\n\n /**\n * @override\n */\n visitExpr(expr: Css.Expr): Css.Val {\n if (this.propName == \"font-size\") {\n const val = CssParser.evaluateCSSToCSS(this.context, expr, this.propName);\n return val.visit(this);\n }\n return expr;\n }\n}\n\nexport function convertFontRelativeLengthToPx(\n numeric: Css.Numeric,\n baseFontSize: number,\n context: Exprs.Context,\n): Css.Numeric {\n const unit = numeric.unit;\n const num = numeric.num;\n if (unit === \"em\" || unit === \"ex\") {\n const ratio = Exprs.defaultUnitSizes[unit] / Exprs.defaultUnitSizes[\"em\"];\n return new Css.Numeric(num * ratio * baseFontSize, \"px\");\n } else if (unit === \"rem\") {\n return new Css.Numeric(num * context.fontSize(), \"px\");\n } else {\n return numeric;\n }\n}\n\nexport function convertFontSizeToPx(\n numeric: Css.Numeric,\n parentFontSize: number,\n context: Exprs.Context,\n): Css.Numeric {\n numeric = convertFontRelativeLengthToPx(numeric, parentFontSize, context);\n const unit = numeric.unit;\n const num = numeric.num;\n if (unit === \"px\") {\n return numeric;\n } else if (unit === \"%\") {\n return new Css.Numeric((num / 100) * parentFontSize, \"px\");\n } else {\n return new Css.Numeric(num * context.queryUnitSize(unit, false), \"px\");\n }\n}\n\nexport type ActionTable = {\n [key: string]: CascadeAction;\n};\n\nexport class CascadeAction {\n apply(cascadeInstance: CascadeInstance): void {}\n\n mergeWith(other: CascadeAction): CascadeAction {\n return new CompoundAction([this, other]);\n }\n\n clone(): CascadeAction {\n // Mutable actions will override\n return this;\n }\n}\n\nexport class ConditionItemAction extends CascadeAction {\n constructor(public readonly conditionItem: ConditionItem) {\n super();\n }\n\n /**\n * @override\n */\n apply(cascadeInstance: CascadeInstance): void {\n cascadeInstance.pushConditionItem(\n this.conditionItem.fresh(cascadeInstance),\n );\n }\n}\n\nexport class CompoundAction extends CascadeAction {\n constructor(public readonly list: CascadeAction[]) {\n super();\n }\n\n /**\n * @override\n */\n apply(cascadeInstance: CascadeInstance): void {\n for (let i = 0; i < this.list.length; i++) {\n this.list[i].apply(cascadeInstance);\n }\n }\n\n /**\n * @override\n */\n mergeWith(other: CascadeAction): CascadeAction {\n this.list.push(other);\n return this;\n }\n\n /**\n * @override\n */\n clone(): CascadeAction {\n return new CompoundAction([].concat(this.list));\n }\n}\n\nexport class ApplyRuleAction extends CascadeAction {\n constructor(\n public readonly style: ElementStyle,\n public readonly specificity: number,\n public readonly pseudoelement: string | null,\n public readonly regionId: string | null,\n public readonly viewConditionId: string | null,\n ) {\n super();\n }\n\n /**\n * @override\n */\n apply(cascadeInstance: CascadeInstance): void {\n mergeIn(\n cascadeInstance.context,\n cascadeInstance.currentStyle,\n this.style,\n this.specificity,\n this.pseudoelement,\n this.regionId,\n cascadeInstance.buildViewConditionMatcher(this.viewConditionId),\n );\n }\n}\n\nexport class ChainedAction extends CascadeAction {\n chained: CascadeAction = null;\n\n constructor() {\n super();\n }\n\n /**\n * @override\n */\n apply(cascadeInstance: CascadeInstance): void {\n this.chained.apply(cascadeInstance);\n }\n\n getPriority(): number {\n return 0;\n }\n\n makePrimary(cascade: Cascade): boolean {\n // cannot be made primary\n return false;\n }\n}\n\nexport class CheckClassAction extends ChainedAction {\n constructor(public readonly className: string) {\n super();\n }\n\n /**\n * @override\n */\n apply(cascadeInstance: CascadeInstance): void {\n if (cascadeInstance.currentClassNames.includes(this.className)) {\n this.chained.apply(cascadeInstance);\n }\n }\n\n /**\n * @override\n */\n getPriority(): number {\n return 10;\n }\n // class should be checked after id\n\n /**\n * @override\n */\n makePrimary(cascade: Cascade): boolean {\n if (this.chained) {\n cascade.insertInTable(cascade.classes, this.className, this.chained);\n }\n return true;\n }\n}\n\nexport class CheckIdAction extends ChainedAction {\n constructor(public readonly id: string) {\n super();\n }\n\n /**\n * @override\n */\n apply(cascadeInstance: CascadeInstance): void {\n if (\n cascadeInstance.currentId == this.id ||\n cascadeInstance.currentXmlId == this.id\n ) {\n this.chained.apply(cascadeInstance);\n }\n }\n\n /**\n * @override\n */\n getPriority(): number {\n return 11;\n }\n // id should be checked after :root\n\n /**\n * @override\n */\n makePrimary(cascade: Cascade): boolean {\n if (this.chained) {\n cascade.insertInTable(cascade.ids, this.id, this.chained);\n }\n return true;\n }\n}\n\nexport class CheckLocalNameAction extends ChainedAction {\n constructor(public readonly localName: string) {\n super();\n }\n\n /**\n * @override\n */\n apply(cascadeInstance: CascadeInstance): void {\n if (cascadeInstance.currentLocalName == this.localName) {\n this.chained.apply(cascadeInstance);\n }\n }\n\n /**\n * @override\n */\n getPriority(): number {\n return 8;\n }\n // tag is a pretty good thing to check, after epub:type\n\n /**\n * @override\n */\n makePrimary(cascade: Cascade): boolean {\n if (this.chained) {\n cascade.insertInTable(cascade.tags, this.localName, this.chained);\n }\n return true;\n }\n}\n\nexport class CheckNSTagAction extends ChainedAction {\n constructor(public readonly ns: string, public readonly localName: string) {\n super();\n }\n\n /**\n * @override\n */\n apply(cascadeInstance: CascadeInstance): void {\n if (\n cascadeInstance.currentLocalName == this.localName &&\n cascadeInstance.currentNamespace == this.ns\n ) {\n this.chained.apply(cascadeInstance);\n }\n }\n\n /**\n * @override\n */\n getPriority(): number {\n return 8;\n }\n // tag is a pretty good thing to check, after epub:type\n\n /**\n * @override\n */\n makePrimary(cascade: Cascade): boolean {\n if (this.chained) {\n let prefix = cascade.nsPrefix[this.ns];\n if (!prefix) {\n prefix = `ns${cascade.nsCount++}:`;\n cascade.nsPrefix[this.ns] = prefix;\n }\n const nsTag = prefix + this.localName;\n cascade.insertInTable(cascade.nstags, nsTag, this.chained);\n }\n return true;\n }\n}\n\nexport class CheckTargetEpubTypeAction extends ChainedAction {\n constructor(public readonly epubTypePatt: RegExp) {\n super();\n }\n\n /**\n * @override\n */\n apply(cascadeInstance: CascadeInstance): void {\n const elem = cascadeInstance.currentElement;\n if (elem && cascadeInstance.currentLocalName == \"a\") {\n const href = elem.getAttribute(\"href\");\n if (href && href.match(/^#/)) {\n const id = href.substring(1);\n const target = elem.ownerDocument.getElementById(id);\n if (target) {\n const epubType = target.getAttributeNS(Base.NS.epub, \"type\");\n if (epubType && epubType.match(this.epubTypePatt)) {\n this.chained.apply(cascadeInstance);\n }\n }\n }\n }\n }\n}\n\nexport class CheckNamespaceAction extends ChainedAction {\n constructor(public readonly ns: string) {\n super();\n }\n\n /**\n * @override\n */\n apply(cascadeInstance: CascadeInstance): void {\n if (cascadeInstance.currentNamespace == this.ns) {\n this.chained.apply(cascadeInstance);\n }\n }\n}\n\nexport class CheckAttributePresentAction extends ChainedAction {\n constructor(public readonly ns: string, public readonly name: string) {\n super();\n }\n\n /**\n * @override\n */\n apply(cascadeInstance: CascadeInstance): void {\n if (\n cascadeInstance.currentElement &&\n cascadeInstance.currentElement.hasAttributeNS(this.ns, this.name)\n ) {\n this.chained.apply(cascadeInstance);\n }\n }\n}\n\nexport class CheckAttributeEqAction extends ChainedAction {\n constructor(\n public readonly ns: string,\n public readonly name: string,\n public readonly value: string,\n ) {\n super();\n }\n\n /**\n * @override\n */\n apply(cascadeInstance: CascadeInstance): void {\n if (\n cascadeInstance.currentElement &&\n cascadeInstance.currentElement.getAttributeNS(this.ns, this.name) ==\n this.value\n ) {\n this.chained.apply(cascadeInstance);\n }\n }\n\n /**\n * @override\n */\n getPriority(): number {\n if (this.name == \"type\" && this.ns == Base.NS.epub) {\n return 9; // epub:type is a pretty good thing to check\n }\n return 0;\n }\n\n /**\n * @override\n */\n makePrimary(cascade: Cascade): boolean {\n if (this.name == \"type\" && this.ns == Base.NS.epub) {\n if (this.chained) {\n cascade.insertInTable(cascade.epubtypes, this.value, this.chained);\n }\n return true;\n }\n return false;\n }\n}\n\nexport class CheckNamespaceSupportedAction extends ChainedAction {\n constructor(public readonly ns: string, public readonly name: string) {\n super();\n }\n\n /**\n * @override\n */\n apply(cascadeInstance: CascadeInstance): void {\n if (cascadeInstance.currentElement) {\n const ns = cascadeInstance.currentElement.getAttributeNS(\n this.ns,\n this.name,\n );\n if (ns && supportedNamespaces[ns]) {\n this.chained.apply(cascadeInstance);\n }\n }\n }\n\n /**\n * @override\n */\n getPriority(): number {\n return 0;\n }\n\n /**\n * @override\n */\n makePrimary(cascade: Cascade): boolean {\n return false;\n }\n}\n\nexport class CheckAttributeRegExpAction extends ChainedAction {\n constructor(\n public readonly ns: string,\n public readonly name: string,\n public readonly regexp: RegExp,\n ) {\n super();\n }\n\n /**\n * @override\n */\n apply(cascadeInstance: CascadeInstance): void {\n if (cascadeInstance.currentElement) {\n const attr = cascadeInstance.currentElement.getAttributeNS(\n this.ns,\n this.name,\n );\n if (attr && attr.match(this.regexp)) {\n this.chained.apply(cascadeInstance);\n }\n }\n }\n}\n\nexport class CheckLangAction extends ChainedAction {\n constructor(public readonly langRegExp: RegExp) {\n super();\n }\n\n /**\n * @override\n */\n apply(cascadeInstance: CascadeInstance): void {\n if (cascadeInstance.lang.match(this.langRegExp)) {\n this.chained.apply(cascadeInstance);\n }\n }\n}\n\nexport class IsFirstAction extends ChainedAction {\n constructor() {\n super();\n }\n\n /**\n * @override\n */\n apply(cascadeInstance: CascadeInstance): void {\n if (cascadeInstance.isFirst) {\n this.chained.apply(cascadeInstance);\n }\n }\n\n /**\n * @override\n */\n getPriority(): number {\n return 6;\n }\n}\n\nexport class IsRootAction extends ChainedAction {\n constructor() {\n super();\n }\n\n /**\n * @override\n */\n apply(cascadeInstance: CascadeInstance): void {\n if (cascadeInstance.isRoot) {\n this.chained.apply(cascadeInstance);\n }\n }\n\n /**\n * @override\n */\n getPriority(): number {\n return 12; // :root is the first thing to check\n }\n}\n\nexport class IsNthAction extends ChainedAction {\n constructor(public readonly a: number, public readonly b: number) {\n super();\n }\n\n /**\n * Checkes whether given order can be represented as an+b with a non-negative\n * interger n\n */\n protected matchANPlusB(order: number): boolean {\n return Matchers.matchANPlusB(order, this.a, this.b);\n }\n}\n\nexport class IsNthSiblingAction extends IsNthAction {\n constructor(a: number, b: number) {\n super(a, b);\n }\n\n /**\n * @override\n */\n apply(cascadeInstance: CascadeInstance): void {\n if (this.matchANPlusB(cascadeInstance.currentSiblingOrder)) {\n this.chained.apply(cascadeInstance);\n }\n }\n\n /**\n * @override\n */\n getPriority(): number {\n return 5;\n }\n}\n\nexport class IsNthSiblingOfTypeAction extends IsNthAction {\n constructor(a: number, b: number) {\n super(a, b);\n }\n\n /**\n * @override\n */\n apply(cascadeInstance: CascadeInstance): void {\n const order =\n cascadeInstance.currentSiblingTypeCounts[\n cascadeInstance.currentNamespace\n ][cascadeInstance.currentLocalName];\n if (this.matchANPlusB(order)) {\n this.chained.apply(cascadeInstance);\n }\n }\n\n /**\n * @override\n */\n getPriority(): number {\n return 5;\n }\n}\n\nexport class IsNthLastSiblingAction extends IsNthAction {\n constructor(a: number, b: number) {\n super(a, b);\n }\n\n /**\n * @override\n */\n apply(cascadeInstance: CascadeInstance): void {\n let order = cascadeInstance.currentFollowingSiblingOrder;\n if (order === null) {\n order = cascadeInstance.currentFollowingSiblingOrder =\n cascadeInstance.currentElement.parentNode.childElementCount -\n cascadeInstance.currentSiblingOrder +\n 1;\n }\n if (this.matchANPlusB(order)) {\n this.chained.apply(cascadeInstance);\n }\n }\n\n /**\n * @override\n */\n getPriority(): number {\n return 4;\n }\n}\n\nexport class IsNthLastSiblingOfTypeAction extends IsNthAction {\n constructor(a: number, b: number) {\n super(a, b);\n }\n\n /**\n * @override\n */\n apply(cascadeInstance: CascadeInstance): void {\n const counts = cascadeInstance.currentFollowingSiblingTypeCounts;\n if (!counts[cascadeInstance.currentNamespace]) {\n let elem = cascadeInstance.currentElement;\n do {\n const ns = elem.namespaceURI;\n const localName = elem.localName;\n let nsCounts = counts[ns];\n if (!nsCounts) {\n nsCounts = counts[ns] = {};\n }\n nsCounts[localName] = (nsCounts[localName] || 0) + 1;\n } while ((elem = elem.nextElementSibling));\n }\n if (\n this.matchANPlusB(\n counts[cascadeInstance.currentNamespace][\n cascadeInstance.currentLocalName\n ],\n )\n ) {\n this.chained.apply(cascadeInstance);\n }\n }\n\n /**\n * @override\n */\n getPriority(): number {\n return 4;\n }\n}\n\nexport class IsEmptyAction extends ChainedAction {\n constructor() {\n super();\n }\n\n /**\n * @override\n */\n apply(cascadeInstance: CascadeInstance): void {\n let node: Node | null = cascadeInstance.currentElement.firstChild;\n while (node) {\n switch (node.nodeType) {\n case Node.ELEMENT_NODE:\n return;\n case Node.TEXT_NODE:\n if ((node as Text).length > 0) {\n return;\n }\n }\n node = node.nextSibling;\n }\n this.chained.apply(cascadeInstance);\n }\n\n /**\n * @override\n */\n getPriority(): number {\n return 4;\n }\n}\n\nexport class IsEnabledAction extends ChainedAction {\n constructor() {\n super();\n }\n\n /**\n * @override\n */\n apply(cascadeInstance: CascadeInstance): void {\n const elem = cascadeInstance.currentElement;\n if ((elem as any).disabled === false) {\n this.chained.apply(cascadeInstance);\n }\n }\n\n /**\n * @override\n */\n getPriority(): number {\n return 5;\n }\n}\n\nexport class IsDisabledAction extends ChainedAction {\n constructor() {\n super();\n }\n\n /**\n * @override\n */\n apply(cascadeInstance: CascadeInstance): void {\n const elem = cascadeInstance.currentElement;\n if ((elem as any).disabled === true) {\n this.chained.apply(cascadeInstance);\n }\n }\n\n /**\n * @override\n */\n getPriority(): number {\n return 5;\n }\n}\n\nexport class IsCheckedAction extends ChainedAction {\n constructor() {\n super();\n }\n\n /**\n * @override\n */\n apply(cascadeInstance: CascadeInstance): void {\n const elem = cascadeInstance.currentElement;\n if ((elem as any).selected === true || (elem as any).checked === true) {\n this.chained.apply(cascadeInstance);\n }\n }\n\n /**\n * @override\n */\n getPriority(): number {\n return 5;\n }\n}\n\nexport class CheckConditionAction extends ChainedAction {\n constructor(public readonly condition: string) {\n super();\n }\n\n /**\n * @override\n */\n apply(cascadeInstance: CascadeInstance): void {\n if (cascadeInstance.conditions[this.condition]) {\n try {\n cascadeInstance.dependentConditions.push(this.condition);\n this.chained.apply(cascadeInstance);\n } finally {\n cascadeInstance.dependentConditions.pop();\n }\n }\n }\n\n /**\n * @override\n */\n getPriority(): number {\n return 5;\n }\n}\n\nexport class CheckAppliedAction extends CascadeAction {\n applied = false;\n\n constructor() {\n super();\n }\n\n /**\n * @override\n */\n apply(cascadeInstance: CascadeInstance): void {\n this.applied = true;\n }\n\n /**\n * @override\n */\n clone(): CascadeAction {\n const cloned = new CheckAppliedAction();\n cloned.applied = this.applied;\n return cloned;\n }\n}\n\nexport class NegateActionsSet extends ChainedAction {\n checkAppliedAction: CheckAppliedAction;\n firstAction: CascadeAction;\n\n constructor(list: ChainedAction[]) {\n super();\n this.checkAppliedAction = new CheckAppliedAction();\n this.firstAction = chainActions(list, this.checkAppliedAction);\n }\n\n /**\n * @override\n */\n apply(cascadeInstance: CascadeInstance): void {\n this.firstAction.apply(cascadeInstance);\n if (!this.checkAppliedAction.applied) {\n this.chained.apply(cascadeInstance);\n }\n this.checkAppliedAction.applied = false;\n }\n\n /**\n * @override\n */\n getPriority(): number {\n return (this.firstAction as ChainedAction).getPriority();\n }\n}\n\n/**\n * An object that is notified as elements are pushed and popped and typically\n * controls a \"named condition\" (which is a count associated with a name).\n */\nexport interface ConditionItem {\n /**\n * Returns a \"fresh\" copy of this item. May be this if immutable.\n */\n fresh(cascadeInstance: CascadeInstance): ConditionItem;\n\n /**\n * Depth is 0 for element itself and its siblings, 1 for direct children and\n * -1 for the parent.\n */\n push(cascadeInstance: CascadeInstance, depth: number): boolean;\n\n /**\n * @return return true if no more notifications are desired\n */\n pop(cascadeInstance: CascadeInstance, depth: number): boolean;\n}\n\nexport class AbstractConditionItem {\n constructor(\n public readonly condition: string,\n public readonly viewConditionId: string | null,\n public readonly viewCondition: Matchers.Matcher,\n ) {}\n\n increment(cascadeInstance: CascadeInstance) {\n cascadeInstance.increment(this.condition, this.viewCondition);\n }\n\n decrement(cascadeInstance: CascadeInstance) {\n cascadeInstance.decrement(this.condition, this.viewCondition);\n }\n\n buildViewConditionMatcher(\n cascadeInstance: CascadeInstance,\n ): Matchers.Matcher {\n return cascadeInstance.buildViewConditionMatcher(this.viewConditionId);\n }\n}\n\nexport class DescendantConditionItem\n extends AbstractConditionItem\n implements ConditionItem {\n constructor(\n condition: string,\n viewConditionId: string | null,\n viewCondition: Matchers.Matcher,\n ) {\n super(condition, viewConditionId, viewCondition);\n }\n\n /**\n * @override\n */\n fresh(cascadeInstance: CascadeInstance): ConditionItem {\n return new DescendantConditionItem(\n this.condition,\n this.viewConditionId,\n this.buildViewConditionMatcher(cascadeInstance),\n );\n }\n\n /**\n * @override\n */\n push(cascadeInstance: CascadeInstance, depth: number): boolean {\n if (depth == 0) {\n this.increment(cascadeInstance);\n }\n return false;\n }\n\n /**\n * @override\n */\n pop(cascadeInstance: CascadeInstance, depth: number): boolean {\n if (depth == 0) {\n this.decrement(cascadeInstance);\n return true;\n }\n return false;\n }\n}\n\nexport class ChildConditionItem\n extends AbstractConditionItem\n implements ConditionItem {\n constructor(\n condition: string,\n viewConditionId: string | null,\n viewCondition: Matchers.Matcher,\n ) {\n super(condition, viewConditionId, viewCondition);\n }\n\n /**\n * @override\n */\n fresh(cascadeInstance: CascadeInstance): ConditionItem {\n return new ChildConditionItem(\n this.condition,\n this.viewConditionId,\n this.buildViewConditionMatcher(cascadeInstance),\n );\n }\n\n /**\n * @override\n */\n push(cascadeInstance: CascadeInstance, depth: number): boolean {\n if (depth == 0) {\n this.increment(cascadeInstance);\n } else if (depth == 1) {\n this.decrement(cascadeInstance);\n }\n return false;\n }\n\n /**\n * @override\n */\n pop(cascadeInstance: CascadeInstance, depth: number): boolean {\n if (depth == 0) {\n this.decrement(cascadeInstance);\n return true;\n } else if (depth == 1) {\n this.increment(cascadeInstance);\n }\n return false;\n }\n}\n\nexport class AdjacentSiblingConditionItem\n extends AbstractConditionItem\n implements ConditionItem {\n fired: boolean = false;\n\n constructor(\n condition: string,\n viewConditionId: string | null,\n viewCondition: Matchers.Matcher,\n ) {\n super(condition, viewConditionId, viewCondition);\n }\n\n /**\n * @override\n */\n fresh(cascadeInstance: CascadeInstance): ConditionItem {\n return new AdjacentSiblingConditionItem(\n this.condition,\n this.viewConditionId,\n this.buildViewConditionMatcher(cascadeInstance),\n );\n }\n\n /**\n * @override\n */\n push(cascadeInstance: CascadeInstance, depth: number): boolean {\n if (this.fired) {\n this.decrement(cascadeInstance);\n return true;\n }\n return false;\n }\n\n /**\n * @override\n */\n pop(cascadeInstance: CascadeInstance, depth: number): boolean {\n if (this.fired) {\n this.decrement(cascadeInstance);\n return true;\n }\n if (depth == 0) {\n // Leaving element that triggered this item.\n this.fired = true;\n this.increment(cascadeInstance);\n }\n return false;\n }\n}\n\nexport class FollowingSiblingConditionItem\n extends AbstractConditionItem\n implements ConditionItem {\n fired: boolean = false;\n\n constructor(\n condition: string,\n viewConditionId: string | null,\n viewCondition: Matchers.Matcher,\n ) {\n super(condition, viewConditionId, viewCondition);\n }\n\n /**\n * @override\n */\n fresh(cascadeInstance: CascadeInstance): ConditionItem {\n return new FollowingSiblingConditionItem(\n this.condition,\n this.viewConditionId,\n this.buildViewConditionMatcher(cascadeInstance),\n );\n }\n\n /**\n * @override\n */\n push(cascadeInstance: CascadeInstance, depth: number): boolean {\n if (this.fired) {\n if (depth == -1) {\n this.increment(cascadeInstance);\n } else if (depth == 0) {\n this.decrement(cascadeInstance);\n }\n }\n return false;\n }\n\n /**\n * @override\n */\n pop(cascadeInstance: CascadeInstance, depth: number): boolean {\n if (this.fired) {\n if (depth == -1) {\n this.decrement(cascadeInstance);\n return true;\n } else if (depth == 0) {\n this.increment(cascadeInstance);\n }\n } else {\n if (depth == 0) {\n // Leaving element that triggered this item.\n this.fired = true;\n this.increment(cascadeInstance);\n }\n }\n return false;\n }\n}\n\n/**\n * Not a true condition item, this class manages proper handling of \"after\"\n * pseudoelement.\n */\nexport class AfterPseudoelementItem implements ConditionItem {\n constructor(\n public readonly afterprop: ElementStyle,\n public readonly element: Element,\n ) {}\n\n /**\n * @override\n */\n fresh(cascadeInstance: CascadeInstance): ConditionItem {\n return this;\n }\n\n /**\n * @override\n */\n push(cascadeInstance: CascadeInstance, depth: number): boolean {\n return false;\n }\n\n /**\n * @override\n */\n pop(cascadeInstance: CascadeInstance, depth: number): boolean {\n if (depth == 0) {\n cascadeInstance.processPseudoelementProps(this.afterprop, this.element);\n return true;\n }\n return false;\n }\n}\n\n/**\n * Not a true condition item, this class restores current language.\n */\nexport class RestoreLangItem implements ConditionItem {\n constructor(public readonly lang: string) {}\n\n /**\n * @override\n */\n fresh(cascadeInstance: CascadeInstance): ConditionItem {\n return this;\n }\n\n /**\n * @override\n */\n push(cascadeInstance: CascadeInstance, depth: number): boolean {\n return false;\n }\n\n /**\n * @override\n */\n pop(cascadeInstance: CascadeInstance, depth: number): boolean {\n if (depth == 0) {\n cascadeInstance.lang = this.lang;\n return true;\n }\n return false;\n }\n}\n\n/**\n * Not a true condition item, this class manages inheritance of quotes property\n */\nexport class QuotesScopeItem implements ConditionItem {\n constructor(public readonly oldQuotes: Css.Str[]) {}\n\n /**\n * @override\n */\n fresh(cascadeInstance: CascadeInstance): ConditionItem {\n return this;\n }\n\n /**\n * @override\n */\n push(cascadeInstance: CascadeInstance, depth: number): boolean {\n return false;\n }\n\n /**\n * @override\n */\n pop(cascadeInstance: CascadeInstance, depth: number): boolean {\n if (depth == 0) {\n cascadeInstance.quotes = this.oldQuotes;\n return true;\n }\n return false;\n }\n}\nexport type CounterValues = {\n [key: string]: number[];\n};\n\nexport interface CounterListener {\n countersOfId(id: string, counters: CounterValues);\n\n getExprContentListener(): Vtree.ExprContentListener;\n}\n\nexport interface CounterResolver {\n setStyler(styler: any): void;\n\n /**\n * Returns an Exprs.Val, whose value is calculated at the layout time by\n * retrieving the innermost page-based counter (null if it does not exist) by\n * its name and formatting the value into a string.\n * @param name Name of the page-based counter to be retrieved\n * @param format A function that formats the counter value into a string\n */\n getPageCounterVal(\n name: string,\n format: (p1: number | null) => string,\n ): Exprs.Val;\n\n /**\n * Returns an Exprs.Val, whose value is calculated at the layout time by\n * retrieving the page-based counters by its name and formatting the values\n * into a string.\n * @param name Name of the page-based counters to be retrieved\n * @param format A function that formats the counter values (passed as an\n * array ordered by the nesting depth with the outermost counter first and\n * the innermost last) into a string\n */\n getPageCountersVal(name: string, format: (p1: number[]) => string): Exprs.Val;\n\n getTargetCounterVal(\n url: string,\n name: string,\n format: (p1: number | null) => string,\n ): Exprs.Val;\n\n getTargetCountersVal(\n url: string,\n name: string,\n format: (p1: number[]) => string,\n ): Exprs.Val;\n\n /**\n * Get value of the CSS string() function\n * https://drafts.csswg.org/css-gcpm-3/#using-named-strings\n */\n getNamedStringVal(name: string, retrievePosition: string): Exprs.Val;\n\n /**\n * Set named string for the CSS string-set property\n * https://drafts.csswg.org/css-gcpm-3/#setting-named-strings-the-string-set-pro\n */\n setNamedString(\n name: string,\n stringValue: string,\n cascadeInstance: CascadeInstance,\n ): void;\n}\n\nexport class AttrValueFilterVisitor extends Css.FilterVisitor {\n constructor(public element: Element) {\n super();\n }\n\n private createValueFromString(str: string | null, type: string): Css.Val {\n switch (type) {\n case \"url\":\n if (str) {\n return new Css.URL(str); // TODO should convert to absolute path\n }\n return new Css.URL(\"about:invalid\");\n case \"string\":\n default:\n if (str) {\n return new Css.Str(str);\n }\n return new Css.Str(\"\");\n }\n }\n\n /**\n * @override\n */\n visitFunc(func: Css.Func): Css.Val {\n if (func.name !== \"attr\") {\n return super.visitFunc(func);\n }\n let type = \"string\";\n let attributeName: string | null = null;\n let defaultValue: Css.Val = null;\n if (func.values[0] instanceof Css.SpaceList) {\n const values = (func.values[0] as Css.SpaceList).values;\n if (values.length >= 2) {\n type = values[1].stringValue();\n }\n attributeName = values[0].stringValue();\n } else {\n attributeName = func.values[0].stringValue();\n }\n if (func.values.length > 1) {\n defaultValue = this.createValueFromString(\n func.values[1].stringValue(),\n type,\n );\n } else {\n defaultValue = this.createValueFromString(null, type);\n }\n if (this.element && this.element.hasAttribute(attributeName)) {\n return this.createValueFromString(\n this.element.getAttribute(attributeName),\n type,\n );\n }\n return defaultValue;\n }\n}\n\n/**\n * Get concatenated string value from CSS `string-set` and `content` property\n */\nfunction getStringValueFromCssContentVal(val: Css.Val): string {\n // When this function is called, CSS `content()`, `attr()`, `counter()`\n // values are already resolved to strings values. Remaining non-string values\n // are ignored.\n if (Vtree.nonTrivialContent(val)) {\n if (val instanceof Css.Str) {\n return val.stringValue();\n }\n if (val instanceof Css.SpaceList) {\n return val.values.map((v) => getStringValueFromCssContentVal(v)).join(\"\");\n }\n }\n return \"\";\n}\n\nexport class ContentPropVisitor extends Css.FilterVisitor {\n constructor(\n public cascade: CascadeInstance,\n public element: Element,\n public readonly counterResolver: CounterResolver,\n ) {\n super();\n }\n\n /**\n * @override\n */\n visitIdent(ident: Css.Ident): Css.Val {\n const cascade = this.cascade;\n const quotes = cascade.quotes;\n const maxDepth = Math.floor(quotes.length / 2) - 1;\n switch (ident.name) {\n case \"open-quote\": {\n const result = quotes[2 * Math.min(maxDepth, cascade.quoteDepth)];\n cascade.quoteDepth++;\n return result;\n }\n case \"close-quote\":\n if (cascade.quoteDepth > 0) {\n cascade.quoteDepth--;\n }\n return quotes[2 * Math.min(maxDepth, cascade.quoteDepth) + 1];\n case \"no-open-quote\":\n cascade.quoteDepth++;\n return new Css.Str(\"\");\n case \"no-close-quote\":\n if (cascade.quoteDepth > 0) {\n cascade.quoteDepth--;\n }\n return new Css.Str(\"\");\n }\n return ident;\n }\n\n private format(num: number, type: string): string {\n let upper = false; // type == \"armenian\";\n // content-counter-10.xht assumes armenian is uppercase, enable if desired\n\n let lower = false;\n let r: RegExpMatchArray;\n if ((r = type.match(/^upper-(.*)/)) != null) {\n upper = true;\n type = r[1];\n } else if ((r = type.match(/^lower-(.*)/)) != null) {\n lower = true;\n type = r[1];\n }\n let result = \"\";\n if (additiveNumbering[type]) {\n result = additiveFormat(additiveNumbering[type], num);\n } else if (alphabeticNumbering[type]) {\n result = alphabeticFormat(alphabeticNumbering[type], num);\n } else if (fixed[type] != null) {\n result = fixed[type];\n } else if (type == \"decimal-leading-zero\") {\n result = `${num}`;\n if (result.length == 1) {\n result = `0${result}`;\n }\n } else if (type == \"cjk-ideographic\" || type == \"trad-chinese-informal\") {\n result = chineseCounter(num, chineseTradInformal);\n } else {\n result = `${num}`;\n }\n if (upper) {\n return result.toUpperCase();\n }\n if (lower) {\n return result.toLowerCase();\n }\n return result;\n }\n\n visitFuncCounter(values: Css.Val[]): Css.Val {\n const counterName = values[0].toString();\n const type = values.length > 1 ? values[1].stringValue() : \"decimal\";\n const arr = this.cascade.counters[counterName];\n if (arr && arr.length) {\n const numval = (arr && arr.length && arr[arr.length - 1]) || 0;\n return new Css.Str(this.format(numval, type));\n } else {\n const c = new Css.Expr(\n this.counterResolver.getPageCounterVal(counterName, (numval) =>\n this.format(numval || 0, type),\n ),\n );\n return new Css.SpaceList([c]);\n }\n }\n\n visitFuncCounters(values: Css.Val[]): Css.Val {\n const counterName = values[0].toString();\n const separator = values[1].stringValue();\n const type = values.length > 2 ? values[2].stringValue() : \"decimal\";\n const arr = this.cascade.counters[counterName];\n const sb = new Base.StringBuffer();\n if (arr && arr.length) {\n for (let i = 0; i < arr.length; i++) {\n if (i > 0) {\n sb.append(separator);\n }\n sb.append(this.format(arr[i], type));\n }\n }\n const c = new Css.Expr(\n this.counterResolver.getPageCountersVal(counterName, (numvals) => {\n const parts = [] as string[];\n if (numvals.length) {\n for (let i = 0; i < numvals.length; i++) {\n parts.push(this.format(numvals[i], type));\n }\n }\n const elementCounters = sb.toString();\n if (elementCounters.length) {\n parts.push(elementCounters);\n }\n if (parts.length) {\n return parts.join(separator);\n } else {\n return this.format(0, type);\n }\n }),\n );\n return new Css.SpaceList([c]);\n }\n\n visitFuncTargetCounter(values: Css.Val[]): Css.Val {\n const targetUrl = values[0];\n let targetUrlStr: string;\n if (targetUrl instanceof Css.URL) {\n targetUrlStr = targetUrl.url;\n } else {\n targetUrlStr = targetUrl.stringValue();\n }\n const counterName = values[1].toString();\n const type = values.length > 2 ? values[2].stringValue() : \"decimal\";\n const c = new Css.Expr(\n this.counterResolver.getTargetCounterVal(\n targetUrlStr,\n counterName,\n (numval) => this.format(numval || 0, type),\n ),\n );\n return new Css.SpaceList([c]);\n }\n\n visitFuncTargetCounters(values: Css.Val[]): Css.Val {\n const targetUrl = values[0];\n let targetUrlStr: string;\n if (targetUrl instanceof Css.URL) {\n targetUrlStr = targetUrl.url;\n } else {\n targetUrlStr = targetUrl.stringValue();\n }\n const counterName = values[1].toString();\n const separator = values[2].stringValue();\n const type = values.length > 3 ? values[3].stringValue() : \"decimal\";\n const c = new Css.Expr(\n this.counterResolver.getTargetCountersVal(\n targetUrlStr,\n counterName,\n (numvals) => {\n const parts = numvals.map((numval) => this.format(numval, type));\n if (parts.length) {\n return parts.join(separator);\n } else {\n return this.format(0, type);\n }\n },\n ),\n );\n return new Css.SpaceList([c]);\n }\n\n /**\n * CSS `string()` function\n * https://drafts.csswg.org/css-gcpm-3/#using-named-strings\n */\n visitFuncString(values: Css.Val[]): Css.Val {\n const name = values.length > 0 ? values[0].stringValue() : \"\";\n const retrievePosition =\n values.length > 1 ? values[1].stringValue() : \"first\";\n const c = new Css.Expr(\n this.counterResolver.getNamedStringVal(name, retrievePosition),\n );\n return new Css.SpaceList([c]);\n }\n\n /**\n * CSS `content()` function\n * https://drafts.csswg.org/css-gcpm-3/#content-function-header\n */\n visitFuncContent(values: Css.Val[]): Css.Val {\n const pseudoName = values.length > 0 ? values[0].stringValue() : \"text\";\n let stringValue = \"\";\n switch (pseudoName) {\n case \"text\":\n case \"first-letter\":\n stringValue = this.element.textContent.trim().replace(/\\s+/g, \" \");\n if (pseudoName === \"first-letter\") {\n const r = stringValue.match(Base.firstLetterPattern);\n stringValue = r ? r[0] : \"\";\n }\n break;\n case \"before\":\n case \"after\":\n {\n const pseudos = getStyleMap(this.cascade.currentStyle, \"_pseudos\");\n const val: Css.Val = pseudos?.[pseudoName]?.[\"content\"]?.value;\n stringValue = getStringValueFromCssContentVal(val);\n }\n break;\n }\n return new Css.Str(stringValue);\n }\n\n /**\n * @override\n */\n visitFunc(func: Css.Func): Css.Val {\n switch (func.name) {\n case \"counter\":\n if (func.values.length <= 2) {\n return this.visitFuncCounter(func.values);\n }\n break;\n case \"counters\":\n if (func.values.length <= 3) {\n return this.visitFuncCounters(func.values);\n }\n break;\n case \"target-counter\":\n if (func.values.length <= 3) {\n return this.visitFuncTargetCounter(func.values);\n }\n break;\n case \"target-counters\":\n if (func.values.length <= 4) {\n return this.visitFuncTargetCounters(func.values);\n }\n break;\n case \"string\":\n if (func.values.length <= 2) {\n return this.visitFuncString(func.values);\n }\n break;\n case \"content\":\n if (func.values.length <= 1) {\n return this.visitFuncContent(func.values);\n }\n break;\n }\n Logging.logger.warn(\"E_CSS_CONTENT_PROP:\", func.toString());\n return new Css.Str(\"\");\n }\n}\n\nexport function roman(num: number): string {\n if (num <= 0 || num != Math.round(num) || num > 3999) {\n return \"\";\n }\n const digits = [\"I\", \"V\", \"X\", \"L\", \"C\", \"D\", \"M\"];\n let offset = 0;\n let acc = \"\";\n while (num > 0) {\n let digit = num % 10;\n num = (num - digit) / 10;\n let result = \"\";\n if (digit == 9) {\n result += digits[offset] + digits[offset + 2];\n } else if (digit == 4) {\n result += digits[offset] + digits[offset + 1];\n } else {\n if (digit >= 5) {\n result += digits[offset + 1];\n digit -= 5;\n }\n while (digit > 0) {\n result += digits[offset];\n digit--;\n }\n }\n acc = result + acc;\n offset += 2;\n }\n return acc;\n}\n\nexport const additiveNumbering = {\n roman: [\n 4999,\n 1000,\n \"M\",\n 900,\n \"CM\",\n 500,\n \"D\",\n 400,\n \"CD\",\n 100,\n \"C\",\n 90,\n \"XC\",\n 50,\n \"L\",\n 40,\n \"XL\",\n 10,\n \"X\",\n 9,\n \"IX\",\n 5,\n \"V\",\n 4,\n \"IV\",\n 1,\n \"I\",\n ],\n armenian: [\n 9999,\n 9000,\n \"\\u0584\",\n 8000,\n \"\\u0583\",\n 7000,\n \"\\u0582\",\n 6000,\n \"\\u0581\",\n 5000,\n \"\\u0580\",\n 4000,\n \"\\u057f\",\n 3000,\n \"\\u057e\",\n 2000,\n \"\\u057d\",\n 1000,\n \"\\u057c\",\n 900,\n \"\\u057b\",\n 800,\n \"\\u057a\",\n 700,\n \"\\u0579\",\n 600,\n \"\\u0578\",\n 500,\n \"\\u0577\",\n 400,\n \"\\u0576\",\n 300,\n \"\\u0575\",\n 200,\n \"\\u0574\",\n 100,\n \"\\u0573\",\n 90,\n \"\\u0572\",\n 80,\n \"\\u0571\",\n 70,\n \"\\u0570\",\n 60,\n \"\\u056f\",\n 50,\n \"\\u056e\",\n 40,\n \"\\u056d\",\n 30,\n \"\\u056c\",\n 20,\n \"\\u056b\",\n 10,\n \"\\u056a\",\n 9,\n \"\\u0569\",\n 8,\n \"\\u0568\",\n 7,\n \"\\u0567\",\n 6,\n \"\\u0566\",\n 5,\n \"\\u0565\",\n 4,\n \"\\u0564\",\n 3,\n \"\\u0563\",\n 2,\n \"\\u0562\",\n 1,\n \"\\u0561\",\n ],\n georgian: [\n 19999,\n 10000,\n \"\\u10f5\",\n 9000,\n \"\\u10f0\",\n 8000,\n \"\\u10ef\",\n 7000,\n \"\\u10f4\",\n 6000,\n \"\\u10ee\",\n 5000,\n \"\\u10ed\",\n 4000,\n \"\\u10ec\",\n 3000,\n \"\\u10eb\",\n 2000,\n \"\\u10ea\",\n 1000,\n \"\\u10e9\",\n 900,\n \"\\u10e8\",\n 800,\n \"\\u10e7\",\n 700,\n \"\\u10e6\",\n 600,\n \"\\u10e5\",\n 500,\n \"\\u10e4\",\n 400,\n \"\\u10f3\",\n 300,\n \"\\u10e2\",\n 200,\n \"\\u10e1\",\n 100,\n \"\\u10e0\",\n 90,\n \"\\u10df\",\n 80,\n \"\\u10de\",\n 70,\n \"\\u10dd\",\n 60,\n \"\\u10f2\",\n 50,\n \"\\u10dc\",\n 40,\n \"\\u10db\",\n 30,\n \"\\u10da\",\n 20,\n \"\\u10d9\",\n 10,\n \"\\u10d8\",\n 9,\n \"\\u10d7\",\n 8,\n \"\\u10f1\",\n 7,\n \"\\u10d6\",\n 6,\n \"\\u10d5\",\n 5,\n \"\\u10d4\",\n 4,\n \"\\u10d3\",\n 3,\n \"\\u10d2\",\n 2,\n \"\\u10d1\",\n 1,\n \"\\u10d0\",\n ],\n hebrew: [\n 999,\n 400,\n \"\\u05ea\",\n 300,\n \"\\u05e9\",\n 200,\n \"\\u05e8\",\n 100,\n \"\\u05e7\",\n 90,\n \"\\u05e6\",\n 80,\n \"\\u05e4\",\n 70,\n \"\\u05e2\",\n 60,\n \"\\u05e1\",\n 50,\n \"\\u05e0\",\n 40,\n \"\\u05de\",\n 30,\n \"\\u05dc\",\n 20,\n \"\\u05db\",\n 19,\n \"\\u05d9\\u05d8\",\n 18,\n \"\\u05d9\\u05d7\",\n 17,\n \"\\u05d9\\u05d6\",\n 16,\n \"\\u05d8\\u05d6\",\n 15,\n \"\\u05d8\\u05d5\",\n 10,\n \"\\u05d9\",\n 9,\n \"\\u05d8\",\n 8,\n \"\\u05d7\",\n 7,\n \"\\u05d6\",\n 6,\n \"\\u05d5\",\n 5,\n \"\\u05d4\",\n 4,\n \"\\u05d3\",\n 3,\n \"\\u05d2\",\n 2,\n \"\\u05d1\",\n 1,\n \"\\u05d0\",\n ],\n};\n\nexport const alphabeticNumbering = {\n latin: \"a-z\",\n alpha: \"a-z\",\n greek: \"\\u03b1-\\u03c1\\u03c3-\\u03c9\",\n russian: \"\\u0430-\\u0438\\u043a-\\u0449\\u044d-\\u044f\",\n};\n\nexport const fixed = {\n square: \"\\u25a0\",\n disc: \"\\u2022\",\n circle: \"\\u25e6\",\n none: \"\",\n};\n\nexport function additiveFormat(entries: any[], num: number): string {\n const max = entries[0] as number;\n if (num > max || num <= 0 || num != Math.round(num)) {\n return \"\";\n }\n let result = \"\";\n for (let i = 1; i < entries.length; i += 2) {\n const value = entries[i] as number;\n let count = Math.floor(num / value);\n if (count > 20) {\n return \"\";\n }\n num -= count * value;\n while (count > 0) {\n result += entries[i + 1];\n count--;\n }\n }\n return result;\n}\n\nexport function expandAlphabet(str: string): string[] | null {\n const arr = [];\n let i = 0;\n while (i < str.length) {\n if (str.substr(i + 1, 1) == \"-\") {\n const first = str.charCodeAt(i);\n const last = str.charCodeAt(i + 2);\n i += 3;\n for (let k = first; k <= last; k++) {\n arr.push(String.fromCharCode(k));\n }\n } else {\n arr.push(str.substr(i++, 1));\n }\n }\n return arr;\n}\n\nexport function alphabeticFormat(alphabetStr: string, num: number): string {\n if (num <= 0 || num != Math.round(num)) {\n return \"\";\n }\n const alphabet = expandAlphabet(alphabetStr);\n let result = \"\";\n do {\n num--;\n const digit = num % alphabet.length;\n result = alphabet[digit] + result;\n num = (num - digit) / alphabet.length;\n } while (num > 0);\n return result;\n}\n\nexport type ChineseNumbering = {\n digits: string;\n markers: string;\n negative: string;\n formal: boolean;\n};\n\n/**\n * From http://www.w3.org/TR/css3-lists/\n */\nexport const chineseTradInformal: ChineseNumbering = {\n formal: false,\n digits: \"\\u96f6\\u4e00\\u4e8c\\u4e09\\u56db\\u4e94\\u516d\\u4e03\\u516b\\u4e5d\",\n markers: \"\\u5341\\u767e\\u5343\",\n negative: \"\\u8ca0\",\n};\n\nexport function chineseCounter(\n num: number,\n numbering: ChineseNumbering,\n): string {\n if (num > 9999 || num < -9999) {\n return `${num}`; // TODO: should be cjk-decimal\n }\n if (num == 0) {\n return numbering.digits.charAt(0);\n }\n const res = new Base.StringBuffer();\n if (num < 0) {\n res.append(numbering.negative);\n num = -num;\n }\n if (num < 10) {\n res.append(numbering.digits.charAt(num));\n } else if (!numbering.formal && num <= 19) {\n res.append(numbering.markers.charAt(0));\n if (num != 0) {\n res.append(numbering.digits.charAt(num - 10));\n }\n } else {\n const thousands = Math.floor(num / 1000);\n if (thousands) {\n res.append(numbering.digits.charAt(thousands));\n res.append(numbering.markers.charAt(2));\n }\n const hundreds = Math.floor(num / 100) % 10;\n if (hundreds) {\n res.append(numbering.digits.charAt(hundreds));\n res.append(numbering.markers.charAt(1));\n }\n const tens = Math.floor(num / 10) % 10;\n if (tens) {\n res.append(numbering.digits.charAt(tens));\n res.append(numbering.markers.charAt(0));\n }\n const ones = num % 10;\n if (ones) {\n res.append(numbering.digits.charAt(ones));\n }\n }\n\n // res.append(\"\\u3001\");\n return res.toString();\n}\n\n/**\n * Fitting order and specificity in the same number. Order is recorded in the\n * fractional part. Select value so that\n *\n * 0x7FFFFFFF != 0x7FFFFFFF + ORDER_INCREMENT\n *\n */\nexport const ORDER_INCREMENT = 1 / 1048576;\n\nexport function copyTable(src: ActionTable, dst: ActionTable): void {\n for (const n in src) {\n dst[n] = src[n].clone();\n }\n}\n\nexport class Cascade {\n nsCount: number = 0;\n nsPrefix: { [key: string]: string } = {};\n tags: ActionTable = {};\n nstags: ActionTable = {};\n epubtypes: ActionTable = {};\n classes: ActionTable = {};\n ids: ActionTable = {};\n pagetypes: ActionTable = {};\n order: number = 0;\n\n clone(): Cascade {\n const r = new Cascade();\n r.nsCount = this.nsCount;\n for (const p in this.nsPrefix) {\n r.nsPrefix[p] = this.nsPrefix[p];\n }\n copyTable(this.tags, r.tags);\n copyTable(this.nstags, r.nstags);\n copyTable(this.epubtypes, r.epubtypes);\n copyTable(this.classes, r.classes);\n copyTable(this.ids, r.ids);\n copyTable(this.pagetypes, r.pagetypes);\n r.order = this.order;\n return r;\n }\n\n insertInTable(table: ActionTable, key: string, action: CascadeAction): void {\n const a = table[key];\n if (a) {\n action = a.mergeWith(action);\n }\n table[key] = action;\n }\n\n createInstance(\n context: Exprs.Context,\n counterListener: CounterListener,\n counterResolver: CounterResolver,\n lang,\n ): CascadeInstance {\n return new CascadeInstance(\n this,\n context,\n counterListener,\n counterResolver,\n lang,\n );\n }\n\n nextOrder(): number {\n return (this.order += ORDER_INCREMENT);\n }\n}\n\nexport class CascadeInstance {\n code: Cascade;\n stack = [[], []] as ConditionItem[][];\n conditions = {} as { [key: string]: number };\n currentElement: Element | null = null;\n currentElementOffset: number | null = null;\n currentStyle: ElementStyle | null = null;\n currentClassNames: string[] | null = null;\n currentLocalName: string = \"\";\n currentNamespace: string = \"\";\n currentId: string = \"\";\n currentXmlId: string = \"\";\n currentNSTag: string = \"\";\n currentEpubTypes: string[] | null = null;\n currentPageType: string | null = null;\n isFirst: boolean = true;\n isRoot: boolean = true;\n counters: CounterValues = {};\n counterScoping: { [key: string]: boolean }[] = [{}];\n quotes: Css.Str[];\n quoteDepth: number = 0;\n lang: string = \"\";\n siblingOrderStack: number[] = [0];\n currentSiblingOrder: number = 0;\n siblingTypeCountsStack: { [key: string]: { [key: string]: number } }[] = [{}];\n currentSiblingTypeCounts: { [key: string]: { [key: string]: number } };\n currentFollowingSiblingOrder: number | null = null;\n followingSiblingOrderStack: (number | null)[];\n followingSiblingTypeCountsStack: {\n [key: string]: { [key: string]: number };\n }[] = [{}];\n currentFollowingSiblingTypeCounts: {\n [key: string]: { [key: string]: number };\n };\n viewConditions: { [key: string]: Matchers.Matcher[] } = {};\n dependentConditions: string[] = [];\n elementStack: Element[];\n\n constructor(\n cascade: Cascade,\n public readonly context: Exprs.Context,\n public readonly counterListener: CounterListener,\n public readonly counterResolver: CounterResolver,\n lang: string,\n ) {\n this.code = cascade;\n this.quotes = [\n new Css.Str(\"\\u201c\"),\n new Css.Str(\"\\u201d\"),\n new Css.Str(\"\\u2018\"),\n new Css.Str(\"\\u2019\"),\n ];\n this.currentSiblingTypeCounts = this.siblingTypeCountsStack[0];\n this.followingSiblingOrderStack = [this.currentFollowingSiblingOrder];\n this.currentFollowingSiblingTypeCounts = this.siblingTypeCountsStack[0];\n if (VIVLIOSTYLE_DEBUG) {\n this.elementStack = [];\n }\n }\n\n pushConditionItem(item: ConditionItem): void {\n this.stack[this.stack.length - 1].push(item);\n }\n\n increment(condition: string, viewCondition: Matchers.Matcher): void {\n this.conditions[condition] = (this.conditions[condition] || 0) + 1;\n if (!viewCondition) {\n return;\n }\n if (this.viewConditions[condition]) {\n this.viewConditions[condition].push(viewCondition);\n } else {\n this.viewConditions[condition] = [viewCondition];\n }\n }\n\n decrement(condition: string, viewCondition: Matchers.Matcher): void {\n this.conditions[condition]--;\n if (!this.viewConditions[condition]) {\n return;\n }\n this.viewConditions[condition] = this.viewConditions[condition].filter(\n (item) => item !== viewCondition,\n );\n if (this.viewConditions[condition].length === 0) {\n delete this.viewConditions[condition];\n }\n }\n\n buildViewConditionMatcher(viewConditionId: string | null): Matchers.Matcher {\n let matcher: Matchers.Matcher = null;\n if (viewConditionId) {\n Asserts.assert(this.currentElementOffset);\n matcher = Matchers.MatcherBuilder.buildViewConditionMatcher(\n this.currentElementOffset,\n viewConditionId,\n );\n }\n const dependentConditionMatchers = this.dependentConditions\n .map((conditionId) => {\n const conditions = this.viewConditions[conditionId];\n if (conditions && conditions.length > 0) {\n return conditions.length === 1\n ? conditions[0]\n : Matchers.MatcherBuilder.buildAnyMatcher([].concat(conditions));\n } else {\n return null;\n }\n })\n .filter((item) => item);\n if (dependentConditionMatchers.length <= 0) {\n return matcher;\n }\n if (matcher === null) {\n return dependentConditionMatchers.length === 1\n ? dependentConditionMatchers[0]\n : Matchers.MatcherBuilder.buildAllMatcher(dependentConditionMatchers);\n }\n return Matchers.MatcherBuilder.buildAllMatcher(\n [matcher].concat(dependentConditionMatchers),\n );\n }\n\n applyAction(table: ActionTable, key: string): void {\n const action = table[key];\n if (action) {\n action.apply(this);\n }\n }\n\n pushRule(\n classes: string[],\n pageType: string | null,\n baseStyle: ElementStyle,\n ): void {\n this.currentElement = null;\n this.currentElementOffset = null;\n this.currentStyle = baseStyle;\n this.currentNamespace = \"\";\n this.currentLocalName = \"\";\n this.currentId = \"\";\n this.currentXmlId = \"\";\n this.currentClassNames = classes;\n this.currentNSTag = \"\";\n this.currentEpubTypes = EMPTY;\n this.currentPageType = pageType;\n this.applyActions();\n }\n\n defineCounter(counterName: string, value: number) {\n if (this.counters[counterName]) {\n this.counters[counterName].push(value);\n } else {\n this.counters[counterName] = [value];\n }\n let scoping = this.counterScoping[this.counterScoping.length - 1];\n if (!scoping) {\n scoping = {};\n this.counterScoping[this.counterScoping.length - 1] = scoping;\n }\n scoping[counterName] = true;\n }\n\n pushCounters(props: ElementStyle): void {\n let displayVal = Css.ident.inline;\n const display = props[\"display\"];\n if (display) {\n displayVal = display.evaluate(this.context);\n }\n let resetMap: { [key: string]: number } = null;\n let incrementMap: { [key: string]: number } = null;\n let setMap: { [key: string]: number } = null;\n const reset = props[\"counter-reset\"];\n if (reset) {\n const resetVal = reset.evaluate(this.context);\n if (resetVal) {\n resetMap = CssProp.toCounters(resetVal, true);\n }\n }\n const set = props[\"counter-set\"];\n if (set) {\n const setVal = set.evaluate(this.context);\n if (setVal) {\n setMap = CssProp.toCounters(setVal, false);\n }\n }\n const increment = props[\"counter-increment\"];\n if (increment) {\n const incrementVal = increment.evaluate(this.context);\n if (incrementVal) {\n incrementMap = CssProp.toCounters(incrementVal, false);\n }\n }\n if (\n (this.currentLocalName == \"ol\" || this.currentLocalName == \"ul\") &&\n this.currentNamespace == Base.NS.XHTML\n ) {\n if (!resetMap) {\n resetMap = {};\n }\n resetMap[\"ua-list-item\"] = ((this.currentElement as any)?.start ?? 1) - 1;\n }\n if (displayVal === Css.ident.list_item) {\n if (!incrementMap) {\n incrementMap = {};\n }\n incrementMap[\"ua-list-item\"] = 1;\n if (\n /^\\s*[-+]?\\d/.test(this.currentElement?.getAttribute(\"value\") ?? \"\")\n ) {\n if (!resetMap) {\n resetMap = {};\n }\n resetMap[\"ua-list-item\"] = (this.currentElement as any).value - 1;\n }\n }\n if (resetMap) {\n for (const resetCounterName in resetMap) {\n this.defineCounter(resetCounterName, resetMap[resetCounterName]);\n }\n }\n if (setMap) {\n for (const setCounterName in setMap) {\n if (!this.counters[setCounterName]) {\n this.defineCounter(setCounterName, setMap[setCounterName]);\n } else {\n const counterValues = this.counters[setCounterName];\n counterValues[counterValues.length - 1] = setMap[setCounterName];\n }\n }\n }\n if (incrementMap) {\n for (const incrementCounterName in incrementMap) {\n if (!this.counters[incrementCounterName]) {\n this.defineCounter(incrementCounterName, 0);\n }\n const counterValues = this.counters[incrementCounterName];\n counterValues[counterValues.length - 1] +=\n incrementMap[incrementCounterName];\n }\n }\n if (displayVal === Css.ident.list_item) {\n const listItemCounts = this.counters[\"ua-list-item\"];\n const listItemCount = listItemCounts[listItemCounts.length - 1];\n props[\"ua-list-item-count\"] = new CascadeValue(\n new Css.Num(listItemCount),\n 0,\n );\n }\n this.counterScoping.push(null);\n }\n\n popCounters(): void {\n const scoping = this.counterScoping.pop();\n if (scoping) {\n for (const counterName in scoping) {\n const arr = this.counters[counterName];\n if (arr) {\n if (arr.length == 1) {\n delete this.counters[counterName];\n } else {\n arr.pop();\n }\n }\n }\n }\n }\n\n /**\n * Process CSS string-set property\n * https://drafts.csswg.org/css-gcpm-3/#setting-named-strings-the-string-set-pro\n */\n setNamedStrings(props: ElementStyle): void {\n let stringSet: CascadeValue = props[\"string-set\"];\n if (!stringSet) {\n return;\n }\n stringSet = stringSet.filterValue(\n new ContentPropVisitor(this, this.currentElement, this.counterResolver),\n );\n const sets =\n stringSet.value instanceof Css.CommaList\n ? stringSet.value.values\n : [stringSet.value];\n\n for (const set of sets) {\n if (set instanceof Css.SpaceList) {\n const name = set.values[0].stringValue();\n const stringValue = set.values\n .slice(1)\n .map((v) => getStringValueFromCssContentVal(v))\n .join(\"\");\n this.counterResolver.setNamedString(name, stringValue, this);\n }\n }\n delete props[\"string-set\"];\n }\n\n processPseudoelementProps(pseudoprops: ElementStyle, element: Element): void {\n this.pushCounters(pseudoprops);\n if (pseudoprops[\"content\"]) {\n pseudoprops[\"content\"] = pseudoprops[\"content\"].filterValue(\n new ContentPropVisitor(this, element, this.counterResolver),\n );\n }\n this.popCounters();\n }\n\n pushElement(\n element: Element,\n baseStyle: ElementStyle,\n elementOffset: number,\n ): void {\n if (VIVLIOSTYLE_DEBUG) {\n this.elementStack.push(element);\n }\n\n // do not apply page rules\n this.currentPageType = null;\n this.currentElement = element;\n this.currentElementOffset = elementOffset;\n this.currentStyle = baseStyle;\n this.currentNamespace = element.namespaceURI;\n this.currentLocalName = element.localName;\n const prefix = this.code.nsPrefix[this.currentNamespace];\n if (prefix) {\n this.currentNSTag = prefix + this.currentLocalName;\n } else {\n this.currentNSTag = \"\";\n }\n this.currentId = element.getAttribute(\"id\");\n this.currentXmlId = element.getAttributeNS(Base.NS.XML, \"id\");\n const classes = element.getAttribute(\"class\");\n if (classes) {\n this.currentClassNames = classes.split(/\\s+/);\n } else {\n this.currentClassNames = EMPTY;\n }\n const types = element.getAttributeNS(Base.NS.epub, \"type\");\n if (types) {\n this.currentEpubTypes = types.split(/\\s+/);\n } else {\n this.currentEpubTypes = EMPTY;\n }\n const lang = Base.getLangAttribute(element);\n if (lang) {\n this.stack[this.stack.length - 1].push(new RestoreLangItem(this.lang));\n this.lang = lang.toLowerCase();\n }\n const isRoot = this.isRoot;\n const siblingOrderStack = this.siblingOrderStack;\n this.currentSiblingOrder = ++siblingOrderStack[\n siblingOrderStack.length - 1\n ];\n siblingOrderStack.push(0);\n const siblingTypeCountsStack = this.siblingTypeCountsStack;\n const currentSiblingTypeCounts = (this.currentSiblingTypeCounts =\n siblingTypeCountsStack[siblingTypeCountsStack.length - 1]);\n let currentNamespaceTypeCounts =\n currentSiblingTypeCounts[this.currentNamespace];\n if (!currentNamespaceTypeCounts) {\n currentNamespaceTypeCounts = currentSiblingTypeCounts[\n this.currentNamespace\n ] = {};\n }\n currentNamespaceTypeCounts[this.currentLocalName] =\n (currentNamespaceTypeCounts[this.currentLocalName] || 0) + 1;\n siblingTypeCountsStack.push({});\n const followingSiblingOrderStack = this.followingSiblingOrderStack;\n if (\n followingSiblingOrderStack[followingSiblingOrderStack.length - 1] !== null\n ) {\n this.currentFollowingSiblingOrder = --followingSiblingOrderStack[\n followingSiblingOrderStack.length - 1\n ];\n } else {\n this.currentFollowingSiblingOrder = null;\n }\n followingSiblingOrderStack.push(null);\n const followingSiblingTypeCountsStack = this\n .followingSiblingTypeCountsStack;\n const currentFollowingSiblingTypeCounts = (this.currentFollowingSiblingTypeCounts =\n followingSiblingTypeCountsStack[\n followingSiblingTypeCountsStack.length - 1\n ]);\n if (\n currentFollowingSiblingTypeCounts &&\n currentFollowingSiblingTypeCounts[this.currentNamespace]\n ) {\n currentFollowingSiblingTypeCounts[this.currentNamespace][\n this.currentLocalName\n ]--;\n }\n followingSiblingTypeCountsStack.push({});\n this.applyActions();\n this.applyAttrFilter(element);\n const quotesCasc = baseStyle[\"quotes\"];\n let itemToPushLast: QuotesScopeItem | null = null;\n if (quotesCasc) {\n const quotesVal = quotesCasc.evaluate(this.context);\n if (quotesVal) {\n itemToPushLast = new QuotesScopeItem(this.quotes);\n if (quotesVal === Css.ident.none) {\n this.quotes = [new Css.Str(\"\"), new Css.Str(\"\")];\n } else if (quotesVal instanceof Css.SpaceList) {\n this.quotes = (quotesVal as Css.SpaceList).values as Css.Str[];\n }\n }\n }\n this.pushCounters(this.currentStyle);\n const id =\n this.currentId || this.currentXmlId || element.getAttribute(\"name\") || \"\";\n if (isRoot || id) {\n const counters: CounterValues = {};\n Object.keys(this.counters).forEach((name) => {\n counters[name] = Array.from(this.counters[name]);\n });\n this.counterListener.countersOfId(id, counters);\n }\n const pseudos = getStyleMap(this.currentStyle, \"_pseudos\");\n if (pseudos) {\n let before = true;\n for (const pseudoName of pseudoNames) {\n if (!pseudoName) {\n // content\n before = false;\n }\n const pseudoProps = pseudos[pseudoName];\n if (pseudoProps) {\n if (before) {\n this.processPseudoelementProps(pseudoProps, element);\n } else {\n this.stack[this.stack.length - 2].push(\n new AfterPseudoelementItem(pseudoProps, element),\n );\n }\n }\n }\n }\n\n // process CSS string-set property\n this.setNamedStrings(this.currentStyle);\n\n if (itemToPushLast) {\n this.stack[this.stack.length - 2].push(itemToPushLast);\n }\n }\n\n private applyAttrFilterInner(visitor, elementStyle): void {\n for (const propName in elementStyle) {\n if (isPropName(propName)) {\n elementStyle[propName] = elementStyle[propName].filterValue(visitor);\n }\n }\n }\n\n private applyAttrFilter(element): void {\n const visitor = new AttrValueFilterVisitor(element);\n const currentStyle = this.currentStyle;\n const pseudoMap = getStyleMap(currentStyle, \"_pseudos\");\n for (const pseudoName in pseudoMap) {\n this.applyAttrFilterInner(visitor, pseudoMap[pseudoName]);\n }\n this.applyAttrFilterInner(visitor, currentStyle);\n }\n\n private applyActions(): void {\n let i: number;\n for (i = 0; i < this.currentClassNames.length; i++) {\n this.applyAction(this.code.classes, this.currentClassNames[i]);\n }\n for (i = 0; i < this.currentEpubTypes.length; i++) {\n this.applyAction(this.code.epubtypes, this.currentEpubTypes[i]);\n }\n this.applyAction(this.code.ids, this.currentId);\n this.applyAction(this.code.tags, this.currentLocalName);\n if (this.currentLocalName != \"\") {\n // Universal selector does not apply to page-master-related rules.\n this.applyAction(this.code.tags, \"*\");\n }\n this.applyAction(this.code.nstags, this.currentNSTag);\n\n // Apply page rules only when currentPageType is not null\n if (this.currentPageType !== null) {\n this.applyAction(this.code.pagetypes, this.currentPageType);\n\n // We represent page rules without selectors by *, though it is illegal in\n // CSS\n this.applyAction(this.code.pagetypes, \"*\");\n }\n\n this.stack.push([]);\n for (let depth = 1; depth >= -1; --depth) {\n const list = this.stack[this.stack.length - depth - 2];\n i = 0;\n while (i < list.length) {\n if (list[i].push(this, depth)) {\n // done\n list.splice(i, 1);\n } else {\n i++;\n }\n }\n }\n this.isFirst = true;\n this.isRoot = false;\n }\n\n private pop(): void {\n for (let depth = 1; depth >= -1; --depth) {\n const list = this.stack[this.stack.length - depth - 2];\n let i = 0;\n while (i < list.length) {\n if (list[i].pop(this, depth)) {\n // done\n list.splice(i, 1);\n } else {\n i++;\n }\n }\n }\n this.stack.pop();\n this.isFirst = false;\n }\n\n popRule(): void {\n this.pop();\n }\n\n popElement(element: Element): void {\n if (VIVLIOSTYLE_DEBUG) {\n const e = this.elementStack.pop();\n if (e !== element) {\n throw new Error(\"Invalid call to popElement\");\n }\n }\n this.siblingOrderStack.pop();\n this.siblingTypeCountsStack.pop();\n this.followingSiblingOrderStack.pop();\n this.followingSiblingTypeCountsStack.pop();\n this.pop();\n this.popCounters();\n }\n}\n\nexport const EMPTY = [];\n\n/**\n * Pseudoelement names in the order they should be processed, empty string is\n * the place where the element's DOM children are processed.\n */\nexport const pseudoNames = [\n \"before\",\n \"transclusion-before\",\n \"footnote-call\",\n \"footnote-marker\",\n \"inner\",\n \"first-letter\",\n \"first-line\",\n \"\",\n /* content */\n \"transclusion-after\",\n \"after\",\n];\n\n/**\n * @enum {number}\n */\nexport enum ParseState {\n TOP,\n SELECTOR,\n RULE,\n}\n\n/**\n * Cascade for base User Agent stylesheet.\n */\nexport let uaBaseCascade: Cascade = null;\nexport function setUABaseCascade(value: Cascade): void {\n uaBaseCascade = value;\n}\n\n//------------- parsing ------------\nexport class CascadeParserHandler\n extends CssParser.SlaveParserHandler\n implements CssValidator.PropertyReceiver {\n chain: ChainedAction[] = null;\n specificity: number = 0;\n elementStyle: ElementStyle = null;\n conditionCount: number = 0;\n pseudoelement: string | null = null;\n footnoteContent: boolean = false;\n cascade: Cascade;\n state: ParseState;\n viewConditionId: string | null = null;\n insideSelectorRule: ParseState;\n\n constructor(\n scope: Exprs.LexicalScope,\n owner: CssParser.DispatchParserHandler,\n public readonly condition: Exprs.Val,\n parent: CascadeParserHandler,\n public readonly regionId: string | null,\n public readonly validatorSet: CssValidator.ValidatorSet,\n topLevel: boolean,\n ) {\n super(scope, owner, topLevel);\n this.cascade = parent\n ? parent.cascade\n : uaBaseCascade\n ? uaBaseCascade.clone()\n : new Cascade();\n this.state = ParseState.TOP;\n }\n\n protected insertNonPrimary(action: CascadeAction): void {\n this.cascade.insertInTable(this.cascade.tags, \"*\", action);\n }\n\n processChain(action: CascadeAction): void {\n const chained = chainActions(this.chain, action);\n if (\n chained !== action &&\n (chained as ChainedAction).makePrimary(this.cascade)\n ) {\n return;\n }\n this.insertNonPrimary(chained);\n }\n\n isInsideSelectorRule(mnemonics: string): boolean {\n if (this.state != ParseState.TOP) {\n this.reportAndSkip(mnemonics);\n return true;\n }\n return false;\n }\n\n /**\n * @override\n */\n tagSelector(ns: string | null, name: string | null): void {\n if (!name && !ns) {\n return;\n }\n this.specificity += 1;\n if (name && ns) {\n this.chain.push(new CheckNSTagAction(ns, name.toLowerCase()));\n } else if (name) {\n this.chain.push(new CheckLocalNameAction(name.toLowerCase()));\n } else {\n this.chain.push(new CheckNamespaceAction(ns as string));\n }\n }\n\n /**\n * @override\n */\n classSelector(name: string): void {\n if (this.pseudoelement) {\n Logging.logger.warn(`::${this.pseudoelement}`, `followed by .${name}`);\n this.chain.push(new CheckConditionAction(\"\")); // always fails\n return;\n }\n this.specificity += 256;\n this.chain.push(new CheckClassAction(name));\n }\n\n /**\n * @override\n */\n pseudoclassSelector(name: string, params: (number | string)[]): void {\n if (this.pseudoelement) {\n Logging.logger.warn(`::${this.pseudoelement}`, `followed by :${name}`);\n this.chain.push(new CheckConditionAction(\"\")); // always fails\n return;\n }\n switch (name.toLowerCase()) {\n case \"enabled\":\n this.chain.push(new IsEnabledAction());\n break;\n case \"disabled\":\n this.chain.push(new IsDisabledAction());\n break;\n case \"checked\":\n this.chain.push(new IsCheckedAction());\n break;\n case \"root\":\n this.chain.push(new IsRootAction());\n break;\n case \"link\":\n this.chain.push(new CheckLocalNameAction(\"a\"));\n this.chain.push(new CheckAttributePresentAction(\"\", \"href\"));\n break;\n case \"-adapt-href-epub-type\":\n case \"href-epub-type\":\n if (params && params.length == 1 && typeof params[0] == \"string\") {\n const value = params[0] as string;\n const patt = new RegExp(`(^|s)${Base.escapeRegExp(value)}(\\$|s)`);\n this.chain.push(new CheckTargetEpubTypeAction(patt));\n } else {\n this.chain.push(new CheckConditionAction(\"\")); // always fails\n }\n break;\n case \"-adapt-footnote-content\":\n case \"footnote-content\":\n // content inside the footnote\n this.footnoteContent = true;\n break;\n case \"visited\":\n case \"active\":\n case \"hover\":\n case \"focus\":\n this.chain.push(new CheckConditionAction(\"\")); // always fails\n break;\n case \"lang\":\n if (params && params.length == 1 && typeof params[0] == \"string\") {\n const langValue = params[0] as string;\n this.chain.push(\n new CheckLangAction(\n new RegExp(\n `^${Base.escapeRegExp(langValue.toLowerCase())}(\\$|-)`,\n ),\n ),\n );\n } else {\n this.chain.push(new CheckConditionAction(\"\")); // always fais\n }\n break;\n case \"nth-child\":\n case \"nth-last-child\":\n case \"nth-of-type\":\n case \"nth-last-of-type\": {\n const ActionClass = nthSelectorActionClasses[name.toLowerCase()];\n if (params && params.length == 2) {\n this.chain.push(\n new ActionClass(params[0] as number, params[1] as number),\n );\n } else {\n this.chain.push(new CheckConditionAction(\"\")); // always fails\n }\n break;\n }\n case \"first-child\":\n this.chain.push(new IsFirstAction());\n break;\n case \"last-child\":\n this.chain.push(new IsNthLastSiblingAction(0, 1));\n break;\n case \"first-of-type\":\n this.chain.push(new IsNthSiblingOfTypeAction(0, 1));\n break;\n case \"last-of-type\":\n this.chain.push(new IsNthLastSiblingOfTypeAction(0, 1));\n break;\n case \"only-child\":\n this.chain.push(new IsFirstAction());\n this.chain.push(new IsNthLastSiblingAction(0, 1));\n break;\n case \"only-of-type\":\n this.chain.push(new IsNthSiblingOfTypeAction(0, 1));\n this.chain.push(new IsNthLastSiblingOfTypeAction(0, 1));\n break;\n case \"empty\":\n this.chain.push(new IsEmptyAction());\n break;\n case \"before\":\n case \"after\":\n case \"first-line\":\n case \"first-letter\":\n this.pseudoelementSelector(name, params);\n return;\n default:\n Logging.logger.warn(`unknown pseudo-class selector: ${name}`);\n this.chain.push(new CheckConditionAction(\"\")); // always fails\n break;\n }\n this.specificity += 256;\n }\n\n /**\n * @override\n */\n pseudoelementSelector(name: string, params: (number | string)[]): void {\n switch (name) {\n case \"before\":\n case \"after\":\n case \"first-line\":\n case \"first-letter\":\n case \"footnote-call\":\n case \"footnote-marker\":\n case \"inner\":\n case \"after-if-continues\":\n if (!this.pseudoelement) {\n this.pseudoelement = name;\n } else {\n Logging.logger.warn(\n `Double pseudoelement ::${this.pseudoelement}::${name}`,\n );\n this.chain.push(new CheckConditionAction(\"\")); // always fails\n }\n break;\n case \"first-n-lines\":\n if (params && params.length == 1 && typeof params[0] == \"number\") {\n const n = Math.round(params[0] as number);\n if (n > 0 && n == params[0]) {\n if (!this.pseudoelement) {\n this.pseudoelement = `first-${n}-lines`;\n } else {\n Logging.logger.warn(\n `Double pseudoelement ::${this.pseudoelement}::${name}`,\n );\n this.chain.push(new CheckConditionAction(\"\")); // always fails\n }\n break;\n }\n }\n this.chain.push(new CheckConditionAction(\"\")); // always fails\n break;\n case \"nth-fragment\":\n if (params && params.length == 2) {\n this.viewConditionId = `NFS_${params[0]}_${params[1]}`;\n } else {\n this.chain.push(new CheckConditionAction(\"\")); // always fails\n }\n break;\n default:\n Logging.logger.warn(`Unrecognized pseudoelement: ::${name}`);\n this.chain.push(new CheckConditionAction(\"\")); // always fails\n break;\n }\n this.specificity += 1;\n }\n\n /**\n * @override\n */\n idSelector(id: string): void {\n this.specificity += 65536;\n this.chain.push(new CheckIdAction(id));\n }\n\n /**\n * @override\n */\n attributeSelector(\n ns: string,\n name: string,\n op: CssTokenizer.TokenType,\n value: string | null,\n ): void {\n this.specificity += 256;\n name = name.toLowerCase();\n value = value || \"\";\n let action;\n switch (op) {\n case CssTokenizer.TokenType.EOF:\n action = new CheckAttributePresentAction(ns, name);\n break;\n case CssTokenizer.TokenType.EQ:\n action = new CheckAttributeEqAction(ns, name, value);\n break;\n case CssTokenizer.TokenType.TILDE_EQ:\n if (!value || value.match(/\\s/)) {\n action = new CheckConditionAction(\"\"); // always fails\n } else {\n action = new CheckAttributeRegExpAction(\n ns,\n name,\n new RegExp(`(^|\\\\s)${Base.escapeRegExp(value)}(\\$|\\\\s)`),\n );\n }\n break;\n case CssTokenizer.TokenType.BAR_EQ:\n action = new CheckAttributeRegExpAction(\n ns,\n name,\n new RegExp(`^${Base.escapeRegExp(value)}(\\$|-)`),\n );\n break;\n case CssTokenizer.TokenType.HAT_EQ:\n if (!value) {\n action = new CheckConditionAction(\"\"); // always fails\n } else {\n action = new CheckAttributeRegExpAction(\n ns,\n name,\n new RegExp(`^${Base.escapeRegExp(value)}`),\n );\n }\n break;\n case CssTokenizer.TokenType.DOLLAR_EQ:\n if (!value) {\n action = new CheckConditionAction(\"\"); // always fails\n } else {\n action = new CheckAttributeRegExpAction(\n ns,\n name,\n new RegExp(`${Base.escapeRegExp(value)}\\$`),\n );\n }\n break;\n case CssTokenizer.TokenType.STAR_EQ:\n if (!value) {\n action = new CheckConditionAction(\"\"); // always fails\n } else {\n action = new CheckAttributeRegExpAction(\n ns,\n name,\n new RegExp(Base.escapeRegExp(value)),\n );\n }\n break;\n case CssTokenizer.TokenType.COL_COL:\n if (value == \"supported\") {\n action = new CheckNamespaceSupportedAction(ns, name);\n } else {\n Logging.logger.warn(\"Unsupported :: attr selector op:\", value);\n action = new CheckConditionAction(\"\"); // always fails\n }\n break;\n default:\n Logging.logger.warn(\"Unsupported attr selector:\", op);\n action = new CheckConditionAction(\"\"); // always fails\n }\n this.chain.push(action);\n }\n\n /**\n * @override\n */\n descendantSelector(): void {\n const condition = `d${conditionCount++}`;\n this.processChain(\n new ConditionItemAction(\n new DescendantConditionItem(condition, this.viewConditionId, null),\n ),\n );\n this.chain = [new CheckConditionAction(condition)];\n this.viewConditionId = null;\n }\n\n /**\n * @override\n */\n childSelector(): void {\n const condition = `c${conditionCount++}`;\n this.processChain(\n new ConditionItemAction(\n new ChildConditionItem(condition, this.viewConditionId, null),\n ),\n );\n this.chain = [new CheckConditionAction(condition)];\n this.viewConditionId = null;\n }\n\n /**\n * @override\n */\n adjacentSiblingSelector(): void {\n const condition = `a${conditionCount++}`;\n this.processChain(\n new ConditionItemAction(\n new AdjacentSiblingConditionItem(condition, this.viewConditionId, null),\n ),\n );\n this.chain = [new CheckConditionAction(condition)];\n this.viewConditionId = null;\n }\n\n /**\n * @override\n */\n followingSiblingSelector(): void {\n const condition = `f${conditionCount++}`;\n this.processChain(\n new ConditionItemAction(\n new FollowingSiblingConditionItem(\n condition,\n this.viewConditionId,\n null,\n ),\n ),\n );\n this.chain = [new CheckConditionAction(condition)];\n this.viewConditionId = null;\n }\n\n /**\n * @override\n */\n nextSelector(): void {\n this.finishChain();\n this.pseudoelement = null;\n this.footnoteContent = false;\n this.specificity = 0;\n this.chain = [];\n }\n\n /**\n * @override\n */\n startSelectorRule(): void {\n if (this.isInsideSelectorRule(\"E_CSS_UNEXPECTED_SELECTOR\")) {\n return;\n }\n this.state = ParseState.SELECTOR;\n this.elementStyle = {} as ElementStyle;\n this.pseudoelement = null;\n this.specificity = 0;\n this.footnoteContent = false;\n this.chain = [];\n }\n\n /**\n * @override\n */\n error(mnemonics: string, token: CssTokenizer.Token): void {\n super.error(mnemonics, token);\n if (this.state == ParseState.SELECTOR) {\n this.state = ParseState.TOP;\n }\n }\n\n /**\n * @override\n */\n startStylesheet(flavor: CssParser.StylesheetFlavor): void {\n super.startStylesheet(flavor);\n this.state = ParseState.TOP;\n }\n\n /**\n * @override\n */\n startRuleBody(): void {\n this.finishChain();\n super.startRuleBody();\n if (this.state == ParseState.SELECTOR) {\n this.state = ParseState.TOP;\n }\n }\n\n /**\n * @override\n */\n endRule(): void {\n super.endRule();\n this.insideSelectorRule = ParseState.TOP;\n }\n\n finishChain(): void {\n if (this.chain) {\n const specificity: number = this.specificity + this.cascade.nextOrder();\n this.processChain(this.makeApplyRuleAction(specificity));\n this.chain = null;\n this.pseudoelement = null;\n this.viewConditionId = null;\n this.footnoteContent = false;\n this.specificity = 0;\n }\n }\n\n protected makeApplyRuleAction(specificity: number): ApplyRuleAction {\n let regionId = this.regionId;\n if (this.footnoteContent) {\n if (regionId) {\n regionId = \"xxx-bogus-xxx\";\n } else {\n regionId = \"footnote\";\n }\n }\n return new ApplyRuleAction(\n this.elementStyle,\n specificity,\n this.pseudoelement,\n regionId,\n this.viewConditionId,\n );\n }\n\n special(name: string, value: Css.Val) {\n let val: CascadeValue;\n if (!this.condition) {\n val = new CascadeValue(value, 0);\n } else {\n val = new ConditionalCascadeValue(value, 0, this.condition);\n }\n const arr = getMutableSpecial(this.elementStyle, name);\n arr.push(val);\n }\n\n /**\n * @override\n */\n property(name: string, value: Css.Val, important: boolean): void {\n this.validatorSet.validatePropertyAndHandleShorthand(\n name,\n value,\n important,\n this,\n );\n }\n\n /**\n * @override\n */\n invalidPropertyValue(name: string, value: Css.Val): void {\n this.report(`E_INVALID_PROPERTY_VALUE ${name}: ${value.toString()}`);\n }\n\n /**\n * @override\n */\n unknownProperty(name: string, value: Css.Val): void {\n this.report(`E_INVALID_PROPERTY ${name}: ${value.toString()}`);\n }\n\n /**\n * @override\n */\n simpleProperty(name: string, value: Css.Val, important): void {\n if (\n name == \"display\" &&\n (value === Css.ident.oeb_page_head || value === Css.ident.oeb_page_foot)\n ) {\n this.simpleProperty(\n \"flow-options\",\n new Css.SpaceList([Css.ident.exclusive, Css.ident._static]),\n important,\n );\n this.simpleProperty(\"flow-into\", value, important);\n value = Css.ident.block;\n }\n const hooks = Plugin.getHooksForName(\"SIMPLE_PROPERTY\");\n hooks.forEach((hook) => {\n const original = { name: name, value: value, important: important };\n const converted = hook(original);\n name = converted[\"name\"];\n value = converted[\"value\"];\n important = converted[\"important\"];\n });\n const specificity = important\n ? this.getImportantSpecificity()\n : this.getBaseSpecificity();\n const cascval = this.condition\n ? new ConditionalCascadeValue(value, specificity, this.condition)\n : new CascadeValue(value, specificity);\n setProp(this.elementStyle, name, cascval);\n }\n\n finish(): Cascade {\n return this.cascade;\n }\n\n /**\n * @override\n */\n startFuncWithSelector(funcName: string): void {\n switch (funcName) {\n case \"not\": {\n const notParserHandler = new NotParameterParserHandler(this);\n notParserHandler.startSelectorRule();\n this.owner.pushHandler(notParserHandler);\n break;\n }\n default:\n // TODO\n break;\n }\n }\n}\n\nexport const nthSelectorActionClasses: { [key: string]: typeof IsNthAction } = {\n \"nth-child\": IsNthSiblingAction,\n \"nth-of-type\": IsNthSiblingOfTypeAction,\n \"nth-last-child\": IsNthLastSiblingAction,\n \"nth-last-of-type\": IsNthLastSiblingOfTypeAction,\n};\n\nexport let conditionCount: number = 0;\n\nexport class NotParameterParserHandler extends CascadeParserHandler {\n parentChain: ChainedAction[];\n\n constructor(public readonly parent: CascadeParserHandler) {\n super(\n parent.scope,\n parent.owner,\n parent.condition,\n parent,\n parent.regionId,\n parent.validatorSet,\n false,\n );\n this.parentChain = parent.chain;\n }\n\n /**\n * @override\n */\n startFuncWithSelector(funcName: string): void {\n if (funcName == \"not\") {\n this.reportAndSkip(\"E_CSS_UNEXPECTED_NOT\");\n }\n }\n\n /**\n * @override\n */\n startRuleBody(): void {\n this.reportAndSkip(\"E_CSS_UNEXPECTED_RULE_BODY\");\n }\n\n /**\n * @override\n */\n nextSelector(): void {\n this.reportAndSkip(\"E_CSS_UNEXPECTED_NEXT_SELECTOR\");\n }\n\n /**\n * @override\n */\n endFuncWithSelector(): void {\n if (this.chain && this.chain.length > 0) {\n this.parentChain.push(new NegateActionsSet(this.chain));\n }\n this.parent.specificity += this.specificity;\n this.owner.popHandler();\n }\n\n /**\n * @override\n */\n error(mnemonics: string, token: CssTokenizer.Token): void {\n super.error(mnemonics, token);\n this.owner.popHandler();\n }\n}\n\n/**\n * @override\n */\nexport class DefineParserHandler extends CssParser.SlaveParserHandler {\n constructor(\n scope: Exprs.LexicalScope,\n owner: CssParser.DispatchParserHandler,\n ) {\n super(scope, owner, false);\n }\n\n /**\n * @override\n */\n property(name: string, value: Css.Val, important: boolean): void {\n if (this.scope.values[name]) {\n this.error(`E_CSS_NAME_REDEFINED ${name}`, this.getCurrentToken());\n } else {\n const unit = name.match(/height|^(top|bottom)$/) ? \"vh\" : \"vw\";\n const dim = new Exprs.Numeric(this.scope, 100, unit);\n this.scope.defineName(name, value.toExpr(this.scope, dim));\n }\n }\n}\n\nexport class PropSetParserHandler\n extends CssParser.SlaveParserHandler\n implements CssValidator.PropertyReceiver {\n order: number;\n\n constructor(\n scope: Exprs.LexicalScope,\n owner: CssParser.DispatchParserHandler,\n public readonly condition: Exprs.Val,\n public readonly elementStyle: ElementStyle,\n public readonly validatorSet: CssValidator.ValidatorSet,\n ) {\n super(scope, owner, false);\n this.order = 0;\n }\n\n /**\n * @override\n */\n property(name: string, value: Css.Val, important: boolean): void {\n if (important) {\n Logging.logger.warn(\"E_IMPORTANT_NOT_ALLOWED\");\n } else {\n this.validatorSet.validatePropertyAndHandleShorthand(\n name,\n value,\n important,\n this,\n );\n }\n }\n\n /**\n * @override\n */\n invalidPropertyValue(name: string, value: Css.Val): void {\n Logging.logger.warn(\n \"E_INVALID_PROPERTY_VALUE\",\n `${name}:`,\n value.toString(),\n );\n }\n\n /**\n * @override\n */\n unknownProperty(name: string, value: Css.Val): void {\n Logging.logger.warn(\"E_INVALID_PROPERTY\", `${name}:`, value.toString());\n }\n\n /**\n * @override\n */\n simpleProperty(name: string, value: Css.Val, important): void {\n let specificity = important\n ? this.getImportantSpecificity()\n : this.getBaseSpecificity();\n specificity += this.order;\n this.order += ORDER_INCREMENT;\n const av = this.condition\n ? new ConditionalCascadeValue(value, specificity, this.condition)\n : new CascadeValue(value, specificity);\n setProp(this.elementStyle, name, av);\n }\n}\n\nexport class PropertyParserHandler\n extends CssParser.ErrorHandler\n implements CssValidator.PropertyReceiver {\n elementStyle = {} as ElementStyle;\n order: number = 0;\n\n constructor(\n scope: Exprs.LexicalScope,\n public readonly validatorSet: CssValidator.ValidatorSet,\n ) {\n super(scope);\n }\n\n /**\n * @override\n */\n property(name: string, value: Css.Val, important: boolean): void {\n this.validatorSet.validatePropertyAndHandleShorthand(\n name,\n value,\n important,\n this,\n );\n }\n\n /**\n * @override\n */\n invalidPropertyValue(name: string, value: Css.Val): void {\n Logging.logger.warn(\n \"E_INVALID_PROPERTY_VALUE\",\n `${name}:`,\n value.toString(),\n );\n }\n\n /**\n * @override\n */\n unknownProperty(name: string, value: Css.Val): void {\n Logging.logger.warn(\"E_INVALID_PROPERTY\", `${name}:`, value.toString());\n }\n\n /**\n * @override\n */\n simpleProperty(name: string, value: Css.Val, important): void {\n let specificity = important\n ? CssParser.SPECIFICITY_STYLE_IMPORTANT\n : CssParser.SPECIFICITY_STYLE;\n specificity += this.order;\n this.order += ORDER_INCREMENT;\n const cascval = new CascadeValue(value, specificity);\n setProp(this.elementStyle, name, cascval);\n }\n}\n\nexport function forEachViewConditionalStyles(\n style: ElementStyle,\n callback: (p1: ElementStyle) => any,\n): void {\n const viewConditionalStyles = getViewConditionalStyleMap(style);\n if (!viewConditionalStyles) {\n return;\n }\n viewConditionalStyles.forEach((entry) => {\n if (!entry.matcher.matches()) {\n return;\n }\n callback(entry.styles);\n });\n}\n\nexport function mergeViewConditionalStyles(\n cascMap: { [key: string]: CascadeValue },\n context: Exprs.Context,\n style: ElementStyle,\n): void {\n forEachViewConditionalStyles(style, (viewConditionalStyles) => {\n mergeStyle(cascMap, viewConditionalStyles, context);\n });\n}\n\nexport function parseStyleAttribute(\n scope: Exprs.LexicalScope,\n validatorSet: CssValidator.ValidatorSet,\n baseURL: string,\n styleAttrValue: string,\n): ElementStyle {\n const handler = new PropertyParserHandler(scope, validatorSet);\n const tokenizer = new CssTokenizer.Tokenizer(styleAttrValue, handler);\n try {\n CssParser.parseStyleAttribute(tokenizer, handler, baseURL);\n } catch (err) {\n Logging.logger.warn(err, \"Style attribute parse error:\");\n }\n return handler.elementStyle;\n}\n\nexport function isVertical(\n cascaded: { [key: string]: CascadeValue },\n context: Exprs.Context,\n vertical: boolean,\n): boolean {\n const writingModeCasc = cascaded[\"writing-mode\"];\n if (writingModeCasc) {\n const writingMode = writingModeCasc.evaluate(context, \"writing-mode\");\n if (writingMode && writingMode !== Css.ident.inherit) {\n return writingMode === Css.ident.vertical_rl;\n }\n }\n return vertical;\n}\n\nexport function isRtl(\n cascaded: { [key: string]: CascadeValue },\n context: Exprs.Context,\n rtl: boolean,\n): boolean {\n const directionCasc = cascaded[\"direction\"];\n if (directionCasc) {\n const direction = directionCasc.evaluate(context, \"direction\");\n if (direction && direction !== Css.ident.inherit) {\n return direction === Css.ident.rtl;\n }\n }\n return rtl;\n}\n\nexport function flattenCascadedStyle(\n style: ElementStyle,\n context: Exprs.Context,\n regionIds: string[],\n isFootnote: boolean,\n nodeContext: Vtree.NodeContext,\n): { [key: string]: CascadeValue } {\n const cascMap = {} as { [key: string]: CascadeValue };\n for (const n in style) {\n if (isPropName(n)) {\n cascMap[n] = getProp(style, n);\n }\n }\n mergeViewConditionalStyles(cascMap, context, style);\n forEachStylesInRegion(\n style,\n regionIds,\n isFootnote,\n (regionId, regionStyle) => {\n mergeStyle(cascMap, regionStyle, context);\n mergeViewConditionalStyles(cascMap, context, regionStyle);\n },\n );\n return cascMap;\n}\n\nexport function forEachStylesInRegion(\n style: ElementStyle,\n regionIds: string[],\n isFootnote: boolean,\n callback: (p1: string, p2: ElementStyle) => any,\n): void {\n const regions = getStyleMap(style, \"_regions\");\n if ((regionIds || isFootnote) && regions) {\n if (isFootnote) {\n const footnoteRegion = [\"footnote\"];\n if (!regionIds) {\n regionIds = footnoteRegion;\n } else {\n regionIds = regionIds.concat(footnoteRegion);\n }\n }\n for (const regionId of regionIds) {\n const regionStyle = regions[regionId];\n if (regionStyle) {\n callback(regionId, regionStyle);\n }\n }\n }\n}\n\nexport function mergeStyle(\n to: { [key: string]: CascadeValue },\n from: ElementStyle,\n context: Exprs.Context,\n): void {\n for (const property in from) {\n if (isPropName(property)) {\n const newVal = getProp(from, property);\n const oldVal = to[property];\n to[property] = cascadeValues(context, oldVal, newVal as CascadeValue);\n }\n }\n}\n\n/**\n * Convert logical properties to physical ones, taking specificity into account.\n * @param src Source properties map\n * @param dest Destination map\n * @param transform If supplied, property values are transformed by this\n * function before inserted into the destination map. The first parameter is\n * the property name and the second one is the property value.\n * @template T\n */\nexport const convertToPhysical = <T>(\n src: { [key: string]: CascadeValue },\n dest: { [key: string]: T },\n vertical: boolean,\n rtl: boolean,\n transform: (p1: string, p2: CascadeValue) => T,\n) => {\n const couplingMap = vertical\n ? rtl\n ? couplingMapVertRtl\n : couplingMapVert\n : rtl\n ? couplingMapHorRtl\n : couplingMapHor;\n for (const propName in src) {\n if (src.hasOwnProperty(propName)) {\n const cascVal = src[propName];\n if (!cascVal) {\n continue;\n }\n const coupledName = couplingMap[propName];\n let targetName: string;\n if (coupledName) {\n const coupledCascVal = src[coupledName];\n if (coupledCascVal && coupledCascVal.priority > cascVal.priority) {\n continue;\n }\n targetName = geomNames[coupledName] ? coupledName : propName;\n } else {\n targetName = propName;\n }\n dest[targetName] = transform(propName, cascVal);\n }\n }\n};\n","/**\n * Copyright 2015 Trim-marks Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview CssLogicalUtil - Utilities related to CSS Logical Properties and Values https://drafts.csswg.org/css-logical/\n */\ntype ConversionMap = {\n regexp: RegExp;\n to: string;\n};\n\nfunction createRegExpMap(\n valueMaps: {\n [key: string]: { [key: string]: { logical: string; physical: string }[] };\n },\n toPhysical: boolean,\n): { [key: string]: { [key: string]: ConversionMap[] } } {\n const map = {};\n Object.keys(valueMaps as object).forEach((writingMode) => {\n const dest = (map[writingMode] = {});\n const src = valueMaps[writingMode];\n Object.keys(src as object).forEach((direction) => {\n dest[direction] = src[direction].map((p) => {\n const from = toPhysical ? p.logical : p.physical;\n const to = toPhysical ? p.physical : p.logical;\n return { regexp: new RegExp(`(-?)${from}(-?)`), to: `\\$1${to}\\$2` };\n });\n });\n });\n return map;\n}\n\nfunction convert(\n value: string,\n writingMode: string,\n direction: string | null,\n maps: { [key: string]: { [key: string]: ConversionMap[] } },\n): string {\n const maps2 = maps[writingMode];\n if (!maps2) {\n throw new Error(`unknown writing-mode: ${writingMode}`);\n }\n const map = maps2[direction || \"ltr\"];\n if (!map) {\n throw new Error(`unknown direction: ${direction}`);\n }\n for (const p of map) {\n const replaced = value.replace(p.regexp, p.to);\n if (replaced !== value) {\n return replaced;\n }\n }\n return value;\n}\nconst values: {\n [key: string]: { [key: string]: { logical: string; physical: string }[] };\n} = {\n \"horizontal-tb\": {\n ltr: [\n { logical: \"inline-start\", physical: \"left\" },\n { logical: \"inline-end\", physical: \"right\" },\n { logical: \"block-start\", physical: \"top\" },\n { logical: \"block-end\", physical: \"bottom\" },\n { logical: \"inline-size\", physical: \"width\" },\n { logical: \"block-size\", physical: \"height\" },\n ],\n rtl: [\n { logical: \"inline-start\", physical: \"right\" },\n { logical: \"inline-end\", physical: \"left\" },\n { logical: \"block-start\", physical: \"top\" },\n { logical: \"block-end\", physical: \"bottom\" },\n { logical: \"inline-size\", physical: \"width\" },\n { logical: \"block-size\", physical: \"height\" },\n ],\n },\n \"vertical-rl\": {\n ltr: [\n { logical: \"inline-start\", physical: \"top\" },\n { logical: \"inline-end\", physical: \"bottom\" },\n { logical: \"block-start\", physical: \"right\" },\n { logical: \"block-end\", physical: \"left\" },\n { logical: \"inline-size\", physical: \"height\" },\n { logical: \"block-size\", physical: \"width\" },\n ],\n rtl: [\n { logical: \"inline-start\", physical: \"bottom\" },\n { logical: \"inline-end\", physical: \"top\" },\n { logical: \"block-start\", physical: \"right\" },\n { logical: \"block-end\", physical: \"left\" },\n { logical: \"inline-size\", physical: \"height\" },\n { logical: \"block-size\", physical: \"width\" },\n ],\n },\n \"vertical-lr\": {\n ltr: [\n { logical: \"inline-start\", physical: \"top\" },\n { logical: \"inline-end\", physical: \"bottom\" },\n { logical: \"block-start\", physical: \"left\" },\n { logical: \"block-end\", physical: \"right\" },\n { logical: \"inline-size\", physical: \"height\" },\n { logical: \"block-size\", physical: \"width\" },\n ],\n rtl: [\n { logical: \"inline-start\", physical: \"bottom\" },\n { logical: \"inline-end\", physical: \"top\" },\n { logical: \"block-start\", physical: \"left\" },\n { logical: \"block-end\", physical: \"right\" },\n { logical: \"inline-size\", physical: \"height\" },\n { logical: \"block-size\", physical: \"width\" },\n ],\n },\n};\nconst toPhysicalMaps = createRegExpMap(values, true);\n\nexport function toPhysical(\n value: string,\n writingMode: string,\n direction?: string | null,\n): string {\n return convert(value, writingMode, direction || null, toPhysicalMaps);\n}\nconst toLogicalMaps = createRegExpMap(values, false);\n\nexport function toLogical(\n value: string,\n writingMode: string,\n direction?: string | null,\n): string {\n return convert(value, writingMode, direction || null, toLogicalMaps);\n}\nconst lineRelativeValues: {\n [key: string]: { logical: string; physical: string }[];\n} = {\n \"horizontal-tb\": [\n { logical: \"line-left\", physical: \"left\" },\n { logical: \"line-right\", physical: \"right\" },\n { logical: \"over\", physical: \"top\" },\n { logical: \"under\", physical: \"bottom\" },\n ],\n \"vertical-rl\": [\n { logical: \"line-left\", physical: \"top\" },\n { logical: \"line-right\", physical: \"bottom\" },\n { logical: \"over\", physical: \"right\" },\n { logical: \"under\", physical: \"left\" },\n ],\n \"vertical-lr\": [\n { logical: \"line-left\", physical: \"top\" },\n { logical: \"line-right\", physical: \"bottom\" },\n { logical: \"over\", physical: \"right\" },\n { logical: \"under\", physical: \"left\" },\n ],\n};\n\nexport function toLineRelative(value: string, writingMode: string): string {\n const maps = lineRelativeValues[writingMode];\n if (!maps) {\n throw new Error(`unknown writing-mode: ${writingMode}`);\n }\n for (let i = 0; i < maps.length; i++) {\n if (maps[i].physical === value) {\n return maps[i].logical;\n }\n }\n return value;\n}\n","/**\n * Copyright 2015 Trim-marks Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Sizing - CSS Intrinsic & Extrinsic Sizing\n */\nimport * as Base from \"./base\";\nimport * as Vtree from \"./vtree\";\n\n/**\n * Box sizes defined in css-sizing.\n * @enum {string}\n */\nexport enum Size {\n FILL_AVAILABLE_INLINE_SIZE = \"fill-available inline size\",\n FILL_AVAILABLE_BLOCK_SIZE = \"fill-available block size\",\n FILL_AVAILABLE_WIDTH = \"fill-available width\",\n FILL_AVAILABLE_HEIGHT = \"fill-available height\",\n MAX_CONTENT_INLINE_SIZE = \"max-content inline size\",\n MAX_CONTENT_BLOCK_SIZE = \"max-content block size\",\n MAX_CONTENT_WIDTH = \"max-content width\",\n MAX_CONTENT_HEIGHT = \"max-content height\",\n MIN_CONTENT_INLINE_SIZE = \"min-content inline size\",\n MIN_CONTENT_BLOCK_SIZE = \"min-content block size\",\n MIN_CONTENT_WIDTH = \"min-content width\",\n MIN_CONTENT_HEIGHT = \"min-content height\",\n FIT_CONTENT_INLINE_SIZE = \"fit-content inline size\",\n FIT_CONTENT_BLOCK_SIZE = \"fit-content block size\",\n FIT_CONTENT_WIDTH = \"fit-content width\",\n FIT_CONTENT_HEIGHT = \"fit-content height\",\n}\n\n/**\n * Get specified sizes for the element.\n */\nexport function getSize(\n clientLayout: Vtree.ClientLayout,\n element: Element,\n sizes: Size[],\n): { [key in Size]: number } {\n const original = {\n display: (element as any).style.display,\n position: (element as any).style.position,\n width: (element as any).style.width as string,\n maxWidth: (element as any).style.maxWidth as string,\n minWidth: (element as any).style.minWidth as string,\n height: (element as any).style.height as string,\n maxHeight: (element as any).style.maxHeight as string,\n minHeight: (element as any).style.minHeight as string,\n };\n const doc = element.ownerDocument;\n const parent = element.parentNode;\n\n // wrap the element with a dummy container element\n const container = doc.createElement(\"div\");\n Base.setCSSProperty(container, \"position\", original.position);\n parent.insertBefore(container, element);\n container.appendChild(element);\n Base.setCSSProperty(element, \"width\", \"auto\");\n Base.setCSSProperty(element, \"max-width\", \"none\");\n Base.setCSSProperty(element, \"min-width\", \"0\");\n Base.setCSSProperty(element, \"height\", \"auto\");\n Base.setCSSProperty(element, \"max-height\", \"none\");\n Base.setCSSProperty(element, \"min-height\", \"0\");\n\n function getComputedValue(name: string): string {\n return clientLayout.getElementComputedStyle(element).getPropertyValue(name);\n }\n const writingModeProperty = Base.getPrefixedPropertyNames(\"writing-mode\");\n const writingModeValue =\n (writingModeProperty ? getComputedValue(writingModeProperty[0]) : null) ||\n getComputedValue(\"writing-mode\");\n const isVertical =\n writingModeValue === \"vertical-rl\" ||\n writingModeValue === \"tb-rl\" ||\n writingModeValue === \"vertical-lr\" ||\n writingModeValue === \"tb-lr\";\n const inlineSizeName = isVertical ? \"height\" : \"width\";\n const blockSizeName = isVertical ? \"width\" : \"height\";\n\n function getFillAvailableInline(): string {\n Base.setCSSProperty(element, \"display\", \"block\");\n Base.setCSSProperty(element, \"position\", \"static\");\n return getComputedValue(inlineSizeName);\n }\n\n // Inline size of an inline-block element is the fit-content\n // (shrink-to-fit) inline size.\n function getMaxContentInline(): string {\n Base.setCSSProperty(element, \"display\", \"inline-block\");\n\n // When the available inline size is sufficiently large, the fit-content\n // inline size equals to the max-content inline size.\n Base.setCSSProperty(container, inlineSizeName, \"99999999px\"); // 'sufficiently large' value\n const r = getComputedValue(inlineSizeName);\n Base.setCSSProperty(container, inlineSizeName, \"\");\n return r;\n }\n\n function getMinContentInline(): string {\n Base.setCSSProperty(element, \"display\", \"inline-block\");\n\n // When the available inline size is zero, the fit-content inline size\n // equals to the min-content inline size.\n Base.setCSSProperty(container, inlineSizeName, \"0\");\n const r = getComputedValue(inlineSizeName);\n Base.setCSSProperty(container, inlineSizeName, \"\");\n return r;\n }\n\n function getFitContentInline(): string {\n const fillAvailableInline = getFillAvailableInline();\n const minContentInline = getMinContentInline();\n const parsedFillAvailable = parseFloat(fillAvailableInline);\n if (parsedFillAvailable <= parseFloat(minContentInline)) {\n return minContentInline;\n } else {\n const maxContentInline = getMaxContentInline();\n if (parsedFillAvailable <= parseFloat(maxContentInline)) {\n return fillAvailableInline;\n } else {\n return maxContentInline;\n }\n }\n }\n\n function getIdealBlock(): string {\n return getComputedValue(blockSizeName);\n }\n\n function getFillAvailableBlock(): string {\n throw new Error(\"Getting fill-available block size is not implemented\");\n }\n const result = {} as { [key in Size]: number };\n sizes.forEach((size) => {\n let r: string;\n switch (size) {\n case Size.FILL_AVAILABLE_INLINE_SIZE:\n r = getFillAvailableInline();\n break;\n case Size.MAX_CONTENT_INLINE_SIZE:\n r = getMaxContentInline();\n break;\n case Size.MIN_CONTENT_INLINE_SIZE:\n r = getMinContentInline();\n break;\n case Size.FIT_CONTENT_INLINE_SIZE:\n r = getFitContentInline();\n break;\n case Size.FILL_AVAILABLE_BLOCK_SIZE:\n r = getFillAvailableBlock();\n break;\n case Size.MAX_CONTENT_BLOCK_SIZE:\n case Size.MIN_CONTENT_BLOCK_SIZE:\n case Size.FIT_CONTENT_BLOCK_SIZE:\n r = getIdealBlock();\n break;\n case Size.FILL_AVAILABLE_WIDTH:\n r = isVertical ? getFillAvailableBlock() : getFillAvailableInline();\n break;\n case Size.FILL_AVAILABLE_HEIGHT:\n r = isVertical ? getFillAvailableInline() : getFillAvailableBlock();\n break;\n case Size.MAX_CONTENT_WIDTH:\n r = isVertical ? getIdealBlock() : getMaxContentInline();\n break;\n case Size.MAX_CONTENT_HEIGHT:\n r = isVertical ? getMaxContentInline() : getIdealBlock();\n break;\n case Size.MIN_CONTENT_WIDTH:\n r = isVertical ? getIdealBlock() : getMinContentInline();\n break;\n case Size.MIN_CONTENT_HEIGHT:\n r = isVertical ? getMinContentInline() : getIdealBlock();\n break;\n case Size.FIT_CONTENT_WIDTH:\n r = isVertical ? getIdealBlock() : getFitContentInline();\n break;\n case Size.FIT_CONTENT_HEIGHT:\n r = isVertical ? getFitContentInline() : getIdealBlock();\n break;\n }\n result[size] = parseFloat(r);\n Base.setCSSProperty(element, \"position\", original.position);\n Base.setCSSProperty(element, \"display\", original.display);\n });\n Base.setCSSProperty(element, \"width\", original.width);\n Base.setCSSProperty(element, \"max-width\", original.maxWidth);\n Base.setCSSProperty(element, \"min-width\", original.minWidth);\n Base.setCSSProperty(element, \"height\", original.height);\n Base.setCSSProperty(element, \"max-height\", original.maxHeight);\n Base.setCSSProperty(element, \"min-height\", original.minHeight);\n parent.insertBefore(element, container);\n parent.removeChild(container);\n return result;\n}\n","/**\n * Copyright 2015 Trim-marks Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview PageFloats - CSS Page Floats\n */\nimport * as Asserts from \"./asserts\";\nimport * as Css from \"./css\";\nimport * as GeometryUtil from \"./geometry-util\";\nimport * as Logging from \"./logging\";\nimport * as CssLogicalUtil from \"./css-logical-util\";\nimport * as Sizing from \"./sizing\";\nimport * as Task from \"./task\";\nimport * as VtreeImpl from \"./vtree\";\nimport { Layout as LayoutType, PageFloats, Vtree } from \"./types\";\n\nexport const FloatReference = PageFloats.FloatReference;\nexport type FloatReference = PageFloats.FloatReference; // eslint-disable-line no-redeclare\n\ntype PageFloatID = PageFloats.PageFloatID;\n\nexport function floatReferenceOf(str: string): FloatReference {\n switch (str) {\n case \"inline\":\n return FloatReference.INLINE;\n case \"column\":\n return FloatReference.COLUMN;\n case \"region\":\n return FloatReference.REGION;\n case \"page\":\n return FloatReference.PAGE;\n default:\n throw new Error(`Unknown float-reference: ${str}`);\n }\n}\n\nexport function isPageFloat(floatReference: FloatReference): boolean {\n switch (floatReference) {\n case FloatReference.INLINE:\n return false;\n case FloatReference.COLUMN:\n case FloatReference.REGION:\n case FloatReference.PAGE:\n return true;\n default:\n throw new Error(`Unknown float-reference: ${floatReference}`);\n }\n}\n\n/**\n * Interpret a float value with the writing-mode and direction assuming the\n * float-reference is inline and returns \"left\" or \"right\".\n */\nexport function resolveInlineFloatDirection(\n floatSide: string,\n vertical: boolean,\n direction: string,\n): string {\n const writingMode = vertical ? \"vertical-rl\" : \"horizontal-tb\";\n if (floatSide === \"top\" || floatSide === \"bottom\") {\n floatSide = CssLogicalUtil.toLogical(floatSide, writingMode, direction);\n }\n if (floatSide === \"block-start\") {\n floatSide = \"inline-start\";\n }\n if (floatSide === \"block-end\") {\n floatSide = \"inline-end\";\n }\n if (floatSide === \"inline-start\" || floatSide === \"inline-end\") {\n const physicalValue = CssLogicalUtil.toPhysical(\n floatSide,\n writingMode,\n direction,\n );\n const lineRelativeValue = CssLogicalUtil.toLineRelative(\n physicalValue,\n writingMode,\n );\n if (lineRelativeValue === \"line-left\") {\n floatSide = \"left\";\n } else if (lineRelativeValue === \"line-right\") {\n floatSide = \"right\";\n }\n }\n if (floatSide !== \"left\" && floatSide !== \"right\") {\n Logging.logger.warn(`Invalid float value: ${floatSide}. Fallback to left.`);\n floatSide = \"left\";\n }\n return floatSide;\n}\n\nexport class PageFloat implements PageFloats.PageFloat {\n order: number | null = null;\n id: PageFloatID | null = null;\n\n constructor(\n public readonly nodePosition: Vtree.NodePosition,\n public readonly floatReference: FloatReference,\n public readonly floatSide: string,\n public readonly clearSide: string | null,\n public readonly flowName: string,\n public readonly floatMinWrapBlock: Css.Numeric | null,\n ) {}\n\n getOrder(): number {\n if (this.order === null) {\n throw new Error(\"The page float is not yet added\");\n }\n return this.order;\n }\n\n getId(): PageFloatID {\n if (!this.id) {\n throw new Error(\"The page float is not yet added\");\n }\n return this.id;\n }\n\n isAllowedOnContext(pageFloatLayoutContext: PageFloatLayoutContext): boolean {\n return pageFloatLayoutContext.isAnchorAlreadyAppeared(this.getId());\n }\n\n isAllowedToPrecede(other: PageFloat): boolean {\n return false;\n }\n}\n\nexport class PageFloatStore {\n private floats: PageFloat[] = [];\n private nextPageFloatIndex: number = 0;\n\n private nextOrder(): number {\n return this.nextPageFloatIndex++;\n }\n\n private createPageFloatId(order: number): PageFloatID {\n return `pf${order}`;\n }\n\n addPageFloat(float: PageFloat) {\n const index = this.floats.findIndex((f) =>\n VtreeImpl.isSameNodePosition(f.nodePosition, float.nodePosition),\n );\n if (index >= 0) {\n throw new Error(\n \"A page float with the same source node is already registered\",\n );\n } else {\n const order = (float.order = this.nextOrder());\n float.id = this.createPageFloatId(order);\n this.floats.push(float);\n }\n }\n\n findPageFloatByNodePosition(\n nodePosition: Vtree.NodePosition,\n ): PageFloat | null {\n const index = this.floats.findIndex((f) =>\n VtreeImpl.isSameNodePosition(f.nodePosition, nodePosition),\n );\n return index >= 0 ? this.floats[index] : null;\n }\n\n findPageFloatById(id: PageFloatID) {\n const index = this.floats.findIndex((f) => f.id === id);\n return index >= 0 ? this.floats[index] : null;\n }\n}\n\n/**\n * @param continues Represents whether the float is fragmented and continues\n * after this fragment\n */\nexport class PageFloatFragment implements PageFloats.PageFloatFragment {\n constructor(\n public readonly floatReference: FloatReference,\n public readonly floatSide: string,\n public readonly continuations: PageFloatContinuation[],\n public readonly area: Vtree.Container,\n public readonly continues: boolean,\n ) {}\n\n hasFloat(float: PageFloat): boolean {\n return this.continuations.some((c) => c.float === float);\n }\n\n findNotAllowedFloat(context: PageFloatLayoutContext): PageFloat | null {\n for (let i = this.continuations.length - 1; i >= 0; i--) {\n const f = this.continuations[i].float;\n if (!f.isAllowedOnContext(context)) {\n return f;\n }\n }\n return null;\n }\n\n getOuterShape(): GeometryUtil.Shape {\n return this.area.getOuterShape(null, null);\n }\n\n getOuterRect(): GeometryUtil.Rect {\n return this.area.getOuterRect();\n }\n\n getOrder(): number {\n const floats = this.continuations.map((c) => c.float);\n return Math.min.apply(\n null,\n floats.map((f) => f.getOrder()),\n );\n }\n\n shouldBeStashedBefore(float: PageFloat): boolean {\n return this.getOrder() < float.getOrder();\n }\n\n addContinuations(continuations: PageFloatContinuation[]) {\n continuations.forEach((c) => {\n this.continuations.push(c);\n });\n }\n\n getFlowName(): string {\n const flowName = this.continuations[0].float.flowName;\n Asserts.assert(\n this.continuations.every((c) => c.float.flowName === flowName),\n );\n return flowName;\n }\n}\n\nexport class PageFloatContinuation implements PageFloats.PageFloatContinuation {\n constructor(\n public readonly float: PageFloat,\n public readonly nodePosition: Vtree.NodePosition,\n ) {}\n\n equals(other: PageFloatContinuation | null): boolean {\n if (!other) {\n return false;\n }\n if (this === other) {\n return true;\n }\n return (\n this.float === other.float &&\n VtreeImpl.isSameNodePosition(this.nodePosition, other.nodePosition)\n );\n }\n}\n\nexport type PageFloatPlacementCondition = PageFloats.PageFloatPlacementCondition;\n\n/**\n * @param generatingNodePosition Source NodePosition generating the context.\n * Specify when a column context is generated by a non-root element (for\n * example page floats)\n */\nexport class PageFloatLayoutContext\n implements PageFloats.PageFloatLayoutContext {\n private children: PageFloatLayoutContext[] = [];\n writingMode: Css.Val;\n direction: Css.Val;\n private invalidated: boolean = false;\n private floatStore: PageFloatStore;\n private forbiddenFloats: PageFloatID[] = [];\n floatFragments: PageFloatFragment[] = [];\n private stashedFloatFragments: PageFloatFragment[] = [];\n private floatAnchors: { [key in PageFloatID]: Node } = {};\n private floatsDeferredToNext: PageFloatContinuation[] = [];\n private floatsDeferredFromPrevious: PageFloatContinuation[];\n private layoutConstraints: LayoutType.LayoutConstraint[] = [];\n private locked: boolean = false;\n\n constructor(\n public readonly parent: PageFloatLayoutContext,\n private readonly floatReference: FloatReference | null,\n private container: Vtree.Container,\n public readonly flowName: string | null,\n public readonly generatingNodePosition: Vtree.NodePosition | null,\n writingMode: Css.Val | null,\n direction: Css.Val | null,\n ) {\n if (parent) {\n parent.children.push(this);\n }\n this.writingMode =\n writingMode || (parent && parent.writingMode) || Css.ident.horizontal_tb;\n this.direction = direction || (parent && parent.direction) || Css.ident.ltr;\n this.floatStore = parent ? parent.floatStore : new PageFloatStore();\n const previousSibling = this.getPreviousSibling();\n this.floatsDeferredFromPrevious = previousSibling\n ? [].concat(previousSibling.floatsDeferredToNext)\n : [];\n }\n\n private getParent(floatReference: FloatReference): PageFloatLayoutContext {\n if (!this.parent) {\n throw new Error(`No PageFloatLayoutContext for ${floatReference}`);\n }\n return this.parent;\n }\n\n private getPreviousSiblingOf(\n child: PageFloatLayoutContext | null,\n floatReference: FloatReference | null,\n flowName: string | null,\n generatingNodePosition: Vtree.NodePosition | null,\n ): PageFloatLayoutContext | null {\n let index = this.children.indexOf(child as PageFloatLayoutContext);\n if (index < 0) {\n index = this.children.length;\n }\n for (let i = index - 1; i >= 0; i--) {\n let result = this.children[i];\n if (\n result.floatReference === floatReference &&\n result.flowName === flowName &&\n VtreeImpl.isSameNodePosition(\n result.generatingNodePosition,\n generatingNodePosition,\n )\n ) {\n return result;\n } else {\n result = result.getPreviousSiblingOf(\n null,\n floatReference,\n flowName,\n generatingNodePosition,\n );\n if (result) {\n return result;\n }\n }\n }\n return null;\n }\n\n private getPreviousSibling(): PageFloatLayoutContext | null {\n let child: PageFloatLayoutContext = this;\n let parent = this.parent;\n let result: PageFloatLayoutContext;\n while (parent) {\n result = parent.getPreviousSiblingOf(\n child,\n this.floatReference,\n this.flowName,\n this.generatingNodePosition,\n );\n if (result) {\n return result;\n }\n child = parent;\n parent = parent.parent;\n }\n return null;\n }\n\n getContainer(floatReference?: FloatReference): Vtree.Container {\n if (!floatReference || floatReference === this.floatReference) {\n return this.container;\n }\n return this.getParent(floatReference).getContainer(floatReference);\n }\n\n setContainer(container: Vtree.Container) {\n this.container = container;\n this.reattachFloatFragments();\n }\n\n addPageFloat(float: PageFloat) {\n this.floatStore.addPageFloat(float);\n }\n\n getPageFloatLayoutContext(\n floatReference: FloatReference,\n ): PageFloatLayoutContext {\n if (floatReference === this.floatReference) {\n return this;\n }\n return this.getParent(floatReference).getPageFloatLayoutContext(\n floatReference,\n );\n }\n\n findPageFloatByNodePosition(\n nodePosition: Vtree.NodePosition,\n ): PageFloat | null {\n return this.floatStore.findPageFloatByNodePosition(nodePosition);\n }\n\n private forbid(float: PageFloat) {\n const id = float.getId();\n const floatReference = float.floatReference;\n if (floatReference === this.floatReference) {\n if (!this.forbiddenFloats.includes(id)) {\n this.forbiddenFloats.push(id);\n const strategy = new PageFloatLayoutStrategyResolver().findByFloat(\n float,\n );\n strategy.forbid(float, this);\n }\n } else {\n const parent = this.getParent(floatReference);\n parent.forbid(float);\n }\n }\n\n isForbidden(float: PageFloat): boolean {\n const id = float.getId();\n const floatReference = float.floatReference;\n if (floatReference === this.floatReference) {\n return this.forbiddenFloats.includes(id);\n } else {\n const parent = this.getParent(floatReference);\n return parent.isForbidden(float);\n }\n }\n\n addPageFloatFragment(\n floatFragment: PageFloatFragment,\n dontInvalidate?: boolean,\n ) {\n const floatReference = floatFragment.floatReference;\n if (floatReference !== this.floatReference) {\n const parent = this.getParent(floatReference);\n parent.addPageFloatFragment(floatFragment, dontInvalidate);\n } else if (!this.floatFragments.includes(floatFragment)) {\n this.floatFragments.push(floatFragment);\n this.floatFragments.sort((fr1, fr2) => fr1.getOrder() - fr2.getOrder());\n }\n if (!dontInvalidate) {\n this.invalidate();\n }\n }\n\n removePageFloatFragment(\n floatFragment: PageFloatFragment,\n dontInvalidate?: boolean,\n ) {\n const floatReference = floatFragment.floatReference;\n if (floatReference !== this.floatReference) {\n const parent = this.getParent(floatReference);\n parent.removePageFloatFragment(floatFragment, dontInvalidate);\n } else {\n const index = this.floatFragments.indexOf(floatFragment);\n if (index >= 0) {\n const fragment = this.floatFragments.splice(index, 1)[0];\n const element = fragment.area && fragment.area.element;\n if (element && element.parentNode) {\n element.parentNode.removeChild(element);\n }\n if (!dontInvalidate) {\n this.invalidate();\n }\n }\n }\n }\n\n findPageFloatFragment(float: PageFloat): PageFloatFragment | null {\n if (float.floatReference !== this.floatReference) {\n const parent = this.getParent(float.floatReference);\n return parent.findPageFloatFragment(float);\n }\n const index = this.floatFragments.findIndex((f) => f.hasFloat(float));\n if (index >= 0) {\n return this.floatFragments[index];\n } else {\n return null;\n }\n }\n\n hasFloatFragments(condition?: (p1: PageFloatFragment) => boolean): boolean {\n if (this.floatFragments.length > 0) {\n if (!condition || this.floatFragments.some(condition)) {\n return true;\n }\n }\n if (this.parent) {\n return this.parent.hasFloatFragments(condition);\n } else {\n return false;\n }\n }\n\n hasContinuingFloatFragmentsInFlow(flowName: string): boolean {\n return this.hasFloatFragments(\n (fragment) => fragment.continues && fragment.getFlowName() === flowName,\n );\n }\n\n registerPageFloatAnchor(float: PageFloat, anchorViewNode: Node) {\n this.floatAnchors[float.getId()] = anchorViewNode;\n }\n\n collectPageFloatAnchors() {\n const anchors = Object.assign({}, this.floatAnchors);\n return this.children.reduce(\n (prev, child) => Object.assign(prev, child.collectPageFloatAnchors()),\n anchors,\n );\n }\n\n isAnchorAlreadyAppeared(floatId: PageFloatID) {\n const deferredFloats = this.getDeferredPageFloatContinuations();\n if (deferredFloats.some((cont) => cont.float.getId() === floatId)) {\n return true;\n }\n const floatAnchors = this.collectPageFloatAnchors();\n const anchorViewNode = floatAnchors[floatId];\n if (!anchorViewNode) {\n return false;\n }\n if (this.container && this.container.element) {\n return this.container.element.contains(anchorViewNode);\n }\n return false;\n }\n\n deferPageFloat(continuation: PageFloatContinuation) {\n const float = continuation.float;\n if (float.floatReference === this.floatReference) {\n const index = this.floatsDeferredToNext.findIndex(\n (c) => c.float === float,\n );\n if (index >= 0) {\n this.floatsDeferredToNext.splice(index, 1, continuation);\n } else {\n this.floatsDeferredToNext.push(continuation);\n }\n } else {\n const parent = this.getParent(float.floatReference);\n parent.deferPageFloat(continuation);\n }\n }\n\n hasPrecedingFloatsDeferredToNext(\n float: PageFloat,\n ignoreReference?: boolean,\n ): boolean {\n if (!ignoreReference && float.floatReference !== this.floatReference) {\n return this.getParent(\n float.floatReference,\n ).hasPrecedingFloatsDeferredToNext(float, false);\n }\n const order = float.getOrder();\n const hasPrecedingFloatsDeferredToNext = this.floatsDeferredToNext.some(\n (c) => c.float.getOrder() < order && !float.isAllowedToPrecede(c.float),\n );\n if (hasPrecedingFloatsDeferredToNext) {\n return true;\n } else if (this.parent) {\n return this.parent.hasPrecedingFloatsDeferredToNext(float, true);\n } else {\n return false;\n }\n }\n\n getLastFollowingFloatInFragments(float: PageFloat): PageFloat | null {\n const order = float.getOrder();\n let lastFollowing: PageFloat = null;\n this.floatFragments.forEach((fragment) => {\n fragment.continuations.forEach((c) => {\n const f = c.float;\n const o = f.getOrder();\n if (o > order && (!lastFollowing || o > lastFollowing.getOrder())) {\n lastFollowing = f;\n }\n });\n });\n if (this.parent) {\n const lastFollowingOfParent = this.parent.getLastFollowingFloatInFragments(\n float,\n );\n if (\n lastFollowingOfParent &&\n (!lastFollowing ||\n lastFollowingOfParent.getOrder() > lastFollowing.getOrder())\n ) {\n lastFollowing = lastFollowingOfParent;\n }\n }\n return lastFollowing;\n }\n\n getDeferredPageFloatContinuations(\n flowName?: string | null,\n ): PageFloatContinuation[] {\n flowName = flowName || this.flowName;\n let result = this.floatsDeferredFromPrevious.filter(\n (cont) => !flowName || cont.float.flowName === flowName,\n );\n if (this.parent) {\n result = this.parent\n .getDeferredPageFloatContinuations(flowName)\n .concat(result);\n }\n return result.sort((c1, c2) => c1.float.getOrder() - c2.float.getOrder());\n }\n\n getPageFloatContinuationsDeferredToNext(\n flowName?: string | null,\n ): PageFloatContinuation[] {\n flowName = flowName || this.flowName;\n const result = this.floatsDeferredToNext.filter(\n (cont) => !flowName || cont.float.flowName === flowName,\n );\n if (this.parent) {\n return this.parent\n .getPageFloatContinuationsDeferredToNext(flowName)\n .concat(result);\n } else {\n return result;\n }\n }\n\n getFloatsDeferredToNextInChildContexts(): PageFloat[] {\n let result = [];\n const done = [];\n for (let i = this.children.length - 1; i >= 0; i--) {\n const child = this.children[i];\n if (done.includes(child.flowName)) {\n continue;\n }\n done.push(child.flowName);\n result = result.concat(child.floatsDeferredToNext.map((c) => c.float));\n result = result.concat(child.getFloatsDeferredToNextInChildContexts());\n }\n return result;\n }\n\n checkAndForbidNotAllowedFloat(): boolean {\n if (this.checkAndForbidFloatFollowingDeferredFloat()) {\n return true;\n }\n for (let i = this.floatFragments.length - 1; i >= 0; i--) {\n const fragment = this.floatFragments[i];\n const notAllowedFloat = fragment.findNotAllowedFloat(this);\n if (notAllowedFloat) {\n if (this.locked) {\n this.invalidate();\n } else {\n this.removePageFloatFragment(fragment);\n this.forbid(notAllowedFloat);\n\n // If the removed float is a block-end/inline-end float,\n // we should re-layout preceding floats with the same float direction.\n this.removeEndFloatFragments(fragment.floatSide);\n }\n return true;\n }\n }\n if (this.floatReference === FloatReference.REGION && this.parent.locked) {\n return this.parent.checkAndForbidNotAllowedFloat();\n }\n return false;\n }\n\n checkAndForbidFloatFollowingDeferredFloat(): boolean {\n const deferredFloats = this.getFloatsDeferredToNextInChildContexts();\n const floatsInFragments = this.floatFragments.reduce(\n (r, fr) => r.concat(fr.continuations.map((c) => c.float)),\n [],\n );\n floatsInFragments.sort((f1, f2) => f2.getOrder() - f1.getOrder());\n for (const float of floatsInFragments) {\n const order = float.getOrder();\n if (\n deferredFloats.some(\n (d) => !float.isAllowedToPrecede(d) && order > d.getOrder(),\n )\n ) {\n if (this.locked) {\n this.invalidate();\n } else {\n this.forbid(float);\n const fragment = this.findPageFloatFragment(float);\n Asserts.assert(fragment);\n this.removePageFloatFragment(fragment);\n }\n return true;\n }\n }\n return false;\n }\n\n finish() {\n if (this.checkAndForbidNotAllowedFloat()) {\n return;\n }\n for (let i = this.floatsDeferredToNext.length - 1; i >= 0; i--) {\n const continuation = this.floatsDeferredToNext[i];\n if (!continuation.float.isAllowedOnContext(this)) {\n if (this.locked) {\n this.invalidate();\n return;\n }\n this.floatsDeferredToNext.splice(i, 1);\n }\n }\n this.floatsDeferredFromPrevious.forEach((continuation) => {\n if (\n this.floatsDeferredToNext.findIndex((c) => continuation.equals(c)) >= 0\n ) {\n return;\n }\n if (this.floatFragments.some((f) => f.hasFloat(continuation.float))) {\n return;\n }\n this.floatsDeferredToNext.push(continuation);\n });\n }\n\n hasSameContainerAs(other: PageFloatLayoutContext): boolean {\n return (\n !!this.container &&\n !!other.container &&\n this.container.element === other.container.element\n );\n }\n\n invalidate() {\n this.invalidated = true;\n if (this.locked) {\n return;\n }\n if (this.container) {\n this.children.forEach((child) => {\n // Since the same container element is shared by a region page float\n // layout context and a column page float layout context in a single\n // column region, view elements of float fragments of the child (column)\n // context need to be removed here.\n if (this.hasSameContainerAs(child)) {\n child.floatFragments.forEach((fragment) => {\n const elem = fragment.area.element;\n if (elem && elem.parentNode) {\n elem.parentNode.removeChild(elem);\n }\n });\n }\n });\n this.container.clear();\n }\n this.children.forEach((child) => {\n child.layoutConstraints.splice(0);\n });\n this.children.splice(0);\n Object.keys(this.floatAnchors).forEach((k) => {\n delete this.floatAnchors[k];\n });\n }\n\n detachChildren(): PageFloatLayoutContext[] {\n const children = this.children.splice(0);\n children.forEach((child) => {\n child.floatFragments.forEach((fragment) => {\n const elem = fragment.area.element;\n if (elem && elem.parentNode) {\n elem.parentNode.removeChild(elem);\n }\n });\n });\n return children;\n }\n\n attachChildren(children: PageFloatLayoutContext[]) {\n children.forEach((child) => {\n this.children.push(child);\n child.reattachFloatFragments();\n });\n }\n\n isInvalidated() {\n return this.invalidated || (!!this.parent && this.parent.isInvalidated());\n }\n\n validate() {\n this.invalidated = false;\n }\n\n private toLogical(side: string): string {\n const writingMode = this.writingMode.toString();\n const direction = this.direction.toString();\n return CssLogicalUtil.toLogical(side, writingMode, direction);\n }\n\n private toPhysical(side: string): string {\n const writingMode = this.writingMode.toString();\n const direction = this.direction.toString();\n return CssLogicalUtil.toPhysical(side, writingMode, direction);\n }\n\n removeEndFloatFragments(floatSide: string) {\n const logicalFloatSide = this.toLogical(floatSide);\n if (logicalFloatSide === \"block-end\" || logicalFloatSide === \"inline-end\") {\n let i = 0;\n while (i < this.floatFragments.length) {\n const fragment = this.floatFragments[i];\n const logicalFloatSide2 = this.toLogical(fragment.floatSide);\n if (logicalFloatSide2 === logicalFloatSide) {\n this.removePageFloatFragment(fragment);\n } else {\n i++;\n }\n }\n }\n }\n\n stashEndFloatFragments(float: PageFloat) {\n const floatReference = float.floatReference;\n if (floatReference !== this.floatReference) {\n this.getParent(floatReference).stashEndFloatFragments(float);\n return;\n }\n const logicalFloatSide = this.toLogical(float.floatSide);\n if (\n logicalFloatSide === \"block-end\" ||\n logicalFloatSide === \"snap-block\" ||\n logicalFloatSide === \"inline-end\"\n ) {\n let i = 0;\n while (i < this.floatFragments.length) {\n const fragment = this.floatFragments[i];\n const fragmentFloatSide = this.toLogical(fragment.floatSide);\n if (\n (fragmentFloatSide === logicalFloatSide ||\n (logicalFloatSide === \"snap-block\" &&\n fragmentFloatSide === \"block-end\")) &&\n fragment.shouldBeStashedBefore(float)\n ) {\n this.stashedFloatFragments.push(fragment);\n this.floatFragments.splice(i, 1);\n } else {\n i++;\n }\n }\n }\n }\n\n restoreStashedFragments(floatReference: FloatReference) {\n if (floatReference !== this.floatReference) {\n this.getParent(floatReference).restoreStashedFragments(floatReference);\n return;\n }\n this.stashedFloatFragments.forEach((stashed) => {\n this.addPageFloatFragment(stashed, true);\n });\n this.stashedFloatFragments.splice(0);\n }\n\n discardStashedFragments(floatReference: FloatReference) {\n if (floatReference !== this.floatReference) {\n this.getParent(floatReference).discardStashedFragments(floatReference);\n return;\n }\n this.stashedFloatFragments.splice(0);\n }\n\n getStashedFloatFragments(\n floatReference: FloatReference,\n ): PageFloatFragment[] {\n if (floatReference === this.floatReference) {\n return this.stashedFloatFragments\n .concat()\n .sort((fr1, fr2) => fr2.getOrder() - fr1.getOrder()); // return in reverse order\n } else {\n return this.getParent(floatReference).getStashedFloatFragments(\n floatReference,\n );\n }\n }\n\n private getLimitValue(\n side: string,\n layoutContext: Vtree.LayoutContext,\n clientLayout: Vtree.ClientLayout,\n condition?: (p1: PageFloatFragment, p2: PageFloatLayoutContext) => boolean,\n ): number {\n Asserts.assert(this.container);\n const logicalSide = this.toLogical(side);\n const physicalSide = this.toPhysical(side);\n const limit = this.getLimitValueInner(\n logicalSide,\n layoutContext,\n clientLayout,\n condition,\n );\n if (this.parent && this.parent.container) {\n const parentLimit = this.parent.getLimitValue(\n physicalSide,\n layoutContext,\n clientLayout,\n condition,\n );\n switch (physicalSide) {\n case \"top\":\n return Math.max(limit, parentLimit);\n case \"left\":\n return Math.max(limit, parentLimit);\n case \"bottom\":\n return Math.min(limit, parentLimit);\n case \"right\":\n return Math.min(limit, parentLimit);\n default:\n Asserts.fail(\"Should be unreachable\");\n }\n }\n return limit;\n }\n\n private getLimitValueInner(\n logicalSide: string,\n layoutContext: Vtree.LayoutContext,\n clientLayout: Vtree.ClientLayout,\n condition?: (p1: PageFloatFragment, p2: PageFloatLayoutContext) => boolean,\n ): number {\n Asserts.assert(this.container);\n const limits = this.getLimitValuesInner(\n layoutContext,\n clientLayout,\n condition,\n );\n switch (logicalSide) {\n case \"block-start\":\n return this.container.vertical ? limits.right : limits.top;\n case \"block-end\":\n return this.container.vertical ? limits.left : limits.bottom;\n case \"inline-start\":\n return this.container.vertical ? limits.top : limits.left;\n case \"inline-end\":\n return this.container.vertical ? limits.bottom : limits.right;\n default:\n throw new Error(`Unknown logical side: ${logicalSide}`);\n }\n }\n\n private getLimitValuesInner(\n layoutContext: Vtree.LayoutContext,\n clientLayout: Vtree.ClientLayout,\n condition?: (p1: PageFloatFragment, p2: PageFloatLayoutContext) => boolean,\n ): {\n top: number;\n left: number;\n bottom: number;\n right: number;\n floatMinWrapBlockStart: number;\n floatMinWrapBlockEnd: number;\n } {\n Asserts.assert(this.container);\n const offsetX = this.container.originX;\n const offsetY = this.container.originY;\n const paddingRect = this.container.getPaddingRect();\n let limits = {\n top: paddingRect.y1 - offsetY,\n left: paddingRect.x1 - offsetX,\n bottom: paddingRect.y2 - offsetY,\n right: paddingRect.x2 - offsetX,\n floatMinWrapBlockStart: 0,\n floatMinWrapBlockEnd: 0,\n };\n\n function resolveLengthPercentage(numeric, viewNode, containerLength) {\n if (numeric.unit === \"%\") {\n return (containerLength * numeric.num) / 100;\n } else {\n return layoutContext.convertLengthToPx(numeric, viewNode, clientLayout);\n }\n }\n const fragments = this.floatFragments;\n if (fragments.length > 0) {\n limits = fragments.reduce((l, f) => {\n if (condition && !condition(f, this)) {\n return l;\n }\n const logicalFloatSide = this.toLogical(f.floatSide);\n const area = f.area;\n const floatMinWrapBlock = f.continuations[0].float.floatMinWrapBlock;\n let top = l.top;\n let left = l.left;\n let bottom = l.bottom;\n let right = l.right;\n let floatMinWrapBlockStart = l.floatMinWrapBlockStart;\n let floatMinWrapBlockEnd = l.floatMinWrapBlockEnd;\n switch (logicalFloatSide) {\n case \"inline-start\":\n if (area.vertical) {\n top = Math.max(top, area.top + area.height);\n } else {\n left = Math.max(left, area.left + area.width);\n }\n break;\n case \"block-start\":\n if (area.vertical) {\n if (floatMinWrapBlock && area.left < right) {\n floatMinWrapBlockStart = resolveLengthPercentage(\n floatMinWrapBlock,\n (area as any).rootViewNodes[0],\n paddingRect.x2 - paddingRect.x1,\n ) as number;\n }\n right = Math.min(right, area.left);\n } else {\n if (floatMinWrapBlock && area.top + area.height > top) {\n floatMinWrapBlockStart = resolveLengthPercentage(\n floatMinWrapBlock,\n (area as any).rootViewNodes[0],\n paddingRect.y2 - paddingRect.y1,\n ) as number;\n }\n top = Math.max(top, area.top + area.height);\n }\n break;\n case \"inline-end\":\n if (area.vertical) {\n bottom = Math.min(bottom, area.top);\n } else {\n right = Math.min(right, area.left);\n }\n break;\n case \"block-end\":\n if (area.vertical) {\n if (floatMinWrapBlock && area.left + area.width > left) {\n floatMinWrapBlockEnd = resolveLengthPercentage(\n floatMinWrapBlock,\n (area as any).rootViewNodes[0],\n paddingRect.x2 - paddingRect.x1,\n ) as number;\n }\n left = Math.max(left, area.left + area.width);\n } else {\n if (floatMinWrapBlock && area.top < bottom) {\n floatMinWrapBlockEnd = resolveLengthPercentage(\n floatMinWrapBlock,\n (area as any).rootViewNodes[0],\n paddingRect.y2 - paddingRect.y1,\n ) as number;\n }\n bottom = Math.min(bottom, area.top);\n }\n break;\n default:\n throw new Error(`Unknown logical float side: ${logicalFloatSide}`);\n }\n return {\n top,\n left,\n bottom,\n right,\n floatMinWrapBlockStart,\n floatMinWrapBlockEnd,\n };\n }, limits);\n }\n limits.left += offsetX;\n limits.right += offsetX;\n limits.top += offsetY;\n limits.bottom += offsetY;\n return limits;\n }\n\n /**\n * @param anchorEdge Null indicates that the anchor is not in the current\n * container.\n * @return Logical float side (snap-block is resolved when init=false). Null\n * indicates that the float area does not fit inside the container\n */\n setFloatAreaDimensions(\n area: LayoutType.PageFloatArea,\n floatReference: FloatReference,\n floatSide: string,\n anchorEdge: number | null,\n init: boolean,\n force: boolean,\n condition: PageFloatPlacementCondition,\n ): string | null {\n if (floatReference !== this.floatReference) {\n const parent = this.getParent(floatReference);\n return parent.setFloatAreaDimensions(\n area,\n floatReference,\n floatSide,\n anchorEdge,\n init,\n force,\n condition,\n );\n }\n let logicalFloatSide = this.toLogical(floatSide);\n if (logicalFloatSide === \"snap-block\") {\n if (!condition[\"block-start\"] && !condition[\"block-end\"]) {\n return null;\n }\n } else {\n if (!condition[logicalFloatSide]) {\n return null;\n }\n }\n Asserts.assert(area.clientLayout);\n let blockStart = this.getLimitValue(\n \"block-start\",\n area.layoutContext,\n area.clientLayout,\n );\n let blockEnd = this.getLimitValue(\n \"block-end\",\n area.layoutContext,\n area.clientLayout,\n );\n let inlineStart = this.getLimitValue(\n \"inline-start\",\n area.layoutContext,\n area.clientLayout,\n );\n let inlineEnd = this.getLimitValue(\n \"inline-end\",\n area.layoutContext,\n area.clientLayout,\n );\n const blockOffset = area.vertical ? area.originX : area.originY;\n const inlineOffset = area.vertical ? area.originY : area.originX;\n blockStart = area.vertical\n ? Math.min(\n blockStart,\n area.left +\n area.getInsetLeft() +\n area.width +\n area.getInsetRight() +\n blockOffset,\n )\n : Math.max(blockStart, area.top + blockOffset);\n blockEnd = area.vertical\n ? Math.max(blockEnd, area.left + blockOffset)\n : Math.min(\n blockEnd,\n area.top +\n area.getInsetTop() +\n area.height +\n area.getInsetBottom() +\n blockOffset,\n );\n\n function limitBlockStartEndValueWithOpenRect(getRect, rect) {\n let openRect = getRect(area.bands, rect);\n if (openRect) {\n if (area.vertical) {\n openRect = GeometryUtil.unrotateBox(openRect);\n }\n blockStart = area.vertical\n ? Math.min(blockStart, openRect.x2)\n : Math.max(blockStart, openRect.y1);\n blockEnd = area.vertical\n ? Math.max(blockEnd, openRect.x1)\n : Math.min(blockEnd, openRect.y2);\n return true;\n } else {\n return force;\n }\n }\n let blockSize: number;\n let inlineSize: number;\n let outerBlockSize: number;\n let outerInlineSize: number;\n if (init) {\n const rect = area.vertical\n ? GeometryUtil.rotateBox(\n new GeometryUtil.Rect(blockEnd, inlineStart, blockStart, inlineEnd),\n )\n : new GeometryUtil.Rect(inlineStart, blockStart, inlineEnd, blockEnd);\n if (\n logicalFloatSide === \"block-start\" ||\n logicalFloatSide === \"snap-block\" ||\n logicalFloatSide === \"inline-start\"\n ) {\n if (\n !limitBlockStartEndValueWithOpenRect(\n GeometryUtil.findUppermostFullyOpenRect,\n rect,\n )\n ) {\n return null;\n }\n }\n if (\n logicalFloatSide === \"block-end\" ||\n logicalFloatSide === \"snap-block\" ||\n logicalFloatSide === \"inline-end\"\n ) {\n if (\n !limitBlockStartEndValueWithOpenRect(\n GeometryUtil.findBottommostFullyOpenRect,\n rect,\n )\n ) {\n return null;\n }\n }\n outerBlockSize = (blockEnd - blockStart) * area.getBoxDir();\n blockSize = outerBlockSize - area.getInsetBefore() - area.getInsetAfter();\n outerInlineSize = inlineEnd - inlineStart;\n inlineSize = outerInlineSize - area.getInsetStart() - area.getInsetEnd();\n if (!force && (blockSize <= 0 || inlineSize <= 0)) {\n return null;\n }\n } else {\n blockSize = area.computedBlockSize;\n outerBlockSize = blockSize + area.getInsetBefore() + area.getInsetAfter();\n const availableBlockSize = (blockEnd - blockStart) * area.getBoxDir();\n if (logicalFloatSide === \"snap-block\") {\n if (anchorEdge === null) {\n // Deferred from previous container\n logicalFloatSide = \"block-start\";\n } else {\n const containerRect = this.container.getPaddingRect();\n const fromStart =\n this.container.getBoxDir() *\n (anchorEdge -\n (this.container.vertical ? containerRect.x2 : containerRect.y1));\n const fromEnd =\n this.container.getBoxDir() *\n ((this.container.vertical ? containerRect.x1 : containerRect.y2) -\n anchorEdge -\n outerBlockSize);\n if (fromStart <= fromEnd) {\n logicalFloatSide = \"block-start\";\n } else {\n logicalFloatSide = \"block-end\";\n }\n }\n if (!condition[logicalFloatSide]) {\n if (condition[\"block-end\"]) {\n logicalFloatSide = \"block-end\";\n } else {\n return null;\n }\n }\n }\n if (!force && availableBlockSize < outerBlockSize) {\n return null;\n }\n if (\n logicalFloatSide === \"inline-start\" ||\n logicalFloatSide === \"inline-end\"\n ) {\n inlineSize = Sizing.getSize(area.clientLayout, area.element, [\n Sizing.Size.FIT_CONTENT_INLINE_SIZE,\n ])[Sizing.Size.FIT_CONTENT_INLINE_SIZE];\n } else if (area.adjustContentRelativeSize) {\n inlineSize = area.getContentInlineSize();\n } else {\n inlineSize = area.vertical ? area.height : area.width;\n }\n outerInlineSize = inlineSize + area.getInsetStart() + area.getInsetEnd();\n const availableInlineSize = inlineEnd - inlineStart;\n if (!force && availableInlineSize < outerInlineSize) {\n return null;\n }\n }\n blockStart -= blockOffset;\n blockEnd -= blockOffset;\n inlineStart -= inlineOffset;\n inlineEnd -= inlineOffset;\n switch (logicalFloatSide) {\n case \"inline-start\":\n case \"block-start\":\n case \"snap-block\":\n area.setInlinePosition(inlineStart, inlineSize);\n area.setBlockPosition(blockStart, blockSize);\n break;\n case \"inline-end\":\n case \"block-end\":\n area.setInlinePosition(inlineEnd - outerInlineSize, inlineSize);\n area.setBlockPosition(\n blockEnd - outerBlockSize * area.getBoxDir(),\n blockSize,\n );\n break;\n default:\n throw new Error(`unknown float direction: ${floatSide}`);\n }\n return logicalFloatSide;\n }\n\n getFloatFragmentExclusions(): GeometryUtil.Shape[] {\n const result = this.floatFragments.map((fragment) =>\n fragment.getOuterShape(),\n );\n if (this.parent) {\n return this.parent.getFloatFragmentExclusions().concat(result);\n } else {\n return result;\n }\n }\n\n private reattachFloatFragments() {\n const parent = this.container.element && this.container.element.parentNode;\n if (parent) {\n this.floatFragments.forEach((fragment) => {\n parent.appendChild(fragment.area.element);\n });\n }\n }\n\n getMaxReachedAfterEdge(): number {\n const isVertical = this.getContainer().vertical;\n return this.floatFragments.reduce(\n (edge, fragment) => {\n const rect = fragment.getOuterRect();\n if (isVertical) {\n return Math.min(edge, rect.x1);\n } else {\n return Math.max(edge, rect.y2);\n }\n },\n isVertical ? Infinity : 0,\n );\n }\n\n getBlockStartEdgeOfBlockEndFloats(): number {\n const isVertical = this.getContainer().vertical;\n return this.floatFragments\n .filter((fragment) => fragment.floatSide === \"block-end\")\n .reduce(\n (edge, fragment) => {\n const rect = fragment.getOuterRect();\n if (isVertical) {\n return Math.max(edge, rect.x2);\n } else {\n return Math.min(edge, rect.y1);\n }\n },\n isVertical ? 0 : Infinity,\n );\n }\n\n getPageFloatClearEdge(clear: string, column: LayoutType.Column): number {\n function isContinuationOfAlreadyAppearedFloat(context) {\n return (continuation) =>\n context.isAnchorAlreadyAppeared(continuation.float.getId());\n }\n\n function isFragmentWithAlreadyAppearedFloat(fragment, context) {\n return fragment.continuations.some(\n isContinuationOfAlreadyAppearedFloat(context),\n );\n }\n const columnRect = column.getPaddingRect();\n const columnBlockEnd = column.vertical ? columnRect.x1 : columnRect.y2;\n let context: PageFloatLayoutContext = this;\n while (context) {\n if (\n context.floatsDeferredToNext.some(\n isContinuationOfAlreadyAppearedFloat(context),\n )\n ) {\n return columnBlockEnd;\n }\n context = context.parent;\n }\n Asserts.assert(column.clientLayout);\n const blockStartLimit = this.getLimitValue(\n \"block-start\",\n column.layoutContext,\n column.clientLayout,\n isFragmentWithAlreadyAppearedFloat,\n );\n const blockEndLimit = this.getLimitValue(\n \"block-end\",\n column.layoutContext,\n column.clientLayout,\n isFragmentWithAlreadyAppearedFloat,\n );\n if (\n blockEndLimit * column.getBoxDir() <\n columnBlockEnd * column.getBoxDir()\n ) {\n return columnBlockEnd;\n } else {\n return blockStartLimit;\n }\n }\n\n getPageFloatPlacementCondition(\n float: PageFloat,\n floatSide: string,\n clearSide: string | null,\n ): PageFloatPlacementCondition {\n if (float.floatReference !== this.floatReference) {\n const parent = this.getParent(float.floatReference);\n return parent.getPageFloatPlacementCondition(float, floatSide, clearSide);\n }\n const result: PageFloatPlacementCondition = {\n \"block-start\": true,\n \"block-end\": true,\n \"inline-start\": true,\n \"inline-end\": true,\n };\n if (!clearSide) {\n return result;\n }\n const logicalFloatSide = this.toLogical(floatSide);\n const logicalClearSide = this.toLogical(clearSide);\n let logicalSides: string[];\n if (logicalClearSide === \"all\") {\n logicalSides = [\"block-start\", \"block-end\", \"inline-start\", \"inline-end\"];\n } else if (logicalClearSide === \"both\") {\n logicalSides = [\"inline-start\", \"inline-end\"];\n } else if (logicalClearSide === \"same\") {\n if (logicalFloatSide === \"snap-block\") {\n logicalSides = [\"block-start\", \"block-end\"];\n } else {\n logicalSides = [logicalFloatSide];\n }\n } else {\n logicalSides = [logicalClearSide];\n }\n const floatOrder = float.getOrder();\n\n function isPrecedingFragment(\n side: string,\n ): (p1: PageFloatFragment) => boolean {\n return (fragment) =>\n fragment.floatSide === side && fragment.getOrder() < floatOrder;\n }\n\n function hasPrecedingFragmentInChildren(\n context: PageFloatLayoutContext,\n side: string,\n ): boolean {\n return context.children.some(\n (child) =>\n child.floatFragments.some(isPrecedingFragment(side)) ||\n hasPrecedingFragmentInChildren(child, side),\n );\n }\n\n function hasPrecedingFragmentInParents(\n context: PageFloatLayoutContext,\n side: string,\n ): boolean {\n const parent = context.parent;\n return (\n !!parent &&\n (parent.floatFragments.some(isPrecedingFragment(side)) ||\n hasPrecedingFragmentInParents(parent, side))\n );\n }\n logicalSides.forEach((side) => {\n switch (side) {\n case \"block-start\":\n case \"inline-start\":\n result[side] = !hasPrecedingFragmentInChildren(this, side);\n break;\n case \"block-end\":\n case \"inline-end\":\n result[side] = !hasPrecedingFragmentInParents(this, side);\n break;\n default:\n throw new Error(`Unexpected side: ${side}`);\n }\n });\n return result;\n }\n\n getLayoutConstraints(): LayoutType.LayoutConstraint[] {\n const constraints = this.parent ? this.parent.getLayoutConstraints() : [];\n return constraints.concat(this.layoutConstraints);\n }\n\n addLayoutConstraint(\n layoutConstraint: LayoutType.LayoutConstraint,\n floatReference: FloatReference,\n ) {\n if (floatReference === this.floatReference) {\n this.layoutConstraints.push(layoutConstraint);\n } else {\n this.getParent(floatReference).addLayoutConstraint(\n layoutConstraint,\n floatReference,\n );\n }\n }\n\n isColumnFullWithPageFloats(column: LayoutType.Column): boolean {\n const layoutContext = column.layoutContext;\n const clientLayout = column.clientLayout;\n Asserts.assert(clientLayout);\n let context: PageFloatLayoutContext = this;\n let limits: {\n top: number;\n left: number;\n bottom: number;\n right: number;\n floatMinWrapBlockStart: number;\n floatMinWrapBlockEnd: number;\n } = null;\n while (context && context.container) {\n const l = context.getLimitValuesInner(layoutContext, clientLayout);\n if (limits) {\n if (column.vertical) {\n if (l.right < limits.right) {\n limits.right = l.right;\n limits.floatMinWrapBlockStart = l.floatMinWrapBlockStart;\n }\n if (l.left > limits.left) {\n limits.left = l.left;\n limits.floatMinWrapBlockEnd = l.floatMinWrapBlockEnd;\n }\n } else {\n if (l.top > limits.top) {\n limits.top = l.top;\n limits.floatMinWrapBlockStart = l.floatMinWrapBlockStart;\n }\n if (l.bottom < limits.bottom) {\n limits.bottom = l.bottom;\n limits.floatMinWrapBlockEnd = l.floatMinWrapBlockEnd;\n }\n }\n } else {\n limits = l;\n }\n context = context.parent;\n }\n const floatMinWrapBlock = Math.max(\n limits.floatMinWrapBlockStart,\n limits.floatMinWrapBlockEnd,\n );\n const blockSpace = column.vertical\n ? limits.right - limits.left\n : limits.bottom - limits.top;\n return blockSpace <= floatMinWrapBlock;\n }\n\n getMaxBlockSizeOfPageFloats(): number {\n const isVertical = this.getContainer().vertical;\n if (!this.floatFragments.length) {\n return 0;\n }\n return Math.max.apply(\n null,\n this.floatFragments.map((fragment) => {\n const area = fragment.area;\n if (isVertical) {\n return area.width;\n } else {\n return area.height;\n }\n }),\n );\n }\n\n lock() {\n this.locked = true;\n }\n\n unlock() {\n this.locked = false;\n }\n\n isLocked(): boolean {\n return this.locked;\n }\n}\n\nexport interface PageFloatLayoutStrategy\n extends PageFloats.PageFloatLayoutStrategy {}\n\nconst pageFloatLayoutStrategies: PageFloatLayoutStrategy[] = [];\n\nexport class PageFloatLayoutStrategyResolver {\n static register(strategy: PageFloatLayoutStrategy) {\n pageFloatLayoutStrategies.push(strategy);\n }\n\n findByNodeContext(nodeContext: Vtree.NodeContext): PageFloatLayoutStrategy {\n for (let i = pageFloatLayoutStrategies.length - 1; i >= 0; i--) {\n const strategy = pageFloatLayoutStrategies[i];\n if (strategy.appliesToNodeContext(nodeContext)) {\n return strategy;\n }\n }\n throw new Error(`No PageFloatLayoutStrategy found for ${nodeContext}`);\n }\n\n findByFloat(float: PageFloat): PageFloatLayoutStrategy {\n for (let i = pageFloatLayoutStrategies.length - 1; i >= 0; i--) {\n const strategy = pageFloatLayoutStrategies[i];\n if (strategy.appliesToFloat(float)) {\n return strategy;\n }\n }\n throw new Error(`No PageFloatLayoutStrategy found for ${float}`);\n }\n}\n\nexport class NormalPageFloatLayoutStrategy implements PageFloatLayoutStrategy {\n /**\n * @override\n */\n appliesToNodeContext(nodeContext: Vtree.NodeContext): boolean {\n return isPageFloat(nodeContext.floatReference);\n }\n\n /**\n * @override\n */\n appliesToFloat(float: PageFloat): boolean {\n return true;\n }\n\n /**\n * @override\n */\n createPageFloat(\n nodeContext: Vtree.NodeContext,\n pageFloatLayoutContext: PageFloatLayoutContext,\n column: LayoutType.Column,\n ): Task.Result<PageFloat> {\n let floatReference = nodeContext.floatReference;\n Asserts.assert(nodeContext.floatSide);\n const floatSide: string = nodeContext.floatSide;\n const nodePosition = nodeContext.toNodePosition();\n return column\n .resolveFloatReferenceFromColumnSpan(\n floatReference,\n nodeContext.columnSpan,\n nodeContext,\n )\n .thenAsync((ref) => {\n floatReference = ref;\n Asserts.assert(pageFloatLayoutContext.flowName);\n const float = new PageFloat(\n nodePosition,\n floatReference,\n floatSide,\n nodeContext.clearSide,\n pageFloatLayoutContext.flowName,\n nodeContext.floatMinWrapBlock,\n );\n pageFloatLayoutContext.addPageFloat(float);\n return Task.newResult(float);\n });\n }\n\n /**\n * @override\n */\n createPageFloatFragment(\n continuations: PageFloatContinuation[],\n floatSide: string,\n floatArea: LayoutType.PageFloatArea,\n continues: boolean,\n ): PageFloatFragment {\n const f = continuations[0].float;\n return new PageFloatFragment(\n f.floatReference,\n floatSide,\n continuations,\n floatArea,\n continues,\n );\n }\n\n /**\n * @override\n */\n findPageFloatFragment(\n float: PageFloat,\n pageFloatLayoutContext: PageFloatLayoutContext,\n ): PageFloatFragment | null {\n return pageFloatLayoutContext.findPageFloatFragment(float);\n }\n\n /**\n * @override\n */\n adjustPageFloatArea(\n floatArea: LayoutType.PageFloatArea,\n floatContainer: Vtree.Container,\n column: LayoutType.Column,\n ) {}\n\n /**\n * @override\n */\n forbid(float: PageFloat, pageFloatLayoutContext: PageFloatLayoutContext) {}\n}\n\nPageFloatLayoutStrategyResolver.register(new NormalPageFloatLayoutStrategy());\n","/**\n * Copyright 2017 Trim-marks Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Footnotes\n */\nimport * as Asserts from \"./asserts\";\nimport * as Css from \"./css\";\nimport * as PageFloats from \"./page-floats\";\nimport * as Task from \"./task\";\nimport * as Vtree from \"./vtree\";\nimport { Layout } from \"./types\";\n\nconst PageFloatFragment = PageFloats.PageFloatFragment;\n\nexport class Footnote extends PageFloats.PageFloat {\n constructor(\n nodePosition: Vtree.NodePosition,\n floatReference: PageFloats.FloatReference,\n flowName: string,\n public readonly footnotePolicy: Css.Ident | null,\n floatMinWrapBlock: Css.Numeric | null,\n ) {\n super(\n nodePosition,\n floatReference,\n \"block-end\",\n null,\n flowName,\n floatMinWrapBlock,\n );\n }\n\n /**\n * @override\n */\n isAllowedToPrecede(other: PageFloats.PageFloat): boolean {\n return !(other instanceof Footnote);\n }\n}\n\n/**\n * @extends PageFloatFragment\n */\nexport class FootnoteFragment extends PageFloatFragment {\n constructor(\n floatReference: PageFloats.FloatReference,\n continuations: PageFloats.PageFloatContinuation[],\n area: Vtree.Container,\n continues: boolean,\n ) {\n super(floatReference, \"block-end\", continuations, area, continues);\n }\n\n /**\n * @override\n */\n getOrder(): number {\n return Infinity;\n }\n\n /**\n * @override\n */\n shouldBeStashedBefore(float: PageFloats.PageFloat): boolean {\n if (float instanceof Footnote) {\n return true;\n } else {\n return this.getOrder() < float.getOrder();\n }\n }\n}\n\nexport class LineFootnotePolicyLayoutConstraint\n implements Layout.LayoutConstraint {\n constructor(public readonly footnote: Footnote) {}\n\n allowLayout(nodeContext: Vtree.NodeContext): boolean {\n const nodePosition = nodeContext.toNodePosition();\n return !Vtree.isSameNodePosition(nodePosition, this.footnote.nodePosition);\n }\n}\n\nexport class FootnoteLayoutStrategy\n implements PageFloats.PageFloatLayoutStrategy {\n /**\n * @override\n */\n appliesToNodeContext(nodeContext: Vtree.NodeContext): boolean {\n return nodeContext.floatSide === \"footnote\";\n }\n\n /**\n * @override\n */\n appliesToFloat(float: PageFloats.PageFloat): boolean {\n return float instanceof Footnote;\n }\n\n /**\n * @override\n */\n createPageFloat(\n nodeContext: Vtree.NodeContext,\n pageFloatLayoutContext: PageFloats.PageFloatLayoutContext,\n column: Layout.Column,\n ): Task.Result<PageFloats.PageFloat> {\n let floatReference = PageFloats.FloatReference.REGION;\n\n // If the region context has the same container as the page context,\n // use the page context as the context for the footnote.\n const regionContext = pageFloatLayoutContext.getPageFloatLayoutContext(\n floatReference,\n );\n const pageContext = pageFloatLayoutContext.getPageFloatLayoutContext(\n PageFloats.FloatReference.PAGE,\n );\n if (pageContext.hasSameContainerAs(regionContext)) {\n floatReference = PageFloats.FloatReference.PAGE;\n }\n const nodePosition = nodeContext.toNodePosition();\n Asserts.assert(pageFloatLayoutContext.flowName);\n const float: PageFloats.PageFloat = new Footnote(\n nodePosition,\n floatReference,\n pageFloatLayoutContext.flowName,\n nodeContext.footnotePolicy,\n nodeContext.floatMinWrapBlock,\n );\n pageFloatLayoutContext.addPageFloat(float);\n return Task.newResult(float);\n }\n\n /**\n * @override\n */\n createPageFloatFragment(\n continuations: PageFloats.PageFloatContinuation[],\n floatSide: string,\n floatArea: Layout.PageFloatArea,\n continues: boolean,\n ): PageFloats.PageFloatFragment {\n const f = continuations[0].float;\n return new FootnoteFragment(\n f.floatReference,\n continuations,\n floatArea,\n continues,\n );\n }\n\n /**\n * @override\n */\n findPageFloatFragment(\n float: PageFloats.PageFloat,\n pageFloatLayoutContext: PageFloats.PageFloatLayoutContext,\n ): PageFloats.PageFloatFragment | null {\n const context = pageFloatLayoutContext.getPageFloatLayoutContext(\n float.floatReference,\n );\n const fragments = context.floatFragments.filter(\n (fr) => fr instanceof FootnoteFragment,\n );\n Asserts.assert(fragments.length <= 1);\n return fragments[0] || null;\n }\n\n /**\n * @override\n */\n adjustPageFloatArea(\n floatArea: Layout.PageFloatArea,\n floatContainer: Vtree.Container,\n column: Layout.Column,\n ) {\n floatArea.isFootnote = true;\n floatArea.adjustContentRelativeSize = false;\n const element = floatArea.element;\n Asserts.assert(element);\n floatArea.vertical = column.layoutContext.applyFootnoteStyle(\n floatContainer.vertical,\n (column.layoutContext as any).nodeContext &&\n (column.layoutContext as any).nodeContext.direction === \"rtl\",\n element,\n );\n floatArea.convertPercentageSizesToPx(element);\n column.setComputedInsets(element, floatArea);\n column.setComputedWidthAndHeight(element, floatArea);\n }\n\n /**\n * @override\n */\n forbid(\n float: PageFloats.PageFloat,\n pageFloatLayoutContext: PageFloats.PageFloatLayoutContext,\n ) {\n const footnote = float as Footnote;\n switch (footnote.footnotePolicy) {\n case Css.ident.line: {\n const constraint = new LineFootnotePolicyLayoutConstraint(footnote);\n pageFloatLayoutContext.addLayoutConstraint(\n constraint,\n footnote.floatReference,\n );\n break;\n }\n }\n }\n}\n\nPageFloats.PageFloatLayoutStrategyResolver.register(\n new FootnoteLayoutStrategy(),\n);\n","/**\n * Copyright 2016 Trim-marks Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Break - Control fragmentation.\n */\nimport * as Css from \"./css\";\nimport * as Plugin from \"./plugin\";\n\n/**\n * Convert old page-break-* properties to break-* properties with appropriate\n * values as specified by CSS Fragmentation module:\n * https://drafts.csswg.org/css-break/#page-break-properties\n */\nexport function convertPageBreakAliases(original: {\n name: string;\n value: Css.Val;\n important: boolean;\n}): { name: string; value: Css.Val; important: boolean } {\n const name = original[\"name\"];\n const value = original[\"value\"];\n switch (name) {\n case \"page-break-before\":\n case \"page-break-after\":\n case \"page-break-inside\":\n return {\n name: name.replace(/^page-/, \"\"),\n value: value === Css.ident.always ? Css.ident.page : value,\n important: original[\"important\"],\n };\n default:\n return original;\n }\n}\n\nexport const forcedBreakValues: { [key: string]: boolean | null } = {\n page: true,\n left: true,\n right: true,\n recto: true,\n verso: true,\n column: true,\n region: true,\n};\n\n/**\n * Returns if the value is one of the forced break values.\n * @param value The break value to be judged. Treats null as 'auto'.\n */\nexport function isForcedBreakValue(value: string | null): boolean {\n return !!forcedBreakValues[value];\n}\n\nexport const spreadBreakValues: { [key: string]: boolean | null } = {\n left: true,\n right: true,\n recto: true,\n verso: true,\n};\n\n/**\n * Returns if the value is one of left/right/recto/verso values.\n * @param value The break value to be judged. Treats null as 'auto'.\n */\nexport function isSpreadBreakValue(value: string | null): boolean {\n return !!spreadBreakValues[value];\n}\n\nexport const avoidBreakValues: { [key: string]: boolean | null } = {\n avoid: true,\n \"avoid-page\": true,\n \"avoid-column\": true,\n \"avoid-region\": true,\n};\n\n/**\n * Returns if the value is one of the avoid break values.\n * @param value The break value to be judged. Treats null as 'auto'.\n */\nexport function isAvoidBreakValue(value: string | null): boolean {\n return !!avoidBreakValues[value];\n}\n\n/**\n * Resolves the effective break value given two break values at a single break\n * point. The order of the arguments are relevant, since a value specified on\n * the latter element takes precedence over one on the former. A forced break\n * value is chosen if present. Otherwise, an avoid break value is chosen if\n * present. See CSS Fragmentation Module for the rule:\n * https://drafts.csswg.org/css-break/#forced-breaks\n * https://drafts.csswg.org/css-break/#unforced-breaks\n * Note that though the spec requires to honor multiple break values at a single\n * break point, the current implementation choose one of them and discard the\n * others.\n * @param first The break value specified on the former element. null means\n * 'auto' (not specified)\n * @param second The break value specified on the latter element. null means\n * 'auto' (not specified)\n */\nexport function resolveEffectiveBreakValue(\n first: string | null,\n second: string | null,\n): string | null {\n if (!first) {\n return second;\n } else if (!second) {\n return first;\n } else if (isSpreadBreakValue(second)) {\n return second;\n } else if (isSpreadBreakValue(first)) {\n return first;\n } else {\n const firstIsForcedBreakValue = isForcedBreakValue(first);\n const secondIsForcedBreakValue = isForcedBreakValue(second);\n if (firstIsForcedBreakValue && secondIsForcedBreakValue) {\n switch (second) {\n case \"column\":\n // \"column\" is the weakest value\n return first;\n case \"region\":\n // \"region\" is stronger than \"column\" but weaker than page\n // values\n return first === \"column\" ? second : first;\n default:\n // page values are strongest\n return second;\n }\n } else if (secondIsForcedBreakValue) {\n return second;\n } else if (firstIsForcedBreakValue) {\n return first;\n } else if (isAvoidBreakValue(second)) {\n return second;\n } else if (isAvoidBreakValue(first)) {\n return first;\n } else {\n return second;\n }\n }\n}\n\nexport function breakValueToStartSideValue(breakValue: string | null): string {\n switch (breakValue) {\n case \"left\":\n case \"right\":\n case \"recto\":\n case \"verso\":\n return breakValue;\n default:\n return \"any\";\n }\n}\n\nexport function startSideValueToBreakValue(\n startSideValue: string,\n): string | null {\n switch (startSideValue) {\n case \"left\":\n case \"right\":\n case \"recto\":\n case \"verso\":\n return startSideValue;\n default:\n return null;\n }\n}\n\nPlugin.registerHook(\"SIMPLE_PROPERTY\", convertPageBreakAliases);\n","/**\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview LayoutHelper - Helper functions of Layout.\n */\nimport * as Base from \"./base\";\nimport * as Logging from \"./logging\";\nimport * as VtreeImpl from \"./vtree\";\nimport { Layout, Vtree } from \"./types\";\n\n/**\n * Though method used to be used as a workaround for Chrome bug, it seems that\n * the bug has been already fixed:\n * https://bugs.chromium.org/p/chromium/issues/detail?id=297808\n * We now use this method as a workaround for Firefox bug:\n * https://bugzilla.mozilla.org/show_bug.cgi?id=1159309\n */\nexport function fixBoxesForNode(\n clientLayout: Vtree.ClientLayout,\n boxes: Vtree.ClientRect[],\n node: Node,\n): Vtree.ClientRect[] {\n const fullRange = node.ownerDocument.createRange();\n fullRange.setStart(node, 0);\n fullRange.setEnd(node, node.textContent.length);\n const fullBoxes = clientLayout.getRangeClientRects(fullRange);\n const result = [];\n for (const box of boxes) {\n let k: number;\n for (k = 0; k < fullBoxes.length; k++) {\n const fullBox = fullBoxes[k];\n if (\n box.top >= fullBox.top &&\n box.bottom <= fullBox.bottom &&\n Math.abs(box.left - fullBox.left) < 1\n ) {\n result.push({\n top: box.top,\n left: fullBox.left,\n bottom: box.bottom,\n right: fullBox.right,\n });\n break;\n }\n }\n if (k == fullBoxes.length) {\n Logging.logger.warn(\"Could not fix character box\");\n result.push(box);\n }\n }\n return result;\n}\n\n/**\n * Calculate the position of the \"after\" edge in the block-progression\n * dimension. Return 0 if position was determined successfully and return\n * non-zero if position could not be determined and the node should be\n * considered zero-height.\n */\nexport function calculateEdge(\n nodeContext: Vtree.NodeContext,\n clientLayout: Vtree.ClientLayout,\n extraOffset: number,\n vertical: boolean,\n): number {\n const node = nodeContext.viewNode;\n if (!node) {\n return NaN;\n }\n if (node.nodeType == 1) {\n if (nodeContext.after || !nodeContext.inline) {\n const cbox = clientLayout.getElementClientRect(node as Element);\n if (cbox.right >= cbox.left && cbox.bottom >= cbox.top) {\n if (nodeContext.after) {\n return vertical ? cbox.left : cbox.bottom;\n } else {\n return vertical ? cbox.right : cbox.top;\n }\n }\n }\n return NaN;\n } else {\n let edge = NaN;\n const range = node.ownerDocument.createRange();\n const length = node.textContent.length;\n if (!length) {\n return NaN;\n }\n if (nodeContext.after) {\n extraOffset += length;\n }\n if (extraOffset >= length) {\n extraOffset = length - 1;\n }\n range.setStart(node, extraOffset);\n range.setEnd(node, extraOffset + 1);\n let boxes = clientLayout.getRangeClientRects(range);\n if (vertical && Base.checkVerticalBBoxBug(document.body)) {\n boxes = fixBoxesForNode(clientLayout, boxes, node);\n }\n let maxSize = 0;\n\n // Get first of the widest boxes (works around Chrome results for soft\n // hyphens).\n for (const box of boxes) {\n const boxSize = vertical ? box.bottom - box.top : box.right - box.left;\n if (\n box.right > box.left &&\n box.bottom > box.top &&\n (isNaN(edge) || boxSize > maxSize)\n ) {\n edge = vertical ? box.left : box.bottom;\n maxSize = boxSize;\n }\n }\n return edge;\n }\n}\n\nexport function getElementHeight(\n element: Element,\n column: Layout.Column,\n vertical: boolean,\n): number {\n const rect = column.clientLayout.getElementClientRect(element);\n const margin = column.getComputedMargin(element);\n return vertical\n ? rect[\"width\"] + margin[\"left\"] + margin[\"right\"]\n : rect[\"height\"] + margin[\"top\"] + margin[\"bottom\"];\n}\n\nexport function isOrphan(node: Node): boolean {\n while (node) {\n if (node.parentNode === node.ownerDocument) {\n return false;\n }\n node = node.parentNode;\n }\n return true;\n}\n\nexport function removeFollowingSiblings(\n parentNode: Node,\n viewNode: Node,\n): void {\n if (!parentNode) {\n return;\n }\n let lastChild: Node;\n while ((lastChild = parentNode.lastChild) != viewNode) {\n parentNode.removeChild(lastChild);\n }\n}\n\nexport function isSpecial(e: Element): boolean {\n return !!e.getAttribute(VtreeImpl.SPECIAL_ATTR);\n}\n\nexport function isSpecialNodeContext(nodeContext: Vtree.NodeContext): boolean {\n if (!nodeContext) {\n return false;\n }\n const viewNode = nodeContext.viewNode;\n if (viewNode && viewNode.nodeType === 1) {\n return isSpecial(viewNode as Element);\n } else {\n return false;\n }\n}\n","/**\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview BreakPosition - Definitions of BreakPosition.\n */\nimport * as Break from \"./break\";\nimport * as LayoutHelper from \"./layout-helper\";\nimport { Layout, RepetitiveElement, Vtree } from \"./types\";\n\n/**\n * Potential breaking position.\n */\nexport type BreakPosition = Layout.BreakPosition;\n\nexport abstract class AbstractBreakPosition\n implements Layout.AbstractBreakPosition {\n abstract findAcceptableBreak(\n column: Layout.Column,\n penalty: number,\n ): Vtree.NodeContext;\n\n abstract getMinBreakPenalty(): number;\n\n calculateOffset(column): { current: number; minimum: number } {\n return calculateOffset(\n this.getNodeContext(),\n column.collectElementsOffset(),\n );\n }\n\n /**\n * @override\n */\n breakPositionChosen(column: Layout.Column): void {}\n\n getNodeContext(): Vtree.NodeContext {\n return null;\n }\n}\n\nexport function calculateOffset(\n nodeContext: Vtree.NodeContext,\n elementsOffsets: RepetitiveElement.ElementsOffset[],\n): { current: number; minimum: number } {\n return {\n current: elementsOffsets.reduce(\n (val, repetitiveElement) =>\n val + repetitiveElement.calculateOffset(nodeContext),\n 0,\n ),\n minimum: elementsOffsets.reduce(\n (val, repetitiveElement) =>\n val + repetitiveElement.calculateMinimumOffset(nodeContext),\n 0,\n ),\n };\n}\n\n/**\n * Potential edge breaking position.\n */\nexport class EdgeBreakPosition\n extends AbstractBreakPosition\n implements Layout.EdgeBreakPosition {\n overflowIfRepetitiveElementsDropped: boolean;\n protected isEdgeUpdated: boolean = false;\n private edge: number = 0;\n\n constructor(\n public readonly position: Vtree.NodeContext,\n public readonly breakOnEdge: string | null,\n public overflows: boolean,\n public readonly computedBlockSize: number,\n ) {\n super();\n this.overflowIfRepetitiveElementsDropped = overflows;\n }\n\n /**\n * @override\n */\n findAcceptableBreak(\n column: Layout.Column,\n penalty: number,\n ): Vtree.NodeContext {\n this.updateOverflows(column);\n if (penalty < this.getMinBreakPenalty()) {\n return null;\n }\n return column.findEdgeBreakPosition(this);\n }\n\n /**\n * @override\n */\n getMinBreakPenalty(): number {\n if (!this.isEdgeUpdated) {\n throw new Error(\"EdgeBreakPosition.prototype.updateEdge not called\");\n }\n const preferDropping =\n this.isFirstContentOfRepetitiveElementsOwner() &&\n !this.overflowIfRepetitiveElementsDropped;\n return (\n (Break.isAvoidBreakValue(this.breakOnEdge) ? 1 : 0) +\n (this.overflows && !preferDropping ? 3 : 0) +\n (this.position.parent ? this.position.parent.breakPenalty : 0)\n );\n }\n\n private updateEdge(column: Layout.Column) {\n const clonedPaddingBorder = column.calculateClonedPaddingBorder(\n this.position,\n );\n this.edge =\n LayoutHelper.calculateEdge(\n this.position,\n column.clientLayout,\n 0,\n column.vertical,\n ) + clonedPaddingBorder;\n this.isEdgeUpdated = true;\n }\n\n private updateOverflows(column: Layout.Column) {\n if (!this.isEdgeUpdated) {\n this.updateEdge(column);\n }\n const edge = this.edge;\n const offsets = this.calculateOffset(column);\n this.overflowIfRepetitiveElementsDropped = column.isOverflown(\n edge + (column.vertical ? -1 : 1) * offsets.minimum,\n );\n this.overflows = this.position.overflow = column.isOverflown(\n edge + (column.vertical ? -1 : 1) * offsets.current,\n );\n }\n\n /** @override */\n getNodeContext(): Vtree.NodeContext {\n return this.position;\n }\n\n private isFirstContentOfRepetitiveElementsOwner(): boolean {\n const nodeContext = this.getNodeContext();\n if (!nodeContext || !nodeContext.parent) {\n return false;\n }\n const { formattingContext } = nodeContext.parent;\n if (\n !RepetitiveElement.isInstanceOfRepetitiveElementsOwnerFormattingContext(\n formattingContext,\n )\n ) {\n return false;\n }\n\n const repetitiveElements = formattingContext.getRepetitiveElements();\n if (!repetitiveElements) {\n return false;\n }\n return repetitiveElements.isFirstContentNode(nodeContext);\n }\n}\n","/**\n * Copyright 2016 Trim-marks Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Display - CSS Display Module\n */\nimport * as Css from \"./css\";\n\nexport const FLOW_ROOT_ATTR = \"data-vivliostyle-flow-root\";\n\nexport function isFlowRoot(element: Element): boolean {\n return element.getAttribute(FLOW_ROOT_ATTR) === \"true\";\n}\n\n/**\n * 'Blockify' a display value.\n * cf. https://drafts.csswg.org/css-display/#transformations\n * https://drafts.csswg.org/css2/visuren.html#dis-pos-flo\n */\nexport function blockify(display: Css.Ident): Css.Ident {\n const displayStr = display.toString();\n let blockifiedStr: string;\n switch (displayStr) {\n case \"inline-flex\":\n blockifiedStr = \"flex\";\n break;\n case \"inline-grid\":\n blockifiedStr = \"grid\";\n break;\n case \"inline-table\":\n blockifiedStr = \"table\";\n break;\n case \"inline\":\n case \"table-row-group\":\n case \"table-column\":\n case \"table-column-group\":\n case \"table-header-group\":\n case \"table-footer-group\":\n case \"table-row\":\n case \"table-cell\":\n case \"table-caption\":\n case \"inline-block\":\n blockifiedStr = \"block\";\n break;\n default:\n blockifiedStr = displayStr;\n }\n return Css.getName(blockifiedStr);\n}\n\n/**\n * Judge if the generated box is absolutely positioned.\n */\nexport function isAbsolutelyPositioned(position: Css.Ident): boolean {\n return position === Css.ident.absolute || position === Css.ident.fixed;\n}\n\n/**\n * Get computed values of display, position and float.\n * cf. https://drafts.csswg.org/css-display/#transformations\n * https://drafts.csswg.org/css2/visuren.html#dis-pos-flo\n */\nexport function getComputedDislayValue(\n display: Css.Ident,\n position: Css.Ident,\n float: Css.Ident,\n isRoot: boolean,\n): { display: Css.Ident; position: Css.Ident; float: Css.Ident } {\n if (display === Css.ident.none) {\n // no need to convert values when 'display' is 'none'\n } else if (isAbsolutelyPositioned(position)) {\n float = Css.ident.none;\n display = blockify(display);\n } else if ((float && float !== Css.ident.none) || isRoot) {\n display = blockify(display);\n }\n return { display, position, float };\n}\n\n/**\n * Judges if the generated box is block.\n */\nexport function isBlock(\n display: Css.Ident,\n position: Css.Ident,\n float: Css.Ident,\n isRoot: boolean,\n): boolean {\n return (\n getComputedDislayValue(display, position, float, isRoot).display ===\n Css.ident.block\n );\n}\n\nexport function isInlineLevel(display: Css.Ident): boolean {\n switch (display.toString()) {\n case \"inline\":\n case \"inline-block\":\n case \"inline-list-item\":\n case \"inline-flex\":\n case \"inline-grid\":\n case \"ruby\":\n case \"inline-table\":\n return true;\n default:\n return false;\n }\n}\n\nexport function isRubyInternalDisplay(display: Css.Ident): boolean {\n switch (display.toString()) {\n case \"ruby-base\":\n case \"ruby-text\":\n case \"ruby-base-container\":\n case \"ruby-text-container\":\n return true;\n default:\n return false;\n }\n}\n\n/**\n * Judges if the generated box establishes a new block formatting context.\n */\nexport function establishesBFC(\n display: Css.Ident,\n position: Css.Ident,\n float: Css.Ident,\n overflow: Css.Ident,\n writingMode?: Css.Ident,\n parentWritingMode?: Css.Ident,\n isFlowRoot?: boolean,\n): boolean {\n writingMode = writingMode || parentWritingMode || Css.ident.horizontal_tb;\n return (\n !!isFlowRoot ||\n (!!float && float !== Css.ident.none) ||\n isAbsolutelyPositioned(position) ||\n display === Css.ident.inline_block ||\n display === Css.ident.table_cell ||\n display === Css.ident.table_caption ||\n display == Css.ident.flex ||\n ((display === Css.ident.block || display === Css.ident.list_item) &&\n !!overflow &&\n overflow !== Css.ident.visible) ||\n (!!parentWritingMode && writingMode !== parentWritingMode)\n );\n}\n\n/**\n * Judges if the generated box establishes a containing block for descendant\n * boxes with 'position: absolute'.\n */\nexport function establishesCBForAbsolute(position: Css.Ident): boolean {\n return (\n position === Css.ident.relative ||\n position === Css.ident.absolute ||\n position === Css.ident.fixed\n );\n}\n","/**\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview LayoutProcessor - Definitions of LayoutProcessor.\n */\nimport * as BreakPosition from \"./break-position\";\nimport * as Display from \"./display\";\nimport * as LayoutHelper from \"./layout-helper\";\nimport * as Plugin from \"./plugin\";\nimport * as Task from \"./task\";\nimport { FormattingContextType, Layout, LayoutProcessor, Vtree } from \"./types\";\n\n/**\n * Processor doing some special layout (e.g. table layout)\n */\n// eslint-disable-next-line no-redeclare\nexport interface LayoutProcessor {\n /**\n * Do actual layout in the column starting from given NodeContext.\n */\n layout(\n nodeContext: Vtree.NodeContext,\n column: Layout.Column,\n leadingEdge: boolean,\n ): Task.Result<Vtree.NodeContext>;\n\n /**\n * Potential edge breaking position.\n */\n createEdgeBreakPosition(\n position: Vtree.NodeContext,\n breakOnEdge: string | null,\n overflows: boolean,\n columnBlockSize: number,\n ): Layout.BreakPosition;\n\n /**\n * process nodecontext at the start of a non inline element.\n * @return return true if you skip the subsequent nodes\n */\n startNonInlineElementNode(nodeContext: Vtree.NodeContext): boolean;\n\n /**\n * process nodecontext after a non inline element.\n * @return return true if you skip the subsequent nodes\n */\n afterNonInlineElementNode(\n nodeContext: Vtree.NodeContext,\n stopAtOverflow: boolean,\n ): boolean;\n\n /**\n * @return holing true\n */\n finishBreak(\n column: Layout.Column,\n nodeContext: Vtree.NodeContext,\n forceRemoveSelf: boolean,\n endOfColumn: boolean,\n ): Task.Result<boolean>;\n\n clearOverflownViewNodes(\n column: Layout.Column,\n parentNodeContext: Vtree.NodeContext,\n nodeContext: Vtree.NodeContext,\n removeSelf: boolean,\n );\n}\n\n/**\n * Resolver finding an appropriate LayoutProcessor given a formatting context\n */\nexport class LayoutProcessorResolver {\n /**\n * Find LayoutProcessor corresponding to given formatting context.\n */\n find(formattingContext: Vtree.FormattingContext): LayoutProcessor {\n const hooks: Plugin.ResolveLayoutProcessorHook[] = Plugin.getHooksForName(\n Plugin.HOOKS.RESOLVE_LAYOUT_PROCESSOR,\n );\n for (let i = 0; i < hooks.length; i++) {\n const processor = hooks[i](formattingContext);\n if (processor) {\n return processor;\n }\n }\n throw new Error(\n `No processor found for a formatting context: ${formattingContext.getName()}`,\n );\n }\n}\n\nexport class BlockLayoutProcessor implements LayoutProcessor {\n /**\n * @override\n */\n layout(\n nodeContext: Vtree.NodeContext,\n column: Layout.Column,\n leadingEdge: boolean,\n ): Task.Result<Vtree.NodeContext> {\n if (column.isFloatNodeContext(nodeContext)) {\n return column.layoutFloatOrFootnote(nodeContext);\n } else if (column.isBreakable(nodeContext)) {\n return column.layoutBreakableBlock(nodeContext);\n } else {\n return column.layoutUnbreakable(nodeContext);\n }\n }\n\n /**\n * @override\n */\n createEdgeBreakPosition(\n position: Vtree.NodeContext,\n breakOnEdge: string | null,\n overflows: boolean,\n columnBlockSize: number,\n ): Layout.BreakPosition {\n return new BreakPosition.EdgeBreakPosition(\n position.copy(),\n breakOnEdge,\n overflows,\n columnBlockSize,\n );\n }\n\n /**\n * @override\n */\n startNonInlineElementNode(nodeContext: Vtree.NodeContext): boolean {\n return false;\n }\n\n /**\n * @override\n */\n afterNonInlineElementNode(\n nodeContext: Vtree.NodeContext,\n stopAtOverflow: boolean,\n ): boolean {\n return false;\n }\n\n /**\n * @override\n */\n clearOverflownViewNodes(\n column: Layout.Column,\n parentNodeContext: Vtree.NodeContext,\n nodeContext: Vtree.NodeContext,\n removeSelf: boolean,\n ) {\n if (!nodeContext.viewNode) {\n return;\n }\n if (!nodeContext.viewNode.parentNode) {\n return;\n }\n const parentNode = nodeContext.viewNode.parentNode;\n LayoutHelper.removeFollowingSiblings(parentNode, nodeContext.viewNode);\n if (removeSelf) {\n parentNode.removeChild(nodeContext.viewNode);\n }\n }\n\n /**\n * @return holing true\n * @override\n */\n finishBreak(\n column: Layout.Column,\n nodeContext: Vtree.NodeContext,\n forceRemoveSelf: boolean,\n endOfColumn: boolean,\n ): Task.Result<boolean> {\n const removeSelf =\n forceRemoveSelf ||\n (nodeContext.viewNode != null &&\n nodeContext.viewNode.nodeType == 1 &&\n !nodeContext.after);\n column.clearOverflownViewNodes(nodeContext, removeSelf);\n if (endOfColumn) {\n column.fixJustificationIfNeeded(nodeContext, true);\n column.layoutContext.processFragmentedBlockEdge(\n removeSelf ? nodeContext : nodeContext.parent,\n );\n }\n return Task.newResult(true);\n }\n}\n\nexport class BlockFormattingContext\n implements LayoutProcessor.BlockFormattingContext {\n formattingContextType: FormattingContextType = \"Block\";\n\n constructor(private readonly parent: Vtree.FormattingContext) {}\n\n /**\n * @override\n */\n getName(): string {\n return \"Block formatting context (BlockFormattingContext)\";\n }\n\n /**\n * @override\n */\n isFirstTime(nodeContext: Vtree.NodeContext, firstTime: boolean): boolean {\n return firstTime;\n }\n\n /**\n * @override\n */\n getParent(): Vtree.FormattingContext {\n return this.parent;\n }\n\n /** @override */\n saveState(): any {}\n\n /** @override */\n restoreState(state: any) {}\n}\n\nexport const blockLayoutProcessor = new BlockLayoutProcessor();\n\nexport const isInstanceOfBlockFormattingContext =\n LayoutProcessor.isInstanceOfBlockFormattingContext;\n\nPlugin.registerHook(\n Plugin.HOOKS.RESOLVE_FORMATTING_CONTEXT,\n (nodeContext, firstTime, display, position, floatSide, isRoot) => {\n const parent = nodeContext.parent;\n if (!parent && nodeContext.formattingContext) {\n return null;\n } else if (\n parent &&\n nodeContext.formattingContext !== parent.formattingContext\n ) {\n return null;\n } else if (\n nodeContext.establishesBFC ||\n (!nodeContext.formattingContext &&\n Display.isBlock(display, position, floatSide, isRoot))\n ) {\n return new BlockFormattingContext(\n parent ? parent.formattingContext : null,\n );\n } else {\n return null;\n }\n },\n);\n\nPlugin.registerHook(\n Plugin.HOOKS.RESOLVE_LAYOUT_PROCESSOR,\n (formattingContext) => {\n if (formattingContext instanceof BlockFormattingContext) {\n return blockLayoutProcessor;\n }\n return null;\n },\n);\n","/**\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview LayoutRetryers - Definitions of LayoutRetryer.\n */\nimport * as Asserts from \"./asserts\";\nimport * as Task from \"./task\";\nimport { Layout, Vtree } from \"./types\";\n\n/**\n * @abstract\n */\nexport abstract class AbstractLayoutRetryer {\n initialBreakPositions: Layout.BreakPosition[] = null;\n initialStateOfFormattingContext: Vtree.NodeContext = null;\n initialPosition: Vtree.NodeContext;\n initialFragmentLayoutConstraints: Layout.FragmentLayoutConstraint[];\n\n layout(\n nodeContext: Vtree.NodeContext,\n column: Layout.Column,\n ): Task.Result<Vtree.NodeContext> {\n this.prepareLayout(nodeContext, column);\n return this.tryLayout(nodeContext, column);\n }\n\n private tryLayout(\n nodeContext: Vtree.NodeContext,\n column: Layout.Column,\n ): Task.Result<Vtree.NodeContext> {\n const frame = Task.newFrame<Vtree.NodeContext>(\n \"AbstractLayoutRetryer.tryLayout\",\n );\n this.saveState(nodeContext, column);\n const mode = this.resolveLayoutMode(nodeContext);\n mode.doLayout(nodeContext, column).then((positionAfter) => {\n let accepted = mode.accept(positionAfter, column);\n accepted = mode.postLayout(\n positionAfter,\n this.initialPosition,\n column,\n accepted,\n );\n if (accepted) {\n frame.finish(positionAfter);\n } else {\n Asserts.assert(this.initialPosition);\n this.clearNodes(this.initialPosition);\n this.restoreState(nodeContext, column);\n this.tryLayout(this.initialPosition, column).thenFinish(frame);\n }\n });\n return frame.result();\n }\n\n /**\n * @abstract\n */\n abstract resolveLayoutMode(nodeContext: Vtree.NodeContext): Layout.LayoutMode;\n\n prepareLayout(nodeContext: Vtree.NodeContext, column: Layout.Column) {}\n\n clearNodes(initialPosition: Vtree.NodeContext) {\n const viewNode =\n initialPosition.viewNode || initialPosition.parent.viewNode;\n let child: Node;\n while ((child = viewNode.lastChild)) {\n viewNode.removeChild(child);\n }\n let sibling: Node;\n while ((sibling = viewNode.nextSibling)) {\n sibling.parentNode.removeChild(sibling);\n }\n }\n\n saveState(nodeContext: Vtree.NodeContext, column: Layout.Column) {\n this.initialPosition = nodeContext.copy();\n this.initialBreakPositions = [].concat(column.breakPositions);\n this.initialFragmentLayoutConstraints = [].concat(\n column.fragmentLayoutConstraints,\n );\n if (nodeContext.formattingContext) {\n this.initialStateOfFormattingContext = nodeContext.formattingContext.saveState();\n }\n }\n\n restoreState(nodeContext: Vtree.NodeContext, column: Layout.Column) {\n column.breakPositions = this.initialBreakPositions;\n column.fragmentLayoutConstraints = this.initialFragmentLayoutConstraints;\n if (nodeContext.formattingContext) {\n nodeContext.formattingContext.restoreState(\n this.initialStateOfFormattingContext,\n );\n }\n }\n}\n","/**\n * Copyright 2016 Trim-marks Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview LayoutUtil - Utilities related to layout.\n */\nimport * as Break from \"./break\";\nimport * as Task from \"./task\";\nimport * as VtreeImpl from \"./vtree\";\nimport { Layout, Vtree } from \"./types\";\n\nexport type LayoutIteratorState = {\n nodeContext: Vtree.NodeContext;\n atUnforcedBreak: boolean;\n break: boolean;\n leadingEdge?: boolean;\n breakAtTheEdge?: string | null;\n onStartEdges?: boolean;\n leadingEdgeContexts?: Vtree.NodeContext[];\n lastAfterNodeContext?: Vtree.NodeContext | null;\n};\n\nexport class LayoutIteratorStrategy {\n initialState(initialNodeContext: Vtree.NodeContext): LayoutIteratorState {\n return {\n nodeContext: initialNodeContext,\n atUnforcedBreak: false,\n break: false,\n };\n }\n\n startNonDisplayableNode(\n state: LayoutIteratorState,\n ): void | Task.Result<boolean> {}\n\n afterNonDisplayableNode(\n state: LayoutIteratorState,\n ): void | Task.Result<boolean> {}\n\n startIgnoredTextNode(\n state: LayoutIteratorState,\n ): void | Task.Result<boolean> {}\n\n afterIgnoredTextNode(\n state: LayoutIteratorState,\n ): void | Task.Result<boolean> {}\n\n startNonElementNode(\n state: LayoutIteratorState,\n ): void | Task.Result<boolean> {}\n\n afterNonElementNode(\n state: LayoutIteratorState,\n ): void | Task.Result<boolean> {}\n\n startInlineElementNode(\n state: LayoutIteratorState,\n ): void | Task.Result<boolean> {}\n\n afterInlineElementNode(\n state: LayoutIteratorState,\n ): void | Task.Result<boolean> {}\n\n startNonInlineElementNode(\n state: LayoutIteratorState,\n ): void | Task.Result<boolean> {}\n\n afterNonInlineElementNode(\n state: LayoutIteratorState,\n ): void | Task.Result<boolean> {}\n\n finish(state: LayoutIteratorState): void | Task.Result<boolean> {}\n}\n\nexport class LayoutIterator {\n constructor(\n private readonly strategy: LayoutIteratorStrategy,\n private readonly layoutContext: Vtree.LayoutContext,\n ) {}\n\n iterate(\n initialNodeContext: Vtree.NodeContext,\n ): Task.Result<Vtree.NodeContext> {\n const strategy = this.strategy;\n const state = strategy.initialState(initialNodeContext);\n const frame: Task.Frame<Vtree.NodeContext> = Task.newFrame(\n \"LayoutIterator\",\n );\n frame\n .loopWithFrame((loopFrame) => {\n let r: void | Task.Result<boolean>;\n while (state.nodeContext) {\n if (!state.nodeContext.viewNode) {\n if (state.nodeContext.after) {\n r = strategy.afterNonDisplayableNode(state);\n } else {\n r = strategy.startNonDisplayableNode(state);\n }\n } else if (state.nodeContext.viewNode.nodeType !== 1) {\n if (\n VtreeImpl.canIgnore(\n state.nodeContext.viewNode,\n state.nodeContext.whitespace,\n )\n ) {\n if (state.nodeContext.after) {\n r = strategy.afterIgnoredTextNode(state);\n } else {\n r = strategy.startIgnoredTextNode(state);\n }\n } else {\n if (state.nodeContext.after) {\n r = strategy.afterNonElementNode(state);\n } else {\n r = strategy.startNonElementNode(state);\n }\n }\n } else {\n if (state.nodeContext.inline) {\n if (state.nodeContext.after) {\n r = strategy.afterInlineElementNode(state);\n } else {\n r = strategy.startInlineElementNode(state);\n }\n } else {\n if (state.nodeContext.after) {\n r = strategy.afterNonInlineElementNode(state);\n } else {\n r = strategy.startNonInlineElementNode(state);\n }\n }\n }\n const cont = r && r.isPending() ? r : Task.newResult(true);\n const nextResult = cont.thenAsync(() => {\n if (state.break) {\n return Task.newResult(null);\n }\n return this.layoutContext.nextInTree(\n state.nodeContext,\n state.atUnforcedBreak,\n );\n });\n if (nextResult.isPending()) {\n nextResult.then((nextNodeContext) => {\n if (state.break) {\n loopFrame.breakLoop();\n } else {\n state.nodeContext = nextNodeContext;\n loopFrame.continueLoop();\n }\n });\n return;\n } else if (state.break) {\n loopFrame.breakLoop();\n return;\n } else {\n state.nodeContext = nextResult.get();\n }\n }\n strategy.finish(state);\n loopFrame.breakLoop();\n })\n .then(() => {\n frame.finish(state.nodeContext);\n });\n return frame.result();\n }\n}\n\nexport class EdgeSkipper extends LayoutIteratorStrategy {\n constructor(protected readonly leadingEdge?: boolean) {\n super();\n }\n\n startNonInlineBox(state: LayoutIteratorState): void | Task.Result<boolean> {}\n\n endEmptyNonInlineBox(\n state: LayoutIteratorState,\n ): void | Task.Result<boolean> {}\n\n endNonInlineBox(state: LayoutIteratorState): void | Task.Result<boolean> {}\n\n initialState(initialNodeContext: Vtree.NodeContext): LayoutIteratorState {\n return {\n nodeContext: initialNodeContext,\n atUnforcedBreak: !!this.leadingEdge && initialNodeContext.after,\n break: false,\n leadingEdge: this.leadingEdge,\n breakAtTheEdge: null,\n onStartEdges: false,\n leadingEdgeContexts: [],\n lastAfterNodeContext: null,\n };\n }\n\n /**\n * @return Returns true if a forced break occurs.\n */\n processForcedBreak(\n state: LayoutIteratorState,\n column: Layout.Column,\n ): boolean {\n const needForcedBreak =\n !state.leadingEdge && Break.isForcedBreakValue(state.breakAtTheEdge);\n if (needForcedBreak) {\n const nodeContext = (state.nodeContext =\n state.leadingEdgeContexts[0] || state.nodeContext);\n nodeContext.viewNode.parentNode.removeChild(nodeContext.viewNode);\n column.pageBreakType = state.breakAtTheEdge;\n }\n return needForcedBreak;\n }\n\n /**\n * @return Returns true if the node overflows the column.\n */\n saveEdgeAndProcessOverflow(\n state: LayoutIteratorState,\n column: Layout.Column,\n ): boolean {\n const overflow = column.checkOverflowAndSaveEdgeAndBreakPosition(\n state.lastAfterNodeContext,\n null,\n true,\n state.breakAtTheEdge,\n );\n if (overflow) {\n state.nodeContext = (\n state.lastAfterNodeContext || state.nodeContext\n ).modify();\n state.nodeContext.overflow = true;\n }\n return overflow;\n }\n\n /**\n * @returns Returns true if the layout constraint is violated.\n */\n processLayoutConstraint(\n state: LayoutIteratorState,\n layoutConstraint: Layout.LayoutConstraint,\n column: Layout.Column,\n ): boolean {\n let nodeContext = state.nodeContext;\n const violateConstraint = !layoutConstraint.allowLayout(nodeContext);\n if (violateConstraint) {\n column.checkOverflowAndSaveEdgeAndBreakPosition(\n state.lastAfterNodeContext,\n null,\n false,\n state.breakAtTheEdge,\n );\n nodeContext = state.nodeContext = nodeContext.modify();\n nodeContext.overflow = true;\n }\n return violateConstraint;\n }\n\n /**\n * @override\n */\n startNonElementNode(state: LayoutIteratorState): void | Task.Result<boolean> {\n state.onStartEdges = false;\n }\n\n /**\n * @override\n */\n startNonInlineElementNode(\n state: LayoutIteratorState,\n ): void | Task.Result<boolean> {\n state.leadingEdgeContexts.push(state.nodeContext.copy());\n state.breakAtTheEdge = Break.resolveEffectiveBreakValue(\n state.breakAtTheEdge,\n state.nodeContext.breakBefore,\n );\n state.onStartEdges = true;\n return this.startNonInlineBox(state);\n }\n\n /**\n * @override\n */\n afterNonInlineElementNode(\n state: LayoutIteratorState,\n ): void | Task.Result<boolean> {\n let r: void | Task.Result<boolean>;\n let cont: Task.Result<boolean>;\n if (state.onStartEdges) {\n r = this.endEmptyNonInlineBox(state);\n cont = r && r.isPending() ? r : Task.newResult(true);\n cont = cont.thenAsync(() => {\n if (!state.break) {\n state.leadingEdgeContexts = [];\n state.leadingEdge = false;\n state.atUnforcedBreak = false;\n state.breakAtTheEdge = null;\n }\n return Task.newResult(true);\n });\n } else {\n r = this.endNonInlineBox(state);\n cont = r && r.isPending() ? r : Task.newResult(true);\n }\n return cont.thenAsync(() => {\n if (!state.break) {\n state.onStartEdges = false;\n state.lastAfterNodeContext = state.nodeContext.copy();\n state.breakAtTheEdge = Break.resolveEffectiveBreakValue(\n state.breakAtTheEdge,\n state.nodeContext.breakAfter,\n );\n }\n return Task.newResult(true);\n });\n }\n}\n","/**\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Shared - Global variables of Vivliostyle.js\n */\nimport { RepetitiveElement } from \"./types\";\n\nexport let repetitiveElementsCache: {\n root: Element;\n elements: RepetitiveElement.RepetitiveElements;\n}[] = [];\n\nexport function clearRepetitiveElementsCache(): void {\n repetitiveElementsCache = [];\n}\n","/**\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview PseudoElement - CSS pseudo elements.\n */\nimport * as Base from \"./base\";\nimport * as Css from \"./css\";\nimport * as CssCascade from \"./css-cascade\";\nimport * as CssStyler from \"./css-styler\";\nimport * as Exprs from \"./exprs\";\nimport * as Vtree from \"./vtree\";\nimport { PseudoElement } from \"./types\";\n\nexport const document = new DOMParser().parseFromString(\n `<root xmlns=\"${Base.NS.SHADOW}\"/>`,\n \"text/xml\",\n);\n\n/**\n * Pseudoelement names in the order they should be inserted in the shadow DOM,\n * empty string is the place where the element's DOM children are processed.\n */\nexport const pseudoNames = [\n \"footnote-marker\",\n \"first-5-lines\",\n \"first-4-lines\",\n \"first-3-lines\",\n \"first-2-lines\",\n \"first-line\",\n \"first-letter\",\n \"before\",\n \"\",\n /* content */\n \"after\",\n];\n\nexport const PSEUDO_ATTR = \"data-adapt-pseudo\";\n\nexport function getPseudoName(element: Element): string {\n return element.getAttribute(PSEUDO_ATTR) || \"\";\n}\n\nexport function setPseudoName(element: Element, name: string): void {\n element.setAttribute(PSEUDO_ATTR, name);\n}\n\nexport class PseudoelementStyler implements PseudoElement.PseudoelementStyler {\n contentProcessed: { [key: string]: boolean } = {};\n\n // after content: update style\n\n constructor(\n public readonly element: Element,\n public style: CssCascade.ElementStyle,\n public styler: CssStyler.AbstractStyler,\n public readonly context: Exprs.Context,\n public readonly exprContentListener: Vtree.ExprContentListener,\n ) {}\n\n /**\n * @override\n */\n getStyle(element: Element, deep: boolean): CssCascade.ElementStyle {\n const pseudoName = getPseudoName(element);\n if (this.styler && pseudoName && pseudoName.match(/after$/)) {\n this.style = this.styler.getStyle(this.element, true);\n this.styler = null;\n }\n const pseudoMap = CssCascade.getStyleMap(this.style, \"_pseudos\");\n const style = pseudoMap[pseudoName] || ({} as CssCascade.ElementStyle);\n if (pseudoName.match(/^first-/) && !style[\"x-first-pseudo\"]) {\n let nest = 1;\n let r: RegExpMatchArray;\n if (pseudoName == \"first-letter\") {\n nest = 0;\n } else if ((r = pseudoName.match(/^first-([0-9]+)-lines$/)) != null) {\n nest = (r[1] as any) - 0;\n }\n style[\"x-first-pseudo\"] = new CssCascade.CascadeValue(\n new Css.Int(nest),\n 0,\n );\n }\n return style;\n }\n\n /**\n * @override\n */\n processContent(element: Element, styles: { [key: string]: Css.Val }) {\n const pseudoName = getPseudoName(element);\n if (!this.contentProcessed[pseudoName]) {\n this.contentProcessed[pseudoName] = true;\n const contentVal = styles[\"content\"];\n if (contentVal) {\n if (Vtree.nonTrivialContent(contentVal)) {\n contentVal.visit(\n new Vtree.ContentPropertyHandler(\n element,\n this.context,\n contentVal,\n this.exprContentListener,\n ),\n );\n }\n }\n }\n }\n}\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2015 Trim-marks Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Layout - Fills a column with styled content.\n * This file does not communicate with the styling system directly.\n * Instead it goes through the layout interface that gives it one view tree\n * node at a time.\n */\nimport * as LayoutRetryers from \"./layout-retryers\";\nimport * as Asserts from \"./asserts\";\nimport * as Shared from \"./shared\";\nimport * as Sizing from \"./sizing\";\nimport * as Break from \"./break\";\nimport * as Logging from \"./logging\";\nimport * as Diff from \"./diff\";\nimport * as Base from \"./base\";\nimport * as BreakPosition from \"./break-position\";\nimport * as Css from \"./css\";\nimport * as GeometryUtil from \"./geometry-util\";\nimport * as LayoutHelper from \"./layout-helper\";\nimport * as LayoutProcessor from \"./layout-processor\";\nimport * as PageFloats from \"./page-floats\";\nimport * as Plugin from \"./plugin\";\nimport * as Matchers from \"./matchers\";\nimport * as PseudoElement from \"./pseudo-element\";\nimport * as Task from \"./task\";\nimport * as Vgen from \"./vgen\";\nimport * as VtreeImpl from \"./vtree\";\nimport {\n FragmentLayoutConstraintType,\n Layout,\n RepetitiveElement,\n Selectors,\n Table,\n Vtree,\n} from \"./types\";\n\nexport const isInstanceOfAfterIfContinuesLayoutConstraint =\n Selectors.isInstanceOfAfterIfContinuesLayoutConstraint;\nexport const registerFragmentIndex =\n Matchers.NthFragmentMatcher.registerFragmentIndex;\nexport const clearFragmentIndices =\n Matchers.NthFragmentMatcher.clearFragmentIndices;\n\nexport class AfterIfContinues implements Selectors.AfterIfContinues {\n constructor(\n public readonly sourceNode: Element,\n public readonly styler: PseudoElement.PseudoelementStyler,\n ) {}\n\n createElement(\n column: Layout.Column,\n parentNodeContext: Vtree.NodeContext,\n ): Task.Result<Element> {\n const doc = parentNodeContext.viewNode.ownerDocument;\n const viewRoot = doc.createElement(\"div\");\n const pseudoColumn = new PseudoColumn(column, viewRoot, parentNodeContext);\n const initialPageBreakType = pseudoColumn.getColumn().pageBreakType;\n pseudoColumn.getColumn().pageBreakType = null;\n return pseudoColumn\n .layout(this.createNodePositionForPseudoElement(), true)\n .thenAsync(() => {\n this.styler.contentProcessed[\"after-if-continues\"] = false;\n pseudoColumn.getColumn().pageBreakType = initialPageBreakType;\n const pseudoElement = viewRoot.firstChild as Element;\n Base.setCSSProperty(pseudoElement, \"display\", \"block\");\n return Task.newResult(pseudoElement);\n });\n }\n\n private createNodePositionForPseudoElement(): Vtree.ChunkPosition {\n const sourceNode = PseudoElement.document.createElementNS(\n Base.NS.XHTML,\n \"div\",\n );\n PseudoElement.setPseudoName(sourceNode, \"after-if-continues\");\n const shadowContext = this.createShadowContext(sourceNode);\n const step = {\n node: sourceNode,\n shadowType: shadowContext.type,\n shadowContext,\n nodeShadow: null,\n shadowSibling: null,\n };\n const nodePosition = {\n steps: [step],\n offsetInNode: 0,\n after: false,\n preprocessedTextContent: null,\n };\n return new VtreeImpl.ChunkPosition(nodePosition as any);\n }\n\n private createShadowContext(root: Element): Vtree.ShadowContext {\n return new VtreeImpl.ShadowContext(\n this.sourceNode,\n root,\n null,\n null,\n null,\n Vtree.ShadowType.ROOTED,\n this.styler,\n );\n }\n}\n\nexport class AfterIfContinuesLayoutConstraint\n implements Selectors.AfterIfContinuesLayoutConstraint {\n flagmentLayoutConstraintType: FragmentLayoutConstraintType =\n \"AfterIfContinue\";\n\n constructor(\n public nodeContext: Vtree.NodeContext,\n public afterIfContinues: Selectors.AfterIfContinues,\n public pseudoElementHeight: number,\n ) {}\n\n /** @override */\n allowLayout(\n nodeContext: Vtree.NodeContext,\n overflownNodeContext: Vtree.NodeContext,\n column: Layout.Column,\n ): boolean {\n if (\n (overflownNodeContext && !nodeContext) ||\n (nodeContext && nodeContext.overflow)\n ) {\n return false;\n } else {\n return true;\n }\n }\n\n /** @override */\n nextCandidate(nodeContext: Vtree.NodeContext): boolean {\n return false;\n }\n\n /** @override */\n postLayout(\n allowed: boolean,\n positionAfter: Vtree.NodeContext,\n initialPosition: Vtree.NodeContext,\n column: Layout.Column,\n ) {}\n\n /** @override */\n finishBreak(\n nodeContext: Vtree.NodeContext,\n column: Layout.Column,\n ): Task.Result<boolean> {\n if (!this.getRepetitiveElements().affectTo(nodeContext)) {\n return Task.newResult(true);\n }\n return this.afterIfContinues\n .createElement(column, this.nodeContext)\n .thenAsync((element) => {\n this.nodeContext.viewNode.appendChild(element);\n return Task.newResult(true);\n });\n }\n\n getRepetitiveElements() {\n return new AfterIfContinuesElementsOffset(\n this.nodeContext,\n this.pseudoElementHeight,\n );\n }\n\n /** @override */\n equalsTo(constraint: Layout.FragmentLayoutConstraint): boolean {\n if (!(constraint instanceof AfterIfContinuesLayoutConstraint)) {\n return false;\n }\n return (\n this.afterIfContinues ==\n (constraint as AfterIfContinuesLayoutConstraint).afterIfContinues\n );\n }\n\n /** @override */\n getPriorityOfFinishBreak(): number {\n return 9;\n }\n}\n\nexport class AfterIfContinuesElementsOffset\n implements Selectors.AfterIfContinuesElementsOffset {\n constructor(public nodeContext, public pseudoElementHeight) {}\n\n /** @override */\n calculateOffset(nodeContext: Vtree.NodeContext): number {\n if (!this.affectTo(nodeContext)) {\n return 0;\n }\n return this.pseudoElementHeight;\n }\n\n /** @override */\n calculateMinimumOffset(nodeContext: Vtree.NodeContext): number {\n return this.calculateOffset(nodeContext);\n }\n\n affectTo(nodeContext: Vtree.NodeContext): boolean {\n if (!nodeContext) {\n return false;\n }\n const sourceNode = nodeContext.shadowContext\n ? nodeContext.shadowContext.owner\n : nodeContext.sourceNode;\n if (sourceNode === this.nodeContext.sourceNode) {\n return !!nodeContext.after;\n }\n for (let n = sourceNode.parentNode; n; n = n.parentNode) {\n if (n === this.nodeContext.sourceNode) {\n return true;\n }\n }\n return false;\n }\n}\n\nfunction processAfterIfContinuesOfNodeContext(\n nodeContext: Vtree.NodeContext,\n column: Layout.Column,\n): Task.Result<Vtree.NodeContext> {\n if (\n !nodeContext ||\n !nodeContext.afterIfContinues ||\n nodeContext.after ||\n column.isFloatNodeContext(nodeContext)\n ) {\n return Task.newResult(nodeContext);\n }\n const afterIfContinues = nodeContext.afterIfContinues;\n return afterIfContinues\n .createElement(column, nodeContext)\n .thenAsync((pseudoElement) => {\n Asserts.assert(nodeContext !== null);\n const pseudoElementHeight = calculatePseudoElementHeight(\n nodeContext,\n column,\n pseudoElement,\n );\n column.fragmentLayoutConstraints.push(\n new AfterIfContinuesLayoutConstraint(\n nodeContext as Vtree.NodeContext,\n afterIfContinues,\n pseudoElementHeight,\n ),\n );\n return Task.newResult(nodeContext);\n });\n}\n\nexport function processAfterIfContinues(\n result: Task.Result<Vtree.NodeContext>,\n column: Layout.Column,\n): Task.Result<Vtree.NodeContext> {\n return result.thenAsync((nodeContext) =>\n processAfterIfContinuesOfNodeContext(nodeContext, column),\n );\n}\n\nexport function processAfterIfContinuesOfAncestors(\n nodeContext: Vtree.NodeContext,\n column: Layout.Column,\n): Task.Result<boolean> {\n const frame: Task.Frame<boolean> = Task.newFrame(\n \"processAfterIfContinuesOfAncestors\",\n );\n let current: Vtree.NodeContext = nodeContext;\n frame\n .loop(() => {\n if (current !== null) {\n const result = processAfterIfContinuesOfNodeContext(current, column);\n current = current.parent;\n return result.thenReturn(true);\n } else {\n return Task.newResult(false);\n }\n })\n .then(() => {\n frame.finish(true);\n });\n return frame.result();\n}\n\nexport function calculatePseudoElementHeight(\n nodeContext: Vtree.NodeContext,\n column: Layout.Column,\n pseudoElement: Element,\n): number {\n const parentNode = nodeContext.viewNode as Element;\n parentNode.appendChild(pseudoElement);\n const height = LayoutHelper.getElementHeight(\n pseudoElement,\n column,\n nodeContext.vertical,\n );\n parentNode.removeChild(pseudoElement);\n return height;\n}\n\nexport const mediaTags = {\n img: true,\n svg: true,\n audio: true,\n video: true,\n};\n\n/**\n * Represents a constraint on layout\n */\nexport type LayoutConstraint = Layout.LayoutConstraint;\n\n/**\n * Represents a constraint that allows layout if all the constraints it contains\n * allow layout.\n */\nexport class AllLayoutConstraint implements LayoutConstraint {\n constructor(public readonly constraints: LayoutConstraint[]) {}\n\n /**\n * @override\n */\n allowLayout(nodeContext: Vtree.NodeContext): boolean {\n return this.constraints.every((c) => c.allowLayout(nodeContext));\n }\n}\n\n/**\n * Represents constraints on laying out fragments\n */\nexport type FragmentLayoutConstraint = Layout.FragmentLayoutConstraint;\n\nexport type BreakPositionAndNodeContext = Layout.BreakPositionAndNodeContext;\n\n/**\n * Potential breaking position inside CSS box (between lines).\n * @param checkPoints array of breaking points for breakable block\n */\nexport class BoxBreakPosition\n extends BreakPosition.AbstractBreakPosition\n implements Layout.BoxBreakPosition {\n private alreadyEvaluated: boolean = false;\n breakNodeContext: Vtree.NodeContext = null;\n\n constructor(\n public readonly checkPoints: Vtree.NodeContext[],\n public readonly penalty: number,\n ) {\n super();\n }\n\n /**\n * @override\n */\n findAcceptableBreak(column: Column, penalty: number): Vtree.NodeContext {\n if (penalty < this.getMinBreakPenalty()) {\n return null;\n }\n if (!this.alreadyEvaluated) {\n this.breakNodeContext = column.findBoxBreakPosition(this, penalty > 0);\n this.alreadyEvaluated = true;\n }\n return this.breakNodeContext;\n }\n\n /**\n * @override\n */\n getMinBreakPenalty(): number {\n return this.penalty;\n }\n\n /** @override */\n getNodeContext(): Vtree.NodeContext {\n return this.alreadyEvaluated\n ? this.breakNodeContext\n : this.checkPoints[this.checkPoints.length - 1];\n }\n}\n\nexport function validateCheckPoints(checkPoints: Vtree.NodeContext[]): void {\n for (let i = 1; i < checkPoints.length; i++) {\n const cp0 = checkPoints[i - 1];\n const cp1 = checkPoints[i];\n if (cp0 === cp1) {\n Logging.logger.warn(\"validateCheckPoints: duplicate entry\");\n } else if (cp0.boxOffset >= cp1.boxOffset) {\n Logging.logger.warn(\"validateCheckPoints: incorrect boxOffset\");\n } else if (cp0.sourceNode == cp1.sourceNode) {\n if (cp1.after) {\n if (cp0.after) {\n Logging.logger.warn(\"validateCheckPoints: duplicate after points\");\n }\n } else {\n if (!cp0.after) {\n if (\n cp1.boxOffset - cp0.boxOffset !=\n cp1.offsetInNode - cp0.offsetInNode\n ) {\n Logging.logger.warn(\n \"validateCheckPoints: boxOffset inconsistent with offsetInNode\",\n );\n }\n }\n }\n }\n }\n}\n\nexport function isSpecialInlineDisplay(display: string): boolean {\n switch (display) {\n case \"ruby\":\n case \"inline-block\":\n case \"inline-flex\":\n case \"inline-grid\":\n case \"inline-list-item\":\n case \"inline-table\":\n return true;\n }\n return false;\n}\n\nexport class Column extends VtreeImpl.Container implements Layout.Column {\n last: Node;\n viewDocument: Document;\n flowRootFormattingContext: Vtree.FormattingContext = null;\n isFloat: boolean = false;\n isFootnote: boolean = false;\n startEdge: number = 0;\n endEdge: number = 0;\n beforeEdge: number = 0;\n afterEdge: number = 0;\n footnoteEdge: number = 0;\n box: GeometryUtil.Rect = null;\n chunkPositions: Vtree.ChunkPosition[] = null;\n bands: GeometryUtil.Band[] = null;\n overflown: boolean = false;\n breakPositions: BreakPosition.BreakPosition[] = null;\n pageBreakType: string | null = null;\n forceNonfitting: boolean = true;\n leftFloatEdge: number = 0; // bottom of the bottommost left float\n rightFloatEdge: number = 0; // bottom of the bottommost right float\n bottommostFloatTop: number = 0; // Top of the bottommost float\n stopAtOverflow: boolean = true;\n lastAfterPosition: Vtree.NodePosition | null = null;\n fragmentLayoutConstraints: FragmentLayoutConstraint[] = [];\n pseudoParent: Column = null;\n nodeContextOverflowingDueToRepetitiveElements: Vtree.NodeContext | null = null;\n blockDistanceToBlockEndFloats: number = NaN;\n computedBlockSize: number;\n\n constructor(\n element: Element,\n public layoutContext: Vtree.LayoutContext,\n public clientLayout: Vtree.ClientLayout,\n public readonly layoutConstraint: LayoutConstraint,\n public readonly pageFloatLayoutContext: PageFloats.PageFloatLayoutContext,\n ) {\n super(element);\n this.last = element.lastChild;\n this.viewDocument = element.ownerDocument;\n pageFloatLayoutContext.setContainer(this);\n }\n\n getTopEdge(): number {\n return this.vertical ? this.startEdge : this.beforeEdge;\n }\n\n getBottomEdge(): number {\n return this.vertical ? this.endEdge : this.afterEdge;\n }\n\n getLeftEdge(): number {\n return this.vertical ? this.afterEdge : this.startEdge;\n }\n\n getRightEdge(): number {\n return this.vertical ? this.beforeEdge : this.endEdge;\n }\n\n isFloatNodeContext(nodeContext: Vtree.NodeContext): boolean {\n return !!nodeContext.floatSide && (!this.isFloat || !!nodeContext.parent);\n }\n\n stopByOverflow(nodeContext: Vtree.NodeContext): boolean {\n return this.stopAtOverflow && !!nodeContext && nodeContext.overflow;\n }\n\n isOverflown(edge: number): boolean {\n if (this.vertical) {\n return edge < this.footnoteEdge;\n } else {\n return edge > this.footnoteEdge;\n }\n }\n\n getExclusions(): GeometryUtil.Shape[] {\n const pageFloatExclusions = this.pageFloatLayoutContext.getFloatFragmentExclusions();\n return this.exclusions.concat(pageFloatExclusions);\n }\n\n openAllViews(position: Vtree.NodePosition): Task.Result<Vtree.NodeContext> {\n const frame: Task.Frame<Vtree.NodeContext> = Task.newFrame(\"openAllViews\");\n const steps = position.steps;\n this.layoutContext.setViewRoot(this.element, this.isFootnote);\n let stepIndex = steps.length - 1;\n let nodeContext: Vtree.NodeContext = null;\n frame\n .loop(() => {\n while (stepIndex >= 0) {\n const prevContext = nodeContext;\n const step = steps[stepIndex];\n nodeContext = VtreeImpl.makeNodeContextFromNodePositionStep(\n step,\n prevContext,\n );\n if (\n stepIndex === steps.length - 1 &&\n !nodeContext.formattingContext\n ) {\n nodeContext.formattingContext = this.flowRootFormattingContext;\n }\n if (stepIndex == 0) {\n nodeContext.offsetInNode = this.calculateOffsetInNodeForNodeContext(\n position,\n );\n nodeContext.after = position.after;\n nodeContext.preprocessedTextContent =\n position.preprocessedTextContent;\n if (nodeContext.after) {\n break;\n }\n }\n const r = this.layoutContext.setCurrent(\n nodeContext,\n stepIndex == 0 && nodeContext.offsetInNode == 0,\n );\n stepIndex--;\n if (r.isPending()) {\n return r;\n }\n }\n return Task.newResult(false);\n })\n .then(() => {\n Asserts.assert(nodeContext);\n frame.finish(nodeContext);\n });\n return frame.result();\n }\n\n calculateOffsetInNodeForNodeContext(position: Vtree.NodePosition): number {\n return position.preprocessedTextContent\n ? Diff.resolveNewIndex(\n position.preprocessedTextContent,\n position.offsetInNode,\n )\n : position.offsetInNode;\n }\n\n /**\n * @param count first-XXX nesting identifier\n */\n maybePeelOff(\n position: Vtree.NodeContext,\n count: number,\n ): Task.Result<Vtree.NodeContext> {\n if (\n position.firstPseudo &&\n position.inline &&\n !position.after &&\n position.firstPseudo.count == 0\n ) {\n // first char\n if (position.viewNode.nodeType != 1) {\n const text = position.viewNode.textContent;\n const r = text.match(Base.firstLetterPattern);\n return this.layoutContext.peelOff(position, r ? r[0].length : 0);\n }\n }\n return Task.newResult(position) as Task.Result<Vtree.NodeContext>;\n }\n\n /**\n * Builds the view until a CSS box edge is reached.\n * @param position start source position.\n * @param checkPoints array to append possible breaking points.\n * @return holding box edge position reached or null if the source is exhausted.\n */\n buildViewToNextBlockEdge(\n position: Vtree.NodeContext,\n checkPoints: Vtree.NodeContext[],\n ): Task.Result<Vtree.NodeContext> {\n let violateConstraint = false;\n const frame: Task.Frame<Vtree.NodeContext> = Task.newFrame(\n \"buildViewToNextBlockEdge\",\n );\n frame\n .loopWithFrame((bodyFrame) => {\n if (position.viewNode && !LayoutHelper.isSpecialNodeContext(position)) {\n checkPoints.push(position.copy());\n }\n this.maybePeelOff(position, 0).then((position1Param) => {\n const position1 = position1Param as Vtree.NodeContext;\n if (position1 !== position) {\n position = position1;\n if (!LayoutHelper.isSpecialNodeContext(position)) {\n checkPoints.push(position.copy());\n }\n }\n this.nextInTree(position).then((positionParam) => {\n position = positionParam as Vtree.NodeContext;\n if (!position) {\n // Exit the loop\n bodyFrame.breakLoop();\n return;\n }\n if (\n violateConstraint ||\n !this.layoutConstraint.allowLayout(position)\n ) {\n violateConstraint = true;\n position = position.modify();\n position.overflow = true;\n }\n if (this.isFloatNodeContext(position) && !this.vertical) {\n this.layoutFloatOrFootnote(position).then((positionParam) => {\n position = positionParam as Vtree.NodeContext;\n if (this.pageFloatLayoutContext.isInvalidated()) {\n position = null;\n }\n if (!position) {\n bodyFrame.breakLoop();\n return;\n }\n bodyFrame.continueLoop();\n });\n } else if (!position.inline) {\n // Exit the loop\n bodyFrame.breakLoop();\n } else {\n // Continue the loop\n bodyFrame.continueLoop();\n }\n });\n });\n })\n .then(() => {\n frame.finish(position);\n });\n return frame.result();\n }\n\n nextInTree(\n position: Vtree.NodeContext,\n atUnforcedBreak?: boolean,\n ): Task.Result<Vtree.NodeContext> {\n const cont = this.layoutContext.nextInTree(position, atUnforcedBreak);\n return processAfterIfContinues(cont, this);\n }\n\n /**\n * Builds the view for a single unbreakable element.\n * @param position start source position.\n * @return holding box edge position reached or null if the source is exhausted.\n */\n buildDeepElementView(\n position: Vtree.NodeContext,\n ): Task.Result<Vtree.NodeContext> {\n if (!position.viewNode) {\n return Task.newResult(position);\n }\n let checkPoints: Vtree.NodeContext[] = [];\n const sourceNode = position.sourceNode;\n const frame: Task.Frame<Vtree.NodeContext> = Task.newFrame(\n \"buildDeepElementView\",\n );\n\n // TODO: end the loop based on depth, not sourceNode comparison\n frame\n .loopWithFrame((bodyFrame) => {\n if (\n position.viewNode &&\n position.inline &&\n !LayoutHelper.isSpecialNodeContext(position)\n ) {\n checkPoints.push(position.copy());\n } else {\n if (checkPoints.length > 0) {\n this.postLayoutBlock(position, checkPoints);\n }\n checkPoints = [];\n }\n this.maybePeelOff(position, 0).then((position1Param) => {\n const position1 = position1Param as Vtree.NodeContext;\n if (position1 !== position) {\n let p = position1;\n while (p && p.sourceNode != sourceNode) {\n p = p.parent;\n }\n if (p == null) {\n // outside of the subtree\n position = position1;\n bodyFrame.breakLoop();\n return;\n }\n if (!LayoutHelper.isSpecialNodeContext(position1)) {\n checkPoints.push(position1.copy());\n }\n }\n this.nextInTree(position1).then((positionParam) => {\n position = positionParam as Vtree.NodeContext;\n if (!position || position.sourceNode == sourceNode) {\n bodyFrame.breakLoop();\n } else if (!this.layoutConstraint.allowLayout(position)) {\n position = position.modify();\n position.overflow = true;\n if (this.stopAtOverflow) {\n bodyFrame.breakLoop();\n } else {\n bodyFrame.continueLoop();\n }\n } else {\n bodyFrame.continueLoop();\n }\n });\n });\n })\n .then(() => {\n if (checkPoints.length > 0) {\n this.postLayoutBlock(position, checkPoints);\n }\n frame.finish(position);\n });\n return frame.result();\n }\n\n /**\n * Create a single floating element (for exclusion areas).\n * @param ref container's child to insert float before (can be null).\n * @param side float side (\"left\" or \"right\").\n * @param width float inline dimension.\n * @param height float box progression dimension.\n * @return newly created float element.\n */\n createFloat(ref: Node, side: string, width: number, height: number): Element {\n const div = this.viewDocument.createElement(\"div\");\n if (this.vertical) {\n if (height >= this.height) {\n height -= 0.1;\n }\n Base.setCSSProperty(div, \"height\", `${width}px`);\n Base.setCSSProperty(div, \"width\", `${height}px`);\n } else {\n if (width >= this.width) {\n width -= 0.1;\n }\n Base.setCSSProperty(div, \"width\", `${width}px`);\n Base.setCSSProperty(div, \"height\", `${height}px`);\n }\n Base.setCSSProperty(div, \"float\", side);\n Base.setCSSProperty(div, \"clear\", side);\n\n // enable to visualize\n // Base.setCSSProperty(div, \"background-color\", \"#50F0FF\");\n this.element.insertBefore(div, ref);\n return div;\n }\n\n /**\n * Remove all the exclusion floats.\n */\n killFloats(): void {\n let c: Node = this.element.firstChild;\n while (c) {\n const nc = c.nextSibling;\n if (c.nodeType == 1) {\n const e = c as HTMLElement;\n const f = e.style.cssFloat;\n if (f == \"left\" || f == \"right\") {\n this.element.removeChild(e);\n } else {\n break;\n }\n }\n c = nc;\n }\n }\n\n /**\n * Create exclusion floats for a column.\n */\n createFloats(): void {\n const ref = this.element.firstChild;\n const bands = this.bands;\n const x1 = this.vertical ? this.getTopEdge() : this.getLeftEdge();\n const x2 = this.vertical ? this.getBottomEdge() : this.getRightEdge();\n for (const band of bands) {\n const height = band.y2 - band.y1;\n band.left = this.createFloat(ref, \"left\", band.x1 - x1, height);\n band.right = this.createFloat(ref, \"right\", x2 - band.x2, height);\n }\n }\n\n /**\n * @param nodeContext position after the block\n * @param checkPoints array of possible breaking points.\n * @param index index of the breaking point\n * @param boxOffset box offset\n * @return edge position\n */\n calculateEdge(\n nodeContext: Vtree.NodeContext,\n checkPoints: Vtree.NodeContext[],\n index: number,\n boxOffset: number,\n ): number {\n let edge: number;\n if (nodeContext && LayoutHelper.isOrphan(nodeContext.viewNode)) {\n return NaN;\n } else if (nodeContext && nodeContext.after && !nodeContext.inline) {\n edge = LayoutHelper.calculateEdge(\n nodeContext,\n this.clientLayout,\n 0,\n this.vertical,\n );\n if (!isNaN(edge)) {\n return edge;\n }\n }\n nodeContext = checkPoints[index];\n let offset = boxOffset - nodeContext.boxOffset;\n while (true) {\n edge = LayoutHelper.calculateEdge(\n nodeContext,\n this.clientLayout,\n offset,\n this.vertical,\n );\n if (!isNaN(edge)) {\n return edge;\n }\n if (offset > 0) {\n offset--;\n continue;\n }\n index--;\n if (index < 0) {\n return this.beforeEdge;\n }\n nodeContext = checkPoints[index];\n if (nodeContext.viewNode.nodeType != 1) {\n offset = nodeContext.viewNode.textContent.length;\n }\n }\n }\n\n /**\n * Parse CSS computed length (in pixels)\n * @param val CSS length in \"px\" units or a number.\n * @return value in pixels or 0 if not parsable\n */\n parseComputedLength(val: string | number): number {\n if (typeof val == \"number\") {\n return val;\n }\n const r = val.match(/^(-?[0-9]*(\\.[0-9]*)?)px$/);\n if (r) {\n return parseFloat(r[0]);\n }\n return 0;\n }\n\n /**\n * Reads element's computed CSS margin.\n */\n getComputedMargin(element: Element): GeometryUtil.Insets {\n const style = this.clientLayout.getElementComputedStyle(element);\n const insets = new GeometryUtil.Insets(0, 0, 0, 0);\n if (style) {\n insets.left = this.parseComputedLength(style.marginLeft);\n insets.top = this.parseComputedLength(style.marginTop);\n insets.right = this.parseComputedLength(style.marginRight);\n insets.bottom = this.parseComputedLength(style.marginBottom);\n }\n return insets;\n }\n\n /**\n * Reads element's computed padding + borders.\n */\n getComputedPaddingBorder(element: Element): GeometryUtil.Insets {\n const style = this.clientLayout.getElementComputedStyle(element);\n const insets = new GeometryUtil.Insets(0, 0, 0, 0);\n if (style) {\n insets.left =\n this.parseComputedLength(style.borderLeftWidth) +\n this.parseComputedLength(style.paddingLeft);\n insets.top =\n this.parseComputedLength(style.borderTopWidth) +\n this.parseComputedLength(style.paddingTop);\n insets.right =\n this.parseComputedLength(style.borderRightWidth) +\n this.parseComputedLength(style.paddingRight);\n insets.bottom =\n this.parseComputedLength(style.borderBottomWidth) +\n this.parseComputedLength(style.paddingBottom);\n }\n return insets;\n }\n\n /**\n * Reads element's computed CSS insets(margins + border + padding or margins :\n * depends on box-sizing)\n */\n getComputedInsets(element: Element): GeometryUtil.Insets {\n const style = this.clientLayout.getElementComputedStyle(element);\n const insets = new GeometryUtil.Insets(0, 0, 0, 0);\n if (style) {\n if (style.boxSizing == \"border-box\") {\n return this.getComputedMargin(element);\n }\n insets.left =\n this.parseComputedLength(style.marginLeft) +\n this.parseComputedLength(style.borderLeftWidth) +\n this.parseComputedLength(style.paddingLeft);\n insets.top =\n this.parseComputedLength(style.marginTop) +\n this.parseComputedLength(style.borderTopWidth) +\n this.parseComputedLength(style.paddingTop);\n insets.right =\n this.parseComputedLength(style.marginRight) +\n this.parseComputedLength(style.borderRightWidth) +\n this.parseComputedLength(style.paddingRight);\n insets.bottom =\n this.parseComputedLength(style.marginBottom) +\n this.parseComputedLength(style.borderBottomWidth) +\n this.parseComputedLength(style.paddingBottom);\n }\n return insets;\n }\n\n /**\n * Set element's computed CSS insets to Column Container\n */\n setComputedInsets(element: Element, container: Column) {\n const style = this.clientLayout.getElementComputedStyle(element);\n if (style) {\n container.marginLeft = this.parseComputedLength(style.marginLeft);\n container.borderLeft = this.parseComputedLength(style.borderLeftWidth);\n container.paddingLeft = this.parseComputedLength(style.paddingLeft);\n container.marginTop = this.parseComputedLength(style.marginTop);\n container.borderTop = this.parseComputedLength(style.borderTopWidth);\n container.paddingTop = this.parseComputedLength(style.paddingTop);\n container.marginRight = this.parseComputedLength(style.marginRight);\n container.borderRight = this.parseComputedLength(style.borderRightWidth);\n container.paddingRight = this.parseComputedLength(style.paddingRight);\n container.marginBottom = this.parseComputedLength(style.marginBottom);\n container.borderBottom = this.parseComputedLength(\n style.borderBottomWidth,\n );\n container.paddingBottom = this.parseComputedLength(style.paddingBottom);\n }\n }\n\n /**\n * Set element's computed width and height to Column Container\n */\n setComputedWidthAndHeight(element: Element, container: Column) {\n const style = this.clientLayout.getElementComputedStyle(element);\n if (style) {\n container.width = this.parseComputedLength(style.width);\n container.height = this.parseComputedLength(style.height);\n }\n }\n\n /**\n * Layout a single unbreakable element.\n */\n layoutUnbreakable(\n nodeContextIn: Vtree.NodeContext,\n ): Task.Result<Vtree.NodeContext> {\n return this.buildDeepElementView(nodeContextIn);\n }\n\n /**\n * Layout a single float element.\n */\n layoutFloat(nodeContext: Vtree.NodeContext): Task.Result<Vtree.NodeContext> {\n const frame: Task.Frame<Vtree.NodeContext> = Task.newFrame(\"layoutFloat\");\n const element = nodeContext.viewNode as Element;\n const floatSide = nodeContext.floatSide as string;\n Base.setCSSProperty(element, \"float\", \"none\");\n Base.setCSSProperty(element, \"display\", \"inline-block\");\n Base.setCSSProperty(element, \"vertical-align\", \"top\");\n this.buildDeepElementView(nodeContext).then((nodeContextAfter) => {\n const floatBBox = this.clientLayout.getElementClientRect(element);\n const margin = this.getComputedMargin(element);\n let floatBox = new GeometryUtil.Rect(\n floatBBox.left - margin.left,\n floatBBox.top - margin.top,\n floatBBox.right + margin.right,\n floatBBox.bottom + margin.bottom,\n );\n let x1 = this.startEdge;\n let x2 = this.endEdge;\n let parent = nodeContext.parent;\n while (parent && parent.inline) {\n parent = parent.parent;\n }\n if (parent) {\n // Position it at the parent element's edge.\n // We need to get the edge of the parent's content area, calling\n // getElementClientRect will also give us borders. Avoid it by creating\n // a temporary element and using it for measurment.\n const probe = parent.viewNode.ownerDocument.createElement(\"div\");\n probe.style.left = \"0px\";\n probe.style.top = \"0px\";\n if (this.vertical) {\n probe.style.bottom = \"0px\";\n probe.style.width = \"1px\";\n } else {\n probe.style.right = \"0px\";\n probe.style.height = \"1px\";\n }\n parent.viewNode.appendChild(probe);\n const parentBox = this.clientLayout.getElementClientRect(probe);\n x1 = Math.max(this.getStartEdge(parentBox), x1);\n x2 = Math.min(this.getEndEdge(parentBox), x2);\n parent.viewNode.removeChild(probe);\n const floatBoxMeasure = this.vertical\n ? floatBox.y2 - floatBox.y1\n : floatBox.x2 - floatBox.x1;\n if (floatSide == \"left\") {\n x2 = Math.max(x2, x1 + floatBoxMeasure);\n } else {\n x1 = Math.min(x1, x2 - floatBoxMeasure);\n }\n\n // Move the float below the block parent.\n // Otherwise, if the float is attached to an inline box with 'position:\n // relative', the absolute positioning of the float gets broken, since\n // the inline parent can be pushed horizontally by exclusion floats\n // after the layout of the float is done.\n parent.viewNode.appendChild(nodeContext.viewNode);\n }\n\n // box is rotated for vertical orientation\n let box = new GeometryUtil.Rect(\n x1,\n this.getBoxDir() * this.beforeEdge,\n x2,\n this.getBoxDir() * this.afterEdge,\n );\n let floatHorBox = floatBox;\n if (this.vertical) {\n floatHorBox = GeometryUtil.rotateBox(floatBox);\n }\n const dir = this.getBoxDir();\n if (floatHorBox.y1 < this.bottommostFloatTop * dir) {\n const boxExtent = floatHorBox.y2 - floatHorBox.y1;\n floatHorBox.y1 = this.bottommostFloatTop * dir;\n floatHorBox.y2 = floatHorBox.y1 + boxExtent;\n }\n GeometryUtil.positionFloat(box, this.bands, floatHorBox, floatSide);\n if (this.vertical) {\n floatBox = GeometryUtil.unrotateBox(floatHorBox);\n }\n const insets = this.getComputedInsets(element);\n Base.setCSSProperty(\n element,\n \"width\",\n `${floatBox.x2 - floatBox.x1 - insets.left - insets.right}px`,\n );\n Base.setCSSProperty(\n element,\n \"height\",\n `${floatBox.y2 - floatBox.y1 - insets.top - insets.bottom}px`,\n );\n Base.setCSSProperty(element, \"position\", \"absolute\");\n Asserts.assert(nodeContext.display);\n Base.setCSSProperty(element, \"display\", nodeContext.display);\n let offsets;\n let containingBlockForAbsolute: Vtree.NodeContext = null;\n if (parent) {\n if (parent.containingBlockForAbsolute) {\n containingBlockForAbsolute = parent;\n } else {\n containingBlockForAbsolute = parent.getContainingBlockForAbsolute();\n }\n }\n if (containingBlockForAbsolute) {\n const probe = containingBlockForAbsolute.viewNode.ownerDocument.createElement(\n \"div\",\n );\n probe.style.position = \"absolute\";\n if (containingBlockForAbsolute.vertical) {\n probe.style.right = \"0\";\n } else {\n probe.style.left = \"0\";\n }\n probe.style.top = \"0\";\n containingBlockForAbsolute.viewNode.appendChild(probe);\n offsets = this.clientLayout.getElementClientRect(probe);\n containingBlockForAbsolute.viewNode.removeChild(probe);\n } else {\n offsets = {\n left: this.getLeftEdge() - this.paddingLeft,\n right: this.getRightEdge() + this.paddingRight,\n top: this.getTopEdge() - this.paddingTop,\n };\n }\n if (\n containingBlockForAbsolute\n ? containingBlockForAbsolute.vertical\n : this.vertical\n ) {\n Base.setCSSProperty(\n element,\n \"right\",\n `${offsets.right - floatBox.x2}px`,\n );\n } else {\n Base.setCSSProperty(element, \"left\", `${floatBox.x1 - offsets.left}px`);\n }\n Base.setCSSProperty(element, \"top\", `${floatBox.y1 - offsets.top}px`);\n if (nodeContext.clearSpacer) {\n nodeContext.clearSpacer.parentNode.removeChild(nodeContext.clearSpacer);\n nodeContext.clearSpacer = null;\n }\n const floatBoxEdge = this.vertical ? floatBox.x1 : floatBox.y2;\n const floatBoxTop = this.vertical ? floatBox.x2 : floatBox.y1;\n\n // TODO: subtract after margin when determining overflow.\n if (!this.isOverflown(floatBoxEdge) || this.breakPositions.length == 0) {\n // no overflow\n this.killFloats();\n box = new GeometryUtil.Rect(\n this.getLeftEdge(),\n this.getTopEdge(),\n this.getRightEdge(),\n this.getBottomEdge(),\n );\n if (this.vertical) {\n box = GeometryUtil.rotateBox(box);\n }\n GeometryUtil.addFloatToBands(\n box,\n this.bands,\n floatHorBox,\n null,\n floatSide,\n );\n this.createFloats();\n if (floatSide == \"left\") {\n this.leftFloatEdge = floatBoxEdge;\n } else {\n this.rightFloatEdge = floatBoxEdge;\n }\n this.bottommostFloatTop = floatBoxTop;\n this.updateMaxReachedAfterEdge(floatBoxEdge);\n frame.finish(nodeContextAfter);\n } else {\n nodeContext = nodeContext.modify();\n nodeContext.overflow = true;\n frame.finish(nodeContext);\n }\n });\n return frame.result();\n }\n\n setupFloatArea(\n area: PageFloatArea,\n floatReference: PageFloats.FloatReference,\n floatSide: string,\n anchorEdge: number | null,\n strategy: PageFloats.PageFloatLayoutStrategy,\n condition: PageFloats.PageFloatPlacementCondition,\n ): boolean {\n const floatLayoutContext = this.pageFloatLayoutContext;\n const floatContainer = floatLayoutContext.getContainer(floatReference);\n const element = area.element;\n floatContainer.element.parentNode.appendChild(element);\n area.isFloat = true;\n area.originX = floatContainer.originX;\n area.originY = floatContainer.originY;\n area.vertical = floatContainer.vertical;\n area.marginLeft = area.marginRight = area.marginTop = area.marginBottom = 0;\n area.borderLeft = area.borderRight = area.borderTop = area.borderBottom = 0;\n area.paddingLeft = area.paddingRight = area.paddingTop = area.paddingBottom = 0;\n area.exclusions = (floatContainer.exclusions || []).concat();\n area.forceNonfitting = !floatLayoutContext.hasFloatFragments();\n area.innerShape = null;\n const containingBlockRect = floatContainer.getPaddingRect();\n area.setHorizontalPosition(\n containingBlockRect.x1 - floatContainer.originX,\n containingBlockRect.x2 - containingBlockRect.x1,\n );\n area.setVerticalPosition(\n containingBlockRect.y1 - floatContainer.originY,\n containingBlockRect.y2 - containingBlockRect.y1,\n );\n strategy.adjustPageFloatArea(area, floatContainer, this);\n\n // Calculate bands from the exclusions before setting float area dimensions\n area.init();\n const fitWithinContainer = !!floatLayoutContext.setFloatAreaDimensions(\n area,\n floatReference,\n floatSide,\n anchorEdge,\n true,\n !floatLayoutContext.hasFloatFragments(),\n condition,\n );\n if (fitWithinContainer) {\n // New dimensions have been set, remove exclusion floats and re-init\n area.killFloats();\n area.init();\n } else {\n floatContainer.element.parentNode.removeChild(element);\n }\n return fitWithinContainer;\n }\n\n createPageFloatArea(\n float: PageFloats.PageFloat | null,\n floatSide: string,\n anchorEdge: number | null,\n strategy: PageFloats.PageFloatLayoutStrategy,\n condition: PageFloats.PageFloatPlacementCondition,\n ): PageFloatArea | null {\n const floatAreaElement = this.element.ownerDocument.createElement(\"div\");\n Base.setCSSProperty(floatAreaElement, \"position\", \"absolute\");\n const parentPageFloatLayoutContext = this.pageFloatLayoutContext.getPageFloatLayoutContext(\n float.floatReference,\n );\n\n // TODO: establish how to specify an appropriate generating element for the\n // new page float layout context\n const pageFloatLayoutContext = new PageFloats.PageFloatLayoutContext(\n null,\n PageFloats.FloatReference.COLUMN,\n null,\n this.pageFloatLayoutContext.flowName,\n float.nodePosition,\n null,\n null,\n );\n const parentContainer = parentPageFloatLayoutContext.getContainer();\n const floatArea = new PageFloatArea(\n floatSide,\n floatAreaElement,\n this.layoutContext.clone(),\n this.clientLayout,\n this.layoutConstraint,\n pageFloatLayoutContext,\n parentContainer,\n );\n pageFloatLayoutContext.setContainer(floatArea);\n if (\n this.setupFloatArea(\n floatArea,\n float.floatReference,\n floatSide,\n anchorEdge,\n strategy,\n condition,\n )\n ) {\n return floatArea;\n } else {\n return null;\n }\n }\n\n layoutSinglePageFloatFragment(\n continuations: PageFloats.PageFloatContinuation[],\n floatSide: string,\n clearSide: string | null,\n allowFragmented: boolean,\n strategy: PageFloats.PageFloatLayoutStrategy,\n anchorEdge: number | null,\n pageFloatFragment?: PageFloats.PageFloatFragment | null,\n ): Task.Result<SinglePageFloatLayoutResult> {\n const context = this.pageFloatLayoutContext;\n const originalContinuations = pageFloatFragment\n ? pageFloatFragment.continuations\n : [];\n continuations = originalContinuations.concat(continuations);\n const firstFloat = continuations[0].float;\n const condition = context.getPageFloatPlacementCondition(\n firstFloat,\n floatSide,\n clearSide,\n );\n const floatArea = this.createPageFloatArea(\n firstFloat,\n floatSide,\n anchorEdge,\n strategy,\n condition,\n );\n const result: SinglePageFloatLayoutResult = {\n floatArea,\n pageFloatFragment: null,\n newPosition: null,\n };\n if (!floatArea) {\n return Task.newResult(result);\n }\n const frame = Task.newFrame<SinglePageFloatLayoutResult>(\n \"layoutSinglePageFloatFragment\",\n );\n let failed = false;\n let i = 0;\n frame\n .loopWithFrame((loopFrame) => {\n if (i >= continuations.length) {\n loopFrame.breakLoop();\n return;\n }\n const c = continuations[i];\n const floatChunkPosition = new VtreeImpl.ChunkPosition(c.nodePosition);\n floatArea.layout(floatChunkPosition, true).then((newPosition) => {\n result.newPosition = newPosition;\n if (!newPosition || allowFragmented) {\n i++;\n loopFrame.continueLoop();\n } else {\n failed = true;\n loopFrame.breakLoop();\n }\n });\n })\n .then(() => {\n if (!failed) {\n Asserts.assert(floatArea);\n const logicalFloatSide = context.setFloatAreaDimensions(\n floatArea,\n firstFloat.floatReference,\n floatSide,\n anchorEdge,\n false,\n allowFragmented,\n condition,\n );\n if (!logicalFloatSide) {\n failed = true;\n } else {\n const newFragment = strategy.createPageFloatFragment(\n continuations,\n logicalFloatSide,\n floatArea,\n !!result.newPosition,\n );\n context.addPageFloatFragment(newFragment, true);\n result.pageFloatFragment = newFragment;\n }\n }\n frame.finish(result);\n });\n return frame.result();\n }\n\n layoutPageFloatInner(\n continuation: PageFloats.PageFloatContinuation,\n strategy: PageFloats.PageFloatLayoutStrategy,\n anchorEdge: number | null,\n pageFloatFragment?: PageFloats.PageFloatFragment,\n ): Task.Result<boolean> {\n const context = this.pageFloatLayoutContext;\n const float = continuation.float;\n context.stashEndFloatFragments(float);\n\n function cancelLayout(floatArea, pageFloatFragment) {\n if (pageFloatFragment) {\n context.removePageFloatFragment(pageFloatFragment, true);\n } else if (floatArea) {\n floatArea.element.parentNode.removeChild(floatArea.element);\n }\n context.restoreStashedFragments(float.floatReference);\n context.deferPageFloat(continuation);\n }\n const frame: Task.Frame<boolean> = Task.newFrame(\"layoutPageFloatInner\");\n this.layoutSinglePageFloatFragment(\n [continuation],\n float.floatSide,\n float.clearSide,\n !context.hasFloatFragments(),\n strategy,\n anchorEdge,\n pageFloatFragment,\n ).then((result) => {\n const floatArea = result.floatArea;\n const newFragment = result.pageFloatFragment;\n const newPosition = result.newPosition;\n if (newFragment) {\n this.layoutStashedPageFloats(float.floatReference, [\n pageFloatFragment,\n ]).then((success) => {\n if (success) {\n // Add again to invalidate the context\n Asserts.assert(newFragment);\n context.addPageFloatFragment(newFragment);\n context.discardStashedFragments(float.floatReference);\n if (newPosition) {\n const continuation = new PageFloats.PageFloatContinuation(\n float,\n newPosition.primary,\n );\n context.deferPageFloat(continuation);\n }\n frame.finish(true);\n } else {\n cancelLayout(floatArea, newFragment);\n frame.finish(false);\n }\n });\n } else {\n cancelLayout(floatArea, newFragment);\n frame.finish(false);\n }\n });\n return frame.result();\n }\n\n /**\n * @returns Represents if the layout was succeeded or not\n */\n private layoutStashedPageFloats(\n floatReference: PageFloats.FloatReference,\n excluded: PageFloats.PageFloatFragment[],\n ): Task.Result<boolean> {\n const context = this.pageFloatLayoutContext;\n const stashedFloatFragments = context.getStashedFloatFragments(\n floatReference,\n );\n const newFloatAreas = [];\n const newFragments = [];\n let failed = false;\n const frame = Task.newFrame<boolean>(\"layoutStashedPageFloats\");\n let i = 0;\n frame\n .loopWithFrame((loopFrame) => {\n if (i >= stashedFloatFragments.length) {\n loopFrame.breakLoop();\n return;\n }\n const stashedFragment = stashedFloatFragments[i];\n if (excluded.includes(stashedFragment)) {\n i++;\n loopFrame.continueLoop();\n return;\n }\n const strategy = new PageFloats.PageFloatLayoutStrategyResolver().findByFloat(\n stashedFragment.continuations[0].float,\n );\n\n // Value of 'clear' is irrelevant when laying out stashed floats\n // since whether the 'clear' value allows placing the float\n // here is already resolved.\n this.layoutSinglePageFloatFragment(\n stashedFragment.continuations,\n stashedFragment.floatSide,\n null,\n false,\n strategy,\n null,\n ).then((result) => {\n const floatArea = result.floatArea;\n if (floatArea) {\n newFloatAreas.push(floatArea);\n }\n const fragment = result.pageFloatFragment;\n if (fragment) {\n newFragments.push(fragment);\n i++;\n loopFrame.continueLoop();\n } else {\n failed = true;\n loopFrame.breakLoop();\n }\n });\n })\n .then(() => {\n if (failed) {\n newFragments.forEach((fragment) => {\n context.removePageFloatFragment(fragment, true);\n });\n newFloatAreas.forEach((area) => {\n const elem = area.element;\n if (elem && elem.parentNode) {\n elem.parentNode.removeChild(elem);\n }\n });\n } else {\n stashedFloatFragments.forEach((fragment) => {\n const elem = fragment.area.element;\n if (elem && elem.parentNode) {\n elem.parentNode.removeChild(elem);\n }\n });\n }\n frame.finish(!failed);\n });\n return frame.result();\n }\n\n setFloatAnchorViewNode(nodeContext: Vtree.NodeContext): Vtree.NodeContext {\n const parent = nodeContext.viewNode.parentNode;\n const anchor = parent.ownerDocument.createElement(\"span\");\n anchor.setAttribute(VtreeImpl.SPECIAL_ATTR, \"1\");\n if (nodeContext.floatSide === \"footnote\") {\n // Defaults for footnote-call, can be overriden by the stylesheet.\n this.layoutContext.applyPseudoelementStyle(\n nodeContext,\n \"footnote-call\",\n anchor,\n );\n }\n parent.appendChild(anchor);\n parent.removeChild(nodeContext.viewNode);\n const nodeContextAfter = nodeContext.modify();\n nodeContextAfter.after = true;\n nodeContextAfter.viewNode = anchor;\n return nodeContextAfter;\n }\n\n resolveFloatReferenceFromColumnSpan(\n floatReference: PageFloats.FloatReference,\n columnSpan: Css.Val,\n nodeContext: Vtree.NodeContext,\n ): Task.Result<PageFloats.FloatReference> {\n const frame = Task.newFrame(\n \"resolveFloatReferenceFromColumnSpan\",\n ) as Task.Frame<PageFloats.FloatReference>;\n const columnContext = this.pageFloatLayoutContext;\n const regionContext = columnContext.getPageFloatLayoutContext(\n PageFloats.FloatReference.REGION,\n );\n const isRegionWider =\n columnContext.getContainer().width < regionContext.getContainer().width;\n if (isRegionWider && floatReference === PageFloats.FloatReference.COLUMN) {\n if (columnSpan === Css.ident.auto) {\n this.buildDeepElementView(nodeContext.copy()).then((position) => {\n const element = position.viewNode as Element;\n let inlineSize = Sizing.getSize(this.clientLayout, element, [\n Sizing.Size.MIN_CONTENT_INLINE_SIZE,\n ])[Sizing.Size.MIN_CONTENT_INLINE_SIZE];\n const margin = this.getComputedMargin(element);\n if (this.vertical) {\n inlineSize += margin.top + margin.bottom;\n } else {\n inlineSize += margin.left + margin.right;\n }\n if (inlineSize > this.width) {\n frame.finish(PageFloats.FloatReference.REGION);\n } else {\n frame.finish(floatReference);\n }\n });\n } else if (columnSpan === Css.ident.all) {\n frame.finish(PageFloats.FloatReference.REGION);\n } else {\n frame.finish(floatReference);\n }\n } else {\n frame.finish(floatReference);\n }\n return frame.result();\n }\n\n layoutPageFloat(\n nodeContext: Vtree.NodeContext,\n ): Task.Result<Vtree.NodeContext> {\n const context = this.pageFloatLayoutContext;\n const strategy = new PageFloats.PageFloatLayoutStrategyResolver().findByNodeContext(\n nodeContext,\n );\n let cont: Task.Result<PageFloats.PageFloat>;\n const float = context.findPageFloatByNodePosition(\n nodeContext.toNodePosition(),\n );\n if (!float) {\n cont = strategy.createPageFloat(nodeContext, context, this);\n } else {\n cont = Task.newResult(float);\n }\n return cont.thenAsync((float) => {\n const nodePosition = VtreeImpl.newNodePositionFromNodeContext(\n nodeContext,\n 0,\n );\n const nodeContextAfter = this.setFloatAnchorViewNode(nodeContext);\n const pageFloatFragment = strategy.findPageFloatFragment(float, context);\n const continuation = new PageFloats.PageFloatContinuation(\n float,\n nodePosition,\n );\n if (pageFloatFragment && pageFloatFragment.hasFloat(float)) {\n context.registerPageFloatAnchor(float, nodeContextAfter.viewNode);\n return Task.newResult(nodeContextAfter as Vtree.NodeContext);\n } else if (\n context.isForbidden(float) ||\n context.hasPrecedingFloatsDeferredToNext(float)\n ) {\n context.deferPageFloat(continuation);\n context.registerPageFloatAnchor(float, nodeContextAfter.viewNode);\n return Task.newResult(nodeContextAfter as Vtree.NodeContext);\n } else if (this.nodeContextOverflowingDueToRepetitiveElements) {\n return Task.newResult(null);\n } else {\n const edge = LayoutHelper.calculateEdge(\n nodeContextAfter,\n this.clientLayout,\n 0,\n this.vertical,\n );\n if (this.isOverflown(edge)) {\n return Task.newResult(nodeContextAfter);\n } else {\n return this.layoutPageFloatInner(\n continuation,\n strategy,\n edge,\n pageFloatFragment,\n ).thenAsync((success) => {\n Asserts.assert(float);\n if (!success) {\n context.registerPageFloatAnchor(float, nodeContextAfter.viewNode);\n return Task.newResult(nodeContextAfter);\n } else {\n return Task.newResult(null);\n }\n });\n }\n }\n });\n }\n\n createJustificationAdjustmentElement(\n insertionPoint: Node,\n doc: Document,\n parentNode: Node,\n vertical: boolean,\n ): HTMLElement {\n const span = doc.createElement(\"span\") as HTMLElement;\n span.style.visibility = \"hidden\";\n span.style.verticalAlign = \"top\";\n span.setAttribute(VtreeImpl.SPECIAL_ATTR, \"1\");\n const inner = doc.createElement(\"span\") as HTMLElement;\n inner.style.fontSize = \"0\";\n inner.style.lineHeight = \"0\";\n inner.textContent = \" #\";\n span.appendChild(inner);\n\n // Measure inline-start and inline-end edge positions of the line box,\n // taking (exclusion) floats into consideration\n span.style.display = \"block\";\n span.style.textIndent = \"0\";\n span.style.textAlign = \"left\";\n parentNode.insertBefore(span, insertionPoint);\n const leftPos = this.clientLayout.getElementClientRect(inner);\n span.style.textAlign = \"right\";\n const rightPos = this.clientLayout.getElementClientRect(inner);\n span.style.textAlign = \"\";\n if (Base.checkInlineBlockJustificationBug(document.body)) {\n // For Chrome\n span.style.display = \"inline\";\n } else {\n // For Firefox, Edge and IE\n span.style.display = \"inline-block\";\n }\n const padding = vertical\n ? rightPos.top - leftPos.top\n : rightPos.left - leftPos.left;\n const paddingStr = padding >= 1 ? `${padding - 1}px` : \"100%\";\n if (vertical) {\n span.style.paddingTop = paddingStr;\n } else {\n span.style.paddingLeft = paddingStr;\n }\n return span;\n }\n\n addAndAdjustJustificationElement(\n nodeContext: Vtree.NodeContext,\n insertAfter: boolean,\n node: Node,\n insertionPoint: Node,\n doc: Document,\n parentNode: Node,\n ): HTMLElement {\n fixJustificationOnHyphen(nodeContext, insertAfter, node, insertionPoint);\n return this.createJustificationAdjustmentElement(\n insertionPoint,\n doc,\n parentNode,\n nodeContext.vertical,\n );\n }\n\n compensateJustificationLineHeight(\n span: Element,\n br: Element,\n nodeContext: Vtree.NodeContext,\n ) {\n const spanRect = this.clientLayout.getElementClientRect(span);\n const brRect = this.clientLayout.getElementClientRect(br);\n if (nodeContext.vertical) {\n (br as HTMLElement).style.marginRight = `${\n brRect.right - spanRect.right\n }px`;\n (br as HTMLElement).style.width = \"0px\";\n } else {\n (br as HTMLElement).style.marginTop = `${spanRect.top - brRect.top}px`;\n (br as HTMLElement).style.height = \"0px\";\n }\n br.setAttribute(VtreeImpl.SPECIAL_ATTR, \"1\");\n }\n\n /**\n * Fix justification of the last line of text broken across pages (if\n * needed).\n */\n fixJustificationIfNeeded(\n nodeContext: Vtree.NodeContext,\n endOfColumn: boolean,\n ): void {\n if (nodeContext.after && !nodeContext.inline) {\n return;\n }\n if (endOfColumn) {\n let textAlign = \"\";\n for (\n let parent = nodeContext.parent;\n parent && !textAlign;\n parent = parent.parent\n ) {\n if (!parent.inline && parent.viewNode) {\n textAlign = (parent.viewNode as HTMLElement).style.textAlign;\n }\n }\n if (textAlign !== \"justify\") {\n return;\n }\n }\n const node = nodeContext.viewNode;\n const doc = node.ownerDocument;\n const insertAfter =\n endOfColumn && (nodeContext.after || node.nodeType != 1);\n let insertionPoint = insertAfter ? node.nextSibling : node;\n if (insertionPoint && !insertionPoint.parentNode) {\n // Possible if removeSelf = false in finishBreak()\n insertionPoint = null;\n }\n const parentNode =\n node.parentNode || (nodeContext.parent && nodeContext.parent.viewNode);\n if (!parentNode) {\n // Possible if nothing was added to the column\n return;\n }\n const span = this.addAndAdjustJustificationElement(\n nodeContext,\n insertAfter,\n node,\n insertionPoint,\n doc,\n parentNode,\n );\n if (!endOfColumn) {\n const br = doc.createElement(\"div\") as HTMLElement;\n parentNode.insertBefore(br, insertionPoint);\n this.compensateJustificationLineHeight(span, br, nodeContext);\n }\n }\n\n processLineStyling(\n nodeContext: Vtree.NodeContext,\n resNodeContext: Vtree.NodeContext,\n checkPoints: Vtree.NodeContext[],\n ): Task.Result<Vtree.NodeContext> {\n const frame: Task.Frame<Vtree.NodeContext> = Task.newFrame(\n \"processLineStyling\",\n );\n if (VIVLIOSTYLE_DEBUG) {\n validateCheckPoints(checkPoints);\n }\n let lastCheckPoints = checkPoints.concat([]); // make a copy\n checkPoints.splice(0, checkPoints.length); // make empty\n let totalLineCount = 0;\n let firstPseudo = nodeContext.firstPseudo; // :first-letter is not processed here\n if (firstPseudo.count == 0) {\n firstPseudo = firstPseudo.outer; // move to line pseudoelement (if any)\n }\n frame\n .loopWithFrame((loopFrame) => {\n if (!firstPseudo) {\n loopFrame.breakLoop();\n return;\n }\n const linePositions = this.findLinePositions(lastCheckPoints);\n const count = firstPseudo.count - totalLineCount;\n if (linePositions.length <= count) {\n loopFrame.breakLoop();\n return;\n }\n const lineBreak = this.findAcceptableBreakInside(\n lastCheckPoints,\n linePositions[count - 1],\n true,\n );\n if (lineBreak == null) {\n loopFrame.breakLoop();\n return;\n }\n this.finishBreak(lineBreak, false, false).then(() => {\n totalLineCount += count;\n this.layoutContext\n .peelOff(lineBreak, 0)\n .then((resNodeContextParam) => {\n nodeContext = resNodeContextParam;\n this.fixJustificationIfNeeded(nodeContext, false);\n firstPseudo = nodeContext.firstPseudo;\n lastCheckPoints = []; // Wipe out line breaks inside pseudoelements\n this.buildViewToNextBlockEdge(nodeContext, lastCheckPoints).then(\n (resNodeContextParam) => {\n resNodeContext = resNodeContextParam;\n loopFrame.continueLoop();\n },\n );\n });\n });\n })\n .then(() => {\n Array.prototype.push.apply(checkPoints, lastCheckPoints);\n if (VIVLIOSTYLE_DEBUG) {\n validateCheckPoints(checkPoints);\n }\n frame.finish(resNodeContext);\n });\n return frame.result();\n }\n\n isLoneImage(checkPoints: Vtree.NodeContext[]): boolean {\n if (checkPoints.length != 2 && this.breakPositions.length > 0) {\n return false;\n }\n return (\n checkPoints[0].sourceNode == checkPoints[1].sourceNode &&\n mediaTags[(checkPoints[0].sourceNode as Element).localName]\n );\n }\n\n getTrailingMarginEdgeAdjustment(\n trailingEdgeContexts: Vtree.NodeContext[],\n ): number {\n // Margins push the computed height, but are not counted as overflow. We\n // need to find the overall collapsed margin from all enclosed blocks.\n let maxPos = 0;\n let minNeg = 0;\n for (let i = trailingEdgeContexts.length - 1; i >= 0; i--) {\n const nodeContext = trailingEdgeContexts[i];\n if (\n !nodeContext.after ||\n !nodeContext.viewNode ||\n nodeContext.viewNode.nodeType != 1\n ) {\n break;\n }\n const margin = this.getComputedMargin(nodeContext.viewNode as Element);\n const m = this.vertical ? -margin.left : margin.bottom;\n if (m > 0) {\n maxPos = Math.max(maxPos, m);\n } else {\n minNeg = Math.min(minNeg, m);\n }\n }\n return maxPos - minNeg;\n }\n\n /**\n * Layout a single CSS box.\n */\n layoutBreakableBlock(\n nodeContext: Vtree.NodeContext,\n ): Task.Result<Vtree.NodeContext> {\n const frame: Task.Frame<Vtree.NodeContext> = Task.newFrame(\n \"layoutBreakableBlock\",\n );\n const checkPoints: Vtree.NodeContext[] = [];\n this.buildViewToNextBlockEdge(nodeContext, checkPoints).then(\n (resNodeContext) => {\n // at this point a single block was appended to the column\n // flowPosition is either null or\n // - if !after: contains view for the next block element\n // - if after: contains view for the enclosing block element\n const checkPointIndex = checkPoints.length - 1;\n if (checkPointIndex < 0) {\n frame.finish(resNodeContext);\n return;\n }\n\n // Record the height\n // TODO: should this be done after first-line calculation?\n let edge = this.calculateEdge(\n resNodeContext,\n checkPoints,\n checkPointIndex,\n checkPoints[checkPointIndex].boxOffset,\n );\n let overflown = false;\n if (\n !resNodeContext ||\n !LayoutHelper.isOrphan(resNodeContext.viewNode)\n ) {\n const offsets = BreakPosition.calculateOffset(\n resNodeContext,\n this.collectElementsOffset(),\n );\n overflown = this.isOverflown(\n edge + (this.vertical ? -1 : 1) * offsets.minimum,\n );\n if (\n this.isOverflown(\n edge + (this.vertical ? -1 : 1) * offsets.current,\n ) &&\n !this.nodeContextOverflowingDueToRepetitiveElements\n ) {\n this.nodeContextOverflowingDueToRepetitiveElements = resNodeContext;\n }\n }\n if (resNodeContext == null) {\n edge += this.getTrailingMarginEdgeAdjustment(checkPoints);\n }\n this.updateMaxReachedAfterEdge(edge);\n let lineCont: Task.Result<Vtree.NodeContext>;\n if (nodeContext.firstPseudo) {\n // possibly need to deal with :first-line and friends\n lineCont = this.processLineStyling(\n nodeContext,\n resNodeContext,\n checkPoints,\n );\n } else {\n lineCont = Task.newResult(resNodeContext);\n }\n lineCont.then((nodeContext) => {\n this.postLayoutBlock(nodeContext, checkPoints);\n if (checkPoints.length > 0) {\n this.saveBoxBreakPosition(checkPoints);\n\n // TODO: how to signal overflow in the last pagargaph???\n if (overflown && !this.isLoneImage(checkPoints) && nodeContext) {\n nodeContext = nodeContext.modify();\n nodeContext.overflow = true;\n }\n }\n frame.finish(nodeContext);\n });\n },\n );\n return frame.result();\n }\n\n postLayoutBlock(\n nodeContext: Vtree.NodeContext,\n checkPoints: Vtree.NodeContext[],\n ) {\n const hooks: Plugin.PostLayoutBlockHook[] = Plugin.getHooksForName(\n Plugin.HOOKS.POST_LAYOUT_BLOCK,\n );\n hooks.forEach((hook) => {\n hook(nodeContext, checkPoints, this);\n });\n }\n\n findEndOfLine(\n linePosition: number,\n checkPoints: Vtree.NodeContext[],\n isUpdateMaxReachedAfterEdge: boolean,\n ): {\n nodeContext: Vtree.NodeContext;\n index: number;\n checkPointIndex: number;\n } {\n if (VIVLIOSTYLE_DEBUG) {\n validateCheckPoints(checkPoints);\n }\n\n // Workaround for Blink not returning correct fractional values for\n // Range.getClientRects.\n // https://bugs.chromium.org/p/chromium/issues/detail?id=629828\n const effectiveLinePosition = this.vertical\n ? linePosition - 1\n : linePosition + 1;\n\n // find the first character which is out\n let lowCP = 0;\n let low = checkPoints[0].boxOffset;\n let low1 = lowCP;\n let highCP = checkPoints.length - 1;\n let high = checkPoints[highCP].boxOffset;\n let mid: number;\n while (low < high) {\n mid = low + Math.ceil((high - low) / 2);\n\n // find the node which contains mid index\n low1 = lowCP;\n let high1 = highCP;\n while (low1 < high1) {\n const mid1 = low1 + Math.ceil((high1 - low1) / 2);\n if (checkPoints[mid1].boxOffset > mid) {\n high1 = mid1 - 1;\n } else {\n low1 = mid1;\n }\n }\n const edge = this.calculateEdge(null, checkPoints, low1, mid);\n if (\n this.vertical\n ? edge <= effectiveLinePosition\n : edge >= effectiveLinePosition\n ) {\n high = mid - 1;\n while (checkPoints[low1].boxOffset == mid) {\n low1--;\n }\n highCP = low1;\n } else {\n if (isUpdateMaxReachedAfterEdge) {\n this.updateMaxReachedAfterEdge(edge);\n }\n low = mid;\n lowCP = low1;\n }\n }\n return {\n nodeContext: checkPoints[low1],\n index: low,\n checkPointIndex: low1,\n };\n }\n\n findAcceptableBreakInside(\n checkPoints: Vtree.NodeContext[],\n edgePosition: number,\n force: boolean,\n ): Vtree.NodeContext {\n const position = this.findEndOfLine(edgePosition, checkPoints, true);\n let nodeContext = position.nodeContext;\n const viewNode = nodeContext.viewNode;\n if (viewNode.nodeType != 1) {\n const textNode = viewNode as Text;\n const textNodeBreaker = this.resolveTextNodeBreaker(nodeContext);\n nodeContext = textNodeBreaker.breakTextNode(\n textNode,\n nodeContext,\n position.index,\n checkPoints,\n position.checkPointIndex,\n force,\n );\n }\n this.clearOverflownViewNodes(nodeContext, false);\n return nodeContext;\n }\n\n resolveTextNodeBreaker(nodeContext: Vtree.NodeContext): TextNodeBreaker {\n const hooks: Plugin.ResolveTextNodeBreakerHook[] = Plugin.getHooksForName(\n Plugin.HOOKS.RESOLVE_TEXT_NODE_BREAKER,\n );\n return hooks.reduce(\n (prev, hook) => hook(nodeContext) || prev,\n TextNodeBreaker.instance,\n );\n }\n\n /**\n * Read ranges skipping special elments\n */\n getRangeBoxes(start: Node, end: Node): Vtree.ClientRect[] {\n const arr = [];\n const range = start.ownerDocument.createRange();\n let wentUp = false;\n let node = start;\n let lastGood: Node = null;\n let haveStart = false;\n let endNotReached = true;\n while (endNotReached) {\n let seekRange = true;\n do {\n let next: Node = null;\n if (node == end) {\n if (end.nodeType === 1) {\n // If end is an element, continue traversing its children to find\n // the last text node inside it. Finish when end has no child or\n // when came back from its children (wentUp==true).\n endNotReached = !(!end.firstChild || wentUp);\n } else {\n endNotReached = false;\n }\n }\n if (node.nodeType != 1) {\n if (!haveStart) {\n range.setStartBefore(node);\n haveStart = true;\n }\n lastGood = node;\n } else if (wentUp) {\n wentUp = false;\n } else if (LayoutHelper.isSpecial(node as Element)) {\n // Skip special\n seekRange = !haveStart;\n } else if (\n (node as Element).localName == \"ruby\" ||\n isSpecialInlineDisplay(\n this.clientLayout.getElementComputedStyle(node as Element).display,\n )\n ) {\n // ruby, inline-block, etc.\n seekRange = !haveStart;\n if (seekRange) {\n range.setStartBefore(node);\n haveStart = true;\n lastGood = node;\n }\n if (node.contains(end)) {\n endNotReached = false;\n }\n } else {\n next = node.firstChild;\n }\n if (!next) {\n next = node.nextSibling;\n if (!next) {\n wentUp = true;\n next = node.parentNode;\n }\n }\n node = next;\n } while (seekRange && endNotReached);\n if (haveStart) {\n range.setEndAfter(lastGood);\n const boxList = this.clientLayout.getRangeClientRects(range);\n for (let i = 0; i < boxList.length; i++) {\n arr.push(boxList[i]);\n }\n haveStart = false;\n }\n }\n return arr;\n }\n\n /**\n * Give block's initial and final nodes, find positions of the line bottoms.\n * This is, of course, somewhat hacky implementation.\n * @return position of line breaks\n */\n findLinePositions(checkPoints: Vtree.NodeContext[]): number[] {\n const LOW_OVERLAP = 0.2;\n const MID_OVERLAP = 0.6;\n const positions = [];\n const boxes = this.getRangeBoxes(\n checkPoints[0].viewNode,\n checkPoints[checkPoints.length - 1].viewNode,\n );\n boxes.sort(\n this.vertical\n ? VtreeImpl.clientrectDecreasingRight\n : VtreeImpl.clientrectIncreasingTop,\n );\n let lineBefore = 0;\n let lineAfter = 0;\n let lineEnd = 0;\n let lineLength = 0;\n let i = 0;\n const dir = this.getBoxDir();\n while (true) {\n if (i < boxes.length) {\n const box = boxes[i];\n let overlap = 1;\n if (lineLength > 0) {\n const boxSize = Math.max(this.getBoxSize(box), 1);\n if (dir * this.getBeforeEdge(box) < dir * lineBefore) {\n overlap = (dir * (this.getAfterEdge(box) - lineBefore)) / boxSize;\n } else if (dir * this.getAfterEdge(box) > dir * lineAfter) {\n overlap = (dir * (lineAfter - this.getBeforeEdge(box))) / boxSize;\n } else {\n overlap = 1;\n }\n }\n if (\n lineLength == 0 ||\n overlap >= MID_OVERLAP ||\n (overlap >= LOW_OVERLAP && this.getStartEdge(box) >= lineEnd - 1)\n ) {\n lineEnd = this.getEndEdge(box);\n if (this.vertical) {\n lineBefore =\n lineLength == 0 ? box.right : Math.max(lineBefore, box.right);\n lineAfter =\n lineLength == 0 ? box.left : Math.min(lineAfter, box.left);\n } else {\n lineBefore =\n lineLength == 0 ? box.top : Math.min(lineBefore, box.top);\n lineAfter =\n lineLength == 0 ? box.bottom : Math.max(lineAfter, box.bottom);\n }\n lineLength++;\n i++;\n continue;\n }\n }\n\n // Add line\n if (lineLength > 0) {\n positions.push(lineAfter);\n lineLength = 0;\n }\n if (i >= boxes.length) {\n break;\n }\n }\n positions.sort(Base.numberCompare);\n if (this.vertical) {\n positions.reverse();\n }\n return positions;\n }\n\n calculateClonedPaddingBorder(nodeContext: Vtree.NodeContext): number {\n let clonedPaddingBorder = 0;\n nodeContext.walkUpBlocks((block) => {\n if (block.inheritedProps[\"box-decoration-break\"] === \"clone\") {\n Asserts.assert(block.viewNode instanceof Element);\n const paddingBorders = this.getComputedPaddingBorder(\n block.viewNode as Element,\n );\n clonedPaddingBorder += block.vertical\n ? -paddingBorders.left\n : paddingBorders.bottom;\n if (block.display === \"table\") {\n clonedPaddingBorder += block.blockBorderSpacing;\n }\n }\n });\n return clonedPaddingBorder;\n }\n\n private getOffsetByRepetitiveElements(\n bp?: BreakPosition.BreakPosition,\n ): number {\n let offset: { current: number; minimum: number };\n if (bp) {\n offset = bp.calculateOffset(this);\n } else {\n offset = BreakPosition.calculateOffset(\n null,\n this.collectElementsOffset(),\n );\n }\n return offset.current;\n }\n\n findBoxBreakPosition(\n bp: BoxBreakPosition,\n force: boolean,\n ): Vtree.NodeContext {\n const checkPoints = bp.checkPoints;\n let block = checkPoints[0];\n while (block.parent && block.inline) {\n block = block.parent;\n }\n let widows: number;\n let orphans: number;\n if (force) {\n // Last resort, ignore widows/orphans\n widows = 1;\n orphans = 1;\n } else {\n // Get widows/orphans settings from the block element\n widows = Math.max(\n ((block.inheritedProps[\"widows\"] as number) || 2) - 0,\n 1,\n );\n orphans = Math.max(\n ((block.inheritedProps[\"orphans\"] as number) || 2) - 0,\n 1,\n );\n }\n\n // In case of box-decoration-break: clone, width (or height in vertical\n // writing mode) of cloned paddings and borders should be taken into\n // account.\n const clonedPaddingBorder = this.calculateClonedPaddingBorder(block);\n\n // Select the first overflowing line break position\n const linePositions = this.findLinePositions(checkPoints);\n let edge = this.footnoteEdge - clonedPaddingBorder;\n const dir = this.getBoxDir();\n const repetitiveElementsOffset = this.getOffsetByRepetitiveElements(bp);\n edge -= dir * repetitiveElementsOffset;\n\n // If an \"overflowing\" checkpoint (e.g. not allowed by LayoutConstraint)\n // exists before the edge, a line containing the checkpoint should be\n // deferred to the next column.\n const firstOverflowing = this.findFirstOverflowingEdgeAndCheckPoint(\n checkPoints,\n );\n if (isNaN(firstOverflowing.edge)) {\n firstOverflowing.edge = dir * Infinity;\n }\n let lineIndex = Base.binarySearch(linePositions.length, (i) => {\n const p = linePositions[i];\n return this.vertical\n ? p < edge || p <= firstOverflowing.edge\n : p > edge || p >= firstOverflowing.edge;\n });\n\n // If no break point is found due to the \"overflowing\" checkpoint,\n // give up deferring a line containing the checkpoint and try to cut the\n // line just before it.\n const forceCutBeforeOverflowing = lineIndex <= 0;\n if (forceCutBeforeOverflowing) {\n lineIndex = Base.binarySearch(linePositions.length, (i) =>\n this.vertical ? linePositions[i] < edge : linePositions[i] > edge,\n );\n }\n\n // First edge after the one that both fits and satisfies widows constraint.\n lineIndex = Math.min(linePositions.length - widows, lineIndex);\n if (lineIndex < orphans) {\n // Not enough lines to satisfy orphans constraint, cannot break here.\n return null;\n }\n edge = linePositions[lineIndex - 1];\n let nodeContext: Vtree.NodeContext;\n if (forceCutBeforeOverflowing) {\n nodeContext = firstOverflowing.checkPoint;\n } else {\n nodeContext = this.findAcceptableBreakInside(bp.checkPoints, edge, force);\n }\n if (nodeContext) {\n // When line-height is small, the edge calculated above (using Range)\n // can be larger than the edge of the block container containing the text.\n // We update the edge by measuring the block edge.\n const blockEdge = this.getAfterEdgeOfBlockContainer(nodeContext);\n if (!isNaN(blockEdge) && blockEdge < edge) {\n edge = blockEdge;\n }\n this.computedBlockSize =\n dir * (edge - this.beforeEdge) + repetitiveElementsOffset;\n }\n return nodeContext;\n }\n\n getAfterEdgeOfBlockContainer(nodeContext: Vtree.NodeContext): number {\n let blockParent = nodeContext;\n do {\n blockParent = blockParent.parent;\n } while (blockParent && blockParent.inline);\n if (blockParent) {\n blockParent = blockParent.copy().modify();\n blockParent.after = true;\n return LayoutHelper.calculateEdge(\n blockParent,\n this.clientLayout,\n 0,\n this.vertical,\n );\n } else {\n return NaN;\n }\n }\n\n findFirstOverflowingEdgeAndCheckPoint(\n checkPoints: Vtree.NodeContext[],\n ): { edge: number; checkPoint: Vtree.NodeContext | null } {\n const index = checkPoints.findIndex((cp) => cp.overflow);\n if (index < 0) {\n return { edge: NaN, checkPoint: null };\n }\n const cp = checkPoints[index];\n return {\n edge: this.calculateEdge(null, checkPoints, index, cp.boxOffset),\n checkPoint: cp,\n };\n }\n\n findEdgeBreakPosition(\n bp: BreakPosition.EdgeBreakPosition,\n ): Vtree.NodeContext {\n this.computedBlockSize =\n bp.computedBlockSize + this.getOffsetByRepetitiveElements(bp);\n return bp.position;\n }\n\n /**\n * Finalize a line break.\n * @return holing true\n */\n finishBreak(\n nodeContext: Vtree.NodeContext,\n forceRemoveSelf: boolean,\n endOfColumn: boolean,\n ): Task.Result<boolean> {\n Asserts.assert(nodeContext.formattingContext);\n const layoutProcessor = new LayoutProcessor.LayoutProcessorResolver().find(\n nodeContext.formattingContext,\n );\n let result = layoutProcessor.finishBreak(\n this,\n nodeContext,\n forceRemoveSelf,\n endOfColumn,\n );\n if (!result) {\n result = LayoutProcessor.blockLayoutProcessor.finishBreak(\n this,\n nodeContext,\n forceRemoveSelf,\n endOfColumn,\n );\n }\n return result;\n }\n\n findAcceptableBreakPosition(): BreakPositionAndNodeContext {\n let bp: Layout.BreakPosition = null;\n let nodeContext: Vtree.NodeContext = null;\n let penalty = 0;\n let nextPenalty = 0;\n do {\n penalty = nextPenalty;\n nextPenalty = Number.MAX_VALUE;\n for (\n let i = this.breakPositions.length - 1;\n i >= 0 && !nodeContext;\n --i\n ) {\n bp = this.breakPositions[i];\n nodeContext = bp.findAcceptableBreak(this, penalty);\n const minPenalty = bp.getMinBreakPenalty();\n if (minPenalty > penalty) {\n nextPenalty = Math.min(nextPenalty, minPenalty);\n }\n }\n } while (\n // Don't need to find a non-optimal break position if\n // forceNonfitting=false\n nextPenalty > penalty &&\n !nodeContext &&\n this.forceNonfitting\n );\n return { breakPosition: nodeContext ? bp : null, nodeContext };\n }\n\n doFinishBreak(\n nodeContext: Vtree.NodeContext,\n overflownNodeContext: Vtree.NodeContext,\n initialNodeContext: Vtree.NodeContext,\n initialComputedBlockSize: number,\n ): Task.Result<Vtree.NodeContext> {\n if (\n this.pageFloatLayoutContext.isInvalidated() ||\n this.pageBreakType ||\n !overflownNodeContext\n ) {\n return Task.newResult(nodeContext);\n }\n const frame: Task.Frame<Vtree.NodeContext> = Task.newFrame(\"doFinishBreak\");\n let forceRemoveSelf = false;\n if (!nodeContext) {\n // Last resort\n if (this.forceNonfitting) {\n Logging.logger.warn(\"Could not find any page breaks?!!\");\n this.skipTailEdges(overflownNodeContext).then((nodeContext) => {\n if (nodeContext) {\n nodeContext = nodeContext.modify();\n nodeContext.overflow = false;\n this.finishBreak(nodeContext, forceRemoveSelf, true).then(() => {\n frame.finish(nodeContext);\n });\n } else {\n frame.finish(nodeContext);\n }\n });\n return frame.result();\n } else {\n nodeContext = initialNodeContext;\n forceRemoveSelf = true;\n this.computedBlockSize = initialComputedBlockSize;\n }\n }\n this.finishBreak(nodeContext, forceRemoveSelf, true).then(() => {\n frame.finish(nodeContext);\n });\n return frame.result();\n }\n\n /**\n * Determines if a page break is acceptable at this position\n */\n isBreakable(flowPosition: Vtree.NodeContext): boolean {\n if (flowPosition.after) {\n return true; // may be an empty block\n }\n switch (flowPosition.sourceNode.namespaceURI) {\n case Base.NS.SVG:\n return false;\n }\n return !flowPosition.flexContainer;\n }\n\n /**\n * Determines if an indent value is zero\n */\n zeroIndent(val: string | number): boolean {\n const s = val.toString();\n return s == \"\" || s == \"auto\" || !!s.match(/^0+(.0*)?[^0-9]/);\n }\n\n /**\n * @return true if overflows\n */\n checkOverflowAndSaveEdge(\n nodeContext: Vtree.NodeContext,\n trailingEdgeContexts: Vtree.NodeContext[],\n ): boolean {\n if (!nodeContext) {\n return false;\n }\n if (LayoutHelper.isOrphan(nodeContext.viewNode)) {\n return false;\n }\n let edge = LayoutHelper.calculateEdge(\n nodeContext,\n this.clientLayout,\n 0,\n this.vertical,\n );\n const offsets = BreakPosition.calculateOffset(\n nodeContext,\n this.collectElementsOffset(),\n );\n const overflown = this.isOverflown(\n edge + (this.vertical ? -1 : 1) * offsets.minimum,\n );\n if (\n this.isOverflown(edge + (this.vertical ? -1 : 1) * offsets.current) &&\n !this.nodeContextOverflowingDueToRepetitiveElements\n ) {\n this.nodeContextOverflowingDueToRepetitiveElements = nodeContext;\n } else if (trailingEdgeContexts) {\n // If the edge does not overflow add the trailing margin, which is\n // truncated to the remaining fragmentainer extent.\n const marginEdge =\n edge + this.getTrailingMarginEdgeAdjustment(trailingEdgeContexts);\n const footnoteEdge =\n this.footnoteEdge - this.getBoxDir() * offsets.current;\n edge = this.vertical\n ? Math.min(edge, Math.max(marginEdge, footnoteEdge))\n : Math.max(edge, Math.min(marginEdge, footnoteEdge));\n }\n this.updateMaxReachedAfterEdge(edge);\n return overflown;\n }\n\n /**\n * Save a possible page break position on a CSS block edge. Check if it\n * overflows.\n * @return true if overflows\n */\n checkOverflowAndSaveEdgeAndBreakPosition(\n nodeContext: Vtree.NodeContext,\n trailingEdgeContexts: Vtree.NodeContext[],\n saveEvenOverflown: boolean,\n breakAtTheEdge: string | null,\n ): boolean {\n if (!nodeContext) {\n return false;\n }\n if (LayoutHelper.isOrphan(nodeContext.viewNode)) {\n return false;\n }\n const overflown = this.checkOverflowAndSaveEdge(\n nodeContext,\n trailingEdgeContexts,\n );\n if (saveEvenOverflown || !overflown) {\n this.saveEdgeBreakPosition(nodeContext, breakAtTheEdge, overflown);\n }\n return overflown;\n }\n\n applyClearance(nodeContext: Vtree.NodeContext): boolean {\n if (!nodeContext.viewNode.parentNode) {\n // Cannot do ceralance for nodes without parents\n return false;\n }\n\n // measure where the edge of the element would be without clearance\n const margin = this.getComputedMargin(nodeContext.viewNode as Element);\n const spacer = nodeContext.viewNode.ownerDocument.createElement(\"div\");\n if (this.vertical) {\n spacer.style.bottom = \"0px\";\n spacer.style.width = \"1px\";\n spacer.style.marginRight = `${margin.right}px`;\n } else {\n spacer.style.right = \"0px\";\n spacer.style.height = \"1px\";\n spacer.style.marginTop = `${margin.top}px`;\n }\n nodeContext.viewNode.parentNode.insertBefore(spacer, nodeContext.viewNode);\n let spacerBox = this.clientLayout.getElementClientRect(spacer);\n const edge = this.getBeforeEdge(spacerBox);\n const dir = this.getBoxDir();\n const clear = nodeContext.clearSide;\n let clearEdge = -this.getBoxDir() * Infinity;\n if (clear === \"all\") {\n clearEdge = this.pageFloatLayoutContext.getPageFloatClearEdge(\n clear,\n this,\n );\n }\n switch (clear) {\n case \"left\":\n clearEdge = dir * Math.max(clearEdge * dir, this.leftFloatEdge * dir);\n break;\n case \"right\":\n clearEdge = dir * Math.max(clearEdge * dir, this.rightFloatEdge * dir);\n break;\n default:\n clearEdge =\n dir *\n Math.max(\n clearEdge * dir,\n Math.max(this.rightFloatEdge * dir, this.leftFloatEdge * dir),\n );\n }\n\n // edge holds the position where element border \"before\" edge will be\n // without clearance. clearEdge is the \"after\" edge of the float to clear.\n if (edge * dir >= clearEdge * dir) {\n // No need for clearance\n nodeContext.viewNode.parentNode.removeChild(spacer);\n return false;\n } else {\n // Need some clearance, determine how much. Add the clearance node,\n // measure its after edge and adjust after margin (required due to\n // possible margin collapse before clearance was introduced).\n const height = Math.max(1, (clearEdge - edge) * dir);\n if (this.vertical) {\n spacer.style.width = `${height}px`;\n } else {\n spacer.style.height = `${height}px`;\n }\n spacerBox = this.clientLayout.getElementClientRect(spacer);\n const afterEdge = this.getAfterEdge(spacerBox);\n if (this.vertical) {\n let wAdj = afterEdge + margin.right - clearEdge;\n if (wAdj > 0 == margin.right >= 0) {\n // In addition to collapsed portion\n wAdj += margin.right;\n }\n spacer.style.marginLeft = `${wAdj}px`;\n } else {\n let hAdj = clearEdge - (afterEdge + margin.top);\n if (hAdj > 0 == margin.top >= 0) {\n // In addition to collapsed portion\n hAdj += margin.top;\n }\n spacer.style.marginBottom = `${hAdj}px`;\n }\n nodeContext.clearSpacer = spacer;\n return true;\n }\n }\n\n isBFC(formattingContext: Vtree.FormattingContext): boolean {\n if (LayoutProcessor.isInstanceOfBlockFormattingContext(formattingContext)) {\n return true;\n }\n if (\n RepetitiveElement.isInstanceOfRepetitiveElementsOwnerFormattingContext(\n formattingContext,\n )\n ) {\n return true;\n }\n return false;\n }\n\n /**\n * Skips positions until either the start of unbreakable block or inline\n * content. Also sets breakBefore on the result combining break-before and\n * break-after properties from all elements that meet at the edge.\n */\n skipEdges(\n nodeContext: Vtree.NodeContext,\n leadingEdge: boolean,\n forcedBreakValue: string | null,\n ): Task.Result<Vtree.NodeContext> {\n const fc = nodeContext.after\n ? nodeContext.parent && nodeContext.parent.formattingContext\n : nodeContext.formattingContext;\n if (fc && !this.isBFC(fc)) {\n return Task.newResult(nodeContext);\n }\n const frame: Task.Frame<Vtree.NodeContext> = Task.newFrame(\"skipEdges\");\n\n // If a forced break occurred at the end of the previous column,\n // nodeContext.after should be false.\n let atUnforcedBreak =\n !forcedBreakValue && leadingEdge && nodeContext && nodeContext.after;\n let breakAtTheEdge = forcedBreakValue;\n let lastAfterNodeContext: Vtree.NodeContext = null;\n let leadingEdgeContexts: Vtree.NodeContext[] = [];\n let trailingEdgeContexts: Vtree.NodeContext[] = [];\n let onStartEdges = false;\n\n function needForcedBreak() {\n // leadingEdge=true means that we are at the beginning of the new column\n // and hence must avoid a break (Otherwise leading to an infinite loop)\n return (\n !!forcedBreakValue ||\n (!leadingEdge && Break.isForcedBreakValue(breakAtTheEdge))\n );\n }\n\n const processForcedBreak = () => {\n nodeContext = leadingEdgeContexts[0] || nodeContext;\n nodeContext.viewNode.parentNode.removeChild(nodeContext.viewNode);\n this.pageBreakType = breakAtTheEdge;\n };\n\n frame\n .loopWithFrame((loopFrame) => {\n while (nodeContext) {\n Asserts.assert(nodeContext.formattingContext);\n const layoutProcessor = new LayoutProcessor.LayoutProcessorResolver().find(\n nodeContext.formattingContext,\n );\n\n // A code block to be able to use break. Break moves to the next\n // node position.\n do {\n if (!nodeContext.viewNode) {\n // Non-displayable content, skip\n break;\n }\n if (nodeContext.inline && nodeContext.viewNode.nodeType != 1) {\n if (\n VtreeImpl.canIgnore(\n nodeContext.viewNode,\n nodeContext.whitespace,\n )\n ) {\n // Ignorable text content, skip\n break;\n }\n if (!nodeContext.after) {\n // Leading edge of non-empty block -> finished going through\n // all starting edges of the box\n if (needForcedBreak()) {\n processForcedBreak();\n } else if (\n this.checkOverflowAndSaveEdgeAndBreakPosition(\n lastAfterNodeContext,\n null,\n true,\n breakAtTheEdge,\n )\n ) {\n nodeContext = (this.stopAtOverflow\n ? lastAfterNodeContext || nodeContext\n : nodeContext\n ).modify();\n nodeContext.overflow = true;\n } else {\n nodeContext = nodeContext.modify();\n nodeContext.breakBefore = breakAtTheEdge;\n }\n loopFrame.breakLoop();\n return;\n }\n }\n if (!nodeContext.after) {\n if (layoutProcessor) {\n if (layoutProcessor.startNonInlineElementNode(nodeContext)) {\n break;\n }\n }\n if (nodeContext.clearSide) {\n // clear\n if (\n this.applyClearance(nodeContext) &&\n leadingEdge &&\n this.breakPositions.length === 0\n ) {\n this.saveEdgeBreakPosition(\n nodeContext.copy(),\n breakAtTheEdge,\n false,\n );\n }\n }\n if (\n !this.isBFC(nodeContext.formattingContext) ||\n RepetitiveElement.isInstanceOfRepetitiveElementsOwnerFormattingContext(\n nodeContext.formattingContext,\n ) ||\n this.isFloatNodeContext(nodeContext) ||\n nodeContext.flexContainer\n ) {\n // new formatting context, or float or flex container\n // (unbreakable)\n leadingEdgeContexts.push(nodeContext.copy());\n breakAtTheEdge = Break.resolveEffectiveBreakValue(\n breakAtTheEdge,\n nodeContext.breakBefore,\n );\n\n // check if a forced break must occur before the block.\n if (needForcedBreak()) {\n processForcedBreak();\n } else if (\n this.checkOverflowAndSaveEdgeAndBreakPosition(\n lastAfterNodeContext,\n null,\n true,\n breakAtTheEdge,\n ) ||\n !this.layoutConstraint.allowLayout(nodeContext)\n ) {\n // overflow\n nodeContext = (this.stopAtOverflow\n ? lastAfterNodeContext || nodeContext\n : nodeContext\n ).modify();\n nodeContext.overflow = true;\n }\n loopFrame.breakLoop();\n return;\n }\n }\n if (nodeContext.viewNode.nodeType != 1) {\n // not an element\n break;\n }\n const style = (nodeContext.viewNode as HTMLElement).style;\n if (nodeContext.after) {\n // Skip an empty inline box at the start of a block\n // (An anonymous block consisting entirely of\n // collapsible white space is removed from the rendering tree)\n if (nodeContext.inline) {\n break;\n }\n if (layoutProcessor) {\n if (\n layoutProcessor.afterNonInlineElementNode(\n nodeContext,\n this.stopAtOverflow,\n )\n ) {\n break;\n }\n }\n\n // Trailing edge\n if (onStartEdges) {\n // finished going through all starting edges of the box.\n // check if a forced break must occur before the block.\n if (needForcedBreak()) {\n processForcedBreak();\n loopFrame.breakLoop();\n return;\n }\n\n // since a break did not occur, move to the next edge. this\n // edge is no longer the leading edge.\n leadingEdgeContexts = [];\n leadingEdge = false;\n atUnforcedBreak = false;\n breakAtTheEdge = null;\n }\n onStartEdges = false; // we are now on end edges.\n lastAfterNodeContext = nodeContext.copy();\n trailingEdgeContexts.push(lastAfterNodeContext);\n breakAtTheEdge = Break.resolveEffectiveBreakValue(\n breakAtTheEdge,\n nodeContext.breakAfter,\n );\n if (\n style &&\n !(\n this.zeroIndent(style.paddingBottom) &&\n this.zeroIndent(style.borderBottomWidth)\n )\n ) {\n // Non-zero trailing inset.\n // Margins don't collapse across non-zero borders and\n // paddings.\n trailingEdgeContexts = [lastAfterNodeContext];\n }\n } else {\n // Leading edge\n leadingEdgeContexts.push(nodeContext.copy());\n breakAtTheEdge = Break.resolveEffectiveBreakValue(\n breakAtTheEdge,\n nodeContext.breakBefore,\n );\n if (!this.layoutConstraint.allowLayout(nodeContext)) {\n this.checkOverflowAndSaveEdgeAndBreakPosition(\n lastAfterNodeContext,\n null,\n !this.stopAtOverflow,\n breakAtTheEdge,\n );\n nodeContext = nodeContext.modify();\n nodeContext.overflow = true;\n if (this.stopAtOverflow) {\n loopFrame.breakLoop();\n return;\n }\n }\n const viewTag = (nodeContext.viewNode as Element).localName;\n if (mediaTags[viewTag]) {\n // elements that have inherent content\n // check if a forced break must occur before the block.\n if (needForcedBreak()) {\n processForcedBreak();\n } else if (\n this.checkOverflowAndSaveEdgeAndBreakPosition(\n lastAfterNodeContext,\n null,\n true,\n breakAtTheEdge,\n )\n ) {\n // overflow\n nodeContext = (this.stopAtOverflow\n ? lastAfterNodeContext || nodeContext\n : nodeContext\n ).modify();\n nodeContext.overflow = true;\n }\n loopFrame.breakLoop();\n return;\n }\n if (\n style &&\n !(\n this.zeroIndent(style.paddingTop) &&\n this.zeroIndent(style.borderTopWidth)\n )\n ) {\n // Non-zero leading inset\n atUnforcedBreak = false;\n trailingEdgeContexts = [];\n }\n onStartEdges = true; // we are now on starting edges.\n }\n } while (false); // End of block of code to use break\n\n const nextResult = this.nextInTree(nodeContext, atUnforcedBreak);\n if (nextResult.isPending()) {\n nextResult.then((nodeContextParam) => {\n nodeContext = nodeContextParam;\n loopFrame.continueLoop();\n });\n return;\n } else {\n nodeContext = nextResult.get();\n }\n }\n\n if (\n this.checkOverflowAndSaveEdgeAndBreakPosition(\n lastAfterNodeContext,\n trailingEdgeContexts,\n !this.stopAtOverflow,\n breakAtTheEdge,\n )\n ) {\n if (lastAfterNodeContext && this.stopAtOverflow) {\n nodeContext = lastAfterNodeContext.modify();\n nodeContext.overflow = true;\n } else {\n // TODO: what to return here??\n }\n } else if (Break.isForcedBreakValue(breakAtTheEdge)) {\n this.pageBreakType = breakAtTheEdge;\n }\n loopFrame.breakLoop();\n })\n .then(() => {\n if (lastAfterNodeContext) {\n this.lastAfterPosition = lastAfterNodeContext.toNodePosition();\n }\n frame.finish(nodeContext);\n });\n return frame.result();\n }\n\n /**\n * Skips non-renderable positions until it hits the end of the flow or some\n * renderable content. Returns the nodeContext that was passed in if some\n * content remains and null if all content could be skipped.\n */\n skipTailEdges(\n nodeContext: Vtree.NodeContext,\n ): Task.Result<Vtree.NodeContext> {\n let resultNodeContext = nodeContext.copy();\n const frame: Task.Frame<Vtree.NodeContext> = Task.newFrame(\"skipEdges\");\n let breakAtTheEdge: string | null = null;\n let onStartEdges = false;\n frame\n .loopWithFrame((loopFrame) => {\n while (nodeContext) {\n // A code block to be able to use break. Break moves to the next\n // node position.\n do {\n if (!nodeContext.viewNode) {\n // Non-displayable content, skip\n break;\n }\n if (nodeContext.inline && nodeContext.viewNode.nodeType != 1) {\n if (\n VtreeImpl.canIgnore(\n nodeContext.viewNode,\n nodeContext.whitespace,\n )\n ) {\n // Ignorable text content, skip\n break;\n }\n if (!nodeContext.after) {\n // Leading edge of non-empty block -> finished going through\n // all starting edges of the box\n if (Break.isForcedBreakValue(breakAtTheEdge)) {\n this.pageBreakType = breakAtTheEdge;\n }\n loopFrame.breakLoop();\n return;\n }\n }\n if (!nodeContext.after) {\n if (\n this.isFloatNodeContext(nodeContext) ||\n nodeContext.flexContainer\n ) {\n // float or flex container (unbreakable)\n breakAtTheEdge = Break.resolveEffectiveBreakValue(\n breakAtTheEdge,\n nodeContext.breakBefore,\n );\n\n // check if a forced break must occur before the block.\n if (Break.isForcedBreakValue(breakAtTheEdge)) {\n this.pageBreakType = breakAtTheEdge;\n }\n loopFrame.breakLoop();\n return;\n }\n }\n if (nodeContext.viewNode.nodeType != 1) {\n // not an element\n break;\n }\n const style = (nodeContext.viewNode as HTMLElement).style;\n if (nodeContext.after) {\n // Trailing edge\n if (onStartEdges) {\n // finished going through all starting edges of the box.\n // check if a forced break must occur before the block.\n if (Break.isForcedBreakValue(breakAtTheEdge)) {\n this.pageBreakType = breakAtTheEdge;\n loopFrame.breakLoop();\n return;\n }\n\n // since a break did not occur, move to the next edge.\n breakAtTheEdge = null;\n }\n onStartEdges = false; // we are now on end edges.\n breakAtTheEdge = Break.resolveEffectiveBreakValue(\n breakAtTheEdge,\n nodeContext.breakAfter,\n );\n } else {\n // Leading edge\n breakAtTheEdge = Break.resolveEffectiveBreakValue(\n breakAtTheEdge,\n nodeContext.breakBefore,\n );\n const viewTag = (nodeContext.viewNode as Element).localName;\n if (mediaTags[viewTag]) {\n // elements that have inherent content\n // check if a forced break must occur before the block.\n if (Break.isForcedBreakValue(breakAtTheEdge)) {\n this.pageBreakType = breakAtTheEdge;\n }\n loopFrame.breakLoop();\n return;\n }\n if (\n style &&\n !(\n this.zeroIndent(style.paddingTop) &&\n this.zeroIndent(style.borderTopWidth)\n )\n ) {\n // Non-zero leading inset\n loopFrame.breakLoop();\n return;\n }\n }\n onStartEdges = true; // we are now on starting edges.\n } while (false); // End of block of code to use break\n\n const nextResult = this.layoutContext.nextInTree(nodeContext);\n if (nextResult.isPending()) {\n nextResult.then((nodeContextParam) => {\n nodeContext = nodeContextParam;\n loopFrame.continueLoop();\n });\n return;\n } else {\n nodeContext = nextResult.get();\n }\n }\n resultNodeContext = null;\n loopFrame.breakLoop();\n })\n .then(() => {\n frame.finish(resultNodeContext);\n });\n return frame.result();\n }\n\n layoutFloatOrFootnote(\n nodeContext: Vtree.NodeContext,\n ): Task.Result<Vtree.NodeContext> {\n if (\n PageFloats.isPageFloat(nodeContext.floatReference) ||\n nodeContext.floatSide === \"footnote\"\n ) {\n return this.layoutPageFloat(nodeContext);\n } else {\n return this.layoutFloat(nodeContext);\n }\n }\n\n /**\n * Layout next portion of the source.\n */\n layoutNext(\n nodeContext: Vtree.NodeContext,\n leadingEdge: boolean,\n forcedBreakValue?: string | null,\n ): Task.Result<Vtree.NodeContext> {\n const frame: Task.Frame<Vtree.NodeContext> = Task.newFrame(\"layoutNext\");\n this.skipEdges(nodeContext, leadingEdge, forcedBreakValue || null).then(\n (nodeContextParam) => {\n nodeContext = nodeContextParam as Vtree.NodeContext;\n if (\n !nodeContext ||\n this.pageBreakType ||\n this.stopByOverflow(nodeContext)\n ) {\n // finished all content, explicit page break or overflow (automatic\n // page break)\n frame.finish(nodeContext);\n } else {\n const formattingContext = nodeContext.formattingContext;\n Asserts.assert(formattingContext);\n const layoutProcessor = new LayoutProcessor.LayoutProcessorResolver().find(\n formattingContext,\n );\n layoutProcessor\n .layout(nodeContext, this, leadingEdge)\n .thenFinish(frame);\n }\n },\n );\n return frame.result();\n }\n\n clearOverflownViewNodes(\n nodeContext: Vtree.NodeContext,\n removeSelf: boolean,\n ): void {\n if (!nodeContext) {\n return;\n }\n for (\n let parent = nodeContext.parent;\n nodeContext;\n nodeContext = parent, parent = parent ? parent.parent : null\n ) {\n const formattingContext = (parent || nodeContext).formattingContext;\n Asserts.assert(formattingContext);\n const layoutProcessor = new LayoutProcessor.LayoutProcessorResolver().find(\n formattingContext,\n );\n layoutProcessor.clearOverflownViewNodes(\n this,\n parent,\n nodeContext,\n removeSelf,\n );\n removeSelf = false;\n }\n }\n\n initGeom(): void {\n // TODO: we should be able to avoid querying the layout engine at this\n // point. Create an element that fills the content area and query its size.\n // Calling getElementClientRect on the container element includes element\n // padding which is wrong for our purposes.\n const probe = this.element.ownerDocument.createElement(\n \"div\",\n ) as HTMLElement;\n probe.style.position = \"absolute\";\n probe.style.top = `${this.paddingTop}px`;\n probe.style.right = `${this.paddingRight}px`;\n probe.style.bottom = `${this.paddingBottom}px`;\n probe.style.left = `${this.paddingLeft}px`;\n this.element.appendChild(probe);\n const columnBBox = this.clientLayout.getElementClientRect(probe);\n this.element.removeChild(probe);\n const offsetX = this.originX + this.left + this.getInsetLeft();\n const offsetY = this.originY + this.top + this.getInsetTop();\n this.box = new GeometryUtil.Rect(\n offsetX,\n offsetY,\n offsetX + this.width,\n offsetY + this.height,\n );\n this.startEdge = columnBBox\n ? this.vertical\n ? columnBBox.top\n : columnBBox.left\n : 0;\n this.endEdge = columnBBox\n ? this.vertical\n ? columnBBox.bottom\n : columnBBox.right\n : 0;\n this.beforeEdge = columnBBox\n ? this.vertical\n ? columnBBox.right\n : columnBBox.top\n : 0;\n this.afterEdge = columnBBox\n ? this.vertical\n ? columnBBox.left\n : columnBBox.bottom\n : 0;\n this.leftFloatEdge = this.beforeEdge;\n this.rightFloatEdge = this.beforeEdge;\n this.bottommostFloatTop = this.beforeEdge;\n this.footnoteEdge = this.afterEdge;\n this.bands = GeometryUtil.shapesToBands(\n this.box,\n [this.getInnerShape()],\n this.getExclusions(),\n 8,\n this.snapHeight,\n this.vertical,\n );\n this.createFloats();\n }\n\n init(): void {\n this.chunkPositions = [];\n Base.setCSSProperty(this.element, \"width\", `${this.width}px`);\n Base.setCSSProperty(this.element, \"height\", `${this.height}px`);\n this.initGeom();\n this.computedBlockSize = 0;\n this.overflown = false;\n this.pageBreakType = null;\n this.lastAfterPosition = null;\n }\n\n /**\n * Save the potential breaking position at the edge. Should, in general, save\n * \"after\" position but only after skipping all of the \"before\" ones and\n * getting to the non-empty content (to get breakAtEdge right).\n */\n saveEdgeBreakPosition(\n position: Vtree.NodeContext,\n breakAtEdge: string | null,\n overflows: boolean,\n ): void {\n Asserts.assert(position.formattingContext);\n const copy = position.copy();\n const layoutProcessor = new LayoutProcessor.LayoutProcessorResolver().find(\n position.formattingContext,\n );\n const clonedPaddingBorder = this.calculateClonedPaddingBorder(copy);\n const bp = layoutProcessor.createEdgeBreakPosition(\n copy,\n breakAtEdge,\n overflows,\n this.computedBlockSize + clonedPaddingBorder,\n );\n this.breakPositions.push(bp);\n }\n\n /**\n * @param checkPoints array of breaking points for breakable block\n */\n saveBoxBreakPosition(checkPoints: Vtree.NodeContext[]): void {\n const penalty = checkPoints[0].breakPenalty;\n const bp = new BoxBreakPosition(checkPoints, penalty);\n this.breakPositions.push(bp);\n }\n\n updateMaxReachedAfterEdge(afterEdge: number) {\n if (!isNaN(afterEdge)) {\n const size = this.getBoxDir() * (afterEdge - this.beforeEdge);\n this.computedBlockSize = Math.max(size, this.computedBlockSize);\n }\n }\n\n /**\n * @param chunkPosition starting position.\n * @return holding end position.\n */\n layout(\n chunkPosition: Vtree.ChunkPosition,\n leadingEdge: boolean,\n breakAfter?: string | null,\n ): Task.Result<Vtree.ChunkPosition> {\n this.chunkPositions.push(chunkPosition); // So we can re-layout this column later\n if (chunkPosition.primary.after) {\n this.lastAfterPosition = chunkPosition.primary;\n }\n if (this.stopAtOverflow && this.overflown) {\n return Task.newResult(chunkPosition as Vtree.ChunkPosition);\n }\n if (this.isFullWithPageFloats()) {\n if (\n chunkPosition.primary.after &&\n chunkPosition.primary.steps.length === 1\n ) {\n // End of contents\n return Task.newResult(null as Vtree.ChunkPosition);\n } else {\n return Task.newResult(chunkPosition as Vtree.ChunkPosition);\n }\n }\n const frame: Task.Frame<Vtree.ChunkPosition> = Task.newFrame(\"layout\");\n\n // ------ start the column -----------\n this.openAllViews(chunkPosition.primary).then((nodeContext) => {\n let initialNodeContext: Vtree.NodeContext = null;\n if (nodeContext.viewNode) {\n initialNodeContext = nodeContext.copy();\n } else {\n const nextInTreeListener = (evt) => {\n if (evt.nodeContext.viewNode) {\n initialNodeContext = evt.nodeContext;\n this.layoutContext.removeEventListener(\n \"nextInTree\",\n nextInTreeListener,\n );\n }\n };\n this.layoutContext.addEventListener(\"nextInTree\", nextInTreeListener);\n }\n const retryer = new ColumnLayoutRetryer(leadingEdge, breakAfter);\n retryer.layout(nodeContext, this).then((nodeContextParam) => {\n this.doFinishBreak(\n nodeContextParam,\n retryer.context.overflownNodeContext,\n initialNodeContext,\n retryer.initialComputedBlockSize,\n ).then((positionAfter) => {\n let cont: Task.Result<boolean> = null;\n if (!this.pseudoParent) {\n cont = this.doFinishBreakOfFragmentLayoutConstraints(positionAfter);\n } else {\n cont = Task.newResult(null);\n }\n cont.then(() => {\n if (this.pageFloatLayoutContext.isInvalidated()) {\n frame.finish(null);\n return;\n }\n if (!positionAfter) {\n frame.finish(null);\n } else {\n this.overflown = true;\n const result = new VtreeImpl.ChunkPosition(\n positionAfter.toNodePosition(),\n );\n frame.finish(result);\n }\n });\n });\n });\n });\n return frame.result();\n }\n\n isFullWithPageFloats(): boolean {\n return this.pageFloatLayoutContext.isColumnFullWithPageFloats(this);\n }\n\n getMaxBlockSizeOfPageFloats(): number {\n return this.pageFloatLayoutContext.getMaxBlockSizeOfPageFloats();\n }\n\n doFinishBreakOfFragmentLayoutConstraints(\n nodeContext: Vtree.NodeContext,\n ): Task.Result<boolean> {\n const frame: Task.Frame<boolean> = Task.newFrame(\n \"doFinishBreakOfFragmentLayoutConstraints\",\n );\n const sortedFragmentLayoutConstraints = [].concat(\n this.fragmentLayoutConstraints,\n );\n sortedFragmentLayoutConstraints.sort(\n (a, b) => a.getPriorityOfFinishBreak() - b.getPriorityOfFinishBreak(),\n );\n let i = 0;\n frame\n .loop(() => {\n if (i < sortedFragmentLayoutConstraints.length) {\n const result = sortedFragmentLayoutConstraints[i++].finishBreak(\n nodeContext,\n this,\n );\n return result.thenReturn(true);\n } else {\n return Task.newResult(false);\n }\n })\n .then(() => {\n frame.finish(true);\n });\n return frame.result();\n }\n\n /**\n * @param nodeContext starting position.\n * @return holding end position.\n */\n doLayout(\n nodeContext: Vtree.NodeContext,\n leadingEdge: boolean,\n breakAfter?: string | null,\n ): Task.Result<{\n nodeContext: Vtree.NodeContext;\n overflownNodeContext: Vtree.NodeContext;\n }> {\n const frame: Task.Frame<{\n nodeContext: Vtree.NodeContext;\n overflownNodeContext: Vtree.NodeContext;\n }> = Task.newFrame(\"doLayout\");\n let overflownNodeContext: Vtree.NodeContext = null;\n\n // ------ init backtracking list -----\n this.breakPositions = [];\n this.nodeContextOverflowingDueToRepetitiveElements = null;\n\n // ------- fill the column -------------\n frame\n .loopWithFrame((loopFrame) => {\n while (nodeContext) {\n // fill a single block\n let pending = true;\n this.layoutNext(nodeContext, leadingEdge, breakAfter || null).then(\n (nodeContextParam) => {\n leadingEdge = false;\n breakAfter = null;\n if (\n this.nodeContextOverflowingDueToRepetitiveElements &&\n this.stopAtOverflow\n ) {\n this.pageBreakType = null;\n nodeContext = this\n .nodeContextOverflowingDueToRepetitiveElements;\n nodeContext.overflow = true;\n } else {\n nodeContext = nodeContextParam;\n }\n if (this.pageFloatLayoutContext.isInvalidated()) {\n loopFrame.breakLoop();\n } else if (this.pageBreakType) {\n // explicit page break\n loopFrame.breakLoop(); // Loop end\n } else if (nodeContext && this.stopByOverflow(nodeContext)) {\n // overflow (implicit page break): back up and find a\n // page break\n overflownNodeContext = nodeContext;\n const bp = this.findAcceptableBreakPosition();\n nodeContext = bp.nodeContext;\n if (bp.breakPosition) {\n bp.breakPosition.breakPositionChosen(this);\n }\n loopFrame.breakLoop(); // Loop end\n } else {\n if (pending) {\n // Sync case\n pending = false;\n } else {\n // Async case\n loopFrame.continueLoop();\n }\n }\n },\n );\n if (pending) {\n // Async case and loop end\n pending = false;\n return;\n }\n }\n\n // Sync case\n this.computedBlockSize += this.getOffsetByRepetitiveElements();\n loopFrame.breakLoop();\n })\n .then(() => {\n frame.finish({ nodeContext, overflownNodeContext });\n });\n return frame.result();\n }\n\n /**\n * Re-layout already laid-out chunks. Return the position of the last flow if\n * there is an overflow.\n * TODO: deal with chunks that did not fit at all.\n * @return holding end position.\n */\n redoLayout(): Task.Result<Vtree.ChunkPosition> {\n const chunkPositions = this.chunkPositions;\n let last: Node = this.element.lastChild;\n while (last != this.last) {\n const prev = last.previousSibling;\n if (\n !(\n this.element === last.parentNode &&\n (this.layoutContext as Vgen.ViewFactory).isPseudoelement(last)\n )\n ) {\n this.element.removeChild(last);\n }\n last = prev;\n }\n this.killFloats();\n this.init();\n const frame: Task.Frame<Vtree.ChunkPosition> = Task.newFrame(\"redoLayout\");\n let i = 0;\n let res: Vtree.ChunkPosition = null;\n let leadingEdge = true;\n frame\n .loopWithFrame((loopFrame) => {\n if (i < chunkPositions.length) {\n const chunkPosition = chunkPositions[i++];\n this.layout(chunkPosition, leadingEdge).then((pos) => {\n leadingEdge = false;\n if (pos) {\n res = pos;\n loopFrame.breakLoop();\n } else {\n loopFrame.continueLoop();\n }\n });\n return;\n }\n loopFrame.breakLoop();\n })\n .then(() => {\n frame.finish(res);\n });\n return frame.result();\n }\n\n saveDistanceToBlockEndFloats() {\n const blockStartEdgeOfBlockEndFloats = this.pageFloatLayoutContext.getBlockStartEdgeOfBlockEndFloats();\n if (\n blockStartEdgeOfBlockEndFloats > 0 &&\n isFinite(blockStartEdgeOfBlockEndFloats)\n ) {\n this.blockDistanceToBlockEndFloats =\n this.getBoxDir() *\n (blockStartEdgeOfBlockEndFloats -\n this.beforeEdge -\n this.computedBlockSize);\n }\n }\n\n collectElementsOffset(): RepetitiveElement.ElementsOffset[] {\n const repetitiveElements: RepetitiveElement.ElementsOffset[] = [];\n for (let current: Column = this; current; current = current.pseudoParent) {\n current.fragmentLayoutConstraints.forEach((constraint) => {\n if (\n RepetitiveElement.isInstanceOfRepetitiveElementsOwnerLayoutConstraint(\n constraint,\n )\n ) {\n const repetitiveElement = constraint.getRepetitiveElements();\n repetitiveElements.push(repetitiveElement);\n }\n if (\n Selectors.isInstanceOfAfterIfContinuesLayoutConstraint(constraint)\n ) {\n const repetitiveElement = constraint.getRepetitiveElements();\n repetitiveElements.push(repetitiveElement);\n }\n if (Table.isInstanceOfTableRowLayoutConstraint(constraint)) {\n constraint\n .getElementsOffsetsForTableCell(this)\n .forEach((repetitiveElement) => {\n repetitiveElements.push(repetitiveElement);\n });\n }\n });\n }\n return repetitiveElements;\n }\n}\n\n/**\n * Represents a \"pseudo\"-column nested inside a real column.\n * This class is created to handle parallel fragmented flows (e.g. table columns\n * in a single table row). A pseudo-column behaves in the same way as the\n * original column, sharing its properties. Property changes on the\n * pseudo-column are not propagated to the original column. The LayoutContext of\n * the original column is also cloned and used by the pseudo-column, not to\n * propagate state changes of the LayoutContext caused by the pseudo-column.\n * @param column The original (parent) column\n * @param viewRoot Root element for the pseudo-column, i.e., the root of the\n * fragmented flow.\n * @param parentNodeContext A NodeContext generating this PseudoColumn\n */\nexport class PseudoColumn {\n startNodeContexts: Vtree.NodeContext[] = [];\n private column: Layout.Column;\n constructor(\n column: Layout.Column,\n viewRoot: Element,\n parentNodeContext: Vtree.NodeContext,\n ) {\n this.column = Object.create(column) as Layout.Column;\n this.column.element = viewRoot;\n this.column.layoutContext = column.layoutContext.clone();\n this.column.stopAtOverflow = false;\n this.column.flowRootFormattingContext = parentNodeContext.formattingContext;\n this.column.pseudoParent = column;\n const parentClonedPaddingBorder = this.column.calculateClonedPaddingBorder(\n parentNodeContext,\n );\n this.column.footnoteEdge =\n this.column.footnoteEdge - parentClonedPaddingBorder;\n const pseudoColumn = this;\n this.column.openAllViews = function (position) {\n return Column.prototype.openAllViews\n .call(this, position)\n .thenAsync((result) => {\n pseudoColumn.startNodeContexts.push(result.copy());\n return Task.newResult(result);\n });\n };\n }\n /**\n * @param chunkPosition starting position.\n * @return holding end position.\n */\n layout(\n chunkPosition: Vtree.ChunkPosition,\n leadingEdge: boolean,\n ): Task.Result<Vtree.ChunkPosition> {\n return this.column.layout(chunkPosition, leadingEdge);\n }\n findAcceptableBreakPosition(\n allowBreakAtStartPosition: boolean,\n ): Layout.BreakPositionAndNodeContext {\n const p = this.column.findAcceptableBreakPosition();\n if (allowBreakAtStartPosition) {\n const startNodeContext = this.startNodeContexts[0].copy();\n const bp = new BreakPosition.EdgeBreakPosition(\n startNodeContext,\n null,\n startNodeContext.overflow,\n 0,\n );\n bp.findAcceptableBreak(this.column, 0);\n if (!p.nodeContext) {\n return { breakPosition: bp, nodeContext: startNodeContext };\n }\n }\n return p;\n }\n /**\n * @return holing true\n */\n finishBreak(\n nodeContext: Vtree.NodeContext,\n forceRemoveSelf: boolean,\n endOfColumn: boolean,\n ): Task.Result<boolean> {\n return this.column.finishBreak(nodeContext, forceRemoveSelf, endOfColumn);\n }\n doFinishBreakOfFragmentLayoutConstraints(positionAfter: Vtree.NodeContext) {\n this.column.doFinishBreakOfFragmentLayoutConstraints(positionAfter);\n }\n isStartNodeContext(nodeContext: Vtree.NodeContext): boolean {\n const startNodeContext = this.startNodeContexts[0];\n return (\n startNodeContext.viewNode === nodeContext.viewNode &&\n startNodeContext.after === nodeContext.after &&\n startNodeContext.offsetInNode === nodeContext.offsetInNode\n );\n }\n isLastAfterNodeContext(nodeContext: Vtree.NodeContext): boolean {\n return VtreeImpl.isSameNodePosition(\n nodeContext.toNodePosition(),\n this.column.lastAfterPosition,\n );\n }\n getColumnElement(): Element {\n return this.column.element;\n }\n getColumn(): Layout.Column {\n return this.column;\n }\n}\n\nexport type SinglePageFloatLayoutResult = Layout.SinglePageFloatLayoutResult;\n\nexport function fixJustificationOnHyphen(\n nodeContext: Vtree.NodeContext,\n insertAfter: boolean,\n node: Node,\n insertionPoint: Node,\n): void {\n if (Base.checkSoftWrapOpportunityAfterHyphenBug(document.body)) {\n const hyphenChar = resolveHyphenateCharacter(nodeContext);\n const prevSibling = insertAfter ? node : node.previousSibling;\n const prevText = prevSibling ? prevSibling.textContent : \"\";\n if (prevText.charAt(prevText.length - 1) === hyphenChar) {\n const doc = node.ownerDocument;\n const parent = node.parentNode;\n if (Base.checkSoftWrapOpportunityByWbrBug(document.body)) {\n // For IE\n parent.insertBefore(doc.createTextNode(\" \"), insertionPoint);\n } else {\n // For Edge\n parent.insertBefore(doc.createElement(\"wbr\"), insertionPoint);\n }\n }\n }\n}\n\n/**\n * breaking point resolver for Text Node.\n */\nexport class TextNodeBreaker implements Layout.TextNodeBreaker {\n breakTextNode(\n textNode: Text,\n nodeContext: Vtree.NodeContext,\n low: number,\n checkPoints: Vtree.NodeContext[],\n checkpointIndex: number,\n force: boolean,\n ): Vtree.NodeContext {\n if (nodeContext.after) {\n nodeContext.offsetInNode = textNode.length;\n } else {\n // Character with index low is the last one that fits.\n let viewIndex = low - nodeContext.boxOffset;\n const text = textNode.data;\n if (text.charCodeAt(viewIndex) == 173) {\n viewIndex = this.breakAfterSoftHyphen(\n textNode,\n text,\n viewIndex,\n nodeContext,\n );\n } else {\n viewIndex = this.breakAfterOtherCharacter(\n textNode,\n text,\n viewIndex,\n nodeContext,\n );\n }\n if (viewIndex > 0) {\n nodeContext = this.updateNodeContext(nodeContext, viewIndex, textNode);\n }\n }\n return nodeContext;\n }\n\n breakAfterSoftHyphen(\n textNode: Text,\n text: string,\n viewIndex: number,\n nodeContext: Vtree.NodeContext,\n ): number {\n // convert trailing soft hyphen to a real hyphen\n textNode.replaceData(\n viewIndex,\n text.length - viewIndex,\n !nodeContext.breakWord ? resolveHyphenateCharacter(nodeContext) : \"\",\n );\n return viewIndex + 1;\n }\n\n breakAfterOtherCharacter(\n textNode: Text,\n text: string,\n viewIndex: number,\n nodeContext: Vtree.NodeContext,\n ): number {\n // keep the trailing character (it may be a space or not)\n const ch0 = text.charAt(viewIndex);\n viewIndex++;\n const ch1 = text.charAt(viewIndex);\n\n // If automatic hyphen was inserted here, add a real hyphen.\n textNode.replaceData(\n viewIndex,\n text.length - viewIndex,\n !nodeContext.breakWord && Base.isLetter(ch0) && Base.isLetter(ch1)\n ? resolveHyphenateCharacter(nodeContext)\n : \"\",\n );\n return viewIndex;\n }\n\n updateNodeContext(\n nodeContext: Vtree.NodeContext,\n viewIndex: number,\n textNode: Text,\n ): Vtree.NodeContext {\n nodeContext = nodeContext.modify();\n nodeContext.offsetInNode += viewIndex;\n nodeContext.breakBefore = null;\n return nodeContext;\n }\n\n static instance: TextNodeBreaker;\n}\nTextNodeBreaker.instance = new TextNodeBreaker();\n\nexport function resolveHyphenateCharacter(\n nodeContext: Vtree.NodeContext,\n): string {\n return (\n nodeContext.hyphenateCharacter ||\n (nodeContext.parent && nodeContext.parent.hyphenateCharacter) ||\n \"-\"\n );\n}\n\nexport class ColumnLayoutRetryer extends LayoutRetryers.AbstractLayoutRetryer {\n breakAfter: string | null;\n private initialPageBreakType: string | null = null;\n initialComputedBlockSize: number = 0;\n private initialOverflown: boolean = false;\n context: { overflownNodeContext: Vtree.NodeContext } = {\n overflownNodeContext: null,\n };\n\n constructor(\n public readonly leadingEdge: boolean,\n breakAfter?: string | null,\n ) {\n super();\n this.breakAfter = breakAfter || null;\n }\n\n /**\n * @override\n */\n resolveLayoutMode(nodeContext: Vtree.NodeContext): Layout.LayoutMode {\n return new DefaultLayoutMode(\n this.leadingEdge,\n this.breakAfter,\n this.context,\n );\n }\n\n /**\n * @override\n */\n prepareLayout(nodeContext: Vtree.NodeContext, column: Layout.Column) {\n column.fragmentLayoutConstraints = [];\n if (!column.pseudoParent) {\n Shared.clearRepetitiveElementsCache();\n }\n }\n\n /**\n * @override\n */\n clearNodes(initialPosition: Vtree.NodeContext) {\n super.clearNodes(initialPosition);\n let nodeContext = initialPosition;\n while (nodeContext) {\n const viewNode = nodeContext.viewNode;\n if (viewNode) {\n LayoutHelper.removeFollowingSiblings(viewNode.parentNode, viewNode);\n }\n nodeContext = nodeContext.parent;\n }\n }\n\n /**\n * @override\n */\n saveState(nodeContext: Vtree.NodeContext, column: Layout.Column) {\n super.saveState(nodeContext, column);\n this.initialPageBreakType = column.pageBreakType;\n this.initialComputedBlockSize = column.computedBlockSize;\n this.initialOverflown = column.overflown;\n }\n\n /**\n * @override\n */\n restoreState(nodeContext: Vtree.NodeContext, column: Layout.Column) {\n super.restoreState(nodeContext, column);\n column.pageBreakType = this.initialPageBreakType;\n column.computedBlockSize = this.initialComputedBlockSize;\n column.overflown = this.initialOverflown;\n }\n}\n\nexport class DefaultLayoutMode implements Layout.LayoutMode {\n constructor(\n public readonly leadingEdge: boolean,\n public readonly breakAfter: string | null,\n public readonly context: { overflownNodeContext: Vtree.NodeContext },\n ) {}\n\n /**\n * @override\n */\n doLayout(\n nodeContext: Vtree.NodeContext,\n column: Layout.Column,\n ): Task.Result<Vtree.NodeContext> {\n const frame: Task.Frame<Vtree.NodeContext> = Task.newFrame(\n \"DefaultLayoutMode.doLayout\",\n );\n\n processAfterIfContinuesOfAncestors(nodeContext, column).then(() => {\n column\n .doLayout(nodeContext, this.leadingEdge, this.breakAfter)\n .then((result) => {\n this.context.overflownNodeContext = result.overflownNodeContext;\n frame.finish(result.nodeContext);\n });\n });\n return frame.result();\n }\n\n /**\n * @override\n */\n accept(nodeContext: Vtree.NodeContext, column: Layout.Column): boolean {\n if (column.pageFloatLayoutContext.isInvalidated() || column.pageBreakType) {\n return true;\n }\n if (column.fragmentLayoutConstraints.length <= 0) {\n return true;\n }\n return column.fragmentLayoutConstraints.every((constraint) =>\n constraint.allowLayout(\n nodeContext,\n this.context.overflownNodeContext,\n column,\n ),\n );\n }\n\n /**\n * @override\n */\n postLayout(\n positionAfter: Vtree.NodeContext,\n initialPosition: Vtree.NodeContext,\n column: Layout.Column,\n accepted: boolean,\n ): boolean {\n if (!accepted) {\n const hasNextCandidate = column.fragmentLayoutConstraints.some(\n (constraint) => constraint.nextCandidate(positionAfter),\n );\n\n // If there is no next candidate, we accept the current layout trial.\n // Later Column#doFinishBreak decides whether the overflowing content\n // should be placed as is or be deferred to the next column,\n // depending on the value of Column#forceNonfitting.\n accepted = !hasNextCandidate;\n }\n column.fragmentLayoutConstraints.forEach((constraint) => {\n constraint.postLayout(accepted, positionAfter, initialPosition, column);\n });\n return accepted;\n }\n}\n\nexport class PageFloatArea extends Column implements Layout.PageFloatArea {\n private rootViewNodes: Element[] = [];\n private floatMargins: GeometryUtil.Insets[] = [];\n adjustContentRelativeSize: boolean = true;\n\n constructor(\n public readonly floatSide: string,\n element: Element,\n layoutContext: Vtree.LayoutContext,\n clientLayout: Vtree.ClientLayout,\n layoutConstraint: LayoutConstraint,\n pageFloatLayoutContext: PageFloats.PageFloatLayoutContext,\n public readonly parentContainer: Vtree.Container,\n ) {\n super(\n element,\n layoutContext,\n clientLayout,\n layoutConstraint,\n pageFloatLayoutContext,\n );\n }\n\n /**\n * @override\n */\n openAllViews(position: Vtree.NodePosition): Task.Result<Vtree.NodeContext> {\n return super.openAllViews(position).thenAsync((nodeContext) => {\n if (nodeContext) {\n this.fixFloatSizeAndPosition(nodeContext);\n }\n return Task.newResult(nodeContext);\n });\n }\n\n convertPercentageSizesToPx(target: Element) {\n const containingBlockRect = this.parentContainer.getPaddingRect();\n const refWidth = containingBlockRect.x2 - containingBlockRect.x1;\n const refHeight = containingBlockRect.y2 - containingBlockRect.y1;\n\n function convertPercentageToPx(props: string[], refValue: number) {\n props.forEach((propName) => {\n const valueString = Base.getCSSProperty(target, propName);\n if (valueString && valueString.charAt(valueString.length - 1) === \"%\") {\n const percentageValue = parseFloat(valueString);\n const value = (refValue * percentageValue) / 100;\n Base.setCSSProperty(target, propName, `${value}px`);\n }\n });\n }\n convertPercentageToPx([\"width\", \"max-width\", \"min-width\"], refWidth);\n convertPercentageToPx([\"height\", \"max-height\", \"min-height\"], refHeight);\n convertPercentageToPx(\n [\n \"margin-top\",\n \"margin-right\",\n \"margin-bottom\",\n \"margin-left\",\n \"padding-top\",\n \"padding-right\",\n \"padding-bottom\",\n \"padding-left\",\n ],\n this.vertical ? refHeight : refWidth,\n );\n [\"margin-top\", \"margin-right\", \"margin-bottom\", \"margin-left\"].forEach(\n (propName) => {\n const value = Base.getCSSProperty(target, propName);\n if (value === \"auto\") {\n Base.setCSSProperty(target, propName, \"0\");\n }\n },\n );\n }\n\n fixFloatSizeAndPosition(nodeContext: Vtree.NodeContext) {\n while (nodeContext.parent) {\n nodeContext = nodeContext.parent;\n }\n Asserts.assert(nodeContext.viewNode.nodeType === 1);\n const rootViewNode = nodeContext.viewNode as Element;\n this.rootViewNodes.push(rootViewNode);\n if (this.adjustContentRelativeSize) {\n this.convertPercentageSizesToPx(rootViewNode);\n }\n this.floatMargins.push(this.getComputedMargin(rootViewNode));\n if (this.adjustContentRelativeSize) {\n const floatSide = this.floatSide;\n const isVertical = this.parentContainer.vertical;\n if (isVertical) {\n if (floatSide === \"block-end\" || floatSide === \"left\") {\n const height = Base.getCSSProperty(rootViewNode, \"height\");\n if (height !== \"\" && height !== \"auto\") {\n Base.setCSSProperty(rootViewNode, \"margin-top\", \"auto\");\n }\n }\n } else {\n if (floatSide === \"block-end\" || floatSide === \"bottom\") {\n const width = Base.getCSSProperty(rootViewNode, \"width\");\n if (width !== \"\" && width !== \"auto\") {\n Base.setCSSProperty(rootViewNode, \"margin-left\", \"auto\");\n }\n }\n }\n }\n }\n\n getContentInlineSize(): number {\n return Math.max.apply(\n null,\n this.rootViewNodes.map((r, i) => {\n const box = this.clientLayout.getElementClientRect(r);\n const margin = this.floatMargins[i];\n return this.vertical\n ? margin.top + box.height + margin.bottom\n : margin.left + box.width + margin.right;\n }),\n );\n }\n}\n","/**\n * Copyright 2016 Trim-marks Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview RepetitiveElement - Elements repeated in every fragment\n * by repeat-on-break property.\n */\nimport * as Asserts from \"./asserts\";\nimport * as LayoutHelper from \"./layout-helper\";\nimport * as LayoutProcessor from \"./layout-processor\";\nimport * as LayoutRetryers from \"./layout-retryers\";\nimport * as LayoutUtil from \"./layout-util\";\nimport * as Plugin from \"./plugin\";\nimport * as Shared from \"./shared\";\nimport * as Task from \"./task\";\nimport * as VtreeImpl from \"./vtree\";\nimport * as Layout from \"./layout\";\nimport {\n FormattingContextType,\n FragmentLayoutConstraintType,\n Layout as LayoutType,\n RepetitiveElement,\n Table,\n Vtree,\n} from \"./types\";\n\nexport class RepetitiveElementsOwnerFormattingContext\n implements RepetitiveElement.RepetitiveElementsOwnerFormattingContext {\n formattingContextType: FormattingContextType = \"RepetitiveElementsOwner\";\n isRoot: boolean = false;\n repetitiveElements: RepetitiveElement.RepetitiveElements = null;\n\n constructor(\n public readonly parent: Vtree.FormattingContext,\n public readonly rootSourceNode: Element,\n ) {}\n\n /**\n * @override\n */\n getName(): string {\n return \"Repetitive elements owner formatting context (RepetitiveElementsOwnerFormattingContext)\";\n }\n\n /**\n * @override\n */\n isFirstTime(nodeContext: Vtree.NodeContext, firstTime: boolean): boolean {\n return firstTime;\n }\n\n /**\n * @override\n */\n getParent(): Vtree.FormattingContext {\n return this.parent;\n }\n\n getRepetitiveElements(): RepetitiveElement.RepetitiveElements {\n return this.repetitiveElements;\n }\n\n getRootViewNode(position: Vtree.NodeContext): Element | null {\n const root = this.getRootNodeContext(position);\n return root ? (root.viewNode as Element) : null;\n }\n\n getRootNodeContext(nodeContext: Vtree.NodeContext): Vtree.NodeContext | null {\n do {\n if (\n !nodeContext.belongsTo(this) &&\n nodeContext.sourceNode === this.rootSourceNode\n ) {\n return nodeContext;\n }\n } while ((nodeContext = nodeContext.parent));\n return null;\n }\n\n initializeRepetitiveElements(vertical: boolean) {\n if (this.repetitiveElements) {\n return;\n }\n const found = Shared.repetitiveElementsCache.some((entry) => {\n if (entry.root === this.rootSourceNode) {\n this.repetitiveElements = entry.elements;\n return true;\n }\n return false;\n });\n if (!found) {\n this.repetitiveElements = new RepetitiveElements(\n vertical,\n this.rootSourceNode,\n );\n Shared.repetitiveElementsCache.push({\n root: this.rootSourceNode,\n elements: this.repetitiveElements,\n });\n }\n }\n\n /** @override */\n saveState(): any {}\n\n /** @override */\n restoreState(state: any) {}\n}\n\nexport type ElementsOffset = RepetitiveElement.ElementsOffset;\n\nexport class RepetitiveElements\n implements RepetitiveElement.RepetitiveElements {\n private headerSourceNode: Element | null = null;\n private footerSourceNode: Element | null = null;\n private headerViewNode: Element | null = null;\n private footerViewNode: Element | null = null;\n private headerNodePosition: Vtree.NodePosition | null = null;\n private footerNodePosition: Vtree.NodePosition | null = null;\n private headerHeight: number = 0;\n private footerHeight: number = 0;\n isSkipHeader: boolean = false;\n isSkipFooter: boolean = false;\n enableSkippingFooter: boolean = true;\n enableSkippingHeader: boolean = true;\n doneInitialLayout: boolean = false;\n firstContentSourceNode: Element | null = null;\n lastContentSourceNode: Element | null = null;\n private affectedNodeCache: {\n nodeContext: Vtree.NodeContext;\n result: boolean;\n }[] = [];\n private afterLastContentNodeCache: {\n nodeContext: Vtree.NodeContext;\n result: boolean;\n }[] = [];\n allowInsert: boolean = false;\n allowInsertRepeatitiveElements: boolean;\n\n constructor(\n private readonly vertical: boolean,\n public ownerSourceNode: Element,\n ) {}\n\n setHeaderNodeContext(nodeContext: Vtree.NodeContext) {\n if (this.headerNodePosition) {\n return; // use first one.\n }\n this.headerNodePosition = VtreeImpl.newNodePositionFromNodeContext(\n nodeContext,\n 0,\n );\n this.headerSourceNode = nodeContext.sourceNode as Element;\n this.headerViewNode = nodeContext.viewNode as Element;\n }\n\n setFooterNodeContext(nodeContext: Vtree.NodeContext) {\n if (this.footerNodePosition) {\n return; // use first one.\n }\n this.footerNodePosition = VtreeImpl.newNodePositionFromNodeContext(\n nodeContext,\n 0,\n );\n this.footerSourceNode = nodeContext.sourceNode as Element;\n this.footerViewNode = nodeContext.viewNode as Element;\n }\n\n updateHeight(column: LayoutType.Column) {\n if (this.headerViewNode) {\n this.headerHeight = LayoutHelper.getElementHeight(\n this.headerViewNode,\n column,\n this.vertical,\n );\n this.headerViewNode = null;\n }\n if (this.footerViewNode) {\n this.footerHeight = LayoutHelper.getElementHeight(\n this.footerViewNode,\n column,\n this.vertical,\n );\n this.footerViewNode = null;\n }\n }\n\n prepareLayoutFragment() {\n this.isSkipHeader = this.isSkipFooter = false;\n this.enableSkippingFooter = true;\n this.enableSkippingHeader = true;\n }\n\n appendHeaderToFragment(\n rootNodeContext: Vtree.NodeContext,\n firstChild: Node | null,\n column: LayoutType.Column,\n ): Task.Result<boolean> {\n if (!this.headerNodePosition || this.isSkipHeader) {\n return Task.newResult(true);\n }\n return this.appendElementToFragment(\n this.headerNodePosition,\n rootNodeContext,\n firstChild,\n column,\n );\n }\n\n appendFooterToFragment(\n rootNodeContext: Vtree.NodeContext,\n firstChild: Node | null,\n column: LayoutType.Column,\n ): Task.Result<boolean> {\n if (!this.footerNodePosition || this.isSkipFooter) {\n return Task.newResult(true);\n }\n return this.appendElementToFragment(\n this.footerNodePosition,\n rootNodeContext,\n firstChild,\n column,\n );\n }\n\n /**\n * @return\n */\n appendElementToFragment(\n nodePosition: Vtree.NodePosition,\n rootNodeContext: Vtree.NodeContext,\n firstChild: Node | null,\n column: LayoutType.Column,\n ): Task.Result<boolean> {\n const doc = rootNodeContext.viewNode.ownerDocument;\n const rootViewNode = rootNodeContext.viewNode as Element;\n const viewRoot = doc.createElement(\"div\");\n rootViewNode.appendChild(viewRoot);\n const pseudoColumn = new Layout.PseudoColumn(\n column,\n viewRoot,\n rootNodeContext,\n );\n const initialPageBreakType = pseudoColumn.getColumn().pageBreakType;\n pseudoColumn.getColumn().pageBreakType = null;\n this.allowInsertRepeatitiveElements = true;\n return pseudoColumn\n .layout(new VtreeImpl.ChunkPosition(nodePosition), true)\n .thenAsync(() => {\n this.allowInsertRepeatitiveElements = false;\n rootViewNode.removeChild(viewRoot);\n this.moveChildren(viewRoot, rootViewNode, firstChild);\n pseudoColumn.getColumn().pageBreakType = initialPageBreakType;\n return Task.newResult(true);\n });\n }\n\n moveChildren(from: Element, to: Element, firstChild: Node | null) {\n if (!to) {\n return;\n }\n while (from.firstChild) {\n const child = from.firstChild;\n from.removeChild(child);\n (child as Element).setAttribute(VtreeImpl.SPECIAL_ATTR, \"1\");\n if (firstChild) {\n to.insertBefore(child, firstChild);\n } else {\n to.appendChild(child);\n }\n }\n }\n\n /** @override */\n calculateOffset(nodeContext: Vtree.NodeContext): number {\n let offset = 0;\n if (nodeContext && !this.affectTo(nodeContext)) {\n return offset;\n }\n if (\n !this.isSkipFooter ||\n (nodeContext && this.isAfterLastContent(nodeContext))\n ) {\n offset += this.footerHeight;\n }\n if (!this.isSkipHeader) {\n offset += this.headerHeight;\n }\n return offset;\n }\n\n /** @override */\n calculateMinimumOffset(nodeContext: Vtree.NodeContext): number {\n let offset = 0;\n if (nodeContext && !this.affectTo(nodeContext)) {\n return offset;\n }\n if (nodeContext && this.isAfterLastContent(nodeContext)) {\n offset += this.footerHeight;\n }\n if (!this.enableSkippingHeader) {\n offset += this.headerHeight;\n }\n return offset;\n }\n\n isAfterLastContent(nodeContext: Vtree.NodeContext): boolean {\n return this.findResultFromCache(\n nodeContext,\n this.afterLastContentNodeCache,\n (nc) =>\n this.isAfterNodeContextOf(\n this.lastContentSourceNode as Element,\n nodeContext,\n false,\n ),\n );\n }\n\n private affectTo(nodeContext: Vtree.NodeContext): boolean {\n return this.findResultFromCache(nodeContext, this.affectedNodeCache, (nc) =>\n this.isAfterNodeContextOf(this.ownerSourceNode, nodeContext, true),\n );\n }\n\n private findResultFromCache(\n nodeContext: Vtree.NodeContext,\n cache: { nodeContext: Vtree.NodeContext; result: boolean }[],\n calculator: (p1: Vtree.NodeContext) => boolean,\n ): boolean {\n const cacheEntry = cache.filter(\n (cache) =>\n cache.nodeContext.sourceNode === nodeContext.sourceNode &&\n cache.nodeContext.after === nodeContext.after,\n );\n if (cacheEntry.length > 0) {\n return cacheEntry[0].result;\n } else {\n const result = calculator(nodeContext);\n cache.push({ nodeContext, result });\n return result;\n }\n }\n\n private isAfterNodeContextOf(\n node: Element,\n nodeContext: Vtree.NodeContext,\n includeChildren: boolean,\n ): boolean {\n const parentsOfNode = [];\n for (let n: Node | null = node; n; n = n.parentNode) {\n if (nodeContext.sourceNode === n) {\n return nodeContext.after;\n } else {\n parentsOfNode.push(n);\n }\n }\n for (\n let currentParent: Node | null = nodeContext.sourceNode;\n currentParent;\n currentParent = currentParent.parentNode\n ) {\n const index = parentsOfNode.indexOf(currentParent);\n if (index >= 0) {\n return includeChildren ? index === 0 : false;\n } else {\n for (\n let current: Element | null = currentParent as Element;\n current;\n current = current.previousElementSibling\n ) {\n if (parentsOfNode.includes(current)) {\n return true;\n }\n }\n }\n }\n return nodeContext.after;\n }\n\n isFirstContentNode(nodeContext: Vtree.NodeContext): boolean {\n return (\n nodeContext && this.firstContentSourceNode === nodeContext.sourceNode\n );\n }\n\n isEnableToUpdateState(): boolean {\n if (\n (!this.isSkipFooter &&\n this.enableSkippingFooter &&\n this.footerNodePosition) ||\n (!this.isSkipHeader &&\n this.enableSkippingHeader &&\n this.headerNodePosition)\n ) {\n return true;\n } else {\n return false;\n }\n }\n\n updateState() {\n if (\n !this.isSkipFooter &&\n this.enableSkippingFooter &&\n this.footerNodePosition\n ) {\n this.isSkipFooter = true;\n } else if (\n !this.isSkipHeader &&\n this.enableSkippingHeader &&\n this.headerNodePosition\n ) {\n this.isSkipHeader = true;\n }\n }\n\n preventSkippingHeader() {\n this.isSkipHeader = false;\n this.enableSkippingHeader = false;\n }\n\n preventSkippingFooter() {\n this.isSkipFooter = false;\n this.enableSkippingFooter = false;\n }\n\n isHeaderRegistered(): boolean {\n return !!this.headerNodePosition;\n }\n\n isFooterRegistered(): boolean {\n return !!this.footerNodePosition;\n }\n\n isHeaderSourceNode(node: Node): boolean {\n return this.headerSourceNode === node;\n }\n\n isFooterSourceNode(node: Node): boolean {\n return this.footerSourceNode === node;\n }\n}\n\n/**\n * @abstract\n */\nexport abstract class LayoutEntireBlock implements LayoutType.LayoutMode {\n constructor(\n public formattingContext: RepetitiveElement.RepetitiveElementsOwnerFormattingContext,\n ) {}\n\n /**\n * @override\n */\n abstract doLayout(\n nodeContext: Vtree.NodeContext,\n column: LayoutType.Column,\n ): Task.Result<Vtree.NodeContext>;\n\n /**\n * @override\n */\n accept(nodeContext: Vtree.NodeContext, column: LayoutType.Column): boolean {\n return !!nodeContext;\n }\n\n /**\n * @override\n */\n postLayout(\n positionAfter: Vtree.NodeContext,\n initialPosition: Vtree.NodeContext,\n column: LayoutType.Column,\n accepted: boolean,\n ): boolean {\n const repetitiveElements = this.formattingContext.getRepetitiveElements();\n if (repetitiveElements) {\n Asserts.assert(column.clientLayout);\n if (!repetitiveElements.doneInitialLayout) {\n repetitiveElements.updateHeight(column);\n repetitiveElements.doneInitialLayout = true;\n }\n }\n return accepted;\n }\n}\n\n/**\n * @abstract\n */\nexport abstract class LayoutFragmentedBlock implements LayoutType.LayoutMode {\n constructor(\n public formattingContext: RepetitiveElement.RepetitiveElementsOwnerFormattingContext,\n ) {}\n\n /**\n * @override\n */\n abstract doLayout(\n nodeContext: Vtree.NodeContext,\n column: LayoutType.Column,\n ): Task.Result<Vtree.NodeContext>;\n\n /**\n * @override\n */\n accept(nodeContext: Vtree.NodeContext, column: LayoutType.Column): boolean {\n return true;\n }\n\n /**\n * @override\n */\n postLayout(\n positionAfter: Vtree.NodeContext,\n initialPosition: Vtree.NodeContext,\n column: LayoutType.Column,\n accepted: boolean,\n ): boolean {\n return accepted;\n }\n}\n\nexport class LayoutEntireOwnerBlock extends LayoutEntireBlock {\n constructor(\n formattingContext: RepetitiveElement.RepetitiveElementsOwnerFormattingContext,\n public readonly processor: RepetitiveElementsOwnerLayoutProcessor,\n ) {\n super(formattingContext);\n }\n\n /**\n * @override\n */\n doLayout(\n nodeContext: Vtree.NodeContext,\n column: LayoutType.Column,\n ): Task.Result<Vtree.NodeContext> {\n // FIXME: LayoutEntireBlock.prototype.doLayout is undefined because it's abstract method.\n // Probably, removing this call is ok.\n // LayoutEntireBlock.prototype.doLayout.call(this, nodeContext, column);\n return this.processor.doInitialLayout(nodeContext, column);\n }\n\n /**\n * @override\n */\n accept(nodeContext: Vtree.NodeContext, column: LayoutType.Column): boolean {\n return false;\n }\n}\n\nexport class LayoutFragmentedOwnerBlock extends LayoutFragmentedBlock {\n constructor(\n formattingContext: RepetitiveElement.RepetitiveElementsOwnerFormattingContext,\n public readonly processor: RepetitiveElementsOwnerLayoutProcessor,\n ) {\n super(formattingContext);\n }\n\n /**\n * @override\n */\n doLayout(\n nodeContext: Vtree.NodeContext,\n column: LayoutType.Column,\n ): Task.Result<Vtree.NodeContext> {\n if (!nodeContext.belongsTo(this.formattingContext) && !nodeContext.after) {\n column.fragmentLayoutConstraints.unshift(\n new RepetitiveElementsOwnerLayoutConstraint(nodeContext),\n );\n }\n return this.processor.doLayout(nodeContext, column);\n }\n}\n\nexport class RepetitiveElementsOwnerLayoutConstraint\n implements RepetitiveElement.RepetitiveElementsOwnerLayoutConstraint {\n flagmentLayoutConstraintType: FragmentLayoutConstraintType =\n \"RepetitiveElementsOwner\";\n nodeContext: Vtree.NodeContext;\n\n constructor(nodeContext: Vtree.NodeContext) {\n const formattingContext = getRepetitiveElementsOwnerFormattingContext(\n nodeContext.formattingContext,\n );\n this.nodeContext = formattingContext.getRootNodeContext(nodeContext);\n }\n\n /** @override */\n allowLayout(\n nodeContext: Vtree.NodeContext,\n overflownNodeContext: Vtree.NodeContext,\n column: LayoutType.Column,\n ): boolean {\n const repetitiveElements = this.getRepetitiveElements();\n if (!repetitiveElements) {\n return true;\n }\n if (LayoutHelper.isOrphan(this.nodeContext.viewNode)) {\n return true;\n }\n if (!repetitiveElements.isEnableToUpdateState()) {\n return true;\n }\n if (\n (overflownNodeContext && !nodeContext) ||\n (nodeContext && nodeContext.overflow)\n ) {\n return false;\n } else {\n return true;\n }\n }\n\n /** @override */\n nextCandidate(nodeContext: Vtree.NodeContext): boolean {\n const repetitiveElements = this.getRepetitiveElements();\n if (!repetitiveElements) {\n return false;\n }\n if (repetitiveElements.isEnableToUpdateState()) {\n repetitiveElements.updateState();\n return true;\n } else {\n return false;\n }\n }\n\n /** @override */\n postLayout(\n allowed: boolean,\n positionAfter: Vtree.NodeContext,\n initialPosition: Vtree.NodeContext,\n column: LayoutType.Column,\n ) {\n const repetitiveElements = this.getRepetitiveElements();\n if (!repetitiveElements) {\n return;\n }\n if (allowed) {\n if (column.stopAtOverflow) {\n if (\n positionAfter == null ||\n repetitiveElements.isAfterLastContent(positionAfter)\n ) {\n repetitiveElements.preventSkippingFooter();\n }\n }\n }\n }\n\n /** @override */\n finishBreak(\n nodeContext: Vtree.NodeContext,\n column: LayoutType.Column,\n ): Task.Result<boolean> {\n const formattingContext = getRepetitiveElementsOwnerFormattingContext(\n this.nodeContext.formattingContext,\n );\n const repetitiveElements = this.getRepetitiveElements();\n if (!repetitiveElements) {\n return Task.newResult(true);\n }\n const rootNodeContext = this.nodeContext;\n return appendHeader(formattingContext, rootNodeContext, column).thenAsync(\n () =>\n appendFooter(formattingContext, rootNodeContext, column).thenAsync(\n () => {\n repetitiveElements.prepareLayoutFragment();\n return Task.newResult(true);\n },\n ),\n );\n }\n\n getRepetitiveElements(): RepetitiveElement.RepetitiveElements {\n const formattingContext = getRepetitiveElementsOwnerFormattingContext(\n this.nodeContext.formattingContext,\n );\n return formattingContext.getRepetitiveElements();\n }\n\n /** @override */\n equalsTo(constraint: LayoutType.FragmentLayoutConstraint): boolean {\n if (!(constraint instanceof RepetitiveElementsOwnerLayoutConstraint)) {\n return false;\n }\n return (\n getRepetitiveElementsOwnerFormattingContext(\n this.nodeContext.formattingContext,\n ) ===\n getRepetitiveElementsOwnerFormattingContext(\n constraint.nodeContext.formattingContext,\n )\n );\n }\n\n /** @override */\n getPriorityOfFinishBreak(): number {\n return 10;\n }\n}\n\nexport class RepetitiveElementsOwnerLayoutRetryer extends LayoutRetryers.AbstractLayoutRetryer {\n constructor(\n public readonly formattingContext: RepetitiveElement.RepetitiveElementsOwnerFormattingContext,\n private readonly processor: RepetitiveElementsOwnerLayoutProcessor,\n ) {\n super();\n }\n\n /**\n * @override\n */\n resolveLayoutMode(nodeContext: Vtree.NodeContext): LayoutType.LayoutMode {\n const repetitiveElements = this.formattingContext.getRepetitiveElements();\n if (\n !nodeContext.belongsTo(this.formattingContext) &&\n !repetitiveElements.doneInitialLayout\n ) {\n return new LayoutEntireOwnerBlock(this.formattingContext, this.processor);\n } else {\n if (\n !nodeContext.belongsTo(this.formattingContext) &&\n !nodeContext.after\n ) {\n if (repetitiveElements) {\n repetitiveElements.preventSkippingHeader();\n }\n }\n return new LayoutFragmentedOwnerBlock(\n this.formattingContext,\n this.processor,\n );\n }\n }\n}\n\nexport class EntireBlockLayoutStrategy extends LayoutUtil.EdgeSkipper {\n constructor(\n public readonly formattingContext: RepetitiveElement.RepetitiveElementsOwnerFormattingContext,\n public readonly column: LayoutType.Column,\n ) {\n super();\n }\n\n /**\n * @override\n */\n startNonInlineElementNode(\n state: LayoutUtil.LayoutIteratorState,\n ): void | Task.Result<boolean> {\n const formattingContext = this.formattingContext;\n const nodeContext = state.nodeContext;\n const repetitiveElements = formattingContext.getRepetitiveElements();\n if (\n nodeContext.parent &&\n formattingContext.rootSourceNode === nodeContext.parent.sourceNode\n ) {\n switch (nodeContext.repeatOnBreak) {\n case \"header\":\n if (!repetitiveElements.isHeaderRegistered()) {\n repetitiveElements.setHeaderNodeContext(nodeContext);\n return Task.newResult(true);\n } else {\n nodeContext.repeatOnBreak = \"none\";\n }\n break;\n case \"footer\":\n if (!repetitiveElements.isFooterRegistered()) {\n repetitiveElements.setFooterNodeContext(nodeContext);\n return Task.newResult(true);\n } else {\n nodeContext.repeatOnBreak = \"none\";\n }\n break;\n }\n if (!repetitiveElements.firstContentSourceNode) {\n repetitiveElements.firstContentSourceNode = nodeContext.sourceNode as Element;\n }\n }\n return LayoutUtil.EdgeSkipper.prototype.startNonInlineElementNode.call(\n this,\n state,\n );\n }\n\n /**\n * @override\n */\n afterNonInlineElementNode(\n state: LayoutUtil.LayoutIteratorState,\n ): void | Task.Result<boolean> {\n const formattingContext = this.formattingContext;\n const nodeContext = state.nodeContext;\n if (nodeContext.sourceNode === formattingContext.rootSourceNode) {\n formattingContext.getRepetitiveElements().lastContentSourceNode =\n state.lastAfterNodeContext &&\n (state.lastAfterNodeContext.sourceNode as Element);\n state.break = true;\n }\n if (\n nodeContext.repeatOnBreak === \"header\" ||\n nodeContext.repeatOnBreak === \"footer\"\n ) {\n return Task.newResult(true);\n } else {\n return LayoutUtil.EdgeSkipper.prototype.afterNonInlineElementNode.call(\n this,\n state,\n );\n }\n }\n}\n\nexport class FragmentedBlockLayoutStrategy extends LayoutUtil.EdgeSkipper {\n constructor(\n public readonly formattingContext: RepetitiveElementsOwnerFormattingContext,\n public readonly column: LayoutType.Column,\n ) {\n super();\n }\n}\n\nexport class RepetitiveElementsOwnerLayoutProcessor\n extends LayoutProcessor.BlockLayoutProcessor\n implements LayoutProcessor.LayoutProcessor {\n layout(\n nodeContext: Vtree.NodeContext,\n column: LayoutType.Column,\n leadingEdge: boolean,\n ): Task.Result<Vtree.NodeContext> {\n if (column.isFloatNodeContext(nodeContext)) {\n return column.layoutFloatOrFootnote(nodeContext);\n }\n const formattingContext = getRepetitiveElementsOwnerFormattingContext(\n nodeContext.formattingContext,\n );\n const rootViewNode = formattingContext.getRootViewNode(nodeContext);\n if (!rootViewNode) {\n return column.buildDeepElementView(nodeContext);\n } else {\n if (leadingEdge) {\n appendHeaderToAncestors(nodeContext.parent, column);\n }\n if (!nodeContext.belongsTo(formattingContext)) {\n return new RepetitiveElementsOwnerLayoutRetryer(\n formattingContext,\n this,\n ).layout(nodeContext, column);\n } else {\n return LayoutProcessor.BlockLayoutProcessor.prototype.layout.call(\n this,\n nodeContext,\n column,\n leadingEdge,\n );\n }\n }\n }\n\n startNonInlineElementNode(nodeContext: Vtree.NodeContext): boolean {\n const formattingContext = getRepetitiveElementsOwnerFormattingContextOrNull(\n nodeContext,\n );\n const repetitiveElements = formattingContext.getRepetitiveElements();\n if (!repetitiveElements) {\n return false;\n }\n if (\n !repetitiveElements.allowInsertRepeatitiveElements &&\n (repetitiveElements.isHeaderSourceNode(nodeContext.sourceNode) ||\n repetitiveElements.isFooterSourceNode(nodeContext.sourceNode))\n ) {\n nodeContext.viewNode.parentNode.removeChild(nodeContext.viewNode);\n }\n return false;\n }\n\n doInitialLayout(\n nodeContext: Vtree.NodeContext,\n column: LayoutType.Column,\n ): Task.Result<Vtree.NodeContext> {\n const formattingContext = getRepetitiveElementsOwnerFormattingContext(\n nodeContext.formattingContext,\n );\n const frame = Task.newFrame<Vtree.NodeContext>(\n \"BlockLayoutProcessor.doInitialLayout\",\n );\n this.layoutEntireBlock(nodeContext, column).thenFinish(frame);\n return frame.result();\n }\n\n private layoutEntireBlock(\n nodeContext: Vtree.NodeContext,\n column: LayoutType.Column,\n ): Task.Result<Vtree.NodeContext> {\n const formattingContext = getRepetitiveElementsOwnerFormattingContext(\n nodeContext.formattingContext,\n );\n const strategy = new EntireBlockLayoutStrategy(formattingContext, column);\n const iterator = new LayoutUtil.LayoutIterator(\n strategy,\n column.layoutContext,\n );\n return iterator.iterate(nodeContext);\n }\n\n doLayout(\n nodeContext: Vtree.NodeContext,\n column: LayoutType.Column,\n ): Task.Result<Vtree.NodeContext> {\n const formattingContext = getRepetitiveElementsOwnerFormattingContext(\n nodeContext.formattingContext,\n );\n const frame: Task.Frame<Vtree.NodeContext> = Task.newFrame(\"doLayout\");\n const cont = column.layoutContext.nextInTree(nodeContext, false);\n Layout.processAfterIfContinues(cont, column).then((resNodeContext) => {\n let nextNodeContext = resNodeContext;\n frame\n .loopWithFrame((loopFrame) => {\n while (nextNodeContext) {\n let pending = true;\n column\n .layoutNext(nextNodeContext, false)\n .then((nodeContextParam) => {\n nextNodeContext = nodeContextParam;\n if (column.pageFloatLayoutContext.isInvalidated()) {\n loopFrame.breakLoop();\n } else if (column.pageBreakType) {\n loopFrame.breakLoop(); // Loop end\n } else if (\n nextNodeContext &&\n column.stopByOverflow(nextNodeContext)\n ) {\n loopFrame.breakLoop(); // Loop end\n } else if (\n nextNodeContext &&\n nextNodeContext.after &&\n nextNodeContext.sourceNode == formattingContext.rootSourceNode\n ) {\n loopFrame.breakLoop(); // Loop end\n } else {\n if (pending) {\n // Sync case\n pending = false;\n } else {\n // Async case\n loopFrame.continueLoop();\n }\n }\n });\n if (pending) {\n // Async case and loop end\n pending = false;\n return;\n }\n }\n\n // Sync case\n loopFrame.breakLoop();\n })\n .then(() => {\n frame.finish(nextNodeContext);\n });\n });\n return frame.result();\n }\n\n /**\n * @override\n */\n finishBreak(\n column: LayoutType.Column,\n nodeContext: Vtree.NodeContext,\n forceRemoveSelf: boolean,\n endOfColumn: boolean,\n ): Task.Result<boolean> | null {\n return LayoutProcessor.BlockLayoutProcessor.prototype.finishBreak.call(\n this,\n column,\n nodeContext,\n forceRemoveSelf,\n endOfColumn,\n );\n }\n\n /**\n * @override\n */\n clearOverflownViewNodes(\n column: LayoutType.Column,\n parentNodeContext: Vtree.NodeContext,\n nodeContext: Vtree.NodeContext,\n removeSelf: boolean,\n ) {\n LayoutProcessor.BlockLayoutProcessor.prototype.clearOverflownViewNodes(\n column,\n parentNodeContext,\n nodeContext,\n removeSelf,\n );\n }\n}\n\nfunction eachAncestorNodeContext(\n nodeContext: Vtree.NodeContext,\n callback: (\n p1: RepetitiveElementsOwnerFormattingContext,\n p2: Vtree.NodeContext,\n ) => any,\n): void {\n for (let nc = nodeContext; nc; nc = nc.parent) {\n const formattingContext = nc.formattingContext;\n if (\n formattingContext &&\n formattingContext instanceof RepetitiveElementsOwnerFormattingContext &&\n !nc.belongsTo(formattingContext)\n ) {\n callback(formattingContext, nc);\n }\n }\n}\n\nexport function appendHeaderToAncestors(\n nodeContext: Vtree.NodeContext,\n column: LayoutType.Column,\n): void {\n if (!nodeContext) {\n return;\n }\n eachAncestorNodeContext(\n nodeContext.after ? nodeContext.parent : nodeContext,\n (formattingContext, nc) => {\n if (Table.isInstanceOfTableFormattingContext(formattingContext)) {\n return;\n }\n column.fragmentLayoutConstraints.push(\n new RepetitiveElementsOwnerLayoutConstraint(nc),\n );\n },\n );\n}\n\nexport function appendHeader(\n formattingContext: RepetitiveElement.RepetitiveElementsOwnerFormattingContext,\n nodeContext: Vtree.NodeContext,\n column: LayoutType.Column,\n): Task.Result<boolean> {\n const repetitiveElements = formattingContext.getRepetitiveElements();\n if (repetitiveElements) {\n const rootNodeContext = formattingContext.getRootNodeContext(nodeContext);\n if (rootNodeContext.viewNode) {\n const firstChild = rootNodeContext.viewNode.firstChild;\n return repetitiveElements.appendHeaderToFragment(\n rootNodeContext,\n firstChild,\n column,\n );\n }\n }\n return Task.newResult(true);\n}\n\nexport function appendFooter(\n formattingContext: RepetitiveElement.RepetitiveElementsOwnerFormattingContext,\n nodeContext: Vtree.NodeContext,\n column: LayoutType.Column,\n): Task.Result<boolean> {\n const repetitiveElements = formattingContext.getRepetitiveElements();\n if (repetitiveElements) {\n if (!repetitiveElements.isSkipFooter) {\n const rootNodeContext = formattingContext.getRootNodeContext(nodeContext);\n if (rootNodeContext.viewNode) {\n return repetitiveElements.appendFooterToFragment(\n rootNodeContext,\n null,\n column,\n );\n }\n }\n }\n return Task.newResult(true);\n}\n\nfunction getRepetitiveElementsOwnerFormattingContextOrNull(\n nodeContext: Vtree.NodeContext,\n): RepetitiveElement.RepetitiveElementsOwnerFormattingContext | null {\n const formattingContext = nodeContext.formattingContext;\n if (!formattingContext) {\n return null;\n }\n if (\n !(formattingContext instanceof RepetitiveElementsOwnerFormattingContext)\n ) {\n return null;\n }\n return formattingContext;\n}\n\nfunction getRepetitiveElementsOwnerFormattingContext(\n formattingContext: Vtree.FormattingContext,\n): RepetitiveElement.RepetitiveElementsOwnerFormattingContext {\n Asserts.assert(\n formattingContext instanceof RepetitiveElementsOwnerFormattingContext,\n );\n return formattingContext as RepetitiveElement.RepetitiveElementsOwnerFormattingContext;\n}\n\nconst repetitiveLayoutProcessor = new RepetitiveElementsOwnerLayoutProcessor();\n\nPlugin.registerHook(\n Plugin.HOOKS.RESOLVE_LAYOUT_PROCESSOR,\n (formattingContext) => {\n if (\n formattingContext instanceof RepetitiveElementsOwnerFormattingContext &&\n !Table.isInstanceOfTableFormattingContext(formattingContext)\n ) {\n return repetitiveLayoutProcessor;\n }\n return null;\n },\n);\n","/**\n * Copyright 2016 Trim-marks Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Table - Table formatting context and layout.\n */\nimport * as Asserts from \"./asserts\";\nimport * as Base from \"./base\";\nimport * as BreakPosition from \"./break-position\";\nimport * as Css from \"./css\";\nimport * as LayoutHelper from \"./layout-helper\";\nimport * as LayoutProcessor from \"./layout-processor\";\nimport * as LayoutRetryers from \"./layout-retryers\";\nimport * as LayoutUtil from \"./layout-util\";\nimport * as Plugin from \"./plugin\";\nimport * as RepetitiveElementImpl from \"./repetitive-element\";\nimport * as Task from \"./task\";\nimport * as Vgen from \"./vgen\";\nimport * as VtreeImpl from \"./vtree\";\nimport * as Layout from \"./layout\";\nimport {\n FormattingContextType,\n FragmentLayoutConstraintType,\n Layout as LayoutType,\n RepetitiveElement,\n Table,\n Vtree,\n} from \"./types\";\n\nexport class TableRow {\n cells: TableCell[] = [];\n\n constructor(\n public readonly rowIndex: number,\n public readonly sourceNode: Node,\n ) {}\n\n addCell(cell: TableCell) {\n this.cells.push(cell);\n }\n\n getMinimumHeight(): number {\n return Math.min.apply(\n null,\n this.cells.map((c) => c.height),\n );\n }\n}\n\nexport class TableCell {\n viewElement: Element | null;\n colSpan: number;\n rowSpan: number;\n height: number = 0;\n anchorSlot: TableSlot = null;\n\n constructor(\n public readonly rowIndex: number,\n public readonly columnIndex: number,\n viewElement: Element,\n ) {\n this.viewElement = viewElement;\n this.colSpan = (viewElement as HTMLTableCellElement).colSpan || 1;\n this.rowSpan = (viewElement as HTMLTableCellElement).rowSpan || 1;\n }\n\n setHeight(height: number) {\n this.height = height;\n }\n\n setAnchorSlot(slot: TableSlot) {\n this.anchorSlot = slot;\n }\n}\n\nexport class TableSlot {\n constructor(\n public readonly rowIndex: number,\n public readonly columnIndex: number,\n public readonly cell: TableCell,\n ) {}\n}\n\nexport class TableCellFragment {\n pseudoColumn: Layout.PseudoColumn;\n empty: boolean = false;\n\n constructor(\n public readonly column: Layout.Column,\n pseudoColumnContainer: Element,\n public readonly cellNodeContext: Vtree.NodeContext,\n ) {\n this.pseudoColumn = new Layout.PseudoColumn(\n column,\n pseudoColumnContainer,\n cellNodeContext,\n );\n }\n\n findAcceptableBreakPosition(): Layout.BreakPositionAndNodeContext {\n const element = this.cellNodeContext.viewNode as Element;\n const verticalAlign = this.cellNodeContext.verticalAlign;\n if (verticalAlign === \"middle\" || verticalAlign === \"bottom\") {\n Base.setCSSProperty(element, \"vertical-align\", \"top\");\n }\n const bp = this.pseudoColumn.findAcceptableBreakPosition(true);\n Base.setCSSProperty(element, \"vertical-align\", verticalAlign);\n return bp;\n }\n}\n\nexport class TableCaptionView {\n constructor(\n public readonly viewNode: Element,\n public readonly side: string,\n ) {}\n}\n\nexport class BetweenTableRowBreakPosition extends BreakPosition.EdgeBreakPosition {\n private formattingContext: TableFormattingContext;\n\n acceptableCellBreakPositions: Layout.BreakPositionAndNodeContext[] = null;\n private rowIndex: number | null = null;\n\n constructor(\n position: Vtree.NodeContext,\n breakOnEdge: string | null,\n overflows: boolean,\n columnBlockSize: number,\n ) {\n super(position, breakOnEdge, overflows, columnBlockSize);\n this.formattingContext = position.formattingContext as TableFormattingContext;\n }\n\n /**\n * @override\n */\n findAcceptableBreak(\n column: Layout.Column,\n penalty: number,\n ): Vtree.NodeContext {\n const breakNodeContext = super.findAcceptableBreak(column, penalty);\n if (penalty < this.getMinBreakPenalty()) {\n return null;\n }\n const allCellsBreakable = this.getAcceptableCellBreakPositions().every(\n (bp) => !!bp.nodeContext,\n );\n if (allCellsBreakable) {\n return breakNodeContext;\n } else {\n return null;\n }\n }\n\n /**\n * @override\n */\n getMinBreakPenalty(): number {\n let penalty = super.getMinBreakPenalty();\n this.getAcceptableCellBreakPositions().forEach((bp) => {\n penalty += bp.breakPosition.getMinBreakPenalty();\n });\n return penalty;\n }\n\n getAcceptableCellBreakPositions(): Layout.BreakPositionAndNodeContext[] {\n if (!this.acceptableCellBreakPositions) {\n const formattingContext = this.formattingContext;\n const cellFragments = this.getCellFragments();\n this.acceptableCellBreakPositions = cellFragments.map((cellFragment) =>\n cellFragment.findAcceptableBreakPosition(),\n );\n }\n return this.acceptableCellBreakPositions;\n }\n\n private getRowIndex(): number {\n if (this.rowIndex != null) {\n return this.rowIndex;\n }\n return (this.rowIndex = this.formattingContext.findRowIndexBySourceNode(\n this.position.sourceNode,\n ));\n }\n\n private getCellFragments() {\n return this.formattingContext\n .getRowSpanningCellsOverflowingTheRow(this.getRowIndex())\n .map(\n this.formattingContext.getCellFragmentOfCell,\n this.formattingContext,\n );\n }\n}\n\nexport class InsideTableRowBreakPosition extends BreakPosition.AbstractBreakPosition {\n acceptableCellBreakPositions: Layout.BreakPositionAndNodeContext[] = null;\n\n constructor(\n public readonly rowIndex: number,\n public readonly beforeNodeContext: Vtree.NodeContext,\n public readonly formattingContext: TableFormattingContext,\n ) {\n super();\n }\n\n /**\n * @override\n */\n findAcceptableBreak(\n column: Layout.Column,\n penalty: number,\n ): Vtree.NodeContext {\n if (penalty < this.getMinBreakPenalty()) {\n return null;\n }\n const cellFragments = this.getCellFragments();\n const acceptableCellBreakPositions = this.getAcceptableCellBreakPositions();\n const allCellsBreakable =\n acceptableCellBreakPositions.every((bp) => !!bp.nodeContext) &&\n acceptableCellBreakPositions.some((bp, index) => {\n const pseudoColumn = cellFragments[index].pseudoColumn;\n const nodeContext = bp.nodeContext;\n return (\n !pseudoColumn.isStartNodeContext(nodeContext) &&\n !pseudoColumn.isLastAfterNodeContext(nodeContext)\n );\n });\n this.beforeNodeContext.overflow = acceptableCellBreakPositions.some(\n (bp) => bp.nodeContext && bp.nodeContext.overflow,\n );\n if (allCellsBreakable) {\n return this.beforeNodeContext;\n } else {\n return null;\n }\n }\n\n /**\n * @override\n */\n getMinBreakPenalty(): number {\n const formattingContext = this.formattingContext;\n const row = formattingContext.getRowByIndex(this.rowIndex);\n let penalty = 0;\n if (!formattingContext.isFreelyFragmentableRow(row)) {\n penalty += 10;\n }\n this.getAcceptableCellBreakPositions().forEach((bp) => {\n penalty += bp.breakPosition.getMinBreakPenalty();\n });\n return penalty;\n }\n\n getAcceptableCellBreakPositions(): Layout.BreakPositionAndNodeContext[] {\n if (!this.acceptableCellBreakPositions) {\n const cellFragments = this.getCellFragments();\n this.acceptableCellBreakPositions = cellFragments.map((cellFragment) =>\n cellFragment.findAcceptableBreakPosition(),\n );\n }\n return this.acceptableCellBreakPositions;\n }\n\n private getCellFragments() {\n return this.formattingContext\n .getCellsFallingOnRow(this.rowIndex)\n .map(\n this.formattingContext.getCellFragmentOfCell,\n this.formattingContext,\n );\n }\n}\n\nexport type BrokenTableCellPosition = {\n cellNodePosition: Vtree.NodePosition;\n breakChunkPosition: Vtree.ChunkPosition;\n cell: TableCell;\n};\n\n/**\n * @param tableSourceNode Source node of the table\n */\nexport class TableFormattingContext\n extends RepetitiveElementImpl.RepetitiveElementsOwnerFormattingContext\n implements Table.TableFormattingContext {\n formattingContextType: FormattingContextType = \"Table\";\n vertical: boolean = false;\n columnCount: number = -1;\n tableWidth: number = 0;\n captions: TableCaptionView[] = [];\n colGroups: DocumentFragment | null = null;\n colWidths: number[] | null = null;\n inlineBorderSpacing: number = 0;\n rows: TableRow[] = [];\n slots: TableSlot[][] = [];\n cellFragments: TableCellFragment[][] = [];\n lastRowViewNode: Element | null = null;\n cellBreakPositions: BrokenTableCellPosition[] = [];\n repetitiveElements: RepetitiveElement.RepetitiveElements | null = null;\n\n constructor(\n parent: Vtree.FormattingContext,\n public readonly tableSourceNode: Element,\n ) {\n super(parent, tableSourceNode);\n }\n\n /**\n * @override\n */\n getName(): string {\n return \"Table formatting context (Table.TableFormattingContext)\";\n }\n\n /**\n * @override\n */\n isFirstTime(nodeContext: Vtree.NodeContext, firstTime: boolean): boolean {\n if (!firstTime) {\n return firstTime;\n }\n switch (nodeContext.display) {\n case \"table-row\":\n return this.cellBreakPositions.length === 0;\n case \"table-cell\":\n return !this.cellBreakPositions.some(\n (p) => p.cellNodePosition.steps[0].node === nodeContext.sourceNode,\n );\n default:\n return firstTime;\n }\n }\n\n /**\n * @override\n */\n getParent(): Vtree.FormattingContext {\n return this.parent;\n }\n\n finishFragment() {\n this.cellFragments = [];\n }\n\n addRow(rowIndex: number, row: TableRow) {\n this.rows[rowIndex] = row;\n }\n\n getRowSlots(rowIndex: number): TableSlot[] {\n let rowSlots = this.slots[rowIndex];\n if (!rowSlots) {\n rowSlots = this.slots[rowIndex] = [];\n }\n return rowSlots;\n }\n\n addCell(rowIndex: number, cell: TableCell) {\n let row = this.rows[rowIndex];\n if (!row) {\n this.addRow(rowIndex, new TableRow(rowIndex, null));\n row = this.rows[rowIndex];\n }\n Asserts.assert(row);\n row.addCell(cell);\n const rowUpper = rowIndex + cell.rowSpan;\n let rowSlots = this.getRowSlots(rowIndex);\n let startColIndex = 0;\n while (rowSlots[startColIndex]) {\n startColIndex++;\n }\n for (; rowIndex < rowUpper; rowIndex++) {\n rowSlots = this.getRowSlots(rowIndex);\n for (let i = startColIndex; i < startColIndex + cell.colSpan; i++) {\n const slot = (rowSlots[i] = new TableSlot(rowIndex, i, cell));\n if (!cell.anchorSlot) {\n cell.setAnchorSlot(slot);\n }\n }\n }\n }\n\n getRowByIndex(index: number): TableRow {\n const row = this.rows[index];\n Asserts.assert(row);\n return row;\n }\n\n findRowIndexBySourceNode(sourceNode: Node): number {\n return this.rows.findIndex((row) => sourceNode === row.sourceNode);\n }\n\n addCellFragment(\n rowIndex: number,\n columnIndex: number,\n cellFragment: TableCellFragment,\n ) {\n let list = this.cellFragments[rowIndex];\n if (!list) {\n list = this.cellFragments[rowIndex] = [];\n }\n list[columnIndex] = cellFragment;\n }\n\n getCellsFallingOnRow(rowIndex: number): TableCell[] {\n const rowSlots = this.getRowSlots(rowIndex);\n return rowSlots.reduce((uniqueCells, slot) => {\n if (slot.cell !== uniqueCells[uniqueCells.length - 1]) {\n return uniqueCells.concat(slot.cell);\n } else {\n return uniqueCells;\n }\n }, []);\n }\n\n getRowSpanningCellsOverflowingTheRow(rowIndex: number): TableCell[] {\n return this.getCellsFallingOnRow(rowIndex).filter(\n (cell) => cell.rowIndex + cell.rowSpan - 1 > rowIndex,\n );\n }\n\n getCellFragmentOfCell(cell: TableCell): TableCellFragment {\n return (\n this.cellFragments[cell.rowIndex] &&\n this.cellFragments[cell.rowIndex][cell.columnIndex]\n );\n }\n\n isFreelyFragmentableRow(row: TableRow): boolean {\n return row.getMinimumHeight() > this.tableWidth / 2;\n }\n\n getColumnCount(): number {\n if (this.columnCount < 0) {\n this.columnCount = Math.max.apply(\n null,\n this.rows.map((row) =>\n row.cells.reduce((sum, c) => sum + c.colSpan, 0),\n ),\n );\n }\n return this.columnCount;\n }\n\n updateCellSizes(clientLayout: Vtree.ClientLayout) {\n this.rows.forEach((row) => {\n row.cells.forEach((cell) => {\n const rect = clientLayout.getElementClientRect(\n cell.viewElement as Element,\n );\n cell.viewElement = null;\n cell.setHeight(this.vertical ? rect[\"width\"] : rect[\"height\"]);\n });\n });\n }\n\n /**\n * @return position\n */\n findCellFromColumn(\n column: Layout.Column,\n ): { rowIndex: number; columnIndex: number } | null {\n if (!column) {\n return null;\n }\n let tableCell: TableCell = null;\n let row = 0;\n let col = 0;\n loop: for (row = 0; row < this.cellFragments.length; row++) {\n if (!this.cellFragments[row]) {\n continue;\n }\n for (col = 0; col < this.cellFragments[row].length; col++) {\n if (!this.cellFragments[row][col]) {\n continue;\n }\n if (column === this.cellFragments[row][col].pseudoColumn.getColumn()) {\n tableCell = this.rows[row].cells[col];\n break loop;\n }\n }\n }\n if (!tableCell) {\n return null;\n }\n for (; row < this.slots.length; row++) {\n for (; col < this.slots[row].length; col++) {\n const slot = this.slots[row][col];\n if (slot.cell === tableCell) {\n return { rowIndex: slot.rowIndex, columnIndex: slot.columnIndex };\n }\n }\n }\n return null;\n }\n\n collectElementsOffsetOfUpperCells(\n position: { rowIndex: number; columnIndex: number } | null,\n ): RepetitiveElement.ElementsOffset[] {\n const collected = [];\n return this.slots.reduce((repetitiveElements, row, index) => {\n if (index >= position.rowIndex) {\n return repetitiveElements;\n }\n const cellFragment =\n row[position.columnIndex] &&\n this.getCellFragmentOfCell(row[position.columnIndex].cell);\n if (!cellFragment || collected.includes(cellFragment)) {\n return repetitiveElements;\n }\n this.collectElementsOffsetFromColumn(\n cellFragment.pseudoColumn.getColumn(),\n repetitiveElements,\n );\n collected.push(cellFragment);\n return repetitiveElements;\n }, [] as RepetitiveElement.ElementsOffset[]);\n }\n\n collectElementsOffsetOfHighestColumn(): RepetitiveElement.ElementsOffset[] {\n const elementsInColumn = [];\n this.rows.forEach((row) => {\n row.cells.forEach((cell, index) => {\n if (!elementsInColumn[index]) {\n elementsInColumn[index] = { collected: [], elements: [] };\n }\n const state = elementsInColumn[index];\n const cellFragment = this.getCellFragmentOfCell(cell);\n if (!cellFragment || state.collected.includes(cellFragment)) {\n return;\n }\n this.collectElementsOffsetFromColumn(\n cellFragment.pseudoColumn.getColumn(),\n state.elements,\n );\n state.collected.push(cellFragment);\n });\n });\n return [\n new ElementsOffsetOfTableCell(\n elementsInColumn.map((entry) => entry.elements),\n ),\n ];\n }\n\n private collectElementsOffsetFromColumn(\n column: LayoutType.Column,\n repetitiveElements: RepetitiveElement.ElementsOffset[],\n ) {\n column.fragmentLayoutConstraints.forEach((constraint) => {\n if (\n RepetitiveElement.isInstanceOfRepetitiveElementsOwnerLayoutConstraint(\n constraint,\n )\n ) {\n const repetitiveElement = constraint.getRepetitiveElements();\n repetitiveElements.push(repetitiveElement);\n }\n if (Table.isInstanceOfTableRowLayoutConstraint(constraint)) {\n constraint\n .getElementsOffsetsForTableCell(null)\n .forEach((repetitiveElement) => {\n repetitiveElements.push(repetitiveElement);\n });\n }\n });\n }\n\n /** @override */\n saveState(): any {\n return [].concat(this.cellBreakPositions);\n }\n\n /** @override */\n restoreState(state: any) {\n this.cellBreakPositions = state as BrokenTableCellPosition[];\n }\n}\n\nexport class ElementsOffsetOfTableCell\n implements RepetitiveElement.ElementsOffset {\n constructor(\n public readonly repeatitiveElementsInColumns: RepetitiveElement.ElementsOffset[][],\n ) {}\n\n /** @override */\n calculateOffset(nodeContext: Vtree.NodeContext): number {\n return this.calculateMaxOffsetOfColumn(\n nodeContext,\n (offsets) => offsets.current,\n );\n }\n\n /** @override */\n calculateMinimumOffset(nodeContext: Vtree.NodeContext): number {\n return this.calculateMaxOffsetOfColumn(\n nodeContext,\n (offsets) => offsets.minimum,\n );\n }\n\n private calculateMaxOffsetOfColumn(nodeContext, resolver) {\n let maxOffset = 0;\n this.repeatitiveElementsInColumns.forEach((repetitiveElements) => {\n const offsets = BreakPosition.calculateOffset(\n nodeContext,\n repetitiveElements,\n );\n maxOffset = Math.max(maxOffset, resolver(offsets));\n });\n return maxOffset;\n }\n}\n\nfunction getTableFormattingContext(\n formattingContext: Vtree.FormattingContext,\n): TableFormattingContext {\n Asserts.assert(formattingContext instanceof TableFormattingContext);\n return formattingContext as TableFormattingContext;\n}\n\nfunction isTableRowGrouping(display: string | null): boolean {\n return (\n display === \"table-row-group\" ||\n display === \"table-header-group\" ||\n display === \"table-footer-group\"\n );\n}\n\nfunction isTableRoot(display: string | null): boolean {\n return display === \"table\" || display === \"inline-table\";\n}\n\nfunction isValidParentOfTableRow(display: string | null): boolean {\n return isTableRowGrouping(display) || isTableRoot(display);\n}\n\nfunction skipNestedTable(\n state: LayoutUtil.LayoutIteratorState,\n formattingContext: TableFormattingContext,\n column: Layout.Column,\n): Task.Result<boolean> | null {\n const nodeContext = state.nodeContext;\n const display = nodeContext.display;\n const parentDisplay = nodeContext.parent ? nodeContext.parent.display : null;\n\n // Is inline-table nested in another table?\n let isNestedInlineTable = false;\n if (\n parentDisplay === \"inline-table\" &&\n !(nodeContext.formattingContext instanceof TableFormattingContext)\n ) {\n for (let nc = nodeContext.parent; nc; nc = nc.parent) {\n if (nc.formattingContext instanceof TableFormattingContext) {\n isNestedInlineTable = nc.formattingContext === formattingContext;\n break;\n }\n }\n }\n const isNestedTable =\n isNestedInlineTable ||\n (display === \"table-row\" && !isValidParentOfTableRow(parentDisplay)) ||\n (display === \"table-cell\" &&\n parentDisplay !== \"table-row\" &&\n !isValidParentOfTableRow(parentDisplay)) ||\n (nodeContext.formattingContext instanceof TableFormattingContext &&\n nodeContext.formattingContext !== formattingContext);\n if (isNestedTable) {\n return column\n .buildDeepElementView(nodeContext)\n .thenAsync((nodeContextAfter) => {\n state.nodeContext = nodeContextAfter;\n return Task.newResult(true);\n });\n } else {\n return null;\n }\n}\n\nexport class EntireTableLayoutStrategy extends LayoutUtil.EdgeSkipper {\n rowIndex: number = -1;\n columnIndex: number = 0;\n inRow: boolean = false;\n checkPoints: Vtree.NodeContext[] = [];\n inHeaderOrFooter: boolean = false;\n\n constructor(\n public readonly formattingContext: TableFormattingContext,\n public readonly column: Layout.Column,\n ) {\n super();\n }\n\n /**\n * @override\n */\n startNonInlineElementNode(\n state: LayoutUtil.LayoutIteratorState,\n ): void | Task.Result<boolean> {\n const formattingContext = this.formattingContext;\n const r = skipNestedTable(state, formattingContext, this.column);\n if (r) {\n return r;\n }\n this.postLayoutBlockContents(state);\n const nodeContext = state.nodeContext;\n const display = nodeContext.display;\n const repetitiveElements = formattingContext.getRepetitiveElements();\n switch (display) {\n case \"table\":\n formattingContext.inlineBorderSpacing = nodeContext.inlineBorderSpacing;\n break;\n case \"table-caption\": {\n const captionView = new TableCaptionView(\n nodeContext.viewNode as Element,\n nodeContext.captionSide,\n );\n formattingContext.captions.push(captionView);\n break;\n }\n case \"table-header-group\":\n if (!repetitiveElements.isHeaderRegistered()) {\n this.inHeaderOrFooter = true;\n repetitiveElements.setHeaderNodeContext(nodeContext);\n }\n return Task.newResult(true);\n case \"table-footer-group\":\n if (!repetitiveElements.isFooterRegistered()) {\n this.inHeaderOrFooter = true;\n repetitiveElements.setFooterNodeContext(nodeContext);\n }\n return Task.newResult(true);\n case \"table-row\":\n if (!this.inHeaderOrFooter) {\n this.inRow = true;\n this.rowIndex++;\n Asserts.assert(nodeContext.sourceNode);\n this.columnIndex = 0;\n formattingContext.addRow(\n this.rowIndex,\n new TableRow(this.rowIndex, nodeContext.sourceNode),\n );\n if (!repetitiveElements.firstContentSourceNode) {\n repetitiveElements.firstContentSourceNode = nodeContext.sourceNode as Element;\n }\n }\n break;\n }\n return super.startNonInlineElementNode(state);\n }\n\n /**\n * @override\n */\n afterNonInlineElementNode(\n state: LayoutUtil.LayoutIteratorState,\n ): void | Task.Result<boolean> {\n const formattingContext = this.formattingContext;\n const nodeContext = state.nodeContext;\n const display = nodeContext.display;\n const clientLayout = this.column.clientLayout;\n this.postLayoutBlockContents(state);\n if (nodeContext.sourceNode === formattingContext.tableSourceNode) {\n const computedStyle = clientLayout.getElementComputedStyle(\n formattingContext.getRootViewNode(nodeContext) as Element,\n );\n formattingContext.tableWidth = parseFloat(\n computedStyle[formattingContext.vertical ? \"height\" : \"width\"],\n );\n formattingContext.getRepetitiveElements().lastContentSourceNode =\n state.lastAfterNodeContext &&\n (state.lastAfterNodeContext.sourceNode as Element);\n state.break = true;\n } else {\n switch (display) {\n case \"table-header-group\":\n case \"table-footer-group\":\n if (this.inHeaderOrFooter) {\n this.inHeaderOrFooter = false;\n return Task.newResult(true);\n }\n break;\n case \"table-row\":\n if (!this.inHeaderOrFooter) {\n formattingContext.lastRowViewNode = nodeContext.viewNode as Element;\n this.inRow = false;\n }\n break;\n case \"table-cell\":\n if (!this.inHeaderOrFooter) {\n if (!this.inRow) {\n this.rowIndex++;\n this.columnIndex = 0;\n this.inRow = true;\n }\n const elem = nodeContext.viewNode as Element;\n formattingContext.addCell(\n this.rowIndex,\n new TableCell(this.rowIndex, this.columnIndex, elem),\n );\n this.columnIndex++;\n }\n break;\n }\n }\n return super.afterNonInlineElementNode(state);\n }\n\n /** @override */\n startNonElementNode(\n state: LayoutUtil.LayoutIteratorState,\n ): void | Task.Result<boolean> {\n this.registerCheckPoint(state);\n }\n\n /** @override */\n afterNonElementNode(\n state: LayoutUtil.LayoutIteratorState,\n ): void | Task.Result<boolean> {\n this.registerCheckPoint(state);\n }\n\n /** @override */\n startInlineElementNode(\n state: LayoutUtil.LayoutIteratorState,\n ): void | Task.Result<boolean> {\n this.registerCheckPoint(state);\n }\n\n /** @override */\n afterInlineElementNode(\n state: LayoutUtil.LayoutIteratorState,\n ): void | Task.Result<boolean> {\n this.registerCheckPoint(state);\n }\n\n registerCheckPoint(state: LayoutUtil.LayoutIteratorState) {\n const nodeContext = state.nodeContext;\n if (\n nodeContext &&\n nodeContext.viewNode &&\n !LayoutHelper.isSpecialNodeContext(nodeContext)\n ) {\n this.checkPoints.push(nodeContext.clone());\n }\n }\n\n postLayoutBlockContents(state: LayoutUtil.LayoutIteratorState) {\n if (this.checkPoints.length > 0) {\n this.column.postLayoutBlock(state.nodeContext, this.checkPoints);\n }\n this.checkPoints = [];\n }\n}\n\nexport class TableLayoutStrategy extends LayoutUtil.EdgeSkipper {\n private static ignoreList: { [key: string]: boolean } = {\n \"table-caption\": true,\n \"table-column-group\": true,\n \"table-column\": true,\n };\n inRow: boolean = false;\n currentRowIndex: number = -1;\n currentColumnIndex: number = 0;\n originalStopAtOverflow: boolean;\n inHeader: boolean;\n inFooter: boolean;\n\n constructor(\n public readonly formattingContext: TableFormattingContext,\n public readonly column: Layout.Column,\n ) {\n super(true);\n this.originalStopAtOverflow = column.stopAtOverflow;\n column.stopAtOverflow = false;\n }\n\n resetColumn() {\n this.column.stopAtOverflow = this.originalStopAtOverflow;\n }\n\n getColSpanningCellWidth(cell: TableCell): number {\n const colWidths = this.formattingContext.colWidths;\n Asserts.assert(colWidths);\n let width = 0;\n for (let i = 0; i < cell.colSpan; i++) {\n width += colWidths[cell.anchorSlot.columnIndex + i];\n }\n width += this.formattingContext.inlineBorderSpacing * (cell.colSpan - 1);\n return width;\n }\n\n layoutCell(\n cell: TableCell,\n cellNodeContext: Vtree.NodeContext,\n startChunkPosition: Vtree.ChunkPosition,\n ): Task.Result<boolean> {\n const rowIndex = cell.rowIndex;\n const columnIndex = cell.columnIndex;\n const colSpan = cell.colSpan;\n const cellViewNode = cellNodeContext.viewNode as Element;\n const verticalAlign = cellNodeContext.verticalAlign;\n if (colSpan > 1) {\n Base.setCSSProperty(cellViewNode, \"box-sizing\", \"border-box\");\n Base.setCSSProperty(\n cellViewNode,\n this.formattingContext.vertical ? \"height\" : \"width\",\n `${this.getColSpanningCellWidth(cell)}px`,\n );\n }\n const pseudoColumnContainer = cellViewNode.ownerDocument.createElement(\n \"div\",\n );\n cellViewNode.appendChild(pseudoColumnContainer);\n const cellFragment = new TableCellFragment(\n this.column,\n pseudoColumnContainer,\n cellNodeContext,\n );\n this.formattingContext.addCellFragment(rowIndex, columnIndex, cellFragment);\n if (\n startChunkPosition.primary.steps.length === 1 &&\n startChunkPosition.primary.after\n ) {\n // Contents of the cell have ended in the previous fragment\n cellFragment.empty = true;\n }\n return cellFragment.pseudoColumn\n .layout(startChunkPosition, true)\n .thenReturn(true);\n }\n\n hasBrokenCellAtSlot(slotIndex): boolean {\n const cellBreakPosition = this.formattingContext.cellBreakPositions[0];\n if (cellBreakPosition) {\n return cellBreakPosition.cell.anchorSlot.columnIndex === slotIndex;\n }\n return false;\n }\n\n private extractRowSpanningCellBreakPositions(): BrokenTableCellPosition[][] {\n const cellBreakPositions = this.formattingContext.cellBreakPositions;\n if (cellBreakPositions.length === 0) {\n return [];\n }\n const rowSpanningCellBreakPositions = [];\n let i = 0;\n do {\n const p = cellBreakPositions[i];\n const rowIndex = p.cell.rowIndex;\n if (rowIndex < this.currentRowIndex) {\n let arr = rowSpanningCellBreakPositions[rowIndex];\n if (!arr) {\n arr = rowSpanningCellBreakPositions[rowIndex] = [];\n }\n arr.push(p);\n cellBreakPositions.splice(i, 1);\n } else {\n i++;\n }\n } while (i < cellBreakPositions.length);\n return rowSpanningCellBreakPositions;\n }\n\n layoutRowSpanningCellsFromPreviousFragment(\n state: LayoutUtil.LayoutIteratorState,\n ): Task.Result<boolean> {\n const formattingContext = this.formattingContext;\n const rowSpanningCellBreakPositions = this.extractRowSpanningCellBreakPositions();\n const rowCount = rowSpanningCellBreakPositions.reduce((s) => s + 1, 0);\n if (rowCount === 0) {\n return Task.newResult(true);\n }\n const layoutContext = this.column.layoutContext;\n const currentRow = state.nodeContext;\n currentRow.viewNode.parentNode.removeChild(currentRow.viewNode);\n const frame = Task.newFrame<boolean>(\n \"layoutRowSpanningCellsFromPreviousFragment\",\n );\n let cont = Task.newResult(true);\n let spanningCellRowIndex = 0;\n const occupiedSlotIndices = [];\n rowSpanningCellBreakPositions.forEach((rowCellBreakPositions) => {\n cont = cont.thenAsync(() => {\n // Is it always correct to assume steps[1] to be the row?\n const rowNodeContext = VtreeImpl.makeNodeContextFromNodePositionStep(\n rowCellBreakPositions[0].cellNodePosition.steps[1],\n currentRow.parent,\n );\n return layoutContext.setCurrent(rowNodeContext, false).thenAsync(() => {\n let cont1 = Task.newResult(true);\n let columnIndex = 0;\n\n function addDummyCellUntil(upperColumnIndex) {\n while (columnIndex < upperColumnIndex) {\n if (!occupiedSlotIndices.includes(columnIndex)) {\n const dummy = rowNodeContext.viewNode.ownerDocument.createElement(\n \"td\",\n );\n Base.setCSSProperty(dummy, \"padding\", \"0\");\n rowNodeContext.viewNode.appendChild(dummy);\n }\n columnIndex++;\n }\n }\n rowCellBreakPositions.forEach((cellBreakPosition) => {\n cont1 = cont1.thenAsync(() => {\n const cell = cellBreakPosition.cell;\n addDummyCellUntil(cell.anchorSlot.columnIndex);\n const cellNodePosition = cellBreakPosition.cellNodePosition;\n const cellNodeContext = VtreeImpl.makeNodeContextFromNodePositionStep(\n cellNodePosition.steps[0],\n rowNodeContext,\n );\n cellNodeContext.offsetInNode = cellNodePosition.offsetInNode;\n cellNodeContext.after = cellNodePosition.after;\n cellNodeContext.fragmentIndex =\n cellNodePosition.steps[0].fragmentIndex + 1;\n return layoutContext\n .setCurrent(cellNodeContext, false)\n .thenAsync(() => {\n const breakChunkPosition =\n cellBreakPosition.breakChunkPosition;\n for (let i = 0; i < cell.colSpan; i++) {\n occupiedSlotIndices.push(columnIndex + i);\n }\n columnIndex += cell.colSpan;\n return this.layoutCell(\n cell,\n cellNodeContext,\n breakChunkPosition,\n ).thenAsync(() => {\n (cellNodeContext.viewNode as HTMLTableCellElement).rowSpan =\n cell.rowIndex +\n cell.rowSpan -\n this.currentRowIndex +\n rowCount -\n spanningCellRowIndex;\n return Task.newResult(true);\n });\n });\n });\n });\n return cont1.thenAsync(() => {\n addDummyCellUntil(formattingContext.getColumnCount());\n spanningCellRowIndex++;\n return Task.newResult(true);\n });\n });\n });\n });\n cont.then(() => {\n layoutContext\n .setCurrent(currentRow, true, state.atUnforcedBreak)\n .then(() => {\n frame.finish(true);\n });\n });\n return frame.result();\n }\n\n startTableRow(state: LayoutUtil.LayoutIteratorState): Task.Result<boolean> {\n if (this.inHeader || this.inFooter) {\n return Task.newResult(true);\n }\n const nodeContext = state.nodeContext;\n const formattingContext = this.formattingContext;\n if (this.currentRowIndex < 0) {\n Asserts.assert(nodeContext.sourceNode);\n this.currentRowIndex = formattingContext.findRowIndexBySourceNode(\n nodeContext.sourceNode,\n );\n } else {\n this.currentRowIndex++;\n }\n this.currentColumnIndex = 0;\n this.inRow = true;\n return this.layoutRowSpanningCellsFromPreviousFragment(state).thenAsync(\n () => {\n this.registerCellFragmentIndex();\n const overflown = this.column.checkOverflowAndSaveEdgeAndBreakPosition(\n state.lastAfterNodeContext,\n null,\n true,\n state.breakAtTheEdge,\n );\n if (\n overflown &&\n formattingContext.getRowSpanningCellsOverflowingTheRow(\n this.currentRowIndex - 1,\n ).length === 0\n ) {\n this.resetColumn();\n nodeContext.overflow = true;\n state.break = true;\n }\n return Task.newResult(true);\n },\n );\n }\n\n private registerCellFragmentIndex() {\n const cells = this.formattingContext.getRowByIndex(this.currentRowIndex)\n .cells;\n cells.forEach((cell) => {\n const cellBreakPosition = this.formattingContext.cellBreakPositions[\n cell.columnIndex\n ];\n if (\n cellBreakPosition &&\n cellBreakPosition.cell.anchorSlot.columnIndex ==\n cell.anchorSlot.columnIndex\n ) {\n const tdNodeStep = cellBreakPosition.cellNodePosition.steps[0];\n const offset = (this.column\n .layoutContext as Vgen.ViewFactory).xmldoc.getElementOffset(\n tdNodeStep.node as Element,\n );\n Layout.registerFragmentIndex(offset, tdNodeStep.fragmentIndex + 1, 1);\n }\n });\n }\n\n startTableCell(state: LayoutUtil.LayoutIteratorState): Task.Result<boolean> {\n if (this.inHeader || this.inFooter) {\n return Task.newResult(true);\n }\n const nodeContext = state.nodeContext;\n if (!this.inRow) {\n if (this.currentRowIndex < 0) {\n this.currentRowIndex = 0;\n } else {\n this.currentRowIndex++;\n }\n this.currentColumnIndex = 0;\n this.inRow = true;\n }\n const cell = this.formattingContext.getRowByIndex(this.currentRowIndex)\n .cells[this.currentColumnIndex];\n const afterNodeContext = nodeContext.copy().modify();\n afterNodeContext.after = true;\n state.nodeContext = afterNodeContext;\n const frame = Task.newFrame<boolean>(\"startTableCell\");\n let cont: Task.Result<Vtree.ChunkPosition>;\n if (this.hasBrokenCellAtSlot(cell.anchorSlot.columnIndex)) {\n const cellBreakPosition = this.formattingContext.cellBreakPositions.shift();\n nodeContext.fragmentIndex =\n cellBreakPosition.cellNodePosition.steps[0].fragmentIndex + 1;\n cont = Task.newResult(cellBreakPosition.breakChunkPosition);\n } else {\n cont = this.column\n .nextInTree(nodeContext, state.atUnforcedBreak)\n .thenAsync((nextNodeContext) => {\n if (nextNodeContext.viewNode) {\n nodeContext.viewNode.removeChild(nextNodeContext.viewNode);\n }\n const startNodePosition = VtreeImpl.newNodePositionFromNodeContext(\n nextNodeContext,\n 0,\n );\n return Task.newResult(new VtreeImpl.ChunkPosition(startNodePosition));\n });\n }\n cont.then((startChunkPosition) => {\n Asserts.assert(nodeContext);\n this.layoutCell(cell, nodeContext, startChunkPosition).then(() => {\n this.afterNonInlineElementNode(state);\n this.currentColumnIndex++;\n frame.finish(true);\n });\n });\n return frame.result();\n }\n\n startNonInlineBox(\n state: LayoutUtil.LayoutIteratorState,\n ): Task.Result<boolean> {\n const r = skipNestedTable(\n state,\n getTableFormattingContext(this.formattingContext),\n this.column,\n );\n if (r) {\n return r;\n }\n const nodeContext = state.nodeContext;\n const repetitiveElements = this.formattingContext.getRepetitiveElements();\n const display = nodeContext.display;\n if (\n display === \"table-header-group\" &&\n repetitiveElements &&\n repetitiveElements.isHeaderSourceNode(nodeContext.sourceNode)\n ) {\n this.inHeader = true;\n return Task.newResult(true);\n } else if (\n display === \"table-footer-group\" &&\n repetitiveElements &&\n repetitiveElements.isFooterSourceNode(nodeContext.sourceNode)\n ) {\n this.inFooter = true;\n return Task.newResult(true);\n } else if (display === \"table-row\") {\n return this.startTableRow(state);\n } else if (display === \"table-cell\") {\n return this.startTableCell(state);\n } else {\n return Task.newResult(true);\n }\n }\n\n endNonInlineBox(state: LayoutUtil.LayoutIteratorState): Task.Result<boolean> {\n const nodeContext = state.nodeContext;\n const display = nodeContext.display;\n if (display === \"table-row\") {\n this.inRow = false;\n if (!this.inHeader && !this.inFooter) {\n const beforeNodeContext = nodeContext.copy().modify();\n beforeNodeContext.after = false;\n const bp = new InsideTableRowBreakPosition(\n this.currentRowIndex,\n beforeNodeContext,\n this.formattingContext,\n );\n this.column.breakPositions.push(bp);\n }\n }\n return Task.newResult(true);\n }\n\n afterNonInlineElementNode(\n state: LayoutUtil.LayoutIteratorState,\n ): void | Task.Result<boolean> {\n const nodeContext = state.nodeContext;\n const repetitiveElements = this.formattingContext.getRepetitiveElements();\n const display = nodeContext.display;\n if (display === \"table-header-group\") {\n if (\n repetitiveElements &&\n !repetitiveElements.allowInsertRepeatitiveElements &&\n repetitiveElements.isHeaderSourceNode(nodeContext.sourceNode)\n ) {\n this.inHeader = false;\n nodeContext.viewNode.parentNode.removeChild(nodeContext.viewNode);\n } else {\n Base.setCSSProperty(\n nodeContext.viewNode as Element,\n \"display\",\n \"table-row-group\",\n );\n }\n } else if (display === \"table-footer-group\") {\n if (\n repetitiveElements &&\n !repetitiveElements.allowInsertRepeatitiveElements &&\n repetitiveElements.isFooterSourceNode(nodeContext.sourceNode)\n ) {\n this.inFooter = false;\n nodeContext.viewNode.parentNode.removeChild(nodeContext.viewNode);\n } else {\n Base.setCSSProperty(\n nodeContext.viewNode as Element,\n \"display\",\n \"table-row-group\",\n );\n }\n }\n if (display && TableLayoutStrategy.ignoreList[display]) {\n nodeContext.viewNode.parentNode.removeChild(nodeContext.viewNode);\n } else if (\n nodeContext.sourceNode === this.formattingContext.tableSourceNode\n ) {\n nodeContext.overflow = this.column.checkOverflowAndSaveEdge(\n nodeContext,\n null,\n );\n this.resetColumn();\n state.break = true;\n } else {\n return super.afterNonInlineElementNode(state);\n }\n return Task.newResult(true);\n }\n}\n\ntype TableLayoutOption = {\n calculateBreakPositionsInside: boolean;\n};\nconst tableLayoutOptionCache: {\n root: Node;\n tableLayoutOption: TableLayoutOption;\n}[] = [];\n\nfunction getTableLayoutOption(\n tableRootSourceNode: Node,\n): TableLayoutOption | null {\n const i = tableLayoutOptionCache.findIndex(\n (c) => c.root === tableRootSourceNode,\n );\n const pair = tableLayoutOptionCache[i];\n return pair ? pair.tableLayoutOption : null;\n}\n\nfunction clearTableLayoutOptionCache(tableRootSourceNode: Node): void {\n const i = tableLayoutOptionCache.findIndex(\n (c) => c.root === tableRootSourceNode,\n );\n if (i >= 0) {\n tableLayoutOptionCache.splice(i, 1);\n }\n}\n\nexport class TableLayoutProcessor implements LayoutProcessor.LayoutProcessor {\n private layoutEntireTable(\n nodeContext: Vtree.NodeContext,\n column: Layout.Column,\n ): Task.Result<Vtree.NodeContext> {\n const formattingContext = getTableFormattingContext(\n nodeContext.formattingContext,\n );\n const strategy = new EntireTableLayoutStrategy(formattingContext, column);\n const iterator = new LayoutUtil.LayoutIterator(\n strategy,\n column.layoutContext,\n );\n return iterator.iterate(nodeContext);\n }\n\n private getColumnWidths(\n lastRow: Element,\n columnCount: number,\n vertical: boolean,\n clientLayout: Vtree.ClientLayout,\n ): number[] {\n const doc = lastRow.ownerDocument;\n const dummyRow = doc.createElement(\"tr\");\n const dummyCells = [];\n for (let i = 0; i < columnCount; i++) {\n const cell = doc.createElement(\"td\");\n dummyRow.appendChild(cell);\n dummyCells.push(cell);\n }\n lastRow.parentNode.insertBefore(dummyRow, lastRow.nextSibling);\n const colWidths = dummyCells.map((cell) => {\n const rect = clientLayout.getElementClientRect(cell);\n return vertical ? rect[\"height\"] : rect[\"width\"];\n });\n lastRow.parentNode.removeChild(dummyRow);\n return colWidths;\n }\n\n private getColGroupElements(tableElement: Element): Element[] {\n const colGroups = [];\n let child = tableElement.firstElementChild;\n while (child) {\n if (child.localName === \"colgroup\") {\n colGroups.push(child);\n }\n child = child.nextElementSibling;\n }\n return colGroups;\n }\n\n private normalizeAndGetColElements(colGroups: Element[]): Element[] {\n const cols = [];\n colGroups.forEach((colGroup) => {\n // Replace colgroup[span=n] with colgroup with n col elements\n let span = (colGroup as any).span;\n colGroup.removeAttribute(\"span\");\n let col = colGroup.firstElementChild;\n while (col) {\n if (col.localName === \"col\") {\n // Replace col[span=n] with n col elements\n let s = (col as any).span;\n col.removeAttribute(\"span\");\n span -= s;\n while (s-- > 1) {\n const cloned = col.cloneNode(true);\n colGroup.insertBefore(cloned, col);\n cols.push(cloned);\n }\n cols.push(col);\n }\n col = col.nextElementSibling;\n }\n while (span-- > 0) {\n col = colGroup.ownerDocument.createElement(\"col\");\n colGroup.appendChild(col);\n cols.push(col);\n }\n });\n return cols;\n }\n\n private addMissingColElements(\n cols: Element[],\n colGroups: Element[],\n columnCount: number,\n tableElement: Element,\n ) {\n if (cols.length < columnCount) {\n const colGroup = tableElement.ownerDocument.createElement(\"colgroup\");\n colGroups.push(colGroup);\n for (let i = cols.length; i < columnCount; i++) {\n const col = tableElement.ownerDocument.createElement(\"col\");\n colGroup.appendChild(col);\n cols.push(col);\n }\n }\n }\n\n /**\n * Measure width of columns and normalize colgroup and col elements so that\n * each column has a corresponding col element with the width specified.\n */\n normalizeColGroups(\n formattingContext: TableFormattingContext,\n tableElement: Element,\n column: Layout.Column,\n ) {\n const vertical = formattingContext.vertical;\n const lastRow = formattingContext.lastRowViewNode;\n if (!lastRow) {\n return;\n }\n Asserts.assert(lastRow);\n formattingContext.lastRowViewNode = null;\n const doc = lastRow.ownerDocument;\n const fragment = doc.createDocumentFragment();\n\n // Count columns\n const columnCount = formattingContext.getColumnCount();\n if (!(columnCount > 0)) {\n formattingContext.colGroups = fragment;\n return;\n }\n\n // Measure column widths\n const colWidths = (formattingContext.colWidths = this.getColumnWidths(\n lastRow,\n columnCount,\n vertical,\n column.clientLayout,\n ));\n\n // Normalize colgroup and col elements\n const colGroups = this.getColGroupElements(tableElement);\n const cols = this.normalizeAndGetColElements(colGroups);\n\n // Add missing col elements for remaining columns\n this.addMissingColElements(cols, colGroups, columnCount, tableElement);\n\n // Assign width to col elements\n cols.forEach((col, i) => {\n Base.setCSSProperty(\n col,\n vertical ? \"height\" : \"width\",\n `${colWidths[i]}px`,\n );\n });\n colGroups.forEach((colGroup) => {\n fragment.appendChild(colGroup.cloneNode(true));\n });\n formattingContext.colGroups = fragment;\n }\n\n doInitialLayout(\n nodeContext: Vtree.NodeContext,\n column: Layout.Column,\n ): Task.Result<Vtree.NodeContext> {\n const formattingContext = getTableFormattingContext(\n nodeContext.formattingContext,\n );\n formattingContext.vertical = nodeContext.vertical;\n formattingContext.initializeRepetitiveElements(nodeContext.vertical);\n Asserts.assert(nodeContext.sourceNode);\n const tableLayoutOption = getTableLayoutOption(nodeContext.sourceNode);\n clearTableLayoutOptionCache(nodeContext.sourceNode);\n const frame = Task.newFrame<Vtree.NodeContext>(\n \"TableLayoutProcessor.doInitialLayout\",\n );\n const initialNodeContext = nodeContext.copy();\n this.layoutEntireTable(nodeContext, column).then((nodeContextAfter) => {\n const tableElement = nodeContextAfter.viewNode as Element;\n const tableBBox = column.clientLayout.getElementClientRect(tableElement);\n let edge = column.vertical ? tableBBox.left : tableBBox.bottom;\n edge +=\n (column.vertical ? -1 : 1) *\n BreakPosition.calculateOffset(\n nodeContext,\n column.collectElementsOffset(),\n ).current;\n if (\n !column.isOverflown(edge) &&\n (!tableLayoutOption || !tableLayoutOption.calculateBreakPositionsInside)\n ) {\n column.breakPositions.push(\n new EntireTableBreakPosition(initialNodeContext),\n );\n frame.finish(nodeContextAfter);\n return;\n }\n this.normalizeColGroups(formattingContext, tableElement, column);\n formattingContext.updateCellSizes(column.clientLayout);\n frame.finish(null);\n });\n return frame.result();\n }\n\n addCaptions(\n formattingContext: TableFormattingContext,\n rootViewNode: Element,\n firstChild: Node | null,\n ) {\n const captions = formattingContext.captions;\n captions.forEach((caption, i) => {\n if (caption) {\n rootViewNode.insertBefore(caption.viewNode, firstChild);\n if (caption.side === \"top\") {\n captions[i] = null;\n }\n }\n });\n }\n\n addColGroups(\n formattingContext: TableFormattingContext,\n rootViewNode: Element,\n firstChild: Node | null,\n ) {\n if (\n formattingContext.colGroups &&\n this.getColGroupElements(rootViewNode).length === 0\n ) {\n rootViewNode.insertBefore(\n formattingContext.colGroups.cloneNode(true),\n firstChild,\n );\n }\n }\n\n removeColGroups(\n formattingContext: TableFormattingContext,\n rootViewNode: Element,\n ) {\n if (formattingContext.colGroups && rootViewNode) {\n const colGroups = this.getColGroupElements(rootViewNode);\n if (colGroups) {\n colGroups.forEach((colGroup) => {\n rootViewNode.removeChild(colGroup);\n });\n }\n }\n }\n\n doLayout(\n nodeContext: Vtree.NodeContext,\n column: Layout.Column,\n ): Task.Result<Vtree.NodeContext> {\n const formattingContext = getTableFormattingContext(\n nodeContext.formattingContext,\n );\n const rootViewNode = formattingContext.getRootViewNode(\n nodeContext,\n ) as Element;\n const firstChild = rootViewNode.firstChild;\n this.addCaptions(formattingContext, rootViewNode, firstChild);\n this.addColGroups(formattingContext, rootViewNode, firstChild);\n const strategy = new TableLayoutStrategy(formattingContext, column);\n const iterator = new LayoutUtil.LayoutIterator(\n strategy,\n column.layoutContext,\n );\n const frame = Task.newFrame<Vtree.NodeContext>(\n \"TableFormattingContext.doLayout\",\n );\n iterator.iterate(nodeContext).thenFinish(frame);\n return frame.result();\n }\n\n /**\n * @override\n */\n layout(\n nodeContext: Vtree.NodeContext,\n column: Layout.Column,\n leadingEdge: boolean,\n ): Task.Result<Vtree.NodeContext> {\n const formattingContext = getTableFormattingContext(\n nodeContext.formattingContext,\n );\n const rootViewNode = formattingContext.getRootViewNode(nodeContext);\n if (!rootViewNode) {\n return column.buildDeepElementView(nodeContext);\n } else {\n if (leadingEdge) {\n RepetitiveElementImpl.appendHeaderToAncestors(\n nodeContext.parent,\n column,\n );\n }\n return new LayoutRetryer(formattingContext, this).layout(\n nodeContext,\n column,\n );\n }\n }\n\n /**\n * @override\n */\n createEdgeBreakPosition(\n position: Vtree.NodeContext,\n breakOnEdge: string | null,\n overflows: boolean,\n columnBlockSize: number,\n ): LayoutType.BreakPosition {\n return new BetweenTableRowBreakPosition(\n position,\n breakOnEdge,\n overflows,\n columnBlockSize,\n );\n }\n\n /**\n * @override\n */\n startNonInlineElementNode(nodeContext: Vtree.NodeContext): boolean {\n return false;\n }\n\n /**\n * @override\n */\n afterNonInlineElementNode(\n nodeContext: Vtree.NodeContext,\n stopAtOverflow: boolean,\n ): boolean {\n return false;\n }\n\n /**\n * @override\n */\n finishBreak(\n column: Layout.Column,\n nodeContext: Vtree.NodeContext,\n forceRemoveSelf: boolean,\n endOfColumn: boolean,\n ): Task.Result<boolean> {\n const formattingContext = getTableFormattingContext(\n nodeContext.formattingContext,\n );\n if (nodeContext.display === \"table-row\") {\n Asserts.assert(nodeContext.sourceNode);\n const rowIndex = formattingContext.findRowIndexBySourceNode(\n nodeContext.sourceNode,\n );\n formattingContext.cellBreakPositions = [];\n let cells: TableCell[];\n if (!nodeContext.after) {\n cells = formattingContext.getCellsFallingOnRow(rowIndex);\n } else {\n cells = formattingContext.getRowSpanningCellsOverflowingTheRow(\n rowIndex,\n );\n }\n if (cells.length) {\n const frame = Task.newFrame<boolean>(\n \"TableLayoutProcessor.finishBreak\",\n );\n let i = 0;\n frame\n .loopWithFrame((loopFrame) => {\n if (i === cells.length) {\n loopFrame.breakLoop();\n return;\n }\n const cell = cells[i++];\n const cellFragment = formattingContext.getCellFragmentOfCell(cell);\n const breakNodeContext = cellFragment.findAcceptableBreakPosition()\n .nodeContext;\n Asserts.assert(breakNodeContext);\n const cellNodeContext = cellFragment.cellNodeContext;\n const cellNodePosition = cellNodeContext.toNodePosition();\n const breakChunkPosition = new VtreeImpl.ChunkPosition(\n breakNodeContext.toNodePosition(),\n );\n formattingContext.cellBreakPositions.push({\n cellNodePosition,\n breakChunkPosition,\n cell,\n } as BrokenTableCellPosition);\n const cellViewNode = cellNodeContext.viewNode as HTMLTableCellElement;\n cellFragment.column.layoutContext.processFragmentedBlockEdge(\n cellFragment.cellNodeContext,\n );\n if (rowIndex < cell.rowIndex + cell.rowSpan - 1) {\n cellViewNode.rowSpan = rowIndex - cell.rowIndex + 1;\n }\n if (!cellFragment.empty) {\n cellFragment.pseudoColumn\n .finishBreak(breakNodeContext, false, true)\n .then(() => {\n Asserts.assert(cellFragment);\n adjustCellHeight(\n cellFragment,\n formattingContext,\n breakNodeContext,\n );\n loopFrame.continueLoop();\n });\n } else {\n loopFrame.continueLoop();\n }\n })\n .then(() => {\n column.clearOverflownViewNodes(nodeContext, false);\n column.layoutContext.processFragmentedBlockEdge(nodeContext);\n formattingContext.finishFragment();\n frame.finish(true);\n });\n return frame.result();\n }\n }\n formattingContext.finishFragment();\n return LayoutProcessor.blockLayoutProcessor.finishBreak(\n column,\n nodeContext,\n forceRemoveSelf,\n endOfColumn,\n );\n }\n\n /** @override */\n clearOverflownViewNodes(\n column: Layout.Column,\n parentNodeContext: Vtree.NodeContext,\n nodeContext: Vtree.NodeContext,\n removeSelf: boolean,\n ) {\n LayoutProcessor.BlockLayoutProcessor.prototype.clearOverflownViewNodes(\n column,\n parentNodeContext,\n nodeContext,\n removeSelf,\n );\n }\n}\n\nfunction adjustCellHeight(\n cellFragment: TableCellFragment,\n formattingContext: TableFormattingContext,\n breakNodeContext: Vtree.NodeContext,\n): void {\n const repetitiveElements = formattingContext.getRepetitiveElements();\n if (!repetitiveElements) {\n return;\n }\n const vertical = formattingContext.vertical;\n const column = cellFragment.column;\n const cellContentElement = cellFragment.pseudoColumn.getColumnElement();\n const cellElement = cellFragment.cellNodeContext.viewNode as Element;\n const cellElementRect = column.clientLayout.getElementClientRect(cellElement);\n const padding = column.getComputedPaddingBorder(cellElement);\n if (vertical) {\n const width =\n cellElementRect.right -\n column.footnoteEdge -\n repetitiveElements.calculateOffset(breakNodeContext) -\n padding.right;\n Base.setCSSProperty(cellContentElement, \"max-width\", `${width}px`);\n } else {\n const height =\n column.footnoteEdge -\n repetitiveElements.calculateOffset(breakNodeContext) -\n cellElementRect.top -\n padding.top;\n Base.setCSSProperty(cellContentElement, \"max-height\", `${height}px`);\n }\n Base.setCSSProperty(cellContentElement, \"overflow\", \"hidden\");\n}\n\nexport class LayoutRetryer extends LayoutRetryers.AbstractLayoutRetryer {\n constructor(\n private tableFormattingContext: TableFormattingContext,\n private readonly processor: TableLayoutProcessor,\n ) {\n super();\n }\n\n /**\n * @override\n */\n resolveLayoutMode(nodeContext: Vtree.NodeContext): LayoutType.LayoutMode {\n const repetitiveElements = this.tableFormattingContext.getRepetitiveElements();\n if (!repetitiveElements || !repetitiveElements.doneInitialLayout) {\n return new LayoutEntireTable(this.tableFormattingContext, this.processor);\n } else {\n if (\n nodeContext.sourceNode ===\n this.tableFormattingContext.tableSourceNode &&\n !nodeContext.after\n ) {\n if (repetitiveElements) {\n repetitiveElements.preventSkippingHeader();\n }\n }\n return new LayoutFragmentedTable(\n this.tableFormattingContext,\n this.processor,\n );\n }\n }\n\n /**\n * @override\n */\n clearNodes(initialPosition: Vtree.NodeContext) {\n super.clearNodes(initialPosition);\n const rootViewNode = this.tableFormattingContext.getRootViewNode(\n initialPosition,\n );\n this.processor.removeColGroups(this.tableFormattingContext, rootViewNode);\n }\n\n /**\n * @override\n */\n restoreState(nodeContext: Vtree.NodeContext, column: Layout.Column) {\n super.restoreState(nodeContext, column);\n this.tableFormattingContext.finishFragment();\n }\n}\n\nexport class LayoutEntireTable extends RepetitiveElementImpl.LayoutEntireBlock {\n constructor(\n formattingContext: TableFormattingContext,\n public readonly processor: TableLayoutProcessor,\n ) {\n super(formattingContext);\n }\n\n /**\n * @override\n */\n doLayout(\n nodeContext: Vtree.NodeContext,\n column: Layout.Column,\n ): Task.Result<Vtree.NodeContext> {\n return this.processor.doInitialLayout(nodeContext, column);\n }\n}\n\nexport class EntireTableBreakPosition extends BreakPosition.EdgeBreakPosition {\n constructor(tableNodeContext: Vtree.NodeContext) {\n super(tableNodeContext, null, tableNodeContext.overflow, 0);\n }\n\n /**\n * @override\n */\n getMinBreakPenalty(): number {\n if (!this.isEdgeUpdated) {\n throw new Error(\"EdgeBreakPosition.prototype.updateEdge not called\");\n }\n return (\n (this.overflows ? 3 : 0) +\n (this.position.parent ? this.position.parent.breakPenalty : 0)\n );\n }\n\n /**\n * @override\n */\n breakPositionChosen(column: Layout.Column): void {\n column.fragmentLayoutConstraints.push(\n new EntireTableLayoutConstraint(this.position.sourceNode),\n );\n }\n}\n\nexport class EntireTableLayoutConstraint\n implements Layout.FragmentLayoutConstraint {\n flagmentLayoutConstraintType: FragmentLayoutConstraintType = \"EntireTable\";\n\n constructor(public tableRootNode: Node) {}\n\n /**\n * @override\n */\n allowLayout(\n nodeContext: Vtree.NodeContext,\n overflownNodeContext: Vtree.NodeContext,\n column: Layout.Column,\n ): boolean {\n // If the nodeContext overflows, any EntireTableLayoutConstraint should not\n // be registered in the first place. See\n // TableLayoutProcessor.prototype.doInitialLayout.\n Asserts.assert(!nodeContext.overflow);\n return false;\n }\n\n /**\n * @override\n */\n nextCandidate(nodeContext: Vtree.NodeContext): boolean {\n return true;\n }\n\n /**\n * @override\n */\n postLayout(\n allowed: boolean,\n positionAfter: Vtree.NodeContext,\n initialPosition: Vtree.NodeContext,\n column: Layout.Column,\n ) {\n Asserts.assert(positionAfter.sourceNode);\n tableLayoutOptionCache.push({\n root: positionAfter.sourceNode,\n tableLayoutOption: {\n calculateBreakPositionsInside: true,\n } as TableLayoutOption,\n });\n }\n\n /**\n * @override\n */\n finishBreak(\n nodeContext: Vtree.NodeContext,\n column: Layout.Column,\n ): Task.Result<boolean> {\n return Task.newResult(true);\n }\n\n /**\n * @override\n */\n equalsTo(constraint: Layout.FragmentLayoutConstraint): boolean {\n return (\n constraint instanceof EntireTableLayoutConstraint &&\n constraint.tableRootNode === this.tableRootNode\n );\n }\n\n /**\n * @override\n */\n getPriorityOfFinishBreak(): number {\n return 0;\n }\n}\n\nexport class LayoutFragmentedTable extends RepetitiveElementImpl.LayoutFragmentedBlock {\n constructor(\n formattingContext: TableFormattingContext,\n public readonly processor: TableLayoutProcessor,\n ) {\n super(formattingContext);\n }\n\n /**\n * @override\n */\n doLayout(\n nodeContext: Vtree.NodeContext,\n column: Layout.Column,\n ): Task.Result<Vtree.NodeContext> {\n const repetitiveElements = this.formattingContext.getRepetitiveElements();\n if (\n repetitiveElements &&\n !repetitiveElements.isAfterLastContent(nodeContext)\n ) {\n const constraint = new TableRowLayoutConstraint(nodeContext);\n if (\n !column.fragmentLayoutConstraints.some((c) => constraint.equalsTo(c))\n ) {\n column.fragmentLayoutConstraints.unshift(constraint);\n }\n }\n return this.processor.doLayout(nodeContext, column);\n }\n}\n\nexport class TableRowLayoutConstraint\n extends RepetitiveElementImpl.RepetitiveElementsOwnerLayoutConstraint\n implements Table.TableRowLayoutConstraint {\n flagmentLayoutConstraintType: FragmentLayoutConstraintType = \"TableRow\";\n cellFragmentLayoutConstraints: {\n constraints: Layout.FragmentLayoutConstraint[];\n breakPosition: Vtree.NodeContext;\n }[] = [];\n\n constructor(nodeContext: Vtree.NodeContext) {\n super(nodeContext);\n }\n\n /** @override */\n allowLayout(\n nodeContext: Vtree.NodeContext,\n overflownNodeContext: Vtree.NodeContext,\n column: Layout.Column,\n ): boolean {\n const repetitiveElements = this.getRepetitiveElements();\n if (!repetitiveElements) {\n return true;\n }\n if (column.pseudoParent) {\n return true;\n }\n if (LayoutHelper.isOrphan(this.nodeContext.viewNode)) {\n return true;\n }\n if (!repetitiveElements.isEnableToUpdateState()) {\n return true;\n }\n if (\n (overflownNodeContext && !nodeContext) ||\n (nodeContext && nodeContext.overflow)\n ) {\n return false;\n } else {\n return true;\n }\n }\n\n /** @override */\n nextCandidate(nodeContext: Vtree.NodeContext): boolean {\n const formattingContext = getTableFormattingContext(\n this.nodeContext.formattingContext,\n );\n const cellFragmentConstraints = this.collectCellFragmentLayoutConstraints(\n nodeContext,\n formattingContext,\n );\n if (\n cellFragmentConstraints.some((entry) =>\n entry.constraints.some((constraint) =>\n constraint.nextCandidate(nodeContext),\n ),\n )\n ) {\n return true;\n }\n return super.nextCandidate(nodeContext);\n }\n\n /** @override */\n postLayout(\n allowed: boolean,\n positionAfter: Vtree.NodeContext,\n initialPosition: Vtree.NodeContext,\n column: Layout.Column,\n ) {\n const formattingContext = getTableFormattingContext(\n this.nodeContext.formattingContext,\n );\n this.cellFragmentLayoutConstraints = this.collectCellFragmentLayoutConstraints(\n positionAfter,\n formattingContext,\n );\n this.cellFragmentLayoutConstraints.forEach((entry) => {\n entry.constraints.forEach((constraint) => {\n constraint.postLayout(\n allowed,\n entry.breakPosition,\n initialPosition,\n column,\n );\n });\n });\n if (!allowed) {\n const rootViewNode = formattingContext.getRootViewNode(this.nodeContext);\n new TableLayoutProcessor().removeColGroups(\n formattingContext,\n rootViewNode as Element,\n );\n this.removeDummyRowNodes(initialPosition);\n }\n super.postLayout(allowed, positionAfter, initialPosition, column);\n }\n\n /** @override */\n finishBreak(\n nodeContext: Vtree.NodeContext,\n column: Layout.Column,\n ): Task.Result<boolean> {\n const formattingContext = getTableFormattingContext(\n this.nodeContext.formattingContext,\n );\n const frame: Task.Frame<boolean> = Task.newFrame(\"finishBreak\");\n const constraints = this.cellFragmentLayoutConstraints.reduce(\n (array, entry) =>\n array.concat(\n entry.constraints.map((constraint) => ({\n constraint,\n breakPosition: entry.breakPosition,\n })),\n ),\n [],\n );\n let i = 0;\n frame\n .loop(() => {\n if (i < constraints.length) {\n const entry = constraints[i++];\n return entry.constraint\n .finishBreak(entry.breakPosition, column)\n .thenReturn(true);\n } else {\n return Task.newResult(false);\n }\n })\n .then(() => {\n frame.finish(true);\n });\n return frame\n .result()\n .thenAsync(() => super.finishBreak(nodeContext, column));\n }\n\n removeDummyRowNodes(nodeContext: Vtree.NodeContext) {\n if (\n !nodeContext ||\n nodeContext.display !== \"table-row\" ||\n !nodeContext.viewNode\n ) {\n return;\n }\n while ((nodeContext.viewNode as Element).previousElementSibling) {\n const dummyNode = (nodeContext.viewNode as Element)\n .previousElementSibling;\n if (dummyNode.parentNode) {\n dummyNode.parentNode.removeChild(dummyNode);\n }\n }\n }\n\n private collectCellFragmentLayoutConstraints(\n nodeContext: Vtree.NodeContext,\n formattingContext: TableFormattingContext,\n ): {\n constraints: Layout.FragmentLayoutConstraint[];\n breakPosition: Vtree.NodeContext;\n }[] {\n return this.getCellFragemnts(nodeContext, formattingContext).map(\n (entry) => ({\n constraints: entry.fragment.pseudoColumn.getColumn()\n .fragmentLayoutConstraints,\n breakPosition: entry.breakPosition,\n }),\n );\n }\n\n private getCellFragemnts(\n nodeContext: Vtree.NodeContext,\n formattingContext: TableFormattingContext,\n ): { fragment: TableCellFragment; breakPosition: Vtree.NodeContext }[] {\n let rowIndex = Number.MAX_VALUE;\n if (nodeContext && nodeContext.display === \"table-row\") {\n Asserts.assert(nodeContext.sourceNode);\n rowIndex =\n formattingContext.findRowIndexBySourceNode(nodeContext.sourceNode) + 1;\n }\n rowIndex = Math.min(formattingContext.cellFragments.length, rowIndex);\n const cellFragments = [];\n for (let i = 0; i < rowIndex; i++) {\n if (!formattingContext.cellFragments[i]) {\n continue;\n }\n formattingContext.cellFragments[i].forEach((cellFragment) => {\n if (!cellFragment) {\n return;\n }\n cellFragments.push({\n fragment: cellFragment,\n breakPosition: cellFragment.findAcceptableBreakPosition().nodeContext,\n });\n });\n }\n return cellFragments;\n }\n\n getElementsOffsetsForTableCell(\n column: Layout.Column,\n ): RepetitiveElement.ElementsOffset[] {\n const formattingContext = getTableFormattingContext(\n this.nodeContext.formattingContext,\n );\n const position = formattingContext.findCellFromColumn(column);\n if (position) {\n return formattingContext.collectElementsOffsetOfUpperCells(position);\n } else {\n return formattingContext.collectElementsOffsetOfHighestColumn();\n }\n }\n\n /** @override */\n equalsTo(constraint: Layout.FragmentLayoutConstraint): boolean {\n if (!(constraint instanceof TableRowLayoutConstraint)) {\n return false;\n }\n return (\n getTableFormattingContext(this.nodeContext.formattingContext) ===\n getTableFormattingContext(constraint.nodeContext.formattingContext)\n );\n }\n}\n\nconst tableLayoutProcessor = new TableLayoutProcessor();\n\nfunction resolveFormattingContextHook(\n nodeContext: Vtree.NodeContext,\n firstTime: boolean,\n display: Css.Ident,\n position: Css.Ident,\n floatSide: Css.Ident,\n isRoot: boolean,\n): TableFormattingContext | null {\n if (!firstTime) {\n return null;\n }\n if (display === Css.ident.table) {\n const parent = nodeContext.parent;\n return new TableFormattingContext(\n parent ? parent.formattingContext : null,\n nodeContext.sourceNode as Element,\n );\n }\n return null;\n}\n\nfunction resolveLayoutProcessor(\n formattingContext,\n): TableLayoutProcessor | null {\n if (formattingContext instanceof TableFormattingContext) {\n return tableLayoutProcessor;\n }\n return null;\n}\n\nPlugin.registerHook(\n Plugin.HOOKS.RESOLVE_FORMATTING_CONTEXT,\n resolveFormattingContextHook,\n);\n\nPlugin.registerHook(\n Plugin.HOOKS.RESOLVE_LAYOUT_PROCESSOR,\n resolveLayoutProcessor,\n);\n","/**\n * Copyright 2017 Trim-marks Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview MathUtil - Math utilities\n */\nexport function mean(array: number[]): number {\n return array.reduce((prev, curr) => prev + curr, 0) / array.length;\n}\n\nexport function variance(array: number[]): number {\n const meanValue = mean(array);\n return mean(\n array.map((x) => {\n const d = x - meanValue;\n return d * d;\n }),\n );\n}\n","/**\n * Copyright 2017 Trim-marks Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Columns - Control column layout.\n */\nimport * as Asserts from \"./asserts\";\nimport * as Css from \"./css\";\nimport * as MathUtil from \"./math-util\";\nimport * as PageFloats from \"./page-floats\";\nimport * as Task from \"./task\";\nimport * as Vtree from \"./vtree\";\nimport { Layout } from \"./types\";\n\nexport type ColumnLayoutResult = {\n columns: Layout.Column[];\n position: Vtree.LayoutPosition;\n columnPageFloatLayoutContexts?: PageFloats.PageFloatLayoutContext[];\n};\n\nexport type ColumnGenerator = () => Task.Result<ColumnLayoutResult | null>;\n\nexport class ColumnBalancingTrialResult {\n constructor(\n public readonly layoutResult: ColumnLayoutResult,\n public readonly penalty: number,\n ) {}\n}\n\nfunction getBlockSize(container: Vtree.Container): number {\n if (container.vertical) {\n return container.width;\n } else {\n return container.height;\n }\n}\n\nfunction setBlockSize(container: Vtree.Container, size: number) {\n if (container.vertical) {\n container.width = size;\n } else {\n container.height = size;\n }\n}\n\nexport abstract class ColumnBalancer {\n originalContainerBlockSize: number;\n\n constructor(\n public readonly layoutContainer: Vtree.Container,\n public readonly columnGenerator: ColumnGenerator,\n public readonly regionPageFloatLayoutContext: PageFloats.PageFloatLayoutContext,\n ) {\n this.originalContainerBlockSize = getBlockSize(layoutContainer);\n }\n\n balanceColumns(\n layoutResult: ColumnLayoutResult,\n ): Task.Result<ColumnLayoutResult> {\n const frame: Task.Frame<ColumnLayoutResult> = Task.newFrame(\n \"ColumnBalancer#balanceColumns\",\n );\n this.preBalance(layoutResult);\n this.savePageFloatLayoutContexts(layoutResult);\n this.layoutContainer.clear();\n const candidates = [this.createTrialResult(layoutResult)];\n frame\n .loopWithFrame((loopFrame) => {\n if (!this.hasNextCandidate(candidates)) {\n loopFrame.breakLoop();\n return;\n }\n this.updateCondition(candidates);\n this.columnGenerator().then((layoutResult) => {\n this.savePageFloatLayoutContexts(layoutResult);\n this.layoutContainer.clear();\n if (!layoutResult) {\n loopFrame.breakLoop();\n return;\n }\n candidates.push(this.createTrialResult(layoutResult));\n loopFrame.continueLoop();\n });\n })\n .then(() => {\n const result = candidates.reduce(\n (prev, curr) => (curr.penalty < prev.penalty ? curr : prev),\n candidates[0],\n );\n this.restoreContents(result.layoutResult);\n this.postBalance();\n frame.finish(result.layoutResult);\n });\n return frame.result();\n }\n\n private createTrialResult(\n layoutResult: ColumnLayoutResult,\n ): ColumnBalancingTrialResult {\n const penalty = this.calculatePenalty(layoutResult);\n return new ColumnBalancingTrialResult(layoutResult, penalty);\n }\n\n protected preBalance(layoutResult: ColumnLayoutResult) {}\n\n protected abstract calculatePenalty(layoutResult: ColumnLayoutResult): number;\n\n protected abstract hasNextCandidate(\n candidates: ColumnBalancingTrialResult[],\n ): boolean;\n\n protected abstract updateCondition(\n candidates: ColumnBalancingTrialResult[],\n ): void;\n\n protected postBalance() {\n setBlockSize(this.layoutContainer, this.originalContainerBlockSize);\n }\n\n savePageFloatLayoutContexts(layoutResult: ColumnLayoutResult | null) {\n const children = this.regionPageFloatLayoutContext.detachChildren();\n if (layoutResult) {\n layoutResult.columnPageFloatLayoutContexts = children;\n }\n }\n\n private restoreContents(newLayoutResult: ColumnLayoutResult) {\n const parent = this.layoutContainer.element;\n newLayoutResult.columns.forEach((c) => {\n parent.appendChild(c.element);\n });\n Asserts.assert(newLayoutResult.columnPageFloatLayoutContexts);\n this.regionPageFloatLayoutContext.attachChildren(\n newLayoutResult.columnPageFloatLayoutContexts,\n );\n }\n}\nconst COLUMN_LENGTH_STEP = 1;\n\nexport function canReduceContainerSize(\n candidates: ColumnBalancingTrialResult[],\n): boolean {\n const lastCandidate = candidates[candidates.length - 1];\n if (lastCandidate.penalty === 0) {\n return false;\n }\n const secondLastCandidate = candidates[candidates.length - 2];\n if (\n secondLastCandidate &&\n lastCandidate.penalty >= secondLastCandidate.penalty\n ) {\n return false;\n }\n const columns = lastCandidate.layoutResult.columns;\n const maxColumnBlockSize = Math.max.apply(\n null,\n columns.map((c) => c.computedBlockSize),\n );\n const maxPageFloatBlockSize = Math.max.apply(\n null,\n columns.map((c) => c.getMaxBlockSizeOfPageFloats()),\n );\n return maxColumnBlockSize > maxPageFloatBlockSize + COLUMN_LENGTH_STEP;\n}\n\nexport function reduceContainerSize(\n candidates: ColumnBalancingTrialResult[],\n container: Vtree.Container,\n): void {\n const columns = candidates[candidates.length - 1].layoutResult.columns;\n const maxColumnBlockSize = Math.max.apply(\n null,\n columns.map((c) => {\n if (!isNaN(c.blockDistanceToBlockEndFloats)) {\n return (\n c.computedBlockSize -\n c.blockDistanceToBlockEndFloats +\n COLUMN_LENGTH_STEP\n );\n } else {\n return c.computedBlockSize;\n }\n }),\n );\n const newEdge = maxColumnBlockSize - COLUMN_LENGTH_STEP;\n if (newEdge < getBlockSize(container)) {\n setBlockSize(container, newEdge);\n } else {\n setBlockSize(container, getBlockSize(container) - 1);\n }\n}\n\nexport class BalanceLastColumnBalancer extends ColumnBalancer {\n originalPosition: Vtree.LayoutPosition | null = null;\n foundUpperBound: boolean = false;\n\n constructor(\n columnGenerator: ColumnGenerator,\n regionPageFloatLayoutContext,\n layoutContainer: Vtree.Container,\n public readonly columnCount: number,\n ) {\n super(layoutContainer, columnGenerator, regionPageFloatLayoutContext);\n }\n\n /**\n * @override\n */\n preBalance(layoutResult: ColumnLayoutResult) {\n const columns = layoutResult.columns;\n const totalBlockSize = columns.reduce(\n (prev, c) => prev + c.computedBlockSize,\n 0,\n );\n setBlockSize(this.layoutContainer, totalBlockSize / this.columnCount);\n this.originalPosition = layoutResult.position;\n }\n\n private checkPosition(position: Vtree.LayoutPosition | null): boolean {\n if (this.originalPosition) {\n return this.originalPosition.isSamePosition(position);\n } else {\n return position === null;\n }\n }\n\n /**\n * @override\n */\n calculatePenalty(layoutResult: ColumnLayoutResult): number {\n if (!this.checkPosition(layoutResult.position)) {\n return Infinity;\n }\n const columns = layoutResult.columns;\n if (isLastColumnLongerThanAnyOtherColumn(columns)) {\n return Infinity;\n }\n return Math.max.apply(\n null,\n columns.map((c) => c.computedBlockSize),\n );\n }\n\n /**\n * @override\n */\n hasNextCandidate(candidates: ColumnBalancingTrialResult[]): boolean {\n if (candidates.length === 1) {\n return true;\n } else if (this.foundUpperBound) {\n return canReduceContainerSize(candidates);\n } else {\n const lastCandidate = candidates[candidates.length - 1];\n if (this.checkPosition(lastCandidate.layoutResult.position)) {\n if (\n !isLastColumnLongerThanAnyOtherColumn(\n lastCandidate.layoutResult.columns,\n )\n ) {\n this.foundUpperBound = true;\n return true;\n }\n }\n return (\n getBlockSize(this.layoutContainer) < this.originalContainerBlockSize\n );\n }\n }\n\n /**\n * @override\n */\n updateCondition(candidates: ColumnBalancingTrialResult[]): void {\n if (this.foundUpperBound) {\n reduceContainerSize(candidates, this.layoutContainer);\n } else {\n const newEdge = Math.min(\n this.originalContainerBlockSize,\n getBlockSize(this.layoutContainer) +\n this.originalContainerBlockSize * 0.1,\n );\n setBlockSize(this.layoutContainer, newEdge);\n }\n }\n}\n\nfunction isLastColumnLongerThanAnyOtherColumn(\n columns: Layout.Column[],\n): boolean {\n if (columns.length <= 1) {\n return false;\n }\n const lastColumnBlockSize = columns[columns.length - 1].computedBlockSize;\n const otherColumns = columns.slice(0, columns.length - 1);\n return otherColumns.every((c) => lastColumnBlockSize > c.computedBlockSize);\n}\n\nexport class BalanceNonLastColumnBalancer extends ColumnBalancer {\n constructor(\n columnGenerator: ColumnGenerator,\n regionPageFloatLayoutContext,\n layoutContainer: Vtree.Container,\n ) {\n super(layoutContainer, columnGenerator, regionPageFloatLayoutContext);\n }\n\n /**\n * @override\n */\n calculatePenalty(layoutResult: ColumnLayoutResult): number {\n if (layoutResult.columns.every((c) => c.computedBlockSize === 0)) {\n return Infinity;\n }\n const computedBlockSizes = layoutResult.columns\n .filter((c) => !c.pageBreakType)\n .map((c) => c.computedBlockSize);\n return MathUtil.variance(computedBlockSizes);\n }\n\n /**\n * @override\n */\n hasNextCandidate(candidates: ColumnBalancingTrialResult[]): boolean {\n return canReduceContainerSize(candidates);\n }\n\n /**\n * @override\n */\n updateCondition(candidates: ColumnBalancingTrialResult[]): void {\n reduceContainerSize(candidates, this.layoutContainer);\n }\n}\n\nexport function createColumnBalancer(\n columnCount: number,\n columnFill: Css.Ident,\n columnGenerator: ColumnGenerator,\n regionPageFloatLayoutContext: PageFloats.PageFloatLayoutContext,\n layoutContainer: Vtree.Container,\n columns: Layout.Column[],\n flowPosition: Vtree.FlowPosition,\n): ColumnBalancer | null {\n if (columnFill === Css.ident.auto) {\n return null;\n } else {\n // TODO: how to handle a case where no more in-flow contents but some\n // page floats\n const noMoreContent = flowPosition.positions.length === 0;\n const lastColumn = columns[columns.length - 1];\n const isLastColumnForceBroken = !!(lastColumn && lastColumn.pageBreakType);\n if (noMoreContent || isLastColumnForceBroken) {\n return new BalanceLastColumnBalancer(\n columnGenerator,\n regionPageFloatLayoutContext,\n layoutContainer,\n columnCount,\n );\n } else if (columnFill === Css.ident.balance_all) {\n return new BalanceNonLastColumnBalancer(\n columnGenerator,\n regionPageFloatLayoutContext,\n layoutContainer,\n );\n } else {\n Asserts.assert(columnFill === Css.ident.balance);\n return null;\n }\n }\n}\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2015 Trim-marks Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview CssValidator - Parse validation rules (validation.txt), validate\n * properties and shorthands.\n */\nimport * as Css from \"./css\";\nimport * as CssParser from \"./css-parser\";\nimport * as CssTokenizer from \"./css-tokenizer\";\nimport * as Logging from \"./logging\";\nimport { ValidationTxt } from \"./assets\";\n\nexport interface PropertyReceiver {\n unknownProperty(name: string, value: Css.Val): void;\n\n invalidPropertyValue(name: string, value: Css.Val): void;\n\n simpleProperty(name: string, value: Css.Val, important): void;\n}\n\nexport class Node {\n success: Node = null;\n failure: Node = null;\n code: number = 0;\n\n constructor(public validator: PropertyValidator) {}\n\n isSpecial(): boolean {\n return this.code != 0;\n }\n\n markAsStartGroup(): void {\n this.code = -1;\n }\n\n isStartGroup(): boolean {\n return this.code == -1;\n }\n\n markAsEndGroup(): void {\n this.code = -2;\n }\n\n isEndGroup(): boolean {\n return this.code == -2;\n }\n\n markAsStartAlternate(index: number): void {\n this.code = 2 * index + 1;\n }\n\n isStartAlternate(): boolean {\n return this.code > 0 && this.code % 2 != 0;\n }\n\n markAsEndAlternate(index: number): void {\n this.code = 2 * index + 2;\n }\n\n isEndAlternate(): boolean {\n return this.code > 0 && this.code % 2 == 0;\n }\n\n getAlternate(): number {\n return Math.floor((this.code - 1) / 2);\n }\n}\n\nexport class Connection {\n what: number = -1;\n\n constructor(public where: number, public success: boolean) {}\n}\n\n/**\n * @enum {number}\n */\nexport enum Add {\n FOLLOW = 1,\n OPTIONAL,\n REPEATED,\n ALTERNATE,\n}\n\n/**\n * A class to build a list validator from other validators.\n */\nexport class ValidatingGroup {\n nodes: Node[] = [];\n connections: Connection[] = [];\n match: number[] = []; // connector indicies\n nomatch: number[] = []; // connector indicies\n error: number[] = []; // connector indicies\n emptyHead: boolean = true;\n\n connect(arr: number[], nodeIndex: number): void {\n for (let i = 0; i < arr.length; i++) {\n this.connections[arr[i]].what = nodeIndex;\n }\n arr.splice(0, arr.length);\n }\n\n clone(): ValidatingGroup {\n const group = new ValidatingGroup();\n for (let i = 0; i < this.nodes.length; i++) {\n const node = this.nodes[i];\n const clonedNode = new Node(node.validator);\n clonedNode.code = node.code;\n group.nodes.push(clonedNode);\n }\n for (let i = 0; i < this.connections.length; i++) {\n const connection = this.connections[i];\n const groupConnection = new Connection(\n connection.where,\n connection.success,\n );\n groupConnection.what = connection.what;\n group.connections.push(groupConnection);\n }\n group.match.push(...this.match);\n group.nomatch.push(...this.nomatch);\n group.error.push(...this.error);\n return group;\n }\n\n /**\n * Add \"special\" validation node to a given array (match, nomatch, or error).\n * @param start if this a start or the end of a clause/group\n * @param clause 0 indicates group start/end, otherwise clause index\n */\n private addSpecialToArr(arr: number[], start: boolean, clause: number): void {\n const index = this.nodes.length;\n const node = new Node(ALWAYS_FAIL);\n if (clause >= 0) {\n if (start) {\n node.markAsStartAlternate(clause);\n } else {\n node.markAsEndAlternate(clause);\n }\n } else {\n if (start) {\n node.markAsStartGroup();\n } else {\n node.markAsEndGroup();\n }\n }\n this.nodes.push(node);\n this.connect(arr, index);\n const success = new Connection(index, true);\n const failure = new Connection(index, false);\n arr.push(this.connections.length);\n this.connections.push(failure);\n arr.push(this.connections.length);\n this.connections.push(success);\n }\n\n endSpecialGroup(): void {\n const arrs = [this.match, this.nomatch, this.error];\n for (let i = 0; i < arrs.length; i++) {\n this.addSpecialToArr(arrs[i], false, -1);\n }\n }\n\n startSpecialGroup(): void {\n if (this.nodes.length) {\n throw new Error(\"invalid call\");\n }\n this.addSpecialToArr(this.match, true, -1);\n }\n\n endClause(clause: number): void {\n this.addSpecialToArr(this.match, false, clause);\n }\n\n startClause(clause: number): void {\n if (this.nodes.length) {\n throw new Error(\"invalid call\");\n }\n const node = new Node(ALWAYS_FAIL);\n node.markAsStartAlternate(clause);\n this.nodes.push(node);\n const success = new Connection(0, true);\n const failure = new Connection(0, false);\n this.nomatch.push(this.connections.length);\n this.connections.push(failure);\n this.match.push(this.connections.length);\n this.connections.push(success);\n }\n\n addPrimitive(validator: PropertyValidator): void {\n const index = this.nodes.length;\n this.nodes.push(new Node(validator));\n const success = new Connection(index, true);\n const failure = new Connection(index, false);\n this.connect(this.match, index);\n if (this.emptyHead) {\n // if did not validate -> no match\n this.nomatch.push(this.connections.length);\n this.emptyHead = false;\n } else {\n // if did not validate -> failure\n this.error.push(this.connections.length);\n }\n this.connections.push(failure);\n this.match.push(this.connections.length);\n this.connections.push(success);\n }\n\n isSimple(): boolean {\n return this.nodes.length == 1 && !this.nodes[0].isSpecial();\n }\n\n isPrimitive(): boolean {\n return (\n this.isSimple() && this.nodes[0].validator instanceof PrimitiveValidator\n );\n }\n\n addGroup(group: ValidatingGroup, how: Add): void {\n if (group.nodes.length == 0) {\n return;\n }\n const index = this.nodes.length;\n\n // optimization for alternate primitive validators\n if (\n how == Add.ALTERNATE &&\n index == 1 &&\n group.isPrimitive() &&\n this.isPrimitive()\n ) {\n this.nodes[0].validator = (this.nodes[0]\n .validator as PrimitiveValidator).combine(\n group.nodes[0].validator as PrimitiveValidator,\n );\n return;\n }\n for (let i = 0; i < group.nodes.length; i++) {\n this.nodes.push(group.nodes[i]);\n }\n\n // nodes[index] is group start\n if (how == Add.ALTERNATE) {\n this.emptyHead = true;\n this.connect(this.nomatch, index);\n } else {\n this.connect(this.match, index);\n }\n const connectionIndex = this.connections.length;\n for (let i = 0; i < group.connections.length; i++) {\n const connection = group.connections[i];\n connection.where += index;\n if (connection.what >= 0) {\n connection.what += index;\n }\n this.connections.push(connection);\n }\n for (let i = 0; i < group.match.length; i++) {\n this.match.push(group.match[i] + connectionIndex);\n }\n if (how == Add.REPEATED) {\n this.connect(this.match, index);\n }\n if (how == Add.OPTIONAL || how == Add.REPEATED) {\n for (let i = 0; i < group.nomatch.length; i++) {\n this.match.push(group.nomatch[i] + connectionIndex);\n }\n } else if (this.emptyHead) {\n for (let i = 0; i < group.nomatch.length; i++) {\n this.nomatch.push(group.nomatch[i] + connectionIndex);\n }\n this.emptyHead = group.emptyHead;\n } else {\n for (let i = 0; i < group.nomatch.length; i++) {\n this.error.push(group.nomatch[i] + connectionIndex);\n }\n }\n for (let i = 0; i < group.error.length; i++) {\n this.error.push(group.error[i] + connectionIndex);\n }\n\n // invalidate group\n group.nodes = null;\n group.connections = null;\n }\n\n /**\n * @return how\n */\n finish(successTerminal: Node, failTerminal: Node): Node {\n const index = this.nodes.length;\n this.nodes.push(successTerminal);\n this.nodes.push(failTerminal);\n this.connect(this.match, index);\n this.connect(this.nomatch, index + 1);\n this.connect(this.error, index + 1);\n for (const connection of this.connections) {\n if (connection.success) {\n this.nodes[connection.where].success = this.nodes[connection.what];\n } else {\n this.nodes[connection.where].failure = this.nodes[connection.what];\n }\n }\n\n // make sure that our data structure is correct\n for (let j = 0; j < index; j++) {\n if (this.nodes[j].failure == null || this.nodes[j].success == null) {\n throw new Error(\"Invalid validator state\");\n }\n }\n return this.nodes[0];\n }\n}\n\nexport const ALLOW_EMPTY = 1;\n\nexport const ALLOW_STR = 2;\n\nexport const ALLOW_IDENT = 4;\n\nexport const ALLOW_POS_NUMERIC = 8;\n\nexport const ALLOW_POS_NUM = 16;\n\nexport const ALLOW_POS_INT = 32;\n\nexport const ALLOW_COLOR = 64;\n\nexport const ALLOW_URL = 128;\n\nexport const ALLOW_NEGATIVE = 256;\n\nexport const ALLOW_ZERO = 512;\n\nexport const ALLOW_ZERO_PERCENT = 1024;\n\nexport const ALLOW_SLASH = 2048;\n\nexport type ValueMap = {\n [key: string]: Css.Val;\n};\n\n/**\n * Abstract class to validate simple CSS property value (not a shorthand)\n */\nexport class PropertyValidator extends Css.Visitor {\n constructor() {\n super();\n }\n\n /**\n * Validate a subsequence of the given values from the given index. Return the\n * list of matched values or null if there is no match.\n */\n validateForShorthand(values: Css.Val[], index: number): Css.Val[] {\n const rval = values[index].visit(this);\n if (rval) {\n return [rval];\n }\n return null;\n }\n}\n\n/**\n * Validate a primitive CSS value (not a list or function).\n * @param allowed mask of ALLOW_*** constants.\n */\nexport class PrimitiveValidator extends PropertyValidator {\n constructor(\n public readonly allowed: number,\n public readonly idents: ValueMap,\n public readonly units: ValueMap,\n ) {\n super();\n }\n\n /**\n * @override\n */\n visitEmpty(empty: Css.Val): Css.Val {\n if (this.allowed & ALLOW_EMPTY) {\n return empty;\n }\n return null;\n }\n\n /**\n * @override\n */\n visitSlash(slash: Css.Val): Css.Val {\n if (this.allowed & ALLOW_SLASH) {\n return slash;\n }\n return null;\n }\n\n /**\n * @override\n */\n visitStr(str: Css.Str): Css.Val {\n if (this.allowed & ALLOW_STR) {\n return str;\n }\n return null;\n }\n\n /**\n * @override\n */\n visitIdent(ident: Css.Ident): Css.Val {\n const val = this.idents[ident.name.toLowerCase()];\n if (val) {\n return val;\n }\n if (this.allowed & ALLOW_IDENT) {\n return ident;\n }\n return null;\n }\n\n /**\n * @override\n */\n visitNumeric(numeric: Css.Numeric): Css.Val {\n if (numeric.num == 0 && !(this.allowed & ALLOW_ZERO)) {\n if (numeric.unit == \"%\" && this.allowed & ALLOW_ZERO_PERCENT) {\n return numeric;\n }\n return null;\n }\n if (numeric.num < 0 && !(this.allowed & ALLOW_NEGATIVE)) {\n return null;\n }\n if (this.units[numeric.unit]) {\n return numeric;\n }\n return null;\n }\n\n /**\n * @override\n */\n visitNum(num: Css.Num): Css.Val {\n if (num.num == 0) {\n return this.allowed & ALLOW_ZERO ? num : null;\n }\n if (num.num <= 0 && !(this.allowed & ALLOW_NEGATIVE)) {\n return null;\n }\n if (this.allowed & ALLOW_POS_NUM) {\n return num;\n }\n return null;\n }\n\n /**\n * @override\n */\n visitInt(num: Css.Int): Css.Val {\n if (num.num == 0) {\n return this.allowed & ALLOW_ZERO ? num : null;\n }\n if (num.num <= 0 && !(this.allowed & ALLOW_NEGATIVE)) {\n return null;\n }\n if (this.allowed & (ALLOW_POS_INT | ALLOW_POS_NUM)) {\n return num;\n }\n const val = this.idents[`${num.num}`];\n if (val) {\n return val;\n }\n return null;\n }\n\n /**\n * @override\n */\n visitColor(color: Css.Color): Css.Val {\n if (this.allowed & ALLOW_COLOR) {\n return color;\n }\n return null;\n }\n\n /**\n * @override\n */\n visitURL(url: Css.URL): Css.Val {\n if (this.allowed & ALLOW_URL) {\n return url;\n }\n return null;\n }\n\n /**\n * @override\n */\n visitSpaceList(list: Css.SpaceList): Css.Val {\n return null;\n }\n\n /**\n * @override\n */\n visitCommaList(list: Css.CommaList): Css.Val {\n return null;\n }\n\n /**\n * @override\n */\n visitFunc(func: Css.Func): Css.Val {\n return null;\n }\n\n /**\n * @override\n */\n visitExpr(expr: Css.Expr): Css.Val {\n if (this.allowed & 0x7fe) {\n // ALLOW_STR|ALLOW_IDENT|...|ALLOW_ZERO_PERCENT\n return expr;\n }\n return null;\n }\n\n combine(other: PrimitiveValidator): PrimitiveValidator {\n const idents: ValueMap = {};\n const units: ValueMap = {};\n for (const ident in this.idents) {\n idents[ident] = this.idents[ident];\n }\n for (const ident in other.idents) {\n idents[ident] = other.idents[ident];\n }\n for (const unit in this.units) {\n units[unit] = this.units[unit];\n }\n for (const unit in other.units) {\n units[unit] = other.units[unit];\n }\n return new PrimitiveValidator(this.allowed | other.allowed, idents, units);\n }\n}\n\nconst NO_IDENTS = {};\n\nexport const ALWAYS_FAIL = new PrimitiveValidator(0, NO_IDENTS, NO_IDENTS);\n\n/**\n * Base class for list validation.\n */\nexport class ListValidator extends PropertyValidator {\n successTerminal: Node;\n failureTerminal: Node;\n first: Node;\n\n constructor(group: ValidatingGroup) {\n super();\n this.successTerminal = new Node(null);\n this.failureTerminal = new Node(null);\n this.first = group.finish(this.successTerminal, this.failureTerminal);\n }\n\n validateList(arr: Css.Val[], slice: boolean, startIndex: number): Css.Val[] {\n let out: Css.Val[] = slice ? [] : arr;\n let current = this.first;\n let index = startIndex;\n let alternativeStack: string[][] = null;\n let alternatives: string[] = null;\n while (\n current !== this.successTerminal &&\n current !== this.failureTerminal\n ) {\n if (index >= arr.length) {\n current = current.failure;\n continue;\n }\n const inval = arr[index];\n let outval = inval;\n if (current.isSpecial()) {\n let success = true;\n if (current.isStartGroup()) {\n if (alternativeStack) {\n alternativeStack.push(alternatives);\n } else {\n alternativeStack = [alternatives];\n }\n alternatives = [];\n } else if (current.isEndGroup()) {\n if (alternativeStack.length > 0) {\n alternatives = alternativeStack.pop();\n } else {\n alternatives = null;\n }\n } else if (current.isEndAlternate()) {\n alternatives[current.getAlternate()] = \"taken\";\n } else {\n success = alternatives[current.getAlternate()] == null;\n }\n current = success ? current.success : current.failure;\n } else {\n if (\n index == 0 &&\n !slice &&\n current.validator instanceof SpaceListValidator &&\n this instanceof SpaceListValidator\n ) {\n // Special nesting case: validate the input space list as a whole.\n outval = new Css.SpaceList(arr).visit(current.validator);\n if (outval) {\n index = arr.length;\n current = current.success;\n continue;\n }\n } else if (\n index == 0 &&\n !slice &&\n current.validator instanceof CommaListValidator &&\n this instanceof SpaceListValidator\n ) {\n // Special nesting case: validate the input comma list as a whole.\n outval = new Css.CommaList(arr).visit(current.validator);\n if (outval) {\n index = arr.length;\n current = current.success;\n continue;\n }\n } else {\n outval = inval.visit(current.validator);\n }\n if (!outval) {\n current = current.failure;\n continue;\n }\n if (outval !== inval && arr === out) {\n // startIndex is zero here\n out = [];\n for (let k = 0; k < index; k++) {\n out[k] = arr[k];\n }\n }\n if (arr !== out) {\n out[index - startIndex] = outval;\n }\n index++;\n current = current.success;\n }\n }\n if (current === this.successTerminal) {\n if (slice ? out.length > 0 : index == arr.length) {\n return out;\n }\n }\n return null;\n }\n\n validateSingle(inval: Css.Val): Css.Val {\n // no need to worry about \"specials\"\n let outval: Css.Val = null;\n let current = this.first;\n while (\n current !== this.successTerminal &&\n current !== this.failureTerminal\n ) {\n if (!inval) {\n current = current.failure;\n continue;\n }\n if (current.isSpecial()) {\n current = current.success;\n continue;\n }\n outval = inval.visit(current.validator);\n if (!outval) {\n current = current.failure;\n continue;\n }\n inval = null;\n current = current.success;\n }\n if (current === this.successTerminal) {\n return outval;\n }\n return null;\n }\n\n /**\n * @override\n */\n visitEmpty(empty: Css.Val): Css.Val {\n return this.validateSingle(empty);\n }\n\n /**\n * @override\n */\n visitSlash(slash: Css.Val): Css.Val {\n return this.validateSingle(slash);\n }\n\n /**\n * @override\n */\n visitStr(str: Css.Str): Css.Val {\n return this.validateSingle(str);\n }\n\n /**\n * @override\n */\n visitIdent(ident: Css.Ident): Css.Val {\n return this.validateSingle(ident);\n }\n\n /**\n * @override\n */\n visitNumeric(numeric: Css.Numeric): Css.Val {\n return this.validateSingle(numeric);\n }\n\n /**\n * @override\n */\n visitNum(num: Css.Num): Css.Val {\n return this.validateSingle(num);\n }\n\n /**\n * @override\n */\n visitInt(num: Css.Int): Css.Val {\n return this.validateSingle(num);\n }\n\n /**\n * @override\n */\n visitColor(color: Css.Color): Css.Val {\n return this.validateSingle(color);\n }\n\n /**\n * @override\n */\n visitURL(url: Css.URL): Css.Val {\n return this.validateSingle(url);\n }\n\n /**\n * @override\n */\n visitSpaceList(list: Css.SpaceList): Css.Val {\n return null;\n }\n\n /**\n * @override\n */\n visitCommaList(list: Css.CommaList): Css.Val {\n return null;\n }\n\n /**\n * @override\n */\n visitFunc(func: Css.Func): Css.Val {\n return this.validateSingle(func);\n }\n\n /**\n * @override\n */\n visitExpr(expr: Css.Expr): Css.Val {\n return null;\n }\n}\n\nexport class SpaceListValidator extends ListValidator {\n constructor(group: ValidatingGroup) {\n super(group);\n }\n\n /**\n * @override\n */\n visitSpaceList(list: Css.SpaceList): Css.Val {\n const arr = this.validateList(list.values, false, 0);\n if (arr === list.values) {\n return list;\n }\n if (!arr) {\n return null;\n }\n return new Css.SpaceList(arr);\n }\n\n /**\n * @override\n */\n visitCommaList(list: Css.CommaList): Css.Val {\n // Special Case : Issue #156\n let node = this.first;\n let hasCommaListValidator = false;\n while (node) {\n if (node.validator instanceof CommaListValidator) {\n hasCommaListValidator = true;\n break;\n }\n node = node.failure;\n }\n if (hasCommaListValidator) {\n const arr = this.validateList(list.values, false, 0);\n if (arr === list.values) {\n return list;\n }\n if (!arr) {\n return null;\n }\n return new Css.CommaList(arr);\n }\n return null;\n }\n\n /**\n * @override\n */\n validateForShorthand(values: Css.Val[], index: number): Css.Val[] {\n return this.validateList(values, true, index);\n }\n}\n\nexport class CommaListValidator extends ListValidator {\n constructor(group: ValidatingGroup) {\n super(group);\n }\n\n /**\n * @override\n */\n visitSpaceList(list: Css.SpaceList): Css.Val {\n return this.validateSingle(list);\n }\n\n /**\n * @override\n */\n visitCommaList(list: Css.CommaList): Css.Val {\n const arr = this.validateList(list.values, false, 0);\n if (arr === list.values) {\n return list;\n }\n if (!arr) {\n return null;\n }\n return new Css.CommaList(arr);\n }\n\n /**\n * @override\n */\n validateForShorthand(values: Css.Val[], index: number): Css.Val[] {\n let current = this.first;\n let rval: Css.Val[];\n while (current !== this.failureTerminal) {\n rval = current.validator.validateForShorthand(values, index);\n if (rval) {\n return rval;\n }\n current = current.failure;\n }\n return null;\n }\n}\n\nexport class FuncValidator extends ListValidator {\n constructor(public readonly name: string, group: ValidatingGroup) {\n super(group);\n }\n\n /**\n * @override\n */\n validateSingle(inval: Css.Val): Css.Val {\n return null;\n }\n\n /**\n * @override\n */\n visitFunc(func: Css.Func): Css.Val {\n if (func.name.toLowerCase() != this.name) {\n return null;\n }\n const arr = this.validateList(func.values, false, 0);\n if (arr === func.values) {\n return func;\n }\n if (!arr) {\n return null;\n }\n return new Css.Func(func.name, arr);\n }\n}\n\n//----------------------- Shorthands\n//------------------------------------------------------------\nexport class ShorthandSyntaxNode {\n /**\n * @return new index.\n */\n tryParse(\n values: Css.Val[],\n index: number,\n shorthandValidator: ShorthandValidator,\n ): number {\n return index;\n }\n\n success(rval: Css.Val, shorthandValidator: ShorthandValidator): void {}\n}\n\nexport class ShorthandSyntaxProperty extends ShorthandSyntaxNode {\n validator: PropertyValidator;\n\n constructor(validatorSet: ValidatorSet, public readonly name: string) {\n super();\n this.validator = validatorSet.validators[this.name];\n }\n\n /**\n * @override\n */\n tryParse(\n values: Css.Val[],\n index: number,\n shorthandValidator: ShorthandValidator,\n ): number {\n if (shorthandValidator.values[this.name]) {\n return index;\n }\n const rvals = this.validator.validateForShorthand(values, index);\n if (rvals) {\n const len = rvals.length;\n const rval = len > 1 ? new Css.SpaceList(rvals) : rvals[0];\n this.success(rval, shorthandValidator);\n return index + len;\n }\n return index;\n }\n\n /**\n * @override\n */\n success(rval: Css.Val, shorthandValidator: ShorthandValidator): void {\n shorthandValidator.values[this.name] = rval;\n }\n}\n\nexport class ShorthandSyntaxPropertyN extends ShorthandSyntaxProperty {\n constructor(validatorSet: ValidatorSet, public readonly names: string[]) {\n super(validatorSet, names[0]);\n }\n\n /**\n * @override\n */\n success(rval: Css.Val, shorthandValidator: ShorthandValidator): void {\n for (let i = 0; i < this.names.length; i++) {\n shorthandValidator.values[this.names[i]] = rval;\n }\n }\n}\n\nexport class ShorthandSyntaxCompound extends ShorthandSyntaxNode {\n constructor(\n public readonly nodes: ShorthandSyntaxNode[],\n public readonly slash: boolean,\n ) {\n super();\n }\n\n /**\n * @override\n */\n tryParse(\n values: Css.Val[],\n index: number,\n shorthandValidator: ShorthandValidator,\n ): number {\n const index0 = index;\n if (this.slash) {\n if (values[index] == Css.slash) {\n if (++index == values.length) {\n return index0;\n }\n } else {\n return index0;\n }\n }\n let newIndex = this.nodes[0].tryParse(values, index, shorthandValidator);\n if (newIndex == index) {\n return index0;\n }\n index = newIndex;\n for (let i = 1; i < this.nodes.length && index < values.length; i++) {\n newIndex = this.nodes[i].tryParse(values, index, shorthandValidator);\n if (newIndex == index) {\n break;\n }\n index = newIndex;\n }\n return index;\n }\n}\n\nexport class ShorthandValidator extends Css.Visitor {\n syntax: ShorthandSyntaxNode[] = null;\n propList: string[] = null;\n error: boolean = false;\n values: ValueMap = {};\n validatorSet: ValidatorSet = null;\n\n setOwner(validatorSet: ValidatorSet) {\n this.validatorSet = validatorSet;\n }\n\n syntaxNodeForProperty(name: string): ShorthandSyntaxNode {\n return new ShorthandSyntaxProperty(this.validatorSet, name);\n }\n\n clone(): this {\n const other = new (this.constructor as any)();\n other.syntax = this.syntax;\n other.propList = this.propList;\n other.validatorSet = this.validatorSet;\n return other;\n }\n\n init(syntax: ShorthandSyntaxNode[], propList: string[]): void {\n this.syntax = syntax;\n this.propList = propList;\n }\n\n finish(important: boolean, receiver: PropertyReceiver): boolean {\n if (!this.error) {\n for (const name of this.propList) {\n receiver.simpleProperty(\n name,\n this.values[name] || this.validatorSet.defaultValues[name],\n important,\n );\n }\n return true;\n }\n return false;\n }\n\n propagateInherit(important: boolean, receiver: PropertyReceiver): void {\n for (const name of this.propList) {\n receiver.simpleProperty(name, Css.ident.inherit, important);\n }\n }\n\n validateList(list: Css.Val[]): number {\n this.error = true;\n return 0;\n }\n\n validateSingle(val: Css.Val): Css.Val {\n this.validateList([val]);\n return null;\n }\n\n /**\n * @override\n */\n visitEmpty(empty: Css.Val): Css.Val {\n return this.validateSingle(empty);\n }\n\n /**\n * @override\n */\n visitStr(str: Css.Str): Css.Val {\n return this.validateSingle(str);\n }\n\n /**\n * @override\n */\n visitIdent(ident: Css.Ident): Css.Val {\n return this.validateSingle(ident);\n }\n\n /**\n * @override\n */\n visitNumeric(numeric: Css.Numeric): Css.Val {\n return this.validateSingle(numeric);\n }\n\n /**\n * @override\n */\n visitNum(num: Css.Num): Css.Val {\n return this.validateSingle(num);\n }\n\n /**\n * @override\n */\n visitInt(num: Css.Int): Css.Val {\n return this.validateSingle(num);\n }\n\n /**\n * @override\n */\n visitColor(color: Css.Color): Css.Val {\n return this.validateSingle(color);\n }\n\n /**\n * @override\n */\n visitURL(url: Css.URL): Css.Val {\n return this.validateSingle(url);\n }\n\n /**\n * @override\n */\n visitSpaceList(list: Css.SpaceList): Css.Val {\n this.validateList(list.values);\n return null;\n }\n\n /**\n * @override\n */\n visitCommaList(list: Css.CommaList): Css.Val {\n this.error = true;\n return null;\n }\n\n /**\n * @override\n */\n visitFunc(func: Css.Func): Css.Val {\n return this.validateSingle(func);\n }\n\n /**\n * @override\n */\n visitExpr(expr: Css.Expr): Css.Val {\n this.error = true;\n return null;\n }\n}\n\nexport class SimpleShorthandValidator extends ShorthandValidator {\n constructor() {\n super();\n }\n\n /**\n * @override\n */\n validateList(list: Css.Val[]): number {\n let index = 0;\n let i = 0;\n while (index < list.length) {\n const newIndex = this.syntax[i].tryParse(list, index, this);\n if (newIndex > index) {\n index = newIndex;\n i = 0;\n continue;\n }\n if (++i == this.syntax.length) {\n this.error = true;\n break;\n }\n }\n return index;\n }\n}\n\nexport class InsetsShorthandValidator extends ShorthandValidator {\n constructor() {\n super();\n }\n\n /**\n * @override\n */\n validateList(list: Css.Val[]): number {\n if (list.length > this.syntax.length || list.length == 0) {\n this.error = true;\n return 0;\n }\n for (let i = 0; i < this.syntax.length; i++) {\n let index = i;\n while (index >= list.length) {\n index = index == 1 ? 0 : index - 2;\n }\n if (this.syntax[i].tryParse(list, index, this) != index + 1) {\n this.error = true;\n return 0;\n }\n }\n return list.length;\n }\n\n createSyntaxNode(): ShorthandSyntaxPropertyN {\n return new ShorthandSyntaxPropertyN(this.validatorSet, this.propList);\n }\n}\n\nexport class InsetsSlashShorthandValidator extends ShorthandValidator {\n constructor() {\n super();\n }\n\n /**\n * @override\n */\n validateList(list: Css.Val[]): number {\n let slashIndex = list.length;\n for (let i = 0; i < list.length; i++) {\n if (list[i] === Css.slash) {\n slashIndex = i;\n break;\n }\n }\n if (slashIndex > this.syntax.length || list.length == 0) {\n this.error = true;\n return 0;\n }\n for (let i = 0; i < this.syntax.length; i++) {\n let index0 = i;\n while (index0 >= slashIndex) {\n index0 = index0 == 1 ? 0 : index0 - 2;\n }\n let index1: number;\n if (slashIndex + 1 < list.length) {\n index1 = slashIndex + i + 1;\n while (index1 >= list.length) {\n index1 = index1 - (index1 == slashIndex + 2 ? 1 : 2);\n }\n } else {\n index1 = index0;\n }\n const vals = [list[index0], list[index1]];\n if (this.syntax[i].tryParse(vals, 0, this) != 2) {\n this.error = true;\n return 0;\n }\n }\n return list.length;\n }\n}\n\nexport class CommaShorthandValidator extends SimpleShorthandValidator {\n constructor() {\n super();\n }\n\n mergeIn(acc: { [key: string]: Css.Val[] }, values: ValueMap) {\n for (const name of this.propList) {\n const val = values[name] || this.validatorSet.defaultValues[name];\n let arr = acc[name];\n if (!arr) {\n arr = [];\n acc[name] = arr;\n }\n arr.push(val);\n }\n }\n\n /**\n * @override\n */\n visitCommaList(list: Css.CommaList): Css.Val {\n const acc: { [key: string]: Css.Val[] } = {};\n for (let i = 0; i < list.values.length; i++) {\n this.values = {};\n if (list.values[i] instanceof Css.CommaList) {\n this.error = true;\n } else {\n list.values[i].visit(this);\n this.mergeIn(acc, this.values);\n if (this.values[\"background-color\"] && i != list.values.length - 1) {\n this.error = true;\n }\n }\n if (this.error) {\n return null;\n }\n }\n this.values = {};\n for (const name in acc) {\n if (name == \"background-color\") {\n this.values[name] = acc[name].pop();\n } else {\n this.values[name] = new Css.CommaList(acc[name]);\n }\n }\n return null;\n }\n}\n\nexport class FontShorthandValidator extends SimpleShorthandValidator {\n constructor() {\n super();\n }\n\n /**\n * @override\n */\n init(syntax: ShorthandSyntaxNode[], propList: string[]): void {\n super.init(syntax, propList);\n this.propList.push(\"font-family\", \"line-height\", \"font-size\");\n }\n\n /**\n * @override\n */\n validateList(list: Css.Val[]): number {\n let index = super.validateList(list);\n\n // must at least have font-size and font-family at the end\n if (index + 2 > list.length) {\n this.error = true;\n return index;\n }\n this.error = false;\n const validators = this.validatorSet.validators;\n if (!list[index].visit(validators[\"font-size\"])) {\n this.error = true;\n return index;\n }\n this.values[\"font-size\"] = list[index++];\n if (list[index] === Css.slash) {\n index++;\n\n // must at least have line-height and font-family at the end\n if (index + 2 > list.length) {\n this.error = true;\n return index;\n }\n if (!list[index].visit(validators[\"line-height\"])) {\n this.error = true;\n return index;\n }\n this.values[\"line-height\"] = list[index++];\n }\n const fontFamily =\n index == list.length - 1\n ? list[index]\n : new Css.SpaceList(list.slice(index, list.length));\n if (!fontFamily.visit(validators[\"font-family\"])) {\n this.error = true;\n return index;\n }\n this.values[\"font-family\"] = fontFamily;\n return list.length;\n }\n\n /**\n * @override\n */\n visitCommaList(list: Css.CommaList): Css.Val {\n list.values[0].visit(this);\n if (this.error) {\n return null;\n }\n const familyList = [this.values[\"font-family\"]];\n for (let i = 1; i < list.values.length; i++) {\n familyList.push(list.values[i]);\n }\n const family = new Css.CommaList(familyList);\n if (!family.visit(this.validatorSet.validators[\"font-family\"])) {\n this.error = true;\n } else {\n this.values[\"font-family\"] = family;\n }\n return null;\n }\n\n /**\n * @override\n */\n visitIdent(ident: Css.Ident): Css.Val {\n const props = this.validatorSet.systemFonts[ident.name];\n if (props) {\n for (const name in props) {\n this.values[name] = props[name];\n }\n } else {\n this.error = true;\n }\n return null;\n }\n}\n\nexport const shorthandValidators: {\n [key: string]: typeof ShorthandValidator;\n} = {\n SIMPLE: SimpleShorthandValidator,\n INSETS: InsetsShorthandValidator,\n INSETS_SLASH: InsetsSlashShorthandValidator,\n COMMA: CommaShorthandValidator,\n FONT: FontShorthandValidator,\n};\n\n//---- validation grammar parser and public property validator\n//------------------------\n\n/**\n * Object that validates simple and shorthand properties, breaking up shorthand\n * properties into corresponding simple ones, also stripping property prefixes.\n */\nexport class ValidatorSet {\n validators: { [key: string]: PropertyValidator } = {};\n prefixes: { [key: string]: { [key: string]: boolean } } = {};\n defaultValues: ValueMap = {};\n namedValidators: { [key: string]: ValidatingGroup } = {};\n systemFonts: { [key: string]: ValueMap } = {};\n shorthands: { [key: string]: ShorthandValidator } = {};\n layoutProps: ValueMap = {};\n backgroundProps: ValueMap = {};\n\n private addReplacement(\n val: ValidatingGroup,\n token: CssTokenizer.Token,\n ): ValidatingGroup {\n let cssval: Css.Val;\n if (token.type == CssTokenizer.TokenType.NUMERIC) {\n cssval = new Css.Numeric(token.num, token.text);\n } else if (token.type == CssTokenizer.TokenType.HASH) {\n cssval = CssParser.colorFromHash(token.text);\n } else if (token.type == CssTokenizer.TokenType.IDENT) {\n cssval = Css.getName(token.text);\n } else {\n throw new Error(\"unexpected replacement\");\n }\n if (val.isPrimitive()) {\n const validator = val.nodes[0].validator as PrimitiveValidator;\n const idents = validator.idents;\n for (const ident in idents) {\n idents[ident] = cssval;\n }\n return val;\n }\n throw new Error(\"unexpected replacement\");\n }\n\n private newGroup(op: string, vals: ValidatingGroup[]): ValidatingGroup {\n const group = new ValidatingGroup();\n if (op == \"||\") {\n for (let i = 0; i < vals.length; i++) {\n const subgroup = new ValidatingGroup();\n subgroup.startClause(i);\n subgroup.addGroup(vals[i], Add.FOLLOW);\n subgroup.endClause(i);\n group.addGroup(subgroup, i == 0 ? Add.FOLLOW : Add.ALTERNATE);\n }\n const outer = new ValidatingGroup();\n outer.startSpecialGroup();\n outer.addGroup(group, Add.REPEATED);\n outer.endSpecialGroup();\n return outer;\n } else {\n let how: Add;\n switch (op) {\n case \" \":\n how = Add.FOLLOW;\n break;\n case \"|\":\n case \"||\":\n how = Add.ALTERNATE;\n break;\n default:\n throw new Error(\"unexpected op\");\n }\n for (let i = 0; i < vals.length; i++) {\n group.addGroup(vals[i], i == 0 ? Add.FOLLOW : how);\n }\n return group;\n }\n }\n\n private addCounts(\n val: ValidatingGroup,\n min: number,\n max: number,\n ): ValidatingGroup {\n const group = new ValidatingGroup();\n for (let i = 0; i < min; i++) {\n group.addGroup(val.clone(), Add.FOLLOW);\n }\n if (max == Number.POSITIVE_INFINITY) {\n group.addGroup(val, Add.REPEATED);\n } else {\n for (let i = min; i < max; i++) {\n group.addGroup(val.clone(), Add.OPTIONAL);\n }\n }\n return group;\n }\n\n private primitive(validator: PropertyValidator): ValidatingGroup {\n const group = new ValidatingGroup();\n group.addPrimitive(validator);\n return group;\n }\n\n private newFunc(fn: string, val: ValidatingGroup): ValidatingGroup {\n let validator: PropertyValidator;\n switch (fn) {\n case \"COMMA\":\n validator = new CommaListValidator(val);\n break;\n case \"SPACE\":\n validator = new SpaceListValidator(val);\n break;\n default:\n validator = new FuncValidator(fn.toLowerCase(), val);\n break;\n }\n return this.primitive(validator);\n }\n\n initBuiltInValidators(): void {\n this.namedValidators[\"HASHCOLOR\"] = this.primitive(\n new PrimitiveValidator(ALLOW_COLOR, NO_IDENTS, NO_IDENTS),\n );\n this.namedValidators[\"POS_INT\"] = this.primitive(\n new PrimitiveValidator(ALLOW_POS_INT, NO_IDENTS, NO_IDENTS),\n );\n this.namedValidators[\"POS_NUM\"] = this.primitive(\n new PrimitiveValidator(ALLOW_POS_NUM, NO_IDENTS, NO_IDENTS),\n );\n this.namedValidators[\"POS_PERCENTAGE\"] = this.primitive(\n new PrimitiveValidator(ALLOW_POS_NUMERIC, NO_IDENTS, { \"%\": Css.empty }),\n );\n this.namedValidators[\"NEGATIVE\"] = this.primitive(\n new PrimitiveValidator(ALLOW_NEGATIVE, NO_IDENTS, NO_IDENTS),\n );\n this.namedValidators[\"ZERO\"] = this.primitive(\n new PrimitiveValidator(ALLOW_ZERO, NO_IDENTS, NO_IDENTS),\n );\n this.namedValidators[\"ZERO_PERCENTAGE\"] = this.primitive(\n new PrimitiveValidator(ALLOW_ZERO_PERCENT, NO_IDENTS, NO_IDENTS),\n );\n this.namedValidators[\"POS_LENGTH\"] = this.primitive(\n new PrimitiveValidator(ALLOW_POS_NUMERIC, NO_IDENTS, {\n em: Css.empty,\n ex: Css.empty,\n ch: Css.empty,\n rem: Css.empty,\n vw: Css.empty,\n vh: Css.empty,\n vi: Css.empty,\n vb: Css.empty,\n vmin: Css.empty,\n vmax: Css.empty,\n pvw: Css.empty,\n pvh: Css.empty,\n pvi: Css.empty,\n pvb: Css.empty,\n pvmin: Css.empty,\n pvmax: Css.empty,\n cm: Css.empty,\n mm: Css.empty,\n in: Css.empty,\n px: Css.empty,\n pt: Css.empty,\n pc: Css.empty,\n q: Css.empty,\n }),\n );\n this.namedValidators[\"POS_ANGLE\"] = this.primitive(\n new PrimitiveValidator(ALLOW_POS_NUMERIC, NO_IDENTS, {\n deg: Css.empty,\n grad: Css.empty,\n rad: Css.empty,\n turn: Css.empty,\n }),\n );\n this.namedValidators[\"POS_TIME\"] = this.primitive(\n new PrimitiveValidator(ALLOW_POS_NUMERIC, NO_IDENTS, {\n s: Css.empty,\n ms: Css.empty,\n }),\n );\n this.namedValidators[\"FREQUENCY\"] = this.primitive(\n new PrimitiveValidator(ALLOW_POS_NUMERIC, NO_IDENTS, {\n Hz: Css.empty,\n kHz: Css.empty,\n }),\n );\n this.namedValidators[\"RESOLUTION\"] = this.primitive(\n new PrimitiveValidator(ALLOW_POS_NUMERIC, NO_IDENTS, {\n dpi: Css.empty,\n dpcm: Css.empty,\n dppx: Css.empty,\n }),\n );\n this.namedValidators[\"URI\"] = this.primitive(\n new PrimitiveValidator(ALLOW_URL, NO_IDENTS, NO_IDENTS),\n );\n this.namedValidators[\"IDENT\"] = this.primitive(\n new PrimitiveValidator(ALLOW_IDENT, NO_IDENTS, NO_IDENTS),\n );\n this.namedValidators[\"STRING\"] = this.primitive(\n new PrimitiveValidator(ALLOW_STR, NO_IDENTS, NO_IDENTS),\n );\n this.namedValidators[\"SLASH\"] = this.primitive(\n new PrimitiveValidator(ALLOW_SLASH, NO_IDENTS, NO_IDENTS),\n );\n const stdfont = { \"font-family\": Css.getName(\"sans-serif\") };\n this.systemFonts[\"caption\"] = stdfont;\n this.systemFonts[\"icon\"] = stdfont;\n this.systemFonts[\"menu\"] = stdfont;\n this.systemFonts[\"message-box\"] = stdfont;\n this.systemFonts[\"small-caption\"] = stdfont;\n this.systemFonts[\"status-bar\"] = stdfont;\n }\n\n private isBuiltIn(name: string): boolean {\n return !!name.match(/^[A-Z_0-9]+$/);\n }\n\n private readNameAndPrefixes(\n tok: CssTokenizer.Tokenizer,\n section: number,\n ): string | null {\n let token = tok.token();\n if (token.type == CssTokenizer.TokenType.EOF) {\n // Finished normally\n return null;\n }\n const rulePrefixes: { [key: string]: boolean } = { \"\": true };\n if (token.type == CssTokenizer.TokenType.O_BRK) {\n do {\n tok.consume();\n token = tok.token();\n if (token.type != CssTokenizer.TokenType.IDENT) {\n throw new Error(\"Prefix name expected\");\n }\n rulePrefixes[token.text] = true;\n tok.consume();\n token = tok.token();\n } while (token.type == CssTokenizer.TokenType.COMMA);\n if (token.type != CssTokenizer.TokenType.C_BRK) {\n throw new Error(\"']' expected\");\n }\n tok.consume();\n token = tok.token();\n }\n if (token.type != CssTokenizer.TokenType.IDENT) {\n throw new Error(\"Property name expected\");\n }\n if (section == 2 ? token.text == \"SHORTHANDS\" : token.text == \"DEFAULTS\") {\n tok.consume();\n return null;\n }\n const name = token.text;\n tok.consume();\n if (section != 2) {\n if (tok.token().type != CssTokenizer.TokenType.EQ) {\n throw new Error(\"'=' expected\");\n }\n if (!this.isBuiltIn(name)) {\n this.prefixes[name] = rulePrefixes;\n }\n } else {\n if (tok.token().type != CssTokenizer.TokenType.COLON) {\n throw new Error(\"':' expected\");\n }\n }\n return name;\n }\n\n private parseValidators(tok: CssTokenizer.Tokenizer): void {\n while (true) {\n const ruleName = this.readNameAndPrefixes(tok, 1);\n if (!ruleName) {\n return;\n }\n let vals: ValidatingGroup[] = [];\n const stack = [];\n let op = \"\";\n let val: ValidatingGroup;\n let expectval = true;\n const reduce = (): ValidatingGroup => {\n if (vals.length == 0) {\n throw new Error(\"No values\");\n }\n if (vals.length == 1) {\n return vals[0];\n }\n return this.newGroup(op, vals);\n };\n const setop = (currop: string): void => {\n if (expectval) {\n throw new Error(`'${currop}': unexpected`);\n }\n if (op && op != currop) {\n throw new Error(`mixed operators: '${currop}' and '${op}'`);\n }\n op = currop;\n expectval = true;\n };\n let result: ValidatingGroup = null;\n while (!result) {\n tok.consume();\n let token = tok.token();\n switch (token.type) {\n case CssTokenizer.TokenType.IDENT:\n if (!expectval) {\n setop(\" \");\n }\n if (this.isBuiltIn(token.text)) {\n const builtIn = this.namedValidators[token.text];\n if (!builtIn) {\n throw new Error(`'${token.text}' unexpected`);\n }\n vals.push(builtIn.clone());\n } else {\n const idents = {};\n idents[token.text.toLowerCase()] = Css.getName(token.text);\n vals.push(\n this.primitive(new PrimitiveValidator(0, idents, NO_IDENTS)),\n );\n }\n expectval = false;\n break;\n case CssTokenizer.TokenType.INT: {\n const idents = {};\n idents[`${token.num}`] = new Css.Int(token.num);\n vals.push(\n this.primitive(new PrimitiveValidator(0, idents, NO_IDENTS)),\n );\n expectval = false;\n break;\n }\n case CssTokenizer.TokenType.BAR:\n setop(\"|\");\n break;\n case CssTokenizer.TokenType.BAR_BAR:\n setop(\"||\");\n break;\n case CssTokenizer.TokenType.O_BRK:\n if (!expectval) {\n setop(\" \");\n }\n stack.push({ vals, op, b: \"[\" });\n op = \"\";\n vals = [];\n expectval = true;\n break;\n case CssTokenizer.TokenType.FUNC:\n if (!expectval) {\n setop(\" \");\n }\n stack.push({ vals, op, b: \"(\", fn: token.text });\n op = \"\";\n vals = [];\n expectval = true;\n break;\n case CssTokenizer.TokenType.C_BRK: {\n val = reduce();\n const open = stack.pop();\n if (open.b != \"[\") {\n throw new Error(\"']' unexpected\");\n }\n vals = open.vals;\n vals.push(val);\n op = open.op;\n expectval = false;\n break;\n }\n case CssTokenizer.TokenType.C_PAR: {\n val = reduce();\n const open = stack.pop();\n if (open.b != \"(\") {\n throw new Error(\"')' unexpected\");\n }\n vals = open.vals;\n vals.push(this.newFunc(open.fn, val));\n op = open.op;\n expectval = false;\n break;\n }\n case CssTokenizer.TokenType.COLON:\n if (expectval) {\n throw new Error(\"':' unexpected\");\n }\n tok.consume();\n vals.push(this.addReplacement(vals.pop(), tok.token()));\n break;\n case CssTokenizer.TokenType.QMARK:\n if (expectval) {\n throw new Error(\"'?' unexpected\");\n }\n vals.push(this.addCounts(vals.pop(), 0, 1));\n break;\n case CssTokenizer.TokenType.STAR:\n if (expectval) {\n throw new Error(\"'*' unexpected\");\n }\n vals.push(this.addCounts(vals.pop(), 0, Number.POSITIVE_INFINITY));\n break;\n case CssTokenizer.TokenType.PLUS:\n if (expectval) {\n throw new Error(\"'+' unexpected\");\n }\n vals.push(this.addCounts(vals.pop(), 1, Number.POSITIVE_INFINITY));\n break;\n case CssTokenizer.TokenType.O_BRC: {\n tok.consume();\n token = tok.token();\n if (token.type != CssTokenizer.TokenType.INT) {\n throw new Error(\"<int> expected\");\n }\n const min = token.num;\n let max = min;\n tok.consume();\n token = tok.token();\n if (token.type == CssTokenizer.TokenType.COMMA) {\n tok.consume();\n token = tok.token();\n if (token.type != CssTokenizer.TokenType.INT) {\n throw new Error(\"<int> expected\");\n }\n max = token.num;\n tok.consume();\n token = tok.token();\n }\n if (token.type != CssTokenizer.TokenType.C_BRC) {\n throw new Error(\"'}' expected\");\n }\n vals.push(this.addCounts(vals.pop(), min, max));\n break;\n }\n case CssTokenizer.TokenType.SEMICOL:\n result = reduce();\n if (stack.length > 0) {\n throw new Error(`unclosed '${stack.pop().b}'`);\n }\n break;\n default:\n throw new Error(\"unexpected token\");\n }\n }\n tok.consume();\n if (this.isBuiltIn(ruleName)) {\n this.namedValidators[ruleName] = result;\n } else {\n if (result.isSimple()) {\n this.validators[ruleName] = result.nodes[0].validator;\n } else {\n this.validators[ruleName] = new SpaceListValidator(result);\n }\n }\n }\n }\n\n private parseDefaults(tok: CssTokenizer.Tokenizer): void {\n while (true) {\n const propName = this.readNameAndPrefixes(tok, 2);\n if (!propName) {\n return;\n }\n const vals: Css.Val[] = [];\n while (true) {\n tok.consume();\n const token = tok.token();\n if (token.type == CssTokenizer.TokenType.SEMICOL) {\n tok.consume();\n break;\n }\n switch (token.type) {\n case CssTokenizer.TokenType.IDENT:\n vals.push(Css.getName(token.text));\n break;\n case CssTokenizer.TokenType.NUM:\n vals.push(new Css.Num(token.num));\n break;\n case CssTokenizer.TokenType.INT:\n vals.push(new Css.Int(token.num));\n break;\n case CssTokenizer.TokenType.NUMERIC:\n vals.push(new Css.Numeric(token.num, token.text));\n break;\n default:\n throw new Error(\"unexpected token\");\n }\n }\n this.defaultValues[propName] =\n vals.length > 1 ? new Css.SpaceList(vals) : vals[0];\n }\n }\n\n private parseShorthands(tok: CssTokenizer.Tokenizer): void {\n while (true) {\n const ruleName = this.readNameAndPrefixes(tok, 3);\n if (!ruleName) {\n return;\n }\n let token = tok.nthToken(1);\n let shorthandValidator: ShorthandValidator;\n if (\n token.type == CssTokenizer.TokenType.IDENT &&\n shorthandValidators[token.text]\n ) {\n shorthandValidator = new shorthandValidators[token.text]();\n tok.consume();\n } else {\n shorthandValidator = new SimpleShorthandValidator();\n }\n shorthandValidator.setOwner(this);\n let result = false;\n let syntax: ShorthandSyntaxNode[] = [];\n let slash = false;\n const stack = [];\n const propList = [];\n while (!result) {\n tok.consume();\n token = tok.token();\n switch (token.type) {\n case CssTokenizer.TokenType.IDENT:\n if (this.validators[token.text]) {\n syntax.push(shorthandValidator.syntaxNodeForProperty(token.text));\n propList.push(token.text);\n } else if (\n this.shorthands[token.text] instanceof InsetsShorthandValidator\n ) {\n const insetShorthand = this.shorthands[\n token.text\n ] as InsetsShorthandValidator;\n syntax.push(insetShorthand.createSyntaxNode());\n propList.push(...insetShorthand.propList);\n } else {\n throw new Error(\n `'${token.text}' is neither a simple property nor an inset shorthand`,\n );\n }\n break;\n case CssTokenizer.TokenType.SLASH:\n if (syntax.length > 0 || slash) {\n throw new Error(\"unexpected slash\");\n }\n slash = true;\n break;\n case CssTokenizer.TokenType.O_BRK:\n stack.push({ slash, syntax });\n syntax = [];\n slash = false;\n break;\n case CssTokenizer.TokenType.C_BRK: {\n const compound = new ShorthandSyntaxCompound(syntax, slash);\n const item = stack.pop();\n syntax = item.syntax;\n slash = item.slash;\n syntax.push(compound);\n break;\n }\n case CssTokenizer.TokenType.SEMICOL:\n result = true;\n tok.consume();\n break;\n default:\n throw new Error(\"unexpected token\");\n }\n }\n shorthandValidator.init(syntax, propList);\n this.shorthands[ruleName] = shorthandValidator;\n }\n }\n\n parse(text: string): void {\n // Not as robust as CSS parser.\n const tok = new CssTokenizer.Tokenizer(text, null);\n this.parseValidators(tok);\n this.parseDefaults(tok);\n this.parseShorthands(tok);\n this.backgroundProps = this.makePropSet([\"background\"]);\n this.layoutProps = this.makePropSet([\n \"margin\",\n \"border\",\n \"padding\",\n \"columns\",\n \"column-gap\",\n \"column-rule\",\n \"column-fill\",\n ]);\n }\n\n makePropSet(propList: string[]): ValueMap {\n const map: ValueMap = {};\n for (const prop of propList) {\n const shorthand = this.shorthands[prop];\n const list = shorthand ? shorthand.propList : [prop];\n for (const pname of list) {\n const pval = this.defaultValues[pname];\n if (!pval) {\n Logging.logger.warn(\"Unknown property in makePropSet:\", pname);\n } else {\n map[pname] = pval;\n }\n }\n }\n return map;\n }\n\n validatePropertyAndHandleShorthand(\n name: string,\n value: Css.Val,\n important: boolean,\n receiver: PropertyReceiver,\n ): void {\n let prefix = \"\";\n const origName = name;\n name = name.toLowerCase();\n const r = name.match(/^-([a-z]+)-([-a-z0-9]+)$/);\n if (r) {\n prefix = r[1];\n name = r[2];\n }\n const px = this.prefixes[name];\n if (!px || !px[prefix]) {\n receiver.unknownProperty(origName, value);\n return;\n }\n const validator = this.validators[name];\n if (validator) {\n const rvalue =\n value === Css.ident.inherit || value.isExpr()\n ? value\n : value.visit(validator);\n if (rvalue) {\n receiver.simpleProperty(name, rvalue, important);\n } else {\n receiver.invalidPropertyValue(origName, value);\n }\n } else {\n const shorthand = this.shorthands[name].clone();\n if (value === Css.ident.inherit) {\n shorthand.propagateInherit(important, receiver);\n } else {\n value.visit(shorthand);\n if (!shorthand.finish(important, receiver)) {\n receiver.invalidPropertyValue(origName, value);\n }\n }\n }\n }\n}\n\nexport function baseValidatorSet(): ValidatorSet {\n const validatorSet = new ValidatorSet();\n validatorSet.initBuiltInValidators();\n validatorSet.parse(ValidationTxt);\n return validatorSet;\n}\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2015 Trim-marks Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview CssStyler - Apply CSS cascade to a document incrementally and\n * cache the result.\n */\nimport * as Asserts from \"./asserts\";\nimport * as Base from \"./base\";\nimport * as Break from \"./break\";\nimport * as Css from \"./css\";\nimport * as CssCascade from \"./css-cascade\";\nimport * as CssParser from \"./css-parser\";\nimport * as CssProp from \"./css-prop\";\nimport * as CssValidator from \"./css-validator\";\nimport * as Display from \"./display\";\nimport * as Exprs from \"./exprs\";\nimport * as Vtree from \"./vtree\";\nimport { CssStyler, XmlDoc } from \"./types\";\n\nexport class SlipRange {\n endStuckFixed: number;\n endFixed: number;\n endSlipped: number;\n\n constructor(endStuckFixed, endFixed, endSlipped) {\n this.endStuckFixed = endStuckFixed;\n this.endFixed = endFixed;\n this.endSlipped = endSlipped;\n }\n}\n\n/**\n * Maps all ints in a range (\"fixed\") to ints with slippage (\"slipped\")\n */\nexport class SlipMap {\n map = [] as SlipRange[];\n\n getMaxFixed(): number {\n if (this.map.length == 0) {\n return 0;\n }\n const range = this.map[this.map.length - 1];\n return range.endFixed;\n }\n\n getMaxSlipped(): number {\n if (this.map.length == 0) {\n return 0;\n }\n const range = this.map[this.map.length - 1];\n return range.endSlipped;\n }\n\n addStuckRange(endFixed: number): void {\n if (this.map.length == 0) {\n this.map.push(new SlipRange(endFixed, endFixed, endFixed));\n } else {\n const range = this.map[this.map.length - 1];\n const endSlipped = range.endSlipped + endFixed - range.endFixed;\n if (range.endFixed == range.endStuckFixed) {\n range.endFixed = endFixed;\n range.endStuckFixed = endFixed;\n range.endSlipped = endSlipped;\n } else {\n this.map.push(new SlipRange(endFixed, endFixed, endSlipped));\n }\n }\n }\n\n addSlippedRange(endFixed: number): void {\n if (this.map.length == 0) {\n this.map.push(new SlipRange(endFixed, 0, 0));\n } else {\n this.map[this.map.length - 1].endFixed = endFixed;\n }\n }\n\n slippedByFixed(fixed: number): number {\n const index = Base.binarySearch(\n this.map.length,\n (index) => fixed <= this.map[index].endFixed,\n );\n const range = this.map[index];\n return range.endSlipped - Math.max(0, range.endStuckFixed - fixed);\n }\n\n /**\n * Smallest fixed for a given slipped.\n */\n fixedBySlipped(slipped: number): number {\n const index = Base.binarySearch(\n this.map.length,\n (index) => slipped <= this.map[index].endSlipped,\n );\n const range = this.map[index];\n return range.endStuckFixed - (range.endSlipped - slipped);\n }\n}\n\nexport interface FlowListener {\n /**\n * @return void\n */\n encounteredFlowChunk(flowChunk: Vtree.FlowChunk, flow: Vtree.Flow): any;\n}\n\nexport interface AbstractStyler extends CssStyler.AbstractStyler {}\n\n/**\n * Represent a box generated by a (pseudo)element. When constructed, a box\n * corresponding to `::before` pseudoelement is also constructed and stored in\n * `beforeBox` property, whereas one corresponding `::after` pseudoelement is\n * not constructed and `afterBox` property is `null`. `afterBox` is constructed\n * by `buildAfterPseudoElementBox` method.\n * @param style Cascaded style values for the box.\n * @param offset The start offset of the box. It coincides with the start offset\n * of the element if the box is generated by the element or the `::before`\n * pseudoelement. When the box corresponds to the `::after` pseudoelement,\n * the offset is just after the content before the `::after` pseudoelement.\n * @param isRoot True if the box is generated by the root element (not\n * pseudoelement).\n * @param flowChunk FlowChunk to which the box belongs to.\n * @param atBlockStart True if the box is right after the block start edge.\n * @param atFlowStart True if the box is right after the flow start.\n * @param isParentBoxDisplayed True if the parent box has a displayed box.\n */\nexport class Box {\n flowName: string;\n isBlockValue: boolean | null = null;\n hasBoxValue: boolean | null = null;\n styleValues = {} as { [key: string]: Css.Val };\n beforeBox: Box = null;\n afterBox: Box = null;\n breakBefore: string | null = null;\n\n constructor(\n public readonly context: Exprs.Context,\n public readonly style: CssCascade.ElementStyle,\n public readonly offset: number,\n public readonly isRoot: boolean,\n public readonly flowChunk: Vtree.FlowChunk,\n public readonly atBlockStart: boolean,\n public readonly atFlowStart: boolean,\n public readonly isParentBoxDisplayed: boolean,\n ) {\n this.flowName = flowChunk.flowName;\n if (this.hasBox()) {\n const pseudoMap = style[\"_pseudos\"];\n if (pseudoMap) {\n if (pseudoMap[\"before\"]) {\n const beforeBox = new Box(\n context,\n pseudoMap[\"before\"],\n offset,\n false,\n flowChunk,\n this.isBlock(),\n atFlowStart,\n true,\n );\n const beforeContent = beforeBox.styleValue(\"content\");\n if (Vtree.nonTrivialContent(beforeContent)) {\n this.beforeBox = beforeBox;\n this.breakBefore = beforeBox.breakBefore;\n }\n }\n }\n }\n this.breakBefore = Break.resolveEffectiveBreakValue(\n this.getBreakValue(\"before\"),\n this.breakBefore,\n );\n if (this.atFlowStart && Break.isForcedBreakValue(this.breakBefore)) {\n flowChunk.breakBefore = Break.resolveEffectiveBreakValue(\n flowChunk.breakBefore,\n this.breakBefore,\n );\n }\n }\n\n /**\n * Build a box corresponding to `::after` pseudoelement and stores it in\n * `afterBox` property.\n * @param offset The start offset of the `::after` pseudoelement box, which is\n * just after the content before the `::after` pseudoelement.\n * @param atBlockStart True if the box is right after the block start edge.\n * @param atFlowStart True if the box is right after the flow start.\n */\n buildAfterPseudoElementBox(\n offset: number,\n atBlockStart: boolean,\n atFlowStart: boolean,\n ) {\n if (this.hasBox()) {\n const pseudoMap = this.style[\"_pseudos\"];\n if (pseudoMap) {\n if (pseudoMap[\"after\"]) {\n const afterBox = new Box(\n this.context,\n pseudoMap[\"after\"],\n offset,\n false,\n this.flowChunk,\n atBlockStart,\n atFlowStart,\n true,\n );\n const afterContent = afterBox.styleValue(\"content\");\n if (Vtree.nonTrivialContent(afterContent)) {\n this.afterBox = afterBox;\n }\n }\n }\n }\n }\n\n styleValue(name: string, defaultValue?: Css.Val): Css.Val | null {\n if (!(name in this.styleValues)) {\n const cv = this.style[name];\n this.styleValues[name] = cv\n ? cv.evaluate(this.context, name)\n : defaultValue || null;\n }\n return this.styleValues[name];\n }\n\n displayValue(): Css.Val {\n return this.styleValue(\"display\", Css.ident.inline);\n }\n\n isBlock(): boolean {\n if (this.isBlockValue === null) {\n const display = this.displayValue() as Css.Ident;\n const position = this.styleValue(\"position\") as Css.Ident;\n const float = this.styleValue(\"float\") as Css.Ident;\n this.isBlockValue = Display.isBlock(\n display,\n position,\n float,\n this.isRoot,\n );\n }\n return this.isBlockValue;\n }\n\n hasBox(): boolean {\n if (this.hasBoxValue === null) {\n this.hasBoxValue =\n this.isParentBoxDisplayed && this.displayValue() !== Css.ident.none;\n }\n return this.hasBoxValue;\n }\n\n getBreakValue(edge: string): string | null {\n let breakValue: string | null = null;\n if (this.isBlock()) {\n const val = this.styleValue(`break-${edge}`);\n if (val) {\n breakValue = val.toString();\n }\n }\n return breakValue;\n }\n}\n\n/**\n * Manages boxes generated by elements as a stack.\n */\nexport class BoxStack {\n stack = [] as Box[];\n atBlockStart: boolean = true; // indicates if the next pushed box will be at the block start\n atFlowStart: boolean = true; // indicates if the next pushed box will be at the flow start\n atStartStack = [] as { atBlockStart: boolean; atFlowStart: boolean }[]; // pushed when a new flow starts\n\n constructor(public readonly context: Exprs.Context) {}\n\n /**\n * Returns if the stack is empty.\n */\n empty(): boolean {\n return this.stack.length === 0;\n }\n\n /**\n * Returns the last box in the stack.\n */\n lastBox(): Box | undefined {\n return this.stack[this.stack.length - 1];\n }\n\n /**\n * Returns the flow name of the last box in the stack.\n */\n lastFlowName(): string | null {\n const lastBox = this.lastBox();\n return lastBox ? lastBox.flowChunk.flowName : null;\n }\n\n /**\n * Returns if the last box in the stack is displayed.\n */\n isCurrentBoxDisplayed(): boolean {\n return this.stack.every((box) => box.displayValue() !== Css.ident.none);\n }\n\n /**\n * Create a new box and push it to the stack.\n * @param style Cascaded style values for the box.\n * @param offset The start offset of the box.\n * @param isRoot True if the box is generated by the root element\n * @param newFlowChunk Specify if the element is a flow element (i.e. the\n * element is specified a new `flow-into` value)\n */\n push(\n style: CssCascade.ElementStyle,\n offset: number,\n isRoot: boolean,\n newFlowChunk?: Vtree.FlowChunk,\n ): Box {\n const lastBox = this.lastBox();\n if (newFlowChunk && lastBox && newFlowChunk.flowName !== lastBox.flowName) {\n this.atStartStack.push({\n atBlockStart: this.atBlockStart,\n atFlowStart: this.atFlowStart,\n });\n }\n const flowChunk = newFlowChunk || lastBox.flowChunk;\n const isAtFlowStart = this.atFlowStart || !!newFlowChunk;\n const isParentBoxDisplayed = this.isCurrentBoxDisplayed();\n const box = new Box(\n this.context,\n style,\n offset,\n isRoot,\n flowChunk,\n isAtFlowStart || this.atBlockStart,\n isAtFlowStart,\n isParentBoxDisplayed,\n );\n this.stack.push(box);\n this.atBlockStart = box.hasBox()\n ? !box.beforeBox && box.isBlock()\n : this.atBlockStart;\n this.atFlowStart = box.hasBox()\n ? !box.beforeBox && isAtFlowStart\n : this.atFlowStart;\n return box;\n }\n\n encounteredTextNode(node: Node) {\n const box = this.lastBox();\n if ((this.atBlockStart || this.atFlowStart) && box.hasBox()) {\n const whitespaceValue = box\n .styleValue(\"white-space\", Css.ident.normal)\n .toString();\n const whitespace = Vtree.whitespaceFromPropertyValue(whitespaceValue);\n Asserts.assert(whitespace !== null);\n if (!Vtree.canIgnore(node, whitespace)) {\n this.atBlockStart = false;\n this.atFlowStart = false;\n }\n }\n }\n\n /**\n * Pop the last box.\n */\n pop(offset: number): Box {\n const box = this.stack.pop();\n box.buildAfterPseudoElementBox(offset, this.atBlockStart, this.atFlowStart);\n if (this.atFlowStart && box.afterBox) {\n const breakBefore = box.afterBox.getBreakValue(\"before\");\n box.flowChunk.breakBefore = Break.resolveEffectiveBreakValue(\n box.flowChunk.breakBefore,\n breakBefore,\n );\n }\n const parent = this.lastBox();\n if (parent) {\n if (parent.flowName === box.flowName) {\n if (box.hasBox()) {\n this.atBlockStart = this.atFlowStart = false;\n }\n } else {\n const atStart = this.atStartStack.pop();\n this.atBlockStart = atStart.atBlockStart;\n this.atFlowStart = atStart.atFlowStart;\n }\n }\n return box;\n }\n\n /**\n * Find the start offset of the nearest block start edge to which the\n * `break-before` value of the box should be propagated. This method can be\n * called when after pushing the box into the stack or after popping the box\n * out of the stack.\n */\n nearestBlockStartOffset(box: Box): number {\n if (!box.atBlockStart) {\n return box.offset;\n }\n let i = this.stack.length - 1;\n let parent = this.stack[i];\n\n // When called just after the box is popped out, the last box in the stack\n // is different from the box and it is the parent of the box. When called\n // after the box is pushed, the last box in the stack is identical to the\n // box and the parent of the box is a box right before the specified box.\n if (parent === box) {\n i--;\n parent = this.stack[i];\n }\n while (i >= 0) {\n if (parent.flowName !== box.flowName) {\n return box.offset;\n }\n if (!parent.atBlockStart) {\n return parent.offset;\n }\n if (parent.isRoot) {\n return parent.offset;\n }\n box = parent;\n parent = this.stack[--i];\n }\n throw new Error(\"No block start offset found!\");\n }\n}\n\nexport class Styler implements AbstractStyler {\n root: Element;\n cascadeHolder: CssCascade.Cascade;\n last: Node;\n rootStyle = {} as CssCascade.ElementStyle;\n styleMap: { [key: string]: CssCascade.ElementStyle } = {};\n flows = {} as { [key: string]: Vtree.Flow };\n flowChunks = [] as Vtree.FlowChunk[];\n flowListener: FlowListener = null;\n flowToReach: string | null = null;\n idToReach: string | null = null;\n cascade: CssCascade.CascadeInstance;\n offsetMap: SlipMap;\n primary: boolean = true;\n primaryStack = [] as boolean[];\n rootBackgroundAssigned: boolean = false;\n rootLayoutAssigned: boolean = false;\n lastOffset: number;\n breakBeforeValues = {} as { [key: number]: string | null };\n boxStack: BoxStack;\n bodyReached: boolean = true;\n\n constructor(\n public readonly xmldoc: XmlDoc.XMLDocHolder,\n cascade: CssCascade.Cascade,\n public readonly scope: Exprs.LexicalScope,\n public readonly context: Exprs.Context,\n public readonly primaryFlows: { [key: string]: boolean },\n public readonly validatorSet: CssValidator.ValidatorSet,\n public readonly counterListener: CssCascade.CounterListener,\n counterResolver: CssCascade.CounterResolver,\n ) {\n this.root = xmldoc.root;\n this.cascadeHolder = cascade;\n this.last = this.root;\n this.cascade = cascade.createInstance(\n context,\n counterListener,\n counterResolver,\n xmldoc.lang,\n );\n this.offsetMap = new SlipMap();\n const rootOffset = xmldoc.getElementOffset(this.root);\n this.lastOffset = rootOffset;\n this.boxStack = new BoxStack(context);\n this.offsetMap.addStuckRange(rootOffset);\n const style = this.getAttrStyle(this.root);\n this.cascade.pushElement(this.root, style, rootOffset);\n this.postprocessTopStyle(style, false);\n switch (this.root.namespaceURI) {\n case Base.NS.XHTML:\n this.bodyReached = false;\n break;\n }\n this.primaryStack.push(true);\n this.styleMap = {};\n this.styleMap[`e${rootOffset}`] = style;\n this.lastOffset++;\n this.replayFlowElementsFromOffset(-1);\n }\n\n hasProp(\n style: CssCascade.ElementStyle,\n map: CssValidator.ValueMap,\n name: string,\n ): boolean {\n const cascVal = style[name];\n return cascVal && cascVal.evaluate(this.context) !== map[name];\n }\n\n transferPropsToRoot(\n srcStyle: CssCascade.ElementStyle,\n map: CssValidator.ValueMap,\n ): void {\n for (const pname in map) {\n const cascval = srcStyle[pname];\n if (cascval) {\n this.rootStyle[pname] = cascval;\n delete srcStyle[pname];\n } else {\n const val = map[pname];\n if (val) {\n this.rootStyle[pname] = new CssCascade.CascadeValue(\n val,\n CssParser.SPECIFICITY_AUTHOR,\n );\n }\n }\n }\n }\n\n /**\n * Transfer properties that should be applied on the container (partition)\n * level to this.rootStyle.\n * @param elemStyle (source) element style\n */\n postprocessTopStyle(\n elemStyle: CssCascade.ElementStyle,\n isBody: boolean,\n ): void {\n [\"writing-mode\", \"direction\"].forEach((propName) => {\n if (elemStyle[propName] && !(isBody && this.rootStyle[propName])) {\n // Copy it over, but keep it at the root element as well.\n this.rootStyle[propName] = elemStyle[propName];\n }\n });\n if (!this.rootBackgroundAssigned) {\n const backgroundColor = this.hasProp(\n elemStyle,\n this.validatorSet.backgroundProps,\n \"background-color\",\n )\n ? elemStyle[\"background-color\"].evaluate(this.context)\n : (null as Css.Val);\n const backgroundImage = this.hasProp(\n elemStyle,\n this.validatorSet.backgroundProps,\n \"background-image\",\n )\n ? elemStyle[\"background-image\"].evaluate(this.context)\n : (null as Css.Val);\n if (\n (backgroundColor && backgroundColor !== Css.ident.inherit) ||\n (backgroundImage && backgroundImage !== Css.ident.inherit)\n ) {\n this.transferPropsToRoot(elemStyle, this.validatorSet.backgroundProps);\n this.rootBackgroundAssigned = true;\n }\n }\n if (!this.rootLayoutAssigned) {\n for (let i = 0; i < columnProps.length; i++) {\n if (\n this.hasProp(elemStyle, this.validatorSet.layoutProps, columnProps[i])\n ) {\n this.transferPropsToRoot(elemStyle, this.validatorSet.layoutProps);\n this.rootLayoutAssigned = true;\n break;\n }\n }\n }\n if (!isBody) {\n const fontSize = elemStyle[\"font-size\"];\n if (fontSize) {\n const val = fontSize.evaluate(this.context);\n let px = val.num;\n switch (val.unit) {\n case \"em\":\n case \"rem\":\n px *= this.context.initialFontSize;\n break;\n case \"ex\":\n px *=\n (this.context.initialFontSize * Exprs.defaultUnitSizes[\"ex\"]) /\n Exprs.defaultUnitSizes[\"em\"];\n break;\n case \"%\":\n px *= this.context.initialFontSize / 100;\n break;\n default: {\n const unitSize = Exprs.defaultUnitSizes[val.unit];\n if (unitSize) {\n px *= unitSize;\n }\n }\n }\n this.context.rootFontSize = px;\n }\n }\n }\n\n getTopContainerStyle(): CssCascade.ElementStyle {\n let offset = 0;\n while (!this.bodyReached) {\n offset += 5000;\n if (this.styleUntil(offset, 0) == Number.POSITIVE_INFINITY) {\n break;\n }\n }\n return this.rootStyle;\n }\n\n getAttrStyle(elem: Element): CssCascade.ElementStyle {\n // skip cases in which elements for XML other than HTML or SVG\n // have 'style' attribute not for CSS declaration\n if ((elem as any).style instanceof CSSStyleDeclaration) {\n const styleAttrValue = elem.getAttribute(\"style\");\n if (styleAttrValue) {\n return CssCascade.parseStyleAttribute(\n this.scope,\n this.validatorSet,\n this.xmldoc.url,\n styleAttrValue,\n );\n }\n }\n return {} as CssCascade.ElementStyle;\n }\n\n /**\n * @return currently reached offset\n */\n getReachedOffset(): number {\n return this.lastOffset;\n }\n\n /**\n * Replay flow elements that were encountered since the given offset\n */\n replayFlowElementsFromOffset(offset: number): void {\n if (offset >= this.lastOffset) {\n return;\n }\n const context = this.context;\n const rootOffset = this.xmldoc.getElementOffset(this.root);\n if (offset < rootOffset) {\n const rootStyle = this.getStyle(this.root, false);\n Asserts.assert(rootStyle);\n const flowName = CssCascade.getProp(rootStyle, \"flow-into\");\n const flowNameStr = flowName\n ? flowName.evaluate(context, \"flow-into\").toString()\n : \"body\";\n const newFlowChunk = this.encounteredFlowElement(\n flowNameStr,\n rootStyle,\n this.root,\n rootOffset,\n );\n if (this.boxStack.empty()) {\n this.boxStack.push(rootStyle, rootOffset, true, newFlowChunk);\n }\n }\n let node = this.xmldoc.getNodeByOffset(offset);\n let nodeOffset = this.xmldoc.getNodeOffset(node, 0, false);\n if (nodeOffset >= this.lastOffset) {\n return;\n }\n while (true) {\n if (node.nodeType != 1) {\n nodeOffset += node.textContent.length;\n } else {\n const elem = node as Element;\n if (VIVLIOSTYLE_DEBUG) {\n if (nodeOffset != this.xmldoc.getElementOffset(elem)) {\n throw new Error(\"Inconsistent offset\");\n }\n }\n const style = this.getStyle(elem, false);\n const flowName = style[\"flow-into\"];\n if (flowName) {\n const flowNameStr = flowName\n .evaluate(context, \"flow-into\")\n .toString();\n this.encounteredFlowElement(flowNameStr, style, elem, nodeOffset);\n }\n nodeOffset++;\n }\n if (nodeOffset >= this.lastOffset) {\n break;\n }\n let next: Node = node.firstChild;\n if (next == null) {\n while (true) {\n next = node.nextSibling;\n if (next) {\n break;\n }\n node = node.parentNode;\n if (node === this.root) {\n return;\n }\n }\n }\n node = next;\n }\n }\n\n resetFlowChunkStream(flowListener: FlowListener): void {\n this.flowListener = flowListener;\n for (let i = 0; i < this.flowChunks.length; i++) {\n this.flowListener.encounteredFlowChunk(\n this.flowChunks[i],\n this.flows[this.flowChunks[i].flowName],\n );\n }\n }\n\n styleUntilFlowIsReached(flowName: string) {\n this.flowToReach = flowName;\n let offset = 0;\n while (true) {\n if (this.flowToReach == null) {\n break;\n }\n offset += 5000;\n if (this.styleUntil(offset, 0) == Number.POSITIVE_INFINITY) {\n break;\n }\n }\n }\n\n styleUntilIdIsReached(id: string) {\n if (!id) {\n return;\n }\n this.idToReach = id;\n let offset = 0;\n while (true) {\n if (!this.idToReach) {\n break;\n }\n offset += 5000;\n if (this.styleUntil(offset, 0) === Number.POSITIVE_INFINITY) {\n break;\n }\n }\n this.idToReach = null;\n }\n\n private encounteredFlowElement(\n flowName: string,\n style: CssCascade.ElementStyle,\n elem: Element,\n startOffset: number,\n ): Vtree.FlowChunk {\n let priority = 0;\n let linger = Number.POSITIVE_INFINITY;\n let exclusive = false;\n let repeated = false;\n let last = false;\n const optionsCV = style[\"flow-options\"];\n if (optionsCV) {\n const options = CssProp.toSet(\n optionsCV.evaluate(this.context, \"flow-options\"),\n );\n exclusive = !!options[\"exclusive\"];\n repeated = !!options[\"static\"];\n last = !!options[\"last\"];\n }\n const lingerCV = style[\"flow-linger\"];\n if (lingerCV) {\n linger = CssProp.toInt(\n lingerCV.evaluate(this.context, \"flow-linger\"),\n Number.POSITIVE_INFINITY,\n );\n }\n const priorityCV = style[\"flow-priority\"];\n if (priorityCV) {\n priority = CssProp.toInt(\n priorityCV.evaluate(this.context, \"flow-priority\"),\n 0,\n );\n }\n const breakBefore = this.breakBeforeValues[startOffset] || null;\n let flow = this.flows[flowName];\n if (!flow) {\n const parentFlowName = this.boxStack.lastFlowName();\n flow = this.flows[flowName] = new Vtree.Flow(flowName, parentFlowName);\n }\n const flowChunk = new Vtree.FlowChunk(\n flowName,\n elem,\n startOffset,\n priority,\n linger,\n exclusive,\n repeated,\n last,\n breakBefore,\n );\n this.flowChunks.push(flowChunk);\n if (this.flowToReach == flowName) {\n this.flowToReach = null;\n }\n if (this.flowListener) {\n this.flowListener.encounteredFlowChunk(flowChunk, flow);\n }\n return flowChunk;\n }\n\n registerForcedBreakOffset(\n breakValue: string | null,\n offset: number,\n flowName: string,\n ) {\n if (Break.isForcedBreakValue(breakValue)) {\n const forcedBreakOffsets = this.flows[flowName].forcedBreakOffsets;\n if (\n forcedBreakOffsets.length === 0 ||\n forcedBreakOffsets[forcedBreakOffsets.length - 1] < offset\n ) {\n forcedBreakOffsets.push(offset);\n }\n }\n const previousValue = this.breakBeforeValues[offset];\n this.breakBeforeValues[offset] = Break.resolveEffectiveBreakValue(\n previousValue,\n breakValue,\n );\n }\n\n /**\n * @param startOffset current position in the document\n * @param lookup lookup window size for the next page\n * @return lookup offset in the document for the next page\n */\n styleUntil(startOffset: number, lookup: number): number {\n let targetSlippedOffset = -1;\n let slippedOffset: number;\n if (startOffset <= this.lastOffset) {\n slippedOffset = this.offsetMap.slippedByFixed(startOffset);\n targetSlippedOffset = slippedOffset + lookup;\n if (targetSlippedOffset < this.offsetMap.getMaxSlipped()) {\n // got to the desired point\n return this.offsetMap.fixedBySlipped(targetSlippedOffset);\n }\n }\n if (this.last == null) {\n return Number.POSITIVE_INFINITY;\n }\n const context = this.context;\n while (true) {\n let next: Node = this.last.firstChild;\n if (next == null) {\n while (true) {\n if (this.last.nodeType == 1) {\n this.cascade.popElement(this.last as Element);\n this.primary = this.primaryStack.pop();\n const box = this.boxStack.pop(this.lastOffset);\n let breakAfter: string | null = null;\n if (box.afterBox) {\n const afterPseudoBreakBefore = box.afterBox.getBreakValue(\n \"before\",\n );\n this.registerForcedBreakOffset(\n afterPseudoBreakBefore,\n box.afterBox.atBlockStart\n ? this.boxStack.nearestBlockStartOffset(box)\n : box.afterBox.offset,\n box.flowName,\n );\n breakAfter = box.afterBox.getBreakValue(\"after\");\n }\n breakAfter = Break.resolveEffectiveBreakValue(\n breakAfter,\n box.getBreakValue(\"after\"),\n );\n this.registerForcedBreakOffset(\n breakAfter,\n this.lastOffset,\n box.flowName,\n );\n }\n next = this.last.nextSibling;\n if (next) {\n break;\n }\n this.last = this.last.parentNode;\n if (this.last === this.root) {\n this.last = null;\n if (startOffset < this.lastOffset) {\n if (targetSlippedOffset < 0) {\n slippedOffset = this.offsetMap.slippedByFixed(startOffset);\n targetSlippedOffset = slippedOffset + lookup;\n }\n if (targetSlippedOffset <= this.offsetMap.getMaxSlipped()) {\n // got to the desired point\n return this.offsetMap.fixedBySlipped(targetSlippedOffset);\n }\n }\n return Number.POSITIVE_INFINITY;\n }\n }\n }\n this.last = next;\n if (this.last.nodeType != 1) {\n this.lastOffset += this.last.textContent.length;\n this.boxStack.encounteredTextNode(this.last);\n if (this.primary) {\n this.offsetMap.addStuckRange(this.lastOffset);\n } else {\n this.offsetMap.addSlippedRange(this.lastOffset);\n }\n } else {\n const elem = this.last as Element;\n const style = this.getAttrStyle(elem);\n this.primaryStack.push(this.primary);\n this.cascade.pushElement(elem, style, this.lastOffset);\n const id =\n elem.getAttribute(\"id\") || elem.getAttributeNS(Base.NS.XML, \"id\");\n if (id && id === this.idToReach) {\n this.idToReach = null;\n }\n if (\n !this.bodyReached &&\n elem.localName == \"body\" &&\n elem.parentNode == this.root\n ) {\n this.postprocessTopStyle(style, true);\n this.bodyReached = true;\n }\n let box: Box;\n const flowName = style[\"flow-into\"];\n if (flowName) {\n const flowNameStr = flowName\n .evaluate(context, \"flow-into\")\n .toString();\n const newFlowChunk = this.encounteredFlowElement(\n flowNameStr,\n style,\n elem,\n this.lastOffset,\n );\n this.primary = !!this.primaryFlows[flowNameStr];\n box = this.boxStack.push(\n style,\n this.lastOffset,\n elem === this.root,\n newFlowChunk,\n );\n } else {\n box = this.boxStack.push(style, this.lastOffset, elem === this.root);\n\n // For not ignoring break-before on :root (issue #666)\n if (elem === this.xmldoc.body) {\n box.breakBefore = Break.resolveEffectiveBreakValue(\n box.flowChunk.breakBefore,\n box.breakBefore,\n );\n }\n }\n const blockStartOffset = this.boxStack.nearestBlockStartOffset(box);\n this.registerForcedBreakOffset(\n box.breakBefore,\n blockStartOffset,\n box.flowName,\n );\n if (box.beforeBox) {\n const beforePseudoBreakAfter = box.beforeBox.getBreakValue(\"after\");\n this.registerForcedBreakOffset(\n beforePseudoBreakAfter,\n box.beforeBox.atBlockStart ? blockStartOffset : box.offset,\n box.flowName,\n );\n }\n if (this.primary) {\n if (box.displayValue() === Css.ident.none) {\n this.primary = false;\n }\n }\n if (VIVLIOSTYLE_DEBUG) {\n const offset = this.xmldoc.getElementOffset(this.last as Element);\n if (offset != this.lastOffset) {\n throw new Error(\"Inconsistent offset\");\n }\n }\n this.styleMap[`e${this.lastOffset}`] = style;\n this.lastOffset++;\n if (this.primary) {\n this.offsetMap.addStuckRange(this.lastOffset);\n } else {\n this.offsetMap.addSlippedRange(this.lastOffset);\n }\n if (startOffset < this.lastOffset) {\n if (targetSlippedOffset < 0) {\n slippedOffset = this.offsetMap.slippedByFixed(startOffset);\n targetSlippedOffset = slippedOffset + lookup;\n }\n if (targetSlippedOffset <= this.offsetMap.getMaxSlipped()) {\n // got to the desired point\n return this.offsetMap.fixedBySlipped(targetSlippedOffset);\n }\n }\n }\n }\n }\n\n /**\n * @override\n */\n getStyle(element: Element, deep: boolean): CssCascade.ElementStyle {\n let offset = this.xmldoc.getElementOffset(element);\n const key = `e${offset}`;\n if (deep) {\n offset = this.xmldoc.getNodeOffset(element, 0, true);\n }\n if (this.lastOffset <= offset) {\n this.styleUntil(offset, 0);\n }\n return this.styleMap[key];\n }\n\n /**\n * @override\n */\n processContent(element: Element, styles: { [key: string]: Css.Val }) {}\n}\n\nexport const columnProps = [\"column-count\", \"column-width\", \"column-fill\"];\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2015 Trim-marks Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Font - Deal with embedded fonts.\n */\nimport * as Base from \"./base\";\nimport * as Css from \"./css\";\nimport * as CssCascade from \"./css-cascade\";\nimport * as Exprs from \"./exprs\";\nimport * as Logging from \"./logging\";\nimport * as Net from \"./net\";\nimport * as Task from \"./task\";\nimport * as TaskUtil from \"./task-util\";\n\nexport const traitProps: { [key: string]: Css.Val } = {\n \"font-style\": Css.ident.normal,\n \"font-variant\": Css.ident.normal,\n \"font-weight\": Css.ident.normal,\n};\n\nexport const bogusFontData = `OTTO${new Date().valueOf()}`;\n\nexport let bogusFontCounter: number = 1;\n\nexport function makeFontTraitKey(properties: {\n [key: string]: Css.Val;\n}): string {\n const sb = new Base.StringBuffer();\n for (const prop in traitProps) {\n sb.append(\" \");\n sb.append(properties[prop].toString());\n }\n return sb.toString();\n}\n\nexport function fillDefaults(properties: { [key: string]: Css.Val }): void {\n for (const prop in traitProps) {\n if (!properties[prop]) {\n properties[prop] = traitProps[prop];\n }\n }\n}\n\nexport function prepareProperties(\n properties: CssCascade.ElementStyle,\n context: Exprs.Context,\n): { [key: string]: Css.Val } {\n const result = {} as { [key: string]: Css.Val };\n for (const prop in properties) {\n result[prop] = CssCascade.getProp(properties, prop).evaluate(context, prop);\n }\n fillDefaults(result);\n return result;\n}\n\n/**\n * A font declared in a font-face rule.\n */\nexport class Face {\n fontTraitKey: string;\n src: string | null;\n blobURLs: string[] = [];\n blobs: Blob[] = [];\n family: string | null;\n\n constructor(public readonly properties: { [key: string]: Css.Val }) {\n this.fontTraitKey = makeFontTraitKey(this.properties);\n this.src = this.properties[\"src\"]\n ? this.properties[\"src\"].toString()\n : null;\n const family = this.properties[\"font-family\"];\n this.family = family ? family.stringValue() : null;\n }\n\n /**\n * Check if font traits are the same for two font faces\n */\n traitsEqual(other: Face): boolean {\n return this.fontTraitKey == other.fontTraitKey;\n }\n\n /**\n * Create \"at\" font-face rule.\n */\n makeAtRule(src: string, fontBytes: Blob): string {\n const sb = new Base.StringBuffer();\n sb.append(\"@font-face {\\n font-family: \");\n sb.append(this.family as string);\n sb.append(\";\\n \");\n for (const prop in traitProps) {\n sb.append(prop);\n sb.append(\": \");\n this.properties[prop].appendTo(sb, true);\n sb.append(\";\\n \");\n }\n if (fontBytes) {\n sb.append('src: url(\"');\n const blobURL = Net.createObjectURL(fontBytes);\n sb.append(blobURL);\n this.blobURLs.push(blobURL);\n this.blobs.push(fontBytes);\n sb.append('\")');\n } else {\n sb.append(\"src: \");\n sb.append(src);\n }\n sb.append(\";\\n}\\n\");\n return sb.toString();\n }\n}\n\n/**\n * Set of the fonts declared in all stylesheets of a document.\n * @param deobfuscator function\n * that takes url and returns data deobfuscator\n */\nexport class DocumentFaces {\n /**\n * Maps source font family names to the family names used in the HTML view.\n */\n familyMap = {} as { [key: string]: string };\n\n constructor(\n public readonly deobfuscator:\n | ((p1: string) => ((p1: Blob) => Task.Result<Blob>) | null)\n | null,\n ) {}\n\n registerFamily(srcFace: Face, viewFace: Face): void {\n const srcFamily = srcFace.family as string;\n const viewFamilyFromSrc = this.familyMap[srcFamily];\n const viewFamilyFromView = viewFace.family;\n if (viewFamilyFromSrc) {\n if (viewFamilyFromSrc != viewFamilyFromView) {\n throw new Error(`E_FONT_FAMILY_INCONSISTENT ${srcFace.family}`);\n }\n } else {\n this.familyMap[srcFamily] = viewFamilyFromView as string;\n }\n }\n\n filterFontFamily(val: Css.Val): Css.Val {\n if (val instanceof Css.CommaList) {\n const list = (val as Css.CommaList).values;\n const newValues = [] as Css.Val[];\n for (const v of list) {\n const r = this.familyMap[v.stringValue()];\n if (r) {\n newValues.push(Css.getName(r));\n }\n newValues.push(v);\n }\n return new Css.CommaList(newValues);\n } else {\n const rf = this.familyMap[val.stringValue()];\n if (rf) {\n return new Css.CommaList([Css.getName(rf), val]);\n }\n return val;\n }\n }\n}\n\n/**\n * Object that loads fonts in a document and allocates font families for them\n * in the view document\n * @param head where to add styles in the view document (normally head element)\n * @param body where to probe text in the view document (normally body element)\n */\nexport class Mapper {\n /**\n * Maps Face.src to an entry for an already-loaded font.\n */\n srcURLMap: { [key: string]: TaskUtil.Fetcher<Face> } = {};\n familyPrefix: string;\n familyCounter: number = 0;\n\n constructor(\n public readonly head: Element,\n public readonly body: Element,\n opt_familyPrefix?: string,\n ) {\n this.familyPrefix = opt_familyPrefix || \"Fnt_\";\n }\n\n getViewFontFamily(srcFace: Face, documentFaces: DocumentFaces): string {\n const srcFamily = srcFace.family as string;\n let viewFamily = documentFaces.familyMap[srcFamily];\n if (viewFamily) {\n return viewFamily;\n }\n viewFamily = this.familyPrefix + ++this.familyCounter;\n documentFaces.familyMap[srcFamily] = viewFamily;\n return viewFamily;\n }\n\n /**\n * @param fontBytes deobfuscated font bytes (if deobfuscation is needed)\n */\n private initFont(\n srcFace: Face,\n fontBytes: Blob,\n documentFaces: DocumentFaces,\n ): Task.Result<Face> {\n const frame: Task.Frame<Face> = Task.newFrame(\"initFont\");\n const src = srcFace.src as string;\n const props = {} as { [key: string]: Css.Val };\n for (const prop in traitProps) {\n props[prop] = srcFace.properties[prop];\n }\n const fontFamily = this.getViewFontFamily(srcFace, documentFaces);\n props[\"font-family\"] = Css.getName(fontFamily);\n const viewFontFace = new Face(props);\n const probe = this.body.ownerDocument.createElement(\"span\");\n probe.textContent = \"M\";\n const killTime = new Date().valueOf() + 1000;\n const style = this.head.ownerDocument.createElement(\"style\");\n const bogusData = bogusFontData + bogusFontCounter++;\n style.textContent = viewFontFace.makeAtRule(\"\", Net.makeBlob([bogusData]));\n this.head.appendChild(style);\n const probeCont = this.body.ownerDocument.createElement(\"span\");\n probeCont.style.width = \"0\";\n probeCont.style.height = \"0\";\n probeCont.style.overflow = \"hidden\";\n probeCont.appendChild(probe);\n this.body.appendChild(probeCont);\n probe.style.visibility = \"hidden\";\n probe.style.fontFamily = fontFamily;\n for (const pname in traitProps) {\n Base.setCSSProperty(probe, pname, props[pname].toString());\n }\n const rect = probe.getBoundingClientRect();\n const initWidth = rect.right - rect.left;\n const initHeight = rect.bottom - rect.top;\n style.textContent = viewFontFace.makeAtRule(src, fontBytes);\n Logging.logger.info(\"Starting to load font:\", src);\n let loaded = false;\n frame\n .loop(() => {\n const rect = probe.getBoundingClientRect();\n const currWidth = rect.right - rect.left;\n const currHeight = rect.bottom - rect.top;\n if (initWidth != currWidth || initHeight != currHeight) {\n loaded = true;\n return Task.newResult(false);\n }\n const currTime = new Date().valueOf();\n if (currTime > killTime) {\n return Task.newResult(false);\n }\n return frame.sleep(10);\n })\n .then(() => {\n if (loaded) {\n Logging.logger.info(\"Loaded font:\", src);\n } else {\n Logging.logger.warn(\"Failed to load font:\", src);\n }\n this.body.removeChild(probeCont);\n frame.finish(viewFontFace);\n });\n return frame.result();\n }\n\n loadFont(\n srcFace: Face,\n documentFaces: DocumentFaces,\n ): TaskUtil.Fetcher<Face> {\n const src = srcFace.src as string;\n let fetcher = this.srcURLMap[src];\n if (fetcher) {\n fetcher.piggyback((viewFaceParam) => {\n const viewFace = viewFaceParam as Face;\n if (!viewFace.traitsEqual(srcFace)) {\n Logging.logger.warn(\"E_FONT_FACE_INCOMPATIBLE\", srcFace.src);\n } else {\n documentFaces.registerFamily(srcFace, viewFace);\n Logging.logger.warn(\"Found already-loaded font:\", src);\n }\n });\n } else {\n fetcher = new TaskUtil.Fetcher(() => {\n const frame: Task.Frame<Face> = Task.newFrame(\"loadFont\");\n const deobfuscator = documentFaces.deobfuscator\n ? documentFaces.deobfuscator(src)\n : null;\n if (deobfuscator) {\n Net.ajax(src, Net.XMLHttpRequestResponseType.BLOB).then((xhr) => {\n if (!xhr.responseBlob) {\n frame.finish(null);\n return;\n }\n deobfuscator(xhr.responseBlob).then((fontBytes) => {\n this.initFont(srcFace, fontBytes, documentFaces).thenFinish(\n frame,\n );\n });\n });\n } else {\n this.initFont(srcFace, null, documentFaces).thenFinish(frame);\n }\n return frame.result();\n }, `loadFont ${src}`);\n this.srcURLMap[src] = fetcher;\n fetcher.start();\n }\n return fetcher;\n }\n\n findOrLoadFonts(\n srcFaces: Face[],\n documentFaces: DocumentFaces,\n ): Task.Result<boolean> {\n const fetchers = [] as TaskUtil.Fetcher<Face>[];\n for (const srcFace of srcFaces) {\n if (!srcFace.src || !srcFace.family) {\n Logging.logger.warn(\"E_FONT_FACE_INVALID\");\n continue;\n }\n fetchers.push(this.loadFont(srcFace, documentFaces));\n }\n return TaskUtil.waitForFetchers(fetchers);\n }\n}\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2015 Trim-marks Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview PageMaster - Deal with page masters, partition groups, and partitions.\n */\nimport * as Base from \"./base\";\nimport * as Css from \"./css\";\nimport * as CssCascade from \"./css-cascade\";\nimport * as CssParser from \"./css-parser\";\nimport * as CssValidator from \"./css-validator\";\nimport * as Exprs from \"./exprs\";\nimport * as Font from \"./font\";\nimport * as Vtree from \"./vtree\";\n\nexport let keyCount: number = 1;\n\n/**\n * Represent an at-rule which creates a page-level CSS box (page-master,\n * partition, and partition-group).\n */\nexport abstract class PageBox<\n I extends PageBoxInstance = PageBoxInstance<any>\n> {\n // styles specified in the at-rule\n specified: CssCascade.ElementStyle = {};\n children: PageBox[] = [];\n pageMaster: PageMaster = null;\n index: number = 0;\n key: string;\n\n protected _scope: Exprs.LexicalScope;\n\n get scope(): Exprs.LexicalScope {\n return this._scope;\n }\n\n constructor(\n scope: Exprs.LexicalScope,\n public readonly name: string | null,\n public readonly pseudoName: string | null,\n public readonly classes: string[],\n public readonly parent: PageBox,\n ) {\n this._scope = scope;\n this.key = `p${keyCount++}`;\n if (parent) {\n this.index = parent.children.length;\n parent.children.push(this);\n }\n }\n\n createInstance(parentInstance: PageBoxInstance): PageBoxInstance {\n throw new Error(\"E_UNEXPECTED_CALL\");\n }\n\n /**\n * Clone the PageBox.\n * @param param parent: The parent of the cloned PageBox.\n * pseudoName: Assign this value as the pseudoName of the cloned PageBox.\n */\n clone(param: { parent?: PageBox; pseudoName?: string }): PageBox<I> {\n throw new Error(\"E_UNEXPECTED_CALL\");\n }\n\n /**\n * Copy 'specified' properties to another instance.\n * @param dest The PageBox into which 'specified' properties are copied\n */\n protected copySpecified(dest: PageBox) {\n const specified = this.specified;\n const destSpecified = dest.specified;\n for (const prop in specified) {\n if (Object.prototype.hasOwnProperty.call(specified, prop)) {\n destSpecified[prop] = specified[prop];\n }\n }\n }\n\n /**\n * Clone children with the specified PageBox as their parent.\n */\n protected cloneChildren(parent: PageBox) {\n for (let i = 0; i < this.children.length; i++) {\n // the cloned child is added to parent.children in the child constructor.\n this.children[i].clone({ parent });\n }\n }\n}\n\n/**\n * Parent of all page masters\n */\nexport class RootPageBox extends PageBox<RootPageBoxInstance> {\n constructor(scope: Exprs.LexicalScope) {\n super(scope, null, null, [], null);\n this.specified[\"width\"] = new CssCascade.CascadeValue(Css.fullWidth, 0);\n this.specified[\"height\"] = new CssCascade.CascadeValue(Css.fullHeight, 0);\n }\n}\n\nexport class PageMasterScope extends Exprs.LexicalScope {\n constructor(scope: Exprs.LexicalScope, public pageMaster: PageMaster) {\n super(scope, resolver);\n const self = this;\n function resolver(qualifiedName, isFunc) {\n const r = qualifiedName.match(/^([^.]+)\\.([^.]+)$/);\n if (r) {\n const key = self.pageMaster.keyMap[r[1]];\n if (key) {\n const holder = this as InstanceHolder;\n const boxInstance = holder.lookupInstance(key);\n if (boxInstance) {\n if (isFunc) {\n return boxInstance.resolveFunc(r[2]);\n } else {\n return boxInstance.resolveName(r[2]);\n }\n }\n }\n }\n return null;\n }\n }\n}\n\n/**\n * Represent a page-master rule\n */\nexport class PageMaster<\n I extends PageMasterInstance = PageMasterInstance<any>\n> extends PageBox<I> {\n pageMaster: PageMaster;\n keyMap: { [key: string]: string } = {};\n\n constructor(\n scope: Exprs.LexicalScope,\n name: string | null,\n pseudoName: string | null,\n classes: string[],\n parent: RootPageBox,\n public readonly condition: Exprs.Val,\n public readonly specificity: number,\n ) {\n super(scope, name, pseudoName, classes, parent);\n // if PageMasterScope object is passed, use (share) it.\n if (!(scope instanceof PageMasterScope)) {\n this._scope = new PageMasterScope(scope, this);\n }\n this.pageMaster = this;\n this.specified[\"width\"] = new CssCascade.CascadeValue(Css.fullWidth, 0);\n this.specified[\"height\"] = new CssCascade.CascadeValue(Css.fullHeight, 0);\n this.specified[\"wrap-flow\"] = new CssCascade.CascadeValue(\n Css.ident.auto,\n 0,\n );\n this.specified[\"position\"] = new CssCascade.CascadeValue(\n Css.ident.relative,\n 0,\n );\n this.specified[\"overflow\"] = new CssCascade.CascadeValue(\n Css.ident.visible,\n 0,\n );\n\n // Shift 1px to workaround Chrome printing bug\n // this.specified[\"top\"] = new CssCascade.CascadeValue(new Css.Numeric(-1, \"px\"), 0);\n }\n\n /**\n * @override\n */\n createInstance(parentInstance): PageBoxInstance {\n return new PageMasterInstance(parentInstance, this);\n }\n\n /**\n * @override\n */\n clone(param): PageMaster {\n // The cloned page master shares the same scope object with the original\n // one.\n const cloned = new PageMaster(\n this.scope,\n this.name,\n param.pseudoName || this.pseudoName,\n this.classes,\n this.parent as RootPageBox,\n this.condition,\n this.specificity,\n );\n this.copySpecified(cloned);\n this.cloneChildren(cloned);\n return cloned;\n }\n\n /**\n * Point the pageMaster reference in the PageMasterScope to the current page\n * master. This is needed when a page master is cloned and shares a common\n * scope with the original page master. Since every Exprs.Val which the\n * page master holds has a reference to the scope and uses it for variable\n * resolution, this reference must be updated properly before the page master\n * instance is used.\n */\n resetScope() {\n (this.scope as any).pageMaster = this;\n }\n}\n\n/**\n * Represent a partition-group rule\n */\nexport class PartitionGroup extends PageBox<PartitionGroupInstance> {\n pageMaster: PageMaster;\n\n constructor(\n scope: Exprs.LexicalScope,\n name: string | null,\n pseudoName: string | null,\n classes: string[],\n parent: PageBox,\n ) {\n super(scope, name, pseudoName, classes, parent);\n this.pageMaster = parent.pageMaster;\n if (name) {\n this.pageMaster.keyMap[name] = this.key;\n }\n this.specified[\"wrap-flow\"] = new CssCascade.CascadeValue(\n Css.ident.auto,\n 0,\n );\n }\n\n /**\n * @override\n */\n createInstance(parentInstance: PageBoxInstance): PageBoxInstance {\n return new PartitionGroupInstance(parentInstance, this);\n }\n\n /**\n * @override\n */\n clone(param): PartitionGroup {\n const cloned = new PartitionGroup(\n param.parent.scope,\n this.name,\n this.pseudoName,\n this.classes,\n param.parent,\n );\n this.copySpecified(cloned);\n this.cloneChildren(cloned);\n return cloned;\n }\n}\n\n/**\n * Represent a partition rule\n */\nexport class Partition<\n I extends PartitionInstance = PartitionInstance\n> extends PageBox<I> {\n pageMaster: PageMaster;\n\n constructor(\n scope: Exprs.LexicalScope,\n name: string | null,\n pseudoName: string | null,\n classes: string[],\n parent: PageBox,\n ) {\n super(scope, name, pseudoName, classes, parent);\n this.pageMaster = parent.pageMaster;\n if (name) {\n this.pageMaster.keyMap[name] = this.key;\n }\n }\n\n /**\n * @override\n */\n createInstance(parentInstance): PageBoxInstance {\n return new PartitionInstance(parentInstance, this);\n }\n\n /**\n * @override\n */\n clone(param): Partition {\n const cloned = new Partition(\n param.parent.scope,\n this.name,\n this.pseudoName,\n this.classes,\n param.parent,\n );\n this.copySpecified(cloned);\n this.cloneChildren(cloned);\n return cloned;\n }\n}\n\n//---------------------------- Instance --------------------------------\n\n/**\n * @param def default value\n */\nexport function toExprIdent(\n scope: Exprs.LexicalScope,\n val: Css.Val,\n def: string,\n): Exprs.Val {\n if (!val) {\n return new Exprs.Const(scope, def);\n }\n return val.toExpr(scope, scope.zero);\n}\n\nexport function toExprAuto(\n scope: Exprs.LexicalScope,\n val: Css.Val,\n ref: Exprs.Val,\n): Exprs.Val {\n if (!val || val === Css.ident.auto) {\n return null;\n }\n return val.toExpr(scope, ref);\n}\n\nexport function toExprNormal(\n scope: Exprs.LexicalScope,\n val: Css.Val,\n ref: Exprs.Val,\n): Exprs.Val {\n if (!val || val === Css.ident.normal) {\n return null;\n }\n return val.toExpr(scope, ref);\n}\n\nexport function toExprZero(\n scope: Exprs.LexicalScope,\n val: Css.Val,\n ref: Exprs.Val,\n): Exprs.Val {\n if (!val || val === Css.ident.auto) {\n return scope.zero;\n }\n return val.toExpr(scope, ref);\n}\n\n/**\n * If the value is not specified (null), returns zero.\n * If the value is 'auto', returns null.\n * Otherwise, return the value itself.\n */\nexport function toExprZeroAuto(\n scope: Exprs.LexicalScope,\n val: Css.Val,\n ref: Exprs.Val,\n): Exprs.Val {\n if (!val) {\n return scope.zero;\n } else if (val === Css.ident.auto) {\n return null;\n } else {\n return val.toExpr(scope, ref);\n }\n}\n\nexport function toExprZeroBorder(\n scope: Exprs.LexicalScope,\n val: Css.Val,\n styleVal: Css.Val,\n ref: Exprs.Val,\n): Exprs.Val {\n if (!val || styleVal === Css.ident.none) {\n return scope.zero;\n }\n return val.toExpr(scope, ref);\n}\n\nexport function toExprBool(\n scope: Exprs.LexicalScope,\n val: Css.Val,\n def: Exprs.Val,\n): Exprs.Val {\n if (!val) {\n return def;\n }\n if (val === Css.ident._true) {\n return scope._true;\n }\n if (val === Css.ident._false) {\n return scope._false;\n }\n return val.toExpr(scope, scope.zero);\n}\n\nexport interface InstanceHolder extends Exprs.Context {\n registerInstance(key: string, instance: PageBoxInstance): void;\n\n /**\n * @return instance\n */\n lookupInstance(key: string): PageBoxInstance;\n}\n\nexport class PageBoxInstance<P extends PageBox = PageBox<any>> {\n /**\n * cascaded styles, geometric ones converted to Css.Expr\n */\n protected cascaded: CssCascade.ElementStyle = {};\n style: { [key: string]: Css.Val } = {};\n private autoWidth: Exprs.Native = null;\n private autoHeight: Exprs.Native = null;\n children: PageBoxInstance[] = [];\n isAutoWidth: boolean = false;\n isAutoHeight: boolean = false;\n isTopDependentOnAutoHeight: boolean = false;\n isRightDependentOnAutoWidth: boolean = false;\n private calculatedWidth: number = 0;\n private calculatedHeight: number = 0;\n pageMasterInstance: PageMasterInstance = null;\n namedValues: { [key: string]: Exprs.Val } = {};\n namedFuncs: { [key: string]: Exprs.Val } = {};\n vertical: boolean = false;\n rtl: boolean = false;\n suppressEmptyBoxGeneration: boolean = false;\n\n constructor(\n public readonly parentInstance: PageBoxInstance,\n public readonly pageBox: P,\n ) {\n if (parentInstance) {\n parentInstance.children.push(this);\n }\n }\n\n /**\n * Reset information related to layout.\n */\n reset() {\n this.calculatedWidth = 0;\n this.calculatedHeight = 0;\n }\n\n private addNamedValues(name1: string, name2: string): Exprs.Val {\n const v1 = this.resolveName(name1);\n const v2 = this.resolveName(name2);\n if (!v1 || !v2) {\n throw new Error(\"E_INTERNAL\");\n }\n return Exprs.add(this.pageBox.scope, v1, v2);\n }\n\n resolveName(name: string): Exprs.Val {\n let expr = this.namedValues[name];\n if (expr) {\n return expr;\n }\n const val = this.style[name];\n if (val) {\n expr = val.toExpr(this.pageBox.scope, this.pageBox.scope.zero);\n }\n switch (name) {\n case \"margin-left-edge\":\n expr = this.resolveName(\"left\");\n break;\n case \"margin-top-edge\":\n expr = this.resolveName(\"top\");\n break;\n case \"margin-right-edge\":\n expr = this.addNamedValues(\"border-right-edge\", \"margin-right\");\n break;\n case \"margin-bottom-edge\":\n expr = this.addNamedValues(\"border-bottom-edge\", \"margin-bottom\");\n break;\n case \"border-left-edge\":\n expr = this.addNamedValues(\"margin-left-edge\", \"margin-left\");\n break;\n case \"border-top-edge\":\n expr = this.addNamedValues(\"margin-top-edge\", \"margin-top\");\n break;\n case \"border-right-edge\":\n expr = this.addNamedValues(\"padding-right-edge\", \"border-right-width\");\n break;\n case \"border-bottom-edge\":\n expr = this.addNamedValues(\n \"padding-bottom-edge\",\n \"border-bottom-width\",\n );\n break;\n case \"padding-left-edge\":\n expr = this.addNamedValues(\"border-left-edge\", \"border-left-width\");\n break;\n case \"padding-top-edge\":\n expr = this.addNamedValues(\"border-top-edge\", \"border-top-width\");\n break;\n case \"padding-right-edge\":\n expr = this.addNamedValues(\"right-edge\", \"padding-right\");\n break;\n case \"padding-bottom-edge\":\n expr = this.addNamedValues(\"bottom-edge\", \"padding-bottom\");\n break;\n case \"left-edge\":\n expr = this.addNamedValues(\"padding-left-edge\", \"padding-left\");\n break;\n case \"top-edge\":\n expr = this.addNamedValues(\"padding-top-edge\", \"padding-top\");\n break;\n case \"right-edge\":\n expr = this.addNamedValues(\"left-edge\", \"width\");\n break;\n case \"bottom-edge\":\n expr = this.addNamedValues(\"top-edge\", \"height\");\n break;\n }\n if (!expr) {\n let altName: string;\n if (name == \"extent\") {\n altName = this.vertical ? \"width\" : \"height\";\n } else if (name == \"measure\") {\n altName = this.vertical ? \"height\" : \"width\";\n } else {\n const map = this.vertical\n ? CssCascade.couplingMapVert\n : CssCascade.couplingMapHor;\n altName = name;\n for (const key in map) {\n altName = altName.replace(key, map[key]);\n }\n }\n if (altName != name) {\n expr = this.resolveName(altName);\n }\n }\n if (expr) {\n this.namedValues[name] = expr;\n }\n return expr;\n }\n\n resolveFunc(name) {\n let expr = this.namedFuncs[name];\n if (expr) {\n return expr;\n }\n switch (name) {\n case \"columns\": {\n // min(count,column-count) * (column-width + column-gap) - column-gap\n const scope = this.pageBox.scope;\n const count = new Exprs.Param(scope, 0);\n const columnCount = this.resolveName(\"column-count\");\n const columnWidth = this.resolveName(\"column-width\");\n const columnGap = this.resolveName(\"column-gap\");\n expr = Exprs.sub(\n scope,\n Exprs.mul(\n scope,\n new Exprs.Call(scope, \"min\", [count, columnCount]),\n Exprs.add(scope, columnWidth, columnGap),\n ),\n columnGap,\n );\n break;\n }\n }\n if (expr) {\n this.namedFuncs[name] = expr;\n }\n return expr;\n }\n\n private initEnabled(): void {\n const scope = this.pageBox.scope;\n const style = this.style;\n let enabled = toExprBool(scope, style[\"enabled\"], scope._true);\n const page = toExprAuto(scope, style[\"page\"], scope.zero);\n if (page) {\n const currentPage = new Exprs.Named(scope, \"page-number\");\n enabled = Exprs.and(\n scope,\n enabled,\n new Exprs.Eq(scope, page, currentPage),\n );\n }\n const minPageWidth = toExprAuto(scope, style[\"min-page-width\"], scope.zero);\n if (minPageWidth) {\n enabled = Exprs.and(\n scope,\n enabled,\n new Exprs.Ge(scope, new Exprs.Named(scope, \"page-width\"), minPageWidth),\n );\n }\n const minPageHeight = toExprAuto(\n scope,\n style[\"min-page-height\"],\n scope.zero,\n );\n if (minPageHeight) {\n enabled = Exprs.and(\n scope,\n enabled,\n new Exprs.Ge(\n scope,\n new Exprs.Named(scope, \"page-height\"),\n minPageHeight,\n ),\n );\n }\n enabled = this.boxSpecificEnabled(enabled);\n style[\"enabled\"] = new Css.Expr(enabled);\n }\n\n protected boxSpecificEnabled(enabled: Exprs.Val): Exprs.Val {\n return enabled;\n }\n\n protected initHorizontal(): void {\n const scope = this.pageBox.scope;\n const style = this.style;\n const parentWidth = this.parentInstance\n ? this.parentInstance.style[\"width\"].toExpr(scope, null)\n : null;\n let left = toExprAuto(scope, style[\"left\"], parentWidth);\n let marginLeft = toExprAuto(scope, style[\"margin-left\"], parentWidth);\n const borderLeftWidth = toExprZeroBorder(\n scope,\n style[\"border-left-width\"],\n style[\"border-left-style\"],\n parentWidth,\n );\n const paddingLeft = toExprZero(scope, style[\"padding-left\"], parentWidth);\n let width = toExprAuto(scope, style[\"width\"], parentWidth);\n let maxWidth = toExprAuto(scope, style[\"max-width\"], parentWidth);\n const paddingRight = toExprZero(scope, style[\"padding-right\"], parentWidth);\n const borderRightWidth = toExprZeroBorder(\n scope,\n style[\"border-right-width\"],\n style[\"border-right-style\"],\n parentWidth,\n );\n let marginRight = toExprAuto(scope, style[\"margin-right\"], parentWidth);\n let right = toExprAuto(scope, style[\"right\"], parentWidth);\n const leftBP = Exprs.add(scope, borderLeftWidth, paddingLeft);\n const rightBP = Exprs.add(scope, borderLeftWidth, paddingRight);\n if (left && right && width) {\n let extra = Exprs.sub(\n scope,\n parentWidth,\n Exprs.add(\n scope,\n width,\n Exprs.add(scope, Exprs.add(scope, left, leftBP), rightBP),\n ),\n );\n if (!marginLeft) {\n extra = Exprs.sub(scope, extra, right);\n if (!marginRight) {\n marginLeft = Exprs.mul(scope, extra, new Exprs.Const(scope, 0.5));\n marginRight = marginLeft;\n } else {\n marginLeft = Exprs.sub(scope, extra, marginRight);\n }\n } else {\n if (!marginRight) {\n marginRight = Exprs.sub(\n scope,\n extra,\n Exprs.add(scope, right, marginLeft),\n );\n } else {\n // overconstraint\n right = Exprs.sub(scope, extra, marginRight);\n }\n }\n } else {\n if (!marginLeft) {\n marginLeft = scope.zero;\n }\n if (!marginRight) {\n marginRight = scope.zero;\n }\n if (!left && !right && !width) {\n left = scope.zero;\n }\n if (!left && !width) {\n width = this.autoWidth;\n this.isAutoWidth = true;\n } else if (!left && !right) {\n left = scope.zero;\n } else if (!width && !right) {\n width = this.autoWidth;\n this.isAutoWidth = true;\n }\n const remains = Exprs.sub(\n scope,\n parentWidth,\n Exprs.add(\n scope,\n Exprs.add(scope, marginLeft, leftBP),\n Exprs.add(scope, marginRight, rightBP),\n ),\n );\n if (this.isAutoWidth) {\n if (!maxWidth) {\n // TODO: handle the case when right/left depends on width\n maxWidth = Exprs.sub(scope, remains, left ? left : right);\n }\n\n // For multi-column layout, width is max-width.\n if (\n !this.vertical &&\n (toExprAuto(scope, style[\"column-width\"], null) ||\n toExprAuto(scope, style[\"column-count\"], null))\n ) {\n width = maxWidth;\n this.isAutoWidth = false;\n }\n }\n if (!left) {\n left = Exprs.sub(scope, remains, Exprs.add(scope, right, width));\n } else if (!width) {\n width = Exprs.sub(scope, remains, Exprs.add(scope, left, right));\n } else if (!right) {\n right = Exprs.sub(scope, remains, Exprs.add(scope, left, width));\n }\n }\n\n // snap-width is inherited\n const snapWidthVal =\n style[\"snap-width\"] ||\n (this.parentInstance ? this.parentInstance.style[\"snap-width\"] : null);\n const snapWidth = toExprZero(scope, snapWidthVal, parentWidth);\n style[\"left\"] = new Css.Expr(left);\n style[\"margin-left\"] = new Css.Expr(marginLeft);\n style[\"border-left-width\"] = new Css.Expr(borderLeftWidth);\n style[\"padding-left\"] = new Css.Expr(paddingLeft);\n style[\"width\"] = new Css.Expr(width);\n style[\"max-width\"] = new Css.Expr(maxWidth ? maxWidth : width);\n style[\"padding-right\"] = new Css.Expr(paddingRight);\n style[\"border-right-width\"] = new Css.Expr(borderRightWidth);\n style[\"margin-right\"] = new Css.Expr(marginRight);\n style[\"right\"] = new Css.Expr(right);\n style[\"snap-width\"] = new Css.Expr(snapWidth);\n }\n\n protected initVertical(): void {\n const scope = this.pageBox.scope;\n const style = this.style;\n const parentWidth = this.parentInstance\n ? this.parentInstance.style[\"width\"].toExpr(scope, null)\n : null;\n const parentHeight = this.parentInstance\n ? this.parentInstance.style[\"height\"].toExpr(scope, null)\n : null;\n let top = toExprAuto(scope, style[\"top\"], parentHeight);\n let marginTop = toExprAuto(scope, style[\"margin-top\"], parentWidth);\n const borderTopWidth = toExprZeroBorder(\n scope,\n style[\"border-top-width\"],\n style[\"border-top-style\"],\n parentWidth,\n );\n const paddingTop = toExprZero(scope, style[\"padding-top\"], parentWidth);\n let height = toExprAuto(scope, style[\"height\"], parentHeight);\n let maxHeight = toExprAuto(scope, style[\"max-height\"], parentHeight);\n const paddingBottom = toExprZero(\n scope,\n style[\"padding-bottom\"],\n parentWidth,\n );\n const borderBottomWidth = toExprZeroBorder(\n scope,\n style[\"border-bottom-width\"],\n style[\"border-bottom-style\"],\n parentWidth,\n );\n let marginBottom = toExprAuto(scope, style[\"margin-bottom\"], parentWidth);\n let bottom = toExprAuto(scope, style[\"bottom\"], parentHeight);\n const topBP = Exprs.add(scope, borderTopWidth, paddingTop);\n const bottomBP = Exprs.add(scope, borderBottomWidth, paddingBottom);\n if (top && bottom && height) {\n let extra = Exprs.sub(\n scope,\n parentHeight,\n Exprs.add(\n scope,\n height,\n Exprs.add(scope, Exprs.add(scope, top, topBP), bottomBP),\n ),\n );\n if (!marginTop) {\n extra = Exprs.sub(scope, extra, bottom);\n if (!marginBottom) {\n marginTop = Exprs.mul(scope, extra, new Exprs.Const(scope, 0.5));\n marginBottom = marginTop;\n } else {\n marginTop = Exprs.sub(scope, extra, marginBottom);\n }\n } else {\n if (!marginBottom) {\n marginBottom = Exprs.sub(\n scope,\n extra,\n Exprs.add(scope, bottom, marginTop),\n );\n } else {\n // overconstraint\n bottom = Exprs.sub(scope, extra, marginTop);\n }\n }\n } else {\n if (!marginTop) {\n marginTop = scope.zero;\n }\n if (!marginBottom) {\n marginBottom = scope.zero;\n }\n if (!top && !bottom && !height) {\n top = scope.zero;\n }\n if (!top && !height) {\n height = this.autoHeight;\n this.isAutoHeight = true;\n } else if (!top && !bottom) {\n top = scope.zero;\n } else if (!height && !bottom) {\n height = this.autoHeight;\n this.isAutoHeight = true;\n }\n const remains = Exprs.sub(\n scope,\n parentHeight,\n Exprs.add(\n scope,\n Exprs.add(scope, marginTop, topBP),\n Exprs.add(scope, marginBottom, bottomBP),\n ),\n );\n if (this.isAutoHeight) {\n if (!maxHeight) {\n // TODO: handle the case when top/bottom depends on height\n maxHeight = Exprs.sub(scope, remains, top ? top : bottom);\n }\n\n // For multi-column layout in vertical writing, height is max-height.\n if (\n this.vertical &&\n (toExprAuto(scope, style[\"column-width\"], null) ||\n toExprAuto(scope, style[\"column-count\"], null))\n ) {\n height = maxHeight;\n this.isAutoHeight = false;\n }\n }\n if (!top) {\n top = Exprs.sub(scope, remains, Exprs.add(scope, bottom, height));\n } else if (!height) {\n height = Exprs.sub(scope, remains, Exprs.add(scope, bottom, top));\n } else if (!bottom) {\n bottom = Exprs.sub(scope, remains, Exprs.add(scope, top, height));\n }\n }\n\n // snap-height is inherited\n const snapHeightVal =\n style[\"snap-height\"] ||\n (this.parentInstance ? this.parentInstance.style[\"snap-height\"] : null);\n const snapHeight = toExprZero(scope, snapHeightVal, parentWidth);\n style[\"top\"] = new Css.Expr(top);\n style[\"margin-top\"] = new Css.Expr(marginTop);\n style[\"border-top-width\"] = new Css.Expr(borderTopWidth);\n style[\"padding-top\"] = new Css.Expr(paddingTop);\n style[\"height\"] = new Css.Expr(height);\n style[\"max-height\"] = new Css.Expr(maxHeight ? maxHeight : height);\n style[\"padding-bottom\"] = new Css.Expr(paddingBottom);\n style[\"border-bottom-width\"] = new Css.Expr(borderBottomWidth);\n style[\"margin-bottom\"] = new Css.Expr(marginBottom);\n style[\"bottom\"] = new Css.Expr(bottom);\n style[\"snap-height\"] = new Css.Expr(snapHeight);\n }\n\n private initColumns(): void {\n const scope = this.pageBox.scope;\n const style = this.style;\n const width = toExprAuto(\n scope,\n style[this.vertical ? \"height\" : \"width\"],\n null,\n );\n let columnWidth = toExprAuto(scope, style[\"column-width\"], width);\n let columnCount = toExprAuto(scope, style[\"column-count\"], null);\n let columnGap = toExprNormal(scope, style[\"column-gap\"], null);\n if (!columnGap) {\n columnGap = new Exprs.Numeric(scope, 1, \"em\");\n }\n if (columnWidth && !columnCount) {\n columnCount = new Exprs.Call(scope, \"floor\", [\n Exprs.div(\n scope,\n Exprs.add(scope, width, columnGap),\n Exprs.add(scope, columnWidth, columnGap),\n ),\n ]);\n columnCount = new Exprs.Call(scope, \"max\", [scope.one, columnCount]);\n }\n if (!columnCount) {\n columnCount = scope.one;\n }\n columnWidth = Exprs.sub(\n scope,\n Exprs.div(scope, Exprs.add(scope, width, columnGap), columnCount),\n columnGap,\n );\n style[\"column-width\"] = new Css.Expr(columnWidth);\n style[\"column-count\"] = new Css.Expr(columnCount);\n style[\"column-gap\"] = new Css.Expr(columnGap);\n }\n\n private depends(\n propName: string,\n val: Exprs.Val,\n context: Exprs.Context,\n ): boolean {\n return this.style[propName]\n .toExpr(this.pageBox.scope, null)\n .depend(val, context);\n }\n\n private init(context: Exprs.Context): void {\n // If context does not implement InstanceHolder we would not be able to\n // resolve \"partition.property\" names later.\n const holder = context as InstanceHolder;\n holder.registerInstance(this.pageBox.key, this);\n const scope = this.pageBox.scope;\n const style = this.style;\n const regionIds = this.parentInstance\n ? this.parentInstance.getActiveRegions(context)\n : null;\n const cascMap = CssCascade.flattenCascadedStyle(\n this.cascaded,\n context,\n regionIds,\n false,\n null,\n );\n this.vertical = CssCascade.isVertical(\n cascMap,\n context,\n this.parentInstance ? this.parentInstance.vertical : false,\n );\n this.rtl = CssCascade.isRtl(\n cascMap,\n context,\n this.parentInstance ? this.parentInstance.rtl : false,\n );\n CssCascade.convertToPhysical(\n cascMap,\n style,\n this.vertical,\n this.rtl,\n (name, cascVal) => cascVal.value,\n );\n this.autoWidth = new Exprs.Native(\n scope,\n () => this.calculatedWidth,\n \"autoWidth\",\n );\n this.autoHeight = new Exprs.Native(\n scope,\n () => this.calculatedHeight,\n \"autoHeight\",\n );\n this.initHorizontal();\n this.initVertical();\n this.initColumns();\n this.initEnabled();\n }\n\n getProp(context: Exprs.Context, name: string): Css.Val {\n let val = this.style[name];\n if (val) {\n val = CssParser.evaluateCSSToCSS(context, val, name);\n }\n return val;\n }\n\n getPropAsNumber(context: Exprs.Context, name: string): number {\n let val = this.style[name];\n if (val) {\n val = CssParser.evaluateCSSToCSS(context, val, name);\n }\n return Css.toNumber(val, context);\n }\n\n getSpecial(context: Exprs.Context, name: string): Css.Val[] {\n const arr = CssCascade.getSpecial(this.cascaded, name);\n if (arr) {\n const result = [] as Css.Val[];\n for (let i = 0; i < arr.length; i++) {\n const v = arr[i].evaluate(context, \"\");\n if (v && v !== Css.empty) {\n result.push(v);\n }\n }\n if (result.length) {\n return result;\n }\n }\n return null;\n }\n\n getActiveRegions(context: Exprs.Context): string[] {\n const arr = this.getSpecial(context, \"region-id\");\n if (arr) {\n const result = [] as string[];\n for (let i = 0; i < arr.length; i++) {\n result[i] = arr[i].toString();\n }\n return result;\n }\n return null;\n }\n\n propagateProperty(\n context: Exprs.Context,\n container: Vtree.Container,\n name: string,\n docFaces: Font.DocumentFaces,\n ): void {\n this.propagatePropertyToElement(context, container.element, name, docFaces);\n }\n\n propagatePropertyToElement(\n context: Exprs.Context,\n element: Element,\n name: string,\n docFaces: Font.DocumentFaces,\n ): void {\n let val = this.getProp(context, name);\n if (val) {\n if (\n val.isNumeric() &&\n Exprs.needUnitConversion((val as Css.Numeric).unit)\n ) {\n val = Css.convertNumericToPx(val, context);\n }\n if (name === \"font-family\") {\n val = docFaces.filterFontFamily(val);\n }\n Base.setCSSProperty(element, name, val.toString());\n }\n }\n\n propagateDelayedProperty(\n context: Exprs.Context,\n container: Vtree.Container,\n name: string,\n delayedItems: Vtree.DelayedItem[],\n ): void {\n const val = this.getProp(context, name);\n if (val) {\n delayedItems.push(new Vtree.DelayedItem(container.element, name, val));\n }\n }\n\n assignLeftPosition(context: Exprs.Context, container: Vtree.Container): void {\n const left = this.getPropAsNumber(context, \"left\");\n const marginLeft = this.getPropAsNumber(context, \"margin-left\");\n const paddingLeft = this.getPropAsNumber(context, \"padding-left\");\n const borderLeftWidth = this.getPropAsNumber(context, \"border-left-width\");\n const width = this.getPropAsNumber(context, \"width\");\n container.setHorizontalPosition(left, width);\n Base.setCSSProperty(container.element, \"margin-left\", `${marginLeft}px`);\n Base.setCSSProperty(container.element, \"padding-left\", `${paddingLeft}px`);\n Base.setCSSProperty(\n container.element,\n \"border-left-width\",\n `${borderLeftWidth}px`,\n );\n container.marginLeft = marginLeft;\n container.borderLeft = borderLeftWidth;\n container.paddingLeft = paddingLeft;\n }\n\n assignRightPosition(\n context: Exprs.Context,\n container: Vtree.Container,\n ): void {\n const right = this.getPropAsNumber(context, \"right\");\n const snapWidth = this.getPropAsNumber(context, \"snap-height\");\n const marginRight = this.getPropAsNumber(context, \"margin-right\");\n let paddingRight = this.getPropAsNumber(context, \"padding-right\");\n const borderRightWidth = this.getPropAsNumber(\n context,\n \"border-right-width\",\n );\n Base.setCSSProperty(container.element, \"margin-right\", `${marginRight}px`);\n Base.setCSSProperty(\n container.element,\n \"padding-right\",\n `${paddingRight}px`,\n );\n Base.setCSSProperty(\n container.element,\n \"border-right-width\",\n `${borderRightWidth}px`,\n );\n container.marginRight = marginRight;\n container.borderRight = borderRightWidth;\n if (this.vertical && snapWidth > 0) {\n const xpos = right + container.getInsetRight();\n const r = xpos - Math.floor(xpos / snapWidth) * snapWidth;\n if (r > 0) {\n container.snapOffsetX = snapWidth - r;\n paddingRight += container.snapOffsetX;\n }\n }\n container.paddingRight = paddingRight;\n container.snapWidth = snapWidth;\n }\n\n assignTopPosition(context: Exprs.Context, container: Vtree.Container): void {\n const snapHeight = this.getPropAsNumber(context, \"snap-height\");\n const top = this.getPropAsNumber(context, \"top\");\n const marginTop = this.getPropAsNumber(context, \"margin-top\");\n let paddingTop = this.getPropAsNumber(context, \"padding-top\");\n const borderTopWidth = this.getPropAsNumber(context, \"border-top-width\");\n container.top = top;\n container.marginTop = marginTop;\n container.borderTop = borderTopWidth;\n container.snapHeight = snapHeight;\n if (!this.vertical && snapHeight > 0) {\n const ypos = top + container.getInsetTop();\n const r = ypos - Math.floor(ypos / snapHeight) * snapHeight;\n if (r > 0) {\n container.snapOffsetY = snapHeight - r;\n paddingTop += container.snapOffsetY;\n }\n }\n container.paddingTop = paddingTop;\n Base.setCSSProperty(container.element, \"top\", `${top}px`);\n Base.setCSSProperty(container.element, \"margin-top\", `${marginTop}px`);\n Base.setCSSProperty(container.element, \"padding-top\", `${paddingTop}px`);\n Base.setCSSProperty(\n container.element,\n \"border-top-width\",\n `${borderTopWidth}px`,\n );\n }\n\n assignBottomPosition(\n context: Exprs.Context,\n container: Vtree.Container,\n ): void {\n const marginBottom = this.getPropAsNumber(context, \"margin-bottom\");\n const paddingBottom = this.getPropAsNumber(context, \"padding-bottom\");\n const borderBottomWidth = this.getPropAsNumber(\n context,\n \"border-bottom-width\",\n );\n const height =\n this.getPropAsNumber(context, \"height\") - container.snapOffsetY;\n Base.setCSSProperty(container.element, \"height\", `${height}px`);\n Base.setCSSProperty(\n container.element,\n \"margin-bottom\",\n `${marginBottom}px`,\n );\n Base.setCSSProperty(\n container.element,\n \"padding-bottom\",\n `${paddingBottom}px`,\n );\n Base.setCSSProperty(\n container.element,\n \"border-bottom-width\",\n `${borderBottomWidth}px`,\n );\n container.height = height - container.snapOffsetY;\n container.marginBottom = marginBottom;\n container.borderBottom = borderBottomWidth;\n container.paddingBottom = paddingBottom;\n }\n\n assignBeforePosition(\n context: Exprs.Context,\n container: Vtree.Container,\n ): void {\n if (this.vertical) {\n this.assignRightPosition(context, container);\n } else {\n this.assignTopPosition(context, container);\n }\n }\n\n assignAfterPosition(\n context: Exprs.Context,\n container: Vtree.Container,\n ): void {\n if (this.vertical) {\n this.assignLeftPosition(context, container);\n } else {\n this.assignBottomPosition(context, container);\n }\n }\n\n assignStartEndPosition(\n context: Exprs.Context,\n container: Vtree.Container,\n ): void {\n if (this.vertical) {\n this.assignTopPosition(context, container);\n this.assignBottomPosition(context, container);\n } else {\n this.assignRightPosition(context, container);\n this.assignLeftPosition(context, container);\n }\n }\n\n sizeWithMaxHeight(context: Exprs.Context, container: Vtree.Container): void {\n Base.setCSSProperty(container.element, \"border-top-width\", \"0px\");\n let height = this.getPropAsNumber(context, \"max-height\");\n if (this.isTopDependentOnAutoHeight) {\n container.setVerticalPosition(0, height);\n } else {\n this.assignTopPosition(context, container);\n height -= container.snapOffsetY;\n container.height = height;\n Base.setCSSProperty(container.element, \"height\", `${height}px`);\n }\n }\n\n sizeWithMaxWidth(context: Exprs.Context, container: Vtree.Container): void {\n Base.setCSSProperty(container.element, \"border-left-width\", \"0px\");\n let width = this.getPropAsNumber(context, \"max-width\");\n if (this.isRightDependentOnAutoWidth) {\n container.setHorizontalPosition(0, width);\n } else {\n this.assignRightPosition(context, container);\n width -= container.snapOffsetX;\n container.width = width;\n const right = this.getPropAsNumber(context, \"right\");\n Base.setCSSProperty(container.element, \"right\", `${right}px`);\n Base.setCSSProperty(container.element, \"width\", `${width}px`);\n }\n }\n\n prepareContainer(\n context: Exprs.Context,\n container: Vtree.Container,\n page: Vtree.Page,\n docFaces: Font.DocumentFaces,\n clientLayout: Vtree.ClientLayout,\n ): void {\n if (!this.parentInstance || this.vertical != this.parentInstance.vertical) {\n Base.setCSSProperty(\n container.element,\n \"writing-mode\",\n this.vertical ? \"vertical-rl\" : \"horizontal-tb\",\n );\n }\n if (this.vertical ? this.isAutoWidth : this.isAutoHeight) {\n if (this.vertical) {\n this.sizeWithMaxWidth(context, container);\n } else {\n this.sizeWithMaxHeight(context, container);\n }\n } else {\n this.assignBeforePosition(context, container);\n this.assignAfterPosition(context, container);\n }\n if (this.vertical ? this.isAutoHeight : this.isAutoWidth) {\n if (this.vertical) {\n this.sizeWithMaxHeight(context, container);\n } else {\n this.sizeWithMaxWidth(context, container);\n }\n } else {\n this.assignStartEndPosition(context, container);\n }\n for (let i = 0; i < passPreProperties.length; i++) {\n this.propagateProperty(\n context,\n container,\n passPreProperties[i],\n docFaces,\n );\n }\n }\n\n transferContentProps(\n context: Exprs.Context,\n container: Vtree.Container,\n page: Vtree.Page,\n docFaces: Font.DocumentFaces,\n ): void {\n for (let i = 0; i < passContentProperties.length; i++) {\n this.propagateProperty(\n context,\n container,\n passContentProperties[i],\n docFaces,\n );\n }\n }\n\n transferSinglUriContentProps(\n context: Exprs.Context,\n element: Element,\n docFaces: Font.DocumentFaces,\n ): void {\n for (let i = 0; i < passSingleUriContentProperties.length; i++) {\n this.propagatePropertyToElement(\n context,\n element,\n passSingleUriContentProperties[i],\n docFaces,\n );\n }\n }\n\n /**\n * @param column (null when content comes from the content property)\n */\n finishContainer(\n context: Exprs.Context,\n container: Vtree.Container,\n page: Vtree.Page,\n column: Vtree.Container,\n columnCount: number,\n clientLayout: Vtree.ClientLayout,\n docFaces: Font.DocumentFaces,\n ): void {\n if (this.vertical) {\n this.calculatedWidth =\n container.computedBlockSize + container.snapOffsetX;\n } else {\n this.calculatedHeight =\n container.computedBlockSize + container.snapOffsetY;\n }\n const readHeight = (this.vertical || !column) && this.isAutoHeight;\n const readWidth = (!this.vertical || !column) && this.isAutoWidth;\n let bbox: Vtree.ClientRect = null;\n if (readWidth || readHeight) {\n if (readWidth) {\n Base.setCSSProperty(container.element, \"width\", \"auto\");\n }\n if (readHeight) {\n Base.setCSSProperty(container.element, \"height\", \"auto\");\n }\n bbox = clientLayout.getElementClientRect(\n column ? column.element : container.element,\n );\n if (readWidth) {\n this.calculatedWidth = Math.ceil(\n bbox.right -\n bbox.left -\n container.paddingLeft -\n container.borderLeft -\n container.paddingRight -\n container.borderRight,\n );\n if (this.vertical) {\n this.calculatedWidth += container.snapOffsetX;\n }\n }\n if (readHeight) {\n this.calculatedHeight =\n bbox.bottom -\n bbox.top -\n container.paddingTop -\n container.borderTop -\n container.paddingBottom -\n container.borderBottom;\n if (!this.vertical) {\n this.calculatedHeight += container.snapOffsetY;\n }\n }\n }\n if (this.vertical ? this.isAutoHeight : this.isAutoWidth) {\n this.assignStartEndPosition(context, container);\n }\n if (this.vertical ? this.isAutoWidth : this.isAutoHeight) {\n if (\n this.vertical\n ? this.isRightDependentOnAutoWidth\n : this.isTopDependentOnAutoHeight\n ) {\n this.assignBeforePosition(context, container);\n }\n this.assignAfterPosition(context, container);\n }\n if (columnCount > 1) {\n const ruleWidth = this.getPropAsNumber(context, \"column-rule-width\");\n const ruleStyle = this.getProp(context, \"column-rule-style\");\n const ruleColor = this.getProp(context, \"column-rule-color\");\n if (\n ruleWidth > 0 &&\n ruleStyle &&\n ruleStyle != Css.ident.none &&\n ruleColor != Css.ident.transparent\n ) {\n const columnGap = this.getPropAsNumber(context, \"column-gap\");\n const containerSize = this.vertical\n ? container.height\n : container.width;\n const border = this.vertical ? \"border-top\" : \"border-left\";\n for (let i = 1; i < columnCount; i++) {\n const pos =\n ((containerSize + columnGap) * i) / columnCount -\n columnGap / 2 +\n container.paddingLeft -\n ruleWidth / 2;\n const size =\n container.height + container.paddingTop + container.paddingBottom;\n const rule = container.element.ownerDocument.createElement(\"div\");\n Base.setCSSProperty(rule, \"position\", \"absolute\");\n Base.setCSSProperty(rule, this.vertical ? \"left\" : \"top\", \"0px\");\n Base.setCSSProperty(rule, this.vertical ? \"top\" : \"left\", `${pos}px`);\n Base.setCSSProperty(rule, this.vertical ? \"height\" : \"width\", \"0px\");\n Base.setCSSProperty(\n rule,\n this.vertical ? \"width\" : \"height\",\n `${size}px`,\n );\n Base.setCSSProperty(\n rule,\n border,\n `${ruleWidth}px ${ruleStyle.toString()}${\n ruleColor ? ` ${ruleColor.toString()}` : \"\"\n }`,\n );\n container.element.insertBefore(rule, container.element.firstChild);\n }\n }\n }\n for (let i = 0; i < passPostProperties.length; i++) {\n this.propagateProperty(\n context,\n container,\n passPostProperties[i],\n docFaces,\n );\n }\n for (let i = 0; i < delayedProperties.length; i++) {\n this.propagateDelayedProperty(\n context,\n container,\n delayedProperties[i],\n page.delayedItems,\n );\n }\n }\n\n applyCascadeAndInit(\n cascade: CssCascade.CascadeInstance,\n docElementStyle: CssCascade.ElementStyle,\n ): void {\n const style = this.cascaded;\n const specified = this.pageBox.specified;\n for (const name in specified) {\n if (CssCascade.isPropName(name)) {\n CssCascade.setProp(style, name, CssCascade.getProp(specified, name));\n }\n }\n if (this.pageBox.pseudoName == userAgentPageMasterPseudo) {\n for (const name in docElementStyle) {\n if (name.match(/^background-/) || name == \"writing-mode\") {\n style[name] = docElementStyle[name];\n }\n }\n }\n if (this.pageBox.pseudoName == \"layout-host\") {\n for (const name in docElementStyle) {\n if (!name.match(/^background-/) && name != \"writing-mode\") {\n style[name] = docElementStyle[name];\n }\n }\n }\n cascade.pushRule(this.pageBox.classes, null, style);\n if (style[\"content\"]) {\n style[\"content\"] = style[\"content\"].filterValue(\n new CssCascade.ContentPropVisitor(\n cascade,\n null,\n cascade.counterResolver,\n ),\n );\n }\n this.init(cascade.context);\n for (const child of this.pageBox.children) {\n const childInstance = child.createInstance(this);\n childInstance.applyCascadeAndInit(cascade, docElementStyle);\n }\n cascade.popRule();\n }\n\n resolveAutoSizing(context: Exprs.Context): void {\n // all implicit dependencies are set up at this point\n if (this.isAutoWidth) {\n this.isRightDependentOnAutoWidth =\n this.depends(\"right\", this.autoWidth, context) ||\n this.depends(\"margin-right\", this.autoWidth, context) ||\n this.depends(\"border-right-width\", this.autoWidth, context) ||\n this.depends(\"padding-right\", this.autoWidth, context);\n }\n if (this.isAutoHeight) {\n this.isTopDependentOnAutoHeight =\n this.depends(\"top\", this.autoHeight, context) ||\n this.depends(\"margin-top\", this.autoHeight, context) ||\n this.depends(\"border-top-width\", this.autoHeight, context) ||\n this.depends(\"padding-top\", this.autoHeight, context);\n }\n for (const childInstance of this.children) {\n childInstance.resolveAutoSizing(context);\n }\n }\n}\n\n/**\n * Properties that are passed through before the layout.\n */\nexport const passPreProperties = [\n \"border-left-style\",\n \"border-right-style\",\n \"border-top-style\",\n \"border-bottom-style\",\n \"border-left-color\",\n \"border-right-color\",\n \"border-top-color\",\n \"border-bottom-color\",\n \"outline-style\",\n \"outline-color\",\n \"outline-width\",\n \"overflow\",\n \"visibility\",\n];\n\n/**\n * Properties that are passed through after the layout.\n */\nexport const passPostProperties = [\n \"border-top-left-radius\",\n \"border-top-right-radius\",\n \"border-bottom-right-radius\",\n \"border-bottom-left-radius\",\n \"border-image-source\",\n \"border-image-slice\",\n \"border-image-width\",\n \"border-image-outset\",\n \"border-image-repeat\",\n \"background-attachment\",\n \"background-color\",\n \"background-image\",\n \"background-repeat\",\n \"background-position\",\n \"background-clip\",\n \"background-origin\",\n \"background-size\",\n \"opacity\",\n \"z-index\",\n \"background-blend-mode\",\n \"isolation\",\n \"mix-blend-mode\",\n \"filter\",\n];\n\n/**\n * Only passed when there is content assigned by the content property.\n */\nexport const passContentProperties = [\n \"color\",\n \"font-family\",\n \"font-size\",\n \"font-style\",\n \"font-weight\",\n \"font-variant\",\n \"line-height\",\n \"letter-spacing\",\n \"text-align\",\n \"text-decoration\",\n \"text-indent\",\n \"text-transform\",\n \"white-space\",\n \"word-spacing\",\n \"font-feature-settings\",\n \"font-kerning\",\n \"font-size-adjust\",\n \"font-variant-east-asian\",\n \"font-stretch\",\n \"text-decoration-color\",\n \"text-decoration-line\",\n \"text-decoration-skip\",\n \"text-decoration-style\",\n \"text-emphasis\",\n \"text-emphasis-color\",\n \"text-emphasis-position\",\n \"text-emphasis-style\",\n \"text-shadow\",\n \"text-underline-position\",\n];\n\nexport const passSingleUriContentProperties = [\n \"width\",\n \"height\",\n \"image-resolution\",\n \"object-fit\",\n \"object-position\",\n];\n\nexport const delayedProperties = [\"transform\", \"transform-origin\"];\n\nexport const userAgentPageMasterPseudo = \"background-host\";\n\nexport class RootPageBoxInstance extends PageBoxInstance<RootPageBox> {\n constructor(pageBox: RootPageBox) {\n super(null, pageBox);\n }\n\n /**\n * @override\n */\n applyCascadeAndInit(\n cascade: CssCascade.CascadeInstance,\n docElementStyle: CssCascade.ElementStyle,\n ): void {\n super.applyCascadeAndInit(cascade, docElementStyle);\n\n // Sort page masters using order and specificity.\n const pageMasters = this.children;\n (pageMasters as PageMasterInstance[]).sort(\n (a, b) =>\n (b.pageBox as any).specificity - (a.pageBox as any).specificity || // probably cause NaN\n a.pageBox.index - b.pageBox.index,\n );\n }\n}\n\nexport class PageMasterInstance<\n P extends PageMaster = PageMaster<PageMasterInstance<any>>\n> extends PageBoxInstance<P> {\n pageMasterInstance: PageMasterInstance;\n\n constructor(parentInstance: PageBoxInstance, pageBox: P) {\n super(parentInstance, pageBox);\n this.pageMasterInstance = this;\n }\n\n /**\n * @override\n */\n boxSpecificEnabled(enabled: Exprs.Val): Exprs.Val {\n const pageMaster = this.pageBox.pageMaster;\n if (pageMaster.condition) {\n enabled = Exprs.and(pageMaster.scope, enabled, pageMaster.condition);\n }\n return enabled;\n }\n\n /**\n * Called after layout of contents of the page has done to adjust the overall\n * page layout. Override in subclasses.\n */\n adjustPageLayout(\n context: Exprs.Context,\n page: Vtree.Page,\n clientLayout: Vtree.ClientLayout,\n ) {}\n}\n\nexport class PartitionGroupInstance extends PageBoxInstance<PartitionGroup> {\n pageMasterInstance: PageMasterInstance;\n\n constructor(parentInstance: PageBoxInstance, pageBox: PageBox) {\n super(parentInstance, pageBox);\n this.pageMasterInstance = parentInstance.pageMasterInstance;\n }\n}\n\nexport class PartitionInstance<\n P extends Partition = Partition<PartitionInstance<any>>\n> extends PageBoxInstance<P> {\n pageMasterInstance: PageMasterInstance;\n\n constructor(parentInstance: PageBoxInstance, pageBox: P) {\n super(parentInstance, pageBox);\n this.pageMasterInstance = parentInstance.pageMasterInstance;\n }\n\n processPartitionList(\n enabled: Exprs.Val,\n listVal: Css.Val,\n conflicting: boolean,\n ): Exprs.Val {\n let list: Css.Val[] = null;\n if (listVal instanceof Css.Ident) {\n list = [listVal];\n }\n if (listVal instanceof Css.CommaList) {\n list = (listVal as Css.CommaList).values;\n }\n if (list) {\n const scope = this.pageBox.scope;\n for (let i = 0; i < list.length; i++) {\n if (list[i] instanceof Css.Ident) {\n const qname = Exprs.makeQualifiedName(\n (list[i] as Css.Ident).name,\n \"enabled\",\n );\n let term: Exprs.Val = new Exprs.Named(scope, qname);\n if (conflicting) {\n term = new Exprs.Not(scope, term);\n }\n enabled = Exprs.and(scope, enabled, term);\n }\n }\n }\n return enabled;\n }\n\n /**\n * @override\n */\n boxSpecificEnabled(enabled: Exprs.Val): Exprs.Val {\n const scope = this.pageBox.scope;\n const style = this.style;\n const required =\n toExprBool(scope, style[\"required\"], scope._false) !== scope._false;\n if (required || this.isAutoHeight) {\n const flowName = toExprIdent(scope, style[\"flow-from\"], \"body\");\n const hasContent = new Exprs.Call(scope, \"has-content\", [flowName]);\n enabled = Exprs.and(scope, enabled, hasContent);\n }\n enabled = this.processPartitionList(\n enabled,\n style[\"required-partitions\"],\n false,\n );\n enabled = this.processPartitionList(\n enabled,\n style[\"conflicting-partitions\"],\n true,\n );\n if (required) {\n const pmEnabledVal = this.pageMasterInstance.style[\"enabled\"];\n let pmEnabled = pmEnabledVal\n ? pmEnabledVal.toExpr(scope, null)\n : scope._true;\n pmEnabled = Exprs.and(scope, pmEnabled, enabled);\n this.pageMasterInstance.style[\"enabled\"] = new Css.Expr(pmEnabled);\n }\n return enabled;\n }\n\n /**\n * @override\n */\n prepareContainer(\n context: Exprs.Context,\n container: Vtree.Container,\n page: Vtree.Page,\n docFaces: Font.DocumentFaces,\n clientLayout: Vtree.ClientLayout,\n ): void {\n Base.setCSSProperty(container.element, \"overflow\", \"hidden\"); // default value\n super.prepareContainer(context, container, page, docFaces, clientLayout);\n }\n}\n\n//--------------------- parsing -----------------------\nexport class PageBoxParserHandler\n extends CssParser.SlaveParserHandler\n implements CssValidator.PropertyReceiver {\n constructor(\n scope: Exprs.LexicalScope,\n owner: CssParser.DispatchParserHandler,\n public readonly target: PageBox,\n public readonly validatorSet: CssValidator.ValidatorSet,\n ) {\n super(scope, owner, false);\n }\n\n /**\n * @override\n */\n property(name: string, value: Css.Val, important: boolean): void {\n this.validatorSet.validatePropertyAndHandleShorthand(\n name,\n value,\n important,\n this,\n );\n }\n\n /**\n * @override\n */\n unknownProperty(name: string, value: Css.Val): void {\n this.report(`E_INVALID_PROPERTY ${name}: ${value.toString()}`);\n }\n\n /**\n * @override\n */\n invalidPropertyValue(name: string, value: Css.Val): void {\n this.report(`E_INVALID_PROPERTY_VALUE ${name}: ${value.toString()}`);\n }\n\n /**\n * @override\n */\n simpleProperty(name: string, value: Css.Val, important): void {\n this.target.specified[name] = new CssCascade.CascadeValue(\n value,\n important\n ? CssParser.SPECIFICITY_STYLE\n : CssParser.SPECIFICITY_STYLE_IMPORTANT,\n );\n }\n}\n\nexport class PartitionParserHandler extends PageBoxParserHandler {\n constructor(\n scope: Exprs.LexicalScope,\n owner: CssParser.DispatchParserHandler,\n target: Partition,\n validatorSet: CssValidator.ValidatorSet,\n ) {\n super(scope, owner, target, validatorSet);\n }\n}\n\nexport class PartitionGroupParserHandler extends PageBoxParserHandler {\n constructor(\n scope: Exprs.LexicalScope,\n owner: CssParser.DispatchParserHandler,\n target: PartitionGroup,\n validatorSet: CssValidator.ValidatorSet,\n ) {\n super(scope, owner, target, validatorSet);\n target.specified[\"width\"] = new CssCascade.CascadeValue(\n Css.hundredPercent,\n 0,\n );\n target.specified[\"height\"] = new CssCascade.CascadeValue(\n Css.hundredPercent,\n 0,\n );\n }\n\n /**\n * @override\n */\n startPartitionRule(\n name: string | null,\n pseudoName: string | null,\n classes: string[],\n ): void {\n const partition = new Partition(\n this.scope,\n name,\n pseudoName,\n classes,\n this.target,\n );\n const handler = new PartitionParserHandler(\n this.scope,\n this.owner,\n partition,\n this.validatorSet,\n );\n this.owner.pushHandler(handler);\n }\n\n /**\n * @override\n */\n startPartitionGroupRule(\n name: string | null,\n pseudoName: string | null,\n classes: string[],\n ): void {\n const partitionGroup = new PartitionGroup(\n this.scope,\n name,\n pseudoName,\n classes,\n this.target,\n );\n const handler = new PartitionGroupParserHandler(\n this.scope,\n this.owner,\n partitionGroup,\n this.validatorSet,\n );\n this.owner.pushHandler(handler);\n }\n}\n\nexport class PageMasterParserHandler extends PageBoxParserHandler {\n constructor(\n scope: Exprs.LexicalScope,\n owner: CssParser.DispatchParserHandler,\n target: PageMaster,\n validatorSet: CssValidator.ValidatorSet,\n ) {\n super(scope, owner, target, validatorSet);\n }\n\n /**\n * @override\n */\n startPartitionRule(\n name: string | null,\n pseudoName: string | null,\n classes: string[],\n ): void {\n const partition = new Partition(\n this.scope,\n name,\n pseudoName,\n classes,\n this.target,\n );\n const handler = new PartitionParserHandler(\n this.scope,\n this.owner,\n partition,\n this.validatorSet,\n );\n this.owner.pushHandler(handler);\n }\n\n /**\n * @override\n */\n startPartitionGroupRule(\n name: string | null,\n pseudoName: string | null,\n classes: string[],\n ): void {\n const partitionGroup = new PartitionGroup(\n this.scope,\n name,\n pseudoName,\n classes,\n this.target,\n );\n const handler = new PartitionGroupParserHandler(\n this.scope,\n this.owner,\n partitionGroup,\n this.validatorSet,\n );\n this.owner.pushHandler(handler);\n }\n}\n","/**\n * Copyright 2015 Trim-marks Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview CssPage - `@page` rule (CSS Paged Media) support https://drafts.csswg.org/css-page/\n */\nimport * as Asserts from \"./asserts\";\nimport * as Base from \"./base\";\nimport * as Constants from \"./constants\";\nimport * as Css from \"./css\";\nimport * as CssCascade from \"./css-cascade\";\nimport * as CssParser from \"./css-parser\";\nimport * as CssValidator from \"./css-validator\";\nimport * as Exprs from \"./exprs\";\nimport * as Font from \"./font\";\nimport * as PageMaster from \"./page-master\";\nimport * as Sizing from \"./sizing\";\nimport * as Vtree from \"./vtree\";\n\n/**\n * Resolve page progression direction from writing-mode and direction.\n */\nexport function resolvePageProgression(\n style: CssCascade.ElementStyle,\n): Constants.PageProgression {\n let writingMode = style[\"writing-mode\"];\n writingMode = writingMode && writingMode.value;\n let direction = style[\"direction\"];\n direction = direction && direction.value;\n if (\n writingMode === Css.ident.vertical_lr ||\n (writingMode !== Css.ident.vertical_rl && direction !== Css.ident.rtl)\n ) {\n return Constants.PageProgression.LTR;\n } else {\n return Constants.PageProgression.RTL;\n }\n}\nexport type PageSize = {\n width: Css.Numeric;\n height: Css.Numeric;\n};\n\n/**\n * Named page sizes.\n */\nexport const pageSizes: { [key: string]: PageSize } = {\n a5: { width: new Css.Numeric(148, \"mm\"), height: new Css.Numeric(210, \"mm\") },\n a4: { width: new Css.Numeric(210, \"mm\"), height: new Css.Numeric(297, \"mm\") },\n a3: { width: new Css.Numeric(297, \"mm\"), height: new Css.Numeric(420, \"mm\") },\n b5: { width: new Css.Numeric(176, \"mm\"), height: new Css.Numeric(250, \"mm\") },\n b4: { width: new Css.Numeric(250, \"mm\"), height: new Css.Numeric(353, \"mm\") },\n \"jis-b5\": {\n width: new Css.Numeric(182, \"mm\"),\n height: new Css.Numeric(257, \"mm\"),\n },\n \"jis-b4\": {\n width: new Css.Numeric(257, \"mm\"),\n height: new Css.Numeric(364, \"mm\"),\n },\n letter: {\n width: new Css.Numeric(8.5, \"in\"),\n height: new Css.Numeric(11, \"in\"),\n },\n legal: {\n width: new Css.Numeric(8.5, \"in\"),\n height: new Css.Numeric(14, \"in\"),\n },\n ledger: {\n width: new Css.Numeric(11, \"in\"),\n height: new Css.Numeric(17, \"in\"),\n },\n};\n\n/**\n * Default value for line width of printer marks\n */\nexport const defaultPrinterMarkLineWidth: Css.Numeric = new Css.Numeric(\n 0.24,\n \"pt\",\n);\n\n/**\n * Default value for distance between an edge of the page and printer marks\n */\nexport const defaultPrinterMarkOffset: Css.Numeric = new Css.Numeric(3, \"mm\");\n\n/**\n * Default value for line length of the (shorter) line of a crop mark and the\n * shorter line of a cross mark\n */\nexport const defaultPrinterMarkLineLength: Css.Numeric = new Css.Numeric(\n 10,\n \"mm\",\n);\n\n/**\n * Default value for bleed offset (= defaultPrinterMarkOffset +\n * defaultPrinterMarkLineLength)\n */\nexport const defaultBleedOffset: Css.Numeric = new Css.Numeric(3 + 10, \"mm\");\n\nexport type PageSizeAndBleed = {\n width: Css.Numeric;\n height: Css.Numeric;\n bleed: Css.Numeric;\n bleedOffset: Css.Numeric;\n};\n\nexport function resolvePageSizeAndBleed(style: {\n [key: string]: CssCascade.CascadeValue;\n}): PageSizeAndBleed {\n // default value (fit to viewport, no bleed)\n const pageSizeAndBleed: PageSizeAndBleed = {\n width: Css.fullWidth,\n height: Css.fullHeight,\n bleed: Css.numericZero,\n bleedOffset: Css.numericZero,\n };\n const size: CssCascade.CascadeValue = style[\"size\"];\n\n if (!size || size.value === Css.ident.auto) {\n // if size is auto, fit to the viewport (use default value)\n } else {\n /** !type {!Css.Val} */\n const value = size.value;\n let val1: Css.Val;\n let val2: Css.Val;\n if (value.isSpaceList()) {\n val1 = (value as Css.SpaceList).values[0];\n val2 = (value as Css.SpaceList).values[1];\n } else {\n val1 = value;\n val2 = null;\n }\n if (val1.isNumeric()) {\n // <length>{1,2}\n pageSizeAndBleed.width = val1 as Css.Numeric;\n pageSizeAndBleed.height = (val2 || val1) as Css.Numeric;\n } else {\n // <page-size> || [ portrait | landscape ]\n const s =\n (val1 as any).name && pageSizes[(val1 as Css.Ident).name.toLowerCase()];\n if (!s) {\n // portrait or landscape is specified alone. fallback to fit to the\n // viewport (use default value)\n } else if (val2 && val2 === Css.ident.landscape) {\n // swap\n pageSizeAndBleed.width = s.height;\n pageSizeAndBleed.height = s.width;\n } else {\n // return {\n pageSizeAndBleed.width = s.width;\n pageSizeAndBleed.height = s.height;\n }\n }\n }\n const marks = style[\"marks\"];\n if (marks && marks.value !== Css.ident.none) {\n pageSizeAndBleed.bleedOffset = defaultBleedOffset;\n }\n const bleed = style[\"bleed\"];\n if (!bleed || bleed.value === Css.ident.auto) {\n // \"('auto' value) Computes to 6pt if marks has crop and to zero\n // otherwise.\" https://drafts.csswg.org/css-page/#valdef-page-bleed-auto\n if (marks) {\n let hasCrop = false;\n if (marks.value.isSpaceList()) {\n hasCrop = (marks.value as Css.SpaceList).values.some(\n (v) => v === Css.ident.crop,\n );\n } else {\n hasCrop = marks.value === Css.ident.crop;\n }\n if (hasCrop) {\n pageSizeAndBleed.bleed = new Css.Numeric(6, \"pt\");\n }\n }\n } else if (bleed.value && bleed.value.isNumeric()) {\n pageSizeAndBleed.bleed = bleed.value as Css.Numeric;\n }\n return pageSizeAndBleed;\n}\n\nexport type EvaluatedPageSizeAndBleed = {\n pageWidth: number;\n pageHeight: number;\n bleed: number;\n bleedOffset: number;\n cropOffset: number;\n};\n\n/**\n * Evaluate actual page width, height and bleed from style specified in page\n * context.\n */\nexport function evaluatePageSizeAndBleed(\n pageSizeAndBleed: PageSizeAndBleed,\n context: Exprs.Context,\n): EvaluatedPageSizeAndBleed {\n const evaluated = {} as EvaluatedPageSizeAndBleed;\n const bleed =\n pageSizeAndBleed.bleed.num *\n context.queryUnitSize(pageSizeAndBleed.bleed.unit, false);\n const bleedOffset =\n pageSizeAndBleed.bleedOffset.num *\n context.queryUnitSize(pageSizeAndBleed.bleedOffset.unit, false);\n const cropOffset = bleed + bleedOffset;\n const width = pageSizeAndBleed.width;\n if (width === Css.fullWidth) {\n if (context.pref.defaultPaperSize) {\n evaluated.pageWidth =\n context.pref.defaultPaperSize.width *\n context.queryUnitSize(\"px\", false);\n } else {\n evaluated.pageWidth =\n (context.pref.spreadView\n ? Math.floor(context.viewportWidth / 2) - context.pref.pageBorder\n : context.viewportWidth) -\n cropOffset * 2;\n }\n } else {\n evaluated.pageWidth = width.num * context.queryUnitSize(width.unit, false);\n }\n const height = pageSizeAndBleed.height;\n if (height === Css.fullHeight) {\n if (context.pref.defaultPaperSize) {\n evaluated.pageHeight =\n context.pref.defaultPaperSize.height *\n context.queryUnitSize(\"px\", false);\n } else {\n evaluated.pageHeight = context.viewportHeight - cropOffset * 2;\n }\n } else {\n evaluated.pageHeight =\n height.num * context.queryUnitSize(height.unit, false);\n }\n evaluated.bleed = bleed;\n evaluated.bleedOffset = bleedOffset;\n evaluated.cropOffset = cropOffset;\n return evaluated;\n}\n\n/**\n * Create an 'svg' element for a printer mark.\n */\nexport function createPrinterMarkSvg(\n doc: Document,\n width: number,\n height: number,\n): Element {\n const mark = doc.createElementNS(Base.NS.SVG, \"svg\");\n mark.setAttribute(\"width\", width);\n mark.setAttribute(\"height\", height);\n mark.style.position = \"absolute\";\n return mark;\n}\n\n/**\n * Create an SVG element for a printer mark line.\n * @param elementType Specifies which type of element to create. Default value\n * is \"polyline\".\n */\nexport function createPrinterMarkElement(\n doc: Document,\n lineWidth: number,\n elementType?: string,\n): Element {\n elementType = elementType || \"polyline\";\n const line = doc.createElementNS(Base.NS.SVG, elementType);\n line.setAttribute(\"stroke\", \"black\");\n line.setAttribute(\"stroke-width\", lineWidth);\n line.setAttribute(\"fill\", \"none\");\n return line;\n}\n\n/**\n * Position of a corner mark\n * @enum {string}\n */\nexport enum CornerMarkPosition {\n TOP_LEFT = \"top left\",\n TOP_RIGHT = \"top right\",\n BOTTOM_LEFT = \"bottom left\",\n BOTTOM_RIGHT = \"bottom right\",\n}\n\n/**\n * Create a corner mark.\n */\nexport function createCornerMark(\n doc: Document,\n position: CornerMarkPosition,\n lineWidth: number,\n cropMarkLineLength: number,\n bleed: number,\n offset: number,\n): Element {\n let bleedMarkLineLength = cropMarkLineLength;\n\n // bleed mark line should be longer than bleed + 2mm\n if (bleedMarkLineLength <= bleed + 2 * Exprs.defaultUnitSizes[\"mm\"]) {\n bleedMarkLineLength = bleed + cropMarkLineLength / 2;\n }\n const maxLineLength = Math.max(cropMarkLineLength, bleedMarkLineLength);\n const svgWidth = bleed + maxLineLength + lineWidth / 2;\n const mark = createPrinterMarkSvg(doc, svgWidth, svgWidth);\n let points1 = [\n [0, bleed + cropMarkLineLength],\n [cropMarkLineLength, bleed + cropMarkLineLength],\n [cropMarkLineLength, bleed + cropMarkLineLength - bleedMarkLineLength],\n ];\n\n // reflect with respect to y=x\n let points2 = points1.map((p) => [p[1], p[0]]);\n if (\n position === CornerMarkPosition.TOP_RIGHT ||\n position === CornerMarkPosition.BOTTOM_RIGHT\n ) {\n // reflect with respect to a vertical axis\n points1 = points1.map((p) => [bleed + maxLineLength - p[0], p[1]]);\n points2 = points2.map((p) => [bleed + maxLineLength - p[0], p[1]]);\n }\n if (\n position === CornerMarkPosition.BOTTOM_LEFT ||\n position === CornerMarkPosition.BOTTOM_RIGHT\n ) {\n // reflect with respect to a vertical axis\n points1 = points1.map((p) => [p[0], bleed + maxLineLength - p[1]]);\n points2 = points2.map((p) => [p[0], bleed + maxLineLength - p[1]]);\n }\n const line1 = createPrinterMarkElement(doc, lineWidth);\n line1.setAttribute(\"points\", points1.map((p) => p.join(\",\")).join(\" \"));\n mark.appendChild(line1);\n const line2 = createPrinterMarkElement(doc, lineWidth);\n line2.setAttribute(\"points\", points2.map((p) => p.join(\",\")).join(\" \"));\n mark.appendChild(line2);\n position.split(\" \").forEach((side) => {\n (mark as any).style[side] = `${offset}px`;\n });\n return mark;\n}\n\n/**\n * Position of a cross mark\n * @enum {string}\n */\nexport enum CrossMarkPosition {\n TOP = \"top\",\n BOTTOM = \"bottom\",\n LEFT = \"left\",\n RIGHT = \"right\",\n}\n\n/**\n * Create a cross mark.\n */\nexport function createCrossMark(\n doc: Document,\n position: CrossMarkPosition,\n lineWidth: number,\n lineLength: number,\n offset: number,\n): Element {\n const longLineLength = lineLength * 2;\n let width: number;\n let height: number;\n if (\n position === CrossMarkPosition.TOP ||\n position === CrossMarkPosition.BOTTOM\n ) {\n width = longLineLength;\n height = lineLength;\n } else {\n width = lineLength;\n height = longLineLength;\n }\n const mark = createPrinterMarkSvg(doc, width, height);\n const horizontalLine = createPrinterMarkElement(doc, lineWidth);\n horizontalLine.setAttribute(\n \"points\",\n `0,${height / 2} ${width},${height / 2}`,\n );\n mark.appendChild(horizontalLine);\n const verticalLine = createPrinterMarkElement(doc, lineWidth);\n verticalLine.setAttribute(\"points\", `${width / 2},0 ${width / 2},${height}`);\n mark.appendChild(verticalLine);\n const circle = createPrinterMarkElement(doc, lineWidth, \"circle\");\n circle.setAttribute(\"cx\", width / 2);\n circle.setAttribute(\"cy\", height / 2);\n circle.setAttribute(\"r\", lineLength / 4);\n mark.appendChild(circle);\n let opposite: CrossMarkPosition;\n switch (position) {\n case CrossMarkPosition.TOP:\n opposite = CrossMarkPosition.BOTTOM;\n break;\n case CrossMarkPosition.BOTTOM:\n opposite = CrossMarkPosition.TOP;\n break;\n case CrossMarkPosition.LEFT:\n opposite = CrossMarkPosition.RIGHT;\n break;\n case CrossMarkPosition.RIGHT:\n opposite = CrossMarkPosition.LEFT;\n break;\n }\n Object.keys(CrossMarkPosition).forEach((key) => {\n const side = CrossMarkPosition[key];\n if (side === position) {\n (mark as any).style[side] = `${offset}px`;\n } else if (side !== opposite) {\n (mark as any).style[side] = \"0\";\n (mark as any).style[`margin-${side}`] = \"auto\";\n }\n });\n return mark;\n}\n\n/**\n * Add printer marks to the page.\n */\nexport function addPrinterMarks(\n cascadedPageStyle: CssCascade.ElementStyle,\n evaluatedPageSizeAndBleed: EvaluatedPageSizeAndBleed,\n page: Vtree.Page,\n context: Exprs.Context,\n): void {\n let crop = false;\n let cross = false;\n const marks = cascadedPageStyle[\"marks\"];\n if (marks) {\n const value = marks.value;\n if (value.isSpaceList()) {\n value.values.forEach((v) => {\n if (v === Css.ident.crop) {\n crop = true;\n } else if (v === Css.ident.cross) {\n cross = true;\n }\n });\n } else if (value === Css.ident.crop) {\n crop = true;\n } else if (value === Css.ident.cross) {\n cross = true;\n }\n }\n if (!crop && !cross) {\n return;\n }\n const container = page.container;\n const doc = container.ownerDocument as Document;\n Asserts.assert(doc);\n const bleed = evaluatedPageSizeAndBleed.bleed;\n const lineWidth = Css.toNumber(defaultPrinterMarkLineWidth, context);\n const printerMarkOffset = Css.toNumber(defaultPrinterMarkOffset, context);\n const lineLength = Css.toNumber(defaultPrinterMarkLineLength, context);\n\n if (bleed) {\n const bgcolor = cascadedPageStyle[\"background-color\"];\n if (bgcolor && bgcolor.value) {\n page.bleedBox.style.backgroundColor = bgcolor.value.stringValue();\n }\n }\n\n // corner marks\n if (crop) {\n Object.keys(CornerMarkPosition).forEach((key) => {\n const position = CornerMarkPosition[key];\n const mark = createCornerMark(\n doc,\n position,\n lineWidth,\n lineLength,\n bleed,\n printerMarkOffset,\n );\n container.appendChild(mark);\n });\n }\n\n // cross marks\n if (cross) {\n Object.keys(CrossMarkPosition).forEach((key) => {\n const position = CrossMarkPosition[key];\n const mark = createCrossMark(\n doc,\n position,\n lineWidth,\n lineLength,\n printerMarkOffset,\n );\n container.appendChild(mark);\n });\n }\n}\n\n/**\n * Properties transfered from the PageRuleMaster to the PageRulePartition\n */\nexport const propertiesAppliedToPartition = (() => {\n const sides = [\n \"left\",\n \"right\",\n \"top\",\n \"bottom\",\n \"before\",\n \"after\",\n \"start\",\n \"end\",\n \"block-start\",\n \"block-end\",\n \"inline-start\",\n \"inline-end\",\n ];\n const props = {\n width: true,\n height: true,\n \"block-size\": true,\n \"inline-size\": true,\n margin: true,\n padding: true,\n border: true,\n outline: true,\n \"outline-width\": true,\n \"outline-style\": true,\n \"outline-color\": true,\n };\n sides.forEach((side) => {\n props[`margin-${side}`] = true;\n props[`padding-${side}`] = true;\n props[`border-${side}-width`] = true;\n props[`border-${side}-style`] = true;\n props[`border-${side}-color`] = true;\n });\n return props;\n})();\n\n/**\n * Represents position of a margin box along the variable dimension of the page.\n * START and END can be interpreted as 'inline-start' and 'inline-end' in\n * horizontal and vertical writing modes. For example, for top margin boxes\n * (@top-left-corner, @top-left, @top-center, @top-right, @top-right-corner),\n * @top-left corresponds to START, @top-center to CENTER, and @top-right to END.\n * The corner boxes (@top-left-corner and @top-right-corner) have a 'null'\n * position.\n * @enum {string}\n */\nexport enum MarginBoxPositionAlongVariableDimension {\n START = \"start\",\n CENTER = \"center\",\n END = \"end\",\n}\n\nexport type PageMarginBoxInformation = {\n order: number;\n isInTopRow: boolean;\n isInBottomRow: boolean;\n isInLeftColumn: boolean;\n isInRightColumn: boolean;\n positionAlongVariableDimension: MarginBoxPositionAlongVariableDimension;\n};\n\n/**\n * Page-margin boxes.\n * @dict\n */\nexport const pageMarginBoxes: { [key: string]: PageMarginBoxInformation } = {\n \"top-left-corner\": {\n order: 1,\n isInTopRow: true,\n isInBottomRow: false,\n isInLeftColumn: true,\n isInRightColumn: true,\n positionAlongVariableDimension: null,\n },\n \"top-left\": {\n order: 2,\n isInTopRow: true,\n isInBottomRow: false,\n isInLeftColumn: false,\n isInRightColumn: false,\n positionAlongVariableDimension:\n MarginBoxPositionAlongVariableDimension.START,\n },\n \"top-center\": {\n order: 3,\n isInTopRow: true,\n isInBottomRow: false,\n isInLeftColumn: false,\n isInRightColumn: false,\n positionAlongVariableDimension:\n MarginBoxPositionAlongVariableDimension.CENTER,\n },\n \"top-right\": {\n order: 4,\n isInTopRow: true,\n isInBottomRow: false,\n isInLeftColumn: false,\n isInRightColumn: false,\n positionAlongVariableDimension: MarginBoxPositionAlongVariableDimension.END,\n },\n \"top-right-corner\": {\n order: 5,\n isInTopRow: true,\n isInBottomRow: false,\n isInLeftColumn: false,\n isInRightColumn: true,\n positionAlongVariableDimension: null,\n },\n \"right-top\": {\n order: 6,\n isInTopRow: false,\n isInBottomRow: false,\n isInLeftColumn: false,\n isInRightColumn: true,\n positionAlongVariableDimension:\n MarginBoxPositionAlongVariableDimension.START,\n },\n \"right-middle\": {\n order: 7,\n isInTopRow: false,\n isInBottomRow: false,\n isInLeftColumn: false,\n isInRightColumn: true,\n positionAlongVariableDimension:\n MarginBoxPositionAlongVariableDimension.CENTER,\n },\n \"right-bottom\": {\n order: 8,\n isInTopRow: false,\n isInBottomRow: false,\n isInLeftColumn: false,\n isInRightColumn: true,\n positionAlongVariableDimension: MarginBoxPositionAlongVariableDimension.END,\n },\n \"bottom-right-corner\": {\n order: 9,\n isInTopRow: false,\n isInBottomRow: true,\n isInLeftColumn: false,\n isInRightColumn: true,\n positionAlongVariableDimension: null,\n },\n \"bottom-right\": {\n order: 10,\n isInTopRow: false,\n isInBottomRow: true,\n isInLeftColumn: false,\n isInRightColumn: false,\n positionAlongVariableDimension: MarginBoxPositionAlongVariableDimension.END,\n },\n \"bottom-center\": {\n order: 11,\n isInTopRow: false,\n isInBottomRow: true,\n isInLeftColumn: false,\n isInRightColumn: false,\n positionAlongVariableDimension:\n MarginBoxPositionAlongVariableDimension.CENTER,\n },\n \"bottom-left\": {\n order: 12,\n isInTopRow: false,\n isInBottomRow: true,\n isInLeftColumn: false,\n isInRightColumn: false,\n positionAlongVariableDimension:\n MarginBoxPositionAlongVariableDimension.START,\n },\n \"bottom-left-corner\": {\n order: 13,\n isInTopRow: false,\n isInBottomRow: true,\n isInLeftColumn: true,\n isInRightColumn: false,\n positionAlongVariableDimension: null,\n },\n \"left-bottom\": {\n order: 14,\n isInTopRow: false,\n isInBottomRow: false,\n isInLeftColumn: true,\n isInRightColumn: false,\n positionAlongVariableDimension: MarginBoxPositionAlongVariableDimension.END,\n },\n \"left-middle\": {\n order: 15,\n isInTopRow: false,\n isInBottomRow: false,\n isInLeftColumn: true,\n isInRightColumn: false,\n positionAlongVariableDimension:\n MarginBoxPositionAlongVariableDimension.CENTER,\n },\n \"left-top\": {\n order: 16,\n isInTopRow: false,\n isInBottomRow: false,\n isInLeftColumn: true,\n isInRightColumn: false,\n positionAlongVariableDimension:\n MarginBoxPositionAlongVariableDimension.START,\n },\n};\n\n/**\n * Names for page-margin boxes order in the default painting order.\n */\nexport const pageMarginBoxNames: string[] = (() => {\n const boxes = pageMarginBoxes;\n return Object.keys(boxes).sort((a, b) => boxes[a].order - boxes[b].order);\n})();\n\n/**\n * Indicates that the page master is generated for `@page` rules.\n */\nexport const pageRuleMasterPseudoName = \"vivliostyle-page-rule-master\";\n\n/**\n * Key for properties in margin contexts.\n * Styles in margin contexts are stored in pageStyle[\"_marginBoxes\"][(margin\n * box's name)].\n */\nexport const marginBoxesKey: string = \"_marginBoxes\";\n\n/**\n * Represent a page master generated for `@page` rules\n * @param style Cascaded style for `@page` rules\n */\nexport class PageRuleMaster extends PageMaster.PageMaster<PageRuleMasterInstance> {\n private bodyPartitionKey: string;\n private pageMarginBoxes = {} as {\n [key: string]: PageMarginBoxPartition;\n };\n\n constructor(\n scope: Exprs.LexicalScope,\n parent: PageMaster.RootPageBox,\n style: CssCascade.ElementStyle,\n ) {\n super(scope, null, pageRuleMasterPseudoName, [], parent, null, 0);\n const pageSize = resolvePageSizeAndBleed(style as any);\n const partition = new PageRulePartition(this.scope, this, style, pageSize);\n this.bodyPartitionKey = partition.key;\n this.createPageMarginBoxes(style);\n this.applySpecified(style, pageSize);\n }\n\n /**\n * Create page-margin boxes\n */\n createPageMarginBoxes(style: CssCascade.ElementStyle) {\n const marginBoxesMap = style[marginBoxesKey];\n if (marginBoxesMap) {\n pageMarginBoxNames.forEach((name) => {\n if (marginBoxesMap[name]) {\n this.pageMarginBoxes[name] = new PageMarginBoxPartition(\n this.scope,\n this,\n name,\n style,\n );\n }\n });\n }\n }\n\n /**\n * Transfer cascaded style for `@page` rules to 'specified' style of this\n * PageBox\n */\n private applySpecified(style: CssCascade.ElementStyle, pageSize: PageSize) {\n this.specified[\"position\"] = new CssCascade.CascadeValue(\n Css.ident.relative,\n 0,\n );\n this.specified[\"width\"] = new CssCascade.CascadeValue(pageSize.width, 0);\n this.specified[\"height\"] = new CssCascade.CascadeValue(pageSize.height, 0);\n for (const name in style) {\n if (!propertiesAppliedToPartition[name] && name !== \"background-clip\") {\n this.specified[name] = style[name];\n }\n }\n }\n\n /**\n * @override\n */\n createInstance(parentInstance): PageRuleMasterInstance {\n return new PageRuleMasterInstance(parentInstance, this);\n }\n}\n\n/**\n * Represent a partition placed in a PageRuleMaster\n * @param style Cascaded style for `@page` rules\n */\nexport class PageRulePartition extends PageMaster.Partition<PageRulePartitionInstance> {\n constructor(\n scope: Exprs.LexicalScope,\n parent: PageRuleMaster,\n style: CssCascade.ElementStyle,\n public readonly pageSize: PageSize,\n ) {\n super(scope, null, null, [], parent);\n this.specified[\"z-index\"] = new CssCascade.CascadeValue(new Css.Int(0), 0);\n this.applySpecified(style);\n }\n\n /**\n * Transfer cascaded style for `@page` rules to 'specified' style of this\n * PageBox\n */\n private applySpecified(style: CssCascade.ElementStyle) {\n this.specified[\"flow-from\"] = new CssCascade.CascadeValue(\n Css.getName(\"body\"),\n 0,\n );\n\n // Use absolute positioning so that this partition's margins don't collapse\n // with its parent's margins\n this.specified[\"position\"] = new CssCascade.CascadeValue(\n Css.ident.absolute,\n 0,\n );\n this.specified[\"overflow\"] = new CssCascade.CascadeValue(\n Css.ident.visible,\n 0,\n );\n for (const prop in propertiesAppliedToPartition) {\n if (propertiesAppliedToPartition.hasOwnProperty(prop)) {\n this.specified[prop] = style[prop];\n }\n }\n }\n\n /**\n * @override\n */\n createInstance(parentInstance): PageMaster.PageBoxInstance {\n return new PageRulePartitionInstance(parentInstance, this);\n }\n}\n\n/**\n * Represent a partition for a page-margin box\n */\nexport class PageMarginBoxPartition extends PageMaster.Partition<PageMarginBoxPartitionInstance> {\n constructor(\n scope: Exprs.LexicalScope,\n parent: PageRuleMaster,\n public readonly marginBoxName: string,\n style: CssCascade.ElementStyle,\n ) {\n super(scope, null, null, [], parent);\n this.applySpecified(style);\n }\n\n /**\n * Transfer cascaded style for `@page` rules to 'specified' style of this\n * PageMarginBox\n */\n applySpecified(style: CssCascade.ElementStyle) {\n const ownStyle = style[marginBoxesKey][\n this.marginBoxName\n ] as CssCascade.ElementStyle;\n\n // Inherit properties in the page context to the page-margin context\n for (const prop in style) {\n const val = style[prop] as CssCascade.CascadeValue;\n const ownVal = ownStyle[prop] as CssCascade.CascadeValue;\n if (\n CssCascade.inheritedProps[prop] ||\n (ownVal && ownVal.value === Css.ident.inherit)\n ) {\n this.specified[prop] = val;\n }\n }\n for (const prop in ownStyle) {\n if (Object.prototype.hasOwnProperty.call(ownStyle, prop)) {\n const val = ownStyle[prop] as CssCascade.CascadeValue;\n if (val && val.value !== Css.ident.inherit) {\n this.specified[prop] = val;\n }\n }\n }\n }\n\n /**\n * @override\n */\n createInstance(parentInstance): PageMaster.PageBoxInstance {\n return new PageMarginBoxPartitionInstance(parentInstance, this);\n }\n}\n\n//---------------------------- Instance --------------------------------\nexport type PageAreaDimension = {\n borderBoxWidth: Exprs.Val;\n borderBoxHeight: Exprs.Val;\n marginTop: Exprs.Val;\n marginBottom: Exprs.Val;\n marginLeft: Exprs.Val;\n marginRight: Exprs.Val;\n};\n\nexport class PageRuleMasterInstance extends PageMaster.PageMasterInstance<PageRuleMaster> {\n pageAreaDimension: PageAreaDimension | null = null;\n pageMarginBoxInstances: {\n [key: string]: PageMarginBoxPartitionInstance;\n } = {};\n\n constructor(\n parentInstance: PageMaster.PageBoxInstance,\n pageRuleMaster: PageRuleMaster,\n ) {\n super(parentInstance, pageRuleMaster);\n }\n\n /**\n * @override\n */\n applyCascadeAndInit(\n cascade: CssCascade.CascadeInstance,\n docElementStyle: CssCascade.ElementStyle,\n ): void {\n const style = this.cascaded;\n for (const name in docElementStyle) {\n if (Object.prototype.hasOwnProperty.call(docElementStyle, name)) {\n switch (name) {\n case \"writing-mode\":\n case \"direction\":\n style[name] = docElementStyle[name];\n }\n }\n }\n super.applyCascadeAndInit(cascade, docElementStyle);\n }\n\n /**\n * @override\n */\n initHorizontal(): void {\n const style = this.style;\n style[\"left\"] = Css.numericZero;\n style[\"margin-left\"] = Css.numericZero;\n style[\"border-left-width\"] = Css.numericZero;\n style[\"padding-left\"] = Css.numericZero;\n style[\"padding-right\"] = Css.numericZero;\n style[\"border-right-width\"] = Css.numericZero;\n style[\"margin-right\"] = Css.numericZero;\n style[\"right\"] = Css.numericZero;\n }\n\n /**\n * @override\n */\n initVertical(): void {\n const style = this.style;\n\n // Shift 1px to workaround Chrome printing bug\n // style[\"top\"] = new Css.Numeric(-1, \"px\");\n style[\"top\"] = Css.numericZero;\n style[\"margin-top\"] = Css.numericZero;\n style[\"border-top-width\"] = Css.numericZero;\n style[\"padding-top\"] = Css.numericZero;\n style[\"padding-bottom\"] = Css.numericZero;\n style[\"border-bottom-width\"] = Css.numericZero;\n style[\"margin-bottom\"] = Css.numericZero;\n style[\"bottom\"] = Css.numericZero;\n }\n\n setPageAreaDimension(dim: PageAreaDimension) {\n this.pageAreaDimension = dim;\n const style = this.style;\n style[\"width\"] = new Css.Expr(dim.borderBoxWidth);\n style[\"height\"] = new Css.Expr(dim.borderBoxHeight);\n style[\"padding-left\"] = new Css.Expr(dim.marginLeft);\n style[\"padding-right\"] = new Css.Expr(dim.marginRight);\n style[\"padding-top\"] = new Css.Expr(dim.marginTop);\n style[\"padding-bottom\"] = new Css.Expr(dim.marginBottom);\n }\n\n /**\n * @override\n */\n adjustPageLayout(\n context: Exprs.Context,\n page: Vtree.Page,\n clientLayout: Vtree.ClientLayout,\n ) {\n const marginBoxContainers = page.marginBoxes;\n const horizontalDimensions = {\n start: this.pageAreaDimension.marginLeft,\n end: this.pageAreaDimension.marginRight,\n extent: this.pageAreaDimension.borderBoxWidth,\n };\n const verticalDimensions = {\n start: this.pageAreaDimension.marginTop,\n end: this.pageAreaDimension.marginBottom,\n extent: this.pageAreaDimension.borderBoxHeight,\n };\n this.sizeMarginBoxesAlongVariableDimension(\n marginBoxContainers.top,\n true,\n horizontalDimensions,\n context,\n clientLayout,\n );\n this.sizeMarginBoxesAlongVariableDimension(\n marginBoxContainers.bottom,\n true,\n horizontalDimensions,\n context,\n clientLayout,\n );\n this.sizeMarginBoxesAlongVariableDimension(\n marginBoxContainers.left,\n false,\n verticalDimensions,\n context,\n clientLayout,\n );\n this.sizeMarginBoxesAlongVariableDimension(\n marginBoxContainers.right,\n false,\n verticalDimensions,\n context,\n clientLayout,\n );\n }\n\n /**\n * Determine and set margin boxes' sizes along variable dimension using an\n * algorithm specified in CSS Paged Media spec.\n * @param marginBoxContainers Containers corresponding to the target margin\n * boxes in one page edge (top, bottom, left, right)\n * @param isHorizontal Indicates if the target margin boxes are on the\n * horizontal edge (top or bottom) or not (left or right).\n * @param dimensions Page dimensions. start: margin-left or margin-top. end:\n * margin-right or margin-bottom. extent: border-box width or height of\n * the page area (= available width or height for the target margin boxes)\n */\n private sizeMarginBoxesAlongVariableDimension(\n marginBoxContainers: { [key: string]: Vtree.Container },\n isHorizontal: boolean,\n dimensions: { start: Exprs.Val; end: Exprs.Val; extent: Exprs.Val },\n context: Exprs.Context,\n clientLayout: Vtree.ClientLayout,\n ) {\n const START = MarginBoxPositionAlongVariableDimension.START;\n const CENTER = MarginBoxPositionAlongVariableDimension.CENTER;\n const END = MarginBoxPositionAlongVariableDimension.END;\n\n // prepare parameters\n const scope = this.pageBox.scope;\n const containers: {\n [key in MarginBoxPositionAlongVariableDimension]?: Vtree.Container;\n } = {};\n const boxInstances: {\n [key in MarginBoxPositionAlongVariableDimension]?: PageMarginBoxPartitionInstance;\n } = {};\n const boxParams: {\n [key in MarginBoxPositionAlongVariableDimension]?: MarginBoxSizingParam;\n } = {};\n for (const name in marginBoxContainers) {\n const boxInfo = pageMarginBoxes[name];\n if (boxInfo) {\n const container = marginBoxContainers[name];\n const boxInstance = this.pageMarginBoxInstances[name];\n const boxParam = new SingleBoxMarginBoxSizingParam(\n container,\n (boxInstance as any).style,\n isHorizontal,\n scope,\n clientLayout,\n );\n containers[boxInfo.positionAlongVariableDimension] = container;\n boxInstances[boxInfo.positionAlongVariableDimension] = boxInstance;\n boxParams[boxInfo.positionAlongVariableDimension] = boxParam;\n }\n }\n\n // determine sizes\n const evaluatedDim = {\n start: dimensions.start.evaluate(context) as number,\n end: dimensions.end.evaluate(context) as number,\n extent: dimensions.extent.evaluate(context) as number,\n };\n let sizes = this.getSizesOfMarginBoxesAlongVariableDimension(\n boxParams,\n evaluatedDim.extent,\n );\n let needRecalculate: boolean = false;\n\n // Check max-width/max-height\n const maxOuterSizes: {\n [key in MarginBoxPositionAlongVariableDimension]?: number;\n } = {};\n Object.keys(containers).forEach((n) => {\n const name = n as MarginBoxPositionAlongVariableDimension;\n const maxSize = PageMaster.toExprAuto(\n scope,\n boxInstances[name].style[isHorizontal ? \"max-width\" : \"max-height\"],\n dimensions.extent,\n );\n if (maxSize) {\n const evaluatedMaxSize = maxSize.evaluate(context) as number;\n if (sizes[name] > evaluatedMaxSize) {\n const p = (boxParams[name] = new FixedSizeMarginBoxSizingParam(\n containers[name],\n boxInstances[name].style,\n isHorizontal,\n scope,\n clientLayout,\n evaluatedMaxSize,\n ));\n maxOuterSizes[name] = p.getOuterSize();\n needRecalculate = true;\n }\n }\n });\n if (needRecalculate) {\n sizes = this.getSizesOfMarginBoxesAlongVariableDimension(\n boxParams,\n evaluatedDim.extent,\n );\n needRecalculate = false;\n [START, CENTER, END].forEach((name) => {\n sizes[name] = maxOuterSizes[name] || sizes[name];\n });\n }\n\n // Check min-width/min-height\n const minOuterSizes: {\n [key in MarginBoxPositionAlongVariableDimension]?: number;\n } = {};\n Object.keys(containers).forEach((n) => {\n const name = n as MarginBoxPositionAlongVariableDimension;\n const minSize = PageMaster.toExprAuto(\n scope,\n boxInstances[name].style[isHorizontal ? \"min-width\" : \"min-height\"],\n dimensions.extent,\n );\n if (minSize) {\n const evaluatedMinSize = minSize.evaluate(context) as number;\n if (sizes[name] < evaluatedMinSize) {\n const p = (boxParams[name] = new FixedSizeMarginBoxSizingParam(\n containers[name],\n boxInstances[name].style,\n isHorizontal,\n scope,\n clientLayout,\n evaluatedMinSize,\n ));\n minOuterSizes[name] = p.getOuterSize();\n needRecalculate = true;\n }\n }\n });\n if (needRecalculate) {\n sizes = this.getSizesOfMarginBoxesAlongVariableDimension(\n boxParams,\n evaluatedDim.extent,\n );\n [START, CENTER, END].forEach((name) => {\n sizes[name] = minOuterSizes[name] || sizes[name];\n });\n }\n\n // set sizes\n const endEdge = evaluatedDim.start + evaluatedDim.extent;\n const startEndSum =\n evaluatedDim.start + (evaluatedDim.start + evaluatedDim.extent);\n [START, CENTER, END].forEach((name) => {\n const outerSize = sizes[name];\n if (outerSize) {\n const container = containers[name];\n let offset = 0;\n switch (name) {\n case START:\n offset = isHorizontal ? container.left : container.top;\n break;\n case CENTER:\n offset = (startEndSum - outerSize) / 2;\n break;\n case END:\n offset = endEdge - outerSize;\n break;\n }\n if (isHorizontal) {\n container.setHorizontalPosition(\n offset,\n outerSize - container.getInsetLeft() - container.getInsetRight(),\n );\n } else {\n container.setVerticalPosition(\n offset,\n outerSize - container.getInsetTop() - container.getInsetBottom(),\n );\n }\n }\n });\n }\n\n private getSizesOfMarginBoxesAlongVariableDimension(\n boxParams: {\n [key in MarginBoxPositionAlongVariableDimension]?: MarginBoxSizingParam;\n },\n availableSize: number,\n ): { [key in MarginBoxPositionAlongVariableDimension]?: number } {\n const startBoxParam =\n boxParams[MarginBoxPositionAlongVariableDimension.START];\n const centerBoxParam =\n boxParams[MarginBoxPositionAlongVariableDimension.CENTER];\n const endBoxParam = boxParams[MarginBoxPositionAlongVariableDimension.END];\n const sizes: {\n [key in MarginBoxPositionAlongVariableDimension]?: number;\n } = {};\n if (!centerBoxParam) {\n const startEndSizes = this.distributeAutoMarginBoxSizes(\n startBoxParam,\n endBoxParam,\n availableSize,\n );\n if (startEndSizes.xSize) {\n sizes[MarginBoxPositionAlongVariableDimension.START] =\n startEndSizes.xSize;\n }\n if (startEndSizes.ySize) {\n sizes[MarginBoxPositionAlongVariableDimension.END] =\n startEndSizes.ySize;\n }\n } else {\n const params = [startBoxParam, endBoxParam].filter((p) => p);\n const startEndBoxParam = params.length\n ? new MultipleBoxesMarginBoxSizingParam(params)\n : null;\n const centerSizes = this.distributeAutoMarginBoxSizes(\n centerBoxParam,\n startEndBoxParam,\n availableSize,\n );\n if (centerSizes.xSize) {\n sizes[MarginBoxPositionAlongVariableDimension.CENTER] =\n centerSizes.xSize;\n }\n const centerSize = centerSizes.xSize || centerBoxParam.getOuterSize();\n const startEndAutoSize = (availableSize - centerSize) / 2;\n if (startBoxParam && startBoxParam.hasAutoSize()) {\n sizes[MarginBoxPositionAlongVariableDimension.START] = startEndAutoSize;\n }\n if (endBoxParam && endBoxParam.hasAutoSize()) {\n sizes[MarginBoxPositionAlongVariableDimension.END] = startEndAutoSize;\n }\n }\n return sizes;\n }\n\n /**\n * Distribute auto margin sizes among two margin boxes using an algorithm\n * specified in CSS Paged Media spec.\n * @param x Parameter for the first margin box. null if the box is not\n * generated.\n * @param y Parameter for the second margin box. null if the box is not\n * generated.\n * @param availableSize Available size for the margin boxes.\n * @returns Determined sizes for the two boxes. Each value is present only\n * when the size of the corresponding box is 'auto'.\n */\n private distributeAutoMarginBoxSizes(\n x: MarginBoxSizingParam,\n y: MarginBoxSizingParam,\n availableSize: number,\n ): { xSize: number | null; ySize: number | null } {\n const result: { xSize: number | null; ySize: number | null } = {\n xSize: null,\n ySize: null,\n };\n if (x && y) {\n if (x.hasAutoSize() && y.hasAutoSize()) {\n const xOuterMaxContentSize = x.getOuterMaxContentSize();\n const yOuterMaxContentSize = y.getOuterMaxContentSize();\n if (xOuterMaxContentSize > 0 && yOuterMaxContentSize > 0) {\n const maxContentSizeSum = xOuterMaxContentSize + yOuterMaxContentSize;\n if (maxContentSizeSum < availableSize) {\n result.xSize =\n (availableSize * xOuterMaxContentSize) / maxContentSizeSum;\n } else {\n const xOuterMinContentSize = x.getOuterMinContentSize();\n const yOuterMinContentSize = y.getOuterMinContentSize();\n const minContentSizeSum =\n xOuterMinContentSize + yOuterMinContentSize;\n if (minContentSizeSum < availableSize) {\n result.xSize =\n xOuterMinContentSize +\n ((availableSize - minContentSizeSum) *\n (xOuterMaxContentSize - xOuterMinContentSize)) /\n (maxContentSizeSum - minContentSizeSum);\n } else if (minContentSizeSum > 0) {\n result.xSize =\n (availableSize * xOuterMinContentSize) / minContentSizeSum;\n }\n }\n if (result.xSize > 0) {\n result.ySize = availableSize - result.xSize;\n }\n } else if (xOuterMaxContentSize > 0) {\n result.xSize = availableSize;\n } else if (yOuterMaxContentSize > 0) {\n result.ySize = availableSize;\n }\n } else if (x.hasAutoSize()) {\n result.xSize = Math.max(availableSize - y.getOuterSize(), 0);\n } else if (y.hasAutoSize()) {\n result.ySize = Math.max(availableSize - x.getOuterSize(), 0);\n }\n } else if (x) {\n if (x.hasAutoSize()) {\n result.xSize = availableSize;\n }\n } else if (y) {\n if (y.hasAutoSize()) {\n result.ySize = availableSize;\n }\n }\n return result;\n }\n\n /**\n * @override\n */\n prepareContainer(\n context: Exprs.Context,\n container: Vtree.Container,\n page: Vtree.Page,\n docFaces: Font.DocumentFaces,\n clientLayout: Vtree.ClientLayout,\n ): void {\n super.prepareContainer(context, container, page, docFaces, clientLayout);\n\n // Add an attribute to the element so that it can be refered from external\n // style sheets.\n container.element.setAttribute(\"data-vivliostyle-page-box\", true);\n }\n}\n\n/**\n * Interface used for parameters passed to distributeAutoMarginBoxSizes method.\n */\ninterface MarginBoxSizingParam {\n hasAutoSize(): boolean;\n\n getOuterMaxContentSize(): number;\n\n getOuterMinContentSize(): number;\n\n getOuterSize(): number;\n}\n\n/**\n * MarginBoxSizingParam for a single page-margin box.\n * @param container A container corresponding to the target margin box.\n * @param style Styles specified to the target margin box.\n */\nclass SingleBoxMarginBoxSizingParam implements MarginBoxSizingParam {\n private hasAutoSize_: boolean;\n private size: { [key in Sizing.Size]: number } | null = null;\n\n constructor(\n protected readonly container: Vtree.Container,\n style: { [key: string]: Css.Val },\n protected readonly isHorizontal: boolean,\n scope: Exprs.LexicalScope,\n private readonly clientLayout: Vtree.ClientLayout,\n ) {\n this.hasAutoSize_ = !PageMaster.toExprAuto(\n scope,\n style[isHorizontal ? \"width\" : \"height\"],\n new Exprs.Numeric(scope, 0, \"px\"),\n );\n }\n\n /**\n * @override\n */\n hasAutoSize(): boolean {\n return this.hasAutoSize_;\n }\n\n private getSize(): { [key in Sizing.Size]: number } {\n if (!this.size) {\n const sizes = this.isHorizontal\n ? [Sizing.Size.MAX_CONTENT_WIDTH, Sizing.Size.MIN_CONTENT_WIDTH]\n : [Sizing.Size.MAX_CONTENT_HEIGHT, Sizing.Size.MIN_CONTENT_HEIGHT];\n this.size = Sizing.getSize(\n this.clientLayout,\n this.container.element,\n sizes,\n );\n }\n return this.size;\n }\n\n /**\n * @override\n */\n getOuterMaxContentSize(): number {\n const size = this.getSize();\n if (this.isHorizontal) {\n return (\n this.container.getInsetLeft() +\n size[Sizing.Size.MAX_CONTENT_WIDTH] +\n this.container.getInsetRight()\n );\n } else {\n return (\n this.container.getInsetTop() +\n size[Sizing.Size.MAX_CONTENT_HEIGHT] +\n this.container.getInsetBottom()\n );\n }\n }\n\n /**\n * @override\n */\n getOuterMinContentSize(): number {\n const size = this.getSize();\n if (this.isHorizontal) {\n return (\n this.container.getInsetLeft() +\n size[Sizing.Size.MIN_CONTENT_WIDTH] +\n this.container.getInsetRight()\n );\n } else {\n return (\n this.container.getInsetTop() +\n size[Sizing.Size.MIN_CONTENT_HEIGHT] +\n this.container.getInsetBottom()\n );\n }\n }\n\n /**\n * @override\n */\n getOuterSize(): number {\n if (this.isHorizontal) {\n return (\n this.container.getInsetLeft() +\n this.container.width +\n this.container.getInsetRight()\n );\n } else {\n return (\n this.container.getInsetTop() +\n this.container.height +\n this.container.getInsetBottom()\n );\n }\n }\n}\n\n/**\n * MarginBoxSizingParam with which multiple margin boxes are treated as one\n * margin box. Each method querying a dimension returns the maximum of the boxes\n * multiplied by the number of the boxes.\n * @param params MarginBoxSizingParam's of the target margin boxes.\n */\nclass MultipleBoxesMarginBoxSizingParam implements MarginBoxSizingParam {\n constructor(private readonly params: MarginBoxSizingParam[]) {}\n\n /**\n * @override\n */\n hasAutoSize(): boolean {\n return this.params.some((p) => p.hasAutoSize());\n }\n\n /**\n * @override\n */\n getOuterMaxContentSize(): number {\n const sizes = this.params.map((p) => p.getOuterMaxContentSize());\n return Math.max.apply(null, sizes) * sizes.length;\n }\n\n /**\n * @override\n */\n getOuterMinContentSize(): number {\n const sizes = this.params.map((p) => p.getOuterMinContentSize());\n return Math.max.apply(null, sizes) * sizes.length;\n }\n\n /**\n * @override\n */\n getOuterSize(): number {\n const sizes = this.params.map((p) => p.getOuterSize());\n return Math.max.apply(null, sizes) * sizes.length;\n }\n}\n\n/**\n * MarginBoxSizingParam for a single page-margin box with a fixed size along the\n * variable dimension.\n * @param container A container corresponding to the target margin box.\n * @param style Styles specified to the target margin box.\n * @param size The fixed size (width or height) along the variable dimension.\n */\nclass FixedSizeMarginBoxSizingParam extends SingleBoxMarginBoxSizingParam {\n private fixedSize: number;\n\n constructor(\n container: Vtree.Container,\n style: { [key: string]: Css.Val },\n isHorizontal: boolean,\n scope: Exprs.LexicalScope,\n clientLayout: Vtree.ClientLayout,\n size: number,\n ) {\n super(container, style, isHorizontal, scope, clientLayout);\n this.fixedSize = size;\n }\n\n /**\n * @override\n */\n hasAutoSize(): boolean {\n return false;\n }\n\n /**\n * @override\n */\n getOuterMaxContentSize(): number {\n return this.getOuterSize();\n }\n\n /**\n * @override\n */\n getOuterMinContentSize(): number {\n return this.getOuterSize();\n }\n\n /**\n * @override\n */\n getOuterSize(): number {\n if (this.isHorizontal) {\n return (\n this.container.getInsetLeft() +\n this.fixedSize +\n this.container.getInsetRight()\n );\n } else {\n return (\n this.container.getInsetTop() +\n this.fixedSize +\n this.container.getInsetBottom()\n );\n }\n }\n}\n\nexport class PageRulePartitionInstance extends PageMaster.PartitionInstance<PageRulePartition> {\n borderBoxWidth: Exprs.Val = null;\n borderBoxHeight: Exprs.Val = null;\n marginTop: Exprs.Val = null;\n marginRight: Exprs.Val = null;\n marginBottom: Exprs.Val = null;\n marginLeft: Exprs.Val = null;\n\n constructor(\n parentInstance: PageMaster.PageBoxInstance,\n pageRulePartition: PageRulePartition,\n ) {\n super(parentInstance, pageRulePartition);\n }\n\n /**\n * @override\n */\n applyCascadeAndInit(\n cascade: CssCascade.CascadeInstance,\n docElementStyle: CssCascade.ElementStyle,\n ): void {\n const style = this.cascaded;\n for (const name in docElementStyle) {\n if (Object.prototype.hasOwnProperty.call(docElementStyle, name)) {\n if (name.match(/^column.*$/) || name.match(/^background-/)) {\n style[name] = docElementStyle[name];\n }\n }\n }\n super.applyCascadeAndInit(cascade, docElementStyle);\n const pageRuleMasterInstance = this\n .parentInstance as PageRuleMasterInstance;\n pageRuleMasterInstance.setPageAreaDimension({\n borderBoxWidth: this.borderBoxWidth,\n borderBoxHeight: this.borderBoxHeight,\n marginTop: this.marginTop,\n marginRight: this.marginRight,\n marginBottom: this.marginBottom,\n marginLeft: this.marginLeft,\n });\n }\n\n /**\n * @override\n */\n initHorizontal(): void {\n const dim = this.resolvePageBoxDimensions({\n start: \"left\",\n end: \"right\",\n extent: \"width\",\n });\n this.borderBoxWidth = dim.borderBoxExtent;\n this.marginLeft = dim.marginStart;\n this.marginRight = dim.marginEnd;\n }\n\n /**\n * @override\n */\n initVertical(): void {\n const dim = this.resolvePageBoxDimensions({\n start: \"top\",\n end: \"bottom\",\n extent: \"height\",\n });\n this.borderBoxHeight = dim.borderBoxExtent;\n this.marginTop = dim.marginStart;\n this.marginBottom = dim.marginEnd;\n }\n\n /**\n * Calculate page dimensions as specified in CSS Paged Media\n * (http://dev.w3.org/csswg/css-page/#page-model) Page border box extent and\n * margins. Since the containing block can be resized in the over-constrained\n * case, the sum of these values is not necessarily same to the original page\n * dimension specified in the page at-rules.\n */\n private resolvePageBoxDimensions(names: {\n start: string;\n end: string;\n extent: string;\n }): {\n borderBoxExtent: Exprs.Val;\n marginStart: Exprs.Val;\n marginEnd: Exprs.Val;\n } {\n const style = this.style;\n const pageSize = this.pageBox.pageSize;\n const scope = this.pageBox.scope;\n const startSide = names.start;\n const endSide = names.end;\n const extentName = names.extent;\n const pageExtent = pageSize[extentName].toExpr(scope, null);\n let extent = PageMaster.toExprAuto(scope, style[extentName], pageExtent);\n let marginStart = PageMaster.toExprAuto(\n scope,\n style[`margin-${startSide}`],\n pageExtent,\n );\n let marginEnd = PageMaster.toExprAuto(\n scope,\n style[`margin-${endSide}`],\n pageExtent,\n );\n const paddingStart = PageMaster.toExprZero(\n scope,\n style[`padding-${startSide}`],\n pageExtent,\n );\n const paddingEnd = PageMaster.toExprZero(\n scope,\n style[`padding-${endSide}`],\n pageExtent,\n );\n const borderStartWidth = PageMaster.toExprZeroBorder(\n scope,\n style[`border-${startSide}-width`],\n style[`border-${startSide}-style`],\n pageExtent,\n );\n const borderEndWidth = PageMaster.toExprZeroBorder(\n scope,\n style[`border-${endSide}-width`],\n style[`border-${endSide}-style`],\n pageExtent,\n );\n let remains = Exprs.sub(\n scope,\n pageExtent,\n Exprs.add(\n scope,\n Exprs.add(scope, borderStartWidth, paddingStart),\n Exprs.add(scope, borderEndWidth, paddingEnd),\n ),\n );\n\n // The dimensions are calculated as for a non-replaced block element in\n // normal flow (http://www.w3.org/TR/CSS21/visudet.html#blockwidth)\n if (!extent) {\n if (!marginStart) {\n marginStart = scope.zero;\n }\n if (!marginEnd) {\n marginEnd = scope.zero;\n }\n extent = Exprs.sub(\n scope,\n remains,\n Exprs.add(scope, marginStart, marginEnd),\n );\n } else {\n remains = Exprs.sub(scope, remains, extent);\n if (!marginStart && !marginEnd) {\n marginStart = Exprs.mul(scope, remains, new Exprs.Const(scope, 0.5));\n marginEnd = marginStart;\n } else if (marginStart) {\n marginEnd = Exprs.sub(scope, remains, marginStart);\n } else {\n marginStart = Exprs.sub(scope, remains, marginEnd);\n }\n }\n\n // TODO over-constrained case\n // \"if the values are over-constrained, instead of ignoring any margins, the\n // containing block is resized to coincide with the margin edges of the page\n // box.\" (CSS Paged Media http://dev.w3.org/csswg/css-page/#page-model)\n style[startSide] = new Css.Expr(marginStart);\n style[endSide] = new Css.Expr(marginEnd);\n style[`margin-${startSide}`] = Css.numericZero;\n style[`margin-${endSide}`] = Css.numericZero;\n style[`padding-${startSide}`] = new Css.Expr(paddingStart);\n style[`padding-${endSide}`] = new Css.Expr(paddingEnd);\n style[`border-${startSide}-width`] = new Css.Expr(borderStartWidth);\n style[`border-${endSide}-width`] = new Css.Expr(borderEndWidth);\n style[extentName] = new Css.Expr(extent);\n style[`max-${extentName}`] = new Css.Expr(extent);\n return {\n borderBoxExtent: Exprs.sub(\n scope,\n pageExtent,\n Exprs.add(scope, marginStart, marginEnd),\n ),\n marginStart,\n marginEnd,\n };\n }\n\n /**\n * @override\n */\n prepareContainer(\n context: Exprs.Context,\n container: Vtree.Container,\n page: Vtree.Page,\n docFaces: Font.DocumentFaces,\n clientLayout: Vtree.ClientLayout,\n ): void {\n super.prepareContainer(context, container, page, docFaces, clientLayout);\n page.pageAreaElement = container.element as HTMLElement;\n\n // Set page area size for vw/vh unit calculation\n context.pageAreaWidth = parseFloat(page.pageAreaElement.style.width);\n context.pageAreaHeight = parseFloat(page.pageAreaElement.style.height);\n }\n}\n\nexport class PageMarginBoxPartitionInstance extends PageMaster.PartitionInstance<PageMarginBoxPartition> {\n boxInfo: PageMarginBoxInformation;\n suppressEmptyBoxGeneration: boolean = true;\n\n constructor(\n parentInstance: PageMaster.PageBoxInstance,\n pageMarginBoxPartition: PageMarginBoxPartition,\n ) {\n super(parentInstance, pageMarginBoxPartition);\n const name = pageMarginBoxPartition.marginBoxName;\n this.boxInfo = pageMarginBoxes[name];\n const pageRuleMasterInstance = parentInstance as PageRuleMasterInstance;\n pageRuleMasterInstance.pageMarginBoxInstances[name] = this;\n }\n\n /**\n * @override\n */\n prepareContainer(\n context: Exprs.Context,\n container: Vtree.Container,\n page: Vtree.Page,\n docFaces: Font.DocumentFaces,\n clientLayout: Vtree.ClientLayout,\n ): void {\n this.applyVerticalAlign(context, container.element);\n super.prepareContainer(context, container, page, docFaces, clientLayout);\n }\n\n private applyVerticalAlign(context: Exprs.Context, element: Element) {\n Base.setCSSProperty(element, \"display\", \"flex\");\n const verticalAlign: Css.Val = this.getProp(context, \"vertical-align\");\n let flexAlign: string | null = null;\n if (verticalAlign === Css.getName(\"middle\")) {\n flexAlign = \"center\";\n } else if (verticalAlign === Css.getName(\"top\")) {\n flexAlign = \"flex-start\";\n } else if (verticalAlign === Css.getName(\"bottom\")) {\n flexAlign = \"flex-end\";\n }\n if (flexAlign) {\n Base.setCSSProperty(\n element,\n \"flex-flow\",\n this.vertical ? \"row\" : \"column\",\n );\n Base.setCSSProperty(element, \"justify-content\", flexAlign);\n }\n }\n\n /**\n * Calculate page-margin boxes positions along the variable dimension of the\n * page. For CENTER and END margin boxes, the position is calculated only if\n * the dimension (width or height) is non-auto, so that it can be resolved at\n * this point. If the dimension is auto, the calculation is deffered.\n */\n private positionAlongVariableDimension(\n names: { start: string; end: string; extent: string },\n dim: PageAreaDimension | null,\n ): void {\n const style = this.style;\n const scope = this.pageBox.scope;\n const startSide = names.start;\n const endSide = names.end;\n const extentName = names.extent;\n const isHorizontal = startSide === \"left\";\n const availableExtent = isHorizontal\n ? dim.borderBoxWidth\n : dim.borderBoxHeight;\n const extent = PageMaster.toExprAuto(\n scope,\n style[extentName],\n availableExtent,\n );\n const startOffset = isHorizontal ? dim.marginLeft : dim.marginTop;\n if (\n this.boxInfo.positionAlongVariableDimension ===\n MarginBoxPositionAlongVariableDimension.START\n ) {\n style[startSide] = new Css.Expr(startOffset);\n } else if (extent) {\n const marginStart = PageMaster.toExprZero(\n scope,\n style[`margin-${startSide}`],\n availableExtent,\n );\n const marginEnd = PageMaster.toExprZero(\n scope,\n style[`margin-${endSide}`],\n availableExtent,\n );\n const paddingStart = PageMaster.toExprZero(\n scope,\n style[`padding-${startSide}`],\n availableExtent,\n );\n const paddingEnd = PageMaster.toExprZero(\n scope,\n style[`padding-${endSide}`],\n availableExtent,\n );\n const borderStartWidth = PageMaster.toExprZeroBorder(\n scope,\n style[`border-${startSide}-width`],\n style[`border-${startSide}-style`],\n availableExtent,\n );\n const borderEndWidth = PageMaster.toExprZeroBorder(\n scope,\n style[`border-${endSide}-width`],\n style[`border-${endSide}-style`],\n availableExtent,\n );\n const outerExtent = Exprs.add(\n scope,\n extent,\n Exprs.add(\n scope,\n Exprs.add(scope, paddingStart, paddingEnd),\n Exprs.add(\n scope,\n Exprs.add(scope, borderStartWidth, borderEndWidth),\n Exprs.add(scope, marginStart, marginEnd),\n ),\n ),\n );\n switch (this.boxInfo.positionAlongVariableDimension) {\n case MarginBoxPositionAlongVariableDimension.CENTER:\n style[startSide] = new Css.Expr(\n Exprs.add(\n scope,\n startOffset,\n Exprs.div(\n scope,\n Exprs.sub(scope, availableExtent, outerExtent),\n new Exprs.Const(scope, 2),\n ),\n ),\n );\n break;\n case MarginBoxPositionAlongVariableDimension.END:\n style[startSide] = new Css.Expr(\n Exprs.sub(\n scope,\n Exprs.add(scope, startOffset, availableExtent),\n outerExtent,\n ),\n );\n break;\n }\n }\n }\n\n /**\n * Calculate page-margin boxes positions along the fixed dimension of the\n * page.\n */\n private positionAndSizeAlongFixedDimension(\n names: { inside: string; outside: string; extent: string },\n dim: PageAreaDimension | null,\n ): void {\n const style = this.style;\n const scope = this.pageBox.scope;\n const insideName = names.inside;\n const outsideName = names.outside;\n const extentName = names.extent;\n const pageMargin =\n dim[\n `margin${outsideName.charAt(0).toUpperCase()}${outsideName.substring(\n 1,\n )}`\n ];\n const marginInside = PageMaster.toExprZeroAuto(\n scope,\n style[`margin-${insideName}`],\n pageMargin,\n );\n const marginOutside = PageMaster.toExprZeroAuto(\n scope,\n style[`margin-${outsideName}`],\n pageMargin,\n );\n const paddingInside = PageMaster.toExprZero(\n scope,\n style[`padding-${insideName}`],\n pageMargin,\n );\n const paddingOutside = PageMaster.toExprZero(\n scope,\n style[`padding-${outsideName}`],\n pageMargin,\n );\n const borderInsideWidth = PageMaster.toExprZeroBorder(\n scope,\n style[`border-${insideName}-width`],\n style[`border-${insideName}-style`],\n pageMargin,\n );\n const borderOutsideWidth = PageMaster.toExprZeroBorder(\n scope,\n style[`border-${outsideName}-width`],\n style[`border-${outsideName}-style`],\n pageMargin,\n );\n const extent = PageMaster.toExprAuto(scope, style[extentName], pageMargin);\n let result: {\n extent: Exprs.Result;\n marginInside: Exprs.Result;\n marginOutside: Exprs.Result;\n } = null;\n\n function getComputedValues(\n context: Exprs.Context,\n ): {\n extent: Exprs.Result | null;\n marginInside: Exprs.Result | null;\n marginOutside: Exprs.Result | null;\n } {\n if (result) {\n return result;\n }\n result = {\n extent: extent ? extent.evaluate(context) : null,\n marginInside: marginInside ? marginInside.evaluate(context) : null,\n marginOutside: marginOutside ? marginOutside.evaluate(context) : null,\n };\n const pageMarginValue = pageMargin.evaluate(context);\n let borderAndPadding = 0;\n [\n borderInsideWidth,\n paddingInside,\n paddingOutside,\n borderOutsideWidth,\n ].forEach((x) => {\n if (x) {\n borderAndPadding += x.evaluate(context) as number;\n }\n });\n if (result.marginInside === null || result.marginOutside === null) {\n const total =\n borderAndPadding +\n (result.extent as number) +\n (result.marginInside as number) +\n (result.marginOutside as number);\n if (total > pageMarginValue) {\n if (result.marginInside === null) {\n result.marginInside = 0;\n }\n if (result.marginOutside === null) {\n result.marginOutside = 0;\n }\n }\n }\n if (\n result.extent !== null &&\n result.marginInside !== null &&\n result.marginOutside !== null\n ) {\n // over-constrained\n result.marginOutside = null;\n }\n if (\n result.extent === null &&\n result.marginInside !== null &&\n result.marginOutside !== null\n ) {\n result.extent =\n pageMarginValue -\n borderAndPadding -\n (result.marginInside as number) -\n (result.marginOutside as number);\n } else if (\n result.extent !== null &&\n (result.marginInside as number) === null &&\n (result.marginOutside as number) !== null\n ) {\n result.marginInside =\n pageMarginValue -\n borderAndPadding -\n (result.extent as number) -\n (result.marginOutside as number);\n } else if (\n result.extent !== null &&\n result.marginInside !== null &&\n result.marginOutside === null\n ) {\n result.marginOutside =\n pageMarginValue -\n borderAndPadding -\n (result.extent as number) -\n (result.marginInside as number);\n } else if (result.extent === null) {\n result.marginInside = result.marginOutside = 0;\n result.extent = pageMarginValue - borderAndPadding;\n } else {\n result.marginInside = result.marginOutside =\n (pageMarginValue - borderAndPadding - (result.extent as number)) / 2;\n }\n return result;\n }\n style[extentName] = new Css.Expr(\n new Exprs.Native(\n scope,\n function () {\n const value = getComputedValues(this).extent;\n return value === null ? 0 : value;\n },\n extentName,\n ),\n );\n style[`margin-${insideName}`] = new Css.Expr(\n new Exprs.Native(\n scope,\n function () {\n const value = getComputedValues(this).marginInside;\n return value === null ? 0 : value;\n },\n `margin-${insideName}`,\n ),\n );\n style[`margin-${outsideName}`] = new Css.Expr(\n new Exprs.Native(\n scope,\n function () {\n const value = getComputedValues(this).marginOutside;\n return value === null ? 0 : value;\n },\n `margin-${outsideName}`,\n ),\n );\n if (insideName === \"left\") {\n style[\"left\"] = new Css.Expr(\n Exprs.add(scope, dim.marginLeft, dim.borderBoxWidth),\n );\n } else if (insideName === \"top\") {\n style[\"top\"] = new Css.Expr(\n Exprs.add(scope, dim.marginTop, dim.borderBoxHeight),\n );\n }\n }\n\n /**\n * @override\n */\n initHorizontal(): void {\n const pageRuleMasterInstance = this\n .parentInstance as PageRuleMasterInstance;\n const dim = pageRuleMasterInstance.pageAreaDimension;\n if (this.boxInfo.isInLeftColumn) {\n this.positionAndSizeAlongFixedDimension(\n { inside: \"right\", outside: \"left\", extent: \"width\" },\n dim,\n );\n } else if (this.boxInfo.isInRightColumn) {\n this.positionAndSizeAlongFixedDimension(\n { inside: \"left\", outside: \"right\", extent: \"width\" },\n dim,\n );\n } else {\n this.positionAlongVariableDimension(\n { start: \"left\", end: \"right\", extent: \"width\" },\n dim,\n );\n }\n }\n\n /**\n * @override\n */\n initVertical(): void {\n const pageRuleMasterInstance = this\n .parentInstance as PageRuleMasterInstance;\n const dim = pageRuleMasterInstance.pageAreaDimension;\n if (this.boxInfo.isInTopRow) {\n this.positionAndSizeAlongFixedDimension(\n { inside: \"bottom\", outside: \"top\", extent: \"height\" },\n dim,\n );\n } else if (this.boxInfo.isInBottomRow) {\n this.positionAndSizeAlongFixedDimension(\n { inside: \"top\", outside: \"bottom\", extent: \"height\" },\n dim,\n );\n } else {\n this.positionAlongVariableDimension(\n { start: \"top\", end: \"bottom\", extent: \"height\" },\n dim,\n );\n }\n }\n\n /**\n * @override\n */\n finishContainer(\n context: Exprs.Context,\n container: Vtree.Container,\n page: Vtree.Page,\n column: Vtree.Container,\n columnCount: number,\n clientLayout: Vtree.ClientLayout,\n docFaces: Font.DocumentFaces,\n ): void {\n super.finishContainer(\n context,\n container,\n page,\n column,\n columnCount,\n clientLayout,\n docFaces,\n );\n\n // finishContainer is called only when the margin box is generated.\n // In this case, store the generated container for the margin box in the\n // page object. (except when it is a corner margin box, because size of a\n // corner margin box does not need to be adjusted after the layout)\n const marginBoxes = page.marginBoxes;\n const name = (this.pageBox as any).marginBoxName;\n const boxInfo = this.boxInfo;\n if (!boxInfo.isInLeftColumn && !boxInfo.isInRightColumn) {\n if (boxInfo.isInTopRow) {\n marginBoxes.top[name] = container;\n } else if (boxInfo.isInBottomRow) {\n marginBoxes.bottom[name] = container;\n }\n } else if (!boxInfo.isInTopRow && !boxInfo.isInBottomRow) {\n if (boxInfo.isInLeftColumn) {\n marginBoxes.left[name] = container;\n } else if (boxInfo.isInRightColumn) {\n marginBoxes.right[name] = container;\n }\n }\n }\n}\n\n/**\n * Dynamically generate and manage page masters corresponding to page at-rules.\n */\nexport class PageManager {\n private pageMasterCache: any = {} as {\n [key: string]: PageMaster.PageMasterInstance;\n };\n\n constructor(\n private readonly cascadeInstance: CssCascade.CascadeInstance,\n private readonly pageScope: Exprs.LexicalScope,\n private readonly rootPageBoxInstance: PageMaster.RootPageBoxInstance,\n private readonly context: Exprs.Context,\n private readonly docElementStyle: CssCascade.ElementStyle,\n ) {\n this.definePageProgression();\n }\n\n /**\n * Determine the page progression and define left/right/recto/verso pages.\n */\n private definePageProgression() {\n // If a page break is forced before the root element, recto/verso pages\n // are no longer odd/even pages. left/right are reversed too.\n const scope = this.pageScope;\n const styleInstance: any /* Ops.StyleInstance */ = this.context;\n const isVersoFirstPage = styleInstance.isVersoFirstPage;\n const pageNumber = new Exprs.Named(scope, \"page-number\");\n const isVersoPage = new Exprs.Eq(\n scope,\n new Exprs.Modulo(scope, pageNumber, new Exprs.Const(scope, 2)),\n isVersoFirstPage ? scope.one : scope.zero,\n );\n scope.defineName(\"recto-page\", new Exprs.Not(scope, isVersoPage));\n scope.defineName(\"verso-page\", isVersoPage);\n const pageProgression =\n styleInstance.pageProgression ||\n resolvePageProgression(this.docElementStyle);\n if (pageProgression === Constants.PageProgression.LTR) {\n scope.defineName(\"left-page\", isVersoPage);\n scope.defineName(\"right-page\", new Exprs.Not(scope, isVersoPage));\n } else {\n scope.defineName(\"left-page\", new Exprs.Not(scope, isVersoPage));\n scope.defineName(\"right-page\", isVersoPage);\n }\n }\n\n /**\n * Get cascaded page style specified in page context for the current page.\n */\n getCascadedPageStyle(): CssCascade.ElementStyle {\n const style = {} as CssCascade.ElementStyle;\n this.cascadeInstance.pushRule([], \"\", style);\n this.cascadeInstance.popRule();\n return style;\n }\n\n /**\n * Return a PageMasterInstance with page rules applied. Return a cached\n * instance if there already exists one with the same styles.\n * @param pageMasterInstance The original page master instance.\n * @param cascadedPageStyle Cascaded page style specified in page context.\n */\n getPageRulePageMaster(\n pageMasterInstance: PageMaster.PageMasterInstance,\n cascadedPageStyle: CssCascade.ElementStyle,\n ): PageMaster.PageMasterInstance {\n const pageMaster = pageMasterInstance.pageBox as PageMaster.PageMaster;\n\n // If no properies are specified in @page rules, use the original page\n // master.\n if (Object.keys(cascadedPageStyle).length === 0) {\n pageMaster.resetScope();\n return pageMasterInstance;\n }\n const key = this.makeCacheKey(cascadedPageStyle, pageMaster);\n let applied = this.pageMasterCache[key];\n if (!applied) {\n if (pageMaster.pseudoName === PageMaster.userAgentPageMasterPseudo) {\n // If the passed page master is a UA page master,\n // ignore it and generate a new page master from @page rules.\n applied = this.generatePageRuleMaster(cascadedPageStyle);\n } else {\n // Otherwise cascade some properties from @page rules to the page\n // master.\n applied = this.generateCascadedPageMaster(\n cascadedPageStyle,\n pageMaster,\n );\n }\n this.pageMasterCache[key] = applied;\n }\n applied.pageBox.resetScope();\n return applied;\n }\n\n /**\n * Generate a cache key from the specified styles and the original page master\n * key.\n */\n private makeCacheKey(\n style: CssCascade.ElementStyle,\n pageMaster: PageMaster.PageMaster,\n ): string {\n const propsStr = this.makeCascadeValueObjectKey(style);\n return `${pageMaster.key}^${propsStr}`;\n }\n\n private makeCascadeValueObjectKey(object: CssCascade.ElementStyle): string {\n const props = [] as string[];\n for (const prop in object) {\n if (Object.prototype.hasOwnProperty.call(object, prop)) {\n const val = object[prop];\n let str: string;\n if (val instanceof CssCascade.CascadeValue) {\n str = `${val.value}`;\n } else {\n str = this.makeCascadeValueObjectKey(val);\n }\n props.push(prop + str + (val.priority || \"\"));\n }\n }\n return props.sort().join(\"^\");\n }\n\n private generatePageRuleMaster(\n style: CssCascade.ElementStyle,\n ): PageRuleMasterInstance {\n const pageMaster = new PageRuleMaster(\n this.pageScope,\n this.rootPageBoxInstance.pageBox as PageMaster.RootPageBox,\n style,\n );\n const pageMasterInstance = pageMaster.createInstance(\n this.rootPageBoxInstance,\n );\n\n // Do the same initialization as in Ops.StyleInstance.prototype.init\n pageMasterInstance.applyCascadeAndInit(\n this.cascadeInstance,\n this.docElementStyle,\n );\n pageMasterInstance.resolveAutoSizing(this.context);\n return pageMasterInstance;\n }\n\n /**\n * Cascade some properties from `@page` rules to a page master.\n * For now, only 'width' and 'height' resolved from 'size' value are cascaded.\n * @param style Cascaded style in the page context\n * @param pageMaster The original page master\n */\n private generateCascadedPageMaster(\n style: CssCascade.ElementStyle,\n pageMaster: PageMaster.PageMaster,\n ): PageMaster.PageMasterInstance {\n const newPageMaster = pageMaster.clone({\n pseudoName: pageRuleMasterPseudoName,\n });\n const pageMasterStyle = newPageMaster.specified;\n const size = style[\"size\"];\n if (size) {\n const pageSize = resolvePageSizeAndBleed(style as any);\n const priority = size.priority;\n pageMasterStyle[\"width\"] = CssCascade.cascadeValues(\n this.context,\n pageMasterStyle[\"width\"],\n new CssCascade.CascadeValue(pageSize.width, priority),\n );\n pageMasterStyle[\"height\"] = CssCascade.cascadeValues(\n this.context,\n pageMasterStyle[\"height\"],\n new CssCascade.CascadeValue(pageSize.height, priority),\n );\n }\n\n // Transfer counter properties to the page style so that these specified in\n // the page master are also effective. Note that these values (if specified)\n // always override values in page contexts.\n [\"counter-reset\", \"counter-increment\"].forEach((name) => {\n if (pageMasterStyle[name]) {\n style[name] = pageMasterStyle[name];\n }\n });\n const pageMasterInstance = newPageMaster.createInstance(\n this.rootPageBoxInstance,\n ) as PageMaster.PageMasterInstance;\n\n // Do the same initialization as in Ops.StyleInstance.prototype.init\n pageMasterInstance.applyCascadeAndInit(\n this.cascadeInstance,\n this.docElementStyle,\n );\n pageMasterInstance.resolveAutoSizing(this.context);\n return pageMasterInstance;\n }\n}\n\nexport class CheckPageTypeAction extends CssCascade.ChainedAction {\n constructor(public readonly pageType: string) {\n super();\n }\n\n /**\n * @override\n */\n apply(cascadeInstance: CssCascade.CascadeInstance): void {\n if (cascadeInstance.currentPageType === this.pageType) {\n this.chained.apply(cascadeInstance);\n }\n }\n\n /**\n * @override\n */\n getPriority(): number {\n return 3;\n }\n\n /**\n * @override\n */\n makePrimary(cascade: CssCascade.Cascade): boolean {\n if (this.chained) {\n cascade.insertInTable(cascade.pagetypes, this.pageType, this.chained);\n }\n return true;\n }\n}\n\nexport class IsFirstPageAction extends CssCascade.ChainedAction {\n constructor(public readonly scope: Exprs.LexicalScope) {\n super();\n }\n\n /**\n * @override\n */\n apply(cascadeInstance: CssCascade.CascadeInstance): void {\n const pageNumber = new Exprs.Named(this.scope, \"page-number\");\n if (pageNumber.evaluate(cascadeInstance.context) === 1) {\n this.chained.apply(cascadeInstance);\n }\n }\n\n /**\n * @override\n */\n getPriority(): number {\n return 2;\n }\n}\n\nexport class IsLeftPageAction extends CssCascade.ChainedAction {\n constructor(public readonly scope: Exprs.LexicalScope) {\n super();\n }\n\n /**\n * @override\n */\n apply(cascadeInstance: CssCascade.CascadeInstance): void {\n const leftPage = new Exprs.Named(this.scope, \"left-page\");\n if (leftPage.evaluate(cascadeInstance.context)) {\n this.chained.apply(cascadeInstance);\n }\n }\n\n /**\n * @override\n */\n getPriority(): number {\n return 1;\n }\n}\n\nexport class IsRightPageAction extends CssCascade.ChainedAction {\n constructor(public readonly scope: Exprs.LexicalScope) {\n super();\n }\n\n /**\n * @override\n */\n apply(cascadeInstance: CssCascade.CascadeInstance): void {\n const rightPage = new Exprs.Named(this.scope, \"right-page\");\n if (rightPage.evaluate(cascadeInstance.context)) {\n this.chained.apply(cascadeInstance);\n }\n }\n\n /**\n * @override\n */\n getPriority(): number {\n return 1;\n }\n}\n\nexport class IsRectoPageAction extends CssCascade.ChainedAction {\n constructor(public readonly scope: Exprs.LexicalScope) {\n super();\n }\n\n /**\n * @override\n */\n apply(cascadeInstance: CssCascade.CascadeInstance): void {\n const rectoPage = new Exprs.Named(this.scope, \"recto-page\");\n if (rectoPage.evaluate(cascadeInstance.context)) {\n this.chained.apply(cascadeInstance);\n }\n }\n\n /**\n * @override\n */\n getPriority(): number {\n return 1;\n }\n}\n\nexport class IsVersoPageAction extends CssCascade.ChainedAction {\n constructor(public readonly scope: Exprs.LexicalScope) {\n super();\n }\n\n /**\n * @override\n */\n apply(cascadeInstance: CssCascade.CascadeInstance): void {\n const versoPage = new Exprs.Named(this.scope, \"verso-page\");\n if (versoPage.evaluate(cascadeInstance.context)) {\n this.chained.apply(cascadeInstance);\n }\n }\n\n /**\n * @override\n */\n getPriority(): number {\n return 1;\n }\n}\n\nexport class IsNthPageAction extends CssCascade.IsNthAction {\n constructor(\n public readonly scope: Exprs.LexicalScope,\n public readonly a: number,\n public readonly b: number,\n ) {\n super(a, b);\n }\n\n /**\n * @override\n */\n apply(cascadeInstance: CssCascade.CascadeInstance): void {\n const styleInstance: any /* Ops.StyleInstance */ = cascadeInstance.context;\n let pageNumber = styleInstance.layoutPositionAtPageStart.page;\n if (styleInstance.blankPageAtStart) {\n pageNumber--;\n }\n if (pageNumber && this.matchANPlusB(pageNumber)) {\n this.chained.apply(cascadeInstance);\n }\n }\n\n /**\n * @override\n */\n getPriority(): number {\n return 2;\n }\n}\n\n/**\n * Action applying an at-page rule\n */\nexport class ApplyPageRuleAction extends CssCascade.ApplyRuleAction {\n constructor(style: CssCascade.ElementStyle, specificity: number) {\n super(style, specificity, null, null, null);\n }\n\n /**\n * @override\n */\n apply(cascadeInstance: CssCascade.CascadeInstance): void {\n mergeInPageRule(\n cascadeInstance.context,\n cascadeInstance.currentStyle,\n this.style,\n this.specificity,\n cascadeInstance,\n );\n }\n}\n\n/**\n * Merge page styles, including styles specified on page-margin boxes,\n * considering specificity. Intended to be used in place of\n * CssCascade.mergeIn, which is for element styles.\n */\nexport function mergeInPageRule(\n context: Exprs.Context,\n target: CssCascade.ElementStyle,\n style: CssCascade.ElementStyle,\n specificity: number,\n cascadeInstance: CssCascade.CascadeInstance,\n): void {\n CssCascade.mergeIn(context, target, style, specificity, null, null, null);\n const marginBoxes = style[marginBoxesKey];\n if (marginBoxes) {\n const targetMap = CssCascade.getMutableStyleMap(target, marginBoxesKey);\n for (const boxName in marginBoxes) {\n if (marginBoxes.hasOwnProperty(boxName)) {\n let targetBox = targetMap[boxName];\n if (!targetBox) {\n targetBox = {} as CssCascade.ElementStyle;\n targetMap[boxName] = targetBox;\n }\n CssCascade.mergeIn(\n context,\n targetBox,\n marginBoxes[boxName],\n specificity,\n null,\n null,\n null,\n );\n }\n }\n }\n}\n\n/**\n * ParserHandler for `@page` rules. It handles properties specified with page\n * contexts. It also does basic cascading (which can be done without information\n * other than the page rules themselves) and stores the result in `pageProps`\n * object as a map from page selectors to sets of properties. This result is\n * later used for adding `@page` rules to the real DOM, which are then used by\n * the PDF renderer (Chromium) to determine page sizes.\n */\nexport class PageParserHandler\n extends CssCascade.CascadeParserHandler\n implements CssValidator.PropertyReceiver {\n private currentPageSelectors: {\n selectors: string[] | null;\n specificity: number;\n }[] = [];\n private currentNamedPageSelector: string = \"\";\n private currentPseudoPageClassSelectors: string[] = [];\n\n constructor(\n scope: Exprs.LexicalScope,\n owner: CssParser.DispatchParserHandler,\n parent: CssCascade.CascadeParserHandler,\n validatorSet: CssValidator.ValidatorSet,\n private readonly pageProps: { [key: string]: CssCascade.ElementStyle },\n ) {\n super(scope, owner, null, parent, null, validatorSet, false);\n }\n\n /**\n * @override\n */\n startPageRule(): void {\n this.startSelectorRule();\n }\n\n /**\n * @override\n */\n tagSelector(ns: string | null, name: string | null): void {\n Asserts.assert(name);\n this.currentNamedPageSelector = name;\n if (name) {\n this.chain.push(new CheckPageTypeAction(name));\n this.specificity += 65536;\n }\n }\n\n /**\n * @override\n */\n pseudoclassSelector(name: string, params: (number | string)[]): void {\n name = name.toLowerCase();\n if (params) {\n switch (name) {\n case \"nth\":\n {\n const [a, b] = params as number[];\n this.currentPseudoPageClassSelectors.push(\n `:${name}(${a}n${b < 0 ? b : \"+\" + b})`,\n );\n this.chain.push(new IsNthPageAction(this.scope, a, b));\n this.specificity += 256;\n }\n break;\n default:\n this.reportAndSkip(\n `E_INVALID_PAGE_SELECTOR :${name}(${params.join(\"\")})`,\n );\n break;\n }\n } else {\n this.currentPseudoPageClassSelectors.push(`:${name}`);\n switch (name) {\n case \"first\":\n this.chain.push(new IsFirstPageAction(this.scope));\n this.specificity += 256;\n break;\n case \"left\":\n this.chain.push(new IsLeftPageAction(this.scope));\n this.specificity += 1;\n break;\n case \"right\":\n this.chain.push(new IsRightPageAction(this.scope));\n this.specificity += 1;\n break;\n case \"recto\":\n this.chain.push(new IsRectoPageAction(this.scope));\n this.specificity += 1;\n break;\n case \"verso\":\n this.chain.push(new IsVersoPageAction(this.scope));\n this.specificity += 1;\n break;\n default:\n this.reportAndSkip(`E_INVALID_PAGE_SELECTOR :${name}`);\n break;\n }\n }\n }\n\n /**\n * Save currently processed selector and reset variables.\n */\n private finishSelector() {\n let selectors: string[];\n if (\n !this.currentNamedPageSelector &&\n !this.currentPseudoPageClassSelectors.length\n ) {\n selectors = null;\n } else {\n selectors = [this.currentNamedPageSelector].concat(\n this.currentPseudoPageClassSelectors.sort(),\n );\n }\n this.currentPageSelectors.push({\n selectors,\n specificity: this.specificity,\n });\n this.currentNamedPageSelector = \"\";\n this.currentPseudoPageClassSelectors = [];\n }\n\n /**\n * @override\n */\n nextSelector(): void {\n this.finishSelector();\n super.nextSelector();\n }\n\n /**\n * @override\n */\n startRuleBody(): void {\n this.finishSelector();\n super.startRuleBody();\n }\n\n /**\n * @override\n */\n simpleProperty(name: string, value: Css.Val, important): void {\n // we limit 'bleed' and 'marks' to be effective only when specified without\n // page selectors\n if (\n (name === \"bleed\" || name === \"marks\") &&\n !this.currentPageSelectors.some((s) => s.selectors === null)\n ) {\n return;\n }\n super.simpleProperty(name, value, important);\n const cascVal = CssCascade.getProp(this.elementStyle, name);\n const pageProps = this.pageProps;\n if (name === \"bleed\" || name === \"marks\") {\n if (!pageProps[\"\"]) {\n pageProps[\"\"] = {} as CssCascade.ElementStyle;\n }\n\n // we can simply overwrite without considering specificity\n // since 'bleed' and 'marks' always come from a page rule without page\n // selectors.\n Object.keys(pageProps).forEach((selector) => {\n CssCascade.setProp(pageProps[selector], name, cascVal);\n });\n } else if (name === \"size\") {\n const noPageSelectorProps = pageProps[\"\"];\n this.currentPageSelectors.forEach((s) => {\n // update specificity to reflect the specificity of the selector\n let result = new CssCascade.CascadeValue(\n cascVal.value,\n cascVal.priority + s.specificity,\n );\n const selector = s.selectors ? s.selectors.join(\"\") : \"\";\n let props = pageProps[selector];\n if (!props) {\n // since no properties for this selector have been stored before,\n // we can simply set the 'size', 'bleed' and 'marks' properties.\n props = pageProps[selector] = {} as CssCascade.ElementStyle;\n CssCascade.setProp(props, name, result);\n if (noPageSelectorProps) {\n [\"bleed\", \"marks\"].forEach((n) => {\n if (noPageSelectorProps[n]) {\n CssCascade.setProp(props, n, noPageSelectorProps[n]);\n }\n });\n }\n } else {\n // consider specificity when setting 'size' property.\n // we don't have to set 'bleed' and 'marks' since they should have\n // been already updated.\n const prevCascVal = CssCascade.getProp(props, name);\n result = prevCascVal\n ? CssCascade.cascadeValues(null, result, prevCascVal)\n : result;\n CssCascade.setProp(props, name, result);\n }\n });\n }\n }\n\n /**\n * @override\n */\n insertNonPrimary(action: CssCascade.CascadeAction): void {\n // We represent page rules without selectors by *, though it is illegal in\n // CSS\n this.cascade.insertInTable(this.cascade.pagetypes, \"*\", action);\n }\n\n /**\n * @override\n */\n makeApplyRuleAction(specificity: number): CssCascade.ApplyRuleAction {\n return new ApplyPageRuleAction(this.elementStyle, specificity);\n }\n\n /**\n * @override\n */\n startPageMarginBoxRule(name: string): void {\n const marginBoxMap = CssCascade.getMutableStyleMap(\n this.elementStyle,\n marginBoxesKey,\n );\n let boxStyle = marginBoxMap[name];\n if (!boxStyle) {\n boxStyle = {} as CssCascade.ElementStyle;\n marginBoxMap[name] = boxStyle;\n }\n const handler = new PageMarginBoxParserHandler(\n this.scope,\n this.owner,\n this.validatorSet,\n boxStyle,\n );\n this.owner.pushHandler(handler);\n }\n}\n\n/**\n * Parser handler for a page-margin box rule.\n */\nexport class PageMarginBoxParserHandler\n extends CssParser.SlaveParserHandler\n implements CssValidator.PropertyReceiver {\n constructor(\n scope: Exprs.LexicalScope,\n owner: CssParser.DispatchParserHandler,\n public readonly validatorSet: CssValidator.ValidatorSet,\n public readonly boxStyle: CssCascade.ElementStyle,\n ) {\n super(scope, owner, false);\n }\n\n /**\n * @override\n */\n property(name: string, value: Css.Val, important: boolean): void {\n this.validatorSet.validatePropertyAndHandleShorthand(\n name,\n value,\n important,\n this,\n );\n }\n\n /**\n * @override\n */\n invalidPropertyValue(name: string, value: Css.Val): void {\n this.report(`E_INVALID_PROPERTY_VALUE ${name}: ${value.toString()}`);\n }\n\n /**\n * @override\n */\n unknownProperty(name: string, value: Css.Val): void {\n this.report(`E_INVALID_PROPERTY ${name}: ${value.toString()}`);\n }\n\n /**\n * @override\n */\n simpleProperty(name: string, value: Css.Val, important): void {\n const specificity = important\n ? this.getImportantSpecificity()\n : this.getBaseSpecificity();\n const cascval = new CssCascade.CascadeValue(value, specificity);\n CssCascade.setProp(this.boxStyle, name, cascval);\n }\n}\n","/**\n * Copyright 2015 Trim-marks Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Urls - URL Utilities\n */\n\n/**\n * transform all urls in attributeValue using documentURLTransformer.\n *\n * @returns transformed attributeValue\n */\n\nexport const transformURIs = (\n attributeValue,\n baseUrl,\n documentURLTransformer,\n) =>\n attributeValue\n .replace(\n /[uU][rR][lL]\\(\\s*\"((\\\\([^0-9a-fA-F]+|[0-9a-fA-F]+\\s*)|[^\"\\r\\n])+)\"/gm,\n (match, m1) =>\n `url(\"${documentURLTransformer.transformURL(m1, baseUrl)}\"`,\n )\n .replace(\n /[uU][rR][lL]\\(\\s*'((\\\\([^0-9a-fA-F]+|[0-9a-fA-F]+\\s*)|[^'\\r\\n])+)'/gm,\n (match, m1) =>\n `url('${documentURLTransformer.transformURL(m1, baseUrl)}'`,\n )\n .replace(\n /[uU][rR][lL]\\(\\s*((\\\\([^0-9a-fA-F]+|[0-9a-fA-F]+\\s*)|[^\"'\\r\\n\\)\\s])+)/gm,\n (match, m1) => `url(${documentURLTransformer.transformURL(m1, baseUrl)}`,\n );\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2015 Trim-marks Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Vgen - View tree generator.\n */\nimport * as Asserts from \"./asserts\";\nimport * as Base from \"./base\";\nimport * as Break from \"./break\";\nimport * as Css from \"./css\";\nimport * as CssCascade from \"./css-cascade\";\nimport * as CssProp from \"./css-prop\";\nimport * as CssStyler from \"./css-styler\";\nimport * as Diff from \"./diff\";\nimport * as Display from \"./display\";\nimport * as Exprs from \"./exprs\";\nimport * as Font from \"./font\";\nimport * as Matchers from \"./matchers\";\nimport * as PageFloats from \"./page-floats\";\nimport * as Plugin from \"./plugin\";\nimport * as PseudoElement from \"./pseudo-element\";\nimport * as RepetitiveElement from \"./repetitive-element\";\nimport * as Task from \"./task\";\nimport * as TaskUtil from \"./task-util\";\nimport * as Urls from \"./urls\";\nimport * as Vtree from \"./vtree\";\nimport * as Layout from \"./layout\";\nimport { XmlDoc } from \"./types\";\n\nconst namespacePrefixMap = {};\n\nexport const frontEdgeBlackListHor: { [key: string]: string } = {\n \"text-indent\": \"0px\",\n \"margin-top\": \"0px\",\n \"padding-top\": \"0px\",\n \"border-top-width\": \"0px\",\n \"border-top-style\": \"none\",\n \"border-top-color\": \"transparent\",\n \"border-top-left-radius\": \"0px\",\n \"border-top-right-radius\": \"0px\",\n};\n\nexport const frontEdgeBlackListVert: { [key: string]: string } = {\n \"text-indent\": \"0px\",\n \"margin-right\": \"0px\",\n \"padding-right\": \"0px\",\n \"border-right-width\": \"0px\",\n \"border-right-style\": \"none\",\n \"border-right-color\": \"transparent\",\n \"border-top-right-radius\": \"0px\",\n \"border-bottom-right-radius\": \"0px\",\n};\n\nexport const frontEdgeUnforcedBreakBlackListHor: { [key: string]: string } = {\n \"margin-top\": \"0px\",\n};\n\nexport const frontEdgeUnforcedBreakBlackListVert: { [key: string]: string } = {\n \"margin-right\": \"0px\",\n};\n\nexport type CustomRenderer = (\n p1: Element,\n p2: Element,\n p3: { [key: string]: Css.Val },\n) => Task.Result<Element>;\n\nexport interface CustomRendererFactory {\n makeCustomRenderer(xmldoc: XmlDoc.XMLDocHolder): CustomRenderer;\n}\n\n/**\n * Creates an epubReadingSystem object in the iframe.contentWindow.navigator\n * when load event fires.\n */\nexport function initIFrame(iframe: HTMLIFrameElement): void {\n iframe.addEventListener(\n \"load\",\n () => {\n iframe.contentWindow.navigator[\"epubReadingSystem\"] = {\n name: \"adapt\",\n version: \"0.1\",\n layoutStyle: \"paginated\",\n hasFeature: function (name, version) {\n switch (name) {\n case \"mouse-events\":\n return true;\n }\n return false;\n },\n };\n },\n false,\n );\n}\n\nexport interface StylerProducer {\n getStylerForDoc(xmldoc: XmlDoc.XMLDocHolder): CssStyler.AbstractStyler;\n}\n\nexport class ViewFactory\n extends Base.SimpleEventTarget\n implements Vtree.LayoutContext {\n private static SVG_URL_ATTRIBUTES: string[] = [\n \"color-profile\",\n \"clip-path\",\n \"cursor\",\n \"filter\",\n \"marker\",\n \"marker-start\",\n \"marker-end\",\n \"marker-mid\",\n \"fill\",\n \"stroke\",\n \"mask\",\n ];\n document: Document;\n exprContentListener: Vtree.ExprContentListener;\n\n // provided by layout\n nodeContext: Vtree.NodeContext | null = null;\n viewRoot: Element | null = null;\n isFootnote: boolean = false;\n sourceNode: Node | null = null;\n offsetInNode: number = 0;\n\n // computed\n // TODO: only set it on NodeContext\n viewNode: Node | null = null;\n\n constructor(\n public readonly flowName: string,\n public readonly context: Exprs.Context,\n public readonly viewport: Viewport,\n public readonly styler: CssStyler.Styler,\n public readonly regionIds: string[],\n public readonly xmldoc: XmlDoc.XMLDocHolder,\n public readonly docFaces: Font.DocumentFaces,\n public readonly footnoteStyle: CssCascade.ElementStyle,\n public readonly stylerProducer: StylerProducer,\n public readonly page: Vtree.Page,\n public readonly customRenderer: CustomRenderer,\n public readonly fallbackMap: { [key: string]: string },\n public readonly documentURLTransformer: Base.DocumentURLTransformer,\n ) {\n super();\n this.document = viewport.document;\n this.exprContentListener = styler.counterListener.getExprContentListener();\n }\n\n /**\n * @override\n */\n clone(): Vtree.LayoutContext {\n return new ViewFactory(\n this.flowName,\n this.context,\n this.viewport,\n this.styler,\n this.regionIds,\n this.xmldoc,\n this.docFaces,\n this.footnoteStyle,\n this.stylerProducer,\n this.page,\n this.customRenderer,\n this.fallbackMap,\n this.documentURLTransformer,\n );\n }\n\n createPseudoelementShadow(\n element: Element,\n isRoot: boolean,\n cascStyle: CssCascade.ElementStyle,\n computedStyle: { [key: string]: Css.Val },\n styler: CssStyler.AbstractStyler,\n context: Exprs.Context,\n parentShadow: Vtree.ShadowContext,\n subShadow: Vtree.ShadowContext,\n ): Vtree.ShadowContext {\n const pseudoMap = this.getPseudoMap(\n cascStyle,\n this.regionIds,\n this.isFootnote,\n this.nodeContext,\n context,\n );\n if (!pseudoMap) {\n return subShadow;\n }\n const addedNames = [];\n const root = PseudoElement.document.createElementNS(Base.NS.SHADOW, \"root\");\n let att = root;\n for (const name of PseudoElement.pseudoNames) {\n let elem: Element;\n if (name) {\n if (!pseudoMap[name]) {\n continue;\n }\n if (name == \"footnote-marker\" && !(isRoot && this.isFootnote)) {\n continue;\n }\n if (name.match(/^first-/)) {\n const display = computedStyle[\"display\"];\n if (!display || display === Css.ident.inline) {\n continue;\n }\n }\n if (name === \"before\" || name === \"after\") {\n const content = pseudoMap[name][\"content\"];\n if (\n !content ||\n content === Css.ident.normal ||\n content === Css.ident.none\n ) {\n continue;\n }\n }\n addedNames.push(name);\n elem = PseudoElement.document.createElementNS(Base.NS.XHTML, \"span\");\n PseudoElement.setPseudoName(elem, name);\n } else {\n elem = PseudoElement.document.createElementNS(\n Base.NS.SHADOW,\n \"content\",\n );\n }\n att.appendChild(elem);\n if (name.match(/^first-/)) {\n att = elem;\n }\n }\n if (!addedNames.length) {\n return subShadow;\n }\n const shadowStyler = new PseudoElement.PseudoelementStyler(\n element,\n cascStyle,\n styler,\n context,\n this.exprContentListener,\n );\n return new Vtree.ShadowContext(\n element,\n root,\n null,\n parentShadow,\n subShadow,\n Vtree.ShadowType.ROOTLESS,\n shadowStyler,\n );\n }\n\n getPseudoMap(\n cascStyle: CssCascade.ElementStyle,\n regionIds: string[],\n isFootnote: boolean,\n nodeContext: Vtree.NodeContext,\n context: Exprs.Context,\n ) {\n const pseudoMap = CssCascade.getStyleMap(cascStyle, \"_pseudos\");\n if (!pseudoMap) {\n return null;\n }\n const computedPseudoStyleMap = {};\n for (const key in pseudoMap) {\n const computedPseudoStyle = (computedPseudoStyleMap[key] = {});\n CssCascade.mergeStyle(computedPseudoStyle, pseudoMap[key], context);\n CssCascade.mergeViewConditionalStyles(\n computedPseudoStyle,\n context,\n pseudoMap[key],\n );\n CssCascade.forEachStylesInRegion(\n pseudoMap[key],\n regionIds,\n isFootnote,\n (regionId, regionStyle) => {\n CssCascade.mergeStyle(computedPseudoStyle, regionStyle, context);\n CssCascade.forEachViewConditionalStyles(\n regionStyle,\n (viewConditionalStyles) => {\n CssCascade.mergeStyle(\n computedPseudoStyle,\n viewConditionalStyles,\n context,\n );\n },\n );\n },\n );\n }\n return computedPseudoStyleMap;\n }\n\n createRefShadow(\n href: string,\n type: Vtree.ShadowType,\n element: Element,\n parentShadow: Vtree.ShadowContext,\n subShadow: Vtree.ShadowContext,\n ): Task.Result<Vtree.ShadowContext> {\n const frame: Task.Frame<Vtree.ShadowContext> = Task.newFrame(\n \"createRefShadow\",\n );\n this.xmldoc.store.load(href).then((refDocParam) => {\n const refDoc = refDocParam;\n if (refDoc) {\n const refElement = refDoc.getElement(href);\n if (refElement) {\n const refStyler = this.stylerProducer.getStylerForDoc(refDoc);\n subShadow = new Vtree.ShadowContext(\n element,\n refElement,\n refDoc,\n parentShadow,\n subShadow,\n type,\n refStyler,\n );\n }\n }\n frame.finish(subShadow);\n });\n return frame.result();\n }\n\n createShadows(\n element: Element,\n isRoot,\n cascStyle: CssCascade.ElementStyle,\n computedStyle: { [key: string]: Css.Val },\n styler: CssStyler.AbstractStyler,\n context: Exprs.Context,\n shadowContext: Vtree.ShadowContext,\n ): Task.Result<Vtree.ShadowContext> {\n const frame: Task.Frame<Vtree.ShadowContext> = Task.newFrame(\n \"createShadows\",\n );\n const shadow: Vtree.ShadowContext = null;\n const templateURLVal = computedStyle[\"template\"];\n let cont: Task.Result<Vtree.ShadowContext>;\n if (templateURLVal instanceof Css.URL) {\n const url = (templateURLVal as Css.URL).url;\n cont = this.createRefShadow(\n url,\n Vtree.ShadowType.ROOTLESS,\n element,\n shadowContext,\n shadow,\n );\n } else {\n cont = Task.newResult(shadow);\n }\n cont.then((shadow) => {\n let cont1: Task.Result<Vtree.ShadowContext> = null;\n if (element.namespaceURI == Base.NS.SHADOW) {\n if (element.localName == \"include\") {\n let href = element.getAttribute(\"href\");\n let xmldoc: XmlDoc.XMLDocHolder = null;\n if (href) {\n xmldoc = shadowContext ? shadowContext.xmldoc : this.xmldoc;\n } else if (shadowContext) {\n if (shadowContext.owner.namespaceURI == Base.NS.XHTML) {\n href = shadowContext.owner.getAttribute(\"href\");\n } else {\n href = shadowContext.owner.getAttributeNS(Base.NS.XLINK, \"href\");\n }\n xmldoc = shadowContext.parentShadow\n ? shadowContext.parentShadow.xmldoc\n : this.xmldoc;\n }\n if (href) {\n href = Base.resolveURL(href, xmldoc.url);\n cont1 = this.createRefShadow(\n href,\n Vtree.ShadowType.ROOTED,\n element,\n shadowContext,\n shadow,\n );\n }\n }\n }\n if (cont1 == null) {\n cont1 = Task.newResult(shadow);\n }\n let cont2: Task.Result<Vtree.ShadowContext> = null;\n cont1.then((shadow) => {\n if (computedStyle[\"display\"] === Css.ident.table_cell) {\n const url = Base.resolveURL(\n \"user-agent.xml#table-cell\",\n Base.resourceBaseURL,\n );\n cont2 = this.createRefShadow(\n url,\n Vtree.ShadowType.ROOTLESS,\n element,\n shadowContext,\n shadow,\n );\n } else {\n cont2 = Task.newResult(shadow);\n }\n });\n cont2.then((shadow) => {\n shadow = this.createPseudoelementShadow(\n element,\n isRoot,\n cascStyle,\n computedStyle,\n styler,\n context,\n shadowContext,\n shadow,\n );\n frame.finish(shadow);\n });\n });\n return frame.result();\n }\n\n /**\n * @override\n */\n setViewRoot(viewRoot: Element, isFootnote: boolean) {\n this.viewRoot = viewRoot;\n this.isFootnote = isFootnote;\n }\n\n /**\n * @return vertical\n */\n computeStyle(\n vertical: boolean,\n rtl: boolean,\n style: CssCascade.ElementStyle,\n computedStyle: { [key: string]: Css.Val },\n ): boolean {\n const context = this.context;\n const cascMap = CssCascade.flattenCascadedStyle(\n style,\n context,\n this.regionIds,\n this.isFootnote,\n this.nodeContext,\n );\n vertical = CssCascade.isVertical(cascMap, context, vertical);\n rtl = CssCascade.isRtl(cascMap, context, rtl);\n CssCascade.convertToPhysical(\n cascMap,\n computedStyle,\n vertical,\n rtl,\n (name, cascVal) => {\n let value = cascVal.evaluate(context, name);\n if (name == \"font-family\") {\n value = this.docFaces.filterFontFamily(value);\n }\n return value;\n },\n );\n\n // Compute values of display, position and float\n const position = computedStyle[\"position\"] as Css.Ident;\n const float = computedStyle[\"float\"] as Css.Ident;\n const displayValues = Display.getComputedDislayValue(\n (computedStyle[\"display\"] as Css.Ident) || Css.ident.inline,\n position,\n float,\n this.sourceNode === this.xmldoc.root,\n );\n [\"display\", \"position\", \"float\"].forEach((name) => {\n if (displayValues[name]) {\n computedStyle[name] = displayValues[name];\n }\n });\n return vertical;\n }\n\n private inheritFromSourceParent(\n elementStyle: CssCascade.ElementStyle,\n ): { lang: string | null; elementStyle: CssCascade.ElementStyle } {\n let node = this.nodeContext.sourceNode;\n const styles = [];\n let lang: string | null = null;\n\n // TODO: this is hacky. We need to recover the path through the shadow\n // trees, but we do not have the full shadow tree structure at this point.\n // This code handles coming out of the shadow trees, but does not go back in\n // (through shadow:content element).\n let shadowContext = this.nodeContext.shadowContext;\n let steps = -1;\n while (node && node.nodeType == 1) {\n const shadowRoot = shadowContext && shadowContext.root == node;\n if (!shadowRoot || shadowContext.type == Vtree.ShadowType.ROOTLESS) {\n const styler = shadowContext\n ? (shadowContext.styler as CssStyler.AbstractStyler)\n : this.styler;\n const nodeStyle = styler.getStyle(node as Element, false);\n styles.push(nodeStyle);\n lang = lang || Base.getLangAttribute(node as Element);\n }\n if (shadowRoot) {\n node = shadowContext.owner;\n shadowContext = shadowContext.parentShadow;\n } else {\n node = node.parentNode;\n steps++;\n }\n }\n const isRoot = steps === 0;\n const fontSize = this.context.queryUnitSize(\"em\", isRoot);\n const props = {\n \"font-size\": new CssCascade.CascadeValue(\n new Css.Numeric(fontSize, \"px\"),\n 0,\n ),\n } as CssCascade.ElementStyle;\n const inheritanceVisitor = new CssCascade.InheritanceVisitor(\n props,\n this.context,\n );\n for (let i = styles.length - 1; i >= 0; --i) {\n const style = styles[i];\n const propList = [];\n for (const propName in style) {\n if (CssCascade.isInherited(propName)) {\n propList.push(propName);\n }\n }\n propList.sort(Css.processingOrderFn);\n for (const name of propList) {\n inheritanceVisitor.setPropName(name);\n const value = CssCascade.getProp(style, name);\n if (value.value !== Css.ident.inherit) {\n props[name] = value.filterValue(inheritanceVisitor);\n }\n }\n }\n for (const sname in elementStyle) {\n if (!CssCascade.isInherited(sname)) {\n props[sname] = elementStyle[sname];\n }\n }\n return { lang, elementStyle: props };\n }\n\n resolveURL(url: string): string {\n url = Base.resolveURL(url, this.xmldoc.url);\n return this.fallbackMap[url] || url;\n }\n\n inheritLangAttribute() {\n this.nodeContext.lang =\n Base.getLangAttribute(this.nodeContext.sourceNode as Element) ||\n (this.nodeContext.parent && this.nodeContext.parent.lang) ||\n this.nodeContext.lang;\n }\n\n transferPolyfilledInheritedProps(computedStyle: { [key: string]: Css.Val }) {\n const polyfilledInheritedProps = CssCascade.getPolyfilledInheritedProps().filter(\n (name) => computedStyle[name],\n );\n if (polyfilledInheritedProps.length) {\n let props = this.nodeContext.inheritedProps;\n if (this.nodeContext.parent) {\n props = this.nodeContext.inheritedProps = {};\n for (const n in this.nodeContext.parent.inheritedProps) {\n props[n] = this.nodeContext.parent.inheritedProps[n];\n }\n }\n polyfilledInheritedProps.forEach((name) => {\n const value = computedStyle[name];\n if (value) {\n if (value instanceof Css.Int) {\n props[name] = (value as Css.Int).num;\n } else if (value instanceof Css.Ident) {\n props[name] = (value as Css.Ident).name;\n } else if (value instanceof Css.Numeric) {\n const numericVal = value as Css.Numeric;\n switch (numericVal.unit) {\n case \"dpi\":\n case \"dpcm\":\n case \"dppx\":\n props[name] =\n numericVal.num * Exprs.defaultUnitSizes[numericVal.unit];\n break;\n }\n } else {\n props[name] = value;\n }\n delete computedStyle[name];\n }\n });\n }\n }\n\n resolveFormattingContext(\n nodeContext: Vtree.NodeContext,\n firstTime: boolean,\n display: Css.Ident,\n position: Css.Ident,\n float: Css.Ident,\n isRoot: boolean,\n ) {\n const hooks: Plugin.ResolveFormattingContextHook[] = Plugin.getHooksForName(\n Plugin.HOOKS.RESOLVE_FORMATTING_CONTEXT,\n );\n for (let i = 0; i < hooks.length; i++) {\n const formattingContext = hooks[i](\n nodeContext,\n firstTime,\n display,\n position,\n float,\n isRoot,\n );\n if (formattingContext) {\n nodeContext.formattingContext = formattingContext;\n return;\n }\n }\n }\n\n /**\n * @return holding true if children should be processed\n */\n private createElementView(\n firstTime: boolean,\n atUnforcedBreak: boolean,\n ): Task.Result<boolean> {\n let needToProcessChildren = true;\n const frame: Task.Frame<boolean> = Task.newFrame(\"createElementView\");\n\n // Figure out element's styles\n let element = this.sourceNode as Element;\n const styler = this.nodeContext.shadowContext\n ? (this.nodeContext.shadowContext.styler as CssStyler.AbstractStyler)\n : this.styler;\n let elementStyle = styler.getStyle(element, false);\n if (!this.nodeContext.shadowContext) {\n const offset = this.xmldoc.getElementOffset(element);\n Matchers.NthFragmentMatcher.registerFragmentIndex(\n offset,\n this.nodeContext.fragmentIndex,\n 0,\n );\n }\n const computedStyle = {};\n if (!this.nodeContext.parent) {\n const inheritedValues = this.inheritFromSourceParent(elementStyle);\n elementStyle = inheritedValues.elementStyle;\n this.nodeContext.lang = inheritedValues.lang;\n }\n const floatReference =\n elementStyle[\"float-reference\"] &&\n PageFloats.floatReferenceOf(\n elementStyle[\"float-reference\"].value.toString(),\n );\n if (\n this.nodeContext.parent &&\n floatReference &&\n PageFloats.isPageFloat(floatReference)\n ) {\n // Since a page float will be detached from a view node of its parent,\n // inherited properties need to be inherited from its source parent.\n const inheritedValues = this.inheritFromSourceParent(elementStyle);\n elementStyle = inheritedValues.elementStyle;\n this.nodeContext.lang = inheritedValues.lang;\n }\n this.nodeContext.vertical = this.computeStyle(\n this.nodeContext.vertical,\n this.nodeContext.direction === \"rtl\",\n elementStyle,\n computedStyle,\n );\n styler.processContent(element, computedStyle);\n this.transferPolyfilledInheritedProps(computedStyle);\n this.inheritLangAttribute();\n if (computedStyle[\"direction\"]) {\n this.nodeContext.direction = computedStyle[\"direction\"].toString();\n }\n\n // Sort out the properties\n const flow = computedStyle[\"flow-into\"];\n if (flow && flow.toString() != this.flowName) {\n // foreign flow, don't create a view\n frame.finish(false);\n return frame.result();\n }\n let display = computedStyle[\"display\"];\n if (display === Css.ident.none) {\n // no content\n frame.finish(false);\n return frame.result();\n }\n const isRoot = this.nodeContext.parent == null;\n this.nodeContext.flexContainer = display === Css.ident.flex;\n this.createShadows(\n element,\n isRoot,\n elementStyle,\n computedStyle,\n styler,\n this.context,\n this.nodeContext.shadowContext,\n ).then((shadowParam) => {\n this.nodeContext.nodeShadow = shadowParam;\n const position = computedStyle[\"position\"];\n let floatSide = computedStyle[\"float\"];\n let clearSide = computedStyle[\"clear\"];\n const writingMode = this.nodeContext.vertical\n ? Css.ident.vertical_rl\n : Css.ident.horizontal_tb;\n const parentWritingMode = this.nodeContext.parent\n ? this.nodeContext.parent.vertical\n ? Css.ident.vertical_rl\n : Css.ident.horizontal_tb\n : writingMode;\n const isFlowRoot = Display.isFlowRoot(element);\n this.nodeContext.establishesBFC = Display.establishesBFC(\n display,\n position,\n floatSide,\n computedStyle[\"overflow\"],\n writingMode,\n parentWritingMode,\n isFlowRoot,\n );\n this.nodeContext.containingBlockForAbsolute = Display.establishesCBForAbsolute(\n position,\n );\n if (\n this.nodeContext.isInsideBFC() &&\n floatSide !== Css.ident.footnote &&\n !(floatReference && PageFloats.isPageFloat(floatReference))\n ) {\n // When the element is already inside a block formatting context\n // (except one from the root), float and clear can be controlled by\n // the browser and we don't need to care.\n floatSide = null;\n clearSide = null;\n }\n let floating =\n floatSide === Css.ident.left ||\n floatSide === Css.ident.right ||\n floatSide === Css.ident.top ||\n floatSide === Css.ident.bottom ||\n floatSide === Css.ident.inline_start ||\n floatSide === Css.ident.inline_end ||\n floatSide === Css.ident.block_start ||\n floatSide === Css.ident.block_end ||\n floatSide === Css.ident.snap_block ||\n floatSide === Css.ident.footnote;\n if (floatSide) {\n // Don't want to set it in view DOM CSS.\n delete computedStyle[\"float\"];\n if (floatSide === Css.ident.footnote) {\n if (this.isFootnote) {\n // No footnotes inside footnotes. this is most likely the root\n // of the footnote body being rendered in footnote area. Treat\n // as block.\n floating = false;\n computedStyle[\"display\"] = Css.ident.block;\n } else {\n computedStyle[\"display\"] = Css.ident.inline;\n }\n }\n }\n if (clearSide) {\n if (clearSide === Css.ident.inherit) {\n if (this.nodeContext.parent && this.nodeContext.parent.clearSide) {\n clearSide = Css.getName(this.nodeContext.parent.clearSide);\n }\n }\n if (\n clearSide === Css.ident.left ||\n clearSide === Css.ident.right ||\n clearSide === Css.ident.top ||\n clearSide === Css.ident.bottom ||\n clearSide === Css.ident.both ||\n clearSide === Css.ident.all ||\n clearSide === Css.ident.same\n ) {\n delete computedStyle[\"clear\"];\n if (\n computedStyle[\"display\"] &&\n computedStyle[\"display\"] != Css.ident.inline\n ) {\n this.nodeContext.clearSide = clearSide.toString();\n }\n }\n }\n const listItem =\n display === Css.ident.list_item && computedStyle[\"ua-list-item-count\"];\n if (\n floating ||\n (computedStyle[\"break-inside\"] &&\n computedStyle[\"break-inside\"] !== Css.ident.auto)\n ) {\n this.nodeContext.breakPenalty++;\n }\n if (\n display &&\n display !== Css.ident.inline &&\n Display.isInlineLevel(display)\n ) {\n // Don't break inside ruby, inline-block, etc.\n this.nodeContext.breakPenalty++;\n }\n this.nodeContext.inline =\n (!floating && !display) ||\n Display.isInlineLevel(display) ||\n Display.isRubyInternalDisplay(display);\n this.nodeContext.display = display ? display.toString() : \"inline\";\n this.nodeContext.floatSide = floating ? floatSide.toString() : null;\n this.nodeContext.floatReference =\n floatReference || PageFloats.FloatReference.INLINE;\n this.nodeContext.floatMinWrapBlock =\n computedStyle[\"float-min-wrap-block\"] || null;\n this.nodeContext.columnSpan = computedStyle[\"column-span\"];\n if (!this.nodeContext.inline) {\n const breakAfter = computedStyle[\"break-after\"];\n if (breakAfter) {\n this.nodeContext.breakAfter = breakAfter.toString();\n }\n const breakBefore = computedStyle[\"break-before\"];\n if (breakBefore) {\n this.nodeContext.breakBefore = breakBefore.toString();\n }\n }\n this.nodeContext.verticalAlign =\n (computedStyle[\"vertical-align\"] &&\n computedStyle[\"vertical-align\"].toString()) ||\n \"baseline\";\n this.nodeContext.captionSide =\n (computedStyle[\"caption-side\"] &&\n computedStyle[\"caption-side\"].toString()) ||\n \"top\";\n const borderCollapse = computedStyle[\"border-collapse\"];\n if (!borderCollapse || borderCollapse === Css.getName(\"separate\")) {\n const borderSpacing = computedStyle[\"border-spacing\"];\n let inlineBorderSpacing;\n let blockBorderSpacing;\n if (borderSpacing) {\n if (borderSpacing.isSpaceList()) {\n inlineBorderSpacing = borderSpacing.values[0];\n blockBorderSpacing = borderSpacing.values[1];\n } else {\n inlineBorderSpacing = blockBorderSpacing = borderSpacing;\n }\n if (inlineBorderSpacing.isNumeric()) {\n this.nodeContext.inlineBorderSpacing = Css.toNumber(\n inlineBorderSpacing,\n this.context,\n );\n }\n if (blockBorderSpacing.isNumeric()) {\n this.nodeContext.blockBorderSpacing = Css.toNumber(\n blockBorderSpacing,\n this.context,\n );\n }\n }\n }\n this.nodeContext.footnotePolicy = computedStyle[\"footnote-policy\"];\n const firstPseudo = computedStyle[\"x-first-pseudo\"];\n if (firstPseudo) {\n const outerPseudo = this.nodeContext.parent\n ? this.nodeContext.parent.firstPseudo\n : null;\n this.nodeContext.firstPseudo = new Vtree.FirstPseudo(\n outerPseudo,\n /** Css.Int */\n firstPseudo.num,\n );\n }\n if (!this.nodeContext.inline) {\n this.processAfterIfcontinues(\n element,\n elementStyle,\n styler,\n this.context,\n );\n }\n const whitespace = computedStyle[\"white-space\"];\n if (whitespace) {\n const whitespaceValue = Vtree.whitespaceFromPropertyValue(\n whitespace.toString(),\n );\n if (whitespaceValue !== null) {\n this.nodeContext.whitespace = whitespaceValue;\n }\n }\n const hyphenateCharacter = computedStyle[\"hyphenate-character\"];\n if (hyphenateCharacter && hyphenateCharacter !== Css.ident.auto) {\n this.nodeContext.hyphenateCharacter = hyphenateCharacter.str;\n }\n const wordBreak = computedStyle[\"word-break\"];\n const overflowWrap = computedStyle[\"overflow-wrap\"] || [\"word-wrap\"];\n this.nodeContext.breakWord =\n wordBreak === Css.ident.break_all ||\n overflowWrap === Css.ident.break_word;\n\n // Resolve formatting context\n this.resolveFormattingContext(\n this.nodeContext,\n firstTime,\n display,\n position,\n floatSide,\n isRoot,\n );\n if (\n this.nodeContext.parent &&\n this.nodeContext.parent.formattingContext\n ) {\n firstTime = this.nodeContext.parent.formattingContext.isFirstTime(\n this.nodeContext,\n firstTime,\n );\n }\n if (!this.nodeContext.inline) {\n this.nodeContext.repeatOnBreak = this.processRepeatOnBreak(\n computedStyle,\n );\n this.findAndProcessRepeatingElements(element, styler);\n }\n\n // Create the view element\n let custom = false;\n let inner: Element = null;\n const fetchers = [];\n let ns = element.namespaceURI;\n let tag = element.localName;\n if (ns == Base.NS.XHTML) {\n if (\n tag == \"html\" ||\n tag == \"body\" ||\n tag == \"script\" ||\n tag == \"link\" ||\n tag == \"meta\"\n ) {\n tag = \"div\";\n } else if (tag == \"vide_\") {\n tag = \"video\";\n } else if (tag == \"audi_\") {\n tag = \"audio\";\n } else if (tag == \"object\") {\n custom = !!this.customRenderer;\n }\n if (element.getAttribute(PseudoElement.PSEUDO_ATTR)) {\n if (\n elementStyle[\"content\"] &&\n elementStyle[\"content\"].value &&\n elementStyle[\"content\"].value.url\n ) {\n tag = \"img\";\n }\n }\n } else if (ns == Base.NS.epub) {\n tag = \"span\";\n ns = Base.NS.XHTML;\n } else if (ns == Base.NS.NCX) {\n ns = Base.NS.XHTML;\n if (tag == \"ncx\" || tag == \"navPoint\") {\n tag = \"div\";\n } else if (tag == \"navLabel\") {\n // Cheat here. Translate source to HTML, so it will plug\n // in into the rest of the pipeline.\n tag = \"span\";\n const navParent = element.parentNode;\n if (navParent) {\n // find the content element\n let href: string | null = null;\n for (let c: Node = navParent.firstChild; c; c = c.nextSibling) {\n if (c.nodeType != 1) {\n continue;\n }\n const childElement = c as Element;\n if (\n childElement.namespaceURI == Base.NS.NCX &&\n childElement.localName == \"content\"\n ) {\n href = childElement.getAttribute(\"src\");\n break;\n }\n }\n if (href) {\n tag = \"a\";\n element = element.ownerDocument.createElementNS(ns, \"a\");\n element.setAttribute(\"href\", href);\n }\n }\n } else {\n tag = \"span\";\n }\n } else if (ns == Base.NS.SHADOW) {\n ns = Base.NS.XHTML;\n tag = this.nodeContext.inline ? \"span\" : \"div\";\n } else {\n custom = !!this.customRenderer;\n }\n if (listItem) {\n if (firstTime) {\n tag = \"li\";\n } else {\n tag = \"div\";\n display = Css.ident.block;\n computedStyle[\"display\"] = display;\n }\n } else if (tag == \"body\" || tag == \"li\") {\n tag = \"div\";\n } else if (tag == \"q\") {\n tag = \"span\";\n } else if (tag == \"a\") {\n const hp = computedStyle[\"hyperlink-processing\"];\n if (hp && hp.toString() != \"normal\") {\n tag = \"span\";\n }\n }\n if (computedStyle[\"behavior\"]) {\n const behavior = computedStyle[\"behavior\"].toString();\n if (behavior != \"none\" && this.customRenderer) {\n custom = true;\n }\n }\n if (\n (element as HTMLElement).dataset &&\n element.getAttribute(\"data-math-typeset\") === \"true\"\n ) {\n custom = true;\n }\n let elemResult: Task.Result<Element>;\n if (custom) {\n const parentNode = this.nodeContext.parent\n ? this.nodeContext.parent.viewNode\n : null;\n elemResult = this.customRenderer(\n element,\n parentNode as Element,\n computedStyle,\n );\n } else {\n elemResult = Task.newResult(null);\n }\n elemResult.then((result) => {\n if (result) {\n if (custom) {\n needToProcessChildren =\n result.getAttribute(\"data-adapt-process-children\") == \"true\";\n }\n } else {\n result = this.createElement(ns, tag);\n }\n if (tag == \"a\") {\n result.addEventListener(\"click\", this.page.hrefHandler, false);\n }\n if (inner) {\n this.applyPseudoelementStyle(this.nodeContext, \"inner\", inner);\n result.appendChild(inner);\n }\n if (\n result.localName == \"iframe\" &&\n result.namespaceURI == Base.NS.XHTML\n ) {\n initIFrame(result as HTMLIFrameElement);\n }\n const imageResolution = this.nodeContext.inheritedProps[\n \"image-resolution\"\n ] as number | undefined;\n const images: {\n image: HTMLElement;\n element: HTMLElement;\n fetcher: TaskUtil.Fetcher<string>;\n }[] = [];\n const cssWidth = computedStyle[\"width\"];\n const cssHeight = computedStyle[\"height\"];\n const attrWidth = element.getAttribute(\"width\");\n const attrHeight = element.getAttribute(\"height\");\n const hasAutoWidth =\n cssWidth === Css.ident.auto || (!cssWidth && !attrWidth);\n const hasAutoHeight =\n cssHeight === Css.ident.auto || (!cssHeight && !attrHeight);\n const attributes = element.attributes;\n const attributeCount = attributes.length;\n let delayedSrc: string | null = null;\n for (let i = 0; i < attributeCount; i++) {\n const attribute = attributes[i];\n const attributeNS = attribute.namespaceURI;\n let attributeName = attribute.localName;\n let attributeValue = attribute.nodeValue;\n if (!attributeNS) {\n if (attributeName.match(/^on/)) {\n continue; // don't propagate JavaScript code\n }\n if (attributeName == \"style\") {\n continue; // we do styling ourselves\n }\n if (attributeName == \"id\" || attributeName == \"name\") {\n // Propagate transformed ids and collect them on the page\n // (only first time).\n if (firstTime) {\n attributeValue = this.documentURLTransformer.transformFragment(\n attributeValue,\n this.xmldoc.url,\n );\n result.setAttribute(attributeName, attributeValue);\n this.page.registerElementWithId(result, attributeValue);\n continue;\n }\n }\n\n // TODO: understand the element we are working with.\n if (\n attributeName == \"src\" ||\n attributeName == \"href\" ||\n attributeName == \"poster\"\n ) {\n attributeValue = this.resolveURL(attributeValue);\n if (attributeName === \"href\") {\n attributeValue = this.documentURLTransformer.transformURL(\n attributeValue,\n this.xmldoc.url,\n );\n }\n } else if (attributeName == \"srcset\") {\n attributeValue = attributeValue\n .split(\",\")\n .map((value) => this.resolveURL(value.trim()))\n .join(\",\");\n }\n if (\n attributeName === \"poster\" &&\n tag === \"video\" &&\n ns === Base.NS.XHTML &&\n hasAutoWidth &&\n hasAutoHeight\n ) {\n const image = new Image();\n const fetcher = TaskUtil.loadElement(image, attributeValue);\n fetchers.push(fetcher);\n images.push({\n image,\n element: result as HTMLElement,\n fetcher,\n });\n }\n } else if (attributeNS == \"http://www.w3.org/2000/xmlns/\") {\n continue; // namespace declaration (in Firefox)\n } else if (attributeNS == Base.NS.XLINK) {\n if (attributeName == \"href\") {\n attributeValue = this.resolveURL(attributeValue);\n }\n }\n if (ns == Base.NS.SVG && /^[A-Z\\-]+$/.test(attributeName)) {\n // Workaround for Edge bug\n // See\n // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/5579311/\n attributeName = attributeName.toLowerCase();\n }\n if (this.isSVGUrlAttribute(attributeName)) {\n attributeValue = Urls.transformURIs(\n attributeValue,\n this.xmldoc.url,\n this.documentURLTransformer,\n );\n }\n if (attributeNS) {\n const attributePrefix = namespacePrefixMap[attributeNS];\n if (attributePrefix) {\n attributeName = `${attributePrefix}:${attributeName}`;\n }\n }\n if (\n attributeName == \"src\" &&\n !attributeNS &&\n (tag == \"img\" || tag == \"input\") &&\n ns == Base.NS.XHTML\n ) {\n // HTML img element should start loading only once all\n // attributes are assigned.\n delayedSrc = attributeValue;\n } else if (\n attributeName == \"href\" &&\n tag == \"image\" &&\n ns == Base.NS.SVG &&\n attributeNS == Base.NS.XLINK\n ) {\n this.page.fetchers.push(\n TaskUtil.loadElement(result, attributeValue),\n );\n } else {\n // When the document is not XML document (e.g. non-XML HTML)\n // attributeNS can be null\n if (attributeNS) {\n result.setAttributeNS(attributeNS, attributeName, attributeValue);\n } else {\n result.setAttribute(attributeName, attributeValue);\n }\n }\n }\n if (delayedSrc) {\n const image = tag === \"input\" ? new Image() : result;\n const imageFetcher = TaskUtil.loadElement(image, delayedSrc);\n if (image !== result) {\n (result as HTMLImageElement).src = delayedSrc;\n }\n if (!hasAutoWidth && !hasAutoHeight) {\n // No need to wait for the image, does not affect layout\n this.page.fetchers.push(imageFetcher);\n } else {\n if (\n hasAutoWidth &&\n hasAutoHeight &&\n imageResolution &&\n imageResolution !== 1\n ) {\n images.push({\n image: image as HTMLElement,\n element: result as HTMLElement,\n fetcher: imageFetcher,\n });\n }\n fetchers.push(imageFetcher);\n }\n }\n delete computedStyle[\"content\"];\n const listStyleImage = computedStyle[\"list-style-image\"];\n if (listStyleImage && listStyleImage instanceof Css.URL) {\n const listStyleURL = (listStyleImage as Css.URL).url;\n fetchers.push(TaskUtil.loadElement(new Image(), listStyleURL));\n }\n this.preprocessElementStyle(computedStyle);\n this.applyComputedStyles(result, computedStyle);\n if (!this.nodeContext.inline) {\n let blackList: { [key: string]: string } = null;\n if (!firstTime) {\n if (\n this.nodeContext.inheritedProps[\"box-decoration-break\"] !==\n \"clone\"\n ) {\n blackList = this.nodeContext.vertical\n ? frontEdgeBlackListVert\n : frontEdgeBlackListHor;\n } else {\n // When box-decoration-break: clone, cloned margins are always\n // truncated to zero.\n blackList = this.nodeContext.vertical\n ? frontEdgeUnforcedBreakBlackListVert\n : frontEdgeUnforcedBreakBlackListHor;\n }\n } else if (atUnforcedBreak && !this.isAtForcedBreak()) {\n blackList = this.nodeContext.vertical\n ? frontEdgeUnforcedBreakBlackListVert\n : frontEdgeUnforcedBreakBlackListHor;\n }\n if (blackList) {\n for (const propName in blackList) {\n Base.setCSSProperty(result, propName, blackList[propName]);\n }\n }\n }\n if (listItem) {\n result.setAttribute(\n \"value\",\n computedStyle[\"ua-list-item-count\"].stringValue(),\n );\n }\n this.viewNode = result;\n if (fetchers.length) {\n TaskUtil.waitForFetchers(fetchers).then(() => {\n if (imageResolution > 0) {\n this.modifyElemDimensionWithImageResolution(\n images,\n imageResolution,\n computedStyle,\n this.nodeContext.vertical,\n );\n }\n frame.finish(needToProcessChildren);\n });\n } else {\n frame.timeSlice().then(() => {\n frame.finish(needToProcessChildren);\n });\n }\n });\n });\n return frame.result();\n }\n\n /**\n * Check if the current position is at a forced break\n * (Fix for Issue #690)\n */\n private isAtForcedBreak(): boolean {\n for (\n let nodeContext = this.nodeContext;\n nodeContext && !nodeContext.after;\n nodeContext = nodeContext.parent\n ) {\n if (Break.isForcedBreakValue(nodeContext.breakBefore)) {\n return true;\n }\n if (\n nodeContext.parent &&\n (nodeContext.parent.sourceNode as Element).firstElementChild !==\n nodeContext.sourceNode\n ) {\n break;\n }\n }\n return false;\n }\n\n private processAfterIfcontinues(\n element: Element,\n cascStyle: CssCascade.ElementStyle,\n styler: CssStyler.AbstractStyler,\n context: Exprs.Context,\n ) {\n const pseudoMap = this.getPseudoMap(\n cascStyle,\n this.regionIds,\n this.isFootnote,\n this.nodeContext,\n context,\n );\n if (!pseudoMap) {\n return;\n }\n if (\n pseudoMap[\"after-if-continues\"] &&\n pseudoMap[\"after-if-continues\"][\"content\"]\n ) {\n const shadowStyler = new PseudoElement.PseudoelementStyler(\n element,\n cascStyle,\n styler,\n context,\n this.exprContentListener,\n );\n this.nodeContext.afterIfContinues = new Layout.AfterIfContinues(\n element,\n shadowStyler,\n );\n }\n }\n\n /**\n * @return isSVGUrlAttribute\n */\n isSVGUrlAttribute(attributeName: string): boolean {\n return ViewFactory.SVG_URL_ATTRIBUTES.includes(attributeName.toLowerCase());\n }\n\n modifyElemDimensionWithImageResolution(\n images: {\n image: HTMLElement;\n element: HTMLElement;\n fetcher: TaskUtil.Fetcher<string>;\n }[],\n imageResolution: number,\n computedStyle: { [key: string]: Css.Val },\n isVertical: boolean,\n ) {\n images.forEach((param) => {\n if (param.fetcher.get().get() === \"load\") {\n const img = param.image;\n let scaledWidth = (img as HTMLImageElement).width / imageResolution;\n let scaledHeight = (img as HTMLImageElement).height / imageResolution;\n const elem = param.element;\n if (scaledWidth > 0 && scaledHeight > 0) {\n if (computedStyle[\"box-sizing\"] === Css.ident.border_box) {\n if (computedStyle[\"border-left-style\"] !== Css.ident.none) {\n scaledWidth += Css.toNumber(\n computedStyle[\"border-left-width\"],\n this.context,\n );\n }\n if (computedStyle[\"border-right-style\"] !== Css.ident.none) {\n scaledWidth += Css.toNumber(\n computedStyle[\"border-right-width\"],\n this.context,\n );\n }\n if (computedStyle[\"border-top-style\"] !== Css.ident.none) {\n scaledHeight += Css.toNumber(\n computedStyle[\"border-top-width\"],\n this.context,\n );\n }\n if (computedStyle[\"border-bottom-style\"] !== Css.ident.none) {\n scaledHeight += Css.toNumber(\n computedStyle[\"border-bottom-width\"],\n this.context,\n );\n }\n }\n if (imageResolution > 1) {\n const maxWidth = computedStyle[\"max-width\"] || Css.ident.none;\n const maxHeight = computedStyle[\"max-height\"] || Css.ident.none;\n if (maxWidth === Css.ident.none && maxHeight === Css.ident.none) {\n Base.setCSSProperty(elem, \"max-width\", `${scaledWidth}px`);\n } else if (\n maxWidth !== Css.ident.none &&\n maxHeight === Css.ident.none\n ) {\n Base.setCSSProperty(elem, \"width\", `${scaledWidth}px`);\n } else if (\n maxWidth === Css.ident.none &&\n maxHeight !== Css.ident.none\n ) {\n Base.setCSSProperty(elem, \"height\", `${scaledHeight}px`);\n } else {\n // maxWidth != none && maxHeight != none\n Asserts.assert(maxWidth.isNumeric());\n Asserts.assert(maxHeight.isNumeric());\n const numericMaxWidth = maxWidth as Css.Numeric;\n const numericMaxHeight = maxHeight as Css.Numeric;\n if (numericMaxWidth.unit !== \"%\") {\n Base.setCSSProperty(\n elem,\n \"max-width\",\n `${Math.min(\n scaledWidth,\n Css.toNumber(numericMaxWidth, this.context),\n )}px`,\n );\n } else if (numericMaxHeight.unit !== \"%\") {\n Base.setCSSProperty(\n elem,\n \"max-height\",\n `${Math.min(\n scaledHeight,\n Css.toNumber(numericMaxHeight, this.context),\n )}px`,\n );\n } else {\n if (isVertical) {\n Base.setCSSProperty(elem, \"height\", `${scaledHeight}px`);\n } else {\n Base.setCSSProperty(elem, \"width\", `${scaledWidth}px`);\n }\n }\n }\n } else if (imageResolution < 1) {\n const minWidth = computedStyle[\"min-width\"] || Css.numericZero;\n const minHeight = computedStyle[\"min-height\"] || Css.numericZero;\n Asserts.assert(minWidth.isNumeric());\n Asserts.assert(minWidth.isNumeric());\n const numericMinWidth = minWidth as Css.Numeric;\n const numericMinHeight = minHeight as Css.Numeric;\n if (numericMinWidth.num === 0 && numericMinHeight.num === 0) {\n Base.setCSSProperty(elem, \"min-width\", `${scaledWidth}px`);\n } else if (\n numericMinWidth.num !== 0 &&\n numericMinHeight.num === 0\n ) {\n Base.setCSSProperty(elem, \"width\", `${scaledWidth}px`);\n } else if (\n numericMinWidth.num === 0 &&\n numericMinHeight.num !== 0\n ) {\n Base.setCSSProperty(elem, \"height\", `${scaledHeight}px`);\n } else {\n // minWidth != 0 && minHeight != 0\n if (numericMinWidth.unit !== \"%\") {\n Base.setCSSProperty(\n elem,\n \"min-width\",\n `${Math.max(\n scaledWidth,\n Css.toNumber(numericMinWidth, this.context),\n )}px`,\n );\n } else if (numericMinHeight.unit !== \"%\") {\n Base.setCSSProperty(\n elem,\n \"min-height\",\n `${Math.max(\n scaledHeight,\n Css.toNumber(numericMinHeight, this.context),\n )}px`,\n );\n } else {\n if (isVertical) {\n Base.setCSSProperty(elem, \"height\", `${scaledHeight}px`);\n } else {\n Base.setCSSProperty(elem, \"width\", `${scaledWidth}px`);\n }\n }\n }\n }\n }\n }\n });\n }\n\n private preprocessElementStyle(computedStyle: { [key: string]: Css.Val }) {\n const hooks: Plugin.PreProcessElementStyleHook[] = Plugin.getHooksForName(\n Plugin.HOOKS.PREPROCESS_ELEMENT_STYLE,\n );\n hooks.forEach((hook) => {\n hook(this.nodeContext, computedStyle);\n });\n }\n\n private findAndProcessRepeatingElements(\n element: Element,\n styler: CssStyler.AbstractStyler,\n ) {\n for (\n let child: Node = element.firstChild;\n child;\n child = child.nextSibling\n ) {\n if (child.nodeType !== 1) {\n continue;\n }\n const computedStyle = {};\n const elementStyle = styler.getStyle(child as Element, false);\n this.computeStyle(\n this.nodeContext.vertical,\n this.nodeContext.direction === \"rtl\",\n elementStyle,\n computedStyle,\n );\n const processRepeatOnBreak = this.processRepeatOnBreak(computedStyle);\n if (!processRepeatOnBreak) {\n continue;\n }\n if (\n this.nodeContext.formattingContext instanceof\n RepetitiveElement.RepetitiveElementsOwnerFormattingContext &&\n !this.nodeContext.belongsTo(this.nodeContext.formattingContext)\n ) {\n return;\n }\n const parent = this.nodeContext.parent;\n const parentFormattingContext = parent && parent.formattingContext;\n this.nodeContext.formattingContext = new RepetitiveElement.RepetitiveElementsOwnerFormattingContext(\n parentFormattingContext,\n this.nodeContext.sourceNode as Element,\n );\n (this.nodeContext\n .formattingContext as RepetitiveElement.RepetitiveElementsOwnerFormattingContext).initializeRepetitiveElements(\n this.nodeContext.vertical,\n );\n return;\n }\n }\n\n private processRepeatOnBreak(computedStyle: { [key: string]: Css.Val }) {\n let repeatOnBreak = computedStyle[\"repeat-on-break\"];\n if (repeatOnBreak !== Css.ident.none) {\n if (repeatOnBreak === Css.ident.auto) {\n if (computedStyle[\"display\"] === Css.ident.table_header_group) {\n repeatOnBreak = Css.ident.header;\n } else if (computedStyle[\"display\"] === Css.ident.table_footer_group) {\n repeatOnBreak = Css.ident.footer;\n } else {\n repeatOnBreak = Css.ident.none;\n }\n }\n if (repeatOnBreak && repeatOnBreak !== Css.ident.none) {\n return repeatOnBreak.toString();\n }\n }\n return null;\n }\n\n private createTextNodeView(): Task.Result<boolean> {\n const frame: Task.Frame<boolean> = Task.newFrame(\"createTextNodeView\");\n this.preprocessTextContent().then(() => {\n const offsetInNode = this.offsetInNode || 0;\n const textContent = Diff.restoreNewText(\n this.nodeContext.preprocessedTextContent,\n ).substr(offsetInNode);\n this.viewNode = document.createTextNode(textContent);\n frame.finish(true);\n });\n return frame.result();\n }\n\n private preprocessTextContent(): Task.Result<boolean> {\n if (this.nodeContext.preprocessedTextContent != null) {\n return Task.newResult(true);\n }\n let originl: string;\n let textContent = (originl = this.sourceNode.textContent);\n const frame: Task.Frame<boolean> = Task.newFrame(\"preprocessTextContent\");\n const hooks: Plugin.PreProcessTextContentHook[] = Plugin.getHooksForName(\n Plugin.HOOKS.PREPROCESS_TEXT_CONTENT,\n );\n let index = 0;\n frame\n .loop(() => {\n if (index >= hooks.length) {\n return Task.newResult(false);\n }\n return hooks[index++](this.nodeContext, textContent).thenAsync(\n (processedText) => {\n textContent = processedText;\n return Task.newResult(true);\n },\n );\n })\n .then(() => {\n this.nodeContext.preprocessedTextContent = Diff.diffChars(\n originl,\n textContent,\n );\n frame.finish(true);\n });\n return frame.result();\n }\n\n /**\n * @return holding true if children should be processed\n */\n createNodeView(\n firstTime: boolean,\n atUnforcedBreak: boolean,\n ): Task.Result<boolean> {\n const frame: Task.Frame<boolean> = Task.newFrame(\"createNodeView\");\n let result: Task.Result<boolean>;\n let needToProcessChildren = true;\n if (this.sourceNode.nodeType == 1) {\n result = this.createElementView(firstTime, atUnforcedBreak);\n } else {\n if (this.sourceNode.nodeType == 8) {\n this.viewNode = null; // comment node\n result = Task.newResult(true);\n } else {\n result = this.createTextNodeView();\n }\n }\n result.then((processChildren) => {\n needToProcessChildren = processChildren;\n this.nodeContext.viewNode = this.viewNode;\n if (this.viewNode) {\n const parent = this.nodeContext.parent\n ? this.nodeContext.parent.viewNode\n : this.viewRoot;\n if (parent) {\n parent.appendChild(this.viewNode);\n }\n }\n frame.finish(needToProcessChildren);\n });\n return frame.result();\n }\n\n /**\n * @override\n */\n setCurrent(\n nodeContext: Vtree.NodeContext,\n firstTime: boolean,\n atUnforcedBreak?: boolean,\n ): Task.Result<boolean> {\n this.nodeContext = nodeContext;\n if (nodeContext) {\n this.sourceNode = nodeContext.sourceNode;\n this.offsetInNode = nodeContext.offsetInNode;\n } else {\n this.sourceNode = null;\n this.offsetInNode = -1;\n }\n this.viewNode = null;\n if (this.nodeContext) {\n return this.createNodeView(firstTime, !!atUnforcedBreak);\n }\n return Task.newResult(true);\n }\n\n processShadowContent(pos: Vtree.NodeContext): Vtree.NodeContext {\n if (\n pos.shadowContext == null ||\n (pos.sourceNode as Element).localName != \"content\" ||\n pos.sourceNode.namespaceURI != Base.NS.SHADOW\n ) {\n return pos;\n }\n const boxOffset = pos.boxOffset;\n const shadow = pos.shadowContext;\n const parent = pos.parent;\n\n // content that will be inserted\n let contentNode: Node;\n let contentShadowType: Vtree.ShadowType;\n let contentShadow: Vtree.ShadowContext;\n if (shadow.subShadow) {\n contentShadow = shadow.subShadow;\n contentNode = shadow.root;\n contentShadowType = shadow.type;\n if (contentShadowType == Vtree.ShadowType.ROOTLESS) {\n contentNode = contentNode.firstChild;\n }\n } else {\n contentShadow = shadow.parentShadow;\n contentNode = shadow.owner.firstChild;\n contentShadowType = Vtree.ShadowType.ROOTLESS;\n }\n const nextSibling = pos.sourceNode.nextSibling;\n if (nextSibling) {\n pos.sourceNode = nextSibling;\n pos.resetView();\n } else if (pos.shadowSibling) {\n pos = pos.shadowSibling;\n } else if (contentNode) {\n pos = null;\n } else {\n pos = pos.parent.modify();\n pos.after = true;\n }\n if (contentNode) {\n const r = new Vtree.NodeContext(contentNode, parent, boxOffset);\n r.shadowContext = contentShadow;\n r.shadowType = contentShadowType;\n r.shadowSibling = pos;\n return r;\n }\n pos.boxOffset = boxOffset;\n return pos;\n }\n\n private nextPositionInTree(pos: Vtree.NodeContext): Vtree.NodeContext {\n let boxOffset = pos.boxOffset + 1; // offset for the next position\n if (pos.after) {\n // root, that was the last possible position\n if (!pos.parent) {\n return null;\n }\n\n // we are done with this sourceNode, see if there is a next sibling,\n // unless this is the root of the shadow tree\n if (pos.shadowType != Vtree.ShadowType.ROOTED) {\n const next = pos.sourceNode.nextSibling;\n if (next) {\n pos = pos.modify();\n\n // keep shadowType\n pos.boxOffset = boxOffset;\n pos.sourceNode = next;\n pos.resetView();\n return this.processShadowContent(pos);\n }\n }\n\n // if no viable siblings, check if there are shadow siblings\n if (pos.shadowSibling) {\n // our next position is the element after shadow:content in the parent\n // shadow tree\n pos = pos.shadowSibling.modify();\n pos.boxOffset = boxOffset;\n return pos;\n }\n\n // if not rootless shadow, move to the \"after\" position for the parent\n pos = pos.parent.modify();\n pos.boxOffset = boxOffset;\n pos.after = true;\n return pos;\n } else {\n // any shadow trees?\n if (pos.nodeShadow) {\n let shadowNode: Node | null = pos.nodeShadow.root;\n if (pos.nodeShadow.type == Vtree.ShadowType.ROOTLESS) {\n shadowNode = shadowNode.firstChild;\n }\n if (shadowNode) {\n const sr = new Vtree.NodeContext(shadowNode, pos, boxOffset);\n sr.shadowContext = pos.nodeShadow;\n sr.shadowType = pos.nodeShadow.type;\n return this.processShadowContent(sr);\n }\n }\n\n // any children?\n const child = pos.sourceNode.firstChild;\n if (child) {\n return this.processShadowContent(\n new Vtree.NodeContext(child, pos, boxOffset),\n );\n }\n\n // no children - was there text content?\n if (pos.sourceNode.nodeType != 1) {\n const content = Diff.restoreNewText(pos.preprocessedTextContent);\n boxOffset += content.length - 1 - pos.offsetInNode;\n }\n pos = pos.modify();\n pos.boxOffset = boxOffset;\n pos.after = true;\n return pos;\n }\n }\n\n isTransclusion(\n element: Element,\n elementStyle: CssCascade.ElementStyle,\n transclusionType: string | null,\n ) {\n const proc = CssCascade.getProp(elementStyle, \"hyperlink-processing\");\n if (!proc) {\n return false;\n }\n const prop = proc.evaluate(this.context, \"hyperlink-processing\");\n if (!prop) {\n return false;\n }\n return prop.toString() == transclusionType;\n }\n\n /**\n * @override\n */\n nextInTree(\n position: Vtree.NodeContext,\n atUnforcedBreak?: boolean,\n ): Task.Result<Vtree.NodeContext> {\n let nodeContext = this.nextPositionInTree(position);\n if (!nodeContext || nodeContext.after) {\n return Task.newResult(nodeContext);\n }\n const frame: Task.Frame<Vtree.NodeContext> = Task.newFrame(\"nextInTree\");\n this.setCurrent(nodeContext, true, atUnforcedBreak).then(\n (processChildren) => {\n if (!nodeContext.viewNode || !processChildren) {\n nodeContext = nodeContext.modify();\n nodeContext.after = true; // skip\n if (!nodeContext.viewNode) {\n nodeContext.inline = true;\n }\n }\n this.dispatchEvent({ type: \"nextInTree\", nodeContext } as any);\n frame.finish(nodeContext);\n },\n );\n return frame.result();\n }\n\n addImageFetchers(bg: Css.Val) {\n if (bg instanceof Css.CommaList) {\n const values = (bg as Css.CommaList).values;\n for (let i = 0; i < values.length; i++) {\n this.addImageFetchers(values[i]);\n }\n } else if (bg instanceof Css.URL) {\n const url = (bg as Css.URL).url;\n this.page.fetchers.push(TaskUtil.loadElement(new Image(), url));\n }\n }\n\n applyComputedStyles(\n target: Element,\n computedStyle: { [key: string]: Css.Val },\n ) {\n const bg = computedStyle[\"background-image\"];\n if (bg) {\n this.addImageFetchers(bg);\n }\n const isRelativePositioned =\n computedStyle[\"position\"] === Css.ident.relative;\n for (const propName in computedStyle) {\n if (propertiesNotPassedToDOM[propName]) {\n continue;\n }\n let value = computedStyle[propName];\n value = value.visit(\n new CssProp.UrlTransformVisitor(\n this.xmldoc.url,\n this.documentURLTransformer,\n ),\n );\n if (\n value.isNumeric() &&\n Exprs.needUnitConversion((value as Css.Numeric).unit)\n ) {\n // font-size for the root element is already converted to px\n value = Css.convertNumericToPx(value, this.context);\n }\n if (\n Vtree.delayedProps[propName] ||\n (isRelativePositioned &&\n Vtree.delayedPropsIfRelativePositioned[propName])\n ) {\n // Set it after page layout is done.\n this.page.delayedItems.push(\n new Vtree.DelayedItem(target, propName, value),\n );\n continue;\n }\n Base.setCSSProperty(target, propName, value.toString());\n }\n }\n\n /**\n * @override\n */\n applyPseudoelementStyle(\n nodeContext: Vtree.NodeContext,\n pseudoName: string,\n target: Element,\n ): void {\n if (nodeContext.after) {\n return;\n }\n const element = this.sourceNode as Element;\n const styler = nodeContext.shadowContext\n ? (nodeContext.shadowContext.styler as CssStyler.AbstractStyler)\n : this.styler;\n let elementStyle = styler.getStyle(element, false);\n const pseudoMap = CssCascade.getStyleMap(elementStyle, \"_pseudos\");\n if (!pseudoMap) {\n return;\n }\n elementStyle = pseudoMap[pseudoName];\n if (!elementStyle) {\n return;\n }\n const computedStyle = {};\n nodeContext.vertical = this.computeStyle(\n nodeContext.vertical,\n nodeContext.direction === \"rtl\",\n elementStyle,\n computedStyle,\n );\n const content = computedStyle[\"content\"];\n if (Vtree.nonTrivialContent(content)) {\n content.visit(\n new Vtree.ContentPropertyHandler(\n target,\n this.context,\n content,\n this.exprContentListener,\n ),\n );\n delete computedStyle[\"content\"];\n }\n this.applyComputedStyles(target, computedStyle);\n }\n\n /**\n * @override\n */\n peelOff(\n nodeContext: Vtree.NodeContext,\n nodeOffset: number,\n ): Task.Result<Vtree.NodeContext> {\n const frame: Task.Frame<Vtree.NodeContext> = Task.newFrame(\"peelOff\");\n const firstPseudo = nodeContext.firstPseudo;\n let offsetInNode = nodeContext.offsetInNode;\n const after = nodeContext.after;\n if (nodeOffset > 0) {\n const text = nodeContext.viewNode.textContent;\n nodeContext.viewNode.textContent = text.substr(0, nodeOffset);\n offsetInNode += nodeOffset;\n } else if (!after && nodeContext.viewNode && offsetInNode == 0) {\n const parent = nodeContext.viewNode.parentNode;\n if (parent) {\n parent.removeChild(nodeContext.viewNode);\n }\n }\n const boxOffset = nodeContext.boxOffset + nodeOffset;\n const arr = [];\n while (nodeContext.firstPseudo === firstPseudo) {\n arr.push(nodeContext);\n nodeContext = nodeContext.parent;\n }\n let pn = arr.pop(); // container for that pseudoelement\n let shadowSibling = pn.shadowSibling;\n frame\n .loop(() => {\n while (arr.length > 0) {\n pn = arr.pop();\n nodeContext = new Vtree.NodeContext(\n pn.sourceNode,\n nodeContext,\n boxOffset,\n );\n if (arr.length == 0) {\n nodeContext.offsetInNode = offsetInNode;\n nodeContext.after = after;\n }\n nodeContext.shadowType = pn.shadowType;\n (nodeContext.shadowContext = pn.shadowContext),\n (nodeContext.nodeShadow = pn.nodeShadow);\n nodeContext.shadowSibling = pn.shadowSibling\n ? pn.shadowSibling\n : shadowSibling;\n shadowSibling = null;\n const result = this.setCurrent(nodeContext, false);\n if (result.isPending()) {\n return result;\n }\n }\n return Task.newResult(false);\n })\n .then(() => {\n frame.finish(nodeContext);\n });\n return frame.result();\n }\n\n createElement(ns: string, tag: string): Element {\n if (ns == Base.NS.XHTML) {\n return this.document.createElement(tag);\n }\n return this.document.createElementNS(ns, tag);\n }\n\n /**\n * @override\n */\n applyFootnoteStyle(\n vertical: boolean,\n rtl: boolean,\n target: Element,\n ): boolean {\n const computedStyle = {};\n const pseudoMap = CssCascade.getStyleMap(this.footnoteStyle, \"_pseudos\");\n vertical = this.computeStyle(\n vertical,\n rtl,\n this.footnoteStyle,\n computedStyle,\n );\n if (pseudoMap && pseudoMap[\"before\"]) {\n const childComputedStyle = {};\n const span = this.createElement(Base.NS.XHTML, \"span\");\n PseudoElement.setPseudoName(span, \"before\");\n target.appendChild(span);\n this.computeStyle(vertical, rtl, pseudoMap[\"before\"], childComputedStyle);\n delete childComputedStyle[\"content\"];\n this.applyComputedStyles(span, childComputedStyle);\n }\n delete computedStyle[\"content\"];\n this.applyComputedStyles(target, computedStyle);\n return vertical;\n }\n\n /**\n * @override\n */\n processFragmentedBlockEdge(nodeContext: Vtree.NodeContext) {\n if (nodeContext) {\n nodeContext.walkUpBlocks((block) => {\n const boxDecorationBreak = block.inheritedProps[\"box-decoration-break\"];\n if (!boxDecorationBreak || boxDecorationBreak === \"slice\") {\n const elem = block.viewNode as Element;\n Asserts.assert(elem instanceof Element);\n if (block.vertical) {\n Base.setCSSProperty(elem, \"padding-left\", \"0\");\n Base.setCSSProperty(elem, \"border-left\", \"none\");\n Base.setCSSProperty(elem, \"border-top-left-radius\", \"0\");\n Base.setCSSProperty(elem, \"border-bottom-left-radius\", \"0\");\n } else {\n Base.setCSSProperty(elem, \"padding-bottom\", \"0\");\n Base.setCSSProperty(elem, \"border-bottom\", \"none\");\n Base.setCSSProperty(elem, \"border-bottom-left-radius\", \"0\");\n Base.setCSSProperty(elem, \"border-bottom-right-radius\", \"0\");\n }\n }\n });\n }\n }\n\n /**\n * @override\n */\n convertLengthToPx(\n numeric: Css.Numeric,\n viewNode: Node,\n clientLayout: Vtree.ClientLayout,\n ): number | Css.Numeric {\n const num = numeric.num;\n const unit = numeric.unit;\n if (Exprs.isFontRelativeLengthUnit(unit)) {\n let elem = viewNode;\n while (elem && elem.nodeType !== 1) {\n elem = elem.parentNode;\n }\n Asserts.assert(elem);\n const fontSize = parseFloat(\n clientLayout.getElementComputedStyle(elem as Element)[\"font-size\"],\n );\n Asserts.assert(this.context);\n return CssCascade.convertFontRelativeLengthToPx(\n numeric,\n fontSize,\n this.context,\n ).num;\n } else {\n const unitSize = this.context.queryUnitSize(unit, false);\n if (unitSize) {\n return num * unitSize;\n } else {\n return numeric;\n }\n }\n }\n\n /**\n * Returns if two NodePositionStep are equivalent.\n */\n isSameNodePositionStep(\n step1: Vtree.NodePositionStep,\n step2: Vtree.NodePositionStep,\n ): boolean {\n if (step1.shadowContext) {\n if (!step2.shadowContext) {\n return false;\n }\n const elem1 =\n step1.node.nodeType === 1\n ? (step1.node as Element)\n : (step1.node.parentElement as Element);\n const elem2 =\n step2.node.nodeType === 1\n ? (step2.node as Element)\n : (step2.node.parentElement as Element);\n return (\n step1.shadowContext.owner === step2.shadowContext.owner &&\n PseudoElement.getPseudoName(elem1) ===\n PseudoElement.getPseudoName(elem2)\n );\n } else {\n return step1.node === step2.node;\n }\n }\n\n /**\n * @override\n */\n isSameNodePosition(\n nodePosition1: Vtree.NodePosition,\n nodePosition2: Vtree.NodePosition,\n ): boolean {\n return (\n nodePosition1.offsetInNode === nodePosition2.offsetInNode &&\n nodePosition1.after == nodePosition2.after &&\n nodePosition1.steps.length === nodePosition2.steps.length &&\n nodePosition1.steps.every((step1, i) => {\n const step2 = nodePosition2.steps[i];\n return this.isSameNodePositionStep(step1, step2);\n })\n );\n }\n\n isPseudoelement(elem) {\n return !!PseudoElement.getPseudoName(elem);\n }\n}\n\nexport const propertiesNotPassedToDOM = {\n \"box-decoration-break\": true,\n \"float-min-wrap-block\": true,\n \"float-reference\": true,\n \"flow-into\": true,\n \"flow-linger\": true,\n \"flow-options\": true,\n \"flow-priority\": true,\n \"footnote-policy\": true,\n page: true,\n};\n\nexport class DefaultClientLayout implements Vtree.ClientLayout {\n layoutBox: Element;\n window: Window;\n\n constructor(viewport: Viewport) {\n this.layoutBox = viewport.layoutBox;\n this.window = viewport.window;\n }\n\n private subtractOffsets(\n rect: Vtree.ClientRect,\n originRect: Vtree.ClientRect,\n ): Vtree.ClientRect {\n const viewportLeft = originRect.left;\n const viewportTop = originRect.top;\n return {\n left: rect.left - viewportLeft,\n top: rect.top - viewportTop,\n right: rect.right - viewportLeft,\n bottom: rect.bottom - viewportTop,\n width: rect.width,\n height: rect.height,\n } as Vtree.ClientRect;\n }\n\n /**\n * @override\n */\n getRangeClientRects(range: Range): ClientRect[] {\n const rects = range[\"getClientRects\"]();\n const layoutBoxRect = this.layoutBox.getBoundingClientRect();\n return Array.from(rects).map((rect) =>\n this.subtractOffsets(rect, layoutBoxRect),\n );\n }\n\n /**\n * @override\n */\n getElementClientRect(element: Element): ClientRect {\n const htmlElement = element as HTMLElement;\n const rect = htmlElement.getBoundingClientRect() as Vtree.ClientRect;\n const layoutBoxRect = this.layoutBox.getBoundingClientRect();\n return this.subtractOffsets(rect, layoutBoxRect);\n }\n\n /**\n * @override\n */\n getElementComputedStyle(element: Element): CSSStyleDeclaration {\n return this.window.getComputedStyle(element, null);\n }\n}\n\nexport class Viewport {\n document: Document;\n root: HTMLElement;\n private outerZoomBox: HTMLElement;\n contentContainer: HTMLElement;\n layoutBox: Element;\n width: number;\n height: number;\n\n constructor(\n public readonly window: Window,\n public readonly fontSize: number,\n opt_root?: HTMLElement,\n opt_width?: number,\n opt_height?: number,\n ) {\n this.document = window.document;\n this.root = opt_root || this.document.body;\n let outerZoomBox = this.root.firstElementChild;\n if (!outerZoomBox) {\n outerZoomBox = this.document.createElement(\"div\");\n outerZoomBox.setAttribute(\"data-vivliostyle-outer-zoom-box\", \"true\");\n this.root.appendChild(outerZoomBox);\n }\n let contentContainer = outerZoomBox.firstElementChild;\n if (!contentContainer) {\n contentContainer = this.document.createElement(\"div\");\n contentContainer.setAttribute(\n \"data-vivliostyle-spread-container\",\n \"true\",\n );\n outerZoomBox.appendChild(contentContainer);\n }\n let layoutBox = outerZoomBox.nextElementSibling;\n if (!layoutBox) {\n layoutBox = this.document.createElement(\"div\");\n layoutBox.setAttribute(\"data-vivliostyle-layout-box\", \"true\");\n this.root.appendChild(layoutBox);\n }\n this.outerZoomBox = outerZoomBox as HTMLElement;\n this.contentContainer = contentContainer as HTMLElement;\n this.layoutBox = layoutBox as HTMLElement;\n const clientLayout = new DefaultClientLayout(this);\n const computedStyle = clientLayout.getElementComputedStyle(this.root);\n this.width =\n opt_width || parseFloat(computedStyle[\"width\"]) || window.innerWidth;\n this.height =\n opt_height || parseFloat(computedStyle[\"height\"]) || window.innerHeight;\n }\n\n /**\n * Reset zoom.\n */\n resetZoom() {\n Base.setCSSProperty(this.outerZoomBox, \"width\", \"\");\n Base.setCSSProperty(this.outerZoomBox, \"height\", \"\");\n Base.setCSSProperty(this.contentContainer, \"width\", \"\");\n Base.setCSSProperty(this.contentContainer, \"height\", \"\");\n Base.setCSSProperty(this.contentContainer, \"transform\", \"\");\n }\n\n /**\n * Zoom viewport.\n * @param width Overall width of contents before scaling (px)\n * @param height Overall height of contents before scaling (px)\n * @param scale Factor to which the viewport will be scaled.\n */\n zoom(width: number, height: number, scale: number) {\n Base.setCSSProperty(this.outerZoomBox, \"width\", `${width * scale}px`);\n Base.setCSSProperty(this.outerZoomBox, \"height\", `${height * scale}px`);\n Base.setCSSProperty(this.contentContainer, \"width\", `${width}px`);\n Base.setCSSProperty(this.contentContainer, \"height\", `${height}px`);\n Base.setCSSProperty(this.contentContainer, \"transform\", `scale(${scale})`);\n }\n\n /**\n * Remove all pages inside the viewport.\n */\n clear() {\n const root = this.root;\n while (root.lastChild) {\n root.removeChild(root.lastChild);\n }\n }\n}\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2015 Trim-marks Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview XmlDoc - Utility functions to work with XML (mostly XHTML)\n * documents.\n */\nimport * as Base from \"./base\";\nimport * as Net from \"./net\";\nimport * as Task from \"./task\";\nimport { XmlDoc } from \"./types\";\n\nexport type XMLDocStore = XmlDoc.XMLDocStore;\n\nexport class XMLDocHolder implements XmlDoc.XMLDocHolder {\n lang: string | null = null;\n totalOffset: number = -1;\n root: Element;\n body: Element;\n head: Element;\n last: Element;\n lastOffset: number = 1;\n idMap: { [key: string]: Element };\n\n constructor(\n public readonly store: XMLDocStore,\n public readonly url: string,\n public readonly document: Document,\n ) {\n this.root = document.documentElement; // html element\n let body: Element = null;\n let head: Element = null;\n if (this.root.namespaceURI == Base.NS.XHTML) {\n for (\n let child: Node = this.root.firstChild;\n child;\n child = child.nextSibling\n ) {\n if (child.nodeType != 1) {\n continue;\n }\n const elem = child as Element;\n if (elem.namespaceURI == Base.NS.XHTML) {\n switch (elem.localName) {\n case \"head\":\n head = elem;\n break;\n case \"body\":\n body = elem;\n break;\n }\n }\n }\n this.lang = this.root.getAttribute(\"lang\");\n }\n this.body = body as Element;\n this.head = head as Element;\n this.last = this.root;\n this.last.setAttribute(Base.ELEMENT_OFFSET_ATTR, \"0\");\n }\n\n doc(): XmlDoc.NodeList {\n return new NodeList([this.document]);\n }\n\n getElementOffset(element: Element): number {\n const offsetStr = element.getAttribute(Base.ELEMENT_OFFSET_ATTR);\n if (offsetStr) {\n return parseInt(offsetStr, 10);\n }\n let offset = this.lastOffset;\n let last: Node | null = this.last;\n while (last != element) {\n let next: Node | null = last.firstChild;\n if (!next) {\n while (true) {\n next = last.nextSibling;\n if (next) {\n break;\n }\n last = last.parentNode;\n if (last == null) {\n throw new Error(\"Internal error\");\n }\n }\n }\n last = next;\n if (next.nodeType == 1) {\n const nextElement = next as Element;\n nextElement.setAttribute(Base.ELEMENT_OFFSET_ATTR, offset.toString());\n ++offset;\n } else {\n offset += (next.textContent as string).length;\n }\n }\n this.lastOffset = offset;\n this.last = element;\n return offset - 1;\n }\n\n getNodeOffset(srcNode: Node, offsetInNode: number, after: boolean) {\n let extraOffset = 0;\n let node: Node | null = srcNode;\n let prev: Node | null = null;\n if (node.nodeType == 1) {\n // after = true is only valid for elements\n if (!after) {\n return this.getElementOffset(node as Element);\n }\n } else {\n // offsetInNode is only valid for text nodes\n extraOffset = offsetInNode;\n prev = node.previousSibling;\n if (!prev) {\n node = node.parentNode;\n extraOffset += 1;\n return this.getElementOffset(node as Element) + extraOffset;\n }\n node = prev;\n }\n while (true) {\n while (node.lastChild) {\n node = node.lastChild;\n }\n if (node.nodeType == 1) {\n // empty element\n break;\n }\n extraOffset += (node.textContent as string).length;\n prev = node.previousSibling;\n if (!prev) {\n node = node.parentNode;\n break;\n }\n node = prev;\n }\n extraOffset += 1;\n return this.getElementOffset(node as Element) + extraOffset;\n }\n\n getTotalOffset(): number {\n if (this.totalOffset < 0) {\n this.totalOffset = this.getNodeOffset(this.root, 0, true);\n }\n return this.totalOffset;\n }\n\n /**\n * @return last node such that its offset is less or equal to the given\n */\n getNodeByOffset(offset: number): Node {\n let elementOffset: number;\n\n // First, find the last element in the document, such that\n // this.getElementOffset(element) <= offset; if offest matches\n // exactly, just return it.\n let element = this.root;\n while (true) {\n elementOffset = this.getElementOffset(element);\n if (elementOffset >= offset) {\n return element;\n }\n const children = element.children; // Element children\n if (!children) {\n break;\n }\n const index = Base.binarySearch(children.length, (index) => {\n const child = children[index];\n const childOffset = this.getElementOffset(child);\n return childOffset > offset;\n });\n if (index == 0) {\n break;\n }\n if (VIVLIOSTYLE_DEBUG) {\n if (index < children.length) {\n const elemOffset = this.getElementOffset(children[index]);\n if (elemOffset <= offset) {\n throw new Error(\"Consistency check failed!\");\n }\n }\n }\n element = children[index - 1];\n }\n\n // Now we have element with offset less than desired. Find following\n // (non-element) node with the right offset.\n let nodeOffset = elementOffset + 1;\n let node: Node | null = element;\n let next: Node | null = node.firstChild || node.nextSibling;\n let lastGood: Node | null = null;\n while (true) {\n if (next) {\n if (next.nodeType == 1) {\n break;\n }\n node = next;\n lastGood = node;\n nodeOffset += (next.textContent as string).length;\n if (nodeOffset > offset && !/^\\s*$/.test(next.textContent)) {\n break;\n }\n } else {\n node = node.parentNode;\n if (!node) {\n break;\n }\n }\n next = node.nextSibling;\n }\n if (next && lastGood && /^\\s*$/.test(lastGood.textContent)) {\n // skip white-space text node\n lastGood = next;\n }\n return lastGood || element;\n }\n\n private buildIdMap(e: Element): void {\n const id = e.getAttribute(\"id\");\n if (id && !this.idMap[id]) {\n this.idMap[id] = e;\n }\n const xmlid = e.getAttributeNS(Base.NS.XML, \"id\");\n if (xmlid && !this.idMap[xmlid]) {\n this.idMap[xmlid] = e;\n }\n for (let c = e.firstElementChild; c; c = c.nextElementSibling) {\n this.buildIdMap(c);\n }\n }\n\n /**\n * Get element by URL in the source document(s). URL must be in either '#id'\n * or 'url#id' form.\n */\n getElement(url: string): Element | null {\n const m = url.match(/([^#]*)#(.+)$/);\n if (!m || (m[1] && m[1] != this.url)) {\n return null;\n }\n const id = m[2];\n let r: Element = this.document.getElementById(id);\n if (!r && this.document.getElementsByName) {\n r = this.document.getElementsByName(id)[0];\n }\n if (!r) {\n if (!this.idMap) {\n this.idMap = {};\n this.buildIdMap(this.document.documentElement);\n }\n r = this.idMap[id];\n }\n return r;\n }\n}\n\n/**\n * cf. https://w3c.github.io/DOM-Parsing/#the-domparser-interface\n * @enum {string}\n */\nexport enum DOMParserSupportedType {\n TEXT_HTML = \"text/html\",\n TEXT_XML = \"text/xml\",\n APPLICATION_XML = \"application/xml\",\n APPLICATION_XHTML_XML = \"application/xhtml+xml\",\n IMAGE_SVG_XML = \"image/svg+xml\",\n}\n\n/**\n * Parses a string with a DOMParser and returns the document.\n * If a parse error occurs, return null.\n */\nexport function parseAndReturnNullIfError(\n str: string,\n type: string,\n opt_parser?: DOMParser,\n): Document | null {\n const parser = opt_parser || new DOMParser();\n let doc: Document;\n try {\n doc = parser.parseFromString(str, type as DOMParserSupportedType);\n } catch (e) {}\n if (!doc) {\n return null;\n } else {\n const docElement = doc.documentElement;\n const errorTagName = \"parsererror\";\n if (docElement.localName === errorTagName) {\n return null;\n } else {\n for (let c = docElement.firstElementChild; c; c = c.nextElementSibling) {\n if (c.localName === errorTagName) {\n return null;\n }\n }\n }\n }\n return doc;\n}\n\n/**\n * @returns null if contentType cannot be inferred from HTTP header and file\n * extension\n */\nexport function resolveContentType(response: Net.Response): string | null {\n const contentType = response.contentType;\n if (contentType) {\n const supportedKeys = Object.keys(DOMParserSupportedType);\n for (let i = 0; i < supportedKeys.length; i++) {\n if (DOMParserSupportedType[supportedKeys[i]] === contentType) {\n return contentType;\n }\n }\n if (contentType.match(/\\+xml$/)) {\n return DOMParserSupportedType.APPLICATION_XML;\n }\n }\n const match = response.url.match(/\\.([^./]+)$/);\n if (match) {\n const extension = match[1];\n switch (extension) {\n case \"html\":\n case \"htm\":\n return DOMParserSupportedType.TEXT_HTML;\n case \"xhtml\":\n case \"xht\":\n return DOMParserSupportedType.APPLICATION_XHTML_XML;\n case \"svg\":\n case \"svgz\":\n return DOMParserSupportedType.IMAGE_SVG_XML;\n case \"opf\":\n case \"xml\":\n return DOMParserSupportedType.APPLICATION_XML;\n }\n }\n return null;\n}\n\nexport function parseXMLResource(\n response: Net.Response,\n store: XMLDocStore,\n): Task.Result<XmlDoc.XMLDocHolder> {\n let doc = response.responseXML;\n if (!doc) {\n const parser = new DOMParser();\n const text = response.responseText;\n if (text) {\n const contentType = resolveContentType(response);\n doc = parseAndReturnNullIfError(\n text,\n contentType || DOMParserSupportedType.APPLICATION_XML,\n parser,\n );\n\n // When contentType cannot be inferred from HTTP header and file\n // extension, we use root element's tag name to infer the contentType. If\n // it is html or svg, we re-parse the source with an appropriate\n // contentType.\n if (doc && !contentType) {\n const root = doc.documentElement;\n if (root.localName.toLowerCase() === \"html\" && !root.namespaceURI) {\n doc = parseAndReturnNullIfError(\n text,\n DOMParserSupportedType.TEXT_HTML,\n parser,\n );\n } else if (\n root.localName.toLowerCase() === \"svg\" &&\n (doc as any).contentType !== DOMParserSupportedType.IMAGE_SVG_XML\n ) {\n doc = parseAndReturnNullIfError(\n text,\n DOMParserSupportedType.IMAGE_SVG_XML,\n parser,\n );\n }\n }\n if (!doc) {\n // Fallback to HTML parsing\n doc = parseAndReturnNullIfError(\n text,\n DOMParserSupportedType.TEXT_HTML,\n parser,\n );\n }\n }\n }\n const xmldoc = doc ? new XMLDocHolder(store, response.url, doc) : null;\n return Task.newResult(xmldoc);\n}\n\nexport function newXMLDocStore(): XMLDocStore {\n return new Net.ResourceStore(\n parseXMLResource,\n Net.XMLHttpRequestResponseType.DOCUMENT,\n );\n}\n\nexport class Predicate implements XmlDoc.Predicate {\n constructor(public readonly fn: (p1: Node) => boolean) {}\n\n check(node: Node): boolean {\n return this.fn(node);\n }\n\n withAttribute(name: string, value: string): Predicate {\n return new Predicate(\n (node) =>\n this.check(node) &&\n node.nodeType == 1 &&\n (node as Element).getAttribute(name) == value,\n );\n }\n\n withChild(name: string, opt_childPredicate?: Predicate): Predicate {\n return new Predicate((node) => {\n if (!this.check(node)) {\n return false;\n }\n let list = new NodeList([node]);\n list = list.child(name);\n if (opt_childPredicate) {\n list = list.predicate(opt_childPredicate);\n }\n return list.size() > 0;\n });\n }\n}\n\nexport const predicate = new Predicate((node) => true);\n\nexport class NodeList implements XmlDoc.NodeList {\n constructor(public readonly nodes: Node[]) {}\n\n asArray(): Node[] {\n return this.nodes;\n }\n\n size(): number {\n return this.nodes.length;\n }\n\n /**\n * Filter with predicate\n */\n predicate(pr: Predicate): NodeList {\n const arr = [];\n for (const n of this.nodes) {\n if (pr.check(n)) {\n arr.push(n);\n }\n }\n return new NodeList(arr);\n }\n\n forEachNode(fn: (p1: Node, p2: (p1: Node) => void) => void): NodeList {\n const arr = [];\n const add = (n) => {\n arr.push(n);\n };\n for (let i = 0; i < this.nodes.length; i++) {\n fn(this.nodes[i], add);\n }\n return new NodeList(arr);\n }\n\n /**\n * @template T\n */\n forEach<T>(fn: (p1: Node) => T): T[] {\n const arr = [];\n for (let i = 0; i < this.nodes.length; i++) {\n arr.push(fn(this.nodes[i]));\n }\n return arr;\n }\n\n /**\n * @template T\n */\n forEachNonNull<T>(fn: (p1: Node) => T): T[] {\n const arr = [];\n for (let i = 0; i < this.nodes.length; i++) {\n const t = fn(this.nodes[i]);\n if (t != null) {\n arr.push(t);\n }\n }\n return arr;\n }\n\n child(tag: string): NodeList {\n return this.forEachNode((node, add) => {\n for (let c: Node = node.firstChild; c; c = c.nextSibling) {\n if (c.nodeType == 1 && (c as Element).localName == tag) {\n add(c);\n }\n }\n });\n }\n\n childElements(): NodeList {\n return this.forEachNode((node, add) => {\n for (let c: Node = node.firstChild; c; c = c.nextSibling) {\n if (c.nodeType == 1) {\n add(c);\n }\n }\n });\n }\n\n attribute(name: string): (string | null)[] {\n return this.forEachNonNull((node) => {\n if (node.nodeType == 1) {\n return (node as Element).getAttribute(name);\n }\n return null;\n });\n }\n\n textContent(): (string | null)[] {\n return this.forEach((node) => node.textContent);\n }\n}\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2015 Trim-marks Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Ops - Render EPUB content files by applying page masters,\n * styling and layout.\n */\nimport \"./footnotes\";\nimport \"./table\";\nimport * as Asserts from \"./asserts\";\nimport * as Base from \"./base\";\nimport * as Break from \"./break\";\nimport * as Columns from \"./columns\";\nimport * as Constants from \"./constants\";\nimport * as Counters from \"./counters\";\nimport * as Css from \"./css\";\nimport * as CssCascade from \"./css-cascade\";\nimport * as CssParser from \"./css-parser\";\nimport * as CssProp from \"./css-prop\";\nimport * as CssStyler from \"./css-styler\";\nimport * as CssTokenizer from \"./css-tokenizer\";\nimport * as CssValidator from \"./css-validator\";\nimport * as Exprs from \"./exprs\";\nimport * as Font from \"./font\";\nimport * as GeometryUtil from \"./geometry-util\";\nimport * as Layout from \"./layout\";\nimport * as LayoutProcessor from \"./layout-processor\";\nimport * as Logging from \"./logging\";\nimport * as Net from \"./net\";\nimport * as PageFloats from \"./page-floats\";\nimport * as CssPage from \"./css-page\";\nimport * as Plugin from \"./plugin\";\nimport * as PageMaster from \"./page-master\";\nimport * as Task from \"./task\";\nimport * as TaskUtil from \"./task-util\";\nimport * as Vgen from \"./vgen\";\nimport * as Vtree from \"./vtree\";\nimport * as XmlDoc from \"./xml-doc\";\nimport { Layout as LayoutType } from \"./types\";\nimport { UserAgentBaseCss, UserAgentPageCss } from \"./assets\";\n\nexport const uaStylesheetBaseFetcher: TaskUtil.Fetcher<boolean> = new TaskUtil.Fetcher(\n () => {\n const frame: Task.Frame<boolean> = Task.newFrame(\"uaStylesheetBase\");\n const validatorSet = CssValidator.baseValidatorSet();\n const url = Base.resolveURL(\"user-agent-base.css\", Base.resourceBaseURL);\n const handler = new CssCascade.CascadeParserHandler(\n null,\n null,\n null,\n null,\n null,\n validatorSet,\n true,\n );\n handler.startStylesheet(CssParser.StylesheetFlavor.USER_AGENT);\n CssCascade.setUABaseCascade(handler.cascade);\n CssParser.parseStylesheetFromText(\n UserAgentBaseCss,\n handler,\n url,\n null,\n null,\n ).thenFinish(frame);\n return frame.result();\n },\n \"uaStylesheetBaseFetcher\",\n);\n\nexport function loadUABase(): Task.Result<boolean> {\n return uaStylesheetBaseFetcher.get();\n}\n\nexport type FontFace = {\n properties: CssCascade.ElementStyle;\n condition: Exprs.Val;\n};\n\nexport class Style {\n fontDeobfuscator:\n | ((p1: string) => ((p1: Blob) => Task.Result<Blob>) | null)\n | null;\n validatorSet: CssValidator.ValidatorSet;\n\n constructor(\n public readonly store: OPSDocStore,\n public readonly rootScope: Exprs.LexicalScope,\n public readonly pageScope: Exprs.LexicalScope,\n public readonly cascade: CssCascade.Cascade,\n public readonly rootBox: PageMaster.RootPageBox,\n public readonly fontFaces: FontFace[],\n public readonly footnoteProps: CssCascade.ElementStyle,\n public readonly flowProps: { [key: string]: CssCascade.ElementStyle },\n public readonly viewportProps: CssCascade.ElementStyle[],\n public readonly pageProps: { [key: string]: CssCascade.ElementStyle },\n ) {\n this.fontDeobfuscator = store.fontDeobfuscator;\n this.validatorSet = store.validatorSet;\n this.pageScope.defineBuiltIn(\"has-content\", function (name) {\n name = name as string;\n const styleInstance = this as StyleInstance;\n const cp = styleInstance.currentLayoutPosition;\n const flowChunk = cp.firstFlowChunkOfFlow(name);\n return (\n styleInstance.matchPageSide(cp.startSideOfFlow(name as string)) &&\n cp.hasContent(name as string, styleInstance.lookupOffset) &&\n !!flowChunk &&\n !styleInstance.flowChunkIsAfterParentFlowForcedBreak(flowChunk)\n );\n });\n this.pageScope.defineName(\n \"page-number\",\n new Exprs.Native(\n this.pageScope,\n function () {\n const styleInstance = this as StyleInstance;\n return (\n styleInstance.pageNumberOffset +\n styleInstance.currentLayoutPosition.page\n );\n },\n \"page-number\",\n ),\n );\n }\n\n sizeViewport(\n viewportWidth: number,\n viewportHeight: number,\n fontSize: number,\n pref?: Exprs.Preferences,\n ): { width: number; height: number; fontSize: number } {\n if (this.viewportProps.length) {\n const context = new Exprs.Context(\n this.rootScope,\n viewportWidth,\n viewportHeight,\n fontSize,\n );\n const viewportProps = CssCascade.mergeAll(context, this.viewportProps);\n const width = viewportProps[\"width\"];\n const height = viewportProps[\"height\"];\n const textZoom = viewportProps[\"text-zoom\"];\n let scaleFactor = 1;\n if ((width && height) || textZoom) {\n const defaultFontSize = Exprs.defaultUnitSizes[\"em\"];\n const zoomVal = textZoom\n ? textZoom.evaluate(context, \"text-zoom\")\n : null;\n if (zoomVal === Css.ident.scale) {\n scaleFactor = defaultFontSize / fontSize;\n fontSize = defaultFontSize;\n viewportWidth *= scaleFactor;\n viewportHeight *= scaleFactor;\n }\n if (width && height) {\n const widthVal = Css.toNumber(\n width.evaluate(context, \"width\"),\n context,\n );\n const heightVal = Css.toNumber(\n height.evaluate(context, \"height\"),\n context,\n );\n if (widthVal > 0 && heightVal > 0) {\n const spreadWidth =\n pref && pref.spreadView\n ? (widthVal + pref.pageBorder) * 2\n : widthVal;\n return { width: spreadWidth, height: heightVal, fontSize };\n }\n }\n }\n }\n return { width: viewportWidth, height: viewportHeight, fontSize };\n }\n}\n\n//-------------------------------------------------------------------------------\nexport class StyleInstance\n extends Exprs.Context\n implements\n CssStyler.FlowListener,\n PageMaster.InstanceHolder,\n Vgen.StylerProducer {\n lang: string | null;\n primaryFlows = { body: true } as { [key: string]: boolean };\n rootPageBoxInstance: PageMaster.RootPageBoxInstance = null;\n styler: CssStyler.Styler = null;\n stylerMap: { [key: string]: CssStyler.Styler } = null;\n currentLayoutPosition: Vtree.LayoutPosition = null;\n layoutPositionAtPageStart: Vtree.LayoutPosition = null;\n lookupOffset: number = 0;\n faces: Font.DocumentFaces;\n pageBoxInstances: { [key: string]: PageMaster.PageBoxInstance } = {};\n pageManager: CssPage.PageManager = null;\n private rootPageFloatLayoutContext: PageFloats.PageFloatLayoutContext;\n pageBreaks: { [key: string]: boolean } = {};\n pageProgression: Constants.PageProgression | null = null;\n isVersoFirstPage: boolean = false;\n blankPageAtStart: boolean = false;\n pageSheetSize: { [key: string]: { width: number; height: number } } = {};\n pageSheetHeight: number = 0;\n pageSheetWidth: number = 0;\n actualPageWidth: number;\n actualPageHeight: number;\n\n constructor(\n public readonly style: Style,\n public readonly xmldoc: XmlDoc.XMLDocHolder,\n defaultLang: string | null,\n public readonly viewport: Vgen.Viewport,\n public readonly clientLayout: Vtree.ClientLayout,\n public readonly fontMapper: Font.Mapper,\n public readonly customRenderer: Vgen.CustomRenderer,\n public readonly fallbackMap: { [key: string]: string },\n public readonly pageNumberOffset: number,\n public readonly documentURLTransformer: Base.DocumentURLTransformer,\n public readonly counterStore: Counters.CounterStore,\n pageProgression?: Constants.PageProgression,\n isVersoFirstPage?: boolean,\n ) {\n super(style.rootScope, viewport.width, viewport.height, viewport.fontSize);\n this.lang = xmldoc.lang || defaultLang;\n this.faces = new Font.DocumentFaces(this.style.fontDeobfuscator);\n this.rootPageFloatLayoutContext = new PageFloats.PageFloatLayoutContext(\n null,\n null,\n null,\n null,\n null,\n null,\n null,\n );\n this.pageProgression = pageProgression || null;\n this.isVersoFirstPage = !!isVersoFirstPage;\n for (const flowName in style.flowProps) {\n const flowStyle = style.flowProps[flowName];\n const consume = CssCascade.getProp(flowStyle, \"flow-consume\");\n if (consume) {\n const consumeVal = consume.evaluate(this, \"flow-consume\");\n if (consumeVal == Css.ident.all) {\n this.primaryFlows[flowName] = true;\n } else {\n delete this.primaryFlows[flowName];\n }\n }\n }\n }\n\n init(): Task.Result<boolean> {\n const frame: Task.Frame<boolean> = Task.newFrame(\"StyleInstance.init\");\n const counterListener = this.counterStore.createCounterListener(\n this.xmldoc.url,\n );\n const counterResolver = this.counterStore.createCounterResolver(\n this.xmldoc.url,\n this.style.rootScope,\n this.style.pageScope,\n );\n this.styler = new CssStyler.Styler(\n this.xmldoc,\n this.style.cascade,\n this.style.rootScope,\n this,\n this.primaryFlows,\n this.style.validatorSet,\n counterListener,\n counterResolver,\n );\n counterResolver.setStyler(this.styler);\n this.styler.resetFlowChunkStream(this);\n this.stylerMap = {};\n this.stylerMap[this.xmldoc.url] = this.styler;\n const docElementStyle = this.styler.getTopContainerStyle();\n if (!this.pageProgression) {\n this.pageProgression = CssPage.resolvePageProgression(docElementStyle);\n }\n\n // Check the spread break at beginning of a document that may cause\n // the first page verso side or cause a blank page (issue #666)\n if (!this.matchStartPageSide(this.styler.breakBeforeValues[0])) {\n if (this.pageNumberOffset === 0) {\n this.isVersoFirstPage = true;\n } else {\n this.blankPageAtStart = true;\n }\n }\n\n const rootBox = this.style.rootBox;\n this.rootPageBoxInstance = new PageMaster.RootPageBoxInstance(rootBox);\n const cascadeInstance = this.style.cascade.createInstance(\n this,\n counterListener,\n counterResolver,\n this.lang,\n );\n this.rootPageBoxInstance.applyCascadeAndInit(\n cascadeInstance,\n docElementStyle,\n );\n this.rootPageBoxInstance.resolveAutoSizing(this);\n this.pageManager = new CssPage.PageManager(\n cascadeInstance,\n this.style.pageScope,\n this.rootPageBoxInstance,\n this,\n docElementStyle,\n );\n const srcFaces = [] as Font.Face[];\n for (const fontFace of this.style.fontFaces) {\n if (fontFace.condition && !fontFace.condition.evaluate(this)) {\n continue;\n }\n const properties = Font.prepareProperties(fontFace.properties, this);\n const srcFace = new Font.Face(properties);\n srcFaces.push(srcFace);\n }\n this.fontMapper.findOrLoadFonts(srcFaces, this.faces).thenFinish(frame);\n\n // Determine page sheet sizes corresponding to page selectors\n const pageProps = this.style.pageProps;\n Object.keys(pageProps).forEach((selector) => {\n const pageSizeAndBleed = CssPage.evaluatePageSizeAndBleed(\n CssPage.resolvePageSizeAndBleed(pageProps[selector] as any),\n this,\n );\n this.pageSheetSize[selector] = {\n width: pageSizeAndBleed.pageWidth + pageSizeAndBleed.cropOffset * 2,\n height: pageSizeAndBleed.pageHeight + pageSizeAndBleed.cropOffset * 2,\n };\n });\n return frame.result();\n }\n\n private matchStartPageSide(side: string): boolean {\n const isRectoStart =\n this.pageNumberOffset % 2 == (this.isVersoFirstPage ? 1 : 0);\n const isLTR = this.pageProgression == Constants.PageProgression.LTR;\n switch (side) {\n case \"left\":\n return isRectoStart !== isLTR;\n case \"right\":\n return isRectoStart === isLTR;\n case \"recto\":\n return isRectoStart;\n case \"verso\":\n return !isRectoStart;\n default:\n return true;\n }\n }\n\n /**\n * @override\n */\n getStylerForDoc(xmldoc: XmlDoc.XMLDocHolder): CssStyler.AbstractStyler {\n let styler = this.stylerMap[xmldoc.url];\n if (!styler) {\n const style = this.style.store.getStyleForDoc(xmldoc);\n\n // We need a separate content, so that variables can get potentially\n // different values.\n const context = new Exprs.Context(\n style.rootScope,\n this.pageWidth(),\n this.pageHeight(),\n this.initialFontSize,\n );\n const counterListener = this.counterStore.createCounterListener(\n xmldoc.url,\n );\n const counterResolver = this.counterStore.createCounterResolver(\n xmldoc.url,\n style.rootScope,\n style.pageScope,\n );\n styler = new CssStyler.Styler(\n xmldoc,\n style.cascade,\n style.rootScope,\n context,\n this.primaryFlows,\n style.validatorSet,\n counterListener,\n counterResolver,\n );\n this.stylerMap[xmldoc.url] = styler;\n }\n return styler;\n }\n\n /**\n * @override\n */\n registerInstance(key: string, instance: PageMaster.PageBoxInstance): void {\n this.pageBoxInstances[key] = instance;\n }\n\n /**\n * @override\n */\n lookupInstance(key: string): PageMaster.PageBoxInstance {\n return this.pageBoxInstances[key];\n }\n\n /**\n * @override\n */\n encounteredFlowChunk(flowChunk: Vtree.FlowChunk, flow: Vtree.Flow): any {\n const cp = this.currentLayoutPosition;\n if (cp) {\n if (!cp.flows[flowChunk.flowName]) {\n cp.flows[flowChunk.flowName] = flow;\n } else {\n flow = cp.flows[flowChunk.flowName];\n }\n let flowPosition = cp.flowPositions[flowChunk.flowName];\n if (!flowPosition) {\n flowPosition = new Vtree.FlowPosition();\n cp.flowPositions[flowChunk.flowName] = flowPosition;\n }\n const nodePosition = Vtree.newNodePositionFromNode(flowChunk.element);\n const chunkPosition = new Vtree.ChunkPosition(nodePosition);\n const flowChunkPosition = new Vtree.FlowChunkPosition(\n chunkPosition,\n flowChunk,\n );\n flowPosition.positions.push(flowChunkPosition);\n }\n }\n\n getConsumedOffset(flowPosition: Vtree.FlowPosition): number {\n let offset = Number.POSITIVE_INFINITY;\n for (let i = 0; i < flowPosition.positions.length; i++) {\n const pos = flowPosition.positions[i].chunkPosition.primary;\n let node = pos.steps[0].node;\n let offsetInNode = pos.offsetInNode;\n let after = pos.after;\n let k = 0;\n while (node.ownerDocument != this.xmldoc.document) {\n k++;\n node = pos.steps[k].node;\n after = false;\n offsetInNode = 0;\n }\n const chunkOffset = this.xmldoc.getNodeOffset(node, offsetInNode, after);\n if (chunkOffset < offset) {\n offset = chunkOffset;\n }\n }\n return offset;\n }\n\n /**\n * @param noLookAhead Do not look ahead elements that are not styled yet\n * @return document offset of the given layoutPosition\n */\n getPosition(\n layoutPosition?: Vtree.LayoutPosition,\n noLookAhead?: boolean,\n ): number {\n if (!layoutPosition) {\n return 0;\n }\n let currentPosition = Number.POSITIVE_INFINITY;\n for (const flowName in this.primaryFlows) {\n let flowPosition = layoutPosition.flowPositions[flowName];\n if (\n !noLookAhead &&\n (!flowPosition || flowPosition.positions.length == 0) &&\n this.currentLayoutPosition\n ) {\n this.styler.styleUntilFlowIsReached(flowName);\n flowPosition = this.currentLayoutPosition.flowPositions[flowName];\n if (layoutPosition != this.currentLayoutPosition) {\n if (flowPosition) {\n flowPosition = flowPosition.clone();\n layoutPosition.flowPositions[flowName] = flowPosition;\n }\n }\n }\n if (flowPosition) {\n const consumedOffset = this.getConsumedOffset(flowPosition);\n if (consumedOffset < currentPosition) {\n currentPosition = consumedOffset;\n }\n }\n }\n return currentPosition;\n }\n\n dumpLocation(position) {\n Logging.logger.debug(\"Location - page\", this.currentLayoutPosition.page);\n Logging.logger.debug(\" current:\", position);\n Logging.logger.debug(\" lookup:\", this.lookupOffset);\n for (const flowName in this.currentLayoutPosition.flowPositions) {\n const flowPosition = this.currentLayoutPosition.flowPositions[flowName];\n for (const p of flowPosition.positions) {\n Logging.logger.debug(\n \" Chunk\",\n `${flowName}:`,\n p.flowChunk.startOffset,\n );\n }\n }\n }\n\n matchPageSide(side: string): boolean {\n switch (side) {\n case \"left\":\n case \"right\":\n case \"recto\":\n case \"verso\":\n return new Exprs.Named(this.style.pageScope, `${side}-page`).evaluate(\n this,\n ) as boolean;\n default:\n return true;\n }\n }\n\n updateStartSide(layoutPosition: Vtree.LayoutPosition) {\n for (const name in layoutPosition.flowPositions) {\n const flowPos = layoutPosition.flowPositions[name];\n if (flowPos && flowPos.positions.length > 0) {\n const flowChunk = flowPos.positions[0].flowChunk;\n if (this.getConsumedOffset(flowPos) === flowChunk.startOffset) {\n const flowChunkBreakBefore =\n flowPos.positions[0].flowChunk.breakBefore;\n const flowBreakAfter = Break.startSideValueToBreakValue(\n flowPos.startSide,\n );\n flowPos.startSide = Break.breakValueToStartSideValue(\n Break.resolveEffectiveBreakValue(\n flowBreakAfter,\n flowChunkBreakBefore,\n ),\n );\n }\n }\n }\n }\n\n /**\n * @param cascadedPageStyle Cascaded page style specified in page context\n */\n selectPageMaster(\n cascadedPageStyle: CssCascade.ElementStyle,\n ): PageMaster.PageMasterInstance {\n const cp = this.currentLayoutPosition;\n\n // 3.5. Page Layout Processing Model\n // 1. Determine current position in the document: Find the minimal\n // consumed-offset for all elements not fully-consumed in each primary flow.\n // Current position is maximum of the results among all primary flows.\n const currentPosition = this.getPosition(cp);\n if (currentPosition == Number.POSITIVE_INFINITY) {\n // end of primary content is reached\n return null;\n }\n\n // 2. Page master selection: for each page master:\n const pageMasters = this.rootPageBoxInstance\n .children as PageMaster.PageMasterInstance[];\n let pageMaster: PageMaster.PageMasterInstance;\n for (let i = 0; i < pageMasters.length; i++) {\n pageMaster = pageMasters[i];\n\n // Skip a page master generated for @page rules\n if (pageMaster.pageBox.pseudoName === CssPage.pageRuleMasterPseudoName) {\n continue;\n }\n let coeff = 1;\n\n // A. Calculate lookup position using current position and utilization\n // (see -epubx-utilization property)\n const utilization = pageMaster.getProp(this, \"utilization\");\n if (utilization && utilization.isNum()) {\n coeff = (utilization as Css.Num).num;\n }\n const em = this.queryUnitSize(\"em\", false);\n const pageArea = this.pageWidth() * this.pageHeight();\n const lookup = Math.ceil((coeff * pageArea) / (em * em));\n\n // B. Determine element eligibility. Each element in a flow is considered\n // eligible if it is is not marked as fully consumed and it comes in the\n // document before the lookup position. Feed lookupOffset and flow\n // availability into the context\n this.lookupOffset = this.styler.styleUntil(currentPosition, lookup);\n Asserts.assert(cp);\n this.updateStartSide(cp);\n\n // update layoutPositionAtPageStart since startSide of FlowChunks may be\n // updated\n this.layoutPositionAtPageStart = cp.clone();\n this.initLingering();\n this.clearScope(this.style.pageScope);\n\n // C. Determine content availability. Flow has content available if it\n // contains eligible elements. D. Determine if page master is enabled\n // using rules in Section 3.4.7\n const enabled = pageMaster.getProp(this, \"enabled\");\n\n // E. First enabled page master is used for the next page\n if (!enabled || enabled === Css.ident._true) {\n if (VIVLIOSTYLE_DEBUG) {\n this.dumpLocation(currentPosition);\n }\n\n // The blank page caused by a spread break between two documents\n // should have no margin box content (issue #666)\n if (cp.page === 1 && this.blankPageAtStart) {\n pageMaster.style = {}; // clear root background-color/image\n cascadedPageStyle = {}; // clear margin boxes\n // TODO: support the :blank page selector\n }\n\n // Apply @page rules\n return this.pageManager.getPageRulePageMaster(\n pageMaster,\n cascadedPageStyle,\n );\n }\n }\n throw new Error(\"No enabled page masters\");\n }\n\n flowChunkIsAfterParentFlowForcedBreak(flowChunk: Vtree.FlowChunk): boolean {\n const flows = this.layoutPositionAtPageStart.flows;\n const parentFlowName = flows[flowChunk.flowName].parentFlowName;\n if (parentFlowName) {\n const startOffset = flowChunk.startOffset;\n const forcedBreakOffsets = flows[parentFlowName].forcedBreakOffsets;\n if (!forcedBreakOffsets.length || startOffset < forcedBreakOffsets[0]) {\n return false;\n }\n const breakOffsetBeforeStartIndex =\n Base.binarySearch(\n forcedBreakOffsets.length,\n (i) => forcedBreakOffsets[i] > startOffset,\n ) - 1;\n const breakOffsetBeforeStart =\n forcedBreakOffsets[breakOffsetBeforeStartIndex];\n const parentFlowPosition = this.layoutPositionAtPageStart.flowPositions[\n parentFlowName\n ];\n const parentStartOffset = this.getConsumedOffset(parentFlowPosition);\n if (breakOffsetBeforeStart < parentStartOffset) {\n return false;\n }\n if (parentStartOffset < breakOffsetBeforeStart) {\n return true;\n }\n\n // Special case: parentStartOffset === breakOffsetBeforeStart\n // In this case, the flowChunk can be used if the start side of the parent\n // flow matches the current page side.\n return !this.matchPageSide(parentFlowPosition.startSide);\n }\n return false;\n }\n\n setFormattingContextToColumn(column: LayoutType.Column, flowName: string) {\n const flow = this.currentLayoutPosition.flows[flowName];\n if (!flow.formattingContext) {\n flow.formattingContext = new LayoutProcessor.BlockFormattingContext(null);\n }\n column.flowRootFormattingContext = flow.formattingContext;\n }\n\n layoutDeferredPageFloats(column: LayoutType.Column): Task.Result<boolean> {\n const pageFloatLayoutContext = column.pageFloatLayoutContext;\n const deferredFloats = pageFloatLayoutContext.getDeferredPageFloatContinuations();\n\n // Prevent deferred page floats from appearing in the preceding pages,\n // e.g., during re-layout the TOC page with target-counter() referencing\n // later sections containing page floats.\n if (\n deferredFloats.length &&\n deferredFloats[0].float.floatReference === \"page\"\n ) {\n const deferredFloatNode = deferredFloats[0].nodePosition.steps[0].node;\n const deferredFloatOffset =\n deferredFloatNode &&\n this.xmldoc.getNodeOffset(deferredFloatNode, 0, false);\n const pageStartPos = this.layoutPositionAtPageStart.flowPositions.body;\n const pageStartOffset =\n pageStartPos && this.getConsumedOffset(pageStartPos);\n if (\n deferredFloatOffset != null &&\n pageStartOffset != null &&\n deferredFloatOffset > pageStartOffset\n ) {\n return Task.newResult(true);\n }\n }\n\n const frame = Task.newFrame<boolean>(\"layoutDeferredPageFloats\");\n let invalidated = false;\n let i = 0;\n frame\n .loopWithFrame((loopFrame) => {\n if (i === deferredFloats.length) {\n loopFrame.breakLoop();\n return;\n }\n const continuation = deferredFloats[i++];\n const float = continuation.float;\n const strategy = new PageFloats.PageFloatLayoutStrategyResolver().findByFloat(\n float,\n );\n const pageFloatFragment = strategy.findPageFloatFragment(\n float,\n pageFloatLayoutContext,\n );\n if (pageFloatFragment && pageFloatFragment.hasFloat(float)) {\n loopFrame.continueLoop();\n return;\n } else if (\n pageFloatLayoutContext.isForbidden(float) ||\n pageFloatLayoutContext.hasPrecedingFloatsDeferredToNext(float)\n ) {\n pageFloatLayoutContext.deferPageFloat(continuation);\n loopFrame.breakLoop();\n return;\n }\n column\n .layoutPageFloatInner(continuation, strategy, null, pageFloatFragment)\n .then((success) => {\n if (!success) {\n loopFrame.breakLoop();\n return;\n }\n const parentInvalidated = pageFloatLayoutContext.parent.isInvalidated();\n if (parentInvalidated) {\n loopFrame.breakLoop();\n return;\n } else if (\n pageFloatLayoutContext.isInvalidated() &&\n !parentInvalidated\n ) {\n invalidated = true;\n pageFloatLayoutContext.validate();\n }\n loopFrame.continueLoop();\n });\n })\n .then(() => {\n if (invalidated) {\n pageFloatLayoutContext.invalidate();\n }\n frame.finish(true);\n });\n return frame.result();\n }\n\n getLastAfterPositionIfDeferredFloatsExists(\n column: LayoutType.Column,\n newPosition: Vtree.ChunkPosition | null,\n ): Vtree.ChunkPosition | null {\n const pageFloatLayoutContext = column.pageFloatLayoutContext;\n const deferredFloats = pageFloatLayoutContext.getPageFloatContinuationsDeferredToNext();\n if (deferredFloats.length > 0) {\n if (column.lastAfterPosition) {\n let result: Vtree.ChunkPosition;\n if (newPosition) {\n // Need overflown footnotes owned by newPosition\n result = newPosition.clone();\n result.primary = column.lastAfterPosition;\n } else {\n result = new Vtree.ChunkPosition(column.lastAfterPosition);\n }\n return result;\n } else {\n Asserts.assert(\"column.lastAfterPosition === null\");\n return null;\n }\n } else {\n return null;\n }\n }\n\n /**\n * @return holding true\n */\n layoutColumn(\n column: LayoutType.Column,\n flowName: string,\n ): Task.Result<boolean> {\n const flowPosition = this.currentLayoutPosition.flowPositions[flowName];\n if (!flowPosition || !this.matchPageSide(flowPosition.startSide)) {\n return Task.newResult(true);\n }\n flowPosition.startSide = \"any\";\n this.setFormattingContextToColumn(column, flowName);\n column.init();\n if (this.primaryFlows[flowName] && column.bands.length > 0) {\n // In general, we force non-fitting content. Exception is only for primary\n // flow columns that have exclusions.\n column.forceNonfitting = false;\n }\n const frame: Task.Frame<boolean> = Task.newFrame(\"layoutColumn\");\n this.layoutDeferredPageFloats(column).then(() => {\n if (column.pageFloatLayoutContext.isInvalidated()) {\n frame.finish(true);\n return;\n }\n\n // Record indices of repeated positions and removed positions\n const repeatedIndices = [] as number[];\n const removedIndices = [] as number[];\n let leadingEdge = true;\n frame\n .loopWithFrame((loopFrame) => {\n if (\n column.pageFloatLayoutContext.hasContinuingFloatFragmentsInFlow(\n flowName,\n )\n ) {\n loopFrame.breakLoop();\n return;\n }\n while (flowPosition.positions.length - removedIndices.length > 0) {\n let index = 0;\n\n // Skip all removed positions\n while (removedIndices.includes(index)) {\n index++;\n }\n let selected = flowPosition.positions[index];\n if (\n selected.flowChunk.startOffset > this.lookupOffset ||\n this.flowChunkIsAfterParentFlowForcedBreak(selected.flowChunk)\n ) {\n break;\n }\n for (let k = index + 1; k < flowPosition.positions.length; k++) {\n if (removedIndices.includes(k)) {\n continue; // Skip removed positions\n }\n const alt = flowPosition.positions[k];\n if (\n alt.flowChunk.startOffset > this.lookupOffset ||\n this.flowChunkIsAfterParentFlowForcedBreak(alt.flowChunk)\n ) {\n break;\n }\n if (alt.flowChunk.isBetter(selected.flowChunk)) {\n selected = alt;\n index = k;\n }\n }\n const flowChunk = selected.flowChunk;\n let pending = true;\n column\n .layout(\n selected.chunkPosition,\n leadingEdge,\n flowPosition.breakAfter,\n )\n .then((newPosition) => {\n if (column.pageFloatLayoutContext.isInvalidated()) {\n loopFrame.breakLoop();\n return;\n }\n leadingEdge = false;\n\n // static: keep in the flow\n if (\n selected.flowChunk.repeated &&\n (newPosition === null || flowChunk.exclusive)\n ) {\n repeatedIndices.push(index);\n }\n if (flowChunk.exclusive) {\n // exclusive, only can have one, remove from the flow even\n // if it did not fit\n removedIndices.push(index);\n loopFrame.breakLoop();\n return;\n } else {\n // not exclusive\n const endOfColumn = !!newPosition || !!column.pageBreakType;\n const lastAfterPosition = this.getLastAfterPositionIfDeferredFloatsExists(\n column,\n newPosition,\n );\n if (column.pageBreakType && lastAfterPosition) {\n selected.chunkPosition = lastAfterPosition;\n\n // TODO propagate pageBreakType\n flowPosition.breakAfter = column.pageBreakType;\n column.pageBreakType = null;\n } else {\n // go to the next element in the flow\n removedIndices.push(index);\n if (newPosition || lastAfterPosition) {\n // did not fit completely\n selected.chunkPosition = newPosition || lastAfterPosition;\n repeatedIndices.push(index);\n }\n if (column.pageBreakType) {\n // forced break\n flowPosition.startSide = Break.breakValueToStartSideValue(\n column.pageBreakType,\n );\n }\n }\n if (endOfColumn) {\n loopFrame.breakLoop();\n return;\n }\n }\n\n // Since at least one flowChunk has been placed in the\n // column, the next flowChunk of the flow can be deferred to\n // the next partition if there is not enough space in the\n // current partition.\n column.forceNonfitting = false;\n if (pending) {\n // Sync result\n pending = false;\n } else {\n // Async result\n loopFrame.continueLoop();\n }\n });\n if (pending) {\n // Async result\n pending = false;\n return;\n }\n }\n\n // Sync result\n loopFrame.breakLoop();\n })\n .then(() => {\n if (!column.pageFloatLayoutContext.isInvalidated()) {\n // Keep positions repeated or not removed\n flowPosition.positions = flowPosition.positions.filter(\n (pos, i) =>\n repeatedIndices.includes(i) || !removedIndices.includes(i),\n );\n if (flowPosition.breakAfter === \"column\") {\n flowPosition.breakAfter = null;\n }\n column.saveDistanceToBlockEndFloats();\n const edge = column.pageFloatLayoutContext.getMaxReachedAfterEdge();\n column.updateMaxReachedAfterEdge(edge);\n }\n frame.finish(true);\n });\n });\n return frame.result();\n }\n\n createLayoutConstraint(\n pageFloatLayoutContext: PageFloats.PageFloatLayoutContext,\n ): LayoutType.LayoutConstraint {\n const pageIndex = this.currentLayoutPosition.page - 1;\n const counterConstraint = this.counterStore.createLayoutConstraint(\n pageIndex,\n );\n return new Layout.AllLayoutConstraint(\n [counterConstraint].concat(pageFloatLayoutContext.getLayoutConstraints()),\n );\n }\n\n private createAndLayoutColumn(\n boxInstance: PageMaster.PageBoxInstance,\n offsetX: number,\n offsetY: number,\n exclusions: GeometryUtil.Shape[],\n layoutContainer: Vtree.Container,\n currentColumnIndex: number,\n flowNameStr: string,\n regionPageFloatLayoutContext: PageFloats.PageFloatLayoutContext,\n columnCount: number,\n columnGap: number,\n columnWidth: number,\n innerShape: GeometryUtil.Shape,\n layoutContext: Vtree.LayoutContext,\n forceNonFitting: boolean,\n ): Task.Result<LayoutType.Column> {\n const dontApplyExclusions = boxInstance.vertical\n ? boxInstance.isAutoWidth && boxInstance.isRightDependentOnAutoWidth\n : boxInstance.isAutoHeight && boxInstance.isTopDependentOnAutoHeight;\n const boxContainer = layoutContainer.element;\n const columnPageFloatLayoutContext = new PageFloats.PageFloatLayoutContext(\n regionPageFloatLayoutContext,\n PageFloats.FloatReference.COLUMN,\n null,\n flowNameStr,\n null,\n null,\n null,\n );\n const positionAtColumnStart = this.currentLayoutPosition.clone();\n const frame: Task.Frame<LayoutType.Column> = Task.newFrame(\n \"createAndLayoutColumn\",\n );\n let column: LayoutType.Column;\n frame\n .loopWithFrame((loopFrame) => {\n const layoutConstraint = this.createLayoutConstraint(\n columnPageFloatLayoutContext,\n );\n if (columnCount > 1) {\n const columnContainer = this.viewport.document.createElement(\"div\");\n Base.setCSSProperty(columnContainer, \"position\", \"absolute\");\n boxContainer.appendChild(columnContainer);\n column = new Layout.Column(\n columnContainer,\n layoutContext,\n this.clientLayout,\n layoutConstraint,\n columnPageFloatLayoutContext,\n );\n column.forceNonfitting = forceNonFitting;\n column.vertical = layoutContainer.vertical;\n column.snapHeight = layoutContainer.snapHeight;\n column.snapWidth = layoutContainer.snapWidth;\n if (layoutContainer.vertical) {\n const columnY =\n currentColumnIndex * (columnWidth + columnGap) +\n layoutContainer.paddingTop;\n column.setHorizontalPosition(\n layoutContainer.paddingLeft,\n layoutContainer.width,\n );\n column.setVerticalPosition(columnY, columnWidth);\n } else {\n const columnX =\n currentColumnIndex * (columnWidth + columnGap) +\n layoutContainer.paddingLeft;\n column.setVerticalPosition(\n layoutContainer.paddingTop,\n layoutContainer.height,\n );\n column.setHorizontalPosition(columnX, columnWidth);\n }\n column.originX = offsetX;\n column.originY = offsetY;\n } else {\n column = new Layout.Column(\n boxContainer,\n layoutContext,\n this.clientLayout,\n layoutConstraint,\n columnPageFloatLayoutContext,\n );\n column.copyFrom(layoutContainer);\n }\n column.exclusions = dontApplyExclusions ? [] : exclusions.concat();\n column.innerShape = innerShape;\n columnPageFloatLayoutContext.setContainer(column);\n if (column.width >= 0) {\n // column.element.style.outline = \"1px dotted green\";\n this.layoutColumn(column, flowNameStr).then(() => {\n if (!columnPageFloatLayoutContext.isInvalidated()) {\n columnPageFloatLayoutContext.finish();\n }\n if (\n column.pageFloatLayoutContext.isInvalidated() &&\n !regionPageFloatLayoutContext.isInvalidated()\n ) {\n column.pageFloatLayoutContext.validate();\n this.currentLayoutPosition = positionAtColumnStart.clone();\n if (column.element !== boxContainer) {\n boxContainer.removeChild(column.element);\n }\n loopFrame.continueLoop();\n } else {\n loopFrame.breakLoop();\n }\n });\n } else {\n columnPageFloatLayoutContext.finish();\n loopFrame.breakLoop();\n }\n })\n .then(() => {\n frame.finish(column);\n });\n return frame.result();\n }\n\n setPagePageFloatLayoutContextContainer(\n pagePageFloatLayoutContext: PageFloats.PageFloatLayoutContext,\n boxInstance: PageMaster.PageBoxInstance,\n layoutContainer: Vtree.Container,\n ) {\n if (\n boxInstance instanceof CssPage.PageRulePartitionInstance ||\n (boxInstance instanceof PageMaster.PageMasterInstance &&\n !(boxInstance instanceof CssPage.PageRuleMasterInstance))\n ) {\n pagePageFloatLayoutContext.setContainer(layoutContainer);\n }\n }\n\n getRegionPageFloatLayoutContext(\n pagePageFloatLayoutContext: PageFloats.PageFloatLayoutContext,\n boxInstance: PageMaster.PageBoxInstance,\n layoutContainer: Vtree.Container,\n flowName: string,\n ): PageFloats.PageFloatLayoutContext {\n Asserts.assert(boxInstance instanceof PageMaster.PartitionInstance);\n const writingMode = boxInstance.getProp(this, \"writing-mode\") || null;\n const direction = boxInstance.getProp(this, \"direction\") || null;\n return new PageFloats.PageFloatLayoutContext(\n pagePageFloatLayoutContext,\n PageFloats.FloatReference.REGION,\n layoutContainer,\n flowName,\n null,\n writingMode,\n direction,\n );\n }\n\n layoutFlowColumnsWithBalancing(\n page: Vtree.Page,\n boxInstance: PageMaster.PageBoxInstance,\n offsetX: number,\n offsetY: number,\n exclusions: GeometryUtil.Shape[],\n pagePageFloatLayoutContext: PageFloats.PageFloatLayoutContext,\n layoutContainer: Vtree.Container,\n flowNameStr: string,\n columnCount: number,\n ): Task.Result<LayoutType.Column[]> {\n const positionAtContainerStart = this.currentLayoutPosition.clone();\n const regionPageFloatLayoutContext = this.getRegionPageFloatLayoutContext(\n pagePageFloatLayoutContext,\n boxInstance,\n layoutContainer,\n flowNameStr,\n );\n let isFirstTime = true;\n\n const layoutColumns = () => {\n this.currentLayoutPosition = positionAtContainerStart.clone();\n return this.layoutFlowColumns(\n page,\n boxInstance,\n offsetX,\n offsetY,\n exclusions,\n pagePageFloatLayoutContext,\n regionPageFloatLayoutContext,\n layoutContainer,\n flowNameStr,\n columnCount,\n isFirstTime,\n ).thenAsync((columns) => {\n if (columns) {\n return Task.newResult({\n columns,\n position: this.currentLayoutPosition,\n });\n } else {\n return Task.newResult(null);\n }\n });\n };\n\n return layoutColumns().thenAsync((generatorResult) => {\n if (!generatorResult) {\n return Task.newResult(null);\n }\n if (columnCount <= 1) {\n return Task.newResult(generatorResult.columns);\n }\n const columnFill =\n (boxInstance.getProp(this, \"column-fill\") as Css.Ident) ||\n Css.ident.balance;\n const flowPosition = this.currentLayoutPosition.flowPositions[\n flowNameStr\n ];\n Asserts.assert(flowPosition);\n const columnBalancer = Columns.createColumnBalancer(\n columnCount,\n columnFill,\n layoutColumns,\n regionPageFloatLayoutContext,\n layoutContainer,\n generatorResult.columns,\n flowPosition,\n );\n if (!columnBalancer) {\n return Task.newResult(generatorResult.columns);\n }\n isFirstTime = false;\n pagePageFloatLayoutContext.lock();\n regionPageFloatLayoutContext.lock();\n return columnBalancer\n .balanceColumns(generatorResult)\n .thenAsync((result) => {\n pagePageFloatLayoutContext.unlock();\n pagePageFloatLayoutContext.validate();\n regionPageFloatLayoutContext.unlock();\n this.currentLayoutPosition = result.position;\n return Task.newResult(result.columns);\n });\n });\n }\n\n layoutFlowColumns(\n page: Vtree.Page,\n boxInstance: PageMaster.PageBoxInstance,\n offsetX: number,\n offsetY: number,\n exclusions: GeometryUtil.Shape[],\n pagePageFloatLayoutContext: PageFloats.PageFloatLayoutContext,\n regionPageFloatLayoutContext: PageFloats.PageFloatLayoutContext,\n layoutContainer: Vtree.Container,\n flowNameStr: string,\n columnCount: number,\n forceNonFitting: boolean,\n ): Task.Result<LayoutType.Column[] | null> {\n const frame: Task.Frame<LayoutType.Column[] | null> = Task.newFrame(\n \"layoutFlowColumns\",\n );\n const positionAtContainerStart = this.currentLayoutPosition.clone();\n const columnGap = boxInstance.getPropAsNumber(this, \"column-gap\");\n\n // Don't query columnWidth when it's not needed, so that width calculation\n // can be delayed for width: auto columns.\n const columnWidth =\n columnCount > 1\n ? boxInstance.getPropAsNumber(this, \"column-width\")\n : layoutContainer.width;\n const regionIds = boxInstance.getActiveRegions(this);\n const innerShapeVal = boxInstance.getProp(this, \"shape-inside\");\n const innerShape = CssProp.toShape(\n innerShapeVal,\n 0,\n 0,\n layoutContainer.width,\n layoutContainer.height,\n this,\n );\n const layoutContext = new Vgen.ViewFactory(\n flowNameStr,\n this,\n this.viewport,\n this.styler,\n regionIds,\n this.xmldoc,\n this.faces,\n this.style.footnoteProps,\n this,\n page,\n this.customRenderer,\n this.fallbackMap,\n this.documentURLTransformer,\n );\n let columnIndex = 0;\n let column: LayoutType.Column = null;\n let columns: LayoutType.Column[] = [];\n frame\n .loopWithFrame((loopFrame) => {\n this.createAndLayoutColumn(\n boxInstance,\n offsetX,\n offsetY,\n exclusions,\n layoutContainer,\n columnIndex++,\n flowNameStr,\n regionPageFloatLayoutContext,\n columnCount,\n columnGap,\n columnWidth,\n innerShape,\n layoutContext,\n forceNonFitting,\n ).then((c) => {\n if (pagePageFloatLayoutContext.isInvalidated()) {\n columns = null;\n loopFrame.breakLoop();\n return;\n }\n const forcedRegionBreak =\n !!c.pageBreakType && c.pageBreakType !== \"column\";\n if (\n (forcedRegionBreak || columnIndex === columnCount) &&\n !regionPageFloatLayoutContext.isInvalidated()\n ) {\n regionPageFloatLayoutContext.finish();\n }\n if (regionPageFloatLayoutContext.isInvalidated()) {\n columnIndex = 0;\n this.currentLayoutPosition = positionAtContainerStart.clone();\n regionPageFloatLayoutContext.validate();\n if (regionPageFloatLayoutContext.isLocked()) {\n columns = null;\n loopFrame.breakLoop();\n } else {\n loopFrame.continueLoop();\n }\n return;\n }\n column = c;\n columns[columnIndex - 1] = column;\n if (column.pageBreakType) {\n if (column.pageBreakType != \"column\") {\n // skip remaining columns\n columnIndex = columnCount;\n if (column.pageBreakType != \"region\") {\n // skip remaining regions\n this.pageBreaks[flowNameStr] = true;\n }\n }\n }\n if (columnIndex < columnCount) {\n loopFrame.continueLoop();\n } else {\n loopFrame.breakLoop();\n }\n });\n })\n .then(() => {\n frame.finish(columns);\n });\n return frame.result();\n }\n\n /**\n * @return holding true\n */\n layoutContainer(\n page: Vtree.Page,\n boxInstance: PageMaster.PageBoxInstance,\n parentContainer: HTMLElement,\n offsetX: number,\n offsetY: number,\n exclusions: GeometryUtil.Shape[],\n pagePageFloatLayoutContext: PageFloats.PageFloatLayoutContext,\n ): Task.Result<boolean> {\n boxInstance.reset();\n const enabled = boxInstance.getProp(this, \"enabled\");\n if (enabled && enabled !== Css.ident._true) {\n return Task.newResult(true);\n }\n const frame: Task.Frame<boolean> = Task.newFrame(\"layoutContainer\");\n const wrapFlow = boxInstance.getProp(this, \"wrap-flow\");\n const dontExclude = wrapFlow === Css.ident.auto;\n const flowName = boxInstance.getProp(this, \"flow-from\");\n const boxContainer = this.viewport.document.createElement(\"div\");\n const position = boxInstance.getProp(this, \"position\");\n Base.setCSSProperty(\n boxContainer,\n \"position\",\n position ? (position as any).name : \"absolute\",\n );\n\n // The -epubx-page-master partitions are laid out in the reverse order\n // (see the spec http://idpf.org/epub/pgt/ ),\n // but for css-page rules, now use forward order, i.e., the page-area first.\n // This is necessary for running headers named strings support.\n const forwardOrderInLayout =\n boxInstance instanceof CssPage.PageRuleMasterInstance;\n const forwardOrderInTree =\n boxInstance instanceof PageMaster.PartitionInstance;\n\n if (forwardOrderInTree) {\n parentContainer.appendChild(boxContainer);\n } else {\n parentContainer.insertBefore(boxContainer, parentContainer.firstChild);\n }\n\n let layoutContainer = new Vtree.Container(boxContainer);\n layoutContainer.vertical = boxInstance.vertical;\n layoutContainer.exclusions = exclusions;\n boxInstance.prepareContainer(\n this,\n layoutContainer,\n page,\n this.faces,\n this.clientLayout,\n );\n layoutContainer.originX = offsetX;\n layoutContainer.originY = offsetY;\n offsetX +=\n layoutContainer.left +\n layoutContainer.marginLeft +\n layoutContainer.borderLeft;\n offsetY +=\n layoutContainer.top +\n layoutContainer.marginTop +\n layoutContainer.borderTop;\n this.setPagePageFloatLayoutContextContainer(\n pagePageFloatLayoutContext,\n boxInstance,\n layoutContainer,\n );\n let cont: Task.Result<boolean>;\n let removed = false;\n if (!flowName || !flowName.isIdent()) {\n const contentVal = boxInstance.getProp(this, \"content\");\n if (contentVal && Vtree.nonTrivialContent(contentVal)) {\n let innerContainerTag = \"span\";\n if ((contentVal as any).url) {\n innerContainerTag = \"img\";\n }\n const innerContainer = this.viewport.document.createElement(\n innerContainerTag,\n );\n contentVal.visit(\n new Vtree.ContentPropertyHandler(\n innerContainer,\n this,\n contentVal,\n this.counterStore.getExprContentListener(),\n ),\n );\n boxContainer.appendChild(innerContainer);\n if (innerContainerTag == \"img\") {\n boxInstance.transferSinglUriContentProps(\n this,\n innerContainer,\n this.faces,\n );\n }\n boxInstance.transferContentProps(\n this,\n layoutContainer,\n page,\n this.faces,\n );\n } else if (boxInstance.suppressEmptyBoxGeneration) {\n parentContainer.removeChild(boxContainer);\n removed = true;\n }\n if (!removed) {\n boxInstance.finishContainer(\n this,\n layoutContainer,\n page,\n null,\n 1,\n this.clientLayout,\n this.faces,\n );\n }\n cont = Task.newResult(true);\n } else if (!this.pageBreaks[flowName.toString()]) {\n const innerFrame: Task.Frame<boolean> = Task.newFrame(\n \"layoutContainer.inner\",\n );\n const flowNameStr = flowName.toString();\n\n // for now only a single column in vertical case\n const columnCount = boxInstance.getPropAsNumber(this, \"column-count\");\n this.layoutFlowColumnsWithBalancing(\n page,\n boxInstance,\n offsetX,\n offsetY,\n exclusions,\n pagePageFloatLayoutContext,\n layoutContainer,\n flowNameStr,\n columnCount,\n ).then((columns) => {\n if (!pagePageFloatLayoutContext.isInvalidated()) {\n const column = columns[0];\n Asserts.assert(column);\n if (column.element === boxContainer) {\n layoutContainer = column;\n }\n layoutContainer.computedBlockSize = Math.max.apply(\n null,\n columns.map((c) => c.computedBlockSize),\n );\n boxInstance.finishContainer(\n this,\n layoutContainer,\n page,\n column,\n columnCount,\n this.clientLayout,\n this.faces,\n );\n const flowPosition = this.currentLayoutPosition.flowPositions[\n flowNameStr\n ];\n if (flowPosition && flowPosition.breakAfter === \"region\") {\n flowPosition.breakAfter = null;\n }\n }\n innerFrame.finish(true);\n });\n cont = innerFrame.result();\n } else {\n if (!pagePageFloatLayoutContext.isInvalidated()) {\n boxInstance.finishContainer(\n this,\n layoutContainer,\n page,\n null,\n 1,\n this.clientLayout,\n this.faces,\n );\n }\n cont = Task.newResult(true);\n }\n cont.then(() => {\n if (pagePageFloatLayoutContext.isInvalidated()) {\n frame.finish(true);\n return;\n }\n if (\n !boxInstance.isAutoHeight ||\n Math.floor(layoutContainer.computedBlockSize) > 0\n ) {\n if (!removed && !dontExclude) {\n const outerShapeProp = boxInstance.getProp(this, \"shape-outside\");\n const outerShape = layoutContainer.getOuterShape(\n outerShapeProp,\n this,\n );\n\n // Though it seems that LShapeFloatBug still exists in Firefox, it\n // apparently does not occur on exclusion floats. See the test file:\n // test/files/column-break-bug.html\n // if (Base.checkLShapeFloatBug(this.viewport.root)) {\n // \t// Simplistic bug workaround: add a copy of the shape translated up.\n // exclusions.push(outerShape.withOffset(0, -1.25 * this.queryUnitSize(\"em\", false)));\n // }\n exclusions.push(outerShape);\n }\n } else if (boxInstance.children.length == 0) {\n parentContainer.removeChild(boxContainer);\n frame.finish(true);\n return;\n }\n let i = forwardOrderInLayout ? 0 : boxInstance.children.length - 1;\n frame\n .loop(() => {\n while (i >= 0 && i < boxInstance.children.length) {\n const child =\n boxInstance.children[forwardOrderInLayout ? i++ : i--];\n const r = this.layoutContainer(\n page,\n child,\n boxContainer as HTMLElement,\n offsetX,\n offsetY,\n exclusions,\n pagePageFloatLayoutContext,\n );\n if (r.isPending()) {\n return r.thenAsync(() =>\n Task.newResult(!pagePageFloatLayoutContext.isInvalidated()),\n );\n } else if (pagePageFloatLayoutContext.isInvalidated()) {\n break;\n }\n }\n return Task.newResult(false);\n })\n .then(() => {\n frame.finish(true);\n });\n });\n return frame.result();\n }\n\n processLinger(): void {\n const pageNumber = this.currentLayoutPosition.page;\n for (const flowName in this.currentLayoutPosition.flowPositions) {\n const flowPosition = this.currentLayoutPosition.flowPositions[flowName];\n for (let i = flowPosition.positions.length - 1; i >= 0; i--) {\n const pos = flowPosition.positions[i];\n if (\n pos.flowChunk.startPage >= 0 &&\n pos.flowChunk.startPage + pos.flowChunk.linger - 1 <= pageNumber\n ) {\n flowPosition.positions.splice(i, 1);\n }\n }\n }\n }\n\n initLingering(): void {\n const pageNumber = this.currentLayoutPosition.page;\n for (const flowName in this.currentLayoutPosition.flowPositions) {\n const flowPosition = this.currentLayoutPosition.flowPositions[flowName];\n for (let i = flowPosition.positions.length - 1; i >= 0; i--) {\n const pos = flowPosition.positions[i];\n if (\n pos.flowChunk.startPage < 0 &&\n pos.flowChunk.startOffset < this.lookupOffset\n ) {\n pos.flowChunk.startPage = pageNumber;\n }\n }\n }\n }\n\n noMorePrimaryFlows(cp: Vtree.LayoutPosition): boolean {\n for (const flowName in this.primaryFlows) {\n const flowPosition = cp.flowPositions[flowName];\n if (flowPosition && flowPosition.positions.length > 0) {\n return false;\n }\n }\n return true;\n }\n\n layoutNextPage(\n page: Vtree.Page,\n cp?: Vtree.LayoutPosition,\n ): Task.Result<Vtree.LayoutPosition> {\n // TOC box is special page container, no pagination\n const isTocBox = page.container === page.bleedBox;\n\n this.pageBreaks = {};\n if (cp) {\n this.currentLayoutPosition = cp.clone();\n this.styler.replayFlowElementsFromOffset(cp.highestSeenOffset);\n } else {\n this.currentLayoutPosition = new Vtree.LayoutPosition();\n this.styler.replayFlowElementsFromOffset(-1);\n }\n if (this.lang) {\n page.bleedBox.setAttribute(\"lang\", this.lang);\n }\n cp = this.currentLayoutPosition;\n cp.page++;\n this.clearScope(this.style.pageScope);\n this.layoutPositionAtPageStart = cp.clone();\n\n // Resolve page size before page master selection.\n const cascadedPageStyle = isTocBox\n ? ({} as CssCascade.ElementStyle)\n : this.pageManager.getCascadedPageStyle();\n const pageMaster = this.selectPageMaster(cascadedPageStyle);\n if (!pageMaster) {\n // end of primary content\n return Task.newResult(null as Vtree.LayoutPosition);\n }\n let bleedBoxPaddingEdge = 0;\n if (!isTocBox) {\n page.setAutoPageWidth(\n pageMaster.pageBox.specified[\"width\"].value === Css.fullWidth,\n );\n page.setAutoPageHeight(\n pageMaster.pageBox.specified[\"height\"].value === Css.fullHeight,\n );\n this.counterStore.setCurrentPage(page);\n this.counterStore.updatePageCounters(cascadedPageStyle, this);\n\n // setup bleed area and crop marks\n const evaluatedPageSizeAndBleed = CssPage.evaluatePageSizeAndBleed(\n CssPage.resolvePageSizeAndBleed(cascadedPageStyle as any),\n this,\n );\n this.setPageSizeAndBleed(evaluatedPageSizeAndBleed, page);\n CssPage.addPrinterMarks(\n cascadedPageStyle,\n evaluatedPageSizeAndBleed,\n page,\n this,\n );\n bleedBoxPaddingEdge =\n evaluatedPageSizeAndBleed.bleedOffset + evaluatedPageSizeAndBleed.bleed;\n }\n\n const writingMode =\n (!isTocBox && pageMaster.getProp(this, \"writing-mode\")) ||\n Css.ident.horizontal_tb;\n\n this.pageVertical = writingMode != Css.ident.horizontal_tb;\n\n const direction = pageMaster.getProp(this, \"direction\") || Css.ident.ltr;\n const pageFloatLayoutContext = new PageFloats.PageFloatLayoutContext(\n this.rootPageFloatLayoutContext,\n PageFloats.FloatReference.PAGE,\n null,\n null,\n null,\n writingMode,\n direction,\n );\n const frame: Task.Frame<Vtree.LayoutPosition> = Task.newFrame(\n \"layoutNextPage\",\n );\n frame\n .loopWithFrame((loopFrame) => {\n // this.layoutContainer(page, pageMaster, page.bleedBox, bleedBoxPaddingEdge, bleedBoxPaddingEdge+1, // Compensate 'top: -1px' on page master\n this.layoutContainer(\n page,\n pageMaster,\n page.bleedBox,\n bleedBoxPaddingEdge,\n bleedBoxPaddingEdge,\n [],\n pageFloatLayoutContext,\n ).then(() => {\n if (!pageFloatLayoutContext.isInvalidated()) {\n pageFloatLayoutContext.finish();\n }\n if (pageFloatLayoutContext.isInvalidated()) {\n this.currentLayoutPosition = this.layoutPositionAtPageStart.clone();\n pageFloatLayoutContext.validate();\n loopFrame.continueLoop();\n } else {\n loopFrame.breakLoop();\n }\n });\n })\n .then(() => {\n pageMaster.adjustPageLayout(this, page, this.clientLayout);\n if (!isTocBox) {\n const isLeftPage = new Exprs.Named(\n pageMaster.pageBox.scope,\n \"left-page\",\n );\n page.side = isLeftPage.evaluate(this)\n ? Constants.PageSide.LEFT\n : Constants.PageSide.RIGHT;\n this.processLinger();\n cp = this.currentLayoutPosition;\n Object.keys(cp.flowPositions).forEach((flowName) => {\n const flowPosition = cp.flowPositions[flowName];\n const breakAfter = flowPosition.breakAfter;\n if (\n breakAfter &&\n (breakAfter === \"page\" || !this.matchPageSide(breakAfter))\n ) {\n flowPosition.breakAfter = null;\n }\n });\n }\n this.currentLayoutPosition = this.layoutPositionAtPageStart = null;\n cp.highestSeenOffset = this.styler.getReachedOffset();\n const triggers = this.style.store.getTriggersForDoc(this.xmldoc);\n page.finish(triggers, this.clientLayout);\n if (this.noMorePrimaryFlows(cp)) {\n cp = null;\n }\n frame.finish(cp);\n });\n return frame.result();\n }\n\n /**\n * Set actual page width, height and bleed from style specified in page\n * context.\n */\n private setPageSizeAndBleed(\n evaluatedPageSizeAndBleed: CssPage.EvaluatedPageSizeAndBleed,\n page: Vtree.Page,\n ) {\n this.actualPageWidth = evaluatedPageSizeAndBleed.pageWidth;\n this.actualPageHeight = evaluatedPageSizeAndBleed.pageHeight;\n this.pageSheetWidth =\n evaluatedPageSizeAndBleed.pageWidth +\n evaluatedPageSizeAndBleed.cropOffset * 2;\n this.pageSheetHeight =\n evaluatedPageSizeAndBleed.pageHeight +\n evaluatedPageSizeAndBleed.cropOffset * 2;\n page.container.style.width = `${this.pageSheetWidth}px`;\n page.container.style.height = `${this.pageSheetHeight}px`;\n page.bleedBox.style.left = `${evaluatedPageSizeAndBleed.bleedOffset}px`;\n page.bleedBox.style.right = `${evaluatedPageSizeAndBleed.bleedOffset}px`;\n page.bleedBox.style.top = `${evaluatedPageSizeAndBleed.bleedOffset}px`;\n page.bleedBox.style.bottom = `${evaluatedPageSizeAndBleed.bleedOffset}px`;\n page.bleedBox.style.padding = `${evaluatedPageSizeAndBleed.bleed}px`;\n\n // Shift 1px to workaround Chrome printing bug (Canceled because of another Chrome problem)\n // page.bleedBox.style.paddingTop = `${evaluatedPageSizeAndBleed.bleed+1}px`;\n\n // Shift 0.01px to workaround Firefox printing problem\n // (This small value (< 1/64 px) has no effect to Chrome)\n page.bleedBox.style.paddingTop = `${\n evaluatedPageSizeAndBleed.bleed + 0.01\n }px`;\n }\n}\n\nexport class BaseParserHandler extends CssCascade.CascadeParserHandler {\n insideRegion: boolean = false;\n\n constructor(\n public masterHandler: StyleParserHandler,\n condition: Exprs.Val,\n parent: BaseParserHandler,\n regionId: string | null,\n ) {\n super(\n masterHandler.rootScope,\n masterHandler,\n condition,\n parent,\n regionId,\n masterHandler.validatorSet,\n !parent,\n );\n }\n\n /**\n * @override\n */\n startPageTemplateRule(): void {}\n\n /**\n * @override\n */\n startPageMasterRule(\n name: string | null,\n pseudoName: string | null,\n classes: string[],\n ): void {\n const pageMaster = new PageMaster.PageMaster(\n this.masterHandler.pageScope,\n name,\n pseudoName,\n classes,\n this.masterHandler.rootBox,\n this.condition,\n this.owner.getBaseSpecificity(),\n );\n this.masterHandler.pushHandler(\n new PageMaster.PageMasterParserHandler(\n pageMaster.scope,\n this.masterHandler,\n pageMaster,\n this.validatorSet,\n ),\n );\n }\n\n /**\n * @override\n */\n startWhenRule(expr: Css.Expr): void {\n let condition = expr.expr;\n if (this.condition != null) {\n condition = Exprs.and(this.scope, this.condition, condition);\n }\n this.masterHandler.pushHandler(\n new BaseParserHandler(this.masterHandler, condition, this, this.regionId),\n );\n }\n\n /**\n * @override\n */\n startDefineRule(): void {\n this.masterHandler.pushHandler(\n new CssCascade.DefineParserHandler(this.scope, this.owner),\n );\n }\n\n /**\n * @override\n */\n startFontFaceRule(): void {\n const properties = {} as CssCascade.ElementStyle;\n this.masterHandler.fontFaces.push({\n properties,\n condition: this.condition,\n });\n this.masterHandler.pushHandler(\n new CssCascade.PropSetParserHandler(\n this.scope,\n this.owner,\n null,\n properties,\n this.masterHandler.validatorSet,\n ),\n );\n }\n\n /**\n * @override\n */\n startFlowRule(flowName: string): void {\n let style = this.masterHandler.flowProps[flowName];\n if (!style) {\n style = {} as CssCascade.ElementStyle;\n this.masterHandler.flowProps[flowName] = style;\n }\n this.masterHandler.pushHandler(\n new CssCascade.PropSetParserHandler(\n this.scope,\n this.owner,\n null,\n style,\n this.masterHandler.validatorSet,\n ),\n );\n }\n\n /**\n * @override\n */\n startViewportRule(): void {\n const viewportProps = {} as CssCascade.ElementStyle;\n this.masterHandler.viewportProps.push(viewportProps);\n this.masterHandler.pushHandler(\n new CssCascade.PropSetParserHandler(\n this.scope,\n this.owner,\n this.condition,\n viewportProps,\n this.masterHandler.validatorSet,\n ),\n );\n }\n\n /**\n * @override\n */\n startFootnoteRule(pseudoelem: string | null): void {\n let style = this.masterHandler.footnoteProps;\n if (pseudoelem) {\n const pseudos = CssCascade.getMutableStyleMap(style, \"_pseudos\");\n style = pseudos[pseudoelem];\n if (!style) {\n style = {} as CssCascade.ElementStyle;\n pseudos[pseudoelem] = style;\n }\n }\n this.masterHandler.pushHandler(\n new CssCascade.PropSetParserHandler(\n this.scope,\n this.owner,\n null,\n style,\n this.masterHandler.validatorSet,\n ),\n );\n }\n\n /**\n * @override\n */\n startRegionRule(): void {\n this.insideRegion = true;\n this.startSelectorRule();\n }\n\n /**\n * @override\n */\n startPageRule(): void {\n const pageHandler = new CssPage.PageParserHandler(\n this.masterHandler.pageScope,\n this.masterHandler,\n this,\n this.validatorSet,\n this.masterHandler.pageProps,\n );\n this.masterHandler.pushHandler(pageHandler);\n pageHandler.startPageRule();\n }\n\n /**\n * @override\n */\n startRuleBody(): void {\n CssCascade.CascadeParserHandler.prototype.startRuleBody.call(this);\n if (this.insideRegion) {\n this.insideRegion = false;\n const regionId = `R${this.masterHandler.regionCount++}`;\n this.special(\"region-id\", Css.getName(regionId));\n this.endRule();\n const regionHandler = new BaseParserHandler(\n this.masterHandler,\n this.condition,\n this,\n regionId,\n );\n this.masterHandler.pushHandler(regionHandler);\n regionHandler.startRuleBody();\n }\n }\n}\n\n// override, so we don't register an error\nexport function processViewportMeta(meta: Element): string {\n let content = meta.getAttribute(\"content\");\n if (!content) {\n return \"\";\n }\n const vals = {};\n let r: RegExpMatchArray;\n while (\n (r = content.match(\n /^,?\\s*([-A-Za-z_.][-A-Za-z_0-9.]*)\\s*=\\s*([-+A-Za-z_0-9.]*)\\s*/,\n )) != null\n ) {\n content = content.substr(r[0].length);\n vals[r[1]] = r[2];\n }\n const width = vals[\"width\"] - 0;\n const height = vals[\"height\"] - 0;\n if (width && height) {\n return `@-epubx-viewport{width:${width}px;height:${height}px;}`;\n }\n return \"\";\n}\n\nexport class StyleParserHandler extends CssParser.DispatchParserHandler {\n rootScope: Exprs.LexicalScope;\n pageScope: Exprs.LexicalScope;\n rootBox: PageMaster.RootPageBox;\n cascadeParserHandler: BaseParserHandler;\n regionCount: number = 0;\n fontFaces = [] as FontFace[];\n footnoteProps = {} as CssCascade.ElementStyle;\n flowProps = {} as { [key: string]: CssCascade.ElementStyle };\n viewportProps = [] as CssCascade.ElementStyle[];\n pageProps = {} as { [key: string]: CssCascade.ElementStyle };\n slave: BaseParserHandler;\n\n constructor(public readonly validatorSet: CssValidator.ValidatorSet) {\n super();\n this.rootScope = new Exprs.LexicalScope(null);\n this.pageScope = new Exprs.LexicalScope(this.rootScope);\n this.rootBox = new PageMaster.RootPageBox(this.rootScope);\n this.cascadeParserHandler = new BaseParserHandler(this, null, null, null);\n this.slave = this.cascadeParserHandler;\n }\n\n /**\n * @override\n */\n error(mnemonics: string, token: CssTokenizer.Token): void {\n Logging.logger.warn(\"CSS parser:\", mnemonics);\n }\n}\n\nexport type StyleSource = {\n url: string;\n text: string | null;\n flavor: CssParser.StylesheetFlavor;\n classes: string | null;\n media: string | null;\n};\n\nexport function parseOPSResource(\n response: Net.Response,\n store: XmlDoc.XMLDocStore,\n): Task.Result<XmlDoc.XMLDocHolder> {\n return (store as OPSDocStore).parseOPSResource(response);\n}\n\nexport class OPSDocStore extends Net.ResourceStore<XmlDoc.XMLDocHolder> {\n styleByKey: { [key: string]: Style } = {};\n styleFetcherByKey: { [key: string]: TaskUtil.Fetcher<Style> } = {};\n styleByDocURL: { [key: string]: Style } = {};\n triggersByDocURL: { [key: string]: Vtree.Trigger[] } = {};\n validatorSet: CssValidator.ValidatorSet = null;\n private styleSheets: StyleSource[] = [];\n private triggerSingleDocumentPreprocessing: boolean = false;\n\n constructor(\n public fontDeobfuscator:\n | ((p1: string) => ((p1: Blob) => Task.Result<Blob>) | null)\n | null,\n ) {\n super(parseOPSResource, Net.XMLHttpRequestResponseType.DOCUMENT);\n }\n\n init(\n authorStyleSheets: { url: string | null; text: string | null }[] | null,\n userStyleSheets: { url: string | null; text: string | null }[] | null,\n ): Task.Result<boolean> {\n this.setStyleSheets(authorStyleSheets as any, userStyleSheets as any);\n const userAgentXML = Base.resolveURL(\n \"user-agent.xml\",\n Base.resourceBaseURL,\n );\n const frame = Task.newFrame<boolean>(\"OPSDocStore.init\");\n this.validatorSet = CssValidator.baseValidatorSet();\n loadUABase().then(() => {\n this.load(userAgentXML).then(() => {\n this.triggerSingleDocumentPreprocessing = true;\n frame.finish(true);\n });\n });\n return frame.result();\n }\n\n getStyleForDoc(xmldoc: XmlDoc.XMLDocHolder): Style {\n return this.styleByDocURL[xmldoc.url];\n }\n\n getTriggersForDoc(xmldoc: XmlDoc.XMLDocHolder): Vtree.Trigger[] {\n return this.triggersByDocURL[xmldoc.url];\n }\n\n /**\n * Set author stylesheets and user stylesheets. Existing style sheets are\n * removed.\n */\n private setStyleSheets(\n authorStyleSheets: StyleSource[] | null,\n userStyleSheets: StyleSource[] | null,\n ) {\n this.clearStyleSheets();\n if (authorStyleSheets) {\n authorStyleSheets.forEach(this.addAuthorStyleSheet, this);\n }\n if (userStyleSheets) {\n userStyleSheets.forEach(this.addUserStyleSheet, this);\n }\n }\n\n private clearStyleSheets() {\n this.styleSheets.splice(0);\n }\n\n private addAuthorStyleSheet(stylesheet: StyleSource) {\n let url = stylesheet.url;\n if (url) {\n url = Base.resolveURL(Base.convertSpecialURL(url), Base.baseURL);\n }\n this.styleSheets.push({\n url,\n text: stylesheet.text,\n flavor: CssParser.StylesheetFlavor.AUTHOR,\n classes: null,\n media: null,\n });\n }\n\n private addUserStyleSheet(stylesheet: StyleSource) {\n let url = stylesheet.url;\n if (url) {\n url = Base.resolveURL(Base.convertSpecialURL(url), Base.baseURL);\n }\n this.styleSheets.push({\n url,\n text: stylesheet.text,\n flavor: CssParser.StylesheetFlavor.USER,\n classes: null,\n media: null,\n });\n }\n\n parseOPSResource(response: Net.Response): Task.Result<XmlDoc.XMLDocHolder> {\n const frame: Task.Frame<XmlDoc.XMLDocHolder> = Task.newFrame(\n \"OPSDocStore.load\",\n );\n const url = response.url;\n\n // Hack for TOCView.showTOC()\n const isTocBox = url.endsWith(\"?viv-toc-box\");\n\n XmlDoc.parseXMLResource(response, this).then(\n (xmldoc: XmlDoc.XMLDocHolder) => {\n if (!xmldoc) {\n frame.finish(null);\n return;\n }\n if (this.triggerSingleDocumentPreprocessing) {\n const hooks: Plugin.PreProcessSingleDocumentHook[] = Plugin.getHooksForName(\n Plugin.HOOKS.PREPROCESS_SINGLE_DOCUMENT,\n );\n for (let i = 0; i < hooks.length; i++) {\n try {\n hooks[i](xmldoc.document);\n } catch (e) {\n Logging.logger.warn(\n \"Error during single document preprocessing:\",\n e,\n );\n }\n }\n }\n const triggers = [];\n const triggerList = xmldoc.document.getElementsByTagNameNS(\n Base.NS.epub,\n \"trigger\",\n );\n for (let i = 0; i < triggerList.length; i++) {\n const triggerElem = triggerList[i];\n const observer = triggerElem.getAttributeNS(Base.NS.EV, \"observer\");\n const event = triggerElem.getAttributeNS(Base.NS.EV, \"event\");\n const action = triggerElem.getAttribute(\"action\");\n const ref = triggerElem.getAttribute(\"ref\");\n if (observer && event && action && ref) {\n triggers.push({ observer, event, action, ref });\n }\n }\n this.triggersByDocURL[url] = triggers;\n const sources = [] as StyleSource[];\n const userAgentURL = Base.resolveURL(\n \"user-agent-page.css\",\n Base.resourceBaseURL,\n );\n sources.push({\n url: userAgentURL,\n text: UserAgentPageCss,\n flavor: CssParser.StylesheetFlavor.USER_AGENT,\n classes: null,\n media: null,\n });\n if (!isTocBox) {\n const elemList = xmldoc.document.querySelectorAll(\n \"style, link, meta\",\n );\n for (const elem of elemList) {\n const ns = elem.namespaceURI;\n const localName = elem.localName;\n if (ns == Base.NS.XHTML) {\n if (localName == \"style\") {\n const classes = elem.getAttribute(\"class\");\n const media = elem.getAttribute(\"media\");\n const title = elem.getAttribute(\"title\");\n sources.push({\n url,\n text: elem.textContent,\n flavor: CssParser.StylesheetFlavor.AUTHOR,\n classes: title ? classes : null,\n media,\n });\n } else if (localName == \"link\") {\n const rel = elem.getAttribute(\"rel\");\n const classes = elem.getAttribute(\"class\");\n const media = elem.getAttribute(\"media\");\n if (\n rel == \"stylesheet\" ||\n (rel == \"alternate stylesheet\" && classes)\n ) {\n let src = elem.getAttribute(\"href\");\n src = Base.resolveURL(src, url);\n const title = elem.getAttribute(\"title\");\n sources.push({\n url: src,\n text: null,\n classes: title ? classes : null,\n media,\n flavor: CssParser.StylesheetFlavor.AUTHOR,\n });\n }\n } else if (\n localName == \"meta\" &&\n elem.getAttribute(\"name\") == \"viewport\"\n ) {\n sources.push({\n url,\n text: processViewportMeta(elem),\n flavor: CssParser.StylesheetFlavor.AUTHOR,\n classes: null,\n media: null,\n });\n }\n }\n }\n for (let i = 0; i < this.styleSheets.length; i++) {\n sources.push(this.styleSheets[i]);\n }\n }\n let key = \"\";\n for (let i = 0; i < sources.length; i++) {\n key += sources[i].url;\n key += \"^\";\n if (sources[i].text) {\n key += sources[i].text;\n }\n key += \"^\";\n }\n let style = this.styleByKey[key];\n if (style) {\n this.styleByDocURL[url] = style;\n frame.finish(xmldoc);\n return;\n }\n let fetcher = this.styleFetcherByKey[key];\n if (!fetcher) {\n fetcher = new TaskUtil.Fetcher(() => {\n const innerFrame: Task.Frame<Style> = Task.newFrame(\n \"fetchStylesheet\",\n );\n let index = 0;\n const sph = new StyleParserHandler(this.validatorSet);\n innerFrame\n .loop(() => {\n if (index < sources.length) {\n const source = sources[index++];\n sph.startStylesheet(source.flavor);\n if (source.text !== null) {\n return CssParser.parseStylesheetFromText(\n source.text,\n sph,\n source.url,\n source.classes,\n source.media,\n ).thenReturn(true);\n } else {\n return CssParser.parseStylesheetFromURL(\n source.url,\n sph,\n source.classes,\n source.media,\n );\n }\n }\n return Task.newResult(false);\n })\n .then(() => {\n const cascade = sph.cascadeParserHandler.finish();\n style = new Style(\n this,\n sph.rootScope,\n sph.pageScope,\n cascade,\n sph.rootBox,\n sph.fontFaces,\n sph.footnoteProps,\n sph.flowProps,\n sph.viewportProps,\n sph.pageProps,\n );\n this.styleByKey[key] = style;\n delete this.styleFetcherByKey[key];\n innerFrame.finish(style);\n });\n return innerFrame.result();\n }, `FetchStylesheet ${url}`);\n this.styleFetcherByKey[key] = fetcher;\n fetcher.start();\n }\n fetcher.get().then((style) => {\n this.styleByDocURL[url] = style;\n frame.finish(xmldoc);\n });\n },\n );\n return frame.result();\n }\n}\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2017 Trim-marks Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Sha1 - Calculate SHA1 hash of the given content.\n */\nimport * as Base from \"./base\";\n\n/**\n * @return big-endian byte sequence\n */\nexport function encode32(n: number): string {\n return String.fromCharCode(\n (n >>> 24) & 255,\n (n >>> 16) & 255,\n (n >>> 8) & 255,\n n & 255,\n );\n}\n\n/**\n * @param bytes big-endian byte sequence\n */\nexport function decode32(bytes: string): number {\n // Important facts: \"\".charCodeAt(0) == NaN, NaN & 0xFF == 0\n const b0 = bytes.charCodeAt(0) & 255;\n const b1 = bytes.charCodeAt(1) & 255;\n const b2 = bytes.charCodeAt(2) & 255;\n const b3 = bytes.charCodeAt(3) & 255;\n return (b0 << 24) | (b1 << 16) | (b2 << 8) | b3;\n}\n\n/**\n * @param bytes chars with codes 0 - 255 that represent message byte values\n * @return big-endian uint32 numbers representing sha1 hash\n */\nexport function bytesToSHA1Int32(bytes: string): number[] {\n const sb = new Base.StringBuffer();\n sb.append(bytes);\n let appendCount = (55 - bytes.length) & 63;\n sb.append(\"\\u0080\");\n while (appendCount > 0) {\n appendCount--;\n sb.append(\"\\x00\");\n }\n sb.append(\"\\x00\\x00\\x00\\x00\");\n sb.append(encode32(bytes.length * 8));\n bytes = sb.toString();\n const h = [1732584193, 4023233417, 2562383102, 271733878, 3285377520];\n const w =\n /** @type Array.<number> */\n [] as number[];\n let i: number;\n for (let bi = 0; bi < bytes.length; bi += 64) {\n for (i = 0; i < 16; i++) {\n w[i] = decode32(bytes.substr(bi + 4 * i, 4));\n }\n for (; i < 80; i++) {\n const q = w[i - 3] ^ w[i - 8] ^ w[i - 14] ^ w[i - 16];\n w[i] = (q << 1) | (q >>> 31);\n }\n let a = h[0];\n let b = h[1];\n let c = h[2];\n let d = h[3];\n let e = h[4];\n let f: number;\n for (i = 0; i < 80; i++) {\n if (i < 20) {\n f = ((b & c) | (~b & d)) + 1518500249;\n } else if (i < 40) {\n f = (b ^ c ^ d) + 1859775393;\n } else if (i < 60) {\n f = ((b & c) | (b & d) | (c & d)) + 2400959708;\n } else {\n f = (b ^ c ^ d) + 3395469782;\n }\n f += ((a << 5) | (a >>> 27)) + e + w[i];\n e = d;\n d = c;\n c = (b << 30) | (b >>> 2);\n b = a;\n a = f;\n }\n h[0] = (h[0] + a) | 0;\n h[1] = (h[1] + b) | 0;\n h[2] = (h[2] + c) | 0;\n h[3] = (h[3] + d) | 0;\n h[4] = (h[4] + e) | 0;\n }\n return h;\n}\n\n/**\n * @param bytes chars with codes 0 - 255 that represent message byte values\n * @return uint8 numbers representing sha1 hash\n */\nexport function bytesToSHA1Int8(bytes: string): number[] {\n const h = bytesToSHA1Int32(bytes);\n const res = [];\n for (const n of h) {\n res.push((n >>> 24) & 255, (n >>> 16) & 255, (n >>> 8) & 255, n & 255);\n }\n return res;\n}\n\n/**\n * @param bytes chars with codes 0 - 255 that represent message byte values\n * @return chars with codes 0 - 255 equal to SHA1 hash of the input\n */\nexport function bytesToSHA1Bytes(bytes: string): string {\n const h = bytesToSHA1Int32(bytes);\n const sb = new Base.StringBuffer();\n for (let i = 0; i < h.length; i++) {\n sb.append(encode32(h[i]));\n }\n return sb.toString();\n}\n\n/**\n * @param bytes chars with codes 0 - 255 that represent message byte values\n * @return hex-encoded SHA1 hash\n */\nexport function bytesToSHA1Hex(bytes: string): string {\n const sha1 = bytesToSHA1Bytes(bytes);\n const sb = new Base.StringBuffer();\n for (let i = 0; i < sha1.length; i++) {\n sb.append((sha1.charCodeAt(i) | 256).toString(16).substr(1));\n }\n return sb.toString();\n}\n\n/**\n * @param bytes chars with codes 0 - 255 that represent message byte values\n * @return base64-encoded SHA1 hash of the input\n */\nexport function bytesToSHA1Base64(bytes: string): string {\n const sha1 = bytesToSHA1Bytes(bytes);\n const sb = new Base.StringBuffer();\n Base.appendBase64(sb, sha1);\n return sb.toString();\n}\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2015 Trim-marks Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Toc - Table of Contents view.\n */\nimport * as Base from \"./base\";\nimport * as Counters from \"./counters\";\nimport * as Css from \"./css\";\nimport * as Exprs from \"./exprs\";\nimport * as Font from \"./font\";\nimport * as OPS from \"./ops\";\nimport * as Task from \"./task\";\nimport * as Vgen from \"./vgen\";\nimport * as Vtree from \"./vtree\";\nimport * as XmlDoc from \"./xml-doc\";\n\n// closed: 25B8\n// open: 25BE\n// empty: 25B9\nexport const bulletClosed = \"\\u25b8\";\n\nexport const bulletOpen = \"\\u25be\";\n\nexport const bulletEmpty = \"\\u25b9\";\n\nexport type TOCItem = {\n id: string;\n title: string;\n children: TOCItem[];\n};\n\nexport class TOCView implements Vgen.CustomRendererFactory {\n pref: Exprs.Preferences;\n page: Vtree.Page = null;\n instance: OPS.StyleInstance = null;\n\n constructor(\n public readonly store: OPS.OPSDocStore,\n public readonly url: string,\n public readonly lang: string | null,\n public readonly clientLayout: Vtree.ClientLayout,\n public readonly fontMapper: Font.Mapper,\n pref: Exprs.Preferences,\n public readonly rendererFactory: Vgen.CustomRendererFactory,\n public readonly fallbackMap: { [key: string]: string },\n public readonly documentURLTransformer: Base.DocumentURLTransformer,\n public readonly counterStore: Counters.CounterStore,\n ) {\n this.pref = Exprs.clonePreferences(pref);\n this.pref.spreadView = false; // No spred view for TOC box\n }\n\n setAutoHeight(elem: Element, depth: number): void {\n if (depth-- == 0) {\n return;\n }\n for (let c: Node = elem.firstChild; c; c = c.nextSibling) {\n if (c.nodeType == 1) {\n const e = c as Element;\n if (Base.getCSSProperty(e, \"height\", \"auto\") != \"auto\") {\n Base.setCSSProperty(e, \"height\", \"auto\");\n this.setAutoHeight(e, depth);\n }\n if (Base.getCSSProperty(e, \"position\", \"static\") == \"absolute\") {\n Base.setCSSProperty(e, \"position\", \"relative\");\n this.setAutoHeight(e, depth);\n }\n }\n }\n }\n\n /**\n * @override\n */\n makeCustomRenderer(xmldoc: XmlDoc.XMLDocHolder): Vgen.CustomRenderer {\n const renderer = this.rendererFactory.makeCustomRenderer(xmldoc);\n return (\n srcElem: Element,\n viewParent: Element,\n computedStyle: { [key: string]: Css.Val },\n ): Task.Result<Element> => {\n const behavior = computedStyle[\"behavior\"];\n if (behavior) {\n switch (behavior.toString()) {\n case \"body-child\":\n if (\n srcElem.parentElement.getAttribute(\n \"data-vivliostyle-primary-entry\",\n )\n ) {\n if (\n !srcElem.querySelector(\n \"[role=doc-toc], [role=directory], nav li a, .toc, #toc\",\n )\n ) {\n // When the TOC element is a part of the primaty entry (X)HTML,\n // hide elements not containing TOC.\n computedStyle[\"display\"] = Css.ident.none;\n }\n }\n break;\n case \"toc-node-anchor\":\n computedStyle[\"color\"] = Css.ident.inherit;\n computedStyle[\"text-decoration\"] = Css.ident.none;\n break;\n case \"toc-node\":\n computedStyle[\"display\"] = Css.ident.block;\n computedStyle[\"margin\"] = Css.numericZero;\n computedStyle[\"padding\"] = Css.numericZero;\n computedStyle[\"padding-inline-start\"] = new Css.Numeric(1.25, \"em\");\n break;\n case \"toc-node-first-child\":\n computedStyle[\"display\"] = Css.ident.inline_block;\n computedStyle[\"margin\"] = new Css.Numeric(0.2, \"em\");\n computedStyle[\"vertical-align\"] = Css.ident.top;\n computedStyle[\"color\"] = Css.ident.inherit;\n computedStyle[\"text-decoration\"] = Css.ident.none;\n break;\n }\n }\n if (\n !behavior ||\n (behavior.toString() != \"toc-node\" &&\n behavior.toString() != \"toc-container\")\n ) {\n return renderer(srcElem, viewParent, computedStyle);\n }\n // Remove white-space textnode that becomes unwanted space between button and anchor element.\n const firstChild = srcElem.firstChild;\n if (\n firstChild &&\n firstChild.nodeType !== 1 &&\n firstChild.textContent.trim() === \"\"\n ) {\n // To avoid \"Inconsistent offset\" error, create a comment node with same white-space text.\n srcElem.replaceChild(\n srcElem.ownerDocument.createComment(firstChild.textContent),\n firstChild,\n );\n }\n const adaptParentClass = viewParent.getAttribute(\"data-adapt-class\");\n if (adaptParentClass == \"toc-node\") {\n const button = viewParent.firstChild as Element;\n if (button.textContent != bulletClosed) {\n button.textContent = bulletClosed;\n Base.setCSSProperty(button, \"cursor\", \"pointer\");\n button.addEventListener(\"click\", toggleNodeExpansion, false);\n\n button.setAttribute(\"role\", \"button\");\n button.setAttribute(\"aria-expanded\", \"false\");\n viewParent.setAttribute(\"aria-expanded\", \"false\");\n\n // Enable tab move to the button unless hidden.\n if ((viewParent as HTMLElement).style.height !== \"0px\") {\n (button as HTMLElement).tabIndex = 0;\n }\n }\n }\n const element = viewParent.ownerDocument.createElement(\"div\");\n element.setAttribute(\"data-adapt-process-children\", \"true\");\n if (behavior.toString() == \"toc-node\") {\n const button = viewParent.ownerDocument.createElement(\"div\");\n button.textContent = bulletEmpty;\n\n // TODO: define pseudo-element for the button?\n Base.setCSSProperty(button, \"margin\", \"0.2em 0 0 -1em\");\n Base.setCSSProperty(button, \"margin-inline-start\", \"-1em\");\n Base.setCSSProperty(button, \"margin-inline-end\", \"0\");\n Base.setCSSProperty(button, \"display\", \"inline-block\");\n Base.setCSSProperty(button, \"width\", \"1em\");\n Base.setCSSProperty(button, \"text-align\", \"center\");\n Base.setCSSProperty(button, \"vertical-align\", \"top\");\n Base.setCSSProperty(button, \"cursor\", \"default\");\n Base.setCSSProperty(button, \"font-family\", \"Menlo,sans-serif\");\n element.appendChild(button);\n Base.setCSSProperty(element, \"overflow\", \"hidden\");\n element.setAttribute(\"data-adapt-class\", \"toc-node\");\n element.setAttribute(\"role\", \"treeitem\");\n\n if (\n adaptParentClass == \"toc-node\" ||\n adaptParentClass == \"toc-container\"\n ) {\n Base.setCSSProperty(element, \"height\", \"0px\");\n\n // Prevent tab move to hidden anchor.\n const anchorElem = srcElem.firstElementChild;\n if (anchorElem && anchorElem.localName === \"a\") {\n (anchorElem as HTMLElement).tabIndex = -1;\n }\n } else {\n viewParent.setAttribute(\"role\", \"tree\");\n }\n } else {\n if (adaptParentClass == \"toc-node\") {\n element.setAttribute(\"data-adapt-class\", \"toc-container\");\n element.setAttribute(\"role\", \"group\");\n element.setAttribute(\"aria-hidden\", \"true\");\n }\n }\n return Task.newResult(element as Element);\n };\n }\n\n showTOC(\n elem: HTMLElement,\n viewport: Vgen.Viewport,\n width: number,\n height: number,\n fontSize: number,\n ): Task.Result<Vtree.Page> {\n if (this.page) {\n return Task.newResult(this.page as Vtree.Page);\n }\n const frame: Task.Frame<Vtree.Page> = Task.newFrame(\"showTOC\");\n const page = new Vtree.Page(elem, elem);\n this.page = page;\n\n // The (X)HTML doc for the TOC box may be reused for the TOC page in the book,\n // but they need different styles. So, add \"?viv-toc-box\" to distinguish with TOC page URL.\n const tocBoxUrl = this.url + \"?viv-toc-box\";\n\n this.store.load(tocBoxUrl).then((xmldoc) => {\n // Mark if this doc is the primary entry page.\n const nonTocBoxDoc = this.store.resources[this.url];\n if (\n nonTocBoxDoc &&\n nonTocBoxDoc.body &&\n nonTocBoxDoc.body.getAttribute(\"data-vivliostyle-primary-entry\")\n ) {\n xmldoc.body.setAttribute(\"data-vivliostyle-primary-entry\", true);\n }\n\n // Make hidden TOC visible in TOC box\n for (const elem of xmldoc.document.querySelectorAll(\n \"[role=doc-toc], [role=directory], nav, .toc, #toc\",\n )) {\n if (elem.hasAttribute(\"hidden\")) {\n elem.removeAttribute(\"hidden\");\n }\n }\n\n const style = this.store.getStyleForDoc(xmldoc);\n const viewportSize = style.sizeViewport(width, 100000, fontSize);\n viewport = new Vgen.Viewport(\n viewport.window,\n viewportSize.fontSize,\n viewport.root,\n viewportSize.width,\n viewportSize.height,\n );\n const customRenderer = this.makeCustomRenderer(xmldoc);\n const instance = new OPS.StyleInstance(\n style,\n xmldoc,\n this.lang,\n viewport,\n this.clientLayout,\n this.fontMapper,\n customRenderer,\n this.fallbackMap,\n 0,\n this.documentURLTransformer,\n this.counterStore,\n );\n this.instance = instance;\n instance.pref = this.pref;\n instance.init().then(() => {\n instance.layoutNextPage(page, null).then(() => {\n Array.from(\n page.container.querySelectorAll(\n \"[data-vivliostyle-toc-box]>*>*>*>*>*[style*='display: none']\",\n ),\n ).forEach((bodyChildElem) => {\n bodyChildElem.setAttribute(\"aria-hidden\", \"true\");\n bodyChildElem.setAttribute(\"hidden\", \"hidden\");\n });\n this.setAutoHeight(elem, 2);\n frame.finish(page);\n });\n });\n });\n return frame.result();\n }\n\n hideTOC(): void {\n if (this.page) {\n this.page.container.style.visibility = \"hidden\";\n this.page.container.setAttribute(\"aria-hidden\", \"true\");\n }\n }\n\n isTOCVisible(): boolean {\n return !!this.page && this.page.container.style.visibility === \"visible\";\n }\n\n getTOC(): TOCItem[] {\n if (!this.page) {\n return [];\n }\n\n function exportTree(tag): TOCItem[] {\n if (!tag) {\n return [];\n }\n const links = tag.querySelectorAll(\":scope > [role=treeitem] > a[href]\");\n return Array.from(links).map(exportLink);\n }\n\n function exportLink(tag): TOCItem {\n const url = new URL(tag.href);\n const [, id] = url.hash.match(/^#(.*)$/);\n\n const title = tag.innerText;\n\n const container = tag.parentElement.querySelector(\"[role=group]\");\n const children = exportTree(container);\n\n return { id, title, children };\n }\n\n const topLevelTree = this.page.container.querySelector(\"[role=tree]\");\n return exportTree(topLevelTree);\n }\n}\n\nexport function toggleNodeExpansion(evt: Event): void {\n const elem = evt.target as Element;\n const open = elem.textContent == bulletClosed;\n elem.textContent = open ? bulletOpen : bulletClosed;\n const tocNodeElem = elem.parentNode as Element;\n elem.setAttribute(\"aria-expanded\", open ? \"true\" : \"false\");\n tocNodeElem.setAttribute(\"aria-expanded\", open ? \"true\" : \"false\");\n let c: Node = tocNodeElem.firstChild;\n while (c) {\n if (c.nodeType === 1) {\n const ce = c as HTMLElement;\n const adaptClass = ce.getAttribute(\"data-adapt-class\");\n if (adaptClass === \"toc-container\") {\n ce.setAttribute(\"aria-hidden\", !open ? \"true\" : \"false\");\n if (ce.firstChild) {\n c = ce.firstChild;\n continue;\n }\n } else if (adaptClass === \"toc-node\") {\n ce.style.height = open ? \"auto\" : \"0px\";\n\n // Update enable/disable tab move to the button and anchor.\n if (ce.children.length >= 2) {\n (ce.children[1] as HTMLElement).tabIndex = open ? 0 : -1;\n }\n if (ce.children.length >= 3) {\n (ce.children[0] as HTMLElement).tabIndex = open ? 0 : -1;\n if (!open) {\n const elem1 = ce.children[0];\n if (elem1.textContent == bulletOpen) {\n elem1.textContent = bulletClosed;\n elem1.setAttribute(\"aria-expanded\", \"false\");\n ce.setAttribute(\"aria-expanded\", \"false\");\n c = ce.children[2];\n continue;\n }\n }\n }\n }\n }\n while (!c.nextSibling && c.parentNode !== tocNodeElem) {\n c = c.parentNode;\n }\n c = c.nextSibling;\n }\n evt.stopPropagation();\n}\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2015 Trim-marks Inc.\n * Copyright 2018 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Epub - Deal with META-INF/ and .opf files in EPUB container.\n */\nimport * as Asserts from \"./asserts\";\nimport * as Base from \"./base\";\nimport * as CFI from \"./cfi\";\nimport * as Constants from \"./constants\";\nimport * as Counters from \"./counters\";\nimport * as Css from \"./css\";\nimport * as CssCascade from \"./css-cascade\";\nimport * as CssParser from \"./css-parser\";\nimport * as CssTokenizer from \"./css-tokenizer\";\nimport * as Exprs from \"./exprs\";\nimport * as Font from \"./font\";\nimport * as Logging from \"./logging\";\nimport * as Net from \"./net\";\nimport * as OPS from \"./ops\";\nimport * as SHA1 from \"./sha1\";\nimport * as Task from \"./task\";\nimport * as Toc from \"./toc\";\nimport * as Vgen from \"./vgen\";\nimport * as Vtree from \"./vtree\";\nimport * as XmlDoc from \"./xml-doc\";\n\nexport type Position = {\n spineIndex: number;\n pageIndex: number;\n offsetInItem: number;\n};\n\nexport class EPUBDocStore extends OPS.OPSDocStore {\n plainXMLStore: XmlDoc.XMLDocStore;\n jsonStore: Net.JSONStore;\n opfByURL: { [key: string]: OPFDoc } = {};\n primaryOPFByEPubURL: { [key: string]: OPFDoc } = {};\n deobfuscators: { [key: string]: (p1: Blob) => Task.Result<Blob> } = {};\n documents: { [key: string]: Task.Result<XmlDoc.XMLDocHolder> } = {};\n\n constructor() {\n super(null);\n this.fontDeobfuscator = this.makeDeobfuscatorFactory();\n this.plainXMLStore = XmlDoc.newXMLDocStore();\n this.jsonStore = Net.newJSONStore();\n }\n\n makeDeobfuscatorFactory():\n | ((p1: string) => ((p1: Blob) => Task.Result<Blob>) | null)\n | null {\n return (url: string): ((p1: Blob) => Task.Result<Blob>) | null => {\n return this.deobfuscators[url];\n };\n }\n\n loadAsPlainXML(\n url: string,\n opt_required?: boolean,\n opt_message?: string,\n ): Task.Result<XmlDoc.XMLDocHolder> {\n return this.plainXMLStore.load(\n url,\n opt_required,\n opt_message,\n ) as Task.Result<XmlDoc.XMLDocHolder>;\n }\n\n startLoadingAsPlainXML(url: string): void {\n this.plainXMLStore.fetch(url);\n }\n\n loadAsJSON(\n url: string,\n opt_required?: boolean,\n opt_message?: string,\n ): Task.Result<Base.JSON> {\n return this.jsonStore.load(url, opt_required, opt_message);\n }\n\n startLoadingAsJSON(url: string): void {\n this.jsonStore.fetch(url);\n }\n\n loadPubDoc(url: string, haveZipMetadata: boolean): Task.Result<OPFDoc> {\n const frame: Task.Frame<OPFDoc> = Task.newFrame(\"loadPubDoc\");\n\n Net.ajax(url, null, \"HEAD\").then((response) => {\n if (response.status >= 400) {\n // This url can be the root of an unzipped EPUB.\n this.loadEPUBDoc(url, haveZipMetadata).then((opf) => {\n if (opf) {\n frame.finish(opf);\n return;\n }\n Logging.logger.error(\n `Failed to fetch a source document from ${url} (${response.status}${\n response.statusText ? \" \" + response.statusText : \"\"\n })`,\n );\n frame.finish(null);\n });\n } else {\n if (\n !response.status &&\n !response.responseXML &&\n !response.responseText &&\n !response.responseBlob &&\n !response.contentType\n ) {\n // Empty response\n if (/\\/[^/.]+(?:[#?]|$)/.test(url)) {\n // Adding trailing \"/\" may solve the problem.\n url = url.replace(/([#?]|$)/, \"/$1\");\n } else {\n // Ignore empty response of HEAD request, it may become OK with GET request.\n }\n }\n if (\n response.contentType == \"application/oebps-package+xml\" ||\n /\\.opf(?:[#?]|$)/.test(url)\n ) {\n // EPUB OPF\n const [, pubURL, root] = url.match(/^((?:.*\\/)?)([^/]*)$/);\n this.loadOPF(pubURL, root, haveZipMetadata).thenFinish(frame);\n } else if (\n response.contentType == \"application/ld+json\" ||\n response.contentType == \"application/webpub+json\" ||\n response.contentType == \"application/audiobook+json\" ||\n response.contentType == \"application/json\" ||\n /\\.json(?:ld)?(?:[#?]|$)/.test(url)\n ) {\n // Web Publication Manifest\n this.loadAsJSON(url, true).then((manifestObj) => {\n if (!manifestObj) {\n this.reportLoadError(url);\n frame.finish(null);\n return;\n }\n const opf = new OPFDoc(this, url);\n opf.initWithWebPubManifest(manifestObj, undefined, url).then(() => {\n frame.finish(opf);\n });\n });\n } else {\n // Web Publication primary entry (X)HTML\n this.loadWebPub(url).then((opf) => {\n if (opf) {\n frame.finish(opf);\n return;\n }\n // This url can be the root of an unzipped EPUB.\n this.loadEPUBDoc(url, haveZipMetadata).then((opf) => {\n if (opf) {\n frame.finish(opf);\n return;\n }\n Logging.logger.error(`Failed to load ${url}.`);\n frame.finish(null);\n });\n });\n }\n }\n });\n return frame.result();\n }\n\n loadEPUBDoc(url: string, haveZipMetadata: boolean): Task.Result<OPFDoc> {\n const frame: Task.Frame<OPFDoc> = Task.newFrame(\"loadEPUBDoc\");\n if (!url.endsWith(\"/\")) {\n url = url + \"/\";\n }\n if (haveZipMetadata) {\n this.startLoadingAsJSON(url + \"?r=list\");\n }\n this.startLoadingAsPlainXML(url + \"META-INF/encryption.xml\");\n const containerURL = url + \"META-INF/container.xml\";\n this.loadAsPlainXML(containerURL).then((containerXML) => {\n if (containerXML) {\n const roots = containerXML\n .doc()\n .child(\"container\")\n .child(\"rootfiles\")\n .child(\"rootfile\")\n .attribute(\"full-path\");\n for (const root of roots) {\n if (root) {\n this.loadOPF(url, root, haveZipMetadata).thenFinish(frame);\n return;\n }\n }\n }\n frame.finish(null);\n });\n return frame.result();\n }\n\n loadOPF(\n pubURL: string,\n root: string,\n haveZipMetadata: boolean,\n ): Task.Result<OPFDoc> {\n const url = pubURL + root;\n let opf = this.opfByURL[url];\n if (opf) {\n return Task.newResult(opf);\n }\n const frame: Task.Frame<OPFDoc> = Task.newFrame(\"loadOPF\");\n this.loadAsPlainXML(url, true, `Failed to fetch EPUB OPF ${url}`).then(\n (opfXML) => {\n if (!opfXML) {\n this.reportLoadError(url);\n } else {\n this.loadAsPlainXML(`${pubURL}META-INF/encryption.xml`).then(\n (encXML) => {\n const zipMetadataResult = haveZipMetadata\n ? this.loadAsJSON(`${pubURL}?r=list`)\n : Task.newResult(null);\n zipMetadataResult.then((zipMetadata) => {\n opf = new OPFDoc(this, pubURL);\n opf\n .initWithXMLDoc(\n opfXML,\n encXML,\n zipMetadata,\n `${pubURL}?r=manifest`,\n )\n .then(() => {\n this.opfByURL[url] = opf;\n this.primaryOPFByEPubURL[pubURL] = opf;\n frame.finish(opf);\n });\n });\n },\n );\n }\n },\n );\n return frame.result();\n }\n\n loadWebPub(url: string): Task.Result<OPFDoc> {\n const frame: Task.Frame<OPFDoc> = Task.newFrame(\"loadWebPub\");\n\n // Load the primary entry page (X)HTML\n this.load(url).then((xmldoc) => {\n if (!xmldoc) {\n this.reportLoadError(url);\n } else if (\n xmldoc.document.querySelector(\n \"a[href='META-INF/'],a[href$='/META-INF/']\",\n )\n ) {\n // This is likely the directory listing of unzipped EPUB top directory\n frame.finish(null);\n } else {\n const doc = xmldoc.document;\n const opf = new OPFDoc(this, url);\n\n if (doc.body) {\n doc.body.setAttribute(\"data-vivliostyle-primary-entry\", true);\n }\n // Find manifest, W3C WebPublication or Readium Web Publication Manifest\n const manifestLink = doc.querySelector(\n \"link[rel='publication'],link[rel='manifest'][type='application/webpub+json']\",\n );\n if (manifestLink) {\n const href = manifestLink.getAttribute(\"href\");\n if (/^#/.test(href)) {\n const manifestObj = Base.stringToJSON(\n doc.getElementById(href.substr(1)).textContent,\n );\n opf.initWithWebPubManifest(manifestObj, doc).then(() => {\n frame.finish(opf);\n });\n } else {\n const manifestUrl = Base.resolveURL(\n manifestLink.getAttribute(\"href\"),\n url,\n );\n this.loadAsJSON(manifestUrl).then((manifestObj) => {\n opf\n .initWithWebPubManifest(manifestObj, doc, manifestUrl)\n .then(() => {\n frame.finish(opf);\n });\n });\n }\n } else {\n // No manifest\n opf.initWithWebPubManifest({}, doc).then(() => {\n if (opf.xhtmlToc && opf.xhtmlToc.src === xmldoc.url) {\n // xhtmlToc is the primari entry (X)HTML\n if (\n !doc.querySelector(\n \"[role=doc-toc], [role=directory], nav, .toc, #toc\",\n )\n ) {\n // TOC is not found in the primari entry (X)HTML\n opf.xhtmlToc = null;\n }\n }\n frame.finish(opf);\n });\n }\n }\n });\n return frame.result();\n }\n\n addDocument(url: string, doc: Document) {\n const frame = Task.newFrame<XmlDoc.XMLDocHolder>(\"EPUBDocStore.load\");\n const docURL = Base.stripFragment(url);\n const r = (this.documents[docURL] = this.parseOPSResource({\n status: 200,\n statusText: \"\",\n url: docURL,\n contentType: (doc as any).contentType,\n responseText: null,\n responseXML: doc,\n responseBlob: null,\n }));\n r.thenFinish(frame);\n return frame.result();\n }\n\n reportLoadError(docURL: string): void {\n const removePath = (url: string) => {\n return url.replace(/([^:/?#]|^)[/?#].*/, \"$1\");\n };\n const likelyCorsProblem = () => {\n const domain = removePath(docURL);\n if (domain === removePath(Base.baseURL)) {\n // same domain, no CORS problem\n return false;\n }\n const urls = Object.keys(this.resources);\n if (\n urls.find((url) => this.resources[url] && removePath(url) === domain)\n ) {\n // if there is an already loaded resource with the same domain, no CORS problem\n return false;\n }\n if (/\\.(xhtml|xht|xml|opf)$/i.test(docURL)) {\n // maybe, XML error\n return false;\n }\n // likely, CORS problem\n return true;\n };\n\n if (docURL.startsWith(\"data:\")) {\n Logging.logger.error(`Failed to load ${docURL}. Invalid data.`);\n } else if (\n docURL.startsWith(\"http:\") &&\n Base.baseURL.startsWith(\"https:\")\n ) {\n Logging.logger.error(\n `Failed to load ${docURL}. Mixed Content (\"http:\" content on \"https:\" context) is not allowed.`,\n );\n } else if (likelyCorsProblem()) {\n Logging.logger.error(\n `Failed to load ${docURL}. This may be caused by the server not allowing cross-origin resource sharing (CORS).`,\n );\n } else {\n Logging.logger.error(\n `Failed to load ${docURL}. The target resource is invalid.`,\n );\n }\n }\n\n /**\n * @override\n */\n load(url: string): Task.Result<XmlDoc.XMLDocHolder> {\n const docURL = Base.stripFragment(url);\n let r = this.documents[docURL];\n if (r) {\n return r.isPending() ? r : Task.newResult(r.get());\n } else {\n const frame = Task.newFrame<XmlDoc.XMLDocHolder>(\"EPUBDocStore.load\");\n r = super.load(\n docURL,\n true,\n `Failed to fetch a source document from ${docURL}`,\n );\n r.then((xmldoc: XmlDoc.XMLDocHolder) => {\n if (!xmldoc) {\n this.reportLoadError(docURL);\n } else {\n frame.finish(xmldoc);\n }\n });\n return frame.result();\n }\n }\n}\n\nexport type OPFItemParam = {\n url: string;\n index: number;\n startPage: number | null;\n skipPagesBefore: number | null;\n};\n\nexport class OPFItem {\n id: string | null = null;\n src: string = \"\";\n mediaType: string | null = null;\n title: string | null = null;\n itemRefElement: Element | null = null;\n spineIndex: number = -1;\n compressedSize: number = 0;\n compressed: boolean | null = null;\n epage: number = 0;\n epageCount: number = 0;\n startPage: number | null = null;\n skipPagesBefore: number | null = null;\n itemProperties: { [key: string]: boolean };\n\n constructor() {\n this.itemProperties = Base.emptyObj;\n }\n\n initWithElement(itemElem: Element, opfURL: string): void {\n this.id = itemElem.getAttribute(\"id\");\n this.src = Base.resolveURL(itemElem.getAttribute(\"href\"), opfURL);\n this.mediaType = itemElem.getAttribute(\"media-type\");\n const propStr = itemElem.getAttribute(\"properties\");\n if (propStr) {\n this.itemProperties = Base.arrayToSet(propStr.split(/\\s+/));\n }\n }\n\n initWithParam(param: OPFItemParam) {\n this.spineIndex = param.index;\n this.id = `item${param.index + 1}`;\n this.src = param.url;\n this.startPage = param.startPage;\n this.skipPagesBefore = param.skipPagesBefore;\n }\n}\n\nexport function getOPFItemId(item: OPFItem): string | null {\n return item.id;\n}\n\nexport function makeDeobfuscator(uid: string): (p1: Blob) => Task.Result<Blob> {\n // TODO: use UTF8 of uid\n const sha1Sum = SHA1.bytesToSHA1Int8(uid);\n return (blob) => {\n const frame = Task.newFrame(\"deobfuscator\") as Task.Frame<Blob>;\n let head: Blob;\n let tail: Blob;\n if (blob.slice) {\n head = blob.slice(0, 1040);\n tail = blob.slice(1040, blob.size);\n } else {\n head = blob[\"webkitSlice\"](0, 1040);\n tail = blob[\"webkitSlice\"](1040, blob.size - 1040);\n }\n Net.readBlob(head).then((buf) => {\n const dataView = new DataView(buf);\n for (let k = 0; k < dataView.byteLength; k++) {\n let b = dataView.getUint8(k);\n b ^= sha1Sum[k % 20];\n dataView.setUint8(k, b);\n }\n frame.finish(Net.makeBlob([dataView, tail]));\n });\n return frame.result();\n };\n}\n\nexport function makeObfuscationKey(uid: string): string {\n return `1040:${SHA1.bytesToSHA1Hex(uid)}`;\n}\n\ntype RawMeta = {\n [key: string]: RawMetaItem[];\n};\n\ntype RawMetaItem = {\n name: string;\n value: string;\n id: string | null;\n refines: string | null;\n scheme: string | null;\n lang: string | null;\n order: number;\n role: string | null;\n};\n\nexport interface Meta {\n [key: string]: MetaItem[];\n}\n\nexport interface MetaItem {\n v: string;\n o?: number;\n s?: string;\n r?: Meta;\n}\n\nexport const predefinedPrefixes = {\n dcterms: \"http://purl.org/dc/terms/\",\n marc: \"http://id.loc.gov/vocabulary/\",\n media: \"http://www.idpf.org/epub/vocab/overlays/#\",\n rendition: \"http://www.idpf.org/vocab/rendition/#\",\n onix: \"http://www.editeur.org/ONIX/book/codelists/current.html#\",\n xsd: \"http://www.w3.org/2001/XMLSchema#\",\n opf: \"http://www.idpf.org/2007/opf\",\n};\n\nexport const defaultIRI = \"http://idpf.org/epub/vocab/package/meta/#\";\n\nexport const metaTerms = {\n language: `${predefinedPrefixes[\"dcterms\"]}language`,\n title: `${predefinedPrefixes[\"dcterms\"]}title`,\n creator: `${predefinedPrefixes[\"dcterms\"]}creator`,\n layout: `${predefinedPrefixes[\"rendition\"]}layout`,\n titleType: `${defaultIRI}title-type`,\n displaySeq: `${defaultIRI}display-seq`,\n alternateScript: `${defaultIRI}alternate-script`,\n role: `${defaultIRI}role`,\n};\n\nexport function getMetadataComparator(\n term: string,\n lang: string,\n): (p1: MetaItem, p2: MetaItem) => number {\n const empty = {};\n return (item1, item2) => {\n let m1: boolean;\n let m2: boolean;\n const r1 = item1[\"r\"] || empty;\n const r2 = item2[\"r\"] || empty;\n if (term == metaTerms.title) {\n m1 = r1[metaTerms.titleType]?.[0].v == \"main\";\n m2 = r2[metaTerms.titleType]?.[0].v == \"main\";\n if (m1 != m2) {\n return m1 ? -1 : 1;\n }\n }\n let i1 = parseInt(r1[metaTerms.displaySeq]?.[0].v, 10);\n if (isNaN(i1)) {\n i1 = Number.MAX_VALUE;\n }\n let i2 = parseInt(r2[metaTerms.displaySeq]?.[0].v, 10);\n if (isNaN(i2)) {\n i2 = Number.MAX_VALUE;\n }\n if (i1 != i2) {\n return i1 - i2;\n }\n if (term != metaTerms.language && lang) {\n m1 =\n (r1[metaTerms.language] || r1[metaTerms.alternateScript])?.[0].v ==\n lang;\n m2 =\n (r2[metaTerms.language] || r2[metaTerms.alternateScript])?.[0].v ==\n lang;\n if (m1 != m2) {\n return m1 ? -1 : 1;\n }\n }\n return item1[\"o\"] - item2[\"o\"];\n };\n}\n\nexport function readMetadata(\n mroot: XmlDoc.NodeList,\n prefixes: string | null,\n): Meta {\n // Parse prefix map (if any)\n let prefixMap;\n if (!prefixes) {\n prefixMap = predefinedPrefixes;\n } else {\n prefixMap = {};\n for (const pn in predefinedPrefixes) {\n prefixMap[pn] = predefinedPrefixes[pn];\n }\n let r: RegExpMatchArray;\n\n // This code permits any non-ASCII characters in the name to avoid bloating\n // the pattern.\n while (\n (r = prefixes.match(\n /^\\s*([A-Z_a-z\\u007F-\\uFFFF][-.A-Z_a-z0-9\\u007F-\\uFFFF]*):\\s*(\\S+)/,\n )) != null\n ) {\n prefixes = prefixes.substr(r[0].length);\n prefixMap[r[1]] = r[2];\n }\n }\n const resolveProperty = (val: string | null): string | null => {\n if (val) {\n const r = val.match(/^\\s*(([^:]*):)?(\\S+)\\s*$/);\n if (r) {\n const iri = r[2] ? prefixMap[r[2]] : defaultIRI;\n if (iri) {\n return iri + r[3];\n }\n }\n }\n return null;\n };\n let order = 1;\n\n // List of metadata items.\n const rawItems = mroot.childElements().forEachNonNull((node: Element) => {\n if (node.localName == \"meta\") {\n const p = resolveProperty(node.getAttribute(\"property\"));\n if (p) {\n return {\n name: p,\n value: node.textContent,\n id: node.getAttribute(\"id\"),\n order: order++,\n refines: node.getAttribute(\"refines\"),\n lang: null,\n scheme: resolveProperty(node.getAttribute(\"scheme\")),\n role: null,\n };\n }\n } else if (node.namespaceURI == Base.NS.DC) {\n return {\n name: predefinedPrefixes[\"dcterms\"] + node.localName,\n order: order++,\n lang: node.getAttribute(\"xml:lang\"),\n value: node.textContent,\n id: node.getAttribute(\"id\"),\n refines: null,\n scheme: null,\n role: node.getAttribute(\"role\") || node.getAttribute(\"opf:role\"),\n };\n }\n return null;\n });\n\n // Items grouped by their target id.\n const rawItemsByTarget = Base.multiIndexArray(\n rawItems,\n (rawItem) => rawItem.refines,\n );\n const makeMetadata = (map: RawMeta): Meta =>\n Base.mapObj(map, (rawItemArr, _itemName) =>\n rawItemArr.map((rawItem) => {\n const entry = { v: rawItem.value, o: rawItem.order };\n if (rawItem.scheme) {\n entry[\"s\"] = rawItem.scheme;\n }\n let refs = rawItemsByTarget[`#${rawItem.id}`] || [];\n if (refs.length || rawItem.lang || rawItem.role) {\n if (rawItem.lang) {\n // Special handling for xml:lang\n refs.push({\n name: metaTerms.language,\n value: rawItem.lang,\n lang: null,\n id: null,\n refines: rawItem.id,\n scheme: null,\n order: rawItem.order,\n role: null,\n });\n }\n if (rawItem.role) {\n // Special handling for opf:role\n refs.push({\n name: metaTerms.role,\n value: rawItem.role,\n lang: null,\n id: null,\n refines: rawItem.id,\n scheme: null,\n order: rawItem.order,\n role: null,\n });\n }\n const entryMap = Base.multiIndexArray(\n refs,\n (rawItem) => rawItem.name,\n );\n entry[\"r\"] = makeMetadata(entryMap);\n }\n return entry;\n }),\n );\n const metadata = makeMetadata(\n Base.multiIndexArray(rawItems, (rawItem) =>\n rawItem.refines ? null : rawItem.name,\n ),\n );\n let lang: string | null = null;\n if (metadata[metaTerms.language]) {\n lang = metadata[metaTerms.language][0][\"v\"];\n }\n const sortMetadata = (metadata: Meta) => {\n for (const term in metadata) {\n const arr = metadata[term];\n arr.sort(getMetadataComparator(term, lang));\n for (let i = 0; i < arr.length; i++) {\n const r = arr[i][\"r\"];\n if (r) {\n sortMetadata(r);\n }\n }\n }\n };\n sortMetadata(metadata);\n return metadata;\n}\n\nexport function getMathJaxHub(): object {\n const math = window[\"MathJax\"];\n if (math) {\n return math[\"Hub\"];\n }\n return null;\n}\n\nexport function checkMathJax(): void {\n if (getMathJaxHub()) {\n CssCascade.supportedNamespaces[Base.NS.MATHML] = true;\n }\n}\n\nexport const supportedMediaTypes = {\n \"application/xhtml+xml\": true,\n \"image/jpeg\": true,\n \"image/png\": true,\n \"image/svg+xml\": true,\n \"image/gif\": true,\n \"audio/mp3\": true,\n};\n\nexport const transformedIdPrefix = \"viv-id-\";\n\nexport class OPFDoc {\n opfXML: XmlDoc.XMLDocHolder = null;\n encXML: XmlDoc.XMLDocHolder = null;\n items: OPFItem[] = null;\n spine: OPFItem[] = null;\n itemMap: { [key: string]: OPFItem } = null;\n itemMapByPath: { [key: string]: OPFItem } = null;\n uid: string | null = null;\n bindings: { [key: string]: string } = {};\n lang: string | null = null;\n epageCount: number = 0;\n prePaginated: boolean = false;\n epageIsRenderedPage: boolean = true;\n epageCountCallback: (p1: number) => void | null = null;\n metadata: Meta = {};\n ncxToc: OPFItem = null;\n xhtmlToc: OPFItem = null;\n cover: OPFItem = null;\n fallbackMap: { [key: string]: string } = {};\n pageProgression: Constants.PageProgression | null = null;\n documentURLTransformer: Base.DocumentURLTransformer;\n\n constructor(\n public readonly store: EPUBDocStore,\n public readonly pubURL: string,\n ) {\n this.documentURLTransformer = this.createDocumentURLTransformer();\n checkMathJax();\n }\n\n // FIXME: TS4055\n createDocumentURLTransformer(): Base.DocumentURLTransformer {\n const self = this;\n class OPFDocumentURLTransformer implements Base.DocumentURLTransformer {\n /**\n * @override\n */\n transformFragment(fragment: string, baseURL: string): string {\n const url = baseURL + (fragment ? `#${fragment}` : \"\");\n return transformedIdPrefix + Base.escapeNameStrToHex(url, \":\");\n }\n\n /**\n * @override\n */\n transformURL(url: string, baseURL: string): string {\n const r = url.match(/^([^#]*)#?(.*)$/);\n if (r) {\n const path = r[1] || baseURL;\n const fragment = decodeURIComponent(r[2]);\n if (path) {\n if (self.items.some((item) => item.src === path)) {\n return `#${this.transformFragment(fragment, path)}`;\n }\n }\n }\n return url;\n }\n\n /**\n * @override\n */\n restoreURL(encoded: string): string[] {\n if (encoded.charAt(0) === \"#\") {\n encoded = encoded.substring(1);\n }\n if (encoded.indexOf(transformedIdPrefix) === 0) {\n encoded = encoded.substring(transformedIdPrefix.length);\n }\n const decoded = Base.unescapeStrFromHex(encoded, \":\");\n const r = decoded.match(/^([^#]*)#?(.*)$/);\n return r ? [r[1], r[2]] : [];\n }\n }\n return new OPFDocumentURLTransformer();\n }\n\n /**\n * Metadata is organized in the following way: fully-expanded property names\n * (with IRI prefixes prepended) point to an array of values. Array contains\n * at least one element. First element is primary and should be used by\n * default. Element values are objects have the following keys:\n * - \"v\" - item value as string,\n * - \"s\" - scheme,\n * - \"o\" - index in the order of appearing in the source,\n * - \"r\" - refinement submetadata (organized just like the top-level\n * metadata).\n */\n getMetadata(): Meta {\n return this.metadata;\n }\n\n getPathFromURL(url: string): string | null {\n if (url.startsWith(\"data:\")) {\n return url === this.pubURL ? \"\" : url;\n }\n if (this.pubURL) {\n let epubBaseURL = Base.resolveURL(\"\", this.pubURL);\n if (url === epubBaseURL || url + \"/\" === epubBaseURL) {\n return \"\";\n }\n if (epubBaseURL.charAt(epubBaseURL.length - 1) != \"/\") {\n epubBaseURL += \"/\";\n }\n return url.substr(0, epubBaseURL.length) == epubBaseURL\n ? decodeURI(url.substr(epubBaseURL.length))\n : null;\n } else {\n return url;\n }\n }\n\n initWithXMLDoc(\n opfXML: XmlDoc.XMLDocHolder,\n encXML: XmlDoc.XMLDocHolder,\n zipMetadata: Base.JSON,\n manifestURL: string,\n ): Task.Result<any> {\n this.opfXML = opfXML;\n this.encXML = encXML;\n const pkg = opfXML.doc().child(\"package\");\n const uidref = pkg.attribute(\"unique-identifier\")[0];\n if (uidref) {\n const uidElem = opfXML.getElement(`${opfXML.url}#${uidref}`);\n if (uidElem) {\n this.uid = uidElem.textContent.replace(/[ \\n\\r\\t]/g, \"\");\n }\n }\n const srcToFallbackId = {};\n this.items = pkg\n .child(\"manifest\")\n .child(\"item\")\n .asArray()\n .map((node) => {\n const item = new OPFItem();\n const elem = node as Element;\n item.initWithElement(elem, opfXML.url);\n const fallback = elem.getAttribute(\"fallback\");\n if (fallback && !supportedMediaTypes[item.mediaType]) {\n srcToFallbackId[item.src] = fallback;\n }\n if (!this.xhtmlToc && item.itemProperties[\"nav\"]) {\n this.xhtmlToc = item;\n }\n if (!this.cover && item.itemProperties[\"cover-image\"]) {\n this.cover = item;\n }\n return item;\n });\n this.itemMap = Base.indexArray(\n this.items,\n getOPFItemId as (p1: OPFItem) => string | null,\n );\n this.itemMapByPath = Base.indexArray(this.items, (item) =>\n this.getPathFromURL(item.src),\n );\n for (const src in srcToFallbackId) {\n let fallbackSrc = src;\n while (true) {\n const item = this.itemMap[srcToFallbackId[fallbackSrc]];\n if (!item) {\n break;\n }\n if (supportedMediaTypes[item.mediaType]) {\n this.fallbackMap[src] = item.src;\n break;\n }\n fallbackSrc = item.src;\n }\n }\n this.spine = pkg\n .child(\"spine\")\n .child(\"itemref\")\n .asArray()\n .map((node, index) => {\n const elem = node as Element;\n const id = elem.getAttribute(\"idref\");\n const item = this.itemMap[id as string];\n if (item) {\n item.itemRefElement = elem;\n item.spineIndex = index;\n }\n return item;\n });\n const tocAttr = pkg.child(\"spine\").attribute(\"toc\")[0];\n if (tocAttr) {\n this.ncxToc = this.itemMap[tocAttr];\n }\n const pageProgressionAttr = pkg\n .child(\"spine\")\n .attribute(\"page-progression-direction\")[0];\n if (pageProgressionAttr) {\n this.pageProgression = Constants.pageProgressionOf(pageProgressionAttr);\n }\n const idpfObfURLs = !encXML\n ? []\n : encXML\n .doc()\n .child(\"encryption\")\n .child(\"EncryptedData\")\n .predicate(\n XmlDoc.predicate.withChild(\n \"EncryptionMethod\",\n XmlDoc.predicate.withAttribute(\n \"Algorithm\",\n \"http://www.idpf.org/2008/embedding\",\n ),\n ),\n )\n .child(\"CipherData\")\n .child(\"CipherReference\")\n .attribute(\"URI\");\n const mediaTypeElems = pkg\n .child(\"bindings\")\n .child(\"mediaType\")\n .asArray() as Element[];\n for (let i = 0; i < mediaTypeElems.length; i++) {\n const handlerId = mediaTypeElems[i].getAttribute(\"handler\");\n const mediaType = mediaTypeElems[i].getAttribute(\"media-type\");\n if (mediaType && handlerId && this.itemMap[handlerId]) {\n this.bindings[mediaType] = this.itemMap[handlerId].src;\n }\n }\n this.metadata = readMetadata(\n pkg.child(\"metadata\"),\n pkg.attribute(\"prefix\")[0],\n );\n if (this.metadata[metaTerms.language]) {\n this.lang = this.metadata[metaTerms.language][0][\"v\"];\n }\n if (this.metadata[metaTerms.layout]) {\n this.prePaginated =\n this.metadata[metaTerms.layout][0][\"v\"] === \"pre-paginated\";\n }\n\n if (!zipMetadata) {\n if (idpfObfURLs.length > 0 && this.uid) {\n // Have to deobfuscate in JavaScript\n const deobfuscator = makeDeobfuscator(this.uid);\n for (let i = 0; i < idpfObfURLs.length; i++) {\n this.store.deobfuscators[this.pubURL + idpfObfURLs[i]] = deobfuscator;\n }\n }\n if (this.prePaginated) {\n this.assignAutoPages();\n }\n return Task.newResult(true);\n }\n const manifestText = new Base.StringBuffer();\n const obfuscations = {};\n if (idpfObfURLs.length > 0 && this.uid) {\n // Deobfuscate in the server.\n const obfuscationKey = makeObfuscationKey(this.uid);\n for (let i = 0; i < idpfObfURLs.length; i++) {\n obfuscations[idpfObfURLs[i]] = obfuscationKey;\n }\n }\n for (let i = 0; i < zipMetadata.length; i++) {\n const entry = zipMetadata[i];\n const encodedPath = entry[\"n\"];\n if (encodedPath) {\n const path = decodeURI(encodedPath);\n const item = this.itemMapByPath[path];\n let mediaType: string | null = null;\n if (item) {\n item.compressed = entry[\"m\"] != 0;\n item.compressedSize = entry[\"c\"];\n if (item.mediaType) {\n mediaType = item.mediaType.replace(/\\s+/g, \"\");\n }\n }\n const obfuscation = obfuscations[path];\n if (mediaType || obfuscation) {\n manifestText.append(encodedPath);\n manifestText.append(\" \");\n manifestText.append(mediaType || \"application/octet-stream\");\n if (obfuscation) {\n manifestText.append(\" \");\n manifestText.append(obfuscation);\n }\n manifestText.append(\"\\n\");\n }\n }\n }\n this.assignAutoPages();\n return Net.ajax(\n manifestURL,\n Net.XMLHttpRequestResponseType.DEFAULT,\n \"POST\",\n manifestText.toString(),\n \"text/plain\",\n );\n }\n\n assignAutoPages(): void {\n let epage = 0;\n for (const item of this.spine) {\n const epageCount = this.prePaginated\n ? 1\n : Math.ceil(item.compressedSize / 1024);\n item.epage = epage;\n item.epageCount = epageCount;\n epage += epageCount;\n }\n this.epageCount = epage;\n\n if (this.epageCountCallback) {\n this.epageCountCallback(this.epageCount);\n }\n }\n\n setEPageCountMode(epageIsRenderedPage: boolean) {\n this.epageIsRenderedPage = epageIsRenderedPage || this.prePaginated;\n }\n\n countEPages(\n epageCountCallback: ((p1: number) => void) | null,\n ): Task.Result<boolean> {\n this.epageCountCallback = epageCountCallback;\n\n if (this.epageIsRenderedPage) {\n if (this.prePaginated && this.epageCount == 0) {\n this.assignAutoPages();\n }\n return Task.newResult(true);\n }\n\n let epage = 0;\n let i = 0;\n const frame: Task.Frame<boolean> = Task.newFrame(\"countEPages\");\n frame\n .loopWithFrame((loopFrame) => {\n if (i === this.spine.length) {\n loopFrame.breakLoop();\n return;\n }\n const item = this.spine[i++];\n item.epage = epage;\n this.store.load(item.src).then((xmldoc) => {\n // According to the old comment,\n // \"Estimate that offset=2700 roughly corresponds to 1024 bytes of compressed size.\"\n // However, it should depend on the language.\n // Further adjustment needed.\n\n //let offsetPerEPage = 2700;\n let offsetPerEPage = 1800;\n const lang = xmldoc.lang || this.lang;\n if (lang && lang.match(/^(ja|ko|zh)/)) {\n offsetPerEPage /= 3;\n }\n item.epageCount = Math.ceil(xmldoc.getTotalOffset() / offsetPerEPage);\n epage += item.epageCount;\n this.epageCount = epage;\n if (this.epageCountCallback) {\n this.epageCountCallback(this.epageCount);\n }\n loopFrame.continueLoop();\n });\n })\n .thenFinish(frame);\n return frame.result();\n }\n\n /**\n * Creates a fake OPF \"document\" that contains OPS chapters.\n */\n initWithChapters(params: OPFItemParam[], doc?: Document | null) {\n this.itemMap = {};\n this.itemMapByPath = {};\n this.items = [];\n this.spine = this.items;\n\n // create a minimum fake OPF XML for navigation with EPUB CFI\n const opfXML = (this.opfXML = new XmlDoc.XMLDocHolder(\n null,\n \"\",\n new DOMParser().parseFromString(\"<spine></spine>\", \"text/xml\"),\n ));\n params.forEach((param) => {\n const item = new OPFItem();\n item.initWithParam(param);\n Asserts.assert(item.id);\n const itemref = opfXML.document.createElement(\"itemref\");\n itemref.setAttribute(\"idref\", item.id);\n opfXML.root.appendChild(itemref);\n item.itemRefElement = itemref;\n this.itemMap[item.id] = item;\n let path = this.getPathFromURL(param.url);\n if (path == null) {\n path = param.url;\n }\n this.itemMapByPath[path] = item;\n this.items.push(item);\n });\n if (doc) {\n return this.store.addDocument(params[0].url, doc);\n } else {\n return Task.newResult(null);\n }\n }\n\n initWithWebPubManifest(\n manifestObj: Base.JSON,\n doc?: Document,\n manifestUrl?: string,\n ): Task.Result<boolean> {\n if (manifestObj[\"readingProgression\"]) {\n this.pageProgression = manifestObj[\"readingProgression\"];\n }\n if (this.metadata === undefined) {\n this.metadata = {};\n }\n const title =\n (doc && doc.title) ||\n manifestObj[\"name\"] ||\n (manifestObj[\"metadata\"] && manifestObj[\"metadata\"][\"title\"]);\n if (title) {\n this.metadata[metaTerms.title] = [{ v: title }];\n }\n // TODO: other metadata...\n\n const primaryEntryPath = this.getPathFromURL(this.pubURL);\n if (!manifestObj[\"readingOrder\"] && doc && primaryEntryPath !== null) {\n manifestObj[\"readingOrder\"] = [encodeURI(primaryEntryPath)];\n\n // Find TOC in the primary entry (X)HTML\n const selector =\n \"[role=doc-toc] a[href],\" +\n \"[role=directory] a[href],\" +\n \"nav li a[href],\" +\n \".toc a[href],\" +\n \"#toc a[href]\";\n for (const anchorElem of doc.querySelectorAll(selector)) {\n const href = anchorElem.getAttribute(\"href\");\n if (/^(https?:)?\\/\\//.test(href)) {\n // Avoid link to external resources\n continue;\n }\n const hrefNoFragment = Base.stripFragment(\n Base.resolveURL(href, this.pubURL),\n );\n const path = this.getPathFromURL(hrefNoFragment);\n const url = path !== null ? encodeURI(path) : hrefNoFragment;\n if (manifestObj[\"readingOrder\"].indexOf(url) == -1) {\n manifestObj[\"readingOrder\"].push(url);\n }\n }\n }\n\n const params = [];\n let itemCount = 0;\n let tocFound = -1;\n [manifestObj[\"readingOrder\"], manifestObj[\"resources\"]].forEach(\n (readingOrderOrResources) => {\n if (readingOrderOrResources instanceof Array) {\n readingOrderOrResources.forEach((itemObj) => {\n const isInReadingOrder = manifestObj[\"readingOrder\"].includes(\n itemObj,\n );\n const url =\n typeof itemObj === \"string\"\n ? itemObj\n : itemObj.url || itemObj.href;\n const encodingFormat =\n typeof itemObj === \"string\"\n ? \"\"\n : itemObj.encodingFormat ||\n (itemObj.href && itemObj.type) ||\n \"\";\n if (\n isInReadingOrder ||\n encodingFormat === \"text/html\" ||\n encodingFormat === \"application/xhtml+xml\" ||\n /(^|\\/)([^/]+\\.(x?html|htm|xht)|[^/.]*)([#?]|$)/.test(url)\n ) {\n const param = {\n url: Base.resolveURL(\n Base.convertSpecialURL(url),\n manifestUrl || this.pubURL,\n ),\n index: itemCount++,\n startPage: null,\n skipPagesBefore: null,\n };\n if (itemObj.rel === \"contents\" && tocFound === -1) {\n tocFound = param.index;\n }\n params.push(param);\n\n //TODO: items not in readingOrder should be excluded from linear reading but available with internal link navigation.\n }\n });\n }\n },\n );\n const frame: Task.Frame<boolean> = Task.newFrame(\"initWithWebPubManifest\");\n this.initWithChapters(params).then(() => {\n if (tocFound !== -1) {\n this.xhtmlToc = this.items[tocFound];\n }\n\n if (!this.xhtmlToc) {\n this.xhtmlToc = manifestUrl\n ? this.items?.[0]\n : this.itemMapByPath[primaryEntryPath];\n }\n\n frame.finish(true);\n });\n return frame.result();\n }\n\n /**\n * @return cfi\n */\n getCFI(spineIndex: number, offsetInItem: number): Task.Result<string | null> {\n const item = this.spine[spineIndex];\n const frame: Task.Frame<string | null> = Task.newFrame(\"getCFI\");\n this.store.load(item.src).then((xmldoc: XmlDoc.XMLDocHolder) => {\n const node = xmldoc.getNodeByOffset(offsetInItem);\n let cfi: string | null = null;\n if (node) {\n const startOffset = xmldoc.getNodeOffset(node, 0, false);\n const offsetInNode = offsetInItem - startOffset;\n const fragment = new CFI.Fragment();\n fragment.prependPathFromNode(node, offsetInNode, false, null);\n if (item.itemRefElement) {\n fragment.prependPathFromNode(item.itemRefElement, 0, false, null);\n }\n cfi = fragment.toString();\n }\n frame.finish(cfi);\n });\n return frame.result();\n }\n\n resolveFragment(fragstr: string | null): Task.Result<Position | null> {\n return Task.handle(\n \"resolveFragment\",\n (frame: Task.Frame<Position | null>): void => {\n if (!fragstr) {\n frame.finish(null);\n return;\n }\n let fragment = new CFI.Fragment();\n fragment.fromString(fragstr);\n let item: OPFItem;\n if (this.opfXML) {\n const opfNav = fragment.navigate(this.opfXML.document);\n if (opfNav.node.nodeType != 1 || opfNav.after || !opfNav.ref) {\n frame.finish(null);\n return;\n }\n const elem = opfNav.node as Element;\n const idref = elem.getAttribute(\"idref\");\n if (elem.localName != \"itemref\" || !idref || !this.itemMap[idref]) {\n frame.finish(null);\n return;\n }\n item = this.itemMap[idref];\n fragment = opfNav.ref;\n } else {\n item = this.spine[0];\n }\n this.store.load(item.src).then((xmldoc: XmlDoc.XMLDocHolder) => {\n const nodeNav = fragment.navigate(xmldoc.document);\n const offset = xmldoc.getNodeOffset(\n nodeNav.node,\n nodeNav.offset,\n nodeNav.after,\n );\n frame.finish({\n spineIndex: item.spineIndex,\n offsetInItem: offset,\n pageIndex: -1,\n });\n });\n },\n (frame: Task.Frame<Position | null>, err: Error): void => {\n Logging.logger.warn(err, \"Cannot resolve fragment:\", fragstr);\n frame.finish(null);\n },\n );\n }\n\n resolveEPage(epage: number): Task.Result<Position | null> {\n return Task.handle(\n \"resolveEPage\",\n (frame: Task.Frame<Position | null>): void => {\n if (epage <= 0) {\n frame.finish({ spineIndex: 0, offsetInItem: 0, pageIndex: -1 });\n return;\n }\n if (this.epageIsRenderedPage) {\n let spineIndex = this.spine.findIndex((item) => {\n return (\n (item.epage == 0 && item.epageCount == 0) ||\n (item.epage <= epage && item.epage + item.epageCount > epage)\n );\n });\n if (spineIndex == -1) {\n spineIndex = this.spine.length - 1;\n }\n let item = this.spine[spineIndex];\n if (!item || item.epageCount == 0) {\n item = this.spine[--spineIndex];\n }\n const pageIndex = Math.floor(epage - item.epage);\n frame.finish({ spineIndex, offsetInItem: -1, pageIndex: pageIndex });\n return;\n }\n let spineIndex = Base.binarySearch(this.spine.length, (index) => {\n const item = this.spine[index];\n return item.epage + item.epageCount > epage;\n });\n if (spineIndex == this.spine.length) {\n spineIndex--;\n }\n const item = this.spine[spineIndex];\n this.store.load(item.src).then((xmldoc: XmlDoc.XMLDocHolder) => {\n epage -= item.epage;\n if (epage > item.epageCount) {\n epage = item.epageCount;\n }\n let offset = 0;\n if (epage > 0) {\n const totalOffset = xmldoc.getTotalOffset();\n offset = Math.round((totalOffset * epage) / item.epageCount);\n if (offset == totalOffset) {\n offset--;\n }\n }\n frame.finish({ spineIndex, offsetInItem: offset, pageIndex: -1 });\n });\n },\n (frame: Task.Frame<Position | null>, err: Error): void => {\n Logging.logger.warn(err, \"Cannot resolve epage:\", epage);\n frame.finish(null);\n },\n );\n }\n\n getEPageFromPosition(position: Position): Task.Result<number> {\n const item = this.spine[position.spineIndex];\n if (this.epageIsRenderedPage) {\n const epage = item.epage + position.pageIndex;\n return Task.newResult(epage);\n }\n if (position.offsetInItem <= 0) {\n return Task.newResult(item.epage);\n }\n const frame: Task.Frame<number> = Task.newFrame(\"getEPage\");\n this.store.load(item.src).then((xmldoc: XmlDoc.XMLDocHolder) => {\n const totalOffset = xmldoc.getTotalOffset();\n const offset = Math.min(totalOffset, position.offsetInItem);\n frame.finish(item.epage + (offset * item.epageCount) / totalOffset);\n });\n return frame.result();\n }\n}\n\nexport type PageAndPosition = {\n page: Vtree.Page;\n position: Position;\n};\n\nexport const makePageAndPosition = (\n page: Vtree.Page,\n pageIndex: number,\n): PageAndPosition => ({\n page,\n position: {\n spineIndex: page.spineIndex,\n pageIndex,\n offsetInItem: page.offset,\n },\n});\n\nexport type OPFViewItem = {\n item: OPFItem;\n xmldoc: XmlDoc.XMLDocHolder;\n instance: OPS.StyleInstance;\n layoutPositions: Vtree.LayoutPosition[];\n pages: Vtree.Page[];\n complete: boolean;\n};\n\nexport class OPFView implements Vgen.CustomRendererFactory {\n spineItems: OPFViewItem[] = [];\n spineItemLoadingContinuations: Task.Continuation<any>[][] = [];\n pref: Exprs.Preferences;\n clientLayout: Vgen.DefaultClientLayout;\n counterStore: Counters.CounterStore;\n tocAutohide: boolean = false;\n tocView?: Toc.TOCView;\n\n constructor(\n public readonly opf: OPFDoc,\n public readonly viewport: Vgen.Viewport,\n public readonly fontMapper: Font.Mapper,\n pref: Exprs.Preferences,\n public readonly pageSheetSizeReporter: (\n p1: { width: number; height: number },\n p2: { [key: string]: { width: number; height: number } },\n p3: number,\n p4: number,\n ) => any,\n ) {\n this.pref = Exprs.clonePreferences(pref);\n this.clientLayout = new Vgen.DefaultClientLayout(viewport);\n this.counterStore = new Counters.CounterStore(opf.documentURLTransformer);\n }\n\n private getPage(position: Position): Vtree.Page {\n const viewItem = this.spineItems[position.spineIndex];\n return viewItem ? viewItem.pages[position.pageIndex] : null;\n }\n\n getCurrentPageProgression(\n position: Position,\n ): Constants.PageProgression | null {\n if (this.opf.pageProgression) {\n return this.opf.pageProgression;\n } else {\n const viewItem = this.spineItems[position ? position.spineIndex : 0];\n return viewItem ? viewItem.instance.pageProgression : null;\n }\n }\n\n private finishPageContainer(\n viewItem: OPFViewItem,\n page: Vtree.Page,\n pageIndex: number,\n ) {\n page.container.style.display = \"none\";\n page.container.style.visibility = \"visible\";\n page.container.style.position = \"\";\n page.container.style.top = \"\";\n page.container.style.left = \"\";\n page.container.setAttribute(\n \"data-vivliostyle-page-side\",\n page.side as string,\n );\n const oldPage = viewItem.pages[pageIndex];\n page.isFirstPage = viewItem.item.spineIndex == 0 && pageIndex == 0;\n viewItem.pages[pageIndex] = page;\n\n if (this.opf.epageIsRenderedPage) {\n if (pageIndex == 0 && viewItem.item.spineIndex > 0) {\n const prevItem = this.opf.spine[viewItem.item.spineIndex - 1];\n viewItem.item.epage = prevItem.epage + prevItem.epageCount;\n }\n viewItem.item.epageCount = viewItem.pages.length;\n this.opf.epageCount = this.opf.spine.reduce(\n (count, item) => count + item.epageCount,\n 0,\n );\n\n if (this.opf.epageCountCallback) {\n this.opf.epageCountCallback(this.opf.epageCount);\n }\n }\n\n if (oldPage) {\n viewItem.instance.viewport.contentContainer.replaceChild(\n page.container,\n oldPage.container,\n );\n oldPage.dispatchEvent({\n type: \"replaced\",\n target: null,\n currentTarget: null,\n preventDefault: null,\n newPage: page,\n });\n } else {\n // Find insert position in contentContainer.\n let insertPos: Element | null = null;\n if (pageIndex > 0) {\n insertPos = viewItem.pages[pageIndex - 1].container.nextElementSibling;\n } else {\n for (\n let i = viewItem.item.spineIndex + 1;\n i < this.spineItems.length;\n i++\n ) {\n const item = this.spineItems[i];\n if (item && item.pages[0]) {\n insertPos = item.pages[0].container;\n break;\n }\n }\n }\n viewItem.instance.viewport.contentContainer.insertBefore(\n page.container,\n insertPos,\n );\n }\n this.pageSheetSizeReporter(\n {\n width: viewItem.instance.pageSheetWidth,\n height: viewItem.instance.pageSheetHeight,\n },\n viewItem.instance.pageSheetSize,\n viewItem.item.spineIndex,\n viewItem.instance.pageNumberOffset + pageIndex,\n );\n }\n\n /**\n * Render a single page. If the new page contains elements with ids that are\n * referenced from other pages by 'target-counter()', those pages are rendered\n * too (calling `renderSinglePage` recursively).\n */\n private renderSinglePage(\n viewItem: OPFViewItem,\n pos: Vtree.LayoutPosition,\n ): Task.Result<RenderSinglePageResult> {\n const frame: Task.Frame<RenderSinglePageResult> = Task.newFrame(\n \"renderSinglePage\",\n );\n let page = this.makePage(viewItem, pos);\n viewItem.instance.layoutNextPage(page, pos).then((posParam) => {\n pos = posParam as Vtree.LayoutPosition;\n const pageIndex = pos\n ? pos.page - 1\n : viewItem.layoutPositions.length - 1;\n this.finishPageContainer(viewItem, page, pageIndex);\n this.counterStore.finishPage(page.spineIndex, pageIndex);\n\n // If the position of the page break change, we should re-layout the next\n // page too.\n let cont: Task.Result<any> = null;\n if (pos) {\n const prevPos = viewItem.layoutPositions[pos.page];\n viewItem.layoutPositions[pos.page] = pos;\n if (prevPos && viewItem.pages[pos.page]) {\n if (!pos.isSamePosition(prevPos)) {\n cont = this.renderSinglePage(viewItem, pos);\n }\n }\n }\n if (!cont) {\n cont = Task.newResult(true);\n }\n cont.then(() => {\n const unresolvedRefs = this.counterStore.getUnresolvedRefsToPage(page);\n let index = 0;\n frame\n .loopWithFrame((loopFrame) => {\n index++;\n if (index > unresolvedRefs.length) {\n loopFrame.breakLoop();\n return;\n }\n const refs = unresolvedRefs[index - 1];\n refs.refs = refs.refs.filter((ref) => !ref.isResolved());\n if (refs.refs.length === 0) {\n loopFrame.continueLoop();\n return;\n }\n this.getPageViewItem(refs.spineIndex).then((viewItem) => {\n if (!viewItem) {\n loopFrame.continueLoop();\n return;\n }\n this.counterStore.pushPageCounters(refs.pageCounters);\n this.counterStore.pushReferencesToSolve(refs.refs);\n const pos = viewItem.layoutPositions[refs.pageIndex];\n this.renderSinglePage(viewItem, pos).then((result) => {\n this.counterStore.popPageCounters();\n this.counterStore.popReferencesToSolve();\n const resultPosition = result.pageAndPosition.position;\n if (\n resultPosition.spineIndex === page.spineIndex &&\n resultPosition.pageIndex === pageIndex\n ) {\n page = result.pageAndPosition.page;\n }\n loopFrame.continueLoop();\n });\n });\n })\n .then(() => {\n if (!page.container.parentElement) {\n // page is replaced\n page = viewItem.pages[pageIndex];\n }\n page.isLastPage =\n !pos && viewItem.item.spineIndex === this.opf.spine.length - 1;\n if (page.isLastPage) {\n Asserts.assert(this.viewport);\n this.counterStore.finishLastPage(this.viewport);\n }\n frame.finish({\n pageAndPosition: makePageAndPosition(page, pageIndex),\n nextLayoutPosition: pos,\n });\n });\n });\n });\n return frame.result();\n }\n\n private normalizeSeekPosition(\n position: Position,\n viewItem: OPFViewItem,\n ): Position | null {\n let pageIndex = position.pageIndex;\n let seekOffset = -1;\n if (pageIndex < 0) {\n seekOffset = position.offsetInItem;\n\n // page with offset higher than seekOffset\n const seekOffsetPageIndex = Base.binarySearch(\n viewItem.layoutPositions.length,\n (pageIndex) => {\n // 'noLookAhead' argument of getPosition must be true, since\n // otherwise StyleInstance.currentLayoutPosition is modified\n // unintentionally.\n const offset = viewItem.instance.getPosition(\n viewItem.layoutPositions[pageIndex],\n true,\n );\n return offset > seekOffset;\n },\n );\n if (seekOffsetPageIndex === viewItem.layoutPositions.length) {\n if (viewItem.complete) {\n pageIndex = viewItem.layoutPositions.length - 1;\n } else {\n // need to search through pages that are not yet produced\n pageIndex = Number.POSITIVE_INFINITY;\n }\n } else {\n // page that contains seekOffset\n pageIndex = seekOffsetPageIndex - 1;\n }\n } else if (\n pageIndex === Number.POSITIVE_INFINITY &&\n position.offsetInItem !== -1\n ) {\n seekOffset = position.offsetInItem;\n }\n return {\n spineIndex: position.spineIndex,\n pageIndex,\n offsetInItem: seekOffset,\n } as Position;\n }\n\n /**\n * Find a page corresponding to a specified position among already laid out\n * pages.\n * @param sync If true, find the page synchronously (not waiting another\n * rendering task)\n */\n private findPage(\n position: Position,\n sync: boolean,\n ): Task.Result<PageAndPosition | null> {\n const frame: Task.Frame<PageAndPosition | null> = Task.newFrame(\"findPage\");\n this.getPageViewItem(position.spineIndex).then((viewItem) => {\n if (!viewItem) {\n frame.finish(null);\n return;\n }\n let resultPage: Vtree.Page = null;\n let pageIndex: number;\n frame\n .loopWithFrame((loopFrame) => {\n const normalizedPosition = this.normalizeSeekPosition(\n position,\n viewItem,\n );\n pageIndex = normalizedPosition.pageIndex;\n resultPage = viewItem.pages[pageIndex];\n if (resultPage) {\n loopFrame.breakLoop();\n } else if (viewItem.complete) {\n pageIndex = viewItem.layoutPositions.length - 1;\n resultPage = viewItem.pages[pageIndex];\n loopFrame.breakLoop();\n } else if (sync) {\n this.renderPage(normalizedPosition).then((result) => {\n if (result) {\n resultPage = result.page;\n pageIndex = result.position.pageIndex;\n }\n loopFrame.breakLoop();\n });\n } else {\n // Wait for the layout task and retry\n frame.sleep(100).then(() => {\n loopFrame.continueLoop();\n });\n }\n })\n .then(() => {\n Asserts.assert(resultPage);\n frame.finish(makePageAndPosition(resultPage, pageIndex));\n });\n });\n return frame.result();\n }\n\n /**\n * Renders a page at the specified position.\n */\n renderPage(position: Position): Task.Result<PageAndPosition | null> {\n const frame: Task.Frame<PageAndPosition | null> = Task.newFrame(\n \"renderPage\",\n );\n this.getPageViewItem(position.spineIndex).then((viewItem) => {\n if (!viewItem) {\n frame.finish(null);\n return;\n }\n const normalizedPosition = this.normalizeSeekPosition(position, viewItem);\n let pageIndex = normalizedPosition.pageIndex;\n const seekOffset = normalizedPosition.offsetInItem;\n let resultPage = viewItem.pages[pageIndex];\n if (resultPage) {\n frame.finish(makePageAndPosition(resultPage, pageIndex));\n return;\n }\n frame\n .loopWithFrame((loopFrame) => {\n if (pageIndex < viewItem.layoutPositions.length) {\n loopFrame.breakLoop();\n return;\n }\n if (viewItem.complete) {\n pageIndex = viewItem.layoutPositions.length - 1;\n loopFrame.breakLoop();\n return;\n }\n let pos =\n viewItem.layoutPositions[viewItem.layoutPositions.length - 1];\n this.renderSinglePage(viewItem, pos).then((result) => {\n const page = result.pageAndPosition.page;\n pos = result.nextLayoutPosition;\n if (pos) {\n if (seekOffset >= 0) {\n // Searching for offset, don't know the page number.\n const offset = viewItem.instance.getPosition(pos);\n if (offset > seekOffset) {\n resultPage = page;\n pageIndex = viewItem.layoutPositions.length - 2;\n loopFrame.breakLoop();\n return;\n }\n }\n loopFrame.continueLoop();\n } else {\n resultPage = page;\n pageIndex = result.pageAndPosition.position.pageIndex;\n viewItem.complete = true;\n loopFrame.breakLoop();\n }\n });\n })\n .then(() => {\n resultPage = resultPage || viewItem.pages[pageIndex];\n const pos = viewItem.layoutPositions[pageIndex];\n if (resultPage) {\n frame.finish(makePageAndPosition(resultPage, pageIndex));\n return;\n }\n this.renderSinglePage(viewItem, pos).then((result) => {\n if (!result.nextLayoutPosition) {\n viewItem.complete = true;\n }\n frame.finish(result.pageAndPosition);\n });\n });\n });\n return frame.result();\n }\n\n renderAllPages(): Task.Result<PageAndPosition | null> {\n return this.renderPagesUpto(\n {\n spineIndex: this.opf.spine.length - 1,\n pageIndex: Number.POSITIVE_INFINITY,\n offsetInItem: -1,\n },\n false,\n );\n }\n\n /**\n * Render pages from (spineIndex=0, pageIndex=0) to the specified (spineIndex,\n * pageIndex).\n * @param notAllPages If true, render from biginning of specified spine item.\n */\n renderPagesUpto(\n position: Position,\n notAllPages: boolean,\n ): Task.Result<PageAndPosition | null> {\n const frame: Task.Frame<PageAndPosition | null> = Task.newFrame(\n \"renderPagesUpto\",\n );\n if (!position) {\n position = { spineIndex: 0, pageIndex: 0, offsetInItem: 0 };\n }\n const spineIndex = position.spineIndex;\n const pageIndex = position.pageIndex;\n let s = 0;\n\n if (notAllPages) {\n // Render pages from biginning of specified spine item.\n s = spineIndex;\n }\n\n let lastResult: PageAndPosition;\n frame\n .loopWithFrame((loopFrame) => {\n const pos = {\n spineIndex: s,\n pageIndex: s === spineIndex ? pageIndex : Number.POSITIVE_INFINITY,\n offsetInItem: s === spineIndex ? position.offsetInItem : -1,\n };\n this.renderPage(pos).then((result) => {\n lastResult = result;\n if (++s > spineIndex) {\n loopFrame.breakLoop();\n } else {\n loopFrame.continueLoop();\n }\n });\n })\n .then(() => {\n frame.finish(lastResult);\n });\n return frame.result();\n }\n\n /**\n * Move to the first page and render it.\n */\n firstPage(\n position: Position,\n sync: boolean,\n ): Task.Result<PageAndPosition | null> {\n return this.findPage(\n { spineIndex: 0, pageIndex: 0, offsetInItem: -1 },\n sync,\n );\n }\n\n /**\n * Move to the last page and render it.\n */\n lastPage(\n position: Position,\n sync: boolean,\n ): Task.Result<PageAndPosition | null> {\n return this.findPage(\n {\n spineIndex: this.opf.spine.length - 1,\n pageIndex: Number.POSITIVE_INFINITY,\n offsetInItem: -1,\n },\n sync,\n );\n }\n\n /**\n * Move to the next page position and render page.\n * @param sync If true, get the page synchronously (not waiting another\n * rendering task)\n */\n nextPage(\n position: Position,\n sync: boolean,\n ): Task.Result<PageAndPosition | null> {\n let spineIndex = position.spineIndex;\n let pageIndex = position.pageIndex;\n const frame: Task.Frame<PageAndPosition | null> = Task.newFrame(\"nextPage\");\n this.getPageViewItem(spineIndex).then((viewItem) => {\n if (!viewItem) {\n frame.finish(null);\n return;\n }\n if (\n viewItem.complete &&\n pageIndex == viewItem.layoutPositions.length - 1\n ) {\n if (spineIndex >= this.opf.spine.length - 1) {\n frame.finish(null);\n return;\n }\n spineIndex++;\n pageIndex = 0;\n\n // Remove next viewItem if its first page has same side as the current page\n // to avoid unpaired page.\n const nextViewItem = this.spineItems[spineIndex];\n const nextPage = nextViewItem && nextViewItem.pages[0];\n const currentPage = viewItem.pages[viewItem.pages.length - 1];\n if (nextPage && currentPage && nextPage.side == currentPage.side) {\n nextViewItem.pages.forEach((page) => {\n if (page.container) page.container.remove();\n });\n this.spineItems[spineIndex] = null;\n this.spineItemLoadingContinuations[spineIndex] = null;\n }\n } else {\n pageIndex++;\n }\n this.findPage(\n { spineIndex, pageIndex, offsetInItem: -1 },\n sync,\n ).thenFinish(frame);\n });\n return frame.result();\n }\n\n /**\n * Move to the previous page and render it.\n */\n previousPage(\n position: Position,\n sync: boolean,\n ): Task.Result<PageAndPosition | null> {\n let spineIndex = position.spineIndex;\n let pageIndex = position.pageIndex;\n if (pageIndex == 0) {\n if (spineIndex == 0) {\n return Task.newResult(null as PageAndPosition | null);\n }\n spineIndex--;\n pageIndex = Number.POSITIVE_INFINITY;\n } else {\n pageIndex--;\n }\n return this.findPage({ spineIndex, pageIndex, offsetInItem: -1 }, sync);\n }\n\n /**\n * @param page This page should be a currently displayed page.\n */\n private isRectoPage(page: Vtree.Page, position: Position): boolean {\n const isLeft = page.side === Constants.PageSide.LEFT;\n const isLTR =\n this.getCurrentPageProgression(position) ===\n Constants.PageProgression.LTR;\n return (!isLeft && isLTR) || (isLeft && !isLTR);\n }\n\n /**\n * Get a spread containing the currently displayed page.\n * @param sync If true, get the spread synchronously (not waiting another\n * rendering task)\n */\n getSpread(position: Position, sync: boolean): Task.Result<Vtree.Spread> {\n const frame: Task.Frame<Vtree.Spread> = Task.newFrame(\"getCurrentSpread\");\n const page = this.getPage(position);\n if (!page) {\n return Task.newResult(\n /** @type Vtree.Spread */\n { left: null, right: null } as Vtree.Spread,\n );\n }\n const isLeft = page.side === Constants.PageSide.LEFT;\n let other: Task.Result<PageAndPosition>;\n if (this.isRectoPage(page, position)) {\n other = this.previousPage(position, sync);\n } else {\n other = this.nextPage(position, sync);\n }\n other.then((otherPageAndPosition) => {\n // this page may be replaced during nextPage(), so get thisPage again.\n const thisPage = this.getPage(position);\n\n let otherPage = otherPageAndPosition && otherPageAndPosition.page;\n if (otherPage && otherPage.side === thisPage.side) {\n // otherPage must not be same side\n otherPage = null;\n }\n\n if (isLeft) {\n frame.finish({ left: thisPage, right: otherPage });\n } else {\n frame.finish({ left: otherPage, right: thisPage });\n }\n });\n return frame.result();\n }\n\n /**\n * Move to the next spread and render pages.\n * @param sync If true, get the spread synchronously (not waiting another\n * rendering task)\n * @returns The 'verso' page of the next spread.\n */\n nextSpread(\n position: Position,\n sync: boolean,\n ): Task.Result<PageAndPosition | null> {\n const page = this.getPage(position);\n if (!page) {\n return Task.newResult(null as PageAndPosition | null);\n }\n const isRecto = this.isRectoPage(page, position);\n const next = this.nextPage(position, sync);\n if (isRecto) {\n return next;\n } else {\n return next.thenAsync((result) => {\n if (result) {\n if (result.page.side === page.side) {\n // If same side, this is the next spread.\n return next;\n }\n const next2 = this.nextPage(result.position, sync);\n return next2.thenAsync((result2) => {\n if (result2) {\n return next2;\n } else {\n // If this is tha last spread, move to next page in the same spread.\n return next;\n }\n });\n } else {\n return Task.newResult(null as PageAndPosition | null);\n }\n });\n }\n }\n\n /**\n * Move to the previous spread and render pages.\n * @returns The 'recto' page of the previous spread.\n */\n previousSpread(\n position: Position,\n sync: boolean,\n ): Task.Result<PageAndPosition | null> {\n const page = this.getPage(position);\n if (!page) {\n return Task.newResult(null as PageAndPosition | null);\n }\n const isRecto = this.isRectoPage(page, position);\n const prev = this.previousPage(position, sync);\n const oldPrevPageCont = page.container.previousElementSibling;\n if (isRecto) {\n return prev.thenAsync((result) => {\n if (result) {\n if (result.page.side === page.side) {\n // If same side, this is the previous spread.\n return prev;\n }\n if (result.page.container !== oldPrevPageCont) {\n // If previous page is changed, return it.\n return prev;\n }\n return this.previousPage(result.position, sync);\n } else {\n return Task.newResult(null as PageAndPosition | null);\n }\n });\n } else {\n return prev;\n }\n }\n\n /**\n * Move to the epage specified by the given number (zero-based) and render it.\n */\n navigateToEPage(\n epage: number,\n position: Position,\n sync: boolean,\n ): Task.Result<PageAndPosition | null> {\n const frame: Task.Frame<PageAndPosition | null> = Task.newFrame(\n \"navigateToEPage\",\n );\n this.opf.resolveEPage(epage).then((position) => {\n if (position) {\n this.findPage(position, sync).thenFinish(frame);\n } else {\n frame.finish(null);\n }\n });\n return frame.result();\n }\n\n /**\n * Move to the page specified by the given CFI and render it.\n */\n navigateToFragment(\n fragment: string,\n position: Position,\n sync: boolean,\n ): Task.Result<PageAndPosition | null> {\n const frame: Task.Frame<PageAndPosition | null> = Task.newFrame(\n \"navigateToCFI\",\n );\n this.opf.resolveFragment(fragment).then((position) => {\n if (position) {\n this.findPage(position, sync).thenFinish(frame);\n } else {\n frame.finish(null);\n }\n });\n return frame.result();\n }\n\n /**\n * Move to the page specified by the given URL and render it.\n */\n navigateTo(\n href: string,\n position: Position,\n sync: boolean,\n ): Task.Result<PageAndPosition | null> {\n Logging.logger.debug(\"Navigate to\", href);\n let path = this.opf.getPathFromURL(Base.stripFragment(href));\n if (!path) {\n if (this.opf.opfXML && href.match(/^#epubcfi\\(/)) {\n // CFI fragment is \"relative\" to OPF.\n path = this.opf.getPathFromURL(this.opf.opfXML.url);\n } else if (href.charAt(0) === \"#\") {\n const restored = this.opf.documentURLTransformer.restoreURL(href);\n if (this.opf.opfXML) {\n path = this.opf.getPathFromURL(restored[0]);\n if (path == null) {\n path = restored[0];\n }\n } else {\n path = restored[0];\n }\n href = restored[0] + (restored[1] ? `#${restored[1]}` : \"\");\n }\n if (path == null) {\n return Task.newResult(null as PageAndPosition | null);\n }\n }\n const item = this.opf.itemMapByPath[path];\n if (!item) {\n if (\n this.opf.opfXML &&\n path == this.opf.getPathFromURL(this.opf.opfXML.url)\n ) {\n // CFI link?\n const fragmentIndex = href.indexOf(\"#\");\n if (fragmentIndex >= 0) {\n return this.navigateToFragment(\n href.substr(fragmentIndex + 1),\n position,\n sync,\n );\n }\n }\n return Task.newResult(null as PageAndPosition | null);\n }\n const frame: Task.Frame<PageAndPosition | null> = Task.newFrame(\n \"navigateTo\",\n );\n this.getPageViewItem(item.spineIndex).then((viewItem) => {\n if (!viewItem) {\n frame.finish(null);\n return;\n }\n const target = viewItem.xmldoc.getElement(href);\n if (target) {\n this.findPage(\n {\n spineIndex: item.spineIndex,\n pageIndex: -1,\n offsetInItem: viewItem.xmldoc.getElementOffset(target),\n },\n sync,\n ).thenFinish(frame);\n } else if (position.spineIndex !== item.spineIndex) {\n // no fragment, different spine item\n this.findPage(\n {\n spineIndex: item.spineIndex,\n pageIndex: 0,\n offsetInItem: -1,\n },\n sync,\n ).thenFinish(frame);\n } else {\n frame.finish(null);\n }\n });\n return frame.result();\n }\n\n makePage(viewItem: OPFViewItem, pos: Vtree.LayoutPosition): Vtree.Page {\n const viewport = viewItem.instance.viewport;\n const pageCont = viewport.document.createElement(\"div\") as HTMLElement;\n pageCont.setAttribute(\"data-vivliostyle-page-container\", \"true\");\n pageCont.setAttribute(\"role\", \"region\");\n pageCont.style.position = \"absolute\";\n pageCont.style.top = \"0\";\n pageCont.style.left = \"0\";\n if (!Constants.isDebug) {\n pageCont.style.visibility = \"hidden\";\n pageCont.setAttribute(\"aria-hidden\", \"true\");\n }\n viewport.layoutBox.appendChild(pageCont);\n const bleedBox = viewport.document.createElement(\"div\") as HTMLElement;\n bleedBox.setAttribute(\"data-vivliostyle-bleed-box\", \"true\");\n pageCont.appendChild(bleedBox);\n const page = new Vtree.Page(pageCont, bleedBox);\n page.spineIndex = viewItem.item.spineIndex;\n page.position = pos;\n page.offset = viewItem.instance.getPosition(pos);\n if (page.offset === 0) {\n const id = this.opf.documentURLTransformer.transformFragment(\n \"\",\n viewItem.item.src,\n );\n bleedBox.setAttribute(\"id\", id);\n page.registerElementWithId(bleedBox, id);\n }\n if (viewport !== this.viewport) {\n const matrix = Exprs.letterbox(\n this.viewport.width,\n this.viewport.height,\n viewport.width,\n viewport.height,\n );\n const cssMatrix = CssParser.parseValue(\n null,\n new CssTokenizer.Tokenizer(matrix, null),\n \"\",\n );\n page.delayedItems.push(\n new Vtree.DelayedItem(pageCont, \"transform\", cssMatrix),\n );\n }\n return page;\n }\n\n makeObjectView(\n xmldoc: XmlDoc.XMLDocHolder,\n srcElem: Element,\n viewParent: Element,\n computedStyle: { [key: string]: Css.Val },\n ): Task.Result<Element> {\n let data = srcElem.getAttribute(\"data\");\n let result: Element | null = null;\n if (data) {\n data = Base.resolveURL(data, xmldoc.url);\n let mediaType = srcElem.getAttribute(\"media-type\");\n if (!mediaType) {\n const path = this.opf.getPathFromURL(data);\n if (path) {\n const item = this.opf.itemMapByPath[path];\n if (item) {\n mediaType = item.mediaType;\n }\n }\n }\n if (mediaType) {\n const handlerSrc = this.opf.bindings[mediaType];\n if (handlerSrc) {\n result = this.viewport.document.createElement(\"iframe\");\n (result as HTMLElement).style.border = \"none\";\n const srcParam = Base.lightURLEncode(data);\n const typeParam = Base.lightURLEncode(mediaType);\n const sb = new Base.StringBuffer();\n sb.append(handlerSrc);\n sb.append(\"?src=\");\n sb.append(srcParam);\n sb.append(\"&type=\");\n sb.append(typeParam);\n for (let c: Node = srcElem.firstChild; c; c = c.nextSibling) {\n if (c.nodeType == 1) {\n const ce = c as Element;\n if (ce.localName == \"param\" && ce.namespaceURI == Base.NS.XHTML) {\n const pname = ce.getAttribute(\"name\");\n const pvalue = ce.getAttribute(\"value\");\n if (pname && pvalue) {\n sb.append(\"&\");\n sb.append(encodeURIComponent(pname));\n sb.append(\"=\");\n sb.append(encodeURIComponent(pvalue));\n }\n }\n }\n }\n result.setAttribute(\"src\", sb.toString());\n const width = srcElem.getAttribute(\"width\");\n if (width) {\n result.setAttribute(\"width\", width);\n }\n const height = srcElem.getAttribute(\"height\");\n if (height) {\n result.setAttribute(\"height\", height);\n }\n }\n }\n }\n if (!result) {\n result = this.viewport.document.createElement(\"span\");\n result.setAttribute(\"data-adapt-process-children\", \"true\");\n }\n\n // Need to cast because we need {Element}, not {!Element}\n return Task.newResult(result as Element);\n }\n\n makeMathJaxView(\n xmldoc: XmlDoc.XMLDocHolder,\n srcElem: Element,\n viewParent: Element,\n computedStyle: { [key: string]: Css.Val },\n ): Task.Result<Element> {\n // See if MathJax installed, use it if it is.\n const hub = getMathJaxHub();\n if (hub) {\n const doc = viewParent.ownerDocument;\n const span = doc.createElement(\"span\");\n viewParent.appendChild(span);\n const clonedMath = doc.importNode(srcElem, true);\n this.resolveURLsInMathML(clonedMath, xmldoc);\n span.appendChild(clonedMath);\n const queue = hub[\"queue\"];\n queue[\"Push\"]([\"Typeset\", hub, span]);\n const frame: Task.Frame<Element> = Task.newFrame(\"makeMathJaxView\");\n const continuation = frame.suspend();\n queue[\"Push\"](() => {\n continuation.schedule(span);\n });\n return frame.result();\n }\n return Task.newResult(null as Element);\n }\n\n private resolveURLsInMathML(node: Node, xmldoc: XmlDoc.XMLDocHolder) {\n if (node == null) {\n return;\n }\n if (node.nodeType === 1 && (node as Element).tagName === \"mglyph\") {\n const attrs = Array.from((node as Element).attributes);\n for (const attr of attrs) {\n if (attr.name !== \"src\") {\n continue;\n }\n const newUrl = Base.resolveURL(attr.nodeValue, xmldoc.url);\n if (attr.namespaceURI) {\n (node as Element).setAttributeNS(\n attr.namespaceURI,\n attr.name,\n newUrl,\n );\n } else {\n (node as Element).setAttribute(attr.name, newUrl);\n }\n }\n }\n if (node.firstChild) {\n this.resolveURLsInMathML(node.firstChild, xmldoc);\n }\n if (node.nextSibling) {\n this.resolveURLsInMathML(node.nextSibling, xmldoc);\n }\n }\n\n /**\n * @override\n */\n makeCustomRenderer(xmldoc: XmlDoc.XMLDocHolder): Vgen.CustomRenderer {\n return (\n srcElem: Element,\n viewParent: Element,\n computedStyle: { [key: string]: Css.Val },\n ): Task.Result<Element> => {\n if (\n srcElem.localName == \"object\" &&\n srcElem.namespaceURI == Base.NS.XHTML\n ) {\n return this.makeObjectView(xmldoc, srcElem, viewParent, computedStyle);\n } else if (srcElem.namespaceURI == Base.NS.MATHML) {\n return this.makeMathJaxView(xmldoc, srcElem, viewParent, computedStyle);\n } else if (\n (srcElem as HTMLElement).dataset &&\n (srcElem as HTMLElement).dataset[\"mathTypeset\"] == \"true\"\n ) {\n return this.makeMathJaxView(xmldoc, srcElem, viewParent, computedStyle);\n }\n return Task.newResult(null as Element);\n };\n }\n\n getPageViewItem(spineIndex: number): Task.Result<OPFViewItem> {\n if (spineIndex === -1 || spineIndex >= this.opf.spine.length) {\n return Task.newResult(null as OPFViewItem);\n }\n let viewItem = this.spineItems[spineIndex];\n if (viewItem) {\n return Task.newResult(viewItem);\n }\n const frame: Task.Frame<OPFViewItem> = Task.newFrame(\"getPageViewItem\");\n\n // If loading for the item has already been started, suspend and wait for\n // the result.\n let loadingContinuations = this.spineItemLoadingContinuations[spineIndex];\n if (loadingContinuations) {\n const cont = frame.suspend();\n loadingContinuations.push(cont);\n return frame.result();\n } else {\n loadingContinuations = this.spineItemLoadingContinuations[\n spineIndex\n ] = [];\n }\n const item = this.opf.spine[spineIndex];\n const store = this.opf.store;\n store.load(item.src).then((xmldoc: XmlDoc.XMLDocHolder) => {\n // EPUB Spine properties support\n const epubSpineProperties = item.itemRefElement.getAttribute(\n \"properties\",\n );\n if (epubSpineProperties) {\n xmldoc.root.setAttribute(\n \"data-vivliostyle-epub-spine-properties\",\n epubSpineProperties,\n );\n }\n item.title = xmldoc.document.title;\n const style = store.getStyleForDoc(xmldoc);\n const customRenderer = this.makeCustomRenderer(xmldoc);\n let viewport = this.viewport;\n const viewportSize = style.sizeViewport(\n viewport.width,\n viewport.height,\n viewport.fontSize,\n this.pref,\n );\n if (\n viewportSize.width != viewport.width ||\n viewportSize.height != viewport.height ||\n viewportSize.fontSize != viewport.fontSize\n ) {\n viewport = new Vgen.Viewport(\n viewport.window,\n viewportSize.fontSize,\n viewport.root,\n viewportSize.width,\n viewportSize.height,\n );\n }\n const isVersoFirstPage = this.spineItems[0]?.instance.isVersoFirstPage;\n const previousViewItem = this.spineItems[spineIndex - 1];\n let pageNumberOffset: number;\n let pageCounterOffset: number;\n if (item.startPage !== null) {\n pageNumberOffset = item.startPage - 1;\n pageCounterOffset = pageNumberOffset;\n } else {\n if (\n spineIndex > 0 &&\n (!previousViewItem || !previousViewItem.complete)\n ) {\n // When navigate to a new spine item skipping the previous items,\n // give up calculate pageNumberOffset and use epage (or spineIndex if epage is unset).\n pageNumberOffset = item.epage || spineIndex;\n if (\n !this.opf.prePaginated &&\n pageNumberOffset % 2 == (isVersoFirstPage ? 1 : 0)\n ) {\n // Force to odd number to avoid unpaired page. (This is 0 based and even number is recto)\n // (odd and even are reversed if isVersoFirstPage is true)\n pageNumberOffset++;\n }\n pageCounterOffset = pageNumberOffset;\n } else {\n pageNumberOffset = previousViewItem\n ? previousViewItem.instance.pageNumberOffset +\n previousViewItem.pages.length\n : 0;\n const counters = this.counterStore.currentPageCounters[\"page\"];\n pageCounterOffset =\n !counters || !counters.length\n ? pageNumberOffset\n : counters[counters.length - 1];\n\n // Note: The \"page\" counter value differs to the \"page-number\" value\n // if the \"page\" counter has been reset by counter-reset/increment.\n // (Fix for issue #701)\n }\n if (item.skipPagesBefore !== null) {\n pageNumberOffset += item.skipPagesBefore;\n pageCounterOffset += item.skipPagesBefore;\n }\n }\n this.counterStore.forceSetPageCounter(pageCounterOffset);\n const instance = new OPS.StyleInstance(\n style,\n xmldoc,\n this.opf.lang,\n viewport,\n this.clientLayout,\n this.fontMapper,\n customRenderer,\n this.opf.fallbackMap,\n pageNumberOffset,\n this.opf.documentURLTransformer,\n this.counterStore,\n this.opf.pageProgression,\n isVersoFirstPage,\n );\n instance.pref = this.pref;\n\n // For env(pub-title) and env(doc-title)\n const pubTitles = this.opf.metadata && this.opf.metadata[metaTerms.title];\n instance.pubTitle =\n (pubTitles && pubTitles[0] && pubTitles[0][\"v\"]) || \"\";\n instance.docTitle = item.title || \"\";\n\n instance.init().then(() => {\n viewItem = {\n item,\n xmldoc,\n instance,\n layoutPositions: [null],\n pages: [],\n complete: false,\n };\n this.spineItems[spineIndex] = viewItem;\n frame.finish(viewItem);\n loadingContinuations.forEach((c) => {\n c.schedule(viewItem);\n });\n });\n });\n return frame.result();\n }\n\n removeRenderedPages() {\n const items = this.spineItems;\n for (const item of items) {\n if (item) {\n item.pages.splice(0);\n }\n }\n this.viewport.clear();\n }\n\n /**\n * Returns if at least one page has 'auto' size\n */\n hasAutoSizedPages(): boolean {\n const items = this.spineItems;\n for (const item of items) {\n if (item) {\n const pages = item.pages;\n for (const page of pages) {\n if (page.isAutoPageWidth && page.isAutoPageHeight) {\n return true;\n }\n }\n }\n }\n return false;\n }\n\n hasPages(): boolean {\n return this.spineItems.some((item) => item && item.pages.length > 0);\n }\n\n showTOC(autohide: boolean): Task.Result<Vtree.Page> {\n const opf = this.opf;\n const toc = opf.xhtmlToc || opf.ncxToc;\n this.tocAutohide = autohide;\n if (!toc) {\n return Task.newResult(null as Vtree.Page);\n }\n if (this.tocView && this.tocView.page) {\n this.tocView.page.container.style.visibility = \"visible\";\n this.tocView.page.container.setAttribute(\"aria-hidden\", \"false\");\n return Task.newResult(this.tocView.page);\n }\n const frame: Task.Frame<Vtree.Page> = Task.newFrame(\"showTOC\");\n if (!this.tocView) {\n this.tocView = new Toc.TOCView(\n opf.store,\n toc.src,\n opf.lang,\n this.clientLayout,\n this.fontMapper,\n this.pref,\n this,\n opf.fallbackMap,\n opf.documentURLTransformer,\n this.counterStore,\n );\n }\n const viewport = this.viewport;\n const tocWidth = Math.min(350, Math.round(0.67 * viewport.width) - 16);\n const tocHeight = viewport.height - 6;\n const pageCont = viewport.document.createElement(\"div\") as HTMLElement;\n viewport.root.appendChild(pageCont);\n // pageCont.style.position = \"absolute\";\n pageCont.style.visibility = \"hidden\";\n // pageCont.style.left = \"3px\";\n // pageCont.style.top = \"3px\";\n pageCont.style.width = `${tocWidth + 10}px`;\n pageCont.style.maxHeight = `${tocHeight}px`;\n // pageCont.style.overflow = \"scroll\";\n // pageCont.style.overflowX = \"hidden\";\n // pageCont.style.background = \"rgba(248,248,248,0.9)\";\n // pageCont.style[\"borderRadius\"] = \"2px\";\n // pageCont.style[\"boxShadow\"] = \"1px 1px 2px rgba(0,0,0,0.4)\";\n\n pageCont.setAttribute(\"data-vivliostyle-toc-box\", \"true\");\n pageCont.setAttribute(\"role\", \"navigation\");\n\n this.tocView\n .showTOC(pageCont, viewport, tocWidth, tocHeight, this.viewport.fontSize)\n .then((page) => {\n pageCont.style.visibility = \"visible\";\n pageCont.setAttribute(\"aria-hidden\", \"false\");\n frame.finish(page);\n });\n return frame.result();\n }\n\n hideTOC(): void {\n if (this.tocView) {\n this.tocView.hideTOC();\n }\n }\n\n isTOCVisible(): boolean {\n return !!this.tocView && this.tocView.isTOCVisible();\n }\n}\n\nexport interface RenderSinglePageResult {\n pageAndPosition: PageAndPosition;\n nextLayoutPosition: Vtree.LayoutPosition;\n}\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2015 Trim-marks Inc.\n * Copyright 2018 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview AdaptiveViewer - Viewer implementation.\n */\nimport * as Asserts from \"./asserts\";\nimport * as Base from \"./base\";\nimport * as Constants from \"./constants\";\nimport * as Epub from \"./epub\";\nimport * as Exprs from \"./exprs\";\nimport * as Font from \"./font\";\nimport * as Logging from \"./logging\";\nimport * as Plugin from \"./plugin\";\nimport * as Profile from \"./profile\";\nimport * as Task from \"./task\";\nimport * as TaskUtil from \"./task-util\";\nimport * as Vgen from \"./vgen\";\nimport * as Vtree from \"./vtree\";\n\nexport type Action = (p1: Base.JSON) => Task.Result<boolean>;\n\nexport type ViewportSize = {\n marginLeft: number;\n marginRight: number;\n marginTop: number;\n marginBottom: number;\n width: number;\n height: number;\n};\n\nexport const VIEWPORT_STATUS_ATTRIBUTE = \"data-vivliostyle-viewer-status\";\n\nexport const VIEWPORT_SPREAD_VIEW_ATTRIBUTE = \"data-vivliostyle-spread-view\";\n\n/**\n * @enum {string}\n */\nexport enum PageViewMode {\n SINGLE_PAGE = \"singlePage\",\n SPREAD = \"spread\",\n AUTO_SPREAD = \"autoSpread\",\n}\n\nexport type SingleDocumentParam = {\n url: string;\n startPage: number | null;\n skipPagesBefore: number | null;\n};\n\nexport class AdaptiveViewer {\n fontMapper: Font.Mapper;\n kick: () => void;\n sendCommand: (p1: Base.JSON | string) => void;\n resizeListener: () => void;\n hyperlinkListener: Base.EventListener;\n pageRuleStyleElement: HTMLElement;\n pageSheetSizeAlreadySet: boolean = false;\n renderTask: Task.Task | null = null;\n actions: { [key: string]: Action };\n readyState: Constants.ReadyState;\n packageURL: string[];\n opf: Epub.OPFDoc;\n haveZipMetadata: boolean;\n touchActive: boolean;\n touchX: number;\n touchY: number;\n needResize: boolean;\n needRefresh: boolean;\n viewportSize: ViewportSize | null;\n currentPage: Vtree.Page;\n currentSpread: Vtree.Spread | null;\n pagePosition: Epub.Position | null;\n fontSize: number;\n zoom: number;\n fitToScreen: boolean;\n pageViewMode: PageViewMode;\n waitForLoading: boolean;\n renderAllPages: boolean;\n pref: Exprs.Preferences;\n pageSizes: { width: number; height: number }[];\n\n // force relayout\n viewport: Vgen.Viewport | null;\n opfView: Epub.OPFView;\n\n constructor(\n public readonly window: Window,\n public readonly viewportElement: HTMLElement,\n public readonly instanceId: string,\n public readonly callbackFn: (p1: Base.JSON) => void,\n ) {\n viewportElement.setAttribute(\"data-vivliostyle-viewer-viewport\", true);\n if (Constants.isDebug) {\n viewportElement.setAttribute(\"data-vivliostyle-debug\", true);\n }\n viewportElement.setAttribute(VIEWPORT_STATUS_ATTRIBUTE, \"loading\");\n const document = window.document;\n this.fontMapper = new Font.Mapper(document.head, viewportElement);\n this.init();\n this.kick = () => {};\n this.sendCommand = () => {};\n this.resizeListener = () => {\n this.needResize = true;\n this.kick();\n };\n this.pageReplacedListener = this.pageReplacedListener.bind(this);\n this.hyperlinkListener = (evt) => {};\n this.pageRuleStyleElement = document.getElementById(\n \"vivliostyle-page-rules\",\n );\n this.actions = {\n loadPublication: this.loadPublication,\n loadXML: this.loadXML,\n configure: this.configure,\n moveTo: this.moveTo,\n toc: this.showTOC,\n };\n this.addLogListeners();\n }\n\n private init(): void {\n this.readyState = Constants.ReadyState.LOADING;\n this.packageURL = [];\n this.opf = null;\n this.haveZipMetadata = false;\n this.touchActive = false;\n this.touchX = 0;\n this.touchY = 0;\n this.needResize = false;\n this.needRefresh = false;\n this.viewportSize = null;\n this.currentPage = null;\n this.currentSpread = null;\n this.pagePosition = null;\n this.fontSize = 16;\n this.zoom = 1;\n this.fitToScreen = false;\n this.pageViewMode = PageViewMode.SINGLE_PAGE;\n this.waitForLoading = false;\n this.renderAllPages = true;\n this.pref = Exprs.defaultPreferences();\n this.pageSizes = [];\n }\n\n addLogListeners() {\n const logLevel = Logging.LogLevel;\n Logging.logger.addListener(logLevel.DEBUG, (info) => {\n this.callback({ t: \"debug\", content: info });\n });\n Logging.logger.addListener(logLevel.INFO, (info) => {\n this.callback({ t: \"info\", content: info });\n });\n Logging.logger.addListener(logLevel.WARN, (info) => {\n this.callback({ t: \"warn\", content: info });\n });\n Logging.logger.addListener(logLevel.ERROR, (info) => {\n this.callback({ t: \"error\", content: info });\n });\n }\n\n private callback(message: Base.JSON): void {\n message[\"i\"] = this.instanceId;\n this.callbackFn(message);\n }\n\n /**\n * Set readyState and notify to listeners\n */\n setReadyState(readyState: Constants.ReadyState) {\n if (this.readyState !== readyState) {\n this.readyState = readyState;\n this.viewportElement.setAttribute(VIEWPORT_STATUS_ATTRIBUTE, readyState);\n this.callback({ t: \"readystatechange\" });\n }\n }\n\n loadPublication(command: Base.JSON): Task.Result<boolean> {\n Profile.profiler.registerStartTiming(\"beforeRender\");\n this.setReadyState(Constants.ReadyState.LOADING);\n const url = command[\"url\"] as string;\n const fragment = command[\"fragment\"] as string | null;\n const haveZipMetadata = !!command[\"zipmeta\"];\n const authorStyleSheet = command[\"authorStyleSheet\"] as {\n url: string | null;\n text: string | null;\n }[];\n const userStyleSheet = command[\"userStyleSheet\"] as {\n url: string | null;\n text: string | null;\n }[];\n this.viewport = null;\n const frame: Task.Frame<boolean> = Task.newFrame(\"loadPublication\");\n this.configure(command).then(() => {\n const store = new Epub.EPUBDocStore();\n store.init(authorStyleSheet, userStyleSheet).then(() => {\n const pubURL = Base.resolveURL(\n Base.convertSpecialURL(url),\n this.window.location.href,\n );\n this.packageURL = [pubURL];\n store.loadPubDoc(pubURL, haveZipMetadata).then((opf) => {\n if (opf) {\n this.opf = opf;\n this.render(fragment).then(() => {\n frame.finish(true);\n });\n } else {\n frame.finish(false);\n }\n });\n });\n });\n return frame.result();\n }\n\n loadXML(command: Base.JSON): Task.Result<boolean> {\n Profile.profiler.registerStartTiming(\"beforeRender\");\n this.setReadyState(Constants.ReadyState.LOADING);\n const params: SingleDocumentParam[] = command[\"url\"];\n const doc = command[\"document\"] as Document;\n const fragment = command[\"fragment\"] as string | null;\n const authorStyleSheet = command[\"authorStyleSheet\"] as {\n url: string | null;\n text: string | null;\n }[];\n const userStyleSheet = command[\"userStyleSheet\"] as {\n url: string | null;\n text: string | null;\n }[];\n\n // force relayout\n this.viewport = null;\n const frame: Task.Frame<boolean> = Task.newFrame(\"loadXML\");\n this.configure(command).then(() => {\n const store = new Epub.EPUBDocStore();\n store.init(authorStyleSheet, userStyleSheet).then(() => {\n const resolvedParams: Epub.OPFItemParam[] = params.map((p, index) => ({\n url: Base.resolveURL(\n Base.convertSpecialURL(p.url),\n this.window.location.href,\n ),\n index,\n startPage: p.startPage,\n skipPagesBefore: p.skipPagesBefore,\n }));\n this.packageURL = resolvedParams.map((p) => p.url);\n this.opf = new Epub.OPFDoc(store, \"\");\n this.opf.initWithChapters(resolvedParams, doc).then(() => {\n this.render(fragment).then(() => {\n frame.finish(true);\n });\n });\n });\n });\n return frame.result();\n }\n\n private render(fragment?: string | null): Task.Result<boolean> {\n this.cancelRenderingTask();\n let cont: Task.Result<boolean>;\n if (fragment) {\n cont = this.opf.resolveFragment(fragment).thenAsync((position) => {\n this.pagePosition = position;\n return Task.newResult(true);\n });\n } else {\n cont = Task.newResult(true);\n }\n return cont.thenAsync(() => {\n Profile.profiler.registerEndTiming(\"beforeRender\");\n return this.resize();\n });\n }\n\n private resolveLength(specified: string): number {\n const value = parseFloat(specified);\n const unitPattern = /[a-z]+$/;\n let matched: RegExpMatchArray;\n if (\n typeof specified === \"string\" &&\n (matched = specified.match(unitPattern))\n ) {\n const unit = matched[0];\n if (unit === \"em\" || unit === \"rem\") {\n return value * this.fontSize;\n }\n if (unit === \"ex\") {\n return (\n (value * Exprs.defaultUnitSizes[\"ex\"] * this.fontSize) /\n Exprs.defaultUnitSizes[\"em\"]\n );\n }\n const unitSize = Exprs.defaultUnitSizes[unit];\n if (unitSize) {\n return value * unitSize;\n }\n }\n return value;\n }\n\n configure(command: Base.JSON): Task.Result<boolean> {\n if (typeof command[\"autoresize\"] == \"boolean\") {\n if (command[\"autoresize\"]) {\n this.viewportSize = null;\n this.window.addEventListener(\"resize\", this.resizeListener, false);\n this.needResize = true;\n } else {\n this.window.removeEventListener(\"resize\", this.resizeListener, false);\n }\n }\n if (typeof command[\"fontSize\"] == \"number\") {\n const fontSize = command[\"fontSize\"] as number;\n if (fontSize >= 5 && fontSize <= 72 && this.fontSize != fontSize) {\n this.fontSize = fontSize;\n this.needResize = true;\n }\n }\n if (typeof command[\"viewport\"] == \"object\" && command[\"viewport\"]) {\n const vp = command[\"viewport\"];\n const viewportSize = {\n marginLeft: this.resolveLength(vp[\"margin-left\"]) || 0,\n marginRight: this.resolveLength(vp[\"margin-right\"]) || 0,\n marginTop: this.resolveLength(vp[\"margin-top\"]) || 0,\n marginBottom: this.resolveLength(vp[\"margin-bottom\"]) || 0,\n width: this.resolveLength(vp[\"width\"]) || 0,\n height: this.resolveLength(vp[\"height\"]) || 0,\n };\n if (viewportSize.width >= 200 || viewportSize.height >= 200) {\n this.window.removeEventListener(\"resize\", this.resizeListener, false);\n this.viewportSize = viewportSize;\n this.needResize = true;\n }\n }\n if (typeof command[\"hyphenate\"] == \"boolean\") {\n this.pref.hyphenate = command[\"hyphenate\"];\n this.needResize = true;\n }\n if (typeof command[\"horizontal\"] == \"boolean\") {\n this.pref.horizontal = command[\"horizontal\"];\n this.needResize = true;\n }\n if (typeof command[\"nightMode\"] == \"boolean\") {\n this.pref.nightMode = command[\"nightMode\"];\n this.needResize = true;\n }\n if (typeof command[\"lineHeight\"] == \"number\") {\n this.pref.lineHeight = command[\"lineHeight\"];\n this.needResize = true;\n }\n if (typeof command[\"columnWidth\"] == \"number\") {\n this.pref.columnWidth = command[\"columnWidth\"];\n this.needResize = true;\n }\n if (typeof command[\"fontFamily\"] == \"string\") {\n this.pref.fontFamily = command[\"fontFamily\"];\n this.needResize = true;\n }\n if (typeof command[\"load\"] == \"boolean\") {\n this.waitForLoading = command[\"load\"]; // Load images (and other resources) on the page.\n }\n if (typeof command[\"renderAllPages\"] == \"boolean\") {\n this.renderAllPages = command[\"renderAllPages\"];\n }\n // for backward compatibility\n if (typeof command[\"userAgentRootURL\"] == \"string\") {\n Base.setBaseURL(command[\"userAgentRootURL\"].replace(/resources\\/?$/, \"\"));\n Base.setResourceBaseURL(command[\"userAgentRootURL\"]);\n }\n if (typeof command[\"rootURL\"] == \"string\") {\n Base.setBaseURL(command[\"rootURL\"]);\n Base.setResourceBaseURL(`${Base.baseURL}resources/`);\n }\n if (\n typeof command[\"pageViewMode\"] == \"string\" &&\n command[\"pageViewMode\"] !== this.pageViewMode\n ) {\n this.pageViewMode = command[\"pageViewMode\"] as PageViewMode;\n this.needResize = true;\n }\n if (\n typeof command[\"pageBorder\"] == \"number\" &&\n command[\"pageBorder\"] !== this.pref.pageBorder\n ) {\n // Force relayout\n this.viewport = null;\n this.pref.pageBorder = command[\"pageBorder\"];\n this.needResize = true;\n }\n if (typeof command[\"zoom\"] == \"number\" && command[\"zoom\"] !== this.zoom) {\n this.zoom = command[\"zoom\"];\n this.needRefresh = true;\n }\n if (\n typeof command[\"fitToScreen\"] == \"boolean\" &&\n command[\"fitToScreen\"] !== this.fitToScreen\n ) {\n this.fitToScreen = command[\"fitToScreen\"];\n this.needRefresh = true;\n }\n if (\n typeof command[\"defaultPaperSize\"] == \"object\" &&\n typeof command[\"defaultPaperSize\"].width == \"number\" &&\n typeof command[\"defaultPaperSize\"].height == \"number\"\n ) {\n this.viewport = null;\n this.pref.defaultPaperSize = command[\"defaultPaperSize\"];\n this.needResize = true;\n }\n this.configurePlugins(command);\n return Task.newResult(true);\n }\n\n configurePlugins(command: Base.JSON) {\n const hooks: Plugin.ConfigurationHook[] = Plugin.getHooksForName(\n Plugin.HOOKS.CONFIGURATION,\n );\n hooks.forEach((hook) => {\n const result = hook(command);\n this.needResize = result.needResize || this.needResize;\n this.needRefresh = result.needRefresh || this.needRefresh;\n });\n }\n\n /**\n * Refresh view when a currently displayed page is replaced (by re-layout\n * caused by cross reference resolutions)\n */\n pageReplacedListener(evt: Base.Event) {\n const currentPage = this.currentPage;\n const spread = this.currentSpread;\n const target = evt.target;\n if (spread) {\n if (spread.left === target || spread.right === target) {\n this.showCurrent(evt.newPage);\n }\n } else if (currentPage === evt.target) {\n this.showCurrent(evt.newPage);\n }\n }\n\n /**\n * Iterate through currently displayed pages and do something\n */\n private forCurrentPages(fn: (p1: Vtree.Page) => any) {\n const pages = [];\n if (this.currentPage) {\n pages.push(this.currentPage);\n }\n if (this.currentSpread) {\n pages.push(this.currentSpread.left);\n pages.push(this.currentSpread.right);\n }\n pages.forEach((page) => {\n if (page) {\n fn(page);\n }\n });\n }\n\n private removePageListeners() {\n this.forCurrentPages((page) => {\n page.removeEventListener(\"hyperlink\", this.hyperlinkListener, false);\n page.removeEventListener(\"replaced\", this.pageReplacedListener, false);\n });\n }\n\n /**\n * Hide current pages (this.currentPage, this.currentSpread)\n */\n private hidePages() {\n this.removePageListeners();\n this.forCurrentPages((page) => {\n Base.setCSSProperty(page.container, \"display\", \"none\");\n page.container.setAttribute(\"aria-hidden\", \"true\");\n });\n this.currentPage = null;\n this.currentSpread = null;\n }\n\n private showSinglePage(page: Vtree.Page) {\n page.addEventListener(\"hyperlink\", this.hyperlinkListener, false);\n page.addEventListener(\"replaced\", this.pageReplacedListener, false);\n Base.setCSSProperty(page.container, \"visibility\", \"visible\");\n Base.setCSSProperty(page.container, \"display\", \"block\");\n page.container.setAttribute(\"aria-hidden\", \"false\");\n }\n\n private showPage(page: Vtree.Page): void {\n this.hidePages();\n this.currentPage = page;\n page.container.style.marginLeft = \"\";\n page.container.style.marginRight = \"\";\n this.showSinglePage(page);\n }\n\n private showSpread(spread: Vtree.Spread) {\n this.hidePages();\n this.currentSpread = spread;\n if (spread.left && spread.right) {\n // Adjust spread horizontal alignment when left/right page widths differ\n let leftWidth = parseFloat(spread.left.container.style.width);\n let rightWidth = parseFloat(spread.right.container.style.width);\n if (leftWidth && rightWidth && leftWidth !== rightWidth) {\n if (leftWidth < rightWidth) {\n spread.left.container.style.marginLeft = `${\n rightWidth - leftWidth\n }px`;\n } else {\n spread.right.container.style.marginRight = `${\n leftWidth - rightWidth\n }px`;\n }\n }\n }\n if (spread.left) {\n this.showSinglePage(spread.left);\n if (!spread.right) {\n spread.left.container.setAttribute(\n \"data-vivliostyle-unpaired-page\",\n true,\n );\n } else {\n spread.left.container.removeAttribute(\"data-vivliostyle-unpaired-page\");\n }\n }\n if (spread.right) {\n this.showSinglePage(spread.right);\n if (!spread.left) {\n spread.right.container.setAttribute(\n \"data-vivliostyle-unpaired-page\",\n true,\n );\n } else {\n spread.right.container.removeAttribute(\n \"data-vivliostyle-unpaired-page\",\n );\n }\n }\n }\n\n private reportPosition(): Task.Result<boolean> {\n const frame: Task.Frame<boolean> = Task.newFrame(\"reportPosition\");\n Asserts.assert(this.pagePosition);\n this.opf\n .getCFI(this.pagePosition.spineIndex, this.pagePosition.offsetInItem)\n .then((cfi) => {\n const page = this.currentPage;\n const r =\n this.waitForLoading && page.fetchers.length > 0\n ? TaskUtil.waitForFetchers(page.fetchers)\n : Task.newResult(true);\n r.then(() => {\n this.sendLocationNotification(page, cfi).thenFinish(frame);\n });\n });\n return frame.result();\n }\n\n private createViewport(): Vgen.Viewport {\n const viewportElement = this.viewportElement;\n if (this.viewportSize) {\n const vs = this.viewportSize;\n viewportElement.style.marginLeft = `${vs.marginLeft}px`;\n viewportElement.style.marginRight = `${vs.marginRight}px`;\n viewportElement.style.marginTop = `${vs.marginTop}px`;\n viewportElement.style.marginBottom = `${vs.marginBottom}px`;\n return new Vgen.Viewport(\n this.window,\n this.fontSize,\n viewportElement,\n vs.width,\n vs.height,\n );\n } else {\n return new Vgen.Viewport(this.window, this.fontSize, viewportElement);\n }\n }\n\n private resolveSpreadView(viewport: Vgen.Viewport): boolean {\n switch (this.pageViewMode) {\n case PageViewMode.SINGLE_PAGE:\n return false;\n case PageViewMode.SPREAD:\n return true;\n case PageViewMode.AUTO_SPREAD:\n default:\n // wide enough for a pair of pages of A/B paper sizes, but not too\n // narrow\n return viewport.width / viewport.height >= 1.45 && viewport.width > 800;\n }\n }\n\n private updateSpreadView(spreadView: boolean) {\n this.pref.spreadView = spreadView;\n this.viewportElement.setAttribute(\n VIEWPORT_SPREAD_VIEW_ATTRIBUTE,\n spreadView.toString(),\n );\n }\n\n private sizeIsGood(): boolean {\n const viewport = this.createViewport();\n const spreadView = this.resolveSpreadView(viewport);\n const spreadViewChanged = this.pref.spreadView !== spreadView;\n this.updateSpreadView(spreadView);\n if (\n this.viewportSize ||\n !this.viewport ||\n this.viewport.fontSize != this.fontSize\n ) {\n return false;\n }\n if (\n !spreadViewChanged &&\n viewport.width == this.viewport.width &&\n viewport.height == this.viewport.height\n ) {\n return true;\n }\n\n if (\n !spreadViewChanged &&\n viewport.width == this.viewport.width &&\n viewport.height != this.viewport.height &&\n /Android|iPhone|iPad|iPod/.test(navigator.userAgent)\n ) {\n // On mobile browsers, the viewport height may change unexpectedly\n // when soft keyboard appears or tab/address bar auto-hide occurs,\n // so ignore resizing in this condition.\n return true;\n }\n\n if (\n this.opfView &&\n this.opfView.hasPages() &&\n !this.opfView.hasAutoSizedPages()\n ) {\n this.viewport.width = viewport.width;\n this.viewport.height = viewport.height;\n this.needRefresh = true;\n return true;\n }\n return false;\n }\n\n private setPageSize(\n pageSize: { width: number; height: number },\n pageSheetSize: { [key: string]: { width: number; height: number } },\n spineIndex: number,\n pageIndex: number,\n ) {\n this.pageSizes[pageIndex] = pageSize;\n this.setPageSizePageRules(pageSheetSize, spineIndex, pageIndex);\n }\n\n private setPageSizePageRules(\n pageSheetSize: { [key: string]: { width: number; height: number } },\n spineIndex: number,\n pageIndex: number,\n ) {\n if (!this.pageSheetSizeAlreadySet && this.pageRuleStyleElement) {\n let styleText = \"\";\n Object.keys(pageSheetSize).forEach((selector) => {\n styleText += `@page ${selector}{margin:0;size:`;\n const size = pageSheetSize[selector];\n styleText += `${size.width}px ${size.height}px;}`;\n });\n this.pageRuleStyleElement.textContent = styleText;\n this.pageSheetSizeAlreadySet = true;\n }\n }\n\n removePageSizePageRules() {\n if (this.pageRuleStyleElement) {\n this.pageRuleStyleElement.textContent = \"\";\n this.pageSheetSizeAlreadySet = false;\n }\n }\n\n private reset(): void {\n let tocVisible = false;\n let tocAutohide = false;\n if (this.opfView) {\n tocVisible = this.opfView.isTOCVisible();\n tocAutohide = this.opfView.tocAutohide;\n this.opfView.hideTOC();\n this.opfView.removeRenderedPages();\n }\n this.removePageSizePageRules();\n this.viewport = this.createViewport();\n this.viewport.resetZoom();\n this.opfView = new Epub.OPFView(\n this.opf,\n this.viewport,\n this.fontMapper,\n this.pref,\n this.setPageSize.bind(this),\n );\n if (tocVisible) {\n this.sendCommand({ a: \"toc\", v: \"show\", autohide: tocAutohide });\n }\n }\n\n /**\n * Show current page or spread depending on the setting\n * (this.pref.spreadView).\n * @param sync If true, get the necessary page synchronously (not waiting\n * another rendering task)\n */\n private showCurrent(page: Vtree.Page, sync?: boolean): Task.Result<null> {\n this.needRefresh = false;\n this.removePageListeners();\n if (this.pref.spreadView) {\n return this.opfView\n .getSpread(this.pagePosition, sync)\n .thenAsync((spread) => {\n this.showSpread(spread);\n this.setSpreadZoom(spread);\n this.currentPage = page;\n return Task.newResult(null);\n });\n } else {\n this.showPage(page);\n this.setPageZoom(page);\n this.currentPage = page;\n return Task.newResult(null);\n }\n }\n\n setPageZoom(page: Vtree.Page) {\n const zoom = this.getAdjustedZoomFactor(page.dimensions);\n this.viewport.zoom(page.dimensions.width, page.dimensions.height, zoom);\n }\n\n setSpreadZoom(spread: Vtree.Spread) {\n const dim = this.getSpreadDimensions(spread);\n this.viewport.zoom(dim.width, dim.height, this.getAdjustedZoomFactor(dim));\n }\n\n /**\n * @returns adjusted zoom factor\n */\n getAdjustedZoomFactor(pageDimension: {\n width: number;\n height: number;\n }): number {\n return this.fitToScreen\n ? this.calculateZoomFactorToFitInsideViewPort(pageDimension)\n : this.zoom;\n }\n\n /**\n * Returns width and height of the spread, including the margin between pages.\n */\n getSpreadDimensions(spread: Vtree.Spread): { width: number; height: number } {\n let width = 0;\n let height = 0;\n if (spread.left) {\n width += spread.left.dimensions.width;\n height = spread.left.dimensions.height;\n }\n if (spread.right) {\n width += spread.right.dimensions.width;\n height = Math.max(height, spread.right.dimensions.height);\n }\n if (spread.left && spread.right) {\n width += this.pref.pageBorder * 2;\n // Adjust spread horizontal alignment when left/right page widths differ\n width += Math.abs(\n spread.left.dimensions.width - spread.right.dimensions.width,\n );\n }\n return { width, height };\n }\n\n /**\n * Returns zoom factor corresponding to the specified zoom type.\n */\n queryZoomFactor(type: ZoomType): number {\n if (!this.currentPage) {\n throw new Error(\"no page exists.\");\n }\n switch (type) {\n case ZoomType.FIT_INSIDE_VIEWPORT: {\n let pageDim: { width: number; height: number };\n if (this.pref.spreadView) {\n Asserts.assert(this.currentSpread);\n pageDim = this.getSpreadDimensions(this.currentSpread);\n } else {\n pageDim = this.currentPage.dimensions;\n }\n return this.calculateZoomFactorToFitInsideViewPort(pageDim);\n }\n default:\n throw new Error(`unknown zoom type: ${type}`);\n }\n }\n\n /**\n * @returns zoom factor to fit inside viewport\n */\n calculateZoomFactorToFitInsideViewPort(pageDimension: {\n width: number;\n height: number;\n }): number {\n const widthZoom = this.viewport.width / pageDimension.width;\n const heightZoom = this.viewport.height / pageDimension.height;\n return Math.min(widthZoom, heightZoom);\n }\n\n private cancelRenderingTask() {\n if (this.renderTask) {\n this.renderTask.interrupt(new RenderingCanceledError());\n }\n this.renderTask = null;\n }\n\n resize(): Task.Result<boolean> {\n this.needResize = false;\n this.needRefresh = false;\n if (this.sizeIsGood()) {\n return Task.newResult(true);\n }\n this.setReadyState(Constants.ReadyState.LOADING);\n this.cancelRenderingTask();\n const resizeTask = Task.currentTask()\n .getScheduler()\n .run(() =>\n Task.handle(\n \"resize\",\n (frame) => {\n if (!this.opf) {\n frame.finish(false);\n return;\n }\n this.renderTask = resizeTask;\n Profile.profiler.registerStartTiming(\"render (resize)\");\n this.reset();\n if (this.pagePosition) {\n // When resizing, do not use the current page index, for a page\n // index corresponding to the current position in the document\n // (offsetInItem) can change due to different layout caused by\n // different viewport size.\n\n // Update(2019-03): to avoid unexpected page move (first page to next),\n // keep pageIndex == 0 when offsetInItem == 0\n if (\n !(\n this.pagePosition.pageIndex == 0 &&\n this.pagePosition.offsetInItem == 0\n )\n ) {\n this.pagePosition.pageIndex = -1;\n }\n }\n\n // epageCount counting depends renderAllPages mode\n this.opf.setEPageCountMode(this.renderAllPages);\n\n // With renderAllPages option specified, the rendering is\n // performed after the initial page display, otherwise users are\n // forced to wait the rendering finish in front of a blank page.\n this.opfView\n .renderPagesUpto(this.pagePosition, !this.renderAllPages)\n .then((result) => {\n if (!result) {\n frame.finish(false);\n return;\n }\n this.pagePosition = result.position;\n this.showCurrent(result.page, true).then(() => {\n this.setReadyState(Constants.ReadyState.INTERACTIVE);\n\n this.opf\n .countEPages((epageCount) => {\n const notification = {\n t: \"nav\",\n epageCount: epageCount,\n first: this.currentPage.isFirstPage,\n last: this.currentPage.isLastPage,\n metadata: this.opf.metadata,\n docTitle: this.opf.spine[this.pagePosition.spineIndex]\n .title,\n };\n if (\n this.currentPage.isFirstPage ||\n (this.pagePosition.pageIndex == 0 &&\n this.opf.spine[this.pagePosition.spineIndex].epage)\n ) {\n notification[\"epage\"] = this.opf.spine[\n this.pagePosition.spineIndex\n ].epage;\n }\n this.callback(notification);\n })\n .then(() => {\n this.reportPosition().then((p) => {\n const r = this.renderAllPages\n ? this.opfView.renderAllPages()\n : Task.newResult(null);\n r.then(() => {\n if (this.renderTask === resizeTask) {\n this.renderTask = null;\n }\n Profile.profiler.registerEndTiming(\"render (resize)\");\n if (this.renderAllPages) {\n this.setReadyState(Constants.ReadyState.COMPLETE);\n }\n this.callback({ t: \"loaded\" });\n frame.finish(p);\n });\n });\n });\n });\n });\n },\n (frame, err) => {\n if (err instanceof RenderingCanceledError) {\n Profile.profiler.registerEndTiming(\"render (resize)\");\n Logging.logger.debug(err.message);\n } else {\n throw err;\n }\n },\n ),\n );\n return Task.newResult(true);\n }\n\n private sendLocationNotification(\n page: Vtree.Page,\n cfi: string | null,\n ): Task.Result<boolean> {\n const frame: Task.Frame<boolean> = Task.newFrame(\n \"sendLocationNotification\",\n );\n const notification = {\n t: \"nav\",\n first: page.isFirstPage,\n last: page.isLastPage,\n metadata: this.opf.metadata,\n docTitle: this.opf.spine[page.spineIndex].title,\n };\n this.opf\n .getEPageFromPosition(this.pagePosition as Epub.Position)\n .then((epage) => {\n notification[\"epage\"] = epage;\n notification[\"epageCount\"] = this.opf.epageCount;\n if (cfi) {\n notification[\"cfi\"] = cfi;\n }\n this.callback(notification);\n frame.finish(true);\n });\n return frame.result();\n }\n\n getCurrentPageProgression(): Constants.PageProgression | null {\n return this.opfView\n ? this.opfView.getCurrentPageProgression(this.pagePosition)\n : null;\n }\n\n moveTo(command: Base.JSON): Task.Result<boolean> {\n let method: () => Task.Result<Epub.PageAndPosition>;\n if (\n this.readyState !== Constants.ReadyState.COMPLETE &&\n command[\"where\"] !== \"next\"\n ) {\n this.setReadyState(Constants.ReadyState.LOADING);\n }\n if (typeof command[\"where\"] == \"string\") {\n let m: (\n position: Epub.Position,\n sync: boolean,\n ) => Task.Result<Epub.PageAndPosition>;\n switch (command[\"where\"]) {\n case \"next\":\n m = this.pref.spreadView\n ? this.opfView.nextSpread\n : this.opfView.nextPage;\n break;\n case \"previous\":\n m = this.pref.spreadView\n ? this.opfView.previousSpread\n : this.opfView.previousPage;\n break;\n case \"last\":\n m = this.opfView.lastPage;\n break;\n case \"first\":\n m = this.opfView.firstPage;\n break;\n default:\n return Task.newResult(true);\n }\n if (m) {\n method = () =>\n m.call(this.opfView, this.pagePosition, !this.renderAllPages);\n }\n } else if (typeof command[\"epage\"] == \"number\") {\n const epage = command[\"epage\"] as number;\n method = () =>\n this.opfView.navigateToEPage(\n epage,\n this.pagePosition,\n !this.renderAllPages,\n );\n } else if (typeof command[\"url\"] == \"string\") {\n const url = command[\"url\"] as string;\n method = () =>\n this.opfView.navigateTo(url, this.pagePosition, !this.renderAllPages);\n } else {\n return Task.newResult(true);\n }\n const frame: Task.Frame<boolean> = Task.newFrame(\"moveTo\");\n method.call(this.opfView).then((result) => {\n let cont: Task.Result<boolean>;\n if (result) {\n this.pagePosition = result.position;\n const innerFrame: Task.Frame<boolean> = Task.newFrame(\n \"moveTo.showCurrent\",\n );\n cont = innerFrame.result();\n this.showCurrent(result.page, !this.renderAllPages).then(() => {\n this.reportPosition().thenFinish(innerFrame);\n });\n } else {\n cont = Task.newResult(true);\n }\n cont.then((res) => {\n if (this.readyState === Constants.ReadyState.LOADING) {\n this.setReadyState(Constants.ReadyState.INTERACTIVE);\n }\n frame.finish(res);\n });\n });\n return frame.result();\n }\n\n showTOC(command: Base.JSON): Task.Result<boolean> {\n const autohide = !!command[\"autohide\"];\n const visibility = command[\"v\"];\n const currentVisibility = this.opfView.isTOCVisible();\n const changeAutohide =\n autohide != this.opfView.tocAutohide && visibility != \"hide\";\n if (currentVisibility) {\n if (visibility == \"show\" && !changeAutohide) {\n return Task.newResult(true);\n }\n } else {\n if (visibility == \"hide\") {\n return Task.newResult(true);\n }\n }\n if (currentVisibility && visibility != \"show\") {\n this.opfView.hideTOC();\n return Task.newResult(true);\n } else {\n const frame: Task.Frame<boolean> = Task.newFrame(\"showTOC\");\n this.opfView.showTOC(autohide).then((page) => {\n if (page) {\n if (changeAutohide) {\n page.listeners = {};\n }\n if (autohide) {\n const hideTOC = () => {\n this.opfView.hideTOC();\n };\n page.addEventListener(\"hyperlink\", hideTOC, false);\n // page.container.addEventListener(\"click\", hideTOC, false);\n }\n page.addEventListener(\"hyperlink\", this.hyperlinkListener, false);\n }\n frame.finish(true);\n });\n return frame.result();\n }\n }\n\n runCommand(command: Base.JSON): Task.Result<boolean> {\n const actionName = command[\"a\"] || \"\";\n return Task.handle(\n \"runCommand\",\n (frame) => {\n const action = this.actions[actionName];\n if (action) {\n action.call(this, command).then(() => {\n this.callback({ t: \"done\", a: actionName });\n frame.finish(true);\n });\n } else {\n Logging.logger.error(\"No such action:\", actionName);\n frame.finish(true);\n }\n },\n (frame, err) => {\n Logging.logger.error(err, \"Error during action:\", actionName);\n frame.finish(true);\n },\n );\n }\n\n initEmbed(cmd: Base.JSON | string): void {\n let command = maybeParse(cmd);\n let continuation: Task.Continuation<boolean> | null = null;\n const viewer = this;\n Task.start(() => {\n const frame: Task.Frame<boolean> = Task.newFrame(\"commandLoop\");\n const scheduler = Task.currentTask().getScheduler();\n viewer.hyperlinkListener = (evt) => {\n const hrefEvent = evt as Vtree.PageHyperlinkEvent;\n const internal =\n hrefEvent.href.charAt(0) === \"#\" ||\n viewer.packageURL.some(\n (url) => hrefEvent.href.substr(0, url.length) == url,\n );\n if (internal) {\n evt.preventDefault();\n const msg = {\n t: \"hyperlink\",\n href: hrefEvent.href,\n internal: internal,\n };\n scheduler.run(() => {\n viewer.callback(msg);\n return Task.newResult(true);\n });\n }\n };\n frame\n .loopWithFrame((loopFrame) => {\n if (viewer.needResize) {\n viewer.resize().then(() => {\n loopFrame.continueLoop();\n });\n } else if (viewer.needRefresh) {\n if (viewer.currentPage) {\n viewer.showCurrent(viewer.currentPage).then(() => {\n loopFrame.continueLoop();\n });\n }\n } else if (command) {\n const cmd = command;\n command = null;\n viewer.runCommand(cmd).then(() => {\n loopFrame.continueLoop();\n });\n } else {\n const frameInternal: Task.Frame<boolean> = Task.newFrame(\n \"waitForCommand\",\n );\n continuation = frameInternal.suspend(this);\n frameInternal.result().then(() => {\n loopFrame.continueLoop();\n });\n }\n })\n .thenFinish(frame);\n return frame.result();\n });\n viewer.kick = () => {\n const cont = continuation;\n if (cont) {\n continuation = null;\n cont.schedule(true);\n }\n };\n viewer.sendCommand = (cmd) => {\n if (command) {\n return false;\n }\n command = maybeParse(cmd);\n viewer.kick();\n return true;\n };\n this.window[\"adapt_command\"] = viewer.sendCommand;\n }\n}\n\n/**\n * @enum {string}\n */\nexport enum ZoomType {\n FIT_INSIDE_VIEWPORT = \"fit inside viewport\",\n}\n\n/**\n * Error representing that the rendering has been canceled.\n */\nclass RenderingCanceledError extends Error {\n name: string = \"RenderingCanceledError\";\n message: string = \"Page rendering has been canceled\";\n stack: string;\n\n constructor() {\n super();\n // Set the prototype explicitly.\n // https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#extending-built-ins-like-error-array-and-map-may-no-longer-work\n Object.setPrototypeOf(this, RenderingCanceledError.prototype);\n this.stack = new Error().stack;\n }\n}\n\nexport function maybeParse(cmd: any): Base.JSON {\n if (typeof cmd == \"string\") {\n return Base.stringToJSON(cmd);\n }\n return cmd;\n}\n","/**\n * Copyright 2015 Trim-marks Inc.\n * Copyright 2018 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview CoreViewer - Vivliostyle CoreViewer class\n */\nimport * as AdaptiveViewer from \"./adaptive-viewer\";\nimport * as Base from \"./base\";\nimport * as Constants from \"./constants\";\nimport * as Epub from \"./epub\";\nimport * as Profile from \"./profile\";\nimport * as Toc from \"./toc\";\n\nexport interface Payload {\n type: string;\n internal: boolean;\n href: string;\n content: string;\n cfi: string;\n first: boolean;\n last: boolean;\n epage: number;\n epageCount: number;\n metadata: unknown;\n docTitle: string;\n}\n\nconst PageProgression = Constants.PageProgression;\n\n/**\n * Viewer settings that must be passed to Viewer's constructor.\n * - userAgentRootURL: URL of a directory from which viewer resource files\n * (under resources/ directory in the source repository) are served.\n * - viewportElement: An element used as the viewport of the displayed contents.\n * - window: Window object. If omitted, current `window` is used.\n * - debug: Debug flag.\n */\nexport type CoreViewerSettings = {\n userAgentRootURL?: string;\n viewportElement: HTMLElement;\n window?: Window;\n debug?: boolean;\n};\n\n/**\n * Viewer options that can be set after the Viewer object is constructed.\n * - autoResize: Run layout again when the window is resized. default: true\n * - fontSize: Default font size (px). default: 16\n * - pageBorderWidth: Width of a border between two pages in a single\n * spread (px). Effective only in spread view mode. default: 1\n * - renderAllPages: Render all pages at the document load time. default: true\n * - pageViewMode: Page view mode (singlePage / spread / autoSpread).\n * default: singlePage\n * - zoom: Zoom factor with which pages are displayed. default: 1\n * - fitToScreen: Auto adjust zoom factor to fit the screen. default: false\n * - defaultPaperSize: Default paper size in px. Effective when `@page` size\n * is set to auto. default: undefined (means the windows size is used as\n * paper size).\n */\nexport type CoreViewerOptions = {\n autoResize?: boolean;\n fontSize?: number;\n pageBorderWidth?: number;\n renderAllPages?: boolean;\n pageViewMode?: AdaptiveViewer.PageViewMode;\n zoom?: number;\n fitToScreen?: boolean;\n defaultPaperSize?: { width: number; height: number };\n};\n\nfunction getDefaultViewerOptions(): CoreViewerOptions {\n return {\n autoResize: true,\n fontSize: 16,\n pageBorderWidth: 1,\n renderAllPages: true,\n pageViewMode: AdaptiveViewer.PageViewMode.AUTO_SPREAD,\n zoom: 1,\n fitToScreen: false,\n defaultPaperSize: undefined,\n };\n}\n\nfunction convertViewerOptions(options: CoreViewerOptions): object {\n const converted = {};\n Object.keys(options).forEach((key) => {\n const v = options[key];\n switch (key) {\n case \"autoResize\":\n converted[\"autoresize\"] = v;\n break;\n case \"pageBorderWidth\":\n converted[\"pageBorder\"] = v;\n break;\n default:\n converted[key] = v;\n }\n });\n return converted;\n}\n\n/**\n * Options for the displayed document.\n * - documentObject: Document object for the document. If provided, it is used\n * directly without parsing the source again.\n * - fragment: Fragmentation identifier (EPUB CFI) of the location in the\n * document which is to be displayed.\n * - authorStyleSheet: An array of author style sheets to be injected after all\n * author style sheets referenced from the document. A single stylesheet may\n * be a URL of the style sheet or a text content of the style sheet.\n * - userStyleSheet: An array of user style sheets to be injected.\n * A single stylesheet may be a URL of the style sheet or a text content of\n * the style sheet.\n */\nexport type DocumentOptions = {\n documentObject?: Document;\n fragment?: string;\n authorStyleSheet?: { url?: string; text?: string }[];\n userStyleSheet?: { url?: string; text?: string }[];\n};\n\n/**\n * Options for a single source document.\n * - url: URL of the document.\n * - startPage: If specified, the `page` page-based counter is set to the\n * specified value on the first page of the document. It is equivalent to\n * specifying `counter-reset: page [specified value - 1]` on that page.\n * - skipPagesBefore: If specified, the `page` page-based counter is\n * incremented by the specified value *before* updating page-based counters\n * on the first page of the document.\n * This option is ignored if `startPageNumber` option is also specified.\n */\nexport type SingleDocumentOptions =\n | string\n | {\n url: string;\n startPage?: number;\n skipPagesBefore?: number;\n };\n\n/**\n * Vivliostyle Viewer class.\n */\nexport class CoreViewer {\n private initialized: boolean = false;\n private adaptViewer_: AdaptiveViewer.AdaptiveViewer;\n private options: CoreViewerOptions;\n private eventTarget: Base.SimpleEventTarget;\n readyState: Constants.ReadyState;\n\n constructor(\n private readonly settings: CoreViewerSettings,\n opt_options?: CoreViewerOptions,\n ) {\n Constants.setDebug(settings.debug);\n this.adaptViewer_ = new AdaptiveViewer.AdaptiveViewer(\n settings[\"window\"] || window,\n settings[\"viewportElement\"],\n \"main\",\n this.dispatcher.bind(this),\n );\n this.options = getDefaultViewerOptions();\n if (opt_options) {\n this.setOptions(opt_options);\n }\n this.eventTarget = new Base.SimpleEventTarget();\n Object.defineProperty(this, \"readyState\", {\n get() {\n return this.adaptViewer_.readyState;\n },\n });\n }\n\n /**\n * Set ViewerOptions to the viewer.\n */\n setOptions(options: CoreViewerOptions) {\n const command = Object.assign(\n { a: \"configure\" },\n convertViewerOptions(options),\n );\n this.adaptViewer_.sendCommand(command);\n Object.assign(this.options, options);\n }\n\n private dispatcher(msg: Base.JSON) {\n /** @dict */\n const event = { type: msg[\"t\"] };\n const o = msg as object;\n Object.keys(o).forEach((key) => {\n if (key !== \"t\") {\n event[key] = o[key];\n }\n });\n this.eventTarget.dispatchEvent(event);\n }\n\n /**\n * Add a listener function, which is invoked when the specified type of event\n * is dispatched.\n * @param type Event type.\n * @param listener Listener function.\n */\n addListener(type: string, listener: (payload: Payload) => void) {\n this.eventTarget.addEventListener(\n type,\n listener as Base.EventListener,\n false,\n );\n }\n\n /**\n * Remove an event listener.\n * @param type Event type.\n * @param listener Listener function.\n */\n removeListener(type: string, listener: (payload: Payload) => void) {\n this.eventTarget.removeEventListener(\n type,\n listener as Base.EventListener,\n false,\n );\n }\n\n /**\n * Load an HTML or XML document(s).\n */\n loadDocument(\n singleDocumentOptions: SingleDocumentOptions | SingleDocumentOptions[],\n opt_documentOptions?: DocumentOptions,\n opt_viewerOptions?: CoreViewerOptions,\n ) {\n if (!singleDocumentOptions) {\n this.eventTarget.dispatchEvent({\n type: \"error\",\n content: \"No URL specified\",\n });\n }\n this.loadDocumentOrPublication(\n singleDocumentOptions,\n null,\n opt_documentOptions,\n opt_viewerOptions,\n );\n }\n\n /**\n * Load an EPUB/WebPub publication.\n */\n loadPublication(\n pubUrl: string,\n opt_documentOptions?: DocumentOptions,\n opt_viewerOptions?: CoreViewerOptions,\n ) {\n if (!pubUrl) {\n this.eventTarget.dispatchEvent({\n type: \"error\",\n content: \"No URL specified\",\n });\n }\n this.loadDocumentOrPublication(\n null,\n pubUrl,\n opt_documentOptions,\n opt_viewerOptions,\n );\n }\n\n /**\n * Load an HTML or XML document, or an EPUB/WebPub publication.\n */\n private loadDocumentOrPublication(\n singleDocumentOptions:\n | SingleDocumentOptions\n | SingleDocumentOptions[]\n | null,\n pubUrl: string | null,\n opt_documentOptions?: DocumentOptions,\n opt_viewerOptions?: CoreViewerOptions,\n ) {\n const documentOptions = opt_documentOptions || {};\n\n function convertStyleSheetArray(arr) {\n if (arr) {\n return arr.map((s) => ({ url: s.url || null, text: s.text || null }));\n } else {\n return undefined;\n }\n }\n const authorStyleSheet = convertStyleSheetArray(\n documentOptions[\"authorStyleSheet\"],\n );\n const userStyleSheet = convertStyleSheetArray(\n documentOptions[\"userStyleSheet\"],\n );\n if (opt_viewerOptions) {\n Object.assign(this.options, opt_viewerOptions);\n }\n const command = Object.assign(\n {\n a: singleDocumentOptions ? \"loadXML\" : \"loadPublication\",\n userAgentRootURL: this.settings[\"userAgentRootURL\"],\n url: convertSingleDocumentOptions(singleDocumentOptions) || pubUrl,\n document: documentOptions[\"documentObject\"],\n fragment: documentOptions[\"fragment\"],\n authorStyleSheet: authorStyleSheet,\n userStyleSheet: userStyleSheet,\n },\n convertViewerOptions(this.options),\n );\n if (this.initialized) {\n this.adaptViewer_.sendCommand(command);\n } else {\n this.initialized = true;\n this.adaptViewer_.initEmbed(command);\n }\n }\n\n /**\n * Returns the current page progression of the viewer. If no document is\n * loaded, returns null.\n */\n getCurrentPageProgression(): Constants.PageProgression | null {\n return this.adaptViewer_.getCurrentPageProgression();\n }\n\n private resolveNavigation(nav: Navigation): Navigation {\n switch (nav) {\n case Navigation.LEFT:\n return this.getCurrentPageProgression() === PageProgression.LTR\n ? Navigation.PREVIOUS\n : Navigation.NEXT;\n case Navigation.RIGHT:\n return this.getCurrentPageProgression() === PageProgression.LTR\n ? Navigation.NEXT\n : Navigation.PREVIOUS;\n default:\n return nav;\n }\n }\n\n /**\n * Navigate to the specified page.\n */\n navigateToPage(nav: Navigation, opt_epage?: number) {\n if (nav === Navigation.EPAGE) {\n this.adaptViewer_.sendCommand({\n a: \"moveTo\",\n epage: opt_epage,\n });\n } else {\n this.adaptViewer_.sendCommand({\n a: \"moveTo\",\n where: this.resolveNavigation(nav),\n });\n }\n }\n\n /**\n * Navigate to the specified internal URL.\n */\n navigateToInternalUrl(url: string) {\n this.adaptViewer_.sendCommand({ a: \"moveTo\", url: url });\n }\n\n /**\n * @returns True if TOC is visible, false if hidden, null if TOC is unavailable\n */\n isTOCVisible(): boolean | null {\n if (\n this.adaptViewer_.opfView &&\n this.adaptViewer_.opfView.opf &&\n (this.adaptViewer_.opfView.opf.xhtmlToc ||\n this.adaptViewer_.opfView.opf.ncxToc)\n ) {\n return !!this.adaptViewer_.opfView.isTOCVisible();\n } else {\n return null;\n }\n }\n\n /**\n * Show or hide TOC box\n * @param opt_autohide If true, automatically hide when click TOC item\n * @param opt_show If true show TOC, false hide TOC. If null or undefined toggle TOC.\n */\n showTOC(opt_show?: boolean | null, opt_autohide?: boolean) {\n const visibility = opt_show == null ? \"toggle\" : opt_show ? \"show\" : \"hide\";\n this.adaptViewer_.sendCommand({\n a: \"toc\",\n v: visibility,\n autohide: opt_autohide,\n });\n }\n\n /**\n * Returns zoom factor corresponding to the specified zoom type.\n */\n queryZoomFactor(type: AdaptiveViewer.ZoomType): number {\n return this.adaptViewer_.queryZoomFactor(type);\n }\n\n getPageSizes(): { width: number; height: number }[] {\n return this.adaptViewer_.pageSizes;\n }\n\n /**\n * Returns the current structure of the TOC once it has\n * been shown, or the empty array if there is no TOC.\n */\n getTOC(): Toc.TOCItem[] {\n return this.adaptViewer_.opfView?.tocView?.getTOC();\n }\n\n /**\n * Returns metadata for the publication. Metadata is\n * organized as an object of fully-qualified IRI properties\n * containing arrays of metadata entries. The first element\n * in the array is primary and should be used by default. Other\n * entries may overload or refine that metadata.\n */\n getMetadata(): Epub.Meta {\n return this.adaptViewer_.opf.getMetadata();\n }\n\n /**\n * Returns the cover for an EPUB publication, if specified.\n */\n getCover(): Epub.OPFItem | null {\n return this.adaptViewer_.opf.cover;\n }\n}\n\nfunction convertSingleDocumentOptions(\n singleDocumentOptions: SingleDocumentOptions | SingleDocumentOptions[],\n): AdaptiveViewer.SingleDocumentParam[] | null {\n function toNumberOrNull(num: any): number | null {\n return typeof num === \"number\" ? num : null;\n }\n\n function convert(opt) {\n if (typeof opt === \"string\") {\n return {\n url: opt,\n startPage: null,\n skipPagesBefore: null,\n } as AdaptiveViewer.SingleDocumentParam;\n } else {\n return {\n url: opt[\"url\"],\n startPage: toNumberOrNull(opt[\"startPage\"]),\n skipPagesBefore: toNumberOrNull(opt[\"skipPagesBefore\"]),\n } as AdaptiveViewer.SingleDocumentParam;\n }\n }\n if (Array.isArray(singleDocumentOptions)) {\n return singleDocumentOptions.map(convert);\n } else if (singleDocumentOptions) {\n return [convert(singleDocumentOptions)];\n } else {\n return null;\n }\n}\n\n/**\n * @enum {string}\n */\nexport enum Navigation {\n PREVIOUS = \"previous\",\n NEXT = \"next\",\n LEFT = \"left\",\n RIGHT = \"right\",\n FIRST = \"first\",\n LAST = \"last\",\n EPAGE = \"epage\",\n}\n\nexport type ZoomType = AdaptiveViewer.ZoomType;\nexport const ZoomType = AdaptiveViewer.ZoomType; // eslint-disable-line no-redeclare\n\nexport type PageViewMode = AdaptiveViewer.PageViewMode;\nexport const PageViewMode = AdaptiveViewer.PageViewMode; // eslint-disable-line no-redeclare\n\nProfile.profiler.forceRegisterEndTiming(\"load_vivliostyle\");\n","// Johannes Wilm\n// Vivliostyle Foundation\n\nimport { CoreViewer } from \"./core-viewer\";\nimport { VivliostyleViewportCss, VivliostyleViewportScreenCss } from \"./assets\";\n\ninterface IFrameWindowForPrint {\n printInstance?: VivliostylePrint;\n}\n\nexport interface PrintConfig {\n title: string;\n printCallback: (iframeWin: Window) => void;\n hideIframe: boolean;\n removeIframe: boolean;\n}\n\nclass VivliostylePrint {\n htmlDoc: string;\n title: string;\n printCallback: (iframeWin: Window) => void;\n hideIframe: boolean;\n removeIframe: boolean;\n iframe: HTMLIFrameElement;\n iframeWin: Window;\n window: Window & typeof globalThis & IFrameWindowForPrint;\n\n constructor(\n htmlDoc: string,\n {\n title = \"\",\n printCallback = (iframeWin: Window) => iframeWin.print(),\n hideIframe = true,\n removeIframe = true,\n }: PrintConfig,\n ) {\n this.htmlDoc = htmlDoc;\n this.title = title;\n this.printCallback = printCallback;\n this.hideIframe = hideIframe;\n this.removeIframe = removeIframe;\n }\n\n init() {\n this.iframe = document.createElement(\"iframe\");\n\n if (this.hideIframe) {\n this.iframe.style.width = \"0\"; // We don't want the iframe to be seen, so we make it zero size with zero border.\n this.iframe.style.height = \"0\";\n this.iframe.style.borderWidth = \"0\";\n }\n\n this.window = window;\n this.window.printInstance = this;\n this.iframe.srcdoc = `\n <!DOCTYPE html>\n <html data-vivliostyle-paginated=\"true\">\n <head>\n <meta charset='utf-8'/>\n <meta name='viewport' content='width=device-width, initial-scale=1.0'/>\n <title>${this.title}</title>\n <style>${VivliostyleViewportCss}</style>\n <style>${VivliostyleViewportScreenCss}</style>\n <style>\n html[data-vivliostyle-paginated] {\n width: 100%;\n height: 100%;\n }\n html[data-vivliostyle-paginated] body,\n html[data-vivliostyle-paginated] [data-vivliostyle-viewer-viewport] {\n width: 100% !important;\n height: 100% !important;\n }\n html[data-vivliostyle-paginated],\n html[data-vivliostyle-paginated] body {\n margin: 0;\n padding: 0;\n }\n </style>\n <style id='vivliostyle-page-rules'></style>\n </head>\n <body onload='parent.printInstance.runInIframe(window)'>\n <div id=\"vivliostyle-viewer-viewport\"></div>\n </body>\n </html>`;\n\n document.body.appendChild(this.iframe);\n }\n\n runInIframe(iframeWin: Window) {\n this.iframeWin = iframeWin;\n return this.preparePrint()\n .then(() => this.browserPrint())\n .then(() => this.cleanUp());\n }\n\n preparePrint() {\n this.iframeWin.document.title = this.title;\n const docBlob = new Blob([this.htmlDoc], {\n type: \"text/html\",\n }),\n docURL = URL.createObjectURL(docBlob),\n Viewer = new CoreViewer(\n {\n viewportElement: this.iframeWin.document.body\n .firstElementChild as HTMLElement,\n window: this.iframeWin,\n debug: true,\n },\n {\n defaultPaperSize: {\n width: 794, // These numbers give weird output, but not setting them crashes the browser when there is no CSS.\n height: 1122,\n },\n },\n );\n return new Promise((resolve) => {\n Viewer.addListener(\"readystatechange\", () => {\n if (Viewer.readyState === \"complete\") {\n resolve();\n }\n });\n\n Viewer.loadDocument({\n url: docURL,\n });\n });\n }\n\n browserPrint() {\n this.printCallback(this.iframeWin);\n }\n\n cleanUp() {\n delete this.window.printInstance;\n if (this.removeIframe) {\n this.iframe.parentElement.removeChild(this.iframe);\n }\n }\n}\n\nexport function printHTML(htmlDoc: string, config: PrintConfig) {\n const instance = new VivliostylePrint(htmlDoc, config);\n instance.init();\n}\n"],"names":["PageSide","ReadyState","LogLevel","setDebug","value","isDebug","pageProgressionOf","str","PageProgression","LTR","RTL","Error","argumentsToErrorInfo","args","a","Array","from","e","shift","error","messages","buildMessageAndStackTrace","stack","concat","length","HOOKS","logger","opt_console","this","consoleDebug","msg","debug","log","console","consoleInfo","info","consoleWarn","warn","consoleError","triggerListeners","level","listeners","forEach","listener","addListener","push","arguments","DEBUG","INFO","WARN","ERROR","hooks","registerHook","name","fn","hooksForName","Logging","removeHook","index","indexOf","splice","getHooksForName","plugin","Profiler","performanceInstance","registerTiming","noop","registerStartTiming","registerEndTiming","forceRegisterStartTiming","timestamp","call","forceRegisterEndTiming","printTimings","timestamps","st","Object","keys","stamps","l","i","t","disable","enable","isEnabled","startEnd","now","fallbackPerformanceInstance","Date","profiler","window","performance","profile","firstLetterPattern","emptyObj","stringToJSON","JSON","parse","stripFragment","url","r","match","baseURL","location","href","setBaseURL","NS","resourceBaseURL","setResourceBaseURL","resolveURL","relURL","test","toLowerCase","substr","stripFragmentAndQuery","lastIndexOf","urlOption","j","replace","convertSpecialURL","exec","asString","v","toString","PriorityQueue","queue","add","item","parentIndex","Math","floor","parent","compare","peek","remove","result","curr","pop","size","childIndex","knownPrefixes","propNameMap","checkIfPropertySupported","prefix","prop","probe","document","createElement","style","setProperty","documentElement","cssPropName","txt","toUpperCase","cssToJSProp","getPrefixedPropertyNames","prefixed","setCSSProperty","elem","prefixedPropertyNames","err","getCSSProperty","opt_value","propertyNames","getPropertyValue","getLangAttribute","element","lang","getAttributeNS","XML","namespaceURI","XHTML","getAttribute","StringBuffer","append","list","clear","join","escapeChar","charCodeAt","escapeCSSIdent","escapeCSSStr","lightURLEncode","encodeURIComponent","isLetter","ch","escapeNameStrToHex","s","escapeCharToHex","escapeRegExp","binarySearch","high","good","h","m","numberCompare","b","indexArray","arr","key","map","k","multiIndexArray","SimpleEventTarget","dispatchEvent","evt","type","target","currentTarget","addEventListener","capture","removeEventListener","hasVerticalBBoxBug","hasInlineBlockJustificationBug","hasSoftWrapOpportunityAfterHyphenBug","hasSoftWrapOpportunityByWbrBug","getId","node","nodeType","idtxt","escape","unescapeChar","unescape","parseExtVal","extstr","p","parseExt","ext","RefStep","appendTo","sb","applyTo","pos","ChildStep","id","sideBias","child","childElements","children","childElementCount","firstChild","min","next","nextSibling","after","OffsetStep","offset","textBefore","textAfter","textLength","textContent","Fragment","fromString","fragstr","decodeURIComponent","steps","charAt","parseInt","Base","navigate","doc","ref","slice","trim","text","prependPathFromNode","parentNode","previousSibling","reverse","clonePreferences","pref","fontFamily","lineHeight","margin","hyphenate","columnWidth","horizontal","nightMode","spreadView","pageBorder","enabledMediaTypes","assign","defaultPaperSize","undefined","defaultPreferencesInstance","vivliostyle","print","Special","letterbox","viewW","viewH","objW","objH","scale","cssString","cssIdent","makeQualifiedName","objName","memberName","nextKeyIndex","LexicalScope","resolver","scopeKey","zero","Const","one","_true","_false","builtIns","ceil","round","sqrt","max","x","defineBuiltInName","pageWidth","pageHeight","fontSize","pubTitle","docTitle","values","Native","defineName","qualifiedName","val","defineFunc","funcs","defineBuiltIn","isViewportRelativeLengthUnit","unit","defaultUnitSizes","px","in","pt","pc","cm","mm","q","em","rem","ex","dppx","dpi","dpcm","needUnitConversion","Context","rootScope","viewportWidth","viewportHeight","actualPageWidth","actualPageHeight","initialFontSize","rootFontSize","getScopeContext","scope","scopes","clearScope","queryUnitSize","isRoot","pvw","pvh","vw","pageAreaWidth","vh","pageAreaHeight","pageVertical","evalName","evalCall","params","noBuiltInEval","body","evaluate","apply","evalMediaName","not","enabled","evalMediaTest","feature","req","actual","screen","availWidth","availHeight","pixelDepth","queryVal","storeVal","Val","buf","priority","evaluateCore","context","expand","dependCore","other","dependencyCache","dependOuter","cached","depend","isMediaName","Prefix","_this","getOp","evalPrefix","constructor","Infix","lhs","rhs","_this2","getPriority","evalInfix","thisPriority","Logical","Comparison","Additive","Multiplicative","Not","Negate","And","AndMedia","Or","OrMedia","Lt","Le","Gt","Ge","Eq","Ne","Add","Subtract","Multiply","Divide","Modulo","Numeric","num","_this3","Named","_this4","MediaName","_this5","_this6","Call","_this7","appendValArray","expandedParams","expanded","expandValArray","Cond","cond","ifTrue","ifFalse","_this8","_this9","MediaTest","_this10","Param","_this11","and","v1","v2","sub","mul","div","Visitor","visitValues","visit","visitEmpty","empty","visitSlash","slash","visitStr","visitIdent","ident","visitNumeric","numeric","visitNum","visitInt","visitColor","color","visitURL","visitSpaceList","visitCommaList","visitFunc","func","visitExpr","expr","FilterVisitor","before","SpaceList","CommaList","Func","stringValue","toExpr","isExpr","isNumeric","isNum","isIdent","isSpaceList","visitor","Exprs","Empty","instance","Slash","Str","nameTable","Ident","getName","Num","Int","Color","rgb","URL","appendList","separator","Expr","toNumber","convertNumericToPx","absolute","all","always","auto","avoid","balance","balance_all","block","block_end","block_start","both","bottom","border_box","break_all","break_word","crop","cross","column","exclusive","fixed","flex","footnote","footer","header","hidden","horizontal_tb","inherit","inline","inline_block","inline_end","inline_start","landscape","left","line","list_item","ltr","manual","none","normal","oeb_page_foot","oeb_page_head","page","relative","right","same","snap_block","spread","_static","rtl","table","table_caption","table_cell","table_footer_group","table_header_group","table_row","top","transparent","vertical_lr","vertical_rl","visible","hundredPercent","fullWidth","fullHeight","numericZero","processingOrder","font-size","processingOrderFn","name1","name2","Number","MAX_VALUE","Rect","x1","y1","x2","y2","Point","y","Insets","Segment","low","winding","shapeId","Band","segmentCompare","s1","s2","Shape","points","addSegments","prev","withOffset","offsetX","offsetY","shapeForEllipse","cx","cy","rx","ry","PI","sin","cos","shapeForRect","BandIntersection","lowOrHigh","intersectY","isNaN","addBandIntersections","intersections","w1","w2","mergeIntersections","includeCount","excludeCount","shapeCount","windings1","windings2","xranges","inside","intersectionCount","intersection","stillInside","rotateBox","box","unrotateBox","rotateShape","shape","point","rotatePoint","normalize","bands","currBand","prevBand","findBand","mid","findUppermostFullyOpenRect","rect","band","topEdge","bottomEdge","findBottommostFullyOpenRect","SetVisitor","propSet","Css","IntVisitor","toInt","def","ShapeVisitor","collect","coords","getShape","width","height","numbers","coord","GeometryUtil","toShape","CountersVisitor","reset","counters","toCounters","UrlTransformVisitor","baseUrl","transformer","transformURL","cloneCounterValues","TokenType","TargetCounterReference","targetId","resolved","equals","spineIndex","pageIndex","isResolved","resolve","unresolve","CounterListener","counterStore","countersOfId","documentURLTransformer","transformFragment","countersById","getExprContentListener","CounterResolver","pageScope","setStyler","styler","getFragment","getTransformedId","transformedId","substring","getPageCounterVal","format","currentPageCounters","getCounterNumber","registerPageCounterExpr","getPageCountersVal","getTargetCounters","lookForElement","targetCounters","styleUntilIdIsReached","getTargetPageCounters","currentPage","elementsById","pageCountersById","getTargetCounterVal","countersOfName","pageCounters","resolveReference","pageCountersOfName","saveReferenceOfCurrentPage","getTargetCountersVal","elementCounters","getNamedStringVal","retrievePosition","stringValues","namedStringValues","offsets","sort","pageStartOffset","pageLastOffset","container","querySelectorAll","firstOffset","startOffset","lastOffset","firstExceptOffset","offsetPrev","offsetNext","elementAtOffset","querySelector","elementAtPageStartOffset","firstElementChild","first","start","last","first-except","setNamedString","cascadeInstance","currentElementOffset","CounterStore","createCounterListener","createCounterResolver","setCurrentPage","definePageCounter","counterName","forceSetPageCounter","pageNumber","updatePageCounters","cascadedPageStyle","resetMap","previousPageCounters","incrementMap","resetVal","CssProp","resetCounterName","increment","incrementVal","incrementCounterName","counterValues","pushPageCounters","currentPageCountersStack","popPageCounters","unresolvedRefs","unresolvedReferences","resolvedRefs","resolvedReferences","pushed","referencesToSolve","newReferencesOfCurrentPage","some","finishPage","ids","oldPageIndex","pageIndicesById","prevPageCounters","every","getUnresolvedRefsToPage","refs","idRefs","r1","r2","o","pushReferencesToSolve","referencesToSolveStack","popReferencesToSolve","pagesCounterExprs","exprContentListener","bind","findIndex","setAttribute","PAGES_COUNTER_ATTR","finishLastPage","viewport","nodes","root","pages","Asserts","createLayoutConstraint","LayoutConstraint","allowLayout","nodeContext","viewNode","escapeParseSingle","code","String","fromCharCode","escapeParse","Action","Token","EOF","makeActions","spec","END","INVALID","actionsNormal","SPACE","BANG","STR2","HASH","DOLLAR","PERCENT","AMP","STR1","O_PAR","C_PAR","STAR","PLUS","COMMA","MINUS","DOT","SLASH","INT","COLON","SEMICOL","LT","EQ","GT","QMARK","AT","IDENT","O_BRK","BSLASH","C_BRK","HAT","O_BRC","BAR","C_BRC","TILDE","actionsIdent","ENDIDNT","FUNC","CONT","IDNTESC","actionsNumOrClass","TOCLASS","TONUM","TOIDES","actionsMinus","MINMIN","TOINT","TOIDENT","actionsIdentEsc","ENDIDES","CHKPOSS","FUNCES","actionsInt","ENDINT","PCUNIT","NUMBER","UNIT","actionsNumber","ENDNUM","FrameState","actionsCheckEq","EQTAIL","actionsColon","COL_COL","actionsBar","BAR_BAR","actionsAmp","AMP_AMP","actionsSlash","COMMENT","actionsComment","COMMST","actionsCommentStar","ENDNOTK","actionsMinusMinus","KILL1","actionsLt","LT_BG","actionsLtBang","LT_BG_M","actionsLtBangMinus","KILL2","actionsIdentEscChr","IDESCH","actionsStr1","ENDSTR","STR1ESC","actionsStr2","STR2ESC","actionsStr1Esc","ENDESTR","CHKPOSN","actionsStr2Esc","actionsURL","URL2","URL1","actionsURLInside","ENDURL","CHKSP","URLESC","NaN","actionsURLInside1","TERMURL","actionsURLInside2","actionsURLTail","FINURL","Tokenizer","input","handler","indexMask","buffer","token","tail","fillBuffer","nthToken","n","consume","mark","head","unmark","hasMark","reallocate","newIndexMask","newBuffer","oldIndex","newIndex","position","mnemonics","actions","tokenType","tokenPosition","tokenText","tokenNum","seenSpace","backslashPos","charCode","STR","CLASS","BANG_EQ","NUM","parseFloat","NUMERIC","precededBySpace","privateCurrentTask","primaryScheduler","currentTask","newFrame","task","frame","Frame","state","ACTIVE","newResult","SyncResultImpl","handle","onErr","raise","TimerImpl","currentTime","valueOf","setTimeout","delay","clearTimeout","Scheduler","timer","setSlice","timeout","isTimeSliceOver","sliceOverTime","arm","inTimeSlice","newTime","scheduledTime","timeoutToken","wakeupTime","doTimeSlice","schedule","continuation","opt_delay","c","order","canceled","resumeInternal","run","opt_name","Task","then","done","running","callbacks","callback","savedTask","suspend","Continuation","otherComp","getTask","scheduler","finish","cancel","interrupt","waitTarget","getScheduler","isRunning","whenDone","unwind","exception","opt_frame","fillStack","f","out","thenAsync","thenReturn","thenFinish","isPending","get","ResultImpl","res1","res2","res","INIT","checkEnvironment","FINISHED","DEAD","timeSlice","sleep","loop","step","more","loopWithFrame","LoopBodyFrame","opt_waitTarget","continueLoop","breakLoop","Fetcher","fetch","resource","piggibacks","piggybacks","arrived","piggyback","hasArrived","waitForFetchers","fetchers","fetcher","loadElement","src","localName","removeAttribute","SVG","setAttributeNS","XLINK","VivliostyleViewportScreenCss","XMLHttpRequestResponseType","VivliostyleViewportCss","ValidationTxt","UserAgentXml","UserAgentPageCss","UserAgentBaseCss","ajax","opt_type","opt_method","opt_data","opt_contentType","request","XMLHttpRequest","response","status","statusText","contentType","responseText","responseXML","responseBlob","open","responseType","onreadystatechange","readyState","DOCUMENT","HTMLDocument","TEXT","makeBlob","contentTypeHeader","getResponseHeader","setRequestHeader","send","overrideMimeType","parts","builderCtr","builder","getBlob","Blob","StylesheetFlavor","ResourceStore","parser","load","opt_required","opt_message","resources","fetchInner","isTocBox","endsWith","userAgentXmlUrl","isUserAgentXml","TaskUtil","parseJSONResource","store","colorFromHash","ParserHandler","flavor","AUTHOR","getCurrentToken","getScope","startStylesheet","tagSelector","ns","classSelector","pseudoclassSelector","pseudoelementSelector","idSelector","attributeSelector","op","descendantSelector","childSelector","adjacentSiblingSelector","followingSiblingSelector","nextSelector","startSelectorRule","startFontFaceRule","startFootnoteRule","pseudoelem","startViewportRule","startDefineRule","startRegionRule","startPageRule","startPageMarginBoxRule","startWhenRule","startMediaRule","startFlowRule","flowName","startPageTemplateRule","startPageMasterRule","pseudoName","classes","startPartitionRule","startPartitionGroupRule","startRuleBody","property","important","endRule","startFuncWithSelector","funcName","endFuncWithSelector","getImportantSpecificity","USER_AGENT","USER","getBaseSpecificity","DispatchParserHandler","pushHandler","slave","popHandler","tokenizer","errorMsg","_ParserHandler","SkippingParserHandler","owner","topLevel","depth","SlaveParserHandler","report","message","reportAndSkip","actionsBase","actionsStyleAttribute","actionsSelector","actionsSelectorInFunc","actionsSelectorCont","actionsSelectorStart","actionsPropVal","actionsExprVal","actionsExprOp","actionsError","actionsErrorDecl","actionsErrorSelector","ExprContext","OP_MEDIA_AND","CssTokenizer","LAST","SELECTOR_START","RULE_END","DONE","PROP","SELECTOR_NAME","SELECTOR_ANY","SELECTOR_ID","SELECTOR_CLASS","SELECTOR_ATTR","SELECTOR_PSEUDOCLASS","SELECTOR_CHILD","SELECTOR_SIBLING","SELECTOR_FOLLOWING_SIBLING","SELECTOR_NAME_1","SELECTOR_ANY_1","SELECTOR_ID_1","SELECTOR_CLASS_1","SELECTOR_ATTR_1","SELECTOR_BODY","SELECTOR_PSEUDOCLASS_1","SELECTOR_PSEUDOELEM","SELECTOR_NEXT","VAL_IDENT","VAL_HASH","VAL_NUM","VAL_INT","VAL_NUMERIC","VAL_STR","VAL_URL","VAL_COMMA","VAL_SLASH","VAL_FUNC","VAL_C_PAR","VAL_END","VAL_BRC","VAL_BANG","VAL_PLUS","VAL_FINISH","EXPR_IDENT","EXPR_NUM","EXPR_NUMERIC","EXPR_STR","EXPR_O_PAR","EXPR_FUNC","EXPR_PREFIX","EXPR_PARAM","EXPR_INFIX_NAME","EXPR_INFIX","GT_EQ","LT_EQ","EQ_EQ","EXPR_C_PAR","EXPR_O_BRC","EXPR_SEMICOL","ERROR_PUSH","ERROR_POP","ERROR_SEMICOL","ERROR_POP_DECL","Parser","exprContext","MEDIA","extractVals","sep","valStack","valStackReduce","count","exprError","propName","exprStackReduce","val2","tok","unshift","e1","e2","er","readPseudoParams","readNthPseudoParams","hasLeadingPlus","hasMinusSign","hasSign","makeCondition","condition","split","isInsidePropertyOnlyRule","ruleStack","runParser","parsingValue","parsingStyleAttr","parsingMediaQuery","parsingFunctionParam","token1","parserLoop","propImportant","namespacePrefixToURI","defaultNamespaceURI","pseudoclassType","POSITIVE_INFINITY","TILDE_EQ","BAR_EQ","HAT_EQ","DOLLAR_EQ","STAR_EQ","regionRule","pageRule","IMPORT","WHEN","importCondition","importReady","importURL","ruleName","rulePseudoName","errorBrackets","ErrorHandler","parseStylesheetFromText","media","parseMediaQuery","resolvedURL","innerFrame","parseStylesheetFromURL","parseStylesheet","Net","xhr","parseValue","numProp","z-index","column-count","flow-linger","opacity","flow-priority","utilization","evaluateCSSToCSS","takesOnlyNum","evaluateExprToCSS","matchANPlusB","AnyMatcher","matchers","matches","matcher","AllMatcher","NthFragmentMatcher","elementOffset","registerFragmentIndex","fragmentIndex","indices","fragmentIndices","clearFragmentIndices","entry","LayoutProcessor","PageFloats","Selectors","RepetitiveElement","Table","Vtree","MatcherBuilder","buildViewConditionMatcher","viewCondition","strs","buildAllMatcher","buildAnyMatcher","restoreNewText","changes","reduce","fastdiff","DELETE","resolveIndex","coef","diff","current","change","INSERT","EQUAL","object","formattingContextType","FloatReference","flagmentLayoutConstraintType","isInstanceOfTableFormattingContext","isInstanceOfTableRowLayoutConstraint","Whitespace","ShadowType","delayedProps","transform","transform-origin","delayedPropsIfRelativePositioned","DelayedItem","show","obj","visibility","hide","play","pause","resume","mute","muted","unmute","makeListener","action","actionFn","Page","bleedBox","hrefHandler","anchorElement","preventDefault","setAutoPageWidth","isAuto","isAutoPageWidth","AUTO_PAGE_WIDTH_ATTRIBUTE","setAutoPageHeight","isAutoPageHeight","AUTO_PAGE_HEIGHT_ATTRIBUTE","registerElementWithId","triggers","clientLayout","elems","contains","delayedItems","getElementClientRect","dimensions","trigger","observers","observer","event","zoom","getPageAreaElement","pageAreaElement","whitespaceFromPropertyValue","whitespace","IGNORE","NEWLINE","PRESERVE","canIgnore","Flow","parentFlowName","FlowChunk","linger","repeated","breakBefore","isBetter","clientrectIncreasingTop","clientrectDecreasingRight","isSameNodePositionStep","nps1","nps2","shadowType","isSameShadowContext","shadowContext","nodeShadow","shadowSibling","isSameNodePosition","np1","np2","offsetInNode","newNodePositionFromNodeContext","initialFragmentIndex","sourceNode","NONE","formattingContext","preprocessedTextContent","makeNodeContextFromNodePositionStep","NodeContext","copy","ShadowContext","xmldoc","parentShadow","superShadow","subShadow","sc1","sc2","FirstPseudo","outer","boxOffset","breakPenalty","floatReference","INLINE","hyphenateCharacter","breakWord","inheritedProps","vertical","direction","firstPseudo","resetView","clearSpacer","display","floatSide","clearSide","floatMinWrapBlock","columnSpan","verticalAlign","flexContainer","breakAfter","establishesBFC","containingBlockForAbsolute","repeatOnBreak","pluginProps","afterIfContinues","footnotePolicy","cloneItem","np","captionSide","inlineBorderSpacing","blockBorderSpacing","overflow","create","modify","shared","clone","npp","npc","toNodePositionStep","toNodePosition","nc","isInsideBFC","getContainingBlockForAbsolute","walkUpBlocks","belongsTo","ChunkPosition","primary","floats","isSamePosition","FlowChunkPosition","chunkPosition","flowChunk","FlowPosition","newfp","positions","newarr","startSide","hasContent","LayoutPosition","newcp","highestSeenNode","highestSeenOffset","lookupPositionOffset","flows","flowPositions","thisFlowNames","otherFlowNames","flowPos","startSideOfFlow","firstFlowChunkOfFlow","flowChunkPosition","Container","getInsetTop","marginTop","borderTop","paddingTop","getInsetBottom","marginBottom","borderBottom","paddingBottom","getInsetLeft","marginLeft","borderLeft","paddingLeft","getInsetRight","marginRight","borderRight","paddingRight","getInsetBefore","getInsetAfter","getInsetStart","getInsetEnd","getBeforeEdge","getAfterEdge","getStartEdge","getEndEdge","getInlineSize","getBoxSize","getBoxDir","getInlineDir","copyFrom","originX","originY","innerShape","exclusions","computedBlockSize","snapWidth","snapHeight","setVerticalPosition","setHorizontalPosition","setBlockPosition","extent","setInlinePosition","lastChild","removeChild","getInnerShape","getInnerRect","getPaddingRect","paddingX","paddingY","getOuterShape","outerShapeProp","getOuterRect","outerX","outerY","outerWidth","outerHeight","ContentPropertyHandler","rootContentValue","visitStrInner","ownerDocument","createTextNode","appendChild","img","createElementNS","CssParser","assert","nonTrivialContent","azimuth","border-collapse","border-spacing","caption-side","clip-rule","color-interpolation","color-rendering","cursor","elevation","empty-cells","fill","fill-opacity","fill-rule","font-kerning","font-size-adjust","font-family","font-feature-settings","font-style","font-stretch","font-variant","font-weight","glyph-orientation-vertical","hyphens","hyphenate-character","hyphenate-limit-chars","hyphenate-limit-last","image-rendering","image-resolution","letter-spacing","line-break","line-height","list-style-image","list-style-position","list-style-type","marker","marker-end","marker-mid","marker-start","orphans","overflow-wrap","paint-order","pointer-events","pitch-range","quotes","richness","ruby-align","ruby-position","speak-header","speak-numeral","speak-punctuation","speech-rate","shape-rendering","stress","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","tab-size","text-align","text-align-last","text-anchor","text-decoration-skip","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-combine-upright","text-indent","text-justify","text-rendering","text-size-adjust","text-transform","text-underline-position","voice-family","volume","white-space","widows","word-break","word-spacing","word-wrap","writing-mode","polyfilledInheritedProps","getPolyfilledInheritedProps","Plugin","POLYFILLED_INHERITED_PROPS","props","supportedNamespaces","http://www.idpf.org/2007/ops","http://www.w3.org/1999/xhtml","http://www.w3.org/2000/svg","coupledPatterns","coupledExtentPatterns","geomNames","sides","names","max-width","max-height","min-width","min-height","buildCouplingMap","sideMap","extentMap","pattern","side","extentPattern","couplingMapVert","block-start","block-end","inline-start","inline-end","block-size","inline-size","couplingMapHor","couplingMapVertRtl","couplingMapHorRtl","CascadeValue","getBaseValue","filterValue","increaseSpecificity","specificity","ConditionalCascadeValue","cascadeValues","tv","av","SPECIALS","region-id","fragment-selector-id","isSpecialName","isPropName","isInherited","getProp","setProp","getStyleMap","getMutableStyleMap","getViewConditionalStyleMap","getSpecial","getMutableSpecial","mergeIn","pseudoelement","regionId","viewConditionMatcher","styleKey","styleMap","styles","as","ts","prototype","chainActions","chain","chained","InheritanceVisitor","setPropName","getFontSize","parentFontSize","convertFontRelativeLengthToPx","convertFontSizeToPx","baseFontSize","CascadeAction","mergeWith","CompoundAction","ConditionItemAction","conditionItem","pushConditionItem","fresh","ApplyRuleAction","viewConditionId","currentStyle","ChainedAction","makePrimary","cascade","CheckClassAction","className","currentClassNames","includes","insertInTable","CheckIdAction","currentId","currentXmlId","CheckLocalNameAction","currentLocalName","tags","CheckNSTagAction","currentNamespace","nsPrefix","nsCount","nstags","CheckTargetEpubTypeAction","epubTypePatt","currentElement","getElementById","epubType","epub","CheckNamespaceAction","_this12","CheckAttributePresentAction","_this13","hasAttributeNS","CheckAttributeEqAction","_this14","epubtypes","CheckNamespaceSupportedAction","_this15","CheckAttributeRegExpAction","regexp","_this16","attr","CheckLangAction","langRegExp","_this17","IsFirstAction","isFirst","IsRootAction","IsNthAction","_this18","Matchers","IsNthSiblingAction","currentSiblingOrder","IsNthSiblingOfTypeAction","currentSiblingTypeCounts","IsNthLastSiblingAction","currentFollowingSiblingOrder","IsNthLastSiblingOfTypeAction","counts","currentFollowingSiblingTypeCounts","nsCounts","nextElementSibling","IsEmptyAction","Node","ELEMENT_NODE","TEXT_NODE","IsEnabledAction","disabled","IsDisabledAction","IsCheckedAction","selected","checked","CheckConditionAction","_this19","conditions","dependentConditions","CheckAppliedAction","_this20","applied","cloned","NegateActionsSet","_this21","checkAppliedAction","firstAction","AbstractConditionItem","decrement","DescendantConditionItem","ChildConditionItem","AdjacentSiblingConditionItem","_this22","fired","FollowingSiblingConditionItem","_this23","AfterPseudoelementItem","afterprop","processPseudoelementProps","RestoreLangItem","QuotesScopeItem","oldQuotes","AttrValueFilterVisitor","_this24","createValueFromString","defaultValue","attributeName","hasAttribute","getStringValueFromCssContentVal","ContentPropVisitor","counterResolver","_this25","maxDepth","quoteDepth","upper","lower","additiveNumbering","entries","additiveFormat","alphabeticNumbering","alphabetStr","alphabet","expandAlphabet","digit","alphabeticFormat","numbering","digits","negative","formal","markers","thousands","hundreds","tens","ones","chineseCounter","chineseTradInformal","visitFuncCounter","numval","_this26","visitFuncCounters","numvals","_this27","visitFuncTargetCounter","targetUrlStr","targetUrl","_this28","visitFuncTargetCounters","_this29","visitFuncString","visitFuncContent","pseudos","_pseudos$pseudoName","_pseudos$pseudoName$c","roman","armenian","georgian","hebrew","latin","alpha","greek","russian","square","disc","circle","copyTable","dst","ParseState","Cascade","pagetypes","createInstance","counterListener","CascadeInstance","nextOrder","siblingTypeCountsStack","followingSiblingOrderStack","viewConditions","filter","dependentConditionMatchers","conditionId","_this30","applyAction","pushRule","pageType","baseStyle","currentNSTag","currentEpubTypes","EMPTY","currentPageType","applyActions","defineCounter","scoping","counterScoping","pushCounters","displayVal","setMap","set","setVal","_this$currentElement","_this$currentElement2","setCounterName","listItemCounts","popCounters","setNamedStrings","stringSet","pseudoprops","pushElement","types","siblingOrderStack","currentNamespaceTypeCounts","followingSiblingTypeCountsStack","applyAttrFilter","quotesCasc","itemToPushLast","quotesVal","_this31","pseudoNames","pseudoProps","applyAttrFilterInner","elementStyle","pseudoMap","popRule","popElement","uaBaseCascade","CascadeParserHandler","validatorSet","_this32","TOP","insertNonPrimary","processChain","isInsideSelectorRule","patt","RegExp","footnoteContent","ActionClass","nthSelectorActionClasses","conditionCount","finishChain","SELECTOR","_CssParser$SlaveParse","insideSelectorRule","makeApplyRuleAction","special","validatePropertyAndHandleShorthand","invalidPropertyValue","unknownProperty","simpleProperty","hook","converted","cascval","notParserHandler","NotParameterParserHandler","nth-child","nth-of-type","nth-last-child","nth-last-of-type","_this33","parentChain","_CascadeParserHandler","DefineParserHandler","dim","PropSetParserHandler","_this34","PropertyParserHandler","_this35","forEachViewConditionalStyles","viewConditionalStyles","mergeViewConditionalStyles","cascMap","mergeStyle","isVertical","cascaded","writingModeCasc","writingMode","isRtl","directionCasc","flattenCascadedStyle","regionIds","isFootnote","forEachStylesInRegion","regionStyle","regions","footnoteRegion","to","newVal","convertToPhysical","dest","couplingMap","hasOwnProperty","cascVal","coupledName","targetName","coupledCascVal","createRegExpMap","valueMaps","toPhysical","physical","logical","convert","maps","maps2","replaced","Size","horizontal-tb","vertical-rl","vertical-lr","toPhysicalMaps","toLogicalMaps","getSize","sizes","original","maxWidth","minWidth","maxHeight","minHeight","getComputedValue","getElementComputedStyle","insertBefore","writingModeProperty","writingModeValue","inlineSizeName","blockSizeName","getFillAvailableInline","getMaxContentInline","getMinContentInline","getFitContentInline","fillAvailableInline","minContentInline","parsedFillAvailable","maxContentInline","getIdealBlock","getFillAvailableBlock","FILL_AVAILABLE_INLINE_SIZE","MAX_CONTENT_INLINE_SIZE","MIN_CONTENT_INLINE_SIZE","FIT_CONTENT_INLINE_SIZE","FILL_AVAILABLE_BLOCK_SIZE","MAX_CONTENT_BLOCK_SIZE","MIN_CONTENT_BLOCK_SIZE","FIT_CONTENT_BLOCK_SIZE","FILL_AVAILABLE_WIDTH","FILL_AVAILABLE_HEIGHT","MAX_CONTENT_WIDTH","MAX_CONTENT_HEIGHT","MIN_CONTENT_WIDTH","MIN_CONTENT_HEIGHT","FIT_CONTENT_WIDTH","FIT_CONTENT_HEIGHT","isPageFloat","COLUMN","REGION","PAGE","PageFloat","nodePosition","getOrder","isAllowedOnContext","pageFloatLayoutContext","isAnchorAlreadyAppeared","isAllowedToPrecede","PageFloatStore","nextPageFloatIndex","createPageFloatId","addPageFloat","float","VtreeImpl","findPageFloatByNodePosition","findPageFloatById","PageFloatFragment","continuations","area","continues","hasFloat","findNotAllowedFloat","shouldBeStashedBefore","addContinuations","getFlowName","PageFloatContinuation","PageFloatLayoutContext","generatingNodePosition","floatStore","getPreviousSibling","floatsDeferredFromPrevious","floatsDeferredToNext","getParent","getPreviousSiblingOf","getContainer","setContainer","reattachFloatFragments","getPageFloatLayoutContext","forbid","forbiddenFloats","PageFloatLayoutStrategyResolver","findByFloat","isForbidden","addPageFloatFragment","floatFragment","dontInvalidate","floatFragments","fr1","fr2","invalidate","removePageFloatFragment","fragment","findPageFloatFragment","hasFloatFragments","hasContinuingFloatFragmentsInFlow","registerPageFloatAnchor","anchorViewNode","floatAnchors","collectPageFloatAnchors","anchors","floatId","getDeferredPageFloatContinuations","cont","deferPageFloat","hasPrecedingFloatsDeferredToNext","ignoreReference","getLastFollowingFloatInFragments","lastFollowing","lastFollowingOfParent","c1","c2","getPageFloatContinuationsDeferredToNext","getFloatsDeferredToNextInChildContexts","checkAndForbidNotAllowedFloat","checkAndForbidFloatFollowingDeferredFloat","notAllowedFloat","locked","removeEndFloatFragments","deferredFloats","floatsInFragments","fr","f1","f2","d","hasSameContainerAs","invalidated","layoutConstraints","detachChildren","attachChildren","isInvalidated","validate","toLogical","logicalFloatSide","stashEndFloatFragments","fragmentFloatSide","stashedFloatFragments","restoreStashedFragments","stashed","discardStashedFragments","getStashedFloatFragments","getLimitValue","layoutContext","logicalSide","physicalSide","limit","getLimitValueInner","parentLimit","limits","getLimitValuesInner","paddingRect","floatMinWrapBlockStart","floatMinWrapBlockEnd","resolveLengthPercentage","containerLength","convertLengthToPx","fragments","rootViewNodes","setFloatAreaDimensions","anchorEdge","init","force","blockSize","inlineSize","outerBlockSize","outerInlineSize","blockStart","blockEnd","inlineStart","inlineEnd","blockOffset","inlineOffset","limitBlockStartEndValueWithOpenRect","getRect","openRect","availableBlockSize","containerRect","Sizing","adjustContentRelativeSize","getContentInlineSize","getFloatFragmentExclusions","getMaxReachedAfterEdge","edge","Infinity","getBlockStartEdgeOfBlockEndFloats","getPageFloatClearEdge","isContinuationOfAlreadyAppearedFloat","isFragmentWithAlreadyAppearedFloat","columnRect","columnBlockEnd","blockStartLimit","getPageFloatPlacementCondition","logicalSides","logicalClearSide","floatOrder","isPrecedingFragment","hasPrecedingFragmentInChildren","hasPrecedingFragmentInParents","getLayoutConstraints","addLayoutConstraint","layoutConstraint","isColumnFullWithPageFloats","getMaxBlockSizeOfPageFloats","lock","unlock","isLocked","pageFloatLayoutStrategies","register","strategy","findByNodeContext","appliesToNodeContext","appliesToFloat","createPageFloat","resolveFloatReferenceFromColumnSpan","createPageFloatFragment","floatArea","adjustPageFloatArea","floatContainer","Footnote","FootnoteFragment","LineFootnotePolicyLayoutConstraint","regionContext","applyFootnoteStyle","convertPercentageSizesToPx","setComputedInsets","setComputedWidthAndHeight","constraint","forcedBreakValues","recto","verso","region","isForcedBreakValue","spreadBreakValues","isSpreadBreakValue","avoidBreakValues","avoid-page","avoid-column","avoid-region","isAvoidBreakValue","resolveEffectiveBreakValue","second","firstIsForcedBreakValue","secondIsForcedBreakValue","breakValueToStartSideValue","breakValue","startSideValueToBreakValue","startSideValue","calculateEdge","extraOffset","cbox","range","createRange","setStart","setEnd","boxes","getRangeClientRects","getBoundingClientRect","fullRange","fullBoxes","fullBox","abs","fixBoxesForNode","maxSize","boxSize","getElementHeight","getComputedMargin","isOrphan","removeFollowingSiblings","isSpecial","isSpecialNodeContext","AbstractBreakPosition","calculateOffset","getNodeContext","collectElementsOffset","breakPositionChosen","elementsOffsets","repetitiveElement","minimum","calculateMinimumOffset","EdgeBreakPosition","breakOnEdge","overflows","overflowIfRepetitiveElementsDropped","findAcceptableBreak","penalty","updateOverflows","getMinBreakPenalty","findEdgeBreakPosition","isEdgeUpdated","preferDropping","isFirstContentOfRepetitiveElementsOwner","Break","updateEdge","clonedPaddingBorder","calculateClonedPaddingBorder","LayoutHelper","isOverflown","isInstanceOfRepetitiveElementsOwnerFormattingContext","repetitiveElements","getRepetitiveElements","isFirstContentNode","blockify","blockifiedStr","displayStr","isAbsolutelyPositioned","getComputedDislayValue","isBlock","isInlineLevel","LayoutProcessorResolver","find","RESOLVE_LAYOUT_PROCESSOR","processor","BlockLayoutProcessor","layout","leadingEdge","isFloatNodeContext","layoutFloatOrFootnote","isBreakable","layoutBreakableBlock","layoutUnbreakable","createEdgeBreakPosition","columnBlockSize","BreakPosition","startNonInlineElementNode","afterNonInlineElementNode","stopAtOverflow","clearOverflownViewNodes","parentNodeContext","removeSelf","finishBreak","forceRemoveSelf","endOfColumn","fixJustificationIfNeeded","processFragmentedBlockEdge","BlockFormattingContext","isFirstTime","firstTime","saveState","restoreState","blockLayoutProcessor","isInstanceOfBlockFormattingContext","RESOLVE_FORMATTING_CONTEXT","Display","AbstractLayoutRetryer","prepareLayout","tryLayout","mode","resolveLayoutMode","doLayout","positionAfter","accepted","accept","postLayout","initialPosition","clearNodes","sibling","initialBreakPositions","breakPositions","initialFragmentLayoutConstraints","fragmentLayoutConstraints","initialStateOfFormattingContext","LayoutIteratorStrategy","initialState","initialNodeContext","atUnforcedBreak","break","startNonDisplayableNode","afterNonDisplayableNode","startIgnoredTextNode","afterIgnoredTextNode","startNonElementNode","afterNonElementNode","startInlineElementNode","afterInlineElementNode","LayoutIterator","iterate","loopFrame","nextResult","nextInTree","nextNodeContext","EdgeSkipper","startNonInlineBox","endEmptyNonInlineBox","endNonInlineBox","breakAtTheEdge","onStartEdges","leadingEdgeContexts","lastAfterNodeContext","processForcedBreak","needForcedBreak","pageBreakType","saveEdgeAndProcessOverflow","checkOverflowAndSaveEdgeAndBreakPosition","processLayoutConstraint","violateConstraint","repetitiveElementsCache","DOMParser","parseFromString","SHADOW","getPseudoName","setPseudoName","PseudoelementStyler","getStyle","deep","CssCascade","nest","processContent","contentProcessed","contentVal","AfterIfContinues","viewRoot","pseudoColumn","PseudoColumn","initialPageBreakType","getColumn","createNodePositionForPseudoElement","pseudoElement","PseudoElement","createShadowContext","ROOTED","AfterIfContinuesLayoutConstraint","pseudoElementHeight","overflownNodeContext","nextCandidate","allowed","affectTo","AfterIfContinuesElementsOffset","equalsTo","getPriorityOfFinishBreak","processAfterIfContinuesOfNodeContext","calculatePseudoElementHeight","processAfterIfContinues","mediaTags","svg","audio","video","AllLayoutConstraint","constraints","BoxBreakPosition","checkPoints","alreadyEvaluated","breakNodeContext","findBoxBreakPosition","isSpecialInlineDisplay","Column","viewDocument","getTopEdge","startEdge","beforeEdge","getBottomEdge","endEdge","afterEdge","getLeftEdge","getRightEdge","isFloat","stopByOverflow","footnoteEdge","getExclusions","pageFloatExclusions","openAllViews","setViewRoot","stepIndex","flowRootFormattingContext","calculateOffsetInNodeForNodeContext","setCurrent","maybePeelOff","peelOff","buildViewToNextBlockEdge","bodyFrame","position1Param","positionParam","buildDeepElementView","postLayoutBlock","position1","createFloat","killFloats","cssFloat","createFloats","parseComputedLength","insets","getComputedPaddingBorder","borderLeftWidth","borderTopWidth","borderRightWidth","borderBottomWidth","getComputedInsets","boxSizing","nodeContextIn","layoutFloat","nodeContextAfter","floatBBox","floatBox","parentBox","floatBoxMeasure","floatHorBox","dir","bottommostFloatTop","boxExtent","floatWidth","floatHeight","floatBottom","floatBoxEdge","floatBoxTop","floatBands","lastY","floatBand","leftFloatEdge","rightFloatEdge","updateMaxReachedAfterEdge","setupFloatArea","floatLayoutContext","forceNonfitting","containingBlockRect","fitWithinContainer","createPageFloatArea","floatAreaElement","parentPageFloatLayoutContext","parentContainer","PageFloatArea","layoutSinglePageFloatFragment","allowFragmented","pageFloatFragment","firstFloat","newPosition","failed","floatChunkPosition","newFragment","layoutPageFloatInner","cancelLayout","layoutStashedPageFloats","success","excluded","newFloatAreas","newFragments","stashedFragment","setFloatAnchorViewNode","anchor","applyPseudoelementStyle","columnContext","layoutPageFloat","nodeContextOverflowingDueToRepetitiveElements","createJustificationAdjustmentElement","insertionPoint","span","inner","textIndent","textAlign","leftPos","rightPos","inlineBlock","padding","paddingStr","addAndAdjustJustificationElement","insertAfter","hyphenChar","resolveHyphenateCharacter","prevSibling","prevText","fixJustificationOnHyphen","compensateJustificationLineHeight","br","spanRect","brRect","processLineStyling","resNodeContext","lastCheckPoints","totalLineCount","linePositions","findLinePositions","lineBreak","findAcceptableBreakInside","resNodeContextParam","isLoneImage","getTrailingMarginEdgeAdjustment","trailingEdgeContexts","maxPos","minNeg","checkPointIndex","overflown","saveBoxBreakPosition","POST_LAYOUT_BLOCK","findEndOfLine","linePosition","isUpdateMaxReachedAfterEdge","effectiveLinePosition","lowCP","low1","highCP","high1","mid1","edgePosition","textNode","resolveTextNodeBreaker","breakTextNode","RESOLVE_TEXT_NODE_BREAKER","TextNodeBreaker","getRangeBoxes","end","wentUp","lastGood","haveStart","endNotReached","seekRange","setStartBefore","setEndAfter","boxList","lineBefore","lineAfter","lineEnd","lineLength","overlap","paddingBorders","getOffsetByRepetitiveElements","bp","repetitiveElementsOffset","firstOverflowing","findFirstOverflowingEdgeAndCheckPoint","lineIndex","forceCutBeforeOverflowing","checkPoint","blockEdge","getAfterEdgeOfBlockContainer","blockParent","cp","findAcceptableBreakPosition","nextPenalty","minPenalty","breakPosition","doFinishBreak","initialComputedBlockSize","skipTailEdges","flowPosition","zeroIndent","checkOverflowAndSaveEdge","marginEdge","saveEvenOverflown","saveEdgeBreakPosition","applyClearance","spacer","spacerBox","clearEdge","wAdj","hAdj","isBFC","skipEdges","forcedBreakValue","fc","layoutProcessor","nodeContextParam","lastAfterPosition","resultNodeContext","layoutNext","initGeom","columnBBox","include","exclude","granularity","segment","segments","segmentCount","lowestIncludeIndex","segmentIndex","activeSegments","y2min","yn","bandIntersections","bi1","bi2","rw","chunkPositions","breakAtEdge","isFullWithPageFloats","nextInTreeListener","retryer","ColumnLayoutRetryer","pseudoParent","doFinishBreakOfFragmentLayoutConstraints","sortedFragmentLayoutConstraints","pending","redoLayout","isPseudoelement","saveDistanceToBlockEndFloats","blockStartEdgeOfBlockEndFloats","isFinite","blockDistanceToBlockEndFloats","isInstanceOfRepetitiveElementsOwnerLayoutConstraint","isInstanceOfAfterIfContinuesLayoutConstraint","getElementsOffsetsForTableCell","parentClonedPaddingBorder","startNodeContexts","allowBreakAtStartPosition","startNodeContext","isStartNodeContext","isLastAfterNodeContext","getColumnElement","checkpointIndex","viewIndex","data","breakAfterSoftHyphen","breakAfterOtherCharacter","updateNodeContext","replaceData","ch0","ch1","DefaultLayoutMode","_LayoutRetryers$Abstr","initialOverflown","LayoutRetryers","processAfterIfContinuesOfAncestors","hasNextCandidate","fixFloatSizeAndPosition","refWidth","refHeight","convertPercentageToPx","refValue","valueString","percentageValue","rootViewNode","floatMargins","RepetitiveElementsOwnerFormattingContext","rootSourceNode","getRootViewNode","getRootNodeContext","initializeRepetitiveElements","Shared","elements","RepetitiveElements","ownerSourceNode","setHeaderNodeContext","headerNodePosition","headerSourceNode","headerViewNode","setFooterNodeContext","footerNodePosition","footerSourceNode","footerViewNode","updateHeight","headerHeight","footerHeight","prepareLayoutFragment","isSkipHeader","isSkipFooter","enableSkippingFooter","enableSkippingHeader","appendHeaderToFragment","rootNodeContext","appendElementToFragment","appendFooterToFragment","Layout","allowInsertRepeatitiveElements","moveChildren","isAfterLastContent","findResultFromCache","afterLastContentNodeCache","isAfterNodeContextOf","lastContentSourceNode","affectedNodeCache","cache","calculator","cacheEntry","includeChildren","parentsOfNode","currentParent","previousElementSibling","firstContentSourceNode","isEnableToUpdateState","updateState","preventSkippingHeader","preventSkippingFooter","isHeaderRegistered","isFooterRegistered","isHeaderSourceNode","isFooterSourceNode","LayoutEntireBlock","doneInitialLayout","LayoutFragmentedBlock","LayoutEntireOwnerBlock","doInitialLayout","LayoutFragmentedOwnerBlock","RepetitiveElementsOwnerLayoutConstraint","appendHeader","appendFooter","RepetitiveElementsOwnerLayoutRetryer","EntireBlockLayoutStrategy","LayoutUtil","appendHeaderToAncestors","eachAncestorNodeContext","repetitiveLayoutProcessor","getRepetitiveElementsOwnerFormattingContextOrNull","layoutEntireBlock","TableRow","rowIndex","addCell","cell","cells","getMinimumHeight","TableCell","columnIndex","viewElement","colSpan","rowSpan","setHeight","setAnchorSlot","slot","anchorSlot","TableSlot","TableCellFragment","pseudoColumnContainer","cellNodeContext","TableCaptionView","BetweenTableRowBreakPosition","getAcceptableCellBreakPositions","acceptableCellBreakPositions","cellFragments","getCellFragments","cellFragment","getRowIndex","findRowIndexBySourceNode","getRowSpanningCellsOverflowingTheRow","getCellFragmentOfCell","InsideTableRowBreakPosition","beforeNodeContext","allCellsBreakable","row","getRowByIndex","isFreelyFragmentableRow","getCellsFallingOnRow","TableFormattingContext","tableSourceNode","cellBreakPositions","cellNodePosition","finishFragment","addRow","rows","getRowSlots","rowSlots","slots","rowUpper","startColIndex","addCellFragment","uniqueCells","tableWidth","getColumnCount","columnCount","sum","updateCellSizes","findCellFromColumn","tableCell","col","collectElementsOffsetOfUpperCells","collected","collectElementsOffsetFromColumn","collectElementsOffsetOfHighestColumn","elementsInColumn","ElementsOffsetOfTableCell","RepetitiveElementImpl","repeatitiveElementsInColumns","calculateMaxOffsetOfColumn","maxOffset","isValidParentOfTableRow","isTableRowGrouping","isTableRoot","skipNestedTable","parentDisplay","isNestedInlineTable","EntireTableLayoutStrategy","postLayoutBlockContents","captionView","captions","inHeaderOrFooter","inRow","computedStyle","lastRowViewNode","registerCheckPoint","TableLayoutStrategy","originalStopAtOverflow","resetColumn","getColSpanningCellWidth","colWidths","layoutCell","startChunkPosition","cellViewNode","hasBrokenCellAtSlot","slotIndex","cellBreakPosition","extractRowSpanningCellBreakPositions","rowSpanningCellBreakPositions","currentRowIndex","layoutRowSpanningCellsFromPreviousFragment","rowCount","currentRow","spanningCellRowIndex","occupiedSlotIndices","rowCellBreakPositions","rowNodeContext","cont1","addDummyCellUntil","upperColumnIndex","dummy","breakChunkPosition","startTableRow","inHeader","inFooter","currentColumnIndex","registerCellFragmentIndex","tdNodeStep","getElementOffset","startTableCell","afterNodeContext","startNodePosition","ignoreList","table-caption","table-column-group","table-column","tableLayoutOptionCache","TableLayoutProcessor","layoutEntireTable","getColumnWidths","lastRow","dummyRow","dummyCells","getColGroupElements","tableElement","colGroups","normalizeAndGetColElements","cols","colGroup","cloneNode","addMissingColElements","normalizeColGroups","createDocumentFragment","tableRootSourceNode","pair","tableLayoutOption","clearTableLayoutOptionCache","tableBBox","calculateBreakPositionsInside","EntireTableBreakPosition","addCaptions","caption","addColGroups","removeColGroups","iterator","LayoutRetryer","cellContentElement","cellElement","cellElementRect","tableFormattingContext","LayoutFragmentedTable","LayoutEntireTable","tableNodeContext","EntireTableLayoutConstraint","tableRootNode","TableRowLayoutConstraint","collectCellFragmentLayoutConstraints","cellFragmentLayoutConstraints","removeDummyRowNodes","_RepetitiveElementImp4","array","dummyNode","getCellFragemnts","tableLayoutProcessor","mean","ColumnBalancingTrialResult","layoutResult","getBlockSize","setBlockSize","ColumnBalancer","layoutContainer","columnGenerator","regionPageFloatLayoutContext","originalContainerBlockSize","balanceColumns","preBalance","savePageFloatLayoutContexts","candidates","createTrialResult","updateCondition","restoreContents","postBalance","calculatePenalty","columnPageFloatLayoutContexts","newLayoutResult","columns","canReduceContainerSize","lastCandidate","secondLastCandidate","reduceContainerSize","newEdge","BalanceLastColumnBalancer","totalBlockSize","originalPosition","checkPosition","isLastColumnLongerThanAnyOtherColumn","foundUpperBound","lastColumnBlockSize","BalanceNonLastColumnBalancer","meanValue","computedBlockSizes","SlipRange","endStuckFixed","endFixed","endSlipped","SlipMap","getMaxFixed","getMaxSlipped","addStuckRange","addSlippedRange","slippedByFixed","fixedBySlipped","slipped","Box","atBlockStart","atFlowStart","isParentBoxDisplayed","hasBox","beforeBox","styleValue","getBreakValue","buildAfterPseudoElementBox","afterBox","styleValues","cv","displayValue","isBlockValue","hasBoxValue","BoxStack","lastBox","lastFlowName","isCurrentBoxDisplayed","newFlowChunk","atStartStack","isAtFlowStart","encounteredTextNode","atStart","nearestBlockStartOffset","Styler","primaryFlows","cascadeHolder","offsetMap","rootOffset","boxStack","getAttrStyle","postprocessTopStyle","bodyReached","primaryStack","replayFlowElementsFromOffset","hasProp","transferPropsToRoot","srcStyle","pname","rootStyle","elemStyle","isBody","rootBackgroundAssigned","backgroundColor","backgroundProps","backgroundImage","rootLayoutAssigned","columnProps","layoutProps","unitSize","getTopContainerStyle","styleUntil","CSSStyleDeclaration","styleAttrValue","getReachedOffset","flowNameStr","encounteredFlowElement","getNodeByOffset","nodeOffset","getNodeOffset","resetFlowChunkStream","flowListener","flowChunks","encounteredFlowChunk","styleUntilFlowIsReached","flowToReach","idToReach","optionsCV","options","lingerCV","priorityCV","breakBeforeValues","flow","registerForcedBreakOffset","forcedBreakOffsets","lookup","targetSlippedOffset","afterPseudoBreakBefore","blockStartOffset","beforePseudoBreakAfter","validator","markAsStartGroup","isStartGroup","markAsEndGroup","isEndGroup","markAsStartAlternate","isStartAlternate","markAsEndAlternate","isEndAlternate","getAlternate","Connection","where","ValidatingGroup","connect","nodeIndex","connections","what","group","clonedNode","connection","groupConnection","nomatch","addSpecialToArr","clause","ALWAYS_FAIL","failure","endSpecialGroup","arrs","startSpecialGroup","endClause","startClause","addPrimitive","emptyHead","isSimple","isPrimitive","PrimitiveValidator","addGroup","how","ALTERNATE","combine","connectionIndex","REPEATED","OPTIONAL","successTerminal","failTerminal","PropertyValidator","validateForShorthand","rval","idents","units","NO_IDENTS","ListValidator","failureTerminal","validateList","startIndex","alternativeStack","alternatives","inval","outval","SpaceListValidator","CommaListValidator","validateSingle","hasCommaListValidator","FuncValidator","ShorthandSyntaxNode","tryParse","shorthandValidator","ShorthandSyntaxProperty","validators","rvals","len","ShorthandSyntaxPropertyN","ShorthandSyntaxCompound","index0","ShorthandValidator","setOwner","syntaxNodeForProperty","syntax","propList","receiver","defaultValues","propagateInherit","SimpleShorthandValidator","InsetsShorthandValidator","createSyntaxNode","shorthandValidators","SIMPLE","INSETS","INSETS_SLASH","slashIndex","index1","acc","FONT","_SimpleShorthandValid2","familyList","family","systemFonts","ValidatorSet","addReplacement","cssval","newGroup","vals","subgroup","FOLLOW","addCounts","primitive","newFunc","initBuiltInValidators","namedValidators","%","vi","vb","vmin","vmax","pvi","pvb","pvmin","pvmax","deg","grad","rad","turn","ms","Hz","kHz","stdfont","isBuiltIn","readNameAndPrefixes","section","rulePrefixes","prefixes","parseValidators","expectval","setop","currop","builtIn","parseDefaults","parseShorthands","shorthands","insetShorthand","compound","makePropSet","shorthand","pval","origName","rvalue","baseValidatorSet","traitProps","bogusFontData","bogusFontCounter","prepareProperties","properties","fillDefaults","Face","fontTraitKey","makeFontTraitKey","traitsEqual","makeAtRule","fontBytes","blobURL","createObjectURL","blobURLs","blobs","DocumentFaces","deobfuscator","registerFamily","srcFace","viewFace","srcFamily","viewFamilyFromSrc","familyMap","viewFamilyFromView","filterFontFamily","newValues","rf","Mapper","opt_familyPrefix","familyPrefix","getViewFontFamily","documentFaces","viewFamily","familyCounter","initFont","viewFontFace","killTime","bogusData","probeCont","initWidth","initHeight","loaded","loadFont","srcURLMap","viewFaceParam","BLOB","findOrLoadFonts","srcFaces","keyCount","PageBox","_scope","parentInstance","param","copySpecified","specified","destSpecified","cloneChildren","RootPageBox","PageMasterScope","pageMaster","isFunc","self","keyMap","boxInstance","lookupInstance","resolveFunc","resolveName","PageMaster","PageMasterInstance","resetScope","PartitionGroup","PartitionGroupInstance","Partition","PartitionInstance","toExprAuto","toExprZero","toExprZeroAuto","toExprZeroBorder","styleVal","toExprBool","PageBoxInstance","pageBox","calculatedWidth","calculatedHeight","addNamedValues","namedValues","altName","namedFuncs","columnGap","initEnabled","minPageWidth","minPageHeight","boxSpecificEnabled","initHorizontal","parentWidth","leftBP","rightBP","extra","autoWidth","isAutoWidth","remains","initVertical","parentHeight","topBP","bottomBP","autoHeight","isAutoHeight","initColumns","toExprNormal","depends","registerInstance","getActiveRegions","getPropAsNumber","propagateProperty","docFaces","propagatePropertyToElement","propagateDelayedProperty","assignLeftPosition","assignRightPosition","xpos","snapOffsetX","assignTopPosition","ypos","snapOffsetY","assignBottomPosition","assignBeforePosition","assignAfterPosition","assignStartEndPosition","sizeWithMaxHeight","isTopDependentOnAutoHeight","sizeWithMaxWidth","isRightDependentOnAutoWidth","prepareContainer","passPreProperties","transferContentProps","passContentProperties","transferSinglUriContentProps","passSingleUriContentProperties","finishContainer","readHeight","readWidth","bbox","ruleWidth","ruleStyle","ruleColor","containerSize","border","rule","passPostProperties","delayedProperties","applyCascadeAndInit","docElementStyle","userAgentPageMasterPseudo","resolveAutoSizing","RootPageBoxInstance","_PageBoxInstance","pageMasterInstance","adjustPageLayout","processPartitionList","listVal","conflicting","qname","term","required","toExprIdent","pmEnabledVal","pmEnabled","_PageBoxInstance4","PageBoxParserHandler","PartitionParserHandler","PartitionGroupParserHandler","partition","partitionGroup","PageMasterParserHandler","resolvePageProgression","Constants","CornerMarkPosition","CrossMarkPosition","pageSizes","a5","a4","a3","b5","b4","jis-b5","jis-b4","letter","legal","ledger","defaultPrinterMarkLineWidth","defaultPrinterMarkOffset","defaultPrinterMarkLineLength","defaultBleedOffset","resolvePageSizeAndBleed","pageSizeAndBleed","bleed","bleedOffset","val1","marks","evaluatePageSizeAndBleed","evaluated","cropOffset","createPrinterMarkSvg","createPrinterMarkElement","lineWidth","elementType","MarginBoxPositionAlongVariableDimension","propertiesAppliedToPartition","outline","outline-width","outline-style","outline-color","pageMarginBoxes","top-left-corner","isInTopRow","isInBottomRow","isInLeftColumn","isInRightColumn","positionAlongVariableDimension","top-left","START","top-center","CENTER","top-right","top-right-corner","right-top","right-middle","right-bottom","bottom-right-corner","bottom-right","bottom-center","bottom-left","bottom-left-corner","left-bottom","left-middle","left-top","pageMarginBoxNames","PageRuleMaster","pageSize","PageRulePartition","bodyPartitionKey","createPageMarginBoxes","applySpecified","marginBoxesMap","PageMarginBoxPartition","PageRuleMasterInstance","PageRulePartitionInstance","marginBoxName","ownStyle","ownVal","PageMarginBoxPartitionInstance","pageRuleMaster","_PageMaster$PageMaste2","setPageAreaDimension","pageAreaDimension","borderBoxWidth","borderBoxHeight","marginBoxContainers","marginBoxes","horizontalDimensions","verticalDimensions","sizeMarginBoxesAlongVariableDimension","isHorizontal","containers","boxInstances","boxParams","boxInfo","pageMarginBoxInstances","boxParam","SingleBoxMarginBoxSizingParam","evaluatedDim","getSizesOfMarginBoxesAlongVariableDimension","needRecalculate","maxOuterSizes","evaluatedMaxSize","FixedSizeMarginBoxSizingParam","getOuterSize","minOuterSizes","minSize","evaluatedMinSize","startEndSum","outerSize","availableSize","startBoxParam","centerBoxParam","endBoxParam","startEndBoxParam","MultipleBoxesMarginBoxSizingParam","centerSizes","distributeAutoMarginBoxSizes","xSize","startEndAutoSize","hasAutoSize","startEndSizes","ySize","xOuterMaxContentSize","getOuterMaxContentSize","yOuterMaxContentSize","maxContentSizeSum","xOuterMinContentSize","getOuterMinContentSize","minContentSizeSum","hasAutoSize_","fixedSize","pageRulePartition","_PageMaster$Partition3","resolvePageBoxDimensions","borderBoxExtent","marginStart","marginEnd","endSide","extentName","pageExtent","paddingStart","paddingEnd","borderStartWidth","borderEndWidth","pageMarginBoxPartition","applyVerticalAlign","_PageMaster$Partition4","flexAlign","availableExtent","outerExtent","positionAndSizeAlongFixedDimension","insideName","outsideName","outside","pageMargin","marginInside","marginOutside","paddingInside","paddingOutside","borderInsideWidth","borderOutsideWidth","getComputedValues","pageMarginValue","borderAndPadding","PageManager","rootPageBoxInstance","definePageProgression","styleInstance","isVersoFirstPage","isVersoPage","pageProgression","getCascadedPageStyle","getPageRulePageMaster","makeCacheKey","pageMasterCache","generatePageRuleMaster","generateCascadedPageMaster","propsStr","makeCascadeValueObjectKey","newPageMaster","pageMasterStyle","CheckPageTypeAction","IsFirstPageAction","IsLeftPageAction","IsRightPageAction","IsRectoPageAction","IsVersoPageAction","IsNthPageAction","layoutPositionAtPageStart","blankPageAtStart","ApplyPageRuleAction","targetMap","boxName","targetBox","mergeInPageRule","PageParserHandler","pageProps","currentNamedPageSelector","currentPseudoPageClassSelectors","finishSelector","selectors","currentPageSelectors","_CssCascade$CascadePa","selector","noPageSelectorProps","prevCascVal","marginBoxMap","boxStyle","PageMarginBoxParserHandler","transformURIs","attributeValue","m1","namespacePrefixMap","frontEdgeBlackListHor","margin-top","padding-top","border-top-width","border-top-style","border-top-color","border-top-left-radius","border-top-right-radius","frontEdgeBlackListVert","margin-right","padding-right","border-right-width","border-right-style","border-right-color","border-bottom-right-radius","frontEdgeUnforcedBreakBlackListHor","frontEdgeUnforcedBreakBlackListVert","ViewFactory","footnoteStyle","stylerProducer","customRenderer","fallbackMap","createPseudoelementShadow","cascStyle","getPseudoMap","addedNames","att","content","shadowStyler","ROOTLESS","computedPseudoStyleMap","computedPseudoStyle","createRefShadow","refDocParam","refDoc","refElement","getElement","refStyler","getStylerForDoc","createShadows","templateURLVal","shadow","cont2","computeStyle","displayValues","inheritFromSourceParent","shadowRoot","nodeStyle","inheritanceVisitor","sname","inheritLangAttribute","transferPolyfilledInheritedProps","numericVal","resolveFormattingContext","createElementView","needToProcessChildren","inheritedValues","shadowParam","parentWritingMode","isFlowRoot","floating","listItem","borderCollapse","borderSpacing","processAfterIfcontinues","whitespaceValue","processRepeatOnBreak","findAndProcessRepeatingElements","custom","tag","NCX","navParent","hp","dataset","iframe","contentWindow","navigator","version","layoutStyle","hasFeature","imageResolution","images","cssWidth","cssHeight","attrWidth","attrHeight","hasAutoWidth","hasAutoHeight","attributes","attributeCount","delayedSrc","attribute","attributeNS","nodeValue","image","Image","isSVGUrlAttribute","Urls","attributePrefix","imageFetcher","listStyleImage","listStyleURL","preprocessElementStyle","applyComputedStyles","blackList","isAtForcedBreak","modifyElemDimensionWithImageResolution","SVG_URL_ATTRIBUTES","scaledWidth","scaledHeight","numericMaxHeight","numericMinWidth","numericMinHeight","PREPROCESS_ELEMENT_STYLE","createTextNodeView","preprocessTextContent","Diff","originl","PREPROCESS_TEXT_CONTENT","processedText","createNodeView","processChildren","processShadowContent","contentNode","contentShadowType","contentShadow","nextPositionInTree","shadowNode","sr","isTransclusion","transclusionType","proc","addImageFetchers","bg","isRelativePositioned","propertiesNotPassedToDOM","pn","childComputedStyle","boxDecorationBreak","step1","step2","elem2","parentElement","nodePosition1","nodePosition2","DOMParserSupportedType","box-decoration-break","float-min-wrap-block","float-reference","flow-into","flow-options","footnote-policy","DefaultClientLayout","layoutBox","subtractOffsets","originRect","viewportLeft","viewportTop","rects","layoutBoxRect","getComputedStyle","Viewport","opt_root","opt_width","opt_height","outerZoomBox","contentContainer","innerWidth","innerHeight","resetZoom","XMLDocHolder","NodeList","offsetStr","srcNode","getTotalOffset","totalOffset","buildIdMap","idMap","xmlid","getElementsByName","parseAndReturnNullIfError","opt_parser","docElement","parseXMLResource","supportedKeys","APPLICATION_XML","TEXT_HTML","APPLICATION_XHTML_XML","IMAGE_SVG_XML","resolveContentType","predicate","check","withAttribute","Predicate","withChild","opt_childPredicate","asArray","pr","forEachNode","forEachNonNull","uaStylesheetBaseFetcher","CssValidator","Style","rootBox","fontFaces","footnoteProps","flowProps","viewportProps","fontDeobfuscator","currentLayoutPosition","matchPageSide","lookupOffset","flowChunkIsAfterParentFlowForcedBreak","pageNumberOffset","sizeViewport","textZoom","scaleFactor","defaultFontSize","widthVal","heightVal","StyleInstance","defaultLang","fontMapper","faces","Font","rootPageFloatLayoutContext","CssStyler","stylerMap","CssPage","matchStartPageSide","pageManager","fontFace","pageSheetSize","isRectoStart","isLTR","getStyleForDoc","pageBoxInstances","getConsumedOffset","chunkOffset","getPosition","layoutPosition","noLookAhead","currentPosition","consumedOffset","dumpLocation","updateStartSide","flowChunkBreakBefore","flowBreakAfter","selectPageMaster","pageMasters","coeff","pageArea","initLingering","breakOffsetBeforeStartIndex","breakOffsetBeforeStart","parentFlowPosition","parentStartOffset","setFormattingContextToColumn","layoutDeferredPageFloats","deferredFloatNode","deferredFloatOffset","pageStartPos","parentInvalidated","getLastAfterPositionIfDeferredFloatsExists","layoutColumn","repeatedIndices","removedIndices","alt","counterConstraint","createAndLayoutColumn","forceNonFitting","dontApplyExclusions","boxContainer","columnPageFloatLayoutContext","positionAtColumnStart","columnContainer","columnY","columnX","setPagePageFloatLayoutContextContainer","pagePageFloatLayoutContext","getRegionPageFloatLayoutContext","layoutFlowColumnsWithBalancing","positionAtContainerStart","layoutColumns","layoutFlowColumns","generatorResult","columnFill","columnBalancer","lastColumn","Columns","Vgen","pageBreaks","dontExclude","forwardOrderInLayout","removed","innerContainerTag","innerContainer","suppressEmptyBoxGeneration","outerShape","processLinger","startPage","noMorePrimaryFlows","layoutNextPage","bleedBoxPaddingEdge","evaluatedPageSizeAndBleed","setPageSizeAndBleed","printerMarkOffset","bgcolor","cropMarkLineLength","bleedMarkLineLength","maxLineLength","svgWidth","points1","points2","TOP_RIGHT","BOTTOM_RIGHT","BOTTOM_LEFT","line1","line2","createCornerMark","longLineLength","BOTTOM","horizontalLine","verticalLine","opposite","LEFT","RIGHT","createCrossMark","isLeftPage","getTriggersForDoc","pageSheetWidth","pageSheetHeight","BaseParserHandler","masterHandler","insideRegion","pageHandler","regionCount","regionHandler","processViewportMeta","meta","StyleParserHandler","cascadeParserHandler","parseOPSResource","OPSDocStore","authorStyleSheets","userStyleSheets","setStyleSheets","userAgentXML","triggerSingleDocumentPreprocessing","styleByDocURL","triggersByDocURL","clearStyleSheets","addAuthorStyleSheet","addUserStyleSheet","styleSheets","stylesheet","XmlDoc","PREPROCESS_SINGLE_DOCUMENT","triggerList","getElementsByTagNameNS","triggerElem","EV","sources","userAgentURL","title","rel","styleByKey","styleFetcherByKey","sph","source","encode32","decode32","bytes","bytesToSHA1Int32","appendCount","w","bi","TOCView","rendererFactory","setAutoHeight","makeCustomRenderer","renderer","srcElem","viewParent","behavior","replaceChild","createComment","adaptParentClass","button","toggleNodeExpansion","tabIndex","anchorElem","showTOC","nonTocBoxDoc","viewportSize","OPS","bodyChildElem","hideTOC","isTOCVisible","getTOC","exportTree","links","exportLink","hash","innerText","tocNodeElem","ce","adaptClass","elem1","stopPropagation","EPUBDocStore","makeDeobfuscatorFactory","plainXMLStore","jsonStore","deobfuscators","loadAsPlainXML","startLoadingAsPlainXML","loadAsJSON","startLoadingAsJSON","loadPubDoc","haveZipMetadata","loadEPUBDoc","opf","loadOPF","manifestObj","reportLoadError","OPFDoc","initWithWebPubManifest","loadWebPub","containerXML","pubURL","opfByURL","opfXML","encXML","zipMetadata","initWithXMLDoc","primaryOPFByEPubURL","manifestLink","manifestUrl","xhtmlToc","addDocument","docURL","documents","domain","removePath","startsWith","OPFItem","itemProperties","initWithElement","itemElem","opfURL","mediaType","propStr","initWithParam","skipPagesBefore","getOPFItemId","predefinedPrefixes","dcterms","marc","rendition","onix","xsd","defaultIRI","metaTerms","language","creator","titleType","displaySeq","alternateScript","role","getMetadataComparator","item1","item2","i1","_r1$metaTerms$display","i2","_r2$metaTerms$display","getMathJaxHub","math","PageViewMode","supportedMediaTypes","application/xhtml+xml","image/jpeg","image/png","image/svg+xml","image/gif","audio/mp3","createDocumentURLTransformer","MATHML","path","items","restoreURL","encoded","unescapeCharFromHex","getMetadata","metadata","getPathFromURL","epubBaseURL","decodeURI","manifestURL","pkg","uidref","uidElem","uid","srcToFallbackId","fallback","cover","itemMap","itemMapByPath","fallbackSrc","spine","itemRefElement","tocAttr","ncxToc","pageProgressionAttr","idpfObfURLs","mediaTypeElems","handlerId","bindings","mroot","prefixMap","resolveProperty","iri","rawItems","refines","scheme","DC","rawItemsByTarget","rawItem","makeMetadata","entryMap","sortMetadata","readMetadata","prePaginated","sha1Sum","SHA1","blob","fileReader","FileReader","readAsArrayBuffer","dataView","DataView","byteLength","getUint8","setUint8","makeDeobfuscator","assignAutoPages","manifestText","obfuscations","obfuscationKey","sha1","bytesToSHA1Bytes","encodedPath","compressed","compressedSize","obfuscation","DEFAULT","epage","epageCount","epageCountCallback","setEPageCountMode","epageIsRenderedPage","countEPages","offsetPerEPage","initWithChapters","itemref","primaryEntryPath","encodeURI","hrefNoFragment","itemCount","tocFound","readingOrderOrResources","itemObj","isInReadingOrder","encodingFormat","_this12$items","getCFI","offsetInItem","cfi","CFI","resolveFragment","opfNav","idref","nodeNav","resolveEPage","getEPageFromPosition","makePageAndPosition","OPFView","pageSheetSizeReporter","Counters","getPage","viewItem","spineItems","getCurrentPageProgression","finishPageContainer","oldPage","isFirstPage","prevItem","newPage","insertPos","renderSinglePage","makePage","posParam","layoutPositions","prevPos","getPageViewItem","resultPosition","pageAndPosition","isLastPage","nextLayoutPosition","normalizeSeekPosition","seekOffset","seekOffsetPageIndex","complete","findPage","sync","resultPage","normalizedPosition","renderPage","renderAllPages","renderPagesUpto","notAllPages","lastResult","firstPage","lastPage","nextPage","nextViewItem","spineItemLoadingContinuations","previousPage","isRectoPage","isLeft","getSpread","otherPageAndPosition","thisPage","otherPage","nextSpread","isRecto","next2","result2","previousSpread","oldPrevPageCont","navigateToEPage","navigateToFragment","navigateTo","restored","pageCont","matrix","cssMatrix","makeObjectView","handlerSrc","srcParam","typeParam","pvalue","makeMathJaxView","hub","clonedMath","importNode","resolveURLsInMathML","tagName","newUrl","loadingContinuations","epubSpineProperties","pageCounterOffset","_this27$spineItems$","previousViewItem","pubTitles","removeRenderedPages","hasAutoSizedPages","hasPages","autohide","toc","tocAutohide","tocView","Toc","tocWidth","tocHeight","ZoomType","AdaptiveViewer","viewportElement","instanceId","callbackFn","kick","sendCommand","resizeListener","needResize","pageReplacedListener","hyperlinkListener","pageRuleStyleElement","loadPublication","loadXML","configure","moveTo","addLogListeners","LOADING","packageURL","touchActive","touchX","touchY","needRefresh","currentSpread","pagePosition","fitToScreen","pageViewMode","SINGLE_PAGE","waitForLoading","logLevel","setReadyState","command","Profile","authorStyleSheet","userStyleSheet","Epub","render","resolvedParams","cancelRenderingTask","resize","resolveLength","matched","vp","configurePlugins","CONFIGURATION","showCurrent","forCurrentPages","removePageListeners","hidePages","showSinglePage","showPage","showSpread","leftWidth","rightWidth","reportPosition","sendLocationNotification","createViewport","vs","resolveSpreadView","SPREAD","AUTO_SPREAD","updateSpreadView","sizeIsGood","spreadViewChanged","userAgent","opfView","setPageSize","setPageSizePageRules","pageSheetSizeAlreadySet","styleText","removePageSizePageRules","tocVisible","setSpreadZoom","setPageZoom","getAdjustedZoomFactor","getSpreadDimensions","pageDimension","calculateZoomFactorToFitInsideViewPort","queryZoomFactor","FIT_INSIDE_VIEWPORT","pageDim","renderTask","RenderingCanceledError","resizeTask","INTERACTIVE","notification","COMPLETE","method","currentVisibility","changeAutohide","runCommand","actionName","initEmbed","cmd","maybeParse","viewer","hrefEvent","internal","frameInternal","setPrototypeOf","convertViewerOptions","CoreViewer","Navigation","settings","opt_options","adaptViewer_","dispatcher","autoResize","pageBorderWidth","setOptions","eventTarget","defineProperty","removeListener","loadDocument","singleDocumentOptions","opt_documentOptions","opt_viewerOptions","loadDocumentOrPublication","pubUrl","documentOptions","convertStyleSheetArray","userAgentRootURL","convertSingleDocumentOptions","initialized","resolveNavigation","nav","PREVIOUS","NEXT","navigateToPage","opt_epage","EPAGE","navigateToInternalUrl","opt_show","opt_autohide","getPageSizes","_this$adaptViewer_$op","_this$adaptViewer_$op2","getCover","toNumberOrNull","opt","isArray","VivliostylePrint","htmlDoc","printCallback","iframeWin","hideIframe","removeIframe","borderWidth","printInstance","srcdoc","runInIframe","preparePrint","browserPrint","cleanUp","docBlob","Viewer","Promise","config"],"mappings":"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,sBACAA,0BACAA,0BAGAA,oBACAA,wBACAA,kBACAA,kBACAA,sBACAA,oBACAA,gBACAA,gBACAA,gBAGAA,0BACAA,8BACAA,wBACAA,wBACAA,4BACAA,0BACAA,sBACAA,sBACAA,sBACAA,0BACAA,0BACAA,oBApDF,CAAYA,KAAAA,YAsEA8I,GAfCC,GAOX,WALA7xB,sBAA2B,EAC3BA,SAAc,EACdA,UAAe,GACfA,cAAmB,EAGjBA,KAAKkL,KAAO4d,GAAUgJ,KA6F1B,SAAgBC,GAAYrK,EAAasK,GACvC,IACI5uB,EADElE,EAAcC,MAAM,KAE1B,IAAKiE,EAAI,EAAGA,EAAI,IAAKA,IACnBlE,EAAEkE,GAAKskB,EAGT,IADAxoB,EAAC,IAAQwoB,GAAOkK,GAAOK,IAAML,GAAOK,IAAML,GAAOM,QAC5C9uB,EAAI,EAAGA,EAAI4uB,EAAKpyB,OAAQwD,GAAK,EAChClE,EAAE8yB,EAAK5uB,IAAM4uB,EAAK5uB,EAAI,GAExB,OAAOlE,GAhGT,SAAY0yB,GACVA,qBACAA,iBACAA,qBACAA,mBACAA,mBACAA,uBACAA,yBACAA,iBACAA,sBACAA,sBACAA,oBACAA,oBACAA,sBACAA,sBACAA,kBACAA,sBACAA,sBACAA,0BACAA,gBACAA,gBACAA,gBACAA,sBACAA,gBACAA,sBACAA,sBACAA,sBACAA,sBACAA,wBACAA,kBACAA,kBACAA,sBACAA,oBACAA,oBACAA,kBACAA,wBACAA,wBACAA,wBACAA,oBACAA,oBACAA,wBACAA,wBACAA,0BACAA,0BACAA,0BAGAA,wBACAA,0BAGAA,0BACAA,0BACAA,0BACAA,0BACAA,oBACAA,wBACAA,0BACAA,wBACAA,0BACAA,wBACAA,sBACAA,sBACAA,0BACAA,wBACAA,sBACAA,sBACAA,kBACAA,oBACAA,oBACAA,wBACAA,0BACAA,wBACAA,sBACAA,0BACAA,0BACAA,0BACAA,0BACAA,wBACAA,wBACAA,0BACAA,0BACAA,sBACAA,kBAnFF,CAAYA,KAAAA,QAsGZ,IAAaO,GAA0B,CACrCP,GAAOM,QACPN,GAAOM,QACPN,G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ACPN,GAAOM,QACPN,GAAOM,QACPN,GAAOM,QACPN,GAAOM,QACPN,GAAOM,QACPN,GAAOM,QACPN,GAAOM,QACPN,GAAOM,QACPN,GAAOM,QACPN,GAAOM,QACPN,GAAOM,QACPN,GAAOM,QACPN,GAAOM,QACPN,GAAOM,QACPN,GAAOM,QACPN,GAAOM,QACPN,GAAOM,QACPN,GAAOM,QACPN,GAAOM,QACPN,GAAOM,QACPN,GAAOM,QACPN,GAAOM,QACPN,GAAOM,QACPN,GAAOM,QACPN,GAAOM,QACPN,GAAOM,QACPN,GAAOM,QACPN,GAAOM,QACPN,GAAOM,QACPN,GAAOM,QACPN,GAAOM,QACPN,GAAOM,QACPN,GAAOM,QACPN,GAAOM,QACPN,GAAOM,QACPN,GAAOM,QACPN,GAAOM,QACPN,GAAOM,QACPN,GAAOM,QACPN,GAAOM,QACPN,GAAOM,QACPN,GAAO+C,QACP/C,GAAOgD,MACPhD,GAAOM,QACPN,GAAOgD,MACPhD,GAAOgD,MACPhD,GAAOgD,MACPhD,GAAOgD,MACPhD,GAAOgD,MACPhD,GAAOgD,MACPhD,GAAOgD,MACPhD,GAAOgD,MACPhD,GAAOgD,MACPhD,GAAOgD,MACPhD,GAAOM,QACPN,GAAOM,QACPN,GAAOM,QACPN,GAAOM,QACPN,GAAOM,QACPN,GAAOM,QACPN,GAAOM,QACPN,GAAO+C,QACP/C,GAAO+C,QACP/C,GAAO+C,QACP/C,GAAO+C,QACP/C,GAAO+C,QACP/C,GAAO+C,QACP/C,GAAO+C,QACP/C,GAAO+C,QACP/C,GAAO+C,QACP/C,GAAO+C,QACP/C,GAAO+C,QACP/C,GAAO+C,QACP/C,GAAO+C,QACP/C,GAAO+C,QACP/C,GAAO+C,QACP/C,GAAO+C,QACP/C,GAAO+C,QACP/C,GAAO+C,QACP/C,GAAO+C,QACP/C,GAAO+C,QACP/C,GAAO+C,QACP/C,GAAO+C,QACP/C,GAAO+C,QACP/C,GAAO+C,QACP/C,GAAO+C,QACP/C,GAAO+C,QACP/C,GAAOM,QACPN,GAAOiD,OACPjD,GAAOM,QACPN,GAAOM,QACPN,GAAO+C,QACP/C,GAAOM,QACPN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GAAOgE,OACPhE,GAAOgE,OACPhE,GAAOgE,OACPhE,GAAOgE,OACPhE,GAAOgE,OACPhE,GAAOgE,OACPhE,GAAOgE,OACPhE,GAAOgE,OACPhE,GAAOgE,OACPhE,GAAOgE,OACPhE,GAAOgE,OACPhE,GAAOgE,OACPhE,GAAOgE,OACPhE,GAAOgE,OACPhE,GAAOgE,OACPhE,GAAOgE,OACPhE,GAAOgE,OACPhE,GAAOgE,OACPhE,GAAOgE,OACPhE,GAAOgE,OACPhE,GAAOgE,OACPhE,GAAOgE,OACPhE,GAAOgE,OACPhE,GAAOgE,OACPhE,GAAOgE,OACPhE,GAAOgE,OACPhE,GAAO4D,OACP5D,GAAOgE,OACPhE,GAAOgE,OACPhE,GAAOgE,OACPhE,GAAOgE,OACPhE,GAAOgE,OACPhE,GAAOgE,OACPhE,GAAOgE,OACPhE,GAAOgE,OACPhE,GAAOgE,OACPhE,GAAOgE,OACPhE,GAAO4C,KACP5C,GAAO4C,KACP5C,GAAO4C,KACP5C,GAAO4C,KACP5C,GAAO4C,KACP5C,GAAO4C,KACP5C,GAAO4C,KACP5C,GAAO4C,KACP5C,GAAO4C,KACP5C,GAAO4C,KACP5C,GAAOgE,OACPhE,GAAOgE,OACPhE,GAAOgE,OACPhE,GAAOgE,OACPhE,GAAOgE,OACPhE,GAAOgE,OACPhE,GAAOgE,OACPhE,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAOgE,OACPhE,GAAOgE,OACPhE,GAAOgE,OACPhE,GAAOgE,OACPhE,GAAO8D,KACP9D,GAAOgE,OAC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xB,YAAYq3D,wBAAwB36C,EAAKlK,QAE3C,MACF,IAAK,SACH,GAAIkK,EAAKlK,OAAOxS,QAAU,EACxB,YAAYu3D,gBAAgB76C,EAAKlK,QAEnC,MACF,IAAK,UACH,GAAIkK,EAAKlK,OAAOxS,QAAU,EACxB,YAAYw3D,iBAAiB96C,EAAKlK,QAKxC,OADAxQ,EAAenB,KAAK,sBAAuB6b,EAAKvW,gBACrCwhB,GAAQ,QAlQiBA,IAqS3B4tC,GAAoB,CAC/BqC,MAAO,CACL,KACA,IACA,IACA,IACA,KACA,IACA,IACA,IACA,KACA,IACA,IACA,GACA,KACA,GACA,IACA,GACA,KACA,GACA,IACA,EACA,KACA,EACA,IACA,EACA,KACA,EACA,KAEFC,SAAU,CACR,KACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,EACA,IACA,EACA,IACA,EACA,IACA,EACA,IACA,EACA,IACA,EACA,IACA,EACA,IACA,EACA,IACA,EACA,KAEFC,SAAU,CACR,MACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,EACA,IACA,EACA,IACA,EACA,IACA,EACA,IACA,EACA,IACA,EACA,IACA,EACA,IACA,EACA,IACA,EACA,KAEFC,OAAQ,CACN,IACA,IACA,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"}
\No newline at end of file