UNPKG

2.52 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, vertical?: 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 const isVertical = vertical ?? this.pageVertical;\n\n switch (unit) {\n case \"vw\":\n return vw;\n case \"vh\":\n return vh;\n case \"vi\":\n return isVertical ? vh : vw;\n case \"vb\":\n return isVertical ? 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 isVertical ? pvh : pvw;\n case \"pvb\":\n return isVertical ? 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 max_content: getName(\"max-content\"),\n min_content: getName(\"min-content\"),\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}\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 | normal | 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: normal;\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 \"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 \"http://www.w3.org/1999/xhtml\";\n@namespace m \"http://www.w3.org/1998/Math/MathML\";\n@namespace epub \"http://www.idpf.org/2007/ops\";\n\nhtml,\naddress,\nblockquote,\nbody,\ndd,\ndiv,\ndl,\ndt,\nfieldset,\nform,\nframe,\nframeset,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\nnoframes,\nol,\np,\nul,\ncenter,\ndir,\nhr,\nmenu,\npre,\ndetails,\ndialog,\nlegend,\nlisting,\noptgroup,\noption,\nplaintext,\nsearch,\nxmp,\narticle,\nsection,\nnav,\naside,\nhgroup,\nfooter,\nheader,\nfigure,\nfigcaption,\nmain {\n display: block;\n}\nli {\n display: list-item;\n}\nhead {\n display: none !important;\n}\ntable {\n display: table;\n}\ntr {\n display: table-row;\n}\nthead {\n display: table-header-group;\n break-after: avoid;\n}\ntbody {\n display: table-row-group;\n}\ntfoot {\n display: table-footer-group;\n break-before: avoid;\n}\ncol {\n display: table-column;\n}\ncolgroup {\n display: table-column-group;\n}\ntd,\nth {\n display: table-cell;\n}\ncaption {\n display: table-caption;\n text-align: center;\n}\nth {\n font-weight: bolder;\n text-align: center;\n}\n*[hidden],\nlink,\nstyle,\nscript {\n display: none;\n}\nh1 {\n font-size: 2em;\n margin-block: 0.67em;\n}\nh2 {\n font-size: 1.5em;\n margin-block: 0.83em;\n}\nh3 {\n font-size: 1.17em;\n margin-block: 1em;\n}\nh4 {\n font-size: 1em;\n margin-block: 1.33em;\n}\nh5 {\n font-size: 0.83em;\n margin-block: 1.67em;\n}\nh6 {\n font-size: 0.67em;\n margin-block: 2.33em;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-weight: bold;\n break-after: avoid;\n}\np,\nblockquote,\nfigure,\nul,\nol,\ndl,\ndir,\nmenu {\n margin-block: 1em;\n}\nb,\nstrong {\n font-weight: bolder;\n}\nblockquote,\nfigure {\n margin-inline: 40px;\n}\ni,\ncite,\ndfn,\nem,\nvar,\naddress {\n font-style: italic;\n}\npre,\ntt,\ncode,\nkbd,\nsamp {\n font-family: monospace;\n text-spacing: none;\n hanging-punctuation: none;\n}\nlisting,\nplaintext,\nxmp,\npre {\n white-space: pre;\n}\npre[wrap] {\n white-space: pre-wrap;\n}\nbutton,\ntextarea,\ninput,\nselect {\n display: inline-block;\n}\nbig {\n font-size: 1.17em;\n}\nsmall,\nsub,\nsup {\n font-size: 0.83em;\n}\nsub {\n vertical-align: sub;\n}\nsup {\n vertical-align: super;\n}\ntable {\n box-sizing: border-box;\n border-spacing: 2px;\n border-collapse: separate;\n text-indent: initial;\n}\nthead,\ntbody,\ntfoot,\ntable > tr {\n vertical-align: middle;\n}\ntr,\ntd,\nth {\n vertical-align: inherit;\n}\ns,\nstrike,\ndel {\n text-decoration: line-through;\n}\nhr {\n border-style: inset;\n border-width: 1px;\n margin-block: 0.5em;\n}\nhr[color],\nhr[noshade] {\n border-style: solid;\n}\nol,\nul,\ndir,\nmenu {\n padding-inline-start: 40px;\n}\ndd {\n margin-inline-start: 40px;\n}\nol ul,\nul ol,\nul ul,\nol ol {\n margin-block: 0;\n}\nu,\nins {\n text-decoration: underline;\n}\ncenter {\n text-align: center;\n}\nq::before {\n content: open-quote;\n}\nq::after {\n content: close-quote;\n}\n\nruby {\n display: ruby;\n}\nrp {\n display: none;\n}\nrbc {\n display: ruby-base-container;\n}\nrtc {\n display: ruby-text-container;\n}\nrb {\n display: ruby-base;\n white-space: nowrap;\n}\nrt {\n display: ruby-text;\n}\nrtc,\nrt {\n text-emphasis: none;\n white-space: nowrap;\n line-height: 1;\n}\nrtc,\nrt {\n font-size: 50%;\n}\nrtc:lang(zh-TW),\nrt:lang(zh-TW) {\n font-size: 30%;\n}\nrtc > rt,\nrtc > rt:lang(zh-TW) {\n font-size: 100%;\n}\n\n/* Bidi settings */\nbdo[dir=\"ltr\"] {\n direction: ltr;\n unicode-bidi: bidi-override;\n}\nbdo[dir=\"rtl\"] {\n direction: rtl;\n unicode-bidi: bidi-override;\n}\n*[dir=\"ltr\"] {\n direction: ltr;\n unicode-bidi: isolate;\n}\n*[dir=\"rtl\"] {\n direction: rtl;\n unicode-bidi: isolate;\n}\n\n/* MathML */\nm|math[display=\"block\"] {\n display: block;\n}\n\n/*------------------ epub-specific ---------------------*/\n\na[epub|type=\"noteref\"] {\n font-size: 0.75em;\n vertical-align: super;\n line-height: 0.01;\n}\n\na[epub|type=\"noteref\"]:href-epub-type(footnote) {\n -adapt-template: url(user-agent.xml#footnote);\n text-decoration: none;\n}\n\naside[epub|type=\"footnote\"] {\n display: none;\n}\n\naside[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 \"http://www.w3.org/1999/xhtml\";\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\n*:not([role=doc-toc],\n [role=doc-toc] *,\n :has([role=doc-toc]),\n :is(h1,h2,h3,h4,h5,h6):has(+:not(nav)[role=doc-toc])) {\n display: none;\n}\n\n[hidden] {\n display: revert;\n}\n\n[role=doc-toc] li a,\nncx|navLabel {\n -adapt-behavior: toc-node-anchor;\n}\n\n[role=doc-toc] li,\nncx|navPoint {\n -adapt-behavior: toc-node;\n}\n\n[role=doc-toc] li > :not(ul,ol):first-child {\n -adapt-behavior: toc-node-first-child;\n}\n\n[role=doc-toc] :is(ol,ul),\n[role=doc-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\n[data-vivliostyle-page-container] {\n text-spacing-trim: space-all;\n text-autospace: no-autospace;\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(\n context: Exprs.Context,\n propName?: string,\n percentRef?: number,\n vertical?: boolean,\n ): Css.Val {\n if (propName && Css.isCustomPropName(propName)) {\n return this.value;\n }\n return evaluateCSSToCSS(\n context,\n this.value,\n propName,\n percentRef,\n vertical,\n );\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 public vertical?: boolean,\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 *\n this.context.queryUnitSize(numeric.unit, false, this.vertical),\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 vertical?: boolean,\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(\n new CalcFilterVisitor(context, true, percentRef, vertical),\n );\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 (\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 forceEnd: boolean; // force-end\n allowEnd: boolean; // allow-end\n last: boolean;\n};\n\nconst HANGING_PUNCTUATION_NONE: HangingPunctuation = {\n first: false,\n forceEnd: 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.forceEnd = true;\n hangingPunctuation.allowEnd = false;\n break;\n case \"allow-end\":\n hangingPunctuation.forceEnd = false;\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.forceEnd &&\n !hangingPunctuation.allowEnd\n );\n}\n\ntype SpacingTrim = {\n trimStart: boolean; // trim-start\n spaceFirst: boolean; // space-first\n trimEnd: boolean; // trim-end\n allowEnd: boolean; // allow-end\n trimAdjacent: boolean; // trim-adjacent\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: normal\n * normal = space-start allow-end trim-adjacent\n */\nconst SPACING_TRIM_NORMAL: SpacingTrim = {\n trimStart: false,\n spaceFirst: false,\n trimEnd: false,\n allowEnd: true,\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_NORMAL);\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 = false;\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 = false;\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.spaceFirst &&\n !spacingTrim.trimEnd &&\n !spacingTrim.allowEnd &&\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 const p = checkPoints[0];\n for (let pp = p; ; pp = pp.parent) {\n if (!pp || !pp.inline) {\n if (pp?.fragmentIndex !== 1) {\n // This block is not the first fragment\n return false;\n }\n break;\n }\n }\n if (!p.inline) {\n // This is at the start of the block\n return true;\n }\n for (\n let prev = p.viewNode.previousSibling;\n prev;\n prev = prev.previousSibling\n ) {\n if (Vtree.canIgnore(prev, p.whitespace)) {\n continue;\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.viewNode?.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 const display = (prevNode as HTMLElement).style?.display;\n if (display && display !== \"inline\") {\n return !/^(inline|ruby)\\b/.test(display);\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 let iFirst = -1;\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 if (iFirst < 0) {\n iFirst = i;\n }\n let prevNode: Node = null;\n let nextNode: Node = null;\n let isFirstAfterBreak = i === iFirst;\n let isFirstInBlock = i === iFirst && isFirstFragment;\n let isFirstAfterForcedLineBreak =\n i === iFirst && 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 if (p.parent?.display === \"inline-block\") {\n if (!isFirstInBlock) {\n let firstInInlineBlock = p.parent.viewNode.firstChild;\n while (Vtree.canIgnore(firstInInlineBlock, p.whitespace)) {\n firstInInlineBlock = firstInInlineBlock.nextSibling;\n }\n if (p.viewNode === firstInInlineBlock) {\n isFirstInBlock = true;\n }\n }\n if (!isLastInBlock) {\n let lastInInlineBlock = p.parent.viewNode.lastChild;\n while (Vtree.canIgnore(lastInInlineBlock, p.whitespace)) {\n lastInInlineBlock = lastInInlineBlock.previousSibling;\n }\n if (p.viewNode === lastInInlineBlock) {\n isLastInBlock = true;\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 (\n (hangingPunctuation.forceEnd || hangingPunctuation.allowEnd) &&\n /^[、。,.、。]\\p{M}*$/u.test(text)\n ) {\n // hanging-punctuation: force-end | allow-end\n tagName = \"viv-ts-close\";\n punctProcessing = true;\n hangingEnd = true;\n } else if (\n (spacingTrim.trimStart ||\n spacingTrim.spaceFirst ||\n 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 ||\n spacingTrim.allowEnd ||\n 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) {\n outerElem.className = \"viv-ts-trim\";\n } else {\n outerElem.className = \"viv-ts-space\";\n }\n } else if (\n !(spacingTrim.trimStart || spacingTrim.spaceFirst) &&\n isAtStartOfLine()\n ) {\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 (\n (spacingTrim.trimStart || spacingTrim.spaceFirst) &&\n isAtStartOfLine()\n ) {\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 const linePos = linePosition();\n if (hangingEnd) {\n outerElem.className = isFullWidth\n ? hangingPunctuation.allowEnd && spacingTrim.allowEnd\n ? \"viv-ts-auto\"\n : \"viv-hang-end\"\n : \"viv-hang-end viv-hang-hw\";\n if (hangingPunctuation.allowEnd && linePos === linePosition()) {\n if (spacingTrim.trimEnd) {\n outerElem.className = \"viv-ts-trim\";\n } else if (spacingTrim.allowEnd) {\n outerElem.className = \"viv-hang-end\";\n if (linePos === linePosition()) {\n outerElem.className = \"\";\n }\n } else {\n outerElem.className = \"viv-ts-space\";\n }\n }\n } else if (spacingTrim.trimEnd) {\n outerElem.className = \"viv-ts-trim\";\n } else if (spacingTrim.allowEnd) {\n outerElem.className = \"viv-ts-auto\";\n if (linePos === linePosition()) {\n outerElem.className = \"\";\n }\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 (atEndNoHang && spacingTrim.trimEnd) {\n outerElem.className = \"viv-ts-auto\";\n } else if (!atEndNoHang && !isAtEndOfLine()) {\n outerElem.className = \"\";\n } else if (!atEnd && hangingPunctuation.allowEnd) {\n if (!spacingTrim.trimEnd) {\n outerElem.className = \"viv-ts-space\";\n if (!isAtEndOfLine()) {\n if (spacingTrim.allowEnd) {\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 || spacingTrim.allowEnd) {\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 const isRoot = !this.nodeContext?.parent;\n if (isRoot) {\n // Ensure that writing-mode and direction are set on the root element.\n if (!cascMap[\"writing-mode\"] && this.styler.rootStyle[\"writing-mode\"]) {\n cascMap[\"writing-mode\"] = this.styler.rootStyle[\n \"writing-mode\"\n ] as CssCascade.CascadeValue;\n }\n if (!cascMap[\"direction\"] && this.styler.rootStyle[\"direction\"]) {\n cascMap[\"direction\"] = this.styler.rootStyle[\n \"direction\"\n ] as CssCascade.CascadeValue;\n }\n }\n const verticalParent = vertical;\n vertical = CssCascade.isVertical(cascMap, context, vertical);\n const verticalChanged = !isRoot && vertical !== verticalParent;\n rtl = CssCascade.isRtl(cascMap, context, rtl);\n\n const transform = (\n name: string,\n cascVal: CssCascade.CascadeValue,\n ): Css.Val => {\n // The percent value of inline-size on vertical-in-horizontal or\n // horizontal-in-vertical block needs to be resolved against the\n // page area height or width. (Fix for issue #1264)\n let percentRef: number;\n if (verticalChanged) {\n if (vertical) {\n if (/^(min-|max-)?(height|inline-size)$/.test(name)) {\n percentRef = context.pageAreaHeight;\n }\n } else {\n if (/^(min-|max-)?(width|inline-size)$/.test(name)) {\n percentRef = context.pageAreaWidth;\n }\n }\n }\n let value = cascVal.evaluate(context, name, percentRef, vertical);\n if (name == \"font-family\") {\n value = this.docFaces.filterFontFamily(value);\n }\n return value;\n };\n\n CssCascade.convertToPhysical(\n cascMap,\n computedStyle,\n vertical,\n rtl,\n transform,\n );\n\n if (verticalChanged) {\n // The auto value of inline-size on vertical-in-horizontal or\n // horizontal-in-vertical block is changed to max-content.\n // (Fix for issue #1264)\n const inlineSize = computedStyle[vertical ? \"height\" : \"width\"];\n if (!inlineSize || inlineSize === Css.ident.auto) {\n computedStyle[vertical ? \"height\" : \"width\"] = Css.ident.max_content;\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 display === Css.ident.table_header_group ||\n display === Css.ident.table_footer_group)\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 (\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 /** @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 function findTocElements(doc: Document): Array<Element> {\n // Find `role=\"doc-toc\"` for webpub or `<nav epub:type=\"toc\">` etc. for EPUB.\n const tocElems = Array.from(\n doc.querySelectorAll(\n \"[role=doc-toc],nav[*|type=toc],nav[*|type=landmarks],nav[*|type=page-list]\",\n ),\n );\n if (tocElems.length > 0) {\n return tocElems;\n }\n // If not found, find TOC elements with the following selector.\n const navs = \"nav,.toc,#toc,#table-of-contents,#contents,[role=directory]\";\n for (const elem of doc.querySelectorAll(navs)) {\n if (tocElems.find((e) => e.contains(elem))) {\n continue; // Skip nested TOC elements.\n }\n let tocElem = elem;\n if (/^h[1-6]$/.test(tocElem.localName)) {\n // If the element is a heading, use its parent or next sibling as TOC element.\n if (!tocElem.previousElementSibling) {\n // If the heading is the first element, use its parent.\n tocElem = tocElem.parentElement;\n } else {\n // Otherwise, use its next sibling.\n tocElem = tocElem.nextElementSibling;\n }\n }\n // TOC element must have at least one list item with an anchor element.\n if (tocElem && tocElem.querySelector(\"li a[href]\")) {\n tocElems.push(tocElem);\n }\n }\n return tocElems;\n}\n\nexport function findTocAnchorElements(doc: Document): Array<Element> {\n const tocElems = findTocElements(doc);\n const anchors = [] as Array<Element>;\n for (const tocElem of tocElems) {\n for (const anchor of tocElem.querySelectorAll(\"li a[href]\")) {\n anchors.push(anchor);\n }\n }\n return anchors;\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 \"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 for (const tocElem of findTocElements(xmldoc.document)) {\n // Set `role=\"doc-toc\"`\n tocElem.setAttribute(\"role\", \"doc-toc\");\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 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 // 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 primary entry (X)HTML\n if (Toc.findTocElements(doc).length === 0) {\n // TOC is not found in the primary 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 for (const anchorElem of Toc.findTocAnchorElements(doc)) {\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 readingOrderOrResources === manifestObj[\"readingOrder\"];\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 });\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 // remove items not in readingOrder (Issue #1257)\n const readingOrderCount = manifestObj[\"readingOrder\"]?.length;\n if (readingOrderCount && readingOrderCount < this.items.length) {\n this.items.splice(readingOrderCount);\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 if (!this.opf.pageProgression && instance.pageProgression) {\n // Use the first instance's page progression as the global page progression.\n // (Fix for issue #1260)\n this.opf.pageProgression = instance.pageProgression;\n }\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 if (!Constants.isDebug) {\n pageCont.style.visibility = \"hidden\";\n }\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","vertical","pvw","pvh","vw","vh","isVertical","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","max_content","min_content","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","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","percentRef","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","_MatchesParameterPars3","DefineParserHandler","_CssParser$SlaveParse2","dim","PropSetParserHandler","_CssParser$SlaveParse3","_this35","_proto54","PropertyParserHandler","_CssParser$ErrorHandl","_this36","_proto55","forEachViewConditionalStyles","viewConditionalStyles","mergeViewConditionalStyles","cascMap","mergeStyle","cascaded","writingModeCasc","isRtl","directionCasc","flattenCascadedStyle","regionIds","isFootnote","forEachStylesInRegion","regionStyle","regions","footnoteRegion","_iterator12","_step12","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","_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","forceEnd","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","pp","_pp","isOutOfLine","checkIfFirstInBlock","isAfterForcedLineBreak","_p$viewNode","_prevNode$style","checkIfAfterForcedLineBreak","_elem$style","iFirst","_ref2","_ref3","_p$lang","_nodeContext$parent","_p$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","firstInInlineBlock","lastInInlineBlock","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","end","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","_this$nodeContext","verticalParent","verticalChanged","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","isPseudo","hasChildNodes","processShadowContent","contentNode","contentShadowType","contentShadow","nextPositionInTree","shadowNode","sr","isTransclusion","transclusionType","proc","addImageFetchers","bg","_this$nodeContext2","_this$sourceNode","_this$viewRoot","isRelativePositioned","_propList2","propertiesNotPassedToDOM","_this$nodeContext$par5","_this$nodeContext$par6","defaultLineHeightNum","parentStyle","parentLineHeight","lineHeightNum","_this$nodeContext$par7","_viewNode","_viewNode$style","ancestorLH","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","userAgent","webdriver","resetZoom","zoom","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","findTocElements","tocElems","tocElem","TOCView","rendererFactory","setAutoHeight","makeCustomRenderer","renderer","srcElem","viewParent","behavior","replaceChild","createComment","adaptParentClass","button","toggleNodeExpansion","tabIndex","showTOC","tocBoxUrl","viewportSize","OPS","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","Toc","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","encodingFormat","_manifestObj$readingO","_this12$items","readingOrderCount","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","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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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,QAC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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,GAAOgF,KACPhF,GAAOgF,KACPhF,GAA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CA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,EACA,IACA,EACA,IACA,EACA,IACA,EACA,IACA,EACA,IACA,EACA,IACA,EACA,IACA,EACA,IACA,EACA,KAEFC,SAAU,CACR,MACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,EACA,IACA,EACA,IACA,EACA,IACA,EACA,IACA,EACA,IACA,EACA,IACA,EACA,IACA,EACA,IACA,EACA,KAEFC,OAAQ,CACN,IACA,IACA,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,aAGEp/C,GAAQ,CACnBq/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,GAAGwmB,OAEpB,KAs1BYsc,GAp1BCC,gBAAOA,WAAAA,SAAAA,SAClBxO,QAAkB,EAClBD,KAAAA,SAAsC,CA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"}
\No newline at end of file