UNPKG

2.51 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/net.ts","../src/vivliostyle/task-util.ts","../src/vivliostyle/assets.ts","../src/vivliostyle/css-parser.ts","../src/vivliostyle/matchers.ts","../src/vivliostyle/break.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/display.ts","../src/vivliostyle/layout-helper.ts","../src/vivliostyle/break-position.ts","../src/vivliostyle/layout-processor.ts","../src/vivliostyle/layout-retryers.ts","../src/vivliostyle/layout-util.ts","../src/vivliostyle/shared.ts","../src/vivliostyle/text-polyfill.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/scripts.ts","../src/vivliostyle/urls.ts","../src/vivliostyle/vgen.ts","../src/vivliostyle/xml-doc.ts","../src/vivliostyle/ops.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 = (p1: Base.JSON) => {\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 * @param atFirst If true, the function is registered at the first of the hook array.\n */\nexport function registerHook(\n name: string,\n fn: (...p1) => any,\n atFirst?: boolean,\n): 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 if (atFirst) {\n hooksForName.unshift(fn);\n } else {\n hooksForName.push(fn);\n }\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[\"registerStartTiming\"] = this.registerStartTiming =\n 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 =\n /^[\\s\\p{Zs}\\p{P}\\p{Mn}]*[\\p{L}\\p{N}]\\p{Mn}*(?:[\\s\\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 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 =\n /^(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 =\n /^(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 =\n /^(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 =\n /^(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\nexport function asString(v: any): string | null {\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\nexport const knownPrefixes = [\"\", \"-webkit-\", \"-moz-\"];\n\nexport const propNameMap: { [key: string]: string[] } = {};\n\nexport function checkIfPropertySupported(\n prefix: string,\n prop: string,\n): boolean {\n return CSS.supports(prefix + prop, \"unset\");\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 \"behavior\":\n case \"template\":\n case \"ua-list-item-count\":\n case \"x-first-pseudo\":\n propNameMap[prop] = null;\n return null;\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 }\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 const elemStyle = (elem as HTMLElement)?.style;\n if (!elemStyle) {\n return;\n }\n if (prop.startsWith(\"--\")) {\n elemStyle.setProperty(prop, value || \" \");\n return;\n }\n const prefixedPropertyNames = getPrefixedPropertyNames(prop);\n if (!prefixedPropertyNames) {\n return;\n }\n for (const prefixed of prefixedPropertyNames) {\n switch (prefixed) {\n case \"-webkit-text-combine\": // for Safari\n switch (value) {\n case \"all\":\n value = \"horizontal\";\n break;\n }\n break;\n case \"text-combine-upright\":\n switch (value) {\n case \"all\":\n // workaround for Chrome 93 bug https://crbug.com/1242755\n elemStyle.setProperty(\"text-indent\", \"0\");\n break;\n }\n break;\n }\n elemStyle.setProperty(prefixed, value);\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 /** @override */\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\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: { [key: string]: boolean } = {};\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 if (!list.includes(listener)) {\n list.push(listener);\n }\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","/**\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\";\nimport * as Logging from \"./logging\";\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 /** @override */\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 /** @override */\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 /** @override */\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 const movedNode = elem.ownerDocument.getElementById(this.id);\n if (movedNode) {\n pos.node = movedNode;\n } else {\n Logging.logger.warn(\"E_CFI_ID_MISMATCH:\", this.id);\n }\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 /** @override */\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 case \"lh\":\n case \"rlh\":\n return true;\n default:\n return false;\n }\n}\n\nexport function isRootFontRelativeLengthUnit(unit: string): boolean {\n switch (unit?.toLowerCase()) {\n case \"rem\":\n case \"rlh\":\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 lh: 20,\n rlh: 20,\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 return !CSS.supports(\"font-size\", \"1q\");\n case \"lh\":\n return !CSS.supports(\"line-height\", \"1lh\");\n case \"rem\":\n case \"rlh\":\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 isRelativeRootFontSize: boolean | null = null;\n fontSize: () => number;\n rootLineHeight: number | null = null;\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 if (unit == \"lh\" || unit == \"rlh\") {\n // FIXME: \"lh\" unit is incorrect, treated same as \"rlh\"\n return this.rootLineHeight;\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 >= Number(req);\n case \"max\":\n return actual <= Number(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 evalSupportsTest(name: string, value: string, isFunc: boolean): boolean {\n return false;\n }\n\n queryVal(scope: LexicalScope, key: string): Result | undefined {\n const s = scope && 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 /** @override */\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 if (this.scope) {\n context.storeVal(this.scope, this.key, result);\n }\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 override evaluateCore(context: Context): Result {\n const val = this.val.evaluate(context);\n return this.evalPrefix(val);\n }\n\n override 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 override 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 override 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 override 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 override 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 override 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 override 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 override 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 override 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 override 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 override 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 override getOp(): string {\n return \"!\";\n }\n\n override evalPrefix(val: Result): Result {\n return !val;\n }\n}\n\nexport class NotMedia extends Not {\n constructor(scope: LexicalScope, val: Val) {\n super(scope, val);\n }\n\n override getOp(): string {\n return \"not \";\n }\n}\n\nexport class Negate extends Prefix {\n constructor(scope: LexicalScope, val: Val) {\n super(scope, val);\n }\n\n override getOp(): string {\n return \"-\";\n }\n\n override 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 override getOp(): string {\n return \"&&\";\n }\n\n override 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 override 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 override getOp(): string {\n return \"||\";\n }\n\n override evaluateCore(context: Context): Result {\n return this.lhs.evaluate(context) || this.rhs.evaluate(context);\n }\n}\n\nexport class Comma extends Or {\n constructor(scope: LexicalScope, lhs: Val, rhs: Val) {\n super(scope, lhs, rhs);\n }\n\n override getOp(): string {\n return \", \";\n }\n}\n\nexport class OrMedia extends Or {\n constructor(scope: LexicalScope, lhs: Val, rhs: Val) {\n super(scope, lhs, rhs);\n }\n\n override getOp(): string {\n return \" or \";\n }\n}\n\nexport class Lt extends Comparison {\n constructor(scope: LexicalScope, lhs: Val, rhs: Val) {\n super(scope, lhs, rhs);\n }\n\n override getOp(): string {\n return \"<\";\n }\n\n override 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 override getOp(): string {\n return \"<=\";\n }\n\n override 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 override getOp(): string {\n return \">\";\n }\n\n override 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 override getOp(): string {\n return \">=\";\n }\n\n override 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 override getOp(): string {\n return \"==\";\n }\n\n override 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 override getOp(): string {\n return \"!=\";\n }\n\n override 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 override getOp(): string {\n return \"+\";\n }\n\n override 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 override getOp(): string {\n return \" - \";\n }\n\n override 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 override getOp(): string {\n return \"*\";\n }\n\n override 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 override getOp(): string {\n return \"/\";\n }\n\n override 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 override getOp(): string {\n return \"%\";\n }\n\n override 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 override appendTo(buf: Base.StringBuffer, priority: number): void {\n buf.append(this.num.toString());\n buf.append(Base.escapeCSSIdent(this.unit));\n }\n\n override 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 override appendTo(buf: Base.StringBuffer, priority: number): void {\n buf.append(this.qualifiedName);\n }\n\n override evaluateCore(context: Context): Result {\n return context.evalName(this.scope, this.qualifiedName).evaluate(context);\n }\n\n override 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 constructor(scope: LexicalScope, public not: boolean, public name: string) {\n super(scope);\n }\n\n override 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 override evaluateCore(context: Context): Result {\n return context.evalMediaName(this.name, this.not);\n }\n\n override 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 override appendTo(buf: Base.StringBuffer, priority: number): void {\n buf.append(this.str);\n }\n\n override 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 override appendTo(buf: Base.StringBuffer, priority: number): void {\n buf.append(this.qualifiedName);\n appendValArray(buf, this.params);\n }\n\n override 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 override 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 override 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 override 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 override 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 override 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 override 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 override 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 override 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 override 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 override evaluateCore(context: Context): Result {\n return context.evalMediaTest(this.name.name, this.value);\n }\n\n override 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 override 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 SupportsTest extends Val {\n constructor(\n scope: LexicalScope,\n public name: string,\n public value: string,\n public isFunc: boolean,\n ) {\n super(scope);\n }\n\n override appendTo(buf: Base.StringBuffer, priority: number): void {\n if (this.isFunc) {\n buf.append(this.name);\n }\n buf.append(\"(\");\n if (!this.isFunc && this.name) {\n buf.append(this.name);\n buf.append(\":\");\n }\n buf.append(this.value);\n buf.append(\")\");\n }\n\n override evaluateCore(context: Context): Result {\n return context.evalSupportsTest(this.name, this.value, this.isFunc);\n }\n}\n\nexport class Param extends Val {\n constructor(scope: LexicalScope, public index: number) {\n super(scope);\n }\n\n override appendTo(buf: Base.StringBuffer, priority: number): void {\n buf.append(\"$\");\n buf.append(this.index.toString());\n }\n\n override 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 visitValues(values: Val[]): Val[] {\n for (let i = 0; i < values.length; i++) {\n values[i].visit(this);\n }\n return null;\n }\n\n visitEmpty(empty: Val): Val {\n return null;\n }\n\n visitSlash(slash: Val): Val {\n return null;\n }\n\n visitStr(str: Str): Val {\n return null;\n }\n\n visitIdent(ident: Ident): Val {\n return null;\n }\n\n visitNumeric(numeric: Numeric): Val {\n return null;\n }\n\n visitNum(num: Num): Val {\n return null;\n }\n\n visitInt(num: Int): Val {\n return this.visitNum(num);\n }\n\n visitHexColor(color: HexColor): Val {\n return null;\n }\n\n visitURL(url: URL): Val {\n return null;\n }\n\n visitURange(urange: URange): Val {\n return null;\n }\n\n visitSpaceList(list: SpaceList): Val {\n this.visitValues(list.values);\n return null;\n }\n\n visitCommaList(list: CommaList): Val {\n this.visitValues(list.values);\n return null;\n }\n\n visitFunc(func: Func): Val {\n this.visitValues(func.values);\n return null;\n }\n\n visitExpr(expr: Expr): Val {\n return null;\n }\n}\n\nexport class FilterVisitor extends Visitor {\n error: boolean = false;\n\n constructor() {\n super();\n }\n\n override 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 (this.error) {\n return [];\n }\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 override visitEmpty(empty: Val): Val {\n return empty;\n }\n\n override visitStr(str: Str): Val {\n return str;\n }\n\n override visitIdent(ident: Ident): Val {\n return ident;\n }\n\n override visitSlash(slash: Val): Val {\n return slash;\n }\n\n override visitNumeric(numeric: Numeric): Val {\n return numeric;\n }\n\n override visitNum(num: Num): Val {\n return num;\n }\n\n override visitInt(num: Int): Val {\n return num;\n }\n\n override visitHexColor(color: HexColor): Val {\n return color;\n }\n\n override visitURL(url: URL): Val {\n return url;\n }\n\n override visitURange(urange: URange): Val {\n return urange;\n }\n\n override visitSpaceList(list: SpaceList): Val {\n const values = this.visitValues(list.values);\n if (this.error) {\n return empty;\n }\n if (values === list.values) {\n return list;\n }\n return new SpaceList(values);\n }\n\n override visitCommaList(list: CommaList): Val {\n const values = this.visitValues(list.values);\n if (this.error) {\n return empty;\n }\n if (values === list.values) {\n return list;\n }\n return new CommaList(values);\n }\n\n override visitFunc(func: Func): Val {\n const values = this.visitValues(func.values);\n if (this.error) {\n return empty;\n }\n if (values === func.values) {\n return func;\n }\n return new Func(func.name, values);\n }\n\n override visitExpr(expr: Expr): Val {\n return expr;\n }\n}\n\nexport class Val {\n /** @override */\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 return null;\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: Visitor): Val {\n return this;\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 override toExpr(scope: Exprs.LexicalScope, ref: Exprs.Val): Exprs.Val {\n return new Exprs.Const(scope, \"\");\n }\n\n override appendTo(buf: Base.StringBuffer, toString: boolean): void {}\n\n override visit(visitor: Visitor): Val {\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 override toExpr(scope: Exprs.LexicalScope, ref: Exprs.Val): Exprs.Val {\n return new Exprs.Const(scope, \"/\");\n }\n\n override appendTo(buf: Base.StringBuffer, toString: boolean): void {\n buf.append(\"/\");\n }\n\n override visit(visitor: Visitor): Val {\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 override toExpr(scope: Exprs.LexicalScope, ref: Exprs.Val): Exprs.Val {\n return new Exprs.Const(scope, this.str);\n }\n\n override 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 override visit(visitor: Visitor): Val {\n return visitor.visitStr(this);\n }\n}\n\nconst nameTable: { [key: string]: Ident } = {};\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 override toExpr(scope: Exprs.LexicalScope, ref: Exprs.Val): Exprs.Val {\n return new Exprs.Const(scope, this.name);\n }\n\n override 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 override visit(visitor: Visitor): Val {\n return visitor.visitIdent(this);\n }\n\n override 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 override 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 override appendTo(buf: Base.StringBuffer, toString: boolean): void {\n buf.append(this.num.toString());\n buf.append(this.unit);\n }\n\n override visit(visitor: Visitor): Val {\n return visitor.visitNumeric(this);\n }\n\n override isNumeric(): boolean {\n return true;\n }\n}\n\nexport class Num extends Val {\n constructor(public num: number) {\n super();\n }\n\n override 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 override appendTo(buf: Base.StringBuffer, toString: boolean): void {\n buf.append(this.num.toString());\n }\n\n override visit(visitor: Visitor): Val {\n return visitor.visitNum(this);\n }\n\n override isNum(): boolean {\n return true;\n }\n}\n\nexport class Int extends Num {\n constructor(num: number) {\n super(num);\n }\n\n override visit(visitor: Visitor): Val {\n return visitor.visitInt(this);\n }\n}\n\nexport class HexColor extends Val {\n constructor(public hex: string) {\n super();\n }\n\n override appendTo(buf: Base.StringBuffer, toString: boolean): void {\n buf.append(\"#\");\n buf.append(this.hex);\n }\n\n override visit(visitor: Visitor): Val {\n return visitor.visitHexColor(this);\n }\n}\n\nexport class URL extends Val {\n constructor(public url: string) {\n super();\n }\n\n override appendTo(buf: Base.StringBuffer, toString: boolean): void {\n buf.append('url(\"');\n buf.append(Base.escapeCSSStr(this.url));\n buf.append('\")');\n }\n\n override visit(visitor: Visitor): Val {\n return visitor.visitURL(this);\n }\n}\n\nexport class URange extends Val {\n constructor(public urangeText: string) {\n super();\n }\n\n override appendTo(buf: Base.StringBuffer, toString: boolean): void {\n buf.append(this.urangeText);\n }\n\n override visit(visitor: Visitor): Val {\n return visitor.visitURange(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 override appendTo(buf: Base.StringBuffer, toString: boolean): void {\n appendList(buf, this.values, \" \", toString);\n }\n\n override visit(visitor: Visitor): Val {\n return visitor.visitSpaceList(this);\n }\n\n override isSpaceList(): boolean {\n return true;\n }\n}\n\nexport class CommaList extends Val {\n constructor(public values: Val[]) {\n super();\n }\n\n override appendTo(buf: Base.StringBuffer, toString: boolean): void {\n appendList(buf, this.values, \",\", toString);\n }\n\n override visit(visitor: Visitor): Val {\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 override 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 override visit(visitor: Visitor): Val {\n return visitor.visitFunc(this);\n }\n}\n\nexport class Expr extends Val {\n constructor(public expr: Exprs.Val) {\n super();\n }\n\n override toExpr(): Exprs.Val {\n return this.expr;\n }\n\n override appendTo(buf: Base.StringBuffer, toString: boolean): void {\n if (\n this.expr instanceof Exprs.Const ||\n this.expr instanceof Exprs.Numeric\n ) {\n this.expr.appendTo(buf, 0);\n } else {\n buf.append(\"-epubx-expr(\");\n this.expr.appendTo(buf, 0);\n buf.append(\")\");\n }\n }\n\n override visit(visitor: Visitor): Val {\n return visitor.visitExpr(this);\n }\n\n override isExpr(): boolean {\n return true;\n }\n}\n\n/**\n * Custom property value, may be arbitrary token\n */\nexport class AnyToken extends Val {\n constructor(public text: string) {\n super();\n }\n\n override appendTo(buf: Base.StringBuffer, toString: boolean): void {\n buf.append(this.text || \" \");\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 anywhere: getName(\"anywhere\"),\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 clip: getName(\"clip\"),\n crop: getName(\"crop\"),\n cross: getName(\"cross\"),\n column: getName(\"column\"),\n discard: getName(\"discard\"),\n exclusive: getName(\"exclusive\"),\n _false: getName(\"false\"),\n fixed: getName(\"fixed\"),\n flex: getName(\"flex\"),\n flow_root: getName(\"flow-root\"),\n footnote: getName(\"footnote\"),\n footer: getName(\"footer\"),\n grid: getName(\"grid\"),\n header: getName(\"header\"),\n hidden: getName(\"hidden\"),\n horizontal_tb: getName(\"horizontal-tb\"),\n inherit: getName(\"inherit\"),\n initial: getName(\"initial\"),\n inline: getName(\"inline\"),\n inline_block: getName(\"inline-block\"),\n inline_end: getName(\"inline-end\"),\n inline_start: getName(\"inline-start\"),\n keep: getName(\"keep\"),\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 padding_box: getName(\"padding-box\"),\n page: getName(\"page\"),\n relative: getName(\"relative\"),\n revert: getName(\"revert\"),\n right: getName(\"right\"),\n same: getName(\"same\"),\n scale: getName(\"scale\"),\n snap_block: getName(\"snap-block\"),\n solid: getName(\"solid\"),\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 unset: getName(\"unset\"),\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 fullURange: URange = new URange(\"U+0-10FFFF\");\n\nexport const processingOrder = {\n \"font-size\": 1,\n \"line-height\": 2,\n color: 3,\n};\n\nexport function isDefaultingValue(value: Val): boolean {\n return (\n value === ident.inherit ||\n value === ident.initial ||\n value === ident.revert ||\n value === ident.unset\n );\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\nexport function isCustomPropName(name: string): boolean {\n return name?.length > 2 && name.startsWith(\"--\");\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 override visitIdent(ident: Css.Ident): Css.Val {\n this.propSet[ident.name] = true;\n return ident;\n }\n\n override 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 override 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 override visitNumeric(numeric: Css.Numeric): Css.Val {\n if (this.collect) {\n this.coords.push(numeric);\n }\n return null;\n }\n\n override 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 override visitSpaceList(list: Css.SpaceList): Css.Val {\n this.visitValues(list.values);\n return null;\n }\n\n override 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 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 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 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 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, named strings, and running elements\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 /** @override */\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 NamedRunningValues = {\n [name: string]: { [elementOffset: number]: string };\n};\n\nclass CounterResolver implements CssCascade.CounterResolver {\n styler: CssStyler.Styler | null = null;\n namedStringValues: NamedRunningValues = {};\n runningElements: NamedRunningValues = {};\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 /** @override */\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 /** @override */\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 /** @override */\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 /** @override */\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 this.getRunningValue(this.namedStringValues, name, retrievePosition),\n `named-string-${retrievePosition}-${name}`,\n );\n }\n\n /**\n * Get value of the CSS element() function\n * https://drafts.csswg.org/css-gcpm-3/#running-elements\n */\n getRunningElementVal(name: string, retrievePosition: string): Exprs.Val {\n return new Exprs.Native(\n this.pageScope,\n () => this.getRunningValue(this.runningElements, name, retrievePosition),\n `running-element-${retrievePosition}-${name}`,\n );\n }\n\n private getRunningValue(\n namedRunningValues: NamedRunningValues,\n name: string,\n retrievePosition: string,\n ): string {\n const runningValues = namedRunningValues[name];\n if (!runningValues) {\n return \"\";\n }\n const offsets = Object.keys(runningValues)\n .map((a) => parseInt(a, 10))\n .sort(Base.numberCompare);\n\n const currentPage = this.counterStore.currentPage;\n const pageStartOffset = currentPage.isBlankPage\n ? currentPage.offset - 1\n : currentPage.offset;\n const pageLastOffset = currentPage.isBlankPage\n ? pageStartOffset\n : 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 =\n 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 runningValue =\n runningValues[\n {\n first: firstOffset,\n start: startOffset,\n last: lastOffset,\n \"first-except\": firstExceptOffset,\n }[retrievePosition]\n ] || \"\";\n\n return runningValue;\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 elementOffset: number,\n ): void {\n const values =\n this.namedStringValues[name] || (this.namedStringValues[name] = {});\n values[elementOffset] = stringValue;\n }\n\n /**\n * Set running element\n * https://drafts.csswg.org/css-gcpm-3/#running-elements\n */\n setRunningElement(name: string, elementOffset: number): void {\n const values =\n this.runningElements[name] || (this.runningElements[name] = {});\n values[elementOffset] = String(elementOffset);\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 private pageCounterExprs: {\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\"] as CssCascade.CascadeValue;\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[\n \"counter-increment\"\n ] as CssCascade.CascadeValue;\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(page: Vtree.Page): {\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 } else {\n this.pageCounterExprs.push({ expr, format });\n }\n }\n\n getExprContentListener(): Vtree.ExprContentListener {\n return this.exprContentListener.bind(this);\n }\n\n private exprContentListener(\n expr: Exprs.Val,\n val: string,\n document: Document,\n ) {\n if (expr instanceof Exprs.Native) {\n if (expr.str == \"viv-leader\") {\n const node = document.createElementNS(Base.NS.XHTML, \"span\");\n node.textContent = val;\n node.setAttribute(\"data-viv-leader\", expr.key);\n node.setAttribute(\"data-viv-leader-value\", val);\n return node;\n } else if (expr.str.startsWith(\"running-element-\")) {\n const elemList =\n val &&\n document.querySelectorAll(`[${Base.ELEMENT_OFFSET_ATTR}=\"${val}\"]`);\n if (!elemList || elemList.length === 0) {\n return null;\n }\n const lastElem = elemList[elemList.length - 1];\n const clonedElem = lastElem.cloneNode(true) as HTMLElement;\n this.fixPageCounterInRunningElement(clonedElem);\n clonedElem.style.position = \"\";\n clonedElem.style.visibility = \"\";\n return clonedElem;\n }\n }\n\n const foundPagesCounter =\n this.pagesCounterExprs.findIndex((o) => o.expr === expr) >= 0;\n const foundPageCounter =\n !foundPagesCounter &&\n this.pageCounterExprs.findIndex((o) => o.expr === expr) >= 0;\n if (foundPagesCounter || foundPageCounter) {\n const node = document.createElementNS(Base.NS.XHTML, \"span\");\n node.textContent = val;\n node.setAttribute(\n foundPagesCounter ? PAGES_COUNTER_ATTR : PAGE_COUNTER_ATTR,\n expr.key,\n );\n return node;\n } else {\n return null;\n }\n }\n\n private fixPageCounterInRunningElement(runningElem: Element): void {\n const nodes = runningElem.querySelectorAll(`[${PAGE_COUNTER_ATTR}]`);\n for (const node of nodes) {\n const key = node.getAttribute(PAGE_COUNTER_ATTR);\n const counterExpr = this.pageCounterExprs.find((o) => o.expr.key === key);\n const str = (counterExpr?.expr as Exprs.Native).str;\n const counterName = str?.replace(/^page-counters?-/, \"\");\n const counterValues = this.currentPageCounters[counterName];\n if (counterValues) {\n node.textContent = counterExpr.format(counterValues);\n }\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\";\nexport const PAGE_COUNTER_ATTR = \"data-vivliostyle-page-counter\";\n\nclass LayoutConstraint implements Layout.LayoutConstraint {\n constructor(\n public readonly counterStore: CounterStore,\n public readonly pageIndex: number,\n ) {}\n\n /** @override */\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(\"data-vivliostyle-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\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 === 0 || (code >= 0xd800 && code <= 0xdfff) || code > 0x10ffff) {\n return \"\\uFFFD\";\n }\n return String.fromCodePoint(code);\n}\n\nexport function escapeParse(str: string): string {\n return str.replace(\n /\\\\([0-9a-fA-F]{1,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 URANGE,\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 CDO,\n CDC,\n UNKNOWN,\n INVALID,\n LAST = 54,\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 toString(): string {\n switch (this.type) {\n case TokenType.O_PAR:\n return \"(\";\n case TokenType.C_PAR:\n return \")\";\n case TokenType.O_BRC:\n return \"{\";\n case TokenType.C_BRC:\n return \"}\";\n case TokenType.O_BRK:\n return \"[\";\n case TokenType.C_BRK:\n return \"]\";\n case TokenType.COMMA:\n return \",\";\n case TokenType.SEMICOL:\n return \";\";\n case TokenType.COLON:\n return \":\";\n case TokenType.SLASH:\n return \"/\";\n case TokenType.PERCENT:\n return \"%\";\n case TokenType.QMARK:\n return \"?\";\n case TokenType.PLUS:\n return \"+\";\n case TokenType.MINUS:\n return \"-\";\n case TokenType.BAR_BAR:\n return \"||\";\n case TokenType.AMP_AMP:\n return \"&&\";\n case TokenType.BANG:\n return \"!\";\n case TokenType.DOLLAR:\n return \"$\";\n case TokenType.HAT:\n return \"^\";\n case TokenType.BAR:\n return \"|\";\n case TokenType.TILDE:\n return \"~\";\n case TokenType.STAR:\n return \"*\";\n case TokenType.GT:\n return \">\";\n case TokenType.LT:\n return \"<\";\n case TokenType.EQ:\n return \"=\";\n case TokenType.BANG_EQ:\n return \"!=\";\n case TokenType.DOLLAR_EQ:\n return \"$=\";\n case TokenType.HAT_EQ:\n return \"^=\";\n case TokenType.BAR_EQ:\n return \"|=\";\n case TokenType.TILDE_EQ:\n return \"~=\";\n case TokenType.STAR_EQ:\n return \"*=\";\n case TokenType.GT_EQ:\n return \">=\";\n case TokenType.LT_EQ:\n return \"<=\";\n case TokenType.EQ_EQ:\n return \"==\";\n case TokenType.COL_COL:\n return \"::\";\n case TokenType.CDO:\n return \"<!--\";\n case TokenType.CDC:\n return \"-->\";\n case TokenType.NUMERIC:\n return this.num.toString() + this.text;\n case TokenType.NUM:\n case TokenType.INT:\n return this.num.toString();\n case TokenType.AT:\n return \"@\" + this.text;\n case TokenType.HASH:\n return \"#\" + this.text;\n case TokenType.FUNC:\n return this.text + \"(\";\n case TokenType.CLASS:\n return \".\" + this.text;\n case TokenType.EOF:\n return \"/*EOF*/\";\n default:\n return this.text;\n }\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 CDO,\n CDC,\n}\n\nexport function makeActions(def: Action, spec: number[]): 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.CDC,\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.CDO,\n]);\n\nexport const actionsIdentEscChr: Action[] = makeActions(Action.IDESCH, [\n 10 /*LF*/,\n Action.INVALID,\n 13 /*CR*/,\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 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 private fillBuffer(): void {\n let tail = this.tail;\n let 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 throw new Error(\"F_CSSTOK_INTERNAL\");\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 tokenText = input.substring(tokenPosition, position);\n if (isNaN(charCode)) {\n // unclosed comment `/***[EOF]`, unclosed string `\"**[EOF]`\n tokenType = TokenType.EOF;\n } else {\n // invalid, e.g, `.` in `:nth-child([.])` (Issue #597)\n tokenType = TokenType.INVALID;\n }\n actions = actionsNormal;\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 = escapeParse(input.substring(tokenPosition, position));\n\n // unicode-range support\n if (\n (tokenType === TokenType.URANGE && charCode === 63) ||\n (tokenType === TokenType.IDENT &&\n tokenText.toLowerCase() === \"u\" &&\n /^(\\bu\\+[?0-9a-f]+(-[?0-9a-f]+)?|,|\\s+|\\/\\*([^*]|\\*[^/])*\\*\\/)+[;}]/i.test(\n input.substring(position - 1),\n ))\n ) {\n tokenType = TokenType.URANGE;\n position++;\n continue;\n }\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 if (input[position] !== \">\") {\n // dashed-ident (custom property name)\n tokenType = TokenType.IDENT;\n actions = actionsIdent;\n }\n continue;\n case Action.CDO:\n tokenType = TokenType.CDO;\n tokenText = input.substring(tokenPosition, ++position);\n actions = actionsNormal;\n break;\n case Action.CDC:\n tokenType = TokenType.CDC;\n tokenText = input.substring(tokenPosition, ++position);\n actions = actionsNormal;\n break;\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 actions = actionsIdent;\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 */\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 as Error, 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 /** @override */\n currentTime(): number {\n return new Date().valueOf();\n }\n\n /** @override */\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 /** @override */\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 as Error);\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 /** @override */\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 /** @override */\n then(callback: (T: any) => void) {\n callback(this.value);\n }\n\n /** @override */\n thenAsync<T1>(callback: (p1: T) => Result<T1>) {\n return callback(this.value);\n }\n\n /** @override */\n thenReturn<T1>(result: T1) {\n return new SyncResultImpl(result);\n }\n\n /** @override */\n thenFinish(frame: Frame<T>): void {\n frame.finish(this.value);\n }\n\n /** @override */\n isPending(): boolean {\n return false;\n }\n\n /** @override */\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 /** @override */\n then(callback: (p1: T) => void): void {\n this.frame.then(callback);\n }\n\n /** @override */\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 /** @override */\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 /** @override */\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 /** @override */\n isPending(): boolean {\n return this.frame.state == FrameState.ACTIVE;\n }\n\n /** @override */\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 as Error, 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 as Error, 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 as Error, 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 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.url = request.responseURL;\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 Document\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\nexport function makeBlob(\n parts: (string | Blob | ArrayBuffer | ArrayBufferView)[],\n opt_type?: string,\n): Blob {\n const type = opt_type || \"application/octet-stream\";\n return new Blob(parts, { type });\n}\n\nexport function readBlob(blob: Blob): Task.Result<ArrayBuffer> {\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 URL.revokeObjectURL(url);\n}\n\n/**\n * @return url\n */\nexport function createObjectURL(blob: Blob): string {\n return URL.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/**\n * @return holding event type (load/error/abort)\n */\nexport function loadElement(\n elem: Element,\n src?: string,\n): TaskUtil.Fetcher<string> {\n const fetcher = new TaskUtil.Fetcher(() => {\n const frame: Task.Frame<string> = Task.newFrame(\"loadElement\");\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 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 if (src) {\n elem.setAttributeNS(Base.NS.XLINK, \"xlink:href\", src);\n }\n // SVG handlers are not reliable\n setTimeout(handler, 300);\n } else if (elem.localName === \"script\") {\n setTimeout(handler, 3000);\n } else if (src) {\n (elem as any).src = src;\n }\n return frame.result();\n }, `loadElement ${src || elem.localName}`);\n fetcher.start();\n return fetcher;\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 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 * 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 box-sizing: border-box;\n display: flex;\n overflow: auto;\n position: relative;\n }\n\n [data-vivliostyle-outer-zoom-box] {\n margin: auto;\n overflow: hidden;\n flex: none;\n }\n\n [data-vivliostyle-viewer-viewport] [data-vivliostyle-spread-container] {\n display: flex;\n flex: none;\n justify-content: center;\n transform-origin: left top;\n }\n\n [data-vivliostyle-viewer-viewport][data-vivliostyle-page-progression=\"ltr\"]\n [data-vivliostyle-spread-container] {\n flex-direction: row;\n }\n\n [data-vivliostyle-viewer-viewport][data-vivliostyle-page-progression=\"rtl\"]\n [data-vivliostyle-spread-container] {\n flex-direction: row-reverse;\n }\n\n [data-vivliostyle-viewer-viewport] [data-vivliostyle-page-container] {\n margin: 0 auto;\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 transform-origin: left top;\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-spread-container] {\n transform: scale(var(--viv-outputScale,1));\n transform-origin: left top;\n}\n\n/* Emulate high pixel ratio using zoom & transform:scale() */\n@supports (zoom: 8) {\n [data-vivliostyle-layout-box] {\n zoom: calc(var(--viv-outputPixelRatio,1) / var(--viv-devicePixelRatio,1));\n transform: scale(calc(var(--viv-devicePixelRatio,1) / var(--viv-outputPixelRatio,1)));\n }\n [data-vivliostyle-spread-container] {\n zoom: calc(var(--viv-outputPixelRatio,1) / var(--viv-devicePixelRatio,1));\n transform: scale(calc(var(--viv-outputScale,1) * var(--viv-devicePixelRatio,1) / var(--viv-outputPixelRatio,1)));\n }\n /* Workaround for Chromium's default border etc. widths not zoomed but scaled down */\n [data-vivliostyle-spread-container] :where([style*=border],[style*=outline],[style*=rule]) {\n border-width: medium;\n outline-width: medium;\n column-rule-width: medium;\n }\n [data-vivliostyle-spread-container] ::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n }\n [data-vivliostyle-spread-container] ::-webkit-scrollbar-track {\n background-color: #f4f4f4;\n }\n [data-vivliostyle-spread-container] ::-webkit-scrollbar-thumb {\n border-radius: 4px;\n background: #c7c7c7;\n }\n [data-vivliostyle-spread-container] ::-webkit-scrollbar-thumb:hover {\n background: #7d7d7d;\n }\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 background-origin: content-box !important;\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 --viv-outputScale: 1 !important;\n --viv-devicePixelRatio: 1 !important;\n zoom: normal !important;\n transform: none !important;\n }\n\n @supports (zoom: 8) {\n [data-vivliostyle-spread-container] [data-vivliostyle-page-container] {\n zoom: var(--viv-outputPixelRatio,1);\n transform: scale(calc(1 / var(--viv-outputPixelRatio,1)));\n transform-origin: left top;\n }\n }\n\n [data-vivliostyle-spread-container] [data-vivliostyle-page-container] {\n display: block !important;\n max-height: 100vh;\n }\n\n [data-vivliostyle-spread-container] [data-vivliostyle-page-container]:not(:last-child) {\n break-after: page;\n }\n\n /* Gecko-only hack, see https://bugzilla.mozilla.org/show_bug.cgi?id=267029#c17 */\n @-moz-document url-prefix() {\n [data-vivliostyle-spread-container] [data-vivliostyle-page-container]:nth-last-child(n + 2) {\n top: -1px;\n margin-top: 1px;\n margin-bottom: -1px;\n }\n /* Workaround Gecko problem on page break */\n [data-vivliostyle-spread-container] [data-vivliostyle-page-container] {\n break-after: auto !important;\n height: 100% !important;\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;\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;\nMIN_MAX_FIT_CONTENT = min-content | max-content | fit-content;\nBG_POSITION_TERM = PLENGTH | left | center | right | top | bottom;\nURI_OR_NONE = URI | none;\nIMAGE = URI | IMAGE_FUNCTION | none;\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 = IDENT;\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 leader([ dotted | solid | space ] | STRING ) |\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]?) |\n element(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;\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 |\n flow-root | grid | inline-grid | contents;\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;\nfont-style = normal | italic | oblique;\nfont-weight = normal | bold | bolder | lighter | POS_NUM;\nheight = PAPLENGTH | MIN_MAX_FIT_CONTENT;\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 | MIN_MAX_FIT_CONTENT;\nmax-width = NPLENGTH | MIN_MAX_FIT_CONTENT;\nmin-height = APLENGTH | MIN_MAX_FIT_CONTENT;\nmin-width = APLENGTH | MIN_MAX_FIT_CONTENT;\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 | clip;\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;\nposition = static | relative | absolute | fixed | running(IDENT);\nquotes = [STRING STRING]+ | none | auto;\nright = APLENGTH;\ntable-layout = auto | fixed;\ntext-align = left | right | center | justify | start | end;\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;\nwhite-space = normal | pre | nowrap | pre-wrap | pre-line | break-spaces;\nwidows = POS_INT;\nwidth = PAPLENGTH | MIN_MAX_FIT_CONTENT;\nword-spacing = normal | LENGTH_OR_NUM;\nz-index = auto | INT;\n\n[epub,moz,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 | MIN_MAX_FIT_CONTENT;\ninline-size = PAPLENGTH | MIN_MAX_FIT_CONTENT;\nmax-block-size = NPLENGTH | MIN_MAX_FIT_CONTENT;\nmax-inline-size = NPLENGTH | MIN_MAX_FIT_CONTENT;\nmin-block-size = APLENGTH | MIN_MAX_FIT_CONTENT;\nmin-inline-size = APLENGTH | MIN_MAX_FIT_CONTENT;\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]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]transform = none | TRANSFORM_FUNCTION+;\n[epub]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;\nmargin-break = auto | keep | discard;\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 | IDENT; /* page: IDENT is for CSS Paged Media */\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 */\nCOMMON_LIG_VALUES = [ common-ligatures | no-common-ligatures ];\nDISCRETIONARY_LIG_VALUES = [ discretionary-ligatures | no-discretionary-ligatures ];\nHISTORICAL_LIG_VALUES = [ historical-ligatures | no-historical-ligatures ];\nCONTEXTUAL_ALT_VALUES = [ contextual | no-contextual ];\nfont-variant-ligatures = normal | none | [ COMMON_LIG_VALUES || DISCRETIONARY_LIG_VALUES || HISTORICAL_LIG_VALUES || CONTEXTUAL_ALT_VALUES ];\nfont-variant-caps = normal | small-caps | all-small-caps | petite-caps | all-petite-caps | unicase | titling-caps;\nNUMERIC_FIGURE_VALUES = [ lining-nums | oldstyle-nums ];\nNUMERIC_SPACING_VALUES = [ proportional-nums | tabular-nums ];\nNUMERIC_FRACTION_VALUES = [ diagonal-fractions | stacked-fractions ];\nfont-variant-numeric = normal | [ NUMERIC_FIGURE_VALUES || NUMERIC_SPACING_VALUES || NUMERIC_FRACTION_VALUES || ordinal || slashed-zero ];\nEAST_ASIAN_VARIANT_VALUES = [ jis78 | jis83 | jis90 | jis04 | simplified | traditional ];\nEAST_ASIAN_WIDTH_VALUES = [ full-width | proportional-width ];\nfont-variant-east-asian = normal | [ EAST_ASIAN_VARIANT_VALUES || EAST_ASIAN_WIDTH_VALUES || ruby ];\nfont-variant_css2 = normal | small-caps; /* for font shorthand */\nfont-size-adjust = none | NNEG_NUM;\n[webkit]font-kerning = auto | normal | none;\nfont-feature-settings = COMMA( normal | SPACE( STRING [ on | off | INT ]? )+ );\nFONT_STRETCH_CSS3_VALUES = normal | wider | narrower | ultra-condensed | extra-condensed | condensed | semi-condensed | semi-expanded | expanded | extra-expanded | ultra-expanded;\nfont-stretch = FONT_STRETCH_CSS3_VALUES | PERCENTAGE;\nfont-stretch_css3 = FONT_STRETCH_CSS3_VALUES; /* for font shorthand */\nfont-display = [ auto | block | swap | fallback | optional ];\nunicode-range = COMMA( URANGE+ );\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 = a10 | a9 | a8 | a7 | a6 | a5 | a4 | a3 | a2 | a1 | a0\n | b10 | b9 | b8 | b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0\n | c10 | c9 | c8 | c7 | c6 | c5 | c4 | c3 | c2 | c1 | c0\n | jis-b10 | jis-b9 | jis-b8 | jis-b7 | jis-b6 | jis-b5 | jis-b4 | jis-b3 | jis-b2 | jis-b1 | jis-b0\n | letter | legal | ledger;\nbleed = auto | LENGTH;\nmarks = none | [ crop || cross ];\nsize = POS_LENGTH{1,2} | auto | [ PAGE_SIZE || [ portrait | landscape ] ];\ncrop-offset = auto | LENGTH;\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]text-size-adjust = auto | none | POS_PERCENTAGE;\n\n/* CSS Text */\n[webkit]line-break = auto | loose | normal | strict | anywhere;\noverflow-wrap = normal | break-word | anywhere;\n[moz]tab-size = NNEG_INT | NNEG_LENGTH;\n[moz]text-align-last = auto | start | end | left | right | center | justify;\ntext-justify = auto | none | inter-word | inter-character;\nword-break = normal | keep-all | break-all | break-word;\ntext-spacing-trim = auto | space-all | trim-auto |\n [[ trim-start | space-start | space-first ] ||\n [ trim-end | space-end | allow-end ] ||\n [ trim-adjacent | space-adjacent ]];\ntext-autospace = normal | auto | no-autospace |\n [[ ideograph-alpha || ideograph-numeric || punctuation ] || [ insert | replace ]];\nhanging-punctuation = none | [ first || [ force-end | allow-end ] || last ];\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[webkit]text-decoration-thickness = from-font | APLENGTH;\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[webkit]text-underline-position = auto | [ under || [ left | right ]];\n\n/* CSS Transforms */\n[webkit]backface-visibility = visible | hidden;\n\n/* CSS UI */\nbox-sizing = content-box | padding-box | border-box;\ntext-overflow = [clip | ellipsis | STRING]{1,2};\n\n/* CSS Writing Modes */\n[epub,webkit]text-combine = none | horizontal;\ntext-combine-upright = none | all; /* 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 */\ntouch-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\n/* Compatibility */\n[webkit]text-fill-color = COLOR;\n[webkit]text-stroke-color = COLOR;\n[webkit]text-stroke-width = BORDER_SIDE_WIDTH;\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-size-adjust: none;\nfont-kerning: auto;\nfont-feature-settings: normal;\nfont-variant-ligatures: normal;\nfont-variant-caps: normal;\nfont-variant-numeric: normal;\nfont-variant-east-asian: 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-autospace: normal;\ntext-emphasis-color: currentColor;\ntext-emphasis-style: none;\ntext-spacing-trim: space-first;\ntext-stroke-color: currentColor;\ntext-stroke-width: 0;\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\nall = ALL;\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-position list-style-type list-style-image;\nmargin = INSETS margin-top margin-right margin-bottom margin-left;\npadding = INSETS padding-top padding-right padding-bottom padding-left;\nfont = FONT font-style font-variant_css2 font-weight font-stretch_css3 /* font-size line-height font-family are special-cased */;\nfont-variant = font-variant-ligatures font-variant-caps font-variant-numeric font-variant-east-asian;\n[epub,webkit]text-emphasis = text-emphasis-style text-emphasis-color;\nmarker = INSETS marker-start marker-mid marker-end;\n[webkit]text-stroke = text-stroke-width text-stroke-color;\ntext-decoration = text-decoration-line text-decoration-color text-decoration-style text-decoration-thickness;\ntext-spacing = TEXT_SPACING text-autospace text-spacing-trim;\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;\ninset = INSETS top right bottom left;\n\n/* old names */\nword-wrap = overflow-wrap;\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|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 text-spacing: none;\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 {\n margin: 0px;\n padding-inline-start: 40px;\n}\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}\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/* MathML */\nmath[display=\"block\"] {\n display: block;\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\n/** user-agent-toc.css */\nexport const UserAgentTocCss = `\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,\nsection:has(>:first-child:is(h1,h2,h3,h4,h5,h6):is(.toc,#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,\nsection:has(>:first-child:is(h1,h2,h3,h4,h5,h6):is(.toc,#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,\nsection:has(>:first-child:is(h1,h2,h3,h4,h5,h6):is(.toc,#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,\nsection:has(>:first-child:is(h1,h2,h3,h4,h5,h6):is(.toc,#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,\nsection:has(>:first-child:is(h1,h2,h3,h4,h5,h6):is(.toc,#toc)) :is(ol,ul) {\n -adapt-behavior: toc-container;\n}\n`;\n\n/** vivliostyle-polyfill.css */\nexport const VivliostylePolyfillCss = `\n[data-viv-margin-discard~=\"block-start\"] {\n margin-block-start: 0 !important;\n}\n[data-viv-margin-discard~=\"block-end\"] {\n margin-block-end: 0 !important;\n}\n[data-viv-margin-discard~=\"inline-start\"] {\n margin-inline-start: 0 !important;\n}\n[data-viv-margin-discard~=\"inline-end\"] {\n margin-inline-end: 0 !important;\n}\n\n[data-viv-box-break~=\"inline-start\"]:not([data-viv-box-break~=\"clone\"]) {\n margin-inline-start: 0 !important;\n padding-inline-start: 0 !important;\n border-inline-start-width: 0 !important;\n border-start-start-radius: 0 !important;\n border-end-start-radius: 0 !important;\n}\n[data-viv-box-break~=\"inline-end\"]:not([data-viv-box-break~=\"clone\"]) {\n margin-inline-end: 0 !important;\n padding-inline-end: 0 !important;\n border-inline-end-width: 0 !important;\n border-start-end-radius: 0 !important;\n border-end-end-radius: 0 !important;\n}\n[data-viv-box-break~=\"block-start\"]:not([data-viv-box-break~=\"clone\"]) {\n margin-block-start: 0 !important;\n padding-block-start: 0 !important;\n border-block-start-width: 0 !important;\n border-start-start-radius: 0 !important;\n border-start-end-radius: 0 !important;\n}\n[data-viv-box-break~=\"block-end\"]:not([data-viv-box-break~=\"clone\"]) {\n margin-block-end: 0 !important;\n padding-block-end: 0 !important;\n border-block-end-width: 0 !important;\n border-end-start-radius: 0 !important;\n border-end-end-radius: 0 !important;\n}\n[data-viv-box-break~=\"block-start\"][data-viv-box-break~=\"text-start\"] {\n text-indent: 0 !important;\n}\n[data-viv-box-break~=\"block-end\"][data-viv-box-break~=\"text-end\"][data-viv-box-break~=\"justify\"] {\n text-align-last: justify !important;\n}\n[data-viv-box-break~=\"block-end\"][data-viv-box-break~=\"text-end\"][data-viv-box-break~=\"justify\"] > * {\n text-align-last: auto;\n}\n[data-viv-box-break~=\"block-end\"][data-viv-box-break~=\"text-end\"]:not([data-viv-box-break~=\"justify\"]) {\n text-align-last: auto !important;\n}\n\nspan.viv-anonymous-block {\n display: block;\n}\n\nviv-ts-open.viv-ts-auto > viv-ts-inner,\nviv-ts-open.viv-ts-trim > viv-ts-inner {\n margin-inline-start: -0.5em;\n}\nviv-ts-close.viv-ts-auto > viv-ts-inner,\nviv-ts-close.viv-ts-trim > viv-ts-inner {\n letter-spacing: -0.5em;\n}\nviv-ts-close.viv-hang-end > viv-ts-inner,\nviv-ts-close.viv-hang-last > viv-ts-inner {\n letter-spacing: -1em;\n}\nviv-ts-open.viv-ts-auto::before,\nviv-ts-close.viv-ts-auto::after,\nviv-ts-close.viv-hang-end::after {\n content: \" \";\n font-family: Courier, monospace;\n word-spacing: normal;\n letter-spacing: -0.11em;\n line-height: 0;\n text-orientation: mixed;\n visibility: hidden;\n}\nviv-ts-close.viv-hang-end:not(.viv-hang-hw)::after {\n letter-spacing: 0.4em;\n}\nviv-ts-close.viv-hang-hw > viv-ts-inner {\n letter-spacing: -0.5em;\n}\nviv-ts-open.viv-hang-first > viv-ts-inner {\n display: inline-block;\n line-height: 1;\n inline-size: 1em;\n text-indent: 0;\n text-align: end;\n text-align-last: end;\n margin-inline-start: -1em;\n}\nviv-ts-thin-sp::after {\n content: \" \";\n font-family: Times, serif;\n word-spacing: normal;\n letter-spacing: -0.125em;\n line-height: 0;\n text-orientation: mixed;\n}\n\nspan[data-viv-leader] {\n text-combine-upright: none;\n text-orientation: mixed;\n white-space: pre;\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 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\";\nimport { TokenType } from \"./css-tokenizer\";\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 = 0x1000000;\n\n/**\n * Author stylesheet (\"normal\" stylesheet) base specificity.\n */\nexport const SPECIFICITY_AUTHOR: number = 0x2000000;\n\n/**\n * Style attribute base specificity.\n */\nexport const SPECIFICITY_STYLE: number = 0x3000000;\n\n/**\n * Style attribute base specificity when !important is used.\n */\nexport const SPECIFICITY_STYLE_IMPORTANT: number = 0x4000000;\n\n/**\n * Author stylesheet base specificity when !important is used.\n */\nexport const SPECIFICITY_AUTHOR_IMPORTANT: number = 0x5000000;\n\n/**\n * User stylesheet base specificity when !important is used.\n */\nexport const SPECIFICITY_USER_IMPORTANT: number = 0x6000000;\n\n/**\n * @enum {string}\n */\nexport enum StylesheetFlavor {\n USER_AGENT = \"UA\",\n USER = \"User\",\n AUTHOR = \"Author\",\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: 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 argument\n */\n startFuncWithSelector(funcName: string): void {}\n\n endFuncWithSelector(): void {}\n\n /**\n * For relational pseudo-class `:has()` support\n */\n pushSelectorText(selectorText: string) {}\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 override getCurrentToken(): CssTokenizer.Token {\n if (this.tokenizer) {\n return this.tokenizer.token();\n }\n return null;\n }\n\n override 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, token?.toString() ?? \"\");\n }\n\n override 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 override tagSelector(ns: string | null, name: string | null): void {\n this.slave.tagSelector(ns, name);\n }\n\n override classSelector(name: string): void {\n this.slave.classSelector(name);\n }\n\n override pseudoclassSelector(\n name: string,\n params: (number | string)[],\n ): void {\n this.slave.pseudoclassSelector(name, params);\n }\n\n override pseudoelementSelector(\n name: string,\n params: (number | string)[],\n ): void {\n this.slave.pseudoelementSelector(name, params);\n }\n\n override idSelector(id: string): void {\n this.slave.idSelector(id);\n }\n\n override attributeSelector(\n ns: string,\n name: string,\n op: TokenType,\n value: string | null,\n ): void {\n this.slave.attributeSelector(ns, name, op, value);\n }\n\n override descendantSelector(): void {\n this.slave.descendantSelector();\n }\n\n override childSelector(): void {\n this.slave.childSelector();\n }\n\n override adjacentSiblingSelector(): void {\n this.slave.adjacentSiblingSelector();\n }\n\n override followingSiblingSelector(): void {\n this.slave.followingSiblingSelector();\n }\n\n override nextSelector(): void {\n this.slave.nextSelector();\n }\n\n override startSelectorRule(): void {\n this.slave.startSelectorRule();\n }\n\n override startFontFaceRule(): void {\n this.slave.startFontFaceRule();\n }\n\n override startFootnoteRule(pseudoelem: string | null): void {\n this.slave.startFootnoteRule(pseudoelem);\n }\n\n override startViewportRule(): void {\n this.slave.startViewportRule();\n }\n\n override startDefineRule(): void {\n this.slave.startDefineRule();\n }\n\n override startRegionRule(): void {\n this.slave.startRegionRule();\n }\n\n override startPageRule(): void {\n this.slave.startPageRule();\n }\n\n override startPageMarginBoxRule(name: string): void {\n this.slave.startPageMarginBoxRule(name);\n }\n\n override startWhenRule(expr: Css.Expr): void {\n this.slave.startWhenRule(expr);\n }\n\n override startFlowRule(flowName: string): void {\n this.slave.startFlowRule(flowName);\n }\n\n override startPageTemplateRule(): void {\n this.slave.startPageTemplateRule();\n }\n\n override startPageMasterRule(\n name: string | null,\n pseudoName: string | null,\n classes: string[],\n ): void {\n this.slave.startPageMasterRule(name, pseudoName, classes);\n }\n\n override startPartitionRule(\n name: string | null,\n pseudoName: string | null,\n classes: string[],\n ): void {\n this.slave.startPartitionRule(name, pseudoName, classes);\n }\n\n override startPartitionGroupRule(\n name: string | null,\n pseudoName: string | null,\n classes: string[],\n ): void {\n this.slave.startPartitionGroupRule(name, pseudoName, classes);\n }\n\n override startRuleBody(): void {\n this.slave.startRuleBody();\n }\n\n override property(name: string, value: Css.Val, important: boolean): void {\n this.slave.property(name, value, important);\n }\n\n override endRule(): void {\n this.slave.endRule();\n }\n\n override startFuncWithSelector(funcName: string): void {\n this.slave.startFuncWithSelector(funcName);\n }\n\n override endFuncWithSelector(): void {\n this.slave.endFuncWithSelector();\n }\n\n override pushSelectorText(selectorText: string): void {\n this.slave.pushSelectorText(selectorText);\n }\n}\n\nexport class SkippingParserHandler extends ParserHandler {\n depth: number = 0;\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 override getCurrentToken(): CssTokenizer.Token {\n return this.owner.getCurrentToken();\n }\n\n override error(mnemonics: string, token: CssTokenizer.Token): void {\n this.owner.errorMsg(mnemonics, token);\n }\n\n override startRuleBody(): void {\n this.depth++;\n }\n\n override 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 override startSelectorRule(): void {\n this.reportAndSkip(\"E_CSS_UNEXPECTED_SELECTOR\");\n }\n\n override startFontFaceRule(): void {\n this.reportAndSkip(\"E_CSS_UNEXPECTED_FONT_FACE\");\n }\n\n override startFootnoteRule(pseudoelem: string | null): void {\n this.reportAndSkip(\"E_CSS_UNEXPECTED_FOOTNOTE\");\n }\n\n override startViewportRule(): void {\n this.reportAndSkip(\"E_CSS_UNEXPECTED_VIEWPORT\");\n }\n\n override startDefineRule(): void {\n this.reportAndSkip(\"E_CSS_UNEXPECTED_DEFINE\");\n }\n\n override startRegionRule(): void {\n this.reportAndSkip(\"E_CSS_UNEXPECTED_REGION\");\n }\n\n override startPageRule(): void {\n this.reportAndSkip(\"E_CSS_UNEXPECTED_PAGE\");\n }\n\n override startWhenRule(expr: Css.Expr): void {\n this.reportAndSkip(\"E_CSS_UNEXPECTED_WHEN\");\n }\n\n override startFlowRule(flowName: string): void {\n this.reportAndSkip(\"E_CSS_UNEXPECTED_FLOW\");\n }\n\n override startPageTemplateRule(): void {\n this.reportAndSkip(\"E_CSS_UNEXPECTED_PAGE_TEMPLATE\");\n }\n\n override 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 override startPartitionRule(\n name: string | null,\n pseudoName: string | null,\n classes: string[],\n ): void {\n this.reportAndSkip(\"E_CSS_UNEXPECTED_PARTITION\");\n }\n\n override 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 override startFuncWithSelector(funcName: string): void {\n this.reportAndSkip(\"E_CSS_UNEXPECTED_SELECTOR_FUNC\");\n }\n\n override endFuncWithSelector(): void {\n this.reportAndSkip(\"E_CSS_UNEXPECTED_END_SELECTOR_FUNC\");\n }\n\n override 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 VAL_URANGE,\n SELECTOR_PSEUDOELEM_1,\n DONE = 200,\n}\n\nexport const OP_MEDIA_AND: number = TokenType.LAST + 1;\nexport const OP_MEDIA_OR: number = TokenType.LAST + 2;\nexport const OP_MEDIA_NOT: number = TokenType.LAST + 3;\n\n(() => {\n actionsBase[TokenType.IDENT] = Action.IDENT;\n actionsBase[TokenType.STAR] = Action.SELECTOR_START;\n actionsBase[TokenType.HASH] = Action.SELECTOR_START;\n actionsBase[TokenType.CLASS] = Action.SELECTOR_START;\n actionsBase[TokenType.O_BRK] = Action.SELECTOR_START;\n actionsBase[TokenType.COLON] = Action.SELECTOR_START;\n actionsBase[TokenType.COL_COL] = Action.SELECTOR_START;\n actionsBase[TokenType.AT] = Action.AT;\n actionsBase[TokenType.C_BRC] = Action.RULE_END;\n actionsBase[TokenType.EOF] = Action.DONE;\n actionsStyleAttribute[TokenType.IDENT] = Action.PROP;\n actionsStyleAttribute[TokenType.EOF] = Action.DONE;\n actionsSelectorStart[TokenType.IDENT] = Action.SELECTOR_NAME;\n actionsSelectorStart[TokenType.STAR] = Action.SELECTOR_ANY;\n actionsSelectorStart[TokenType.HASH] = Action.SELECTOR_ID;\n actionsSelectorStart[TokenType.CLASS] = Action.SELECTOR_CLASS;\n actionsSelectorStart[TokenType.O_BRK] = Action.SELECTOR_ATTR;\n actionsSelectorStart[TokenType.COLON] = Action.SELECTOR_PSEUDOCLASS;\n actionsSelectorStart[TokenType.COL_COL] = Action.SELECTOR_PSEUDOELEM;\n\n actionsSelector[TokenType.GT] = Action.SELECTOR_CHILD;\n actionsSelector[TokenType.PLUS] = Action.SELECTOR_SIBLING;\n actionsSelector[TokenType.TILDE] = Action.SELECTOR_FOLLOWING_SIBLING;\n actionsSelector[TokenType.IDENT] = Action.SELECTOR_NAME_1;\n actionsSelector[TokenType.STAR] = Action.SELECTOR_ANY_1;\n actionsSelector[TokenType.HASH] = Action.SELECTOR_ID_1;\n actionsSelector[TokenType.CLASS] = Action.SELECTOR_CLASS_1;\n actionsSelector[TokenType.O_BRK] = Action.SELECTOR_ATTR_1;\n actionsSelector[TokenType.O_BRC] = Action.SELECTOR_BODY;\n actionsSelector[TokenType.COLON] = Action.SELECTOR_PSEUDOCLASS_1;\n actionsSelector[TokenType.COL_COL] = Action.SELECTOR_PSEUDOELEM_1;\n actionsSelector[TokenType.COMMA] = Action.SELECTOR_NEXT;\n actionsSelectorInFunc[TokenType.GT] = Action.SELECTOR_CHILD;\n actionsSelectorInFunc[TokenType.PLUS] = Action.SELECTOR_SIBLING;\n actionsSelectorInFunc[TokenType.TILDE] = Action.SELECTOR_FOLLOWING_SIBLING;\n actionsSelectorInFunc[TokenType.IDENT] = Action.SELECTOR_NAME_1;\n actionsSelectorInFunc[TokenType.STAR] = Action.SELECTOR_ANY_1;\n actionsSelectorInFunc[TokenType.HASH] = Action.SELECTOR_ID_1;\n actionsSelectorInFunc[TokenType.CLASS] = Action.SELECTOR_CLASS_1;\n actionsSelectorInFunc[TokenType.O_BRK] = Action.SELECTOR_ATTR_1;\n actionsSelectorInFunc[TokenType.COLON] = Action.SELECTOR_PSEUDOCLASS_1;\n actionsSelectorCont[TokenType.IDENT] = Action.SELECTOR_NAME;\n actionsSelectorCont[TokenType.STAR] = Action.SELECTOR_ANY;\n actionsSelectorCont[TokenType.HASH] = Action.SELECTOR_ID;\n actionsSelectorCont[TokenType.CLASS] = Action.SELECTOR_CLASS;\n actionsSelectorCont[TokenType.COLON] = Action.SELECTOR_PSEUDOCLASS;\n actionsSelectorCont[TokenType.COL_COL] = Action.SELECTOR_PSEUDOELEM;\n actionsSelectorCont[TokenType.O_BRK] = Action.SELECTOR_ATTR;\n actionsSelectorCont[TokenType.O_BRC] = Action.SELECTOR_BODY;\n actionsPropVal[TokenType.IDENT] = Action.VAL_IDENT;\n actionsPropVal[TokenType.HASH] = Action.VAL_HASH;\n actionsPropVal[TokenType.NUM] = Action.VAL_NUM;\n actionsPropVal[TokenType.INT] = Action.VAL_INT;\n actionsPropVal[TokenType.NUMERIC] = Action.VAL_NUMERIC;\n actionsPropVal[TokenType.STR] = Action.VAL_STR;\n actionsPropVal[TokenType.URL] = Action.VAL_URL;\n actionsPropVal[TokenType.URANGE] = Action.VAL_URANGE;\n actionsPropVal[TokenType.COMMA] = Action.VAL_COMMA;\n actionsPropVal[TokenType.SLASH] = Action.VAL_SLASH;\n actionsPropVal[TokenType.FUNC] = Action.VAL_FUNC;\n actionsPropVal[TokenType.C_PAR] = Action.VAL_C_PAR;\n actionsPropVal[TokenType.SEMICOL] = Action.VAL_END;\n actionsPropVal[TokenType.C_BRC] = Action.VAL_BRC;\n actionsPropVal[TokenType.BANG] = Action.VAL_BANG;\n actionsPropVal[TokenType.PLUS] = Action.VAL_PLUS;\n actionsPropVal[TokenType.EOF] = Action.VAL_FINISH;\n actionsExprVal[TokenType.IDENT] = Action.EXPR_IDENT;\n actionsExprVal[TokenType.NUM] = Action.EXPR_NUM;\n actionsExprVal[TokenType.INT] = Action.EXPR_NUM;\n actionsExprVal[TokenType.NUMERIC] = Action.EXPR_NUMERIC;\n actionsExprVal[TokenType.STR] = Action.EXPR_STR;\n actionsExprVal[TokenType.O_PAR] = Action.EXPR_O_PAR;\n actionsExprVal[TokenType.FUNC] = Action.EXPR_FUNC;\n actionsExprVal[TokenType.BANG] = Action.EXPR_PREFIX;\n actionsExprVal[TokenType.MINUS] = Action.EXPR_PREFIX;\n actionsExprVal[TokenType.DOLLAR] = Action.EXPR_PARAM;\n actionsExprOp[TokenType.IDENT] = Action.EXPR_INFIX_NAME;\n actionsExprOp[TokenType.COMMA] = Action.EXPR_INFIX;\n actionsExprOp[TokenType.GT] = Action.EXPR_INFIX;\n actionsExprOp[TokenType.LT] = Action.EXPR_INFIX;\n actionsExprOp[TokenType.GT_EQ] = Action.EXPR_INFIX;\n actionsExprOp[TokenType.LT_EQ] = Action.EXPR_INFIX;\n actionsExprOp[TokenType.EQ] = Action.EXPR_INFIX;\n actionsExprOp[TokenType.EQ_EQ] = Action.EXPR_INFIX;\n actionsExprOp[TokenType.BANG_EQ] = Action.EXPR_INFIX;\n actionsExprOp[TokenType.AMP_AMP] = Action.EXPR_INFIX;\n actionsExprOp[TokenType.BAR_BAR] = Action.EXPR_INFIX;\n actionsExprOp[TokenType.PLUS] = Action.EXPR_INFIX;\n actionsExprOp[TokenType.MINUS] = Action.EXPR_INFIX;\n actionsExprOp[TokenType.SLASH] = Action.EXPR_INFIX;\n actionsExprOp[TokenType.PERCENT] = Action.EXPR_INFIX;\n actionsExprOp[TokenType.STAR] = Action.EXPR_INFIX;\n actionsExprOp[TokenType.COLON] = Action.EXPR_INFIX;\n actionsExprOp[TokenType.QMARK] = Action.EXPR_INFIX;\n actionsExprOp[TokenType.C_PAR] = Action.EXPR_C_PAR;\n actionsExprOp[TokenType.O_BRC] = Action.EXPR_O_BRC;\n actionsExprOp[TokenType.SEMICOL] = Action.EXPR_SEMICOL;\n actionsError[TokenType.EOF] = Action.DONE;\n actionsError[TokenType.O_BRC] = Action.ERROR_PUSH;\n actionsError[TokenType.C_BRC] = Action.ERROR_POP;\n actionsError[TokenType.O_BRK] = Action.ERROR_PUSH;\n actionsError[TokenType.C_BRK] = Action.ERROR_POP;\n actionsError[TokenType.O_PAR] = Action.ERROR_PUSH;\n actionsError[TokenType.C_PAR] = Action.ERROR_POP;\n actionsError[TokenType.SEMICOL] = Action.ERROR_SEMICOL;\n actionsErrorDecl[TokenType.EOF] = Action.DONE;\n actionsErrorDecl[TokenType.O_BRC] = Action.ERROR_PUSH;\n actionsErrorDecl[TokenType.C_BRC] = Action.ERROR_POP_DECL;\n actionsErrorDecl[TokenType.O_BRK] = Action.ERROR_PUSH;\n actionsErrorDecl[TokenType.C_BRK] = Action.ERROR_POP;\n actionsErrorDecl[TokenType.O_PAR] = Action.ERROR_PUSH;\n actionsErrorDecl[TokenType.C_PAR] = Action.ERROR_POP;\n actionsErrorDecl[TokenType.SEMICOL] = Action.ERROR_SEMICOL;\n actionsErrorSelector[TokenType.EOF] = Action.DONE;\n actionsErrorSelector[TokenType.O_BRC] = Action.ERROR_PUSH;\n actionsErrorSelector[TokenType.C_BRC] = Action.ERROR_POP;\n actionsErrorSelector[TokenType.O_BRK] = Action.ERROR_PUSH;\n actionsErrorSelector[TokenType.C_BRK] = Action.ERROR_POP;\n actionsErrorSelector[TokenType.O_PAR] = Action.ERROR_PUSH;\n actionsErrorSelector[TokenType.C_PAR] = Action.ERROR_POP;\n priority[TokenType.C_PAR] = 0;\n priority[TokenType.COMMA] = 0;\n priority[TokenType.QMARK] = 1;\n priority[TokenType.COLON] = 1;\n priority[TokenType.AMP_AMP] = 2;\n priority[TokenType.BAR_BAR] = 2;\n priority[TokenType.LT] = 3;\n priority[TokenType.GT] = 3;\n priority[TokenType.LT_EQ] = 3;\n priority[TokenType.GT_EQ] = 3;\n priority[TokenType.EQ] = 3;\n priority[TokenType.EQ_EQ] = 3;\n priority[TokenType.BANG_EQ] = 3;\n priority[TokenType.PLUS] = 4;\n priority[TokenType.MINUS] = 4;\n priority[TokenType.STAR] = 5;\n priority[TokenType.SLASH] = 5;\n priority[TokenType.PERCENT] = 5;\n priority[TokenType.EOF] = 6;\n priority[OP_MEDIA_AND] = 2;\n priority[OP_MEDIA_OR] = 2;\n})();\n\n/**\n * @enum {number}\n */\nexport enum ExprContext {\n PROP,\n WHEN,\n MEDIA,\n IMPORT,\n SUPPORTS,\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 inStyleDeclaration: 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 if (index === valStack.length) {\n // keep last comma in `var(--b , )`\n arr.push(Css.empty);\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 parLevel = 0;\n let v;\n do {\n v = valStack[--index];\n if (sep === \")\" && v instanceof Css.AnyToken) {\n // For nested parens in calc() (Issue #1014)\n if (v.text === \")\") {\n parLevel++;\n } else if (v.text === \"(\") {\n if (parLevel === 0) {\n return null;\n }\n parLevel--;\n }\n }\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 if (token.type !== TokenType.EOF) {\n this.handler.error(\"E_CSS_MISMATCHED_C_PAR\", token);\n this.actions = actionsErrorDecl;\n }\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\n // Check invalid var()\n if (func.name === \"var\") {\n const name = func.values[0] instanceof Css.Ident && func.values[0].name;\n if (!Css.isCustomPropName(name) || name === this.propName) {\n this.handler.error(`E_CSS_INVALID_VAR ${func.toString()}`, token);\n this.actions = actionsErrorDecl;\n }\n }\n return func;\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 const val = valStack[0];\n if (val instanceof Css.Val) {\n return val;\n } else if (!val) {\n return Css.empty;\n } else {\n // custom property value can be arbitrary token e.g. \",\"\n return new Css.AnyToken(val.toString());\n }\n }\n\n exprError(mnemonics: string, token: CssTokenizer.Token) {\n this.actions = this.propName ? actionsErrorDecl : actionsError;\n // this.handler.error(mnemonics, token);\n // (should not throw error by expression syntax errors)\n Logging.logger.warn(mnemonics, token.toString());\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 == TokenType.C_PAR) {\n const args: Exprs.Val[] = [val];\n while (tok == 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.Comma(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 = TokenType.EOF;\n continue;\n }\n }\n if (tok == 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 = 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 == -TokenType.BANG) {\n val = new Exprs.Not(handler.getScope(), val);\n } else if (tok == -TokenType.MINUS) {\n val = new Exprs.Negate(handler.getScope(), val);\n } else if (tok == -OP_MEDIA_NOT) {\n // `not` operator in `@media` or `@supports`\n val = new Exprs.NotMedia(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 TokenType.AMP_AMP:\n val = new Exprs.And(handler.getScope(), val2, val);\n break;\n case OP_MEDIA_AND:\n // `and` operator in `@media` or `@supports`\n val = new Exprs.AndMedia(handler.getScope(), val2, val);\n break;\n case OP_MEDIA_OR:\n // `or` operator in `@media` or `@supports`\n val = new Exprs.OrMedia(handler.getScope(), val2, val);\n break;\n case TokenType.BAR_BAR:\n val = new Exprs.Or(handler.getScope(), val2, val);\n break;\n case TokenType.LT:\n val = new Exprs.Lt(handler.getScope(), val2, val);\n break;\n case TokenType.GT:\n val = new Exprs.Gt(handler.getScope(), val2, val);\n break;\n case TokenType.LT_EQ:\n val = new Exprs.Le(handler.getScope(), val2, val);\n break;\n case TokenType.GT_EQ:\n val = new Exprs.Ge(handler.getScope(), val2, val);\n break;\n case TokenType.EQ:\n case TokenType.EQ_EQ:\n val = new Exprs.Eq(handler.getScope(), val2, val);\n break;\n case TokenType.BANG_EQ:\n val = new Exprs.Ne(handler.getScope(), val2, val);\n break;\n case TokenType.PLUS:\n val = new Exprs.Add(handler.getScope(), val2, val);\n break;\n case TokenType.MINUS:\n val = new Exprs.Subtract(handler.getScope(), val2, val);\n break;\n case TokenType.STAR:\n val = new Exprs.Multiply(handler.getScope(), val2, val);\n break;\n case TokenType.SLASH:\n val = new Exprs.Divide(handler.getScope(), val2, val);\n break;\n case TokenType.PERCENT:\n val = new Exprs.Modulo(handler.getScope(), val2, val);\n break;\n case TokenType.COLON:\n if (valStack.length > 1) {\n switch (valStack[valStack.length - 1]) {\n case 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 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 TokenType.QMARK:\n if (op != TokenType.COLON) {\n this.exprError(\"E_CSS_EXPR_COND\", token);\n return false;\n }\n\n // fall through\n case 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 readSupportsTest(token: CssTokenizer.Token): Exprs.SupportsTest {\n // `@supports (prop-name:...)`\n // `@supports func-name(...)`\n const isFunc = token.type === TokenType.FUNC;\n const tokenizer = this.tokenizer;\n let startPosition: number;\n let name: string;\n if (isFunc) {\n name = token.text;\n startPosition = token.position + name.length + 1;\n } else if (token.type === TokenType.O_PAR) {\n const token1 = tokenizer.nthToken(1);\n const token2 = tokenizer.nthToken(2);\n if (token1.type === TokenType.IDENT && token2.type === TokenType.COLON) {\n tokenizer.consume();\n tokenizer.consume();\n name = token1.text;\n startPosition = token2.position + 1;\n } else if (\n token1.type === TokenType.O_PAR ||\n token1.type === TokenType.FUNC ||\n (token1.type === TokenType.IDENT &&\n token1.text.toLowerCase() === \"not\" &&\n (token2.type === TokenType.O_PAR || token2.type === TokenType.FUNC))\n ) {\n return null;\n } else {\n // Unknown `(...)` syntax, read until `)` and evaluate to false\n startPosition = token.position + 1;\n }\n } else {\n return null;\n }\n let parLevel = 0;\n let tokenN: CssTokenizer.Token;\n let commaCount = 0;\n while (parLevel >= 0) {\n tokenizer.consume();\n tokenN = tokenizer.token();\n switch (tokenN.type) {\n case TokenType.C_PAR:\n parLevel--;\n break;\n case TokenType.O_PAR:\n case TokenType.FUNC:\n parLevel++;\n break;\n case TokenType.COMMA:\n if (parLevel === 0) {\n commaCount++;\n }\n break;\n case TokenType.EOF:\n this.exprError(\"E_CSS_UNEXPECTED_EOF\", tokenN);\n return null;\n }\n }\n tokenizer.consume();\n const endPosition = tokenN.position;\n const value =\n isFunc && name === \"selector\" && commaCount > 0\n ? \"\" // selector() with multiple selectors doesn't work\n : tokenizer.input.substring(startPosition, endPosition).trim();\n const supportsTest = new Exprs.SupportsTest(\n this.handler.getScope(),\n name,\n value,\n isFunc,\n );\n return supportsTest;\n }\n\n readPseudoParams(): (number | string)[] {\n const arr = [];\n while (true) {\n const token = this.tokenizer.token();\n switch (token.type) {\n case TokenType.IDENT:\n arr.push(token.text);\n break;\n case TokenType.PLUS:\n arr.push(\"+\");\n break;\n case TokenType.NUM:\n case 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 === TokenType.PLUS) {\n // '+'\n hasLeadingPlus = true;\n this.tokenizer.consume();\n token = this.tokenizer.token();\n } else if (\n token.type === 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 TokenType.NUMERIC:\n if (hasLeadingPlus && token.num < 0) {\n // reject '+-an'\n return null;\n }\n\n // FALLTHROUGH\n case 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 === 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 === TokenType.MINUS;\n const hasSign = token.type === 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 === 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 === TokenType.NUMERIC) {\n a = token.num;\n }\n this.tokenizer.consume();\n token = this.tokenizer.token();\n if (token.type === 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 === 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 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: boolean,\n parsingStyleAttr: boolean,\n parsingMediaQuery: boolean,\n parsingFunctionParam: boolean,\n parsingRelationalSelector?: boolean,\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 let selectorStartPosition: number | null = null;\n\n if (parsingStyleAttr) {\n this.inStyleDeclaration = true;\n }\n if (parsingMediaQuery) {\n this.exprContext = ExprContext.MEDIA;\n this.valStack.push(\"{\");\n }\n\n for (; count > 0; --count) {\n token = tokenizer.token();\n\n // For relational pseudo-class `:has()` support\n if (parsingFunctionParam && selectorStartPosition === null) {\n // token.position may be token's start position + 1\n selectorStartPosition = token.position - 1;\n if (tokenizer.input[selectorStartPosition] === \"(\") {\n selectorStartPosition++;\n }\n }\n\n // Do not stop parsing on invalid property syntax as long as brackets are balanced.\n if (\n this.actions === actionsPropVal &&\n this.errorBrackets.length > 0 &&\n (token.type === this.errorBrackets[this.errorBrackets.length - 1] ||\n token.type === TokenType.SEMICOL ||\n token.type === TokenType.BANG)\n ) {\n if (token.type === this.errorBrackets[this.errorBrackets.length - 1]) {\n this.errorBrackets.pop();\n if (token.type === TokenType.C_PAR) {\n // For nested func in parens (Issue #1014)\n if (this.valStackReduce(\")\", token)) {\n tokenizer.consume();\n continue;\n }\n }\n }\n valStack.push(new Css.AnyToken(token.toString()));\n tokenizer.consume();\n continue;\n }\n\n switch (this.actions[token.type]) {\n case Action.IDENT:\n // figure out if this is a property assignment or selector\n if (\n !this.inStyleDeclaration ||\n tokenizer.nthToken(1).type != TokenType.COLON\n ) {\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 // property assignment\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 != 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 == 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 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 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 == TokenType.BAR) {\n tokenizer.consume();\n tokenizer.consume();\n token = tokenizer.token();\n switch (token.type) {\n case 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 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 if (!token.text) {\n handler.error(\"E_CSS_SYNTAX\", token);\n tokenizer.consume();\n continue;\n }\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 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 TokenType.FUNC:\n text = token.text;\n tokenizer.consume();\n switch (text) {\n case \"is\":\n case \"not\":\n case \"where\":\n case \"has\":\n this.actions = actionsSelectorStart;\n handler.startFuncWithSelector(text);\n if (\n this.runParser(\n Number.POSITIVE_INFINITY,\n false,\n false,\n false,\n true,\n text === \"has\",\n )\n ) {\n this.actions = actionsSelector;\n } else {\n this.actions = actionsErrorSelector;\n }\n continue;\n case \"lang\":\n case \"href-epub-type\":\n token = tokenizer.token();\n if (token.type === 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 == 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_1:\n if (token.precededBySpace) {\n handler.descendantSelector();\n }\n\n // fall through\n case Action.SELECTOR_PSEUDOELEM:\n tokenizer.consume();\n token = tokenizer.token();\n switch (token.type) {\n case 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 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 == 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 == TokenType.IDENT) {\n text = token.text;\n tokenizer.consume();\n } else if (token.type == TokenType.STAR) {\n text = null;\n tokenizer.consume();\n } else if (token.type == 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 == 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 != 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 TokenType.EQ:\n case TokenType.TILDE_EQ:\n case TokenType.BAR_EQ:\n case TokenType.HAT_EQ:\n case TokenType.DOLLAR_EQ:\n case TokenType.STAR_EQ:\n case TokenType.COL_COL:\n num = token.type;\n tokenizer.consume();\n token = tokenizer.token();\n break;\n case TokenType.C_BRK:\n handler.attributeSelector(\n ns as string,\n text as string,\n 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 TokenType.IDENT:\n case 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 != 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 this.inStyleDeclaration = true;\n } else {\n this.ruleStack.push(\"[selector]\");\n this.inStyleDeclaration = true;\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 valStack.push(new Css.HexColor(token.text));\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 valStack.push(new Css.Numeric(token.num, token.text));\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_URANGE:\n valStack.push(new Css.URange(token.text));\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 == \"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 if (this.errorBrackets.length > 0) {\n // For nested func in parens (Issue #1014)\n this.errorBrackets.push(TokenType.C_PAR);\n }\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 == TokenType.IDENT &&\n token.text.toLowerCase() == \"important\" &&\n (token1.type == TokenType.SEMICOL ||\n token1.type == TokenType.EOF ||\n token1.type == 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 TokenType.NUM:\n case TokenType.NUMERIC:\n case TokenType.INT:\n if (!token1.precededBySpace) {\n // Plus before number, ignore\n tokenizer.consume();\n continue;\n }\n }\n // this.exprError(\"E_CSS_UNEXPECTED_PLUS\", token);\n valStack.push(new Css.AnyToken(\"+\"));\n tokenizer.consume();\n continue;\n case Action.VAL_END:\n tokenizer.consume();\n\n // fall through\n case Action.VAL_BRC:\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\n // for implicit closing parens, e.g. style=\"color: var(--a, var(--b\"\n while (valStack.length > 0) {\n const len = valStack.length;\n val = this.valStackReduce(\";\", token);\n if (!val || valStack.length === len) {\n break;\n }\n }\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 return true;\n case Action.EXPR_IDENT:\n token1 = tokenizer.nthToken(1);\n if (token1.type == TokenType.CLASS) {\n if (\n tokenizer.nthToken(2).type == 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 if (\n this.exprContext === ExprContext.SUPPORTS &&\n token.text.toLowerCase() === \"not\" &&\n valStack[valStack.length - 1] !== OP_MEDIA_AND &&\n valStack[valStack.length - 1] !== OP_MEDIA_OR &&\n (token1.type === TokenType.O_PAR ||\n token1.type === TokenType.FUNC)\n ) {\n // for `@supports not (...)`\n valStack.push(-OP_MEDIA_NOT);\n tokenizer.consume();\n continue;\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 if (this.exprContext === ExprContext.SUPPORTS) {\n // `@supports selector(...)`\n valStack.push(this.readSupportsTest(token));\n this.actions = actionsExprOp;\n continue;\n }\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 (token.type != TokenType.INT || token.precededBySpace) {\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 // `and` or `or` operator in `@media` or `@supports`\n if (\n token.text.toLowerCase() === \"and\" &&\n valStack[valStack.length - 2] !== OP_MEDIA_OR &&\n valStack[valStack.length - 2] !== -OP_MEDIA_NOT\n ) {\n this.actions = actionsExprVal;\n this.exprStackReduce(OP_MEDIA_AND, token);\n valStack.push(OP_MEDIA_AND);\n tokenizer.consume();\n } else if (\n token.text.toLowerCase() === \"or\" &&\n valStack[valStack.length - 2] !== OP_MEDIA_AND &&\n valStack[valStack.length - 2] !== -OP_MEDIA_NOT\n ) {\n this.actions = actionsExprVal;\n this.exprStackReduce(OP_MEDIA_OR, token);\n valStack.push(OP_MEDIA_OR);\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 this.actions = actionsPropVal;\n }\n tokenizer.consume();\n continue;\n case Action.EXPR_O_BRC:\n if (this.exprStackReduce(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(TokenType.C_PAR, token)) {\n if (this.propName || this.exprContext != ExprContext.IMPORT) {\n this.exprError(\"E_CSS_UNEXPECTED_SEMICOL\", token);\n // `@media ...;` and `@supports ...;` should be ok\n this.actions = actionsBase;\n tokenizer.consume();\n return false;\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 if (this.exprContext === ExprContext.SUPPORTS) {\n // `@supports (...)`\n const supportsTest = this.readSupportsTest(token);\n if (supportsTest) {\n valStack.push(supportsTest);\n this.actions = actionsExprOp;\n continue;\n }\n }\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 this.inStyleDeclaration = false;\n if (this.ruleStack.length) {\n this.ruleStack.pop();\n switch (this.ruleStack[this.ruleStack.length - 1]) {\n case \"page\":\n case \"-epubx-page-master\":\n case \"-epubx-partition-group\":\n this.inStyleDeclaration = true;\n }\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 (token.type == TokenType.STR || token.type == TokenType.URL) {\n this.importURL = token.text;\n tokenizer.consume();\n token = tokenizer.token();\n if (\n token.type == TokenType.SEMICOL ||\n token.type == 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 TokenType.IDENT:\n text = token.text; // Prefix\n tokenizer.consume();\n token = tokenizer.token();\n if (\n (token.type == TokenType.STR ||\n token.type == TokenType.URL) &&\n tokenizer.nthToken(1).type == TokenType.SEMICOL\n ) {\n this.namespacePrefixToURI[text] = token.text;\n tokenizer.consume();\n tokenizer.consume();\n continue;\n }\n break;\n case TokenType.STR:\n case TokenType.URL:\n if (tokenizer.nthToken(1).type == TokenType.SEMICOL) {\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 == TokenType.STR &&\n tokenizer.nthToken(1).type == 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 == TokenType.O_BRC) {\n tokenizer.consume();\n tokenizer.consume();\n switch (text) {\n case \"font-face\":\n handler.startFontFaceRule();\n this.inStyleDeclaration = true;\n break;\n case \"-epubx-page-template\":\n handler.startPageTemplateRule();\n break;\n case \"-epubx-define\":\n handler.startDefineRule();\n this.inStyleDeclaration = true;\n break;\n case \"-epubx-viewport\":\n handler.startViewportRule();\n this.inStyleDeclaration = true;\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 TokenType.O_BRC:\n tokenizer.consume();\n handler.startFootnoteRule(null);\n this.ruleStack.push(text);\n handler.startRuleBody();\n this.inStyleDeclaration = true;\n continue;\n case TokenType.COL_COL:\n tokenizer.consume();\n token = tokenizer.token();\n if (\n token.type == TokenType.IDENT &&\n tokenizer.nthToken(1).type == 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 this.inStyleDeclaration = true;\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 == TokenType.O_BRC) {\n tokenizer.consume();\n handler.startPageMarginBoxRule(text);\n this.ruleStack.push(text);\n handler.startRuleBody();\n this.inStyleDeclaration = true;\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 \"supports\":\n tokenizer.consume();\n this.propName = null; // signals @ rule\n this.exprContext = ExprContext.SUPPORTS;\n this.actions = actionsExprVal;\n valStack.push(\"{\");\n continue;\n case \"-epubx-flow\":\n if (\n tokenizer.nthToken(1).type == TokenType.IDENT &&\n tokenizer.nthToken(2).type == 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 this.inStyleDeclaration = true;\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 == TokenType.IDENT) {\n ruleName = token.text;\n tokenizer.consume();\n token = tokenizer.token();\n }\n if (\n token.type == TokenType.COLON &&\n tokenizer.nthToken(1).type == 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 == TokenType.FUNC &&\n token.text.toLowerCase() == \"class\" &&\n tokenizer.nthToken(1).type == TokenType.IDENT &&\n tokenizer.nthToken(2).type == 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 == 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 this.inStyleDeclaration = true;\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 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 (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 if (\n parsingFunctionParam &&\n this.errorBrackets.length == 0 &&\n token.type == TokenType.C_PAR\n ) {\n tokenizer.consume();\n handler.endFuncWithSelector();\n return true;\n }\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 (this.errorBrackets.length == 0 && token.type == TokenType.C_BRC) {\n this.actions = actionsBase;\n }\n tokenizer.consume();\n continue;\n case Action.ERROR_SEMICOL:\n if (this.errorBrackets.length == 0) {\n this.actions = actionsBase;\n }\n tokenizer.consume();\n continue;\n case Action.DONE:\n return true;\n default:\n if (parsingMediaQuery) {\n if (this.exprStackReduce(TokenType.C_PAR, token)) {\n this.result = valStack.pop() as Css.Val;\n return true;\n }\n return false;\n }\n if (parsingFunctionParam) {\n switch (token.type) {\n case TokenType.COMMA:\n case TokenType.C_PAR:\n if (this.actions === actionsSelectorStart) {\n handler.error(\"E_CSS_SYNTAX\", token);\n } else {\n const selectorText = tokenizer.input.substring(\n selectorStartPosition,\n token.position,\n );\n handler.pushSelectorText(selectorText);\n selectorStartPosition = token.position + 1;\n }\n if (token.type === TokenType.COMMA) {\n handler.nextSelector();\n this.actions = actionsSelectorStart;\n tokenizer.consume();\n continue;\n } else {\n handler.endFuncWithSelector();\n tokenizer.consume();\n return true;\n }\n case TokenType.GT:\n case TokenType.PLUS:\n case TokenType.TILDE:\n if (parsingRelationalSelector) {\n // :has() takes relational selectors e.g. `:has(> F)`\n this.actions = actionsSelector;\n continue;\n }\n break;\n case TokenType.O_BRC:\n case TokenType.O_BRK:\n case TokenType.O_PAR:\n this.errorBrackets.push(token.type + 1);\n break;\n }\n handler.error(\"E_CSS_SYNTAX\", token);\n tokenizer.consume();\n this.actions = actionsErrorSelector;\n continue;\n }\n if (\n this.actions !== actionsError &&\n this.actions !== actionsErrorSelector &&\n this.actions !== actionsErrorDecl\n ) {\n if (token.type == TokenType.INVALID) {\n handler.error(\"E_CSS_SYNTAX\", token);\n } else if (this.actions === actionsPropVal) {\n // Do not stop parsing on invalid property syntax as long as brackets are balanced.\n switch (token.type) {\n case TokenType.O_PAR:\n case TokenType.O_BRC:\n case TokenType.O_BRK:\n this.errorBrackets.push(token.type + 1);\n break;\n }\n valStack.push(new Css.AnyToken(token.toString()));\n tokenizer.consume();\n continue;\n } else if (\n token.type === TokenType.O_BRC &&\n this.actions == actionsExprVal &&\n valStack.length > 0\n ) {\n // `@media {...}` and `@supports {...}` should be ok\n handler.startMediaRule(valStack.pop() as Css.Expr);\n this.ruleStack.push(\"media\");\n handler.startRuleBody();\n this.actions = actionsBase;\n tokenizer.consume();\n continue;\n } else if (\n token.type === TokenType.SEMICOL &&\n this.actions == actionsExprVal\n ) {\n // `@media;` and `@supports;` should be ok\n this.actions = actionsBase;\n tokenizer.consume();\n return false;\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 override error(mnemonics: string, token: CssTokenizer.Token): void {\n // throw new Error(mnemonics + \" \" + token);\n Logging.logger.warn(mnemonics, token.toString());\n }\n\n override 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 * 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 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 * Check if style=\"box-decoration-break: clone\" is set\n */\nexport function isCloneBoxDecorationBreak(element: Element): boolean {\n return (\n (element as HTMLElement)?.style?.[\"box-decoration-break\"] === \"clone\" ||\n (element as HTMLElement)?.style?.[\"-webkit-box-decoration-break\"] ===\n \"clone\"\n );\n}\n\n/**\n * data-viv-box-break attribute\n *\n * Value: [ [inline-start || inline-end] |\n * [block-start text-start? || block-end text-end?] justify? ]\n * clone?\n *\n * inline-start, inline-end, block-start, block-end: the side at which a box break occurs\n * text-start: the fragment starts with text or inline box\n * text-end: the fragment ends with text or inline box\n * justify: the computed value of `text-align` property is `justify`\n * clone: the computed value of `box-decoration-break` property is `clone`\n */\ntype BoxBreakFlag =\n | \"inline-start\"\n | \"inline-end\"\n | \"block-start\"\n | \"block-end\"\n | \"text-start\"\n | \"text-end\"\n | \"justify\"\n | \"clone\";\n\nexport function getBoxBreakFlags(element: Element): BoxBreakFlag[] {\n const val = element.getAttribute(\"data-viv-box-break\");\n return (val ? val.split(\" \") : []) as BoxBreakFlag[];\n}\n\nexport function setBoxBreakFlags(\n element: Element,\n boxBreakFlags: BoxBreakFlag[],\n): void {\n element.setAttribute(\"data-viv-box-break\", boxBreakFlags.join(\" \"));\n}\n\nexport function setBoxBreakFlag(\n element: Element,\n boxBreakFlag: BoxBreakFlag,\n): void {\n const boxBreakFlags = getBoxBreakFlags(element);\n if (!boxBreakFlags.includes(boxBreakFlag)) {\n boxBreakFlags.push(boxBreakFlag);\n setBoxBreakFlags(element, boxBreakFlags);\n }\n}\n\n/**\n * data-viv-margin-discard attribute\n *\n * Value: block-start || block-end || inline-start || inline-end\n *\n * block-start: the block-start margin is discarded\n * block-end: the block-end margin is discarded\n * inline-start: the inline-start margin is discarded\n * inline-end: the inline-end margin is discarded\n */\ntype MarginDiscardFlag =\n | \"block-start\"\n | \"block-end\"\n | \"inline-start\"\n | \"inline-end\";\n\nexport function getMarginDiscardFlags(element: Element): MarginDiscardFlag[] {\n const val = element.getAttribute(\"data-viv-margin-discard\");\n return (val ? val.split(\" \") : []) as MarginDiscardFlag[];\n}\n\nexport function setMarginDiscardFlags(\n element: Element,\n marginDiscardFlags: MarginDiscardFlag[],\n): void {\n element.setAttribute(\"data-viv-margin-discard\", marginDiscardFlags.join(\" \"));\n}\n\nexport function setMarginDiscardFlag(\n element: Element,\n marginDiscardFlag: MarginDiscardFlag,\n): void {\n const MarginDiscardFlags = getMarginDiscardFlags(element);\n if (!MarginDiscardFlags.includes(marginDiscardFlag)) {\n MarginDiscardFlags.push(marginDiscardFlag);\n setMarginDiscardFlags(element, MarginDiscardFlags);\n }\n}\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 breakValueToStartBreakType(breakValue: string | null): string {\n return isForcedBreakValue(breakValue) ? breakValue : \"auto\";\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 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 type ElementStyle = { [key: string]: any };\n}\n\nexport namespace CssStyler {\n export interface AbstractStyler {\n getStyle(element: Element, deep: boolean): CssCascade.ElementStyle;\n processContent(\n element: Element,\n styles: { [key: string]: Css.Val },\n viewNode: Node,\n );\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 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(checkPoints: Vtree.NodeContext[]): {\n edge: number;\n checkPoint: Vtree.NodeContext | null;\n };\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 rtl: boolean;\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: CssStyler.AbstractStyler;\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 pageType: string | 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 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\nexport function restoreOriginalText(changes: Change[]): string {\n return changes.reduce((result, item) => {\n if (item[0] === fastdiff.INSERT) {\n return result;\n }\n return result + item[1];\n }, \"\");\n}\n\nexport function restoreNewText(changes: Change[]): string {\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 Break from \"./break\";\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 {\n CssStyler,\n PageFloats,\n PseudoElement,\n Selectors,\n Vtree,\n XmlDoc,\n} 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 isBlankPage: 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 pageType: string | null = null;\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\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 case \"break-spaces\":\n return Whitespace.PRESERVE;\n default:\n return null;\n }\n}\n\nexport function canIgnore(node: Node, whitespace?: Whitespace): boolean {\n if (!node) {\n return true;\n }\n if (node.nodeType == 1) {\n return false;\n }\n const text = node.textContent;\n switch (whitespace) {\n case Whitespace.PRESERVE:\n return text.length == 0;\n case Whitespace.NEWLINE:\n return !!text.match(/^[ \\t]*$/);\n case Whitespace.IGNORE:\n default:\n return !!text.match(/^[ \\t\\r\\n\\f]*$/);\n }\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 // Fix for issue #869\n (!!nps1.shadowContext &&\n !!nps2.shadowContext &&\n nps1.shadowType === Vtree.ShadowType.ROOTLESS &&\n nps2.shadowType === Vtree.ShadowType.ROOTLESS &&\n (nps1.node as Element)?.outerHTML ===\n (nps2.node as Element)?.outerHTML)) &&\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: CssStyler.AbstractStyler,\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: Vtree.ShadowContext,\n sc2: Vtree.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: Vtree.ShadowContext;\n nodeShadow: Vtree.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 pageType: string | 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 this.pageType = parent ? parent.pageType : 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\n // Fix for issue #703\n if (\n nc.shadowType === Vtree.ShadowType.ROOTLESS &&\n (nc.floatReference !== PageFloats.FloatReference.INLINE ||\n nc.floatSide === \"footnote\") &&\n (nc.shadowContext?.styler as PseudoElement.PseudoelementStyler)?.style?.[\n \"_pseudos\"\n ]\n ) {\n nc = nc.parent;\n }\n\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 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 startBreakType: string | null = null;\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.startBreakType = this.startBreakType;\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 isBlankPage: boolean = false;\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.isBlankPage = this.isBlankPage;\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 // Removed:\n // || this.highestSeenOffset !== other.highestSeenOffset\n // to prevent unnecessary re-layout (Issue #681-case2)\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 startBreakType = this.flowPositions[name]?.startBreakType;\n return startBreakType && Break.isSpreadBreakValue(startBreakType)\n ? startBreakType\n : \"any\";\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 rtl: boolean = false;\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\n ? this.rtl\n ? box.bottom\n : box.top\n : this.rtl\n ? box.right\n : box.left;\n }\n\n getEndEdge(box: ClientRect): number {\n return this.vertical\n ? this.rtl\n ? box.top\n : box.bottom\n : this.rtl\n ? box.left\n : 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 this.rtl ? -1 : 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 this.rtl = other.rtl;\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 const outerExtent =\n extent +\n this.marginLeft +\n this.marginRight +\n this.paddingLeft +\n this.paddingRight +\n this.borderLeft +\n this.borderRight;\n this.setHorizontalPosition(\n start + outerExtent * this.getBoxDir(),\n extent,\n );\n } else {\n this.setVerticalPosition(start, extent);\n }\n }\n\n setInlinePosition(start: number, extent: number): void {\n if (this.vertical) {\n if (this.rtl) {\n const outerExtent =\n extent +\n this.marginTop +\n this.marginBottom +\n this.paddingTop +\n this.paddingBottom +\n this.borderTop +\n this.borderBottom;\n this.setVerticalPosition(\n start + outerExtent * this.getInlineDir(),\n extent,\n );\n } else {\n this.setVerticalPosition(start, extent);\n }\n } else if (this.rtl) {\n const outerExtent =\n extent +\n this.marginLeft +\n this.marginRight +\n this.paddingLeft +\n this.paddingRight +\n this.borderLeft +\n this.borderRight;\n this.setHorizontalPosition(\n start + outerExtent * this.getInlineDir(),\n extent,\n );\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 if (this.elem.lastChild?.nodeType === 3) {\n this.elem.lastChild.textContent += str;\n return;\n }\n node = this.elem.ownerDocument.createTextNode(str);\n }\n this.elem.appendChild(node);\n }\n\n override visitStr(str: Css.Str): Css.Val {\n this.visitStrInner(str.str);\n return null;\n }\n\n override 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 visitSpaceList(list: Css.SpaceList): Css.Val {\n this.visitValues(list.values);\n return null;\n }\n\n override 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 if (\n !node &&\n val &&\n ex instanceof Exprs.Native &&\n ex.str.startsWith(\"running-element-\")\n ) {\n // Prevent wrong running element output when the element is not found (Issue #1196)\n val = \"\";\n }\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.empty &&\n val !== Css.ident.normal &&\n val !== Css.ident.none &&\n !Css.isDefaultingValue(val)\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 { CssStyler, Layout } from \"./types\";\nimport { TokenType } from \"./css-tokenizer\";\n\nexport type ElementStyle = {\n [key: string]:\n | CascadeValue\n | CascadeValue[]\n | ElementStyleMap\n | { matcher: Matchers.Matcher; styles: ElementStyle }[];\n};\n\nexport const inheritedProps = {\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 \"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-ligatures\": true,\n \"font-variant-caps\": true,\n \"font-variant-numeric\": true,\n \"font-variant-east-asian\": true,\n \"font-weight\": true,\n \"glyph-orientation-vertical\": true,\n \"hanging-punctuation\": 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 quotes: true,\n \"ruby-align\": true,\n \"ruby-position\": true,\n \"shape-rendering\": 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-autospace\": true,\n \"text-decoration-skip\": true,\n \"text-emphasis-color\": true,\n \"text-emphasis-position\": true,\n \"text-emphasis-style\": true,\n \"text-fill-color\": true,\n \"text-combine-upright\": true,\n \"text-indent\": true,\n \"text-justify\": true,\n \"text-orientation\": true,\n \"text-rendering\": true,\n \"text-size-adjust\": true,\n \"text-spacing-trim\": true,\n \"text-stroke-color\": true,\n \"text-stroke-width\": true,\n \"text-transform\": true,\n \"text-underline-position\": true,\n visibility: true,\n \"white-space\": true,\n widows: true,\n \"word-break\": true,\n \"word-spacing\": true,\n \"writing-mode\": true,\n};\n\nexport const polyfilledInheritedProps = [\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: { [key: string]: string } = {};\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 if (propName && Css.isCustomPropName(propName)) {\n return this.value;\n }\n return 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 override getBaseValue(): CascadeValue {\n return new CascadeValue(this.value, this.priority);\n }\n\n override 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 override 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 try {\n return !!this.condition.evaluate(context);\n } catch (err) {\n Logging.logger.warn(err);\n }\n return false;\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 || av.priority >= tv.priority) && av.isEnabled(context)) {\n return av.getBaseValue();\n }\n return tv;\n}\n\n/**\n * setProp with priority checking.\n * If context is given it is same as\n * setProp(style, name, cascadeValues(context, getProp(style, name), value))\n */\nexport function setPropCascadeValue(\n style: ElementStyle,\n name: string,\n value: CascadeValue,\n context?: Exprs.Context,\n): void {\n if (!value) {\n delete style[name];\n } else {\n const tv = style[name] as CascadeValue;\n if (!tv || value.priority >= tv.priority) {\n if (context) {\n if (value.isEnabled(context)) {\n style[name] = value.getBaseValue();\n }\n } else {\n style[name] = value;\n }\n }\n }\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) === \"_\" && name !== \"_viewConditionalStyles\";\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] || Css.isCustomPropName(name);\n}\n\nexport function getProp(style: ElementStyle, name: string): CascadeValue {\n return style[name] as CascadeValue;\n}\n\nexport function setProp(\n style: ElementStyle,\n name: string,\n value: CascadeValue,\n): void {\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: ElementStyle }[] => {\n let r = style[\"_viewConditionalStyles\"] as {\n matcher: Matchers.Matcher;\n styles: ElementStyle;\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,\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 setPropCascadeValue(target, prop, av, context);\n\n // Expand shorthand property (its value contains variables).\n const propListLH = (\n context as Exprs.Context & {\n style: { validatorSet: CssValidator.ValidatorSet };\n }\n ).style?.validatorSet.shorthands[prop]?.propList;\n if (propListLH) {\n for (const propLH of propListLH) {\n const avLH = new CascadeValue(Css.empty, av.priority);\n setPropCascadeValue(target, propLH, avLH, context);\n }\n }\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 if (!cascval.value.isNumeric()) {\n // FIXME: cascval may be Ident value e.g. \"smaller\"\n return Exprs.defaultUnitSizes[\"em\"];\n }\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 override 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 numeric.unit === \"lh\" ||\n numeric.unit === \"rlh\"\n ) {\n return convertFontRelativeLengthToPx(\n numeric,\n this.getFontSize(),\n this.context,\n );\n }\n return numeric;\n }\n\n override visitExpr(expr: Css.Expr): Css.Val {\n if (this.propName == \"font-size\") {\n const val = 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 if (unit === \"rlh\") {\n return new Css.Numeric(num * context.rootLineHeight, \"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 override 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 override apply(cascadeInstance: CascadeInstance): void {\n for (let i = 0; i < this.list.length; i++) {\n this.list[i].apply(cascadeInstance);\n }\n }\n\n override mergeWith(other: CascadeAction): CascadeAction {\n this.list.push(other);\n return this;\n }\n\n override 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 override 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 override 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 override apply(cascadeInstance: CascadeInstance): void {\n if (cascadeInstance.currentClassNames.includes(this.className)) {\n this.chained.apply(cascadeInstance);\n }\n }\n\n override getPriority(): number {\n return 10;\n }\n // class should be checked after id\n\n override 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 override 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 override getPriority(): number {\n return 11;\n }\n // id should be checked after :root\n\n override 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 override apply(cascadeInstance: CascadeInstance): void {\n if (cascadeInstance.currentLocalName == this.localName) {\n this.chained.apply(cascadeInstance);\n }\n }\n\n override getPriority(): number {\n return 8;\n }\n // tag is a pretty good thing to check, after epub:type\n\n override 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 override 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 override getPriority(): number {\n return 8;\n }\n // tag is a pretty good thing to check, after epub:type\n\n override 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 override 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 override 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 override 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 override 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 override 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 override 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 override 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 override getPriority(): number {\n return 0;\n }\n\n override 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 override 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 override 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 override apply(cascadeInstance: CascadeInstance): void {\n if (cascadeInstance.isFirst) {\n this.chained.apply(cascadeInstance);\n }\n }\n\n override getPriority(): number {\n return 6;\n }\n}\n\nexport class IsRootAction extends ChainedAction {\n constructor() {\n super();\n }\n\n override apply(cascadeInstance: CascadeInstance): void {\n if (cascadeInstance.isRoot) {\n this.chained.apply(cascadeInstance);\n }\n }\n\n override 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 override apply(cascadeInstance: CascadeInstance): void {\n if (this.matchANPlusB(cascadeInstance.currentSiblingOrder)) {\n this.chained.apply(cascadeInstance);\n }\n }\n\n override 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 override 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 override 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 override 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 override 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 override 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 override getPriority(): number {\n return 4;\n }\n}\n\nexport class IsEmptyAction extends ChainedAction {\n constructor() {\n super();\n }\n\n override 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 override getPriority(): number {\n return 4;\n }\n}\n\nexport class IsEnabledAction extends ChainedAction {\n constructor() {\n super();\n }\n\n override 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 override getPriority(): number {\n return 5;\n }\n}\n\nexport class IsDisabledAction extends ChainedAction {\n constructor() {\n super();\n }\n\n override 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 override getPriority(): number {\n return 5;\n }\n}\n\nexport class IsCheckedAction extends ChainedAction {\n constructor() {\n super();\n }\n\n override 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 override getPriority(): number {\n return 5;\n }\n}\n\nexport class CheckConditionAction extends ChainedAction {\n constructor(public readonly condition: string) {\n super();\n }\n\n override 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 override getPriority(): number {\n return 5;\n }\n}\n\nexport class CheckAppliedAction extends CascadeAction {\n applied = false;\n\n constructor() {\n super();\n }\n\n override apply(cascadeInstance: CascadeInstance): void {\n this.applied = true;\n }\n\n override clone(): CascadeAction {\n const cloned = new CheckAppliedAction();\n cloned.applied = this.applied;\n return cloned;\n }\n}\n\n/**\n * Cascade Action for :is() and similar pseudo-classes\n */\nexport class MatchesAction extends ChainedAction {\n checkAppliedAction: CheckAppliedAction;\n firstActions: CascadeAction[] = [];\n\n constructor(chains: ChainedAction[][]) {\n super();\n this.checkAppliedAction = new CheckAppliedAction();\n for (const chain of chains) {\n this.firstActions.push(chainActions(chain, this.checkAppliedAction));\n }\n }\n\n override apply(cascadeInstance: CascadeInstance): void {\n for (const firstAction of this.firstActions) {\n firstAction.apply(cascadeInstance);\n if (this.checkAppliedAction.applied) {\n break;\n }\n }\n if (this.checkAppliedAction.applied === this.positive()) {\n this.chained.apply(cascadeInstance);\n }\n this.checkAppliedAction.applied = false;\n }\n\n override getPriority(): number {\n return Math.max(\n ...this.firstActions.map((firstAction) =>\n firstAction instanceof ChainedAction ? firstAction.getPriority() : 0,\n ),\n );\n }\n\n positive(): boolean {\n return true;\n }\n\n relational(): boolean {\n return false;\n }\n}\n\n/**\n * Cascade Action for :not() pseudo-class\n */\nexport class MatchesNoneAction extends MatchesAction {\n override positive(): boolean {\n return false;\n }\n}\n\n/**\n * Cascade Action for :has() pseudo-class\n */\nexport class MatchesRelationalAction extends MatchesAction {\n constructor(public selectorTexts: string[]) {\n super([]);\n }\n\n override apply(cascadeInstance: CascadeInstance): void {\n for (const selectorText of this.selectorTexts) {\n let selectorWithScope: string;\n let scopingRoot: Element;\n if (/^\\s*[+~]/.test(selectorText)) {\n // :has(+ F) or :has(~ F)\n scopingRoot = cascadeInstance.currentElement.parentElement;\n const index = Array.from(scopingRoot.children).indexOf(\n cascadeInstance.currentElement,\n );\n selectorWithScope = `:scope > :nth-child(${index + 1}) ${selectorText}`;\n } else {\n // :has(F) or :has(> F)\n scopingRoot = cascadeInstance.currentElement;\n selectorWithScope = `:scope ${selectorText}`;\n }\n try {\n if (scopingRoot.querySelector(selectorWithScope)) {\n this.checkAppliedAction.apply(cascadeInstance);\n break;\n }\n } catch (e) {}\n }\n if (this.checkAppliedAction.applied) {\n this.chained.apply(cascadeInstance);\n }\n this.checkAppliedAction.applied = false;\n }\n\n override relational(): boolean {\n return true;\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{\n constructor(\n condition: string,\n viewConditionId: string | null,\n viewCondition: Matchers.Matcher,\n ) {\n super(condition, viewConditionId, viewCondition);\n }\n\n /** @override */\n fresh(cascadeInstance: CascadeInstance): ConditionItem {\n return new DescendantConditionItem(\n this.condition,\n this.viewConditionId,\n this.buildViewConditionMatcher(cascadeInstance),\n );\n }\n\n /** @override */\n push(cascadeInstance: CascadeInstance, depth: number): boolean {\n if (depth == 0) {\n this.increment(cascadeInstance);\n }\n return false;\n }\n\n /** @override */\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{\n constructor(\n condition: string,\n viewConditionId: string | null,\n viewCondition: Matchers.Matcher,\n ) {\n super(condition, viewConditionId, viewCondition);\n }\n\n /** @override */\n fresh(cascadeInstance: CascadeInstance): ConditionItem {\n return new ChildConditionItem(\n this.condition,\n this.viewConditionId,\n this.buildViewConditionMatcher(cascadeInstance),\n );\n }\n\n /** @override */\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 /** @override */\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{\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 /** @override */\n fresh(cascadeInstance: CascadeInstance): ConditionItem {\n return new AdjacentSiblingConditionItem(\n this.condition,\n this.viewConditionId,\n this.buildViewConditionMatcher(cascadeInstance),\n );\n }\n\n /** @override */\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 /** @override */\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{\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 /** @override */\n fresh(cascadeInstance: CascadeInstance): ConditionItem {\n return new FollowingSiblingConditionItem(\n this.condition,\n this.viewConditionId,\n this.buildViewConditionMatcher(cascadeInstance),\n );\n }\n\n /** @override */\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 /** @override */\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 /** @override */\n fresh(cascadeInstance: CascadeInstance): ConditionItem {\n return this;\n }\n\n /** @override */\n push(cascadeInstance: CascadeInstance, depth: number): boolean {\n return false;\n }\n\n /** @override */\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 /** @override */\n fresh(cascadeInstance: CascadeInstance): ConditionItem {\n return this;\n }\n\n /** @override */\n push(cascadeInstance: CascadeInstance, depth: number): boolean {\n return false;\n }\n\n /** @override */\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 /** @override */\n fresh(cascadeInstance: CascadeInstance): ConditionItem {\n return this;\n }\n\n /** @override */\n push(cascadeInstance: CascadeInstance, depth: number): boolean {\n return false;\n }\n\n /** @override */\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: CssStyler.AbstractStyler): 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 elementOffset: number,\n ): void;\n\n /**\n * Get value of the CSS element() function\n * https://drafts.csswg.org/css-gcpm-3/#running-elements\n */\n getRunningElementVal(name: string, retrievePosition: string): Exprs.Val;\n\n /**\n * Set running element\n * https://drafts.csswg.org/css-gcpm-3/#running-elements\n */\n setRunningElement(name: string, elementOffset: number): 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 override 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 override 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\n return new Css.Expr(\n this.counterResolver.getNamedStringVal(name, retrievePosition),\n );\n }\n\n /**\n * CSS `element()` function\n * https://drafts.csswg.org/css-gcpm-3/#running-elements\n */\n visitFuncElement(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\n return new Css.Expr(\n this.counterResolver.getRunningElementVal(name, retrievePosition),\n );\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 stringValue = this.element.textContent;\n break;\n case \"before\":\n case \"after\":\n {\n const pseudos = getStyleMap(this.cascade.currentStyle, \"_pseudos\");\n const val = (pseudos?.[pseudoName]?.[\"content\"] as CascadeValue)\n ?.value;\n stringValue = getStringValueFromCssContentVal(val);\n }\n break;\n case \"first-letter\":\n {\n // Respect ::before/after pseudo-elements (Issue #1174)\n const pseudos = getStyleMap(this.cascade.currentStyle, \"_pseudos\");\n const r = (\n getStringValueFromCssContentVal(\n (pseudos?.[\"before\"]?.[\"content\"] as CascadeValue)?.value,\n ) ||\n this.element.textContent ||\n getStringValueFromCssContentVal(\n (pseudos?.[\"after\"]?.[\"content\"] as CascadeValue)?.value,\n )\n ).match(Base.firstLetterPattern);\n stringValue = r ? r[0] : \"\";\n }\n break;\n }\n return new Css.Str(stringValue);\n }\n\n /**\n * CSS `leader()` function\n * https://www.w3.org/TR/css-content-3/#leaders\n */\n visitFuncLeader(values: Css.Val[]): Css.Val {\n let leader: string = \"\";\n if (values[0] instanceof Css.Ident) {\n switch (values[0].stringValue()) {\n case \"dotted\":\n leader = \".\";\n break;\n case \"solid\":\n leader = \"_\";\n break;\n case \"space\":\n leader = \" \";\n break;\n }\n } else if (values[0] instanceof Css.Str) {\n leader = values[0].stringValue();\n }\n if (leader.length == 0) {\n return new Css.Str(\"\");\n }\n return new Css.Expr(new Exprs.Native(null, () => leader, \"viv-leader\"));\n }\n\n override 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 \"element\":\n if (func.values.length <= 2) {\n return this.visitFuncElement(func.values);\n }\n break;\n case \"content\":\n if (func.values.length <= 1) {\n return this.visitFuncContent(func.values);\n }\n break;\n case \"leader\":\n if (func.values.length <= 1) {\n return this.visitFuncLeader(func.values);\n }\n break;\n }\n // Logging.logger.warn(\"E_CSS_CONTENT_PROP:\", func.toString());\n return func;\n }\n}\n\n/**\n * POST_LAYOUT_BLOCK hook function for CSS leader()\n * @param nodeContext\n * @param checkPoints\n * @param column\n */\nconst postLayoutBlockLeader: Plugin.PostLayoutBlockHook = (\n nodeContext: Vtree.NodeContext,\n checkPoints: Vtree.NodeContext[],\n column: Layout.Column,\n) => {\n const leaders: Vtree.NodeContext[] = checkPoints.filter(\n (c) =>\n c.after &&\n c.viewNode.nodeType === 1 &&\n (c.viewNode as Element).getAttribute(\"data-viv-leader\"),\n );\n for (const c of leaders) {\n // we want to access the bottom block element, which contains single leader().\n let container = c.parent;\n while (container && container.inline) {\n container = container.parent;\n }\n const leaderElem = c.viewNode as HTMLElement;\n const pseudoAfter = leaderElem.parentElement;\n const leader = leaderElem.getAttribute(\"data-viv-leader-value\");\n const previous = leaderElem.textContent || leader;\n const { writingMode, direction, marginInlineEnd } =\n column.clientLayout.getElementComputedStyle(pseudoAfter);\n\n function setLeaderTextContent(leaderStr: string): void {\n if (direction === \"rtl\") {\n // in RTL direction, enclose the leader with U+200F (RIGHT-TO-LEFT MARK)\n // to ensure RTL order around the leader.\n const RLM = \"\\u200f\";\n leaderElem.textContent =\n (leaderStr.startsWith(RLM) ? \"\" : RLM) +\n leaderStr +\n (leaderStr.endsWith(RLM) ? \"\" : RLM);\n } else {\n leaderElem.textContent = leaderStr;\n }\n }\n\n // prevent leader layout problem (Issue #1117)\n leaderElem.style.marginInlineStart = \"1px\";\n\n // reset the expanded leader\n setLeaderTextContent(leader);\n // setting inline-block removes the pseudo CONTENT from normal text flow\n pseudoAfter.style.display = \"inline-block\";\n pseudoAfter.style.textIndent = \"0\"; // cancel inherited text-indent\n\n const box = column.clientLayout.getElementClientRect(\n container.viewNode as Element,\n );\n const innerInit = column.clientLayout.getElementClientRect(pseudoAfter);\n const innerMarginInlineEnd = column.parseComputedLength(marginInlineEnd);\n // capture the line boundary\n // Some leader text (\"_\" e.g.) creates higher top than container.\n if (writingMode === \"vertical-rl\" || writingMode === \"vertical-lr\") {\n if (direction === \"rtl\") {\n box.top += innerMarginInlineEnd;\n } else {\n box.bottom -= innerMarginInlineEnd;\n }\n box.left = innerInit.left;\n box.right = innerInit.right;\n box.top = Math.min(innerInit.top, box.top);\n box.bottom = Math.max(innerInit.bottom, box.bottom);\n } else {\n if (direction === \"rtl\") {\n box.left += innerMarginInlineEnd;\n } else {\n box.right -= innerMarginInlineEnd;\n }\n box.top = innerInit.top;\n box.bottom = innerInit.bottom;\n box.left = Math.min(innerInit.left, box.left);\n box.right = Math.max(innerInit.right, box.right);\n }\n\n function overrun() {\n const inner = column.clientLayout.getElementClientRect(pseudoAfter);\n if (\n box.left > inner.left ||\n box.right < inner.right ||\n box.top > inner.top ||\n box.bottom < inner.bottom\n ) {\n return true;\n }\n return false;\n }\n\n function setLeader() {\n // min-max search\n let lower: number;\n let upper: number;\n setLeaderTextContent(previous);\n if (overrun()) {\n lower = 1;\n upper = previous.length / leader.length;\n } else {\n lower = previous.length / leader.length;\n upper = lower;\n for (let i = 0; i < 16; i++) {\n let templeader = previous;\n for (let j = 0; j < 1 << i; j++) {\n templeader += leader;\n }\n setLeaderTextContent(templeader);\n if (overrun()) {\n upper += 1 << i;\n break;\n }\n }\n }\n // leader is set to overrun state here\n for (let i = 0; i < 16; i++) {\n let templeader = \"\";\n const mid = Math.floor((lower + upper) / 2);\n for (let j = 0; j < mid; j++) {\n templeader += leader;\n }\n setLeaderTextContent(templeader);\n if (overrun()) {\n upper = mid;\n } else {\n if (lower == mid) {\n return;\n }\n lower = mid;\n }\n }\n setLeaderTextContent(leader);\n }\n\n // set the expanded leader\n setLeader();\n\n // Without inline-end, we use margin-inline-start to adjust the position.\n // To get the margin size, set float, calculate then cancel float.\n const innerInline = column.clientLayout.getElementClientRect(pseudoAfter);\n if (direction == \"rtl\") {\n pseudoAfter.style.float = \"left\";\n } else {\n pseudoAfter.style.float = \"right\";\n }\n const innerAligned = column.clientLayout.getElementClientRect(pseudoAfter);\n // When float is applied, the content will be removed from the normal\n // text flow, and box inset will be also removed.\n // When content comes back to the normal text flow, then inset effects again.\n function getInset(side: string): number {\n let inset = 0;\n let p = pseudoAfter.parentElement;\n while (p && p !== container.viewNode) {\n inset += column.getComputedInsets(p)[side];\n p = p.parentElement;\n }\n return inset;\n }\n let padding = 0;\n if (direction == \"rtl\") {\n if (writingMode == \"vertical-rl\" || writingMode == \"vertical-lr\") {\n padding = innerInline.top - innerAligned.top - getInset(\"top\");\n } else {\n padding = innerInline.left - innerAligned.left - getInset(\"left\");\n }\n } else {\n if (writingMode == \"vertical-rl\" || writingMode == \"vertical-lr\") {\n padding = innerAligned.bottom - innerInline.bottom - getInset(\"bottom\");\n } else {\n padding = innerAligned.right - innerInline.right - getInset(\"right\");\n }\n }\n padding = Math.max(0, padding - 0.1); // prevent line wrapping (Issue #1112)\n pseudoAfter.style.float = \"\";\n leaderElem.style.marginInlineStart = `${padding}px`;\n }\n};\n\nPlugin.registerHook(Plugin.HOOKS.POST_LAYOUT_BLOCK, postLayoutBlockLeader);\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 / 0x100000;\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 previousPageType: string | null = null;\n firstPageType: 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.Val = Css.ident.inline;\n const display = props[\"display\"] as CascadeValue;\n if (display) {\n displayVal = display.evaluate(this.context);\n }\n let floatVal: Css.Val = Css.ident.inline;\n const float = props[\"float\"] as CascadeValue;\n if (float) {\n floatVal = float.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\"] as CascadeValue;\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\"] as CascadeValue;\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\"] as CascadeValue;\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 (this.currentElement?.parentNode.nodeType === Node.DOCUMENT_NODE) {\n if (!resetMap) {\n resetMap = {};\n }\n // `counter-reset: footnote 0` is implicitly applied on the root element\n if (resetMap[\"footnote\"] === undefined) {\n resetMap[\"footnote\"] = 0;\n }\n }\n if (floatVal === Css.ident.footnote) {\n if (!incrementMap) {\n incrementMap = {};\n }\n // `counter-increment: footnote 1` is implicitly applied on the\n // element (or pseudo element) with `float: footnote`,\n // unless `counter-increment: footnote` is explicitly specified\n // on the element (parent element of the pseudo element).\n if (incrementMap[\"footnote\"] === undefined) {\n const incrPropValue = (\n this.currentStyle[\"counter-increment\"] as CascadeValue\n )?.value;\n if (\n !incrPropValue ||\n !(\n incrPropValue === Css.ident.footnote ||\n (incrPropValue instanceof Css.SpaceList &&\n incrPropValue.values.includes(Css.ident.footnote))\n )\n ) {\n incrementMap[\"footnote\"] = 1;\n }\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 = props[\"string-set\"] as CascadeValue;\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(\n name,\n stringValue,\n this.currentElementOffset,\n );\n }\n }\n delete props[\"string-set\"];\n }\n\n /**\n * Process CSS running elements\n * https://drafts.csswg.org/css-gcpm-3/#running-elements\n */\n setRunningElement(props: ElementStyle): void {\n const position = props[\"position\"] as CascadeValue;\n if (\n position?.value instanceof Css.Func &&\n position.value.name === \"running\"\n ) {\n const name = position.value.values[0].stringValue();\n this.counterResolver.setRunningElement(name, this.currentElementOffset);\n }\n }\n\n processPseudoelementProps(pseudoprops: ElementStyle, element: Element): void {\n this.pushCounters(pseudoprops);\n const content = pseudoprops[\"content\"] as CascadeValue;\n if (content) {\n pseudoprops[\"content\"] = content.filterValue(\n new ContentPropVisitor(this, element, this.counterResolver),\n );\n }\n this.popCounters();\n }\n\n pushElement(\n styler: CssStyler.AbstractStyler,\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 =\n this.followingSiblingTypeCountsStack;\n const currentFollowingSiblingTypeCounts =\n (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\n // Substitute var()\n this.applyVarFilter([this.currentStyle], styler, element);\n\n // Calculate calc()\n this.applyCalcFilter(this.currentStyle, this.context);\n\n this.applyAttrFilter(element);\n const quotesCasc = baseStyle[\"quotes\"] as CascadeValue;\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 (\n quotesVal === Css.ident.auto ||\n quotesVal === Css.ident.initial\n ) {\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 // FIXME: quotes:auto should be based on the content language\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 (\n ((pseudoName === \"before\" || pseudoName === \"after\") &&\n !Vtree.nonTrivialContent(\n (pseudoProps[\"content\"] as CascadeValue)?.value,\n )) ||\n ((pseudoName === \"footnote-call\" ||\n pseudoName === \"footnote-marker\") &&\n getProp(this.currentStyle, \"float\")?.value !== Css.ident.footnote)\n ) {\n delete pseudos[pseudoName];\n } else 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 // process CSS running elements\n this.setRunningElement(this.currentStyle);\n\n if (itemToPushLast) {\n this.stack[this.stack.length - 2].push(itemToPushLast);\n }\n }\n\n private applyAttrFilterInner(\n visitor: Css.Visitor,\n elementStyle: ElementStyle,\n ): void {\n for (const propName in elementStyle) {\n if (isPropName(propName) && !Css.isCustomPropName(propName)) {\n elementStyle[propName] = (\n elementStyle[propName] as CascadeValue\n ).filterValue(visitor);\n }\n }\n }\n\n private applyAttrFilter(element: 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 /**\n * Substitute all variables in property values in elementStyle\n */\n applyVarFilter(\n elementStyles: ElementStyle[],\n styler: CssStyler.AbstractStyler,\n element: Element | null,\n ): void {\n const elementStyle = elementStyles[0];\n const visitor = new VarFilterVisitor(elementStyles, styler, element);\n const LIMIT_LOOP = 32; // prevent cyclic or too deep dependency\n const propsLH: ElementStyle = {}; // for shorthand -> longhand cascade\n\n for (const name in elementStyle) {\n if (isMapName(name)) {\n const pseudoMap = getStyleMap(elementStyle, name);\n for (const pseudoName in pseudoMap) {\n this.applyVarFilter(\n [pseudoMap[pseudoName], ...elementStyles],\n styler,\n element,\n );\n }\n } else if (isPropName(name)) {\n const cascVal = getProp(elementStyle, name);\n let value = cascVal.value;\n\n for (let i = 0; ; i++) {\n if (i >= LIMIT_LOOP) {\n value = Css.empty;\n break;\n }\n const after = value.visit(visitor);\n if (visitor.error) {\n // invalid or unresolved variable found\n value = Css.empty;\n visitor.error = false;\n break;\n }\n if (after === value) {\n // no variable, or all variables substituted\n break;\n }\n // variables substituted, but the substituted value may contain variables\n value = after;\n }\n if (value !== cascVal.value) {\n // all variables substituted\n const validatorSet = (styler as any)\n .validatorSet as CssValidator.ValidatorSet;\n const shorthand = validatorSet?.shorthands[name]?.clone();\n if (shorthand) {\n if (Css.isDefaultingValue(value)) {\n for (const nameLH of shorthand.propList) {\n const avLH = new CascadeValue(value, cascVal.priority);\n const tvLH = getProp(elementStyle, nameLH);\n setProp(\n propsLH,\n nameLH,\n cascadeValues(this.context, tvLH, avLH),\n );\n }\n delete elementStyle[name];\n } else {\n // The var()-substituted value may have complex structure\n // (e.g. SpaceList in SpaceList) that ShorthandValidator\n // cannot handle, so use toString and parseValue.\n const valueSH = CssParser.parseValue(\n (styler as any).scope,\n new CssTokenizer.Tokenizer(value.toString(), null),\n \"\",\n );\n if (valueSH) {\n valueSH.visit(shorthand);\n if (!shorthand.error) {\n for (const nameLH of shorthand.propList) {\n const avLH = new CascadeValue(\n shorthand.values[nameLH] ??\n validatorSet.defaultValues[nameLH] ??\n Css.ident.initial,\n cascVal.priority,\n );\n const tvLH = getProp(elementStyle, nameLH);\n setProp(\n propsLH,\n nameLH,\n cascadeValues(this.context, tvLH, avLH),\n );\n }\n delete elementStyle[name];\n }\n }\n }\n } else {\n elementStyle[name] = new CascadeValue(value, cascVal.priority);\n }\n }\n if (propsLH[name]) {\n const av = getProp(elementStyle, name);\n if (av && av.value !== Css.empty) {\n setPropCascadeValue(propsLH, name, av, this.context);\n }\n }\n }\n }\n // Update elementStyle with shorthand -> longhand cascade result\n for (const name in propsLH) {\n elementStyle[name] = propsLH[name];\n }\n }\n\n /**\n * Calculate all calc() in property values in elementStyle\n */\n applyCalcFilter(elementStyle: ElementStyle, context: Exprs.Context): void {\n const visitor = new CalcFilterVisitor(context);\n for (const name in elementStyle) {\n if (isMapName(name)) {\n const pseudoMap = getStyleMap(elementStyle, name);\n for (const pseudoName in pseudoMap) {\n this.applyCalcFilter(pseudoMap[pseudoName], context);\n }\n } else if (isPropName(name) && !Css.isCustomPropName(name)) {\n const cascVal = getProp(elementStyle, name);\n const value = cascVal.value.visit(visitor);\n if (value !== cascVal.value) {\n elementStyle[name] = new CascadeValue(value, cascVal.priority);\n }\n }\n }\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: string[] = [];\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 \"\", // 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{\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 invalid: boolean = false; // for `@supports selector()` check\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 override tagSelector(ns: string | null, name: string | null): void {\n if (!name && !ns) {\n return;\n }\n if (name) {\n this.specificity += 1;\n }\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 invalidSelector(message: string): void {\n Logging.logger.warn(message);\n this.chain.push(new CheckConditionAction(\"\")); // always fails\n this.setInvalid();\n }\n\n setInvalid(): void {\n this.invalid = true;\n for (\n let handler: CascadeParserHandler = this;\n handler instanceof MatchesParameterParserHandler;\n handler = handler.parent\n ) {\n handler.parent.invalid = true;\n }\n }\n\n override classSelector(name: string): void {\n if (this.pseudoelement) {\n this.invalidSelector(`::${this.pseudoelement} followed by .${name}`);\n return;\n }\n this.specificity += 256;\n this.chain.push(new CheckClassAction(name));\n }\n\n override pseudoclassSelector(\n name: string,\n params: (number | string)[],\n ): void {\n if (this.pseudoelement) {\n this.invalidSelector(`::${this.pseudoelement} followed by :${name}`);\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 case \"scope\":\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 fails\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: // always fails\n this.invalidSelector(`Unknown pseudo-class :${name}`);\n return;\n }\n this.specificity += 256;\n }\n\n override pseudoelementSelector(\n name: string,\n params: (number | string)[],\n ): 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 this.invalidSelector(\n `Double pseudo-element ::${this.pseudoelement}::${name}`,\n );\n return;\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 this.invalidSelector(\n `Double pseudo-element ::${this.pseudoelement}::${name}`,\n );\n return;\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: // always fails\n this.invalidSelector(`Unknown pseudo-element ::${name}`);\n return;\n }\n this.specificity += 1;\n }\n\n override idSelector(id: string): void {\n this.specificity += 65536;\n this.chain.push(new CheckIdAction(id));\n }\n\n override attributeSelector(\n ns: string,\n name: string,\n op: 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 TokenType.EOF:\n action = new CheckAttributePresentAction(ns, name);\n break;\n case TokenType.EQ:\n action = new CheckAttributeEqAction(ns, name, value);\n break;\n case 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 TokenType.BAR_EQ:\n action = new CheckAttributeRegExpAction(\n ns,\n name,\n new RegExp(`^${Base.escapeRegExp(value)}(\\$|-)`),\n );\n break;\n case 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 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 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 TokenType.COL_COL:\n if (value == \"supported\") {\n action = new CheckNamespaceSupportedAction(ns, name);\n } else {\n this.invalidSelector(`Unsupported :: attr selector op: ${value}`);\n return;\n }\n break;\n default:\n this.invalidSelector(`Unsupported attr selector: ${op}`);\n return;\n }\n this.chain.push(action);\n }\n\n override 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 override 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 override 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 override 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 override nextSelector(): void {\n this.finishChain();\n this.pseudoelement = null;\n this.footnoteContent = false;\n this.specificity = 0;\n this.chain = [];\n }\n\n override 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 this.invalid = false;\n }\n\n override 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 this.setInvalid();\n }\n\n override startStylesheet(flavor: CssParser.StylesheetFlavor): void {\n super.startStylesheet(flavor);\n this.state = ParseState.TOP;\n }\n\n override startRuleBody(): void {\n this.finishChain();\n super.startRuleBody();\n if (this.state == ParseState.SELECTOR) {\n this.state = ParseState.TOP;\n }\n }\n\n override endRule(): void {\n super.endRule();\n this.insideSelectorRule = ParseState.TOP;\n }\n\n finishChain(): void {\n if (this.chain) {\n this.processChain(this.makeApplyRuleAction(this.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 override 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 /** @override */\n invalidPropertyValue(name: string, value: Css.Val): void {\n this.report(`E_INVALID_PROPERTY_VALUE ${name}: ${value.toString()}`);\n }\n\n /** @override */\n unknownProperty(name: string, value: Css.Val): void {\n this.report(`E_INVALID_PROPERTY ${name}: ${value.toString()}`);\n }\n\n /** @override */\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 priority = specificity + this.cascade.nextOrder();\n const cascval = this.condition\n ? new ConditionalCascadeValue(value, priority, this.condition)\n : new CascadeValue(value, priority);\n setPropCascadeValue(this.elementStyle, name, cascval);\n }\n\n finish(): Cascade {\n return this.cascade;\n }\n\n override startFuncWithSelector(funcName: string): void {\n let parameterParserHandler: MatchesParameterParserHandler;\n switch (funcName) {\n case \"is\":\n parameterParserHandler = new MatchesParameterParserHandler(this);\n break;\n case \"not\":\n parameterParserHandler = new NotParameterParserHandler(this);\n break;\n case \"where\":\n parameterParserHandler = new WhereParameterParserHandler(this);\n break;\n case \"has\":\n parameterParserHandler = new HasParameterParserHandler(this);\n break;\n }\n if (parameterParserHandler) {\n parameterParserHandler.startSelectorRule();\n this.owner.pushHandler(parameterParserHandler);\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\n/**\n * Cascade Parser Handler for :is() and similar pseudo-classes parameter\n */\nexport class MatchesParameterParserHandler extends CascadeParserHandler {\n parentChain: ChainedAction[];\n chains: ChainedAction[][] = [];\n maxSpecificity: number = 0;\n selectorTexts: string[] = [];\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 override nextSelector(): void {\n if (this.chain) {\n this.chains.push(this.chain);\n }\n this.maxSpecificity = Math.max(this.maxSpecificity, this.specificity);\n this.chain = [];\n this.pseudoelement = null;\n this.viewConditionId = null;\n this.footnoteContent = false;\n this.specificity = 0;\n }\n\n override endFuncWithSelector(): void {\n if (this.chain) {\n this.chains.push(this.chain);\n }\n if (this.chains.length > 0) {\n this.maxSpecificity = Math.max(this.maxSpecificity, this.specificity);\n this.parentChain.push(\n this.relational()\n ? new MatchesRelationalAction(this.selectorTexts)\n : this.positive()\n ? new MatchesAction(this.chains)\n : new MatchesNoneAction(this.chains),\n );\n if (this.increasingSpecificity()) {\n this.parent.specificity += this.maxSpecificity;\n }\n } else {\n // func argument is empty or all invalid\n this.parentChain.push(new CheckConditionAction(\"\")); // always fails\n }\n\n this.owner.popHandler();\n }\n\n override startRuleBody(): void {\n this.reportAndSkip(\"E_CSS_UNEXPECTED_RULE_BODY\");\n }\n\n override error(mnemonics: string, token: CssTokenizer.Token): void {\n super.error(mnemonics, token);\n this.chain = null;\n this.pseudoelement = null;\n this.viewConditionId = null;\n this.footnoteContent = false;\n this.specificity = 0;\n\n let forgiving = false;\n for (\n let handler: CascadeParserHandler = this;\n handler instanceof MatchesParameterParserHandler;\n handler = handler.parent\n ) {\n if (handler.forgiving()) {\n forgiving = true;\n break;\n }\n }\n if (!forgiving) {\n this.owner.popHandler();\n }\n }\n\n override pushSelectorText(selectorText: string): void {\n // selectorText is used only for relational pseudo-class `:has()`\n if (this.chain && this.relational()) {\n this.selectorTexts.push(selectorText);\n }\n }\n\n /**\n * @returns true unless this is `:not()`\n */\n positive(): boolean {\n return true;\n }\n\n /**\n * @returns true unless this is `:where()`\n */\n increasingSpecificity(): boolean {\n return true;\n }\n\n /**\n * @returns true if this takes a forgiving selector list (:is/where/has)\n */\n forgiving(): boolean {\n return true;\n }\n\n /**\n * @returns true if this is `:has()`\n */\n relational(): boolean {\n return false;\n }\n}\n\n/**\n * Cascade Parser Handler for :not() pseudo-class parameter\n */\nexport class NotParameterParserHandler extends MatchesParameterParserHandler {\n override positive(): boolean {\n return false;\n }\n\n forgiving(): boolean {\n return false;\n }\n}\n\n/**\n * Cascade Parser Handler for :where() pseudo-class parameter\n */\nexport class WhereParameterParserHandler extends MatchesParameterParserHandler {\n override increasingSpecificity(): boolean {\n return false;\n }\n}\n\n/**\n * Cascade Parser Handler for :has() pseudo-class parameter\n */\nexport class HasParameterParserHandler extends MatchesParameterParserHandler {\n override relational(): boolean {\n return true;\n }\n}\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 override 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{\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 override 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 /** @override */\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 /** @override */\n unknownProperty(name: string, value: Css.Val): void {\n Logging.logger.warn(\"E_INVALID_PROPERTY\", `${name}:`, value.toString());\n }\n\n /** @override */\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 cascval = this.condition\n ? new ConditionalCascadeValue(value, specificity, this.condition)\n : new CascadeValue(value, specificity);\n setPropCascadeValue(this.elementStyle, name, cascval);\n }\n}\n\nexport class PropertyParserHandler\n extends CssParser.ErrorHandler\n implements CssValidator.PropertyReceiver\n{\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 override 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 /** @override */\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 /** @override */\n unknownProperty(name: string, value: Css.Val): void {\n Logging.logger.warn(\"E_INVALID_PROPERTY\", `${name}:`, value.toString());\n }\n\n /** @override */\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 setPropCascadeValue(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 (\n writingMode &&\n writingMode !== Css.ident.inherit &&\n writingMode !== Css.ident.revert &&\n writingMode !== Css.ident.unset\n ) {\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 (\n direction &&\n direction !== Css.ident.inherit &&\n direction !== Css.ident.revert &&\n direction !== Css.ident.unset\n ) {\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/**\n * Convert var() to its value\n */\nexport class VarFilterVisitor extends Css.FilterVisitor {\n constructor(\n public elementStyles: ElementStyle[],\n public styler: CssStyler.AbstractStyler,\n public element: Element | null,\n ) {\n super();\n }\n\n private getVarValue(name: string): Css.Val {\n let elem = this.element ?? ((this.styler as any).root as Element);\n if (this.elementStyles?.length) {\n for (const style of this.elementStyles) {\n const val = (style[name] as CascadeValue)?.value;\n if (val) {\n return val;\n }\n }\n if (this.element) {\n elem = this.element.parentElement;\n }\n }\n for (; elem; elem = elem.parentElement) {\n const val = (this.styler.getStyle(elem, false)?.[name] as CascadeValue)\n ?.value;\n if (val) {\n return val;\n }\n }\n return null;\n }\n\n override visitFunc(func: Css.Func): Css.Val {\n if (func.name !== \"var\") {\n return super.visitFunc(func);\n }\n const name = func.values[0] instanceof Css.Ident && func.values[0].name;\n if (!name || !Css.isCustomPropName(name)) {\n this.error = true;\n return Css.empty;\n }\n const varVal = this.getVarValue(name);\n if (varVal) {\n return varVal;\n }\n // fallback value\n if (func.values.length < 2) {\n this.error = true;\n return Css.empty;\n }\n if (func.values.length === 2) {\n return func.values[1];\n } else {\n return new Css.CommaList(func.values.slice(1));\n }\n }\n}\n\n/**\n * Convert calc() to its value\n */\nexport class CalcFilterVisitor extends Css.FilterVisitor {\n constructor(\n public context: Exprs.Context,\n public resolveViewportUnit?: boolean,\n public percentRef?: number,\n ) {\n super();\n }\n\n override visitFunc(func: Css.Func): Css.Val {\n // convert func args\n let value = super.visitFunc(func);\n if (func.name !== \"calc\") {\n return value;\n }\n const exprText = value.toString().replace(/^calc\\b/, \"-epubx-expr\");\n if (\n /\\d(%|em|ex|cap|ch|ic|lh|p?v[whbi]|p?vmin|p?vmax)\\W|\\Wvar\\(\\s*--/i.test(\n exprText,\n )\n ) {\n return value;\n }\n const exprVal = CssParser.parseValue(\n this.context.rootScope,\n new CssTokenizer.Tokenizer(exprText, null),\n \"\",\n );\n if (exprVal instanceof Css.Expr) {\n try {\n const exprResult = exprVal.expr.evaluate(this.context);\n if (typeof exprResult === \"number\") {\n value = new Css.Numeric(exprResult, \"px\");\n }\n } catch (err) {\n Logging.logger.warn(err);\n }\n }\n return value;\n }\n\n override visitNumeric(numeric: Css.Numeric): Css.Val {\n if (\n this.resolveViewportUnit &&\n (Exprs.isViewportRelativeLengthUnit(numeric.unit) ||\n Exprs.isRootFontRelativeLengthUnit(numeric.unit))\n ) {\n return new Css.Numeric(\n numeric.num * this.context.queryUnitSize(numeric.unit, false),\n \"px\",\n );\n }\n if (typeof this.percentRef === \"number\" && numeric.unit === \"%\") {\n return new Css.Numeric((numeric.num * this.percentRef) / 100, \"px\");\n }\n return numeric;\n }\n}\n\nexport function evaluateCSSToCSS(\n context: Exprs.Context,\n val: Css.Val,\n propName?: string,\n percentRef?: number,\n): Css.Val {\n try {\n if (val instanceof Css.Expr) {\n if (\n val.expr instanceof Exprs.Native &&\n (val.expr.str.startsWith(\"named-string-\") ||\n val.expr.str.startsWith(\"running-element-\"))\n ) {\n return val;\n }\n return CssParser.evaluateExprToCSS(context, val.expr, propName);\n }\n if (\n val instanceof Css.Numeric ||\n val instanceof Css.Func ||\n val instanceof Css.SpaceList ||\n val instanceof Css.CommaList\n ) {\n return val.visit(new CalcFilterVisitor(context, true, percentRef));\n }\n } catch (err) {\n Logging.logger.warn(err);\n return Css.empty;\n }\n return val;\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 // Workaround for the case that the element has an image that is\n // not loaded yet. Use 1px instead of 0px to avoid wrong layout.\n if (\n r === \"0px\" &&\n element.childNodes.length === 1 &&\n element.firstElementChild?.localName === \"img\" &&\n !(element.firstElementChild as HTMLImageElement).complete\n ) {\n r = \"1px\";\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 =\n 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{\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 =\n this.parent.getLastFollowingFloatInFragments(float);\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\n ? this.container.rtl\n ? limits.bottom\n : limits.top\n : this.container.rtl\n ? limits.right\n : limits.left;\n case \"inline-end\":\n return this.container.vertical\n ? this.container.rtl\n ? limits.top\n : limits.bottom\n : this.container.rtl\n ? limits.left\n : 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) * area.getInlineDir();\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 =\n (inlineEnd - inlineStart) * area.getInlineDir();\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(\n inlineEnd - outerInlineSize * area.getInlineDir(),\n inlineSize,\n );\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 /** @override */\n appliesToNodeContext(nodeContext: Vtree.NodeContext): boolean {\n return isPageFloat(nodeContext.floatReference);\n }\n\n /** @override */\n appliesToFloat(float: PageFloat): boolean {\n return true;\n }\n\n /** @override */\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 /** @override */\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 /** @override */\n findPageFloatFragment(\n float: PageFloat,\n pageFloatLayoutContext: PageFloatLayoutContext,\n ): PageFloatFragment | null {\n return pageFloatLayoutContext.findPageFloatFragment(float);\n }\n\n /** @override */\n adjustPageFloatArea(\n floatArea: LayoutType.PageFloatArea,\n floatContainer: Vtree.Container,\n column: LayoutType.Column,\n ) {}\n\n /** @override */\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 override 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 override getOrder(): number {\n return Infinity;\n }\n\n override 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{\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 appliesToNodeContext(nodeContext: Vtree.NodeContext): boolean {\n return nodeContext.floatSide === \"footnote\";\n }\n\n /** @override */\n appliesToFloat(float: PageFloats.PageFloat): boolean {\n return float instanceof Footnote;\n }\n\n /** @override */\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 =\n pageFloatLayoutContext.getPageFloatLayoutContext(floatReference);\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 /** @override */\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 /** @override */\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 /** @override */\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 /** @override */\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 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.Val): boolean {\n return position === Css.ident.absolute || position === Css.ident.fixed;\n}\n\n/**\n * Check if the position value is 'running()'.\n * https://drafts.csswg.org/css-gcpm/#running-elements\n */\nexport function isRunning(position: Css.Val): boolean {\n return position instanceof Css.Func && position.name === \"running\";\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 getComputedDisplayValue(\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 (\n (float && float !== Css.ident.none && !Css.isDefaultingValue(float)) ||\n isRoot\n ) {\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 getComputedDisplayValue(display, position, float, isRoot).display ===\n Css.ident.block\n );\n}\n\nexport function isInlineLevel(display: Css.Ident | string): 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 | string): 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 && !Css.isDefaultingValue(float)) ||\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.grid ||\n display == Css.ident.flow_root ||\n ((display === Css.ident.block || display === Css.ident.list_item) &&\n !!overflow &&\n overflow !== Css.ident.visible &&\n overflow !== Css.ident.clip &&\n !Css.isDefaultingValue(overflow)) ||\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 LayoutHelper - Helper functions of Layout.\n */\nimport * as Base from \"./base\";\nimport * as Display from \"./display\";\nimport * as Logging from \"./logging\";\nimport * as VtreeImpl from \"./vtree\";\nimport { Layout, Vtree } from \"./types\";\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\n // NOTE: Do not replace `node.nodeType === 1` with `node instanceof Element`,\n // which does not work when the node is inside iframe. (Issue #1000)\n\n const element = node.nodeType === 1 ? (node as Element) : node.parentElement;\n if (element && element.namespaceURI === Base.NS.XHTML) {\n if (element.localName === \"rt\" && (element as HTMLElement).style[\"zoom\"]) {\n // \"zoom\" is set in fixRubyTextFontSize() to fix the issue #673 for Chrome.\n // when zoom is set, it is hard to get the edge value, so return NaN.\n // (Fix for issues #804 and #808)\n return NaN;\n }\n if (\n /^([\\d\\.]|super|(text-)?top)/.test(\n (element as HTMLElement).style.verticalAlign,\n )\n ) {\n // (Fix for issue #811)\n return NaN;\n }\n }\n if (node === element) {\n if (nodeContext.after || !nodeContext.inline) {\n if (\n nodeContext.after &&\n !nodeContext.inline &&\n element.querySelector(\"ruby\")\n ) {\n // Workaround for issue #987 (unnecessary break caused by ruby)\n const parentNode = element.parentNode;\n const nextSibling = element.nextSibling;\n parentNode.removeChild(element);\n parentNode.insertBefore(element, nextSibling);\n }\n const cbox = clientLayout.getElementClientRect(element);\n if (\n cbox.left === 0 &&\n cbox.top === 0 &&\n cbox.right === 0 &&\n cbox.bottom === 0\n ) {\n // getBoundingClientRect() returns 0,0,0,0 for WBR element (Chrome)\n // (Fix for issue #802)\n return NaN;\n }\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 boxes = boxes.filter((box) => box.right > box.left && box.bottom > box.top);\n if (!boxes.length) {\n return NaN;\n }\n if (vertical) {\n edge = Math.min.apply(\n null,\n boxes.map((box) => box.left),\n );\n } else {\n edge = Math.max.apply(\n null,\n boxes.map((box) => box.bottom),\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 isOutOfFlow(node: Node): boolean {\n if (!(node?.nodeType === 1)) return false;\n const e = node as HTMLElement;\n if (isSpecial(e)) return true;\n const position = e.style?.position;\n return position === \"absolute\" || position === \"fixed\";\n}\n\nexport function isSpecialNodeContext(nodeContext: Vtree.NodeContext): boolean {\n const viewNode = nodeContext?.viewNode;\n return viewNode?.nodeType === 1 && isSpecial(viewNode as Element);\n}\n\nexport function isSpecialInlineDisplay(display: string): boolean {\n return (\n display !== \"inline\" &&\n (Display.isInlineLevel(display) || Display.isRubyInternalDisplay(display))\n );\n}\n\nexport function findAncestorSpecialInlineNodeContext(\n nodeContext: Vtree.NodeContext,\n): Vtree.NodeContext | null {\n for (let p = nodeContext.parent; p; p = p.parent) {\n if (p.display !== \"inline\" && Display.isInlineLevel(p.display)) {\n return p;\n }\n }\n return null;\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{\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 /** @override */\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{\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 override 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 override 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\n if (!this.position.after && !this.position.inline) {\n // Subtract marginBlockStart from the edge (Issue #611)\n const marginBlockStart = column.parseComputedLength(\n column.clientLayout.getElementComputedStyle(\n this.position.viewNode as Element,\n ).marginBlockStart,\n );\n this.edge -= (column.vertical ? -1 : 1) * marginBlockStart;\n }\n\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 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 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 /** @override */\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 /** @override */\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 /** @override */\n startNonInlineElementNode(nodeContext: Vtree.NodeContext): boolean {\n return false;\n }\n\n /** @override */\n afterNonInlineElementNode(\n nodeContext: Vtree.NodeContext,\n stopAtOverflow: boolean,\n ): boolean {\n return false;\n }\n\n /** @override */\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 // Fix for issue #740\n if (\n nodeContext.shadowType === Vtree.ShadowType.ROOTLESS &&\n LayoutHelper.isSpecialNodeContext(nodeContext)\n ) {\n return;\n }\n let node = nodeContext.viewNode;\n if (node.parentElement?.localName === \"viv-ts-inner\") {\n // special element for text-spacing\n node = node.parentElement.parentElement;\n }\n const parentNode = node.parentNode;\n LayoutHelper.removeFollowingSiblings(parentNode, node);\n if (removeSelf) {\n parentNode.removeChild(node);\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.layoutContext.processFragmentedBlockEdge(nodeContext);\n }\n return Task.newResult(true);\n }\n}\n\nexport class BlockFormattingContext\n implements LayoutProcessor.BlockFormattingContext\n{\n formattingContextType: FormattingContextType = \"Block\";\n\n constructor(private readonly parent: Vtree.FormattingContext) {}\n\n /** @override */\n getName(): string {\n return \"Block formatting context (BlockFormattingContext)\";\n }\n\n /** @override */\n isFirstTime(nodeContext: Vtree.NodeContext, firstTime: boolean): boolean {\n return firstTime;\n }\n\n /** @override */\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 =\n 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> =\n Task.newFrame(\"LayoutIterator\");\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 override startNonElementNode(\n state: LayoutIteratorState,\n ): void | Task.Result<boolean> {\n state.onStartEdges = false;\n }\n\n override 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 override 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 2021 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 TextPolyfill - CSS text-spacing and hanging-punctuation support.\n */\nimport * as Base from \"./base\";\nimport * as Css from \"./css\";\nimport * as Plugin from \"./plugin\";\nimport * as Vtree from \"./vtree\";\n\ntype PropertyValue = string | number | Css.Val;\n\ntype HangingPunctuation = {\n first: boolean;\n end: boolean; // force-end or allow-end\n allowEnd: boolean;\n last: boolean;\n};\n\nconst HANGING_PUNCTUATION_NONE: HangingPunctuation = {\n first: false,\n end: false,\n allowEnd: false,\n last: false,\n};\n\nfunction hangingPunctuationFromPropertyValue(\n value: PropertyValue,\n): HangingPunctuation {\n const cssval =\n value instanceof Css.Val\n ? value\n : typeof value === \"string\"\n ? Css.getName(value)\n : Css.ident.none;\n\n if (cssval === Css.ident.none) {\n return HANGING_PUNCTUATION_NONE;\n }\n const values = cssval instanceof Css.SpaceList ? cssval.values : [cssval];\n const hangingPunctuation: HangingPunctuation = Object.create(\n HANGING_PUNCTUATION_NONE,\n );\n\n for (const val of values) {\n if (val instanceof Css.Ident) {\n switch (val.name) {\n case \"first\":\n hangingPunctuation.first = true;\n break;\n case \"force-end\":\n hangingPunctuation.end = true;\n break;\n case \"allow-end\":\n hangingPunctuation.end = true;\n hangingPunctuation.allowEnd = true;\n break;\n case \"last\":\n hangingPunctuation.last = true;\n break;\n }\n }\n }\n return hangingPunctuation;\n}\n\nfunction isHangingPunctuationNone(\n hangingPunctuation: HangingPunctuation,\n): boolean {\n return (\n !hangingPunctuation.first &&\n !hangingPunctuation.last &&\n !hangingPunctuation.end\n );\n}\n\ntype SpacingTrim = {\n trimStart: boolean; // trim-start or space-first (not space-start)\n spaceFirst: boolean; // space-first (trim-start except at first line)\n trimEnd: boolean; // trim-end or allow-end (not space-end)\n allowEnd: boolean; // allow-end (not force-end)\n trimAdjacent: boolean;\n // TODO: add support for:\n // trimAll: boolean; // trim-all\n};\n\n/**\n * text-spacing-trim: space-all (none)\n * space-all (none) = space-start space-end space-adjacent\n */\nconst SPACING_TRIM_NONE: SpacingTrim = {\n trimStart: false,\n spaceFirst: false,\n trimEnd: false,\n allowEnd: false,\n trimAdjacent: false,\n};\n\n/**\n * text-spacing-trim: space-first (normal)\n * space-first (normal) = space-first trim-end trim-adjacent\n */\nconst SPACING_TRIM_NORMAL: SpacingTrim = {\n trimStart: true,\n spaceFirst: true,\n trimEnd: true,\n allowEnd: false,\n trimAdjacent: true,\n};\n\n/**\n * text-spacing-trim: trim-auto (auto)\n * trim-auto (auto) = trim-start trim-end trim-adjacent\n */\nconst SPACING_TRIM_AUTO: SpacingTrim = {\n trimStart: true,\n spaceFirst: false,\n trimEnd: true,\n allowEnd: false,\n trimAdjacent: true,\n};\n\nfunction spacingTrimFromPropertyValue(value: PropertyValue): SpacingTrim {\n const cssval =\n value instanceof Css.Val\n ? value\n : typeof value === \"string\"\n ? Css.getName(value)\n : Css.ident.normal;\n\n if (cssval === Css.ident.normal) {\n return SPACING_TRIM_NORMAL;\n }\n if (cssval === Css.ident.none) {\n return SPACING_TRIM_NONE;\n }\n if (cssval === Css.ident.auto) {\n return SPACING_TRIM_AUTO;\n }\n const values = cssval instanceof Css.SpaceList ? cssval.values : [cssval];\n const textSpacing: SpacingTrim = Object.create(SPACING_TRIM_AUTO);\n\n for (const val of values) {\n if (val instanceof Css.Ident) {\n switch (val.name) {\n case \"trim-auto\":\n return SPACING_TRIM_AUTO;\n case \"space-all\":\n return SPACING_TRIM_NONE;\n case \"trim-start\":\n textSpacing.trimStart = true;\n textSpacing.spaceFirst = false;\n break;\n case \"space-start\":\n textSpacing.trimStart = false;\n textSpacing.spaceFirst = false;\n break;\n case \"space-first\":\n textSpacing.trimStart = true;\n textSpacing.spaceFirst = true;\n break;\n case \"trim-end\":\n textSpacing.trimEnd = true;\n textSpacing.allowEnd = false;\n break;\n case \"space-end\":\n textSpacing.trimEnd = false;\n textSpacing.allowEnd = false;\n break;\n case \"allow-end\":\n textSpacing.trimEnd = true;\n textSpacing.allowEnd = true;\n break;\n case \"trim-adjacent\":\n textSpacing.trimAdjacent = true;\n break;\n case \"space-adjacent\":\n textSpacing.trimAdjacent = false;\n break;\n }\n }\n }\n\n return textSpacing;\n}\n\ntype Autospace = {\n ideographAlpha: boolean;\n ideographNumeric: boolean;\n // TODO: add support for:\n // punctuation: boolean;\n // replace: boolean;\n};\n\n/**\n * text-autospace: no-autospace (none)\n */\nconst AUTOSPACE_NONE: Autospace = {\n ideographAlpha: false,\n ideographNumeric: false,\n};\n\n/**\n * text-autospace: normal\n */\nconst AUTOSPACE_NORMAL: Autospace = {\n ideographAlpha: true,\n ideographNumeric: true,\n};\n\nfunction autospaceFromPropertyValue(value: PropertyValue): Autospace {\n const cssval =\n value instanceof Css.Val\n ? value\n : typeof value === \"string\"\n ? Css.getName(value)\n : Css.ident.normal;\n\n if (cssval === Css.ident.normal || cssval === Css.ident.auto) {\n return AUTOSPACE_NORMAL;\n }\n if (cssval === Css.ident.none) {\n return AUTOSPACE_NONE;\n }\n\n const values = cssval instanceof Css.SpaceList ? cssval.values : [cssval];\n const autospace: Autospace = Object.create(AUTOSPACE_NONE);\n\n for (const val of values) {\n if (val instanceof Css.Ident) {\n switch (val.name) {\n case \"no-autospace\":\n return AUTOSPACE_NONE;\n case \"ideograph-alpha\":\n autospace.ideographAlpha = true;\n break;\n case \"ideograph-numeric\":\n autospace.ideographNumeric = true;\n break;\n }\n }\n }\n\n return autospace;\n}\n\nfunction isTextSpacingNone(\n autospace: Autospace,\n spacingTrim: SpacingTrim,\n): boolean {\n return (\n !autospace.ideographAlpha &&\n !autospace.ideographNumeric &&\n !spacingTrim.trimStart &&\n !spacingTrim.trimEnd &&\n !spacingTrim.trimAdjacent\n );\n}\n\nfunction normalizeLang(lang: string): string | null {\n if (lang) {\n // Normalize CJK lang\n lang = lang.toLowerCase();\n if (/^zh\\b.*-(hant|tw|hk)\\b/.test(lang)) {\n return \"zh-hant\";\n }\n if (/^zh\\b/.test(lang)) {\n return \"zh-hans\";\n }\n if (/^ja\\b/.test(lang)) {\n return \"ja\";\n }\n if (/^ko\\b/.test(lang)) {\n return \"ko\";\n }\n return lang;\n }\n return null;\n}\n\nconst embeddedContentTags = {\n audio: true,\n canvas: true,\n embed: true,\n iframe: true,\n img: true,\n math: true,\n object: true,\n picture: true,\n svg: true,\n video: true,\n};\n\nclass TextSpacingPolyfill {\n getPolyfilledInheritedProps() {\n return [\"hanging-punctuation\", \"text-autospace\", \"text-spacing-trim\"];\n }\n\n preprocessSingleDocument(document: Document): void {\n if (!document.body) {\n return;\n }\n this.preprocessForTextSpacing(document.body);\n }\n\n preprocessForTextSpacing(element: Element): void {\n // Split text nodes by punctuations and ideograph/non-ideograph boundary\n const nodeIter = element.ownerDocument.createNodeIterator(\n element,\n NodeFilter.SHOW_TEXT,\n );\n for (let node = nodeIter.nextNode(); node; node = nodeIter.nextNode()) {\n if (\n node.parentElement.namespaceURI !== Base.NS.XHTML ||\n node.parentElement.dataset?.[\"mathTypeset\"] === \"true\"\n ) {\n continue;\n }\n const textArr = node.textContent\n .replace(\n /(?![()\\[\\]{}])[\\p{Ps}\\p{Pe}\\p{Pf}\\p{Pi}、。,.:;、。\\u3000]\\p{M}*(?=\\P{M})|.(?=(?![()\\[\\]{}])[\\p{Ps}\\p{Pe}\\p{Pf}\\p{Pi}、。,.:;、。\\u3000])|(?!\\p{P})[\\p{sc=Han}\\u3041-\\u30FF\\u31C0-\\u31FF]\\p{M}*(?=(?![\\p{sc=Han}\\u3041-\\u30FF\\u31C0-\\u31FF\\uFF01-\\uFF60])[\\p{L}\\p{Nd}])|(?![\\p{sc=Han}\\u3041-\\u30FF\\u31C0-\\u31FF\\uFF01-\\uFF60])[\\p{L}\\p{Nd}]\\p{M}*(?=(?!\\p{P})[\\p{sc=Han}\\u3041-\\u30FF\\u31C0-\\u31FF])/gsu,\n \"$&\\x00\",\n )\n .split(\"\\x00\");\n\n if (textArr.length > 1) {\n const lastIndex = textArr.length - 1;\n for (let i = 0; i < lastIndex; i++) {\n node.parentNode.insertBefore(\n document.createTextNode(textArr[i]),\n node,\n );\n }\n node.textContent = textArr[lastIndex];\n }\n }\n }\n\n processGeneratedContent(\n element: HTMLElement,\n autospaceVal: Css.Val,\n spacingTrimVal: Css.Val,\n hangingPunctuationVal: Css.Val,\n lang: string,\n vertical: boolean,\n ): void {\n lang = normalizeLang(lang);\n const autospace = autospaceFromPropertyValue(autospaceVal);\n const spacingTrim = spacingTrimFromPropertyValue(spacingTrimVal);\n const hangingPunctuation = hangingPunctuationFromPropertyValue(\n hangingPunctuationVal,\n );\n\n if (\n isHangingPunctuationNone(hangingPunctuation) &&\n isTextSpacingNone(autospace, spacingTrim)\n ) {\n return;\n }\n\n this.preprocessForTextSpacing(element);\n\n const whiteSpaceSave = element.style.whiteSpace;\n if ((vertical ? element.offsetHeight : element.offsetWidth) === 0) {\n // Prevent wrong line wrapping\n element.style.whiteSpace = \"pre\";\n }\n\n const nodeIter = element.ownerDocument.createNodeIterator(\n element,\n NodeFilter.SHOW_TEXT,\n );\n let prevNode: Node = null;\n let nextNode: Node = null;\n for (let node = nodeIter.nextNode(); node; node = nextNode) {\n nextNode = nodeIter.nextNode();\n const isFirstInBlock = !prevNode;\n const isFirstAfterForcedLineBreak =\n !prevNode || /\\n$/.test(prevNode.textContent);\n const isLastBeforeForcedLineBreak =\n !nextNode || /^\\n/.test(nextNode.textContent);\n const isLastInBlock = !nextNode;\n this.processTextSpacing(\n node,\n isFirstInBlock || isFirstAfterForcedLineBreak,\n isFirstInBlock,\n isFirstAfterForcedLineBreak,\n isLastBeforeForcedLineBreak,\n isLastInBlock,\n prevNode,\n nextNode,\n autospace,\n spacingTrim,\n hangingPunctuation,\n lang,\n vertical,\n );\n prevNode = node;\n }\n\n element.style.whiteSpace = whiteSpaceSave;\n }\n\n postLayoutBlock(\n nodeContext: Vtree.NodeContext,\n checkPoints: Vtree.NodeContext[],\n ): void {\n const isFirstFragment =\n !nodeContext ||\n (nodeContext.fragmentIndex === 1 && checkIfFirstInBlock());\n const isAfterForcedLineBreak =\n isFirstFragment || checkIfAfterForcedLineBreak();\n\n function isOutOfLine(node: Node): boolean {\n if (node?.nodeType !== 1) {\n return false;\n }\n const elem = node as HTMLElement;\n if (elem.hasAttribute(Vtree.SPECIAL_ATTR)) {\n return true;\n }\n const { position, float } = elem.style ?? {};\n return (\n position === \"absolute\" ||\n position === \"fixed\" ||\n (float && float !== \"none\")\n );\n }\n\n function checkIfFirstInBlock(): boolean {\n let p = checkPoints[0];\n let viewNode = p.viewNode;\n while (p && p.inline) {\n p = p.parent;\n }\n if (p?.fragmentIndex !== 1) {\n return false;\n }\n for (\n let prev = viewNode.previousSibling;\n prev;\n prev = prev.previousSibling\n ) {\n if (!isOutOfLine(prev)) {\n return false;\n }\n }\n return true;\n }\n\n function checkIfAfterForcedLineBreak(): boolean {\n let p = checkPoints[0];\n let prevNode: Node;\n while (p && p.inline) {\n prevNode = p.sourceNode?.previousSibling;\n if (prevNode) {\n if (\n prevNode.nodeType === 3 &&\n /^[ \\t\\r\\n\\f]*$/.test(prevNode.textContent) &&\n p.whitespace !== Vtree.Whitespace.PRESERVE\n ) {\n prevNode = prevNode.previousSibling;\n }\n if (prevNode) {\n break;\n }\n }\n p = p.parent;\n }\n\n while (prevNode) {\n if (prevNode.nodeType === 1) {\n if ((prevNode as Element).localName === \"br\") {\n return true;\n }\n } else if (prevNode.nodeType === 3) {\n if (p.whitespace === Vtree.Whitespace.PRESERVE) {\n if (/\\n$/.test(prevNode.textContent)) {\n return true;\n }\n } else if (p.whitespace === Vtree.Whitespace.NEWLINE) {\n if (/\\n[ \\t\\r\\n\\f]*$/.test(prevNode.textContent)) {\n return true;\n }\n }\n }\n prevNode = prevNode.lastChild;\n }\n return false;\n }\n\n for (let i = 0; i < checkPoints.length; i++) {\n const p = checkPoints[i];\n if (\n !p.after &&\n p.inline &&\n !p.display &&\n p.parent &&\n p.viewNode.parentNode &&\n p.viewNode.nodeType === Node.TEXT_NODE &&\n !Vtree.canIgnore(p.viewNode, p.whitespace)\n ) {\n const lang = normalizeLang(\n p.lang ??\n p.parent.lang ??\n nodeContext?.lang ??\n nodeContext?.parent?.lang,\n );\n const autospace = autospaceFromPropertyValue(\n p.inheritedProps[\"text-autospace\"],\n );\n const spacingTrim = spacingTrimFromPropertyValue(\n p.inheritedProps[\"text-spacing-trim\"],\n );\n const hangingPunctuation = hangingPunctuationFromPropertyValue(\n p.inheritedProps[\"hanging-punctuation\"],\n );\n\n if (\n isHangingPunctuationNone(hangingPunctuation) &&\n isTextSpacingNone(autospace, spacingTrim)\n ) {\n continue;\n }\n if (/\\b(flex|grid)\\b/.test(p.parent.display)) {\n // Cannot process if parent is flex or grid. (Issue #926)\n continue;\n }\n\n let prevNode: Node = null;\n let nextNode: Node = null;\n let isFirstAfterBreak = i === 0;\n let isFirstInBlock = i === 0 && isFirstFragment;\n let isFirstAfterForcedLineBreak = i === 0 && isAfterForcedLineBreak;\n let isLastBeforeForcedLineBreak = false;\n let isLastInBlock = false;\n\n function checkIfFirstAfterForcedLineBreak(\n prevP: Vtree.NodeContext,\n ): boolean {\n if (prevP.viewNode?.nodeType === 1) {\n return (prevP.viewNode as Element).localName === \"br\";\n }\n if (prevP.viewNode?.nodeType === 3) {\n if (prevP.whitespace === Vtree.Whitespace.PRESERVE) {\n if (/\\n$/.test(prevP.viewNode.textContent)) {\n return true;\n }\n } else if (prevP.whitespace === Vtree.Whitespace.NEWLINE) {\n if (/\\n[ \\t\\r\\n\\f]*$/.test(prevP.viewNode.textContent)) {\n return true;\n }\n }\n if (\n (prevP.viewNode as Element).previousElementSibling?.localName ===\n \"br\"\n ) {\n return Vtree.canIgnore(prevP.viewNode, prevP.whitespace);\n }\n }\n return false;\n }\n\n function checkIfLastBeforeForcedLineBreak(\n nextP: Vtree.NodeContext,\n ): boolean {\n if (nextP.viewNode?.nodeType === 1) {\n return (nextP.viewNode as Element).localName === \"br\";\n }\n if (nextP.viewNode?.nodeType === 3) {\n if (nextP.whitespace === Vtree.Whitespace.PRESERVE) {\n if (/^\\n/.test(nextP.viewNode.textContent)) {\n return true;\n }\n } else if (nextP.whitespace === Vtree.Whitespace.NEWLINE) {\n if (/^[ \\t\\r\\n\\f]*\\n/.test(nextP.viewNode.textContent)) {\n return true;\n }\n }\n if (\n (nextP.viewNode as Element).nextElementSibling?.localName === \"br\"\n ) {\n return Vtree.canIgnore(nextP.viewNode, nextP.whitespace);\n }\n }\n return false;\n }\n\n for (let prev = i - 1; prev >= 0; prev--) {\n const prevP = checkPoints[prev];\n if (checkIfFirstAfterForcedLineBreak(prevP)) {\n isFirstAfterForcedLineBreak = true;\n break;\n }\n if (\n !prevP.display &&\n prevP.viewNode.nodeType === Node.TEXT_NODE &&\n prevP.viewNode.textContent.length > 0\n ) {\n prevNode = prevP.viewNode;\n break;\n }\n if (\n (prevP.display && !/^(inline|ruby)\\b/.test(prevP.display)) ||\n (prevP.viewNode?.nodeType === 1 &&\n ((prevP.viewNode as Element).localName === \"br\" ||\n embeddedContentTags[(prevP.viewNode as Element).localName]))\n ) {\n break;\n }\n if (prev === 0) {\n isFirstAfterBreak = true;\n if (isFirstFragment) {\n isFirstInBlock = true;\n isFirstAfterForcedLineBreak = true;\n }\n }\n }\n for (let next = i + 1; next < checkPoints.length; next++) {\n const nextP = checkPoints[next];\n if (checkIfLastBeforeForcedLineBreak(nextP)) {\n isLastBeforeForcedLineBreak = true;\n break;\n }\n if (\n nextP.viewNode !== p.viewNode &&\n !nextP.display &&\n nextP.viewNode.nodeType === Node.TEXT_NODE &&\n nextP.viewNode.textContent.length > 0\n ) {\n nextNode = nextP.viewNode;\n break;\n }\n if (\n (nextP.display && !/^(inline|ruby)\\b/.test(nextP.display)) ||\n (nextP.viewNode?.nodeType === 1 &&\n ((nextP.viewNode as Element).localName === \"br\" ||\n embeddedContentTags[(nextP.viewNode as Element).localName]))\n ) {\n if (\n next === checkPoints.length - 1 &&\n isOutOfLine(nextP.viewNode)\n ) {\n isLastInBlock = true;\n }\n break;\n }\n if (next === checkPoints.length - 1) {\n isLastBeforeForcedLineBreak = true;\n isLastInBlock = true;\n for (\n let nextNext = nextP.viewNode.nextSibling;\n nextNext;\n nextNext = nextNext.nextSibling\n ) {\n if (!isOutOfLine(nextNext)) {\n isLastInBlock = false;\n break;\n }\n }\n }\n }\n this.processTextSpacing(\n p.viewNode,\n isFirstAfterBreak,\n isFirstInBlock,\n isFirstAfterForcedLineBreak,\n isLastBeforeForcedLineBreak,\n isLastInBlock,\n prevNode,\n nextNode,\n autospace,\n spacingTrim,\n hangingPunctuation,\n lang,\n p.vertical,\n );\n }\n }\n }\n\n private processTextSpacing(\n textNode: Node,\n isFirstAfterBreak: boolean,\n isFirstInBlock: boolean,\n isFirstAfterForcedLineBreak: boolean,\n isLastBeforeForcedLineBreak: boolean,\n isLastInBlock: boolean,\n prevNode: Node,\n nextNode: Node,\n autospace: Autospace,\n spacingTrim: SpacingTrim,\n hangingPunctuation: HangingPunctuation,\n lang: string,\n vertical: boolean,\n ): void {\n const text = textNode.textContent;\n const document = textNode.ownerDocument;\n let currRange: Range;\n let prevRange: Range;\n let nextRange: Range;\n\n function isAtStartOfLine(): boolean {\n if (isFirstAfterBreak) {\n return true;\n }\n if (!prevNode) {\n return false;\n }\n if (!currRange) {\n currRange = document.createRange();\n currRange.selectNode(textNode);\n }\n const rect = currRange.getClientRects()[0];\n if (!prevRange) {\n prevRange = document.createRange();\n prevRange.selectNode(prevNode);\n }\n const prevRects = prevRange.getClientRects();\n const prevRect = prevRects[prevRects.length - 1];\n if (!rect || !prevRect) {\n return false;\n }\n return vertical\n ? rect.top < prevRect.top + prevRect.height - rect.width ||\n rect.left + rect.width < prevRect.left + rect.width / 10 ||\n rect.left > prevRect.left + prevRect.width - rect.width / 10\n : rect.left < prevRect.left + prevRect.width - rect.height ||\n rect.top > prevRect.top + prevRect.height - rect.height / 10 ||\n rect.top + rect.height < prevRect.top + rect.height / 10;\n }\n\n function isAtEndOfLine(): boolean {\n if (!nextNode) {\n return false;\n }\n if (!currRange) {\n currRange = document.createRange();\n currRange.selectNode(textNode);\n }\n const rect = currRange.getClientRects()[0];\n if (!nextRange) {\n nextRange = document.createRange();\n nextRange.selectNode(nextNode);\n }\n const nextRect = nextRange.getClientRects()[0];\n if (!rect || !nextRect) {\n return false;\n }\n return vertical\n ? rect.top + rect.height > nextRect.top + rect.width ||\n rect.left > nextRect.left + nextRect.width - rect.width / 10 ||\n rect.left + rect.width < nextRect.left + rect.width / 10\n : rect.left + rect.width > nextRect.left + rect.height ||\n rect.top + rect.height < nextRect.top + rect.height / 10 ||\n rect.top > nextRect.top + nextRect.height - rect.height / 10;\n }\n\n let punctProcessing = false;\n let hangingFirst = false;\n let hangingLast = false;\n let hangingEnd = false;\n let tagName: \"viv-ts-open\" | \"viv-ts-close\";\n\n if (\n isFirstInBlock &&\n hangingPunctuation.first &&\n /^[\\p{Ps}\\p{Pf}\\p{Pi}'\"\\u3000]\\p{M}*$/u.test(text)\n ) {\n // hanging-punctuation: first\n tagName = \"viv-ts-open\";\n punctProcessing = true;\n hangingFirst = true;\n } else if (\n isLastInBlock &&\n hangingPunctuation.last &&\n /^[\\p{Pe}\\p{Pf}\\p{Pi}'\"]\\p{M}*$/u.test(text)\n ) {\n // hanging-punctuation: last\n tagName = \"viv-ts-close\";\n punctProcessing = true;\n hangingLast = true;\n } else if (hangingPunctuation.end && /^[、。,.、。]\\p{M}*$/u.test(text)) {\n // hanging-punctuation: force-end | allow-end\n tagName = \"viv-ts-close\";\n punctProcessing = true;\n hangingEnd = true;\n } else if (\n (spacingTrim.trimStart || spacingTrim.trimAdjacent) &&\n /^[‘“〝([{⦅〈〈《「『【〔〖〘〚]\\p{M}*$/u.test(text)\n ) {\n // fullwidth opening punctuation\n tagName = \"viv-ts-open\";\n punctProcessing = true;\n } else if (\n (spacingTrim.trimEnd || spacingTrim.trimAdjacent) &&\n (/^[’”〞〟)]}⦆〉〉》」』】〕〗〙〛]\\p{M}*$/u.test(text) ||\n (lang === \"zh-hans\" && /^[:;]\\p{M}*$/u.test(text)) ||\n (lang !== \"zh-hant\" && /^[、。,.]\\p{M}*$/u.test(text)))\n ) {\n // fullwidth closing punctuation\n tagName = \"viv-ts-close\";\n punctProcessing = true;\n }\n\n if (punctProcessing) {\n if (textNode.parentElement.localName === \"viv-ts-inner\") {\n // Already processed\n return;\n }\n // Wrap the textNode as `<{tagName}><viv-ts-inner>{text}<viv-ts-inner></{tagName}>`\n const outerElem = document.createElement(tagName);\n const innerElem = document.createElement(\"viv-ts-inner\");\n outerElem.appendChild(innerElem);\n textNode.parentNode.insertBefore(outerElem, textNode);\n innerElem.appendChild(textNode);\n\n // Check if che punctuation is almost full width\n const fontSize = parseFloat(\n document.defaultView.getComputedStyle(outerElem).fontSize,\n );\n const fullWidthThreshold = fontSize * 0.7;\n const isFullWidth =\n (vertical ? innerElem.offsetHeight : innerElem.offsetWidth) >\n fullWidthThreshold;\n\n function linePosition(): number {\n return vertical ? outerElem.offsetLeft : outerElem.offsetTop;\n }\n\n if (isFullWidth || hangingFirst || hangingLast || hangingEnd) {\n if (tagName === \"viv-ts-open\") {\n if (hangingFirst) {\n outerElem.className = \"viv-hang-first\";\n } else if (isFirstInBlock || isFirstAfterForcedLineBreak) {\n if (spacingTrim.trimStart && !spacingTrim.spaceFirst) {\n outerElem.className = \"viv-ts-trim\";\n } else {\n outerElem.className = \"viv-ts-space\";\n }\n } else if (!spacingTrim.trimStart && isAtStartOfLine()) {\n outerElem.className = \"viv-ts-space\";\n } else if (\n spacingTrim.trimAdjacent &&\n prevNode &&\n /[\\p{Ps}\\p{Pi}\\p{Pe}\\p{Pf}\\u00B7\\u2027\\u30FB\\u3000:;、。,.]\\p{M}*$/u.test(\n prevNode.textContent,\n ) &&\n // exclude non-fullwidth closing punctuations (Issue #1003)\n (!/[\\p{Pe}\\p{Pf}]\\p{M}*$/u.test(prevNode.textContent) ||\n (prevNode.parentElement.localName === \"viv-ts-inner\" &&\n (vertical\n ? prevNode.parentElement.offsetHeight\n : prevNode.parentElement.offsetWidth) > fullWidthThreshold))\n ) {\n outerElem.className = \"viv-ts-trim\";\n } else if (spacingTrim.trimStart && isAtStartOfLine()) {\n const linePos = linePosition();\n outerElem.className = \"viv-ts-auto\";\n if (linePos === linePosition() && !isAtStartOfLine()) {\n // workaround for issues #1005 and #1010\n outerElem.className = \"viv-ts-trim\";\n }\n }\n } else if (tagName === \"viv-ts-close\") {\n if (hangingLast) {\n outerElem.className = isFullWidth\n ? \"viv-hang-last\"\n : \"viv-hang-last viv-hang-hw\";\n } else if (isLastInBlock || isLastBeforeForcedLineBreak) {\n if (hangingEnd) {\n const { offsetLeft, offsetTop } = outerElem;\n outerElem.className = isFullWidth\n ? \"viv-hang-end\"\n : \"viv-hang-end viv-hang-hw\";\n if (\n outerElem.offsetLeft === offsetLeft &&\n outerElem.offsetTop === offsetTop\n ) {\n outerElem.className = \"\";\n }\n } else if (spacingTrim.trimEnd) {\n outerElem.className = \"viv-ts-trim\";\n } else {\n outerElem.className = \"viv-ts-space\";\n }\n } else if (\n nextNode &&\n /^[\\p{Pe}\\p{Pf}\\u00B7\\u2027\\u30FB\\u3000:;、。,.]/u.test(\n nextNode.textContent,\n )\n ) {\n if (isFullWidth && spacingTrim.trimAdjacent) {\n outerElem.className = \"viv-ts-trim\";\n }\n } else if (hangingEnd) {\n const atEnd = isAtEndOfLine();\n const atEndNoHang = atEnd && hangingPunctuation.allowEnd;\n if (!atEndNoHang) {\n outerElem.className = isFullWidth\n ? \"viv-hang-end\"\n : \"viv-hang-end viv-hang-hw\";\n }\n if (!isFullWidth) {\n if (!atEnd && !isAtEndOfLine()) {\n outerElem.className = \"\";\n }\n } else if (\n atEndNoHang &&\n spacingTrim.trimEnd &&\n !spacingTrim.allowEnd\n ) {\n outerElem.className = \"viv-ts-auto\";\n } else if (!atEndNoHang && !isAtEndOfLine()) {\n outerElem.className = \"\";\n } else if (!atEnd && hangingPunctuation.allowEnd) {\n if (!spacingTrim.trimEnd || spacingTrim.allowEnd) {\n outerElem.className = \"viv-ts-space\";\n if (!isAtEndOfLine()) {\n if (spacingTrim.trimEnd) {\n outerElem.className = \"viv-ts-auto\";\n if (!isAtEndOfLine()) {\n outerElem.className = \"viv-hang-end\";\n }\n } else {\n outerElem.className = \"viv-hang-end\";\n }\n }\n } else {\n outerElem.className = \"viv-ts-auto\";\n if (!isAtEndOfLine()) {\n outerElem.className = \"viv-hang-end\";\n }\n }\n }\n } else if (spacingTrim.trimEnd) {\n if (isAtEndOfLine()) {\n if (spacingTrim.allowEnd) {\n outerElem.className = \"viv-ts-space\";\n } else {\n outerElem.className = \"viv-ts-auto\";\n }\n } else {\n const linePos = linePosition();\n outerElem.className = \"viv-ts-auto\";\n if (linePos === linePosition()) {\n outerElem.className = \"\";\n }\n }\n }\n }\n }\n }\n\n let spaceIdeoAlnumProcessing = false;\n\n function checkUpright(elem: Element): boolean {\n const style = elem?.ownerDocument.defaultView?.getComputedStyle(elem);\n return (\n !!style &&\n (style.textOrientation === \"upright\" ||\n style.textCombineUpright === \"all\" ||\n style[\"-webkit-text-combine\"] === \"horizontal\")\n );\n }\n\n function checkNonZeroMarginBorderPadding(\n node1: Node,\n node2: Node,\n ): boolean {\n if (node1.nodeType === 1) {\n const style = document.defaultView.getComputedStyle(node1 as Element);\n if (\n parseFloat(style.marginInlineEnd) ||\n parseFloat(style.borderInlineEndWidth) ||\n parseFloat(style.paddingInlineEnd)\n ) {\n return true;\n }\n }\n const parent1 = node1.parentElement;\n if (parent1 && !parent1.contains(node2)) {\n return checkNonZeroMarginBorderPadding(parent1, node2);\n }\n if (node2.nodeType === 1) {\n const style = document.defaultView.getComputedStyle(node2 as Element);\n if (\n parseFloat(style.marginInlineStart) ||\n parseFloat(style.borderInlineStartWidth) ||\n parseFloat(style.paddingInlineStart)\n ) {\n return true;\n }\n }\n const parent2 = node2.parentElement;\n if (parent2 && !parent2.contains(node1)) {\n return checkNonZeroMarginBorderPadding(node1, parent2);\n }\n return false;\n }\n\n if (autospace.ideographAlpha || autospace.ideographNumeric) {\n if (\n prevNode &&\n /^(?!\\p{P})[\\p{sc=Han}\\u3041-\\u30FF\\u31C0-\\u31FF]/u.test(text) &&\n ((autospace.ideographAlpha &&\n /(?![\\p{sc=Han}\\u3041-\\u30FF\\u31C0-\\u31FF\\uFF01-\\uFF60])\\p{L}\\p{M}*$/u.test(\n prevNode.textContent,\n )) ||\n (autospace.ideographNumeric &&\n /(?![\\uFF01-\\uFF60])\\p{Nd}\\p{M}*$/u.test(prevNode.textContent))) &&\n !(vertical && checkUpright(prevNode.parentElement)) &&\n !checkNonZeroMarginBorderPadding(prevNode, textNode)\n ) {\n textNode.parentNode.insertBefore(\n document.createElement(\"viv-ts-thin-sp\"),\n textNode,\n );\n spaceIdeoAlnumProcessing = true;\n }\n if (\n nextNode &&\n /(?!\\p{P})[\\p{sc=Han}\\u3041-\\u30FF\\u31C0-\\u31FF]\\p{M}*$/u.test(text) &&\n ((autospace.ideographAlpha &&\n /^(?![\\p{sc=Han}\\u3041-\\u30FF\\u31C0-\\u31FF\\uFF01-\\uFF60])\\p{L}/u.test(\n nextNode.textContent,\n )) ||\n (autospace.ideographNumeric &&\n /^(?![\\uFF01-\\uFF60])\\p{Nd}/u.test(nextNode.textContent))) &&\n !(vertical && checkUpright(nextNode.parentElement)) &&\n !checkNonZeroMarginBorderPadding(textNode, nextNode)\n ) {\n textNode.parentNode.insertBefore(\n document.createElement(\"viv-ts-thin-sp\"),\n textNode.nextSibling,\n );\n spaceIdeoAlnumProcessing = true;\n }\n }\n }\n\n registerHooks() {\n Plugin.registerHook(\n Plugin.HOOKS.POLYFILLED_INHERITED_PROPS,\n this.getPolyfilledInheritedProps.bind(this),\n );\n Plugin.registerHook(\n Plugin.HOOKS.PREPROCESS_SINGLE_DOCUMENT,\n this.preprocessSingleDocument.bind(this),\n );\n Plugin.registerHook(\n Plugin.HOOKS.POST_LAYOUT_BLOCK,\n this.postLayoutBlock.bind(this),\n true, // text-spacing must be processed before others (Issue #1105)\n );\n }\n}\n\nconst textPolyfill = new TextSpacingPolyfill();\ntextPolyfill.registerHooks();\n\nexport function preprocessForTextSpacing(element: Element): void {\n textPolyfill.preprocessForTextSpacing(element);\n}\n\nexport function processGeneratedContent(\n element: HTMLElement,\n textAutospace: Css.Val,\n textSpacingTrim: Css.Val,\n hangingPunctuation: Css.Val,\n lang: string,\n vertical: boolean,\n): void {\n textPolyfill.processGeneratedContent(\n element,\n textAutospace,\n textSpacingTrim,\n hangingPunctuation,\n lang,\n vertical,\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 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 TextPolyfill from \"./text-polyfill\";\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 /** @override */\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 /** @override */\n processContent(\n element: Element,\n styles: { [key: string]: Css.Val },\n viewNode: Node,\n ) {\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 // text-spacing & hanging-punctuation support\n TextPolyfill.preprocessForTextSpacing(element);\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{\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{\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 /** @override */\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{\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 override findAcceptableBreak(\n column: Column,\n penalty: number,\n ): 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 override getMinBreakPenalty(): number {\n return this.penalty;\n }\n\n override 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 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 =\n null;\n blockDistanceToBlockEndFloats: number = NaN;\n breakAtTheEdgeBeforeFloat: string | null = null;\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\n ? this.rtl\n ? this.endEdge\n : this.startEdge\n : this.beforeEdge;\n }\n\n getBottomEdge(): number {\n return this.vertical\n ? this.rtl\n ? this.startEdge\n : this.endEdge\n : this.afterEdge;\n }\n\n getLeftEdge(): number {\n return this.vertical\n ? this.afterEdge\n : this.rtl\n ? this.endEdge\n : this.startEdge;\n }\n\n getRightEdge(): number {\n return this.vertical\n ? this.beforeEdge\n : this.rtl\n ? this.startEdge\n : 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 =\n 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 =\n this.calculateOffsetInNodeForNodeContext(position);\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 let firstLetterLength = r ? r[0].length : 0;\n if (\n !r &&\n position.sourceNode?.nodeType === 3 &&\n position.sourceNode.nextSibling?.nodeType === 3 &&\n text === position.sourceNode.textContent\n ) {\n // The text '“Foo' may be split to '“' and 'Foo'\n const text2 = text + position.sourceNode.nextSibling.textContent;\n const r2 = text2.match(Base.firstLetterPattern);\n if (r2) {\n const firstLetterText = r2[0];\n firstLetterLength = firstLetterText.length;\n position.sourceNode.textContent = firstLetterText;\n position.viewNode.textContent = firstLetterText;\n position.sourceNode.nextSibling.textContent =\n text2.substr(firstLetterLength);\n }\n }\n return this.layoutContext.peelOff(position, firstLetterLength);\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 (\n this.isFloatNodeContext(position) &&\n // Exclude normal floats (fix for issue #611)\n (PageFloats.isPageFloat(position.floatReference) ||\n position.floatSide === \"footnote\")\n ) {\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\" || f === \"none\") {\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 let foundNonZeroWidthBand = false;\n\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 // Hacky workaround for issue #1071\n // (Top page float should not absorb margin/border/padding of the block below)\n if (!foundNonZeroWidthBand) {\n if (band.x1 >= x2 || band.x2 <= x1) {\n Base.setCSSProperty(band.right, \"float\", \"none\");\n } else {\n foundNonZeroWidthBand = true;\n }\n }\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 = PageFloats.resolveInlineFloatDirection(\n nodeContext.floatSide,\n nodeContext.vertical,\n nodeContext.direction,\n );\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.rtl ? this.endEdge : this.startEdge;\n let x2 = this.rtl ? this.startEdge : 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(\n this.rtl ? this.getEndEdge(parentBox) : this.getStartEdge(parentBox),\n x1,\n );\n x2 = Math.min(\n this.rtl ? this.getStartEdge(parentBox) : this.getEndEdge(parentBox),\n x2,\n );\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 if (!nodeContext.firstPseudo) {\n // Unless float is specified on ::first-letter (Fix for issue #923)\n parent.viewNode.appendChild(nodeContext.viewNode);\n }\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 =\n 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.rtl = floatContainer.rtl;\n area.marginLeft = area.marginRight = area.marginTop = area.marginBottom = 0;\n area.borderLeft = area.borderRight = area.borderTop = area.borderBottom = 0;\n area.paddingLeft =\n area.paddingRight =\n area.paddingTop =\n area.paddingBottom =\n 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 =\n 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 =\n context.getStashedFloatFragments(floatReference);\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 =\n 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 =\n 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 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> =\n Task.newFrame(\"processLineStyling\");\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 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 // Text-spacing etc. must be done before calculating edge. (Issue #898)\n this.postLayoutBlock(resNodeContext, checkPoints);\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 // Text-spacing etc. must be done before calculating edge. (Issue #898)\n // this.postLayoutBlock(nodeContext, checkPoints);\n\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 (\n viewNode.nodeType != 1 &&\n viewNode.parentElement?.localName !== \"viv-ts-inner\"\n ) {\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 } else {\n // Fix for issue #821, #885\n const p = LayoutHelper.findAncestorSpecialInlineNodeContext(nodeContext);\n if (p) {\n if (\n this.breakPositions?.[0] instanceof BoxBreakPosition &&\n p?.viewNode.contains(this.breakPositions[0].checkPoints[0].viewNode)\n ) {\n // Prevent breaks at beginning of the column\n return null;\n }\n // Prevent breaks inside inline-blocks\n nodeContext = p;\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 elements\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 const element = node.nodeType === 1 ? (node as Element) : null;\n if (!element) {\n if (!haveStart) {\n if (node.parentNode == null) {\n endNotReached = false;\n } else {\n range.setStartBefore(node);\n haveStart = true;\n }\n }\n lastGood = node;\n } else if (wentUp) {\n wentUp = false;\n } else if (LayoutHelper.isSpecial(element)) {\n // Skip special\n seekRange = !haveStart;\n } else if (\n /^r(uby|[bt]c?)$/.test(element.localName) ||\n LayoutHelper.isSpecialInlineDisplay(\n this.clientLayout.getElementComputedStyle(element).display,\n )\n ) {\n // ruby, inline-block, etc.\n seekRange = !haveStart;\n if (seekRange) {\n if (element.localName === \"ruby\" && node.firstChild) {\n // Fix for issue #985\n node = node.firstChild;\n }\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 for (let nc = nodeContext; nc; nc = nc.parent) {\n if (\n !nc.inline &&\n Break.isCloneBoxDecorationBreak(nc.viewNode as Element)\n ) {\n const paddingBorders = this.getComputedPaddingBorder(\n nc.viewNode as Element,\n );\n clonedPaddingBorder += nc.vertical\n ? -paddingBorders.left\n : paddingBorders.bottom;\n if (nc.display === \"table\") {\n clonedPaddingBorder += (nc.vertical ? -1 : 1) * nc.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 // Workaround for issue #816 (Text with ruby overflowed at column/page break)\n const parentNode = this.element.parentNode;\n const nextSibling = this.element.nextSibling;\n parentNode.removeChild(this.element);\n parentNode.insertBefore(this.element, nextSibling);\n\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 =\n this.findFirstOverflowingEdgeAndCheckPoint(checkPoints);\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 // Workaround for the case of block child after text in parent block\n // (Issue #1036)\n let lastNode = checkPoints[checkPoints.length - 1].viewNode;\n if (lastNode?.parentElement.localName === \"viv-ts-inner\") {\n lastNode = lastNode.parentElement.parentElement;\n }\n if (\n (lineIndex === linePositions.length && lastNode.nextSibling) ||\n (lineIndex >= linePositions.length - 1 &&\n lastNode.parentElement.querySelector(\".MJXc-display\")) // for MathJax\n ) {\n // Prevent unnecessary page break before the last line\n // when a block box (may be generated by MathJax) exists\n // just after the text or inline box.\n widows = 0;\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(checkPoints: Vtree.NodeContext[]): {\n edge: number;\n checkPoint: Vtree.NodeContext | null;\n } {\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 as Element).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 (!nodeContext.floatSide) {\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 }\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?.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(): boolean {\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 &&\n Break.isForcedBreakValue(breakAtTheEdge) &&\n // prevent unnecessary breaks at the beginning of the column/page\n // after out-of-flow elements, e.g. position:absolute or running().\n // (Issue #1176)\n !atLeadingEdgeIgnoringOutOfFlow())\n );\n }\n\n function atLeadingEdgeIgnoringOutOfFlow(): boolean {\n if (!lastAfterNodeContext) {\n return false;\n }\n for (let nc = lastAfterNodeContext; nc?.parent; nc = nc.parent) {\n let node = nc.after ? nc.viewNode : nc.viewNode?.previousSibling;\n while (\n node &&\n (VtreeImpl.canIgnore(node, nc.parent.whitespace) ||\n LayoutHelper.isOutOfFlow(node))\n ) {\n node = node.previousSibling;\n }\n if (node) {\n return false;\n }\n }\n return true;\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 =\n 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 = (\n 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 (nodeContext.floatSide) {\n // Save break-after:avoid* value at before the float\n // (Fix for issue #904)\n this.breakAtTheEdgeBeforeFloat = Break.isAvoidBreakValue(\n breakAtTheEdge,\n )\n ? breakAtTheEdge\n : null;\n }\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 // Check break opportunity between anonymous block box and block-level box\n // (Issue #611)\n if (\n !nodeContext.inline &&\n (lastAfterNodeContext\n ? LayoutHelper.findAncestorSpecialInlineNodeContext(\n lastAfterNodeContext,\n )\n : this.breakPositions[\n this.breakPositions.length - 1\n ] instanceof BoxBreakPosition)\n ) {\n this.saveEdgeBreakPosition(\n nodeContext.copy(),\n breakAtTheEdge,\n false,\n );\n }\n if (\n !this.isBFC(nodeContext.formattingContext) ||\n RepetitiveElement.isInstanceOfRepetitiveElementsOwnerFormattingContext(\n nodeContext.formattingContext,\n ) ||\n this.isFloatNodeContext(nodeContext) ||\n nodeContext.flexContainer ||\n // Check empty block box (Issue #749)\n (!nodeContext.nodeShadow &&\n !(nodeContext.sourceNode as Element).firstElementChild &&\n VtreeImpl.canIgnore(\n nodeContext.sourceNode.firstChild,\n nodeContext.whitespace,\n ))\n ) {\n // new formatting context, or float or flex container,\n // or empty block box (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 = (\n 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 if (nodeContext.floatSide) {\n // Restore break-after:avoid* value at before the float\n // (Fix for issue #904)\n breakAtTheEdge =\n breakAtTheEdge ?? this.breakAtTheEdgeBeforeFloat;\n this.breakAtTheEdgeBeforeFloat = null;\n }\n const element = nodeContext.sourceNode as Element;\n // Make breakable after svg and math elements\n // (Fix for issue #750)\n if (\n element.localName === \"svg\" ||\n element.localName === \"math\" ||\n element.getAttribute(\"data-math-typeset\") === \"true\"\n ) {\n onStartEdges = false;\n lastAfterNodeContext = nodeContext.copy();\n trailingEdgeContexts.push(lastAfterNodeContext);\n breakAtTheEdge = Break.resolveEffectiveBreakValue(\n null,\n nodeContext.breakAfter,\n );\n this.checkOverflowAndSaveEdgeAndBreakPosition(\n lastAfterNodeContext,\n null,\n !this.stopAtOverflow,\n breakAtTheEdge,\n );\n break;\n }\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 (\n (nodeContext.pageType != nodeContext.parent?.pageType || // Fix for issue #771\n !Break.isForcedBreakValue(breakAtTheEdge)) && // Fix for issue #722\n !this.layoutConstraint.allowLayout(nodeContext)\n ) {\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 = (\n 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 =\n 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 =\n new LayoutProcessor.LayoutProcessorResolver().find(formattingContext);\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 ? this.rtl\n ? columnBBox.bottom\n : columnBBox.top\n : this.rtl\n ? columnBBox.right\n : columnBBox.left\n : 0;\n this.endEdge = columnBBox\n ? this.vertical\n ? this.rtl\n ? columnBBox.top\n : columnBBox.bottom\n : this.rtl\n ? columnBBox.left\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 let penalty = checkPoints[0].breakPenalty;\n if (penalty) {\n // Fix for issue #546\n let block = checkPoints[0];\n while (block.parent && block.inline) {\n block = block.parent;\n }\n penalty = block.breakPenalty;\n }\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 =\n this.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 =\n 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 =\n this.column.calculateClonedPaddingBorder(parentNodeContext);\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\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 override resolveLayoutMode(\n nodeContext: Vtree.NodeContext,\n ): Layout.LayoutMode {\n return new DefaultLayoutMode(\n this.leadingEdge,\n this.breakAfter,\n this.context,\n );\n }\n\n override prepareLayout(\n nodeContext: Vtree.NodeContext,\n column: Layout.Column,\n ) {\n column.fragmentLayoutConstraints = [];\n if (!column.pseudoParent) {\n Shared.clearRepetitiveElementsCache();\n }\n }\n\n override 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 override 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 override 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 /** @override */\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 /** @override */\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 /** @override */\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 override openAllViews(\n position: Vtree.NodePosition,\n ): 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{\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 /** @override */\n getName(): string {\n return \"Repetitive elements owner formatting context (RepetitiveElementsOwnerFormattingContext)\";\n }\n\n /** @override */\n isFirstTime(nodeContext: Vtree.NodeContext, firstTime: boolean): boolean {\n return firstTime;\n }\n\n /** @override */\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{\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 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 /** @override */\n abstract doLayout(\n nodeContext: Vtree.NodeContext,\n column: LayoutType.Column,\n ): Task.Result<Vtree.NodeContext>;\n\n /** @override */\n accept(nodeContext: Vtree.NodeContext, column: LayoutType.Column): boolean {\n return !!nodeContext;\n }\n\n /** @override */\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 /** @override */\n abstract doLayout(\n nodeContext: Vtree.NodeContext,\n column: LayoutType.Column,\n ): Task.Result<Vtree.NodeContext>;\n\n /** @override */\n accept(nodeContext: Vtree.NodeContext, column: LayoutType.Column): boolean {\n return true;\n }\n\n /** @override */\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 override 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 override accept(\n nodeContext: Vtree.NodeContext,\n column: LayoutType.Column,\n ): 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 override 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{\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 override resolveLayoutMode(\n nodeContext: Vtree.NodeContext,\n ): 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 override 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 =\n nodeContext.sourceNode as Element;\n }\n }\n return LayoutUtil.EdgeSkipper.prototype.startNonInlineElementNode.call(\n this,\n state,\n );\n }\n\n override 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{\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 =\n getRepetitiveElementsOwnerFormattingContextOrNull(nodeContext);\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 override 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 override 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 =\n position.formattingContext as TableFormattingContext;\n }\n\n override 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 override 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 override 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 override 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{\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 override getName(): string {\n return \"Table formatting context (Table.TableFormattingContext)\";\n }\n\n override isFirstTime(\n nodeContext: Vtree.NodeContext,\n firstTime: boolean,\n ): 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 override 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 saveState(): any {\n return [].concat(this.cellBreakPositions);\n }\n\n override restoreState(state: any) {\n this.cellBreakPositions = state as BrokenTableCellPosition[];\n }\n}\n\nexport class ElementsOffsetOfTableCell\n implements RepetitiveElement.ElementsOffset\n{\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 override 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 =\n nodeContext.sourceNode as Element;\n }\n }\n break;\n }\n return super.startNonInlineElementNode(state);\n }\n\n override 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 startNonElementNode(\n state: LayoutUtil.LayoutIteratorState,\n ): void | Task.Result<boolean> {\n this.registerCheckPoint(state);\n }\n\n override afterNonElementNode(\n state: LayoutUtil.LayoutIteratorState,\n ): void | Task.Result<boolean> {\n this.registerCheckPoint(state);\n }\n\n override startInlineElementNode(\n state: LayoutUtil.LayoutIteratorState,\n ): void | Task.Result<boolean> {\n this.registerCheckPoint(state);\n }\n\n override 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 =\n cellViewNode.ownerDocument.createElement(\"div\");\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 =\n 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 =\n rowNodeContext.viewNode.ownerDocument.createElement(\"td\");\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 =\n 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(\n this.currentRowIndex,\n ).cells;\n cells.forEach((cell) => {\n const cellBreakPosition =\n this.formattingContext.cellBreakPositions[cell.columnIndex];\n if (\n cellBreakPosition &&\n cellBreakPosition.cell.anchorSlot.columnIndex ==\n cell.anchorSlot.columnIndex\n ) {\n const tdNodeStep = cellBreakPosition.cellNodePosition.steps[0];\n const offset = (\n this.column.layoutContext as Vgen.ViewFactory\n ).xmldoc.getElementOffset(tdNodeStep.node as Element);\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 if (!cell) {\n // Fix for Issue #712\n state.break = true;\n return Task.newResult(true);\n }\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 =\n 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 const width = vertical ? rect[\"height\"] : rect[\"width\"];\n // Workaround for issue #958\n // Non-integer width causes problem, so return rounded-up value.\n return Math.ceil(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 /** @override */\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 /** @override */\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 /** @override */\n startNonInlineElementNode(nodeContext: Vtree.NodeContext): boolean {\n return false;\n }\n\n /** @override */\n afterNonInlineElementNode(\n nodeContext: Vtree.NodeContext,\n stopAtOverflow: boolean,\n ): boolean {\n return false;\n }\n\n /** @override */\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 =\n formattingContext.getRowSpanningCellsOverflowingTheRow(rowIndex);\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 =\n cellFragment.findAcceptableBreakPosition().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 =\n 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 override resolveLayoutMode(\n nodeContext: Vtree.NodeContext,\n ): LayoutType.LayoutMode {\n const repetitiveElements =\n 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 override clearNodes(initialPosition: Vtree.NodeContext) {\n super.clearNodes(initialPosition);\n const rootViewNode =\n this.tableFormattingContext.getRootViewNode(initialPosition);\n this.processor.removeColGroups(this.tableFormattingContext, rootViewNode);\n }\n\n override 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 override 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 override 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 override 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{\n flagmentLayoutConstraintType: FragmentLayoutConstraintType = \"EntireTable\";\n\n constructor(public tableRootNode: Node) {}\n\n /** @override */\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 /** @override */\n nextCandidate(nodeContext: Vtree.NodeContext): boolean {\n return true;\n }\n\n /** @override */\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 /** @override */\n finishBreak(\n nodeContext: Vtree.NodeContext,\n column: Layout.Column,\n ): Task.Result<boolean> {\n return Task.newResult(true);\n }\n\n /** @override */\n equalsTo(constraint: Layout.FragmentLayoutConstraint): boolean {\n return (\n constraint instanceof EntireTableLayoutConstraint &&\n constraint.tableRootNode === this.tableRootNode\n );\n }\n\n /** @override */\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 override 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{\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 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 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 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 =\n 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 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:\n entry.fragment.pseudoColumn.getColumn().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 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 */\n\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 override 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 override 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 override 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 override 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 override 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 override hasNextCandidate(candidates: ColumnBalancingTrialResult[]): boolean {\n return canReduceContainerSize(candidates);\n }\n\n override 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 CssTokenizer from \"./css-tokenizer\";\nimport * as Logging from \"./logging\";\nimport { ValidationTxt } from \"./assets\";\nimport { TokenType } from \"./css-tokenizer\";\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 = (\n this.nodes[0].validator as PrimitiveValidator\n ).combine(group.nodes[0].validator as PrimitiveValidator);\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 = 0x01;\n\nexport const ALLOW_STR = 0x02;\n\nexport const ALLOW_IDENT = 0x04;\n\nexport const ALLOW_POS_NUMERIC = 0x08;\n\nexport const ALLOW_POS_NUM = 0x10;\n\nexport const ALLOW_POS_INT = 0x20;\n\nexport const ALLOW_COLOR = 0x40;\n\nexport const ALLOW_URL = 0x80;\n\nexport const ALLOW_NEGATIVE = 0x100;\n\nexport const ALLOW_ZERO = 0x200;\n\nexport const ALLOW_ZERO_PERCENT = 0x400;\n\nexport const ALLOW_SLASH = 0x800;\n\nexport const ALLOW_URANGE = 0x1000;\n\nexport const ALLOW_IMAGE = 0x2000;\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 override visitEmpty(empty: Css.Val): Css.Val {\n if (this.allowed & ALLOW_EMPTY) {\n return empty;\n }\n return null;\n }\n\n override visitSlash(slash: Css.Val): Css.Val {\n if (this.allowed & ALLOW_SLASH) {\n return slash;\n }\n return null;\n }\n\n override visitStr(str: Css.Str): Css.Val {\n if (this.allowed & ALLOW_STR) {\n return str;\n }\n return null;\n }\n\n override 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 if (this.allowed & ALLOW_COLOR) {\n if (CSS.supports(\"color\", ident.name)) {\n return ident;\n }\n }\n return null;\n }\n\n override 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 override 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 override 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 override visitHexColor(color: Css.HexColor): Css.Val {\n if (this.allowed & ALLOW_COLOR) {\n if (/^([0-9A-F]{3,4}|([0-9A-F]{2}){3,4})$/i.test(color.hex)) {\n return color;\n }\n }\n return null;\n }\n\n override visitURL(url: Css.URL): Css.Val {\n if (this.allowed & ALLOW_URL) {\n return url;\n }\n return null;\n }\n\n override visitURange(urange: Css.URange): Css.Val {\n if (this.allowed & ALLOW_URANGE) {\n return urange;\n }\n return null;\n }\n\n override visitSpaceList(list: Css.SpaceList): Css.Val {\n return null;\n }\n\n override visitCommaList(list: Css.CommaList): Css.Val {\n return null;\n }\n\n override visitFunc(func: Css.Func): Css.Val {\n if (this.allowed & ALLOW_COLOR) {\n if (CSS.supports(\"color\", func.toString())) {\n return func;\n }\n }\n if (this.allowed & ALLOW_IMAGE) {\n if (CSS.supports(\"background-image\", func.toString())) {\n return func;\n }\n }\n if (\n func.name === \"calc\" &&\n this.allowed &\n (ALLOW_POS_NUMERIC |\n ALLOW_POS_NUM |\n ALLOW_POS_INT |\n ALLOW_NEGATIVE |\n ALLOW_ZERO |\n ALLOW_ZERO_PERCENT)\n ) {\n return func;\n }\n return null;\n }\n\n override 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: ValueMap = {};\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 override visitEmpty(empty: Css.Val): Css.Val {\n return this.validateSingle(empty);\n }\n\n override visitSlash(slash: Css.Val): Css.Val {\n return this.validateSingle(slash);\n }\n\n override visitStr(str: Css.Str): Css.Val {\n return this.validateSingle(str);\n }\n\n override visitIdent(ident: Css.Ident): Css.Val {\n return this.validateSingle(ident);\n }\n\n override visitNumeric(numeric: Css.Numeric): Css.Val {\n return this.validateSingle(numeric);\n }\n\n override visitNum(num: Css.Num): Css.Val {\n return this.validateSingle(num);\n }\n\n override visitInt(num: Css.Int): Css.Val {\n return this.validateSingle(num);\n }\n\n override visitHexColor(color: Css.HexColor): Css.Val {\n return this.validateSingle(color);\n }\n\n override visitURL(url: Css.URL): Css.Val {\n return this.validateSingle(url);\n }\n\n override visitURange(urange: Css.URange): Css.Val {\n return this.validateSingle(urange);\n }\n\n override visitSpaceList(list: Css.SpaceList): Css.Val {\n return null;\n }\n\n override visitCommaList(list: Css.CommaList): Css.Val {\n return null;\n }\n\n override visitFunc(func: Css.Func): Css.Val {\n return this.validateSingle(func);\n }\n\n override 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 override 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 override 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 override 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 override visitSpaceList(list: Css.SpaceList): Css.Val {\n return this.validateSingle(list);\n }\n\n override 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 override 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 override validateSingle(inval: Css.Val): Css.Val {\n return null;\n }\n\n override 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 override 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 override success(\n rval: Css.Val,\n shorthandValidator: ShorthandValidator,\n ): 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 override success(\n rval: Css.Val,\n shorthandValidator: ShorthandValidator,\n ): 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 override 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] ??\n this.validatorSet.defaultValues[name] ??\n Css.ident.initial,\n important,\n );\n }\n return true;\n }\n return false;\n }\n\n propagateDefaultingValue(\n value: Css.Val,\n important: boolean,\n receiver: PropertyReceiver,\n ): void {\n for (const name of this.propList) {\n receiver.simpleProperty(name, value, 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 override visitEmpty(empty: Css.Val): Css.Val {\n return this.validateSingle(empty);\n }\n\n override visitStr(str: Css.Str): Css.Val {\n return this.validateSingle(str);\n }\n\n override visitIdent(ident: Css.Ident): Css.Val {\n return this.validateSingle(ident);\n }\n\n override visitNumeric(numeric: Css.Numeric): Css.Val {\n return this.validateSingle(numeric);\n }\n\n override visitNum(num: Css.Num): Css.Val {\n return this.validateSingle(num);\n }\n\n override visitInt(num: Css.Int): Css.Val {\n return this.validateSingle(num);\n }\n\n override visitHexColor(color: Css.HexColor): Css.Val {\n return this.validateSingle(color);\n }\n\n override visitURL(url: Css.URL): Css.Val {\n return this.validateSingle(url);\n }\n\n override visitSpaceList(list: Css.SpaceList): Css.Val {\n this.validateList(list.values);\n return null;\n }\n\n override visitCommaList(list: Css.CommaList): Css.Val {\n this.error = true;\n return null;\n }\n\n override visitFunc(func: Css.Func): Css.Val {\n return this.validateSingle(func);\n }\n\n override visitExpr(expr: Css.Expr): Css.Val {\n return this.validateSingle(expr);\n }\n}\n\nexport class SimpleShorthandValidator extends ShorthandValidator {\n constructor() {\n super();\n }\n\n override 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 override 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 override 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 =\n values[name] ??\n this.validatorSet.defaultValues[name] ??\n Css.ident.initial;\n let arr = acc[name];\n if (!arr) {\n arr = [];\n acc[name] = arr;\n }\n arr.push(val);\n }\n }\n\n override 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 override init(syntax: ShorthandSyntaxNode[], propList: string[]): void {\n super.init(syntax, propList);\n this.propList.push(\n \"font-family\",\n \"line-height\",\n \"font-size\",\n \"font-stretch\",\n \"font-variant-ligatures\",\n \"font-variant-caps\",\n \"font-variant-numeric\",\n \"font-variant-east-asian\",\n );\n }\n\n override validateList(list: Css.Val[]): number {\n let index = super.validateList(list);\n\n const fontVariant = this.values[\"font-variant_css2\"];\n if (fontVariant) {\n delete this.values[\"font-variant_css2\"];\n this.values[\"font-variant-caps\"] = fontVariant;\n }\n const fontStretch = this.values[\"font-stretch_css3\"];\n if (fontStretch) {\n delete this.values[\"font-stretch_css3\"];\n this.values[\"font-stretch\"] = fontStretch;\n }\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 override 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 override 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 class TextSpacingShorthandValidator extends SimpleShorthandValidator {\n override validateList(list: Css.Val[]): number {\n if (list.length === 1 && list[0] instanceof Css.Ident) {\n switch (list[0].name.toLowerCase()) {\n case \"normal\":\n list = [\n this.validatorSet.defaultValues[\"text-autospace\"],\n this.validatorSet.defaultValues[\"text-spacing-trim\"],\n ];\n break;\n case \"auto\":\n list = [Css.ident.auto, Css.ident.auto];\n break;\n case \"none\":\n list = [Css.getName(\"no-autospace\"), Css.getName(\"space-all\")];\n break;\n }\n }\n return super.validateList(list);\n }\n}\n\nconst propsExcludedFromAll = [\n \"unicode-bidi\",\n \"direction\",\n\n // excludes css-logical\n \"margin-block-start\",\n \"margin-block-end\",\n \"margin-inline-start\",\n \"margin-inline-end\",\n \"padding-block-start\",\n \"padding-block-end\",\n \"padding-inline-start\",\n \"padding-inline-end\",\n \"border-block-start-color\",\n \"border-block-end-color\",\n \"border-inline-start-color\",\n \"border-inline-end-color\",\n \"border-block-start-style\",\n \"border-block-end-style\",\n \"border-inline-start-style\",\n \"border-inline-end-style\",\n \"border-block-start-width\",\n \"border-block-end-width\",\n \"border-inline-start-width\",\n \"border-inline-end-width\",\n \"block-start\",\n \"block-end\",\n \"inline-start\",\n \"inline-end\",\n \"block-size\",\n \"inline-size\",\n \"max-block-size\",\n \"max-inline-size\",\n \"min-block-size\",\n \"min-inline-size\",\n\n // excludes non-standards and special\n \"behavior\",\n \"bleed\",\n \"conflicting-partitions\",\n \"crop-offset\",\n \"enabled\",\n \"flow-consume\",\n \"flow-from\",\n \"flow-into\",\n \"flow-linger\",\n \"flow-options\",\n \"flow-priority\",\n \"font-display\",\n \"font-size-adjust\",\n \"font-stretch_css3\",\n \"font-variant_css2\",\n \"glyph-orientation-vertical\",\n \"marks\",\n \"min-page-height\",\n \"min-page-width\",\n \"repeat-on-break\",\n \"required\",\n \"required-partitions\",\n \"ruby-align\",\n \"shape-inside\",\n \"snap-height\",\n \"snap-width\",\n \"template\",\n \"text-decoration-skip\",\n \"text-justify\",\n \"text-zoom\",\n \"unicode-range\",\n \"utilization\",\n \"wrap-flow\",\n];\n\nexport class AllShorthandValidator extends SimpleShorthandValidator {\n constructor() {\n super();\n }\n\n override init(syntax: ShorthandSyntaxNode[], propList: string[]): void {\n super.init(syntax, propList);\n for (const name in this.validatorSet.validators) {\n if (!propsExcludedFromAll.includes(name)) {\n this.propList.push(name);\n }\n }\n }\n\n override validateList(list: Css.Val[]): number {\n this.error = true;\n return 0;\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 TEXT_SPACING: TextSpacingShorthandValidator,\n ALL: AllShorthandValidator,\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 == TokenType.NUMERIC) {\n cssval = new Css.Numeric(token.num, token.text);\n } else if (token.type == TokenType.HASH) {\n cssval = new Css.HexColor(token.text);\n } else if (token.type == 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[\"COLOR\"] = this.primitive(\n new PrimitiveValidator(ALLOW_COLOR, NO_IDENTS, NO_IDENTS),\n );\n this.namedValidators[\"IMAGE_FUNCTION\"] = this.primitive(\n new PrimitiveValidator(ALLOW_IMAGE, 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 lh: Css.empty,\n rlh: 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[\"URANGE\"] = this.primitive(\n new PrimitiveValidator(ALLOW_URANGE, 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 == TokenType.EOF) {\n // Finished normally\n return null;\n }\n const rulePrefixes: { [key: string]: boolean } = { \"\": true };\n if (token.type == TokenType.O_BRK) {\n do {\n tok.consume();\n token = tok.token();\n if (token.type != 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 == TokenType.COMMA);\n if (token.type != TokenType.C_BRK) {\n throw new Error(\"']' expected\");\n }\n tok.consume();\n token = tok.token();\n }\n if (token.type != 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 != 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 != 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 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: ValueMap = {};\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 TokenType.INT: {\n const idents: ValueMap = {};\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 TokenType.BAR:\n setop(\"|\");\n break;\n case TokenType.BAR_BAR:\n setop(\"||\");\n break;\n case 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 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 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 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 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 TokenType.QMARK:\n if (expectval) {\n throw new Error(\"'?' unexpected\");\n }\n vals.push(this.addCounts(vals.pop(), 0, 1));\n break;\n case 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 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 TokenType.O_BRC: {\n tok.consume();\n token = tok.token();\n if (token.type != 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 == TokenType.COMMA) {\n tok.consume();\n token = tok.token();\n if (token.type != 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 != TokenType.C_BRC) {\n throw new Error(\"'}' expected\");\n }\n vals.push(this.addCounts(vals.pop(), min, max));\n break;\n }\n case 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 == TokenType.SEMICOL) {\n tok.consume();\n break;\n }\n switch (token.type) {\n case TokenType.IDENT:\n vals.push(Css.getName(token.text));\n break;\n case TokenType.NUM:\n vals.push(new Css.Num(token.num));\n break;\n case TokenType.INT:\n vals.push(new Css.Int(token.num));\n break;\n case 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 (token.type == TokenType.IDENT && shorthandValidators[token.text]) {\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 TokenType.IDENT:\n if (this.validators[token.text]) {\n syntax.push(shorthandValidator.syntaxNodeForProperty(token.text));\n // `font-variant_css2` and `font-stretch_css3` are not real properties\n if (!token.text.includes(\"_\")) {\n propList.push(token.text);\n }\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 TokenType.SLASH:\n if (syntax.length > 0 || slash) {\n throw new Error(\"unexpected slash\");\n }\n slash = true;\n break;\n case TokenType.O_BRK:\n stack.push({ slash, syntax });\n syntax = [];\n slash = false;\n break;\n case 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 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 map[pname] = this.defaultValues[pname] ?? Css.ident.initial;\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 if (Css.isCustomPropName(name)) {\n receiver.simpleProperty(name, value, important);\n return;\n }\n if (containsVar(value)) {\n // Set the specified property containing `var(…)`\n receiver.simpleProperty(name, value, important);\n return;\n }\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 if (CSS.supports(name, value.toString())) {\n // Browser supports this property\n receiver.simpleProperty(origName, value, important);\n } else {\n receiver.unknownProperty(origName, value);\n }\n return;\n }\n const validator = this.validators[name];\n if (validator) {\n const rvalue =\n Css.isDefaultingValue(value) || value.isExpr()\n ? value\n : value.visit(validator);\n if (rvalue) {\n receiver.simpleProperty(name, rvalue, important);\n } else if (!prefix && CSS.supports(name, value.toString())) {\n // Browser supports this property value\n receiver.simpleProperty(name, value, important);\n return;\n } else {\n receiver.invalidPropertyValue(origName, value);\n }\n } else {\n const shorthand = this.shorthands[name].clone();\n if (Css.isDefaultingValue(value)) {\n shorthand.propagateDefaultingValue(value, 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\nclass VarCheckVisitor extends Css.Visitor {\n varFound = false;\n\n visitFunc(func: Css.Func): Css.Val {\n if (func.name === \"var\") {\n this.varFound = true;\n } else if (!this.varFound) {\n this.visitValues(func.values);\n }\n return null;\n }\n}\n\nexport function containsVar(val: Css.Val): boolean {\n const varCheckVisitor = new VarCheckVisitor();\n val.visit(varCheckVisitor);\n return varCheckVisitor.varFound;\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 encounteredFlowChunk(flowChunk: Vtree.FlowChunk, flow: Vtree.Flow): void;\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] as CssCascade.CascadeValue;\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 (\n (node.nodeType === Node.TEXT_NODE ||\n node.nodeType === Node.CDATA_SECTION_NODE) &&\n (this.atBlockStart || this.atFlowStart) &&\n box.hasBox()\n ) {\n const whitespaceValue = box\n .styleValue(\"white-space\", Css.ident.normal)\n .toString();\n const whitespace = Vtree.whitespaceFromPropertyValue(whitespaceValue);\n if (whitespace && !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, 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] as CssCascade.CascadeValue;\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 if (isBody) {\n for (const propName of [\"writing-mode\", \"direction\"]) {\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 } else {\n for (const propName in elemStyle) {\n if (CssCascade.isInherited(propName)) {\n this.rootStyle[propName] = elemStyle[propName];\n }\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\"] as CssCascade.CascadeValue).evaluate(\n this.context,\n )\n : (null as Css.Val);\n const backgroundImage = this.hasProp(\n elemStyle,\n this.validatorSet.backgroundProps,\n \"background-image\",\n )\n ? (elemStyle[\"background-image\"] as CssCascade.CascadeValue).evaluate(\n this.context,\n )\n : (null as Css.Val);\n if (\n (backgroundColor && !Css.isDefaultingValue(backgroundColor)) ||\n (backgroundImage && !Css.isDefaultingValue(backgroundImage))\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 // root element\n const fontSize = elemStyle[\"font-size\"] as CssCascade.CascadeValue;\n let isRelativeFontSize = true;\n if (fontSize && !Css.isDefaultingValue(fontSize.value)) {\n const val = fontSize.evaluate(this.context);\n if (val instanceof Css.Numeric) {\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 case \"lh\":\n case \"rlh\":\n px *=\n (this.context.initialFontSize * Exprs.defaultUnitSizes[\"lh\"]) /\n Exprs.defaultUnitSizes[\"em\"];\n break;\n default: {\n const unitSize = Exprs.defaultUnitSizes[val.unit];\n if (unitSize) {\n px *= unitSize;\n }\n isRelativeFontSize = false;\n }\n }\n this.context.rootFontSize = px;\n this.context.isRelativeRootFontSize = isRelativeFontSize;\n }\n }\n const rootFontSize =\n this.context.rootFontSize ?? this.context.initialFontSize;\n const lineHeight = elemStyle[\"line-height\"] as CssCascade.CascadeValue;\n if (lineHeight && !Css.isDefaultingValue(lineHeight.value)) {\n const val = lineHeight.evaluate(this.context);\n if (val instanceof Css.Num) {\n this.context.rootLineHeight = val.num * rootFontSize;\n } else if (val instanceof Css.Numeric) {\n let px = val.num;\n switch (val.unit) {\n case \"em\":\n case \"rem\":\n px *= rootFontSize;\n break;\n case \"ex\":\n px *=\n (rootFontSize * Exprs.defaultUnitSizes[\"ex\"]) /\n Exprs.defaultUnitSizes[\"em\"];\n break;\n case \"%\":\n px *= rootFontSize / 100;\n break;\n case \"lh\":\n case \"rlh\":\n px *=\n (this.context.initialFontSize * Exprs.defaultUnitSizes[\"lh\"]) /\n Exprs.defaultUnitSizes[\"em\"];\n break;\n default: {\n const unitSize = Exprs.defaultUnitSizes[val.unit];\n if (unitSize) {\n px *= unitSize;\n }\n }\n }\n this.context.rootLineHeight = px;\n }\n } else {\n // Note: \"rlh\" unit is inaccurate for line-height:normal, not using font metrics.\n this.context.rootLineHeight =\n (this.context.fontSize() * Exprs.defaultUnitSizes[\"lh\"]) /\n Exprs.defaultUnitSizes[\"em\"];\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\"] as CssCascade.CascadeValue;\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\"] as CssCascade.CascadeValue;\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\"] as CssCascade.CascadeValue;\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\"] as CssCascade.CascadeValue;\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 =\n box.afterBox.getBreakValue(\"before\");\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(this, 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\"] as CssCascade.CascadeValue;\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\n if (blockStartOffset === 0) {\n // Named page type at first page\n const pageCV = style[\"page\"] as CssCascade.CascadeValue;\n const pageType =\n pageCV &&\n !Css.isDefaultingValue(pageCV.value) &&\n pageCV.value.toString();\n if (pageType && pageType.toLowerCase() !== \"auto\") {\n this.cascade.firstPageType = pageType;\n }\n }\n\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 (this.bodyReached && blockStartOffset === 0) {\n // body reached but the named page type at first page is not determined\n // (Fix for issue #770)\n continue;\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 /** @override */\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 /** @override */\n processContent(\n element: Element,\n styles: { [key: string]: Css.Val },\n viewNode: Node,\n ) {}\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.auto,\n \"font-stretch\": Css.ident.auto,\n \"font-weight\": Css.ident.auto,\n \"unicode-range\": Css.fullURange,\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 style = this.head.ownerDocument.createElement(\"style\");\n style.textContent = viewFontFace.makeAtRule(src, fontBytes);\n this.head.appendChild(style);\n Logging.logger.debug(\"Load font:\", src);\n frame.finish(viewFontFace);\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 const srcFamilySrc = srcFace.family + \";\" + src;\n let fetcher = this.srcURLMap[srcFamilySrc];\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.debug(\"Found already-loaded font:\", src);\n }\n });\n } else {\n fetcher = new TaskUtil.Fetcher(() => {\n const frame: Task.Frame<Face> = Task.newFrame(\"loadFont\");\n // Get URL from `@font-face` src value.\n const url = src.replace(/^url\\(\"([^\"]+)\"\\).*$/, \"$1\");\n const deobfuscator = documentFaces.deobfuscator\n ? documentFaces.deobfuscator(url)\n : null;\n if (deobfuscator) {\n Net.ajax(url, 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[srcFamilySrc] = 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).thenAsync(() =>\n this.waitFontLoading(),\n );\n }\n\n waitFontLoading(): Task.Result<boolean> {\n const fonts = this.head.ownerDocument.fonts; // FontFaceSet\n let unloadedCount = 0;\n fonts.forEach((fontFace) => {\n if (fontFace.status === \"unloaded\") {\n unloadedCount++;\n fontFace.load();\n }\n });\n if (unloadedCount === 0) {\n return Task.newResult(true);\n }\n const frame: Task.Frame<boolean> = Task.newFrame(\"waitFontLoading\");\n frame\n .loop(() => {\n return frame.sleep(20).thenAsync(() => {\n if (fonts.status === \"loading\") {\n return Task.newResult(true); // continue\n }\n return Task.newResult(false); // break\n });\n })\n .thenFinish(frame);\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 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 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 override createInstance(parentInstance): PageBoxInstance {\n return new PageMasterInstance(parentInstance, this);\n }\n\n override 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 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 override createInstance(parentInstance: PageBoxInstance): PageBoxInstance {\n return new PartitionGroupInstance(parentInstance, this);\n }\n\n override 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 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 override createInstance(parentInstance): PageBoxInstance {\n return new PartitionInstance(parentInstance, this);\n }\n\n override 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 || Css.isDefaultingValue(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 || Css.isDefaultingValue(val)) {\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 || Css.isDefaultingValue(val)) {\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 || Css.isDefaultingValue(val)) {\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 || Css.isDefaultingValue(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 || Css.isDefaultingValue(val)) {\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 || Css.isDefaultingValue(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 && CssCascade.isInherited(name)) {\n // inherit from root style\n if (\n name === \"font-size\" &&\n context.isRelativeRootFontSize &&\n context.rootFontSize\n ) {\n val = new Css.Numeric(context.rootFontSize, \"px\");\n } else {\n const rootStyle = (\n context as Exprs.Context & {\n styler: { rootStyle: { [key: string]: CssCascade.CascadeValue } };\n }\n ).styler?.rootStyle;\n val = rootStyle[name]?.value;\n }\n }\n if (val) {\n val = CssCascade.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 let percentRef = /\\b(height|top|bottom)\\b/.test(name)\n ? context.pageAreaHeight ?? context.pageHeight()\n : context.pageAreaWidth ?? context.pageWidth();\n val = CssCascade.evaluateCSSToCSS(context, val, name, percentRef);\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 if (\n (name.startsWith(\"background\") || name === \"z-index\") &&\n element.parentElement.hasAttribute(\"data-vivliostyle-bleed-box\")\n ) {\n // Move background properties and z-index to the parent bleed-box element.\n // (Fix for issue #644, #1166)\n element = element.parentElement;\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 transferSingleUriContentProps(\n context: Exprs.Context,\n element: Element,\n docFaces: Font.DocumentFaces,\n ): void {\n const hasWidth = (): boolean => {\n const width = (\n (this.cascaded[\"width\"] ??\n this.cascaded[\n this.vertical ? \"block-size\" : \"inline-size\"\n ]) as CssCascade.CascadeValue\n )?.value;\n return (\n !!width && width !== Css.ident.auto && !Css.isDefaultingValue(width)\n );\n };\n const hasHeight = (): boolean => {\n const height = (\n (this.cascaded[\"height\"] ??\n this.cascaded[\n this.vertical ? \"inline-size\" : \"block-size\"\n ]) as CssCascade.CascadeValue\n )?.value;\n return (\n !!height && height !== Css.ident.auto && !Css.isDefaultingValue(height)\n );\n };\n\n for (let i = 0; i < passSingleUriContentProperties.length; i++) {\n const name = passSingleUriContentProperties[i];\n if (\n (name === \"width\" && !hasWidth()) ||\n (name === \"height\" && !hasHeight())\n ) {\n // Don't propagate width/height to the img element if it's not specified.\n // (Issue #1177)\n continue;\n }\n this.propagatePropertyToElement(context, element, name, docFaces);\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 = this.vertical\n ? ((containerSize + columnGap) * i) / columnCount -\n columnGap / 2 +\n container.paddingTop -\n ruleWidth / 2\n : ((containerSize + columnGap) * i) / columnCount -\n columnGap / 2 +\n container.paddingLeft -\n ruleWidth / 2;\n const size = this.vertical\n ? container.width + container.paddingLeft + container.paddingRight\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 const content = style[\"content\"] as CssCascade.CascadeValue;\n if (content) {\n style[\"content\"] = 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 \"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-ligatures\",\n \"font-variant-caps\",\n \"font-variant-numeric\",\n \"font-variant-east-asian\",\n \"font-stretch\",\n \"text-combine-upright\",\n \"text-decoration-color\",\n \"text-decoration-line\",\n \"text-decoration-skip\",\n \"text-decoration-style\",\n \"text-decoration-thickness\",\n \"text-emphasis\",\n \"text-emphasis-color\",\n \"text-emphasis-position\",\n \"text-emphasis-style\",\n \"text-fill-color\",\n \"text-orientation\",\n \"text-shadow\",\n \"text-stroke-color\",\n \"text-stroke-width\",\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 override 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 constructor(parentInstance: PageBoxInstance, pageBox: P) {\n super(parentInstance, pageBox);\n this.pageMasterInstance = this;\n }\n\n override 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 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 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 override 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 override 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}\n\n//--------------------- parsing -----------------------\nexport class PageBoxParserHandler\n extends CssParser.SlaveParserHandler\n implements CssValidator.PropertyReceiver\n{\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 override 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 /** @override */\n unknownProperty(name: string, value: Css.Val): void {\n this.report(`E_INVALID_PROPERTY ${name}: ${value.toString()}`);\n }\n\n /** @override */\n invalidPropertyValue(name: string, value: Css.Val): void {\n this.report(`E_INVALID_PROPERTY_VALUE ${name}: ${value.toString()}`);\n }\n\n /** @override */\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 override 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 override 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 override 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 override 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 const writingMode = (style[\"writing-mode\"] as CssCascade.CascadeValue)?.value;\n const direction = (style[\"direction\"] as CssCascade.CascadeValue)?.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 a10: { width: new Css.Numeric(26, \"mm\"), height: new Css.Numeric(37, \"mm\") },\n a9: { width: new Css.Numeric(37, \"mm\"), height: new Css.Numeric(52, \"mm\") },\n a8: { width: new Css.Numeric(52, \"mm\"), height: new Css.Numeric(74, \"mm\") },\n a7: { width: new Css.Numeric(74, \"mm\"), height: new Css.Numeric(105, \"mm\") },\n a6: { width: new Css.Numeric(105, \"mm\"), height: new Css.Numeric(148, \"mm\") },\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 a2: { width: new Css.Numeric(420, \"mm\"), height: new Css.Numeric(594, \"mm\") },\n a1: { width: new Css.Numeric(594, \"mm\"), height: new Css.Numeric(841, \"mm\") },\n a0: {\n width: new Css.Numeric(841, \"mm\"),\n height: new Css.Numeric(1189, \"mm\"),\n },\n b10: { width: new Css.Numeric(31, \"mm\"), height: new Css.Numeric(44, \"mm\") },\n b9: { width: new Css.Numeric(44, \"mm\"), height: new Css.Numeric(62, \"mm\") },\n b8: { width: new Css.Numeric(62, \"mm\"), height: new Css.Numeric(88, \"mm\") },\n b7: { width: new Css.Numeric(88, \"mm\"), height: new Css.Numeric(125, \"mm\") },\n b6: { width: new Css.Numeric(125, \"mm\"), height: new Css.Numeric(176, \"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 b3: { width: new Css.Numeric(353, \"mm\"), height: new Css.Numeric(500, \"mm\") },\n b2: { width: new Css.Numeric(500, \"mm\"), height: new Css.Numeric(707, \"mm\") },\n b1: {\n width: new Css.Numeric(707, \"mm\"),\n height: new Css.Numeric(1000, \"mm\"),\n },\n b0: {\n width: new Css.Numeric(1000, \"mm\"),\n height: new Css.Numeric(1414, \"mm\"),\n },\n c10: { width: new Css.Numeric(28, \"mm\"), height: new Css.Numeric(40, \"mm\") },\n c9: { width: new Css.Numeric(40, \"mm\"), height: new Css.Numeric(57, \"mm\") },\n c8: { width: new Css.Numeric(57, \"mm\"), height: new Css.Numeric(81, \"mm\") },\n c7: { width: new Css.Numeric(81, \"mm\"), height: new Css.Numeric(114, \"mm\") },\n c6: { width: new Css.Numeric(114, \"mm\"), height: new Css.Numeric(162, \"mm\") },\n c5: { width: new Css.Numeric(162, \"mm\"), height: new Css.Numeric(229, \"mm\") },\n c4: { width: new Css.Numeric(229, \"mm\"), height: new Css.Numeric(324, \"mm\") },\n c3: { width: new Css.Numeric(324, \"mm\"), height: new Css.Numeric(458, \"mm\") },\n c2: { width: new Css.Numeric(458, \"mm\"), height: new Css.Numeric(648, \"mm\") },\n c1: { width: new Css.Numeric(648, \"mm\"), height: new Css.Numeric(917, \"mm\") },\n c0: {\n width: new Css.Numeric(917, \"mm\"),\n height: new Css.Numeric(1297, \"mm\"),\n },\n \"jis-b10\": {\n width: new Css.Numeric(32, \"mm\"),\n height: new Css.Numeric(45, \"mm\"),\n },\n \"jis-b9\": {\n width: new Css.Numeric(45, \"mm\"),\n height: new Css.Numeric(64, \"mm\"),\n },\n \"jis-b8\": {\n width: new Css.Numeric(64, \"mm\"),\n height: new Css.Numeric(91, \"mm\"),\n },\n \"jis-b7\": {\n width: new Css.Numeric(91, \"mm\"),\n height: new Css.Numeric(128, \"mm\"),\n },\n \"jis-b6\": {\n width: new Css.Numeric(128, \"mm\"),\n height: new Css.Numeric(182, \"mm\"),\n },\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 \"jis-b3\": {\n width: new Css.Numeric(364, \"mm\"),\n height: new Css.Numeric(515, \"mm\"),\n },\n \"jis-b2\": {\n width: new Css.Numeric(515, \"mm\"),\n height: new Css.Numeric(728, \"mm\"),\n },\n \"jis-b1\": {\n width: new Css.Numeric(728, \"mm\"),\n height: new Css.Numeric(1030, \"mm\"),\n },\n \"jis-b0\": {\n width: new Css.Numeric(1030, \"mm\"),\n height: new Css.Numeric(1456, \"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 cropOffset: 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 cropOffset: 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 marksCV = style[\"marks\"];\n const bleedCV = style[\"bleed\"];\n const marks =\n marksCV && !Css.isDefaultingValue(marksCV.value)\n ? marksCV.value\n : Css.ident.none;\n const bleed =\n bleedCV && !Css.isDefaultingValue(bleedCV.value)\n ? bleedCV.value\n : Css.ident.auto;\n if (bleed === 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 !== Css.ident.none) {\n let hasCrop = false;\n if (marks.isSpaceList()) {\n hasCrop = (marks as Css.SpaceList).values.some(\n (v) => v === Css.ident.crop,\n );\n } else {\n hasCrop = marks === Css.ident.crop;\n }\n if (hasCrop) {\n pageSizeAndBleed.bleed = new Css.Numeric(6, \"pt\");\n }\n }\n } else if (bleed.isNumeric()) {\n pageSizeAndBleed.bleed = bleed as Css.Numeric;\n }\n\n // crop-offset (Issue #913)\n const cropOffsetCV = style[\"crop-offset\"];\n const cropOffset =\n cropOffsetCV && !Css.isDefaultingValue(cropOffsetCV.value)\n ? cropOffsetCV.value\n : Css.ident.auto;\n if (cropOffset === Css.ident.auto) {\n if (marks !== Css.ident.none) {\n pageSizeAndBleed.bleedOffset = defaultBleedOffset;\n }\n } else if (cropOffset.isNumeric()) {\n pageSizeAndBleed.cropOffset = cropOffset 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 Math.max(0, pageSizeAndBleed.bleed.num) *\n context.queryUnitSize(pageSizeAndBleed.bleed.unit, false);\n const bleedOffset =\n !pageSizeAndBleed.cropOffset.num && pageSizeAndBleed.bleedOffset.num\n ? pageSizeAndBleed.bleedOffset.num *\n context.queryUnitSize(pageSizeAndBleed.bleedOffset.unit, false)\n : Math.max(\n 0,\n pageSizeAndBleed.cropOffset.num *\n context.queryUnitSize(pageSizeAndBleed.cropOffset.unit, false) -\n bleed,\n );\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\", \"#010101\");\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\"] as CssCascade.CascadeValue;\n if (marks) {\n const value = marks.value;\n if (value instanceof Css.SpaceList) {\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\n const bleed = evaluatedPageSizeAndBleed.bleed;\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 lineWidth = Css.toNumber(defaultPrinterMarkLineWidth, context);\n const printerMarkOffset = Math.max(\n 0,\n evaluatedPageSizeAndBleed.bleedOffset -\n Css.toNumber(defaultPrinterMarkLineLength, context),\n );\n const lineLength = evaluatedPageSizeAndBleed.bleedOffset - printerMarkOffset;\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: false,\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 override 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 override 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 (\n val &&\n val.value !== Css.empty &&\n val.value !== Css.ident.inherit &&\n val.value !== Css.ident.unset &&\n val.value !== Css.ident.revert\n ) {\n this.specified[prop] = val;\n }\n }\n }\n }\n\n override 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 override 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 override 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 override 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 override 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 override 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 const val = style[isHorizontal ? \"width\" : \"height\"];\n this.hasAutoSize_ =\n !val || val === Css.ident.auto || Css.isDefaultingValue(val);\n }\n\n /** @override */\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 /** @override */\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 /** @override */\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 /** @override */\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 /** @override */\n hasAutoSize(): boolean {\n return this.params.some((p) => p.hasAutoSize());\n }\n\n /** @override */\n getOuterMaxContentSize(): number {\n const sizes = this.params.map((p) => p.getOuterMaxContentSize());\n return Math.max.apply(null, sizes) * sizes.length;\n }\n\n /** @override */\n getOuterMinContentSize(): number {\n const sizes = this.params.map((p) => p.getOuterMinContentSize());\n return Math.max.apply(null, sizes) * sizes.length;\n }\n\n /** @override */\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 override hasAutoSize(): boolean {\n return false;\n }\n\n override getOuterMaxContentSize(): number {\n return this.getOuterSize();\n }\n\n override getOuterMinContentSize(): number {\n return this.getOuterSize();\n }\n\n override 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 override 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 override 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 override 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\n if (\n this.hasBorderOrOutline() ||\n (marginStart instanceof Exprs.Numeric && marginStart.num < 0) ||\n (marginEnd instanceof Exprs.Numeric && marginEnd.num < 0)\n ) {\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[`border-${startSide}-width`] = new Css.Expr(borderStartWidth);\n style[`border-${endSide}-width`] = new Css.Expr(borderEndWidth);\n } else {\n // If the page box has no border or outline and margins are not negative,\n // use transparent borders for page margins. This is to improve text selection behavior.\n style[startSide] = Css.numericZero;\n style[endSide] = Css.numericZero;\n style[`margin-${startSide}`] = Css.numericZero;\n style[`margin-${endSide}`] = Css.numericZero;\n style[`border-${startSide}-width`] = new Css.Expr(marginStart);\n style[`border-${endSide}-width`] = new Css.Expr(marginEnd);\n style[`border-${startSide}-style`] = Css.ident.solid;\n style[`border-${endSide}-style`] = Css.ident.solid;\n style[`border-${startSide}-color`] = Css.ident.transparent;\n style[`border-${endSide}-color`] = Css.ident.transparent;\n style[\"background-clip\"] = Css.ident.padding_box;\n }\n style[`padding-${startSide}`] = new Css.Expr(paddingStart);\n style[`padding-${endSide}`] = new Css.Expr(paddingEnd);\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 private hasBorderOrOutline(): boolean {\n const hasBorder1 = (propName: string): boolean => {\n const propValue = CssCascade.getProp(this.cascaded, propName)?.value;\n return !!propValue && propValue !== Css.ident.none;\n };\n return (\n hasBorder1(\"border-top-style\") ||\n hasBorder1(\"border-bottom-style\") ||\n hasBorder1(\"border-left-style\") ||\n hasBorder1(\"border-right-style\") ||\n hasBorder1(\"border-block-start-style\") ||\n hasBorder1(\"border-block-end-style\") ||\n hasBorder1(\"border-inline-start-style\") ||\n hasBorder1(\"border-inline-end-style\") ||\n hasBorder1(\"outline-style\")\n );\n }\n\n override 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 override 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 Base.setCSSProperty(\n element,\n \"flex-flow\",\n this.vertical ? (this.rtl ? \"row-reverse\" : \"row\") : \"column\",\n );\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(element, \"justify-content\", flexAlign);\n }\n const content: Css.Val = this.getProp(context, \"content\");\n if (\n this.vertical ||\n content instanceof Css.URL ||\n (content instanceof Css.Expr &&\n content.expr instanceof Exprs.Native &&\n content.expr.str.startsWith(\"running-element-\"))\n ) {\n let align = \"center\";\n if (this.boxInfo.isInTopRow || this.boxInfo.isInBottomRow) {\n if (\n this.boxInfo.isInLeftColumn ||\n this.boxInfo.positionAlongVariableDimension ===\n MarginBoxPositionAlongVariableDimension.END\n ) {\n align = this.vertical || this.rtl ? \"start\" : \"end\";\n } else if (\n this.boxInfo.isInRightColumn ||\n this.boxInfo.positionAlongVariableDimension ===\n MarginBoxPositionAlongVariableDimension.START\n ) {\n align = this.vertical || this.rtl ? \"end\" : \"start\";\n }\n }\n Base.setCSSProperty(element, \"align-items\", align);\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(context: Exprs.Context): {\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 override 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 override 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 override 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(pageType: string): CssCascade.ElementStyle {\n const style = {} as CssCascade.ElementStyle;\n this.cascadeInstance.pushRule([], pageType, 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] as CssCascade.CascadeValue;\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\"] as CssCascade.CascadeValue;\n if (size && !Css.isDefaultingValue(size.value)) {\n const pageSize = resolvePageSizeAndBleed(style as any);\n const priority = size.priority;\n CssCascade.setPropCascadeValue(\n pageMasterStyle,\n \"width\",\n new CssCascade.CascadeValue(pageSize.width, priority),\n this.context,\n );\n CssCascade.setPropCascadeValue(\n pageMasterStyle,\n \"height\",\n new CssCascade.CascadeValue(pageSize.height, priority),\n this.context,\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 override apply(cascadeInstance: CssCascade.CascadeInstance): void {\n if (cascadeInstance.currentPageType === this.pageType) {\n this.chained.apply(cascadeInstance);\n }\n }\n\n override getPriority(): number {\n return 3;\n }\n\n override 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 override 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 override getPriority(): number {\n return 2;\n }\n}\n\nexport class IsBlankPageAction extends CssCascade.ChainedAction {\n constructor(public readonly scope: Exprs.LexicalScope) {\n super();\n }\n\n override apply(cascadeInstance: CssCascade.CascadeInstance): void {\n const blankPage = new Exprs.Named(this.scope, \"blank-page\");\n if (blankPage.evaluate(cascadeInstance.context)) {\n this.chained.apply(cascadeInstance);\n }\n }\n\n override 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 override 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 override 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 override 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 override 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 override 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 override 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 override 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 override 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 override 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 override 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 override 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{\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, parent?.condition, parent, null, validatorSet, false);\n }\n\n override startPageRule(): void {\n this.startSelectorRule();\n }\n\n override 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 override pseudoclassSelector(\n name: string,\n params: (number | string)[],\n ): 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 \"blank\":\n this.chain.push(new IsBlankPageAction(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 override nextSelector(): void {\n this.finishSelector();\n super.nextSelector();\n }\n\n override startRuleBody(): void {\n this.finishSelector();\n super.startRuleBody();\n }\n\n override 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 const 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(\n props,\n n,\n noPageSelectorProps[n] as CssCascade.CascadeValue,\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 CssCascade.setPropCascadeValue(props, name, result);\n }\n });\n }\n }\n\n override 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 override makeApplyRuleAction(\n specificity: number,\n ): CssCascade.ApplyRuleAction {\n return new ApplyPageRuleAction(this.elementStyle, specificity);\n }\n\n override 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{\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 override 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 /** @override */\n invalidPropertyValue(name: string, value: Css.Val): void {\n this.report(`E_INVALID_PROPERTY_VALUE ${name}: ${value.toString()}`);\n }\n\n /** @override */\n unknownProperty(name: string, value: Css.Val): void {\n this.report(`E_INVALID_PROPERTY ${name}: ${value.toString()}`);\n }\n\n /** @override */\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 2022 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 Scripts - Supports JavaScript in source document.\n */\nimport * as CssCascade from \"./css-cascade\";\nimport * as CssStyler from \"./css-styler\";\nimport * as Net from \"./net\";\nimport * as Task from \"./task\";\nimport * as Logging from \"./logging\";\nimport * as TaskUtil from \"./task-util\";\n\n/**\n * Enable or disable JavaScript in html support\n */\nexport let allowScripts = true;\nexport function setAllowScripts(value: boolean): void {\n allowScripts = value;\n}\n\nconst deferredScripts: HTMLScriptElement[] = [];\n\nfunction sameScripts(s1: HTMLScriptElement, s2: HTMLScriptElement): boolean {\n return (\n s1 === s2 ||\n (s1.src || s2.src ? s1.src === s2.src : s1.textContent === s2.textContent)\n );\n}\n\nfunction getScriptsInOrNearHead(document: Document): HTMLScriptElement[] {\n // To support Chrome < 88 and Firefox < 84, we cannot use\n // the selector \"body > script:not(:not(script, link, style) ~ *)\".\n // (Issue #919)\n const scriptsInBodyNotNearHead = Array.from(\n document.querySelectorAll(\n \"body > :not(script):not(link):not(style) ~ script\",\n ),\n ) as HTMLScriptElement[];\n return (\n Array.from(\n document.querySelectorAll(\"head > script, body > script\"),\n ) as HTMLScriptElement[]\n ).filter((script) => !scriptsInBodyNotNearHead.includes(script));\n}\n\nexport function loadScript(\n srcScriptElem: HTMLScriptElement,\n window: Window,\n flags?: { inHead?: boolean; atEnd?: boolean; forceDefer?: boolean },\n): Task.Result<boolean> {\n if (!allowScripts) {\n return Task.newResult(false);\n }\n if (\n !flags?.inHead &&\n !flags?.atEnd &&\n getScriptsInOrNearHead(srcScriptElem.ownerDocument).includes(srcScriptElem)\n ) {\n // The script elements at beginning of body have already been processed.\n return Task.newResult(false);\n }\n\n const scriptContent = srcScriptElem.textContent;\n const src = srcScriptElem.src;\n const isModule = srcScriptElem.type === \"module\";\n const async = (isModule || src) && srcScriptElem.async;\n const defer = (isModule && !async) || (src && srcScriptElem.defer);\n const needDefer = !flags?.atEnd && (flags?.forceDefer || defer || async);\n\n if (!hasScripts(window)) {\n // `window.onload = startViewer`, which was set by vivliostyle-viewer,\n // has to be unset to prevent `startViewer` restarting because of\n // `window.dispatchEvent(new Event(\"load\"))` in `loadScriptsAtEnd()`.\n window.onload = null;\n }\n\n if (needDefer) {\n if (!deferredScripts.some((s) => sameScripts(s, srcScriptElem))) {\n deferredScripts.push(srcScriptElem);\n }\n return Task.newResult(true);\n }\n\n if (src.includes(\"/mathjax\")) {\n const builtinMathJax2 = window.document.head.querySelector(\n \"script[src*='MathJax.js']:not([data-vivliostyle-scripting])\",\n );\n if (builtinMathJax2) {\n if (src.includes(\"/mathjax@3\")) {\n // Remove the builtin MathJax 2 when MathJax 3 is specified\n window.document.head.removeChild(builtinMathJax2);\n if (window[\"MathJax\"]?.version?.startsWith(\"2.\")) {\n delete window[\"MathJax\"];\n }\n } else if (src.includes(\"/MathJax.js\")) {\n // Ignore the specified MathJax 2, and use the builtin MathJax 2\n return Task.newResult(true);\n }\n }\n }\n\n for (const s of window.document.head.getElementsByTagName(\"script\")) {\n if (\n s.hasAttribute(\"data-vivliostyle-scripting\") &&\n sameScripts(s, srcScriptElem)\n ) {\n // If same script is already loaded, remove the already loaded one before load the new one.\n window.document.head.removeChild(s);\n }\n }\n\n const scriptElem = window.document.createElement(\"script\");\n scriptElem.textContent = scriptContent;\n if (src) {\n scriptElem.src = src;\n }\n scriptElem.async = async;\n scriptElem.defer = defer;\n scriptElem.setAttribute(\"data-vivliostyle-scripting\", \"true\");\n\n for (const attr of srcScriptElem.attributes) {\n if (![\"src\", \"async\", \"defer\"].includes(attr.name)) {\n scriptElem.setAttribute(attr.name, attr.value);\n }\n }\n Logging.logger.debug(\"script:\", src);\n if (!src) {\n window.document.head.appendChild(scriptElem);\n return Task.newResult(true);\n } else {\n const fetcher = Net.loadElement(scriptElem);\n window.document.head.appendChild(scriptElem);\n return TaskUtil.waitForFetchers([fetcher]);\n }\n}\n\nfunction getAllFontFamilyList(\n srcDocument: Document,\n styler: CssStyler.Styler,\n): string {\n const fontFamilySet = {};\n const findFontFamilyInStyle = (style: any): void => {\n const fontFamily = style[\"font-family\"]?.value;\n if (fontFamily) {\n if (fontFamily.values) {\n for (const family1 of fontFamily.values) {\n fontFamilySet[family1.stringValue()] = true;\n }\n } else {\n fontFamilySet[fontFamily.stringValue()] = true;\n }\n }\n const marginBoxes = style[\"_marginBoxes\"];\n if (marginBoxes) {\n for (const marginBoxStyle of Object.values(marginBoxes)) {\n findFontFamilyInStyle(marginBoxStyle);\n }\n }\n };\n const findAllFontFamily = (arg: any): void => {\n if (arg instanceof CssCascade.ApplyRuleAction) {\n findFontFamilyInStyle(arg.style);\n } else if (arg instanceof CssCascade.CascadeAction || Array.isArray(arg)) {\n for (const v of Object.values(arg)) {\n findAllFontFamily(v);\n }\n }\n };\n // Find all font-family values in stylesheets.\n for (const obj of Object.values(styler.cascade.code)) {\n for (const arg of Object.values(obj ?? {})) {\n findAllFontFamily(arg);\n }\n }\n // Find all font-family values in inline style.\n for (const elem of srcDocument.querySelectorAll(\"[style]\")) {\n if ((elem as HTMLElement).style?.fontFamily) {\n fontFamilySet[(elem as HTMLElement).style.fontFamily] = true;\n }\n }\n return Object.keys(fontFamilySet).join(\",\");\n}\n\nfunction prepareTextContentForWebFonts(\n srcDocument: Document,\n window: Window,\n styler: CssStyler.Styler,\n): HTMLElement {\n const textContentDiv: HTMLElement =\n window.document.querySelector(\"[data-vivliostyle-textcontent]\") ??\n window.document.createElement(\"div\");\n textContentDiv.style.position = \"fixed\";\n textContentDiv.style.fontSize = \"0\";\n textContentDiv.setAttribute(\"data-vivliostyle-textcontent\", \"true\");\n textContentDiv.setAttribute(\"aria-hidden\", \"true\");\n textContentDiv.style.fontFamily = getAllFontFamilyList(srcDocument, styler);\n textContentDiv.textContent = srcDocument.documentElement.textContent;\n window.document.body.appendChild(textContentDiv);\n return textContentDiv;\n}\n\nexport function loadScriptsInHead(\n srcDocument: Document,\n window: Window,\n styler: CssStyler.Styler,\n): Task.Result<boolean> {\n if (!allowScripts) {\n return Task.newResult(false);\n }\n // Process script elements in head and also beginning of body\n const srcScripts: HTMLScriptElement[] = getScriptsInOrNearHead(srcDocument);\n if (srcScripts.length === 0) {\n return Task.newResult(false);\n }\n const needPrepareForWebFonts = srcScripts.some(\n (s) => !(s.async || s.defer || s.type === \"module\"),\n );\n\n // Web fonts needs text content of the document\n const textContentDiv = needPrepareForWebFonts\n ? prepareTextContentForWebFonts(srcDocument, window, styler)\n : null;\n const fonts = window.document.fonts; // FontFaceSet\n const savedDollar = window[\"$\"];\n let forceDefer = false;\n const frame: Task.Frame<boolean> = Task.newFrame(\"loadScripts\");\n frame\n .loop(() => {\n if (srcScripts.length === 0) {\n if (!needPrepareForWebFonts) {\n return Task.newResult(false); // break\n }\n return frame.sleep(20).thenAsync(() => {\n if (\n fonts.status === \"loading\" ||\n // for Typekit Web Font Loader (Adobe Fonts)\n window.document.documentElement.classList.contains(\"wf-loading\") ||\n // For DynaFont\n // FIXME: checking the global variable `ret` set in https://dfo.dynacw.co.jp/JSDynaFont/DynaFont.js\n // would be not very good, because it seems to have been made global by mistake.\n (window[\"FontJSON\"]?.Font &&\n window[\"ret\"]?.readyState &&\n window[\"ret\"].readyState < 4)\n ) {\n return Task.newResult(true); // continue\n }\n return Task.newResult(false); // break\n });\n }\n const srcScriptElem = srcScripts.shift();\n return loadScript(srcScriptElem, window, {\n inHead: true,\n forceDefer,\n }).thenAsync(() => {\n if (!forceDefer && window[\"$\"] !== savedDollar) {\n // jQuery `$(…)` does not work before document is loaded, so need to defer\n deferredScripts.push(srcScriptElem);\n forceDefer = true;\n }\n if (srcScripts.length === 0) {\n if (needPrepareForWebFonts) {\n // Some web font loaders (DynaFont, FONTPLUS) need DOMContentLoaded event\n Logging.logger.debug(\"dispatchEvent: DOMContentLoaded (document)\");\n window.document.dispatchEvent(new Event(\"DOMContentLoaded\"));\n }\n }\n return Task.newResult(true); // continue\n });\n })\n .then(() => {\n if (textContentDiv) {\n textContentDiv.remove();\n }\n frame.finish(true);\n });\n return frame.result();\n}\n\nexport function loadScriptsAtEnd(window: Window): Task.Result<boolean> {\n if (!allowScripts) {\n return Task.newResult(false);\n }\n const frame: Task.Frame<boolean> = Task.newFrame(\"loadScripts\");\n frame\n .loop(() => {\n if (deferredScripts.length === 0) {\n return Task.newResult(false);\n }\n return loadScript(deferredScripts.shift(), window, {\n atEnd: true,\n }).thenReturn(deferredScripts.length > 0);\n })\n .then(() => {\n Logging.logger.debug(\"dispatchEvent: DOMContentLoaded (window)\");\n window.dispatchEvent(new Event(\"DOMContentLoaded\"));\n Logging.logger.debug(\"dispatchEvent: load (window)\");\n window.dispatchEvent(new Event(\"load\"));\n frame.finish(true);\n });\n return frame.result();\n}\n\nexport function hasScripts(window: Window) {\n if (!allowScripts) {\n return false;\n }\n return (\n deferredScripts.length > 0 ||\n !!window.document.head.querySelector(\"script[data-vivliostyle-scripting]\")\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 LayoutHelper from \"./layout-helper\";\nimport * as Logging from \"./logging\";\nimport * as Matchers from \"./matchers\";\nimport * as Net from \"./net\";\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 Scripts from \"./scripts\";\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: { [key: string]: string } = {};\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{\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 /** @override */\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 const child = element.firstElementChild;\n if (child && Vtree.canIgnore(child.previousSibling)) {\n const childStyle = styler.getStyle(child, false);\n if (childStyle) {\n const childDisplay = CssCascade.getProp(childStyle, \"display\");\n if (\n childDisplay?.value &&\n childDisplay.value !== Css.ident.inline\n ) {\n continue;\n }\n }\n }\n }\n if (name === \"before\" || name === \"after\") {\n const content = pseudoMap[name][\"content\"] as CssCascade.CascadeValue;\n if (!content || !Vtree.nonTrivialContent(content.value)) {\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 ): CssCascade.ElementStyleMap {\n const pseudoMap = CssCascade.getStyleMap(cascStyle, \"_pseudos\");\n if (!pseudoMap) {\n return null;\n }\n const computedPseudoStyleMap: CssCascade.ElementStyleMap = {};\n for (const key in pseudoMap) {\n const computedPseudoStyle: { [key: string]: CssCascade.CascadeValue } =\n (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> =\n Task.newFrame(\"createRefShadow\");\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> =\n Task.newFrame(\"createShadows\");\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 /** @override */\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 if (Display.isRunning(computedStyle[\"position\"])) {\n // Running elements\n computedStyle[\"position\"] = Css.ident.fixed;\n computedStyle[\"visibility\"] = Css.ident.hidden;\n return vertical;\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.getComputedDisplayValue(\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(elementStyle: CssCascade.ElementStyle): {\n lang: string | null;\n elementStyle: CssCascade.ElementStyle;\n } {\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 let fontSize: Css.Val;\n let lineHeight: Css.Val;\n\n for (const name of propList) {\n inheritanceVisitor.setPropName(name);\n const prop = CssCascade.getProp(style, name);\n let prop1 = prop;\n if (!Css.isDefaultingValue(prop.value)) {\n if (\n name === \"font-size\" &&\n i === styles.length - 1 &&\n this.context.isRelativeRootFontSize &&\n this.context.rootFontSize\n ) {\n // Fix for issue #608, #549\n prop1 = new CssCascade.CascadeValue(\n new Css.Numeric(this.context.rootFontSize, \"px\"),\n prop.priority,\n );\n } else if (\n name === \"line-height\" &&\n i === styles.length - 1 &&\n this.context.rootLineHeight &&\n prop.value instanceof Css.Numeric &&\n (prop.value.unit === \"lh\" || prop.value.unit === \"rlh\")\n ) {\n // line-height with lh or rlh unit on root element\n prop1 = new CssCascade.CascadeValue(\n new Css.Numeric(this.context.rootLineHeight, \"px\"),\n prop.priority,\n );\n } else if (\n i === 0 &&\n prop.value instanceof Css.Numeric &&\n prop.value.unit === \"lh\"\n ) {\n // line-height with lh unit on current element\n prop1 = new CssCascade.CascadeValue(\n new Css.Numeric(\n prop.value.num *\n this.getLineHeightUnitSize(name, fontSize, lineHeight),\n \"px\",\n ),\n prop.priority,\n );\n } else if (!Css.isCustomPropName(name)) {\n prop1 = prop.filterValue(inheritanceVisitor);\n }\n\n if (name === \"font-size\") {\n fontSize = prop1.value;\n } else if (name === \"line-height\") {\n lineHeight = prop1.value;\n }\n\n props[name] = prop1;\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 =\n 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 (Css.isDefaultingValue(value)) {\n if (value === Css.ident.initial) {\n props[name] = undefined;\n }\n } else 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 default:\n props[name] = value;\n }\n } else {\n props[name] = value;\n }\n if (![\"widows\", \"orphans\"].includes(name)) {\n // Note: widows and orphans are polyfilled for page and\n // root multi-column, but they should be left to the browser\n // for multi-column boxes inside body. (Issue #1182)\n delete computedStyle[name];\n }\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\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: { [key: string]: Css.Val } = {};\n if (!this.nodeContext.parent) {\n const inheritedValues = this.inheritFromSourceParent(elementStyle);\n elementStyle = inheritedValues.elementStyle;\n this.nodeContext.lang = inheritedValues.lang;\n }\n const positionCV: CssCascade.CascadeValue = elementStyle[\"position\"];\n const floatCV: CssCascade.CascadeValue = elementStyle[\"float\"];\n const floatReferenceCV: CssCascade.CascadeValue =\n elementStyle[\"float-reference\"];\n const floatReference =\n floatCV &&\n !Css.isDefaultingValue(floatCV.value) &&\n floatCV.value !== Css.ident.none &&\n floatReferenceCV &&\n !Css.isDefaultingValue(floatReferenceCV.value)\n ? PageFloats.floatReferenceOf(floatReferenceCV.value.toString())\n : null;\n if (\n this.nodeContext.parent &&\n (Display.isRunning(positionCV?.value) ||\n (floatReference && 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(\n element,\n computedStyle,\n this.nodeContext.viewNode ?? this.nodeContext.parent?.viewNode,\n );\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 if (\n Scripts.allowScripts &&\n element.localName === \"script\" &&\n element.namespaceURI === Base.NS.XHTML\n ) {\n Scripts.loadScript(\n element as HTMLScriptElement,\n this.viewport.window,\n ).thenFinish(frame);\n return frame.result();\n }\n let display = computedStyle[\"display\"] as Css.Ident;\n if (Css.isDefaultingValue(display)) {\n if (display === Css.ident.initial || display === Css.ident.unset) {\n display = Css.ident.inline;\n } else if (display === Css.ident.inherit) {\n display =\n this.nodeContext.parent?.display &&\n Css.getName(this.nodeContext.parent?.display);\n } else {\n display = null;\n }\n }\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 as Vtree.ShadowContext,\n ).then((shadowParam) => {\n this.nodeContext.nodeShadow = shadowParam;\n const position = computedStyle[\"position\"] as Css.Ident;\n let floatSide = computedStyle[\"float\"] as Css.Ident;\n let clearSide = computedStyle[\"clear\"] as Css.Ident;\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\"] as Css.Ident,\n writingMode,\n parentWritingMode,\n isFlowRoot,\n );\n this.nodeContext.containingBlockForAbsolute =\n Display.establishesCBForAbsolute(position);\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 const breakInside = computedStyle[\"break-inside\"];\n if (\n floating ||\n (breakInside &&\n !Css.isDefaultingValue(breakInside) &&\n breakInside !== 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 const floatMinWrapBlock = computedStyle[\"float-min-wrap-block\"];\n this.nodeContext.floatMinWrapBlock =\n floatMinWrapBlock && !Css.isDefaultingValue(floatMinWrapBlock)\n ? (floatMinWrapBlock as Css.Numeric)\n : null;\n\n // Leaves handling of multicol specified on non-root/body elements to the browser\n const insideNonRootMultiColumn = this.isInsideNonRootMultiColumn();\n\n const columnSpan = computedStyle[\"column-span\"];\n this.nodeContext.columnSpan =\n !insideNonRootMultiColumn &&\n columnSpan &&\n !Css.isDefaultingValue(columnSpan)\n ? columnSpan\n : null;\n if (!this.nodeContext.inline) {\n const breakAfter = computedStyle[\"break-after\"];\n if (\n breakAfter &&\n !Css.isDefaultingValue(breakAfter) &&\n !(insideNonRootMultiColumn && breakAfter === Css.ident.column)\n ) {\n this.nodeContext.breakAfter = breakAfter.toString();\n if (Break.forcedBreakValues[this.nodeContext.breakAfter]) {\n delete computedStyle[\"break-after\"];\n }\n }\n const breakBefore = computedStyle[\"break-before\"];\n if (\n breakBefore &&\n !Css.isDefaultingValue(breakBefore) &&\n !(insideNonRootMultiColumn && breakBefore === Css.ident.column)\n ) {\n this.nodeContext.breakBefore = breakBefore.toString();\n if (Break.forcedBreakValues[this.nodeContext.breakBefore]) {\n delete computedStyle[\"break-before\"];\n }\n }\n // Named page type\n const pageVal: Css.Val = computedStyle[\"page\"];\n let pageType =\n pageVal && !Css.isDefaultingValue(pageVal) && pageVal.toString();\n if (\n !pageType &&\n !this.nodeContext.parent &&\n this.nodeContext.shadowContext\n ) {\n // Keep currentPageType for shadowContext (Fix for issue #1233)\n pageType = this.styler.cascade.currentPageType;\n }\n if (!pageType || pageType.toLowerCase() === \"auto\") {\n pageType = this.nodeContext.pageType;\n } else {\n this.nodeContext.pageType = pageType;\n }\n if (\n this.styler.cascade.currentPageType !== pageType &&\n // Fixed positioned or running elements should not affect page type\n // unless page type is explicitly set\n !(!pageType && computedStyle[\"position\"] === Css.ident.fixed)\n ) {\n if (!Break.isSpreadBreakValue(this.nodeContext.breakBefore)) {\n this.nodeContext.breakBefore = \"page\";\n }\n this.styler.cascade.previousPageType =\n this.styler.cascade.currentPageType;\n this.styler.cascade.currentPageType = pageType;\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: Css.Val;\n let blockBorderSpacing: Css.Val;\n if (borderSpacing) {\n if (borderSpacing instanceof Css.SpaceList) {\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 const footnotePolicy = computedStyle[\"footnote-policy\"] as Css.Ident;\n this.nodeContext.footnotePolicy =\n footnotePolicy && !Css.isDefaultingValue(footnotePolicy)\n ? footnotePolicy\n : null;\n const firstPseudo = computedStyle[\"x-first-pseudo\"] as Css.Int;\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 instanceof Css.Str) {\n this.nodeContext.hyphenateCharacter = hyphenateCharacter.str;\n }\n const wordBreak = computedStyle[\"word-break\"];\n const lineBreak = computedStyle[\"line-break\"];\n const overflowWrap = computedStyle[\"overflow-wrap\"];\n if (\n wordBreak === Css.ident.break_all ||\n lineBreak === Css.ident.anywhere ||\n overflowWrap === Css.ident.break_word ||\n overflowWrap === Css.ident.anywhere\n ) {\n this.nodeContext.breakWord = true;\n }\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 =\n this.processRepeatOnBreak(computedStyle);\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 (elementStyle[\"content\"]?.value?.url) {\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 if (computedStyle[\"display\"] === Css.ident.none) {\n // No element should be created if display:none is set.\n // (Fix issue #924)\n frame.finish(false);\n return;\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 (!Scripts.allowScripts && 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 const transformedValue =\n this.documentURLTransformer.transformFragment(\n attributeValue,\n this.xmldoc.url,\n );\n if (\n Scripts.allowScripts &&\n !(\n result.namespaceURI === Base.NS.SVG &&\n result.localName !== \"svg\"\n ) &&\n !result.ownerDocument.getElementById(attributeValue)\n ) {\n // Keep original id value so that JavaScript can manipulate it\n result.setAttribute(attributeName, attributeValue);\n result.setAttribute(\"data-vivliostyle-id\", transformedValue);\n\n // Create an anchor element with transformed id, necessary for internal links in output PDF\n // (issue #877)\n const anchorElem = result.ownerDocument.createElement(\"a\");\n anchorElem.setAttribute(attributeName, transformedValue);\n anchorElem.setAttribute(Vtree.SPECIAL_ATTR, \"1\");\n anchorElem.style.position = \"absolute\";\n result.appendChild(anchorElem);\n } else {\n result.setAttribute(attributeName, transformedValue);\n }\n this.page.registerElementWithId(result, transformedValue);\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 } else if (\n attributeName === \"data\" &&\n custom &&\n tag === \"object\" &&\n result.hasAttribute(\"data\")\n ) {\n // the data attribute is already set in OPFView.makeObjectView()\n continue;\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 = Net.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.documentURLTransformer.transformURL(\n this.resolveURL(attributeValue),\n this.xmldoc.url,\n );\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(Net.loadElement(result, attributeValue));\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 try {\n result.setAttribute(attributeName, attributeValue);\n } catch (err) {\n Logging.logger.warn(err);\n }\n }\n }\n }\n if (delayedSrc) {\n const image = tag === \"input\" ? new Image() : result;\n const imageFetcher = Net.loadElement(image, delayedSrc);\n if (image !== result) {\n (result as HTMLImageElement).src = delayedSrc;\n }\n const isInsideRunningElement = (): boolean => {\n // Check if the image is inside a position:fixed or running element\n // which is converted to position:fixed.\n if (computedStyle[\"position\"] === Css.ident.fixed) {\n return true;\n }\n for (\n let p = this.nodeContext.parent?.viewNode as HTMLElement;\n p && p !== this.viewRoot;\n p = p.parentElement\n ) {\n if (p.style?.[\"position\"] === \"fixed\") {\n return true;\n }\n }\n return false;\n };\n if (!hasAutoWidth && !hasAutoHeight && !isInsideRunningElement()) {\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(Net.loadElement(new Image(), listStyleURL));\n }\n this.preprocessElementStyle(computedStyle);\n this.applyComputedStyles(result, computedStyle);\n\n if (this.nodeContext.inline) {\n if (!firstTime) {\n Break.setBoxBreakFlag(result, \"inline-start\");\n if (Break.isCloneBoxDecorationBreak(result)) {\n Break.setBoxBreakFlag(result, \"clone\");\n }\n }\n } else {\n if (!firstTime) {\n Break.setBoxBreakFlag(result, \"block-start\");\n if (Break.isCloneBoxDecorationBreak(result)) {\n Break.setBoxBreakFlag(result, \"clone\");\n\n // When box-decoration-break: clone, cloned margins are always\n // truncated to zero.\n Break.setMarginDiscardFlag(result, \"block-start\");\n }\n } else if (\n !Display.isAbsolutelyPositioned(computedStyle[\"position\"])\n ) {\n const marginBreak = computedStyle[\"margin-break\"];\n\n // Detect forced or unforced break at this point\n // to handle margin-break properly.\n // Note: Do not use `atUnforcedBreak` which may be inaccurate.\n const breakType = this.getBreakTypeAt(this.nodeContext);\n const anyBreak = breakType !== null;\n const unforcedBreak = breakType === \"auto\";\n if (\n (marginBreak === Css.ident.discard && anyBreak) ||\n (marginBreak !== Css.ident.keep && unforcedBreak)\n ) {\n Break.setMarginDiscardFlag(result, \"block-start\");\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 element is inside multi-column element\n * that is not root or body element in the source tree.\n *\n * Note: vivliostyle handles multi-column on the root and body element on its own,\n * but leaves it to the browser to handle other multi-column.\n * This check is for such non-root/body multi-column.\n */\n private isInsideNonRootMultiColumn(): boolean {\n for (\n let node = this.nodeContext.parent?.viewNode;\n node;\n node = node.parentNode\n ) {\n const style = node.nodeType === 1 ? (node as HTMLElement).style : null;\n if (!style) {\n break;\n }\n if (\n !isNaN(parseFloat(style.columnCount)) ||\n !isNaN(parseFloat(style.columnWidth))\n ) {\n return true;\n }\n if (style.position === \"absolute\") {\n break;\n }\n }\n return false;\n }\n\n /**\n * Check if the current position is at a forced or unforced break\n * (Fix for Issue #690)\n *\n * @param nodeContext\n * @returns forced break type, or \"auto\" for unforced break, or null for not break\n */\n private getBreakTypeAt(nodeContext: Vtree.NodeContext): string | null {\n for (let nc = nodeContext; nc && !nc.after; nc = nc.parent) {\n if (Break.isForcedBreakValue(nc.breakBefore)) {\n return nc.breakBefore; // forced break\n }\n if (nc.fragmentIndex === 1 && !nc.parent) {\n if (nc.sourceNode === nc.sourceNode.ownerDocument.documentElement) {\n // beginning of document\n return \"page\";\n } else {\n // page floats, etc.\n return null;\n }\n }\n const parentViewNode = nc.parent?.viewNode as Element;\n if (parentViewNode) {\n const style = this.viewport.window.getComputedStyle(parentViewNode);\n const paddingBlockStart = parseFloat(style.paddingBlockStart);\n const borderBlockStartWidth = parseFloat(style.borderBlockStartWidth);\n if (paddingBlockStart || borderBlockStartWidth) {\n // parent's viewNode has block-start padding or border\n return null;\n }\n let node = parentViewNode?.firstChild;\n while (\n node &&\n (Vtree.canIgnore(node, nc.parent.whitespace) ||\n LayoutHelper.isOutOfFlow(node))\n ) {\n node = node.nextSibling;\n }\n if (node && node !== nc.viewNode) {\n // parent's viewNode already has other content\n return null;\n }\n }\n }\n\n const startBreakType = (\n this.context as Exprs.Context & {\n currentLayoutPosition: Vtree.LayoutPosition;\n }\n )?.currentLayoutPosition?.flowPositions[this.flowName]?.startBreakType;\n\n if (Break.isForcedBreakValue(startBreakType)) {\n return startBreakType; // forced break\n } else {\n return \"auto\"; // unforced break\n }\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 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: { [key: string]: Css.Val } = {};\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 =\n new RepetitiveElement.RepetitiveElementsOwnerFormattingContext(\n parentFormattingContext,\n this.nodeContext.sourceNode as Element,\n );\n (\n this.nodeContext\n .formattingContext as RepetitiveElement.RepetitiveElementsOwnerFormattingContext\n ).initializeRepetitiveElements(this.nodeContext.vertical);\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 (\n repeatOnBreak === Css.ident.auto ||\n Css.isDefaultingValue(repeatOnBreak)\n ) {\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 isPseudo = (node: Node, name: string): boolean =>\n node?.nodeType === 1 &&\n PseudoElement.getPseudoName(node as Element) === name;\n const p = this.nodeContext.parent;\n const parent = p\n ? isPseudo(this.viewNode, \"after\") &&\n isPseudo(p.viewNode, \"first-letter\") &&\n p.viewNode?.hasChildNodes()\n ? (p.parent.viewNode as Element) // Fix for issue #1175\n : (p.viewNode as Element)\n : this.viewRoot;\n if (parent) {\n if (\n this.nodeContext.inline &&\n // ignore whitespace text node\n !(this.viewNode.nodeType === 3 && Vtree.canIgnore(this.viewNode)) &&\n !parent.hasChildNodes() &&\n Break.getBoxBreakFlags(parent).includes(\"block-start\")\n ) {\n Break.setBoxBreakFlag(parent, \"text-start\");\n }\n parent.appendChild(this.viewNode);\n }\n }\n frame.finish(needToProcessChildren);\n });\n return frame.result();\n }\n\n /** @override */\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 as Element).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 const contentShadow = shadow.subShadow || shadow.parentShadow;\n if (shadow.subShadow) {\n contentNode = shadow.root;\n contentShadowType = shadow.type;\n if (contentShadowType == Vtree.ShadowType.ROOTLESS) {\n contentNode = contentNode.firstChild;\n }\n } else {\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 /** @override */\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(Net.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 const isRoot =\n this.nodeContext?.parent === null &&\n this.sourceNode?.parentElement === null &&\n !!this.viewRoot?.parentElement;\n\n const propList = Object.keys(computedStyle);\n propList.sort(Css.processingOrderFn);\n let fontSize: Css.Val;\n let lineHeight: Css.Val;\n\n for (const propName of propList) {\n if (propertiesNotPassedToDOM[propName]) {\n continue;\n }\n let value = computedStyle[propName];\n if (!value || (value === Css.empty && !Css.isCustomPropName(propName))) {\n continue;\n }\n value = value.visit(\n new CssProp.UrlTransformVisitor(\n this.xmldoc.url,\n this.documentURLTransformer,\n ),\n );\n if (\n value instanceof Css.Numeric &&\n Exprs.needUnitConversion(value.unit)\n ) {\n if (value.unit === \"lh\") {\n // for browsers not supporting \"lh\" unit\n value = new Css.Numeric(\n value.num *\n this.getLineHeightUnitSize(propName, fontSize, lineHeight),\n \"px\",\n );\n } else {\n // font-size for the root element is already converted to px\n value = Css.convertNumericToPx(value, this.context);\n }\n }\n\n if (propName === \"font-size\") {\n fontSize = value;\n } else if (propName === \"line-height\") {\n lineHeight = value;\n }\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 if (target.localName === \"rt\" && propName === \"font-size\") {\n // Fix for Issue #673\n if (this.fixRubyTextFontSize(target, value)) {\n continue;\n }\n }\n if (\n isRoot &&\n this.page.pageAreaElement &&\n CssCascade.isInherited(propName)\n ) {\n // Fix for Issue #568\n Base.setCSSProperty(\n this.page.pageAreaElement.parentElement,\n propName,\n value.toString(),\n );\n } else {\n Base.setCSSProperty(target, propName, value.toString());\n }\n }\n }\n\n /**\n * Get \"lh\" unit size in px\n */\n private getLineHeightUnitSize(\n propName: string,\n fontSize: Css.Val,\n lineHeight: Css.Val,\n ): number {\n // Note: \"lh\" unit is inaccurate for line-height:normal, not using font metrics.\n const defaultLineHeightNum =\n Exprs.defaultUnitSizes[\"lh\"] / Exprs.defaultUnitSizes[\"em\"];\n\n const parentStyle =\n this.nodeContext.parent?.viewNode?.nodeType === 1\n ? this.viewport.window.getComputedStyle(\n this.nodeContext.parent.viewNode as Element,\n )\n : null;\n\n const parentFontSize = parentStyle\n ? parseFloat(parentStyle.fontSize)\n : this.context.fontSize();\n\n const parentLineHeight = parentStyle\n ? parentStyle.lineHeight === \"normal\"\n ? parentFontSize * defaultLineHeightNum\n : parseFloat(parentStyle.lineHeight)\n : this.context.rootLineHeight;\n\n if (propName === \"line-height\" || propName === \"font-size\") {\n return parentLineHeight;\n }\n\n let lineHeightNum: number | null = null;\n\n if (lineHeight) {\n if (\n lineHeight instanceof Css.Num ||\n (lineHeight instanceof Css.Numeric &&\n (lineHeight.unit === \"em\" || lineHeight.unit === \"%\"))\n ) {\n lineHeightNum =\n lineHeight instanceof Css.Numeric && lineHeight.unit === \"%\"\n ? lineHeight.num / 100\n : lineHeight.num;\n } else if (lineHeight instanceof Css.Numeric) {\n return (\n lineHeight.num * this.context.queryUnitSize(lineHeight.unit, false)\n );\n }\n } else {\n for (\n let viewNode = this.nodeContext.parent?.viewNode;\n ;\n viewNode = viewNode.parentNode\n ) {\n if (!viewNode || viewNode.nodeType !== 1) {\n lineHeightNum = defaultLineHeightNum;\n break;\n }\n const ancestorLH = (viewNode as HTMLElement)?.style?.lineHeight;\n if (ancestorLH) {\n if (/^[0-9.]+$/.test(ancestorLH)) {\n lineHeightNum = parseFloat(ancestorLH);\n }\n if (ancestorLH === \"normal\") {\n lineHeightNum = defaultLineHeightNum;\n }\n break;\n }\n }\n }\n\n if (lineHeightNum !== null) {\n if (fontSize instanceof Css.Numeric) {\n return (\n lineHeightNum *\n CssCascade.convertFontSizeToPx(fontSize, parentFontSize, this.context)\n .num\n );\n } else {\n return lineHeightNum * parentFontSize;\n }\n }\n return parentLineHeight;\n }\n\n /**\n * Fix ruby text font size.\n * Issue #673: Minimum font size setting in Chrome causes ruby font size problem\n * @param target the rt element\n * @param value the font-size value\n * @returns true if the font-size fix is done\n */\n fixRubyTextFontSize(target: Element, value: Css.Val): boolean {\n if (!/Chrome/.test(navigator.userAgent)) {\n // Do nothing if the browser engine is not \"Chrome\"\n return false;\n }\n if (!value.isNumeric()) {\n return false;\n }\n const numeric = value as Css.Numeric;\n let fontSizeInPx: number;\n if (numeric.unit === \"%\" || numeric.unit === \"em\") {\n const parentElem = this.nodeContext?.parent?.viewNode as Element;\n const parentFontSize =\n parentElem &&\n parseFloat(this.viewport.window.getComputedStyle(parentElem).fontSize);\n fontSizeInPx =\n (parentFontSize * numeric.num) / (numeric.unit === \"%\" ? 100 : 1);\n } else {\n fontSizeInPx = Css.convertNumericToPx(numeric, this.context).num;\n }\n if (!fontSizeInPx) {\n return false;\n }\n const minFontSizeInPx = 10; // Default minimum font size setting in Chrome\n if (fontSizeInPx >= minFontSizeInPx) {\n return false;\n }\n if ((target as HTMLElement).style?.[\"zoom\"] === undefined) {\n return false;\n }\n const zoom = fontSizeInPx / minFontSizeInPx;\n Base.setCSSProperty(target, \"font-size\", `${minFontSizeInPx}px`);\n Base.setCSSProperty(target, \"zoom\", `${zoom}`);\n return true;\n }\n\n /** @override */\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: { [key: string]: Css.Val } = {};\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 /** @override */\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 /** @override */\n applyFootnoteStyle(\n vertical: boolean,\n rtl: boolean,\n target: Element,\n ): boolean {\n const computedStyle: { [key: string]: Css.Val } = {};\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: { [key: string]: Css.Val } = {};\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 /** @override */\n processFragmentedBlockEdge(nodeContext: Vtree.NodeContext) {\n const nodeContext1 =\n !nodeContext.inline && nodeContext.after\n ? nodeContext.parent\n : nodeContext;\n // Fix for problem with math (Issue #1038)\n let isBeforeBlock = false;\n if (\n nodeContext.inline &&\n nodeContext.after &&\n !nodeContext.shadowContext &&\n nodeContext.sourceNode.nextSibling?.nodeType === 1\n ) {\n const nextElem = nodeContext.sourceNode.nextSibling as Element;\n const display = CssCascade.getProp(\n this.styler.getStyle(nextElem, false),\n \"display\",\n )?.value.toString();\n isBeforeBlock =\n (display && !Display.isInlineLevel(display)) ||\n (nextElem.getAttribute(\"data-math-typeset\") === \"true\" &&\n /^\\s*(\\$\\$|\\\\\\[)/.test(nextElem.textContent));\n }\n\n let blockNestCount = 0;\n for (let nc = nodeContext1; nc; nc = nc.parent) {\n if (nc.viewNode?.nodeType !== 1) continue;\n\n const elem = nc.viewNode as HTMLElement;\n if (!elem.style) continue;\n\n if (nc.inline) {\n Break.setBoxBreakFlag(elem, \"inline-end\");\n if (Break.isCloneBoxDecorationBreak(elem)) {\n const extentBefore = nc.vertical\n ? elem.offsetWidth\n : elem.offsetHeight;\n Break.setBoxBreakFlag(elem, \"clone\");\n const extentAfter = nc.vertical\n ? elem.offsetWidth\n : elem.offsetHeight;\n if (extentAfter > extentBefore) {\n // Workaround for Chrome box-decoration-break:clone problem\n this.fixClonedBoxDecorationOverflow(elem);\n }\n }\n } else {\n Break.setBoxBreakFlag(elem, \"block-end\");\n if (!blockNestCount++) {\n if (nc !== nodeContext1) {\n const { textAlign } = this.viewport.window.getComputedStyle(elem);\n if (textAlign === \"justify\" && !isBeforeBlock) {\n // Workaround for the problem that text-align-last:justify is\n // not only effective at the last line of the block but also\n // effective at lines just before child block-level or `<br>`\n // elements.\n const elem2 = this.createChildAnonymousBlockIfNeeded(elem);\n if (elem2) {\n if (elem2 !== elem) {\n // child anonymous block created\n Break.setBoxBreakFlags(elem2, [\n \"block-start\",\n \"text-start\",\n \"block-end\",\n \"text-end\",\n \"justify\",\n ]);\n } else {\n Break.setBoxBreakFlag(elem, \"text-end\");\n Break.setBoxBreakFlag(elem, \"justify\");\n }\n } else {\n // text-align-last:justify is not necessary (`<br>` at very last)\n // or not appropriate (e.g. the last `<br>` is in middle of nested inline)\n Break.setBoxBreakFlag(elem, \"text-end\");\n }\n } else {\n Break.setBoxBreakFlag(elem, \"text-end\");\n }\n }\n }\n if (Break.isCloneBoxDecorationBreak(elem)) {\n Break.setBoxBreakFlag(elem, \"clone\");\n Break.setMarginDiscardFlag(elem, \"block-end\");\n }\n }\n }\n }\n\n private fixClonedBoxDecorationOverflow(elem: HTMLElement): void {\n const computedStyle = this.viewport.window.getComputedStyle(elem);\n const paddingInlineEnd = parseFloat(computedStyle.paddingInlineEnd);\n const borderInlineEndWidth = parseFloat(computedStyle.borderInlineEndWidth);\n const adjust = -(paddingInlineEnd + borderInlineEndWidth);\n if (!isNaN(adjust)) {\n elem.style.marginInlineEnd = `${adjust}px`;\n }\n }\n\n private createChildAnonymousBlockIfNeeded(\n elem: HTMLElement,\n ): HTMLElement | null {\n const checkForcedLineBreakElem = (elem1: Element): boolean | null => {\n const { display, position, float } =\n this.viewport.window.getComputedStyle(elem1);\n if (elem1.localName === \"ruby\") {\n return false;\n }\n if (elem1.localName === \"br\") {\n return true;\n }\n if (\n (display === \"inline\" || display === \"contents\") &&\n elem1.hasChildNodes()\n ) {\n const lastChild = elem1.lastElementChild;\n if (\n lastChild &&\n (!lastChild.nextSibling ||\n (lastChild.nextSibling === elem1.lastChild &&\n Vtree.canIgnore(lastChild.nextSibling)))\n ) {\n const found = checkForcedLineBreakElem(lastChild);\n if (found || found === null) {\n return found;\n }\n }\n for (\n let child = lastChild?.previousElementSibling;\n child;\n child = child.previousElementSibling\n ) {\n const found = checkForcedLineBreakElem(child);\n if (found || found === null) {\n // forced line break is found at middle of nested inline\n return null;\n }\n }\n return false;\n }\n if (\n display === \"none\" ||\n position === \"absolute\" ||\n position === \"fixed\" ||\n (float && float !== \"none\") ||\n elem1.hasAttribute(Vtree.SPECIAL_ATTR)\n ) {\n const prevElem = elem1.previousElementSibling;\n if (\n prevElem &&\n (prevElem.nextSibling === elem1 ||\n (prevElem.nextSibling === elem1.previousSibling &&\n Vtree.canIgnore(prevElem.nextSibling)))\n ) {\n return checkForcedLineBreakElem(prevElem);\n }\n return false;\n }\n if (!display || Display.isInlineLevel(display)) {\n return false;\n }\n return true;\n };\n\n let forcedBreakElem: Element | null = null;\n for (\n let child = elem.lastElementChild;\n child;\n child = child.previousElementSibling\n ) {\n const found = checkForcedLineBreakElem(child);\n if (found) {\n forcedBreakElem = child;\n break;\n }\n if (found === null) {\n // forced line break is found at middle of nested inline\n return null;\n }\n }\n\n if (!forcedBreakElem) {\n // forced line break is not found\n return elem;\n }\n\n if (\n forcedBreakElem === elem.lastElementChild &&\n (!forcedBreakElem.nextSibling ||\n (forcedBreakElem.nextSibling === elem.lastChild &&\n Vtree.canIgnore(forcedBreakElem.nextSibling)))\n ) {\n // forced line break is found at very last\n return null;\n }\n\n const anonymousBlock = elem.ownerDocument.createElement(\"span\");\n anonymousBlock.className = \"viv-anonymous-block\";\n\n for (\n let node = forcedBreakElem.nextSibling, nextNode = null;\n node;\n node = nextNode\n ) {\n nextNode = node.nextSibling;\n anonymousBlock.appendChild(node);\n }\n elem.appendChild(anonymousBlock);\n return anonymousBlock;\n }\n\n /** @override */\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 /** @override */\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 \"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 \"margin-break\": true,\n page: true,\n};\n\nexport class DefaultClientLayout implements Vtree.ClientLayout {\n layoutBox: Element;\n window: Window;\n scaleRatio: number = 1;\n\n constructor(viewport: Viewport) {\n this.layoutBox = viewport.layoutBox;\n this.window = viewport.window;\n if (viewport.pixelRatio > 0 && CSS.supports(\"zoom\", \"8\")) {\n this.scaleRatio = viewport.pixelRatio / viewport.window.devicePixelRatio;\n }\n }\n\n private scaleRect(rect: Vtree.ClientRect): Vtree.ClientRect {\n return {\n left: rect.left * this.scaleRatio,\n top: rect.top * this.scaleRatio,\n right: rect.right * this.scaleRatio,\n bottom: rect.bottom * this.scaleRatio,\n width: rect.width * this.scaleRatio,\n height: rect.height * this.scaleRatio,\n } as Vtree.ClientRect;\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 /** @override */\n getRangeClientRects(range: Range): Vtree.ClientRect[] {\n const rects = range.getClientRects();\n const layoutBoxRect = this.layoutBox.getBoundingClientRect();\n return Array.from(rects).map((rect) =>\n this.scaleRect(this.subtractOffsets(rect, layoutBoxRect)),\n );\n }\n\n /** @override */\n getElementClientRect(element: Element): Vtree.ClientRect {\n const htmlElement = element as HTMLElement;\n const rect = htmlElement.getBoundingClientRect() as Vtree.ClientRect;\n if (\n rect.left === 0 &&\n rect.top === 0 &&\n rect.right === 0 &&\n rect.bottom === 0\n ) {\n // getBoundingClientRect() returns 0,0,0,0 for WBR element (Chrome)\n // (Fix for issue #802)\n return rect;\n }\n const layoutBoxRect = this.layoutBox.getBoundingClientRect();\n return this.scaleRect(this.subtractOffsets(rect, layoutBoxRect));\n }\n\n /** @override */\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 public readonly pixelRatio: 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\n if (pixelRatio > 0 && CSS.supports(\"zoom\", \"8\")) {\n // Emulate high pixel ratio using zoom and transform:scale().\n // Workaround for issue #419 (minimum border width too thick)\n // and #1076 (layout depends on device pixel ratio).\n //\n // CSS variables --viv-outputPixelRatio, --viv-devicePixelRatio,\n // and --viv-outputScale are used in zoom and transform property values\n // to emulate high pixel ratio output.\n // (see VivliostyleViewportCss in assets.ts)\n Base.setCSSProperty(this.root, \"--viv-outputPixelRatio\", `${pixelRatio}`);\n Base.setCSSProperty(\n this.root,\n \"--viv-devicePixelRatio\",\n `${window.devicePixelRatio}`,\n );\n }\n\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 this.width =\n opt_width ||\n parseFloat(window.getComputedStyle(this.root).width) ||\n this.root.offsetWidth ||\n window.innerWidth;\n this.height =\n opt_height ||\n parseFloat(window.getComputedStyle(this.root).height) ||\n this.root.offsetHeight ||\n window.innerHeight;\n\n // Use the fallbackPageSize if window size is 0 or browser is in headless mode.\n const fallbackPageSize = {\n // compromise between A4 (210mm 297mm) and letter (8.5in 11in)\n width: 794, // 210mm (8.27in)\n height: 1056, // 279.4mm (11in)\n };\n const isHeadlessBrowser =\n (!window.outerWidth && !window.outerHeight) ||\n /Headless/.test(navigator.userAgent) ||\n (navigator.webdriver &&\n window.innerWidth === 800 &&\n window.innerHeight === 600);\n\n if (!this.width || (!opt_width && isHeadlessBrowser)) {\n this.width = fallbackPageSize.width;\n }\n if (!this.height || (!opt_height && isHeadlessBrowser)) {\n this.height = fallbackPageSize.height;\n }\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.root, \"--viv-outputScale\", `${scale}`);\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 }\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 Scripts from \"./scripts\";\nimport * as Task from \"./task\";\nimport * as TaskUtil from \"./task-util\";\nimport * as TextPolyfill from \"./text-polyfill\";\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, UserAgentTocCss } from \"./assets\";\n\nexport const uaStylesheetBaseFetcher: TaskUtil.Fetcher<boolean> =\n new TaskUtil.Fetcher(() => {\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 }, \"uaStylesheetBaseFetcher\");\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 this.pageScope.defineName(\n \"blank-page\",\n new Exprs.Native(\n this.pageScope,\n function () {\n const styleInstance = this as StyleInstance;\n const cp = styleInstance.currentLayoutPosition;\n return cp?.isBlankPage;\n },\n \"blank-page\",\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\"] as CssCascade.CascadeValue;\n const height = viewportProps[\"height\"] as CssCascade.CascadeValue;\n const textZoom = viewportProps[\"text-zoom\"] as CssCascade.CascadeValue;\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{\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\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\n // Named page type at first page\n this.styler.cascade.currentPageType = this.styler.cascade.firstPageType;\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).then(() => {\n // JavaScript in HTML documents support\n Scripts.loadScriptsInHead(\n this.xmldoc.document,\n this.viewport.window,\n this.styler,\n ).thenFinish(frame);\n });\n\n // Determine page sheet sizes corresponding to page selectors\n const pageProps = this.style.pageProps;\n if (!pageProps[\"\"]) {\n pageProps[\"\"] = {};\n }\n Object.keys(pageProps).forEach((selector) => {\n let pageStyle = pageProps[selector] as {\n [key: string]: CssCascade.CascadeValue;\n };\n\n // Substitute var() in @page\n this.styler.cascade.applyVarFilter([pageStyle], this.styler, null);\n\n // Calculate calc()\n this.styler.cascade.applyCalcFilter(pageStyle, this.styler.context);\n\n const pageSizeAndBleed = CssPage.evaluatePageSizeAndBleed(\n CssPage.resolvePageSizeAndBleed(pageStyle),\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 /** @override */\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 /** @override */\n registerInstance(key: string, instance: PageMaster.PageBoxInstance): void {\n this.pageBoxInstances[key] = instance;\n }\n\n /** @override */\n lookupInstance(key: string): PageMaster.PageBoxInstance {\n return this.pageBoxInstances[key];\n }\n\n /** @override */\n encounteredFlowChunk(flowChunk: Vtree.FlowChunk, flow: Vtree.Flow): void {\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 override evalSupportsTest(\n name: string,\n value: string,\n isFunc: boolean,\n ): boolean {\n if (isFunc) {\n if (name === \"selector\") {\n return this.evalSupportsSelector(value);\n }\n return false;\n }\n if (!name) {\n // `(...)` without `name:`\n return false;\n }\n\n let supported = true;\n\n class SupportsReceiver implements CssValidator.PropertyReceiver {\n unknownProperty(name: string, value: Css.Val): void {\n supported = false;\n }\n invalidPropertyValue(name: string, value: Css.Val): void {\n supported = false;\n }\n simpleProperty(name: string, value: Css.Val, important): void {}\n }\n\n const supportsReceiver = new SupportsReceiver();\n const val = CssParser.parseValue(\n this.style.rootScope,\n new CssTokenizer.Tokenizer(value, null),\n \"\",\n );\n if (!val) {\n return false;\n }\n const validatorSet = (this.xmldoc.store as OPSDocStore).validatorSet;\n validatorSet.validatePropertyAndHandleShorthand(\n name,\n val,\n false,\n supportsReceiver,\n );\n return supported;\n }\n\n /**\n * @param selectorText\n * @returns true if selectorText is supported selector\n */\n private evalSupportsSelector(selectorText: string): boolean {\n const sph = new StyleParserHandler(null);\n const tokenizer = new CssTokenizer.Tokenizer(selectorText + \"{}\", sph);\n const parser = new CssParser.Parser(\n CssParser.actionsBase,\n tokenizer,\n sph,\n \"\",\n );\n if (\n parser.runParser(Number.POSITIVE_INFINITY, false, false, false, false)\n ) {\n return !sph.cascadeParserHandler.invalid;\n }\n return false;\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 | null): 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 = flowPos.startBreakType;\n flowPos.startBreakType = Break.breakValueToStartBreakType(\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 if (\n pageMaster.pageBox.pseudoName ===\n PageMaster.userAgentPageMasterPseudo &&\n !(this.actualPageWidth && this.actualPageHeight)\n ) {\n // If page master is UA page master and page size is not determined,\n // set lookup position to infinity.\n // This is to prevent pagination problem depending on viewport size.\n // (Fix for Issue #1228)\n coeff = Infinity;\n }\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 const size = cascadedPageStyle[\"size\"];\n cascadedPageStyle = {}; // clear margin boxes\n if (size) {\n // Restore page size (fix for issue #743)\n cascadedPageStyle[\"size\"] = size;\n }\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 =\n this.layoutPositionAtPageStart.flowPositions[parentFlowName];\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.startBreakType);\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 =\n 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. (Issue #681)\n const checkPageFloatForLaterPage = (\n float: PageFloats.PageFloat,\n ): boolean => {\n // FIXME: This check is incomplete when float-reference is other than \"page\".\n // so give up for now to prevent another problem (Issue #962).\n if (\n !this.pageAreaWidth &&\n !this.pageAreaHeight &&\n float.floatReference !== PageFloats.FloatReference.PAGE\n ) {\n return false;\n }\n const pageStartPos = this.layoutPositionAtPageStart.flowPositions.body;\n const pageStartOffset =\n pageStartPos && this.getConsumedOffset(pageStartPos);\n const deferredFloatOffset = this.xmldoc.getNodeOffset(\n float.nodePosition.steps[0].node,\n 0,\n false,\n );\n return (\n deferredFloatOffset != null &&\n pageStartOffset != null &&\n deferredFloatOffset > pageStartOffset\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\n // Prevent deferred page floats from appearing in the preceding pages\n // (Issue #681)\n if (checkPageFloatForLaterPage(float)) {\n loopFrame.breakLoop();\n return;\n }\n\n const strategy =\n new PageFloats.PageFloatLayoutStrategyResolver().findByFloat(float);\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 =\n 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 =\n 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.startBreakType)) {\n return Task.newResult(true);\n }\n\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 =\n 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 // forced break or \"auto\"\n flowPosition.startBreakType =\n Break.breakValueToStartBreakType(column.pageBreakType);\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 =\n this.counterStore.createLayoutConstraint(pageIndex);\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.rtl = layoutContainer.rtl;\n column.snapHeight = layoutContainer.snapHeight;\n column.snapWidth = layoutContainer.snapWidth;\n if (layoutContainer.vertical) {\n const columnY =\n (layoutContainer.rtl\n ? columnCount - currentColumnIndex - 1\n : currentColumnIndex) *\n (columnWidth + columnGap) +\n layoutContainer.paddingTop;\n const outerWidth = parseFloat(\n (boxContainer as HTMLElement).style.width,\n );\n column.setHorizontalPosition(\n layoutContainer.paddingLeft + outerWidth - layoutContainer.width,\n layoutContainer.width,\n );\n column.setVerticalPosition(columnY, columnWidth);\n } else {\n const columnX =\n (layoutContainer.rtl\n ? columnCount - currentColumnIndex - 1\n : currentColumnIndex) *\n (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 =\n this.currentLayoutPosition.flowPositions[flowNameStr];\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> =\n Task.newFrame(\"layoutFlowColumns\");\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.rtl = boxInstance.rtl;\n layoutContainer.exclusions = exclusions;\n boxInstance.prepareContainer(\n this,\n layoutContainer,\n page,\n this.faces,\n this.clientLayout,\n );\n\n if (\n boxInstance instanceof CssPage.PageRuleMasterInstance &&\n (layoutContainer.width <= 0 || layoutContainer.height <= 0)\n ) {\n Logging.logger.warn(\"Negative or zero page area size\");\n }\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 (\n contentVal instanceof Css.Expr &&\n contentVal.expr instanceof Exprs.Native &&\n contentVal.expr.str.startsWith(\"running-element-\")\n ) {\n // Single running element\n contentVal.visit(\n new Vtree.ContentPropertyHandler(\n boxContainer,\n this,\n contentVal,\n this.counterStore.getExprContentListener(),\n ),\n );\n } else if (contentVal && Vtree.nonTrivialContent(contentVal)) {\n let innerContainerTag = \"span\";\n if ((contentVal as any).url) {\n innerContainerTag = \"img\";\n }\n const innerContainer =\n this.viewport.document.createElement(innerContainerTag);\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.transferSingleUriContentProps(\n this,\n innerContainer,\n this.faces,\n );\n }\n boxInstance.transferContentProps(\n this,\n layoutContainer,\n page,\n this.faces,\n );\n if (innerContainerTag == \"span\") {\n // text-spacing & hanging-punctuation on margin boxes\n TextPolyfill.processGeneratedContent(\n innerContainer,\n boxInstance.getProp(this, \"text-autospace\"),\n boxInstance.getProp(this, \"text-spacing-trim\"),\n boxInstance.getProp(this, \"hanging-punctuation\"),\n this.lang,\n boxInstance.vertical,\n );\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 =\n this.currentLayoutPosition.flowPositions[flowNameStr];\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 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\n // Limit number of pages to prevent endless page generation\n const LIMIT_PAGES = 10000;\n if (cp.page > LIMIT_PAGES) {\n throw new Error(`Too many pages generated (over ${LIMIT_PAGES} pages)`);\n }\n cp.page++;\n\n const startSide = cp.startSideOfFlow(\"body\");\n cp.isBlankPage =\n Break.isSpreadBreakValue(startSide) && this.matchPageSide(startSide);\n page.isBlankPage = cp.isBlankPage;\n\n if (page.pageType == null) {\n page.pageType =\n (page.isBlankPage\n ? this.styler.cascade.previousPageType\n : this.styler.cascade.currentPageType) ?? \"\";\n }\n\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(page.pageType);\n\n // Substitute var()\n this.styler.cascade.applyVarFilter([cascadedPageStyle], this.styler, null);\n\n // Calculate calc()\n this.styler.cascade.applyCalcFilter(cascadedPageStyle, this.styler.context);\n\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\"] as CssCascade.CascadeValue)\n .value === Css.fullWidth,\n );\n page.setAutoPageHeight(\n (pageMaster.pageBox.specified[\"height\"] as CssCascade.CascadeValue)\n .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\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> =\n Task.newFrame(\"layoutNextPage\");\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}\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 override startPageTemplateRule(): void {}\n\n override 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 override 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 override startDefineRule(): void {\n this.masterHandler.pushHandler(\n new CssCascade.DefineParserHandler(this.scope, this.owner),\n );\n }\n\n override 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 override 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 override 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 override 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 override startRegionRule(): void {\n this.insideRegion = true;\n this.startSelectorRule();\n }\n\n override 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 override 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\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\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\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 frame = Task.newFrame<boolean>(\"OPSDocStore.init\");\n this.validatorSet = CssValidator.baseValidatorSet();\n loadUABase().then(() => {\n this.triggerSingleDocumentPreprocessing = true;\n frame.finish(true);\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> =\n Task.newFrame(\"OPSDocStore.load\");\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[] =\n Plugin.getHooksForName(Plugin.HOOKS.PREPROCESS_SINGLE_DOCUMENT);\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 sources.push({\n url: Base.resolveURL(\"user-agent-page.css\", Base.resourceBaseURL),\n text: UserAgentPageCss,\n flavor: CssParser.StylesheetFlavor.USER_AGENT,\n classes: null,\n media: null,\n });\n if (isTocBox) {\n sources.push({\n url: Base.resolveURL(\"user-agent-toc.css\", Base.resourceBaseURL),\n text: UserAgentTocCss,\n flavor: CssParser.StylesheetFlavor.USER_AGENT,\n classes: null,\n media: null,\n });\n } else {\n const elemList =\n xmldoc.document.querySelectorAll(\"style, link, meta\");\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 href = elem.getAttribute(\"href\");\n const rel = elem.getAttribute(\"rel\")?.split(/\\s+/);\n const classes = elem.getAttribute(\"class\");\n const media = elem.getAttribute(\"media\");\n if (\n href &&\n rel?.includes(\"stylesheet\") &&\n (!rel.includes(\"alternate\") || classes)\n ) {\n const src = Base.resolveURL(href, 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: this.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> =\n Task.newFrame(\"fetchStylesheet\");\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 processViewportMeta(meta: Element): string {\n return \"\";\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 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 /** @override */\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.querySelector(\n \"[role=doc-toc], [role=directory], nav li a, .toc, #toc\",\n )\n ) {\n // hide elements not containing TOC.\n computedStyle[\"display\"] = Css.ident.none;\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 case \"toc-container\":\n computedStyle[\"padding\"] = Css.numericZero;\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 Vtree.canIgnore(firstChild)\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 = Base.stripFragment(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\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 0,\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 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 loadPubDoc(url: string): 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).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).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).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): Task.Result<OPFDoc> {\n const frame: Task.Frame<OPFDoc> = Task.newFrame(\"loadEPUBDoc\");\n if (!url.endsWith(\"/\")) {\n url = url + \"/\";\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).thenFinish(frame);\n return;\n }\n }\n }\n frame.finish(null);\n });\n return frame.result();\n }\n\n loadOPF(pubURL: string, root: string): 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 opf = new OPFDoc(this, pubURL);\n opf.initWithXMLDoc(opfXML, encXML).then(() => {\n this.opfByURL[url] = opf;\n this.primaryOPFByEPubURL[pubURL] = opf;\n frame.finish(opf);\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(\n manifestUrl,\n true,\n `Failed to fetch Publication Manifest ${manifestUrl}`,\n ).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 override 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 override 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 const prePaginated = !!Object.values(this.primaryOPFByEPubURL).find(\n (opf) => opf.prePaginated,\n );\n return (\n `@-epubx-viewport{width:${width}px;height:${height}px;}` +\n (prePaginated\n ? `@page{size:${width}px ${height}px;margin:0;}`\n : `@page{margin:0;}`)\n );\n }\n return \"\";\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 return (blob) => {\n const frame = Task.newFrame(\"deobfuscator\") as Task.Frame<Blob>;\n makeDigest(\"SHA-1\", uid).then((hash) => {\n const head = blob.slice(0, 1040);\n const tail = blob.slice(1040, blob.size);\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 ^= hash[k % 20];\n dataView.setUint8(k, b);\n }\n frame.finish(Net.makeBlob([dataView, tail]));\n });\n });\n return frame.result();\n };\n}\n\nfunction makeDigest(algorithm: string, str: string): Task.Result<Uint8Array> {\n const frame = Task.newFrame(\"makeDigest\") as Task.Frame<Uint8Array>;\n const continuation = frame.suspend();\n window.crypto.subtle\n .digest(algorithm, new TextEncoder().encode(str))\n .then((buf) => {\n continuation.schedule(new Uint8Array(buf));\n });\n return frame.result();\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 /** @override */\n transformFragment(fragment: string, baseURL: string): string {\n const url = baseURL + (fragment ? `#${fragment}` : \"\");\n return transformedIdPrefix + Base.escapeNameStrToHex(url, \":\");\n }\n\n /** @override */\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.spine.some((item) => item.src === path)) {\n return `#${this.transformFragment(fragment, path)}`;\n }\n }\n }\n return url;\n }\n\n /** @override */\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 ? decodeURIComponent(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 ): 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 (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\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 manifestObj[\"name\"] || manifestObj[\"metadata\"]?.[\"title\"] || doc?.title;\n if (title) {\n this.metadata[metaTerms.title] = (\n Array.isArray(title) ? title : [title]\n ).map((item) => ({ v: item.value ?? item }));\n }\n const author =\n manifestObj[\"author\"] ||\n manifestObj[\"creator\"] ||\n manifestObj[\"metadata\"]?.[\"author\"] ||\n Array.from(\n doc?.querySelectorAll(\"meta[name='author'], meta[name='DC.Creator']\") ??\n [],\n ).map((meta: HTMLMetaElement) => meta.content);\n if (author && author.length !== 0) {\n this.metadata[metaTerms.creator] = (\n Array.isArray(author) ? author : [author]\n ).map((item) => ({ v: item.name ?? item }));\n }\n const language =\n manifestObj[\"inLanguage\"] ||\n manifestObj[\"metadata\"]?.[\"language\"] ||\n doc?.documentElement.lang ||\n doc?.documentElement.getAttribute(\"xml:lang\");\n if (language) {\n this.metadata[metaTerms.language] = (\n Array.isArray(language) ? language : [language]\n ).map((item) => ({ v: item }));\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 (CSS.supports(\"selector(:has(*))\")\n ? \",section:has(>:first-child:is(h1,h2,h3,h4,h5,h6):is(.toc,#toc)) a[href]\"\n : \"\");\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 if (/\\.(jpe?g|png|gif|pdf|svg|mml)([#?]|$)/.test(href)) {\n // Avoid link to non-HTML 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 =\n manifestObj[\"readingOrder\"].includes(itemObj);\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 (!encodingFormat &&\n itemObj.rel !== \"stylesheet\" &&\n /(^|\\/)([^/]+\\.(x?html|htm|xht)|[^/.]*)([#?]|$)/.test(url))\n ) {\n const baseUrl = manifestUrl\n ? manifestUrl.replace(/\\/[^/]+$/, \"/\")\n : this.pubURL;\n const param = {\n url: Base.resolveURL(Base.convertSpecialURL(url), baseUrl),\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 tocVisible: 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> =\n Task.newFrame(\"renderSinglePage\");\n\n const oldPage = viewItem.pages[pos ? pos.page : 0];\n let page = this.makePage(viewItem, pos);\n if (oldPage) {\n // If the old page exists, keep the pageType (named page).\n // This is necessary for named page with target-counter() to work.\n // (fix for issue #1136)\n page.pageType = oldPage.pageType;\n }\n\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 page.container.setAttribute(\n \"data-vivliostyle-page-index\",\n pageIndex,\n );\n page.container.setAttribute(\n \"data-vivliostyle-spine-index\",\n page.spineIndex,\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 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> =\n Task.newFrame(\"renderPage\");\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> =\n Task.newFrame(\"renderPagesUpto\");\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 page = this.getPage(position);\n if (!page) {\n return Task.newResult({ left: null, right: null });\n }\n const frame: Task.Frame<Vtree.Spread> = Task.newFrame(\"getSpread\");\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> =\n Task.newFrame(\"navigateToEPage\");\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> =\n Task.newFrame(\"navigateToCFI\");\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> =\n Task.newFrame(\"navigateTo\");\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 this.findPage(\n {\n spineIndex: item.spineIndex,\n pageIndex: -1,\n offsetInItem: target ? viewItem.xmldoc.getElementOffset(target) : 0,\n },\n sync,\n ).thenFinish(frame);\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\n if (!Constants.isDebug) {\n pageCont.style.visibility = \"hidden\";\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 (\n page.offset === 0 &&\n !(viewItem.instance.blankPageAtStart && viewItem.pages.length === 0)\n ) {\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(\"object\");\n if (data) {\n result.setAttribute(\"data\", data);\n }\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 /** @override */\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[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 =\n item.itemRefElement.getAttribute(\"properties\");\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.pixelRatio,\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 this.tocVisible = true;\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 this.tocVisible = false;\n if (this.tocView) {\n this.tocView.hideTOC();\n }\n }\n\n isTOCVisible(): boolean {\n return this.tocVisible && !!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 Scripts from \"./scripts\";\nimport * as Task from \"./task\";\nimport * as TaskUtil from \"./task-util\";\nimport * as Vgen from \"./vgen\";\nimport * as Vtree from \"./vtree\";\nimport {\n VivliostylePolyfillCss,\n VivliostyleViewportCss,\n VivliostyleViewportScreenCss,\n} from \"./assets\";\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 touchActive: boolean;\n touchX: number;\n touchY: number;\n needResize: boolean;\n resized: 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 pixelRatio: number;\n pixelRatioLimit: 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 const document = viewportElement.ownerDocument;\n const findOrCreateStyleElement = (\n id: string,\n cssText?: string,\n ): HTMLElement => {\n let styleElement = document.getElementById(id);\n if (!styleElement) {\n styleElement = document.createElement(\"style\");\n styleElement.id = id;\n if (cssText) {\n styleElement.textContent = cssText;\n }\n document.head.appendChild(styleElement);\n }\n return styleElement;\n };\n findOrCreateStyleElement(\n \"vivliostyle-viewport-screen-css\",\n VivliostyleViewportScreenCss,\n );\n findOrCreateStyleElement(\n \"vivliostyle-viewport-css\",\n VivliostyleViewportCss,\n );\n findOrCreateStyleElement(\n \"vivliostyle-polyfill-css\",\n VivliostylePolyfillCss,\n );\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 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.resized = true;\n this.kick();\n };\n this.pageReplacedListener = this.pageReplacedListener.bind(this);\n this.hyperlinkListener = (evt) => {};\n this.pageRuleStyleElement = findOrCreateStyleElement(\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.touchActive = false;\n this.touchX = 0;\n this.touchY = 0;\n this.needResize = false;\n this.resized = 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 // Pixel ratio emulation on PDF output (PR #1079) does not work with\n // non-Chromium browsers.\n this.pixelRatioLimit = /Chrome/.test(navigator.userAgent)\n ? 16 // max pixelRatio value on Chromium browsers\n : 0; // disable pixelRatio emulation on non-Chromium browsers\n this.pixelRatio = Math.min(8, this.pixelRatioLimit);\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 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).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 // JavaScript in HTML documents support\n if (\n typeof command[\"allowScripts\"] == \"boolean\" &&\n command[\"allowScripts\"] !== Scripts.allowScripts\n ) {\n Scripts.setAllowScripts(command[\"allowScripts\"]);\n this.needResize = true;\n }\n // output pixel ratio emulation\n if (typeof command[\"pixelRatio\"] == \"number\") {\n const pixelRatio = Math.min(command[\"pixelRatio\"], this.pixelRatioLimit);\n if (pixelRatio !== this.pixelRatio) {\n this.pixelRatio = pixelRatio;\n this.needResize = true;\n }\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 });\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 }\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 this.pixelRatio,\n viewportElement,\n vs.width,\n vs.height,\n );\n } else {\n return new Vgen.Viewport(\n this.window,\n this.fontSize,\n this.pixelRatio,\n viewportElement,\n );\n }\n }\n\n private resolveSpreadView(\n viewport: Vgen.Viewport,\n pageSize: { width: number; height: number } | null,\n ): 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 return (\n (viewport.width - this.pref.pageBorder) / viewport.height >=\n (pageSize ? (pageSize.width * 2) / pageSize.height : 1.45) &&\n (!!pageSize || viewport.width > 800)\n );\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 hasNoAutoSizedPages =\n this.opfView?.hasPages() && !this.opfView.hasAutoSizedPages();\n const spreadView = this.resolveSpreadView(\n viewport,\n this.resized && hasNoAutoSizedPages ? this.pageSizes[0] : null,\n );\n this.resized = false;\n const spreadViewChanged = this.pref.spreadView !== spreadView;\n this.updateSpreadView(spreadView);\n\n // check if window.devicePixelRatio is changed\n const scaleRatioChanged =\n this.pixelRatio &&\n this.opfView &&\n this.pixelRatio / this.window.devicePixelRatio !==\n this.opfView.clientLayout.scaleRatio;\n\n if (\n scaleRatioChanged ||\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 (hasNoAutoSizedPages) {\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 if (\n pageIndex === 0 &&\n this.pageViewMode === PageViewMode.AUTO_SPREAD &&\n !this.opfView.hasAutoSizedPages()\n ) {\n this.updateSpreadView(this.resolveSpreadView(this.viewport, pageSize));\n }\n }\n\n private setPageSizePageRules(\n pageSheetSize: { [key: string]: { width: number; height: number } },\n spineIndex: number,\n pageIndex: number,\n ) {\n // In this implementation, it generates one page rule with the largest\n // page size both in width and height in the multiple page sizes.\n // (Resolve issue #751)\n if (\n this.pageRuleStyleElement &&\n (!this.pageSheetSizeAlreadySet ||\n this.pageSizes[pageIndex].width !==\n this.pageSizes[pageIndex - 1]?.width ||\n this.pageSizes[pageIndex].height !==\n this.pageSizes[pageIndex - 1]?.height)\n ) {\n const widthMax = Math.max(...this.pageSizes.map((p) => p.width));\n const heightMax = Math.max(...this.pageSizes.map((p) => p.height));\n\n function convertSize(px: number): number {\n const pt = px * 0.75;\n // Workaround for Chromium's rounded page size problem.\n // (Fix for issue #934 and #936)\n return Math.ceil(pt);\n }\n const widthPt = convertSize(widthMax);\n const heightPt = convertSize(heightMax);\n\n // Negative margin setting is necessary to prevent unexpected page breaking.\n // Note that the high pixel ratio emulation, the pixelRatio setting, uses the CSS zoom property\n // that enlarge the page content size, and Chromium splits such large pages unless this\n // negative margin is specified.\n const rightPt = widthPt * ((this.pixelRatio || 1) - 1) + 2;\n const bottomPt = heightPt * ((this.pixelRatio || 1) - 1) + 2; // \"+ 2\" is for issue #947\n const styleText = `@page {size: ${widthPt}pt ${heightPt}pt; margin: 0 ${-rightPt}pt ${-bottomPt}pt 0;}`;\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.tocVisible;\n tocAutohide = this.opfView.tocAutohide;\n this.opfView.removeRenderedPages();\n }\n this.pageSizes = [];\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 if (!spread.left && !spread.right) {\n return Task.newResult(null);\n }\n this.showSpread(spread);\n this.setSpreadZoom(spread);\n this.currentPage =\n page.side === Constants.PageSide.LEFT ? spread.left : spread.right;\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 if (!this.viewport) {\n return this.zoom;\n }\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:\n this.opf.spine[this.pagePosition.spineIndex].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\"] =\n this.opf.spine[this.pagePosition.spineIndex].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 // JavaScript in HTML documents support\n if (\n Scripts.allowScripts &&\n Scripts.hasScripts(this.window)\n ) {\n Scripts.loadScriptsAtEnd(this.window).then(() => {\n if (this.renderAllPages) {\n this.setReadyState(\n Constants.ReadyState.COMPLETE,\n );\n }\n this.callback({ t: \"loaded\" });\n frame.finish(p);\n });\n } else {\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 },\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 if (typeof command[\"position\"]?.spineIndex == \"number\") {\n const position = command[\"position\"] as Epub.Position;\n method = () => this.opfView.findPage(position, !this.renderAllPages);\n } else {\n return Task.newResult(true);\n }\n if (!this.opfView) {\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> =\n Task.newFrame(\"moveTo.showCurrent\");\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\n .showCurrent(viewer.currentPage, !this.renderAllPages)\n .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> =\n Task.newFrame(\"waitForCommand\");\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 * - allowScripts: Allow JavaScript in documents. default: true\n * - pixelRatio: Set output pixel ratio. Enables very thin border width and\n * improves layout precision, emulating high pixel ratio.\n * default: 8. Set 0 to disable pixel ratio emulation.\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 allowScripts?: boolean;\n pixelRatio?: 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 allowScripts: true,\n pixelRatio: 8,\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 * Navigate to the specified position.\n */\n navigateToPosition(position: {\n spineIndex: number;\n pageIndex?: number;\n offsetInItem?: number;\n }) {\n this.adaptViewer_.sendCommand({\n a: \"moveTo\",\n position: {\n spineIndex: position.spineIndex,\n pageIndex: position.pageIndex ?? -1,\n offsetInItem: position.offsetInItem ?? -1,\n },\n });\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\";\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>\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 viewportElement: this.iframeWin.document.body\n .firstElementChild as HTMLElement,\n window: this.iframeWin,\n debug: true,\n });\n return new Promise<void>((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","Logger","opt_console","this","listeners","_proto","prototype","consoleDebug","msg","_this$opt_console","_this$opt_console2","_console","debug","apply","log","console","consoleInfo","_this$opt_console3","_this$opt_console4","_console2","info","consoleWarn","_this$opt_console5","_this$opt_console6","_console3","warn","consoleError","_this$opt_console7","_this$opt_console8","_console4","triggerListeners","level","forEach","listener","addListener","push","arguments","DEBUG","INFO","WARN","ERROR","hooks","registerHook","name","fn","atFirst","hooksForName","unshift","Logging","removeHook","index","indexOf","splice","getHooksForName","plugin","Profiler","performanceInstance","timestamps","registerTiming","registerStartTiming","registerEndTiming","noop","forceRegisterStartTiming","timestamp","call","forceRegisterEndTiming","printTimings","st","Object","keys","stamps","l","i","t","disable","enable","isEnabled","startEnd","now","fallbackPerformanceInstance","Date","profiler","window","performance","profile","firstLetterPattern","ELEMENT_OFFSET_ATTR","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","CSS","supports","getPrefixedPropertyNames","prefixed","_step","_iterator","_createForOfIteratorHelperLoose","done","setCSSProperty","elem","elemStyle","style","startsWith","setProperty","prefixedPropertyNames","_step2","_iterator2","getCSSProperty","opt_value","propertyNames","getPropertyValue","err","getLangAttribute","element","lang","getAttributeNS","XML","namespaceURI","XHTML","getAttribute","StringBuffer","list","_proto2","append","clear","join","escapeChar","charCodeAt","escapeCSSIdent","escapeCSSStr","lightURLEncode","encodeURIComponent","isLetter","ch","escapeNameStrToHex","s","escapeCharToHex","escapeRegExp","binarySearch","high","good","h","m","numberCompare","b","indexArray","arr","key","_step3","map","_iterator3","k","multiIndexArray","_step4","_iterator4","SimpleEventTarget","_proto3","dispatchEvent","evt","type","target","currentTarget","addEventListener","capture","includes","removeEventListener","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","movedNode","ownerDocument","getElementById","OffsetStep","offset","textBefore","textAfter","textLength","textContent","Fragment","steps","_proto4","fromString","fragstr","decodeURIComponent","charAt","parseInt","Base","navigate","doc","documentElement","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","one","_true","_false","values","funcs","builtIns","Const","ceil","round","sqrt","max","x","defineBuiltInName","pageWidth","pageHeight","fontSize","pubTitle","docTitle","Native","defineName","qualifiedName","val","defineFunc","defineBuiltIn","isViewportRelativeLengthUnit","unit","defaultUnitSizes","px","in","pt","pc","cm","mm","q","em","rem","ex","lh","rlh","dppx","dpi","dpcm","needUnitConversion","Context","rootScope","viewportWidth","viewportHeight","actualPageWidth","actualPageHeight","initialFontSize","rootFontSize","isRelativeRootFontSize","rootLineHeight","scopes","pageAreaWidth","pageAreaHeight","pageVertical","getScopeContext","scope","clearScope","queryUnitSize","isRoot","pvw","pvh","vw","vh","evalName","evalCall","params","noBuiltInEval","body","evaluate","evalMediaName","not","enabled","evalMediaTest","feature","req","actual","screen","availWidth","availHeight","pixelDepth","Number","evalSupportsTest","isFunc","queryVal","storeVal","Val","buf","priority","evaluateCore","context","expand","dependCore","other","dependencyCache","dependOuter","cached","depend","isMediaName","Prefix","_Val","_this","_inheritsLoose","getOp","evalPrefix","constructor","Infix","_Val2","lhs","rhs","_this2","_proto5","getPriority","evalInfix","thisPriority","Logical","_Infix","Comparison","_Infix2","Additive","_Infix3","Multiplicative","_Infix4","Not","_Prefix","_proto10","NotMedia","_Not","Negate","_Prefix2","_proto12","And","_Logical","_proto13","AndMedia","_And","Or","_Logical2","_proto15","Comma","_Or","OrMedia","_Or2","Lt","_Comparison","_proto18","Le","_Comparison2","_proto19","Gt","_Comparison3","_proto20","Ge","_Comparison4","_proto21","Eq","_Comparison5","_proto22","Ne","_Comparison6","_proto23","Add","_Additive","_proto24","Subtract","_Additive2","_proto25","Multiply","_Multiplicative","_proto26","Divide","_Multiplicative2","_proto27","Modulo","_Multiplicative3","_proto28","Numeric","_Val3","num","_unit$toLowerCase","_this3","_proto29","Named","_Val4","_this4","_proto30","MediaName","_Val5","_this5","_proto31","_Val6","_this6","_proto32","Call","_Val7","_this7","_proto33","appendValArray","expandedParams","expanded","expandValArray","Cond","_Val8","cond","ifTrue","ifFalse","_this8","_proto34","_Val9","_this9","_proto35","MediaTest","_Val10","_this10","_proto36","SupportsTest","_Val11","_this11","_proto37","Param","_Val12","_this12","_proto38","and","v1","v2","sub","mul","div","Visitor","visitValues","visit","visitEmpty","empty","visitSlash","slash","visitStr","visitIdent","ident","visitNumeric","numeric","visitNum","visitInt","visitHexColor","color","visitURL","visitURange","urange","visitSpaceList","visitCommaList","visitFunc","func","visitExpr","expr","FilterVisitor","_Visitor","before","SpaceList","CommaList","Func","stringValue","toExpr","isExpr","isNumeric","isNum","isIdent","isSpaceList","visitor","Empty","Exprs","_createClass","get","instance","Slash","Str","_proto6","nameTable","Ident","_assertThisInitialized","_proto7","getName","_proto8","Num","_proto9","Int","_Num","HexColor","hex","_proto11","URL","URange","urangeText","appendList","separator","_values$","_values$i","_proto14","_proto16","Expr","_Val13","_proto17","AnyToken","_Val14","_this13","toNumber","convertNumericToPx","absolute","all","always","anywhere","auto","avoid","balance","balance_all","block","block_end","block_start","both","bottom","border_box","break_all","break_word","clip","crop","cross","column","discard","exclusive","fixed","flex","flow_root","footnote","footer","grid","header","hidden","horizontal_tb","inherit","initial","inline","inline_block","inline_end","inline_start","keep","landscape","left","line","list_item","ltr","manual","none","normal","oeb_page_foot","oeb_page_head","padding_box","page","relative","revert","right","same","snap_block","solid","spread","_static","rtl","table","table_caption","table_cell","table_footer_group","table_header_group","table_row","top","transparent","unset","vertical_lr","vertical_rl","visible","hundredPercent","fullWidth","fullHeight","numericZero","fullURange","processingOrder","isDefaultingValue","processingOrderFn","name1","name2","MAX_VALUE","isCustomPropName","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","_Css$Visitor","propSet","Css","IntVisitor","_Css$Visitor2","toInt","def","ShapeVisitor","_Css$Visitor3","collect","coords","getShape","width","height","numbers","coord","GeometryUtil","toShape","CountersVisitor","_Css$Visitor4","reset","counters","toCounters","UrlTransformVisitor","_Css$FilterVisitor","baseUrl","transformer","transformURL","cloneCounterValues","TokenType","TargetCounterReference","targetId","resolved","pageCounters","spineIndex","pageIndex","equals","isResolved","resolve","unresolve","CounterListener","counterStore","countersOfId","documentURLTransformer","transformFragment","countersById","getExprContentListener","CounterResolver","pageScope","styler","namedStringValues","runningElements","setStyler","getFragment","getTransformedId","transformedId","substring","getPageCounterVal","format","currentPageCounters","getCounterNumber","registerPageCounterExpr","getPageCountersVal","getTargetCounters","lookForElement","targetCounters","styleUntilIdIsReached","getTargetPageCounters","currentPage","elementsById","pageCountersById","getTargetCounterVal","countersOfName","resolveReference","pageCountersOfName","saveReferenceOfCurrentPage","getTargetCountersVal","elementCounters","getNamedStringVal","retrievePosition","getRunningValue","getRunningElementVal","namedRunningValues","runningValues","offsets","sort","pageStartOffset","isBlankPage","pageLastOffset","container","querySelectorAll","firstOffset","startOffset","lastOffset","firstExceptOffset","offsetPrev","offsetNext","elementAtOffset","querySelector","elementAtPageStartOffset","firstElementChild","first","start","last","setNamedString","elementOffset","setRunningElement","String","CounterStore","previousPageCounters","currentPageCountersStack","pageIndicesById","newReferencesOfCurrentPage","referencesToSolve","referencesToSolveStack","unresolvedReferences","resolvedReferences","pagesCounterExprs","pageCounterExprs","createCounterListener","createCounterResolver","setCurrentPage","definePageCounter","counterName","forceSetPageCounter","pageNumber","updatePageCounters","cascadedPageStyle","resetMap","incrementMap","resetVal","CssProp","resetCounterName","increment","incrementVal","incrementCounterName","counterValues","pushPageCounters","popPageCounters","unresolvedRefs","resolvedRefs","pushed","some","finishPage","ids","oldPageIndex","prevPageCounters","every","getUnresolvedRefsToPage","refs","idRefs","r1","r2","o","pushReferencesToSolve","popReferencesToSolve","exprContentListener","bind","document","createElementNS","setAttribute","elemList","clonedElem","cloneNode","fixPageCounterInRunningElement","position","visibility","foundPagesCounter","findIndex","foundPageCounter","PAGES_COUNTER_ATTR","PAGE_COUNTER_ATTR","runningElem","_loop","counterExpr","find","finishLastPage","viewport","nodes","root","pages","_loop2","createLayoutConstraint","LayoutConstraint","allowLayout","nodeContext","viewNode","escapeParseSingle","code","fromCodePoint","escapeParse","Action","Token","precededBySpace","EOF","O_PAR","C_PAR","O_BRC","C_BRC","O_BRK","C_BRK","COMMA","SEMICOL","COLON","SLASH","PERCENT","QMARK","PLUS","MINUS","BAR_BAR","AMP_AMP","BANG","DOLLAR","HAT","BAR","TILDE","STAR","GT","LT","EQ","BANG_EQ","DOLLAR_EQ","HAT_EQ","BAR_EQ","TILDE_EQ","STAR_EQ","GT_EQ","LT_EQ","EQ_EQ","COL_COL","CDO","CDC","NUMERIC","NUM","INT","AT","HASH","FUNC","CLASS","makeActions","spec","END","INVALID","actionsNormal","SPACE","STR2","AMP","STR1","DOT","IDENT","BSLASH","actionsIdent","ENDIDNT","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","actionsBar","actionsAmp","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","tail","token","fillBuffer","nthToken","n","consume","head","actions","tokenType","tokenPosition","tokenText","tokenNum","seenSpace","backslashPos","charCode","STR","parseFloat","URANGE","privateCurrentTask","primaryScheduler","currentTask","newFrame","task","frame","Frame","state","ACTIVE","newResult","SyncResultImpl","handle","onErr","raise","XMLHttpRequestResponseType","TimerImpl","currentTime","valueOf","setTimeout","_setTimeout","_x","_x2","delay","clearTimeout","_clearTimeout","_x3","Scheduler","timer","timeout","sliceOverTime","wakeupTime","timeoutToken","inTimeSlice","order","setSlice","isTimeSliceOver","arm","newTime","scheduledTime","doTimeSlice","schedule","continuation","opt_delay","c","canceled","resumeInternal","run","opt_name","Task","then","running","callbacks","callback","savedTask","suspend","Continuation","otherComp","getTask","scheduler","finish","cancel","exception","waitTarget","interrupt","getScheduler","isRunning","whenDone","unwind","opt_frame","fillStack","f","out","thenAsync","thenReturn","thenFinish","isPending","ResultImpl","res1","res2","res","INIT","checkEnvironment","FINISHED","DEAD","timeSlice","sleep","loop","step","more","loopWithFrame","LoopBodyFrame","opt_waitTarget","_Frame","continueLoop","breakLoop","Fetcher","fetch","arrived","resource","piggybacks","piggibacks","piggyback","hasArrived","waitForFetchers","fetchers","fetcher","VivliostyleViewportScreenCss","VivliostyleViewportCss","ValidationTxt","UserAgentXml","UserAgentPageCss","UserAgentBaseCss","UserAgentTocCss","VivliostylePolyfillCss","ajax","opt_type","opt_method","opt_data","opt_contentType","request","XMLHttpRequest","response","status","statusText","contentType","responseText","responseXML","responseBlob","open","responseType","onreadystatechange","readyState","responseURL","DOCUMENT","localName","Document","TEXT","makeBlob","contentTypeHeader","getResponseHeader","setRequestHeader","send","overrideMimeType","parts","Blob","ResourceStore","parser","resources","load","opt_required","opt_message","fetchInner","isTocBox","endsWith","userAgentXmlUrl","isUserAgentXml","TaskUtil","parseJSONResource","store","loadElement","src","SVG","setAttributeNS","XLINK","StylesheetFlavor","SPECIFICITY_AUTHOR","SPECIFICITY_STYLE","SPECIFICITY_STYLE_IMPORTANT","ParserHandler","flavor","AUTHOR","getCurrentToken","getScope","mnemonics","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","pushSelectorText","selectorText","getImportantSpecificity","USER_AGENT","USER","getBaseSpecificity","DispatchParserHandler","_ParserHandler","tokenizer","slave","pushHandler","popHandler","errorMsg","_token$toString","SkippingParserHandler","_ParserHandler2","owner","topLevel","depth","SlaveParserHandler","_SkippingParserHandle","report","message","reportAndSkip","actionsBase","actionsStyleAttribute","actionsSelector","actionsSelectorInFunc","actionsSelectorCont","actionsSelectorStart","actionsPropVal","actionsExprVal","actionsExprOp","actionsError","actionsErrorDecl","actionsErrorSelector","ExprContext","OP_MEDIA_AND","LAST","OP_MEDIA_OR","OP_MEDIA_NOT","SELECTOR_START","RULE_END","DONE","PROP","SELECTOR_NAME","SELECTOR_ANY","SELECTOR_ID","SELECTOR_CLASS","SELECTOR_ATTR","SELECTOR_PSEUDOCLASS","SELECTOR_PSEUDOELEM","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_1","SELECTOR_NEXT","VAL_IDENT","VAL_HASH","VAL_NUM","VAL_INT","VAL_NUMERIC","VAL_STR","VAL_URL","VAL_URANGE","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","EXPR_C_PAR","EXPR_O_BRC","EXPR_SEMICOL","ERROR_PUSH","ERROR_POP","ERROR_SEMICOL","ERROR_POP_DECL","Parser","valStack","namespacePrefixToURI","defaultNamespaceURI","propName","propImportant","exprContext","importReady","importURL","importCondition","errorBrackets","ruleStack","regionRule","pageRule","inStyleDeclaration","MEDIA","extractVals","sep","valStackReduce","parLevel","count","exprError","exprStackReduce","val2","tok","e1","e2","er","readSupportsTest","startPosition","token1","token2","tokenN","commaCount","readPseudoParams","readNthPseudoParams","hasLeadingPlus","hasMinusSign","hasSign","makeCondition","condition","split","isInsidePropertyOnlyRule","runParser","parsingValue","parsingStyleAttr","parsingMediaQuery","parsingFunctionParam","parsingRelationalSelector","selectorStartPosition","pseudoclassType","POSITIVE_INFINITY","len","IMPORT","SUPPORTS","WHEN","supportsTest","ruleName","rulePseudoName","ErrorHandler","_ParserHandler3","parseStylesheetFromText","media","parseMediaQuery","CssTokenizer","resolvedURL","innerFrame","parseStylesheetFromURL","_ret","parseStylesheet","Net","xhr","parseValue","numProp","opacity","utilization","matchANPlusB","AnyMatcher","matchers","matches","matcher","AllMatcher","NthFragmentMatcher","registerFragmentIndex","fragmentIndex","indices","fragmentIndices","clearFragmentIndices","entry","MatcherBuilder","buildViewConditionMatcher","viewCondition","strs","buildAllMatcher","buildAnyMatcher","isCloneBoxDecorationBreak","_element$style","_element$style2","getBoxBreakFlags","setBoxBreakFlags","boxBreakFlags","setBoxBreakFlag","boxBreakFlag","setMarginDiscardFlag","marginDiscardFlag","MarginDiscardFlags","getMarginDiscardFlags","marginDiscardFlags","setMarginDiscardFlags","forcedBreakValues","recto","verso","region","isForcedBreakValue","spreadBreakValues","isSpreadBreakValue","LayoutProcessor","PageFloats","Selectors","RepetitiveElement","Table","Vtree","avoidBreakValues","isAvoidBreakValue","resolveEffectiveBreakValue","second","firstIsForcedBreakValue","secondIsForcedBreakValue","breakValueToStartBreakType","breakValue","restoreNewText","changes","reduce","fastdiff","DELETE","resolveIndex","coef","diff","current","change","INSERT","EQUAL","Plugin","original","isInstanceOfBlockFormattingContext","object","formattingContextType","FloatReference","isInstanceOfAfterIfContinuesLayoutConstraint","flagmentLayoutConstraintType","isInstanceOfRepetitiveElementsOwnerFormattingContext","isInstanceOfTableFormattingContext","isInstanceOfRepetitiveElementsOwnerLayoutConstraint","isInstanceOfTableRowLayoutConstraint","Whitespace","ShadowType","delayedProps","transform","delayedPropsIfRelativePositioned","DelayedItem","show","obj","hide","play","pause","resume","mute","muted","unmute","makeListener","action","actionFn","Page","_Base$SimpleEventTarg","bleedBox","pageAreaElement","delayedItems","hrefHandler","dimensions","isFirstPage","isLastPage","isAutoPageWidth","isAutoPageHeight","side","marginBoxes","pageType","anchorElement","preventDefault","setAutoPageWidth","isAuto","AUTO_PAGE_WIDTH_ATTRIBUTE","removeAttribute","setAutoPageHeight","AUTO_PAGE_HEIGHT_ATTRIBUTE","registerElementWithId","triggers","clientLayout","elems","contains","getElementClientRect","trigger","observers","observer","event","SPECIAL_ATTR","whitespaceFromPropertyValue","whitespace","IGNORE","NEWLINE","PRESERVE","canIgnore","Flow","parentFlowName","forcedBreakOffsets","formattingContext","FlowChunk","linger","repeated","breakBefore","startPage","isBetter","clientrectIncreasingTop","clientrectDecreasingRight","isSameNodePositionStep","nps1","nps2","_nps1$node","_nps2$node","shadowContext","shadowType","ROOTLESS","outerHTML","isSameShadowContext","nodeShadow","shadowSibling","isSameNodePosition","np1","np2","offsetInNode","newNodePositionFromNodeContext","initialFragmentIndex","sourceNode","NONE","preprocessedTextContent","makeNodeContextFromNodePositionStep","NodeContext","copy","ShadowContext","xmldoc","parentShadow","superShadow","subShadow","sc1","sc2","FirstPseudo","outer","boxOffset","shared","overflow","breakPenalty","display","floatReference","floatSide","clearSide","floatMinWrapBlock","columnSpan","verticalAlign","captionSide","inlineBorderSpacing","blockBorderSpacing","flexContainer","hyphenateCharacter","breakWord","establishesBFC","containingBlockForAbsolute","breakAfter","clearSpacer","inheritedProps","vertical","direction","firstPseudo","repeatOnBreak","pluginProps","afterIfContinues","footnotePolicy","INLINE","resetView","cloneItem","np","create","modify","clone","npp","npc","toNodePositionStep","toNodePosition","_nc$shadowContext","_nc$shadowContext$sty","_nc$shadowContext$sty2","nc","isInsideBFC","getContainingBlockForAbsolute","belongsTo","ChunkPosition","primary","floats","isSamePosition","FlowChunkPosition","chunkPosition","flowChunk","FlowPosition","positions","startBreakType","newfp","newarr","hasContent","LayoutPosition","flows","flowPositions","highestSeenOffset","highestSeenNode","lookupPositionOffset","newcp","thisFlowNames","otherFlowNames","_i2","_thisFlowNames","flowPos","startSideOfFlow","_this$flowPositions$n","Break","firstFlowChunkOfFlow","flowChunkPosition","Container","marginLeft","marginRight","marginTop","marginBottom","borderLeft","borderRight","borderTop","borderBottom","paddingLeft","paddingRight","paddingTop","paddingBottom","originX","originY","exclusions","innerShape","computedBlockSize","snapWidth","snapHeight","snapOffsetX","snapOffsetY","getInsetTop","getInsetBottom","getInsetLeft","getInsetRight","getInsetBefore","getInsetAfter","getInsetStart","getInsetEnd","getBeforeEdge","getAfterEdge","getStartEdge","getEndEdge","getInlineSize","getBoxSize","getBoxDir","getInlineDir","copyFrom","setVerticalPosition","setHorizontalPosition","setBlockPosition","extent","setInlinePosition","lastChild","removeChild","getInnerShape","getInnerRect","getPaddingRect","paddingX","paddingY","getOuterShape","outerShapeProp","getOuterRect","outerX","outerY","outerWidth","outerHeight","ContentPropertyHandler","rootContentValue","visitStrInner","_this$elem$lastChild","createTextNode","appendChild","img","CssParser","nonTrivialContent","cursor","fill","hyphens","marker","orphans","quotes","stroke","widows","polyfilledInheritedProps","getPolyfilledInheritedProps","POLYFILLED_INHERITED_PROPS","props","supportedNamespaces","coupledPatterns","coupledExtentPatterns","geomNames","sides","names","buildCouplingMap","sideMap","extentMap","pattern","extentPattern","couplingMapVert","couplingMapHor","couplingMapVertRtl","couplingMapHorRtl","CascadeValue","getBaseValue","filterValue","increaseSpecificity","specificity","evaluateCSSToCSS","ConditionalCascadeValue","_CascadeValue","cascadeValues","tv","av","setPropCascadeValue","SPECIALS","isMapName","isPropName","isInherited","getProp","setProp","getStyleMap","getMutableStyleMap","getViewConditionalStyleMap","getSpecial","getMutableSpecial","mergeIn","pseudoelement","regionId","viewConditionMatcher","styleKey","styleMap","styles","as","ts","_context$style","_context$style$valida","propListLH","validatorSet","shorthands","propList","propLH","avLH","chainActions","chain","chained","InheritanceVisitor","setPropName","getFontSize","cascval","convertFontSizeToPx","convertFontRelativeLengthToPx","baseFontSize","parentFontSize","CascadeAction","cascadeInstance","mergeWith","CompoundAction","ConditionItemAction","_CascadeAction","conditionItem","pushConditionItem","fresh","_CascadeAction2","ApplyRuleAction","_CascadeAction3","viewConditionId","currentStyle","ChainedAction","_CascadeAction4","makePrimary","cascade","CheckClassAction","_ChainedAction","className","currentClassNames","insertInTable","CheckIdAction","_ChainedAction2","currentId","currentXmlId","CheckLocalNameAction","_ChainedAction3","currentLocalName","tags","CheckNSTagAction","_ChainedAction4","currentNamespace","nsPrefix","nsCount","nstags","CheckTargetEpubTypeAction","_ChainedAction5","epubTypePatt","currentElement","epubType","epub","CheckNamespaceAction","_ChainedAction6","CheckAttributePresentAction","_ChainedAction7","hasAttributeNS","CheckAttributeEqAction","_ChainedAction8","_this14","epubtypes","CheckNamespaceSupportedAction","_ChainedAction9","_this15","CheckAttributeRegExpAction","_ChainedAction10","regexp","_this16","attr","CheckLangAction","_ChainedAction11","langRegExp","_this17","IsFirstAction","_ChainedAction12","isFirst","IsRootAction","_ChainedAction13","IsNthAction","_ChainedAction14","_this18","Matchers","IsNthSiblingAction","_IsNthAction","currentSiblingOrder","IsNthSiblingOfTypeAction","_IsNthAction2","currentSiblingTypeCounts","IsNthLastSiblingAction","_IsNthAction3","currentFollowingSiblingOrder","IsNthLastSiblingOfTypeAction","_IsNthAction4","counts","currentFollowingSiblingTypeCounts","nsCounts","nextElementSibling","IsEmptyAction","_ChainedAction15","Node","ELEMENT_NODE","TEXT_NODE","IsEnabledAction","_ChainedAction16","disabled","IsDisabledAction","_ChainedAction17","IsCheckedAction","_ChainedAction18","selected","checked","CheckConditionAction","_ChainedAction19","_this19","conditions","dependentConditions","CheckAppliedAction","_CascadeAction5","_this20","applied","cloned","MatchesAction","_ChainedAction20","chains","_this21","checkAppliedAction","firstActions","_iterator5","_step5","positive","firstAction","relational","MatchesNoneAction","_MatchesAction","MatchesRelationalAction","_MatchesAction2","selectorTexts","_this22","_step6","_iterator6","selectorWithScope","scopingRoot","parentElement","AbstractConditionItem","decrement","DescendantConditionItem","_AbstractConditionIte","ChildConditionItem","_AbstractConditionIte2","AdjacentSiblingConditionItem","_AbstractConditionIte3","_this23","fired","_proto39","FollowingSiblingConditionItem","_AbstractConditionIte4","_this24","_proto40","AfterPseudoelementItem","afterprop","_proto41","processPseudoelementProps","RestoreLangItem","_proto42","QuotesScopeItem","oldQuotes","_proto43","AttrValueFilterVisitor","_Css$FilterVisitor2","_this25","_proto44","createValueFromString","defaultValue","attributeName","hasAttribute","getStringValueFromCssContentVal","ContentPropVisitor","_Css$FilterVisitor3","counterResolver","_this26","_proto45","maxDepth","quoteDepth","upper","lower","additiveNumbering","entries","additiveFormat","alphabeticNumbering","alphabetStr","alphabet","fromCharCode","expandAlphabet","digit","alphabeticFormat","numbering","digits","negative","formal","markers","thousands","hundreds","tens","ones","chineseCounter","chineseTradInformal","toUpperCase","visitFuncCounter","_this27","numval","visitFuncCounters","_this28","numvals","visitFuncTargetCounter","targetUrlStr","_this29","targetUrl","visitFuncTargetCounters","_this30","visitFuncString","visitFuncElement","visitFuncContent","_pseudos$pseudoName","_pseudos$pseudoName$c","pseudos","_pseudos$before","_pseudos$before$conte","_pseudos$after","_pseudos$after$conten","visitFuncLeader","leader","POST_LAYOUT_BLOCK","checkPoints","_step7","leaderElem","pseudoAfter","previous","_column$clientLayout$","getElementComputedStyle","writingMode","marginInlineEnd","setLeaderTextContent","leaderStr","RLM","marginInlineStart","textIndent","innerInit","innerMarginInlineEnd","parseComputedLength","overrun","inner","templeader","setLeader","innerInline","innerAligned","getInset","inset","getComputedInsets","padding","_iterator7","filter","roman","armenian","georgian","hebrew","latin","alpha","greek","russian","square","disc","circle","ORDER_INCREMENT","copyTable","dst","ParseState","Cascade","pagetypes","_proto46","createInstance","counterListener","CascadeInstance","nextOrder","currentElementOffset","currentNSTag","currentEpubTypes","currentPageType","previousPageType","firstPageType","counterScoping","siblingOrderStack","siblingTypeCountsStack","followingSiblingOrderStack","followingSiblingTypeCountsStack","viewConditions","elementStack","_proto47","_this31","dependentConditionMatchers","conditionId","applyAction","pushRule","baseStyle","EMPTY","applyActions","defineCounter","scoping","pushCounters","_this$currentElement3","displayVal","floatVal","float","setMap","set","setVal","_this$currentElement$","_this$currentElement","_this$currentElement$2","_this$currentElement2","DOCUMENT_NODE","_this$currentStyle$co","incrPropValue","setCounterName","listItemCounts","popCounters","setNamedStrings","stringSet","_step8","_iterator8","pseudoprops","content","pushElement","_this32","types","currentNamespaceTypeCounts","applyVarFilter","applyCalcFilter","applyAttrFilter","quotesCasc","itemToPushLast","quotesVal","_step9","_iterator9","pseudoNames","_pseudoProps$content","_getProp","pseudoProps","applyAttrFilterInner","elementStyle","pseudoMap","elementStyles","VarFilterVisitor","propsLH","cascVal","_validatorSet$shortha","shorthand","_step10","_iterator10","nameLH","tvLH","valueSH","_step11","_iterator11","_ref","_shorthand$values$_na","defaultValues","CalcFilterVisitor","popRule","popElement","uaBaseCascade","CascadeParserHandler","_CssParser$SlaveParse","_this33","conditionCount","footnoteContent","insideSelectorRule","invalid","TOP","_proto48","insertNonPrimary","processChain","isInsideSelectorRule","invalidSelector","setInvalid","MatchesParameterParserHandler","patt","RegExp","ActionClass","nthSelectorActionClasses","finishChain","SELECTOR","makeApplyRuleAction","special","validatePropertyAndHandleShorthand","invalidPropertyValue","unknownProperty","simpleProperty","hook","converted","parameterParserHandler","NotParameterParserHandler","WhereParameterParserHandler","HasParameterParserHandler","_CascadeParserHandler","_this34","parentChain","maxSpecificity","_proto49","increasingSpecificity","forgiving","_MatchesParameterPars","_proto50","_MatchesParameterPars2","_proto51","_MatchesParameterPars3","_proto52","DefineParserHandler","_CssParser$SlaveParse2","dim","PropSetParserHandler","_CssParser$SlaveParse3","_this35","_proto54","PropertyParserHandler","_CssParser$ErrorHandl","_this36","_proto55","forEachViewConditionalStyles","viewConditionalStyles","mergeViewConditionalStyles","cascMap","mergeStyle","isVertical","cascaded","writingModeCasc","isRtl","directionCasc","flattenCascadedStyle","regionIds","isFootnote","forEachStylesInRegion","regionStyle","regions","footnoteRegion","_step12","_iterator12","to","newVal","convertToPhysical","dest","couplingMap","hasOwnProperty","coupledName","targetName","coupledCascVal","_Css$FilterVisitor4","_this37","_proto56","getVarValue","_this$element","_this$elementStyles","_step13","_iterator13","_style$name","_this$styler$getStyle","_this$styler$getStyle2","getStyle","_Css$FilterVisitor5","resolveViewportUnit","percentRef","_this38","_proto57","exprText","exprVal","exprResult","takesOnlyNum","createRegExpMap","valueMaps","toPhysical","physical","logical","convert","maps","maps2","replaced","toPhysicalMaps","toLogicalMaps","toLogical","Size","lineRelativeValues","getSize","sizes","maxWidth","minWidth","maxHeight","minHeight","createElement","getComputedValue","insertBefore","writingModeProperty","writingModeValue","inlineSizeName","blockSizeName","getFillAvailableInline","getMaxContentInline","getMinContentInline","getFitContentInline","fillAvailableInline","minContentInline","parsedFillAvailable","maxContentInline","getIdealBlock","getFillAvailableBlock","_element$firstElement","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","childNodes","complete","isPageFloat","COLUMN","REGION","PAGE","PageFloat","nodePosition","getOrder","isAllowedOnContext","pageFloatLayoutContext","isAnchorAlreadyAppeared","isAllowedToPrecede","PageFloatStore","nextPageFloatIndex","createPageFloatId","addPageFloat","VtreeImpl","findPageFloatByNodePosition","findPageFloatById","PageFloatFragment","continuations","area","continues","hasFloat","findNotAllowedFloat","shouldBeStashedBefore","addContinuations","getFlowName","PageFloatContinuation","PageFloatLayoutContext","generatingNodePosition","invalidated","floatStore","forbiddenFloats","floatFragments","stashedFloatFragments","floatAnchors","floatsDeferredToNext","floatsDeferredFromPrevious","layoutConstraints","locked","getPreviousSibling","getParent","getPreviousSiblingOf","getContainer","setContainer","reattachFloatFragments","getPageFloatLayoutContext","forbid","PageFloatLayoutStrategyResolver","findByFloat","isForbidden","addPageFloatFragment","floatFragment","dontInvalidate","fr1","fr2","invalidate","removePageFloatFragment","fragment","findPageFloatFragment","hasFloatFragments","hasContinuingFloatFragmentsInFlow","registerPageFloatAnchor","anchorViewNode","collectPageFloatAnchors","anchors","floatId","getDeferredPageFloatContinuations","cont","deferPageFloat","hasPrecedingFloatsDeferredToNext","ignoreReference","getLastFollowingFloatInFragments","lastFollowing","lastFollowingOfParent","c1","c2","getPageFloatContinuationsDeferredToNext","getFloatsDeferredToNextInChildContexts","checkAndForbidNotAllowedFloat","checkAndForbidFloatFollowingDeferredFloat","notAllowedFloat","removeEndFloatFragments","deferredFloats","floatsInFragments","fr","f1","f2","d","hasSameContainerAs","detachChildren","attachChildren","isInvalidated","validate","CssLogicalUtil","logicalFloatSide","stashEndFloatFragments","fragmentFloatSide","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","availableInlineSize","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","NormalPageFloatLayoutStrategy","createPageFloat","resolveFloatReferenceFromColumnSpan","createPageFloatFragment","floatArea","adjustPageFloatArea","floatContainer","Footnote","_PageFloats$PageFloat","FootnoteFragment","_PageFloatFragment","LineFootnotePolicyLayoutConstraint","blockify","blockifiedStr","displayStr","isAbsolutelyPositioned","getComputedDisplayValue","isBlock","isInlineLevel","isRubyInternalDisplay","calculateEdge","extraOffset","cbox","range","createRange","setStart","setEnd","boxes","getRangeClientRects","getElementHeight","getComputedMargin","isOrphan","removeFollowingSiblings","isSpecial","isOutOfFlow","_e$style","isSpecialNodeContext","findAncestorSpecialInlineNodeContext","Display","FootnoteLayoutStrategy","regionContext","applyFootnoteStyle","convertPercentageSizesToPx","setComputedInsets","setComputedWidthAndHeight","constraint","AbstractBreakPosition","calculateOffset","getNodeContext","collectElementsOffset","breakPositionChosen","elementsOffsets","repetitiveElement","minimum","calculateMinimumOffset","EdgeBreakPosition","_AbstractBreakPositio","breakOnEdge","overflows","overflowIfRepetitiveElementsDropped","isEdgeUpdated","findAcceptableBreak","penalty","updateOverflows","getMinBreakPenalty","findEdgeBreakPosition","preferDropping","isFirstContentOfRepetitiveElementsOwner","updateEdge","clonedPaddingBorder","calculateClonedPaddingBorder","LayoutHelper","marginBlockStart","isOverflown","repetitiveElements","getRepetitiveElements","isFirstContentNode","LayoutProcessorResolver","RESOLVE_LAYOUT_PROCESSOR","processor","BlockLayoutProcessor","layout","leadingEdge","isFloatNodeContext","layoutFloatOrFootnote","isBreakable","layoutBreakableBlock","layoutUnbreakable","createEdgeBreakPosition","columnBlockSize","BreakPosition","startNonInlineElementNode","afterNonInlineElementNode","stopAtOverflow","clearOverflownViewNodes","parentNodeContext","removeSelf","_node$parentElement","finishBreak","forceRemoveSelf","endOfColumn","processFragmentedBlockEdge","BlockFormattingContext","isFirstTime","firstTime","saveState","restoreState","blockLayoutProcessor","RESOLVE_FORMATTING_CONTEXT","AbstractLayoutRetryer","initialBreakPositions","initialStateOfFormattingContext","initialPosition","initialFragmentLayoutConstraints","prepareLayout","tryLayout","mode","resolveLayoutMode","doLayout","positionAfter","accepted","accept","postLayout","clearNodes","sibling","breakPositions","fragmentLayoutConstraints","LayoutIteratorStrategy","initialState","initialNodeContext","atUnforcedBreak","break","startNonDisplayableNode","afterNonDisplayableNode","startIgnoredTextNode","afterIgnoredTextNode","startNonElementNode","afterNonElementNode","startInlineElementNode","afterInlineElementNode","LayoutIterator","iterate","loopFrame","nextResult","nextInTree","nextNodeContext","EdgeSkipper","_LayoutIteratorStrate","startNonInlineBox","endEmptyNonInlineBox","endNonInlineBox","breakAtTheEdge","onStartEdges","leadingEdgeContexts","lastAfterNodeContext","processForcedBreak","needForcedBreak","pageBreakType","saveEdgeAndProcessOverflow","checkOverflowAndSaveEdgeAndBreakPosition","processLayoutConstraint","violateConstraint","repetitiveElementsCache","HANGING_PUNCTUATION_NONE","end","allowEnd","hangingPunctuationFromPropertyValue","cssval","hangingPunctuation","isHangingPunctuationNone","SPACING_TRIM_NONE","trimStart","spaceFirst","trimEnd","trimAdjacent","SPACING_TRIM_NORMAL","SPACING_TRIM_AUTO","spacingTrimFromPropertyValue","textSpacing","AUTOSPACE_NONE","ideographAlpha","ideographNumeric","AUTOSPACE_NORMAL","autospaceFromPropertyValue","autospace","isTextSpacingNone","spacingTrim","normalizeLang","embeddedContentTags","audio","canvas","embed","iframe","math","picture","svg","video","textPolyfill","TextSpacingPolyfill","preprocessSingleDocument","preprocessForTextSpacing","nodeIter","createNodeIterator","NodeFilter","SHOW_TEXT","nextNode","_node$parentElement$d","dataset","textArr","lastIndex","processGeneratedContent","autospaceVal","spacingTrimVal","hangingPunctuationVal","whiteSpaceSave","whiteSpace","offsetHeight","offsetWidth","prevNode","isFirstInBlock","isFirstAfterForcedLineBreak","isLastBeforeForcedLineBreak","processTextSpacing","postLayoutBlock","isFirstFragment","_p","isOutOfLine","checkIfFirstInBlock","isAfterForcedLineBreak","_p$sourceNode","checkIfAfterForcedLineBreak","_elem$style","_ref2","_ref3","_p$lang","_nodeContext$parent","checkIfFirstAfterForcedLineBreak","prevP","_prevP$viewNode","_prevP$viewNode2","_prevP$viewNode$previ","previousElementSibling","checkIfLastBeforeForcedLineBreak","nextP","_nextP$viewNode","_nextP$viewNode2","_nextP$viewNode$nextE","isFirstAfterBreak","isLastInBlock","_prevP$viewNode3","_nextP$viewNode3","nextNext","textNode","currRange","prevRange","nextRange","isAtStartOfLine","selectNode","getClientRects","prevRects","prevRect","isAtEndOfLine","nextRect","tagName","punctProcessing","hangingFirst","hangingLast","hangingEnd","linePosition","outerElem","offsetLeft","offsetTop","innerElem","fullWidthThreshold","defaultView","getComputedStyle","isFullWidth","linePos","atEnd","atEndNoHang","checkUpright","_elem$ownerDocument$d","textOrientation","textCombineUpright","checkNonZeroMarginBorderPadding","node1","node2","borderInlineEndWidth","paddingInlineEnd","parent1","borderInlineStartWidth","paddingInlineStart","parent2","registerHooks","PREPROCESS_SINGLE_DOCUMENT","DOMParser","parseFromString","SHADOW","PSEUDO_ATTR","getPseudoName","setPseudoName","PseudoelementStyler","contentProcessed","deep","CssCascade","nest","processContent","contentVal","TextPolyfill","AfterIfContinues","viewRoot","pseudoColumn","PseudoColumn","initialPageBreakType","getColumn","createNodePositionForPseudoElement","pseudoElement","PseudoElement","createShadowContext","ROOTED","AfterIfContinuesLayoutConstraint","pseudoElementHeight","overflownNodeContext","nextCandidate","allowed","affectTo","AfterIfContinuesElementsOffset","equalsTo","getPriorityOfFinishBreak","processAfterIfContinuesOfNodeContext","calculatePseudoElementHeight","processAfterIfContinues","mediaTags","AllLayoutConstraint","constraints","BoxBreakPosition","_BreakPosition$Abstra","alreadyEvaluated","breakNodeContext","findBoxBreakPosition","Column","_VtreeImpl$Container","viewDocument","flowRootFormattingContext","isFloat","startEdge","endEdge","beforeEdge","afterEdge","footnoteEdge","chunkPositions","overflown","forceNonfitting","leftFloatEdge","rightFloatEdge","bottommostFloatTop","lastAfterPosition","pseudoParent","nodeContextOverflowingDueToRepetitiveElements","blockDistanceToBlockEndFloats","breakAtTheEdgeBeforeFloat","getTopEdge","getBottomEdge","getLeftEdge","getRightEdge","stopByOverflow","getExclusions","pageFloatExclusions","openAllViews","setViewRoot","stepIndex","calculateOffsetInNodeForNodeContext","setCurrent","maybePeelOff","_position$sourceNode","_position$sourceNode$","firstLetterLength","text2","firstLetterText","peelOff","buildViewToNextBlockEdge","bodyFrame","position1Param","positionParam","buildDeepElementView","position1","createFloat","killFloats","cssFloat","createFloats","foundNonZeroWidthBand","insets","getComputedPaddingBorder","borderLeftWidth","borderTopWidth","borderRightWidth","borderBottomWidth","boxSizing","nodeContextIn","layoutFloat","lineRelativeValue","nodeContextAfter","floatBBox","floatBox","probe","parentBox","floatBoxMeasure","floatHorBox","dir","boxExtent","floatWidth","floatHeight","floatBottom","floatBoxEdge","floatBoxTop","floatBands","lastY","floatBand","updateMaxReachedAfterEdge","setupFloatArea","floatLayoutContext","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","processLineStyling","resNodeContext","lastCheckPoints","totalLineCount","linePositions","findLinePositions","lineBreak","findAcceptableBreakInside","resNodeContextParam","isLoneImage","getTrailingMarginEdgeAdjustment","trailingEdgeContexts","maxPos","minNeg","checkPointIndex","saveBoxBreakPosition","findEndOfLine","isUpdateMaxReachedAfterEdge","effectiveLinePosition","lowCP","low1","highCP","high1","mid1","edgePosition","_viewNode$parentEleme","resolveTextNodeBreaker","breakTextNode","_this$breakPositions","RESOLVE_TEXT_NODE_BREAKER","TextNodeBreaker","getRangeBoxes","wentUp","lastGood","haveStart","endNotReached","seekRange","setStartBefore","setEndAfter","boxList","lineBefore","lineAfter","lineEnd","lineLength","overlap","boxSize","paddingBorders","getOffsetByRepetitiveElements","bp","_lastNode","repetitiveElementsOffset","firstOverflowing","findFirstOverflowingEdgeAndCheckPoint","lineIndex","forceCutBeforeOverflowing","lastNode","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","_nc","_nc$viewNode","atLeadingEdgeIgnoringOutOfFlow","layoutProcessor","_breakAtTheEdge","_nodeContext$parent2","nodeContextParam","resultNodeContext","layoutNext","initGeom","columnBBox","include","exclude","granularity","segment","segments","segmentCount","lowestIncludeIndex","segmentIndex","activeSegments","y2min","yn","bandIntersections","bi1","bi2","rw","breakAtEdge","isFullWithPageFloats","nextInTreeListener","retryer","ColumnLayoutRetryer","doFinishBreakOfFragmentLayoutConstraints","sortedFragmentLayoutConstraints","pending","redoLayout","isPseudoelement","saveDistanceToBlockEndFloats","blockStartEdgeOfBlockEndFloats","isFinite","getElementsOffsetsForTableCell","startNodeContexts","parentClonedPaddingBorder","allowBreakAtStartPosition","startNodeContext","isStartNodeContext","isLastAfterNodeContext","getColumnElement","checkpointIndex","viewIndex","data","breakAfterSoftHyphen","breakAfterOtherCharacter","updateNodeContext","replaceData","resolveHyphenateCharacter","ch0","ch1","_LayoutRetryers$Abstr","initialOverflown","DefaultLayoutMode","LayoutRetryers","processAfterIfContinuesOfAncestors","hasNextCandidate","_Column","floatMargins","fixFloatSizeAndPosition","refWidth","refHeight","convertPercentageToPx","refValue","valueString","percentageValue","rootViewNode","RepetitiveElementsOwnerFormattingContext","rootSourceNode","getRootViewNode","getRootNodeContext","initializeRepetitiveElements","Shared","elements","RepetitiveElements","ownerSourceNode","headerSourceNode","footerSourceNode","headerViewNode","footerViewNode","headerNodePosition","footerNodePosition","headerHeight","footerHeight","isSkipHeader","isSkipFooter","enableSkippingFooter","enableSkippingHeader","doneInitialLayout","firstContentSourceNode","lastContentSourceNode","affectedNodeCache","afterLastContentNodeCache","allowInsert","allowInsertRepeatitiveElements","setHeaderNodeContext","setFooterNodeContext","updateHeight","prepareLayoutFragment","appendHeaderToFragment","rootNodeContext","appendElementToFragment","appendFooterToFragment","Layout","moveChildren","isAfterLastContent","findResultFromCache","isAfterNodeContextOf","cache","calculator","cacheEntry","includeChildren","parentsOfNode","currentParent","isEnableToUpdateState","updateState","preventSkippingHeader","preventSkippingFooter","isHeaderRegistered","isFooterRegistered","isHeaderSourceNode","isFooterSourceNode","LayoutEntireBlock","LayoutFragmentedBlock","LayoutEntireOwnerBlock","_LayoutEntireBlock","doInitialLayout","LayoutFragmentedOwnerBlock","_LayoutFragmentedBloc","RepetitiveElementsOwnerLayoutConstraint","appendHeader","appendFooter","RepetitiveElementsOwnerLayoutRetryer","EntireBlockLayoutStrategy","_LayoutUtil$EdgeSkipp","LayoutUtil","appendHeaderToAncestors","eachAncestorNodeContext","repetitiveLayoutProcessor","_LayoutProcessor$Bloc","RepetitiveElementsOwnerLayoutProcessor","getRepetitiveElementsOwnerFormattingContextOrNull","layoutEntireBlock","TableRow","rowIndex","cells","addCell","cell","getMinimumHeight","TableCell","columnIndex","viewElement","colSpan","rowSpan","anchorSlot","setHeight","setAnchorSlot","slot","TableSlot","TableCellFragment","pseudoColumnContainer","cellNodeContext","TableCaptionView","BetweenTableRowBreakPosition","_BreakPosition$EdgeBr","acceptableCellBreakPositions","getAcceptableCellBreakPositions","cellFragments","getCellFragments","cellFragment","getRowIndex","findRowIndexBySourceNode","getRowSpanningCellsOverflowingTheRow","getCellFragmentOfCell","InsideTableRowBreakPosition","beforeNodeContext","allCellsBreakable","row","getRowByIndex","isFreelyFragmentableRow","getCellsFallingOnRow","TableFormattingContext","_RepetitiveElementImp","tableSourceNode","columnCount","tableWidth","captions","colGroups","colWidths","rows","slots","lastRowViewNode","cellBreakPositions","cellNodePosition","finishFragment","addRow","getRowSlots","rowSlots","rowUpper","startColIndex","addCellFragment","uniqueCells","getColumnCount","sum","updateCellSizes","findCellFromColumn","tableCell","col","collectElementsOffsetOfUpperCells","collected","collectElementsOffsetFromColumn","collectElementsOffsetOfHighestColumn","elementsInColumn","ElementsOffsetOfTableCell","RepetitiveElementImpl","repeatitiveElementsInColumns","calculateMaxOffsetOfColumn","maxOffset","isValidParentOfTableRow","isTableRowGrouping","isTableRoot","skipNestedTable","parentDisplay","isNestedInlineTable","EntireTableLayoutStrategy","inRow","inHeaderOrFooter","postLayoutBlockContents","captionView","computedStyle","registerCheckPoint","TableLayoutStrategy","_LayoutUtil$EdgeSkipp2","currentRowIndex","currentColumnIndex","originalStopAtOverflow","inHeader","inFooter","resetColumn","getColSpanningCellWidth","layoutCell","startChunkPosition","cellViewNode","hasBrokenCellAtSlot","slotIndex","cellBreakPosition","extractRowSpanningCellBreakPositions","rowSpanningCellBreakPositions","layoutRowSpanningCellsFromPreviousFragment","rowCount","currentRow","spanningCellRowIndex","occupiedSlotIndices","rowCellBreakPositions","rowNodeContext","cont1","addDummyCellUntil","upperColumnIndex","dummy","breakChunkPosition","startTableRow","registerCellFragmentIndex","tdNodeStep","getElementOffset","startTableCell","afterNodeContext","startNodePosition","ignoreList","tableLayoutOptionCache","TableLayoutProcessor","layoutEntireTable","getColumnWidths","lastRow","dummyRow","dummyCells","getColGroupElements","tableElement","normalizeAndGetColElements","cols","colGroup","span","addMissingColElements","normalizeColGroups","createDocumentFragment","tableRootSourceNode","pair","tableLayoutOption","clearTableLayoutOptionCache","tableBBox","calculateBreakPositionsInside","EntireTableBreakPosition","addCaptions","caption","addColGroups","removeColGroups","iterator","LayoutRetryer","cellContentElement","cellElement","cellElementRect","adjustCellHeight","tableFormattingContext","LayoutFragmentedTable","LayoutEntireTable","_RepetitiveElementImp2","_BreakPosition$EdgeBr2","tableNodeContext","EntireTableLayoutConstraint","tableRootNode","_RepetitiveElementImp3","TableRowLayoutConstraint","_RepetitiveElementImp4","cellFragmentLayoutConstraints","collectCellFragmentLayoutConstraints","removeDummyRowNodes","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","_ColumnBalancer","originalPosition","foundUpperBound","totalBlockSize","checkPosition","isLastColumnLongerThanAnyOtherColumn","lastColumnBlockSize","BalanceNonLastColumnBalancer","_ColumnBalancer2","meanValue","computedBlockSizes","SlipRange","endStuckFixed","endFixed","endSlipped","SlipMap","getMaxFixed","getMaxSlipped","addStuckRange","addSlippedRange","slippedByFixed","fixedBySlipped","slipped","Box","atBlockStart","atFlowStart","isParentBoxDisplayed","isBlockValue","hasBoxValue","styleValues","beforeBox","afterBox","hasBox","styleValue","getBreakValue","buildAfterPseudoElementBox","cv","displayValue","BoxStack","atStartStack","lastBox","lastFlowName","isCurrentBoxDisplayed","newFlowChunk","isAtFlowStart","encounteredTextNode","CDATA_SECTION_NODE","atStart","nearestBlockStartOffset","Styler","primaryFlows","cascadeHolder","rootStyle","flowChunks","flowListener","flowToReach","idToReach","offsetMap","primaryStack","rootBackgroundAssigned","rootLayoutAssigned","breakBeforeValues","boxStack","bodyReached","rootOffset","getAttrStyle","postprocessTopStyle","replayFlowElementsFromOffset","hasProp","transferPropsToRoot","srcStyle","pname","isBody","_i","_arr","backgroundColor","backgroundProps","backgroundImage","columnProps","layoutProps","_this$context$rootFon","isRelativeFontSize","unitSize","getTopContainerStyle","styleUntil","CSSStyleDeclaration","styleAttrValue","getReachedOffset","flowNameStr","encounteredFlowElement","getNodeByOffset","nodeOffset","getNodeOffset","resetFlowChunkStream","encounteredFlowChunk","styleUntilFlowIsReached","optionsCV","options","lingerCV","priorityCV","flow","registerForcedBreakOffset","lookup","targetSlippedOffset","afterPseudoBreakBefore","blockStartOffset","pageCV","beforePseudoBreakAfter","validator","failure","markAsStartGroup","isStartGroup","markAsEndGroup","isEndGroup","markAsStartAlternate","isStartAlternate","markAsEndAlternate","isEndAlternate","getAlternate","Connection","where","what","ValidatingGroup","connections","nomatch","emptyHead","connect","nodeIndex","_group$match","_group$nomatch","_group$error","group","clonedNode","connection","groupConnection","addSpecialToArr","clause","ALWAYS_FAIL","endSpecialGroup","arrs","startSpecialGroup","endClause","startClause","addPrimitive","isSimple","isPrimitive","PrimitiveValidator","addGroup","how","ALTERNATE","combine","connectionIndex","REPEATED","OPTIONAL","successTerminal","failTerminal","ALLOW_NEGATIVE","ALLOW_ZERO","PropertyValidator","validateForShorthand","rval","_PropertyValidator","idents","units","ALLOW_POS_INT","NO_IDENTS","ListValidator","_PropertyValidator2","failureTerminal","validateList","startIndex","alternativeStack","alternatives","inval","outval","SpaceListValidator","CommaListValidator","validateSingle","_ListValidator","hasCommaListValidator","_ListValidator2","FuncValidator","_ListValidator3","ShorthandSyntaxNode","tryParse","shorthandValidator","ShorthandSyntaxProperty","_ShorthandSyntaxNode","validators","rvals","ShorthandSyntaxPropertyN","_ShorthandSyntaxPrope","ShorthandSyntaxCompound","_ShorthandSyntaxNode2","index0","newIndex","ShorthandValidator","_len","_key","syntax","setOwner","syntaxNodeForProperty","receiver","_this$values$name","propagateDefaultingValue","SimpleShorthandValidator","_ShorthandValidator","InsetsShorthandValidator","_ShorthandValidator2","createSyntaxNode","InsetsSlashShorthandValidator","_ShorthandValidator3","slashIndex","index1","CommaShorthandValidator","_SimpleShorthandValid","acc","_values$name","FontShorthandValidator","_SimpleShorthandValid2","fontVariant","fontStretch","familyList","family","systemFonts","propsExcludedFromAll","shorthandValidators","SIMPLE","INSETS","INSETS_SLASH","FONT","TEXT_SPACING","_SimpleShorthandValid3","TextSpacingShorthandValidator","ALL","_SimpleShorthandValid4","AllShorthandValidator","ValidatorSet","prefixes","namedValidators","addReplacement","newGroup","vals","subgroup","FOLLOW","addCounts","primitive","newFunc","initBuiltInValidators","vi","vb","vmin","vmax","pvi","pvb","pvmin","pvmax","deg","grad","rad","turn","ms","Hz","kHz","stdfont","isBuiltIn","readNameAndPrefixes","section","rulePrefixes","parseValidators","expectval","setop","currop","builtIn","parseDefaults","parseShorthands","insetShorthand","compound","makePropSet","_this$defaultValues$p","varCheckVisitor","VarCheckVisitor","varFound","origName","rvalue","baseValidatorSet","_len2","_key2","traitProps","prepareProperties","properties","fillDefaults","Face","fontTraitKey","blobURLs","blobs","makeFontTraitKey","traitsEqual","makeAtRule","fontBytes","blobURL","createObjectURL","DocumentFaces","deobfuscator","familyMap","registerFamily","srcFace","viewFace","srcFamily","viewFamilyFromSrc","viewFamilyFromView","filterFontFamily","newValues","rf","Mapper","opt_familyPrefix","srcURLMap","familyPrefix","familyCounter","getViewFontFamily","documentFaces","viewFamily","initFont","viewFontFace","loadFont","srcFamilySrc","viewFaceParam","BLOB","findOrLoadFonts","srcFaces","waitFontLoading","fonts","unloadedCount","fontFace","keyCount","PageBox","specified","pageMaster","_scope","parentInstance","param","copySpecified","destSpecified","cloneChildren","RootPageBox","_PageBox","PageMasterScope","_Exprs$LexicalScope","self","keyMap","boxInstance","lookupInstance","resolveFunc","resolveName","PageMaster","_PageBox2","PageMasterInstance","resetScope","PartitionGroup","_PageBox3","PartitionGroupInstance","Partition","_PageBox4","PartitionInstance","toExprAuto","toExprZero","toExprZeroAuto","toExprZeroBorder","styleVal","toExprBool","PageBoxInstance","pageBox","autoWidth","autoHeight","isAutoWidth","isAutoHeight","isTopDependentOnAutoHeight","isRightDependentOnAutoWidth","calculatedWidth","calculatedHeight","pageMasterInstance","namedValues","namedFuncs","suppressEmptyBoxGeneration","addNamedValues","altName","columnGap","initEnabled","minPageWidth","minPageHeight","boxSpecificEnabled","initHorizontal","parentWidth","leftBP","rightBP","extra","remains","initVertical","parentHeight","topBP","bottomBP","initColumns","toExprNormal","depends","registerInstance","getActiveRegions","_context$styler","_rootStyle$name","getPropAsNumber","_context$pageAreaHeig","_context$pageAreaWidt","propagateProperty","docFaces","propagatePropertyToElement","propagateDelayedProperty","assignLeftPosition","assignRightPosition","xpos","assignTopPosition","ypos","assignBottomPosition","assignBeforePosition","assignAfterPosition","assignStartEndPosition","sizeWithMaxHeight","sizeWithMaxWidth","prepareContainer","passPreProperties","transferContentProps","passContentProperties","transferSingleUriContentProps","_this7$cascaded$heigh","_this7$cascaded$width","passSingleUriContentProperties","finishContainer","readHeight","readWidth","bbox","ruleWidth","ruleStyle","ruleColor","containerSize","border","rule","passPostProperties","delayedProperties","applyCascadeAndInit","docElementStyle","userAgentPageMasterPseudo","resolveAutoSizing","RootPageBoxInstance","_PageBoxInstance","_PageBoxInstance2","adjustPageLayout","_PageBoxInstance3","_PageBoxInstance4","processPartitionList","listVal","conflicting","qname","term","required","toExprIdent","pmEnabledVal","pmEnabled","PageBoxParserHandler","PartitionParserHandler","_PageBoxParserHandler","PartitionGroupParserHandler","_PageBoxParserHandler2","partition","partitionGroup","PageMasterParserHandler","_PageBoxParserHandler3","resolvePageProgression","_style$writingMode","_style$direction","Constants","pageSizes","a10","a9","a8","a7","a6","a5","a4","a3","a2","a1","a0","b10","b9","b8","b7","b6","b5","b4","b3","b2","b1","b0","c10","c9","c8","c7","c6","c5","c4","c3","c0","letter","legal","ledger","defaultPrinterMarkLineWidth","CornerMarkPosition","CrossMarkPosition","defaultPrinterMarkLineLength","defaultBleedOffset","resolvePageSizeAndBleed","pageSizeAndBleed","bleed","bleedOffset","cropOffset","val1","marksCV","bleedCV","marks","cropOffsetCV","evaluatePageSizeAndBleed","evaluated","createPrinterMarkSvg","mark","createPrinterMarkElement","lineWidth","elementType","MarginBoxPositionAlongVariableDimension","propertiesAppliedToPartition","outline","pageMarginBoxes","isInTopRow","isInBottomRow","isInLeftColumn","isInRightColumn","positionAlongVariableDimension","START","CENTER","pageMarginBoxNames","pageRuleMasterPseudoName","marginBoxesKey","PageRuleMaster","_PageMaster$PageMaste","bodyPartitionKey","pageSize","PageRulePartition","createPageMarginBoxes","applySpecified","marginBoxesMap","PageMarginBoxPartition","PageRuleMasterInstance","_PageMaster$Partition","PageRulePartitionInstance","_PageMaster$Partition2","marginBoxName","ownStyle","ownVal","PageMarginBoxPartitionInstance","_PageMaster$PageMaste2","pageRuleMaster","pageAreaDimension","pageMarginBoxInstances","setPageAreaDimension","borderBoxWidth","borderBoxHeight","marginBoxContainers","horizontalDimensions","verticalDimensions","sizeMarginBoxesAlongVariableDimension","isHorizontal","containers","boxInstances","boxParams","boxInfo","boxParam","SingleBoxMarginBoxSizingParam","evaluatedDim","getSizesOfMarginBoxesAlongVariableDimension","needRecalculate","maxOuterSizes","maxSize","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_","_SingleBoxMarginBoxSi","fixedSize","_PageMaster$Partition3","pageRulePartition","resolvePageBoxDimensions","borderBoxExtent","marginStart","marginEnd","startSide","endSide","extentName","pageExtent","paddingStart","paddingEnd","borderStartWidth","borderEndWidth","hasBorderOrOutline","hasBorder1","_CssCascade$getProp","propValue","_PageMaster$Partition4","pageMarginBoxPartition","applyVerticalAlign","flexAlign","align","availableExtent","outerExtent","positionAndSizeAlongFixedDimension","insideName","outsideName","outside","pageMargin","marginInside","marginOutside","paddingInside","paddingOutside","borderInsideWidth","borderOutsideWidth","getComputedValues","pageMarginValue","borderAndPadding","PageManager","rootPageBoxInstance","pageMasterCache","definePageProgression","styleInstance","isVersoFirstPage","isVersoPage","pageProgression","getCascadedPageStyle","getPageRulePageMaster","makeCacheKey","generatePageRuleMaster","generateCascadedPageMaster","propsStr","makeCascadeValueObjectKey","newPageMaster","pageMasterStyle","CheckPageTypeAction","_CssCascade$ChainedAc","IsFirstPageAction","_CssCascade$ChainedAc2","IsBlankPageAction","_CssCascade$ChainedAc3","IsLeftPageAction","_CssCascade$ChainedAc4","IsRightPageAction","_CssCascade$ChainedAc5","IsRectoPageAction","_CssCascade$ChainedAc6","IsVersoPageAction","_CssCascade$ChainedAc7","IsNthPageAction","_CssCascade$IsNthActi","layoutPositionAtPageStart","blankPageAtStart","ApplyPageRuleAction","_CssCascade$ApplyRule","targetMap","boxName","targetBox","mergeInPageRule","PageParserHandler","_CssCascade$CascadePa","pageProps","currentPageSelectors","currentNamedPageSelector","currentPseudoPageClassSelectors","finishSelector","selectors","selector","noPageSelectorProps","marginBoxMap","boxStyle","PageMarginBoxParserHandler","allowScripts","deferredScripts","sameScripts","getScriptsInOrNearHead","scriptsInBodyNotNearHead","script","loadScript","srcScriptElem","flags","inHead","scriptContent","isModule","async","defer","needDefer","forceDefer","hasScripts","onload","_window$MathJax","_window$MathJax$versi","builtinMathJax2","version","getElementsByTagName","scriptElem","attributes","getAllFontFamilyList","srcDocument","fontFamilySet","findFontFamilyInStyle","_style$fontFamily","_Object$values","findAllFontFamily","arg","isArray","_Object$values2","_i3","_Object$values3","_i4","_Object$values4","transformURIs","attributeValue","m1","namespacePrefixMap","ViewFactory","footnoteStyle","stylerProducer","customRenderer","fallbackMap","createPseudoelementShadow","cascStyle","getPseudoMap","addedNames","att","childStyle","childDisplay","shadowStyler","computedPseudoStyleMap","computedPseudoStyle","createRefShadow","refDocParam","refDoc","refElement","getElement","refStyler","getStylerForDoc","createShadows","templateURLVal","shadow","cont2","computeStyle","displayValues","inheritFromSourceParent","shadowRoot","nodeStyle","inheritanceVisitor","_propList","prop1","getLineHeightUnitSize","sname","inheritLangAttribute","transferPolyfilledInheritedProps","numericVal","resolveFormattingContext","createElementView","_this$nodeContext$vie","_this$nodeContext$par","needToProcessChildren","inheritedValues","positionCV","floatCV","floatReferenceCV","Scripts","_this$nodeContext$par2","_this$nodeContext$par3","shadowParam","parentWritingMode","isFlowRoot","floating","listItem","breakInside","insideNonRootMultiColumn","isInsideNonRootMultiColumn","pageVal","borderCollapse","borderSpacing","processAfterIfcontinues","whitespaceValue","overflowWrap","processRepeatOnBreak","findAndProcessRepeatingElements","_elementStyle$content","_elementStyle$content2","custom","tag","NCX","navParent","hp","contentWindow","navigator","layoutStyle","hasFeature","imageResolution","images","cssWidth","cssHeight","attrWidth","attrHeight","hasAutoWidth","hasAutoHeight","attributeCount","delayedSrc","attribute","attributeNS","nodeValue","transformedValue","anchorElem","image","Image","isSVGUrlAttribute","Urls","attributePrefix","imageFetcher","_this5$nodeContext$pa","_p$style","isInsideRunningElement","listStyleImage","listStyleURL","preprocessElementStyle","applyComputedStyles","marginBreak","breakType","getBreakTypeAt","modifyElemDimensionWithImageResolution","_this$nodeContext$par4","_this$context","_this$context$current","_this$context$current2","_nc$parent","parentViewNode","paddingBlockStart","borderBlockStartWidth","currentLayoutPosition","SVG_URL_ATTRIBUTES","scaledWidth","scaledHeight","numericMaxHeight","numericMinWidth","numericMinHeight","PREPROCESS_ELEMENT_STYLE","createTextNodeView","preprocessTextContent","Diff","originl","PREPROCESS_TEXT_CONTENT","processedText","createNodeView","processChildren","_p$viewNode","isPseudo","hasChildNodes","processShadowContent","contentNode","contentShadowType","contentShadow","nextPositionInTree","shadowNode","sr","isTransclusion","transclusionType","proc","addImageFetchers","bg","_this$nodeContext","_this$sourceNode","_this$viewRoot","isRelativePositioned","_propList2","propertiesNotPassedToDOM","fixRubyTextFontSize","_this$nodeContext$par5","_this$nodeContext$par6","defaultLineHeightNum","parentStyle","parentLineHeight","lineHeightNum","_this$nodeContext$par7","_viewNode","_viewNode$style","ancestorLH","_target$style","userAgent","fontSizeInPx","_this$nodeContext2","_this$nodeContext2$pa","parentElem","zoom","minFontSizeInPx","pn","childComputedStyle","_nodeContext$sourceNo","nodeContext1","isBeforeBlock","nextElem","blockNestCount","extentBefore","fixClonedBoxDecorationOverflow","textAlign","elem2","createChildAnonymousBlockIfNeeded","adjust","checkForcedLineBreakElem","elem1","_this13$viewport$wind","lastElementChild","found","prevElem","forcedBreakElem","anonymousBlock","step1","step2","nodePosition1","nodePosition2","DOMParserSupportedType","DefaultClientLayout","layoutBox","scaleRatio","pixelRatio","devicePixelRatio","scaleRect","subtractOffsets","originRect","viewportLeft","viewportTop","rects","layoutBoxRect","getBoundingClientRect","Viewport","opt_root","opt_width","opt_height","outerZoomBox","contentContainer","innerWidth","innerHeight","isHeadlessBrowser","webdriver","resetZoom","XMLDocHolder","totalOffset","idMap","NodeList","offsetStr","srcNode","getTotalOffset","buildIdMap","xmlid","getElementsByName","parseAndReturnNullIfError","opt_parser","docElement","errorTagName","parseXMLResource","supportedKeys","APPLICATION_XML","TEXT_HTML","APPLICATION_XHTML_XML","IMAGE_SVG_XML","resolveContentType","predicate","Predicate","check","withAttribute","withChild","opt_childPredicate","asArray","pr","forEachNode","forEachNonNull","uaStylesheetBaseFetcher","CssValidator","Style","rootBox","fontFaces","footnoteProps","flowProps","viewportProps","fontDeobfuscator","matchPageSide","lookupOffset","flowChunkIsAfterParentFlowForcedBreak","pageNumberOffset","sizeViewport","textZoom","scaleFactor","defaultFontSize","widthVal","heightVal","StyleInstance","_Exprs$Context","defaultLang","fontMapper","stylerMap","faces","pageBoxInstances","pageManager","rootPageFloatLayoutContext","pageBreaks","pageSheetSize","pageSheetHeight","pageSheetWidth","Font","CssStyler","CssPage","matchStartPageSide","srcScripts","needPrepareForWebFonts","textContentDiv","_window$document$quer","prepareTextContentForWebFonts","savedDollar","_window$FontJSON","_window$ret","classList","Event","pageStyle","isRectoStart","isLTR","getStyleForDoc","evalSupportsSelector","supported","supportsReceiver","SupportsReceiver","sph","StyleParserHandler","cascadeParserHandler","getConsumedOffset","chunkOffset","getPosition","layoutPosition","noLookAhead","currentPosition","consumedOffset","dumpLocation","updateStartSide","selectPageMaster","pageMasters","coeff","pageArea","initLingering","breakOffsetBeforeStartIndex","breakOffsetBeforeStart","parentFlowPosition","parentStartOffset","setFormattingContextToColumn","layoutDeferredPageFloats","pageStartPos","deferredFloatOffset","checkPageFloatForLaterPage","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","dontExclude","forwardOrderInLayout","textAutospace","textSpacingTrim","removed","innerContainerTag","innerContainer","outerShape","processLinger","noMorePrimaryFlows","layoutNextPage","LIMIT_PAGES","bleedBoxPaddingEdge","evaluatedPageSizeAndBleed","setPageSizeAndBleed","printerMarkOffset","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","BaseParserHandler","masterHandler","insideRegion","pageHandler","regionCount","regionHandler","_CssParser$DispatchPa","parseOPSResource","OPSDocStore","_Net$ResourceStore","styleByKey","styleFetcherByKey","styleByDocURL","triggersByDocURL","styleSheets","triggerSingleDocumentPreprocessing","authorStyleSheets","userStyleSheets","setStyleSheets","clearStyleSheets","addAuthorStyleSheet","addUserStyleSheet","stylesheet","XmlDoc","triggerList","getElementsByTagNameNS","triggerElem","EV","sources","title","_elem$getAttribute","rel","processViewportMeta","source","meta","bulletClosed","TOCView","rendererFactory","setAutoHeight","makeCustomRenderer","renderer","srcElem","viewParent","behavior","replaceChild","createComment","adaptParentClass","button","toggleNodeExpansion","tabIndex","showTOC","tocBoxUrl","viewportSize","OPS","bodyChildElem","hideTOC","isTOCVisible","getTOC","exportTree","links","exportLink","hash","innerText","tocNodeElem","ce","adaptClass","stopPropagation","EPUBDocStore","_OPS$OPSDocStore","plainXMLStore","jsonStore","opfByURL","primaryOPFByEPubURL","deobfuscators","documents","makeDeobfuscatorFactory","loadAsPlainXML","startLoadingAsPlainXML","loadAsJSON","loadPubDoc","loadEPUBDoc","opf","_url$match","loadOPF","manifestObj","reportLoadError","OPFDoc","initWithWebPubManifest","loadWebPub","containerXML","pubURL","opfXML","encXML","initWithXMLDoc","manifestLink","manifestUrl","xhtmlToc","addDocument","docURL","domain","removePath","prePaginated","OPFItem","mediaType","itemRefElement","compressedSize","compressed","epage","epageCount","skipPagesBefore","itemProperties","initWithElement","itemElem","opfURL","propStr","initWithParam","getOPFItemId","predefinedPrefixes","dcterms","marc","rendition","onix","xsd","defaultIRI","metaTerms","language","creator","titleType","displaySeq","alternateScript","role","getMetadataComparator","item1","item2","_r1$metaTerms$display","_r2$metaTerms$display","_r1$metaTerms$titleTy","_r2$metaTerms$titleTy","i1","i2","getMathJaxHub","PageViewMode","supportedMediaTypes","transformedIdPrefix","items","spine","itemMap","itemMapByPath","uid","bindings","epageIsRenderedPage","epageCountCallback","metadata","ncxToc","cover","createDocumentURLTransformer","MATHML","OPFDocumentURLTransformer","path","restoreURL","encoded","unescapeCharFromHex","getMetadata","getPathFromURL","epubBaseURL","pkg","uidref","uidElem","srcToFallbackId","fallback","fallbackSrc","tocAttr","pageProgressionAttr","idpfObfURLs","mediaTypeElems","handlerId","mroot","prefixMap","resolveProperty","iri","rawItems","refines","scheme","DC","rawItemsByTarget","rawItem","makeMetadata","entryMap","sortMetadata","readMetadata","blob","algorithm","crypto","subtle","digest","TextEncoder","encode","Uint8Array","makeDigest","fileReader","FileReader","readAsArrayBuffer","dataView","DataView","byteLength","getUint8","setUint8","makeDeobfuscator","assignAutoPages","setEPageCountMode","countEPages","offsetPerEPage","initWithChapters","itemref","_manifestObj$metadata","_manifestObj$metadata2","_doc$querySelectorAll","_manifestObj$metadata3","_item$value","author","_item$name","primaryEntryPath","encodeURI","hrefNoFragment","itemCount","tocFound","readingOrderOrResources","itemObj","isInReadingOrder","encodingFormat","_this12$items","getCFI","offsetInItem","cfi","CFI","resolveFragment","opfNav","idref","nodeNav","resolveEPage","getEPageFromPosition","makePageAndPosition","OPFView","pageSheetSizeReporter","spineItems","spineItemLoadingContinuations","tocAutohide","tocVisible","tocView","Counters","getPage","viewItem","getCurrentPageProgression","finishPageContainer","oldPage","prevItem","newPage","insertPos","renderSinglePage","makePage","posParam","layoutPositions","prevPos","getPageViewItem","resultPosition","pageAndPosition","nextLayoutPosition","normalizeSeekPosition","seekOffset","seekOffsetPageIndex","findPage","sync","resultPage","normalizedPosition","renderPage","renderAllPages","renderPagesUpto","notAllPages","lastResult","firstPage","lastPage","nextPage","nextViewItem","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","_attrs","newUrl","loadingContinuations","_this27$spineItems$","epubSpineProperties","pageCounterOffset","previousViewItem","pubTitles","removeRenderedPages","hasAutoSizedPages","hasPages","autohide","toc","Toc","tocWidth","tocHeight","VIEWPORT_STATUS_ATTRIBUTE","ZoomType","AdaptiveViewer","viewportElement","instanceId","callbackFn","kick","sendCommand","resizeListener","hyperlinkListener","pageRuleStyleElement","pageSheetSizeAlreadySet","renderTask","packageURL","touchActive","touchX","touchY","needResize","resized","needRefresh","currentSpread","pagePosition","fitToScreen","pageViewMode","waitForLoading","pixelRatioLimit","opfView","findOrCreateStyleElement","cssText","styleElement","pageReplacedListener","loadPublication","loadXML","configure","moveTo","addLogListeners","LOADING","SINGLE_PAGE","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","updateSpreadView","sizeIsGood","_this$opfView","hasNoAutoSizedPages","spreadViewChanged","setPageSize","setPageSizePageRules","AUTO_SPREAD","_this$pageSizes","_this$pageSizes2","convertSize","widthMax","heightMax","widthPt","heightPt","removePageSizePageRules","setSpreadZoom","setPageZoom","getAdjustedZoomFactor","getSpreadDimensions","pageDimension","calculateZoomFactorToFitInsideViewPort","abs","queryZoomFactor","pageDim","FIT_INSIDE_VIEWPORT","RenderingCanceledError","resizeTask","INTERACTIVE","notification","COMPLETE","_command$position","method","currentVisibility","changeAutohide","runCommand","actionName","initEmbed","cmd","maybeParse","viewer","hrefEvent","internal","frameInternal","_Error","setPrototypeOf","_wrapNativeSuper","convertViewerOptions","Navigation","CoreViewer","settings","opt_options","initialized","adaptViewer_","eventTarget","dispatcher","autoResize","pageBorderWidth","setOptions","defineProperty","removeListener","loadDocument","singleDocumentOptions","opt_documentOptions","opt_viewerOptions","loadDocumentOrPublication","pubUrl","documentOptions","convertStyleSheetArray","userAgentRootURL","convertSingleDocumentOptions","resolveNavigation","nav","PREVIOUS","NEXT","navigateToPage","opt_epage","EPAGE","navigateToInternalUrl","navigateToPosition","_position$pageIndex","_position$offsetInIte","opt_show","opt_autohide","getPageSizes","_this$adaptViewer_$op","_this$adaptViewer_$op2","getCover","toNumberOrNull","opt","VivliostylePrint","htmlDoc","_ref$title","_ref$printCallback","printCallback","iframeWin","_ref$hideIframe","hideIframe","_ref$removeIframe","removeIframe","borderWidth","printInstance","srcdoc","runInIframe","preparePrint","browserPrint","cleanUp","docBlob","Viewer","Promise","config"],"mappings":"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PnD,GAAOmD,QACPnD,GAAOmD,QACPnD,GAAOmD,QACPnD,GAAOmD,QACPnD,GAAOmD,QACPnD,GAAOmD,QACPnD,GAAOmD,QACPnD,GAAOmD,QACPnD,GAAOmD,QACPnD,GAAOmD,QACPnD,GAAOmD,QACPnD,GAAOmD,QACPnD,GAAOmD,QACPnD,GAAOmD,QACPnD,GAAOmD,QACPnD,GAAOmD,QACPnD,GAAOmD,QACPnD,GAAOmD,QACPnD,GAAOmD,QACPnD,GAAOmD,QACPnD,GAAOiE,QACPjE,GAAOkE,MACPlE,GAAOmD,QACPnD,GAAOkE,MACPlE,GAAOkE,MACPlE,GAAOkE,MACPlE,GAAOkE,MACPlE,GAAOkE,MACPlE,GAAOkE,MACPlE,GAAOkE,MACPlE,GAAOkE,MACPlE,GAAOkE,MACPlE,GAAOkE,MACPlE,GAAOmD,QACPnD,GAAOmD,QACPnD,GAAOmD,QACPnD,GAAOmD,QACPnD,GAAOmD,QACPnD,GAAOmD,QACPnD,GAAOmD,QACPnD,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOmD,QACPnD,GAAOmE,OACPnE,GAAOmD,QACPnD,GAAOmD,QACPnD,GAAOiE,QACPjE,GAAOmD,QACPnD,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOiE,QACPjE,GAAOmD,QACPnD,GAAOmD,QACPnD,GAAOmD,QACPnD,GAAOmD,QACPnD,GAAOmD,SAGTS,GAAgB,IAAI5D,GAAO6D,QAKd,IAAAO,GAAyB,CACpCpE,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOqE,OACPrE,GAAOkE,MACPlE,GAAOkD,IACPlD,GAAOsE,MACPtE,GAAOsE,MACPtE,GAAOsE,MACPtE,GAAOsE,MACPtE,GAAOsE,MACPtE,GAAOsE,MACPtE,GAAOsE,MACPtE,GAAOsE,MACPtE,GAAOsE,MACPtE,GAAOsE,MACPtE,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOkD,IACPlD,GAAOmE,OACPnE,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOuE,QACPvE,GAAOkD,IACPlD,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOuE,QACPvE,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,IACPlD,GAAOkD,KAGTkB,GAAgB,IAAIpE,GAAOkD,IAKd,IAAAsB,GAA4B,CACvCxE,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAO0E,QACP1E,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAO0E,QACP1E,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAO2E,OACP3E,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAOyE,QACPzE,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,GAAOyE,QACPzE,GAAO+D,QACP/D,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAO8D,KACP9D,GAAOyE,QACPzE,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,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAOyE,QACPzE,GAAOyE,SAGTD,GAAmB,IAAIxE,GAAOyE,QAKjB,IAAAG,GAAuB,CAClC5E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO8E,OACP9E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO+E,OACP/E,GAAO6E,OACP7E,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAOgF,KACPhF,GAAO6E,OACP7E,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,OACP7E,GAAO6E,QAGTD,GAAc,IAAI5E,GAAO6E,OAKlB,IAAMI,GAA0B,CACrCjF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAO8E,OACP9E,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAO8D,KACP9D,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOkF,OACPlF,GAAOgF,KACPhF,GAAOkF,OACPlF,GAAOgF,KACPhF,GAAOgF,KACPhF,GAAOgF,KACPhF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CA,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,IACA,IACA,IACA,IACA,IACA,IACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,KACA,GACA,IACA,EACA,IACA,EACA,IACA,EACA,IACA,EACA,IACA,EACA,IACA,EACA,IACA,EACA,IACA,EACA,IACA,EACA,MAIS5E,GAAsB,CACjC6E,MAAO,MACPC,MAAO,MACPC,MAAO,SACPC,QAAS,aAGEl/C,GAAQ,CACnBm/C,OAAQ,IACRC,KAAM,IACNC,OAAQ,IACR/9C,KAAM,IAmEK65C,GAAwC,CACnDP,QAAQ,EACRF,OAAQ,aACRG,QAAS,MACTF,SAAU,KA0DC2E,GAAkB,EAAI,QAEnB,SAAAC,GAAU93B,EAAkB+3B,GAC1C,IAAK,IAAM7iC,KAAK8K,EACd+3B,EAAI7iC,GAAK8K,EAAI9K,GAAGymB,OAEpB,KAs1BYqc,GAp1BCC,oCAAOA,IAAApnE,KAClB44D,QAAkB,EAClBD,KAAAA,SAAsC,CAAA,OACtC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"}
\No newline at end of file