commit 1d9976f9ecb6d57b7f18e311413f47a9088efc89 Author: zhuhao <979263092@qq.com> Date: Fri Oct 25 14:38:32 2024 +0800 文枢AI2.5初始化 diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..3dce414 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true \ No newline at end of file diff --git a/.env.development b/.env.development new file mode 100644 index 0000000..f3b45f2 --- /dev/null +++ b/.env.development @@ -0,0 +1,19 @@ +# 页面标题 +VITE_APP_TITLE = AIx智慧教育 + +# 开发环境配置 +VITE_APP_ENV = 'development' + +# AIx融合数字管理系统/开发环境 +VITE_APP_BASE_API = '/dev-api' + +VITE_APP_DOMAIN = 'file.ysaix.com' + +VITE_APP_UPLOAD_API = 'https://file.ysaix.com:7868/prod-api' +#VITE_APP_UPLOAD_API = 'http://192.168.2.52:7863' + +VITE_APP_RES_FILE_PATH = 'https://file.ysaix.com:7868/src/assets/textbook/booktxt/' + +VITE_APP_BUILD_BASE_PATH = 'https://file.ysaix.com:7868/' + +VITE_SHOW_DEV_TOOLS = 'true' diff --git a/.env.production b/.env.production new file mode 100644 index 0000000..e103054 --- /dev/null +++ b/.env.production @@ -0,0 +1,21 @@ +# 页面标题 +VITE_APP_TITLE = 文枢课堂 + +# 生产环境配置 +VITE_APP_ENV = 'production' + +# AIx融合数字管理系统/生产环境 +VITE_APP_BASE_API = 'https://prev.ysaix.com:7868/prod-api' + +VITE_APP_DOMAIN = 'prev.ysaix.com' + +VITE_APP_UPLOAD_API = 'https://prev.ysaix.com:7868/prod-api' + +# 是否在打包时开启压缩,支持 gzip 和 brotli +VITE_BUILD_COMPRESS = gzip + +VITE_APP_RES_FILE_PATH = 'https://prev.ysaix.com:7868/src/assets/textbook/booktxt/' + +VITE_APP_BUILD_BASE_PATH = 'https://prev.ysaix.com:7868/' + +VITE_SHOW_DEV_TOOLS = 'false' diff --git a/.env.test b/.env.test new file mode 100644 index 0000000..3d671e1 --- /dev/null +++ b/.env.test @@ -0,0 +1,19 @@ +# 页面标题 +VITE_APP_TITLE = AIx数字平台(测试版) + +# 生产环境配置 +VITE_APP_ENV = 'production' + +# AIx融合数字管理系统/生产环境 +VITE_APP_BASE_API = 'https://file.ysaix.com:7868/prod-api' + +VITE_APP_DOMAIN = 'file.ysaix.com' + +VITE_APP_UPLOAD_API = 'https://file.ysaix.com:7868/prod-api' + +# 是否在打包时开启压缩,支持 gzip 和 brotli +VITE_BUILD_COMPRESS = gzip + +VITE_APP_RES_FILE_PATH = 'https://file.ysaix.com:7868/src/assets/textbook/booktxt/' + +VITE_APP_BUILD_BASE_PATH = 'https://file.ysaix.com:7868/' diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..a6f34fe --- /dev/null +++ b/.eslintignore @@ -0,0 +1,4 @@ +node_modules +dist +out +.gitignore diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 0000000..517a19c --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,16 @@ +/* eslint-env node */ +require('@rushstack/eslint-patch/modern-module-resolution') + +module.exports = { + extends: [ + 'eslint:recommended', + 'plugin:vue/vue3-recommended', + '@electron-toolkit', + '@vue/eslint-config-prettier' + ], + rules: { + 'vue/require-default-prop': 'off', + 'vue/multi-word-component-names': 'off', + 'prettier/prettier': 'off' + } +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2135be4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,31 @@ +node_modules +dist +out +.DS_Store +*.log* + +/node_modules/ +/.idea/ +/dist/ +/.idea/workspace.xml + +yarn.lock + +pnpm-lock.yaml + +node_modules +.vscode/* +!.vscode/extensions.json + +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +/.idea/deployment.xml +/.idea/encodings.xml +/.idea/misc.xml +/dist.zip +/package-lock.json +/pnpm-lock.json +/build +/out diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..34862ff --- /dev/null +++ b/.npmrc @@ -0,0 +1,2 @@ +electron_mirror=https://npmmirror.com/mirrors/electron/ +electron_builder_binaries_mirror=https://npmmirror.com/mirrors/electron-builder-binaries/ diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..9c6b791 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,6 @@ +out +dist +pnpm-lock.yaml +LICENSE.md +tsconfig.json +tsconfig.*.json diff --git a/.prettierrc.yaml b/.prettierrc.yaml new file mode 100644 index 0000000..35893b3 --- /dev/null +++ b/.prettierrc.yaml @@ -0,0 +1,4 @@ +singleQuote: true +semi: false +printWidth: 100 +trailingComma: none diff --git a/README.md b/README.md new file mode 100644 index 0000000..f453515 --- /dev/null +++ b/README.md @@ -0,0 +1,130 @@ +# electron-app + +- [Vue3](https://cn.vuejs.org) + [ElementPlus](https://element-plus.org/zh-CN/) + [electron-vite](https://cn-evite.netlify.app/) + [Electron](https://www.electronjs.org/zh/) + + + +### 安装 + +```bash +$ npm install +``` + +### 启动 + +```bash +$ npm run dev +``` + +### 打包 + +```bash +# For windows +$ npm run build:win + +# For macOS +$ npm run build:mac + +# For Linux +$ npm run build:linux +``` + +### 项目目录结构 + +```bash +├── build // 编译过程输出文件目录 +├── dist // 打包后输出目录 +├── node_modules // 依赖模块 +├── out //编译过程输出文件目录 +├── resources // 公共资源文件,主进程使用 +│ └── icon.png //默认图标 +├──src +│ ├── main // 主进程开发目录 +│ │ └── index.js //主进程入口文件 +│ ├── preload // 预加载脚本开发目录 +│ │ └── index.js // 预加载默认脚本 +│ └── renderer // 渲染进程开发目录,类似纯web项目根目录 +│ ├── src +│ │ ├── assets //资源文件目录 +│ │ ├── components //组件目录 +│ │ ├── App.vue // 入口页面 +│ │ └── main.js // 入口文件 +│ └── index.js.html // 默认html文件 +├── .editorconfig +├── .eslintignore //eslint代码检查忽略配置文件 +├── .eslintrc.cjs //eslint代码检查配置文件 +├── .gitignore //git忽略配置文件 +├── .npmrc // npm源配置文件 +├── .prettierignore //prettier代码格式化忽略配置文件 +├── .prettierrc.yaml //prettier代码格式化配置文件 +├── dev-app-update.yml +├── electron-builder.yml //打包配置文件 +├── electron.vite.config.mjs //electron-vite配置文件 +├── package-lock.json +├── package.json +└── README.md //项目说明 + +``` + + + +### electron-builder.yml配置说明 + +```json +appId: com.electron.test //appid 包名 +productName: 测试程序 //安装程序的名字 +directories: + buildResources: build +files: + - '!**/.vscode/*' + - '!src/*' + - '!electron.vite.config.{js,ts,mjs,cjs}' + - '!{.eslintignore,.eslintrc.cjs,.prettierignore,.prettierrc.yaml,dev-app-update.yml,CHANGELOG.md,README.md}' + - '!{.env,.env.*,.npmrc,pnpm-lock.yaml}' + - '!{tsconfig.json,tsconfig.node.json,tsconfig.web.json}' +asarUnpack: + - resources +win: + executableName: 测试程序 + icon: build/icon/favicon.ico //程序图标 +nsis: + oneClick: false //是否一键安装 + allowElevation: true //允许请求提升。若为false,则用户必须使用提升的权限重新启动安装程序。 + allowToChangeInstallationDirectory: true //是否允许修改安装目录 + createDesktopShortcut: true //卸载时图标 + createStartMenuShortcut: true // 是否创建开始菜单图标 + runAfterFinish: false //是否安装完成后运行 + include: ../build/script/installer.nsh //我这里放的是将应用程序默认安装在哪个路径 + artifactName: ${name}-${version}-setup.${ext} + uninstallDisplayName: ${productName} + installerIcon: ./build/icon.ico // 安装时图标 + uninstallerIcon: ./build/icon.ico +mac: + entitlementsInherit: build/entitlements.mac.plist + extendInfo: + - NSCameraUsageDescription: Application requests access to the device's camera. + - NSMicrophoneUsageDescription: Application requests access to the device's microphone. + - NSDocumentsFolderUsageDescription: Application requests access to the user's Documents folder. + - NSDownloadsFolderUsageDescription: Application requests access to the user's Downloads folder. + notarize: false +dmg: + artifactName: ${name}-${version}.${ext} +linux: + target: + - AppImage + - snap + - deb + maintainer: electronjs.org + category: Utility +appImage: + artifactName: ${name}-${version}.${ext} +npmRebuild: false +publish: + provider: generic + url: https://example.com/auto-updates //程序升级的验证地址 +electronDownload: + mirror: https://npmmirror.com/mirrors/electron/ +``` + + + diff --git a/dev-app-update.yml b/dev-app-update.yml new file mode 100644 index 0000000..0083a29 --- /dev/null +++ b/dev-app-update.yml @@ -0,0 +1,3 @@ +provider: generic +url: http://localhost:3000/ +updaterCacheDirName: electron-app-updater diff --git a/electron-builder-prod.yml b/electron-builder-prod.yml new file mode 100644 index 0000000..f8e0b9a --- /dev/null +++ b/electron-builder-prod.yml @@ -0,0 +1,54 @@ +appId: com.electron.app +productName: 文枢课堂 +directories: + output: dist + buildResources: build +win: + executableName: 文枢课堂 + icon: resources/logo2.ico +files: + - '!**/.vscode/*' + - '!src/*' + - '!electron.vite.config.{js,ts,mjs,cjs}' + - '!{.eslintignore,.eslintrc.cjs,.prettierignore,.prettierrc.yaml,dev-app-update.yml,CHANGELOG.md,README.md}' + - '!{.env,.env.*,.npmrc,pnpm-lock.yaml}' +asarUnpack: + - resources/** +nsis: + oneClick: false + allowToChangeInstallationDirectory: true + artifactName: ${name}-${version}-setup.${ext} + shortcutName: ${productName} + uninstallDisplayName: ${productName} + createDesktopShortcut: always +mac: + entitlementsInherit: build/entitlements.mac.plist + extendInfo: + - NSCameraUsageDescription: Application requests access to the device's camera. + - NSMicrophoneUsageDescription: Application requests access to the device's microphone. + - NSDocumentsFolderUsageDescription: Application requests access to the user's Documents folder. + - NSDownloadsFolderUsageDescription: Application requests access to the user's Downloads folder. + notarize: false +dmg: + artifactName: ${name}-${version}.${ext} +linux: + target: + - AppImage + - snap + - deb + maintainer: electronjs.org + category: Utility +appImage: + artifactName: ${name}-${version}.${ext} +npmRebuild: false +publish: + provider: generic + url: https://prev.ysaix.com:7868/src/assets/smarttalk/ +electronDownload: + mirror: https://npmmirror.com/mirrors/electron/ +# 额外依赖打包到输出目录 +extraFiles: + - from: ./node_modules/im_electron_sdk/lib/ + to: ./resources + filter: + - '**/*' diff --git a/electron-builder-test.yml b/electron-builder-test.yml new file mode 100644 index 0000000..6159547 --- /dev/null +++ b/electron-builder-test.yml @@ -0,0 +1,53 @@ +appId: com.electron.app +productName: AIx +directories: + buildResources: build +files: + - '!**/.vscode/*' + - '!src/*' + - '!electron.vite.config.{js,ts,mjs,cjs}' + - '!{.eslintignore,.eslintrc.cjs,.prettierignore,.prettierrc.yaml,dev-app-update.yml,CHANGELOG.md,README.md}' + - '!{.env,.env.*,.npmrc,pnpm-lock.yaml}' +asarUnpack: + - resources/** +win: + executableName: AIx + icon: resources/logo2.ico +nsis: + oneClick: false + allowToChangeInstallationDirectory: true + artifactName: ${name}-${version}-setup.${ext} + shortcutName: ${productName} + uninstallDisplayName: ${productName} + createDesktopShortcut: always +mac: + entitlementsInherit: build/entitlements.mac.plist + extendInfo: + - NSCameraUsageDescription: Application requests access to the device's camera. + - NSMicrophoneUsageDescription: Application requests access to the device's microphone. + - NSDocumentsFolderUsageDescription: Application requests access to the user's Documents folder. + - NSDownloadsFolderUsageDescription: Application requests access to the user's Downloads folder. + notarize: false +dmg: + artifactName: ${name}-${version}.${ext} +linux: + target: + - AppImage + - snap + - deb + maintainer: electronjs.org + category: Utility +appImage: + artifactName: ${name}-${version}.${ext} +npmRebuild: false +publish: + provider: generic + url: http://localhost:3000 +electronDownload: + mirror: https://npmmirror.com/mirrors/electron/ +# 额外依赖打包到输出目录 +extraFiles: + - from: ./node_modules/im_electron_sdk/lib/ + to: ./resources + filter: + - '**/*' diff --git a/electron-builder.yml b/electron-builder.yml new file mode 100644 index 0000000..4b26cd1 --- /dev/null +++ b/electron-builder.yml @@ -0,0 +1,53 @@ +appId: com.electron.app +productName: AIx +directories: + buildResources: build +files: + - '!**/.vscode/*' + - '!src/*' + - '!electron.vite.config.{js,ts,mjs,cjs}' + - '!{.eslintignore,.eslintrc.cjs,.prettierignore,.prettierrc.yaml,dev-app-update.yml,CHANGELOG.md,README.md}' + - '!{.env,.env.*,.npmrc,pnpm-lock.yaml}' +asarUnpack: + - resources/** +win: + executableName: AIx + icon: resources/logo2.ico +nsis: + oneClick: false + allowToChangeInstallationDirectory: true + artifactName: ${name}-${version}-test.${ext} + shortcutName: ${productName} + uninstallDisplayName: ${productName} + createDesktopShortcut: always +mac: + entitlementsInherit: build/entitlements.mac.plist + extendInfo: + - NSCameraUsageDescription: Application requests access to the device's camera. + - NSMicrophoneUsageDescription: Application requests access to the device's microphone. + - NSDocumentsFolderUsageDescription: Application requests access to the user's Documents folder. + - NSDownloadsFolderUsageDescription: Application requests access to the user's Downloads folder. + notarize: false +dmg: + artifactName: ${name}-${version}.${ext} +linux: + target: + - AppImage + - snap + - deb + maintainer: electronjs.org + category: Utility +appImage: + artifactName: ${name}-${version}.${ext} +npmRebuild: false +publish: + provider: generic + url: https://file.ysaix.com:7868/src/assets/smarttalk/ +electronDownload: + mirror: https://npmmirror.com/mirrors/electron/ +# 额外依赖打包到输出目录 +extraFiles: + - from: ./node_modules/im_electron_sdk/lib/ + to: ./resources + filter: + - '**/*' diff --git a/electron.vite.config.mjs b/electron.vite.config.mjs new file mode 100644 index 0000000..8e66b38 --- /dev/null +++ b/electron.vite.config.mjs @@ -0,0 +1,56 @@ +import { resolve } from 'path' +import path from 'path' +import { defineConfig, externalizeDepsPlugin } from 'electron-vite' +import vue from '@vitejs/plugin-vue' +import WindiCSS from "vite-plugin-windicss" +/*import electron from 'vite-plugin-electron' +plugins: [electron({ + main: { + builderOptions: { + asar: false + } + } +})],*/ +export default defineConfig({ + main: { + plugins: [externalizeDepsPlugin()] + }, + preload: { + plugins: [externalizeDepsPlugin()] + }, + renderer: { + resolve: { + alias: { + // '@': resolve('./src/renderer/src'), + // '@': path.resolve(__dirname, 'src/renderer/src'), + '@': path.join(__dirname, './src/renderer/src'), + '@root': path.join(__dirname, '.'), + + } + }, + server: { + proxy: { + '/dev-api': { + target: 'http://27.128.240.72:7865', + // target: 'http://36.134.181.164:7863', + // target: 'http://192.168.2.52:7863', + changeOrigin: true, + rewrite: (p) => p.replace(/^\/dev-api/, '') + }, + '/baidubce': { + target: 'https://aip.baidubce.com', + ws: true, + changeOrigin: true, + rewrite: (p) => p.replace(/^\/baidubce/, '') + }, + '/parth': { + target: 'https://zwapi.xfyun.cn', // 第三方API的地址 + changeOrigin: true, // 改变请求的起源 + rewrite: (path) => path.replace(/^\/parth/, '') // 重写路径 + }, + }, + }, + plugins: [vue(), WindiCSS()], + assetsInclude:('**/*.woff', '**/*.woff2', '**/*.ttf'), + } +}) diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 0000000..f611e59 --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "baseUrl": "./", + "paths": { + "@/*":[ + "src/renderer/src/*" + ], + "@root/*":["./*"] + } + }, + "exclude": [ + "node_modeules", + "dist" + ] +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..ecf3b97 --- /dev/null +++ b/package.json @@ -0,0 +1,89 @@ +{ + "name": "aix-win", + "version": "2.5.0", + "description": "", + "main": "./out/main/index.js", + "author": "上海交大重庆人工智能研究院", + "homepage": "https://electron-vite.org", + "scripts": { + "format": "prettier --write .", + "lint": "eslint . --ext .js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix", + "start": "electron-vite preview", + "dev": "electron-vite dev", + "build": "electron-vite build", + "postinstall": "electron-builder install-app-deps", + "build:unpack": "npm run build && electron-builder --dir", + "build:dev": "npm run build && electron-builder --win --config ./electron-builder-test.yml", + "build:test": "electron-vite build --mode test && electron-builder --win --config ./electron-builder.yml", + "build:prod": "electron-vite build --mode production && electron-builder --win --config ./electron-builder-prod.yml", + "build:lt": "electron-vite build --mode lt && electron-builder --win --config ./electron-builder-lt.yml", + "build:mac": "electron-vite build --mode production && electron-builder --mac --config ./electron-builder-prod.yml", + "build:linux": "npm run build && electron-builder --linux" + }, + "dependencies": { + "@electron-toolkit/preload": "^3.0.1", + "@electron-toolkit/utils": "^3.0.0", + "@electron/remote": "^2.1.2", + "@element-plus/icons-vue": "^2.3.1", + "@vitejs/plugin-vue-jsx": "^4.0.0", + "@antv/x6": "^2.18.1", + "@antv/x6-plugin-clipboard": "^2.1.6", + "@antv/x6-plugin-dnd": "^2.1.1", + "@antv/x6-plugin-export": "^2.1.6", + "@antv/x6-plugin-keyboard": "^2.2.3", + "@antv/x6-plugin-selection": "^2.2.2", + "@antv/x6-plugin-snapline": "^2.1.7", + "@antv/x6-plugin-transform": "^2.1.8", + "@vue-office/docx": "^1.6.2", + "@vue-office/excel": "^1.7.11", + "@vue-office/pdf": "^2.0.2", + "@vueuse/core": "^10.11.0", + "circular-json": "^0.5.9", + "cropperjs": "^1.6.2", + "crypto-js": "^4.2.0", + "echarts": "^5.5.1", + "electron-dl-manager": "^3.0.0", + "electron-log": "^5.1.7", + "electron-store": "8.0.0", + "electron-updater": "^6.1.7", + "element-china-area-data": "^6.1.0", + "element-plus": "^2.8.0", + "fabric": "^5.3.0", + "im_electron_sdk": "^8.0.5904", + "js-cookie": "^3.0.5", + "jsencrypt": "^3.3.2", + "jsondiffpatch": "0.6.0", + "lodash": "^4.17.21", + "node-addon-api": "^8.1.0", + "pdfjs-dist": "4.4.168", + "pinia": "^2.1.7", + "pinia-plugin-persistedstate": "^3.2.1", + "spark-md5": "^3.0.2", + "vite-plugin-electron": "^0.28.8", + "vue-qr": "^4.0.9", + "vue-router": "^4.4.0", + "xgplayer": "^3.0.19", + "xlsx": "^0.18.5", + "less": "^4.2.0", + "less-loader": "^7.3.0", + "whiteboard_lyc": "^0.1.3" + }, + "devDependencies": { + "@electron-toolkit/eslint-config": "^1.0.2", + "@rushstack/eslint-patch": "^1.10.3", + "@vitejs/plugin-vue": "^5.0.5", + "@vue/eslint-config-prettier": "^9.0.0", + "axios": "^1.7.2", + "electron": "^31.0.2", + "electron-builder": "^24.13.3", + "electron-vite": "^2.3.0", + "eslint": "^8.57.0", + "eslint-plugin-vue": "^9.26.0", + "prettier": "^3.3.2", + "sass": "^1.77.6", + "vite": "^5.3.1", + "vite-plugin-windicss": "^1.9.3", + "vue": "^3.4.30", + "windicss": "^3.5.6" + } +} diff --git a/resources/icon.png b/resources/icon.png new file mode 100644 index 0000000..cf9e8b2 Binary files /dev/null and b/resources/icon.png differ diff --git a/resources/logo.ico b/resources/logo.ico new file mode 100644 index 0000000..5802771 Binary files /dev/null and b/resources/logo.ico differ diff --git a/resources/logo.png b/resources/logo.png new file mode 100644 index 0000000..45f6e65 Binary files /dev/null and b/resources/logo.png differ diff --git a/resources/logo2.ico b/resources/logo2.ico new file mode 100644 index 0000000..e3239fc Binary files /dev/null and b/resources/logo2.ico differ diff --git a/resources/logo3.ico b/resources/logo3.ico new file mode 100644 index 0000000..6bf1e56 Binary files /dev/null and b/resources/logo3.ico differ diff --git a/src/main/chat.js b/src/main/chat.js new file mode 100644 index 0000000..b6700f2 --- /dev/null +++ b/src/main/chat.js @@ -0,0 +1,20 @@ +/** + * @description 腾讯云-即时通讯-sdkID + */ +// import { ipcMain } from 'electron' +// const TimMain = require('im_electron_sdk/dist/main') +import TimMain from 'im_electron_sdk/dist/main' +// import {TIMErrCode} from 'im_electron_sdk/dist/enumbers' +const sdkappidDef = 1600034736 // 可以去腾讯云即时通信IM控制台申请 + +// 初始化 +function init(sdkappid = sdkappidDef) { + return new TimMain({sdkappid}) +} +export function initialize(){ + // ipcMain.handle('im-chat:init', (event, sdkappid) => { + // return init(sdkappid) + // }) + return init() +} +export default { initialize, init } diff --git a/src/main/file.js b/src/main/file.js new file mode 100644 index 0000000..3de3333 --- /dev/null +++ b/src/main/file.js @@ -0,0 +1,528 @@ +import SparkMD5 from 'spark-md5' +const fs = require('fs') +const path = require('path') +import { ElectronDownloadManager } from 'electron-dl-manager' +import { dialog } from 'electron' +import axios from 'axios' +const uploadUrl = import.meta.env.VITE_APP_UPLOAD_API + '/smarttalk/file/upload' +const asyncUploadUrl = import.meta.env.VITE_APP_UPLOAD_API + '/smarttalk/file/asyncUpload' +const manager = new ElectronDownloadManager() +export default async function ({ app, shell, BrowserWindow, ipcMain }) { + const userDataPath = app.getPath('userData') + const appRootFilePath = userDataPath + '\\selfFile\\' + const appTempFilePath = userDataPath + '\\tempFile\\' + let Spark = new SparkMD5.ArrayBuffer() + + ipcMain.on('upload-file-change', (e, { id, fileNewName, cookie, fileType }) => { + let filePath = appRootFilePath + fileNewName + //执行更新,上传文件 + let formData = new FormData() + formData.append('id', id) + uploadFileByFS({ + url: asyncUploadUrl, + path: filePath, + name: fileNewName, + cookie, + fileType, + formData, + success: (response) => { + e.reply('upload-file-change-success' + fileNewName, { + data: response.data, + md5: formData.md5 + }) + }, + error: (err) => { + console.error('Error uploading file:', err) + } + }) + }) + + /*监听文件改变,如果有改变则返回触发*/ + ipcMain.on('listen-file-change', (e, { id, fileNewName, md5, cookie, fileType }) => { + let filePath = appRootFilePath + fileNewName + let uploadId = null + let isOn = false + let lastMTime = fs.statSync(filePath).mtime.getTime() + console.log(lastMTime) + setInterval(() => { + getFileMsg(filePath).then((msg) => { + if (msg !== lastMTime) { + lastMTime = msg + if (uploadId) { + clearTimeout(uploadId) + } + if (isOn === false) { + console.log(fileNewName) + e.reply('listen-file-change-on' + fileNewName) + isOn = true + } + //倒数十秒提交更改,十秒之内有继续修改则重置倒数 + uploadId = setTimeout(() => { + console.log(223) + //执行更新,上传文件 + let formData = new FormData() + formData.append('id', id) + uploadFileByFS({ + url: asyncUploadUrl, + path: filePath, + name: fileNewName, + cookie, + fileType, + formData, + success: (response) => { + e.reply('listen-file-change-success' + fileNewName, { + data: response.data, + md5: formData.md5 + }) + clearTimeout(uploadId) + isOn = false + }, + error: (err) => { + console.error('Error uploading file:', err) + } + }) + }, 5000) + } + }) + }, 1000) + }) + + function getFileMsg(path) { + return new Promise((resolve, reject) => { + const stats = fs.statSync(path) + return resolve(stats.mtime.getTime()) + }) + } + + function getFileMD5(path) { + return new Promise((resolve, reject) => { + fs.readFile(path, (err, dataFile) => { + if (err) { + reject(err) + return console.error(err) + } + Spark.append(dataFile) + let md5 = Spark.end() + resolve(md5) + }) + }) + } + + /* + * 判断是否有本地文件 + * */ + ipcMain.on('is-have-local-file', (e, fileNewName) => { + let filePath = appRootFilePath + fileNewName + fs.access(filePath, fs.constants.F_OK, (err) => { + if (err) { + e.reply('is-have-local-file-reply' + fileNewName, false) + return + } + e.reply('is-have-local-file-reply' + fileNewName, true) + }) + }) + + /* + * 判断是需要同步本地文件 + * */ + ipcMain.on('is-async-local-file', (e, { fileNewName, lastModifyTime, md5 }) => { + let filePath = appRootFilePath + fileNewName + fs.access(filePath, fs.constants.F_OK, (err) => { + if (err) { + e.reply('is-async-local-file-reply' + fileNewName, { isAsync: true, type: 'down' }) + return + } + getFileMsg(filePath).then((msg) => { + let time = new Date(lastModifyTime).getTime(); + msg = parseInt(msg/1000)*1000; + if (msg == time) { + e.reply('is-async-local-file-reply' + fileNewName, { isAsync: false, type: '' }) + } else { + const stats = fs.statSync(filePath) + //如果线上时间大于线下时间,就需要从线上下载,否则则需要上传 + if (time > stats.mtime.getTime()) { + e.reply('is-async-local-file-reply' + fileNewName, { isAsync: true, type: 'down' }) + } else if (time < stats.mtime.getTime()) { + e.reply('is-async-local-file-reply' + fileNewName, { isAsync: true, type: 'upload' }) + } + } + }) + }) + }) + + //默认浏览器打开url + ipcMain.on('open-url-browser', (e, url) => { + shell.openPath(url) + }) + + //使用默认应用打开本地文件 + ipcMain.on('open-path-app', (e, destination) => { + let path = appRootFilePath + destination + shell.openPath(path).catch((error) => { + console.log(error) + }) + }) + + //复制文件 + ipcMain.on('copy-file-default', (e, { source, destination }) => { + copyFile(source, destination, (error, filePath) => { + e.reply('copy-file-default-reply', { error, filePath }) + }) + }) + + //导出文件 + ipcMain.on('export-file-default', (e, list) => { + exportFile(list, (res) => { + e.reply('export-file-default-reply', res) + }) + }) + + function uploadFileByFS({ url, path, name, cookie, fileType, formData, success, error }) { + fs.readFile(path, (err, data) => { + if (err) { + return console.error(err) + } + // 配置上传的请求 + const config = { + headers: { + 'Content-Type': 'multipart/form-data', // 或者其他适合上传文件的Content-Type + Authorization: 'Bearer ' + cookie + } + } + Spark.append(data) + let md5 = Spark.end() + // 使用axios上传文件 + let file = new File([data], name, { + type: fileType + }) + const stats = fs.statSync(path) + formData.append('file', file) + formData.append('md5', md5) + formData.append('lastModifyTime', stats.mtime.toLocaleString()) + axios + .post(url, formData, config) + .then((response) => { + success(response) + }) + .catch((errorMsg) => { + error(errorMsg) + }) + }) + } + + /*创建新的ppt文件*/ + ipcMain.on('creat-file-default', (e, { name, uploadData, cookie }) => { + createFolder('tempFile').then(() => { + let path = appTempFilePath + name.replace(/[\\/:*?"<>|]/, '') + console.log(path) + fs.writeFileSync(path, '', 'utf-8') + let fileType = 'application/vnd.openxmlformats-officedocument.presentationml.presentation' + let formData = new FormData() + for (let key in uploadData) { + if (Object.prototype.hasOwnProperty.call(uploadData, key)) { + // 检查是否是对象自身的属性 + formData.append(key, uploadData[key]) + } + } + formData.append('fileFlag', '课件') + uploadFileByFS({ + url: uploadUrl, + path, + name, + cookie, + fileType, + formData, + success: (response) => { + e.reply('creat-file-default-reply', response.data) + console.log('File uploaded successfully:', response.data) + }, + error: (err) => { + console.error('Error uploading file:', err) + } + }) + }) + }) + + /*创建新的ppt文件*/ + ipcMain.on('creat-ai-file-default', (e, { name, url, uploadData, cookie }) => { + createFolder('tempFile').then(async () => { + let lastname = decodeURIComponent(url); + name = lastname.substring(lastname.lastIndexOf("/")+1) + let path = appTempFilePath + name.replace(/[\\/:*?"<>|]/, '') + let {type,item} = await downloadFiles(url,name) + if (type==="成功") { + let fileType = 'application/vnd.openxmlformats-officedocument.presentationml.presentation' + let formData = new FormData() + for (let key in uploadData) { + if (Object.prototype.hasOwnProperty.call(uploadData, key)) { + // 检查是否是对象自身的属性 + formData.append(key, uploadData[key]) + } + } + formData.append('fileFlag', '课件') + uploadFileByFS({ + url: uploadUrl, + path, + name, + cookie, + fileType, + formData, + success: (response) => { + e.reply('creat-ai-file-default-reply', response.data) + console.log('File uploaded successfully:', response.data) + }, + error: (err) => { + console.error('Error uploading file:', err) + } + }) + }else { + e.reply('creat-ai-file-default-reply', type) + } + }) + }) + + function downloadFiles(url,fileName) { + console.log(url,fileName) + return new Promise((resolve, reject)=>{ + const browserWindow = BrowserWindow.getFocusedWindow() + const id = manager.download({ + window: browserWindow, + url: url, + saveAsFilename: fileName, + directory: appTempFilePath, + callbacks: { + onDownloadStarted: async ({ id, item, webContents }) => { + // Do something with the download id + }, + onDownloadProgress: async ({ id, item, percentCompleted }) => { + // console.log(percentCompleted) + }, + onDownloadCompleted: async ({ id, item }) => { + console.log('完成') + resolve({type:"成功",item}) + }, + onDownloadCancelled: async () => { + console.log("取消") + reject({type:"取消了下载"}) + }, + onDownloadInterrupted: async () => { + console.log('中断') + reject({type:"下载被中断"}) + }, + onError: (err, data) => { + console.log(err.toString()) + reject({type:"下载出错",err}) + } + } + }) + }) + } + + //获取应用文件目录 + ipcMain.on('get-root-file-path', (e) => { + e.reply('get-root-file-path-reply', appRootFilePath) + }) + + //下载文件 + ipcMain.on('download-file-default', (e, { url, fileName }) => { + createFolder('selfFile') + .then(async () => { + const browserWindow = BrowserWindow.getFocusedWindow() + const id = await manager.download({ + window: browserWindow, + url: url, + saveAsFilename: fileName, + directory: appRootFilePath, + callbacks: { + onDownloadStarted: async ({ id, item, webContents }) => { + // Do something with the download id + }, + onDownloadProgress: async ({ id, item, percentCompleted }) => { + e.reply('download-file-default-prog' + fileName, percentCompleted) + }, + onDownloadCompleted: async ({ id, item }) => { + console.log('完成') + e.reply('download-file-default' + fileName, true) + }, + onDownloadCancelled: async () => { + console.log('取消') + e.reply('download-file-default' + fileName, false) + }, + onDownloadInterrupted: async () => { + console.log('中断') + e.reply('download-file-default' + fileName, false) + }, + onError: (err, data) => { + console.log(err.toString()) + e.reply('download-file-default' + fileName, false) + } + } + }) + }) + .catch((error) => { + e.reply('download-file-default' + fileName, false) + }) + }) + + /**另存为... + * 接收渲染进程 保存文件的 的通知 + * @param {Object} event + * @param {String} url 下载链接 + * @param {String} fileName 文件名称包括后缀名,例如图1.png + */ + ipcMain.on('save-as', function (event, url, fileName) { + let win = BrowserWindow.getFocusedWindow() + //通过扩展名识别文件类型 + let filters = [{ name: '全部文件', extensions: ['*'] }] + let ext = path.extname(fileName) //获取扩展名 + if (ext && ext !== '.') { + const name = ext.slice(1, ext.length) + if (name) { + filters.unshift({ + name: '', + extensions: [name] + }) + } + } + let filePath = null //用户选择存放文件的路径 + + //1- 弹出另存为弹框,用于获取保存路径 + dialog + .showSaveDialog(win, { + title: '另存为', + filters, + defaultPath: fileName + }) + .then((result) => { + //点击保存后开始下载 + filePath = result.filePath + if (filePath) { + win.webContents.downloadURL(url) // 触发will-download事件 + } + }) + .catch(() => { + console.log('另存为--catch') + }) + + //2- 准备下载的时候触发 + win.webContents.session.once('will-download', (event, item, webContents) => { + if (!filePath) return + //设置下载项的保存文件路径 + item.setSavePath(filePath) + }) + }) + + /*导出文件*/ + function exportFile(list, callback) { + let win = BrowserWindow.getFocusedWindow() + //通过扩展名识别文件类型 + let filePath = null //用户选择存放文件的路径 + //1- 弹出另存为弹框,用于获取保存路径 + dialog + .showOpenDialog(win, { + properties: ['openDirectory'] + }) + .then(async (result) => { + if (result.filePaths[0]) { + filePath = result.filePaths[0] + let res = [] + for (let i = 0; i < list.length; i++) { + let item = list[i] + let source = appRootFilePath + item.id + let destination = filePath + '/' + item.name + await copyRelFile(source, filterCopyFile(destination), (error, path) => { + res.push({ error, path }) + }) + } + callback(res) + } + }) + .catch(() => { + console.log('另存为--catch') + }) + } + + /*文件是否已经存在*/ + function isHaveFile(path) { + return fs.existsSync(path) + } + + /*判断是否已经存在这个名字的文件,如果已经存在则递增导出*/ + function filterCopyFile(path, index = 0) { + if (isHaveFile(path) === true) { + index++ + path = path.replaceAll('.', `(${index}).`) + return filterCopyFile(path, index) + } else { + return path + } + } + + /*复制文件*/ + function copyRelFile(source, destination, callback) { + return new Promise((resolve, reject) => { + const readStream = fs.createReadStream(source) + const writeStream = fs.createWriteStream(destination) + + readStream.on('error', (error) => { + reject() + callback(error, null) + }) + writeStream.on('error', (error) => { + reject() + callback(error, null) + }) + writeStream.on('close', () => { + console.log('关闭写入流') + callback(null, destination) + resolve() + }) + readStream.pipe(writeStream) + }) + } + + /*复制文件*/ + function copyFile(source, destination, callback) { + let path = appRootFilePath + destination + createFolder('selfFile').then(() => { + const readStream = fs.createReadStream(source) + const writeStream = fs.createWriteStream(path) + + readStream.on('error', (error) => { + callback(error, null) + }) + writeStream.on('error', (error) => { + callback(error, null) + }) + writeStream.on('close', () => { + callback(null, path) + }) + + readStream.pipe(writeStream) + }) + } + + /*创建文件夹*/ + function createFolder(folderName) { + return new Promise((resolve, reject) => { + const folderPath = path.join(userDataPath, folderName) + // 异步检查文件夹是否存在,不存在则创建 + fs.access(folderPath, fs.constants.F_OK, (err) => { + if (err) { + fs.mkdir(folderPath, { recursive: true }, (mkdirErr) => { + if (mkdirErr) { + console.error(mkdirErr) + reject() + } else { + console.log(`Folder ${folderName} created successfully.`) + resolve() + } + }) + } else { + console.log(`Folder ${folderName} already exists.`) + resolve() + } + }) + }) + } +} diff --git a/src/main/index.js b/src/main/index.js new file mode 100644 index 0000000..f874b6b --- /dev/null +++ b/src/main/index.js @@ -0,0 +1,330 @@ +import { app, shell, BrowserWindow, ipcMain, session, BrowserView } from 'electron' +import { join } from 'path' +import { electronApp, optimizer, is } from '@electron-toolkit/utils' +import icon from '../../resources/icon.png?asset' +import File from './file' +import Logger from './logger' // 日志封装 +import chat from './chat' // chat封装 +import Store from './store' // Store封装 +import updateInit from './update' +// 代理 electron/remote +// 第一步:引入remote +import remote from '@electron/remote/main' +// 第二步: 初始化remote +remote.initialize() +// 日志配置-初始化(日志直接绑定到console上) +if(!is.dev) Logger.initialize() +// 持久化数据-初始化 +Store.initialize() + +File({ app, shell, BrowserWindow, ipcMain }) +process.env['ELECTRON_DISABLE_SECURITY_WARNINGS'] = 'true' +let mainWindow, loginWindow + +const additionalData = {myKey:'ys_axi_smarttalk'} +const gotTheLock = app.requestSingleInstanceLock(additionalData) + +if(!gotTheLock){ + app.quit() +}else{ + app.on('second-instance',(event,commandLine,workingDirectory,additionalData)=>{ + //输入从第二个实例中接收到的数据 + console.log(additionalData) + //有人试图运行第二个实例,我们应该关注我们的窗口 + if(mainWindow){ + if(mainWindow.isMinimized()) mainWindow.restore() + mainWindow.focus() + } + if(loginWindow){ + if(loginWindow.isMinimized()) loginWindow.restore() + loginWindow.focus() + } + }) +} + +//登录窗口 +function createLoginWindow() { + if (loginWindow) return + loginWindow = new BrowserWindow({ + width: 888, + height: 520, + show: false, + frame: false, + autoHideMenuBar: true, + maximizable: false, + resizable: false, + icon: join(__dirname, '../../resources/logo2.ico'), + ...(process.platform === 'linux' ? { icon } : {}), + webPreferences: { + defaultEncoding: 'utf-8', + preload: join(__dirname, '../preload/index.js'), + sandbox: false, + nodeIntegration: true, + contextIsolation: false // 沙箱取消 + } + }) + loginWindow.type = 'login' // 唯一标识 + // handleUpdate(loginWindow,ipcMain) + // const loginURL = is.dev ? `http://localhost:5173/#/login` : `file://${__dirname}/index.html/#/login` + // loginWindow.loadURL(loginURL) + if (is.dev && process.env['ELECTRON_RENDERER_URL']) { + loginWindow.loadURL('http://localhost:5173/#/login') + } else { + loginWindow.loadFile(join(__dirname, '../renderer/index.html'), { hash: 'login' }) + updateInit(loginWindow) + } + if (import.meta.env.VITE_SHOW_DEV_TOOLS === 'true') loginWindow.webContents.openDevTools() + loginWindow.once('ready-to-show', () => { + loginWindow.show() + }) + + loginWindow.on('closed', () => { + loginWindow = null + }) + + remote.enable(loginWindow.webContents) +} +//主窗口 +function createMainWindow() { + mainWindow = new BrowserWindow({ + width: 1350, + minWidth: 1200, + height: 700, + minHeight: 700, + show: false, + frame: false, // 无边框 + autoHideMenuBar: true, + maximizable: false, + icon: join(__dirname, '../../resources/logo2.ico'), + ...(process.platform === 'linux' ? { icon } : {}), + webPreferences: { + defaultEncoding: 'utf-8', + preload: join(__dirname, '../preload/index.js'), + sandbox: false, + // nodeIntegration: true, + nodeIntegration: true, // nodeApi调用 + contextIsolation: false // 沙箱取消 + // webSecurity: false // 跨域关闭 + } + }) + mainWindow.type = 'main' // 唯一标识 + mainWindow.on('ready-to-show', () => { + mainWindow.show() + }) + mainWindow.on('closed', () => { + setTimeout(() => { + // 延迟销毁 + mainWindow = null + }, 1000) + // app.quit() // 主窗口关闭-结束所有进程 + }) + mainWindow.on('resize', () => { + const { width, height } = mainWindow.getBounds(); + mainWindow.webContents.send('minWinResize', { width, height }); + }); + + mainWindow.webContents.setWindowOpenHandler((details) => { + shell.openExternal(details.url) + return { action: 'deny' } + }) + if (import.meta.env.VITE_SHOW_DEV_TOOLS === 'true') mainWindow.webContents.openDevTools() + + if (is.dev && process.env['ELECTRON_RENDERER_URL']) { + mainWindow.loadURL(process.env['ELECTRON_RENDERER_URL']) + } else { + mainWindow.loadFile(join(__dirname, '../renderer/index.html')) + } + + // mainWindow.setAlwaysOnTop(true, "screen-saver") // 将窗口设置为顶层窗口 + // mainWindow.setVisibleOnAllWorkspaces(true) // 如果窗口在所有工作区都可见 + mainWindow.maximize(); + // 第三步: 开启remote服务 + remote.enable(mainWindow.webContents) +} + +// 打开外部链接窗口 +let linkWin = {} +async function createLinkWin(data) { + if (linkWin[data.key]) return + + linkWin[data.key] = new BrowserWindow({ + show: false, + frame: true, + maximizable: true, + autoHideMenuBar: true, + ...(process.platform === 'linux' ? { icon } : {}), + webPreferences: { + defaultEncoding: 'utf-8', + sandbox: false, + nodeIntegration: true, + worldSafeExecuteJavaScript: true, + contextIsolation: true + } + }) + linkWin[data.key].type = 'link'+data.key // 唯一标识 + + let cookieDetails = { ...data.cookieData } + await linkWin[data.key].webContents.session.cookies + .set(cookieDetails) + .then(() => {}) + .catch((error) => {}) + data.fullPath = data.fullPath.replaceAll('//', '/') + if (data.fullPath.indexOf('?') !== -1) { + data.fullPath += '&urlSource=smarttalk&t' + Date.now() + }else { + data.fullPath += '?urlSource=smarttalk&t' + Date.now() + } + linkWin[data.key].loadURL(data.fullPath) + + linkWin[data.key].once('ready-to-show', () => { + linkWin[data.key].show() + linkWin[data.key].maximize() + }) + linkWin[data.key].on('closed', () => { + linkWin[data.key] = null + delete linkWin[data.key] + }) +} + +// 初始化完成 +app.on('ready', () => { + appWatchError() // 监听app错误 + process.env.LANG = 'en_US.UTF-8' + // 设置应用程序用户模型标识符 + electronApp.setAppUserModelId('com.electron') + + //一个新的browserWindow 被创建时触发 + app.on('browser-window-created', (_, window) => { + optimizer.watchWindowShortcuts(window) + }) + + //窗口 最大、最小、关闭 + ipcMain.on('minimize-window', () => { + if (loginWindow) { + loginWindow.minimize() + } + if (mainWindow) { + mainWindow.minimize() + } + }) + + ipcMain.on('maximize-window', () => { + mainWindow.isMaximized() ? mainWindow.unmaximize() : mainWindow.maximize() + }) + + ipcMain.on('close-window', () => { + if (loginWindow) { + loginWindow.destroy() + } + if (mainWindow) { + mainWindow.close() // 先发出这个关闭指令 + setTimeout(() => { + // + mainWindow.destroy() + }, 200) + } + }) + + // 打开主窗口 + ipcMain.on('openMainWindow', () => { + if (!mainWindow) { + createMainWindow() + } + loginWindow.destroy() + loginWindow = null + }) + // 打开登录窗口 + ipcMain.on('openLoginWindow', () => { + if (!loginWindow) { + createLoginWindow() + } + mainWindow.destroy() + mainWindow = null + loginWindow.show() + loginWindow.focus() + }) + + //打开作业窗口 + ipcMain.on('openWindow', (e, data) => { + createLinkWin(data) + }) + // zdg: 消息监听 + handleAll() + // 打开-登录窗口 + createLoginWindow() + + app.on('activate', function () { + if (BrowserWindow.getAllWindows().length === 0) createLoginWindow() + }) +}) + +// Quit when all windows are closed, except on macOS. There, it's common +// for applications and their menu bar to stay active until the user quits +// explicitly with Cmd + Q. +app.on('window-all-closed', () => { + if (process.platform !== 'darwin') { + app.quit() + } +}) + +// 监听全局事件 +function handleAll() { + const chatInstance = chat.initialize() // im-chat 实例 + // 新窗口创建-监听 + ipcMain.handle('new-window', (e, data) => { + const { id, type } = data + const win = BrowserWindow.fromId(id) + win.type = type // 绑定独立标识 + remote.enable(win.webContents) // 开启远程服务 + chatInstance.enable(win.webContents) // 开启im-chat + console.log(`主进程 [${type}]: 窗口注册-远程代理-完毕(${Date.now()})`) + }) + // 用于监听-状态管理变化-同步所有窗口 + ipcMain.handle('pinia-state-change', (e, storeName, jsonStr) => { + + for(const curWin of BrowserWindow.getAllWindows()){ + const id = curWin.webContents.id + const bool = id !== e.sender.id && !curWin.isDestroyed() + if (bool) { // 除了消息发送窗口和销毁的窗口 其他都发送 + curWin.webContents.send('pinia-state-set', storeName, jsonStr) + } + } + }) + // 用于监听-状态管理变化-初始同步 + ipcMain.handle('pinia-state-init', (e, wid, storeName, jsonStr) => { + // console.log('pinia-state-init', jsonStr) + const win = BrowserWindow.fromId(wid) + win.webContents.send('pinia-state-set', storeName, jsonStr) + }) +} + +// app 崩溃监听器 +function appWatchError() { + // 渲染进程崩溃 + app.on('renderer-process-crashed', (event, webContents, killed) => { + console.error( + `APP-ERROR:renderer-process-crashed; event: ${JSON.stringify(event)}; webContents:${JSON.stringify( + webContents + )}; killed:${JSON.stringify(killed)}` + ) + }) + + // GPU进程崩溃 + app.on('gpu-process-crashed', (event, killed) => { + console.error(`APP-ERROR:gpu-process-crashed; event: ${JSON.stringify(event)}; killed: ${JSON.stringify(killed)}`) + }) + + // 渲染进程结束 + app.on('render-process-gone', async (event, webContents, details) => { + console.error( + `APP-ERROR:render-process-gone; event: ${JSON.stringify(event)}; webContents:${JSON.stringify( + webContents + )}; details:${JSON.stringify(details)}` + ) + }) + + // 子进程结束 + app.on('child-process-gone', async (event, details) => { + console.error(`APP-ERROR:child-process-gone; event: ${JSON.stringify(event)}; details:${JSON.stringify(details)}`) + }) +} diff --git a/src/main/logger.js b/src/main/logger.js new file mode 100644 index 0000000..03b6db3 --- /dev/null +++ b/src/main/logger.js @@ -0,0 +1,52 @@ +/** + * @description 日志配置 + * @author zdg + * @date 2021-07-05 14:07:01 + */ +// import log from 'electron-log' +import log from 'electron-log/main' +import { app } from 'electron' +import path from 'path' + +// 关闭控制台打印 +// 日志控制台等级,默认值:false +log.transports.console.level = false +// log.transports.console.level = 'info' +// 日志文件等级,默认值:false +log.transports.file.level = 'info' +// 日志文件名,默认:main.log +// log.transports.file.fileName = 'main.log'; +// 日志大小,默认:1048576(1M),达到最大上限后,备份文件并重命名为:main.old.log,有且仅有一个备份文件 +log.transports.file.maxSize = 10 * 1024 * 1024; // 文件最大不超过 10M +// 自定义日志文件滚动策略 +log.transports.file.rollSize = 10 * 1024 * 1024; // 10MB +// 日志格式,默认:[{y}-{m}-{d} {h}:{i}:{s}.{ms}] [{level}]{scope} {text} +log.transports.file.format = '[{y}-{m}-{d} {h}:{i}:{s}.{ms}] [{level}]{scope} {text}' +let date = new Date() +let dateStr = date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + date.getDate() +// 文件位置及命名方式 +// 默认位置为:C:\Users\[user]\AppData\Roaming\[appname]\electron_log\ +// 文件名为:年-月-日.log +// 自定义文件保存位置为安装目录下 \log\年-月-日.log +// log.transports.file.resolvePathFn = () => 'logs\\' + dateStr+ '.log'; +log.transports.file.resolvePathFn = () => path.join(app.getPath('userData'), `logs/${dateStr}.log`) + +// 有六个日志级别error, warn, info, verbose, debug, silly。默认是silly +export const logger = { + error: (...args) => log.error(...args), + warn: (...args) => log.warn(...args), + info: (...args) => log.info(...args), + verbose: (...args) => log.verbose(...args), + debug: (...args) => log.debug(...args), + silly: (...args) => log.silly(...args) +} +export function initialize(bool = true, type = 'all') { + log.initialize() // 为渲染器进行初始化 + if (bool) { // 是否替换默认的console + if (type == 'all') Object.assign(console, log.functions) + else { // 替换指定类型 + console[type] = log[type] + } + } +} +export default { initialize } \ No newline at end of file diff --git a/src/main/store.js b/src/main/store.js new file mode 100644 index 0000000..a34bd90 --- /dev/null +++ b/src/main/store.js @@ -0,0 +1,68 @@ +/** + * @description 解决 主进程|渲染进程 数据共享 + */ +import Store from 'electron-store' // 持久化存储 + +// 设置ipc与渲染器通信 +Store.initRenderer() + +// 默认共享数据 +const defaultData = { + session: { // 缓存(临时sessionStorage) + model: 'select', // 悬浮球-当前模式 + showBoardAll: false, // 全屏画板-是否显示 + isPdfWin: false, // pdf窗口是否打开 + isToolWin: false, // 工具窗口是否打开 + isTaskWin: false, // 批改窗口是否打开 + curSubjectNode: { + querySearch: {} // 查询资源所需参数 + }, + subject: { // 不走同步 Pinia + bookList: null, // 教材列表 + curBook: null, // 当前选中的教材 + curNode: null, // 当前选中的节点 + defaultExpandedKeys: [], //展开的节点 + subjectTree: [] // "树结构" 章节 + } + }, + local: { // 本地(永久localStorage) + }, +} + +// 初始化 +export function initialize(){ + // 缓存数据-sessionStore + const sessionStore = new Store({ + name: 'session-store', // 存储文件名 + fileExtension: 'ini', // 文件后缀名 + encryptionKey: 'BvPLmgCC4DSIG0KkTec5', // 数据加密-防止用户直接改配置 + beforeEachMigration: (store, context) => { // 版本迁移回调 + console.log(`[session-store] 迁移从 ${context.fromVersion} → ${context.toVersion}`); + }, + migrations: { // 版本变化 + '0.0.0': store => { + // store.set('debugPhase', true); + } + } + }) + sessionStore.clear() // 先清除-所有缓存数据 + sessionStore.set(defaultData.session) // 初始化-默认数据 + + // 缓存数据-localStore + const localStore = new Store({ + name: 'local-store', // 存储文件名 + fileExtension: 'ini', // 文件后缀名 + encryptionKey: '6CyoHQmUaPmLzvVsh', // 数据加密-防止用户直接改配置 + beforeEachMigration: (store, context) => { // 版本迁移回调 + console.log(`[local-store] 迁移从 ${context.fromVersion} → ${context.toVersion}`); + }, + migrations: { // 版本变化 + '0.0.0': store => { + // store.set('debugPhase', true); + } + } + }) + localStore.set(defaultData.local) // 初始化-默认数据 + return {sessionStore, localStore} +} +export default { initialize } \ No newline at end of file diff --git a/src/main/update.js b/src/main/update.js new file mode 100644 index 0000000..e2f7332 --- /dev/null +++ b/src/main/update.js @@ -0,0 +1,66 @@ +import { dialog } from 'electron' +import logger from 'electron-log' +const updateURL = 'http://27.128.240.72:3000/zhuhao/AIx_Smarttalk/releases/tag/V1.0.0%28%E6%B5%8B%E8%AF%95%E7%89%88%29/' + +// 主进程中的更新检查 +const { autoUpdater } = require('electron-updater') + +const updateInit = (win) => { + logger.info('进来了') + // 检查更新 + autoUpdater.checkForUpdates() + // 自动下载 + autoUpdater.autoDownload = false + // 设置版本更新服务器地址 + // autoUpdater.setFeedURL(updateURL) + + //监听更新事件 + autoUpdater.on('update-available', (info) => { + logger.info('发现新版本') + dialog + .showMessageBox(win,{ + type: 'info', + title: '新版本可用', + message: '有一个可用的新版本,要更新吗', + buttons: ['是', '否'] + }) + .then((result) => { + if (result.response === 0) { + // 用户选择更新,触发下载和安装 + autoUpdater.downloadUpdate() + } + }) + }) + + // 没有新版本 + autoUpdater.on('update-not-available', () => { + logger.info('没有新版本') + }) + + // 更新发生错误 + autoUpdater.on('error', () => { + logger.error('检查更新失败') + }) + + // 监听下载进度 + autoUpdater.on('download-progress', (progressObj) => { + win.webContents.send('update-app-progress', progressObj.percent); + }); + + // 跟新下载完毕 + autoUpdater.on('update-downloaded', () => { + dialog + .showMessageBox({ + type: 'info', + title: '更新下载完成', + message: '点击确定重启获取最新内容', + buttons: ['确定'] + }) + .then(() => { + // 调用 quitAndInstall 来安装更新 + autoUpdater.quitAndInstall() + }) + }) +} + +export default updateInit diff --git a/src/preload/index.js b/src/preload/index.js new file mode 100644 index 0000000..ffdb7a0 --- /dev/null +++ b/src/preload/index.js @@ -0,0 +1,22 @@ +import { contextBridge } from 'electron' +import { electronAPI } from '@electron-toolkit/preload' +import TimRender from 'im_electron_sdk/dist/renderer' // im渲染部分实例 +// Custom APIs for renderer +const api = { + preloadPath: __dirname, // 当前preload地址 + getTimRender: () => new TimRender(), // im渲染部分实例 +} +// Use `contextBridge` APIs to expose Electron APIs to +// renderer only if context isolation is enabled, otherwise +// just add to the DOM global. +if (process.contextIsolated) { + try { + contextBridge.exposeInMainWorld('electron', electronAPI) + contextBridge.exposeInMainWorld('api', api) + } catch (error) { + console.error(error) + } +} else { + window.electron = electronAPI + window.api = api +} diff --git a/src/renderer/index.html b/src/renderer/index.html new file mode 100644 index 0000000..1de810c --- /dev/null +++ b/src/renderer/index.html @@ -0,0 +1,19 @@ + + + + + %VITE_APP_TITLE% + + + + + + + +
+ + + diff --git a/src/renderer/public/aaa.pdf b/src/renderer/public/aaa.pdf new file mode 100644 index 0000000..d4ffc94 --- /dev/null +++ b/src/renderer/public/aaa.pdf @@ -0,0 +1,5430 @@ +普通高中教科书 + + 必  修 + +上  册 + 普通高中教科书 + + 必  修 + + 上  册 + + 教育部组织编写 + + ·北京· + 总 主 编:温儒敏 +本册主编:刘勇强 杨九俊 +编写人员:(以姓氏笔画为序) + + 王 岱 王栋生 朱德勇 张克中 + 胡 勤 倪文尖 常 森 蔡 可 +责任编辑:胡 晓 韩 涵 +美术编辑:房海莹 + +普通高中教科书  语文  必修  上册 +教育部组织编写 +出  版  + + (北京市海淀区中关村南大街 17 号院 1 号楼  邮编:100081) +网  址  http://www.pep.com.cn + +版权所有·未经许可不得采用任何方式擅自复制或使用本产品任何部分·违者必究 +如发现内容质量问题,请登录中小学教材意见反馈平台:jcyjfk.pep.com.cn + 目  录 + +第一单元 1 + +1 沁园春·长沙 / 毛泽东 2 + +2 立在地球边上放号 / 郭沫若 4 + +红烛 / 闻一多 4 + +* 峨日朵雪峰之侧 / 昌耀 6 + +* 致云雀 / 雪莱 7 + +3 百合花 / 茹志鹃 12 + +* 哦,香雪 / 铁凝 19 + +单元学习任务 29 + +第二单元 31 + +4 喜看稻菽千重浪 + +——记首届国家最高科技奖获得者袁隆平 / 沈英甲 32 + +* 心有一团火,温暖众人心 / 林为民 38 + +*“探界者”钟扬 / 叶雨婷 43 + +5 以工匠精神雕琢时代品质 / 李斌 51 + +6 芣苢 /《诗经·周南》 53 + +插秧歌 / 杨万里 53 + +单元学习任务 55 + +第三单元 57  + +7 短歌行 / 曹操 58 + +* 归园田居(其一)/ 陶渊明 59 + + 目录 1 + 8 梦游天姥吟留别 / 李白 60 + + 登高 / 杜甫 61 + + * 琵琶行并序 / 白居易 62 + + 9 念奴娇·赤壁怀古 / 苏轼 65 + + * 永遇乐·京口北固亭怀古 / 辛弃疾 66 + + * 声声慢(寻寻觅觅)/ 李清照 67 + + 单元学习任务 69 + + 第四单元 + 家乡文化生活 71 + + 学习活动 + + 一 记录家乡的人和物 72 + + 二 家乡文化生活现状调查 73 + + 三 参与家乡文化建设 74 + + 第五单元 + 整本书阅读  79 + + 《乡土中国》 80 + + 第六单元 83 + + 10 劝学 /《荀子》 84 + + * 师说 / 韩愈 85 + + 11 反对党八股(节选)/ 毛泽东 88 + + 12 拿来主义 / 鲁迅 94 + + 13 * 读书:目的和前提 / 黑塞 97 + + * 上图书馆 / 王佐良 100 + + 单元学习任务 103 + +2 语文 必修上册 + 第七单元 105 + +14 故都的秋 / 郁达夫 106 + +* 荷塘月色 / 朱自清 109 + +15 我与地坛(节选)/ 史铁生 112 + +16 赤壁赋 / 苏轼 118 + +* 登泰山记 / 姚鼐 120 + +单元学习任务 123 + +第八单元 +词语积累与词语解释 125 + +学习活动 + + 一 丰富词语积累 126 + + 二 把握古今词义的联系与区别 127 + + 三 词义的辨析和词语的使用 128 + +古诗词诵读 140 + +静女 /《诗经·邶风》 140 + +涉江采芙蓉 /《古诗十九首》 141 + +虞美人(春花秋月何时了)/ 李煜 142 + +鹊桥仙(纤云弄巧)/ 秦观 143 + +注:篇名前标有 * 的为自读课文。 + + 目录 3 + 4 语文 必修上册 + 第一单元 + + 青春是花样年华。怀着美好的梦想、纯真的感 + 情,带着对自我的认识、对社会的思考和对理想的 + 追求,我们就此迈出人生的重要一步。 + + 本单元的五首诗歌和两篇小说创作于不同的历 + 史时期,都是对青春的吟唱。作者或感时忧国、抒 + 发情怀,或感悟人生、思考未来,让我们体验到各 + 具特色的文学表达,点燃澎湃的青春激情。 + + 学习本单元,可从“青春的价值”角度思考作 + 品的意蕴,并结合自己的体验,敞开心扉,追寻理 + 想,拥抱未来。要理解诗歌运用意象抒发感情的手 + 法,把握小说叙事和抒情的特点,体会诗歌和小说 + 的独特魅力;学习从语言、形象、情感等不同角度 + 欣赏作品,获得审美体验;尝试写作诗歌。 + 1 + + 毛泽东手书《沁园春·长沙》 + + 沁园春·长沙 a + + 毛泽东 + + 独立寒秋, + + 湘江北去, + 橘子洲 b 头。 + + 看万山红遍, + 层林尽染 c ; + 漫江 d 碧透, + 百舸 e 争流。 + + 鹰击长空, + 鱼翔浅底 f, + 万类霜天竞自由 g。 + 怅 h 寥廓 i, + 问苍茫 j 大地, + 谁主 k 沉浮 l ? + +a 选自《毛泽东诗词集》(中央文献出版社 1996 年版)。 g 〔万类霜天竞自由〕万物都在深秋竞相自由地活动。 +b 〔橘子洲〕又名水陆洲,在长沙城西的湘江中。 霜天,深秋天气。 +c 〔层林尽染〕山上一层层的树林全都经霜变红,像 + h 〔怅(chàng)〕失意,不畅快。这里用来表达由深 + 染过一样。 思而引发的激昂慷慨的心绪。 +d 〔漫江〕满江。漫,遍布。 +e 〔舸(ɡě)〕大船。这里泛指船只。 i 〔寥廓〕指宇宙高远辽阔。 +f 〔 鹰 击 长 空, 鱼 翔 浅 底 〕 鹰 在 广 阔 的 天 上 飞, 鱼 在 j〔 苍茫〕旷远迷茫。 + k〔 主〕主宰。 + 清澈的水里游。击,搏击,这里形容飞得矫健有力。 l〔 沉浮〕这里指盛衰。 + 翔,本指鸟盘旋飞翔,这里形容鱼游得轻快自由。 + +2 语文 必修上册 + 携来百侣 a 曾游。 + 忆往昔峥嵘岁月稠 b。 + + 恰同学少年, + 风华正茂 c ; + + 书生意气, + 挥斥方遒 d。 + + 指点江山, + 激扬文字 e, + 粪土当年万户侯 f。 + + 曾记否, + 到中流 g 击水 h, + 浪遏 i 飞舟? + + 1925 年 + +学习提示 + + 面对“万类霜天竞自由”的壮丽秋景,毛泽东填写了这首词,抒发昂扬向 +上的青春激情,表达雄视天下的凌云壮志。阅读时注意领略毛泽东以天下为己 +任的胸怀,品味其中意象的活泼灵动、意境的丰盈深邃。要反复诵读,仔细揣 +摩,体会这首词炼字选词的精妙之处。老一辈无产阶级革命家的很多诗词都能 +引发我们对青春的思考,可以课外阅读毛泽东《水调歌头·游泳》、周恩来《赤 +光的宣言》、朱德《太行春感》、陈毅《赣南游击词》等,感受他们的情怀。 + + 背诵课文。 + +a〔 百侣〕众多同伴。侣,这里指同学。 激浊扬清,抨击恶浊,褒扬清明。 +b〔 峥嵘岁月稠〕不寻常的日子很多。峥嵘,不平凡、 f〔 粪土当年万户侯〕意思是把当时的军阀官僚看得 + + 不寻常。稠,多。 同粪土一样。粪土,视……如粪土,表鄙视。万户 +c〔 风华正茂〕风采才华正盛。 侯,本指食邑万户的封侯者,这里借指大军阀、大 +d 〔书生意气,挥斥方遒(qiú)〕同学们意气奔放,正 官僚。 + g〔 中流〕江河水流中央。 + 强劲有力。挥斥,纵放、奔放。遒,强劲有力。 h〔 击水〕指游泳。 +e 〔指点江山,激扬文字〕评论国家大事,写出激浊 i〔 遏(è)〕阻止。 + + 扬清的文章。指点,评论。江山,指国家。激扬, 第一单元 3 + 2 + + 立在地球边上放号 a + + 郭沫若 + + 无数的白云正在空中怒涌, + 啊啊!好幅壮丽的北冰洋的晴景哟! + 无限的太平洋提起他全身的力量来要把地球推倒。 + 啊啊!我眼前来了的滚滚的洪涛哟! + 啊啊!不断的毁坏,不断的创造,不断的努力哟! + 啊啊!力哟!力哟! + 力的绘画,力的舞蹈,力的音乐,力的诗歌,力的律吕 b 哟! + + 1919 年 9、10 月间作 + +红  烛 c + + 闻一多 + + 蜡炬成灰泪始干 d + ——李商隐 + +红烛啊! +这样红的烛! +诗人啊! + +a 选自《郭沫若全集·文学编》第一卷(人民文学出 吕”作为音律的统称。 + 版社 1982 年版)。 c 选自《红烛》(人民文学出版社 1981 年版)。 + d 〔蜡炬成灰泪始干〕语出唐李商隐《无题》(相见时 +b 〔律吕〕古代用竹管或金属管制成的校正乐律的器 + 具,以管的长短来确定音的不同高度。后来用“律 难别亦难)。 + +4 语文 必修上册 + 吐出你的心来比比, +可是一般颜色? + +红烛啊! +是谁制的蜡——给你躯体? +是谁点的火——点着灵魂? +为何更须烧蜡成灰, +然后才放光出? +一误再误; +矛盾!冲突! + +红烛啊! +不误,不误! +原是要“烧”出你的光来—— +这正是自然的方法。 + +红烛啊! +既制了,便烧着! +烧吧!烧吧! +烧破世人的梦, +烧沸世人的血—— +也救出他们的灵魂, +也捣破他们的监狱! + +红烛啊! +你心火发光之期, +正是泪流开始之日。 + +红烛啊! +匠人造了你, +原是为烧的。 +既已烧着, +又何苦伤心流泪? +哦!我知道了! +是残风来侵你的光芒, + + 第一单元 5 + 你烧得不稳时, + 才着急得流泪! + + 红烛啊! + 流吧!你怎能不流呢? + 请将你的脂膏, + 不息地流向人间, + 培出慰藉的花儿, + 结成快乐的果子! + + 红烛啊! + 你流一滴泪,灰一分心。 + 灰心流泪你的果, + 创造光明你的因。 + + 红烛啊! +“莫问收获,但问耕耘。” + +峨日朵雪峰之侧 a + + 昌耀 + +这是我此刻仅能征服的高度了: +我小心地探出前额, +惊异于薄壁那边 +朝向峨日朵之雪彷徨许久的太阳 +正决然跃入一片引力无穷的 + +a 选自《昌耀抒情诗集》(青海人民出版社 1986 年 昌耀(1936—2000),原名王昌耀,湖南桃源人,诗 + 版)。峨日朵雪峰在青海海北藏族自治州内,是祁 人。 代 表 作 有 诗 歌《 划 呀, 划 呀, 父 亲 们!》《 意 + 连山脉的一座无名山,靠近祁连县峨堡镇,山顶终 绪》等。 + 年积雪。作者在诗中借称这座山为“峨日朵雪峰”。 + +6 语文 必修上册 + 山海。石砾不时滑坡, +引动棕色深渊自上而下的一派嚣鸣, +像军旅远去的喊杀声。 +我的指关节铆钉一样揳 a 入巨石的罅隙 b。 +血滴,从撕裂的千层掌鞋底渗出。 + +啊,真渴望有一只雄鹰或雪豹与我为伍。 +在锈蚀的岩壁, +但有一只小得可怜的蜘蛛 +与我一同默享着这大自然赐予的 +快慰。 + + 1962 年 8 月 2 日初稿 + 1983 年 7 月 27 日删定 + +致云雀 c + + 雪莱 + + 你好啊,欢乐的精灵! + 你似乎从不是飞禽, + + 从天堂或天堂的邻近, + 以酣畅淋漓的乐音, + +不事雕琢的艺术,倾吐你的衷心。 + +向上,再向高处飞翔, + 从地面你一跃而上, + +像一片烈火的轻云, + 掠过蔚蓝的天心, + +a 〔揳(xiē)〕把楔子、钉子等捶打到物体里面。这 c 选自《雪莱诗选》(时代文艺出版社 2012 年版)。江 + 里指用力插入。 枫 译。 雪 莱(1792—1822), 英 国 诗 人。 代 表 作 有 + 诗歌《西风颂》、诗剧《解放了的普罗米修斯》等。 +b 〔罅(xià)隙〕缝隙。 + 第一单元 7 + 永远歌唱着飞翔,飞翔着歌唱。 + + 地平线下的太阳, + 放射出金色的电光, + + 晴空里霞蔚云蒸, + 你沐浴着明光飞行, + + 似不具形体的喜悦开始迅疾的远征。 + + 淡淡的紫色黄昏 + 在你航程周围消融。 + + 像昼空里的星星。 + 虽然不见形影, + + 却可以听得清你那欢乐的强音—— + + 那犀利无比的乐音, + 似银色星光的利箭, + + 它那强烈的明灯, + 在晨曦中逐渐暗淡。 + + 以至难以分辨,却能感觉到就在空间。 + + 整个大地和大气, + 响彻你婉转的歌喉, + + 仿佛在荒凉的黑夜, + 从一片孤云背后, + + 明月放射出光芒,清辉洋溢遍宇宙。 + + 我们不知,你是什么, + 什么和你最为相似? + + 从霓虹似的彩霞 + 也降不下这样美的雨, + + 能和你出现时降下的乐曲甘霖相比。 + + 像一位诗人,隐身 + 在思想的明辉之中, + + 吟诵着即兴的诗韵, + +8 语文 必修上册 + 直到普天下的同情 +都被未曾留意过的希望和忧虑唤醒; + + 像一位高贵的少女, + 居住在深宫的楼台, + + 在寂寞难言的时刻, + 排遣为爱所苦的情怀, + +甜美有如爱情的歌曲,溢出闺阁之外; + + 像一只金色的萤火虫, + 在凝露的深山幽谷, + + 不显露它的行止影踪, + 把晶莹的流光传播, + +在遮断我们视线的芳草鲜花丛中; + + 像一朵让自己的绿叶 + 荫蔽着的玫瑰, + + 遭受到热风的摧残, + 以至它的芳菲 + +以过浓的香甜使鲁莽的飞贼沉醉; + + 晶莹闪烁的草地, + 春霖洒落的声息, + + 雨后苏醒的花蕾, + 称得上明朗、欢悦、 + +清新的一切,全都不及你的音乐。 + + 飞禽或是精灵,有什么 + 甜美的思绪在你心头? + + 我从来还没有听到过 + 爱情或是醇酒的颂歌 + +能够迸涌出这样神圣的极乐音流。 + + 赞婚的合唱也罢, + 凯旋的欢歌也罢, + + 第一单元 9 + 和你的乐声相比, + 不过是空洞的浮夸。 + + 人们可以觉察,其中总有着贫乏。 + + 什么样的物象或事件, + 是你欢乐乐曲的源泉? + + 什么田野、波涛、山峦? + 什么空中陆上的形态? + + 是你对同类的爱,还是对痛苦的绝缘? + + 有你明澈强烈的欢快, + 倦怠永不会出现, + + 那烦恼的阴影,从来 + 近不得你的身边, + + 你爱,却从不知晓过分充满爱的悲哀。 + + 是醒来,抑或是睡去, + 你对死的理解一定比 + + 我们凡人梦想到的 + 更加深刻真切,否则 + + 你的乐曲音流怎能像液态的水晶涌泻? + + 我们瞻前顾后,为了 + 不存在的事物自扰, + + 我们最真挚的欢笑, + 也交织着某种苦恼, + + 我们最美的音乐是最能倾诉哀思的曲调。 + + 可是,即使我们能摈弃 + 憎恨、傲慢和恐惧, + + 即使我们生来不会 + 抛洒任何一滴眼泪, + + 我也不知,怎能接近于你的欢愉。 + +10 语文 必修上册 + 比一切欢乐的音律 + 更加甜蜜美妙, + + 比一切书中的宝库 + 更加丰盛富饶。 + + 这就是鄙弃尘土的你啊你的艺术技巧。 + + 教给我一半,你的心 + 必定熟知的欢欣, + + 和谐、炽热的激情 + 就会流出我的双唇, + + 全世界就会像此刻的我——侧耳倾听。 + + 1820 年夏 + + 学习提示 + + 郭沫若的诗集《女神》是中国新诗的代表性作品,它以崭新的内容和形式,表 +达了“五四”时期狂飙突进的时代精神。《立在地球边上放号》是《女神》中富有 +代表性的一首诗。诗人设想站在地球“边上”全方位俯瞰地球,放声呼唤,纵情高 +歌,想象着那怒涌的白云、壮丽的北冰洋和狂暴的太平洋,意在赞美摧毁旧世界、 +创造新生活的雄强之力,体现了“五四”所焕发的自由宏阔、雄奇奔放的气概。阅 +读时要注意联系“五四”特定的时代氛围来理解这首诗的内涵与形式特征。 + + 闻一多的《红烛》化用“蜡炬”这一古典意象,赋予它新的含义,赞美了红 +烛以“烧蜡成灰”来点亮世界的奉献精神。注意体会诗人如何借助与红烛的“对 +话”表达青春的困惑与希望,以及对理想的坚毅追求。洋溢在诗中的幻想和情绪 +渲染,感叹词的回环使用,诗句长短错落形成的节奏美,也是欣赏时要关注的。 + + 昌耀的《峨日朵雪峰之侧》内涵丰富,阅读时要注意发挥想象,体味“雪 +峰”“太阳”“蜘蛛”等意象营造出的凝重而又壮美的氛围,感受其中蕴含的谦卑 +而强劲的生命力量。 + + 雪莱的《致云雀》意蕴深刻,比喻新奇,要注意体会诗人的情感,理解云雀 +的象征意义;把握作品节与节之间环环相扣的特点,欣赏诗人想象的奇特和运用 +修辞手法的大胆、灵活。 + + 学习这组诗作,要多借助朗读,理清诗歌的抒情脉络,把握意象的内涵,感 +悟诗人抒发的情思,体会象征手法的运用。 + + 第一单元 11 + 3 + + 百合花 a + + 茹志鹃 + + 1946 年的中秋。 + 这天打海岸的部队决定晚上总攻。我们文工团创作室的几个同志, +就由主攻团的团长分派到各个战斗连去帮助工作。大概因为我是个女同 +志吧,团长对我抓了半天后脑勺,最后才叫一个通讯员 b 送我到前沿包 +扎所去。 + 包扎所就包扎所吧!反正不叫我进保险箱就行。我背上背包,跟通 +讯员走了。 + 早上下过一阵小雨,现在虽放了晴,路上还是滑得很,两边地里的 +秋庄稼,却给雨水冲洗得青翠水绿,珠烁晶莹。空气里也带有一股清鲜 +湿润的香味。要不是敌人的冷炮在间歇地盲目地轰响着,我真以为我们 +是去赶集的呢! + 通讯员撒开大步,一直走在我前面。一开始他就把我撂下几丈远。 +我的脚烂了,路又滑,怎么努力也赶不上他。我想喊他等等我,却又怕 +他笑我胆小害怕;不叫他,我又真怕一个人摸不到那个包扎所。我开始 +对这个通讯员生起气来。 + 哎!说也怪,他背后好像长了眼睛似的,倒自动在路边站下了, +但脸还是朝着前面,没看我一眼。等我紧走慢赶地快要走近他时,他 +又噔噔噔地自个儿向前走了,一下又把我甩下几丈远。我实在没力气 +赶了,索性一个人在后面慢慢晃。不过这一次还好,他没让我撂得太 +远,但也不让我走近,总和我保持着丈把远的距离。我走快,他在前 +面大踏步向前;我走慢,他在前面就摇摇摆摆。奇怪的是,我从没见 +他回头看我一次,我不禁对这通讯员发生了兴趣。 + 刚才在团部我没注意看他,现在从背后看去,只看到他是高挑挑的 +个子,块头不大,但从他那副厚实实的肩膀看来,是个挺棒的小伙儿, + +a 选自《百合花》(人民文学出版社 2000 年版)。略 故事》等。 + 有改动。茹志鹃(1925—1998),浙江杭州人,作 b 〔通讯员〕现在称作“通信员”,指部队、机关中担 + 家。 代 表 作 有 短 篇 小 说《 百 合 花 》《 剪 辑 错 了 的 + 任传递公文等联络工作的人员。 +12 语文 必修上册 + 他穿了一身洗淡了的黄军装,绑腿直打到膝盖上。肩上的步枪筒里, +稀疏地插了几根树枝,这要说是伪装,倒不如算作装饰点缀。 + + 没有赶上他,但双脚胀痛得像火烧似的。我向他提出休息一会儿 +后,自己便在做田界的石头上坐了下来。他也在远远的一块石头上坐 +下,把枪横搁在腿上,背向着我,好像没我这个人似的。凭经验,我晓 +得这一定又因为我是个女同志。女同志下连队,就有这些困难。我着 +恼 a 地带着一种反抗情绪走过去,面对着他坐下来。这时,我看见他那 +张十分年轻稚气的圆脸,顶多有十八岁。他见我挨他坐下,立即张皇 b +起来,好像他身边埋下了一颗定时炸弹,局促不安,掉过脸去不好,不 +掉过去又不行,想站起来又不好意思。我拼命忍住笑,随便地问他是哪 +里人。他没回答,脸涨得像个关公,讷讷 c 半晌,才说清自己是天目山 +人。原来他还是我的同乡呢! + + “在家时你干什么?” + “帮人拖毛竹。” + 我朝他宽宽的两肩望了一下,立即在我眼前出现了一片绿雾似的竹 +海,海中间,一条窄窄的石级山道,盘旋而上。一个肩膀宽宽的小伙儿, +肩上垫了一块老蓝布,扛了几枝青竹,竹梢长长的拖在他后面,刮打得 +石级哗哗作响……这是我多么熟悉的故乡生活啊!我立刻对这位同乡越 +加亲热起来。我又问: + “你多大了?” + “十九。” + “参加革命几年了?” + “一年。” + “你怎么参加革命的?”我问到这里自己觉得这不像是谈话,倒有 +些像审讯。不过我还是禁不住地要问。 + “大军北撤时我自己跟来的。” + “家里还有什么人呢?” + “娘,爹,弟弟妹妹,还有一个姑姑也住在我家里。” + “你还没娶媳妇吧?” + “……”他飞红了脸,更加忸怩起来,两只手不停地数摸着皮腰带 +上的扣眼。半晌他才低下了头,憨憨地笑了一下,摇了摇头。我还想问 +他有没有对象,但看到他这样子,只得把嘴里的话又咽了下去。 + +a 〔着(zháo)恼〕生气。 c 〔讷(nè)讷〕说话迟钝、不连贯。 +b 〔张皇〕惊慌不安的样子。 + 第一单元 13 + 两人闷坐了一会儿,他开始抬头看看天,又掉过来扫了我一眼,意 + 思是在催我动身。 + + 当我站起来要走的时候,我看见他摘了帽子,偷偷地在用毛巾拭 + 汗。这是我的不是,人家走路都没出一滴汗,为了我跟他说话,却害他 + 出了这一头大汗,这都怪我了。 + + 我们到包扎所,已是下午两点钟了。这里离前沿有三里路,包扎所 + 设在一个小学里,大小六个房子组成“品”字形,中间一块空地长了许 + 多野草,显然,小学已有多时不开课了。我们到时,屋里已有几个卫生 + 员在弄着纱布棉花,满地上都是用砖头垫起来的门板,算作病床。 + + 我们刚到不久,来了一个乡干部,他眼睛熬得通红,用一片硬纸插 + 在额前的破毡帽下,低低地遮在眼睛前面挡光。他一肩背枪,一肩挂了 + 一杆秤;左手挎了一篮鸡蛋,右手提了一口大锅,呼哧呼哧地走来。他 + 一边放东西,一边对我们又道歉又诉苦,一边还喘息地喝着水,同时还 + 从怀里掏出一包饭团来嚼着。我只见他迅速地做着这一切,他说的什么 + 我就没大听清,好像是说什么被子的事,要我们自己去借。我问清了卫 + 生员,原来因为部队上的被子还没发下来,但伤员流了血,非常怕冷, + 所以就得向老百姓去借,哪怕有一二十条棉絮也好。我这时正愁工作插 + 不上手,便自告奋勇讨了这件差事,怕来不及,就顺便也请了我那位同 + 乡,请他帮我动员几家再走。他踌躇了一下,便和我一起去了。 + + 我们先到附近一个村子,进村后他向东,我往西,分头去动员。不 + 一会儿,我已写了三张借条出去,借到两条棉絮,一条被子,手里抱得 + 满满的,心里十分高兴,正准备送回去再来借时,看见通讯员从对面走 + 来,两手还是空空的。 + + “怎么,没借到?”我觉得这里老百姓觉悟高,又很开通,怎么会 + 没有借到呢?我有点惊奇地问。 + + “女同志,你去借吧!……老百姓死封建……” + “哪一家?你带我去。”我估计一定是他说话不对,说崩了。借不 + 到被子事小,得罪了老百姓影响可不好。我叫他带我去看看。但他执 + 拗地低着头,像钉在地上似的,不肯挪步,我走近他,低声地把群众 + 影响的话对他说了。他听了,果然就松松爽爽地带我走了。 + 我们走进老乡的院子里,只见堂屋里静静的,里面一间房门上,垂 + 着一块蓝布红额的门帘,门框两边还贴着鲜红的对联。我们只得站在外 + 面向里“大姐、大嫂”地喊,喊了几声,不见有人应,但响动是有了。 + 一会儿,门帘一挑,露出一个年轻媳妇来。这媳妇长得很好看,高高的 + +14 语文 必修上册 + 鼻梁,弯弯的眉,额前一溜蓬松松的刘海。穿的虽是粗布,倒都是新 +的。我看她头上已硬挠挠地挽了髻,便大嫂长大嫂短地向她道歉,说刚 +才这个同志来,说话不好别见怪等等。她听着,脸扭向里面,尽咬着嘴 +唇笑。我说完了,她也不作声,还是低头咬着嘴唇,好像忍了一肚子的 +笑料没笑完。这一来,我倒有些尴尬了,下面的话怎么说呢!我看通讯 +员站在一边,眼睛一眨不眨地看着我,好像在看连长做示范动作似的。 +我只好硬了头皮,讪讪 a 地向她开口借被子了,接着还对她说了一遍共 +产党的部队打仗是为了老百姓的道理。这一次,她不笑了,一边听着, +一边不断向房里瞅着。我说完了,她看看我,看看通讯员,好像在掂量 +我刚才那些话的斤两。半晌,她转身进去抱被子了。 + + 通讯员乘这机会,颇不服气地对我说道: + “我刚才也是说的这几句话,她就是不借,你看怪吧!……” + 我赶忙白了他一眼,不叫他再说。可是来不及了,那个媳妇抱了被 +子,已经在房门口了。被子一拿出来,我方才明白她刚才为什么不肯借 +了。这原来是一条里外全新的花被子,被面是假洋缎的,枣红底,上 +面撒满白色百合花。 她好像是在故意气通讯员,把被子朝我面前一送, +说:“抱去吧。” + 我手里已捧满了被子,就一努嘴,叫通讯员来拿。没想到他竟扬起 +脸,装作没看见。我只好开口叫他,他这才绷了脸,垂着眼皮,上去接 +过被子,慌慌张张地转身就走。不想他一步还没走出去,就听见“嘶” +的一声,衣服挂住了门钩,在肩膀处,挂下一片布来,口子撕得不小。 +那媳妇一面笑着,一面赶忙找针拿线,要给他缝上。通讯员却高低不 +肯,挟了被子就走。 + 刚走出门不远,就有人告诉我们,刚才那位年轻媳妇,是刚过门三 +天的新娘子,这条被子就是她唯一的嫁妆。我听了,心里便有些过意不 +去,通讯员也皱起了眉,默默地看着手里的被子。我想他听了这样的话 +一定会有同感吧!果然,他一边走,一边跟我嘟哝起来了。 + “我们不了解情况,把人家结婚被子也借来了,多不合适呀!……” + 我忍不住想给他开个玩笑,便故作严肃地说:“是呀!也许她为了 +这条被子,在做姑娘时,不知起早熬夜,多干了多少零活儿,才积起了 +做被子的钱,或许她曾为了这条花被,睡不着觉呢。可是还有人骂她死 +封建……” + 他听到这里,突然站住脚,呆了一会儿,说: + +a 〔讪(shàn)讪〕形容不好意思、难为情的样子。 + + 第一单元 15 + “那!……那我们送回去吧!” + “已经借来了,再送回去,倒叫她多心。”我看他那副认真、为难的 + 样子,又好笑,又觉得可爱。不知怎么的,我已从心底爱上了这个傻乎 + 乎的小同乡。 + 他 听 我 这 么 说, 也 似 乎 有 理, 考 虑 了 一 下, 便 下 了 决 心 似 的 说: + “好,算了。用了给她好好洗洗。”他决定以后,就把我抱着的被子,统 + 统抓过去,左一条、右一条地披挂在自己肩上,大踏步地走了。 + 回到包扎所以后,我就让他回团部去。他精神顿时活泼起来了,向 + 我敬了礼就跑了。走不几步,他又想起了什么,在自己挎包里掏了一 + 阵,摸出两个馒头,朝我扬了扬,顺手放在路边石头上,说:“给你开 + 饭啦!”说完就脚不点地地走了。我走过去拿起那两个干硬的馒头,看 + 见他背的枪筒里不知在什么时候又多了一枝野菊花,跟那些树枝一起, + 在他耳边抖抖地颤动着。 + 他已走远了,但还见他肩上撕挂下来的布片,在风里一飘一飘。我 + 真后悔没给他缝上再走。现在,至少他要裸露一晚上的肩膀了。 + 包扎所的工作人员很少。乡干部动员了几个妇女,帮我们打水,烧 + 锅,做些零碎活儿。那位新媳妇也来了,她还是那样,笑眯眯地抿着 + 嘴,偶然从眼角上看我一眼,但她时不时地东张西望,好像在找什么。 + 后来她到底问我说:“那位同志弟到哪里去了?”我告诉她同志弟不是 + 这里的,他现在到前沿去了。她不好意思地笑了一下说:“刚才借被子, + 他可受我的气了!”说完又抿了嘴笑着,动手把借来的几十条被子、棉 + 絮,整整齐齐地分铺在门板上、桌子上(两张课桌拼起来,就是一张 + 床)。我看见她把自己那条白百合花的新被,铺在外面屋檐下的一块门 + 板上。 + 天黑了,天边涌起一轮满月。我们的总攻还没发起。敌人照例是忌 + 怕夜晚的,在地上烧起一堆堆的野火,又盲目地轰炸,照明弹也一个接 + 一个地升起,好像在月亮下面点了无数盏汽油灯,把地面的一切都赤裸 + 裸地暴露出来了。在这样一个“白夜”里来攻击,有多困难,要付出多 + 大的代价啊! 我连那一轮皎洁的月亮,也憎恶起来了。 + 乡干部又来了,慰劳了我们几个家做的干菜月饼。原来今天是中秋 + 节了。 + 啊!中秋节,在我的故乡,现在一定又是家家门前放一张竹茶几, + 上面供一副香烛,几碟瓜果月饼。孩子们急切地盼那炷香快些焚尽,好 + 早些分摊给月亮娘娘享用过的东西,他们在茶几旁边跳着唱着:“月亮 + +16 语文 必修上册 + 堂堂,敲锣买糖……”或是唱着:“月亮嬷嬷,照你照我……”我想到 + 这里,又想起我那个小同乡,那个拖毛竹的小伙儿,也许,几年以前, + 他还唱过这些歌吧!……我咬了一口美味的家做月饼,想起那个小同乡 + 大概现在正趴在工事里,也许在团指挥所,或者是在那些弯弯曲曲的交 + 通沟里走着哩!…… + + 一会儿,我们的炮响了,天空划过几颗红色的信号弹,攻击开始 + 了。不久,断断续续地有几个伤员下来,包扎所的空气立即紧张起来。 + + 我拿着小本子,去登记他们的姓名、单位,轻伤的问问,重伤的就 + 得拉开他们的符号,或是翻看他们的衣襟。我拉开一个重彩号的符号时, +“通讯员”三个字使我突然打了个寒战,心跳起来。我定了下神才看到符 + 号上写着 × 营的字样。啊!不是,我的同乡他是团部的通讯员。但我又 + 莫名其妙地想问问谁,战地上会不会漏掉伤员。通讯员在战斗时,除了 + 送信,还干什么——我不知道自己为什么要问这些没意思的问题。 + + 战斗开始后的几十分钟里,一切顺利,伤员一次次带下来的消息, + 都是我们突破第一道鹿寨 a,第二道铁丝网,占领敌人前沿工事打进 + 街了。但到这里,消息忽然停顿了,下来的伤员只是简单地回答“在 + 打”,或是“在巷战”。但从他们满身泥泞,极度疲乏的神色上,甚至 + 从那些似乎刚从泥里掘出来的担架上,大家明白,前面在进行着一场 + 什么样的战斗。 + + 包扎所的担架不够了,好几个重彩号不能及时送后方医院,耽搁 + 下来。我不能解除他们任何痛苦,只得带着那些妇女,给他们拭脸洗 + 手,能吃得了的喂他们吃一点,带着背包的,就给他们换一件干净衣 + 裳,有些还得解开他们的衣服,给他们拭洗身上的污泥血迹。 + + 做这种工作,我当然没什么,可那些妇女又羞又怕,就是放不开手 + 来,大家都要抢着去烧锅,特别是那新媳妇。我跟她说了半天,她才红 + 了脸,同意了,不过只答应做我的下手。 + + 前面的枪声,已响得稀落了。感觉上似乎天快亮了,其实还只是半 + 夜。外边月亮很明,也比平日悬得高。前面又下来一个重伤员。屋里铺 + 位都满了,我就把这位重伤员安排在屋檐下的那块门板上。担架员把伤 + 员抬上门板,但还围在床边不肯走。一个上了年纪的担架员,大概把我 + 当作医生了,一把抓住我的膀子说:“大夫,你可无论如何要想办法治 + + a 〔鹿寨〕一种军用障碍物,把树木的枝干交叉放 + 置,用来阻止敌人的步兵或坦克。因形状像鹿角 + 而得名。 + + 第一单元 17 + 好这位同志呀!你治好他,我……我们全体担架队员给你挂匾!……” + 他说话的时候,我发现其他的几个担架员也都睁大了眼盯着我,似乎我 + 点一点头,这伤员就立即会好了似的。我心想给他们解释一下,只见新 + 媳妇端着水站在床前,短促地“啊”了一声。我急拨开他们上前一看, + 我看见了一张十分年轻稚气的圆脸,原来棕红的脸色,现已变得灰黄。 + 他安详地合着眼,军装的肩头上露着那个大洞,一片布还挂在那里。 + + “这都是为了我们……”那个担架员负罪地说道,“我们十多副担架 + 挤在一个小巷子里,准备往前运动,这位同志走在我们后面,可谁知道 + 反动派不知从哪个屋顶上撂下颗手榴弹来,手榴弹就在我们人缝里冒着 + 烟乱转,这时这位同志叫我们快趴下,他自己就一下扑在那个东西上 + 了……” + + 新媳妇又短促地“啊”了一声。我强忍着眼泪,跟那些担架员说 + 了些话,打发他们走了。我回转身看见新媳妇已轻轻移过一盏油灯, + 解开他的衣服,她刚才那种忸怩羞涩已经完全消失,只是庄严而虔诚 + 地给他拭着身子,这位高大而又年轻的小通讯员无声地躺在那里…… + 我猛然醒悟地跳起身,磕磕绊绊地跑去找医生,等我和医生拿了针药 + 赶来,新媳妇正侧着身子坐在他旁边。 + + 她低着头,正一针一针地在缝他衣肩上那个破洞。医生听了听通讯 + 员的心脏,默默地站起身说:“不用打针了。”我过去一摸,果然手都冰 + 冷了。新媳妇却像什么也没看见,什么也没听到,依然拿着针,细细地、 + 密密地缝着那个破洞。我实在看不下去了,低声地说:“不要缝了。” + + 她却对我异样地瞟了一眼,低下头,还是一针一针地缝。我想拉开 + 她,我想推开这沉重的氛围,我想看见他坐起来,看见他羞涩地笑。但 + 我无意中碰到了身边一个什么东西,伸手一摸,是他给我开的饭,两个 + 干硬的馒头…… + + 卫生员让人抬了一口棺材来,动手揭掉他身上的被子,要把他放进 + 棺材去。新媳妇这时脸发白,劈手夺过被子,狠狠地瞪了他们一眼。自 + 己动手把半条被子平展展地铺在棺材底,半条盖在他身上。卫生员为难 + 地说:“被子……是借老百姓的。” + + “是我的——”她气汹汹地嚷了半句,就扭过脸去。在月光下,我 + 看见她眼里晶莹发亮,我也看见那条枣红底色上撒满白色百合花的被子, + 这象征纯洁与感情的花,盖上了这位平常的、拖毛竹的青年人的脸。 + + 1958 年 3 月 + +18 语文 必修上册 + 哦,香雪 a + + 铁凝 + + 如果不是有人发明了火车,如果不是有人把铁轨铺进深山,你怎 +么也不会发现台儿沟这个小村。它和它的十几户乡亲,一心一意掩藏 +在大山那深深的皱褶里,从春到夏,从秋到冬,默默地接受着大山任 +意给予的温存和粗暴。 + + 然而,两根纤细、闪亮的铁轨延伸过来了。它勇敢地盘旋在山腰, +又悄悄地试探着前进,弯弯曲曲,曲曲弯弯,终于绕到台儿沟脚下, +然后钻进幽暗的隧道,冲向又一道山梁,朝着神秘的远方奔去。 + + 不久,这条线正式营运,人们挤在村口,看见那绿色的长龙一路 +呼啸,挟带着来自山外的陌生、新鲜的清风,擦着台儿沟贫弱的脊背 +匆匆而过。它走得那样急忙,连车轮碾轧钢轨时发出的声音好像都在 +说:不停不停,不停不停!是啊,它有什么理由在台儿沟站脚呢?台 +儿沟有人要出远门吗?山外有人来台儿沟探亲访友吗?还是这里有石 +油储存,有金矿埋藏?台儿沟,无论从哪方面讲,都不具备挽住火车 +在它身边留步的力量。 + + 可是,记不清从什么时候起,列车时刻表上,还是多了“台儿沟” +这一站。也许乘车的旅客提出过要求,他们中有哪位说话算数的人和 +台儿沟沾亲;也许是那个快乐的男乘务员发现台儿沟有一群十七八岁 +的漂亮姑娘,每逢列车疾驶而过,她们就成帮搭伙地站在村口,翘起 +下巴,贪婪、专注地仰望着火车。有人朝车厢指点,不时能听见她们 +由于互相捶打而发出的一两声娇嗔的尖叫。也许什么都不为,就因为 +台儿沟太小了,小得叫人心疼,就是钢筋铁骨的巨龙在它面前也不能 +昂首阔步,也不能不停下来。总之,台儿沟上了列车时刻表,每晚七 +点钟,由首都方向开往山西的这列火车在这里停留一分钟。 + + 这短暂的一分钟,搅乱了台儿沟以往的宁静。从前,台儿沟人历 +来是吃过晚饭就钻被窝,他们仿佛是在同一时刻听到了大山无声的命 +令。于是,台儿沟那一小片石头房子在同一时刻忽然完全静止了,静 + +a 选自《铁凝文集》(江苏文艺出版社 1996 年版)。略 + 有改动。 + + 第一单元 19 + 得那样深沉、真切,好像在默默地向大山诉说着自己的虔诚。如今,台 + 儿沟的姑娘们刚把晚饭端上桌就慌了神,她们心不在焉地胡乱吃几口, + 扔下碗就开始梳妆打扮。她们洗净蒙受了一天的黄土、风尘,露出粗 + 糙、红润的面色,把头发梳得乌亮,然后就比赛着穿出最好的衣裳。有 + 人换上过年时才穿的新鞋,有人还悄悄往脸上涂点胭脂。尽管火车到站 + 时已经天黑,她们还是按照自己的心思,刻意斟酌着服饰和容貌。然 + 后,她们就朝村口,朝火车经过的地方跑去。香雪总是第一个出门,隔 + 壁的凤娇第二个就跟了出来。 + + 七点钟,火车喘息着向台儿沟滑过来,接着一阵咔哐乱响,车身震 + 颤一下,才停住不动了。姑娘们心跳着涌上前去,像看电影一样,挨着 + 窗口观望。只有香雪躲在后边,双手紧紧捂着耳朵。看火车,她跑在最 + 前边;火车来了,她却缩到最后去了。她有点害怕它那巨大的车头,车 + 头那么雄壮地喷吐着白雾,仿佛一口气就能把台儿沟吸进肚里。它那撼 + 天动地的轰鸣也叫她感到恐惧。在它跟前,她简直像一棵没根的小草。 + + “香雪,过来呀,看!”凤娇拉过香雪向一个妇女头上指,她指的 + 是那个妇女头上别着的那一排金圈圈。 + + “怎么我看不见?”香雪微微眯着眼睛。 + “就是靠里边那个,那个大圆脸,看,还有手表哪,比指甲盖还小 + 哩!”凤娇又有了新发现。 + 香雪不言不语地点着头,她终于看见了妇女头上的金圈圈和她腕上 + 比指甲盖还要小的手表。但她也很快就发现了别的。“皮书包!”她指 + 着行李架上一只普通的棕色人造革学生书包。就是那种连小城市都随处 + 可见的学生书包。 + 尽管姑娘们对香雪的发现总是不感兴趣,但她们还是围了上来。 + “哟,我的妈呀!你踩着我脚啦!”凤娇一声尖叫,埋怨着挤上来 + 的一个姑娘。她老是爱一惊一乍的。 + “你咋呼什么呀,是想叫那个小白脸和你搭话了吧?”被埋怨的姑 + 娘也不示弱。 + “我撕了你的嘴!”凤娇骂着,眼睛却不由自主地朝第三节车厢的 + 车门望去。 + 那 个 白 白 净 净 的 年 轻 乘 务 员 真 下 车 来 了。 他 身 材 高 大, 头 发 乌 + 黑,说一口漂亮的北京话。也许因为这点,姑娘们私下里都叫他“北京 + 话”。“北京话”双手抱住胳膊肘,和她们站得不远不近地说:“喂,我 + 说小姑娘们,别扒窗户,危险!” + +20 语文 必修上册 + “哟,我们小,你就老了吗?”大胆的凤娇回敬了一句。 + 姑娘们一阵大笑,不知谁还把凤娇往前一搡,弄得她差点儿撞在他 +身上。这一来反倒更壮了凤娇的胆。“喂,你们老待在车上不头晕?” +她又问。 + “房顶子上那个大刀片似的,那是干什么用的?”又一个姑娘问。 +她指的是车厢里的电扇。 + “烧水在哪儿?” + “开到没路的地方怎么办?” + “你们城市里一天吃几顿饭?”香雪也紧跟在姑娘们后边小声问了 +一句。 + “真没治!”“北京话”陷在姑娘们的包围圈里,不知所措地嘟囔着。 + 快开车了,她们才让出一条路,放他走。他一边看表,一边朝车门 +跑去,跑到门口,又扭头对她们说:“下次吧,下次告诉你们!”他的 +两条长腿灵巧地向上一跨就上了车,接着一阵叽里哐啷,绿色的车门就 +在姑娘们面前沉重地合上了。列车一头扎进黑暗,把她们撇在冰冷的铁 +轨旁边。很久,她们还能感觉到它那越来越轻的震颤。 + 一切又恢复了寂静,静得叫人惆怅。姑娘们走回家去,路上总要为 +一点儿小事争论不休: + “谁知道别在头上的金圈圈是几个?” + “八个。” + “九个。” + “不是!” + “就是!” + “凤娇你说呢?” + “她呀,还在想‘北京话’哪!”有人开起了凤娇的玩笑。 + “去你的,谁说谁就想。”凤娇说着捏了一下香雪的手,意思是叫香 +雪帮腔。 + 香雪没说话,慌得脸都红了。她才十七岁,还没学会怎样在这种事 +上给人家帮腔。 + “他的脸多白呀!”那个姑娘还在逗凤娇。 + “白?还不是在那大绿屋里捂的。叫他到咱台儿沟住几天试试。”有 +人在黑影里说。 + “可不,城里人就靠捂。要论白,叫他们和咱香雪比比。咱们香雪,天 +生一副好皮子,再照火车上那些闺女的样儿,把头发烫成弯绕绕,啧啧! + + 第一单元 21 + ‘真没治’!凤娇姐,你说是不是?” + 凤娇不接茬儿,松开了香雪的手。好像姑娘们真在贬低她的什么人 + + 一样,她心里真有点儿替他抱不平呢。不知怎么的,她认定他的脸绝不 + 是捂白的,那是天生。 + + 香雪又悄悄把手送到凤娇手心里,她示意凤娇握住她的手,仿佛请 + 求凤娇的宽恕,仿佛是她使凤娇受了委屈。 + + “凤娇,你哑巴啦?”还是那个姑娘。 + “谁哑巴啦!谁像你们,专看人家脸黑脸白。你们喜欢,你们可跟 + 上人家走啊!”凤娇的嘴很硬。 + “我们不配!” + “你担保人家没有相好的?” + …… + 不管在路上吵得怎样厉害,分手时大家还是十分友好的,因为一个叫 + 人兴奋的念头又在她们心中升起:明天,火车还要经过,她们还会有一 + 个美妙的一分钟。和它相比,闹点儿小别扭还算回事吗? + 哦,五彩缤纷的一分钟,你饱含着台儿沟的姑娘们多少喜怒哀乐! + 日久天长,这五彩缤纷的一分钟,竟变得更加五彩缤纷起来。就在 + 这个一分钟里,她们开始挎上装满核桃、鸡蛋、大枣的长方形柳条篮 + 子,站在车窗下,抓紧时间跟旅客和和气气地做买卖。她们踮着脚尖, + 双臂伸得直直的,把整筐的鸡蛋、红枣举上窗口,换回台儿沟少见的挂 + 面、火柴,以及属于姑娘们自己的发卡、香皂。有时,有人还会冒着回 + 家挨骂的风险,换回花色繁多的纱巾和能松能紧的尼龙袜。 + 凤娇好像是大家有意分配给那个“北京话”的,每次都是她提着篮 + 子去找他。她和他做买卖故意磨磨蹭蹭,车快开时才把整篮的鸡蛋塞给 + 他。要是他先把鸡蛋拿走,下次见面时再付钱,那就更够意思了。如果 + 他给她捎回一捆挂面、两条纱巾,凤娇就一定抽出一斤挂面还给他。她 + 觉得,只有这样才对得起和他的交往,她愿意这种交往和一般的做买卖 + 有所区别。有时她也想起姑娘们的话:“你担保人家没有相好的?”其 + 实,有没有相好的不关凤娇的事,她又没想过跟他走。可她愿意对他好, + 难道非得是相好的才能这么做吗? + 香雪平时话不多,胆子又小,但做起买卖却是姑娘中最顺利的一 + 个。旅客们爱买她的货,因为她是那么信任地瞧着你,那洁如水晶的眼 + 睛告诉你,站在车窗下的这个女孩子还不知道什么叫受骗。她还不知道 + 怎么讲价钱,只说:“你看着给吧。”你望着她那洁净得仿佛一分钟前才 + +22 语文 必修上册 + 《哦,香雪》连环画  王玉琦  作 + +诞生的面孔,望着她那柔软得宛若红缎子似的嘴唇,心中会升起一种美 +好的感情。你不忍心跟这样的小姑娘耍滑头,在她面前,再爱计较的人 +也会变得慷慨大度。 + + 有时她也抓空儿向他们打听外面的事,打听北京的大学要不要台儿 +沟人,打听什么叫“配乐诗朗诵”(那是她偶然在同桌的一本书上看到 +的)。有一回她向一位戴眼镜的中年妇女打听能自动开关的铅笔盒,还 +问到它的价钱。谁知没等人家回话,车已经开动了。她追着它跑了好 +远,当秋风和车轮的呼啸一同在她耳边鸣响时,她才停下脚步意识到, +自己的行为是多么可笑啊。 + + 火车眨眼间就无影无踪了。姑娘们围住香雪,当她们知道她追火车 +的原因后,便觉得好笑起来。 + + “傻丫头!” + “值不当的!” + 她们像长者那样拍着她的肩膀。 + “就怪我磨蹭,问慢了。”香雪可不认为这是一件值不当的事,她只 +是埋怨自己没抓紧时间。 + “咳,你问什么不行呀!”凤娇替香雪挎起篮子说。 + “谁叫咱们香雪是学生呢。”也有人替香雪分辩。 + 也许就因为香雪是学生吧,是台儿沟唯一考上初中的人。 + 台儿沟没有学校,香雪每天上学要到十五里以外的公社 a。尽管不 + +a 〔公社〕指人民公社。1958—1982 年我国农村中的集 + 体所有制经济组织。一般一乡建立一社,政社合一。 + + 第一单元 23 + 爱说话是她的天性,但和台儿沟的姐妹们总是有话可说的。公社中学可 + 就没那么多姐妹了,虽然女同学不少,但她们的言谈举止,一个眼神, + 一声轻轻的笑,好像都是为了叫香雪意识到,她是小地方来的,穷地方 + 来的。她们故意一遍又一遍地问她:“你们那儿一天吃几顿饭?”她不 + 明白她们的用意,每次都认真地回答:“两顿。”然后又友好地瞧着她们 + 反问道:“你们呢?” + + “三顿!”她们每次都理直气壮地回答。之后,又对香雪在这方面 + 的迟钝感到说不出的怜悯和气恼。 + + “你上学怎么不带铅笔盒呀?”她们又问。 + “那不是吗。”香雪指指桌角。 + 其实,她们早知道桌角那只小木盒就是香雪的铅笔盒,但她们还是做 + 出吃惊的样子。每到这时,香雪的同桌就把自己那只宽大的泡沫塑料铅笔 + 盒摆弄得嗒嗒乱响。这是一只可以自动合上的铅笔盒,很久以后,香雪才 + 知道它所以能自动合上,是因为铅笔盒里包藏着一块不大不小的吸铁石。 + 香雪的小木盒,尽管那是当木匠的父亲为她考上中学特意制作的,它在台 + 儿沟还是独一无二的呢。可在这儿,和同桌的铅笔盒一比,为什么显得那 + 样笨拙,陈旧?它在一阵嗒嗒声中有几分羞涩地畏缩在桌角上。 + 香雪的心再也不能平静了,她好像忽然明白了同学们对于她的再三 + 盘问,明白了台儿沟是多么贫穷。她第一次意识到这是不光彩的,因为 + 贫穷,同学们才敢一遍又一遍地盘问她。她盯住同桌那只铅笔盒,猜测 + 它来自遥远的大城市,猜测它的价钱肯定非同寻常。三十个鸡蛋换得来 + 吗?还是四十个、五十个?这时她的心又忽地一沉:怎么想起这些了? + 娘攒下鸡蛋,不是为了叫她乱打主意啊!可是,为什么那诱人的嗒嗒声 + 老是在耳边响个没完? + 深秋,山风渐渐凛冽了,天也黑得越来越早。但香雪和她的姐妹们 + 对于七点钟的火车,是照等不误的。她们可以穿起花棉袄了,凤娇头上 + 别起了淡粉色的有机玻璃发卡,有些姑娘的辫梢还缠上了夹丝橡皮筋。 + 那是她们用鸡蛋、核桃从火车上换来的。她们仿照火车上那些城里姑娘 + 的样子把自己武装起来,整齐地排列在铁路旁,像是等待欢迎远方的贵 + 宾,又像是准备着接受检阅。 + 火车停了,发出一阵沉重的叹息,像是在抱怨台儿沟的寒冷。今 + 天,它对台儿沟表现了少有的冷漠:车窗全部紧闭着,旅客在昏黄的灯 + 光下喝茶、看报,没有人向窗外瞥一眼。那些眼熟的、常跑这条线的人 + 们,似乎也忘记了台儿沟的姑娘。 + +24 语文 必修上册 + 凤娇照例跑到第三节车厢去找她的“北京话”,香雪系紧头上的紫 +红色线围巾,把臂弯里的篮子换了换手,也顺着车身不停地跑着。她尽 +量高高地踮起脚尖,希望车厢里的人能看见她的脸。车上一直没有人发 +现她,她却在一张堆满食品的小桌上,发现了渴望已久的东西。它的出 +现,使她再也不想往前走了,她放下篮子,心跳着,双手紧紧扒住窗 +框,认清了那真是一只铅笔盒,一只装有吸铁石的自动铅笔盒。它和她 +离得那样近,如果不是隔着玻璃,她一伸手就可以摸到。 + + 一位中年女乘务员走过来拉开了香雪。香雪挎起篮子站在远处继续 +观察。当她断定它属于靠窗那位女学生模样的姑娘时,就果断地跑过去 +敲起了玻璃。女学生转过脸来,看见香雪臂弯里的篮子,抱歉地冲她摆 +了摆手,并没有打开车窗的意思。不知怎么的她朝车门跑去,当她在门 +口站定时,还一把扒住了扶手。如果说跑的时候她还有点儿犹豫,那么 +从车厢里送出来的一阵阵温馨的、火车特有的气息却坚定了她的信心, +她学着“北京话”的样子,轻巧地跃上了踏板。她打算以最快的速度跑 +进车厢,以最快的速度用鸡蛋换回铅笔盒。也许,她所以能够在几秒钟 +内就决定上车,正是因为她拥有那么多鸡蛋吧,那是四十个。 + + 香雪终于站在火车上了。她挽紧篮子,小心地朝车厢迈出了第一 +步。这时,车身忽然颤动了一下,接着,车门被人关上了。当她意识 +到眼前发生了什么事时,列车已经缓缓地向台儿沟告别了。香雪扑在 +车门上,看见凤娇的脸在车下一晃。看来这不是梦,一切都是真的, +她确实离开姐妹们,站在这既熟悉又陌生的火车上了。她拍打着玻 +璃,冲凤娇叫喊:“凤娇!我怎么办呀,我可怎么办呀!” + + 列车无情地载着香雪一路飞奔,台儿沟刹那间就被抛在后面了。下 +一站叫西山口,西山口离台儿沟三十里。 + + 三十里,对于火车、汽车真的不算什么,西山口在旅客们闲聊之中 +就到了。这里上车的人不少,下车的只有一位旅客,那就是香雪。她胳 +膊上少了那只篮子,她把它塞到那个女学生座位下面了。 + + 在车上,当她红着脸告诉女学生,想用鸡蛋和她换铅笔盒时,女学 +生不知怎么的也红了脸。她一定要把铅笔盒送给香雪,还说她住在学校 +吃食堂,鸡蛋带回去也没法吃。她怕香雪不信,又指了指胸前的校徽, +上面果真有“矿冶学院”几个字。香雪却觉着她在哄她,难道除了学校 +她就没家吗?香雪一面摆弄着铅笔盒,一面想着主意。台儿沟再穷,她 +也从没白拿过别人的东西。就在火车停顿前发出的几秒钟的震颤里,香 +雪还是猛然把篮子塞到女学生的座位下面,迅速离开了。 + + 第一单元 25 + 车上,旅客们曾劝她在西山口住一夜再回台儿沟。热情的“北京 + 话”还告诉她,他爱人有个亲戚就住在站上。香雪并没有住,更不打 + 算去找“北京话”的什么亲戚,他的话倒使她感到了委屈,她替凤娇 + 委屈,替台儿沟委屈。她只是一心一意地想:赶快走回去,明天理直气 + 壮地去上学,理直气壮地打开书包,把“它”摆在桌上。车上的人既不 + 了解火车的呼啸曾经怎样叫她像只受惊的小鹿那样不知所措,更不了解 + 山里的女孩子在大山和黑夜面前到底有多大本事。 + + 列车很快就从西山口车站消失了,留给她的又是一片空旷。一阵寒 + 风扑来,吸吮着她单薄的身体。她把滑到肩上的围巾紧裹在头上,缩起 + 身子在铁轨上坐了下来。香雪感受过各种各样的害怕,小时候她怕头 + 发,身上沾着一根头发择不下来,她会急得哭起来;长大了她怕晚上一 + 个人到院子里去,怕毛毛虫,怕被人胳肢(凤娇最爱和她来这一手)。 + 现在她害怕这陌生的西山口,害怕四周黑幽幽的大山,害怕叫人心跳的 + 寂静,当风吹响近处的小树林时,她又害怕小树林发出的窸窸窣窣的声 + 音。三十里,一路走回去,该路过多少大大小小的林子啊! + + 一轮满月升起来了,照亮了寂静的山谷、灰白的小路,照亮了秋日 + 的败草、粗糙的树干,还有一丛丛荆棘、怪石,还有漫山遍野那树的队 + 伍,还有香雪手中那只闪闪发光的小盒子。 + + 她这才想到把它举起来仔细端详。她想,为什么坐了一路火车,竟 + 没有拿出来好好看看?现在,在皎洁的月光下,她才看清了它是淡绿色 + 的,盒盖上有两朵洁白的马蹄莲。她小心地把它打开,又学着同桌的样 + 子轻轻一拍盒盖,“嗒”的一声,它便合得严严实实。她又打开盒盖, + 觉得应该立刻装点东西进去。她从兜里摸出一只盛擦脸油的小盒放进 + 去,又合上了盖子。只有这时,她才觉得这铅笔盒真属于她了,真的。 + 她又想到了明天,明天上学时,她多么盼望她们会再三盘问她啊! + + 她站了起来,忽然感到心里很满意,风也柔和了许多。她发现月 + 亮是这样明净。群山被月光笼罩着,像母亲庄严、神圣的胸脯;那秋 + 风吹干的一树树核桃叶,卷起来像一树树金铃铛,她第一次听清它们 + 在夜晚,在风的怂恿下“豁啷啷”地歌唱。她不再害怕了,在枕木上 + 跨着大步,一直朝前走去。大山原来是这样的!月亮原来是这样的! + 核桃树原来是这样的!香雪走着,就像第一次认出养育她成人的山谷。 + 台儿沟呢?不知怎么的,她加快了脚步。她急着见到它,就像从来没 + 见过它那样觉得新奇。台儿沟一定会是“这样的”:那时台儿沟的姑 + 娘不再央求别人,也用不着回答人家的再三盘问。火车上的漂亮小伙 + +26 语文 必修上册 + 子都会求上门来,火车也会停得久一些,也许三分、四分,也许十分、 +八分。它会向台儿沟打开所有的门窗,要是再碰上今晚这种情况,谁 +都能从从容容地下车。 + + 今晚台儿沟发生了什么事?对了,火车拉走了香雪,为什么现在她 +像闹着玩儿似的去回忆呢?四十个鸡蛋也没有了,娘会怎么说呢?爹不 +是盼望每天都有人家娶媳妇、聘闺女吗?那时他才有干不完的活儿,他 +才能光着红铜似的脊梁,不分昼夜地打出那些躺柜、碗橱、板箱,挣回 +香雪的学费。想到这儿,香雪站住了,月光好像也黯淡下来,脚下的枕 +木变成一片模糊。回去怎么说?她环视群山,群山沉默着;她又朝着近 +处的杨树林张望,杨树林窸窸窣窣地响着,并不真心告诉她应该怎么 +做。是哪儿来的流水声?她寻找着,发现离铁轨几米远的地方,有一道 +浅浅的小溪。她走下铁轨,在小溪旁边蹲了下来。她想起小时候有一回 +和凤娇在河边洗衣裳,碰见一个换芝麻糖的老头。凤娇劝香雪拿一件旧 +汗褂换几块糖吃,还教她对娘说,那件衣裳不小心叫河水给冲走了。香 +雪很想吃芝麻糖,可她到底没换。她还记得,那老头真心实意等了她半 +天呢。为什么她会想起这件小事?也许现在应该骗娘吧,因为芝麻糖怎 +么也不能和铅笔盒的重要性相比。她要告诉娘,这是一个宝盒子,谁用 +上它,就能一切顺心如意,就能上大学、坐上火车到处跑,就能要什么 +有什么,就再也不会被人盘问她们每天吃几顿饭了。娘会相信的,因为 +香雪从来不骗人。 + + 小溪的歌唱高昂起来了,它欢腾着向前奔跑,撞击着水中的石块, +不时溅起一朵小小的浪花。香雪也要赶路了,她捧起溪水洗了把脸,又 +用沾着水的手抿光被风吹乱的头发。水很凉,但她觉得很精神。她告别 +了小溪,又回到了长长的铁路上。 + + 前边又是什么?是隧道,它愣在那里,就像大山的一只黑眼睛。香 +雪又站住了,但她没有返回去,她想到怀里的铅笔盒,想到同学们惊羡 +的目光,那些目光好像就在隧道里闪烁。她弯腰拔下一根枯草,将草茎 +插在小辫里。娘告诉她,这样可以“避邪”。然后她就朝隧道跑去。确 +切地说,是冲去。 + + 香雪越走越热了,她解下围巾,把它搭在脖子上。她走出了多少 +里?不知道。尽管草丛里的“纺织娘”“油葫芦”总在鸣叫着提醒她。 +台儿沟在哪儿?她向前望去,她看见迎面有一颗颗黑点在铁轨上蠕动。 +再近一些她才看清,那是人,是迎着她走过来的人群。第一个是凤娇, +凤娇身后是台儿沟的姐妹们。 + + 第一单元 27 + 香雪想快点跑过去,但脚为什么变得异常沉重?她站在枕木上,回 + 头望着笔直的铁轨,铁轨在月亮的照耀下泛着清淡的光,它冷静地记载 + 着香雪的路程。她忽然觉得心头一紧,不知怎么的就哭了起来,那是欢 + 乐的泪水、满足的泪水。面对严峻而又温厚的大山,她心中升起一种从 + 未有过的骄傲。她用手背抹净眼泪,拿下插在辫子里的那根草茎,然后 + 举起铅笔盒,迎着对面的人群跑去。 + + 山谷里突然爆发了姑娘们欢乐的呐喊。她们叫着香雪的名字,声音 + 是那样奔放,热烈;她们笑着,笑得是那样不加掩饰,无所顾忌。古老 + 的群山终于被感动得战栗了,它发出洪亮低沉的回音,和她们共同欢 + 呼着。 + + 哦,香雪!香雪! + + 1982 年 6 月 + + 学习提示 + + 《百合花》所讲的故事发生在解放战争时期。小说写部队发起总攻之前,小通讯 + 员和“我”到包扎所向一个刚过门三天的新媳妇借被子以及此后发生的故事,表现 + 了战火中的青春美和人性美。阅读时注意那些感人的细节描写,如新媳妇发现重伤 + 的是小通讯员,于是一针一针缝补他衣服上的破洞,后来又将自己新婚时的被子盖 + 在了小通讯员的遗体上。想一想这篇战争题材的小说为何格外让人心动,重点把握 + 小说对人物形象的刻画,体会革命战争年代特有的崇高情操。 + + 《哦,香雪》写的是改革开放之初火车的开通给边远山村带来的新鲜事儿。小说 + 没有激烈的冲突和曲折的故事,只是捕捉了几个小的生活场景,细致入微地描绘了 + 香雪等几位姑娘的心理变化与情感波澜,折射出山村生活的新变化。“香雪们”青春 + 的纯真和质朴,让人感受到生命的美好。阅读时注意欣赏小说清新的笔调,以及洋 + 溢在淡雅文字中的诗情画意。 + +28 语文 必修上册 + 单元学习任务 + +一 本单元作品抒发的都是青春情怀。作品中的哪些地方最让你感动?哪些是你以前未曾留 + 意,而读过之后感受很深的?哪些已经点燃了你思考人生、积极上进的热情?认真阅 + 读、欣赏这些作品,从你最有感触的一点出发,与同学就“青春的价值”这一话题展 + 开讨论。 + +二 反复诵读本单元诗歌作品,围绕“意象”和“诗歌语言”探讨欣赏诗歌的方法,揣摩 + 作品的意蕴和情感,感受不同的风格。 + 1. 五首诗歌风格各异,但诗人都善于运用意象来表达自己的情思。任选一首,想一 + 想:诗中运用了哪些意象?这些意象有怎样的特点?激发了你怎样的情思?如何 + 通过意象来欣赏诗歌?记录下自己的思考,写一则札记。 + 2. 查找毛泽东《沁园春·长沙》的写作背景资料,建议阅读埃德加·斯诺的《毛泽 + 东自传》,了解毛泽东青年时期的革命经历,加深对这首词主旨的理解。还要注意 + 感受词作的意境,抓住“红遍”“尽染”“碧透”等富有表现力的词语来欣赏这首 + 词。选取自己印象最深的一点进行分析并与同学交流。 + 3. 任选一首诗,有感情地朗读,把你对诗作的理解通过朗读表达出来。同学之间相 + 互点评。 + +三 《百合花》写的是战争年代一名革命军人的牺牲,《哦,香雪》写的是改革开放初期山 + 村少女对现代生活的向往。两篇小说的时代背景不同,表现的青春情怀却都是那样感 + 人。阅读时要联系特定的历史背景来理解作品的内涵,结合自己的阅读感受欣赏小说 + 的描写艺术。从两篇小说中各选择一两个感人的片段,揣摩人物的心理活动,分析典 + 型的细节描写,并作简要点评。 + +四 青春之美,在人的一生中是弥足珍贵的。结合本单元诗作和能够引发你思考的其他作 + 品,发挥想象写一首诗,抒写你的青春岁月,给未来留下宝贵的记忆。注意借鉴本 + 单元诗歌在意象选择、语言锤炼等方面的手法,使诗作多一些“诗味”。汇总所有 + 同学的诗作,全班合作编辑一本诗集作为青春的纪念。 + + 第一单元 29 + 学写诗歌 + + 诗歌是情感的艺术。激发诗情和灵感,需要生活的体验和积累,需要把握时代的 + 脉搏。毛泽东的《沁园春·长沙》作于反帝反封建斗争风起云涌、工农运动蓬勃发展 + 的时代,至今都能让人感受到诗人炽热的情感、豪迈的气概。如果我们平时多关注现 + 实,注重对生活的观察和领悟,诗情就会不期而至,也就能从中提炼出抒情的主题。 + + 诗歌需要形象。思想感情与具体形象相融合,就形成意象。通过意象抒发自己的 + 诗情和意趣,诗歌就会产生特有的艺术感染力。在闻一多的《红烛》中,诗人通过对 + 红烛这一核心意象的层层渲染和开掘,赋予它丰富的内涵和情感。昌耀的《峨日朵雪 + 峰之侧》一诗中,诗人情感的变化和对人生的思考是通过几个意象的组合实现的。雪 + 莱的《致云雀》以云雀为中心组成密集的意象群,表达诗人奔放的激情和坚定的理想。 + 写作诗歌时,最好不要直接说出你想表达的思想感情,而要通过具体的形象,运用比 + 喻、象征等方式来暗示。总之,要婉转曲折地表达才能耐咀嚼,有诗味。 + + 诗歌富于音乐性。这种音乐性来自诗歌的韵律和节奏。诗歌写作要安排好韵律和节 + 奏,以适合所要表达的情感意蕴,否则作品就会缺少韵味。郭沫若《立在地球边上放号》 + 的雄奇奔放、雪莱《致云雀》的浪漫激情,与作品的韵律节奏是协调一致的。在写作时, + 韵律和节奏的安排要与情感的表达相统一。写好后还要反复朗读,边读边改,以期取得 + 理想的表达效果。 + + 情感、意象、韵律等都要落实到语言上。诗歌的语言必须凝练、含蓄,给人以联想和想 + 象的空间,达到言有尽而意无穷的效果。一首诗中,如果有一些词句能让人眼前一亮,自然 + 能给人留下深刻印象。 + +30 语文 必修上册 + 第二单元 + + 劳动改造世界,劳动创造文明。崇尚劳动,尊 + 重劳动,热爱劳动,是中华民族世代相传的美德; + 无私奉献,锐意进取,勇于创造,是新时代青年应 + 该树立的劳动观念。 + + 本单元作品,或报道优秀劳动者的杰出事迹, + 或倡导践行工匠精神,或歌咏劳动的美好与欢乐, + 从不同角度彰显劳动的伟大意义,体现劳动精神的 + 传承和发展。 + + 学习本单元,通过专题研讨等活动,深入体会 + “劳动最光荣、劳动最崇高、劳动最伟大、劳动最 + 美丽”的思想,形成正确的劳动观念。学会分析通 + 讯的报道角度,理解事实与观点的关系,抓住典型 + 事件,把握人物精神;了解新闻评论的观点,学习 + 阐述观点的方法;辨析和把握新闻的报道立场,提 + 升媒介素养。 + 4 + + 喜看稻菽千重浪 a + + ——记首届国家最高科技奖获得者袁隆平 + + 沈英甲 + + 曾记否,到中流击水 + + 2001 年春节过后的第二天,湖南长沙马坡岭笼罩在薄雾之中,空 +中不时飘下雨点。袁隆平眯起双眼,出神地打量着这几百亩 b 试验田, +然后跨过水渠,迈步走进田间。他蹲下身子翻看着土壤。 + + 我跟随在他身后不禁产生了瞬间的错觉:这难道就是几天后就要赴 +京,领取由国家主席亲自签署、颁发的国家最高科技奖的科学家吗?他 +看上去更像一个地道的湖南农民,这使我想起了农民送给他的“泥腿子 +专家”“泥腿子院士”的称谓。 + + 挽起裤腿走下稻田,是人们从播种到收获季节见到的袁隆平最“标 +准”的形象。人们常提出的一个疑问是:中国的稻田里如何走出了袁隆 +平这样一位世界级的农业科学家? + + 中国在现在和将来相当长的岁月里,都是一个农业大国,“民以食 +为天”的说法自古流传。到了当代,农民出身的毛泽东说,世界上什么 +事情最大,吃饭的事情最大。 + + 20 世纪五六十年代我国普遍发生的饥馑给袁隆平留下了刻骨铭心的印 +象。那时在湖南一所偏僻山村农校──湘西雪峰山麓的安江农校任教的青 +年袁隆平便下定决心,拼尽毕生精力用农业科技战胜饥饿。他在 1961 年 +发现“天然杂交稻株”的往事,注定要成为世界农业史上的经典事例。 + + 那是 1961 年 7 月的一天,下课铃声响过之后,袁隆平拍去身上的粉 +笔灰尘,掖着讲义夹,匆匆来到校园外的早稻试验田。采用常规法培育 + +a 选自 2001 年 2 月 22 日《科技日报》。选入教材时由 稻 的 杂 交 优 势 成 功 应 用 于 生 产 的 科 学 家, 被 誉 为 + 作 者 本 人 做 了 改 动。“ 喜 看 稻 菽(shū)千重浪” “杂交水稻之父”。 + 语 出 毛 泽 东《 七 律· 到 韶 山 》。 菽, 豆 类 的 总 称。 b 〔亩〕计量土地面积的市制单位,按现行法定计量单 + 袁隆平(1930—2021),农学家、杂交水稻育种专 + 家。他是杂交水稻研究的先驱,世界上第一个将水 位换算,1 公顷等于 15 亩,1 亩合 666.7 平方米。 + +32 语文 必修上册 + 袁隆平 + +出来的早稻常规品种正在勾头散籽,呈现一派丰收景象。袁隆平把讲义夹 +放在田埂上,走下稻田一行行地观察起来。突然,他那敏锐的目光停留在 +一蔸a 形态特异、鹤立鸡群的水稻植株上。他屏气静神地伸出双手,欣喜 +地抚摸着那可爱的稻穗,激动得几乎要喊出声来! + + 这是一株奇特的稻禾,株形优异,穗大粒多,足有十余穗,每穗有 +壮谷一百六七十粒。袁隆平用布条扎上记号,从此格外精心地照顾这蔸 +稻禾。收获季节他得到了一把金灿灿的稻种。第二年春天,袁隆平把这 +些种子播种到试验田里,期待收获有希望的新一代稻种。可是当秧苗长 +高之后,袁隆平发现,它们高的高,矮的矮,成熟得也很不一致,迟的 +迟,早的早,没有哪一蔸的性状超过它们的前代。 + + 一种失望的情绪掠过袁隆平心头,但是对孟德尔 b、摩尔根 c 遗传 +学有着深入研究的袁隆平进而想到,从遗传学的分离律观点看,纯种水 +稻品种的第二代是不会有分离的,只有杂种第二代才会出现分离现象。 +今年它的后代既然发生分离,那么可以断定去年发现的性状优异稻株是 +一株“天然杂交稻”的杂种第一代。 + + 他返回试验田对那些出现分离的稻株进行研究,高的、矮的、早 +熟、迟熟……一一做了详尽记录。经过反复统计计算,袁隆平证明,这 +次发现完全符合孟德尔的分离规律。 + + 袁隆平的实践让他发现了真理:只要探索出其中规律,就一定能培 + +a 〔蔸(dōu)〕方言,相当于“棵”或“丛”。 c 〔 摩 尔 根(1866—1945)〕 美国胚胎学家、遗传学 +b 〔孟德尔(1822—1884)〕奥地利遗传学家,遗传学 家,获得 1933 年诺贝尔生理学或医学奖。 + + 的奠基人。 第二单元 33 + 育出人工杂交稻,也就一定能把这种优势应用到生产上,从而大幅度提 + 高水稻的产量。 + + 后面我们将看到,袁隆平对真理的发现,使他不可避免地要向国际 + 知名的权威和他们的权威结论发起挑战,这种挑战之艰难往往使挑战者 + 身心俱疲,落荒而去。 + + 创新是科学家的灵魂和本质 + + 有人说,袁隆平具有敢于挑战的勇气和信心。他在决定选择水稻杂 + 种优势利用作为自己的攻关方向时,并不知道世界上已有美国、日本等 + 国的科学家从事过研究,但没有成功。这无疑是一道世界难题。况且, + 他还得顶着研究水稻杂种优势利用是“对遗传学的无知”等权威学者的 + 指责和压力。他根据自己的实践,以科学家的胆识和眼光断定杂交水稻 + 研究具有光辉的前景,他决心义无反顾地坚持研究。 + + 因为水稻是自花授粉作物,“自花授粉作物自交不退化,因而杂交 + 无优势”的论断明白无误地写在美国著名遗传学家辛诺特和邓恩的经典 + 著作、20 世纪五六十年代美国大学教科书《遗传学原理》中,由此有 + 人嘲笑“提出杂交水稻课题是对遗传学的无知”。 + + 在理论与事实发生矛盾时,袁隆平的态度是尊重权威但不崇拜权 + 威,不能跟在权威后面亦步亦趋,不敢越雷池一步。他不迷信权威的每 + 一个观点。他知道,自己直接观察到的一些事实表明水稻具有杂种优 + 势,“无优势论”是没有试验依据的推论,这一推论与自交系的杂交优 + 势现象相矛盾,袁隆平坚信搞杂交水稻研究有前途,勇敢地向“无优势 + 论”这一传统观念挑战,从而拉开了我国水稻杂种优势利用的序幕。 + + 袁隆平认为,水稻的杂种优势利用只有两条路可走:一条是进行人 + 工去雄 a,如果用人工去雄杂交,就得一朵花一朵花进行,产生的种子 + 数量极为有限,不可能在生产上推广应用;再一条路就是培育出一个雄 + 蕊不育的“母稻”,即雄性不育系,然后用其他品种的花粉去给它授粉 + 杂交,产生出用于生产的杂交种子。然而国内外都没有这一先例,甚至 + 有著名学者断言这“不可能”。还有学者认为,像水稻这样一朵花只结 + 一粒种子的“单颖果作物”,利用杂种优势必然制种困难,无法应用于 + +a 〔去雄〕植物有性杂交的工作步骤之一,即除去或杀 + 死母本花朵中雄蕊的措施。 + +34 语文 必修上册 + 生产。在独立开展杂交水稻研究很长时间之后,袁隆平才从国外资料中 +了解到,早在 1926 年,美国的琼斯就发现了水稻杂种优势现象。最早 +开展这项研究的是日本的科学家,时为 20 世纪 50 年代。此外美国、国 +际水稻研究所的科学家也相继开始了这项研究。尽管实验手段先进,但 +都因这项研究难度确实太大,无法在生产中得到应用。 + + 袁隆平不打算退却,他很清楚他拥有的有利条件是其他国家科学家 +少有的:进行这项研究,中国有中国的有利条件,中国是古老的农业 +国,又是最早种植水稻的国家之一,有众多的野生稻和栽培稻品种,蕴 +藏着丰富的种质资源;有辽阔的国土和充足的光温条件,海南岛是理想 +的天然温室,育种者的乐园;更重要的是我们有优越的社会主义制度, +可以组织科研协作攻关;有党的正确领导,任何困难都可以组织力量克 +服。直到今天,袁隆平都对为攻克杂交水稻难关在全国 13 个省区的 18 +个科研单位进行的科研大协作感慨不已,认为没有这样的大协作,杂交 +水稻研究绝不会取得今天这样世界瞩目的成果。 + + 1964 年 7 月 5 日,“泥腿子专家”袁隆平又走进了安江农校的稻田, +去寻找水稻的天然雄性不育株。他头顶烈日脚踩淤泥弯腰驼背去寻找这 +种天然雄性不育株,已是第 14 天了。突然他的目光停留在一株雄花不 +开裂、性状奇特的植株上,这正是退化了的雄蕊。他马上把这株洞庭 +早籼 a 天然雄性不育株用布条标记。袁隆平欣喜异常,水稻雄性不育植 +株,终于找到了。 + + 两年后,袁隆平的一篇论文《水稻的雄性不孕性》发表,它宣示了 +袁隆平培育杂交水稻的理论设想和实现途径,开创了水稻研究的新纪元。 + + 事实是科学家的空气 + + 科学家是真理的侍者,是事实的追随者。袁隆平坚信实践能发现 +事实,发现真理,并能验证真理。他对中国亿万农民怀有深厚的感 +情,在国家杂交水稻工程技术研究中心的稻田中,他一边甩去手上的 +泥巴一边对我说,农民不富裕谈不到现代化,单产上不去农民就富不 +起来。现在我们试验田种的杂交稻每亩产 700 千克,农民种的亩产能 +达到 800 千克甚至更高,因为他们大量采用有机肥。还有比这更令他 + +a 〔洞庭早籼(xiān)〕籼稻早稻品种之一。籼,指籼 + 稻,水稻的一类。 + + 第二单元 35 + 欣慰的事吗? + 凡是涉及不顾农民利益、无视事实的事,他都能挺身而出毫不含糊 + + 地阐明事实,至于是不是得担风险,袁隆平在所不计。 + 前些年一家有影响的报纸在头版刊登了一篇贬斥杂交稻的文章, + + 说杂交稻是“三不稻”——“米不养人,糠不养猪,草不养牛”。这 + 种不顾事实的说法给农业科研人员和广大农民心头蒙上了阴影。袁隆 + 平写了一封信寄给了《人民日报》,凭着他杰出的学识和无与伦比的 + 实践,用事实说明“杂交稻既能高产又能优质”。1992 年 6 月 18 日, + 《人民日报》在第二版刊登了袁隆平的来信。 + + 信中,袁隆平用平和的语气、无可辩驳的事实说:最近社会上流传 + 杂交稻米质太差,有人贬杂交稻为“三不稻”,说什么“米不养人,糠 + 不养猪,草不养牛”。果真是这样吗?我想用事实来回答。我国是世界 + 上第一个在生产上利用水稻杂种优势的国家,杂交稻比一般水稻每亩增 + 产 100 千克左右。1976 ─ 1991 年全国累计种植杂交稻 19 亿多亩,增产 + 粮食近 2000 亿千克。由此可见,杂交水稻的推广,对解决我国 11 亿人 + 口的温饱问题发挥了极其重要的作用。目前,全国种植面积最大、产量 + 最高的一个水稻良种“汕优 63”是杂交稻。近几年的年种植面积都超 + 过 1 亿亩,平均亩产稳定在 500 千克左右,不仅产量高而且品质好,被 + 评为全国优质籼稻米。的确,在我国南方生产的稻谷中,有相当一部分 + 米质较差,这主要是双季早稻。目前积压的稻谷以及历年来粮店出售的 + 大米,大多数为这种早籼稻。他写道,双季晚稻和一季中稻一般品质较 + 好,粮店偶尔出售这种稻米时,则出现排长队争购的现象。而杂交稻则 + 占双季晚稻和中稻面积的 80%左右,产量占 90%以上。因此,说杂交 + 稻属劣质米与事实不符。 + + 袁隆平进而写道,其实,杂交稻、常规稻与任何其他农作物一样, + 品种不同,产量和品质是有差别的,有的甚至相差很大。一般地说,大 + 多数杂交稻品种的米质属于中等,其中也有个别杂交稻品种的米质较 + 差,但绝不能以个别品种的优劣来概括一般。 + + 就这样,袁隆平捍卫了事实,也捍卫了真理。 + + 饥饿的威胁在退却 + + 在一次电视台举办的活动上,主持人问作为特邀嘉宾参加活动的袁 + 隆平是不是也做梦,梦见过什么。 + +36 语文 必修上册 + 袁隆平是一位世界级的伟大科学家,同时也是一个凡人,当然要 +做梦。他高兴地回答:他曾经梦见水稻长得像高粱那么高,稻穗像扫 +帚那么大。真是日有所思夜有所梦,不过这极具夸张的梦想,正在走 +向现实。 + + 1986 年,袁隆平在总结国内外水稻杂种优势利用经验的基础上, +根据已掌握的新材料,提出了杂交水稻育种的战略设想。在他的著名论 +文《杂交水稻的育种战略设想》中他提出,若将杂交稻的强优势固定下 +来,就可以免除年年制种,成为一系法杂交稻。 + + 作为世界公认的“杂交水稻之父”,袁隆平客观地分析了现阶段培 +育的杂交稻的缺点,并把这些缺点概括为“三个有余,三个不足”:前 +劲有余,后劲不足;分蘖 a 有余,成穗不足;穗大有余,结实不足。他 +主持的“两系法亚种间杂种优势利用”研究课题通过了国家“863 计 +划”论证,正式立项开展研究,袁隆平担任了国家“863—101—01”专题 +的责任专家。1995 年,两系杂交稻基本研究成功,被中国科学院、中 +国工程院评为 1996 年全国十大科技进展新闻,并列为榜首。 + + 1997 年,袁隆平发表了《杂交水稻超高产育种》重要论文。1998 +年 8 月在北京召开的第 18 届国际遗传学大会上和 9 月在埃及开罗召开的 +第 19 届国际水稻会议上,袁隆平发言:由于采取了形态改良与杂种优 +势利用有机结合的技术路线,中国在培育超级稻方面已走在世界前列。 +经过中国许多科学家 10 多年的协作研究,目前技术上的难题已基本解 +决。袁隆平预计,亚种间超级杂交稻将在近几年内应用于生产,并将在 +21 世纪初大面积生产中发挥巨大的增产作用。 + + 杂交水稻的研究成功开辟了粮食大幅度增产的新途径,大面积推 +广给我国水稻生产带来了一次飞跃。有人统计过,杂交水稻比常规稻 +增产 20%左右,1976 ─ 1999 年,每年增产的稻谷可以养活 6000 万人 +口,为从根本上解决我国粮食自给自足难题作出了重大贡献。 + + 1997 年,袁隆平提出了超级杂交稻选育的指标、株型模式和技术 +路线,选育出一批具有超高产潜力、米质优良的亚种间苗头组合,小 +面积最高产量达每亩 1139 千克(每公顷日产 107.4 千克),达到了日 +产量 100 千克/公顷的超级稻产量指标。如果按年推广 2 亿亩计,年 +增粮食可养活 7000 多万人口。袁隆平对我说,这是对看上去表情显 +得十分深沉的美国经济学家布朗“未来谁来养活中国”疑问的有说服 + +a 〔分蘖(niè)〕稻、麦、甘蔗等植物发育的时候, + 在幼苗靠近土壤的茎节上生出分枝。 + + 第二单元 37 + 力的回答。 + 美 国 学 者 唐· 帕 尔 伯 格 在 他《 走 向 丰 衣 足 食 的 世 界 》 一 书 中 写 + + 道:袁隆平使“饥饿的威胁在退却,袁正引导我们走向一个营养充足的 + 世界”。 + + 在各国水稻科研工作者心目中,位于长沙马坡岭的国家杂交水稻工 + 程技术研究中心已成为圣地。 + + 近十几年来,杂交水稻不断走向世界,已在 20 多个国家和地区 + 引种推广,这项技术是我国转让给美国的第一项农业科技专利。 + + 袁隆平是在世界上最有影响的中国科学家之一,他正在引导一场新 + 的“绿色革命”。 + + a + + 心有一团火,温暖众人心 + + 林为民 + + 初冬的早晨,寒气袭人。我们随着熙熙攘攘的人流,走进百货大楼。 + 嗬,糖果组的柜台前好热闹!人们拥挤在柜台前,看一位戴着劳动 + 模范胸章的老售货员卖糖果。他站在柜台里的那股精神劲儿,售货动作 + 的迅速劲儿,接待顾客的热情劲儿,像一团火一样,把大家深深地吸引 + 住了。顾客们悄悄议论道: + “他就是劳动模范张秉贵 b !” + “你瞧他拿糖,一抓就准。” + “他卖得真快,又那么热情,让人心里暖乎乎的。” + 一位抱小孩的女顾客来买糖,还没轮到她买,孩子就哭闹起来, + 嚷着要吃糖。只见张秉贵从货柜里拿起一块糖,放到孩子手里,孩子 + 顿时止住了哭声。老张又对这位顾客说:“这块糖等会儿一块儿算账。” + 她感激地点点头。过了一会儿,轮到她买糖时,老张从称好的糖果中 + +a 选自《北京日报创刊 60 周年纪念文集·优秀新闻作 售货员,全国劳动模范。他一心一意为人民服务, + 品集》(同心出版社 2012 年版)。原载 1977 年 12 月 练 就 了 称 糖“ 一 抓 准 ”、 算 账“ 一 口 清 ” 的 本 领, + 24 日《北京日报》。 以“一团火”的服务精神树起我国商业战线上的一 + 面旗帜。 +b〔 张秉贵(1918—1987)〕北京人,北京市百货大楼 + +38 语文 必修上册 + 张秉贵 + +拿出一块放回货柜里,又拿出几块用小纸袋装好,塞进孩子的衣兜里, +把剩下的糖果包捆结实递给顾客,嘱咐道:“孩子兜里的糖,留他路上 +吃。”这位顾客激动地对孩子说:“快谢谢爷爷!”孩子天真而又亲昵 +地叫了声:“爷爷!”周围的顾客不约而同地笑起来,赞扬张秉贵比当 +妈妈的想得还周到。人们常用体贴入微来形容张秉贵的服务态度。糖 +果组的柜台前,还发生过这样一件事:有一次,张秉贵在卖糖时,发 +现排在队尾的一位顾客,一会儿看看手表,一会儿又抬头看看墙上的 +电 钟, 神 色 不 安。 他 忙 问 这 位 顾 客:“ 您 有 什 么 急 事 吗?”“ 我 急 着 +赶火车,再有半小时就开了,可我又想买点首都的糖果……”老张立 +即征得前面顾客的同意,很快给他称完糖,又告诉他应该在哪儿坐车 +去火车站。他连声道谢。老张说:“你要谢就谢大家,这是同志们的 +支持。” + + 张秉贵 22 年来,没有对顾客发过一次火,红过一次脸,态度总是 +那么和蔼可亲。有人问,难道张秉贵从来没遇到过不讲理的个别顾客? +张秉贵说:“我们为人民服务,就要完全彻底,遇到个别顾客冷,绝不 +能以冷对冷,而要以热对冷,变冷为热。”一天中午,商店里的人不多, +一位女顾客气呼呼地来到糖果柜台前,张秉贵满面笑容地问她: + + “同志,您想买点儿什么糖?” + “不买,难道不能看看吗!” + 说完,这位顾客连看都不看张秉贵一眼,绷着脸从中间柜台向东头 + + 第二单元 39 + 柜台走。张秉贵也随着她向柜台东头走去,边走边想:她准是遇到了什 + 么不顺心的事,越是这样,我越是要热情接待她。张秉贵一边走,一边 + 还是那样和颜悦色地说:“最近从上海来了几种新糖果,味道还不错,您 + 想看看吗?我向您介绍一下……”顾客被张秉贵那火一般的热情感动了, + 她抱歉地说:“刚才我冲您发火,您没见怪吧,我那孩子不吃饭就去游 + 泳,气得我真想揍他。您瞧,刚进大楼那阵儿,我的气还没消呢!” + + “您教育孩子是应该的,可要注意方法,不能打孩子。” + “您的服务态度真好,我无缘无故向您发火,您还这样耐心做我的 + 思想工作……” + 打这以后,这位顾客每次来百货大楼,都要到糖果柜台前来看望 + 老张。 + 张秉贵服务态度这样好,有人问他:“难道你自己就没有过不顺心 + 的事吗?”张秉贵回答:“一个人哪能事事如意?不过,我们售货员一 + 进柜台,就要像解放军战士进入战斗岗位那样,把自己的事情放一边, + 全神贯注地去为人民服务。”1970 年 9 月,张秉贵老两口最心爱的唯一 + 的女儿得了重病,日夜说着胡话。张秉贵心神不定,坐卧不安。他把 + 女儿送进了医院,在上班的路上,边走边想:我是人民的售货员,每 + 天都要接待几百个顾客,自己遇上了不顺心的事儿,决不能让顾客不 + 顺心。于是,他用最大的毅力克制住内心的焦虑,像往常一样精神抖 + 擞地走进了柜台,满面笑容地接待顾客。 + + 张秉贵今年 59 岁,出身贫农家庭,从 10 岁起就在资本家的工厂当 + 童工,17 岁到私营的德昌厚食品店学徒,受尽了剥削阶级的压迫和凌 + 辱。新中国成立后,他翻了身,打心眼儿里感谢党和毛主席。1955 年 + 他刚到百货大楼时,认为只要为商店多销货、多卖钱,就是做好了本职 + 工作,报答了党的恩情,因此他比较注意抓大号买卖。一次,有位农民 + 顾客来买两块桃酥,张秉贵光照顾买得多的顾客,让这位顾客等了很长 + 时间。顾客生气地质问他:“你是不是嫌我买得少,看不起我?”这件 + 事深深地触动了张秉贵。党支部书记找他谈心,对他说:“过去资本家 + 做买卖,唯一的目的是赚钱。我们社会主义商店做买卖,首先要为人民 + 服务好。” + + 没过多久,张秉贵在柜台上遇到一件事,使他受到更深刻的教育。 + 一次,有位面带病容的女顾客来买糕点,她对张秉贵说:“我身体不好, + 一吃甜的就腻,你能帮助选择几种适合我吃的点心吗?”张秉贵详细 + 地介绍了各种糕点的味道,最后帮她挑了些略带咸味的鸡油芝麻饼和 + +40 语文 必修上册 + 牛舌饼。顾客感激地说:“你们的服务态度真好!”几天后,这位女顾 +客又来到柜台前,把一大包枣和梨放在柜台上,说:“这是我家乡出产 +的水果,特意送来让你们尝尝。”张秉贵急忙摆手谢绝,可是顾客已经 +跑出门了。夜里,张秉贵翻来覆去睡不着觉。他在德昌厚当伙计时遇到 +的一件事,又浮现在眼前。一个国民党兵痞来吃冰激凌,因为等了一会 +儿,就发起火来,一拳打在张秉贵的心口上,还恶狠狠地骂:“看你还 +敢把老子当生西瓜‘蹲’起来!”那时候啊,张秉贵有气往肚里咽,有 +泪朝心里流,挨了打,还要装出一副笑脸赔不是。忆往昔,看今天,他 +默默地想,现在我刚为人民做一点儿事,他们就把我当亲人相待,我有 +什么理由不全心全意为人民服务! 1958 年他入党后,想了又想,一个 +共产党员到底图什么?图的就是多为人民服务! + + 张秉贵常说:“我们售货员要用全心全意为人民服务的一团火,来 +温暖人民群众,使他们不仅在商店里感到热乎乎的,回到家里热乎乎 +的,走上工作岗位还要热乎乎的,激发出更大的革命干劲儿,投入社会 +主义建设,这才算我们对革命事业有了一点儿贡献。”为了当好顾客的 +参谋,他不知费了多少心血去熟悉自己柜台里的商品。公休日,他到糖 +果厂去参观访问,了解糖果的制作过程;下班后,他又到医院向医生学 +习各种糖果的营养知识;卖糖果时,他虚心向爱吃糖的顾客了解各种人 +吃糖的习惯和各种糖果的味道。几年来,他还自己花钱买了 230 多种糖 +果来品尝,并请同柜台的售货员一起尝。经过刻苦钻研,张秉贵的商品 +知识十分丰富,为群众服务也有更多的主动权了。遇到患肝炎的顾客, +老张就介绍买糖分多、对治肝病有好处的水果糖;遇到患气管炎的顾 +客,他就介绍买冰糖;对消化不良的顾客,他又请顾客买柠檬糖和橘子 +糖……在售货中,他严格要求自己,做到了顾客买与不买一个样,买多 +买少一个样,生人熟人一个样,大人孩子一个样。 + + 人们用“主动、热情、诚恳、耐心、周到”这 10 个字,来赞扬张 +秉贵的服务态度。每天,老张从早晨穿上工作服进入柜台,到晚上送 +走最后一位顾客,每分钟都是全力以赴。你看,他在柜台里,眼、耳、 +口、手、脚、脑这 6 部“机器”同时开动,他抬头售货,及时发现需 +要照顾的老弱病残顾客,随时倾听顾客的要求和意见,不断解答顾客 +的询问,还要不停地拿糖、过磅、包包、打捆,同时用心算代替算盘。 +在柜台里,他三步并作两步走,一点儿不知累,可晚上下班后,他就 +感到有些支持不住,有时连上楼还要扶着墙。 + + 张秉贵用自己心中的一团火温暖人民群众,赢得了广大顾客的爱戴 + + 第二单元 41 + 和尊敬。有时,当他累得额头渗满汗珠,顾客就按住秤盘说:“老同志, + 您先擦擦汗!”后边的也嚷道:“您喝口水,歇会儿再卖!”当他端起 + 缸子匆忙地喝着水,又有人对他说:“您喝足了,我们多等会儿没关 + 系……”这些热情的话,像一股股清泉涌进张秉贵的心田,他感到自己 + 的心和顾客的心紧紧地贴在一起了。不久前的一天,张秉贵去东风市场 + 一家饭馆吃夜宵。这里已经座无虚席,他买了一盘炒面站着吃起来。突 + 然,厨房里有位大师傅,举着凳子一边吆喝着闪道,一边朝他走来。人 + 没到话先到了:“您是百货大楼卖糖的那个老同志吧,我在您那儿买过 + 糖,快坐下来吃!您这么大岁数了,站一天柜台,够呛啊,该歇歇了。” + 说着把凳子放在张秉贵的身后,张秉贵不由得眼里有些湿润了。他又一 + 次感到:在我们的社会主义祖国,只有低人一等的思想,绝没有低人一 + 等的工作!商业、服务业既是平凡的工作,又是光荣的岗位,是伟大的 + 社会主义事业的重要组成部分。 + + 张秉贵为革命站柜台的先进事迹广为传颂,多年来受到全国各地 + 人民群众的赞扬,1977 年以来就收到 200 多封热情洋溢的信件。新 + 疆博尔塔拉蒙古自治州第三中学的 10 名学生写道:“张伯伯,我们要 + 像您一样,做革命的螺丝钉,党把我们拧在哪里,就在哪里闪闪发 + 光!”辽宁省阜新矿务局高德煤矿三八掘进队的女队长写道:“我要 + 像您一样热爱自己的工作,宁让煤尘粘满脸,不让资产阶级思想沾半 + 点!”一位路过北京的青年农民,晚上住在旅馆,从收音机里听到张 + 秉贵的先进事迹后,久久不能入睡。他从床上爬起来,披起衣服伏在 + 灯下,给张秉贵写了一首充满激情的诗: + + 您那感人肺腑的事迹, + 使我心中仿佛升起了一团火。 + …… + 请收下我这青年社员当徒弟, + 到了那金色的季节, + 在您笑迎顾客的同时, + 我正坐上喜送公粮的大车! + +42 语文 必修上册 + a + +“探界者”钟扬 + + 叶雨婷 + + 拟南芥,一种看起来细弱的草本植物,因为生长快、体型小、分布 +广、基因组小,常被植物学家比作“小白鼠”,是进行遗传学研究的好 +材料,全世界有众多植物学家都在研究它。 + + 在植物学家很少涉足的青藏高原,执着的钟扬团队发现了它。钟扬 +把拟南芥栽种在自己位于西藏大学安置房的后院中,把它做成标本带回 +了复旦大学。 + + 植物学家、科普达人、教育专家、援藏干部……哪一个身份都可以 +以一种完整的人生角色在他身上呈现。在生命的高度和广度上,他一直 +在探索自己的边界,直到他生命戛然而止的那一天…… + +“英雄”少年 + + 1978 年,湖北黄冈一所中学的大操场上举行隆重的欢送仪式,庆 +祝恢复高考后的第一届大学生即将入学,4 名考上大学的同学胸前戴着 +大红花,像英雄一般。 + + 钟扬也渴望成为那样的“英雄”。父亲是当地的招办主任,为了避嫌, +父亲不让他以在读生身份提前参加高考。在与父亲赌气的同时,钟扬参加 +了中国科学技术大学少年班的考试。当时的竞争非常激烈,就在钟扬差点 +儿失去信心的时候,他接到了通知——考上了! + + 这个 15 岁考入中科大无线电专业的少年,开始了他“不安分”的 +人生。 + + 钟扬的母亲回忆,钟扬在考上少年班以后就开始补习数学、物理, +因为老师说他这两门考得不好。进入大学以后,钟扬一边忙着学生会宣 +传委员的事务,一边坚持每月往家里写信。 + + 那时,学习无线电专业的他对植物学产生了浓厚的兴趣,因此转向 + +a 选自《时代楷模 2018 钟扬》(学习出版社 2018 年 + 版 )。 有 删 改。 钟 扬(1964—2017), 湖 南 邵 阳 人, + 植物学家。 + + 第二单元 43 + 用计算机技术研究植物学问题。1984 年,钟扬被分配到中国科学院武 + 汉植物研究所工作。那时,他曾用两年的业余时间,旁听了武汉大学生 + 物系的课程。 + + 回忆起这段往事,钟扬的妻子也感叹:“他在这方面的知识储备非 + 常充足。” + + 和钟扬外向热情的性格相比,他的妻子就显得内向了许多。那时 + 候,工作调动是一件非常困难的事,加上不愿和父母分居异地,妻子对 + 于与钟扬的婚事一直犹豫不定。 + + 一次,她在工作结束后回到武汉,钟扬在车站接她时突然开门见山 + 地说,自己把证明开好了。 + + “什么证明?”妻子问。 + “我们的结婚证明啊。” + “我还没同意呢,你怎么就把这个证明开了呢?” + “没有问题,大家都觉得可以了,到时间了。” + “于是我就这样有点‘被胁迫’地领了结婚证。”妻子笑说。 + 结婚没几年,33 岁的钟扬就成了武汉植物研究所副所长。后来, + 这位在生活和工作中都雷厉风行的年轻副局级干部干出一件让常人 + 无法理解的事情——放弃武汉的一切,去上海当一名高校教师。 + + 种子达人 + + 2000 年,钟扬辞去武汉植物研究所的工作来到复旦大学。 + 那年 5 月钟扬报到时,学校还没有过渡房,临时给他找了一套系里 + 别的老师提供的毛坯房。他毫无怨言地接受了这个连煤气、热水器都没 + 有的房子,洗着冷水澡住了半年。 + 尽管钟扬对生活品质不讲究,但对于种子却一点也不将就。为了自 + 己的“种子事业”,他的足迹延伸到了气候恶劣、人烟稀少的青藏高原。 + 从他到复旦大学的第二年起,钟扬就开始主动到西藏采集种子。 + 2009 年, 钟 扬 正 式 成 为 中 组 部 援 藏 干 部。 据 统 计, 在 这 十 几 年 间, + 他和同伴收集了上千种植物的 4000 多万颗种子,占到西藏高等植物 + 的 1/5。 + 很多人都有这样的疑问,钟扬为什么要收集种子? + “一个基因能够拯救一个国家,一粒种子能够造福万千苍生。青藏 + 高原这个地区,植物种类占到了我国植物种类的 1/3。有些地方甚至百 + +44 语文 必修上册 + 年来无人涉足,植物资源被严重低估。”钟扬曾在一次公开演讲中这样 +介绍。 + + 他扎根西藏,努力为人类建一个来自世界屋脊的种子“宝库”。 + 对钟扬来说,采种子是一件乐事。“作为一个植物学家,我最喜 +欢的植物是蒲公英,如果发现它开花并且结了种子,我会用手抓一 +把,一摊开里面一般有 200 颗。我最讨厌的植物是什么呢?椰子。那 +么大一颗,8000 颗的样本,我们需要两台卡车把它们拉回来。”钟扬 +调侃道。 + 然而,在西藏采集种子更多的是随时出现的高原反应和长时间的体 +力透支。而钟扬却背着他经典的黑色双肩包,穿着磨白了的牛仔裤,戴 +着一顶宽檐帽,迈着长期痛风的腿,在青藏高原上刷新一个植物学家的 +极限,连藏族同事都称他为“钟大胆”。 + 钟扬在西藏大学理学院的一位同事说:“每次和钟老师采种子都是 +惊险和惊喜并存。” + “那次,我们跟着钟老师去采集高山雪莲。我们从海拔 5200 米的 +珠峰大本营出发向更高的山地挺进时,钟老师出现了严重的高原反 +应,头痛欲裂,呼吸急促,全身无力,随时都会有生命危险。”这位 +同事回忆。 + 大家都建议钟扬待在帐篷里,他却说:“我最清楚植物的情况,我 +不去的话,你们更难找。你们能爬,我也能爬。”最终,钟扬带着学生 +在海拔 6000 多米的珠峰北坡,采集到了被认为是世界上生长在海拔最高 +处的种子植物——鼠曲雪兔子,也攀登到了中国植物学家采样的最高点。 + + 钟扬在西藏 + + 第二单元 45 + 如今,这些种子静静地沉睡在一个又一个玻璃罐里,等待着有一 + 天,改变人类的命运。按钟扬的话说,也许那个时候,胖胖的钟教授已 + 经不在了,但是他期待着它们可以派上用场。 + + 科学队长 + + “生命诞生以来,从原核到真核,从单细胞到多细胞,从海洋到陆 + 地,简单与复杂并存,繁盛与灭绝交替,奏响了一篇篇跌宕起伏的演化乐 + 章,其间洋溢着生命诞生与繁盛的欢颂,伴随着物种灭绝与衰落的悲怆。” + + 这是钟扬为 2016 年刚刚竣工的上海自然博物馆(以下简称“自博 + 馆”)撰写的一段文字。他参与了 500 多块图文展板的写作。很少有人 + 知道,这细腻而又富有文采的文字,竟出自这位看起来五大三粗的理工 + 男之手。 + + 如果说,采种子是钟扬的“主业”,那么科普则是他最爱的“副业”。 + 在自博馆建设期间,设计院展览设计部主任为寻找图文写作顾问操 + 碎了心。因为学科跨度大、文字要求高,她先后联系的几家高校都因这 + 个项目难度太大而婉拒。 + 设计部主任知道钟扬太忙了,想拜托他帮忙牵线或引荐一些专家。 + 令她没想到的是,钟扬二话不说就接下了这个没什么回报、时间紧的烫 + 手山芋。 + “我们会毫不客气地把最难的部分留给他。在半年多的时间里,每 + 次听说钟老师从西藏回上海了,我们都会立刻和他预约时间,他总是爽 + 快地答应。”设计部主任告诉记者。 + 从 2001 年起,钟扬开始和上海科技馆合作。他有过很多身份,有 + 时是评审专家,有时是科学顾问,有时是科普活动主讲人,有时是标本 + 捐赠人。他时不时会出现在科技馆或者自博馆的各个角落,每一次,都 + 带着特定的任务过来。 + 复旦大学生命科学学院的赵老师是钟扬的学生,她见证了导师这些 + 年在科普这条路上的持续前行。 + 2003—2017 年,钟扬共撰写、翻译、审校了 10 本科普著作,其中 + 不乏《大流感》这样的畅销书。“《大流感》这本书,内容包罗万象, + 语言风格多变,钟老师对推敲文字乐在其中,他会忽然在吃饭时得意扬 + 扬告诉大家他的译法,当然偶尔会被我们反驳,他也会欣然接受。”赵 + 老师回忆。 + +46 语文 必修上册 + 对中小学生来说,钟扬可以称作“科学队长”了。他连续 7 年多次 +义务为全国中小学生进行形式多样的科普,任学校科学顾问。来自上海 +市实验学校的一位同学就深受他的感染。 + + “当时去听讲座,一下子就被钟教授生动的演讲吸引住了,从此我 +就成了年龄最小的学生,并开始跟随他学习科学……听他的课,你永 +远都不会感到无聊。在钟老师的指引下,我慢慢爱上了科学。”这位同 +学说。 + + “做科学传播是件好事情,我当然支持啊!”在钟扬的鼓励下,同 +学们在学校创立了“学与做科学社”。另外,钟扬还帮这个社团撰写舞 +台剧脚本,并利用零碎时间帮助同学们排练。 + + 钟扬为什么要用这么大的精力做科普?他的学生认为,与其说科 +普,不如简单地说是他愿意教人。 + + “钟老师对‘批判性思维’念念不忘。他觉得对中小学生开展科学 +教育乃至思维教育非常重要,他还想着要把大学专业教材改成适合小朋 +友的音频故事,想着要为孩子们写一本科学故事书,想着去中学给科学 +社的孩子们上课,还想着开设更系统化的科学营……”他的学生说。 + +“接盘”导师 + + 复旦大学生命科学学院副院长卢老师分管研究生的培养工作,目睹 +了钟扬在收学生时的不少“奇葩”事儿。 + + “我们每个人招研究生有一个数量限制,但是他招得特别多,后来 +我就去了解,才发现事情的真相。”卢老师说。 + + 卢老师发现,当学生和老师进行双向选择时,有些学生可能因选不 +到合适的导师而“流落街头”,有些学生因为某些原因提出转导师。这 +样,问题来了,谁来“接盘”? + + 这时,身为研究生院院长的钟扬总是负责兜底。“他总说‘有问题 +我来’,这是他的一种责任与担当。他说在这个位置上,必须承担这个 +责任,必须要有这种担当。” + + 钟扬的“暖”是有目共睹的,这更体现在他对学生的关爱上。他从 +不放弃任何一个学生,更会根据每个学生的特点为他们量身定制一套个 +性化的发展规划,不让一个人掉队。 + + 钟扬曾说:“培养学生就像我们采集种子,每一颗种子都很宝贵, +你不能因为外表看上去不好看就不要,说不定这种子以后能长得很好。” + + 第二单元 47 + 而当钟扬的工作重心转到西藏时,他承认,自己的招生名额渐渐倾 + 向这所他心目中的“世界最高学府”。 + + 钟扬的学生、复旦大学生命科学学院一位博士生回忆道,实验室里 + 有很多学生是钟老师从少数民族地区招进来的。“这些同学由于底子薄, + 知识基础与上海本地学生有一定的差距,刚开始都是抱着试一试的想法 + 联系了钟老师。钟老师总是鼓励他们报考自己的研究生,他说,‘读我 + 的研究生基础差一点没关系,我帮你补,你只需要有一颗热爱植物学 + 的心’。” + + 于是,钟扬的学生们“各显神通”,有做科学研究的,有做科普 + 的,有自己创业的。钟扬停不下来的点子,就这样在他的学生中生根发 + 芽,变为现实。 + + 生命延续 + + 2017 年 5 月的一场讲座中,钟扬曾介绍自己的实验室研究过一种 + “长寿基因”。他们使用生命期 5 至 7 天的线虫作为实验对象,当某种基 + 因被敲除后,线虫寿命可增加 5 至 7 倍。 + + 有人问,只要敲除一个基因,人是否就可以更长寿。钟扬回答: + “这个基因主管生殖,要想长寿必须在一出生就去除掉,这意味着你将 + 终身无法生育。”对于钟扬这样的植物学家来说,生命的长短成为了藏 + 在基因里的秘密。 + + 对于他个人来讲,生命的意义是什么?或许在与千千万万种生命打 + 交道的过程中,钟扬已经有了答案。 + + “在一个适宜生物生存与发展的良好环境中,不乏各种各样的成功 + 者,它们造就了生命的辉煌。然而,生命的高度绝不只是一种形式。当 + 一个物种要拓展其疆域而必须迎接恶劣环境挑战的时候,总是需要一些 + 先锋者牺牲个体的优势,以换取整个群体乃至物种新的生存空间和发展 + 机遇。换言之,先锋者为成功者奠定了基础,它们在生命的高度上应该 + 是一致的。”在复旦大学 2012 年 7 月 6 日的校刊上,钟扬发表的《生命 + 的高度》一文这样写道。 + + 在探寻生命的边界时,他甘愿成为一个先锋者。 + 钟扬的身体条件是不适合长期在高原工作的。2015 年,钟扬突发 + 脑出血,对常人来说,这应是一次生命的警告,钟扬却把它理解成工作 + 倒计时的闹钟。 + +48 语文 必修上册 + “他有一种想把时间抢回来的劲头。”钟扬的同事回忆道。病好以 + 后,大家都以为原本忙碌的钟老师可以调整一下超负荷的生活节奏, +“收敛一点”。没想到的是,他变得更加拼命了。 + + 西藏大学的老师展示了钟扬 2017 年 6 月 24 日的工作安排:上午到 + 拉萨贡嘎机场,下午 3 点半参加西藏大学博士生答辩会,5 点跟西藏大 + 学的同事和研究生处理各种学科建设和研究生论文等事情,晚 11 点回 + 到宿舍网上评阅国家基金委各项申请书,深夜 1 点开始处理邮件,深夜 + 2 点上床睡觉,凌晨 4 点起床,4 点半赶往墨脱进行野外科学考察。 + + 钟扬未完成的愿望很多,他希望继续收集青藏高原的种子资料,希 + 望帮助西藏大学学科建设水平不断提高,希望培养出更多扎根高原的植 + 物学人才…… + + 脑出血之后,医生、亲友、同事都劝钟扬不要再去西藏,说他简直 + 是拿自己的生命作赌注,而他第三次向组织递交了继续担任援藏干部的 + 申请书,成为第八批援藏干部。 + + “再次进藏时,我明显感觉到他的身体大不如前,连上车和下车都 + 特别吃力。但他总说‘没事,我很好’。他对我说,自己的时间太短 + 了,必须这样。”钟扬的同事说。 + + 2017 年 9 月 25 日,钟扬忙碌的行程在赴内蒙古城川民族干部学院 + 作报告之后戛然而止。 + + 而他双肩背包里的很多张小纸条显示出,他的工作依然很满—— + 9 月 26 日,他将回到复旦大学上党课,带大家学习科学家黄大年的 + 先进事迹; + 9 月 28 日,他将来到拉萨,参加 29 日的西藏大学生态学一流学科 + 建设推进会; + 之后,他将完成西藏植物学期刊的创刊文章,完成关于“生物样本 + 库的伦理问题和管理政策研究”的国家社科基金项目的招标,继续英文 + 科普著作《不凡的物种》的翻译工作…… + 未来,他还希望在成都或上海建立青藏高原研究院,让上海的红树 + 林实现自由生长,让更多的中小学生通过科学课程提高科学思维水平, + 让更多的学生致力于青藏高原的种子事业…… + “任何生命都有结束的一天,但我毫不畏惧,因为我的学生会将科 + 学探索之路延续下去,而我们采集的种子,也许会在几百年后的某一天 + 生根发芽,到那时,不知会完成多少人的梦想。”对于生命的意义,钟 + 扬这样说。 + + 第二单元 49 + 学习提示 + + 在社会主义建设和中华民族伟大复兴的历程中,涌现出了许多杰出的劳动者。 + 他们岗位不同,但都具有高度的责任心和奉献精神,以辛勤劳动与创造为社会作 + 出巨大贡献,令我们感佩和景仰。 + + 《喜看稻菽千重浪——记首届国家最高科技奖获得者袁隆平》介绍了科学家袁 + 隆平发现天然杂交稻、培育杂交稻,进一步选育“超级稻”的长期而艰难的历程。 + 《心有一团火,温暖众人心》记述了售货员张秉贵的事迹,他在平凡的劳动岗位 + 上,以热情周到的服务温暖了几代顾客的心。《“探界者”钟扬》则讲述了科学家 + 钟扬献身于种子事业、普及科学知识、悉心培养学生的故事,展现了他对“生命 + 的高度和广度”的不懈探索。 + + 这三篇通讯都很注意通过具有典型意义的事件来表现人物的优秀品质。比如, + 袁隆平头顶烈日脚踩淤泥,终于找到水稻雄性不育植株;张秉贵“以热对冷,变 + 冷为热”,感动了不讲理的顾客。同时,三篇通讯还着力刻画了一些细节,如张秉 + 贵在柜台里“三步并作两步走,一点儿不知累”,下班后累得“有时连上楼还要扶 + 着墙”,又如钟扬背包里的一张又一张小纸条……这些细节让人物形象更加丰满, + 内容更加真切感人。 + + 阅读时注意了解通讯报道的一般特点,关注作者如何通过不同的渠道采集材 + 料,又是怎样多角度、分层次进行报道的。通讯作者在记述新闻事实时,常常表 + 达自己的观点,阅读时要注意理解事实与观点的关系,把握作者表达观点的方法。 + +50 语文 必修上册 + 5 + + a + + 以工匠精神雕琢时代品质 + + 李斌 + + 今天,我们迎来了一个更加注重精细品质和独特体验的时代。“我 +是真的希望工匠精神可以变成我的墓志铭。”不久前,一位生产智能电 +器的企业家如是感慨。企业对高精尖、炫彩酷的不懈追求,同工匠精神 +不谋而合。只有像手工匠人一样雕琢技艺、打造产品,企业才有金字招 +牌,产品才能经受住用户最挑剔眼光的检验。 + + 《说文》b 里讲:“匠,木工也。”今天的“匠”,已成为心思巧妙、 +技艺精湛、造诣高深的代名词。职业与职业没有高低贵贱之分,但人与 +人却从来都有职业品质、专业精神的差别。工匠精神厚植的企业,一定 +是一个气质雍容、活力涌流的企业。崇尚工匠精神的国家,一定是一个 +拥有健康市场环境和深厚人文素养的国家。“将产品当成艺术,将质量 +视为生命”,正是这样的极致追求,将我们带往一个更为不凡的世界。 + + 一盏孤灯一刻刀,一柄标尺一把锉,构成一个匠人的全部世界。别 +人可能觉得他们同世界脱节,但方寸之间他们实实在在地改变着世界: +不仅赋予器物以生命,更刷新着社会的审美追求,扩充着人类文明的疆 +域。工匠精神从来都不是什么雕虫小技,而是一种改变世界的现实力 +量。坚守工匠精神,并不是把“拜手工教”推上神坛,也不是鼓励离群 +索居、“躲进小楼成一统 c”,而是为了擦亮爱岗敬业、劳动光荣的价值 +原色,倡导质量至上、品质取胜的市场风尚,展现创新引领、追求卓越 +的时代精神,为中国制造强筋健骨,为中国文化立根固本,为中国力量 +凝神铸魂。 + + 将一门技术掌握到炉火纯青,这固然是工匠精神,但工匠精神的内 +涵又远不限于此。有人说:“没有一流的心性,就没有一流的技术。”的 +确,倘若没有发自肺腑、专心如一的热爱,怎能有废寝忘食、尽心竭力 +的付出;没有臻于至善、超今冠古的追求,怎能有出类拔萃、巧夺天工 + +a 选自 2016 年 4 月 30 日《人民日报》。略有改动。 的字书之一。 +b〔 《说文》〕指《说文解字》,东汉许慎编著的中国第一 c〔 躲进小楼成一统〕语出鲁迅《自嘲》:“躲进小楼 + + 部系统的分析汉字字形结构的字书,也是世界最古 成一统,管他冬夏与春秋。” + + 第二单元 51 + 的卓越;没有冰心一片、物我两忘的境界,怎能有雷打不动、脚踏实地 + 的笃实。工匠精神中所深藏的,有格物致知、正心诚意的生命哲学,也 + 有技进乎道、超然达观的人生信念。从赞叹工匠继而推崇工匠精神,见 + 证着社会对浮躁风气、短视心态的自我疗治,对美好器物、超凡品质 + 的主动探寻。我们不必人人成为工匠,却可以人人成为工匠精神的践 + 行者。 + + 一个时代有一个时代的气质,我们的时代将以怎样的面貌被书写, + 取决于我们每个人的表现。工匠精神是手艺人的安身之本,亦是我们生 + 命的尊严所在;是企业的金色名片,亦是社会品格、国家形象的荣耀写 + 照。工匠精神并不以成功为旨归,却足以为成功铺就通天大道。 + + 学习提示 + + 什么是工匠精神?在自动化程度越来越高的现代社会,传统社会所孕育的工 + 匠精神是否还有坚守的必要?如果有,我们应该怎样践行?这些问题关乎如何认 + 识劳动的意义与价值,值得我们深思。 + + 这篇新闻评论结合时代特点深入阐述了工匠精神的内涵,点明其当代价值, + 呼吁每个人在自己的工作中努力践行,具有很强的现实意义。文章观点鲜明,持 + 论严正,既批评了社会上存在的浮躁风气和短视心态,也澄清了对工匠精神的一 + 些误解,可以深化我们对劳动的认识,激发我们尊重劳动、追求卓越的情感。 + + 新闻评论既具有议论性文章的特点,又有新闻作品的属性。要注意分析文章 + 中事实与观点的关系,学习文章联系社会现实提出观点并合理阐述的写法,体会 + 其有的放矢、直面现实的新闻品格。 + +52 语文 必修上册 + 6 + + 芣  苢 a + + 《诗经·周南》 + + 采采 b 芣苢,薄言 c 采之。采采芣苢,薄言有 d 之。 + 采采芣苢,薄言掇 e 之。采采芣苢,薄言捋 f 之。 + 采采芣苢,薄言袺 g 之。采采芣苢,薄言襭 h 之。 + + 插秧歌 i + + 杨万里 + + 田夫抛秧田妇接,小儿拔秧大儿插。 + 笠是兜鍪 j 蓑是甲,雨从头上湿到胛 k。 + 唤渠 l 朝餐歇半霎 m,低头折腰只不答: + “秧根未牢莳未匝 n,照管 o 鹅儿与雏鸭。” + +a 选 自《 诗 经 注 析 》( 中 华 书 局 1991 年 版 )。 芣 苢 i 选自《杨万里集笺校》卷十三(中华书局 2007 年版)。 + (fúyǐ),车前草。 j 〔兜鍪(móu)〕古代打仗时战士所戴的头盔。 + k 〔胛〕肩胛。 +b 〔采采〕茂盛的样子。 l 〔渠〕他。 +c 〔薄言〕“薄”“言”都是助词,无实义。 m 〔半霎〕极短的时间。 +d 〔有〕取得,获得。 n 〔莳(shì)未匝〕意思是,这块田里还没有栽插完 +e 〔掇(duō)〕拾取,摘取。 +f 〔捋(luō)〕从茎上成把地取下。 毕。莳,移栽、种植。匝,布满、遍及。 +g 〔袺(jié)〕提起衣襟兜东西。 o 〔照管〕照料,照看。这里是“提防”的意思。 +h 〔襭(xié)〕把衣襟掖在腰带上兜东西。 + 第二单元 53 + 学习提示 + + 本单元特别选入这两首描写劳动的古诗,从中可以读到古人的日常生活与 + 劳作场景,感受他们劳动时的欢乐与情趣,体会古诗超越时空的魅力。阅读时 + 要展开想象,走进其中描摹的场景,悉心感受诗人的情感,体会其中表现出的 + 劳动之美。 + + 《芣苢》句式整齐,节奏明朗、轻快,自然流露出劳动的喜悦;“采”“有” + “掇”等一系列动词的变换,细腻地描绘出劳动的过程,富于诗情和画意。清代方 + 玉润在《诗经原始》中说,这首诗读来好似“田家妇女,三三五五,于平原绣野、 + 风和日丽中,群歌互答,余音袅袅,若远若近,忽断忽续,不知其情之何以移而 + 神之何以旷”。《插秧歌》运用民歌手法,选取日常劳动场景,描绘一家四口趁着 + 农时冒雨插秧的紧张生活,他们齐心协力,分工合作,干得热火朝天而秩序井然。 + 诗作表现出农家生活的辛苦与农事的繁忙,富于生活情趣,字里行间洋溢着吃苦 + 耐劳、勤奋乐观的精神。 + + 两首诗各具不同的艺术魅力。《芣苢》重章叠唱,回环往复,令人神往;《插 + 秧歌》善用口语,浅白流畅,富有自然、新鲜的意趣。学习时可反复诵读,认 + 真体会。 + +54 语文 必修上册 + 单元学习任务 + +一 劳动推动着社会的发展、时代的进步,也塑造着人的思想品格。袁隆平等杰出劳动者 + 的模范事迹,古代人民热烈的劳动场面,彰显了劳动的崇高与美丽;普通劳动者的辛 + 勤汗水,手工匠人的高超技艺,体现出劳动的价值与意义。从下列话题中任选一个, + 结合课文具体内容,分组进行专题研讨。 + 话题 1 :劳动的崇高与美丽 + 话题 2 :劳动的价值与意义 + 话题 3 :无私奉献、锐意进取、勇于创造 + 话题 4 :辛勤劳动、诚实劳动、创造性劳动 + +二 本单元所选的新闻作品包括人物通讯和新闻评论。前者报道典型人物,树立时代楷 + 模;后者评论社会热点,引导社会舆论。细读相关课文,完成下列任务。 + 1. 人物通讯要深入挖掘典型事件以表现人物精神,并在其中体现作者的立场和态度。 + 阅读本单元的三篇人物通讯,以表格的形式梳理其中的具体事件、人物精神和作 + 者立场。 + 2. 新闻评论讲究观点鲜明、针对性强,注重行文的逻辑性。梳理《以工匠精神雕琢 + 时代品质》一文的思路,体会文章是怎样辩证地讨论有关“工匠精神”的话题的。 + 3. 角度的选择对新闻评论非常重要。面对某个事实或问题,评论的角度不同,文章 + 面貌往往迥异。思考《以工匠精神雕琢时代品质》在选择评论角度方面的特点, + 在此基础上,从本单元的人物通讯中任选一篇,基于其呈现的事实,考虑可以从 + 哪些角度进行评论。 + +三 我们每天都会接触各种新闻,新闻在生活中无处不在。一些重大事件,如新中国成立 + 七十周年、中国共产党成立一百周年、党的二十大召开、防控新冠疫情等,都是新闻 + 报道的焦点,会涌现大量新闻作品。选择一份报纸或一个新闻网站,浏览一周的内 + 容,从中挑选出三四篇你认为比较优秀的新闻作品。小组合作,从新闻价值、报道角 + 度、结构层次、语言表达等方面草拟一份优秀新闻评选标准。每个小组按照标准评选 + 出一篇优秀新闻作品,合作撰写一份推荐书,阐述推荐理由,与新闻作品一起在全班 + 展示、交流。 + +四 教过两代人的山村小学教师,抗击疫情护佑生命的医护人员,精心擦拭每一块玻璃的 + + 第二单元 55 + 保洁阿姨,春耕秋收辛勤劳作的农民……生活中,有很多平凡的劳动者值得我们关 + 注,发生在他们身上的不少事也可能触动我们的心灵。写一个你熟悉的劳动者,不少 + 于 800 字,题目自拟。 + + 写人要关注事例和细节 + + 我们之所以经常被先进人物事迹感动,是因为这些事迹反映了人间的真善美,表现 + 了人们对美好事物共同的追求。也许我们身边没有名闻遐迩的“楷模”和“新闻人物”, + 但一定会有美好的人与事。能发现人世间的美好,能从身边找到值得学习、尊敬的人物, + 生活和写作都会变得有意义。 + + 描写人物,要注意选取典型事例,写出人物特征。以千字左右的篇幅写一个人,要 + 让读者对人物有印象,比较好的办法是,选取典型事例,勾勒人物形象,反映他的主要 + 性格和品格。写袁隆平就要突出他孜孜以求的精神,写他坚持真理、不断创新的研究历 + 程。写钟扬,则通过他长期在西藏采集种子的事迹和他有关生命意义的言论,表现他火 + 一般的生命激情。写人要注意体现人物性格的丰富性,避免单一化,可以选取不同的生 + 活侧面真实地表现人物,让人物有“立体感”。 + + 和典型事例同样重要的,是真实感人的细节。很多情况下,能让别人留下深刻印象 + 的,不是典型的事迹,而是生活工作的细节(或“画面”)。在车水马龙的路口,执勤 + 交警小心搀扶腿脚不便的老人过斑马线;一名同学考试没通过,仍然庄重地把试卷折叠 + 整齐收进书包,向老师微笑告别;急诊室的抢救失败了,患者家属反而安慰哭泣的护 + 士……抓住这类细节,只要用一二百字就能写活场景中的那些人,让一个个活生生的人 + “站立”在读者面前。 + +56 语文 必修上册 + 第三单元 + + 优美的古诗词是中华传统文化的瑰宝,蕴含着中 + 华儿女代代相传的文化基因。阅读古诗词作品,可以 + 体味古人丰富的情感、深邃的思想、多样的人生,加 + 深对社会的思考,增强对人生的感悟,激发对中华优 + 秀传统文化的热爱之情。 + + 本单元汇集了不同时期、不同体式的诗词名作。 + 曹操对“天下归心”的渴望,陶渊明“复得返自然” + 的淡泊,展示了两种不同的人生状态;李白驰骋想象 + 的豪迈,杜甫登高望远的悲凉,白居易“同是天涯沦 + 落人”的慨叹,表现出各自的人生境遇和情感世界; + 苏轼、辛弃疾词的豪放,李清照词的婉约,则展示出 + 宋词不同的审美追求。 + + 学习本单元,要逐步掌握古诗词鉴赏的基本方法, + 认识古诗词的当代价值,增强对中华优秀传统文化的 + 传承意识。要在诵读和想象中感受诗歌的意境,欣赏 + 其独特的艺术魅力;感受诗人的精神世界,体会诗人 + 对社会的思考与对人生的感悟,提高自身的思想修养 + 和文化品位;尝试写作文学短评。 + 7 + + 短歌行 a + + 曹操 + +对酒当歌 b,人生几何 c ! +譬如朝露,去日苦多 d。 +慨当以慷 e,忧思难忘。 +何以解忧?唯有杜康 f。 +青青子衿,悠悠我心 g。 +但为君故,沉吟 h 至今。 + +呦呦鹿鸣,食野之苹。 +我有嘉宾,鼓瑟吹笙 i。 +明明如月,何时可掇 j ? + +忧从中来,不可断绝。 +越陌度阡 k,枉用相存 l。 +契阔谈讌 m,心念旧恩。 + +月明星稀,乌鹊南飞。 +绕树三匝 n,何枝可依? +山不厌高,海不厌深 o。 +周公吐哺 p,天下归心。 + +a 选自《曹操集·诗集》(中华书局 2013 年版)。诗的 客的诗,这里用来表达招纳贤才的热情。 + 题目是汉乐府旧题。 j 〔掇〕拾取,摘取。一说同“辍”,停止。 + k 〔越陌度阡〕穿过纵横交错的小路。陌,东西向的 +b 〔对酒当歌〕面对着酒与歌,即饮酒听歌。当,也 + 是“对”的意思。 田间小路。阡,南北向的田间小路。 + l 〔枉用相存〕屈驾来访。枉,这里是枉驾的意思。 +c 〔几何〕多少。 +d 〔去日苦多〕可悲的是逝去的日子太多了。这是慨 用,以。存,问候、探望。 + m 〔契阔谈讌(yàn)〕久别重逢,欢饮畅谈。契阔, + 叹人生短暂。 +e 〔慨当以慷〕即“慷慨”。这里指宴会上的歌声激越 聚散,这里指久别重逢。讌,同“宴”。 + n 〔三匝(zā)〕三周。匝,周、圈。 + 不平。当以,没有实义。 o 〔山不厌高,海不厌深〕这里是仿用《管子·形势 +f 〔杜康〕相传是最早造酒的人。这里代指酒。 +g 〔青青子衿(jīn),悠悠我心〕语出《诗经·郑风·子 解》中的话:“海不辞水,故能成其大;山不辞土 + 石,故能成其高;明主不厌人,故能成其众。”意思 + 衿》,原写姑娘思念情人,这里用来形容渴望得到 是表示希望尽可能多地接纳人才。厌,满足。 + 贤才。子,对对方的尊称。青衿,指代周代读书人 p 〔周公吐哺(bǔ)〕《史记·鲁周公世家》记载,周 + 青色交领的服装。衿,衣服的交领。悠悠,长远的 公广纳贤才,正吃饭时,听到门外有士子求见,来 + 样子,形容思虑连绵不断。 不及咽下嘴里的食物,把食物一吐就赶紧去接见。 +h 〔沉吟〕沉思吟味。这里指思念和倾慕贤人。 这里借用这个典故,表示自己像周公一样热切殷勤 +i 〔呦呦鹿鸣,食野之苹。我有嘉宾,鼓瑟吹笙〕语 地接待贤才。吐哺,吐出嘴里的食物。 + 出《诗经·小雅·鹿鸣》。苹,艾蒿。《鹿鸣》是宴 + +58 语文 必修上册 + 归园田居(其一) a + + 陶渊明 + +少无适俗 b 韵 c,性本爱丘山 d。 +误落尘网 e 中,一去三十年 f。 +羁鸟 g 恋旧林,池鱼思故渊。 +开荒南野 h 际,守拙 i 归园田。 +方宅十余亩 j,草屋八九间。 + +榆柳荫后檐,桃李罗堂前。 +暧暧 k 远人村,依依 l 墟里 m 烟。 +狗吠深巷中,鸡鸣桑树颠 n。 +户庭 o 无尘杂 p,虚室 q 有余闲 r。 +久在樊笼 s 里,复得返自然。 + + 学习提示 + + 曹操的《短歌行》表达对时光流逝的感慨,以及建功立业的宏愿。陶渊明 +的《归园田居》抒发对官场生活的厌倦,以及辞官归隐、躬耕田园的自由、喜 +悦之情。这两首诗均为古体诗,但在语言风格和表达技巧上有很大不同。前者是 +四言,质朴刚健,运用比兴手法,化用典故或引前人诗句表达心志;后者是五言, +平淡舒缓,善用白描,寥寥数笔就勾勒出一幅乡村日常生活的图景。要在诵读中 +体会两首诗不同的韵律、节奏和表达技巧,结合诗人的身世领悟诗中的思想感情。 + + 背诵《短歌行》。 + +a 选自《陶渊明集笺注》卷二(中华书局 2003 年版)。 i 〔守拙〕持守愚拙的本性,即不学巧伪,不争名利。 + 《归园田居》共有五首,这是第一首。 j 〔方宅十余亩〕宅子四周有十几亩地。方,四周围绕。 + k 〔暧(ài)暧〕迷蒙隐约的样子。 +b 〔适俗〕适应世俗。 l 〔依依〕隐约的样子。一说“轻柔的样子”。 +c 〔韵〕气质,情致。 m 〔墟里〕指村落。 +d 〔丘山〕指山林。 n 〔颠〕顶端。 +e 〔尘网〕指世俗的种种束缚。 o 〔户庭〕门户庭院。 +f 〔一去三十年〕陶渊明大约二十五岁离开少时居所, p 〔尘杂〕指世俗的繁杂琐事。 + q 〔虚室〕静室。 + 直到五十五岁辞去彭泽令方归,所以说“一去三十 r 〔余闲〕余暇,空闲。 + 年”。或疑当作“十三年”。自开始做官至辞去彭泽 s 〔樊笼〕关鸟兽的笼子。这里指束缚本性的俗世。 + 令,前后为十三年。 +g 〔羁鸟〕被关在笼中的鸟。羁,约束。 第三单元 59 +h 〔南野〕南面的田野。一作“南亩”,指农田。 + 8 + + 梦游天姥吟留别 a + + 李白 + + 海客谈瀛洲,烟涛微茫信难求 b ;越人 c 语天姥,云霞明灭或可 +睹。天姥连天向天横 d,势拔五岳掩赤城 e。天台四万八千丈,对此欲 +倒东南倾 f。 + + 我欲因之g 梦吴越,一夜飞度镜湖h 月。湖月照我影,送我至剡溪i。 +谢公 j 宿处今尚在,渌 k 水荡漾清 l 猿啼。脚著谢公屐 m,身登青云梯 n。 +半壁见海日 o,空中闻天鸡 p。千岩万转路不定,迷花倚石忽已暝 q。熊 +咆龙吟殷岩泉 r,栗深林兮惊层巅 s。云青青 t 兮欲雨,水澹澹兮生 + +a 选自《李白集校注》卷十五(上海古籍出版社 1980 年 i 〔剡(shàn)溪〕水名,在今浙江嵊(shèng)州南。 + 版)。唐玄宗天宝三载(744),李白在长安受到权贵 j 〔谢公〕指南朝宋诗人谢灵运(385—433)。谢灵运 + 的排挤,被放出京。第二年,他即将由东鲁(今山东 + 一带)南游吴越,写了这首描绘梦中游历天姥(mǔ) 喜欢游山访胜,他游天姥山时,曾在剡溪住宿。 + 山的诗,留给在东鲁的朋友,所以也题作《梦游天姥 k 〔渌(lù)〕清澈。 + 山别东鲁诸公》。天姥山,在今浙江新昌东。传说登 l 〔清〕凄清。 + 山的人能听到仙人天姥唱歌的声音,山因此而得名。 m 〔谢公屐(jī)〕据《宋书·谢灵运传》,谢灵运游 + +b 〔海客谈瀛洲,烟涛微茫信难求〕航海的人谈起瀛 山, 必 到 幽 深 高 峻 的 地 方, 他 备 有 一 种 特 制 的 木 + 洲,(大海)烟波渺茫,(瀛洲)实在难以找到。瀛 屐,前后齿可装卸,上山时去掉前齿,下山时去掉 + 洲,古代传说中的东海三座仙山之一,另两座叫蓬 后齿,以保持身体平衡。屐,以木板作底,上面有 + 莱、方丈。烟涛,波涛渺茫,远看像烟雾笼罩的样 带子,形状像拖鞋。 + 子。微茫,景象模糊不清。信,确实、实在。 n 〔青云梯〕指直上云霄的山路。语出谢灵运《登石 + 门最高顶》诗:“惜无同怀客,共登青云梯。” +c 〔越人〕指今浙江一带的人。 o 〔半壁见海日〕在半山腰看到从海上升起的太阳。 +d 〔向天横〕遮住天空。横,遮蔽。 p 〔天鸡〕古代传说,东南有桃都山,山上有大树叫 +e 〔势拔五岳掩赤城〕山势高过五岳,遮掩了赤城。 “桃都”,树上栖有天鸡。每当太阳初升照到树上,天 + 鸡就会鸣叫,天下的鸡也都跟着它叫起来。 + 拔, 超 出。 五 岳, 东 岳 泰 山、 西 岳 华 山、 中 岳 嵩 q 〔迷花倚石忽已暝〕迷恋着花,依倚着石,不觉天 + 山、北岳恒山、南岳衡山的总称。赤城,和下文的 色很快就暗了下来。暝,昏暗。 + “天台(tāi)”都是山名,在今浙江天台北。 r 〔熊咆龙吟殷(yǐn)岩泉〕熊在咆哮,龙在长吟, +f 〔对此欲倒东南倾〕对着(天姥)这座山,(天台 声音震荡着岩石和泉水。殷,震动。 + 山)就好像要拜倒在它的东南面一样。意思是天台 s 〔栗深林兮惊层巅〕使深林战栗,使层巅震惊。栗、 + 山和天姥山相比,就显得低了。倾,偏斜、倒下。 惊,均为使动用法。层巅,层层山峰。 +g 〔因之〕意思是受前面越人的话所吸引。因,依据。 t 〔青青〕黑沉沉的。 +h 〔镜湖〕即鉴湖,在今浙江绍兴。 + +60 语文 必修上册 + 烟。列缺 a 霹雳,丘峦崩摧。洞天石扉,訇然中开 b。青冥 c 浩荡不 +见底,日月照耀金银台 d。霓为衣兮风为马,云之君 e 兮纷纷而来下。 +虎鼓瑟兮鸾回车 f,仙之人兮列如麻。忽魂悸 g 以魄动,恍 h 惊起而长 +嗟。惟觉 i 时之枕席,失向来之烟霞 j。 + + 世间行乐亦如此,古来万事东流水。别君去兮何时还?且放白 +鹿青崖间,须行即骑访名山 k。安能摧眉折腰 l 事权贵,使我不得开 + +心颜? + + 登  高 m + + 杜甫 + +风急天高猿啸哀,渚清沙白鸟飞回 n。 +无边落木 o 萧萧 p 下,不尽长江滚滚来。 +万里 q 悲秋常作客,百年 r 多病独登台。 +艰难苦恨繁霜鬓 s,潦倒 t 新停 u 浊酒杯。 + +a 〔列缺〕闪电。列,同“裂”。 低头。 +b 〔洞天石扉,訇(hōng)然中开〕仙府的石门,訇 m 选自《杜诗详注》卷二十(中华书局 2015 年版)。 + + 的 一 声 从 中 间 打 开。 洞 天, 仙 人 居 住 的 洞 府。 訇 这 首 诗 是 唐 代 宗 大 历 二 年(767) 杜 甫 流 寓 夔 州 + 然,形容声音很大。 (今重庆奉节)时的作品。 +c 〔青冥〕天空。 n 〔鸟飞回〕鸟(在急风中)飞舞盘旋。 +d 〔金银台〕金银筑成的楼台,指神仙居住的地方。 o 〔落木〕落叶。 +e 〔云之君〕泛指驾乘云彩的神仙。 p 〔萧萧〕草木摇落的声音。 +f 〔鸾回车〕鸾鸟拉车回转。鸾,传说中的神鸟。 q 〔万里〕指远离故乡。 +g 〔悸(jì)〕因惊惧而心跳。 r 〔百年〕这里借指晚年。 +h 〔恍〕猛然惊醒的样子。 s 〔艰难苦恨繁霜鬓〕意思是,一生艰难,常常抱恨 +i 〔觉(jiào)〕醒。 +j 〔失向来之烟霞〕刚才(梦中)所见的烟雾云霞消 于志业无成而身已衰老。艰难,指自己生活多艰, + 失了。向来,原来。烟霞,指前面所写的仙境。 又指国家多难。苦恨,极恨。繁霜鬓,像浓霜一样 +k 〔且放白鹿青崖间,须行即骑访名山〕暂且把白鹿 的鬓发。 + 放在青青的山崖间,等到要走的时候就骑上它去探 t 〔潦倒〕衰颓,失意。 + 访名山。传说中神仙、隐士多骑白鹿。 u 〔新停〕刚 刚 停 止 。 杜 甫 晚 年 因 病 戒 酒 , 所 以 说 +l 〔摧眉折腰〕低头弯腰,即卑躬屈膝。摧眉,即低眉, “新停”。 + + 第三单元 61 + 琵琶行并序 a + + 白居易 + + 元和十年 b,予左迁 c 九江郡 d 司马 e。明年秋,送客湓浦口 f, +闻舟中夜弹琵琶者,听其音,铮铮然有京都声 g。问其人,本长安倡女 h, +尝学琵琶于穆、曹二善才 i,年长色衰,委身 j 为贾人 k 妇。遂命酒 l, +使快 m 弹数曲。曲罢悯然 n,自叙少小时欢乐事,今漂沦 o 憔悴,转徙 +于江湖间。予出官 p 二年,恬然 q 自安,感斯人言,是夕始觉有迁谪 r +意。因为 s 长句 @0,歌以赠之,凡六百一十六言,命曰《琵琶行》。 + + 浔阳江头 @1 夜送客,枫叶荻 @2 花秋瑟瑟 @3。主人 @4 下马客在船,举 +酒欲饮无管弦 @5。醉不成欢惨将别,别时茫茫江浸月。 + + 忽闻水上琵琶声,主人忘归客不发。寻声暗问 @6 弹者谁,琵琶声停 +欲语迟@7。移船相近邀相见,添酒回灯@8 重开宴。千呼万唤始出来,犹抱 +琵琶半遮面。转轴拨弦@9 三两声,未成曲调先有情。弦弦掩抑#0 声声思#1, + +a 选 自《 白 居 易 集 笺 校 》 卷 十 二( 上 海 古 籍 出 版 社 p 〔出官〕京官贬黜往地方任职。 + 1988 年版)。行,古诗的一种体裁。 q 〔恬然〕宁静安适的样子。 + r 〔迁谪〕官吏因罪降职并流放。 +b 〔 元 和 十 年 〕 公 元 815 年。 元 和, 唐 宪 宗 的 年 号 s 〔为〕创作。 + (806—820)。 t 〔长句〕指七言诗。唐代的习惯说法。 + u 〔江头〕江边。 +c 〔左迁〕贬官、降职的委婉说法。白居易因越职上 v 〔荻(dí)〕多年生草本植物,形状像芦苇,生长在 + 书言事,触怒当朝权贵,被贬为江州司马。 + 水边。 +d 〔九江郡〕设于隋代,唐代称为江州或浔阳郡,治 w 〔瑟瑟〕形容微风吹动的声音。 + 所在今江西九江。 @4 〔主人〕白居易自指。 + @5 〔管弦〕指音乐。管,箫、笛之类的管乐。弦,琴、 +e 〔司马〕州刺史的副职。 +f 〔湓(pén)浦口〕湓江流入长江的地方,在今九江 瑟、琵琶之类的弦乐。 + @6 〔暗问〕低声询问。 + 西。湓浦,又叫湓江,源出江西瑞昌清湓山。 @7 〔欲语迟〕将要回答,又有些迟疑。 +g 〔京都声〕指唐代京城长安流行的乐曲声调。 @8 〔回灯〕重新掌灯。一说“移灯”。 +h 〔倡(chāng)女〕歌女。 @9 〔转轴拨弦〕拧 转 弦 轴, 拨 动 弦 丝。 这 里 指 调 弦 +i 〔善才〕当时对技艺高超的乐师的称呼。 +j 〔委身〕托身。这里是嫁人的意思。 校音。 +k 〔贾(gǔ)人〕商人。 #0 〔掩抑〕声音低沉。 +l 〔命酒〕叫人摆酒。 #1 〔思〕深长的情思。 +m 〔快〕畅快。 +n 〔悯然〕忧郁的样子。 +o 〔漂沦〕漂泊流落。 + +62 语文 必修上册 + 似诉平生不得志。低眉信手 a 续续 b 弹,说尽心中无限事。轻 +拢慢捻抹复挑 c,初为《霓裳》d 后《六幺》e。大弦 f 嘈嘈 g 如 +急雨,小弦 h 切切 i 如私语。嘈嘈切切错杂弹,大珠小珠落玉 +盘 j。间关莺语花底滑 k,幽咽泉流冰下难 l。冰泉冷涩弦凝 +绝 m,凝绝不通声暂歇。别有幽愁暗恨生,此时无声胜有声。 +银瓶乍破水浆迸,铁骑突出刀枪鸣 n。曲终收拨当心画 o,四 +弦一声 p 如裂帛。东船西舫悄无言,唯见江心秋月白。 + + 沉吟放拨插弦中,整顿衣裳起敛容 q。自言本是京城女, +家在虾蟆陵 r 下住。十三学得琵琶成,名属教坊 s 第一部 t。曲 +罢曾教善才服,妆成每被秋娘 u 妒。五陵年少 v 争缠头 w,一 +曲红绡 @4 不知数。钿头银篦 @5 击节碎 @6,血色罗裙翻酒污 @7。 +今年欢笑复明年,秋月春风等闲 @8 度。弟走从军阿姨死,暮去 +朝来颜色故 @9。门前冷落鞍马稀,老大 #0 嫁作商人妇。商人重利 +轻别离,前月浮梁 #1 买茶去。去来 #2 江口守空船,绕船月明 人物故事图·浔阳琵琶  [明]仇英  作 + +a 〔信手〕随手。 o 〔曲终收拨当心画〕乐曲终了,用拨子在琵琶的中 +b 〔续续〕连续。 间部位划过四弦。这是弹奏琵琶到一曲结束时的常 +c 〔轻拢慢捻抹(mò)复挑(tiǎo)〕轻轻地拢,慢 用手法。拨,拨子,弹奏弦乐的用具。 + + 慢地捻,一会儿抹,一会儿挑。拢,扣弦。捻,揉 p 〔四弦一声〕四根弦同时发声。 + 弦。抹,顺手下拨。挑,反手回拨。 q 〔敛容〕显出端庄的脸色。 +d 〔《霓裳(cháng)》〕即《霓裳羽衣曲》,唐代乐曲 r 〔虾(há)蟆陵〕地名,在长安城东南。 + 名,相传为唐玄宗所制。 s 〔教坊〕古时管理宫廷音乐的官署。专管雅乐以外的 +e 〔《六幺(yāo)》〕即《六幺令》,唐代乐曲名。 +f 〔大弦〕指琵琶四根弦中的粗弦。 音乐、舞蹈、百戏的教习、排练、演出等事务。 +g 〔嘈嘈〕形容声音沉重舒长。 t 〔第一部〕第一队,是教坊中最优秀的一队。部, +h 〔小弦〕指琵琶上的细弦。 +i 〔切切〕形容声音轻细急促。 量词,计量歌舞队、乐队。 +j 〔大珠小珠落玉盘〕分别比喻乐声的重浊和清脆。 u 〔秋娘〕唐代歌伎常用的名字。这里是对善歌貌美 + 一说,形容声音的清脆圆润。 +k 〔间(jiàn)关莺语花底滑〕像黄莺在花下啼叫一样 歌伎的通称。 + 婉转流利。间关,形容鸟鸣婉转。 v 〔五陵年少〕指京城富家豪族子弟。五陵,汉代五 +l 〔幽咽泉流冰下难〕像幽咽的泉水在冰下艰难流过。 + 幽咽,形容乐声梗塞不畅。难,艰难,形容乐声滞 个皇帝(高、惠、景、武、昭)的陵墓,在长安附 + 塞难通。 近,富家豪族多聚居在这一带。 +m 〔冰泉冷涩弦凝绝〕像冰下的泉水又冷又涩不能畅 w 〔缠头〕古代对歌伎舞女打赏用的锦帛。 + 流, 弦 似 乎 凝 结 不 动 了。 这 是 形 容 弦 声 愈 来 愈 低 @4 〔绡(xiāo)〕轻薄的生丝织品。泛指轻美的丝织品。 + 沉,以至停顿。 @5 〔钿(diàn)头银篦(bì)〕上端镶着花钿的银质发 +n 〔银瓶乍破水浆迸,铁骑突出刀枪鸣〕像银瓶突然 篦。钿,用金银等制成的花形首饰。 + 破裂,水浆迸射一样;像铁骑突然冲出,刀枪齐鸣 @6 〔击节碎〕(随着音乐)打拍子时敲碎了。节,节拍。 + 一般。这是形容琵琶声在沉咽、暂歇后,忽然又爆 @7 〔翻酒污〕(因为)泼翻了酒被沾污。 + 发出激越、雄壮的乐音。 @8 〔等闲〕平常,随随便便。 + @9 〔颜色故〕容貌衰老。故,旧、老。 + #0 〔老大〕年纪大了。 + #1 〔浮梁〕地名,在今江西景德镇北。 + #2 〔去来〕走了以后。来,语气助词。 + + 第三单元 63 + 江水寒。夜深忽梦少年事,梦啼妆泪红阑干 a。 + 我闻琵琶已叹息,又闻此语重唧唧 b。同是天涯沦落人,相逢 + +何必曾相识!我从去年辞帝京,谪居卧病浔阳城。浔阳地僻无音乐, + +终岁不闻丝竹声。住近湓江地低湿,黄芦苦竹绕宅生。其间旦暮闻 +何物?杜鹃啼血 c 猿哀鸣。春江花朝秋月夜,往往取酒还独倾 d。岂 +无山歌与村笛,呕哑嘲哳 e 难为听。今夜闻君琵琶语,如听仙乐耳暂 f +明。莫辞更 g 坐弹一曲,为君翻作 h《琵琶行》。 + + 感我此言良久立,却坐 i 促弦 j 弦转 k 急。凄凄不似向前 l 声,满 +座重闻皆掩泣 m。座中泣下谁最多?江州司马青衫 n 湿。 + + 学习提示 + + 李白、杜甫和白居易在中国古典诗歌史上具有重要的地位。这里各选入他们 +的一首经典诗作。这几首诗体式不同,抒发的情感和创作手法也各不相同,诵读 +时要细加体会。 + + 《梦游天姥吟留别》以浪漫瑰丽的想象,描绘了一个迷离惝恍的梦境。诗作 +以七言为主,不受诗律限制,笔随兴至,在奇特的梦境中寄寓着深沉的慨叹。学 +习时要在诵读中发挥想象,品味组成梦境的意象以及梦境所隐含的精神追求。 + + 《登高》写诗人登高远眺,身世之悲与忧国之情齐集心头。这首诗每联对仗, +句法谨严,历来为人称赞。学习时注意感受诗歌营造的沉郁悲凉的意境,体会作 +者圆熟的律诗创作技巧。宋代罗大经曾说“万里悲秋常作客,百年多病独登台” +一联含有八层意思(《鹤林玉露》),试就此联作一番品析。 + + 《琵琶行》是一首长篇乐府诗,叙述琵琶女的故事,述说自己的人生遭际。 +学习时,注意琵琶女与诗人境遇的相通之处,体会诗人抒发的人生感慨。重点欣 +赏诗中音乐描写和景物描写的精妙。 + + 背诵《梦游天姥吟留别》和《登高》。 + +a 〔梦啼妆泪红阑干〕从梦中哭醒,搽了胭脂粉的脸 g 〔更〕再。 + 上流满了一道道红色的泪痕。妆,这里指脸上的胭 h 〔翻作〕写作。翻,按曲调写作歌词。 + 脂粉。 i 〔却坐〕回到(原处)坐下。却,退回。 + j 〔促弦〕把琴弦拧紧。促,紧、迫。 +b 〔唧唧〕叹息。 k 〔转〕更加,越发。 +c 〔杜鹃啼血〕传说杜鹃鸟啼叫时,嘴里会淌出血来。 l 〔向前〕以前。 + m 〔掩泣〕掩面哭泣。下面“泣下”的“泣”指眼泪。 + 这是形容杜鹃啼声的悲切。 n 〔青衫〕青色单衣。唐代官职低的服色为青。 +d 〔独倾〕独自饮酒。 +e 〔呕哑(ōuyā)嘲哳(zhāozhā)〕指声音嘈杂刺耳。 +f 〔暂〕忽然,一下子。 + +64 语文 必修上册 + 9 + + 念奴娇·赤壁怀古 a + + 苏轼 + + 大江b 东去,浪淘尽,千古风流人物。故垒c 西边,人道是,三国周 +郎 d 赤壁。乱石穿空,惊涛拍岸,卷起千堆雪。江山如画,一时多少豪 +杰。 遥想公瑾当年,小乔初嫁了,雄姿英发 e。羽扇纶巾 f,谈笑 +间,樯橹 g 灰飞烟灭。故国 h 神游,多情应笑我,早生华发 i。人生如 +梦,一尊 j 还酹 k 江月。 + +a 选自《东坡乐府笺》卷二(上海古籍出版社 2009 年 f〔 羽扇纶(guān)巾〕(手持)羽扇,(头戴)纶巾。 + 版)。念奴娇,词牌名。这首词作于宋神宗元丰五 这是儒者的装束,形容周瑜有儒将风度。纶巾,配 + 年(1082)。苏轼所游的是黄州(今湖北黄冈)的 有青丝带的头巾。 + 赤鼻矶,并非东汉末期赤壁大战处。 + g 〔樯(qiáng)橹〕代指曹操的战船。樯,挂帆的桅 +b〔 大江〕指长江。 杆。橹,一种摇船的桨。 +c〔 故垒〕旧时军队营垒的遗迹。 +d〔 周郎〕即周瑜(175—210),字公瑾,孙权军中指 h 〔故国〕指赤壁古战场。 + i 〔多情应笑我,早生华发〕应笑我多愁善感,过早 + 挥赤壁大战的将领。二十四岁时即出任要职,军中 + 皆呼为“周郎”。 地长出花白的头发。 +e 〔雄姿英发〕姿容雄伟,英气勃发。 j〔 尊〕同“樽”,一种盛酒器。这里指酒杯。 + k 〔酹(lèi)〕将酒洒在地上,表示凭吊。 + + 第三单元 65 + 永遇乐·京口北固亭怀古 a + + 辛弃疾 + + 千古江山,英雄无觅,孙仲谋处。舞榭歌台,风流总被,雨打风吹 +去。斜阳草树,寻常巷陌,人道寄奴曾住 b。想当年,金戈铁马,气吞 +万里如虎 c。 元嘉草草 d,封狼居胥 e,赢得仓皇北顾 f。四十三 +年 g,望中犹记,烽火扬州路 h。可堪回首,佛狸祠 i 下,一片神鸦 j +社鼓 k。凭谁问:廉颇老矣,尚能饭否 l ? + +a 选 自《 稼 轩 词 编 年 笺 注 》 卷 五( 上 海 古 籍 出 版 社 g 〔四十三年〕作者于宋高宗绍兴三十二年(1162) + 1993 年版)。永遇乐,词牌名。这首词作于宋宁宗 南归,到写这首词时正好四十三年。 + 开禧元年(1205)。 + h 〔烽火扬州路〕扬州一带抗金的烽火。 +b 〔寄奴曾住〕寄奴是南朝宋武帝刘裕(363—422) i 〔佛(bì)狸祠〕北魏太武帝拓跋焘(408—452)小 + 的小名。刘裕的祖先移居京口,他在这里起事,晚 + 年推翻东晋做了皇帝。 名“佛狸”。公元 450 年,他反击刘宋,兵锋南下, + 在长江北岸瓜步山上建立行宫,后称“佛狸祠”。 +c 〔想当年,金戈铁马,气吞万里如虎〕刘裕曾两次 j 〔神鸦〕指在庙里吃祭品的乌鸦。 + 率领东晋军队北伐,收复洛阳、长安等地。 k 〔社鼓〕社日祭祀土地神的鼓声。南宋时期,当地 + 老百姓只把佛狸祠当作一般祠庙来祭祀供奉,而不 +d 〔元嘉草草〕南朝宋文帝刘义隆好大喜功,仓促 知道它过去曾是北魏皇帝的行宫。 + 北 伐, 遭 到 重 创。 元 嘉, 宋 文 帝 刘 义 隆 的 年 号 l 〔廉颇老矣,尚能饭否〕据《史记·廉颇蔺相如列 + (424—453)。草草,轻率。 传》,战国时赵国名将廉颇被免职后跑到魏国,后 + 来赵王想重新起用他,派人去探看他的身体状况。 +e 〔封狼居胥〕汉武帝元狩四年(前 119),霍去病远 廉颇在使者面前吃下饭一斗、肉十斤,披甲上马, + 征匈奴,歼敌七万余,封狼居胥山而还。封,登山 以示尚可大用。使者受廉颇仇人郭开的贿赂,回来 + 祭天,以纪功勋。狼居胥,山名,即今蒙古国境内 报 告 赵 王 说:“ 廉 将 军 虽 老, 尚 善 饭, 然 与 臣 坐, + 的肯特山。这里用“元嘉北伐”暗示南宋朝廷要汲 顷之三遗矢矣。”(矢,同“屎”。)赵王以为廉颇已 + 取历史教训。《宋书·王玄谟传》载刘义隆对殷景 老,遂不召。 + 仁说:“闻王玄谟陈说,使人有封狼居胥意。” + +f 〔北顾〕败逃中回头北望。 + +66 语文 必修上册 + 声声慢 a + + 李清照 + + 寻寻觅觅,冷冷清清,凄凄惨惨戚戚 b。乍 +暖还寒 c 时候,最难将息 d。三杯两盏淡酒,怎 +敌他、晚来风急!雁过也,正伤心,却是旧时 +相识。 满地黄花 e 堆积,憔悴损 f,如今有 +谁堪 g 摘?守着窗儿,独自怎生得黑 h !梧桐更 +兼细雨,到黄昏、点点滴滴。这次第 i,怎一个 +愁字了得 j ! + + 李清照像  郑慕康  作 + +a 选自《李清照集校注》卷一(人民文学出版社 1979 f 〔憔悴损〕枯萎,凋零殆尽。憔悴,凋零、枯萎。 + 年版)。声声慢,词牌名。北宋末年李清照南渡避 损,这里相当于“极”,表示程度很深。 + 乱,不久北宋灭亡,丈夫病死,她只身逃难,境遇 + 悲惨。这首词是作者南渡后晚年的作品。 g 〔堪〕可以,能够。 + h 〔怎生得黑〕怎样挨到天黑。怎生,怎么、怎样。 +b 〔戚戚〕悲愁、哀伤的样子。 i 〔次第〕光景,状况。 +c 〔乍暖还(huán)寒〕忽暖忽冷,天气变化无常。 j 〔怎一个愁字了得〕意思是,一个“愁”字怎么 +d 〔将息〕养息,休息。 +e 〔黄花〕菊花。 能概括得尽呢? + + 第三单元 67 + 学习提示 + + 一般认为,豪放和婉约是词的两种典型风格。品读本课的三首宋词,感受其 + 不同的风格特点,体会这些词作是如何表现词人不同的思想情感的。 + + 《念奴娇·赤壁怀古》咏古抒怀,雄浑苍凉,境界宏阔,历来被视为豪放词 + 的代表作品。学习时,要仔细体会词作将写景、咏史、抒情融为一体的写法,品 + 味词的声韵美,思考词中寄托的生命感悟与人生态度。 + + 《永遇乐·京口北固亭怀古》为词人登高凭眺、怀古伤今之作,豪迈悲壮。词 + 作多用典,学习时要注意理解典故的内涵;结句“凭谁问:廉颇老矣,尚能饭 + 否?”是这首词的主旨,应注意领悟。可以拓展阅读辛弃疾的《菩萨蛮·书江西 + 造口壁》,通过对比理解词人的不同情感。 + + 《声声慢》(寻寻觅觅)以朴素清新的口语入词,抒写词人在国破家亡遭受劫 + 难后的忧愁苦闷,通篇写“愁”,徘徊低迷,婉转凄楚。要注意揣摩词人因外物 + 触发的内心波澜,体会词作是如何渲染这种愁绪的。这首词手法独到,起句便用 + 十四个叠字,反复诵读,体会叠字中包孕的情感及其递进层次。 + + 与律诗相比,词的声韵、句式、节奏等有着更多的变化,显得更为自由灵 + 活,诵读时注意体会这一点。 + + 背诵《念奴娇·赤壁怀古》。 + + 词以境界为最上。有境界则自成高格,自有名句。 + 境非独谓景物也,喜怒哀乐亦人心中之一境界。故能写真景物真感情者,谓 + 之有境界。否则谓之无境界。 + 古今之成大事业、大学问者,必经过三种之境界:“昨夜西风凋碧树。独上高 + 楼,望尽天涯路”,此第一境也。“衣带渐宽终不悔,为伊消得人憔悴”,此第二境 + 也。“众里寻他千百度,回头蓦见,那人正在灯火阑珊处”,此第三境也。此等语 + 皆非大词人不能道。然遽以此意解释诸词,恐为晏欧诸公所不许也。 + + ——王国维《人间词话》卷上 + +68 语文 必修上册 + 单元学习任务 + +一 古诗词中常常寄寓着诗人对社会的思考和对人生的感悟。阅读本单元诗作,可以采 + 用知人论世的方法,通过了解诗人的生平、创作背景等,深入理解作品。比如,了 + 解杜甫及其所处的时代,有助于理解《登高》中忧国伤时、悲秋苦病的深沉情思; + 了解苏轼的人生经历及《念奴娇·赤壁怀古》的写作背景,有助于理解词作中蕴含 + 的壮志难酬的忧愤及旷达洒脱的豪情。从本单元选择一首诗词,查找相关资料,探 + 讨诗作的内涵,思考对你有怎样的启示,与同学交流。 + +二 古诗词是中华传统文化的精华,具有很强的音乐性。建议组织一次班级诗歌朗诵会, + 通过多种形式的朗诵,体会古诗词的音韵美。 + 1. 每位同学选择自己最喜欢的一首诗词在小组内朗诵。朗诵前,要反复揣摩其情感 + 基调和音韵节奏,设计朗诵脚本;也可以从网络上搜集相关音频、视频资料,学 + 习借鉴。 + 2. 每个小组推举代表参加班级朗诵会。可以为诗词配上合适的乐曲和图片,增强朗 + 诵效果。 + +三 优秀的古诗词作品往往具有深刻的意蕴和独特的艺术匠心,学习欣赏时应当重点关 + 注,细加品味。比如,曹操《短歌行》运用比兴手法和典故表述心志,陶渊明《归园 + 田居》用白描呈现日常生活画面,李白《梦游天姥吟留别》用瑰丽的想象表现梦境, + 白居易《琵琶行》把抽象无形的音乐化为具体可感的形象等。从本单元选择一首诗 + 词,就你感触最深的一点,写一则 800 字左右的文学短评。 + + 学写文学短评 + + 阅读文学作品时,从自己的感受出发,用简要的文字把自己对作品的理解、分析和 + 评价写出来,就是文学短评。写文学短评,有利于梳理、积累个人的阅读经验,领悟创 + 作、鉴赏的规律,提高文学审美能力。 + + 写文学短评,必须对作品有深入的了解和准确的把握。要认真读作品,对作品的情 + 感、形象、思想内涵、艺术特点等有自己的理解,抓住让你感触最深的地方,以此展开 + 评论。比如李白《梦游天姥吟留别》中跌宕起伏的情绪流转、深沉复杂的人生之思,杜 + + 第三单元 69 + 甫《登高》中蕴含的身世之悲和忧国之情,白居易《琵琶行》对音乐的传神描写,李清 + 照《声声慢》(寻寻觅觅)中别出心裁的叠词运用等,都可以加以评论。 + + 写文学短评要善于聚焦,从“小”处切入。优秀的文学作品往往从多方面触动我们 + 的情思,引发我们的思考,值得评论的点很多。写短评时要能够聚焦,如果面面俱到, + 很容易失之浮泛。比如作者怎样渲染气氛,怎么描摹景物,抒发了什么情感,运用了哪 + 些手法等,都可以成为评论的焦点。同时,也要注意选择小的切入口,可以关注一些细 + 节。茹志鹃《百合花》中“撒满白色百合花”的被子,小通讯员衣服上被撕开的口子等 + 细节反复出现,就可以将它们作为切入口,分析这些细节对于表现人物、深化作品主题 + 的作用。 + + 写文学短评主要运用叙议结合的方式,要在适当复述、介绍或者引用作品内容的基 + 础上,展开分析和评论。“叙”要精当,为“议”提供支撑或依据;“议”要紧密结合 + “叙”,思路清晰,态度鲜明,最好有自己独到的见解。叙议有机融合,才能将见解表达 + 清楚,有理有据,令人信服。比如要想评论陶渊明《归园田居》“善用白描”,就可以从 + 景物的选择、近景远景的勾勒等方面找出具体的词句进行分析,讲清楚作者是怎么运用 + 白描手法表现乡村日常生活图景的。 + +70 语文 必修上册 + 第四单元 + +家乡文化生活 + + 家乡总在牵动着我们的情思:名山大川、寻常巷 + 陌、小桥人家……我们生于斯长于斯,在这里经历鲜 + 活的体验,留下生命的印痕,有许多难以割舍的记忆。 + 这里所说的家乡,主要指我们居住的城乡社区。家乡 + 文化既是中国文化的重要组成部分,又是我们个体精 + 神生活的重要依托。用适当的方式关注和参与家乡的 + 文化生活,学习剖析文化现象,有助于我们增强认识 + 社会和阐释自己见解的能力,这也是学好语文的重要 + 途径之一。 + + 本单元围绕“家乡文化生活”展开学习活动。通 + 过采访、考察和查阅文献等方式,了解家乡的人和物, + 关注家乡的文化与风俗,深入认识家乡,对丰富家乡 + 文化生活提出合理建议;回顾昨天,考察今天,展望 + 明天,寻找情感归宿,增进对家乡的文化认同。 + 学习活动 + +一  记录家乡的人和物 + + 我们居住的家乡有着各类人物、多样景致和独特习俗,承载着我们丰富的记忆与情感。 +也许某个人物留下了动人的故事,也许某幢建筑有着不朽的价值,也许某个物件有着特殊 +的来历,这些都值得我们寻访探究。参考下面的活动提示,采访有关人物,了解家乡的人、 +物、历史、习俗等,并收集相关的文献资料和实物资料,写一篇《家乡人物(风物)志》。 + + 活动提示 + + 1. 访谈之前要作充分准备。可以查阅相关材料,也可实地考察风景名胜、建筑设施, +或走访本地博物馆和档案馆等。先要了解采写的对象,确定访谈的主题(如家乡名称的来 +历和演变、家乡的历史传说等),然后拟定访谈提纲,根据访谈主题选定合适的访谈对象并 +征得对方同意。 + + 2. 访谈中提出问题应具体明确,切忌笼统、含糊不清。可将问答变为交谈,使访谈 +气氛融洽一些。交流中要注意倾听受访人的看法,随时给予积极回应。访谈结束后要及时 +整理访谈记录,整合访谈内容,为“志”的写作准备好基础材料。 + + 3.“志”是记述、记载的意思。如地方志,就是如实记载某一地方历史的书或文章。 +记述的人物,既可以是历史名人,也可以是有一技之长或有独特经历的普通人;风物,既 +可以是家乡的建筑、特产、老物件,也可以是传统习俗等。 + + 4. 撰写“志”要突出家乡特色。记述人物,要写清楚人物的生平、主要事迹,突出 +他对家乡的贡献或影响。记述风物,要写清楚其来源、特点、文化价值等。“志”的表述 +方式以叙述和说明为主,语言力求准确、平实、简明,在记述中自然而然地融入自己对家 +乡的思考与情感。 + + 附一:访谈记录表 + +对象 性别 年龄 + +访谈 访谈 +成员 时间 + + 1. 访谈 + 记录 + 2. +访谈 + + 3. +提纲 + + 4. + + 5. + +72 语文 必修上册 + 附二:历史建筑登记表 建筑 + 位置 +建筑 +名称 建筑 +建造 现状 (是否完好,周边环境) +历史 (建造年代,历史变化) +价值 信息 +描述 (风格特色,历史价值) 来源 +照片 + 建议 + +二  家乡文化生活现状调查 + + 家乡不仅是生活的地方,也是文化熏陶的场所。你家乡的文化生活状况如何?那里 +的文化设施是否齐全?使用情况如何?人们日常都开展哪些活动?有没有图书阅览室? +是否经常开展读书活动?参考下面的活动提示,以小组为单位,通过访谈、考察等方式 +了解家乡的文化生活现状。可以撰写调查报告,也可以制作成演示文稿。 + + 活动提示 + + 1. 开展家乡的文化生活调查可以选择不同的主题,如人际关系、道德风尚、文物古 +迹的保护、文化生活的方式等。不求全面,任选一个主题深入调查即可。 + + 下面的题目可供参考: + ① 家乡文化遗产保护传承情况调查 + ② 家乡群众性业余文化活动调查 + ③ 家乡图书室藏书与借阅情况调查 + ④ 家乡商家招牌体现的商业文化调查 + ⑤ 家乡文化习俗、生活方式的变化调查 + 2. 调查前要规划调查路线,确定调查重点。调查时要认真观察,做好记录,尽可能 +详尽地留下第一手材料(包括影像资料)。要注意准确记录各种信息的来源。 + 3. 运用专题访谈、网上查阅、实地考察等调查方法取得的资料大多是鲜活生动的, +但往往比较零散,因此对资料进行整理就十分必要。可采用图表的方式加以呈现,做到一 +目了然。 + 4. 对材料作深入挖掘分析,对家乡文化生活现状有自己的认识和思考。 + + 第四单元 73 + 附三:调查报告结构表 + +标题 (标题应明确调查的主旨,放在第一页中间) + +摘要 (简要概括报告内容,语言应简明清晰) + +目录 (列出报告主要包括哪几部分) + +调查背景与目标 (调查的背景和设定的目标) + +调查步骤与方法 (怎样实施调查,经历了什么样的步骤,运用了哪些方法) + +调查内容与分析 (调查的主要问题,获得的各种信息,以及对这些信息的分析。这是调查 + 报告的主体部分,可以分成若干段落) + +结论 (总结调查的主要内容,提出自己的看法) + + 建议 (简要提出解决问题的措施) +参考资料 (列出参考的文献资料及其来源) + +调查报告一般包括以上内容,自己撰写时也可作一些调整。 + +三  参与家乡文化建设 + + 了解家乡的文化生活,参与家乡文化建设,是语文学习向课外的延伸,也是我们的 +责任。在对家乡文化生活现状进行调查的基础上,参考下面的活动提示,对丰富家乡 +的文化生活提出建议。 + + 活动提示 + + 1. 可以考察家乡的风俗习惯、邻里关系、生活方式、文化环境等,选择其中的一项, +看看哪些方面需要改进,有哪些改进的可能,具备了哪些条件,等等。 + + 2. 所提建议应当从家乡实际出发,具有可操作性,切忌空泛。应先征求各方面意见, +和同学讨论后再拟定建议。可以写成建议书,陈述建议的内容、建议的理由、实施的步骤 +和可行性等。 + + 3. 所提建议要基于对当代文化发展和区域文化生活的理解,有利于家乡文化的健康发 +展;要符合社会主义核心价值观,倡导新文化、新风尚,有利于和谐社区的建设。 + +74 语文 必修上册 + 学习资源 + + 1.  调查的技术 a + + 毛泽东 + + (1)要开调查会作讨论式的调查 + 只有这样才能近于正确,才能抽出结论。那种不开调查会,不作讨论式的调查,只凭一个人讲他 +的经验的方法,是容易犯错误的。那种只随便问一下子,不提出中心问题在会议席上经过辩论的方法, +是不能抽出近于正确的结论的。 + (2)调查会到些什么人? + 要是能深切明了社会经济情况的人。以年龄说,老年人最好,因为他们有丰富的经验,不但懂得 +现状,而且明白因果。有斗争经验的青年人也要,因为他们有进步的思想,有锐利的观察。以职业说, +工人也要,农民也要,商人也要,知识分子也要,有时兵士也要,流氓也要。自然,调查某个问题时, +和那个问题无关的人不必在座,如调查商业时,工农学各业不必在座。 + (3)开调查会人多好还是人少好? + 看调查人的指挥能力。那种善于指挥的,可以多到十几个人或者二十几个人。人多有人多的好 +处,就是在做统计时(如征询贫农占农民总数的百分之几),在做结论时(如征询土地分配平均分 +好还是差别分好),能得到比较正确的回答。自然人多也有人多的坏处,指挥能力欠缺的人会无法 +使会场得到安静。究竟人多人少,要依调查人的情况决定。但是至少需要三人,不然会囿于见闻, +不符合真实情况。 + (4)要定调查纲目 + 纲目要事先准备,调查人按照纲目发问,会众口说。不明了的,有疑义的,提起辩论。所谓“调 +查纲目”,要有大纲,还要有细目,如“商业”是个大纲,“布匹”“粮食”“杂货”“药材”都是细目, +布匹下再分“洋布”“土布”“绸缎”各项细目。 + (5)要亲身出马 + 凡担负指导工作的人,从乡政府主席到全国中央政府主席,从大队长到总司令,从支部书记到总 +书记,一定都要亲身从事社会经济的实际调查,不能单靠书面报告,因为二者是两回事。 + (6)要深入 + 初次从事调查工作的人,要作一两回深入的调查工作,就是要了解一处地方(例如一个农村、一 +个城市),或者一个问题(例如粮食问题、货币问题)的底里。深切地了解一处地方或者一个问题了, +往后调查别处地方、别个问题,便容易找到门路了。 + +a 节选自《反对本本主义》(《毛泽东选集》第一卷, + 人民出版社 1991 年版)。 + + 第四单元 75 + (7)要自己做记录 + 调查不但要自己当主席,适当地指挥调查会的到会人,而且要自己做记录,把调查的结果记下来。 +假手于人是不行的。 + + 2.  访谈法 a + + 王思斌 + + 访谈法的含义与类型 + + 访谈法是指调查员同调查对象接触,通过有目的的谈话收集资料的方法。根据调查员同调查对 +象的接触方式,访谈可分为直接访谈和间接访谈。前者是面对面的访谈,后者则是借助某种通信工 +具进行的访谈。在我国的实际调查中,当面访谈是访谈的主要方式,也有一些调查公司使用电话进 +行访谈。 + + 访谈有结构性访谈和非结构性访谈之分。结构性访谈是按照事先制定的调查提纲进行,在调查中 +对问题的解释和说明也是标准的。因此,结构性访谈的特点是比较规范。非结构性访谈没有事先制定 +的较详细的提纲,只有访谈题目或它所涉及的几个方面。调查员只就调查的主题提一些笼统的问题, +求得调查对象的回答,甚至有些问题是在访谈中形成的,访谈随着情况的发展深入下去。非结构性访 +谈适用于事先对调查主题知之不多,或希望深入了解调查对象的情况。相比而言,这样的访谈得到的 +资料比较具体、细致、全面,花费的时间也比较多。 + + 访谈的准备及技巧 + + 访谈是调查员同调查对象面对面互动的过程,双方的一言一行都可能会影响访谈的进程与结果。 +因此,要想得到满意的结果,就要提前做好准备并在访谈中讲究访谈技巧。这包括:(1)访谈前要尽 +量做好准备工作,对访谈的主题及它所包含、涉及的问题作尽可能充分的思考,以备向调查对象提出 +所要了解的问题。(2)事先通知调查对象,约定访谈的时间和地点。(3)尽可能多地了解调查对象的 +身份、生活背景及其与所调查问题的关系等情况,以使访谈时发问得体。(4)一般来说要提前到场, +在约定的地点等候调查对象;如果去调查对象的家庭或工作地点则要准时。(5)从调查对象手中操办 +的、关心的事情谈起,逐渐引入正题,以与调查对象建立起良好关系。(6)从简单问题入手,启发调 +查对象充分发表自己的看法。(7)控制话题,避免谈话离题太远。在对方谈话离题时,要善意地、巧 +妙地扭转他的话题。(8)在整个访谈过程中始终抱着虚心求教的态度,尊敬调查对象。注意使用合适 +的谈话方式,包括姿势、语气、表情,使对方觉得调查员是在认真听他讲话。(9)对重要问题可以 +用不同方式重复提问,重复对方关于此问题的回答,看其是否肯定此说法。(10)调查员应对所问 + +a 选 自《 社 会 学 教 程 》( 北 京 大 学 出 版 社 2010 年 + 版)。有改动。 + +76 语文 必修上册 + 问题持中立态度,不能发表自己对问题的看法,也不能作引导性提问。(11)经调查对象同意后进 +行记录。 + +3.  节日与文化 a + + 钟敬文 + + 近代以前,长期的农业社会,产生和继承、发展了许多节日。现在只要打开古代《岁时广记》一 +类的文献看看,你就会感到惊异了。为什么会有那么多的节日?是古人闲着无事干,或者他们物力、 +精力过剩,所以要来弄弄这种“四时八节”吗?不是的。尽管过去有些节日,现在我们看来是无谓、 +可笑乃至可厌的,但在被创造乃至被继承的当时,有它的主客观原因和相应条件。在过去节日及其活 +动中,有些是有一定现实意义和作用的(如端午的洒雄黄酒、六月六的晒衣物及年终的掸尘等),有 +些却只是满足生活、心理的要求的(如新年的家人团聚、亲友来往以及追傩、钉桃符等)。后者往往 +带着幻想和迷信的色彩。这是由于当时人们对付实际事物的能力还很有限,认识事物的知识又比较低 +下。因此,为了满足需要,不能不借助于巫术及宗教信仰、仪式。这就必然要使这种文化带有消极的 +因素。它标志着人类和民族文化的原始的或近原始的阶段。 + + 但是,人民文化具有一种自然调节、改进的能力。随着社会的发展,人们的实际活动能力和心理 +智能也不断变化。他们对于传统文化(包括节日活动在内)中的不合理的、过时的部分,往往不自觉 +地或半自觉地加以改动,使之合理化(或比较合理化),使之具有较高的社会意义。例如本来是一种 +禳灾法术的放纸鸢活动,逐渐成为一种大人或儿童的文娱活动。又如本来是江滨人民驱除瘟神等的宗 +教行事——送瘟船,后来却被联系到楚国忠臣的沉江故事,使它具有历史的和伦理的意义。这种事实, +不仅说明了民间文化的进步性,也增强了文化进化理论的可靠性。 + + 民间节日,作为一种文化事象,有一个颇值得注意的特点,就是它的复合性。例如端午节,它 +既有划龙舟、吃粽子等活动,又有饮雄黄酒、插艾蒿、挂蒲剑、贴钟馗图、小孩带香囊和穿老虎腰 +肚,以及出嫁了的女儿回娘家、邻居互送节物等活动。至于那一年之首的春节,活动事项就更加繁 +多了。宋人陈元靓编纂的《岁时广记》,“元旦”这部分的资料(包括活动和故事),就占了三卷。 +18 世纪中叶文人学者所写作的新年民俗诗集《武林新年杂咏》里,关于艺术、技艺一类事项的题目 +就有 40 多个。这些表明,民间的许多节日是包括社会的多种活动事项在内的。从社会文化的门类 +说,它包括经济、宗教、伦理、艺术、技艺等活动。它是许多文化活动的集合体,是民族文化的一 +种展览会。 + + 由于上述这种特点,民间文学的功能必然也是多方面的,关于人际的团结、社会规范的保持、 +技能的表现、医药的运用,以及对各种心理的慰藉……总之,民间节日,在过去,尽着各种社会的 +功能,是民族文化的综合应用。在这种意义上,我们今天不能简单地以旧文化、旧生活模式一笔抹 +杀它。 + +a 选自《钟敬文文集·民俗学卷》(安徽教育出版社 名钟谭宗,广东海丰人,民俗学家、民间文艺学 + 1999 年版)。有删改。钟敬文(1903—2002),原 家、散文家。 + + 第四单元 77 + 我们现在处在社会主义社会的初级阶段。许多社会礼制和观念都起着新的变化。我们的风俗、习 +尚(包括节日)也不能安于旧态。新中国成立之后,我们已经采用了一些新节日,如青年节、劳动节、 +建军节、国庆节(还有些地方把重阳节改为老人节)。但同时有些传统节日仍在普遍或局部沿用,如 +春节、清明、中秋节等。不过由于现实生活有较大的变动,作为上层建筑的文化,不能不作相应修改, +如传统新年改为春节,并加入新的内容(慰问军烈属等);清明节主要作为纪念革命烈士的节日等。 +这样做,是合理的,也是必要的。这些有长远历史的古老节日,在新社会中就成了新文化的一部分。 +我以为传统节日行事中,还有些是颇有意义或情趣的,像上文所提到的晒衣物、掸尘等,符合新学理 +和新社会要求。此外,如清明踏青、踢毽子、重阳登高(南方并放纸鸢),甚至如七夕的女儿月下穿 +针、中秋的玩兔儿爷等,虽没有显著的社会或科学意义,但作为民族的传统生活情趣,以某种适当形 +式给予保留,也是可以考虑的吧? + +78 语文 必修上册 + 第五单元 + +整本书阅读 + + 阅读整本书,学习不同类型书籍的阅读方法,积 + 累阅读整本书的经验,养成良好的阅读习惯,不断拓 + 宽阅读视野,我们将终身受益。 + + 本单元阅读学术著作《乡土中国》。书中所写的 + “乡土中国”,“并不是具体的中国社会的素描,而是 + 包含在具体的中国基层传统社会里的一种特具的体系, + 支配着社会生活的各个方面”(费孝通《乡土中国》)。 + 从传统农村入手研究中国基层生活,缘于作者对中国 + 乡土社会的了解与情感,这是一种可贵的文化自觉。 + 通过阅读这本书,我们可以进一步认识我们的国家和 + 人民。 + + 阅读《乡土中国》,要注意理解书中的关键概念, + 把握全书的逻辑思路,了解这本书的学术价值;学会根 + 据阅读目的选择阅读方法,积累阅读学术著作的经验。 + + 第五单元 79 + 《乡土中国》 + + 《乡土中国》是费孝通所著的一部研究中国乡村社会特点的学术著作。此书写于 + 20 世纪 40 年代后期,缘起于作者在云南大学和西南联大讲授“乡村社会学”课程的经 + 历。最初费孝通参考美国的教材授课,上过几轮后,他利用自己的社会调查成果重起炉 + 灶,以中国基层传统社会——农村为对象,边研究边授课,并撰写了 14 篇文章,之后整 + 理汇成此书。 + + 作者基于自己田野调查的丰富积累,对中国传统社会结构进行了充分的思考和分析,尝 + 试回答“作为中国基层社会的乡土社会究竟是个什么样的社会”这个问题。作为社会学本 + 土化的重要论著,《乡土中国》对研究中国乡土社会的传统文化、社会结构具有开创性意 + 义;其通俗自然的用语和深入浅出的阐述,大大增强了该书的可读性。 + + 阅读指导 + + 阅读《乡土中国》,总的要求是读通、读懂,理解基本内容,并力求触类旁通,掌握 + 学术著作的一般读法。学术著作大多追求的是在相关领域或者某一专题上的探索与创造, + 强调科学性、系统性和逻辑性,重在理论发现或解决实际问题。阅读这类著作,除了关注 + 作者运用的材料、提出的概念,以及作出的理论阐释,还要看它在前人研究的基础上有什 + 么创造,这种创造经历过怎样的探索,具有怎样的价值。 + + 下面的一些策略,可以为我们阅读《乡土中国》这样的学术著作提供帮助。 + 1. 要有阅读的“预期”。阅读学术著作的目的一般比较明确,如阅读《乡土中国》, + 可能是为了解中国乡村的历史与文化,也可能是想学习一些社会学研究的方法,还可能是 + 为解决当今农村问题寻找答案,等等。无论带着哪种预期来阅读,目标明确了,才能达到 + 预期的效果。 + 2. 先“粗”后“细”,逐步推进。所谓“粗”,一是阅读“序言”“后记”等,了解作 + 者的写作背景和写作目的;二是通过浏览目录大体了解著作的基本内容和章节结构。所谓 +“细”,即注重概念、材料、论证、推理等要素,深入思考,不断提炼。阅读《乡土中国》 + 中的各篇文章,可以先读篇章标题,预测推想;再读各段,筛选重要的概念或语句,了解 + 各段的内容;最后观照全篇,更好地把握作者的观点和论述的逻辑。 + + 80 语文 必修上册 + 3. 抓住核心概念,找出概念间的联系。学术著作往往会提出一些重要的概念,然后 +从理论上进行阐释。阅读《乡土中国》要特别关注其中的重要概念,如“礼俗社会”“差 +序格局”“无讼”“无为政治”等。这些都是作者从大量的田野调查材料中提炼出来的,用 +以归纳某些现象,并从理论高度解释这些现象。抓住并理解核心概念,就掌握了阅读学术 +著作的钥匙。 + + 4. 关注作者研究的思路。《乡土中国》是基于田野调查的研究,阅读时要注意作者怎 +样从调查材料中提炼典型的现象,形成概念,又怎样上升到理论的高度进行阐释。不仅要 +知道结论,还要注意形成结论的过程,看作者怎样通过辨识、分析、比较、归纳,提出和 +研究问题,获得新的理论发现,甚至开拓新的研究领域。 + + 5. 反复阅读,积极思考。学术著作理论性强,涉及的术语多,语言表达比较抽象,阅 +读时难免会遇到不明白的地方。这时就要多读几遍,调动自己的经验和知识积极思考,还 +可以参阅一些资料,促进对学术著作的理解。 + +学习任务 + +以下任务供参考,可以选择其中一部分完成,也可以自行设计任务。 + + 任务 1 :抓住核心概念,理解作者观点 + 费孝通在《乡土中国》的序言中说:“它不是一个具体社会的描写,而是从具体社会 +里提炼出的一些概念。”“差序格局”就是他提出的一个重要概念,指的是由亲属关系和地 +缘关系所决定的有差等的次序关系。作者在解释这个抽象概念时,运用了比喻等方法。分 +小组讨论,谈谈你对“差序格局”概念的理解。之后联系全书,梳理作者用以指称乡土社 +会的概念和与之相对应的指称其他社会的概念,填写下面的表格,并结合作者的论述和相 +关资料理解其含义。 + +指称乡土社会的概念 指称其他社会的对应概念 + 礼俗社会 借助文字的社会 + + 差序格局 + 系维着私人的道德 + + 第五单元 81 + 指称乡土社会的概念 续表 + 男女有别 指称其他社会的对应概念 + + 血缘社会 家庭 + + 法治秩序 + 司法诉讼体系 + + 有为政治 + + 任务 2 :分析整体框架,把握知识体系 + 学术著作具有较强的逻辑性,各个篇章共同呈现出一个相对完整的学术知识体系,比 + 如《乡土中国》中的 14 篇文章相互关联,综合分析阐述了中国乡村社会的结构和特点。 + 在阅读文章的基础上,归纳各篇主旨,撰写相应的内容摘要。注意摘录和使用文中关键的 + 概念,简洁、准确地概括作者的学术观点。之后,以小组为单位讨论各篇之间的内在联 + 系,尝试把握这本书的知识体系。 + + 任务 3 :关注“问题”,学以致用 + 阅读学术著作,要关注其中“问题的提出”和“问题的解决”。当今中国社会正处 + 于转型的关键时期,传统与现代的交织和转换,乡村与城市的碰撞和融合,使社会发生 + 着巨大变化。在这样的背景下,本书关于乡土社会的论述能给我们带来哪些思考?试以 +“今日中国乡村的变迁”为话题,从居住环境、精神风貌、文化生活、风俗习惯、乡村管 + 理等角度中任选一个,开展调查访问,写一篇不少于 1000 字的报告。在此基础上,运用 + 多种形式,如制作手抄报、举行演讲、开展辩论、设计网页等,与同学交流。 + + 任务 4 :拓展阅读,知人论世 + 费孝通不仅在社会学、人类学的研究领域中成就卓著,还有着强烈的社会责任感和爱 + 国之情。查找资料,了解其生平,并拓展阅读他编著的其他作品,如《中华民族多元一体 + 格局》,更全面地认识费孝通的学术思想和成就。 + +82 语文 必修上册 + 第六单元 + + 学习是永恒的话题。从《礼记·学记》中的“玉 + 不琢,不成器”,到当今社会倡导的终身学习和个性 + 化学习,数千年来,人们一直在不懈地探索学习之道, + 以更好地获取知识,提升能力和自身修养。 + + 本单元的文章从不同角度论述有关学习的问题, + 或阐述学习的意义,或讨论学习的态度与方法,或描 + 述读书的经历与感受,使我们获得不同的启迪。 + + 学习本单元,以“学习之道”为核心,通过梳理、 + 探究和反思,形成正确的学习观,改进学习方法,提 + 高学习能力。要准确把握作者的观点和态度,关注作 + 者思考问题的角度,学习他们有针对性地表达观点的 + 方法;学会发现问题,从合适的角度以恰当的方式阐 + 述自己的看法。 + + 第六单元 83 + 10 + + 劝  学 a + + 《荀子》 + + 君子 b 曰:学不可以已。 + 青,取之于蓝 c,而青于蓝 d ;冰,水为之,而寒于水。木直中 +绳 e, f 以为轮,其曲中规 g。虽有槁暴 h,不复挺 i 者, 使之然 +也。故木受绳 j 则直,金 k 就砺 l 则利,君子博学而日参省乎己 m,则 +知 n 明而行无过矣。 + 吾尝终日而思矣,不如须臾之所学也;吾尝跂 o 而望矣,不如登高 +之博见也。登高而招,臂非加长也,而见者远 p ;顺风而呼,声非加 +疾 q 也,而闻者彰 r。假 s 舆马 t 者,非利足 u 也,而致 v 千里;假舟楫 +者,非能水 w 也,而绝 x 江河。君子生非异 @5 也,善假于物 @6 也。 + 积土成山,风雨兴焉 @7 ;积水成渊,蛟龙生焉;积善成德,而神 +明 @8 自得,圣心 @9 备焉。故不积跬步 #0,无以 #1 至千里;不积小流,无 + +a 选自《荀子集解》卷一(中华书局 1988 年版)。有 n 〔知〕同“智”,见识。 + 删节。劝,鼓励。《荀子》全书现存 32 篇,大部分 o 〔跂(qǐ)〕踮起脚后跟。 + 为荀子自著,其余为荀子弟子记录的荀子言论和思 p 〔见者远〕意思是远处的人也能看见。 + 想观点。荀子(约前 313—前 238),名况,字卿, q 〔疾〕劲疾。 + 赵国人,战国末期思想家。 r 〔彰〕清楚。 + s 〔假〕借助。 +b 〔君子〕这里指有学问、有修养的人。 t 〔舆马〕车马。这里指车子。 +c 〔青,取之于蓝〕靛(diàn)青从蓝草中取得。青, u 〔利足〕善于奔走。 + v 〔致〕到达。 + 靛青,一种染料。蓝,草名,叶子可提取靛青。 w 〔能水〕善于游水。水,游泳。 +d 〔青于蓝〕比蓝草颜色深。 x 〔绝〕横渡。 +e 〔中(zhòng)绳〕合乎木匠用来取直的墨线。 y 〔生(xìng)非异〕天性(同一般人)没有差别。 +f 〔 (róu)〕同“煣”,用火烘烤木材使之弯曲。 +g 〔规〕圆规。 生,同“性”,天性。 +h 〔虽有槁暴(gǎopù)〕即使又晒干了。有,同“又”。 @6 〔物〕外物,包括各种客观条件。 + @7 〔兴焉〕在这里兴起。兴,起。焉,兼词,相当于 + 槁暴,晒干。槁,枯。暴,晒。 +i 〔挺〕直。 “于此”。下文“生焉”的“焉”同此。 +j 〔受绳〕经过墨线比量。 @8 〔神明〕非凡的智慧。 +k 〔金〕指金属制的刀斧等。 @9 〔圣心〕圣人的心怀。 +l 〔就砺〕拿到磨刀石上去磨。就,接近、靠近。砺, #0 〔跬(kuǐ)步〕古代称跨出一脚为“跬”,跨出两 + + 磨刀石。 脚为“步”。 +m 〔参(cān)省(xǐng)乎己〕对自己检查、省察。 #1 〔无以〕没有用来……的,无从。 + + 参,检验。省,省察。乎,相当于“于”。 + +84 语文 必修上册 + 以成江海。骐骥 a 一跃,不能十步;驽马十驾 b,功在不舍 c。锲 d 而舍 +之,朽木不折;锲而不舍,金石可镂 e。蚓无爪牙之利,筋骨之强,上 +食埃土 f,下饮黄泉 g,用心一 h 也。蟹六跪 i 而二螯 j,非蛇鳝之穴无 +可寄托者,用心躁 k 也。 + +师  说 l + + 韩 愈 + + 古之学者 m 必有师。师者,所以传道受业解惑也 n。人非生而知 +之 o 者,孰能无惑?惑而不从师,其为惑也 p,终不解矣。生乎吾前, +其闻 q 道也固先乎吾,吾从而师之 r ;生乎吾后,其闻道也亦先乎吾, +吾从而师之。吾师道也 s,夫庸知其年之先后生于吾乎 t ?是故无贵 +无贱 u,无长无少,道之所存,师之所存也 v。 + + 嗟乎!师道 w 之不传也久矣!欲人之无惑也难矣!古之圣人,其出 +人 x 也远矣,犹且 y 从师而问焉;今之众人 z,其下圣人也亦远矣,而 +耻学于师。是故圣益圣,愚益愚 @7。圣人之所以为圣,愚人之所以为 + +a 〔骐骥(qíjì)〕骏马。 和道理。 +b 〔驽马十驾〕劣马拉车走十天。驾,一天的行程。 p 〔其为惑也〕它们作为疑惑。其,它们,指不跟从 +c 〔功在不舍〕功效来源于走个不停。舍,停止、止息。 +d 〔锲(qiè)〕刻。 老师学习而遗留下的问题。 +e 〔镂〕雕刻。 q 〔闻〕知道,懂得。 +f 〔埃土〕泥土,尘土。 r 〔从而师之〕跟随他学习,即以他为老师。 +g 〔黄泉〕地下的泉水。 s 〔吾师道也〕我学习的是道。师,学习。 +h 〔一〕专一。 t 〔夫庸知其年之先后生于吾乎〕哪管他是生在我之 +i 〔六跪〕蟹的六条腿。“六”应是“八”。 +j 〔螯〕蟹钳。 前还是生在我之后呢?庸,表示反问语气。 +k 〔躁〕浮躁,不专心。 @1 〔无贵无贱〕意思是就从师问道来说,没有贵和贱 +l 选 自《 韩 昌 黎 文 集 校 注 》 卷 一( 上 海 古 籍 出 版 社 + 的区分。 + 1986 年版)。 @2 〔道之所存,师之所存也〕道存在的地方,就是老师 +m 〔学者〕求学的人。 +n 〔师者,所以传道受业解惑也〕老师,是依靠他来 在的地方。意思是谁懂得道,谁就是自己的老师。 + @3 〔师道〕尊师学习的风尚。 + 传授道、教授学业、解除疑惑的人。所以,用来…… @4 〔出人〕超出一般人。 + @5 〔犹且〕尚且,还。 + 的、凭它(他)来……的。受,同“授”,传授。 @6 〔众人〕一般人。 +o 〔生而知之〕生下来就懂得知识和道理。之,指知识 @7 〔圣益圣,愚益愚〕圣人更加圣明,愚人更加愚昧。 + + 益,更加、越发。 + + 第六单元 85 + 杏坛图(南宋版画) 愚,其皆出于此乎?爱其子,择师而教 之; + 于其身 a 也,则耻师 b 焉,惑 c 矣。彼童子 d + 之师,授之书而习其句读 e 者,非吾所谓传 + 其道解其惑者也。句读之不知 f,惑之不解, + 或师焉,或不焉 g,小学而大遗 h,吾未见其 + 明也。巫医 i 乐师 j 百工 k 之人,不耻相师 l。 + 士大夫之族 m,曰师曰弟子云者 n,则群聚而 + 笑之。问之,则曰:“彼与彼年相若 o 也,道 + 相 似 也, 位 卑 则 足 羞, 官 盛 则 近 谀 p。” 呜 + + 呼!师道之不复,可知矣。巫医乐师百工之 + 人,君子不齿 q,今其智乃 r 反不能及,其可 + 怪也欤 s ! + + 圣 人 无 常 师 t。 孔 子 师 郯 子 u、 苌 弘 v、 + 师襄 @3、老聃 @4。郯子之徒 @5,其贤 @6 不及孔 + 子。孔子曰:三人行,则必有我师 @7。是故弟 + 子不必 @8 不如师,师不必贤 @9 于弟子,闻道有 + +a 〔身〕自己。 o 〔年相若〕年龄差不多。 +b 〔耻师〕以从师学习为耻。 p 〔位卑则足羞,官盛则近谀(yú)〕以地位低者为 +c 〔惑〕糊涂。 +d 〔童子〕未成年的男子。 师,就感到十分耻辱;以官职高者为师,就觉得是 +e 〔授之书而习其句读(dòu)〕教给他书本的文字, 近乎谄媚。谀,谄媚奉承。 + q 〔不齿〕不与同列,意思是看不起。齿,并列、排列。 + ( 帮 助 他 ) 学 习 句 读。 句 读, 指 断 开 句 子 的 知 识。 r 〔乃〕竟。 + 一句话后面的停顿为句,一句话中间短暂的停顿为 s 〔欤(yú)〕语气助词,表示感叹。 + 读。古书没有标点,所以要学习句读。 t 〔常师〕固定的老师。 +f 〔句读之不知〕不明句读。下文“惑之不解”结 u 〔郯(tán)子(生卒年不详)〕春秋时郯国(今山 + 构同此。 东郯城一带)的国君,孔子曾向他请教官职的名称。 +g 〔或师焉,或不(fǒu)焉〕有的向老师学习,有的 v 〔苌(cháng)弘(生卒年不详)〕周敬王时的大夫, + 不向老师学习。前一个“或”指代“句读之不知”, 孔子曾向他请教过音乐方面的事情。 + 后一个“或”指代“惑之不解”。不,同“否”。 w 〔师襄(生卒年不详)〕春秋时鲁国的乐官,孔子曾 +h 〔小学而大遗〕小的方面要学习,大的方面却放 跟他学过琴。 + 弃了。 x 〔老聃(dān)〕即老子,孔子曾向他问过礼。 +i 〔巫医〕古代巫和医不分,故并举。巫主要以祝祷、 y 〔郯子之徒〕郯子那些人(指上面说的四个人)。 + 占卜等为业,也为人治病。 徒,同类的人。 +j 〔乐师〕以演奏音乐为职业的人。 z 〔贤〕才德优秀。 +k 〔百工〕泛指各种工匠。 @7 〔三人行,则必有我师〕语出《论语·述而》。原句 +l 〔不耻相师〕不以拜别人为师为耻。 是:“三人行,必有我师焉。” +m 〔族〕类。 @8 〔不必〕不一定。 +n 〔曰师曰弟子云者〕说谁是谁的老师、谁是谁的学 @9 〔贤〕超过。 + 生之类的话。云者,如此之类。 + +86 语文 必修上册 + 先后,术业 a 有专攻 b,如是而已。 + 李氏子蟠 c,年十七,好古文 d,六艺经传 e 皆通 f 习之,不拘于 + +时 g,学于余。余嘉 h 其能行古道 i,作《师说》以贻 j 之。 + + 学习提示 + + 《劝学》和《师说》都是我国古代探讨学习问题的名篇。熟读这两篇文章, + 找出文中谈学习的名句,推敲句子的含义,以此为基础把握两篇文章关于学习的 + 主要观点。 + + 阅读时,要注意联系作者的思想主张和写作背景来理解文章的观点,分析作 + 者提出观点的依据。例如,荀子为何如此强调后天学习的重要性?韩愈是针对怎 + 样的现状倡导师道回归的?这需要分别结合荀子的“性恶论”、韩愈所处时代士 + 大夫“耻学于师”的风气来理解。还可以结合今天的社会生活,说说荀子和韩愈 + 的学习观中,哪些仍然值得借鉴,哪些需要更新并赋予其新的内涵。 + + “而”是古代汉语中常见的连词,可用于表示并列、承接、递进、转折、修 + 饰等多种语义关系。这两篇文章中的许多语句用了“而”,诵读时注意体会这些 + “而”字表现的语义关系。 + + 背诵课文《劝学》全篇和《师说》的第 1 段。 + +a 〔术业〕学术技艺。 其中《乐》久已失传。传,古代解释经书的著作。 +b 〔专攻〕专门学习或研究。攻,学习、研究。 f 〔通〕全面。 +c 〔李氏子蟠〕李家的孩子叫蟠的。即李蟠,唐德宗 g 〔不拘于时〕不受时俗的限制。时,时俗,指当时 + + 贞元十九年(803)进士。 士大夫中耻于从师的不良风气。 +d 〔古文〕指先秦两汉时期的散文,与骈文相对。 h 〔嘉〕赞许。 +e 〔六艺经传(zhuàn)〕六经的经文和传文。六艺, i 〔古道〕指古人从师之道。 + j 〔贻(yí)〕赠送。 + 指《诗》《书》《礼》《乐》《易》《春秋》六种经书, + 第六单元 87 + 11 + + 反对党八股 a + + (节选) + + (一九四二年二月八日) + + 毛泽东 + + 现在来分析一下党八股的坏处在什么地方。我们也仿照八股文章 b + 的笔法来一个“八股”,以毒攻毒,就叫做八大罪状吧。 + + 党八股的第一条罪状是:空话连篇,言之无物。我们有些同志欢喜 + 写长文章,但是没有什么内容,真是“懒婆娘的裹脚,又长又臭”。为 + 什么一定要写得那么长,又那么空空洞洞的呢?只有一种解释,就是下 + 决心不要群众看。因为长而且空,群众见了就摇头,哪里还肯看下去 + 呢?只好去欺负幼稚的人,在他们中间散布坏影响,造成坏习惯。去年 + 六月二十二日,苏联进行那么大的反侵略战争,斯大林在七月三日发表 + 了一篇演说 c,还只有我们《解放日报》d 一篇社论那样长。要是我们 + 的老爷写起来,那就不得了,起码得有几万字。现在是在战争的时期, + 我们应该研究一下文章怎样写得短些,写得精粹些。延安虽然还没有战 + 争,但军队天天在前方打仗,后方也唤工作忙,文章太长了,有谁来看 + 呢?有些同志在前方也喜欢写长报告。他们辛辛苦苦地写了,送来了, + 其目的是要我们看的。可是怎么敢看呢?长而空不好,短而空就好吗? + 也不好。我们应当禁绝一切空话。但是主要的和首先的任务,是把那些 + 又长又臭的懒婆娘的裹脚,赶快扔到垃圾桶里去。或者有人要说:《资 + 本论》不是很长的吗?那又怎么办?这是好办的,看下去就是了。俗话 + 说:“到什么山上唱什么歌。”又说:“看菜吃饭,量体裁衣。”我们无论 + 做什么事都要看情形办理,文章和演说也是这样。我们反对的是空话连 + 篇言之无物的八股调,不是说任何东西都以短为好。战争时期固然需要 + +a 选自《毛泽东选集》第三卷(人民出版社 1991 年 c 〔斯大林在七月三日发表了一篇演说〕 1941 年 6 月 + 版)。 22 日,纳粹德国背信弃义进攻苏联。斯大林在 7 月 + 3 日发表广播演说,号召苏联人民起来保卫祖国, +b 〔八股文章〕即八股文,是明清科举考试的一种文 打败敌人,争取胜利。全文不到 4000 字。 + 体,在字数、体式、语气、题旨和思想内容上均有 + 严格限定,是封建统治者束缚人们思想、维护自身 d 〔《解放日报》〕当时中共中央的机关报,1941 年 5 月 + 统治的工具。 16 日在延安创刊,1947 年 3 月 27 日停刊。 + +88 语文 必修上册 + 短文章,但尤其需要有内容的文章。最不应该、最要反对的是言之无物 + 的文章。演说也是一样,空话连篇言之无物的演说,是必须停止的。 + + 党八股的第二条罪状是:装腔作势,借以吓人。有些党八股,不只 + 是空话连篇,而且装样子故意吓人,这里面包含着很坏的毒素。空话 + 连篇,言之无物,还可以说是幼稚;装腔作势,借以吓人,则不但是幼 + 稚,简直是无赖了。鲁迅曾经批评过这种人,他说:“辱骂和恐吓决不 + 是战斗 a。”科学的东西,随便什么时候都是不怕人家批评的,因为科 + 学是真理,决不怕人家驳。主观主义和宗派主义的东西,表现在党八股 + 式的文章和演说里面,却生怕人家驳,非常胆怯,于是就靠装样子吓 + 人;以为这一吓,人家就会闭口,自己就可以“得胜回朝”了。这种装 + 腔作势的东西,不能反映真理,而是妨害真理的。凡真理都不装样子吓 + 人,它只是老老实实地说下去和做下去。从前许多同志的文章和演说里 + 面,常常有两个名词:一个叫做“残酷斗争”,一个叫做“无情打击”。 + 这种手段,用了对付敌人或敌对思想是完全必要的,用了对付自己的同 + 志则是错误的。党内也常常有敌人和敌对思想混进来,如《苏联共产党 +(布)历史简要读本》结束语第四条所说的那样。对于这种人,毫无疑 + 义地是应该采用残酷斗争或无情打击的手段的,因为那些坏人正在利 + 用这种手段对付党,我们如果还对他们宽容,那就会正中坏人的奸计。 + 但是不能用同一手段对付偶然犯错误的同志;对于这类同志,就须使用 + 批评和自我批评的方法,这就是《苏联共产党(布)历史简要读本》结 + 束语第五条所说的方法。从前我们那些同志之所以向这些同志也大讲其 +“残酷斗争”和“无情打击”,一方面是没有分析对象,一方面就是为着 + 装腔作势,借以吓人。无论对什么人,装腔作势借以吓人的方法,都是 + 要不得的。因为这种吓人战术,对敌人是毫无用处,对同志只有损害。 + 这种吓人战术,是剥削阶级以及流氓无产者 b 所惯用的手段,无产阶级 + 不需要这类手段。无产阶级的最尖锐最有效的武器只有一个,那就是严 + 肃的战斗的科学态度。共产党不靠吓人吃饭,而是靠马克思列宁主义的 + 真理吃饭,靠实事求是吃饭,靠科学吃饭。至于以装腔作势来达到名誉 + 和地位的目的,那更是卑劣的念头,不待说的了。总之,任何机关做决 + 定,发指示,任何同志写文章,做演说,一概要靠马克思列宁主义的真 + +a 〔辱骂和恐吓决不是战斗〕这是鲁迅的一篇文章的 剥削,失去土地和职业的一部分人。他们大多是破 + 题目。最初发表于 1932 年 12 月 15 日《文学月报》 产的农民和失业的手工业者,常常以不正当的活动 + 第一卷第五、六号合刊上,后编入《南腔北调集》。 (如偷盗、欺骗、恐吓等)谋生。 + +b 〔流氓无产者〕指旧社会中受反动统治阶级压迫和 + + 第六单元 89 + 理,要靠有用。只有靠了这个才能争取革命胜利,其他都是无益的。 + 党八股的第三条罪状是:无的放矢,不看对象。早几年,在延安城 + + 墙上,曾经看见过这样一个标语:“工人农民联合起来争取抗日胜利。” + 这个标语的意思并不坏,可是那工人的工字第二笔不是写的一直,而是 + 转了两个弯子,写成了“ ”字。人字呢?在右边一笔加了三撇,写成 + 了“ ”字。这位同志是古代文人学士的学生是无疑的了,可是他却 + 要写在抗日时期延安这地方的墙壁上,就有些莫名其妙了。大概他的意 + 思也是发誓不要老百姓看,否则就很难得到解释。共产党员如果真想做 + 宣传,就要看对象,就要想一想自己的文章、演说、谈话、写字是给什 + 么人看、给什么人听的,否则就等于下决心不要人看,不要人听。许多 + 人常常以为自己写的讲的人家都看得很懂,听得很懂,其实完全不是那 + 么一回事,因为他写的和讲的是党八股,人家哪里会懂呢?“对牛弹琴” + 这句话,含有讥笑对象的意思。如果我们除去这个意思,放进尊重对象 + 的意思去,那就只剩下讥笑弹琴者这个意思了。为什么不看对象乱弹一 + 顿呢?何况这是党八股,简直是老鸦声调,却偏要向人民群众哇哇地叫。 + 射箭要看靶子,弹琴要看听众,写文章做演说倒可以不看读者不看听众 + 吗?我们和无论什么人做朋友,如果不懂得彼此的心,不知道彼此心里 + 面想些什么东西,能够做成知心朋友吗?做宣传工作的人,对于自己的 + 宣传对象没有调查,没有研究,没有分析,乱讲一顿,是万万不行的。 + + 党八股的第四条罪状是:语言无味,像个瘪三 a。上海人叫小瘪三 + 的那批角色,也很像我们的党八股,干瘪得很,样子十分难看。如果一 + 篇文章,一个演说,颠来倒去,总是那几个名词,一套“学生腔”,没 + 有一点生动活泼的语言,这岂不是语言无味,面目可憎,像个瘪三吗? + 一个人七岁入小学,十几岁入中学,二十多岁在大学毕业,没有和人 + 民群众接触过,语言不丰富,单纯得很,那是难怪的。但我们是革命 + 党,是为群众办事的,如果也不学群众的语言,那就办不好。现在我们 + 有许多做宣传工作的同志,也不学语言。他们的宣传,乏味得很;他们 + 的文章,就没有多少人欢喜看;他们的演说,也没有多少人欢喜听。为 + 什么语言要学,并且要用很大的气力去学呢?因为语言这东西,不是随 + 便可以学好的,非下苦功不可。第一,要向人民群众学习语言。人民的 + 语汇是很丰富的,生动活泼的,表现实际生活的。我们很多人没有学好 + +a 〔瘪三〕新中国成立前,上海人称城市中无正当职 + 业而以乞讨或偷窃为生的游民。 + +90 语文 必修上册 + 语言,所以我们在写文章做演说时没有几句生动活泼切实有力的话,只 +有死板板的几条筋,像瘪三一样,瘦得难看,不像一个健康的人。第 +二,要从外国语言中吸收我们所需要的成分。我们不是硬搬或滥用外国 +语言,是要吸收外国语言中的好东西,于我们适用的东西。因为中国原 +有语汇不够用,现在我们的语汇中就有很多是从外国吸收来的。例如今 +天开的干部大会,这“干部”两个字,就是从外国学来的。我们还要多 +多吸收外国的新鲜东西,不但要吸收他们的进步道理,而且要吸收他们 +的新鲜用语。第三,我们还要学习古人语言中有生命的东西。由于我们 +没有努力学习语言,古人语言中的许多还有生气的东西我们就没有充分 +地合理地利用。当然我们坚决反对去用已经死了的语汇和典故,这是确 +定了的,但是好的仍然有用的东西还是应该继承。现在中党八股毒太深 +的人,对于民间的、外国的、古人的语言中有用的东西,不肯下苦功去 +学,因此,群众就不欢迎他们枯燥无味的宣传,我们也不需要这样蹩 +脚 a 的不中用的宣传家。什么是宣传家?不但教员是宣传家,新闻记者 +是宣传家,文艺作者是宣传家,我们的一切工作干部也都是宣传家。比 +如军事指挥员,他们并不对外发宣言,但是他们要和士兵讲话,要和人 +民接洽,这不是宣传是什么?一个人只要他对别人讲话,他就是在做宣 +传工作。只要他不是哑巴,他就总有几句话要讲的。所以我们的同志都 +非学习语言不可。 + + 党八股的第五条罪状是:甲乙丙丁,开中药铺。你们去看一看中 +药铺,那里的药柜子上有许多抽屉格子,每个格子上面贴着药名,当 +归、熟地、大黄、芒硝,应有尽有。这个方法,也被我们的同志学到 +了。 写 文 章, 做 演 说, 著 书, 写 报 告, 第 一 是 大 壹 贰 叁 肆, 第 二 是 +小一二三四,第三是甲乙丙丁,第四是子丑寅卯,还有大 ABCD,小 +abcd,还有阿拉伯数字,多得很!幸亏古人和外国人替我们造好了这许 +多符号,使我们开起中药铺来毫不费力。一篇文章充满了这些符号,不 +提出问题,不分析问题,不解决问题,不表示赞成什么,反对什么,说 +来说去还是一个中药铺,没有什么真切的内容。我不是说甲乙丙丁等字 +不能用,而是说那种对待问题的方法不对。现在许多同志津津有味于这 +个开中药铺的方法,实在是一种最低级、最幼稚、最庸俗的方法。这种 +方法就是形式主义的方法,是按照事物的外部标志来分类,不是按照事 +物的内部联系来分类的。单单按照事物的外部标志,使用一大堆互相 + +a 〔蹩(bié)脚〕本领不强。 + + 第六单元 91 + 没有内部联系的概念,排列成一篇文章、一篇演说或一个报告,这种办 + 法,他自己是在做概念的游戏,也会引导人家都做这类游戏,使人不用 + 脑筋想问题,不去思考事物的本质,而满足于甲乙丙丁的现象罗列。什 + 么叫问题?问题就是事物的矛盾。哪里有没有解决的矛盾,哪里就有问 + 题。既有问题,你总得赞成一方面,反对另一方面,你就得把问题提出 + 来。提出问题,首先就要对于问题即矛盾的两个基本方面加以大略的调 + 查和研究,才能懂得矛盾的性质是什么,这就是发现问题的过程。大略 + 的调查和研究可以发现问题,提出问题,但是还不能解决问题。要解决 + 问题,还须作系统的周密的调查工作和研究工作,这就是分析的过程。 + 提出问题也要用分析,不然,对着模糊杂乱的一大堆事物的现象,你就 + 不能知道问题即矛盾的所在。这里所讲的分析过程,是指系统的周密的 + 分析过程。常常问题是提出了,但还不能解决,就是因为还没有暴露事 + 物的内部联系,就是因为还没有经过这种系统的周密的分析过程,因而 + 问题的面貌还不明晰,还不能做综合工作,也就不能好好地解决问题。 + 一篇文章或一篇演说,如果是重要的带指导性质的,总得要提出一个什 + 么问题,接着加以分析,然后综合起来,指明问题的性质,给以解决的 + 办法,这样,就不是形式主义的方法所能济事。因为这种幼稚的、低级 + 的、庸俗的、不用脑筋的形式主义的方法,在我们党内很流行,所以必 + 须揭破它,才能使大家学会应用马克思主义的方法去观察问题、提出问 + 题、分析问题和解决问题,我们所办的事才能办好,我们的革命事业才 + 能胜利。 + + 党八股的第六条罪状是:不负责任,到处害人。上面所说的那些, + 一方面是由于幼稚而来,另一方面也是由于责任心不足而来的。拿洗脸 + 作比方,我们每天都要洗脸,许多人并且不止洗一次,洗完之后还要拿 + 镜子照一照,要调查研究一番,(大笑)生怕有什么不妥当的地方。你们 + 看,这是何等地有责任心呀!我们写文章,做演说,只要像洗脸这样负 + 责,就差不多了。拿不出来的东西就不要拿出来。须知这是要去影响别 + 人的思想和行动的啊!一个人偶然一天两天不洗脸,固然也不好,洗后 + 脸上还留着一个两个黑点,固然也不雅观,但倒并没有什么大危险。写 + 文章做演说就不同了,这是专为影响人的,我们的同志反而随随便便, + 这就叫做轻重倒置。许多人写文章,做演说,可以不要预先研究,不要 + 预先准备;文章写好之后,也不多看几遍,像洗脸之后再照照镜子一样, + 就马马虎虎地发表出去。其结果,往往是“下笔千言,离题万里”,仿佛 + 像个才子,实则到处害人。这种责任心薄弱的坏习惯,必须改正才好。 + +92 语文 必修上册 + 第七条罪状是:流毒全党,妨害革命。第八条罪状是:传播出去, +祸国殃民。这两条意义自明,无须多说。这就是说,党八股如不改革, +如果听其发展下去,其结果之严重,可以闹到很坏的地步。党八股里 +面藏的是主观主义、宗派主义的毒物,这个毒物传播出去,是要害党 +害国的。 + + 上面这八条,就是我们申讨党八股的檄文 a。 + 党八股这个形式,不但不便于表现革命精神,而且非常容易使革命 +精神窒息。要使革命精神获得发展,必须抛弃党八股,采取生动活泼新 +鲜有力的马克思列宁主义的文风。这种文风,早已存在,但尚未充实, +尚未得到普遍的发展。我们破坏了洋八股和党八股之后,新的文风就可 +以获得充实,获得普遍的发展,党的革命事业,也就可以向前推进了。 + + 学习提示 + + 《反对党八股》是毛泽东于 1942 年 2 月 8 日在延安干部会上的讲话。当时, + 抗日战争处于最艰难的相持阶段,根据地的生存尚且艰难,但是中国共产党人 + 仍然花费宝贵的时间和精力来讨论文风问题,其原因何在?阅读时要注意思考, + 以理解这篇文章的针对性和现实意义。 + + 这篇文章列举了党八股的多条罪状,重点批判了教条主义、主观主义和宗派 + 主义;在批判的同时也提出了正确的主张,倡导理论联系实际的马克思主义学风 + 和文风。阅读时可以看到,这篇文章的表达方式和语言风格与作者提倡的文风是 + 一致的。 + + 这篇文章说理切中要害,深入浅出,语言特点鲜明。找出文中典型的语句, + 归纳其特点,尝试从表达目的、听众感受等角度品评其表达效果。 + +a 〔檄(xí)文〕古代用于晓谕、征召、声讨等的文 + 书,特指声讨敌人或叛逆者的文书。 + + 第六单元 93 + 12 + + 拿来主义 a + + 鲁 迅 + + 中国一向是所谓“闭关主义 b”,自己不去,别人也不许来。自从 + 给枪炮打破了大门之后,又碰了一串钉子 c,到现在,成了什么都是 +“送去主义”了。别的且不说罢,单是学艺 d 上的东西,近来就先送一 + 批古董到巴黎去展览 e,但终“不知后事如何”;还有几位“大师”们 + 捧着几张古画和新画,在欧洲各国一路的挂过去,叫作“发扬国光 f”。 + 听说不远还要送梅兰芳博士到苏联去,以催进“象征主义 g”,此后是 + 顺便到欧洲传道。我在这里不想讨论梅博士演艺和象征主义的关系,总 + 之,活人替代了古董,我敢说,也可以算得显出一点进步了。 + + 但我们没有人根据了“礼尚往来”的仪节,说道:拿来! + 当然,能够只是送出去,也不算坏事情,一者见得丰富,二者见得 + 大度。尼采 h 就自诩过他是太阳,光热无穷,只是给与,不想取得。然 + 而尼采究竟不是太阳,他发了疯。中国也不是,虽然有人说,掘起地下 + 的煤来,就足够全世界几百年之用。但是,几百年之后呢?几百年之 + 后,我们当然是化为魂灵,或上天堂,或落了地狱,但我们的子孙是在 + 的,所以还应该给他们留下一点礼品。要不然,则当佳节大典之际,他 + 们拿不出东西来,只好磕头贺喜,讨一点残羹冷炙 i 做奖赏。 + +a 选自《且介亭杂文》(《鲁迅全集》第六卷,人民文 g 〔象征主义〕 1934 年 5 月 28 日《大晚报》报道:“苏 + 学出版社 2005 年版)。 俄艺术界向分写实与象征两派,现写实主义已渐没 + 落,而象征主义则经朝野一致提倡,引成欣欣向荣 +b 〔闭关主义〕指清政府奉行的闭关自守政策。 之概。自彼邦艺术家见我国之书画作品深合象征派 +c 〔碰了一串钉子〕指鸦片战争以后,清政府与英、 后,即忆及中国戏剧亦必采取象征主义。因拟…… + 邀 中 国 戏 曲 名 家 梅 兰 芳 等 前 往 奏 艺。” 鲁 迅 曾 在 + 法、俄、日、美、德、意等国家相继签订了一系列 《谁在没落?》一文中批评《大晚报》的这种歪曲 + 丧权辱国的不平等条约。 报道。 +d 〔学艺〕泛指学术文艺。 +e 〔送一批古董到巴黎去展览〕指当时国民党政府在 h 〔尼采(1844—1900)〕德国哲学家,唯意志论者。 + 巴黎举办的中国古典艺术展览。 宣扬“超人”哲学。这里所述尼采的话,见于他的 +f 〔发扬国光〕 1932 年至 1934 年间,美术家徐悲鸿、 《查拉图斯特拉如是说·序言》。 + 刘海粟曾分别去欧洲一些国家举办中国美术展览或 + 个人美术作品展览。“发扬国光”是 1934 年 5 月 28 i 〔残羹冷炙〕吃剩的饭菜,喻指权贵的施舍。 + 日《大晚报》报道这些消息时的用语。 + +94 语文 必修上册 + 这种奖赏,不要误解为“抛来”的东西,这是“抛给”的,说得冠 + 冕 a 些,可以称之为“送来”,我在这里不想举出实例 b。 + + 我在这里也并不想对于“送去”再说什么,否则太不“摩登 c” + 了。我只想鼓吹我们再吝啬一点,“送去”之外,还得“拿来”,是为 +“拿来主义”。 + + 但我们被“送来”的东西吓怕了。先有英国的鸦片,德国的废枪 + 炮,后有法国的香粉,美国的电影,日本的印着“完全国货”的各种小 + 东西。于是连清醒的青年们,也对于洋货发生了恐怖。其实,这正是因 + 为那是“送来”的,而不是“拿来”的缘故。 + + 所以我们要运用脑髓,放出眼光,自己来拿! + 譬如罢,我们之中的一个穷青年,因为祖上的阴功 d(姑且让我这 + 么说说罢),得了一所大宅子,且不问他是骗来的,抢来的,或合法继 + 承的,或是做了女婿换来的 e。那么,怎么办呢?我想,首先是不管 + 三七二十一,“拿来”!但是,如果反对这宅子的旧主人,怕给他的东西 + 染污了,徘徊不敢走进门,是孱头 f ;勃然大怒,放一把火烧光,算是 + 保存自己的清白,则是昏蛋。不过因为原是羡慕这宅子的旧主人的,而 + 这回接受一切,欣欣然的蹩进卧室,大吸剩下的鸦片,那当然更是废物。 +“拿来主义”者是全不这样的。 + 他占有,挑选。看见鱼翅,并不就抛在路上以显其“平民化”,只 + 要有养料,也和朋友们像萝卜白菜一样的吃掉,只不用它来宴大宾;看 + 见鸦片,也不当众摔在毛厕 g 里,以见其彻底革命,只送到药房里去, + 以供治病之用,却不弄“出售存膏,售完即止”的玄虚 h。只有烟枪和 + 烟灯,虽然形式和印度,波斯 i,阿剌伯 j 的烟具都不同,确可以算是 + 一种国粹 k,倘使背着周游世界,一定会有人看,但我想,除了送一点 + 进博物馆之外,其余的是大可以毁掉的了。还有一群姨太太,也大以请 + 她们各自走散为是,要不然,“拿来主义”怕未免有些危机。 + +a 〔冠冕〕意思是很体面,有气派。冕,天子、诸侯、 给记功,可以泽及后代子孙。 + 卿、大夫所戴的礼帽,后来专指帝王的礼帽。 e 〔做了女婿换来的〕这里是讽刺以做富翁家的女婿 + +b 〔我在这里不想举出实例〕 1933 年 6 月 4 日,国民 为荣的邵洵美等人。 + 党政府和美国在华盛顿签订五千万美元的“棉麦借 f 〔孱(càn)头〕懦弱无能的人。 + 款”协定,购买美国的小麦、面粉和棉花。这里指 g 〔毛厕〕现在写作“茅厕”。 + 的可能是这一类事。 h 〔玄虚〕这里指用来掩盖真相、使人迷惑的手段。 + i 〔波斯〕伊朗的旧称。 +c 〔摩登〕英语 modern 的音译,意思是现代的、时 j 〔阿剌伯〕现在译作“阿拉伯”。 + 髦的。 k 〔国粹〕原指我国固有文化中的精华,这里是反语。 + +d 〔阴功〕迷信的说法,认为人们做了好事,阴间就 第六单元 95 + 总之,我们要拿来。我们要或使用,或存放,或毁灭。那么,主人 + 是新主人,宅子也就会成为新宅子。然而首先要这人沉着,勇猛,有辨 + 别,不自私。没有拿来的,人不能自成为新人,没有拿来的,文艺不能 + 自成为新文艺。 + + 六月四日 a。⑨ + + 学习提示 + + 议论性文章往往具有鲜明的针对性。查找相关资料,了解本文的写作背景, + 思考文章是针对什么问题而写的,提出了怎样的观点,对我们有什么启示。 + + 这篇文章将不同现象进行归类,直接予以批驳,确立自己的观点。阅读 + 时,梳理和把握论述的脉络层次,学习破立结合的写法,感受文章蕴含的批判 + 力量。 + + 作者善于运用比喻来证明观点,阐述自己的主张。找出文中比喻论证的例 + 子,分析作者是怎样有效地进行论证的,体会比喻论证的表达效果。 + +a 〔六月四日〕指 1934 年 6 月 4 日。 + +96 语文 必修上册 + 13 + + 读书:目的和前提 a + + 黑 塞 + + 真正的修养不追求任何具体目的,一如所有为了自我完善而作的努 +力,本身便有意义。对于教养也即精神和心灵完善的追求,并非是朝向 +某些狭隘目标的艰难跋涉,而是我们自我意识的增强和扩展,从而使我 +们生活更加丰富多彩,享受更多更大的幸福。因此,真正的修养一如真 +正的体育,既是完成同时又是激励,随处都可到达终点却又从不停歇, +永远都在半道上,与宇宙共振,于永恒中生存。它的目的不在于提高这 +种或那种能力和本领,而在于帮助我们找到生活的意义,正确认识过 +去,以大无畏的精神迎接未来。 + + 为获得真正的教养可以走不同的道路。最重要的途径之一,就是研 +读世界文学,就是逐渐地熟悉掌握各国作家和思想家的作品,尤其是他 +们在作品中留给我们的思想、经验和理想的巨大财富。这条路永无止 +境,任何人也不可能在什么时候走到尽头;任何人也不可能在什么时候 +将哪怕仅仅只是一个文化发达民族的全部文学通通读完,更别提整个人 +类的文学了。然而,对每一部思想家或作家的杰作的深入理解,都会使 +你感到满足和幸福——不是因为获得了僵死的知识,而是有了鲜活的意 +识和理解。对于我们来说,问题不在于尽可能地多读、多知道,而在于 +自由地选择我们个人闲暇时能完全沉浸其中的杰作,领略人类所思、所 +求的广阔和丰盈,从而在自己与整个人类之间,建立起息息相通的生动 +联系,使自己的心脏随着人类心脏的跳动而跳动。这,归根到底是一切 +生活的意义,如果活着不仅仅是为着满足那些赤裸裸的需要的话。读书 +绝不是要使我们“散心消遣”,倒是要使我们集中心智;不是要用虚假 +的慰藉来麻痹我们,使我们对无意义的人生视而不见,而是正好相反, +要帮助我们将自己的人生变得越来越充实、高尚,越来越有意义。 + +a 选自《读书》1990 年第 4 期。杨武能编译。有删改。 + 黑塞(1877—1962),德国作家、诗人。获 1946 年 + 诺贝尔文学奖。 + + 第六单元 97 + 要想建立与世界文学的生动联系,读者的第一要务乃是认识自己, + 进而认识那些特别能引起共鸣的作品,而不要遵循任何的模式或者教学 + 大纲!他必须走一条爱之路,而非义务之路。仅仅因为某部作品有名, + 因为羞于不了解它就强迫自己去阅读,实乃大错而特错。恰恰相反,每 + 个人都该在他感觉最自然的地方,开始对书籍的阅读、了解和喜爱。有 + 的人在学生时代已早早发现自己对优美诗歌的爱好,也有人更爱好历史 + 和乡土传说;有的人也许喜欢民歌,还有人觉得阅读那种细致考察我们 + 心灵的感受并给予高度理性解释的作品,更加富有魅力和令人欣喜。阅 + 读之路有千万条。可以从小学课本和日历出发,而终结于莎士比亚、歌 + 德或者但丁。一本别人称赞而我们也试图阅读却引不起兴趣的作品,一 + 本令我们反感、无法读进去的作品,千万别强迫自己耐着性子硬往下 + 读,应该干脆放弃。所以也不要过分鼓励和规劝小孩子和年轻人去读某 + 一专门范围内的书;否则,会搞得他们终生厌恶那些最优美的著作,是 + 的,甚至厌恶读书本身。让每个人凭自己的爱好去开始阅读,读一部文 + 学作品或者一首诗,或者一则报道、一篇论文,以此为出发点,然后再 + 扩而大之。 + + 世界文学的辉煌殿堂对每一位有志者都敞开着,谁也不必对它收藏 + 之丰富望洋兴叹,因为问题不在于数量。有的人一生中只读过十来本 + 书,却仍然不失为真正的读书人。还有人见书便生吞下去,对什么都能 + 说上几句,然而一切努力全都白费。因为教养得有一个可教养的客体作 + 前提,那就是个性或人格。没有这个前提,教养在一定意义上便落了 + 空,纵然能积累某些知识,却不会产生爱和生命。没有爱的阅读,没有 + 敬重的知识,没有心的教养,是戕害性灵的最严重的罪过之一。 + + 为了说清楚富有个性地、生动热情地与书籍打交道大概是个什么情 + 况,我别无他法,只好将我本人迷恋阅读的一些情形如实相告。我早早 + 地开始了读书生活,也知道应该努力去正确而恰当地选读世界文学。我 + 广泛涉猎,认为了解和懂得某些生疏的事物乃是自己的责任。殊不知这 + 种将读书当作学习,以教养和公平为阅读外国文学的目的和准则的方 + 法,实在不合我的天性;相反,在书籍的世界中,总不断有某种特殊的 + 爱好使我着迷,有某个新发现令我神往,有某种新的热情叫我兴奋不 + 已。许多这样的热情交替出现,有的过一定时期去而复来,有的出现一 + 次便永远消失了…… + + 少年时代,我唯一熟悉并可以利用的是我祖父的巨大藏书室。在它 + 数以千计的卷帙里面,绝大多数我一点不感兴趣,也永远不会再感兴 + +98 语文 必修上册 + 趣。可是就在这故书堆中,渐渐地,我也发现了另一类东西。一开始吸 +引我的只是不多的那么几本书;但正是它们,促使我慢慢地将这显得如 +此无聊的藏书整个翻了一遍,并且终于发掘到自己感兴趣的东西。那不 +过是一部配有格兰威尔引人入胜插图的《鲁滨逊漂流记》,以及两巨册 +1830 年出版的四开的《一千零一夜》的德译本,同样配有插图。这两 +部书告诉我,在灰色的大海里也可以捞到珍珠。从此我便孜孜不倦地搜 +寻大厅中那一个个高高的书架,经常在扶梯顶上一坐就是几个钟头,要 +不便趴在地板上,让周围一摞一摞的书将自己围起来。也是在那个时 +候,我第一次读到了巴尔扎克的名字。书架上有几册还是他生前出版的 +十六开蓝色硬纸面的德译本。我没有忘记,我怎样第一次翻开他的作 +品,却几乎不懂他说些什么。主人公的财务状况竟描写得如此详尽,每 +个月入息多少,从母亲方面得到的遗产是多少,还有希望得到多少遗 +产,以及欠债多少,等等。我大失所望。我所期待的是充满狂热与纠葛 +的故事,是前往陌生国度的旅行,或者是甜蜜而冒险的艳遇;谁知没有 +这一切,却要我去操心一个年轻人,一个还完全陌生的年轻人的钱包! +我厌烦地将那本蓝色小书放回原处,从此许多许多年都没再读巴尔扎 +克,直至很久很久之后重新发现他;这次才是认认真真的发现,一劳永 +逸的发现。 + + 又过了若干年,一次与书籍有关的新体验带给了我满足。在此之 +前,通过父亲的指点,我已认识了老子,最先读的是格里尔(Grill)的 +译本。随后开始出版“中国丛书”,即卫礼贤(Richard Wilhelm)翻译 +的中国经典著作;在我看来,这是当今德国精神生活中最重要的事件之 +一。高度发达的、最高贵的人类文化的精华的一支,以往对于德国读者 +只是陌生的稀罕物,现在已为我们所拥有,不是像往常那样从拉丁文和 +英文转译过来,经由第三者或第四者倒手,而是直接由一位在中国生活 +了半辈子、对中国精神了如指掌的德国人所译。这个德国人不只精通中 +文,也精通德文,并亲身体验到了中国精神对于今日欧洲的意义。“丛 +书”头一本是孔子的《论语》,我永远不会忘记,我在阅读这本书时如 +何惊异和心驰神往,书中所说的一切对我如何既陌生又正确,既符合 +我的预感和期望又美好无比。这套丛书到今天已相当可观。《论语》之 +后又出了《道德经》《庄子》《孟子》《吕氏春秋》和《中国民间童话》。 +与此同时,还有好几位译者在努力重译中国的抒情诗,对中国通俗小说 +的介绍则更加成功。几十年来,我对这些中国典籍的喜爱有增无已,床 +头多半总是摆着其中的某一部。对现实生活的接近,高贵的谨守最高道 + + 第六单元 99 + 德要求的精神与感性的富有乐趣和魅力的日常生活和谐协调——自如地 +周旋于崇高的精神境界与纯真的生活享乐之间。如果说印度在禁欲和僧 +侣式的弃绝尘世方面已臻佳境,令人感动,那么,古代中国在精神修养 +方面创造的奇迹也毫不逊色。在中国人那里,自然与精神,宗教信仰与 +日常生活,不是相互敌对和矛盾,而是相反相成,各得其所。 + + 当今之世,对书籍已经有些轻视了。为数甚多的年轻人,似乎觉得 +舍弃愉快的生活而埋头读书,是既可笑又不值得的;他们认为人生太短 +促,太宝贵,却又挤得出时间一星期去泡六次咖啡馆,在舞池中消磨许 +多时光。可整天待在这些地方,难道就比我们一天留一两个小时去读古 +代哲人和诗人的作品,更能接近真正的生活吗?不错,读得太多可能有 +害,书籍可能成为生活的竞争对手。但尽管如此,我仍然不反对任何人 +倾心于书。让我们每个人都从自己能够理解和喜爱的作品开始阅读吧! +但单靠报纸和偶然得到的流行文学,是学不会真正意义上的阅读的,必 +须读杰作。杰作常常不像时髦读物那么适口,那么富于刺激性。杰作需 +要我们认真对待,需要我们在读的时候花力气,下功夫。我们先得向杰 +作表明自己的价值,才会发现杰作的真正价值。 + + 上图书馆 a + + 王佐良 + + 在什么地方看见西蒙娜·德·波伏瓦 b 说了一句话:她真正钟情的 +是法国国立图书馆。 + + 这地方我去过,在巴黎里胥力欧大街,是一所华美的房子。光这建 +筑,且不讲其中藏的几百万册书,也使人爱它。 + + 于是我想起了上图书馆之乐。 + 在这方面,我是有愉快的回忆的。我在武昌上中学,一个大院子里 +有三所学校:文华中学,华中大学,文华图书科学校。这三所学校是有 + +a 选自《王佐良全集》第十卷(外语教学与研究出版 人,诗人、翻译家。 + 社 2016 年版)。王佐良(1916—1995),浙江上虞 ②〔西蒙娜·德·波伏瓦(1908—1986)〕法国女作家。 + +100 语文 必修上册 + 血亲关系的,这且不表。只说文华图书科学校是当时中国唯一讲授图书 +馆学的高等学府,它拥有一个图书馆,叫作“公书林”,这里有丰富的 +中英文藏书,而且全部开架,连我们中学生也可以进去随便阅览。我在 +文华中学学到了许多东西,至今都怀念我那时的中外老师,但给我知识 +最多的却是这个“公书林”。“公书林”的房子也宽敞,舒服,而且环 +境优雅,至今我都记得馆外的一片绿色和馆内的幽静整洁。我在那里翻 +阅了许多英文小说,当时我的英文程度很有限,多数原著是我看不懂 +的,但是仅仅摸着那些书,看看它们的封面、目录和插图之类也使我高 +兴。当时《中学生》杂志正在介绍斯蒂文生的小说《宝岛》a,我读得 +有趣,对作者的其他小说也产生了好奇心,果然在“公书林”里找到了 +书架上一排斯蒂文生的书,拿下来翻了几本,虽然只记得了它们的书 +名,那个下午却是消磨得很愉快的。 + + “公书林”还帮我养成了一个习惯,即看英文杂志。我就是在它的 +期刊室里第一次接触到一些美国杂志的,如《星期六晚邮刊》《全国地 +理》《美丽的屋子》等,当然也主要是翻着图画看看,这样也就部分地 +满足了我对外间世界的好奇心,也从旁学到了一些英文。 + + 后来我上大学进了清华。清华给我的教益极多,这当中它的图书馆 +又是我的一大恩师。它比“公书林”更神气:文艺复兴式的红色外表, +大理石的门厅,玻璃地板的书库,软木地板的阅览室——当时新建的第 +三阅览室好像有一个足球场那么长,其中各种精美的书刊闪着光,宽 +长的书桌上两端各立一个铜制的高台灯,它们在一个 19 岁青年的心上 +投下了温情和宁静的光,是后来任何日光灯、白炽灯所不能比的。就是 +在这个“指定参考书阅览室”里,我和我的同学好友们读了柏拉图《对 +话》的英译本,西洋哲学史,古罗马史,希腊悲剧,英国 16、17 世纪 +诗剧,等等,进入了一个知识上和情感上的新世界,一片灿烂! + + 真实的世界却在暗淡下来。“七七事变”一起,清华图书馆的灯光 +全灭了。 + + 此后若干年,我发现自己坐在英国牛津大学的包德林图书馆里。一 +间名叫“亨福莱公爵室”的古籍阅览室是我常去之地,那里天花板上有 +彩画,四壁还有过去的名人画像,也是华美的建筑,然而照明相当差。 +当时还有一些古本是用链子锁在书架上的,把它们拉下来摊在桌上看 + +a 〔斯蒂文生的小说《宝岛》〕即英国作家斯蒂文森 + (1850—1894)的小说《金银岛》。 + + 第六单元 101 + 也看得吃力。在这里,中古僧侣修习的遗风犹存,那种一灯如豆一心 + 苦读的空气却与我当时的心情合拍:国内正在进行大战,我的家已无 + 音讯,虽然在做着功课,心里却是很不平静的。只在最后的两个月里, + 论文已经做完,口试也已通过,北平也解放了,我在等船的间隙里在 + 包德林图书馆纵情自由阅读,初夏的阳光给了馆内更多光亮,我的心 + 境也豁然开朗了。 + + 在英国读书的时候,我还去过英国博物馆的圆形图书馆,这就是 + 过去马克思常去的地方。这个大厅也是建筑华美,气象万千,那高耸 + 的大圆顶总使我想起一段台词:“这个覆盖众生的苍穹,这一顶壮丽的 + 帐幕,这个金黄色的火球点缀着的庄严的屋宇……人类是一件多么了 + 不得的杰作!多么高贵的理性!多么伟大的力量!……a” + + 也许是牵强附会吧,但这也说明独拥书城自吟啸固是一乐,上图 + 书馆也有其奇趣。 + + 学习提示 + + 《读书:目的和前提》《上图书馆》都是随笔,两位作者用灵活自由的笔触, + 记述了自己求学读书的生活与感悟。 + + 黑塞从切身体会出发,思考读书的意义。文章充满睿智的思考,又温暖感 + 人。黑塞读中国古代论著的感受,以及他关于修养不追求具体目的、流行读物不 + 能取代经典等看法,都发人深思。找出文中关于读书与修养的名句,细加体味。 + + 王佐良回顾上图书馆的几段经历,那种氛围与乐趣,给我们留下深刻的印 + 象。其中对图书馆的礼赞,体现出作者对知识的崇敬,阅读时注意结合文中引用 + 的莎士比亚戏剧台词加以体会。还可以联系自己的读书生活,思考阅读对于人生 + 的意义。 + +a 〔这个覆盖众生的苍穹……多么伟大的力量!……〕 + 这是英国剧作家莎士比亚戏剧《哈姆莱特》中的 + 台词。 + +102 语文 必修上册 + 单元学习任务 + +一 学会学习,是我们应该具备的基本素养,而良好的学风,又是有效学习的必备条件。 + 围绕“学习之道”,深入阅读本单元课文,完成下列任务。 + 1. 本单元的文章,从不同角度探讨学习问题,阐发了一些深刻的道理。如《劝学》 + 强调“学不可以已”,看似平淡实含至理;《师说》提出“无贵无贱,无长无少, + 道之所存,师之所存”的观点,透辟而振聋发聩;《反对党八股》主张“我们应当 + 禁绝一切空话”,坚决而不留余地。从几篇课文中摘录一些名言警句,谈谈自己的 + 心得体会。 + 2. 本单元的一些文章描述了作者读书求学的经历,如黑塞在祖父的巨大藏书室中捞 + 取“珍珠”,王佐良在清华大学的图书馆感受“新世界”。这些场景带给你什么样 + 的感受?你有过哪些难忘的读书经历?跟同学分享一下。 + +二 本单元的文章以说理为主,运用了多种说理方式,语言也各有特色。《劝学》多以比 + 喻阐发道理,生动形象;《反对党八股》为党八股画像,态度鲜明而又诙谐幽默;《拿 + 来主义》先破后立,睿智犀利而又妙趣横生。阅读本单元课文,梳理作者的论述思 + 路,体会其说理艺术,看看作者是如何阐释“学习之道”的。 + 1. 本单元课文,大都运用了对比的方法说理;《劝学》《反对党八股》《拿来主义》都 + 运用了比喻的方法说理。从课文中分别找出典型的例子,分析对比和比喻的方法 + 在阐发观点上的作用。 + 2. 本单元的文章大都针对现实问题发表议论,往往先批判错误,然后有针对性地提 + 出自己的主张。阅读这些文章,看看文中列举了哪些错误现象,作者又是如何层 + 层辩驳剖析,并给出“药方”的。 + +三 《劝学》是两千多年前荀子对学习问题的朴素认识,《师说》是一千多年前韩愈对“耻 + 学于师”的批评。随着社会的发展变化,我们今天在学习中又遇到了新的难题。针对 + 当下学习中的某些问题,以《“劝学”新说》为题,写一篇不少于 800 字的文章。 + + 第六单元 103 + 议论要有针对性 + + 白居易主张“文章合为时而著,歌诗合为事而作”(《与元九书》),强调诗文创作要 + 关注时代、有针对性。写议论文更应当遵循这一原则,不空发议论,不自说自话,这样 + 文章才能有内涵、有价值,也容易被人接受。 + + 写议论文,要有现实针对性。人们发表议论,往往是针对现实生活中的某个问题, + 古往今来的论说名篇大多如此:《师说》论述师道的内涵,针对的是当时士大夫“耻学于 + 师”的风气;《反对党八股》的批评矛头,则指向当时广泛存在于党内的主观主义、宗派 + 主义倾向。当然,针对性不等于批判性,而是指议论文讨论的问题要有现实基础和现实 + 意义,《劝学》中对学习的意义、态度、方法的论述就是很好的例子。我们写议论文也应 + 该如此,可以从最近发生的新闻事件、值得关注的社会现象、人们关心的某些问题、存 + 在争议的某个说法中发掘议论的对象,对其进行分析论证,启发人们深入思考,以作出 + 正确的判断。 + + 需要说明的是,强调议论的现实针对性,不等于只能把议论局限于某时某事。事实 + 上,好的议论文大多能从对具体问题的讨论中得出具有普遍意义的结论。《拿来主义》有 + 感于《大晚报》的报道,却并不局限于评论“发扬国光”的“送去主义”,所论的“拿 + 来主义”更具有超越一时一事的认识价值。我们平时要多阅读,多思考,深化自己的认 + 识,写作时才能把个别之事与一般之理结合起来。 + + 写议论文,还要有读者意识,这也是一种针对性。人们发表议论,都希望读者能理 + 解自己的思想,接受自己的观点,因此,根据读者的情况选择内容、调整表达方法,就 + 很有必要。毛泽东所说的党八股的罪状之一就是“无的放矢,不看对象”,我们在写议 + 论文时要避免出现这样的问题。写作前可仔细思考:我的文章是为哪些读者写的?他们 + 的年龄、知识层次、阅读能力和阅读喜好如何?他们最关心哪些问题?设想讨论哪些问 + 题会引起读者的兴趣,怎样表达更容易让读者信服,这样才能使议论达到预期效果。 + +104 语文 必修上册 + 第七单元 + + 人们生活在自然之中,而大自然也已深深融入人 + 类的精神世界,成为人类心灵的寄托。通过文学作品 + 对自然的描写反观自然,可以提升对自然美的感悟力, + 激发对自然和生活的热爱之情。 + + 本单元选取的五篇散文,都是写景抒情的名篇, + 有对故都“秋味”的吟唱,对荷塘月色的描写;有北京 + 地坛牵出的人生故事;有夜游赤壁的吊古伤今,登临 + 东岳的畅想。在对大地山川、风物美景的描写中徜徉, + 既可以受到美的熏陶,又能够领会深厚的人文内涵。 + + 学习本单元的写景抒情散文,体会民族审美心理, + 提升文学欣赏品位,培养对自然的热爱之情。要关注作 + 品中的自然景物描写和人生思考,体会作者观察、欣赏 + 和表现自然景物的角度,分析情景交融、情理结合的手 + 法;还要反复涵泳咀嚼,感受作品的文辞之美。 + + 第七单元 105 + 14 + + 故都的秋 a + + 郁达夫 + + 秋天,无论在什么地方的秋天,总是好的;可是啊,北国的秋,却 +特别地来得清,来得静,来得悲凉。我的不远千里,要从杭州赶上青 +岛,更要从青岛赶上北平来的理由,也不过想饱尝一尝这“秋”,这故 +都的秋味。 + + 江南,秋当然也是有的;但草木凋得慢,空气来得润,天的颜色显 +得淡,并且又时常多雨而少风;一个人夹在苏州上海杭州,或厦门香港 +广州的市民中间,混混沌沌地过去,只能感到一点点清凉,秋的味,秋 +的色,秋的意境与姿态,总看不饱,尝不透,赏玩不到十足。秋并不是 +名花,也并不是美酒,那一种半开、半醉的状态,在领略秋的过程上, +是不合适的。 + + 不逢北国之秋,已将近十年了。在南方每年到了秋天,总要想起 +陶然亭 b 的芦花,钓鱼台 c 的柳影,西山 d 的虫唱,玉泉 e 的夜月,潭 +柘寺 f 的钟声。在北平即使不出门去吧,就是在皇城人海之中,租人 +家一椽 g 破屋来住着,早晨起来,泡一碗浓茶,向院子一坐,你也能 +看得到很高很高的碧绿的天色,听得到青天下驯鸽的飞声。从槐树叶 +底,朝东细数着一丝一丝漏下来的日光,或在破壁腰中,静对着像喇 +叭似的牵牛花(朝荣)的蓝朵,自然而然地也能够感觉到十分的秋意。 +说到了牵牛花,我以为以蓝色或白色者为佳,紫黑色次之,淡红者最 + +a 选自《郁达夫全集》第三卷(浙江大学出版社 2007 面,环境清幽,“台下有泉涌出,汇为池,其水至 + 年版)。略有改动。郁达夫(1896—1945),原名郁 冬不竭”(《明一统志》卷一)。 + 文,浙江富阳人,小说家、散文家。因在南洋从事 d 〔西山〕北京西郊群山的总称,是京郊名胜。 + 抗日活动,1945 年 9 月 17 日被日本宪兵秘密杀害于 e 〔玉泉〕指玉泉山,是西山东麓支脉。 + 印度尼西亚的苏门答腊。1952 年,中央人民政府追 f 〔潭柘(zhè)寺〕在北京西山,“相传寺址本在青 + 认他为革命烈士。 龙 潭 上, 有 古 柘 千 章, 寺 以 此 得 名 ”(《 日 下 旧 闻 + 考》卷一〇五)。 +b 〔陶然亭〕在北京城南,亭名出自唐白居易《与梦 g 〔椽(chuán)〕本指放在房檩(lǐn)上架着屋面板 + 得沽酒闲饮且约后期》:“更待菊黄家酿熟,共君一 和瓦的木条。这里作量词。 + 醉一陶然。” + +c 〔钓鱼台〕在北京阜成门外三里河,玉渊潭公园北 + +106 语文 必修上册 + 下。最好,还要在牵牛花底,教长着几根疏疏落落的尖细且长的秋草, +使作陪衬。 + + 北国的槐树,也是一种能使人联想起秋来的点缀。像花而又不是花 +的那一种落蕊,早晨起来,会铺得满地。脚踏上去,声音也没有,气味 +也没有,只能感出一点点极微细极柔软的触觉。扫街的在树影下一阵扫 +后,灰土上留下来的一条条扫帚的丝纹,看起来既觉得细腻,又觉得清 +闲,潜意识下并且还觉得有点儿落寞,古人所说的梧桐一叶而天下知 +秋 a 的遥想,大约也就在这些深沉的地方。 + + 秋蝉的衰弱的残声,更是北国的特产;因为北平处处全长着树,屋 +子又低,所以无论在什么地方,都听得见它们的啼唱。在南方是非要上 +郊外或山上去才听得到的。这嘶叫的秋蝉,在北平可和蟋蟀耗子一样, +简直像是家家户户都养在家里的家虫。 + + 还有秋雨哩,北方的秋雨,也似乎比南方的下得奇,下得有味,下 +得更像样。 + + 在灰沉沉的天底下,忽而来一阵凉风,便息列索落地下起雨来了。 +一层雨过,云渐渐地卷向了西去,天又青了,太阳又露出脸来了;着 b +着很厚的青布单衣或夹袄的都市闲人,咬着烟管,在雨后的斜桥影里, +上桥头树底去一立,遇见熟人,便会用了缓慢悠闲的声调,微叹着互答 +着地说: + + “唉,天可真凉了——”(这了字念得很高,拖得很长。) + “可不是吗?一层秋雨一层凉啦!” + 北方人念阵字,总老像是层字,平平仄仄 c 起来,这念错的歧韵, +倒来得正好。 + 北方的果树,到秋来,也是一种奇景。第一是枣子树;屋角,墙 +头, 茅 房 边 上, 灶 房 门 口, 它 都 会 一 株 株 地 长 大 起 来。 像 橄 榄 又 像 +鸽蛋似的这枣子颗儿,在小椭圆形的细叶中间,显出淡绿微黄的颜色 +的时候,正是秋的全盛时期;等枣树叶落,枣子红完,西北风就要起 +来了,北方便是尘沙灰土的世界,只有这枣子、柿子、葡萄,成熟到 +八九分的七八月之交,是北国的清秋的佳日,是一年之中最好也没有 +的 Golden Daysd。 + +a 〔梧桐一叶而天下知秋〕语出《淮南子·说山训》: b 〔着(zhuó)〕穿。 + “见一叶落而知岁之将暮。”《太平御览》卷二十四 c 〔平平仄仄〕这里指推敲字的声韵。 + 引作“一叶落而知天下秋”。 d 〔 Golden Days 〕意思是黄金般的日子。 + + 第七单元 107 + 有些批评家说,中国的文人学士,尤其是诗人,都带着很浓厚的 +颓废色彩,所以中国的诗文里,颂赞秋的文字特别多。但外国的诗人, +又何尝不然?我虽则外国诗文念得不多,也不想开出账来,做一篇秋 +的诗歌散文钞 a,但你若去一翻英德法意等诗人的集子,或各国的诗文 +的 Anthologyb 来,总能够看到许多关于秋的歌颂与悲啼。各著名的大 +诗人的长篇田园诗或四季诗里,也总以关于秋的部分,写得最出色而 +最有味。足见有感觉的动物,有情趣的人类,对于秋,总是一样地能 +特别引起深沉、幽远、严厉、萧索的感触来的。不单是诗人,就是被 +关闭在牢狱里的囚犯,到了秋天,我想也一定会感到一种不能自已的 +深情;秋之于人,何尝有国别,更何尝有人种阶级的区别呢?不过在 +中国,文字里有一个“秋士 c”的成语,读本里又有着很普遍的欧阳子 +的《秋声》d 与苏东坡的《赤壁赋》等,就觉得中国的文人,与秋的关 +系特别深了。可是这秋的深味,尤其是中国的秋的深味,非要在北方, +才感受得到底。 + + 南国之秋,当然是也有它的特异的地方的,譬如廿四桥的明月 e, +钱塘江的秋潮 f,普陀山 g 的凉雾,荔枝湾 h 的残荷,等等,可是色彩 +不浓,回味不永。比起北国的秋来,正像是黄酒之与白干,稀饭之与馍 +馍,鲈鱼之与大蟹,黄犬之与骆驼。 + + 秋天,这北国的秋天,若留得住的话,我愿意把寿命的三分之二折 +去,换得一个三分之一的零头。 + + 1934 年 8 月,在北平 + +a 〔钞〕文学作品等经过选录而成的集子。 曾在月夜令宫女二十四人吹箫于此,故名。 +b 〔 Anthology 〕英语中指“选集”。 f 〔钱塘江的秋潮〕钱塘江位于浙江,出杭州湾,入东 +c 〔秋士〕古时指到了暮年仍不得志的知识分子。 +d 〔欧阳子的《秋声》〕指北宋欧阳修的《秋声赋》。 海,江口为喇叭状。每年中秋节前后涨潮时,受江口 +e〔廿四桥的明月〕唐杜牧《寄扬州韩绰判官》中有 地形收缩和水深骤减的影响,江面波涛汹涌,潮水以 + 排山倒海之势奔腾向前,形成“钱塘怒潮”景观。 + “二十四桥明月夜,玉人何处教吹箫”的诗句。廿四 g 〔普陀山〕在浙江舟山群岛中的一座小岛上。 + 桥,即二十四桥,在江苏扬州瘦西湖。相传隋炀帝 h 〔荔枝湾〕在广州市。 + +108 语文 必修上册 + 荷塘月色 a + + 朱自清 + + 这几天心里颇不宁静。今晚在院子里坐着乘凉,忽然想起日日走 +过的荷塘,在这满月 b 的光里,总该另有一番样子吧。月亮渐渐地升高 +了,墙外马路上孩子们的欢笑,已经听不见了;妻在屋里拍着闰儿 c, +迷迷糊糊地哼着眠歌。我悄悄地披了大衫,带上门出去。 + + 沿着荷塘,是一条曲折的小煤屑路。这是一条幽僻的路;白天也少 +人走,夜晚更加寂寞。荷塘四面,长着许多树,蓊蓊郁郁 d 的。路的一 +旁,是些杨柳,和一些不知道名字的树。没有月光的晚上,这路上阴森 +森的,有些怕人。今晚却很好,虽然月光也还是淡淡的。 + + 路上只我一个人,背着手踱着。这一片天地好像是我的;我也像超 +出了平常的自己,到了另一世界里。我爱热闹,也爱冷静;爱群居,也 +爱独处。像今晚上,一个人在这苍茫的月下,什么都可以想,什么都可 +以不想,便觉是个自由的人。白天里一定要做的事,一定要说的话,现 +在都可不理。这是独处的妙处,我且受用这无边的荷香月色好了。 + + 曲曲折折的荷塘上面,弥望 e 的是田田 f 的叶子。叶子出水很高, +像亭亭的舞女的裙。层层的叶子中间,零星地点缀着些白花,有袅娜 g +地开着的,有羞涩地打着朵儿的;正如一粒粒的明珠,又如碧天里的星 +星,又如刚出浴的美人。微风过处,送来缕缕清香,仿佛远处高楼上渺 +茫的歌声似的。这时候叶子与花也有一丝的颤动,像闪电般,霎时传过 +荷塘的那边去了。叶子本是肩并肩密密地挨着,这便宛然 h 有了一道凝 +碧的波痕。叶子底下是脉脉 i 的流水,遮住了,不能见一些颜色;而叶 +子却更见风致 j 了。 + + 月光如流水一般,静静地泻在这一片叶子和花上。薄薄的青雾浮起 +在荷塘里。叶子和花仿佛在牛乳中洗过一样,又像笼着轻纱的梦。虽然 + +a 选自《朱自清全集》第一卷(江苏教育出版社 1996 f 〔田田〕形容荷叶相连的样子。汉乐府《江南》中有 + 年版)。 “莲叶何田田”的句子。 + +b 〔满月〕圆月。 g 〔袅娜〕柔美的样子。 +c 〔闰儿〕指作者的次子朱闰生。 h 〔宛然〕仿佛。 +d 〔蓊(wěng)蓊郁郁〕形容树木茂盛的样子。 i 〔脉(mò)脉〕默默,这里形容水没有声音。 +e 〔弥望〕充满视野,满眼。 j 〔风致〕美的姿态。 + + 第七单元 109 + 是满月,天上却有一层淡淡的云,所以不能朗照;但我以为这恰是到了 +好处——酣眠固不可少,小睡也别有风味的。月光是隔了树照过来的, +高处丛生的灌木,落下参差的斑驳的黑影,峭楞楞如鬼一般;弯弯的杨 +柳的稀疏的倩影,却又像是画在荷叶上。塘中的月色并不均匀;但光与 +影有着和谐的旋律,如梵婀玲 a上奏着的名曲。 + + 荷塘的四面,远远近近,高高低低都是树,而杨柳最多。这些树将 +一片荷塘重重围住;只在小路一旁,漏着几段空隙,像是特为月光留下 +的。树色一例 b是阴阴的,乍看像一团烟雾;但杨柳的丰姿,便在烟雾 +里也辨得出。树梢上隐隐约约的是一带远山,只有些大意罢了。树缝里 +也漏着一两点路灯光,没精打采的,是渴睡人的眼。这时候最热闹的, +要数树上的蝉声与水里的蛙声;但热闹是它们的,我什么也没有。 + + 忽然想起采莲的事情来了。采莲是江南的旧俗,似乎很早就有,而 +六朝时为盛;从诗歌里可以约略知道。采莲的是少年的女子,她们是荡 +着小船,唱着艳歌c 去的。采莲人不用说很多,还有看采莲的人。那是一 +个热闹的季节,也是一个风流d 的季节。梁元帝e《采莲赋》里说得好: + + 于是妖童媛女,荡舟心许 f ;鹢首徐回,兼传羽杯 g ;棹将移 + 而藻挂,船欲动而萍开 h。尔其纤腰束素,迁延顾步 i ;夏始春 + 余,叶嫩花初,恐沾裳而浅笑,畏倾船而敛裾 j。 + + 可见当时嬉游的光景了。这真是有趣的事,可惜我们现在早已无福 +消受 k了。 + + 于是又记起《西洲曲》l 里的句子: + + 采莲南塘秋,莲花过人头;低头弄莲子,莲子清如水。 + +a 〔梵婀(ē)玲〕英语 violin的音译,即小提琴。 杯,酒器。 +b 〔一例〕一概,一律。 h 〔棹(zhào)将移而藻挂,船欲动而萍开〕桨要划 +c 〔艳歌〕专门咏唱男女爱情的歌曲。 +d 〔风流〕这里指年轻男女不拘礼法地表露自己的爱情。 动,却被水草挂着;船要移动,就把浮萍分开了。 +e 〔梁元帝〕南朝梁代皇帝萧绎(508—554)。 棹,船桨。 +f 〔妖童媛(yuàn)女,荡舟心许〕艳丽的少男和美貌 i 〔尔其纤腰束素,迁延顾步〕那细细的腰肢,裹着洁 + 白的绸子,走走停停,不住地回视自己的动作。尔 + 的少女,摇着小船互相默默地传情。妖,艳丽。心 其,那。顾,回头看。 + 许,默许。 j 〔敛裾(jū)〕提着衣襟。裾,衣襟。 +g 〔鹢(yì)首徐回,兼传羽杯〕船慢慢地来回摇荡 k 〔消受〕享受。多用于否定式。 + 着,双方传递着酒杯。鹢首,古时画鹢于船头,所 l 〔《西洲曲》〕南朝乐府诗,描写青年女子思念意中人 + 以把船头叫“鹢首”。鹢,水鸟。兼,指双方。羽 的痛苦。 + +110 语文 必修上册 + 今晚若有采莲人,这儿的莲花也算得“过人头”了;只不见一些 +流水的影子,是不行的。这令我到底惦着江南了。——这样想着,猛 +一抬头,不觉已是自己的门前;轻轻地推门进去,什么声息也没有, +妻已睡熟好久了。 + + 1927 年 7 月,北京清华园。 + + 学习提示 + + 阅读《故都的秋》,要抓住“秋味”这个中心,慢慢读,调动各种感官来体 + 会故都之秋的“清”“静”“悲凉”等特点,看看作品是通过哪些景物的描写巧妙 + 地表现这些特点的。作者没有详细描绘陶然亭、钓鱼台、西山等北平著名景点, + 而是着重描写牵牛花、槐蕊、秋雨、秋枣一类平凡细小的事物,这是为什么?再 + 想想,悲凉的“秋味”,为什么在郁达夫笔下具有特别的美?作者说中国的文人 + “与秋的关系特别深”,有什么道理? + + 阅读《荷塘月色》,应该多朗读,边读边沉浸到月色清淡、荷香缕缕的意境 + 中去,品味那种优雅、朦胧、幽静之美。重点学习作者如何写景,如何在景物描 + 写中自然地融入感情,以及如何通过比喻和通感来激发读者的联想和想象。 + + 学习时要关注两篇写景文章的语言艺术,可以从用词、句式等方面来细细品 + 味。如《故都的秋》开头多用短句,句中多停顿,起到了舒缓节奏和营造氛围的 + 作用;《荷塘月色》善用叠词,语言朴素典雅、准确传神、贮满诗意。阅读时应 + 多加体会。 + + 第七单元 111 + 15 + + 我与地坛 a + + (节选) + + 史铁生 + + 一 + + 我在好几篇小说中都提到过一座废弃的古园,实际就是地坛。许多 +年前旅游业还没有开展,园子荒芜冷落得如同一片野地,很少被人记起。 + + 地坛离我家很近。或者说我家离地坛很近。总之,只好认为这是缘 +分。地坛在我出生前四百多年就坐落在那儿了,而自从我的祖母年轻时 +带着我父亲来到北京,就一直住在离它不远的地方——五十多年间搬过 +几次家,可搬来搬去总是在它周围,而且是越搬离它越近了。我常觉得 +这中间有着宿命的味道:仿佛这古园就是为了等我,而历尽沧桑在那儿 +等待了四百多年。 + + 它等待我出生,然后又等待我活到最狂妄的年龄上忽地残废了双 +腿。四百多年里,它一面剥蚀了古殿檐头浮夸的琉璃,淡褪了门壁上炫 +耀的朱红,坍圮了一段段高墙,又散落了玉砌雕栏,祭坛四周的老柏树 +愈见苍幽,到处的野草荒藤也都茂盛得自在坦荡。这时候想必我是该来 +了。十五年前的一个下午,我摇着轮椅进入园中,它为一个失魂落魄的 +人把一切都准备好了。那时,太阳循着亘古不变的路途正越来越大,也 +越红。在满园弥漫的沉静光芒中,一个人更容易看到时间,并看见自己 +的身影。 + + 自从那个下午我无意中进了这园子,就再没长久地离开过它。我 +一下子就理解了它的意图。正如我在一篇小说 b 中所说的:“在人口 +密聚的城市里,有这样一个宁静的去处,像是上天的苦心安排。” + + 两条腿残废后的最初几年,我找不到工作,找不到去路,忽然间几 +乎什么都找不到了,我就摇了轮椅总是到它那儿去,仅为着那儿是可以 +逃避一个世界的另一个世界。我在那篇小说中写道:“没处可去我便一 + +a 选 自《 史 铁 生 散 文 选 》( 人 民 文 学 出 版 社 2005 年 嘉靖九年(1530),为明清皇帝祭地之坛。 + 版)。略有改动。地坛在北京安定门外,始建于明 b 〔一篇小说〕指作者的小说《我之舞》。 + +112 语文 必修上册 + 天到晚耗在这园子里。跟上班下班一样,别人去上班我就摇了轮椅到这 +儿来。”“园子无人看管,上下班时间有些抄近路的人们从园中穿过,园 +子里活跃一阵,过后便沉寂下来。”“园墙在金晃晃的空气中斜切下一溜 +阴凉,我把轮椅开进去,把椅背放倒,坐着或是躺着,看书或者想事, +撅 a 一杈树枝左右拍打,驱赶那些和我一样不明白为什么要来这世上的 +小昆虫。”“蜂儿如一朵小雾稳稳地停在半空;蚂蚁摇头晃脑捋着触须, +猛然间想透了什么,转身疾行而去;瓢虫爬得不耐烦了,累了,祈祷一 +回便支开翅膀,忽悠一下升空了;树干上留着一个蝉蜕,寂寞如一间空 +屋;露水在草叶上滚动,聚集,压弯了草叶,轰然坠地,摔开万道金 +光。”“满园子都是草木竞相生长弄出的响动,窸窸窣窣 b 窸窸窣窣片刻 +不息。”这都是真实的记录,园子荒芜但并不衰败。 + + 除去几座殿堂我无法进去,除去那座祭坛我不能上去而只能从各个 +角度张望它,地坛的每一棵树下我都去过,差不多它的每一平米草地上 +都有过我的车轮印。无论是什么季节,什么天气,什么时间,我都在这 +园子里待过。有时候待一会儿就回家,有时候就待到满地上都亮起月光。 +记不清都是在它的哪些角落里了,我一连几小时专心致志地想关于死的 +事,也以同样的耐心和方式想过我为什么要出生。这样想了好几年,最 +后事情终于弄明白了:一个人,出生了,这就不再是一个可以辩论的问 +题,而只是上天交给他的一个事实;上天在交给我们这个事实的时候, +已经顺便保证了它的结果,所以死是一件不必急于求成的事,死是一个 +必然会降临的节日。这样想过之后我安心多了,眼前的一切不再那么可 +怕。比如你起早熬夜准备考试的时候,忽然想起有一个长长的假期在前 +面等待你,你会不会觉得轻松一点?并且庆幸并且感激这样的安排? + + 剩下的就是怎样活的问题了。这却不是在某一个瞬间就能完全想透 +的,不是能够一次性解决的事,怕是活多久就要想它多久了,就像是伴 +你终生的魔鬼或恋人。所以,十五年了,我还是总得到那古园里去,去 +它的老树下或荒草边或颓墙旁,去默坐,去呆想,去推开耳边的嘈杂理 +一理纷乱的思绪,去窥看自己的心魂。十五年中,这古园的形体被不能 +理解它的人肆意雕琢,幸好有些东西是任谁也不能改变它的。譬如祭坛 +石门中的落日,寂静的光辉平铺的一刻,地上的每一个坎坷都被映照得 +灿烂;譬如在园中最为落寞的时间,一群雨燕便出来高歌,把天地都叫 +喊得苍凉;譬如冬天雪地上孩子的脚印,总让人猜想他们是谁,曾在哪 + +a 〔撅(juē)〕折。 b 〔窸(xī)窸窣(sū)窣〕象声词,形容细小的摩擦声。 + + 第七单元 113 + 史铁生  摄 + + 儿做过些什么,然后又都到哪儿去了;譬如那些苍黑的古柏,你忧郁的 + 时候它们镇静地站在那儿,你欣喜的时候它们依然镇静地站在那儿,它 + 们没日没夜地站在那儿,从你没有出生一直站到这个世界上又没了你的 + 时候;譬如暴雨骤临园中,激起一阵阵灼烈而清纯的草木和泥土的气 + 味,让人想起无数个夏天的事件;譬如秋风忽至,再有一场早霜,落叶 + 或飘摇歌舞或坦然安卧,满园中播散着熨帖 a 而微苦的味道。味道是最 + 说不清楚的,味道不能写只能闻,要你身临其境去闻才能明了。味道甚 + 至是难于记忆的,只有你又闻到它你才能记起它的全部情感和意蕴。所 + 以我常常要到那园子里去。 + + 二 + + 现在我才想到,当年我总是独自跑到地坛去,曾经给母亲出了一个 + 怎样的难题。 + + 她不是那种光会疼爱儿子而不懂得理解儿子的母亲。她知道我心里 + 的苦闷,知道不该阻止我出去走走,知道我要是老待在家里结果会更 + 糟,但她又担心我一个人在那荒僻的园子里整天都想些什么。我那时脾 + 气坏到极点,经常是发了疯一样地离开家,从那园子里回来又中了魔似 + +a 〔熨(yù)帖〕舒服,舒适。 + +114 语文 必修上册 + 的什么话都不说。母亲知道有些事不宜问,便犹犹豫豫地想问而终于不 +敢问,因为她自己心里也没有答案。她料想我不会愿意她跟我一同去, +所以她从未这样要求过,她知道得给我一点儿独处的时间,得有这样一 +段过程。她只是不知道这过程得要多久,和这过程的尽头究竟是什么。 +每次我要动身时,她便无言地帮我准备,帮助我上了轮椅车,看着我摇 +车拐出小院;这以后她会怎样,当年我不曾想过。 + + 有一回我摇车出了小院,想起一件什么事又返身回来,看见母亲仍 +站在原地,还是送我走时的姿势,望着我拐出小院去的那处墙角,对 +我的回来竟一时没有反应。待她再次送我出门的时候,她说:“出去活 +动活动,去地坛看看书,我说这挺好。”许多年以后我才渐渐听出,母 +亲这话实际上是自我安慰,是暗自的祷告,是给我的提示,是恳求与 +嘱咐。只是在她猝然去世之后,我才有余暇设想,当我不在家里的那些 +漫长的时间,她是怎样心神不定坐卧难宁,兼着痛苦、惊恐与一个母亲 +最低限度的祈求。现在我可以断定,以她的聪慧和坚忍,在那些空落的 +白天后的黑夜,在那不眠的黑夜后的白天,她思来想去最后准是对自己 +说:“反正我不能不让他出去,未来的日子是他自己的,如果他真的要 +在那园子里出了什么事,这苦难也只好我来承担。”在那段日子里—— +那是好几年长的一段日子,我想我一定使母亲做过最坏的准备了,但她 +从来没有对我说过“你为我想想”。事实上我也真的没为她想过。那时 +她的儿子还太年轻,还来不及为母亲想,他被命运击昏了头,一心以为 +自己是世上最不幸的一个,不知道儿子的不幸在母亲那儿总是要加倍 +的。她有一个长到二十岁上忽然截瘫了的儿子,这是她唯一的儿子;她 +情愿截瘫的是自己而不是儿子,可这事无法代替;她想,只要儿子能活 +下去,哪怕自己去死呢也行,可她又确信一个人不能仅仅是活着,儿子 +得有一条路走向自己的幸福;而这条路呢,没有谁能保证她的儿子最终 +能找到。——这样一个母亲,注定是活得最苦的母亲。 + + 有一次与一个作家朋友聊天,我问他学写作的最初动机是什么。他 +想了一会儿说:“为我母亲。为了让她骄傲。”我心里一惊,良久无言。 +回想自己最初写小说的动机,虽不似这位朋友的那般单纯,但如他一 +样的愿望我也有,且一经细想,发现这愿望也在全部动机中占了很大 +比重。这位朋友说:“我的动机太低俗了吧?”我光是摇头,心想低俗 +并不见得低俗,只怕是这愿望过于天真了。他又说:“我那时真就是想 +出名,出了名让别人羡慕我母亲。”我想,他比我坦率。我想,他又比 +我幸福,因为他的母亲还活着。而且我想,他的母亲也比我的母亲运气 + + 第七单元 115 + 好,他的母亲没有一个双腿残废的儿子,否则事情就不这么简单。 + 在我的头一篇小说发表的时候,在我的小说第一次获奖的那些日子 + + 里,我真是多么希望我的母亲还活着。我便又不能在家里待了,又整天 + 整天独自跑到地坛去,心里是没头没尾的沉郁和哀怨,走遍整个园子却 + 怎么也想不通:母亲为什么就不能再多活两年?为什么在她儿子就快要 + 碰撞开一条路的时候,她却忽然熬不住了?莫非她来此世上只是为了替 + 儿子担忧,却不该分享我的一点点快乐?她匆匆离我去时才只有四十九 + 呀 ! 有那么一会儿,我甚至对世界对上天充满了仇恨和厌恶。后来我在 + 一篇题为《合欢树》的文章中写道:“我坐在小公园安静的树林里,闭 + 上眼睛,想,上天为什么早早地召母亲回去呢?很久很久,迷迷糊糊的 + 我听见了回答:‘她心里太苦了,上天看她受不住了,就召她回去。’我 + 似乎得了一点安慰,睁开眼睛,看见风正从树林里穿过。”小公园,指 + 的也是地坛。 + + 只是到了这时候,纷纭的往事才在我眼前幻现得清晰,母亲的苦难 + 与伟大才在我心中渗透得深彻。上天的考虑,也许是对的。 + + 摇着轮椅在园中慢慢走,又是雾罩的清晨,又是骄阳高悬的白昼, + 我只想着一件事:母亲已经不在了。在老柏树旁停下,在草地上在颓 + 墙边停下,又是处处虫鸣的午后,又是鸟儿归巢的傍晚,我心里只默念 + 着一句话:可是母亲已经不在了。把椅背放倒,躺下,似睡非睡挨到日 + 没,坐起来,心神恍惚,呆呆地直坐到古祭坛上落满黑暗然后再渐渐浮 + 起月光,心里才有点明白,母亲不能再来这园中找我了。 + + 曾有过好多回,我在这园子里待得太久了,母亲就来找我。她来找 + 我又不想让我发觉,只要见我还好好地在这园子里,她就悄悄转身回 + 去,我看见过几次她的背影。我也看见过几回她四处张望的情景,她视 + 力不好,端着眼镜像在寻找海上的一条船,她没看见我时我已经看见她 + 了,待我看见她也看见我了我就不去看她,过一会儿我再抬头看她就又 + 看见她缓缓离去的背影。我更是无法知道有多少回她没有找到我。有一 + 回我坐在矮树丛中,树丛很密,我看见她没有找到我;她一个人在园子 + 里走,走过我的身旁,走过我经常待的一些地方,步履茫然又急迫。我 + 不知道她已经找了多久还要找多久,我不知道为什么我决意不喊她—— + 但这绝不是小时候的捉迷藏,这也许是出于长大了的男孩子的倔强或羞 + 涩?但这倔强只留给我痛悔,丝毫也没有骄傲。我真想告诫所有长大了 + 的男孩子,千万不要跟母亲来这套倔强,羞涩就更不必,我已经懂了, + 可我已经来不及了。 + +116 语文 必修上册 + 儿子想使母亲骄傲,这心情毕竟是太真实了,以致使“想出名”这 +一声名狼藉的念头也多少改变了一点形象。这是个复杂的问题,且不去 +管它了吧。随着小说获奖的激动逐日暗淡,我开始相信,至少有一点我 +是想错了:我用纸笔在报刊上碰撞开的一条路,并不就是母亲盼望我找 +到的那条路。年年月月我都到这园子里来,年年月月我都要想,母亲盼 +望我找到的那条路到底是什么。母亲生前没给我留下过什么隽永 a 的哲 +言,或要我恪守的教诲,只是在她去世之后,她艰难的命运,坚忍的意 +志和毫不张扬的爱,随光阴流转,在我的印象中愈加鲜明深刻。 + + 有一年,十月的风又翻动起安详的落叶,我在园中读书,听见两个 +散步的老人说:“没想到这园子有这么大。”我放下书,想,这么大一座 +园子,要在其中找到她的儿子,母亲走过了多少焦灼的路。多年来我头 +一次意识到,这园中不单是处处都有过我的车辙,有过我的车辙的地方 +也都有过母亲的脚印。 + + 学习提示 + + 地坛是明清时期皇帝祭地的重要场所,如今是一个公园。这样的地方会和 + “我”发生怎样的关系呢?最好能在阅读课文的基础上,通读《我与地坛》全文, + 把握节选部分与全文主旨的关系。 + + 史铁生的人生感悟是独特的,这和他承受着因残疾而导致的苦难有关,但他 + 超越了自我,对人的生存状态和意义,包括对生与死,都有深邃的思考。学习时 + 要深入理解,感受作者的人格力量。文章在景物描写和往事追忆中穿插了许多富 + 有哲理的语句,这可以作为理解作者思考的突破口,阅读时要重点关注。要在阅 + 读过程中与作者“对话”,形成边阅读边思考的习惯。 + + 文中除了对生命的思考,还有一条线索是对母亲的怀念。体会其中的母爱, + 想想为何作者怀有痛彻心扉的悔恨和对母亲深深的歉意。史铁生的思考发自内心 + 深处,执着而坦诚,这正是这篇散文的感人之处。注意欣赏文章是如何在清明如 + 静水般的行文里,表达诚挚感情的。 + +a 〔隽(juàn)永〕意味深长。 + + 第七单元 117 + 16 + + 赤壁赋 a + + 苏 轼 + + 壬戌 b 之秋,七月既望 c,苏子与客泛舟游于赤壁之下。清风徐 +来,水波不兴。举酒属客 d,诵明月之诗 e,歌窈窕之章。少焉 f,月 +出于东山之上,徘徊于斗牛 g 之间。白露 h 横江,水光接天。纵一苇之 +所如 i,凌万顷之茫然 j。浩浩乎如冯虚御风 k,而不知其所止;飘飘 +乎如遗世独立,羽化而登仙 l。 + + 于是饮酒乐甚,扣舷 m 而歌之。歌曰:“桂棹兮兰桨 n,击空明兮溯 +流光 o。渺渺兮予怀 p,望美人兮天一方 q。”客 r 有吹洞箫 s 者,倚歌 t +而和之 u。其声呜呜然,如怨如慕,如泣如诉,余音袅袅,不绝如缕 v。 +舞幽壑之潜蛟,泣孤舟之嫠妇 w。 + +a 选自《苏轼文集》卷一(中华书局 1986 年版)。宋神 k 〔 冯(píng) 虚 御 风 〕 凌 空 驾 风 而 行。 冯, 同 + 宗元丰二年(1079),苏轼被贬为黄州(今湖北黄冈) “凭”,乘。虚,太空。御,驾。 + 团练副使。元丰五年(1082)秋冬,苏轼先后两次游 + 览了黄州附近的赤壁,写下两篇赋。本文是第一篇, l 〔遗世独立,羽化而登仙〕脱离人世,升入仙境。 + 又称《前赤壁赋》。 羽化,指飞升成仙。 + +b 〔壬(rén)戌〕宋神宗元丰五年(1082)。 m 〔扣舷〕敲着船边,指打着节拍。 +c 〔既望〕过了望日后的第一天,通常指农历每月 n 〔桂棹兮兰桨〕桂木做的棹,木兰做的桨。 + o 〔击空明兮溯流光〕(桨)划破月光下的清波,(船) + 十六日。 +d 〔举酒属(zhǔ)客〕举起酒杯,劝客人饮酒。属, 在月光浮动的水面上逆流而上。空明,指月光下的 + 清波。流光,江面浮动的月光。 + 劝请。 p 〔渺渺兮予怀〕我心里想得很远。渺渺,悠远的样子。 +e 〔明月之诗〕和下文的“窈窕之章”分指《诗经·陈 q 〔望美人兮天一方〕眺望美人,(美人)却在天的那 + 一边。美人,指所思慕的人。 + 风·月出》及其诗句。这首诗的第一章有“舒窈纠 r 〔客〕指与苏轼同游的人。 + (jiǎo)兮”的句子,所以称为“窈窕之章”。 s 〔洞箫〕管乐器的一种。 +f 〔少焉〕一会儿。 t 〔倚歌〕依照歌曲的声调和节拍。倚,循、依。 +g 〔斗(dǒu)牛〕斗宿和牛宿,都是星宿名。 u 〔和(hè)之〕(用箫)随着歌声伴奏。 +h 〔白露〕指白茫茫的水汽。 v 〔余音袅袅,不绝如缕〕尾声细弱而婉转悠长,如同 +i 〔纵一苇之所如〕任凭小船漂去。纵,放任。一苇, 不断的细丝。袅袅,形容声音婉转悠长。缕,细丝。 + 指 小 船( 比 喻 船 很 小, 像 一 片 苇 叶 )。 语 出《 诗 w 〔舞幽壑之潜蛟,泣孤舟之嫠(lí)妇〕意思是,箫 + 经·卫风·河广》:“谁谓河广,一苇杭(航)之。” 声使深谷中的蛟龙听了起舞,使独坐孤舟的寡妇听 + 了落泪。幽壑,深谷。嫠妇,寡妇。 + 如,往。 +j 〔凌万顷之茫然〕越过那茫茫的江面。凌,越过。 + + 万顷,指广阔的江面。茫然,旷远的样子。 + +118 语文 必修上册 + 苏子愀然 a,正襟危坐 b 而问客曰:“何为其然也 c ?”客曰:“‘月 +明星稀,乌鹊南飞’,此非曹孟德之诗乎?西望夏口 d,东望武昌 e,山 +川相缪,郁乎苍苍 f,此 g 非孟德之困 h 于周郎 i 者乎?方 j 其破荆 +州 k,下江陵 l,顺流而东也,舳舻 m 千里,旌旗蔽空,酾酒临江,横 +槊赋诗 n,固一世之雄也,而今安在哉?况吾与子渔樵于江渚之上 o, +侣鱼虾而友麋鹿,驾一叶之扁舟,举匏樽 p 以相属。寄蜉蝣 q 于天地, +渺沧海之一粟 r。哀吾生之须臾,羡长江之无穷。挟飞仙以遨游,抱明 +月而长终。知不可乎骤 s 得,托遗响 t 于悲风。” + + 苏子曰:“客亦知夫水与月乎?逝者如斯,而未尝往也;盈虚者 +如彼,而卒莫消长也 u。盖将自其变者而观之,则天地曾不能以一 + +a 〔愀(qiǎo)然〕容色改变的样子。 赤壁图 [金]武元直  作 +b 〔危坐〕端坐。 +c 〔何为其然也〕(曲调)为什么这样(悲凉)呢? n 〔酾(shī) 酒 临 江, 横 槊(shuò) 赋 诗 〕 面 对 大 +d 〔夏口〕古镇名,在今湖北武昌的西面。 江斟酒,横执长矛吟诗(曹操所吟的诗就是《短歌 +e 〔武昌〕今湖北鄂州。 行》)。酾酒,斟酒。槊,长矛。 +f 〔山川相缪(liáo),郁乎苍苍〕山水环绕,一片苍 + o 〔渔樵于江渚之上〕在江边捕鱼砍柴。渔樵,捕鱼 + 翠。缪,同“缭”,盘绕、围绕。 砍柴。 +g 〔此〕这地方。 +h 〔困〕受困。指曹操败于赤壁。 p 〔匏(páo)樽〕用葫芦做成的酒器。匏,葫芦的一种。 +i 〔周郎〕周瑜。 q 〔蜉蝣(fúyóu)〕一种小飞虫,夏秋之交生在水边, +j 〔方〕当。 +k 〔破荆州〕建安十三年(208),曹操南击荆州,当 生存期很短,古人说它朝生暮死。这里用来比喻人 + 生短促。 + 时荆州刺史刘表已死,刘表的儿子刘琮(cóng)投 r 〔一粟〕一粒米。 + 降曹操。荆州,在今湖北、湖南一带。 s 〔骤〕一下子,很轻易地。 +l 〔下江陵〕刘琮投降曹操以后,曹操又在当阳的长 t 〔遗响〕余音,指箫声。 + 坂击败刘备,进兵江陵。下,攻占。江陵,当时为 u 〔逝者如斯,而未尝往也;盈虚者如彼,而卒莫消 + 荆州重镇,今属湖北。 长 也 〕 流 去 的( 水 ) 像 这 样( 不 断 地 流 去 永 不 复 +m 〔舳舻(zhúlú)〕船头和船尾的并称,泛指首尾相接 返),而并没有流去;(月亮)像那样时圆时缺,却 + 的船只。 终究没有增减的变化。未尝往,意思是江水虽然在 + 不断地奔流,但前者去后者来,始终滔滔不绝,如 + 同没有流去。盈,满。虚,缺。卒,终究。消长, + 消减和增长。 + + 第七单元 119 + 瞬 a ;自其不变者而观之,则物与我皆无尽 b 也,而又何羡乎!且夫天 + +地之间,物各有主,苟非吾之所有,虽一毫而莫取。惟江上之清风,与 + +山间之明月,耳得之而为声,目遇之而成色,取之无禁,用之不竭,是 +造物者之无尽藏也,而吾与子之所共适 c。” + + 客喜而笑,洗盏更 d 酌。肴核 e 既尽,杯盘狼籍 f。相与枕藉 g 乎 +舟中,不知东方之既白 h。 + + 登泰山记 i + + 姚 鼐 + + 泰山之阳,汶水 j 西流;其阴,济水 k 东流。阳谷 l 皆入汶,阴谷 +皆入济。当其南北分者 m,古长城 n 也。最高日观峰,在长城南十五里。 + + 余以 o 乾隆三十九年 p 十二月,自京师乘 q 风雪,历齐河、长清 r, +穿泰山西北谷,越长城之限 s,至于泰安。是月丁未 t,与知府朱孝纯 +子颍 u 由南麓登。四十五里,道皆砌石为磴 v,其级七千有余。泰山正 + +a 〔盖将自其变者而观之,则天地曾不能以一瞬〕如 j 〔汶(wèn)水〕发源于山东莱芜东北原山,向西 + 果从那变化的一面看,那么天地间万事万物(时刻 南流经泰安。 + 在变动),连一眨眼的工夫都不停止。将,这里表 + 示假设。 k 〔济(jǐ)水〕发源于河南济源西王屋山,东流到山 + 东入海。 +b 〔物与我皆无尽〕意思是,万物同我们一样都是永 + 恒的。 l 〔阳谷〕山南面山谷中的水。 + m 〔当其南北分者〕在那(阳谷和阴谷)南北分界处的。 +c 〔是造物者之无尽藏(zàng)也,而吾与子之所共 n 〔古长城〕古代的长城,指春秋战国时齐国所筑长 + 适〕这是自然界无穷无尽的宝藏,我和你可以共同 + 享受。造物者,原指“天”,就是现在所说的“自 城的遗址,古时齐鲁两国以此分界。 + 然”。无尽藏,出自佛家语的“无尽藏海”(像海之 o 〔以〕在。 + 能包罗万物)。适,这里有“享有”的意思。 p 〔乾隆三十九年〕公元 1774 年。乾隆,清高宗的年 + +d 〔更〕再。 号(1736—1795)。 +e 〔肴核〕菜肴和果品。 q 〔乘〕这里是“冒”的意思。 +f 〔狼籍〕即“狼藉”,凌乱。 r 〔齐河、长清〕清代县名,今属山东。 +g 〔相与枕藉(jiè)〕互相枕着垫着。 s 〔限〕界限。 +h 〔既白〕天明。白,明亮。 t 〔是月丁未〕这个月的丁未日(乾隆三十九年十二 +i 选自《惜抱轩诗文集》卷十四(上海古籍出版社 + 月二十八日)。 + 1992 年 版 )。 姚 鼐(1732—1815), 字 姬 传, 桐 城 u 〔朱孝纯子颍(yǐng)〕朱孝纯,字子颍。当时是泰 + (今属安徽)人,清代散文家。 + 安府的知府。 +120 语文 必修上册 v 〔磴〕石阶。 + 南面有三谷。中谷绕泰安城下,郦道元所谓环水a 也。余始 +循以入 b,道少半 c,越中岭 d,复循西谷,遂至其巅。古 + +时登山,循东谷入,道有天门。东谷者,古谓之天门溪水, +余所不至也。今所经中岭及山巅,崖限当道者 e,世皆谓之 +天门云 f。道中迷雾冰滑,磴几 g 不可登。及既上,苍山负 +雪,明烛天南 h。望晚日照城郭 i,汶水、徂徕 j 如画,而 +半山居 k 雾若带然。 + + 戊申晦 l,五鼓 m,与子颍坐日观亭 n,待日出。大风 +扬积雪击面。亭东自足下皆云漫 o。稍 p 见云中白若樗蒱 q +数十立者,山也。极天 r 云一线异色,须臾成五采 s。日 +上,正赤如丹 t,下有红光动摇承之,或曰,此东海 u 也。 +回视日观以西峰,或得日或否 v,绛皓驳色 w,而皆若偻 x。 + + 亭西有岱祠 y,又有碧霞元君 z 祠。皇帝行宫 @7 在碧霞 +元君祠东。是日观道中石刻,自唐显庆 @8 以来;其远古刻 +尽漫失 @9。僻不当道者,皆不及往。 + + 山多石,少土。石苍黑色,多平方,少圜ホ。少杂树, + +多松,生石罅,皆平顶。冰雪,无瀑水,无鸟兽音迹。至 + +日观数里内无树,而雪与人膝齐。 + + 桐城姚鼐记。 + + 泰山图 [清]张深  作 + +a 〔 环 水 〕 水 名, 又 名“ 梳 洗 河 ”。 郦 道 元《 水 经 p 〔稍〕逐渐。 + 注·汶水》:“又合环水,水出泰山南溪。” q 〔樗蒱(chūpú)〕古代的一种博戏,这里指樗蒱所 + +b 〔循以入〕顺着(中谷)进山。 用的掷具,长形而末端尖锐,立起来像山峰。 +c 〔道少半〕路不到一半。 r 〔极天〕天边。 +d 〔中岭〕山名,又名“中溪山”。 s 〔采〕同“彩”。 +e 〔崖限当道者〕像门槛一样横在路上的山崖。限, t 〔丹〕朱砂。 + u 〔东海〕泛指东面的海。这里是想象,实际上在泰 + 门槛。 +f 〔云〕助词,无实义。 山顶上并不能看见东海。 +g 〔几(jī)〕几乎。 v 〔或得日或否〕有的被日光照着,有的没有被照着。 +h 〔苍山负雪,明烛天南〕青黑色的山上覆盖着白雪, w 〔绛皓(hào)驳色〕或红或白,颜色错杂。绛,大 + + 雪反射的光照亮了南面的天空。负,背。烛,照。 红。皓,白。驳,杂。 +i 〔城郭〕指城市。 x 〔偻〕脊背弯曲的样子。引申为鞠躬的样子。日观 +j 〔徂徕(cúlái)〕山名,在泰安城东南。 +k 〔居〕停留。 峰西面诸峰都比日观峰低,所以说“若偻”。 +l 〔戊申晦〕戊申日月底这一天。晦,农历每月的最 y 〔岱祠〕东岳大帝庙。 + z 〔碧霞元君〕传说是东岳大帝的女儿。 + 后一天。 @7 〔行宫〕皇帝出外巡行时居住的处所。 +m 〔五鼓〕五更。 @8 〔显庆〕唐高宗的年号(656—661)。 +n 〔日观亭〕亭名,在日观峰上。 @9 〔漫失〕模糊或缺失。 +o 〔漫〕弥漫。 ホ〔圜〕同“圆”。 + + 第七单元 121 + 学习提示 + +《赤壁赋》和《登泰山记》都是古代写景抒情的名篇,在读通、读懂的基础 + +上,体会两篇文章中景与情的关系。 + +《赤壁赋》通过铺陈、排比形成整饬之美,要反复诵读,逐步领会。文章写 + +景充满诗情画意,并采用“主客问答”的说理方式,逐层阐述作者的观点,思 + +想认识逐步深化。阅读时要注意梳理文中情感起伏变化的脉络,抓住文章写景、 + +抒情、说理完美融合的特点,体会作者复杂矛盾的内心世界和旷达乐观的人生 + +态度。 + +《登泰山记》全文不到五百字,却充分展示了雪后登山的别样情趣。文章善 + +于取舍,将小细节与大印象结合,描写、叙事简洁明快,阅读时要注意体会这些 + +特点。我国古代还有不少写景、记游名篇,如王勃《滕王阁序》、王禹偁《黄冈 + +竹楼记》、徐霞客《游天台山日记》等,可以找来阅读、比较。 + +我们读古代诗文,有必要了解一些古人记录时间的方法,包括纪年、纪月、 + +纪日和纪时。拿纪年来说,干支纪年和年号纪年是最常见的两种方法,前者如 + +“壬戌之秋”,后者如“乾隆三十九年十二月”。纪日,除了常见的干支纪日(如 +44 444444 + +“是月丁未”),有些日子在古代还有特殊的名称,如农历每月的最后一天称“晦”。 + 44 + +有兴趣的同学,可以从这两篇文章或此前学过的课文中,整理一些古人记录时间 + +的方法。 + +背诵《赤壁赋》。 + + 江馆清秋,晨起看竹,烟光日影露气,皆浮动于疏枝密叶之间。胸中勃勃, +遂有画意。其实胸中之竹,并不是眼中之竹也。因而磨墨展纸,落笔倏作变相, +手中之竹,又不是胸中之竹也。总之,意在笔先者,定则也;趣在法外者,化机 +也。独画云乎哉! + + ——郑燮《题画》 + +122 语文 必修上册 + 单元学习任务 + +一 平时你是否留意过身边的自然景物?哪些景物曾经激起你心灵的涟漪,引发你对生命 + 的感悟?本单元的写景抒情散文,都表现了作者眼中的自然美,表达了他们对生命的 + 感悟与思考。阅读这些文章,完成下列任务。 + 1.《故都的秋》《荷塘月色》和《我与地坛》描写的是同一个城市的景物,呈现出多 + 姿多样的美。选取你认为最精彩的段落,反复朗读,细加品味,写一段评点文字。 + 2. 这几篇文章都有融情于景、情景交融的特点,字里行间蕴含着作者的思想感情。结 + 合《赤壁赋》,分析文中的景与情是怎样完美融合在一起的。如有兴趣,可以选取 + 文中的一个片段,拟写视频拍摄脚本,挑选合适的音乐和场景,制作一个小视频。 + +二 本单元的文章在写景状物的同时,反映了作者的审美倾向和人生思考,折射出民族的 + 审美传统。从下面的话题中任选一个进行研讨。 + 1. 在郁达夫的笔下,故都的秋特别“清”“静”“悲凉”,带着传统文人的某种审美情 + 趣。阅读《故都的秋》,分析其中哪些地方体现了民族审美心理和审美特点。 + 2. 游览胜迹,登临高山,常常能引发文人墨客的遐思,从而催生许多优秀的文学作 + 品。赤壁是古代战场,当年的“舳舻千里,旌旗蔽空”,引发无数人的怀古之情; + 泰山为五岳之尊,是中国古代重要的文化符号,登临赋诗者众多。阅读《赤壁赋》 + 和《登泰山记》,感兴趣的同学,可以再搜集一些写赤壁或泰山的诗文,探讨历代 + 文人寄托在赤壁和泰山上的不同情思,探究其背后蕴含的文化意义。 + +三 同是写景抒情,本单元的几篇文章运用的艺术手法各具特色。借鉴这些文章的写法, + 写一篇不少于 800 字的散文。写完之后与同学交换阅读,互相品评,提出修改建议。 + 修改后,把全班的习作编辑成册,拟定书名,撰写序言,作为高中生活的一份纪念。 + 以下题目供参考,也可以自拟题目。 + 1. 对我们的校园(村庄或小区等),你也许已经非常熟悉了,但很可能其中还有你 + 未曾留意的一小块天地;同一处景物,你也未必观察到它在不同时间的变化。以 + 《我仿佛第一次走过    》为题,写一篇散文。 + 2. 四季更替是大自然的节律,每个季节都有它独有的特点。“立春”“立秋”“夏 + 至”“冬至”,这些字眼都能引发很多遐想和回忆。选择一个节气,观察此时的景 + 物和人们的活动,写一篇散文。 + + 第七单元 123 + 如何做到情景交融 + + “景无情不发,情无景不生”(范晞文《对床夜语》卷二),景与情在写作中应是相 + 互依存,不可分割的。一篇景情自然融合的文章,更容易让读者产生心灵的触动和情感 + 上的共鸣。 + + 触景生情,情因景生。我们常常有这样的经历,看到某种景物,自然而然生出或被 + 触发出某种情感。将这样的景描写出来,将这样的情抒发出来,并让景物与情感之间建 + 立起某种联系,就是一篇好的写景抒情文字。如朱自清《荷塘月色》中,起初作者内心 + “颇不宁静”,淡淡的忧愁弥漫在字里行间。但随着作者独行小路,领略月下荷塘美景, + 忧愁虽然还在,但心头平添了一份淡淡的喜悦,感受到一丝得来不易的宁静。这喜悦和 + 宁静都是由荷塘之景自然生发出的感受,作者在描写荷塘时并没有直接写情,但情自在 + 景中。 + + 因情写景,借景抒情。生活中我们常常会感到高兴或烦恼,轻松或沉重,热烈或悲 + 凉,而随着情感的变化,似乎看到的景物也产生了不同,所谓“感时花溅泪,恨别鸟惊 + 心”(杜甫《春望》),正是此意。以情感为轴心选择与之契合度较高的景物进行描写, + 将自己的情感赋予景物,使“物皆著我之色彩”(王国维《人间词话》),同样也能写出 + 一篇好的写景抒情文字。如郁达夫《故都的秋》中,北平之秋景物众多,作者选择了槐 + 树的落蕊、秋蝉衰弱的残声、微凉的秋雨等颇具悲凉之感的景物,来表现对故都的思念 + 与眷恋,皆因它们与自己内心的孤独、苦闷之情相一致;史铁生《我与地坛》中,“剥 + 蚀”的琉璃,“淡褪”的朱红,“坍圮”的高墙,“散落”的玉砌雕栏,也都高度暗合了作 + 者失落、悲伤甚至绝望的心境。这样的文字,处处写景,字字关情,能给读者以思考或 + 震撼。 + +124 语文 必修上册 + 第八单元 + +词语积累与词语解释 + + 说话写文章离不开词语。如同盖房子需要砖石一 + 样,词和短语就是语言表达的“砖石”。我们要做生 + 活中的有心人,平时多读多记,积累尽可能丰富的词 + 语,形成自己的词语库。词语库充实了,才有选择的 + 余地,才能更好地发挥语言的表现力。积累是为了运 + 用,要让词语库中的词语“活”起来,就要准确理解词 + 语的含义,能对词语进行比较、辨析,并根据表达的 + 需要,恰当地选择和使用。 + + 本单元围绕词语积累与词语解释开展学习活动。 + 要了解汉语词语的特点,通过多种方式积累词语;学 + 习辨析词义的方法,把握词义变化的规律,认识古今 + 汉语的联系和差异;结合词义特点,探究语言表达中 + 词语选择的艺术,提高理解和运用词语的能力。 + + 第八单元 125 + 学习活动 + +一 丰富词语积累 + + 从小学到中学,我们一直都在积累词语。汉语中的词语数量巨大,我们不可能全部 +掌握,但每个人都应当有意识地扩充自己的词语库,努力提升阅读和表达的能力。有些 +人说话写文章干巴巴的,拙于表达,词不达意,就是因为积累的词语太少。 + + 1. 了解词语“家族”,让积累更加有效 + 汉语中的词语并非杂乱无章,而是有“家族”、成系统的。有些词包含共同的语素, +如包含语素“理”的词语有“理解”“理由”“整理”“办理”“梳理”“条理”等。有些 +词,通过语义上的各种关系聚合在一起,如同义关系、反义关系、亲属关系、顺序关系 +等。从词语的“家族”或者“系统”出发,触类旁通,可以大大增加词汇量。 + 我们一直都在积累词语,但未必有方法上的理性认识。写一段文字,说说自己从前 +是怎样积累词语的,现在有什么更好的方法。写完后与同学交流。 + + 2. 丰富熟语积累,让语言多姿多彩 + 无论说话还是作文,我们经常会用到熟语。熟语主要包括成语、惯用语和歇后语。可 +以尝试按照这几个类别,分类搜集、整理一些熟语。每类中各选五个例子,理解它们的含 +义,并分别运用它们说一两句话。还可以找出意思相近的成语、惯用语和歇后语,做做互 +换练习。 + 成语是熟语中最常用的一种。建议举办一次“领略成语魅力”的主题语文活动。下 +面的内容供参考。 + + ①全班分成若干小组,梳理所学成语,以其中若干成语作为研习的对象,查找 + 它们的出处。注意考察成语中保留的古代汉语词汇、语法等方面的特征。 + + ②成语深植于中华民族的文化土壤,包含着丰富的文化信息。分类整理成语(如 + 爱国、民本、诚信、荣辱、世情、师友、读书、岁月、动物、植物等,也可自己拟 + 定),同学分工,各选一类,以《成语中的    文化》为题,写一则语言札记。 + + 3. 关注新词语,让语言鲜活生动 + 随着社会生活各方面的变化,新词语在不断涌现,为汉语增添了鲜活的生命力。积 +累词语,不能不关注新词语。新词语的来源多种多样,主要包括汉语自身的新造词和外 +来词,如“供给侧”“高铁”“刷屏”“博客”“作秀”等。 + +126 语文 必修上册 + 全班分成若干小组,搜集一些新词语,从中选择十个,参考后面的“学习资源”,为 + 它们制作“词语档案”。档案内容包括词语的来源、含义,体现了社会生活哪些领域的变 + 化,反映了什么样的文化现象,等等。 + + 二 把握古今词义的联系与区别 + + 积累、学习词语,要特别关注词义。随着社会的发展和人们认识的深化,词义也会 + 不断发展变化。古今词义既有联系,也有区别。阅读古诗文,要留意一词多义、古今词 + 义不同的现象,避免以今律古;阅读现代作品,也要准确理解词义,避免望文生义。 + + 1. 探究一词多义 + 一词多义现象在古汉语中非常普遍,阅读古诗文时,要注意结合语境仔细甄别,正 + 确理解。 + 例 1 :绝 + + ①假舟楫者,非能水也,而绝江河。(《荀子·劝学》) + ②率妻子邑人来此绝境,不复出焉,遂与外人间隔。(陶渊明《桃花源记》) + ③自富阳至桐庐一百许里,奇山异水,天下独绝。(吴均《与朱元思书》) + ④至于夏水襄陵,沿溯阻绝。(郦道元《三峡》) + ⑤会当凌绝顶,一览众山小。(杜甫《望岳》) + ⑥大雪三日,湖中人鸟声俱绝。(张岱《湖心亭看雪》) + 例 2 :信 + ①与朋友交而不信乎?(《论语·学而》) + ②愿陛下亲之信之,则汉室之隆,可计日而待也。(诸葛亮《出师表》) + ③谢公与人围棋,俄而谢玄淮上信至,看书竟,默然无言,徐向局。(《世说新 + 语·雅量》) + ④海客谈瀛洲,烟涛微茫信难求。(李白《梦游天姥吟留别》) + ⑤低眉信手续续弹,说尽心中无限事。(白居易《琵琶行》) + ⑥不忍拈将等闲用,半封京信半题诗。(元稹《书乐天纸》) + 从 你 所 学 的 古 诗 文 中, 再 梳 理 一 些 一 词 多 义 的 例 子, 比 如“ 兵 ”“ 报 ”“ 亡 ”“ 朝 ” +“理”等,理解它们在具体语句中的含义。 + 一词多义看似纷繁复杂,其实也有规律可循。多义词的各个义项并不是孤立的,其间 + 存在着各种联系。分析义项间的相互关系,往往就抓住了理解多义词的“线索”。比如, + 兵,本义是武器,引申指拿武器的士卒、战士,由此义引申指军队,又引申指战争、军事。 + 参考后面的“学习资源”,梳理一词多义的例子,撰写学习笔记,说明词义的引申关系。 + + 第八单元 127 + 2. 把握古今词义的不同 + 一词多义是词义发展演变的结果,而演变的结果并不一样。如“江”,在古代专指长 + 江,而后来多泛指大河,词义的外延扩大了,我们说是“词义的扩大”;“子”,古代可以 + 指儿子和女儿,现在多专指儿子,词义的外延缩小了,是“词义的缩小”。再如“涕”,在 + 古代多指眼泪,而现在除了成语“痛哭流涕”“感恩涕零”等还保留“涕”的古义外,均 + 指鼻涕,这是词义发生了转移。又如“爪牙”,古代多用作中性词,指动物的尖爪和利牙, + 也比喻勇士,形容勇武,现在喻指坏人的党羽,用作贬义词,这是感情色彩发生了变化。 + 参考上述例子,梳理下面的词语,也可以再找一些,看看词义变化的情况。可以用 + 表格的形式,也可以用其他形式,在班里展示、讲解。 + + 菜 宫 睡 河 瓦 臭 禽 汤 走 去 走狗 丈夫 + 钩心斗角 闭门造车 粉墨登场 道貌岸然 + + 3. 避免以今律古,望文生义 + 词义是不断发展变化的,词语的古义和今义,既有联系也有区别。阅读古诗文时, + 要注意避免以今律古。下面这些句子中,加点的部分是一个词还是两个词?如何理解? + 再搜集一些类似的例子。 + + 今齐地方千里。(《邹忌讽齐王纳谏》) + 44 + + 未尝不叹息痛恨于桓、灵也。(诸葛亮《出师表》) + 44 + + 问今是何世,乃不知有汉,无论魏晋。(陶渊明《桃花源记》) + 44 + + 因为长句,歌以赠之。(白居易《琵琶行》) + 44 + + 学习现代汉语词语,尤其是从古代沿用而来的成语,容易望文生义而误用。了解成 + 语的来历,或者理解成语中某些字的含义,往往能够帮助我们准确理解词义。如“不赞一 + 词”,出自《史记·孔子世家》:“至于为《春秋》,笔则笔,削则削,子夏之徒,不能赞一 + 辞。”“不赞一词”是指文章写得很好,别人不能再添一句话,后来也指一言不发。如果将 +“赞”理解为现代常用义“赞扬”,就会歪曲成语的意思而误用。查找资料,搜集容易错误 + 理解的成语,分小组进行讨论,然后全班交流:这些成语的含义是什么?如何避免误用? + + 三 词义的辨析和词语的使用 + + 词语是造句成文的基础。“夫人之立言,因字而生句,积句而成章,积章而成篇。篇 + 之彪炳,章无疵也;章之明靡,句无玷也;句之清英,字不妄也。”(刘勰《文心雕龙·章 + 句》)词语的选择,不仅讲究用“对”,也追求用“好”;既要准确,也要生动。古人早就 + 有“炼字”一说,这说明词语的选择不但极其重要,而且绝非易事。 + + 128 语文 必修上册 + 1. 准确理解词义,把握词语的用法 + +老舍在《关于文学的语言问题》一文中说,有些词意思相近,“只看你把它搁在哪里 + +最恰当、最合适就是了”。要做到“恰当”“合适”,就要仔细辨析词义,准确理解词语的 + +意义,把握其用法。 + +可以通过作家对原稿的修改体会用词的准确。例如: + + 油蛉在这里低唱,蟋蟀们在这里弹琴。翻开断砖来,有时会遇见蜈蚣;还有斑 + +蝥,倘若用手指按住它的脊梁(原稿:背脊),便会拍的一声,从后窍(原稿:后 + 44 44 + +身)喷出一阵(原稿:一股)烟雾。(鲁迅《从百草园到三味书屋》) + 44 + +可以通过作家对不同词语的选择体会词义的细微差别。例如: + + (孔乙己)便排出九文大钱…… + 4 + 他从破衣袋里摸出四文大钱……(鲁迅《孔乙己》) + 4 + +除了辨析词义,还要注意词语的用法,尤其是与其他词语的搭配。例如: + + 四百多年里,它一面剥蚀了古殿檐头浮夸的琉璃,淡褪了门壁上炫耀的朱红,坍 + 44 44 4 + +圮了一段段高墙,又散落了玉砌雕栏,祭坛四周的老柏树愈见苍幽,到处的野草荒藤 +4 44 + +也都茂盛得自在坦荡。(史铁生《我与地坛》) + +对上面几个例子进行分析,可从课文中再搜集、梳理一些例子,作点评,然后与同学 + +讨论:词语选用如何“最恰当、最合适”? + +2. 体会词语的感情色彩 + +汉语中不少词语带有或褒或贬的感情色彩,即使是中性词,在具体的语境中也常带 + +有褒贬色彩。例如: + + 但是,如果反对这宅子的旧主人,怕给他的东西染污了,徘徊不敢走进门,是孱 + 44 44 4 + +头;勃然大怒,放一把火烧光,算是保存自己的清白,则是昏蛋。不过因为原是羡慕 +4 44 + +这宅子的旧主人的,而这回接受一切,欣欣然的蹩进卧室,大吸剩下的鸦片,那当然 + +更是废物。(鲁迅《拿来主义》) + 44 + +在特定的语境下,词语的感情色彩也会发生转化,表达出更为复杂的情感。例如: + + 我只想鼓吹我们再吝啬一点,“送去”之外,还得“拿来”,是为“拿来主义”。 + 44 44 + +(鲁迅《拿来主义》) + +搜集典型的段落和语句,探究作者如何利用词语的褒贬色彩表达自己的情感态度。 + + 3. 把握词语的语体色彩 + 有些词语常用于特定的语体中,带有鲜明的语体色彩。词语的语体色彩主要分为口语 +色彩和书面语色彩两大类。语体色彩表明,不同的词适用于社会交际的不同范围,适用于 +不同的文体。通常情况下,具有某种语体色彩的词语要用于相应的语体,以求得风格的协 + + 第八单元 129 + 调一致。例如,“可以执行”“现在证明”“打算办理”等带有口语色彩的说法就不太适合 +用于公文中,而要用“准予执行”“兹证明”“计划办理”等这些带有书面语色彩的说法。 + + 在交流和表达中,人们往往根据对象和内容需要,交错运用不同语体色彩的词语。文 +学作品中就有很多这样的例子。有兴趣的班级,可以任选一两部作品,探究作家如何运用 +词语的语体色彩以获得更好的表达效果。以下专题可供参考,也可另拟专题。 + + ①同样是表现地域特色的小说,《蒲柳人家》和《溜索》在词语的选用上各有什 + 么特点?体现出怎样的风格? + + ②在小说、戏剧等文学作品中,作家常常利用词语的语体色彩,描写人物语言, + 塑造人物形象。你想到了哪些人物?具体说明。 + 结合上述活动中搜集的例子,进一步提炼、总结自己的心得体会,任选一位你喜欢的 +作家,研读其作品,探究词语使用的艺术,写一则语言札记。 + +130 语文 必修上册 + 学习资源 + + 1.  语言的演变 a + + 吕叔湘 + + 语言也在变 + + 世界上万事万物都永远在那儿运动、变化、发展,语言也是这样。语言的变化,短时间内不容易 + 觉察,日子长了就显出来了。比如宋朝的朱熹,他曾经给《论语》做过注解,可是假如当孔子正在跟颜 + 回、子路他们谈话的时候,朱熹闯了进去,管保他们在讲什么,他是一句也听不懂的。不光是古代的话 + 后世的人听不懂,同一种语言在不同的地方经历着不同的变化,久而久之也会这个地方的人听不懂那个 + 地方的话,形成许许多多方言。 + + 古代人说的话是无法听见的了,幸而留传下来一些古代的文字。文字虽然不是语言的如实记录,但 + 是它必得拿语言作基础,其中有些是离语言不太远的,通过这些我们可以对古代语言的演变获得一定的 + 认识。为了具体说明古代和现代汉语的差别,最好拿一段古代作品来看看。下面是大家都很熟悉的《战 + 国策》里的《邹忌讽齐王纳谏》的头上一段: + + 邹忌修八尺有余,而形貌昳丽。朝服衣冠,窥镜,谓其妻曰:“我孰与城北徐公美?” + 其妻曰:“君美甚,徐公何能及君也?”城北徐公,齐国之美丽者也。忌不自信……旦日, + 客从外来,与坐谈,问之客曰:“吾与徐公孰美?”客曰:“徐公不若君之美也。” + + 把这一段用现代话来说一遍,就会发现有很大的差别。不能光看字形。光看字形,现代不用的字只 + 有四个:昳、曰、孰、吾。可是联系字的意义和用法来看,真正古今一致的,除人名、地名外,也只有 + 十二个字:八、我、能、城、国、不、客、从、来、坐、谈、问。大多数的字,不是意义有所不同,就 + 是用法有些两样。大致说来,有三种情形。 + + 第一种情形是意义没有改变,但是现在不能单用,只能作为复音词或者成语的一个成分。有的构词 + 的能力还比较强,如:形、貌、衣、镜、北、何、自、信、日、外;有的只在少数词语里出现,如:丽 +(美丽、壮丽)、朝(朝霞、朝气、朝发夕至)、窥(窥探、窥测)、妻(夫妻、妻子)、甚(欺人太甚)。 + + 第二种情形是意义没有改变,可是使用受很大限制。例如:作为连词的“而”“与”,只见于一定 + 的文体;表示从属关系的“之”只用于“百分之几”“原因之一”等;起指代作用的“者”只用于“作 + 者”“读者”等;“美”现在不大用于人,尤其不用于男人(“美男子”口语不说,也不能拆开);“有余” + 现在能懂,但不大用,“八尺有余”现在说“八尺多”。 + + 第三种情形是这里所用的意义现代已经不用,尽管别的意义还用。例如:修(长)、服(穿、戴)、 + +a 选自《语文常谈》(《吕叔湘全集》第六卷,辽宁教 吕叔湘(1904—1998),江苏丹阳人,语言学家、语 + 育出版社 2002 年版)。原题为《古今言殊》。有删改。 文教育家。 + + 第八单元 131 + 谓(对……说)、其(他的;“其余”“其中”“其一”里的“其”是“那”的意思)、公(尊称)、及(比 + 得上)、君(尊称)、也(助词;现代的“啊”只部分地与“也”相当)、旦(“旦日”“明日”,这里作 +“次日”讲)、之(他)、若(比得上)。还有一个“尺”字,似乎应该属于古今通用的一类,可是这里说 + 邹忌身长八尺有余,显然比现在的尺小,严格说,“尺”的意义也已经改变了(汉朝的一尺大约合现在 + 七寸半,这里的尺大概跟汉朝的差不多)。 + + 在语法方面,也有不少差别。例如“我孰与城北徐公美?”就是古代特有的句法,底下“吾与徐公 + 孰美?”才跟现代句法相同。“君美甚”现在说“您漂亮得很”,当中必须用个“得”字。“忌不自信” + 也是古代的句法,现代的说法是“邹忌不相信自己(比徐公美)”,不能把“自己”搁在动词前边,搁在 + 前边就是“亲自”的意思(如“自己动手”),不是动作对象的意思(“自救”“自治”“自杀”等,是古 + 代句法结构遗留在现代语里的合成词)。“客从外来”现在说“有一位客人从外边来”,“客人”前边得加 + 个“一位”,头里还要来个“有”字,否则就得改变词序,说成“从外边来了一位客人”。“与坐谈”也 + 是古代语法,现在不能光说“和”,不说出和谁,也不能愣说“坐谈”,得说成“坐下来说话”。“不若君 + 之美”的“之”字,按照现代语法也是多余的。 + + 这短短的一段古代的文字,大多数的字都是现在还用的,可是仔细一分析,跟现代汉语的差别就有 + 这么大。 + + 语汇的变化 + + 语言的变化涉及语音、语法、语汇三方面。语汇联系人们的生活最为紧密,因而变化也最快,最 + 显著。有些字眼随着旧事物、旧概念的消失而消失。例如《诗经·鲁颂》的《 a》这一首诗里提到 + 马的名称就有十六种,全部《诗经》里的马的名称还有好些,再加上别的书里的,名堂就更多了。这 + 是因为马在古代人的生活里占重要位置,特别是那些贵族很讲究养马。这些字绝大多数后来都不用了。 + 别说《诗经》时代,清朝末年离现在才几十年,翻开那时候的小说像《官场现形记》之类来看看,已 + 经有很多词语非加注不可了。 + + 有些字眼随着新事物、新概念的出现而出现。古代席地而坐,没有专门供人坐的家具,后来生 + 活方式改变了,坐具产生了,“椅子”“凳子”等字眼也就产生了。椅子有靠背,最初就用“倚”字, + 后来才写作“椅”。凳子最初借用“橙”字,后来才写作“凳”。桌子也是后来才有的,古代只有 +“几”“案”,都是很矮的,适应席地而坐的习惯,后来坐高了,几案也不得不加高,于是有了新的名 + 称,最初就叫“卓子”(“卓”是高而直立的意思),后来才把“卓”写作“桌”。 + + 外来的事物带来了外来语。虽然汉语对于外来语以意译为主,音译词(包括部分译音的)比重较 + 小,但是数目也还是可观的。比较早的有葡萄、苜蓿、茉莉、苹果、菠菜等,近代的像咖啡、可可、 + 柠檬、雪茄、巧克力、冰激凌、白兰地、啤酒、卡片、沙发、扑克、哔叽、尼龙、法兰绒、道林纸、 + 芭蕾舞等,都是极常见的。由现代科学和技术带来的外来语就更多了,像化学元素的名称就有一大半 + 是译音的新造字,此外像摩托车、马达、引擎、水泵、卡车、吉普车、拖拉机、雷达、爱克斯光、淋 + 巴、阿米巴、休克、奎宁、吗啡、尼古丁、凡士林、来苏水、滴滴涕、逻辑、米(米突)、克(克兰 + 姆)、吨、瓦(瓦特)、卡(卡路里)等,都已经进入一般语汇了。 + + a 〔 〕读 jiōng。 + + 132 语文 必修上册 + 随着社会的发展,生活的改变,许多字眼的意义也起了变化。比如有了桌子之后,“几”就只用 + 于“茶几”,连炕上摆的跟古代的“几”十分相似的东西也叫作“炕桌儿”,不叫作“几”了。又如 +“床”,古代本是坐卧两用的,所以最早的坐具,类似现在的马扎的东西,叫作“胡床”,后来演变成 + 了椅子,床就只指专供睡觉用的家具了。连“坐”字的意义,古代和现代也不完全一样 a :古代席地 + 而坐,两膝着席,跟跪差不多,所以《战国策》里说伍子胥“坐行蒲服,乞食于吴市”,坐行就是膝 + 行(蒲服即匍匐);要是按现代的坐的姿势来理解,又是坐着又是走,那是绝对不可能的。 + + 再举两个名称不变而实质已变的例子。“钟”本是古代的乐器,后来一早一晚用钟和鼓报时,到了 + 西洋的时钟传入中国,因为它是按时敲打的,尽管形状不同,也管它叫钟,慢慢地时钟不再敲打了, + 可是钟的名称不变,这就跟古代的乐器全不相干了。“肥皂”的名称出于皂角树,从前把它的荚果捣烂 + 搓成丸子,用来洗脸洗澡洗衣服,现在用的肥皂是用油脂和碱制成的,跟皂角树无关。肥皂在北方又 + 叫“胰子”,胰子原来也是一种化妆用品,是用猪的胰脏制成的,现在也是名同实异了。 + + 也有一些字眼的意义变化或者事物的名称改变,跟人们的生活不一定有多大关系。比如“江”原 + 来专指长江,“河”原来专指黄河,后来都由专名变成通名了。又如“菜”,原来只指蔬菜,后来连 + 肉类也包括进去,到菜市场去买菜或者在饭店里叫菜,都是荤素全在内。这都是词义扩大的例子。跟 +“菜”相反,“肉”原来指禽兽的肉,现在在大多数地区如果不加限制词就专指猪肉,这是词义缩小的 + 例子(“肉”最初不用于人体,后来也用了,在这方面是词义扩大了)。“谷”原来是谷类的总名,现在 + 北方的“谷子”专指小米,南方的“谷子”专指稻子,这也是词义缩小的例子。 + + 词义也可以转移。比如“涕”,原来指眼泪,《庄子》里说:“哭泣无涕,中心不戚。”可是到汉朝 + 已经指鼻涕了,王褒 b《僮约》里说:“目泪下,鼻涕长一尺。”又如“信”,古代只指送信的人,现在 + 的信古代叫“书”,《世说新语》中“俄而谢玄淮上信至,(谢安)看书竟,默然无言”,“信”和“书” + 的分别是很清楚的。后来“信”由音信的意思转指书信,而信使的意思必得和“使”字连用,单用就 + 没有这个意思了。 + + 词义也会弱化。比如“很”,原来就是凶狠的“狠”,表示程度很高,可是现在已经一点也不狠 + 了,例如“今天很冷”不一定比“今天冷”更冷些,除非“很”字说得特别重。又如“普遍”,本来 + 是无例外的意思,可是现在常听见说“很普遍”,也就是说例外不多,并不是毫无例外。 + + 如果我们换一个角度来看事物怎样改变了名称,那么首先引起我们注意的是,像前边分析《战国 + 策》那一段文字的时候已经讲过的,很多古代的单音词现代都多音化了。这里再举几个人体方面的例 + 子:“耳”成了“耳朵”,“眉”成了“眉毛”,“鼻”成了“鼻子”,“发”成了“头发”。有的是一个单 + 音词换了另外一个单音词,例如“首”变成“头”(原来同义),“口”变成“嘴”(原来指鸟类的嘴), +“面”变成“脸”(原来指颊),“足”变成“脚”(原来指小腿)。有些方言里管头叫“脑袋”“脑壳”, + 管嘴叫“嘴巴”,管脸叫“面孔”,管脚叫“脚板”“脚丫子”,这又是多音化了。 + + 动词的例子:古代说“食”,现代说“吃”;古代说“服”或“衣”,现代说“穿”;古代说“居”, + 现代说“住”;古代说“行”,现代说“走”。形容词的例子:古代的“善”,现代叫“好”;古代的 + +a 〔连“坐”字的意义,古代和现代也不完全一样〕 古今意义一致;但“坐”的方式或姿势,则古今意 + 前 文 认 为“ 坐 ” 属 于 古 今 意 义 一 致, 此 处 认 为 义不同。 + “坐”属于古今意义不完全一样,是因为:“坐”作 b 〔王褒(生卒年不详)〕字子渊,蜀郡资中(今四川 + 为 身 体 动 作 的 一 种 状 态, 区 别 于“ 立 ”“ 卧 ” 等, 资阳)人,西汉辞赋家。 + + 第八单元 133 + “恶”,现代叫“坏”;古代的“甘”,现代叫“甜”;古代的“辛”,现代叫“辣”。 + 字眼的变换有时候是由于忌讳:或者因为恐惧、厌恶,或者因为觉得说出来难听。管老虎叫“大 + + 虫”,管蛇叫“长虫”,管老鼠叫“老虫”或“耗子”,是前者的例子。后者的例子如“大便”“小 + 便”“解手”“出恭”(明朝考场里防止考生随便进出,凡是上厕所的都要领块小牌子,牌子上写着“出 + 恭入敬”)。 + + 2.  词 义 a + + 朱德熙 + + 中国文字寻常所用的不过一二千字。初看去似乎只要认识了这一二千字就可以看懂一般普通的 + 文字了,其实不然。中国常用的文字数目虽有限,可是拼合起的词却很多。例如“轻”“重”两个字 + 是小学生都认识的,但“轻”字和“重”字和别的单字拼合起来,可以造成许多词,如“轻率”“轻 + 浮”“轻易”“轻蔑”“轻松”“轻便”都是用“轻”字拼成的词,“重要”“重实”“严重”“厚重”“沉 + 重”“郑重”“尊重”都是用“重”字拼成的词。此外还有各种各样的拼合法。这些词当然和原来的 +“轻”字和“重”字有关联,可是每个词的意思、情味并不一样。每个都可以说是生字。要体会这些词 + 的意义和情味,词典不能帮什么忙。譬如“轻狂”和“轻薄”两个词明明是有区别的,可是如果去查 + 词典,就会看见“不稳重”“不庄重”等类共同的解释。这并不是词典不好,实在是无可奈何的事。词 + 不但有意义,还有情味。词的情味完全要靠自己去体会,词典是无法帮忙的。犹之吃东西,甜酸苦辣 + 是尝得出说不出的东西。而且文字语言是社会的产物,词由于长时间的运用,各有特别的味道,譬如 +“现代”和“摩登”意义是差不多的,可是情味大大不同,“现代青年”“现代女子”并不就是“摩登青 + 年”“摩登女子”的意思。这两个词原是英语 modern 的意译和音译,但是渐渐分化,变成两个味道全 + 不同的词了,如“近代物理”不能说“摩登物理”,“中国近代史”也不能说“中国摩登史”。 + + 由于对于词的意义情味了解得不够,同学们往往犯下面几种毛病。 + 第一是词选择得不准确,不恰当。 +   a 集体学习的好处,我觉得有几点是可以讨论的。 + + 3333 + + 作者原想列举几点集体学习的好处,但结果读者所得的印象和作者原意刚好相反。因为“可以讨 + 论”通常有“尚不确定,有待讨论”的意思。 + +   b 我顶怕开会等人,而现在轮到他们等我了。 + 33 + + 作者的意思是说他自己顶怕等人,现在让别人等他,很过意不去。但是“而现在轮到他们等我了” + 这句话,好像说“从前老是我等他们,现在可轮到他们等我了”,有报复的意味,和原意相反。 + +   c 父亲昨夜伟大的谈话还萦绕在耳旁。 + 33 + + a 选自《作文指导》(《朱德熙文集》第四卷,商务印 + 书馆 1999 年版)。略有改动。朱德熙(1920—1992), + 江苏苏州人,语言学家。 + + 134 语文 必修上册 +   d 我奔跳了几下,完成了呼吸新鲜空气的任务后就回去了。 + 33 33 + +词的力量有轻重大小之别,不能乱用,这两句是“大词小用”的例子。 + +  e 三十多万人的会场如今竟似在无人之境。 + 3333 + +旧小说里描写赵子龙之类的勇将在百万军中杀进杀出,才说“如入无人之境”。这里要用成语, + +应该是“鸦雀无声”。 + +第二是相关的词的意义搭不拢,硬凑在一起,显得驴唇不对马嘴。这可以分为三类来说: + +1. 修饰语和被修饰语搭不拢。 +  f1950 年具有雄壮伟大的意义。 + +“伟大的意义”是可以说的,“雄壮的意义”却不成话。 +   g 以有魄力的舞会来表现我们的热情。 + +“有魄力”通常是用来形容人的性格或气概的,不能用以形容舞会。 +   h 提起麻木的脚步。 + +脚是有感觉的,可以说“麻木的脚”,脚步既无实质,又没有感觉,怎么能说“麻木”呢 ? +  i 对反动派表现出无比英勇的愤怒。 + +“愤怒”无所谓“英勇”不“英勇”,凑不到一块儿。 + +2. 相关的动词和名词搭不拢。 +  j 我国营贸易公司在全市开展零售商店。 + +“开展”只能跟一种业务或运动搭拢,零售店是店,不是业务,和“开展”搭不拢,这里通常只说 + +“开”,用个双音词就是“开设”。 +   k 美国外交人员捏造各种诡计。 + +凡是捏造的东西都是准备公开的,如准备说给人听的消息,准备拿给人看的证件,“诡计”却是藏 + +在心头决不肯公开的。 +   l 各地编的冬学政治教材内容太深,为一般冬学教师所不能胜任。 + +凡说“胜任”或“不胜任”,都指工作而言,“政治教材”不是工作,无所谓“胜任”不“胜任”。 + +  m 他沉痛地叙述在新中国成立前夕惨遭杀害的许多同学。 + +我们只能“叙述”一件事,却不能“叙述”人。 +  n 他们的心在跳跃着,奔腾着。 + +心只会“跳跃”,不会“奔腾”。 + +3. 相关的主语和谓语搭不拢。 +  o 他承认以前的行为完全是一个没有灵魂的僵尸。 + +无论怎么样的“行为”也不会变成“僵尸”。 +  p 这个宝贵的教训也就是土改工作的过程。 + +“教训”是一种抽象的概念,“过程”是一件事情发展的经过,完全是两回事。 + +上面我们曾以“轻”“重”二字为例,说明许多形式上类似的词,意义情味并不完全相同,这里再 + +举一些常见的词混淆的例子。 +   q 向同学们宣传助学金的意思。 + +“意思”是人的想法或意见,“意义”是事物的重要性,这里应该用“意义”(不过“意思”和“意 + + 第八单元 135 + 义”有时也可通用,例如“我不明白这个字的意思”和“我不明白这个字的意义”是一样的,二者都 + 相当于英文的 meaning)。 + +   r 中等以上学校的公费制度早在抗战初期就已设立。 + 这里应该用“建立”。“设立”往往用于比较具体的事物,如学校、机关之类;“建立”则用于较 + 抽象的事物,如制度、规则之类。 +   s 解放战争尚未完成。 + 一种有积极目的的,或是做完以后有具体的、可见的成绩的工作,才用“完成”,如“黄河堵险 + 工程已全部完成”“本年税收工作已告完成”。“战争”“会议”只是一种过程,事后没有具体的成绩可 + 言,只能用“结束”。 +   t 题目之难很有全军覆没的希望。 + “希望”指说话人主观愿望所想达到的结果,“危险”指主观愿望所想避免的结果,“可能”则兼指 + 二者。 +   u 大家都承认过去思想的不准确。 + “准确”是指量或程度而言的,如“统计数字不够准确”。“正确”是指方向而言的,如“正确的 + 领导”。 +   v 血肉造成的“机器”终于和钢铁造成的机器不一样的。(夏衍《包身工》) + “终于”是“最后”的意思,这里应该用“到底”或“究竟”。 +   w 现在的农村不是从前的了,那里发生着很有兴趣的过程。(加里宁《论通讯员的写作和 +   修养》) + “兴趣”与“趣味”不同,人对于事物可以发生兴趣,然而就事物本身说,却只能说“有趣味”, + 不能说“有兴趣”。 +   x 这学期常常听见各班同学很重视集体学习。 + “听见”一种声音,“听说”一件事情。 +   y 一提到清华,总觉得神气得了不起。 + “解放军真了不起”和“解放军真了不得”的意思是差不多的,但是“失火啦,了不得啦 !”不能 + 说“失火啦,了不起啦 !”主要的区别在于“了不得”可以用作程度修饰语,例如“他骄傲得了不得” + 或“他神气得了不得”表示骄傲、神气的程度达于极点,“了不起”不能用作程度修饰语,所以不能说 +“神气得了不起”“骄傲得了不起”。 +   z 在反动派统治时期,参加学生运动对个人的安全是有很大的作用的。 + “作用”往往指正面的、积极的意义,“影响”则可兼指正反两面。 +   @7 在严肃紧张的局面下,我不敢发言。 + “局面”是个大词,如“军阀割据的局面”,这里说的是开会,应该用“场面”。 + + 136 语文 必修上册 + 3.  资料摘编一组 + + (1) + + 任何一种语言,从教、学、使用的角度来看,相对地讲,语汇是比较难的。母语是这样,第二语言 + 更是这样。这是因为:第一,语汇的规律最不好讲。什么是一个词,就说不清楚。汉语说“铁路”,是 + 一个词;英语说 railroad,或 railway,也是一个词,然而直译应为“轨路”,不是“铁路”;法语说 chemin + de fer,直译是“铁路”,然而不是一个词。这有什么道理可讲呢?就是在同一种语言之内,比如汉语普 + 通话,说“吃面包”“吃苹果”“吃菜”“吃牛肉”,但是不说“吃酒”,因为酒是液体,要说“喝”,不说 +“吃”,然而,凡是药,即使是药水或者汤药,统统说“吃”,不说“喝”。这又有什么道理可讲,有什么 + 规律可循呢?这只是极简单的例子。词的来源,词的构成,词义,词的用法,词与词的搭配,等等,变 + 化多端,复杂万状。第二,词太多。学任何语言,要想稍微管点儿用,总得会几千个词。许多词有多义 + 多用现象;两三个词或三五个词之间,有所谓同义、近义现象,或大同而小异,或大异而小同,其同其 + 异,或在所表示的概念的外延、内涵,或在新旧,或在雅俗,或在文野,或在来源,或在隐含,或在色 + 彩,或在搭配习惯,充分理解已经不易,掌握使用做到准确得体更难。人们容易感到语音、语法困难, + 尤其在学习第二语言时,其实,无论就数量说或就内容说,与语汇之难都无法相比。第三,语汇的身上 + 负载着使用这种语言的民族文化传统,社会风土人情,以至人们的心理特征和思维习惯。倘若这些方面 + 的知识不够,对许多词的领会和运用就必然产生困难。在中国,比如举行一次文艺晚会,大家请某人弹 + 一曲钢琴,或者唱一首歌,或者朗诵一首他本人写的诗,表演完了,大家鼓掌,他答谢,同时可能说 +(尤其在很小型的,十个八个人的聚会时):“胡弹乱唱,献丑,献丑”“见笑,见笑”“请指教”。在西 + 方,不大会这样说;西方人初次听见中国人这样说会感到不理解,甚至诧异。就是在中国,这几个说法 + 的含义也很不相同,用不用说,用哪个合适,要看聚会者都是些什么人,什么关系,表演者自己和听者 + 是什么关系,等等。第四,语汇的变化很快,比语音语法快得多。社会上,文化、科学中,有了新的发 + 展变化,出现了什么新事物、新观念,立刻就会出现新的词,或者用旧有的词赋予新义来表示它们。相 + 反,也会不断有旧词被淘汰或者改变了意义和用法。对于社会生活的哪怕点点滴滴的变化,语汇是极为 + 敏感的,反应也是极为迅速的。如果我们做一次今天一天出版的 100 份各种报纸的词频统计,大概“现 + 代化”这个词的出现频率会相当高。可是,如果认真追问一下“现代”的含义,恐怕不是很容易回答的。 +“现代汉语”“中国现代史”“欧洲现代史”“现代派(绘画)”“现代信息技术”,这些“现代”用一个定 + 义能说得清楚吗?不是不可知,不是不能定义,只是说,很难,因为同是这个词,在不同的时候,不同 + 的场合含义有所变化,它不是凝固的。 + + (摘自张志公《语汇重要,语汇难》,《张志公语文教育论集》,人民教育出版社 1994 年版) + + (2) + + 一个词往往不只具有一个意义。当它们有两个以上的意义的时候,其中应该有一个是本义,另外 + 还有一个或一些引申义。所谓引申义,是从本义“引申”出来的,即从本义发展出来的。举例来说, + + 第八单元 137 + “向”字的本义是“向北的窗户”(《说文》:“向,北出牖也。”),《诗经·豳风·七月》:“塞向墐户。” +(塞好朝北的窗子,用泥涂好柴门。)由朝北的窗户这个本义,引申为“朝着”或“对着”。又如“道” + 字,它的本义是“路”,《诗经·秦风·蒹葭》:“道阻且长。”引申为达到道德标准的途径,《论语·里 + + 仁》:“朝闻道,夕死可矣。”又引申为正当的手段,《论语·里仁》:“不以其道得之,不处也。”等等。 + 词义的引申和词义的更替应该区别开来。词义的更替是指某词在产生新的意义的时候同时排斥了 + + 旧的意义,例如“脚”字的本义是“小腿”(《说文》:“脚,胫也。”),后来“脚”字变为指“足”,也 + 就不再指小腿了。词义的引申是指某词产生了新的意义以后,并不排除原始意义。例如“道”字虽然 + 产生了一些新义,但是路的意义一直保存到现代汉语里。这类情况很多,也最重要。一方面,这增强 + 了语言的稳固性,使语言不至于面目全非;另一方面,这使语言丰富化了。 + + 抓住本义去说明各种引申义,就会处处都通,而且令人明白:虽然一个词有许多意义,但是它们 + 之间是互相联系着的,而且往往环绕着一个中心。比如:朝拜、朝廷、朝向的“朝”就都是从朝见的 +“朝”引申出来的。也有的是一环套一环,几个引申义同本义之间的距离有远近之分。仍以“朝”字为 + 例,它的本义是早晨的意思(《说文》:“朝,旦也。”),引申为朝见,由朝见再引申为朝廷,由朝廷又 + 引申为朝代。 + + 近的引申义很容易令人意识到,例如长短的“长”引申为长久的“长”,尊长的“长”引申为首长 + 的“长”。远的引申义就不容易令人意识到,例如长短的“长”引申为首长的“长”,不但意义远了, + 连读音都改变了。其实长短的“长”和滋长的“长”,意义还是相当近的,因为草木滋长(zhǎng)是 + 越来越长(cháng)了。然后滋长的“长”引申为长幼的“长”,再引申为首长的“长”。 + + 抓住一个词的本义,就像抓住了这个词的纲,纷繁的词义都变为简单而有系统的了。对本义有了 + 体会,对于某些词义可以推想而知,而且也可以了解得更透彻。 + + (摘自王力《古代汉语》,中华书局 1999 年版) + + (3) + + 用词要用得正确、贴切,就要比较一些词的细微的区别。这是很要紧的。譬如与“密”字配合的, + 有“精密”“严密”“周密”等词,粗粗看来好像差不多,要细细辨别才辨得出彼此的差别。“精密”跟 +“周密”有何不同,“精密”该用在何处,“周密”该用在何处,都要仔细想一想。想过了,用起来就有分 + 寸。如果平时不下功夫,就不知道用哪一个才合适。 + + 用词,有时也表示一个人的立场。立场,就是站在哪一方面。比方有人说,在土地改革的时候,某 + 村地主很“活跃”,这就是立场不对头。“活跃”往往用在对一件事表示赞美的场合。对地主用“活跃” + 不合适,要用“猖獗”。否则人家会认为你是站在地主的立场呢。这些地方如果平时不注意,就会出错。 + 用词还有个搭配的问题。比方“成绩”,可以说“取得成绩”“作出成绩”,如果说“造出成绩”就不合 + 适。前边的词跟后边的词,有搭配得上的,有搭配不上的,把不相配合的硬配在一起,就不行。所以用 + 词也是基本功,无论阅读或是写作都要注意。 + + (摘自叶圣陶《认真学习语文》,《叶圣陶集》第十三卷,江苏教育出版社 2004 年版) + + 138 语文 必修上册 + (4) + + 投机取巧。有人说,成语词典把“投机取巧”这个成语列为贬义词不对——理由是我们的祖先创造 +“投机”“取巧”两个词组(应为“词”)时并非贬义,其实这表示“注意时机”“采用巧妙方法”云云。 + 祖先创造时如何,我不曾考证过,但多少年来人们用这四个字表现了社会上的一种不正之风,并非词典 + 把它归入“贬义范围”,而是词典记录了这四个字在语言活动中所传递的贬义信息。况且“投机”不等 + 于“注意时机”,“取巧”也不等于“采用巧妙方法”。约定俗成在词汇的形成和发展上确实起作用,有 + 时甚至是决定性作用,这属于语言要素变异的研究范围。 + + 新潮。新潮一词是 20 世纪 70 年代末到 80 年代在香港兴起的,它的语义是“摩登”“时兴”“时 + 髦”“新款式”“新方式”,如“新潮服装”之类。新潮这个语词随着 20 世纪 80 年代开放政策的逐步深 + 化,进入了内地。内地从 80 年代中期开始,一部分人也大谈新潮了。在现代汉语,新潮却不是个新构成 + 的语词——“五四”时期就出现了,那时的新潮却是新的历史潮流之意。20 世纪 20 年代在北平兴起的 +“新潮”,到 70 年代在香港借用的“新潮”,又回到 80 年代北京一般口头语中使用的“新潮”,语义变了 + 又变:这个语词可以说明语言运动的一种模式。 + + 与此相类似的还有摩登一词——13 世纪汉语出现的摩登,是从梵语译来的(“摩登伽”),到 20 世纪 + 汉语使用的摩登,却是从英语译来的(“现代”)。所用的汉字虽然一样,且都是从外国语译借来的,但 + 意义却迥然不同。这也是一种语言运动。 + + (摘自尘元《在语词的密林里》,生活·读书·新知三联书店 2008 年版) + + 第八单元 139 + 古诗词诵读 + + a + + 静  女 + + 《诗经·邶风》 + + 静女其姝 b,俟 c 我于城隅 d。 + 爱 e 而不见,搔首踟蹰 f。 + + 静女其娈 g,贻我彤管 h。 + 彤管有炜 i,说怿女美 j。 + + 自牧归荑 k,洵美且异 l。 + 匪女之为美 m,美人之贻。 + + 这是一首古老的爱情诗。开篇先以男子之口,引出一位娴静而美丽的女子。 + 接着叙述她原本与男子约定相会,却“爱而不见”,令男子独自徘徊,这样的场 + 景,表现了爱情萌发时的甜蜜和欢乐。接下来说静女赠送的彤管很美丽、讨人喜 + 爱,后面又退一步说并非彤管好,而是因为它是美人赠送的。如此反复借彤管 +“表白”,其实都是抒发对静女的爱,真实且有情趣。诵读这首诗,思考“彤管” + 这类美好事物在诗中的象征作用,感受反复手法在表情达意上的作用。 + +a 选自《诗经注析》(中华书局 1991 年版)。 i 〔炜(wěi)〕色红而光亮。 +b 〔静女其姝(shū)〕娴静的女子很漂亮。姝,美丽、 j 〔说(yuè)怿(yì)女(rǔ)美〕喜爱你的美丽。说, + + 漂亮。 同“悦”。怿,喜悦。女,同“汝”,第二人称代词。 +c 〔俟(sì)〕等待。 下文的“匪女之为美”的“女”同此。 +d 〔城隅〕城角。一说指城上的角楼。 k 〔自牧归(kuì)荑〕从远郊归来赠送我初生的茅草。 +e 〔爱〕同“ (ài)”,隐藏。 牧,城邑的远郊。归,同“馈”,赠送。 +f 〔搔首踟蹰(chíchú)〕以手指挠头,徘徊不进。 l 〔洵美且异〕确实美好而且与众不同。洵,诚然、 +g 〔娈(luán)〕美好。 实在。 +h 〔彤管〕红色的管状物。一说指初生时呈红色的管 m 〔匪女之为美〕并非你这荑草美。匪,同“非”,表 + 示否定判断。 + 状的草,即下一章所说的“荑(tí)”。 + +140 语文 必修上册 + a + + 涉江采芙蓉 + + 《古诗十九首》 + + 涉江采芙蓉,兰泽 b 多芳草。 + 采之欲遗 c 谁?所思在远道。 + 还顾望旧乡,长路漫浩浩。 + 同心而离居,忧伤以 d 终老。 + + 东汉中后期,游宦、游学之风盛行,大批士子远离故乡。作为文人五言诗滥 +觞的《古诗十九首》反映的就是这一现实,诗中充满了羁旅怀乡的思绪。这首 +诗的主人公采撷美草香花要送给“同心”的人,但他思念的人还在“旧乡”,长 +路漫漫,欲赠不能,只能让忧伤陪伴自己终老。全诗字里行间流露着漂泊他乡 +和分隔两地的无奈。诵读这首诗,体会其“浅而能深、近而能远”(胡应麟《诗 +薮·内编》卷一)的特色。 + +a 选自《文选》卷二十九(上海古籍出版社 1986 年版)。 c 〔遗(wèi)〕赠送。 + 芙蓉,荷花。 d 〔以〕连词,表示结果。 + +b 〔兰泽〕长着兰草的低湿之地。 + + 古诗词诵读 141 + a + + 虞美人 + + 李煜 + + 春花秋月 b 何时了,往事知多少 c。小楼昨夜又东风,故国 d 不堪回首月 +明中。  雕栏玉砌 e 应犹在,只是朱颜改 f。问君能有几多 g 愁,恰似一江春 +水向东流。 + + 李煜的这首词,将俘囚生活的幽怨、月夜听风的无眠、物是人非的无奈、愁 +怀难解的悲凉,以及对往日帝王生活的怀想,编织在一起,将亡国之痛、故国之 +思寄寓其中。词人通过具体的物象,把抽象的愁绪具象化,如“问君能有几多 +愁,恰似一江春水向东流”,千古流传,引发了不同时代人们的感叹,诵读时要 +细加品味。 + +a 选自《南唐二主词校订》(中华书局 2007 年版)。虞 d 〔故国〕指南唐。 + 美人,词牌名。李煜(937—978),字重光,徐州 e 〔雕栏玉砌〕雕饰华美的栏杆与用玉石砌成的台阶, + (今属江苏)人,南唐后主,世称李后主。 + 指宫殿建筑。 +b 〔春花秋月〕指季节的更替。 f 〔朱颜改〕红润的容颜改变了,指人已憔悴。 +c 〔往事知多少〕意思是多少往事都难以忘却。 g 〔几多〕多少。 + +142 语文 必修上册 + a + + 鹊桥仙 + + 秦观 + + 纤云弄巧 b,飞星传恨 c,银汉迢迢暗度 d。金风 e 玉露一相逢,便胜却 f 人 +间无数。 柔情似水,佳期 g 如梦,忍顾鹊桥归路 h !两情若是久长时,又岂 +在朝朝暮暮 i。 + + 这首词借鹊桥相会的传说,歌咏忠贞不渝的爱情。词人不认为织女和牛郎聚 +少离多值得哀怨,因为他们短暂的相会,远胜世人无数次的相聚,时空阻隔反而 +酿就了他们相会的甜蜜。词人还说,只要彼此情意长久,即使不能朝夕相守,也 +无须黯然神伤。诵读这首词,体会词人命意的高妙,理解他对爱情的独特见解。 + +a 选 自《 淮 海 居 士 长 短 句 笺 注 》 卷 中( 上 海 古 籍 出 农 历 七 月 七 日 夜, 织 女、 牛 郎 借 鹊 桥 越 过 天 河 相 + 版社 2008 年版)。鹊桥仙,词牌名。秦观(1049— 会。银汉,天河、银河。 + 1100), 字 少 游, 又 字 太 虚, 号 淮 海 居 士, 高 邮 e〔 金风〕秋风。五行学说以秋天与金相配。 + f 〔胜却〕胜过。 + (今属江苏)人,北宋词人。 g〔 佳期〕这里指重聚相守的美好时光。 +b 〔纤云弄巧〕纤细的云编织出各种巧妙的图案样式, h〔 忍顾鹊桥归路〕怎么忍心回望由鹊桥回去的路。 + i〔 朝朝暮暮〕指朝夕相守。 + 比喻织女制作云锦的手艺高超。 +c 〔飞星传恨〕流星传递分别的愁苦。 古诗词诵读 143 +d〔 银汉迢迢暗度〕夜里渡过辽阔的天河。传说每年 + 后记 + + 《普通高中教科书 语文》由教育部组织编写,北京大学温儒敏教授担任总主编, +2019 年经国家教材委员会审核通过。 + + 国家教材委员会委员、国家教材委员会语文学科专家委员会和思想政治审议专家委员 +会委员及有关专家,对教科书的编写与修改完善给予了悉心指导和严格把关,提出了很多 +宝贵的意见建议。北京、天津、上海、浙江、山东、河南、四川、宁夏、新疆、海南等省(自 +治区、直辖市)教育科学研究院(所)、教研室及部分学校参加教科书的试教试用,为教 +科书的修改完善提出了很好的意见建议。余党绪、韩涵、陈恒舒、曹晛等同志参与了部分 +教材编写工作。同时,教科书还征求了许多专家学者和广大一线教师的意见。在此,向各 +位专家和教师表示感谢。 + + 人民教育出版社承担了教科书的编辑出版工作,在组织编写、排版印制、试教试用等 +方面给予了全方位的协助。中学语文编辑室王本华、朱于国为全套教科书的编写修改做了 +大量统筹协调工作。房海莹承担本书的美术设计工作。此外,在教科书编写、编辑出版过 +程中,还有很多业界同仁和社会各界朋友都提供过帮助,在此一并表示诚挚的谢意。 + + 教科书投入使用后,我们根据各方意见作了修订,真诚希望广大师生和家长继续提出 +宝贵意见! + + 联系方式 + 电话:010-58758959 58758628 + 电子邮箱:jcfk@pep.com.cn + + 编者 + 2023 年 7 月 + ® + +PUTONG GAOZHONG JIAOKESHU + +YUWEN + +绿色印刷产品 + diff --git a/src/renderer/public/img/logo.png b/src/renderer/public/img/logo.png new file mode 100644 index 0000000..45f6e65 Binary files /dev/null and b/src/renderer/public/img/logo.png differ diff --git a/src/renderer/public/lib/build/pdf.mjs b/src/renderer/public/lib/build/pdf.mjs new file mode 100644 index 0000000..7906d1a --- /dev/null +++ b/src/renderer/public/lib/build/pdf.mjs @@ -0,0 +1,19678 @@ +/** + * @licstart The following is the entire license notice for the + * JavaScript code in this page + * + * Copyright 2023 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @licend The above is the entire license notice for the + * JavaScript code in this page + */ + +/******/ // The require scope +/******/ var __webpack_require__ = {}; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/************************************************************************/ +var __webpack_exports__ = globalThis.pdfjsLib = {}; + +// EXPORTS +__webpack_require__.d(__webpack_exports__, { + AbortException: () => (/* reexport */ AbortException), + AnnotationEditorLayer: () => (/* reexport */ AnnotationEditorLayer), + AnnotationEditorParamsType: () => (/* reexport */ AnnotationEditorParamsType), + AnnotationEditorType: () => (/* reexport */ AnnotationEditorType), + AnnotationEditorUIManager: () => (/* reexport */ AnnotationEditorUIManager), + AnnotationLayer: () => (/* reexport */ AnnotationLayer), + AnnotationMode: () => (/* reexport */ AnnotationMode), + CMapCompressionType: () => (/* reexport */ CMapCompressionType), + ColorPicker: () => (/* reexport */ ColorPicker), + DOMSVGFactory: () => (/* reexport */ DOMSVGFactory), + DrawLayer: () => (/* reexport */ DrawLayer), + FeatureTest: () => (/* reexport */ util_FeatureTest), + GlobalWorkerOptions: () => (/* reexport */ GlobalWorkerOptions), + ImageKind: () => (/* reexport */ util_ImageKind), + InvalidPDFException: () => (/* reexport */ InvalidPDFException), + MissingPDFException: () => (/* reexport */ MissingPDFException), + OPS: () => (/* reexport */ OPS), + Outliner: () => (/* reexport */ Outliner), + PDFDataRangeTransport: () => (/* reexport */ PDFDataRangeTransport), + PDFDateString: () => (/* reexport */ PDFDateString), + PDFWorker: () => (/* reexport */ PDFWorker), + PasswordResponses: () => (/* reexport */ PasswordResponses), + PermissionFlag: () => (/* reexport */ PermissionFlag), + PixelsPerInch: () => (/* reexport */ PixelsPerInch), + RenderingCancelledException: () => (/* reexport */ RenderingCancelledException), + TextLayer: () => (/* reexport */ TextLayer), + UnexpectedResponseException: () => (/* reexport */ UnexpectedResponseException), + Util: () => (/* reexport */ Util), + VerbosityLevel: () => (/* reexport */ VerbosityLevel), + XfaLayer: () => (/* reexport */ XfaLayer), + build: () => (/* reexport */ build), + createValidAbsoluteUrl: () => (/* reexport */ createValidAbsoluteUrl), + fetchData: () => (/* reexport */ fetchData), + getDocument: () => (/* reexport */ getDocument), + getFilenameFromUrl: () => (/* reexport */ getFilenameFromUrl), + getPdfFilenameFromUrl: () => (/* reexport */ getPdfFilenameFromUrl), + getXfaPageViewport: () => (/* reexport */ getXfaPageViewport), + isDataScheme: () => (/* reexport */ isDataScheme), + isPdfFile: () => (/* reexport */ isPdfFile), + noContextMenu: () => (/* reexport */ noContextMenu), + normalizeUnicode: () => (/* reexport */ normalizeUnicode), + renderTextLayer: () => (/* reexport */ renderTextLayer), + setLayerDimensions: () => (/* reexport */ setLayerDimensions), + shadow: () => (/* reexport */ shadow), + updateTextLayer: () => (/* reexport */ updateTextLayer), + version: () => (/* reexport */ version) +}); + +;// CONCATENATED MODULE: ./src/shared/util.js +const isNodeJS = typeof process === "object" && process + "" === "[object process]" && !process.versions.nw && !(process.versions.electron && process.type && process.type !== "browser"); +const IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0]; +const FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0]; +const MAX_IMAGE_SIZE_TO_CACHE = 10e6; +const LINE_FACTOR = 1.35; +const LINE_DESCENT_FACTOR = 0.35; +const BASELINE_FACTOR = LINE_DESCENT_FACTOR / LINE_FACTOR; +const RenderingIntentFlag = { + ANY: 0x01, + DISPLAY: 0x02, + PRINT: 0x04, + SAVE: 0x08, + ANNOTATIONS_FORMS: 0x10, + ANNOTATIONS_STORAGE: 0x20, + ANNOTATIONS_DISABLE: 0x40, + OPLIST: 0x100 +}; +const AnnotationMode = { + DISABLE: 0, + ENABLE: 1, + ENABLE_FORMS: 2, + ENABLE_STORAGE: 3 +}; +const AnnotationEditorPrefix = "pdfjs_internal_editor_"; +const AnnotationEditorType = { + DISABLE: -1, + NONE: 0, + FREETEXT: 3, + HIGHLIGHT: 9, + STAMP: 13, + INK: 15 +}; +const AnnotationEditorParamsType = { + RESIZE: 1, + CREATE: 2, + FREETEXT_SIZE: 11, + FREETEXT_COLOR: 12, + FREETEXT_OPACITY: 13, + INK_COLOR: 21, + INK_THICKNESS: 22, + INK_OPACITY: 23, + HIGHLIGHT_COLOR: 31, + HIGHLIGHT_DEFAULT_COLOR: 32, + HIGHLIGHT_THICKNESS: 33, + HIGHLIGHT_FREE: 34, + HIGHLIGHT_SHOW_ALL: 35 +}; +const PermissionFlag = { + PRINT: 0x04, + MODIFY_CONTENTS: 0x08, + COPY: 0x10, + MODIFY_ANNOTATIONS: 0x20, + FILL_INTERACTIVE_FORMS: 0x100, + COPY_FOR_ACCESSIBILITY: 0x200, + ASSEMBLE: 0x400, + PRINT_HIGH_QUALITY: 0x800 +}; +const TextRenderingMode = { + FILL: 0, + STROKE: 1, + FILL_STROKE: 2, + INVISIBLE: 3, + FILL_ADD_TO_PATH: 4, + STROKE_ADD_TO_PATH: 5, + FILL_STROKE_ADD_TO_PATH: 6, + ADD_TO_PATH: 7, + FILL_STROKE_MASK: 3, + ADD_TO_PATH_FLAG: 4 +}; +const util_ImageKind = { + GRAYSCALE_1BPP: 1, + RGB_24BPP: 2, + RGBA_32BPP: 3 +}; +const AnnotationType = { + TEXT: 1, + LINK: 2, + FREETEXT: 3, + LINE: 4, + SQUARE: 5, + CIRCLE: 6, + POLYGON: 7, + POLYLINE: 8, + HIGHLIGHT: 9, + UNDERLINE: 10, + SQUIGGLY: 11, + STRIKEOUT: 12, + STAMP: 13, + CARET: 14, + INK: 15, + POPUP: 16, + FILEATTACHMENT: 17, + SOUND: 18, + MOVIE: 19, + WIDGET: 20, + SCREEN: 21, + PRINTERMARK: 22, + TRAPNET: 23, + WATERMARK: 24, + THREED: 25, + REDACT: 26 +}; +const AnnotationReplyType = { + GROUP: "Group", + REPLY: "R" +}; +const AnnotationFlag = { + INVISIBLE: 0x01, + HIDDEN: 0x02, + PRINT: 0x04, + NOZOOM: 0x08, + NOROTATE: 0x10, + NOVIEW: 0x20, + READONLY: 0x40, + LOCKED: 0x80, + TOGGLENOVIEW: 0x100, + LOCKEDCONTENTS: 0x200 +}; +const AnnotationFieldFlag = { + READONLY: 0x0000001, + REQUIRED: 0x0000002, + NOEXPORT: 0x0000004, + MULTILINE: 0x0001000, + PASSWORD: 0x0002000, + NOTOGGLETOOFF: 0x0004000, + RADIO: 0x0008000, + PUSHBUTTON: 0x0010000, + COMBO: 0x0020000, + EDIT: 0x0040000, + SORT: 0x0080000, + FILESELECT: 0x0100000, + MULTISELECT: 0x0200000, + DONOTSPELLCHECK: 0x0400000, + DONOTSCROLL: 0x0800000, + COMB: 0x1000000, + RICHTEXT: 0x2000000, + RADIOSINUNISON: 0x2000000, + COMMITONSELCHANGE: 0x4000000 +}; +const AnnotationBorderStyleType = { + SOLID: 1, + DASHED: 2, + BEVELED: 3, + INSET: 4, + UNDERLINE: 5 +}; +const AnnotationActionEventType = { + E: "Mouse Enter", + X: "Mouse Exit", + D: "Mouse Down", + U: "Mouse Up", + Fo: "Focus", + Bl: "Blur", + PO: "PageOpen", + PC: "PageClose", + PV: "PageVisible", + PI: "PageInvisible", + K: "Keystroke", + F: "Format", + V: "Validate", + C: "Calculate" +}; +const DocumentActionEventType = { + WC: "WillClose", + WS: "WillSave", + DS: "DidSave", + WP: "WillPrint", + DP: "DidPrint" +}; +const PageActionEventType = { + O: "PageOpen", + C: "PageClose" +}; +const VerbosityLevel = { + ERRORS: 0, + WARNINGS: 1, + INFOS: 5 +}; +const CMapCompressionType = { + NONE: 0, + BINARY: 1 +}; +const OPS = { + dependency: 1, + setLineWidth: 2, + setLineCap: 3, + setLineJoin: 4, + setMiterLimit: 5, + setDash: 6, + setRenderingIntent: 7, + setFlatness: 8, + setGState: 9, + save: 10, + restore: 11, + transform: 12, + moveTo: 13, + lineTo: 14, + curveTo: 15, + curveTo2: 16, + curveTo3: 17, + closePath: 18, + rectangle: 19, + stroke: 20, + closeStroke: 21, + fill: 22, + eoFill: 23, + fillStroke: 24, + eoFillStroke: 25, + closeFillStroke: 26, + closeEOFillStroke: 27, + endPath: 28, + clip: 29, + eoClip: 30, + beginText: 31, + endText: 32, + setCharSpacing: 33, + setWordSpacing: 34, + setHScale: 35, + setLeading: 36, + setFont: 37, + setTextRenderingMode: 38, + setTextRise: 39, + moveText: 40, + setLeadingMoveText: 41, + setTextMatrix: 42, + nextLine: 43, + showText: 44, + showSpacedText: 45, + nextLineShowText: 46, + nextLineSetSpacingShowText: 47, + setCharWidth: 48, + setCharWidthAndBounds: 49, + setStrokeColorSpace: 50, + setFillColorSpace: 51, + setStrokeColor: 52, + setStrokeColorN: 53, + setFillColor: 54, + setFillColorN: 55, + setStrokeGray: 56, + setFillGray: 57, + setStrokeRGBColor: 58, + setFillRGBColor: 59, + setStrokeCMYKColor: 60, + setFillCMYKColor: 61, + shadingFill: 62, + beginInlineImage: 63, + beginImageData: 64, + endInlineImage: 65, + paintXObject: 66, + markPoint: 67, + markPointProps: 68, + beginMarkedContent: 69, + beginMarkedContentProps: 70, + endMarkedContent: 71, + beginCompat: 72, + endCompat: 73, + paintFormXObjectBegin: 74, + paintFormXObjectEnd: 75, + beginGroup: 76, + endGroup: 77, + beginAnnotation: 80, + endAnnotation: 81, + paintImageMaskXObject: 83, + paintImageMaskXObjectGroup: 84, + paintImageXObject: 85, + paintInlineImageXObject: 86, + paintInlineImageXObjectGroup: 87, + paintImageXObjectRepeat: 88, + paintImageMaskXObjectRepeat: 89, + paintSolidColorImageMask: 90, + constructPath: 91 +}; +const PasswordResponses = { + NEED_PASSWORD: 1, + INCORRECT_PASSWORD: 2 +}; +let verbosity = VerbosityLevel.WARNINGS; +function setVerbosityLevel(level) { + if (Number.isInteger(level)) { + verbosity = level; + } +} +function getVerbosityLevel() { + return verbosity; +} +function info(msg) { + if (verbosity >= VerbosityLevel.INFOS) { + console.log(`Info: ${msg}`); + } +} +function warn(msg) { + if (verbosity >= VerbosityLevel.WARNINGS) { + console.log(`Warning: ${msg}`); + } +} +function unreachable(msg) { + throw new Error(msg); +} +function assert(cond, msg) { + if (!cond) { + unreachable(msg); + } +} +function _isValidProtocol(url) { + switch (url?.protocol) { + case "http:": + case "https:": + case "ftp:": + case "mailto:": + case "tel:": + return true; + default: + return false; + } +} +function createValidAbsoluteUrl(url, baseUrl = null, options = null) { + if (!url) { + return null; + } + try { + if (options && typeof url === "string") { + if (options.addDefaultProtocol && url.startsWith("www.")) { + const dots = url.match(/\./g); + if (dots?.length >= 2) { + url = `http://${url}`; + } + } + if (options.tryConvertEncoding) { + try { + url = stringToUTF8String(url); + } catch {} + } + } + const absoluteUrl = baseUrl ? new URL(url, baseUrl) : new URL(url); + if (_isValidProtocol(absoluteUrl)) { + return absoluteUrl; + } + } catch {} + return null; +} +function shadow(obj, prop, value, nonSerializable = false) { + Object.defineProperty(obj, prop, { + value, + enumerable: !nonSerializable, + configurable: true, + writable: false + }); + return value; +} +const BaseException = function BaseExceptionClosure() { + function BaseException(message, name) { + if (this.constructor === BaseException) { + unreachable("Cannot initialize BaseException."); + } + this.message = message; + this.name = name; + } + BaseException.prototype = new Error(); + BaseException.constructor = BaseException; + return BaseException; +}(); +class PasswordException extends BaseException { + constructor(msg, code) { + super(msg, "PasswordException"); + this.code = code; + } +} +class UnknownErrorException extends BaseException { + constructor(msg, details) { + super(msg, "UnknownErrorException"); + this.details = details; + } +} +class InvalidPDFException extends BaseException { + constructor(msg) { + super(msg, "InvalidPDFException"); + } +} +class MissingPDFException extends BaseException { + constructor(msg) { + super(msg, "MissingPDFException"); + } +} +class UnexpectedResponseException extends BaseException { + constructor(msg, status) { + super(msg, "UnexpectedResponseException"); + this.status = status; + } +} +class FormatError extends BaseException { + constructor(msg) { + super(msg, "FormatError"); + } +} +class AbortException extends BaseException { + constructor(msg) { + super(msg, "AbortException"); + } +} +function bytesToString(bytes) { + if (typeof bytes !== "object" || bytes?.length === undefined) { + unreachable("Invalid argument for bytesToString"); + } + const length = bytes.length; + const MAX_ARGUMENT_COUNT = 8192; + if (length < MAX_ARGUMENT_COUNT) { + return String.fromCharCode.apply(null, bytes); + } + const strBuf = []; + for (let i = 0; i < length; i += MAX_ARGUMENT_COUNT) { + const chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length); + const chunk = bytes.subarray(i, chunkEnd); + strBuf.push(String.fromCharCode.apply(null, chunk)); + } + return strBuf.join(""); +} +function stringToBytes(str) { + if (typeof str !== "string") { + unreachable("Invalid argument for stringToBytes"); + } + const length = str.length; + const bytes = new Uint8Array(length); + for (let i = 0; i < length; ++i) { + bytes[i] = str.charCodeAt(i) & 0xff; + } + return bytes; +} +function string32(value) { + return String.fromCharCode(value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff); +} +function objectSize(obj) { + return Object.keys(obj).length; +} +function objectFromMap(map) { + const obj = Object.create(null); + for (const [key, value] of map) { + obj[key] = value; + } + return obj; +} +function isLittleEndian() { + const buffer8 = new Uint8Array(4); + buffer8[0] = 1; + const view32 = new Uint32Array(buffer8.buffer, 0, 1); + return view32[0] === 1; +} +function isEvalSupported() { + try { + new Function(""); + return true; + } catch { + return false; + } +} +class util_FeatureTest { + static get isLittleEndian() { + return shadow(this, "isLittleEndian", isLittleEndian()); + } + static get isEvalSupported() { + return shadow(this, "isEvalSupported", isEvalSupported()); + } + static get isOffscreenCanvasSupported() { + return shadow(this, "isOffscreenCanvasSupported", typeof OffscreenCanvas !== "undefined"); + } + static get platform() { + if (typeof navigator !== "undefined" && typeof navigator?.platform === "string") { + return shadow(this, "platform", { + isMac: navigator.platform.includes("Mac") + }); + } + return shadow(this, "platform", { + isMac: false + }); + } + static get isCSSRoundSupported() { + return shadow(this, "isCSSRoundSupported", globalThis.CSS?.supports?.("width: round(1.5px, 1px)")); + } +} +const hexNumbers = Array.from(Array(256).keys(), n => n.toString(16).padStart(2, "0")); +class Util { + static makeHexColor(r, g, b) { + return `#${hexNumbers[r]}${hexNumbers[g]}${hexNumbers[b]}`; + } + static scaleMinMax(transform, minMax) { + let temp; + if (transform[0]) { + if (transform[0] < 0) { + temp = minMax[0]; + minMax[0] = minMax[2]; + minMax[2] = temp; + } + minMax[0] *= transform[0]; + minMax[2] *= transform[0]; + if (transform[3] < 0) { + temp = minMax[1]; + minMax[1] = minMax[3]; + minMax[3] = temp; + } + minMax[1] *= transform[3]; + minMax[3] *= transform[3]; + } else { + temp = minMax[0]; + minMax[0] = minMax[1]; + minMax[1] = temp; + temp = minMax[2]; + minMax[2] = minMax[3]; + minMax[3] = temp; + if (transform[1] < 0) { + temp = minMax[1]; + minMax[1] = minMax[3]; + minMax[3] = temp; + } + minMax[1] *= transform[1]; + minMax[3] *= transform[1]; + if (transform[2] < 0) { + temp = minMax[0]; + minMax[0] = minMax[2]; + minMax[2] = temp; + } + minMax[0] *= transform[2]; + minMax[2] *= transform[2]; + } + minMax[0] += transform[4]; + minMax[1] += transform[5]; + minMax[2] += transform[4]; + minMax[3] += transform[5]; + } + static transform(m1, m2) { + return [m1[0] * m2[0] + m1[2] * m2[1], m1[1] * m2[0] + m1[3] * m2[1], m1[0] * m2[2] + m1[2] * m2[3], m1[1] * m2[2] + m1[3] * m2[3], m1[0] * m2[4] + m1[2] * m2[5] + m1[4], m1[1] * m2[4] + m1[3] * m2[5] + m1[5]]; + } + static applyTransform(p, m) { + const xt = p[0] * m[0] + p[1] * m[2] + m[4]; + const yt = p[0] * m[1] + p[1] * m[3] + m[5]; + return [xt, yt]; + } + static applyInverseTransform(p, m) { + const d = m[0] * m[3] - m[1] * m[2]; + const xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d; + const yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d; + return [xt, yt]; + } + static getAxialAlignedBoundingBox(r, m) { + const p1 = this.applyTransform(r, m); + const p2 = this.applyTransform(r.slice(2, 4), m); + const p3 = this.applyTransform([r[0], r[3]], m); + const p4 = this.applyTransform([r[2], r[1]], m); + return [Math.min(p1[0], p2[0], p3[0], p4[0]), Math.min(p1[1], p2[1], p3[1], p4[1]), Math.max(p1[0], p2[0], p3[0], p4[0]), Math.max(p1[1], p2[1], p3[1], p4[1])]; + } + static inverseTransform(m) { + const d = m[0] * m[3] - m[1] * m[2]; + return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d, (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d]; + } + static singularValueDecompose2dScale(m) { + const transpose = [m[0], m[2], m[1], m[3]]; + const a = m[0] * transpose[0] + m[1] * transpose[2]; + const b = m[0] * transpose[1] + m[1] * transpose[3]; + const c = m[2] * transpose[0] + m[3] * transpose[2]; + const d = m[2] * transpose[1] + m[3] * transpose[3]; + const first = (a + d) / 2; + const second = Math.sqrt((a + d) ** 2 - 4 * (a * d - c * b)) / 2; + const sx = first + second || 1; + const sy = first - second || 1; + return [Math.sqrt(sx), Math.sqrt(sy)]; + } + static normalizeRect(rect) { + const r = rect.slice(0); + if (rect[0] > rect[2]) { + r[0] = rect[2]; + r[2] = rect[0]; + } + if (rect[1] > rect[3]) { + r[1] = rect[3]; + r[3] = rect[1]; + } + return r; + } + static intersect(rect1, rect2) { + const xLow = Math.max(Math.min(rect1[0], rect1[2]), Math.min(rect2[0], rect2[2])); + const xHigh = Math.min(Math.max(rect1[0], rect1[2]), Math.max(rect2[0], rect2[2])); + if (xLow > xHigh) { + return null; + } + const yLow = Math.max(Math.min(rect1[1], rect1[3]), Math.min(rect2[1], rect2[3])); + const yHigh = Math.min(Math.max(rect1[1], rect1[3]), Math.max(rect2[1], rect2[3])); + if (yLow > yHigh) { + return null; + } + return [xLow, yLow, xHigh, yHigh]; + } + static #getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, t, minMax) { + if (t <= 0 || t >= 1) { + return; + } + const mt = 1 - t; + const tt = t * t; + const ttt = tt * t; + const x = mt * (mt * (mt * x0 + 3 * t * x1) + 3 * tt * x2) + ttt * x3; + const y = mt * (mt * (mt * y0 + 3 * t * y1) + 3 * tt * y2) + ttt * y3; + minMax[0] = Math.min(minMax[0], x); + minMax[1] = Math.min(minMax[1], y); + minMax[2] = Math.max(minMax[2], x); + minMax[3] = Math.max(minMax[3], y); + } + static #getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, a, b, c, minMax) { + if (Math.abs(a) < 1e-12) { + if (Math.abs(b) >= 1e-12) { + this.#getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, -c / b, minMax); + } + return; + } + const delta = b ** 2 - 4 * c * a; + if (delta < 0) { + return; + } + const sqrtDelta = Math.sqrt(delta); + const a2 = 2 * a; + this.#getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, (-b + sqrtDelta) / a2, minMax); + this.#getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, (-b - sqrtDelta) / a2, minMax); + } + static bezierBoundingBox(x0, y0, x1, y1, x2, y2, x3, y3, minMax) { + if (minMax) { + minMax[0] = Math.min(minMax[0], x0, x3); + minMax[1] = Math.min(minMax[1], y0, y3); + minMax[2] = Math.max(minMax[2], x0, x3); + minMax[3] = Math.max(minMax[3], y0, y3); + } else { + minMax = [Math.min(x0, x3), Math.min(y0, y3), Math.max(x0, x3), Math.max(y0, y3)]; + } + this.#getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, 3 * (-x0 + 3 * (x1 - x2) + x3), 6 * (x0 - 2 * x1 + x2), 3 * (x1 - x0), minMax); + this.#getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, 3 * (-y0 + 3 * (y1 - y2) + y3), 6 * (y0 - 2 * y1 + y2), 3 * (y1 - y0), minMax); + return minMax; + } +} +const PDFStringTranslateTable = (/* unused pure expression or super */ null && ([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2d8, 0x2c7, 0x2c6, 0x2d9, 0x2dd, 0x2db, 0x2da, 0x2dc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x192, 0x2044, 0x2039, 0x203a, 0x2212, 0x2030, 0x201e, 0x201c, 0x201d, 0x2018, 0x2019, 0x201a, 0x2122, 0xfb01, 0xfb02, 0x141, 0x152, 0x160, 0x178, 0x17d, 0x131, 0x142, 0x153, 0x161, 0x17e, 0, 0x20ac])); +function stringToPDFString(str) { + if (str[0] >= "\xEF") { + let encoding; + if (str[0] === "\xFE" && str[1] === "\xFF") { + encoding = "utf-16be"; + if (str.length % 2 === 1) { + str = str.slice(0, -1); + } + } else if (str[0] === "\xFF" && str[1] === "\xFE") { + encoding = "utf-16le"; + if (str.length % 2 === 1) { + str = str.slice(0, -1); + } + } else if (str[0] === "\xEF" && str[1] === "\xBB" && str[2] === "\xBF") { + encoding = "utf-8"; + } + if (encoding) { + try { + const decoder = new TextDecoder(encoding, { + fatal: true + }); + const buffer = stringToBytes(str); + const decoded = decoder.decode(buffer); + if (!decoded.includes("\x1b")) { + return decoded; + } + return decoded.replaceAll(/\x1b[^\x1b]*(?:\x1b|$)/g, ""); + } catch (ex) { + warn(`stringToPDFString: "${ex}".`); + } + } + } + const strBuf = []; + for (let i = 0, ii = str.length; i < ii; i++) { + const charCode = str.charCodeAt(i); + if (charCode === 0x1b) { + while (++i < ii && str.charCodeAt(i) !== 0x1b) {} + continue; + } + const code = PDFStringTranslateTable[charCode]; + strBuf.push(code ? String.fromCharCode(code) : str.charAt(i)); + } + return strBuf.join(""); +} +function stringToUTF8String(str) { + return decodeURIComponent(escape(str)); +} +function utf8StringToString(str) { + return unescape(encodeURIComponent(str)); +} +function isArrayEqual(arr1, arr2) { + if (arr1.length !== arr2.length) { + return false; + } + for (let i = 0, ii = arr1.length; i < ii; i++) { + if (arr1[i] !== arr2[i]) { + return false; + } + } + return true; +} +function getModificationDate(date = new Date()) { + const buffer = [date.getUTCFullYear().toString(), (date.getUTCMonth() + 1).toString().padStart(2, "0"), date.getUTCDate().toString().padStart(2, "0"), date.getUTCHours().toString().padStart(2, "0"), date.getUTCMinutes().toString().padStart(2, "0"), date.getUTCSeconds().toString().padStart(2, "0")]; + return buffer.join(""); +} +let NormalizeRegex = null; +let NormalizationMap = null; +function normalizeUnicode(str) { + if (!NormalizeRegex) { + NormalizeRegex = /([\u00a0\u00b5\u037e\u0eb3\u2000-\u200a\u202f\u2126\ufb00-\ufb04\ufb06\ufb20-\ufb36\ufb38-\ufb3c\ufb3e\ufb40-\ufb41\ufb43-\ufb44\ufb46-\ufba1\ufba4-\ufba9\ufbae-\ufbb1\ufbd3-\ufbdc\ufbde-\ufbe7\ufbea-\ufbf8\ufbfc-\ufbfd\ufc00-\ufc5d\ufc64-\ufcf1\ufcf5-\ufd3d\ufd88\ufdf4\ufdfa-\ufdfb\ufe71\ufe77\ufe79\ufe7b\ufe7d]+)|(\ufb05+)/gu; + NormalizationMap = new Map([["ſt", "ſt"]]); + } + return str.replaceAll(NormalizeRegex, (_, p1, p2) => p1 ? p1.normalize("NFKC") : NormalizationMap.get(p2)); +} +function getUuid() { + if (typeof crypto !== "undefined" && typeof crypto?.randomUUID === "function") { + return crypto.randomUUID(); + } + const buf = new Uint8Array(32); + if (typeof crypto !== "undefined" && typeof crypto?.getRandomValues === "function") { + crypto.getRandomValues(buf); + } else { + for (let i = 0; i < 32; i++) { + buf[i] = Math.floor(Math.random() * 255); + } + } + return bytesToString(buf); +} +const AnnotationPrefix = "pdfjs_internal_id_"; +const FontRenderOps = { + BEZIER_CURVE_TO: 0, + MOVE_TO: 1, + LINE_TO: 2, + QUADRATIC_CURVE_TO: 3, + RESTORE: 4, + SAVE: 5, + SCALE: 6, + TRANSFORM: 7, + TRANSLATE: 8 +}; + +;// CONCATENATED MODULE: ./src/display/base_factory.js + +class BaseFilterFactory { + constructor() { + if (this.constructor === BaseFilterFactory) { + unreachable("Cannot initialize BaseFilterFactory."); + } + } + addFilter(maps) { + return "none"; + } + addHCMFilter(fgColor, bgColor) { + return "none"; + } + addAlphaFilter(map) { + return "none"; + } + addLuminosityFilter(map) { + return "none"; + } + addHighlightHCMFilter(filterName, fgColor, bgColor, newFgColor, newBgColor) { + return "none"; + } + destroy(keepHCM = false) {} +} +class BaseCanvasFactory { + #enableHWA = false; + constructor({ + enableHWA = false + } = {}) { + if (this.constructor === BaseCanvasFactory) { + unreachable("Cannot initialize BaseCanvasFactory."); + } + this.#enableHWA = enableHWA; + } + create(width, height) { + if (width <= 0 || height <= 0) { + throw new Error("Invalid canvas size"); + } + const canvas = this._createCanvas(width, height); + return { + canvas, + context: canvas.getContext("2d", { + willReadFrequently: !this.#enableHWA + }) + }; + } + reset(canvasAndContext, width, height) { + if (!canvasAndContext.canvas) { + throw new Error("Canvas is not specified"); + } + if (width <= 0 || height <= 0) { + throw new Error("Invalid canvas size"); + } + canvasAndContext.canvas.width = width; + canvasAndContext.canvas.height = height; + } + destroy(canvasAndContext) { + if (!canvasAndContext.canvas) { + throw new Error("Canvas is not specified"); + } + canvasAndContext.canvas.width = 0; + canvasAndContext.canvas.height = 0; + canvasAndContext.canvas = null; + canvasAndContext.context = null; + } + _createCanvas(width, height) { + unreachable("Abstract method `_createCanvas` called."); + } +} +class BaseCMapReaderFactory { + constructor({ + baseUrl = null, + isCompressed = true + }) { + if (this.constructor === BaseCMapReaderFactory) { + unreachable("Cannot initialize BaseCMapReaderFactory."); + } + this.baseUrl = baseUrl; + this.isCompressed = isCompressed; + } + async fetch({ + name + }) { + if (!this.baseUrl) { + throw new Error('The CMap "baseUrl" parameter must be specified, ensure that ' + 'the "cMapUrl" and "cMapPacked" API parameters are provided.'); + } + if (!name) { + throw new Error("CMap name must be specified."); + } + const url = this.baseUrl + name + (this.isCompressed ? ".bcmap" : ""); + const compressionType = this.isCompressed ? CMapCompressionType.BINARY : CMapCompressionType.NONE; + return this._fetchData(url, compressionType).catch(reason => { + throw new Error(`Unable to load ${this.isCompressed ? "binary " : ""}CMap at: ${url}`); + }); + } + _fetchData(url, compressionType) { + unreachable("Abstract method `_fetchData` called."); + } +} +class BaseStandardFontDataFactory { + constructor({ + baseUrl = null + }) { + if (this.constructor === BaseStandardFontDataFactory) { + unreachable("Cannot initialize BaseStandardFontDataFactory."); + } + this.baseUrl = baseUrl; + } + async fetch({ + filename + }) { + if (!this.baseUrl) { + throw new Error('The standard font "baseUrl" parameter must be specified, ensure that ' + 'the "standardFontDataUrl" API parameter is provided.'); + } + if (!filename) { + throw new Error("Font filename must be specified."); + } + const url = `${this.baseUrl}${filename}`; + return this._fetchData(url).catch(reason => { + throw new Error(`Unable to load font data at: ${url}`); + }); + } + _fetchData(url) { + unreachable("Abstract method `_fetchData` called."); + } +} +class BaseSVGFactory { + constructor() { + if (this.constructor === BaseSVGFactory) { + unreachable("Cannot initialize BaseSVGFactory."); + } + } + create(width, height, skipDimensions = false) { + if (width <= 0 || height <= 0) { + throw new Error("Invalid SVG dimensions"); + } + const svg = this._createSVG("svg:svg"); + svg.setAttribute("version", "1.1"); + if (!skipDimensions) { + svg.setAttribute("width", `${width}px`); + svg.setAttribute("height", `${height}px`); + } + svg.setAttribute("preserveAspectRatio", "none"); + svg.setAttribute("viewBox", `0 0 ${width} ${height}`); + return svg; + } + createElement(type) { + if (typeof type !== "string") { + throw new Error("Invalid SVG element type"); + } + return this._createSVG(type); + } + _createSVG(type) { + unreachable("Abstract method `_createSVG` called."); + } +} + +;// CONCATENATED MODULE: ./src/display/display_utils.js + + +const SVG_NS = "http://www.w3.org/2000/svg"; +class PixelsPerInch { + static CSS = 96.0; + static PDF = 72.0; + static PDF_TO_CSS_UNITS = this.CSS / this.PDF; +} +class DOMFilterFactory extends BaseFilterFactory { + #_cache; + #_defs; + #docId; + #document; + #_hcmCache; + #id = 0; + constructor({ + docId, + ownerDocument = globalThis.document + } = {}) { + super(); + this.#docId = docId; + this.#document = ownerDocument; + } + get #cache() { + return this.#_cache ||= new Map(); + } + get #hcmCache() { + return this.#_hcmCache ||= new Map(); + } + get #defs() { + if (!this.#_defs) { + const div = this.#document.createElement("div"); + const { + style + } = div; + style.visibility = "hidden"; + style.contain = "strict"; + style.width = style.height = 0; + style.position = "absolute"; + style.top = style.left = 0; + style.zIndex = -1; + const svg = this.#document.createElementNS(SVG_NS, "svg"); + svg.setAttribute("width", 0); + svg.setAttribute("height", 0); + this.#_defs = this.#document.createElementNS(SVG_NS, "defs"); + div.append(svg); + svg.append(this.#_defs); + this.#document.body.append(div); + } + return this.#_defs; + } + #createTables(maps) { + if (maps.length === 1) { + const mapR = maps[0]; + const buffer = new Array(256); + for (let i = 0; i < 256; i++) { + buffer[i] = mapR[i] / 255; + } + const table = buffer.join(","); + return [table, table, table]; + } + const [mapR, mapG, mapB] = maps; + const bufferR = new Array(256); + const bufferG = new Array(256); + const bufferB = new Array(256); + for (let i = 0; i < 256; i++) { + bufferR[i] = mapR[i] / 255; + bufferG[i] = mapG[i] / 255; + bufferB[i] = mapB[i] / 255; + } + return [bufferR.join(","), bufferG.join(","), bufferB.join(",")]; + } + addFilter(maps) { + if (!maps) { + return "none"; + } + let value = this.#cache.get(maps); + if (value) { + return value; + } + const [tableR, tableG, tableB] = this.#createTables(maps); + const key = maps.length === 1 ? tableR : `${tableR}${tableG}${tableB}`; + value = this.#cache.get(key); + if (value) { + this.#cache.set(maps, value); + return value; + } + const id = `g_${this.#docId}_transfer_map_${this.#id++}`; + const url = `url(#${id})`; + this.#cache.set(maps, url); + this.#cache.set(key, url); + const filter = this.#createFilter(id); + this.#addTransferMapConversion(tableR, tableG, tableB, filter); + return url; + } + addHCMFilter(fgColor, bgColor) { + const key = `${fgColor}-${bgColor}`; + const filterName = "base"; + let info = this.#hcmCache.get(filterName); + if (info?.key === key) { + return info.url; + } + if (info) { + info.filter?.remove(); + info.key = key; + info.url = "none"; + info.filter = null; + } else { + info = { + key, + url: "none", + filter: null + }; + this.#hcmCache.set(filterName, info); + } + if (!fgColor || !bgColor) { + return info.url; + } + const fgRGB = this.#getRGB(fgColor); + fgColor = Util.makeHexColor(...fgRGB); + const bgRGB = this.#getRGB(bgColor); + bgColor = Util.makeHexColor(...bgRGB); + this.#defs.style.color = ""; + if (fgColor === "#000000" && bgColor === "#ffffff" || fgColor === bgColor) { + return info.url; + } + const map = new Array(256); + for (let i = 0; i <= 255; i++) { + const x = i / 255; + map[i] = x <= 0.03928 ? x / 12.92 : ((x + 0.055) / 1.055) ** 2.4; + } + const table = map.join(","); + const id = `g_${this.#docId}_hcm_filter`; + const filter = info.filter = this.#createFilter(id); + this.#addTransferMapConversion(table, table, table, filter); + this.#addGrayConversion(filter); + const getSteps = (c, n) => { + const start = fgRGB[c] / 255; + const end = bgRGB[c] / 255; + const arr = new Array(n + 1); + for (let i = 0; i <= n; i++) { + arr[i] = start + i / n * (end - start); + } + return arr.join(","); + }; + this.#addTransferMapConversion(getSteps(0, 5), getSteps(1, 5), getSteps(2, 5), filter); + info.url = `url(#${id})`; + return info.url; + } + addAlphaFilter(map) { + let value = this.#cache.get(map); + if (value) { + return value; + } + const [tableA] = this.#createTables([map]); + const key = `alpha_${tableA}`; + value = this.#cache.get(key); + if (value) { + this.#cache.set(map, value); + return value; + } + const id = `g_${this.#docId}_alpha_map_${this.#id++}`; + const url = `url(#${id})`; + this.#cache.set(map, url); + this.#cache.set(key, url); + const filter = this.#createFilter(id); + this.#addTransferMapAlphaConversion(tableA, filter); + return url; + } + addLuminosityFilter(map) { + let value = this.#cache.get(map || "luminosity"); + if (value) { + return value; + } + let tableA, key; + if (map) { + [tableA] = this.#createTables([map]); + key = `luminosity_${tableA}`; + } else { + key = "luminosity"; + } + value = this.#cache.get(key); + if (value) { + this.#cache.set(map, value); + return value; + } + const id = `g_${this.#docId}_luminosity_map_${this.#id++}`; + const url = `url(#${id})`; + this.#cache.set(map, url); + this.#cache.set(key, url); + const filter = this.#createFilter(id); + this.#addLuminosityConversion(filter); + if (map) { + this.#addTransferMapAlphaConversion(tableA, filter); + } + return url; + } + addHighlightHCMFilter(filterName, fgColor, bgColor, newFgColor, newBgColor) { + const key = `${fgColor}-${bgColor}-${newFgColor}-${newBgColor}`; + let info = this.#hcmCache.get(filterName); + if (info?.key === key) { + return info.url; + } + if (info) { + info.filter?.remove(); + info.key = key; + info.url = "none"; + info.filter = null; + } else { + info = { + key, + url: "none", + filter: null + }; + this.#hcmCache.set(filterName, info); + } + if (!fgColor || !bgColor) { + return info.url; + } + const [fgRGB, bgRGB] = [fgColor, bgColor].map(this.#getRGB.bind(this)); + let fgGray = Math.round(0.2126 * fgRGB[0] + 0.7152 * fgRGB[1] + 0.0722 * fgRGB[2]); + let bgGray = Math.round(0.2126 * bgRGB[0] + 0.7152 * bgRGB[1] + 0.0722 * bgRGB[2]); + let [newFgRGB, newBgRGB] = [newFgColor, newBgColor].map(this.#getRGB.bind(this)); + if (bgGray < fgGray) { + [fgGray, bgGray, newFgRGB, newBgRGB] = [bgGray, fgGray, newBgRGB, newFgRGB]; + } + this.#defs.style.color = ""; + const getSteps = (fg, bg, n) => { + const arr = new Array(256); + const step = (bgGray - fgGray) / n; + const newStart = fg / 255; + const newStep = (bg - fg) / (255 * n); + let prev = 0; + for (let i = 0; i <= n; i++) { + const k = Math.round(fgGray + i * step); + const value = newStart + i * newStep; + for (let j = prev; j <= k; j++) { + arr[j] = value; + } + prev = k + 1; + } + for (let i = prev; i < 256; i++) { + arr[i] = arr[prev - 1]; + } + return arr.join(","); + }; + const id = `g_${this.#docId}_hcm_${filterName}_filter`; + const filter = info.filter = this.#createFilter(id); + this.#addGrayConversion(filter); + this.#addTransferMapConversion(getSteps(newFgRGB[0], newBgRGB[0], 5), getSteps(newFgRGB[1], newBgRGB[1], 5), getSteps(newFgRGB[2], newBgRGB[2], 5), filter); + info.url = `url(#${id})`; + return info.url; + } + destroy(keepHCM = false) { + if (keepHCM && this.#hcmCache.size !== 0) { + return; + } + if (this.#_defs) { + this.#_defs.parentNode.parentNode.remove(); + this.#_defs = null; + } + if (this.#_cache) { + this.#_cache.clear(); + this.#_cache = null; + } + this.#id = 0; + } + #addLuminosityConversion(filter) { + const feColorMatrix = this.#document.createElementNS(SVG_NS, "feColorMatrix"); + feColorMatrix.setAttribute("type", "matrix"); + feColorMatrix.setAttribute("values", "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.59 0.11 0 0"); + filter.append(feColorMatrix); + } + #addGrayConversion(filter) { + const feColorMatrix = this.#document.createElementNS(SVG_NS, "feColorMatrix"); + feColorMatrix.setAttribute("type", "matrix"); + feColorMatrix.setAttribute("values", "0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0 0 0 1 0"); + filter.append(feColorMatrix); + } + #createFilter(id) { + const filter = this.#document.createElementNS(SVG_NS, "filter"); + filter.setAttribute("color-interpolation-filters", "sRGB"); + filter.setAttribute("id", id); + this.#defs.append(filter); + return filter; + } + #appendFeFunc(feComponentTransfer, func, table) { + const feFunc = this.#document.createElementNS(SVG_NS, func); + feFunc.setAttribute("type", "discrete"); + feFunc.setAttribute("tableValues", table); + feComponentTransfer.append(feFunc); + } + #addTransferMapConversion(rTable, gTable, bTable, filter) { + const feComponentTransfer = this.#document.createElementNS(SVG_NS, "feComponentTransfer"); + filter.append(feComponentTransfer); + this.#appendFeFunc(feComponentTransfer, "feFuncR", rTable); + this.#appendFeFunc(feComponentTransfer, "feFuncG", gTable); + this.#appendFeFunc(feComponentTransfer, "feFuncB", bTable); + } + #addTransferMapAlphaConversion(aTable, filter) { + const feComponentTransfer = this.#document.createElementNS(SVG_NS, "feComponentTransfer"); + filter.append(feComponentTransfer); + this.#appendFeFunc(feComponentTransfer, "feFuncA", aTable); + } + #getRGB(color) { + this.#defs.style.color = color; + return getRGB(getComputedStyle(this.#defs).getPropertyValue("color")); + } +} +class DOMCanvasFactory extends BaseCanvasFactory { + constructor({ + ownerDocument = globalThis.document, + enableHWA = false + } = {}) { + super({ + enableHWA + }); + this._document = ownerDocument; + } + _createCanvas(width, height) { + const canvas = this._document.createElement("canvas"); + canvas.width = width; + canvas.height = height; + return canvas; + } +} +async function fetchData(url, type = "text") { + if (isValidFetchUrl(url, document.baseURI)) { + const response = await fetch(url); + if (!response.ok) { + throw new Error(response.statusText); + } + switch (type) { + case "arraybuffer": + return response.arrayBuffer(); + case "blob": + return response.blob(); + case "json": + return response.json(); + } + return response.text(); + } + return new Promise((resolve, reject) => { + const request = new XMLHttpRequest(); + request.open("GET", url, true); + request.responseType = type; + request.onreadystatechange = () => { + if (request.readyState !== XMLHttpRequest.DONE) { + return; + } + if (request.status === 200 || request.status === 0) { + switch (type) { + case "arraybuffer": + case "blob": + case "json": + resolve(request.response); + return; + } + resolve(request.responseText); + return; + } + reject(new Error(request.statusText)); + }; + request.send(null); + }); +} +class DOMCMapReaderFactory extends BaseCMapReaderFactory { + _fetchData(url, compressionType) { + return fetchData(url, this.isCompressed ? "arraybuffer" : "text").then(data => ({ + cMapData: data instanceof ArrayBuffer ? new Uint8Array(data) : stringToBytes(data), + compressionType + })); + } +} +class DOMStandardFontDataFactory extends BaseStandardFontDataFactory { + _fetchData(url) { + return fetchData(url, "arraybuffer").then(data => new Uint8Array(data)); + } +} +class DOMSVGFactory extends BaseSVGFactory { + _createSVG(type) { + return document.createElementNS(SVG_NS, type); + } +} +class PageViewport { + constructor({ + viewBox, + scale, + rotation, + offsetX = 0, + offsetY = 0, + dontFlip = false + }) { + this.viewBox = viewBox; + this.scale = scale; + this.rotation = rotation; + this.offsetX = offsetX; + this.offsetY = offsetY; + const centerX = (viewBox[2] + viewBox[0]) / 2; + const centerY = (viewBox[3] + viewBox[1]) / 2; + let rotateA, rotateB, rotateC, rotateD; + rotation %= 360; + if (rotation < 0) { + rotation += 360; + } + switch (rotation) { + case 180: + rotateA = -1; + rotateB = 0; + rotateC = 0; + rotateD = 1; + break; + case 90: + rotateA = 0; + rotateB = 1; + rotateC = 1; + rotateD = 0; + break; + case 270: + rotateA = 0; + rotateB = -1; + rotateC = -1; + rotateD = 0; + break; + case 0: + rotateA = 1; + rotateB = 0; + rotateC = 0; + rotateD = -1; + break; + default: + throw new Error("PageViewport: Invalid rotation, must be a multiple of 90 degrees."); + } + if (dontFlip) { + rotateC = -rotateC; + rotateD = -rotateD; + } + let offsetCanvasX, offsetCanvasY; + let width, height; + if (rotateA === 0) { + offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX; + offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY; + width = (viewBox[3] - viewBox[1]) * scale; + height = (viewBox[2] - viewBox[0]) * scale; + } else { + offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX; + offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY; + width = (viewBox[2] - viewBox[0]) * scale; + height = (viewBox[3] - viewBox[1]) * scale; + } + this.transform = [rotateA * scale, rotateB * scale, rotateC * scale, rotateD * scale, offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY, offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY]; + this.width = width; + this.height = height; + } + get rawDims() { + const { + viewBox + } = this; + return shadow(this, "rawDims", { + pageWidth: viewBox[2] - viewBox[0], + pageHeight: viewBox[3] - viewBox[1], + pageX: viewBox[0], + pageY: viewBox[1] + }); + } + clone({ + scale = this.scale, + rotation = this.rotation, + offsetX = this.offsetX, + offsetY = this.offsetY, + dontFlip = false + } = {}) { + return new PageViewport({ + viewBox: this.viewBox.slice(), + scale, + rotation, + offsetX, + offsetY, + dontFlip + }); + } + convertToViewportPoint(x, y) { + return Util.applyTransform([x, y], this.transform); + } + convertToViewportRectangle(rect) { + const topLeft = Util.applyTransform([rect[0], rect[1]], this.transform); + const bottomRight = Util.applyTransform([rect[2], rect[3]], this.transform); + return [topLeft[0], topLeft[1], bottomRight[0], bottomRight[1]]; + } + convertToPdfPoint(x, y) { + return Util.applyInverseTransform([x, y], this.transform); + } +} +class RenderingCancelledException extends BaseException { + constructor(msg, extraDelay = 0) { + super(msg, "RenderingCancelledException"); + this.extraDelay = extraDelay; + } +} +function isDataScheme(url) { + const ii = url.length; + let i = 0; + while (i < ii && url[i].trim() === "") { + i++; + } + return url.substring(i, i + 5).toLowerCase() === "data:"; +} +function isPdfFile(filename) { + return typeof filename === "string" && /\.pdf$/i.test(filename); +} +function getFilenameFromUrl(url) { + [url] = url.split(/[#?]/, 1); + return url.substring(url.lastIndexOf("/") + 1); +} +function getPdfFilenameFromUrl(url, defaultFilename = "document.pdf") { + if (typeof url !== "string") { + return defaultFilename; + } + if (isDataScheme(url)) { + warn('getPdfFilenameFromUrl: ignore "data:"-URL for performance reasons.'); + return defaultFilename; + } + const reURI = /^(?:(?:[^:]+:)?\/\/[^/]+)?([^?#]*)(\?[^#]*)?(#.*)?$/; + const reFilename = /[^/?#=]+\.pdf\b(?!.*\.pdf\b)/i; + const splitURI = reURI.exec(url); + let suggestedFilename = reFilename.exec(splitURI[1]) || reFilename.exec(splitURI[2]) || reFilename.exec(splitURI[3]); + if (suggestedFilename) { + suggestedFilename = suggestedFilename[0]; + if (suggestedFilename.includes("%")) { + try { + suggestedFilename = reFilename.exec(decodeURIComponent(suggestedFilename))[0]; + } catch {} + } + } + return suggestedFilename || defaultFilename; +} +class StatTimer { + started = Object.create(null); + times = []; + time(name) { + if (name in this.started) { + warn(`Timer is already running for ${name}`); + } + this.started[name] = Date.now(); + } + timeEnd(name) { + if (!(name in this.started)) { + warn(`Timer has not been started for ${name}`); + } + this.times.push({ + name, + start: this.started[name], + end: Date.now() + }); + delete this.started[name]; + } + toString() { + const outBuf = []; + let longest = 0; + for (const { + name + } of this.times) { + longest = Math.max(name.length, longest); + } + for (const { + name, + start, + end + } of this.times) { + outBuf.push(`${name.padEnd(longest)} ${end - start}ms\n`); + } + return outBuf.join(""); + } +} +function isValidFetchUrl(url, baseUrl) { + try { + const { + protocol + } = baseUrl ? new URL(url, baseUrl) : new URL(url); + return protocol === "http:" || protocol === "https:"; + } catch { + return false; + } +} +function noContextMenu(e) { + e.preventDefault(); +} +function deprecated(details) { + console.log("Deprecated API usage: " + details); +} +let pdfDateStringRegex; +class PDFDateString { + static toDateObject(input) { + if (!input || typeof input !== "string") { + return null; + } + pdfDateStringRegex ||= new RegExp("^D:" + "(\\d{4})" + "(\\d{2})?" + "(\\d{2})?" + "(\\d{2})?" + "(\\d{2})?" + "(\\d{2})?" + "([Z|+|-])?" + "(\\d{2})?" + "'?" + "(\\d{2})?" + "'?"); + const matches = pdfDateStringRegex.exec(input); + if (!matches) { + return null; + } + const year = parseInt(matches[1], 10); + let month = parseInt(matches[2], 10); + month = month >= 1 && month <= 12 ? month - 1 : 0; + let day = parseInt(matches[3], 10); + day = day >= 1 && day <= 31 ? day : 1; + let hour = parseInt(matches[4], 10); + hour = hour >= 0 && hour <= 23 ? hour : 0; + let minute = parseInt(matches[5], 10); + minute = minute >= 0 && minute <= 59 ? minute : 0; + let second = parseInt(matches[6], 10); + second = second >= 0 && second <= 59 ? second : 0; + const universalTimeRelation = matches[7] || "Z"; + let offsetHour = parseInt(matches[8], 10); + offsetHour = offsetHour >= 0 && offsetHour <= 23 ? offsetHour : 0; + let offsetMinute = parseInt(matches[9], 10) || 0; + offsetMinute = offsetMinute >= 0 && offsetMinute <= 59 ? offsetMinute : 0; + if (universalTimeRelation === "-") { + hour += offsetHour; + minute += offsetMinute; + } else if (universalTimeRelation === "+") { + hour -= offsetHour; + minute -= offsetMinute; + } + return new Date(Date.UTC(year, month, day, hour, minute, second)); + } +} +function getXfaPageViewport(xfaPage, { + scale = 1, + rotation = 0 +}) { + const { + width, + height + } = xfaPage.attributes.style; + const viewBox = [0, 0, parseInt(width), parseInt(height)]; + return new PageViewport({ + viewBox, + scale, + rotation + }); +} +function getRGB(color) { + if (color.startsWith("#")) { + const colorRGB = parseInt(color.slice(1), 16); + return [(colorRGB & 0xff0000) >> 16, (colorRGB & 0x00ff00) >> 8, colorRGB & 0x0000ff]; + } + if (color.startsWith("rgb(")) { + return color.slice(4, -1).split(",").map(x => parseInt(x)); + } + if (color.startsWith("rgba(")) { + return color.slice(5, -1).split(",").map(x => parseInt(x)).slice(0, 3); + } + warn(`Not a valid color format: "${color}"`); + return [0, 0, 0]; +} +function getColorValues(colors) { + const span = document.createElement("span"); + span.style.visibility = "hidden"; + document.body.append(span); + for (const name of colors.keys()) { + span.style.color = name; + const computedColor = window.getComputedStyle(span).color; + colors.set(name, getRGB(computedColor)); + } + span.remove(); +} +function getCurrentTransform(ctx) { + const { + a, + b, + c, + d, + e, + f + } = ctx.getTransform(); + return [a, b, c, d, e, f]; +} +function getCurrentTransformInverse(ctx) { + const { + a, + b, + c, + d, + e, + f + } = ctx.getTransform().invertSelf(); + return [a, b, c, d, e, f]; +} +function setLayerDimensions(div, viewport, mustFlip = false, mustRotate = true) { + if (viewport instanceof PageViewport) { + const { + pageWidth, + pageHeight + } = viewport.rawDims; + const { + style + } = div; + const useRound = util_FeatureTest.isCSSRoundSupported; + const w = `var(--scale-factor) * ${pageWidth}px`, + h = `var(--scale-factor) * ${pageHeight}px`; + const widthStr = useRound ? `round(${w}, 1px)` : `calc(${w})`, + heightStr = useRound ? `round(${h}, 1px)` : `calc(${h})`; + if (!mustFlip || viewport.rotation % 180 === 0) { + style.width = widthStr; + style.height = heightStr; + } else { + style.width = heightStr; + style.height = widthStr; + } + } + if (mustRotate) { + div.setAttribute("data-main-rotation", viewport.rotation); + } +} + +;// CONCATENATED MODULE: ./src/display/editor/toolbar.js + +class EditorToolbar { + #toolbar = null; + #colorPicker = null; + #editor; + #buttons = null; + constructor(editor) { + this.#editor = editor; + } + render() { + const editToolbar = this.#toolbar = document.createElement("div"); + editToolbar.className = "editToolbar"; + editToolbar.setAttribute("role", "toolbar"); + const signal = this.#editor._uiManager._signal; + editToolbar.addEventListener("contextmenu", noContextMenu, { + signal + }); + editToolbar.addEventListener("pointerdown", EditorToolbar.#pointerDown, { + signal + }); + const buttons = this.#buttons = document.createElement("div"); + buttons.className = "buttons"; + editToolbar.append(buttons); + const position = this.#editor.toolbarPosition; + if (position) { + const { + style + } = editToolbar; + const x = this.#editor._uiManager.direction === "ltr" ? 1 - position[0] : position[0]; + style.insetInlineEnd = `${100 * x}%`; + style.top = `calc(${100 * position[1]}% + var(--editor-toolbar-vert-offset))`; + } + this.#addDeleteButton(); + return editToolbar; + } + static #pointerDown(e) { + e.stopPropagation(); + } + #focusIn(e) { + this.#editor._focusEventsAllowed = false; + e.preventDefault(); + e.stopPropagation(); + } + #focusOut(e) { + this.#editor._focusEventsAllowed = true; + e.preventDefault(); + e.stopPropagation(); + } + #addListenersToElement(element) { + const signal = this.#editor._uiManager._signal; + element.addEventListener("focusin", this.#focusIn.bind(this), { + capture: true, + signal + }); + element.addEventListener("focusout", this.#focusOut.bind(this), { + capture: true, + signal + }); + element.addEventListener("contextmenu", noContextMenu, { + signal + }); + } + hide() { + this.#toolbar.classList.add("hidden"); + this.#colorPicker?.hideDropdown(); + } + show() { + this.#toolbar.classList.remove("hidden"); + } + #addDeleteButton() { + const button = document.createElement("button"); + button.className = "delete"; + button.tabIndex = 0; + button.setAttribute("data-l10n-id", `pdfjs-editor-remove-${this.#editor.editorType}-button`); + this.#addListenersToElement(button); + button.addEventListener("click", e => { + this.#editor._uiManager.delete(); + }, { + signal: this.#editor._uiManager._signal + }); + this.#buttons.append(button); + } + get #divider() { + const divider = document.createElement("div"); + divider.className = "divider"; + return divider; + } + addAltTextButton(button) { + this.#addListenersToElement(button); + this.#buttons.prepend(button, this.#divider); + } + addColorPicker(colorPicker) { + this.#colorPicker = colorPicker; + const button = colorPicker.renderButton(); + this.#addListenersToElement(button); + this.#buttons.prepend(button, this.#divider); + } + remove() { + this.#toolbar.remove(); + this.#colorPicker?.destroy(); + this.#colorPicker = null; + } +} +class HighlightToolbar { + #buttons = null; + #toolbar = null; + #uiManager; + constructor(uiManager) { + this.#uiManager = uiManager; + } + #render() { + const editToolbar = this.#toolbar = document.createElement("div"); + editToolbar.className = "editToolbar"; + editToolbar.setAttribute("role", "toolbar"); + editToolbar.addEventListener("contextmenu", noContextMenu, { + signal: this.#uiManager._signal + }); + const buttons = this.#buttons = document.createElement("div"); + buttons.className = "buttons"; + editToolbar.append(buttons); + this.#addHighlightButton(); + return editToolbar; + } + #getLastPoint(boxes, isLTR) { + let lastY = 0; + let lastX = 0; + for (const box of boxes) { + const y = box.y + box.height; + if (y < lastY) { + continue; + } + const x = box.x + (isLTR ? box.width : 0); + if (y > lastY) { + lastX = x; + lastY = y; + continue; + } + if (isLTR) { + if (x > lastX) { + lastX = x; + } + } else if (x < lastX) { + lastX = x; + } + } + return [isLTR ? 1 - lastX : lastX, lastY]; + } + show(parent, boxes, isLTR) { + const [x, y] = this.#getLastPoint(boxes, isLTR); + const { + style + } = this.#toolbar ||= this.#render(); + parent.append(this.#toolbar); + style.insetInlineEnd = `${100 * x}%`; + style.top = `calc(${100 * y}% + var(--editor-toolbar-vert-offset))`; + } + hide() { + this.#toolbar.remove(); + } + #addHighlightButton() { + const button = document.createElement("button"); + button.className = "highlightButton"; + button.tabIndex = 0; + button.setAttribute("data-l10n-id", `pdfjs-highlight-floating-button1`); + const span = document.createElement("span"); + button.append(span); + span.className = "visuallyHidden"; + span.setAttribute("data-l10n-id", "pdfjs-highlight-floating-button-label"); + const signal = this.#uiManager._signal; + button.addEventListener("contextmenu", noContextMenu, { + signal + }); + button.addEventListener("click", () => { + this.#uiManager.highlightSelection("floating_button"); + }, { + signal + }); + this.#buttons.append(button); + } +} + +;// CONCATENATED MODULE: ./src/display/editor/tools.js + + + +function bindEvents(obj, element, names) { + for (const name of names) { + element.addEventListener(name, obj[name].bind(obj)); + } +} +function opacityToHex(opacity) { + return Math.round(Math.min(255, Math.max(1, 255 * opacity))).toString(16).padStart(2, "0"); +} +class IdManager { + #id = 0; + get id() { + return `${AnnotationEditorPrefix}${this.#id++}`; + } +} +class ImageManager { + #baseId = getUuid(); + #id = 0; + #cache = null; + static get _isSVGFittingCanvas() { + const svg = `data:image/svg+xml;charset=UTF-8,`; + const canvas = new OffscreenCanvas(1, 3); + const ctx = canvas.getContext("2d", { + willReadFrequently: true + }); + const image = new Image(); + image.src = svg; + const promise = image.decode().then(() => { + ctx.drawImage(image, 0, 0, 1, 1, 0, 0, 1, 3); + return new Uint32Array(ctx.getImageData(0, 0, 1, 1).data.buffer)[0] === 0; + }); + return shadow(this, "_isSVGFittingCanvas", promise); + } + async #get(key, rawData) { + this.#cache ||= new Map(); + let data = this.#cache.get(key); + if (data === null) { + return null; + } + if (data?.bitmap) { + data.refCounter += 1; + return data; + } + try { + data ||= { + bitmap: null, + id: `image_${this.#baseId}_${this.#id++}`, + refCounter: 0, + isSvg: false + }; + let image; + if (typeof rawData === "string") { + data.url = rawData; + image = await fetchData(rawData, "blob"); + } else { + image = data.file = rawData; + } + if (image.type === "image/svg+xml") { + const mustRemoveAspectRatioPromise = ImageManager._isSVGFittingCanvas; + const fileReader = new FileReader(); + const imageElement = new Image(); + const imagePromise = new Promise((resolve, reject) => { + imageElement.onload = () => { + data.bitmap = imageElement; + data.isSvg = true; + resolve(); + }; + fileReader.onload = async () => { + const url = data.svgUrl = fileReader.result; + imageElement.src = (await mustRemoveAspectRatioPromise) ? `${url}#svgView(preserveAspectRatio(none))` : url; + }; + imageElement.onerror = fileReader.onerror = reject; + }); + fileReader.readAsDataURL(image); + await imagePromise; + } else { + data.bitmap = await createImageBitmap(image); + } + data.refCounter = 1; + } catch (e) { + console.error(e); + data = null; + } + this.#cache.set(key, data); + if (data) { + this.#cache.set(data.id, data); + } + return data; + } + async getFromFile(file) { + const { + lastModified, + name, + size, + type + } = file; + return this.#get(`${lastModified}_${name}_${size}_${type}`, file); + } + async getFromUrl(url) { + return this.#get(url, url); + } + async getFromId(id) { + this.#cache ||= new Map(); + const data = this.#cache.get(id); + if (!data) { + return null; + } + if (data.bitmap) { + data.refCounter += 1; + return data; + } + if (data.file) { + return this.getFromFile(data.file); + } + return this.getFromUrl(data.url); + } + getSvgUrl(id) { + const data = this.#cache.get(id); + if (!data?.isSvg) { + return null; + } + return data.svgUrl; + } + deleteId(id) { + this.#cache ||= new Map(); + const data = this.#cache.get(id); + if (!data) { + return; + } + data.refCounter -= 1; + if (data.refCounter !== 0) { + return; + } + data.bitmap = null; + } + isValidId(id) { + return id.startsWith(`image_${this.#baseId}_`); + } +} +class CommandManager { + #commands = []; + #locked = false; + #maxSize; + #position = -1; + constructor(maxSize = 128) { + this.#maxSize = maxSize; + } + add({ + cmd, + undo, + post, + mustExec, + type = NaN, + overwriteIfSameType = false, + keepUndo = false + }) { + if (mustExec) { + cmd(); + } + if (this.#locked) { + return; + } + const save = { + cmd, + undo, + post, + type + }; + if (this.#position === -1) { + if (this.#commands.length > 0) { + this.#commands.length = 0; + } + this.#position = 0; + this.#commands.push(save); + return; + } + if (overwriteIfSameType && this.#commands[this.#position].type === type) { + if (keepUndo) { + save.undo = this.#commands[this.#position].undo; + } + this.#commands[this.#position] = save; + return; + } + const next = this.#position + 1; + if (next === this.#maxSize) { + this.#commands.splice(0, 1); + } else { + this.#position = next; + if (next < this.#commands.length) { + this.#commands.splice(next); + } + } + this.#commands.push(save); + } + undo() { + if (this.#position === -1) { + return; + } + this.#locked = true; + const { + undo, + post + } = this.#commands[this.#position]; + undo(); + post?.(); + this.#locked = false; + this.#position -= 1; + } + redo() { + if (this.#position < this.#commands.length - 1) { + this.#position += 1; + this.#locked = true; + const { + cmd, + post + } = this.#commands[this.#position]; + cmd(); + post?.(); + this.#locked = false; + } + } + hasSomethingToUndo() { + return this.#position !== -1; + } + hasSomethingToRedo() { + return this.#position < this.#commands.length - 1; + } + destroy() { + this.#commands = null; + } +} +class KeyboardManager { + constructor(callbacks) { + this.buffer = []; + this.callbacks = new Map(); + this.allKeys = new Set(); + const { + isMac + } = util_FeatureTest.platform; + for (const [keys, callback, options = {}] of callbacks) { + for (const key of keys) { + const isMacKey = key.startsWith("mac+"); + if (isMac && isMacKey) { + this.callbacks.set(key.slice(4), { + callback, + options + }); + this.allKeys.add(key.split("+").at(-1)); + } else if (!isMac && !isMacKey) { + this.callbacks.set(key, { + callback, + options + }); + this.allKeys.add(key.split("+").at(-1)); + } + } + } + } + #serialize(event) { + if (event.altKey) { + this.buffer.push("alt"); + } + if (event.ctrlKey) { + this.buffer.push("ctrl"); + } + if (event.metaKey) { + this.buffer.push("meta"); + } + if (event.shiftKey) { + this.buffer.push("shift"); + } + this.buffer.push(event.key); + const str = this.buffer.join("+"); + this.buffer.length = 0; + return str; + } + exec(self, event) { + if (!this.allKeys.has(event.key)) { + return; + } + const info = this.callbacks.get(this.#serialize(event)); + if (!info) { + return; + } + const { + callback, + options: { + bubbles = false, + args = [], + checker = null + } + } = info; + if (checker && !checker(self, event)) { + return; + } + callback.bind(self, ...args, event)(); + if (!bubbles) { + event.stopPropagation(); + event.preventDefault(); + } + } +} +class ColorManager { + static _colorsMapping = new Map([["CanvasText", [0, 0, 0]], ["Canvas", [255, 255, 255]]]); + get _colors() { + const colors = new Map([["CanvasText", null], ["Canvas", null]]); + getColorValues(colors); + return shadow(this, "_colors", colors); + } + convert(color) { + const rgb = getRGB(color); + if (!window.matchMedia("(forced-colors: active)").matches) { + return rgb; + } + for (const [name, RGB] of this._colors) { + if (RGB.every((x, i) => x === rgb[i])) { + return ColorManager._colorsMapping.get(name); + } + } + return rgb; + } + getHexCode(name) { + const rgb = this._colors.get(name); + if (!rgb) { + return name; + } + return Util.makeHexColor(...rgb); + } +} +class AnnotationEditorUIManager { + #abortController = new AbortController(); + #activeEditor = null; + #allEditors = new Map(); + #allLayers = new Map(); + #altTextManager = null; + #annotationStorage = null; + #changedExistingAnnotations = null; + #commandManager = new CommandManager(); + #currentPageIndex = 0; + #deletedAnnotationsElementIds = new Set(); + #draggingEditors = null; + #editorTypes = null; + #editorsToRescale = new Set(); + #enableHighlightFloatingButton = false; + #filterFactory = null; + #focusMainContainerTimeoutId = null; + #highlightColors = null; + #highlightWhenShiftUp = false; + #highlightToolbar = null; + #idManager = new IdManager(); + #isEnabled = false; + #isWaiting = false; + #lastActiveElement = null; + #mainHighlightColorPicker = null; + #mlManager = null; + #mode = AnnotationEditorType.NONE; + #selectedEditors = new Set(); + #selectedTextNode = null; + #pageColors = null; + #showAllStates = null; + #boundBlur = this.blur.bind(this); + #boundFocus = this.focus.bind(this); + #boundCopy = this.copy.bind(this); + #boundCut = this.cut.bind(this); + #boundPaste = this.paste.bind(this); + #boundKeydown = this.keydown.bind(this); + #boundKeyup = this.keyup.bind(this); + #boundOnEditingAction = this.onEditingAction.bind(this); + #boundOnPageChanging = this.onPageChanging.bind(this); + #boundOnScaleChanging = this.onScaleChanging.bind(this); + #boundOnRotationChanging = this.onRotationChanging.bind(this); + #previousStates = { + isEditing: false, + isEmpty: true, + hasSomethingToUndo: false, + hasSomethingToRedo: false, + hasSelectedEditor: false, + hasSelectedText: false + }; + #translation = [0, 0]; + #translationTimeoutId = null; + #container = null; + #viewer = null; + static TRANSLATE_SMALL = 1; + static TRANSLATE_BIG = 10; + static get _keyboardManager() { + const proto = AnnotationEditorUIManager.prototype; + const arrowChecker = self => self.#container.contains(document.activeElement) && document.activeElement.tagName !== "BUTTON" && self.hasSomethingToControl(); + const textInputChecker = (_self, { + target: el + }) => { + if (el instanceof HTMLInputElement) { + const { + type + } = el; + return type !== "text" && type !== "number"; + } + return true; + }; + const small = this.TRANSLATE_SMALL; + const big = this.TRANSLATE_BIG; + return shadow(this, "_keyboardManager", new KeyboardManager([[["ctrl+a", "mac+meta+a"], proto.selectAll, { + checker: textInputChecker + }], [["ctrl+z", "mac+meta+z"], proto.undo, { + checker: textInputChecker + }], [["ctrl+y", "ctrl+shift+z", "mac+meta+shift+z", "ctrl+shift+Z", "mac+meta+shift+Z"], proto.redo, { + checker: textInputChecker + }], [["Backspace", "alt+Backspace", "ctrl+Backspace", "shift+Backspace", "mac+Backspace", "mac+alt+Backspace", "mac+ctrl+Backspace", "Delete", "ctrl+Delete", "shift+Delete", "mac+Delete"], proto.delete, { + checker: textInputChecker + }], [["Enter", "mac+Enter"], proto.addNewEditorFromKeyboard, { + checker: (self, { + target: el + }) => !(el instanceof HTMLButtonElement) && self.#container.contains(el) && !self.isEnterHandled + }], [[" ", "mac+ "], proto.addNewEditorFromKeyboard, { + checker: (self, { + target: el + }) => !(el instanceof HTMLButtonElement) && self.#container.contains(document.activeElement) + }], [["Escape", "mac+Escape"], proto.unselectAll], [["ArrowLeft", "mac+ArrowLeft"], proto.translateSelectedEditors, { + args: [-small, 0], + checker: arrowChecker + }], [["ctrl+ArrowLeft", "mac+shift+ArrowLeft"], proto.translateSelectedEditors, { + args: [-big, 0], + checker: arrowChecker + }], [["ArrowRight", "mac+ArrowRight"], proto.translateSelectedEditors, { + args: [small, 0], + checker: arrowChecker + }], [["ctrl+ArrowRight", "mac+shift+ArrowRight"], proto.translateSelectedEditors, { + args: [big, 0], + checker: arrowChecker + }], [["ArrowUp", "mac+ArrowUp"], proto.translateSelectedEditors, { + args: [0, -small], + checker: arrowChecker + }], [["ctrl+ArrowUp", "mac+shift+ArrowUp"], proto.translateSelectedEditors, { + args: [0, -big], + checker: arrowChecker + }], [["ArrowDown", "mac+ArrowDown"], proto.translateSelectedEditors, { + args: [0, small], + checker: arrowChecker + }], [["ctrl+ArrowDown", "mac+shift+ArrowDown"], proto.translateSelectedEditors, { + args: [0, big], + checker: arrowChecker + }]])); + } + constructor(container, viewer, altTextManager, eventBus, pdfDocument, pageColors, highlightColors, enableHighlightFloatingButton, mlManager) { + this._signal = this.#abortController.signal; + this.#container = container; + this.#viewer = viewer; + this.#altTextManager = altTextManager; + this._eventBus = eventBus; + this._eventBus._on("editingaction", this.#boundOnEditingAction); + this._eventBus._on("pagechanging", this.#boundOnPageChanging); + this._eventBus._on("scalechanging", this.#boundOnScaleChanging); + this._eventBus._on("rotationchanging", this.#boundOnRotationChanging); + this.#addSelectionListener(); + this.#addDragAndDropListeners(); + this.#addKeyboardManager(); + this.#annotationStorage = pdfDocument.annotationStorage; + this.#filterFactory = pdfDocument.filterFactory; + this.#pageColors = pageColors; + this.#highlightColors = highlightColors || null; + this.#enableHighlightFloatingButton = enableHighlightFloatingButton; + this.#mlManager = mlManager || null; + this.viewParameters = { + realScale: PixelsPerInch.PDF_TO_CSS_UNITS, + rotation: 0 + }; + this.isShiftKeyDown = false; + } + destroy() { + this.#abortController?.abort(); + this.#abortController = null; + this._signal = null; + this._eventBus._off("editingaction", this.#boundOnEditingAction); + this._eventBus._off("pagechanging", this.#boundOnPageChanging); + this._eventBus._off("scalechanging", this.#boundOnScaleChanging); + this._eventBus._off("rotationchanging", this.#boundOnRotationChanging); + for (const layer of this.#allLayers.values()) { + layer.destroy(); + } + this.#allLayers.clear(); + this.#allEditors.clear(); + this.#editorsToRescale.clear(); + this.#activeEditor = null; + this.#selectedEditors.clear(); + this.#commandManager.destroy(); + this.#altTextManager?.destroy(); + this.#highlightToolbar?.hide(); + this.#highlightToolbar = null; + if (this.#focusMainContainerTimeoutId) { + clearTimeout(this.#focusMainContainerTimeoutId); + this.#focusMainContainerTimeoutId = null; + } + if (this.#translationTimeoutId) { + clearTimeout(this.#translationTimeoutId); + this.#translationTimeoutId = null; + } + } + async mlGuess(data) { + return this.#mlManager?.guess(data) || null; + } + get hasMLManager() { + return !!this.#mlManager; + } + get hcmFilter() { + return shadow(this, "hcmFilter", this.#pageColors ? this.#filterFactory.addHCMFilter(this.#pageColors.foreground, this.#pageColors.background) : "none"); + } + get direction() { + return shadow(this, "direction", getComputedStyle(this.#container).direction); + } + get highlightColors() { + return shadow(this, "highlightColors", this.#highlightColors ? new Map(this.#highlightColors.split(",").map(pair => pair.split("=").map(x => x.trim()))) : null); + } + get highlightColorNames() { + return shadow(this, "highlightColorNames", this.highlightColors ? new Map(Array.from(this.highlightColors, e => e.reverse())) : null); + } + setMainHighlightColorPicker(colorPicker) { + this.#mainHighlightColorPicker = colorPicker; + } + editAltText(editor) { + this.#altTextManager?.editAltText(this, editor); + } + onPageChanging({ + pageNumber + }) { + this.#currentPageIndex = pageNumber - 1; + } + focusMainContainer() { + this.#container.focus(); + } + findParent(x, y) { + for (const layer of this.#allLayers.values()) { + const { + x: layerX, + y: layerY, + width, + height + } = layer.div.getBoundingClientRect(); + if (x >= layerX && x <= layerX + width && y >= layerY && y <= layerY + height) { + return layer; + } + } + return null; + } + disableUserSelect(value = false) { + this.#viewer.classList.toggle("noUserSelect", value); + } + addShouldRescale(editor) { + this.#editorsToRescale.add(editor); + } + removeShouldRescale(editor) { + this.#editorsToRescale.delete(editor); + } + onScaleChanging({ + scale + }) { + this.commitOrRemove(); + this.viewParameters.realScale = scale * PixelsPerInch.PDF_TO_CSS_UNITS; + for (const editor of this.#editorsToRescale) { + editor.onScaleChanging(); + } + } + onRotationChanging({ + pagesRotation + }) { + this.commitOrRemove(); + this.viewParameters.rotation = pagesRotation; + } + #getAnchorElementForSelection({ + anchorNode + }) { + return anchorNode.nodeType === Node.TEXT_NODE ? anchorNode.parentElement : anchorNode; + } + highlightSelection(methodOfCreation = "") { + const selection = document.getSelection(); + if (!selection || selection.isCollapsed) { + return; + } + const { + anchorNode, + anchorOffset, + focusNode, + focusOffset + } = selection; + const text = selection.toString(); + const anchorElement = this.#getAnchorElementForSelection(selection); + const textLayer = anchorElement.closest(".textLayer"); + const boxes = this.getSelectionBoxes(textLayer); + if (!boxes) { + return; + } + selection.empty(); + if (this.#mode === AnnotationEditorType.NONE) { + this._eventBus.dispatch("showannotationeditorui", { + source: this, + mode: AnnotationEditorType.HIGHLIGHT + }); + this.showAllEditors("highlight", true, true); + } + for (const layer of this.#allLayers.values()) { + if (layer.hasTextLayer(textLayer)) { + layer.createAndAddNewEditor({ + x: 0, + y: 0 + }, false, { + methodOfCreation, + boxes, + anchorNode, + anchorOffset, + focusNode, + focusOffset, + text + }); + break; + } + } + } + #displayHighlightToolbar() { + const selection = document.getSelection(); + if (!selection || selection.isCollapsed) { + return; + } + const anchorElement = this.#getAnchorElementForSelection(selection); + const textLayer = anchorElement.closest(".textLayer"); + const boxes = this.getSelectionBoxes(textLayer); + if (!boxes) { + return; + } + this.#highlightToolbar ||= new HighlightToolbar(this); + this.#highlightToolbar.show(textLayer, boxes, this.direction === "ltr"); + } + addToAnnotationStorage(editor) { + if (!editor.isEmpty() && this.#annotationStorage && !this.#annotationStorage.has(editor.id)) { + this.#annotationStorage.setValue(editor.id, editor); + } + } + #selectionChange() { + const selection = document.getSelection(); + if (!selection || selection.isCollapsed) { + if (this.#selectedTextNode) { + this.#highlightToolbar?.hide(); + this.#selectedTextNode = null; + this.#dispatchUpdateStates({ + hasSelectedText: false + }); + } + return; + } + const { + anchorNode + } = selection; + if (anchorNode === this.#selectedTextNode) { + return; + } + const anchorElement = this.#getAnchorElementForSelection(selection); + const textLayer = anchorElement.closest(".textLayer"); + if (!textLayer) { + if (this.#selectedTextNode) { + this.#highlightToolbar?.hide(); + this.#selectedTextNode = null; + this.#dispatchUpdateStates({ + hasSelectedText: false + }); + } + return; + } + this.#highlightToolbar?.hide(); + this.#selectedTextNode = anchorNode; + this.#dispatchUpdateStates({ + hasSelectedText: true + }); + if (this.#mode !== AnnotationEditorType.HIGHLIGHT && this.#mode !== AnnotationEditorType.NONE) { + return; + } + if (this.#mode === AnnotationEditorType.HIGHLIGHT) { + this.showAllEditors("highlight", true, true); + } + this.#highlightWhenShiftUp = this.isShiftKeyDown; + if (!this.isShiftKeyDown) { + const signal = this._signal; + const pointerup = e => { + if (e.type === "pointerup" && e.button !== 0) { + return; + } + window.removeEventListener("pointerup", pointerup); + window.removeEventListener("blur", pointerup); + if (e.type === "pointerup") { + this.#onSelectEnd("main_toolbar"); + } + }; + window.addEventListener("pointerup", pointerup, { + signal + }); + window.addEventListener("blur", pointerup, { + signal + }); + } + } + #onSelectEnd(methodOfCreation = "") { + if (this.#mode === AnnotationEditorType.HIGHLIGHT) { + this.highlightSelection(methodOfCreation); + } else if (this.#enableHighlightFloatingButton) { + this.#displayHighlightToolbar(); + } + } + #addSelectionListener() { + document.addEventListener("selectionchange", this.#selectionChange.bind(this), { + signal: this._signal + }); + } + #addFocusManager() { + const signal = this._signal; + window.addEventListener("focus", this.#boundFocus, { + signal + }); + window.addEventListener("blur", this.#boundBlur, { + signal + }); + } + #removeFocusManager() { + window.removeEventListener("focus", this.#boundFocus); + window.removeEventListener("blur", this.#boundBlur); + } + blur() { + this.isShiftKeyDown = false; + if (this.#highlightWhenShiftUp) { + this.#highlightWhenShiftUp = false; + this.#onSelectEnd("main_toolbar"); + } + if (!this.hasSelection) { + return; + } + const { + activeElement + } = document; + for (const editor of this.#selectedEditors) { + if (editor.div.contains(activeElement)) { + this.#lastActiveElement = [editor, activeElement]; + editor._focusEventsAllowed = false; + break; + } + } + } + focus() { + if (!this.#lastActiveElement) { + return; + } + const [lastEditor, lastActiveElement] = this.#lastActiveElement; + this.#lastActiveElement = null; + lastActiveElement.addEventListener("focusin", () => { + lastEditor._focusEventsAllowed = true; + }, { + once: true, + signal: this._signal + }); + lastActiveElement.focus(); + } + #addKeyboardManager() { + const signal = this._signal; + window.addEventListener("keydown", this.#boundKeydown, { + signal + }); + window.addEventListener("keyup", this.#boundKeyup, { + signal + }); + } + #removeKeyboardManager() { + window.removeEventListener("keydown", this.#boundKeydown); + window.removeEventListener("keyup", this.#boundKeyup); + } + #addCopyPasteListeners() { + const signal = this._signal; + document.addEventListener("copy", this.#boundCopy, { + signal + }); + document.addEventListener("cut", this.#boundCut, { + signal + }); + document.addEventListener("paste", this.#boundPaste, { + signal + }); + } + #removeCopyPasteListeners() { + document.removeEventListener("copy", this.#boundCopy); + document.removeEventListener("cut", this.#boundCut); + document.removeEventListener("paste", this.#boundPaste); + } + #addDragAndDropListeners() { + const signal = this._signal; + document.addEventListener("dragover", this.dragOver.bind(this), { + signal + }); + document.addEventListener("drop", this.drop.bind(this), { + signal + }); + } + addEditListeners() { + this.#addKeyboardManager(); + this.#addCopyPasteListeners(); + } + removeEditListeners() { + this.#removeKeyboardManager(); + this.#removeCopyPasteListeners(); + } + dragOver(event) { + for (const { + type + } of event.dataTransfer.items) { + for (const editorType of this.#editorTypes) { + if (editorType.isHandlingMimeForPasting(type)) { + event.dataTransfer.dropEffect = "copy"; + event.preventDefault(); + return; + } + } + } + } + drop(event) { + for (const item of event.dataTransfer.items) { + for (const editorType of this.#editorTypes) { + if (editorType.isHandlingMimeForPasting(item.type)) { + editorType.paste(item, this.currentLayer); + event.preventDefault(); + return; + } + } + } + } + copy(event) { + event.preventDefault(); + this.#activeEditor?.commitOrRemove(); + if (!this.hasSelection) { + return; + } + const editors = []; + for (const editor of this.#selectedEditors) { + const serialized = editor.serialize(true); + if (serialized) { + editors.push(serialized); + } + } + if (editors.length === 0) { + return; + } + event.clipboardData.setData("application/pdfjs", JSON.stringify(editors)); + } + cut(event) { + this.copy(event); + this.delete(); + } + paste(event) { + event.preventDefault(); + const { + clipboardData + } = event; + for (const item of clipboardData.items) { + for (const editorType of this.#editorTypes) { + if (editorType.isHandlingMimeForPasting(item.type)) { + editorType.paste(item, this.currentLayer); + return; + } + } + } + let data = clipboardData.getData("application/pdfjs"); + if (!data) { + return; + } + try { + data = JSON.parse(data); + } catch (ex) { + warn(`paste: "${ex.message}".`); + return; + } + if (!Array.isArray(data)) { + return; + } + this.unselectAll(); + const layer = this.currentLayer; + try { + const newEditors = []; + for (const editor of data) { + const deserializedEditor = layer.deserialize(editor); + if (!deserializedEditor) { + return; + } + newEditors.push(deserializedEditor); + } + const cmd = () => { + for (const editor of newEditors) { + this.#addEditorToLayer(editor); + } + this.#selectEditors(newEditors); + }; + const undo = () => { + for (const editor of newEditors) { + editor.remove(); + } + }; + this.addCommands({ + cmd, + undo, + mustExec: true + }); + } catch (ex) { + warn(`paste: "${ex.message}".`); + } + } + keydown(event) { + if (!this.isShiftKeyDown && event.key === "Shift") { + this.isShiftKeyDown = true; + } + if (this.#mode !== AnnotationEditorType.NONE && !this.isEditorHandlingKeyboard) { + AnnotationEditorUIManager._keyboardManager.exec(this, event); + } + } + keyup(event) { + if (this.isShiftKeyDown && event.key === "Shift") { + this.isShiftKeyDown = false; + if (this.#highlightWhenShiftUp) { + this.#highlightWhenShiftUp = false; + this.#onSelectEnd("main_toolbar"); + } + } + } + onEditingAction({ + name + }) { + switch (name) { + case "undo": + case "redo": + case "delete": + case "selectAll": + this[name](); + break; + case "highlightSelection": + this.highlightSelection("context_menu"); + break; + } + } + #dispatchUpdateStates(details) { + const hasChanged = Object.entries(details).some(([key, value]) => this.#previousStates[key] !== value); + if (hasChanged) { + this._eventBus.dispatch("annotationeditorstateschanged", { + source: this, + details: Object.assign(this.#previousStates, details) + }); + if (this.#mode === AnnotationEditorType.HIGHLIGHT && details.hasSelectedEditor === false) { + this.#dispatchUpdateUI([[AnnotationEditorParamsType.HIGHLIGHT_FREE, true]]); + } + } + } + #dispatchUpdateUI(details) { + this._eventBus.dispatch("annotationeditorparamschanged", { + source: this, + details + }); + } + setEditingState(isEditing) { + if (isEditing) { + this.#addFocusManager(); + this.#addCopyPasteListeners(); + this.#dispatchUpdateStates({ + isEditing: this.#mode !== AnnotationEditorType.NONE, + isEmpty: this.#isEmpty(), + hasSomethingToUndo: this.#commandManager.hasSomethingToUndo(), + hasSomethingToRedo: this.#commandManager.hasSomethingToRedo(), + hasSelectedEditor: false + }); + } else { + this.#removeFocusManager(); + this.#removeCopyPasteListeners(); + this.#dispatchUpdateStates({ + isEditing: false + }); + this.disableUserSelect(false); + } + } + registerEditorTypes(types) { + if (this.#editorTypes) { + return; + } + this.#editorTypes = types; + for (const editorType of this.#editorTypes) { + this.#dispatchUpdateUI(editorType.defaultPropertiesToUpdate); + } + } + getId() { + return this.#idManager.id; + } + get currentLayer() { + return this.#allLayers.get(this.#currentPageIndex); + } + getLayer(pageIndex) { + return this.#allLayers.get(pageIndex); + } + get currentPageIndex() { + return this.#currentPageIndex; + } + addLayer(layer) { + this.#allLayers.set(layer.pageIndex, layer); + if (this.#isEnabled) { + layer.enable(); + } else { + layer.disable(); + } + } + removeLayer(layer) { + this.#allLayers.delete(layer.pageIndex); + } + updateMode(mode, editId = null, isFromKeyboard = false) { + if (this.#mode === mode) { + return; + } + this.#mode = mode; + if (mode === AnnotationEditorType.NONE) { + this.setEditingState(false); + this.#disableAll(); + return; + } + this.setEditingState(true); + this.#enableAll(); + this.unselectAll(); + for (const layer of this.#allLayers.values()) { + layer.updateMode(mode); + } + if (!editId && isFromKeyboard) { + this.addNewEditorFromKeyboard(); + return; + } + if (!editId) { + return; + } + for (const editor of this.#allEditors.values()) { + if (editor.annotationElementId === editId) { + this.setSelected(editor); + editor.enterInEditMode(); + break; + } + } + } + addNewEditorFromKeyboard() { + if (this.currentLayer.canCreateNewEmptyEditor()) { + this.currentLayer.addNewEditor(); + } + } + updateToolbar(mode) { + if (mode === this.#mode) { + return; + } + this._eventBus.dispatch("switchannotationeditormode", { + source: this, + mode + }); + } + updateParams(type, value) { + if (!this.#editorTypes) { + return; + } + switch (type) { + case AnnotationEditorParamsType.CREATE: + this.currentLayer.addNewEditor(); + return; + case AnnotationEditorParamsType.HIGHLIGHT_DEFAULT_COLOR: + this.#mainHighlightColorPicker?.updateColor(value); + break; + case AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL: + this._eventBus.dispatch("reporttelemetry", { + source: this, + details: { + type: "editing", + data: { + type: "highlight", + action: "toggle_visibility" + } + } + }); + (this.#showAllStates ||= new Map()).set(type, value); + this.showAllEditors("highlight", value); + break; + } + for (const editor of this.#selectedEditors) { + editor.updateParams(type, value); + } + for (const editorType of this.#editorTypes) { + editorType.updateDefaultParams(type, value); + } + } + showAllEditors(type, visible, updateButton = false) { + for (const editor of this.#allEditors.values()) { + if (editor.editorType === type) { + editor.show(visible); + } + } + const state = this.#showAllStates?.get(AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL) ?? true; + if (state !== visible) { + this.#dispatchUpdateUI([[AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL, visible]]); + } + } + enableWaiting(mustWait = false) { + if (this.#isWaiting === mustWait) { + return; + } + this.#isWaiting = mustWait; + for (const layer of this.#allLayers.values()) { + if (mustWait) { + layer.disableClick(); + } else { + layer.enableClick(); + } + layer.div.classList.toggle("waiting", mustWait); + } + } + #enableAll() { + if (!this.#isEnabled) { + this.#isEnabled = true; + for (const layer of this.#allLayers.values()) { + layer.enable(); + } + for (const editor of this.#allEditors.values()) { + editor.enable(); + } + } + } + #disableAll() { + this.unselectAll(); + if (this.#isEnabled) { + this.#isEnabled = false; + for (const layer of this.#allLayers.values()) { + layer.disable(); + } + for (const editor of this.#allEditors.values()) { + editor.disable(); + } + } + } + getEditors(pageIndex) { + const editors = []; + for (const editor of this.#allEditors.values()) { + if (editor.pageIndex === pageIndex) { + editors.push(editor); + } + } + return editors; + } + getEditor(id) { + return this.#allEditors.get(id); + } + addEditor(editor) { + this.#allEditors.set(editor.id, editor); + } + removeEditor(editor) { + if (editor.div.contains(document.activeElement)) { + if (this.#focusMainContainerTimeoutId) { + clearTimeout(this.#focusMainContainerTimeoutId); + } + this.#focusMainContainerTimeoutId = setTimeout(() => { + this.focusMainContainer(); + this.#focusMainContainerTimeoutId = null; + }, 0); + } + this.#allEditors.delete(editor.id); + this.unselect(editor); + if (!editor.annotationElementId || !this.#deletedAnnotationsElementIds.has(editor.annotationElementId)) { + this.#annotationStorage?.remove(editor.id); + } + } + addDeletedAnnotationElement(editor) { + this.#deletedAnnotationsElementIds.add(editor.annotationElementId); + this.addChangedExistingAnnotation(editor); + editor.deleted = true; + } + isDeletedAnnotationElement(annotationElementId) { + return this.#deletedAnnotationsElementIds.has(annotationElementId); + } + removeDeletedAnnotationElement(editor) { + this.#deletedAnnotationsElementIds.delete(editor.annotationElementId); + this.removeChangedExistingAnnotation(editor); + editor.deleted = false; + } + #addEditorToLayer(editor) { + const layer = this.#allLayers.get(editor.pageIndex); + if (layer) { + layer.addOrRebuild(editor); + } else { + this.addEditor(editor); + this.addToAnnotationStorage(editor); + } + } + setActiveEditor(editor) { + if (this.#activeEditor === editor) { + return; + } + this.#activeEditor = editor; + if (editor) { + this.#dispatchUpdateUI(editor.propertiesToUpdate); + } + } + get #lastSelectedEditor() { + let ed = null; + for (ed of this.#selectedEditors) {} + return ed; + } + updateUI(editor) { + if (this.#lastSelectedEditor === editor) { + this.#dispatchUpdateUI(editor.propertiesToUpdate); + } + } + toggleSelected(editor) { + if (this.#selectedEditors.has(editor)) { + this.#selectedEditors.delete(editor); + editor.unselect(); + this.#dispatchUpdateStates({ + hasSelectedEditor: this.hasSelection + }); + return; + } + this.#selectedEditors.add(editor); + editor.select(); + this.#dispatchUpdateUI(editor.propertiesToUpdate); + this.#dispatchUpdateStates({ + hasSelectedEditor: true + }); + } + setSelected(editor) { + for (const ed of this.#selectedEditors) { + if (ed !== editor) { + ed.unselect(); + } + } + this.#selectedEditors.clear(); + this.#selectedEditors.add(editor); + editor.select(); + this.#dispatchUpdateUI(editor.propertiesToUpdate); + this.#dispatchUpdateStates({ + hasSelectedEditor: true + }); + } + isSelected(editor) { + return this.#selectedEditors.has(editor); + } + get firstSelectedEditor() { + return this.#selectedEditors.values().next().value; + } + unselect(editor) { + editor.unselect(); + this.#selectedEditors.delete(editor); + this.#dispatchUpdateStates({ + hasSelectedEditor: this.hasSelection + }); + } + get hasSelection() { + return this.#selectedEditors.size !== 0; + } + get isEnterHandled() { + return this.#selectedEditors.size === 1 && this.firstSelectedEditor.isEnterHandled; + } + undo() { + this.#commandManager.undo(); + this.#dispatchUpdateStates({ + hasSomethingToUndo: this.#commandManager.hasSomethingToUndo(), + hasSomethingToRedo: true, + isEmpty: this.#isEmpty() + }); + } + redo() { + this.#commandManager.redo(); + this.#dispatchUpdateStates({ + hasSomethingToUndo: true, + hasSomethingToRedo: this.#commandManager.hasSomethingToRedo(), + isEmpty: this.#isEmpty() + }); + } + addCommands(params) { + this.#commandManager.add(params); + this.#dispatchUpdateStates({ + hasSomethingToUndo: true, + hasSomethingToRedo: false, + isEmpty: this.#isEmpty() + }); + } + #isEmpty() { + if (this.#allEditors.size === 0) { + return true; + } + if (this.#allEditors.size === 1) { + for (const editor of this.#allEditors.values()) { + return editor.isEmpty(); + } + } + return false; + } + delete() { + this.commitOrRemove(); + if (!this.hasSelection) { + return; + } + const editors = [...this.#selectedEditors]; + const cmd = () => { + for (const editor of editors) { + editor.remove(); + } + }; + const undo = () => { + for (const editor of editors) { + this.#addEditorToLayer(editor); + } + }; + this.addCommands({ + cmd, + undo, + mustExec: true + }); + } + commitOrRemove() { + this.#activeEditor?.commitOrRemove(); + } + hasSomethingToControl() { + return this.#activeEditor || this.hasSelection; + } + #selectEditors(editors) { + for (const editor of this.#selectedEditors) { + editor.unselect(); + } + this.#selectedEditors.clear(); + for (const editor of editors) { + if (editor.isEmpty()) { + continue; + } + this.#selectedEditors.add(editor); + editor.select(); + } + this.#dispatchUpdateStates({ + hasSelectedEditor: this.hasSelection + }); + } + selectAll() { + for (const editor of this.#selectedEditors) { + editor.commit(); + } + this.#selectEditors(this.#allEditors.values()); + } + unselectAll() { + if (this.#activeEditor) { + this.#activeEditor.commitOrRemove(); + if (this.#mode !== AnnotationEditorType.NONE) { + return; + } + } + if (!this.hasSelection) { + return; + } + for (const editor of this.#selectedEditors) { + editor.unselect(); + } + this.#selectedEditors.clear(); + this.#dispatchUpdateStates({ + hasSelectedEditor: false + }); + } + translateSelectedEditors(x, y, noCommit = false) { + if (!noCommit) { + this.commitOrRemove(); + } + if (!this.hasSelection) { + return; + } + this.#translation[0] += x; + this.#translation[1] += y; + const [totalX, totalY] = this.#translation; + const editors = [...this.#selectedEditors]; + const TIME_TO_WAIT = 1000; + if (this.#translationTimeoutId) { + clearTimeout(this.#translationTimeoutId); + } + this.#translationTimeoutId = setTimeout(() => { + this.#translationTimeoutId = null; + this.#translation[0] = this.#translation[1] = 0; + this.addCommands({ + cmd: () => { + for (const editor of editors) { + if (this.#allEditors.has(editor.id)) { + editor.translateInPage(totalX, totalY); + } + } + }, + undo: () => { + for (const editor of editors) { + if (this.#allEditors.has(editor.id)) { + editor.translateInPage(-totalX, -totalY); + } + } + }, + mustExec: false + }); + }, TIME_TO_WAIT); + for (const editor of editors) { + editor.translateInPage(x, y); + } + } + setUpDragSession() { + if (!this.hasSelection) { + return; + } + this.disableUserSelect(true); + this.#draggingEditors = new Map(); + for (const editor of this.#selectedEditors) { + this.#draggingEditors.set(editor, { + savedX: editor.x, + savedY: editor.y, + savedPageIndex: editor.pageIndex, + newX: 0, + newY: 0, + newPageIndex: -1 + }); + } + } + endDragSession() { + if (!this.#draggingEditors) { + return false; + } + this.disableUserSelect(false); + const map = this.#draggingEditors; + this.#draggingEditors = null; + let mustBeAddedInUndoStack = false; + for (const [{ + x, + y, + pageIndex + }, value] of map) { + value.newX = x; + value.newY = y; + value.newPageIndex = pageIndex; + mustBeAddedInUndoStack ||= x !== value.savedX || y !== value.savedY || pageIndex !== value.savedPageIndex; + } + if (!mustBeAddedInUndoStack) { + return false; + } + const move = (editor, x, y, pageIndex) => { + if (this.#allEditors.has(editor.id)) { + const parent = this.#allLayers.get(pageIndex); + if (parent) { + editor._setParentAndPosition(parent, x, y); + } else { + editor.pageIndex = pageIndex; + editor.x = x; + editor.y = y; + } + } + }; + this.addCommands({ + cmd: () => { + for (const [editor, { + newX, + newY, + newPageIndex + }] of map) { + move(editor, newX, newY, newPageIndex); + } + }, + undo: () => { + for (const [editor, { + savedX, + savedY, + savedPageIndex + }] of map) { + move(editor, savedX, savedY, savedPageIndex); + } + }, + mustExec: true + }); + return true; + } + dragSelectedEditors(tx, ty) { + if (!this.#draggingEditors) { + return; + } + for (const editor of this.#draggingEditors.keys()) { + editor.drag(tx, ty); + } + } + rebuild(editor) { + if (editor.parent === null) { + const parent = this.getLayer(editor.pageIndex); + if (parent) { + parent.changeParent(editor); + parent.addOrRebuild(editor); + } else { + this.addEditor(editor); + this.addToAnnotationStorage(editor); + editor.rebuild(); + } + } else { + editor.parent.addOrRebuild(editor); + } + } + get isEditorHandlingKeyboard() { + return this.getActive()?.shouldGetKeyboardEvents() || this.#selectedEditors.size === 1 && this.firstSelectedEditor.shouldGetKeyboardEvents(); + } + isActive(editor) { + return this.#activeEditor === editor; + } + getActive() { + return this.#activeEditor; + } + getMode() { + return this.#mode; + } + get imageManager() { + return shadow(this, "imageManager", new ImageManager()); + } + getSelectionBoxes(textLayer) { + if (!textLayer) { + return null; + } + const selection = document.getSelection(); + for (let i = 0, ii = selection.rangeCount; i < ii; i++) { + if (!textLayer.contains(selection.getRangeAt(i).commonAncestorContainer)) { + return null; + } + } + const { + x: layerX, + y: layerY, + width: parentWidth, + height: parentHeight + } = textLayer.getBoundingClientRect(); + let rotator; + switch (textLayer.getAttribute("data-main-rotation")) { + case "90": + rotator = (x, y, w, h) => ({ + x: (y - layerY) / parentHeight, + y: 1 - (x + w - layerX) / parentWidth, + width: h / parentHeight, + height: w / parentWidth + }); + break; + case "180": + rotator = (x, y, w, h) => ({ + x: 1 - (x + w - layerX) / parentWidth, + y: 1 - (y + h - layerY) / parentHeight, + width: w / parentWidth, + height: h / parentHeight + }); + break; + case "270": + rotator = (x, y, w, h) => ({ + x: 1 - (y + h - layerY) / parentHeight, + y: (x - layerX) / parentWidth, + width: h / parentHeight, + height: w / parentWidth + }); + break; + default: + rotator = (x, y, w, h) => ({ + x: (x - layerX) / parentWidth, + y: (y - layerY) / parentHeight, + width: w / parentWidth, + height: h / parentHeight + }); + break; + } + const boxes = []; + for (let i = 0, ii = selection.rangeCount; i < ii; i++) { + const range = selection.getRangeAt(i); + if (range.collapsed) { + continue; + } + for (const { + x, + y, + width, + height + } of range.getClientRects()) { + if (width === 0 || height === 0) { + continue; + } + boxes.push(rotator(x, y, width, height)); + } + } + return boxes.length === 0 ? null : boxes; + } + addChangedExistingAnnotation({ + annotationElementId, + id + }) { + (this.#changedExistingAnnotations ||= new Map()).set(annotationElementId, id); + } + removeChangedExistingAnnotation({ + annotationElementId + }) { + this.#changedExistingAnnotations?.delete(annotationElementId); + } + renderAnnotationElement(annotation) { + const editorId = this.#changedExistingAnnotations?.get(annotation.data.id); + if (!editorId) { + return; + } + const editor = this.#annotationStorage.getRawValue(editorId); + if (!editor) { + return; + } + if (this.#mode === AnnotationEditorType.NONE && !editor.hasBeenModified) { + return; + } + editor.renderAnnotationElement(annotation); + } +} + +;// CONCATENATED MODULE: ./src/display/editor/alt_text.js + +class AltText { + #altText = ""; + #altTextDecorative = false; + #altTextButton = null; + #altTextTooltip = null; + #altTextTooltipTimeout = null; + #altTextWasFromKeyBoard = false; + #editor = null; + static _l10nPromise = null; + constructor(editor) { + this.#editor = editor; + } + static initialize(l10nPromise) { + AltText._l10nPromise ||= l10nPromise; + } + async render() { + const altText = this.#altTextButton = document.createElement("button"); + altText.className = "altText"; + const msg = await AltText._l10nPromise.get("pdfjs-editor-alt-text-button-label"); + altText.textContent = msg; + altText.setAttribute("aria-label", msg); + altText.tabIndex = "0"; + const signal = this.#editor._uiManager._signal; + altText.addEventListener("contextmenu", noContextMenu, { + signal + }); + altText.addEventListener("pointerdown", event => event.stopPropagation(), { + signal + }); + const onClick = event => { + event.preventDefault(); + this.#editor._uiManager.editAltText(this.#editor); + }; + altText.addEventListener("click", onClick, { + capture: true, + signal + }); + altText.addEventListener("keydown", event => { + if (event.target === altText && event.key === "Enter") { + this.#altTextWasFromKeyBoard = true; + onClick(event); + } + }, { + signal + }); + await this.#setState(); + return altText; + } + finish() { + if (!this.#altTextButton) { + return; + } + this.#altTextButton.focus({ + focusVisible: this.#altTextWasFromKeyBoard + }); + this.#altTextWasFromKeyBoard = false; + } + isEmpty() { + return !this.#altText && !this.#altTextDecorative; + } + get data() { + return { + altText: this.#altText, + decorative: this.#altTextDecorative + }; + } + set data({ + altText, + decorative + }) { + if (this.#altText === altText && this.#altTextDecorative === decorative) { + return; + } + this.#altText = altText; + this.#altTextDecorative = decorative; + this.#setState(); + } + toggle(enabled = false) { + if (!this.#altTextButton) { + return; + } + if (!enabled && this.#altTextTooltipTimeout) { + clearTimeout(this.#altTextTooltipTimeout); + this.#altTextTooltipTimeout = null; + } + this.#altTextButton.disabled = !enabled; + } + destroy() { + this.#altTextButton?.remove(); + this.#altTextButton = null; + this.#altTextTooltip = null; + } + async #setState() { + const button = this.#altTextButton; + if (!button) { + return; + } + if (!this.#altText && !this.#altTextDecorative) { + button.classList.remove("done"); + this.#altTextTooltip?.remove(); + return; + } + button.classList.add("done"); + AltText._l10nPromise.get("pdfjs-editor-alt-text-edit-button-label").then(msg => { + button.setAttribute("aria-label", msg); + }); + let tooltip = this.#altTextTooltip; + if (!tooltip) { + this.#altTextTooltip = tooltip = document.createElement("span"); + tooltip.className = "tooltip"; + tooltip.setAttribute("role", "tooltip"); + const id = tooltip.id = `alt-text-tooltip-${this.#editor.id}`; + button.setAttribute("aria-describedby", id); + const DELAY_TO_SHOW_TOOLTIP = 100; + const signal = this.#editor._uiManager._signal; + signal.addEventListener("abort", () => { + clearTimeout(this.#altTextTooltipTimeout); + this.#altTextTooltipTimeout = null; + }, { + once: true + }); + button.addEventListener("mouseenter", () => { + this.#altTextTooltipTimeout = setTimeout(() => { + this.#altTextTooltipTimeout = null; + this.#altTextTooltip.classList.add("show"); + this.#editor._reportTelemetry({ + action: "alt_text_tooltip" + }); + }, DELAY_TO_SHOW_TOOLTIP); + }, { + signal + }); + button.addEventListener("mouseleave", () => { + if (this.#altTextTooltipTimeout) { + clearTimeout(this.#altTextTooltipTimeout); + this.#altTextTooltipTimeout = null; + } + this.#altTextTooltip?.classList.remove("show"); + }, { + signal + }); + } + tooltip.innerText = this.#altTextDecorative ? await AltText._l10nPromise.get("pdfjs-editor-alt-text-decorative-tooltip") : this.#altText; + if (!tooltip.parentNode) { + button.append(tooltip); + } + const element = this.#editor.getImageForAltText(); + element?.setAttribute("aria-describedby", tooltip.id); + } +} + +;// CONCATENATED MODULE: ./src/display/editor/editor.js + + + + + +class AnnotationEditor { + #accessibilityData = null; + #allResizerDivs = null; + #altText = null; + #disabled = false; + #keepAspectRatio = false; + #resizersDiv = null; + #savedDimensions = null; + #boundFocusin = this.focusin.bind(this); + #boundFocusout = this.focusout.bind(this); + #editToolbar = null; + #focusedResizerName = ""; + #hasBeenClicked = false; + #initialPosition = null; + #isEditing = false; + #isInEditMode = false; + #isResizerEnabledForKeyboard = false; + #moveInDOMTimeout = null; + #prevDragX = 0; + #prevDragY = 0; + #telemetryTimeouts = null; + _initialOptions = Object.create(null); + _isVisible = true; + _uiManager = null; + _focusEventsAllowed = true; + _l10nPromise = null; + #isDraggable = false; + #zIndex = AnnotationEditor._zIndex++; + static _borderLineWidth = -1; + static _colorManager = new ColorManager(); + static _zIndex = 1; + static _telemetryTimeout = 1000; + static get _resizerKeyboardManager() { + const resize = AnnotationEditor.prototype._resizeWithKeyboard; + const small = AnnotationEditorUIManager.TRANSLATE_SMALL; + const big = AnnotationEditorUIManager.TRANSLATE_BIG; + return shadow(this, "_resizerKeyboardManager", new KeyboardManager([[["ArrowLeft", "mac+ArrowLeft"], resize, { + args: [-small, 0] + }], [["ctrl+ArrowLeft", "mac+shift+ArrowLeft"], resize, { + args: [-big, 0] + }], [["ArrowRight", "mac+ArrowRight"], resize, { + args: [small, 0] + }], [["ctrl+ArrowRight", "mac+shift+ArrowRight"], resize, { + args: [big, 0] + }], [["ArrowUp", "mac+ArrowUp"], resize, { + args: [0, -small] + }], [["ctrl+ArrowUp", "mac+shift+ArrowUp"], resize, { + args: [0, -big] + }], [["ArrowDown", "mac+ArrowDown"], resize, { + args: [0, small] + }], [["ctrl+ArrowDown", "mac+shift+ArrowDown"], resize, { + args: [0, big] + }], [["Escape", "mac+Escape"], AnnotationEditor.prototype._stopResizingWithKeyboard]])); + } + constructor(parameters) { + if (this.constructor === AnnotationEditor) { + unreachable("Cannot initialize AnnotationEditor."); + } + this.parent = parameters.parent; + this.id = parameters.id; + this.width = this.height = null; + this.pageIndex = parameters.parent.pageIndex; + this.name = parameters.name; + this.div = null; + this._uiManager = parameters.uiManager; + this.annotationElementId = null; + this._willKeepAspectRatio = false; + this._initialOptions.isCentered = parameters.isCentered; + this._structTreeParentId = null; + const { + rotation, + rawDims: { + pageWidth, + pageHeight, + pageX, + pageY + } + } = this.parent.viewport; + this.rotation = rotation; + this.pageRotation = (360 + rotation - this._uiManager.viewParameters.rotation) % 360; + this.pageDimensions = [pageWidth, pageHeight]; + this.pageTranslation = [pageX, pageY]; + const [width, height] = this.parentDimensions; + this.x = parameters.x / width; + this.y = parameters.y / height; + this.isAttachedToDOM = false; + this.deleted = false; + } + get editorType() { + return Object.getPrototypeOf(this).constructor._type; + } + static get _defaultLineColor() { + return shadow(this, "_defaultLineColor", this._colorManager.getHexCode("CanvasText")); + } + static deleteAnnotationElement(editor) { + const fakeEditor = new FakeEditor({ + id: editor.parent.getNextId(), + parent: editor.parent, + uiManager: editor._uiManager + }); + fakeEditor.annotationElementId = editor.annotationElementId; + fakeEditor.deleted = true; + fakeEditor._uiManager.addToAnnotationStorage(fakeEditor); + } + static initialize(l10n, _uiManager, options) { + AnnotationEditor._l10nPromise ||= new Map(["pdfjs-editor-alt-text-button-label", "pdfjs-editor-alt-text-edit-button-label", "pdfjs-editor-alt-text-decorative-tooltip", "pdfjs-editor-resizer-label-topLeft", "pdfjs-editor-resizer-label-topMiddle", "pdfjs-editor-resizer-label-topRight", "pdfjs-editor-resizer-label-middleRight", "pdfjs-editor-resizer-label-bottomRight", "pdfjs-editor-resizer-label-bottomMiddle", "pdfjs-editor-resizer-label-bottomLeft", "pdfjs-editor-resizer-label-middleLeft"].map(str => [str, l10n.get(str.replaceAll(/([A-Z])/g, c => `-${c.toLowerCase()}`))])); + if (options?.strings) { + for (const str of options.strings) { + AnnotationEditor._l10nPromise.set(str, l10n.get(str)); + } + } + if (AnnotationEditor._borderLineWidth !== -1) { + return; + } + const style = getComputedStyle(document.documentElement); + AnnotationEditor._borderLineWidth = parseFloat(style.getPropertyValue("--outline-width")) || 0; + } + static updateDefaultParams(_type, _value) {} + static get defaultPropertiesToUpdate() { + return []; + } + static isHandlingMimeForPasting(mime) { + return false; + } + static paste(item, parent) { + unreachable("Not implemented"); + } + get propertiesToUpdate() { + return []; + } + get _isDraggable() { + return this.#isDraggable; + } + set _isDraggable(value) { + this.#isDraggable = value; + this.div?.classList.toggle("draggable", value); + } + get isEnterHandled() { + return true; + } + center() { + const [pageWidth, pageHeight] = this.pageDimensions; + switch (this.parentRotation) { + case 90: + this.x -= this.height * pageHeight / (pageWidth * 2); + this.y += this.width * pageWidth / (pageHeight * 2); + break; + case 180: + this.x += this.width / 2; + this.y += this.height / 2; + break; + case 270: + this.x += this.height * pageHeight / (pageWidth * 2); + this.y -= this.width * pageWidth / (pageHeight * 2); + break; + default: + this.x -= this.width / 2; + this.y -= this.height / 2; + break; + } + this.fixAndSetPosition(); + } + addCommands(params) { + this._uiManager.addCommands(params); + } + get currentLayer() { + return this._uiManager.currentLayer; + } + setInBackground() { + this.div.style.zIndex = 0; + } + setInForeground() { + this.div.style.zIndex = this.#zIndex; + } + setParent(parent) { + if (parent !== null) { + this.pageIndex = parent.pageIndex; + this.pageDimensions = parent.pageDimensions; + } else { + this.#stopResizing(); + } + this.parent = parent; + } + focusin(event) { + if (!this._focusEventsAllowed) { + return; + } + if (!this.#hasBeenClicked) { + this.parent.setSelected(this); + } else { + this.#hasBeenClicked = false; + } + } + focusout(event) { + if (!this._focusEventsAllowed) { + return; + } + if (!this.isAttachedToDOM) { + return; + } + const target = event.relatedTarget; + if (target?.closest(`#${this.id}`)) { + return; + } + event.preventDefault(); + if (!this.parent?.isMultipleSelection) { + this.commitOrRemove(); + } + } + commitOrRemove() { + if (this.isEmpty()) { + this.remove(); + } else { + this.commit(); + } + } + commit() { + this.addToAnnotationStorage(); + } + addToAnnotationStorage() { + this._uiManager.addToAnnotationStorage(this); + } + setAt(x, y, tx, ty) { + const [width, height] = this.parentDimensions; + [tx, ty] = this.screenToPageTranslation(tx, ty); + this.x = (x + tx) / width; + this.y = (y + ty) / height; + this.fixAndSetPosition(); + } + #translate([width, height], x, y) { + [x, y] = this.screenToPageTranslation(x, y); + this.x += x / width; + this.y += y / height; + this.fixAndSetPosition(); + } + translate(x, y) { + this.#translate(this.parentDimensions, x, y); + } + translateInPage(x, y) { + this.#initialPosition ||= [this.x, this.y]; + this.#translate(this.pageDimensions, x, y); + this.div.scrollIntoView({ + block: "nearest" + }); + } + drag(tx, ty) { + this.#initialPosition ||= [this.x, this.y]; + const [parentWidth, parentHeight] = this.parentDimensions; + this.x += tx / parentWidth; + this.y += ty / parentHeight; + if (this.parent && (this.x < 0 || this.x > 1 || this.y < 0 || this.y > 1)) { + const { + x, + y + } = this.div.getBoundingClientRect(); + if (this.parent.findNewParent(this, x, y)) { + this.x -= Math.floor(this.x); + this.y -= Math.floor(this.y); + } + } + let { + x, + y + } = this; + const [bx, by] = this.getBaseTranslation(); + x += bx; + y += by; + this.div.style.left = `${(100 * x).toFixed(2)}%`; + this.div.style.top = `${(100 * y).toFixed(2)}%`; + this.div.scrollIntoView({ + block: "nearest" + }); + } + get _hasBeenMoved() { + return !!this.#initialPosition && (this.#initialPosition[0] !== this.x || this.#initialPosition[1] !== this.y); + } + getBaseTranslation() { + const [parentWidth, parentHeight] = this.parentDimensions; + const { + _borderLineWidth + } = AnnotationEditor; + const x = _borderLineWidth / parentWidth; + const y = _borderLineWidth / parentHeight; + switch (this.rotation) { + case 90: + return [-x, y]; + case 180: + return [x, y]; + case 270: + return [x, -y]; + default: + return [-x, -y]; + } + } + get _mustFixPosition() { + return true; + } + fixAndSetPosition(rotation = this.rotation) { + const [pageWidth, pageHeight] = this.pageDimensions; + let { + x, + y, + width, + height + } = this; + width *= pageWidth; + height *= pageHeight; + x *= pageWidth; + y *= pageHeight; + if (this._mustFixPosition) { + switch (rotation) { + case 0: + x = Math.max(0, Math.min(pageWidth - width, x)); + y = Math.max(0, Math.min(pageHeight - height, y)); + break; + case 90: + x = Math.max(0, Math.min(pageWidth - height, x)); + y = Math.min(pageHeight, Math.max(width, y)); + break; + case 180: + x = Math.min(pageWidth, Math.max(width, x)); + y = Math.min(pageHeight, Math.max(height, y)); + break; + case 270: + x = Math.min(pageWidth, Math.max(height, x)); + y = Math.max(0, Math.min(pageHeight - width, y)); + break; + } + } + this.x = x /= pageWidth; + this.y = y /= pageHeight; + const [bx, by] = this.getBaseTranslation(); + x += bx; + y += by; + const { + style + } = this.div; + style.left = `${(100 * x).toFixed(2)}%`; + style.top = `${(100 * y).toFixed(2)}%`; + this.moveInDOM(); + } + static #rotatePoint(x, y, angle) { + switch (angle) { + case 90: + return [y, -x]; + case 180: + return [-x, -y]; + case 270: + return [-y, x]; + default: + return [x, y]; + } + } + screenToPageTranslation(x, y) { + return AnnotationEditor.#rotatePoint(x, y, this.parentRotation); + } + pageTranslationToScreen(x, y) { + return AnnotationEditor.#rotatePoint(x, y, 360 - this.parentRotation); + } + #getRotationMatrix(rotation) { + switch (rotation) { + case 90: + { + const [pageWidth, pageHeight] = this.pageDimensions; + return [0, -pageWidth / pageHeight, pageHeight / pageWidth, 0]; + } + case 180: + return [-1, 0, 0, -1]; + case 270: + { + const [pageWidth, pageHeight] = this.pageDimensions; + return [0, pageWidth / pageHeight, -pageHeight / pageWidth, 0]; + } + default: + return [1, 0, 0, 1]; + } + } + get parentScale() { + return this._uiManager.viewParameters.realScale; + } + get parentRotation() { + return (this._uiManager.viewParameters.rotation + this.pageRotation) % 360; + } + get parentDimensions() { + const { + parentScale, + pageDimensions: [pageWidth, pageHeight] + } = this; + const scaledWidth = pageWidth * parentScale; + const scaledHeight = pageHeight * parentScale; + return util_FeatureTest.isCSSRoundSupported ? [Math.round(scaledWidth), Math.round(scaledHeight)] : [scaledWidth, scaledHeight]; + } + setDims(width, height) { + const [parentWidth, parentHeight] = this.parentDimensions; + this.div.style.width = `${(100 * width / parentWidth).toFixed(2)}%`; + if (!this.#keepAspectRatio) { + this.div.style.height = `${(100 * height / parentHeight).toFixed(2)}%`; + } + } + fixDims() { + const { + style + } = this.div; + const { + height, + width + } = style; + const widthPercent = width.endsWith("%"); + const heightPercent = !this.#keepAspectRatio && height.endsWith("%"); + if (widthPercent && heightPercent) { + return; + } + const [parentWidth, parentHeight] = this.parentDimensions; + if (!widthPercent) { + style.width = `${(100 * parseFloat(width) / parentWidth).toFixed(2)}%`; + } + if (!this.#keepAspectRatio && !heightPercent) { + style.height = `${(100 * parseFloat(height) / parentHeight).toFixed(2)}%`; + } + } + getInitialTranslation() { + return [0, 0]; + } + #createResizers() { + if (this.#resizersDiv) { + return; + } + this.#resizersDiv = document.createElement("div"); + this.#resizersDiv.classList.add("resizers"); + const classes = this._willKeepAspectRatio ? ["topLeft", "topRight", "bottomRight", "bottomLeft"] : ["topLeft", "topMiddle", "topRight", "middleRight", "bottomRight", "bottomMiddle", "bottomLeft", "middleLeft"]; + const signal = this._uiManager._signal; + for (const name of classes) { + const div = document.createElement("div"); + this.#resizersDiv.append(div); + div.classList.add("resizer", name); + div.setAttribute("data-resizer-name", name); + div.addEventListener("pointerdown", this.#resizerPointerdown.bind(this, name), { + signal + }); + div.addEventListener("contextmenu", noContextMenu, { + signal + }); + div.tabIndex = -1; + } + this.div.prepend(this.#resizersDiv); + } + #resizerPointerdown(name, event) { + event.preventDefault(); + const { + isMac + } = util_FeatureTest.platform; + if (event.button !== 0 || event.ctrlKey && isMac) { + return; + } + this.#altText?.toggle(false); + const boundResizerPointermove = this.#resizerPointermove.bind(this, name); + const savedDraggable = this._isDraggable; + this._isDraggable = false; + const signal = this._uiManager._signal; + const pointerMoveOptions = { + passive: true, + capture: true, + signal + }; + this.parent.togglePointerEvents(false); + window.addEventListener("pointermove", boundResizerPointermove, pointerMoveOptions); + window.addEventListener("contextmenu", noContextMenu, { + signal + }); + const savedX = this.x; + const savedY = this.y; + const savedWidth = this.width; + const savedHeight = this.height; + const savedParentCursor = this.parent.div.style.cursor; + const savedCursor = this.div.style.cursor; + this.div.style.cursor = this.parent.div.style.cursor = window.getComputedStyle(event.target).cursor; + const pointerUpCallback = () => { + this.parent.togglePointerEvents(true); + this.#altText?.toggle(true); + this._isDraggable = savedDraggable; + window.removeEventListener("pointerup", pointerUpCallback); + window.removeEventListener("blur", pointerUpCallback); + window.removeEventListener("pointermove", boundResizerPointermove, pointerMoveOptions); + window.removeEventListener("contextmenu", noContextMenu); + this.parent.div.style.cursor = savedParentCursor; + this.div.style.cursor = savedCursor; + this.#addResizeToUndoStack(savedX, savedY, savedWidth, savedHeight); + }; + window.addEventListener("pointerup", pointerUpCallback, { + signal + }); + window.addEventListener("blur", pointerUpCallback, { + signal + }); + } + #addResizeToUndoStack(savedX, savedY, savedWidth, savedHeight) { + const newX = this.x; + const newY = this.y; + const newWidth = this.width; + const newHeight = this.height; + if (newX === savedX && newY === savedY && newWidth === savedWidth && newHeight === savedHeight) { + return; + } + this.addCommands({ + cmd: () => { + this.width = newWidth; + this.height = newHeight; + this.x = newX; + this.y = newY; + const [parentWidth, parentHeight] = this.parentDimensions; + this.setDims(parentWidth * newWidth, parentHeight * newHeight); + this.fixAndSetPosition(); + }, + undo: () => { + this.width = savedWidth; + this.height = savedHeight; + this.x = savedX; + this.y = savedY; + const [parentWidth, parentHeight] = this.parentDimensions; + this.setDims(parentWidth * savedWidth, parentHeight * savedHeight); + this.fixAndSetPosition(); + }, + mustExec: true + }); + } + #resizerPointermove(name, event) { + const [parentWidth, parentHeight] = this.parentDimensions; + const savedX = this.x; + const savedY = this.y; + const savedWidth = this.width; + const savedHeight = this.height; + const minWidth = AnnotationEditor.MIN_SIZE / parentWidth; + const minHeight = AnnotationEditor.MIN_SIZE / parentHeight; + const round = x => Math.round(x * 10000) / 10000; + const rotationMatrix = this.#getRotationMatrix(this.rotation); + const transf = (x, y) => [rotationMatrix[0] * x + rotationMatrix[2] * y, rotationMatrix[1] * x + rotationMatrix[3] * y]; + const invRotationMatrix = this.#getRotationMatrix(360 - this.rotation); + const invTransf = (x, y) => [invRotationMatrix[0] * x + invRotationMatrix[2] * y, invRotationMatrix[1] * x + invRotationMatrix[3] * y]; + let getPoint; + let getOpposite; + let isDiagonal = false; + let isHorizontal = false; + switch (name) { + case "topLeft": + isDiagonal = true; + getPoint = (w, h) => [0, 0]; + getOpposite = (w, h) => [w, h]; + break; + case "topMiddle": + getPoint = (w, h) => [w / 2, 0]; + getOpposite = (w, h) => [w / 2, h]; + break; + case "topRight": + isDiagonal = true; + getPoint = (w, h) => [w, 0]; + getOpposite = (w, h) => [0, h]; + break; + case "middleRight": + isHorizontal = true; + getPoint = (w, h) => [w, h / 2]; + getOpposite = (w, h) => [0, h / 2]; + break; + case "bottomRight": + isDiagonal = true; + getPoint = (w, h) => [w, h]; + getOpposite = (w, h) => [0, 0]; + break; + case "bottomMiddle": + getPoint = (w, h) => [w / 2, h]; + getOpposite = (w, h) => [w / 2, 0]; + break; + case "bottomLeft": + isDiagonal = true; + getPoint = (w, h) => [0, h]; + getOpposite = (w, h) => [w, 0]; + break; + case "middleLeft": + isHorizontal = true; + getPoint = (w, h) => [0, h / 2]; + getOpposite = (w, h) => [w, h / 2]; + break; + } + const point = getPoint(savedWidth, savedHeight); + const oppositePoint = getOpposite(savedWidth, savedHeight); + let transfOppositePoint = transf(...oppositePoint); + const oppositeX = round(savedX + transfOppositePoint[0]); + const oppositeY = round(savedY + transfOppositePoint[1]); + let ratioX = 1; + let ratioY = 1; + let [deltaX, deltaY] = this.screenToPageTranslation(event.movementX, event.movementY); + [deltaX, deltaY] = invTransf(deltaX / parentWidth, deltaY / parentHeight); + if (isDiagonal) { + const oldDiag = Math.hypot(savedWidth, savedHeight); + ratioX = ratioY = Math.max(Math.min(Math.hypot(oppositePoint[0] - point[0] - deltaX, oppositePoint[1] - point[1] - deltaY) / oldDiag, 1 / savedWidth, 1 / savedHeight), minWidth / savedWidth, minHeight / savedHeight); + } else if (isHorizontal) { + ratioX = Math.max(minWidth, Math.min(1, Math.abs(oppositePoint[0] - point[0] - deltaX))) / savedWidth; + } else { + ratioY = Math.max(minHeight, Math.min(1, Math.abs(oppositePoint[1] - point[1] - deltaY))) / savedHeight; + } + const newWidth = round(savedWidth * ratioX); + const newHeight = round(savedHeight * ratioY); + transfOppositePoint = transf(...getOpposite(newWidth, newHeight)); + const newX = oppositeX - transfOppositePoint[0]; + const newY = oppositeY - transfOppositePoint[1]; + this.width = newWidth; + this.height = newHeight; + this.x = newX; + this.y = newY; + this.setDims(parentWidth * newWidth, parentHeight * newHeight); + this.fixAndSetPosition(); + } + altTextFinish() { + this.#altText?.finish(); + } + async addEditToolbar() { + if (this.#editToolbar || this.#isInEditMode) { + return this.#editToolbar; + } + this.#editToolbar = new EditorToolbar(this); + this.div.append(this.#editToolbar.render()); + if (this.#altText) { + this.#editToolbar.addAltTextButton(await this.#altText.render()); + } + return this.#editToolbar; + } + removeEditToolbar() { + if (!this.#editToolbar) { + return; + } + this.#editToolbar.remove(); + this.#editToolbar = null; + this.#altText?.destroy(); + } + getClientDimensions() { + return this.div.getBoundingClientRect(); + } + async addAltTextButton() { + if (this.#altText) { + return; + } + AltText.initialize(AnnotationEditor._l10nPromise); + this.#altText = new AltText(this); + if (this.#accessibilityData) { + this.#altText.data = this.#accessibilityData; + this.#accessibilityData = null; + } + await this.addEditToolbar(); + } + get altTextData() { + return this.#altText?.data; + } + set altTextData(data) { + if (!this.#altText) { + return; + } + this.#altText.data = data; + } + hasAltText() { + return !this.#altText?.isEmpty(); + } + render() { + this.div = document.createElement("div"); + this.div.setAttribute("data-editor-rotation", (360 - this.rotation) % 360); + this.div.className = this.name; + this.div.setAttribute("id", this.id); + this.div.tabIndex = this.#disabled ? -1 : 0; + if (!this._isVisible) { + this.div.classList.add("hidden"); + } + this.setInForeground(); + const signal = this._uiManager._signal; + this.div.addEventListener("focusin", this.#boundFocusin, { + signal + }); + this.div.addEventListener("focusout", this.#boundFocusout, { + signal + }); + const [parentWidth, parentHeight] = this.parentDimensions; + if (this.parentRotation % 180 !== 0) { + this.div.style.maxWidth = `${(100 * parentHeight / parentWidth).toFixed(2)}%`; + this.div.style.maxHeight = `${(100 * parentWidth / parentHeight).toFixed(2)}%`; + } + const [tx, ty] = this.getInitialTranslation(); + this.translate(tx, ty); + bindEvents(this, this.div, ["pointerdown"]); + return this.div; + } + pointerdown(event) { + const { + isMac + } = util_FeatureTest.platform; + if (event.button !== 0 || event.ctrlKey && isMac) { + event.preventDefault(); + return; + } + this.#hasBeenClicked = true; + if (this._isDraggable) { + this.#setUpDragSession(event); + return; + } + this.#selectOnPointerEvent(event); + } + #selectOnPointerEvent(event) { + const { + isMac + } = util_FeatureTest.platform; + if (event.ctrlKey && !isMac || event.shiftKey || event.metaKey && isMac) { + this.parent.toggleSelected(this); + } else { + this.parent.setSelected(this); + } + } + #setUpDragSession(event) { + const isSelected = this._uiManager.isSelected(this); + this._uiManager.setUpDragSession(); + let pointerMoveOptions, pointerMoveCallback; + const signal = this._uiManager._signal; + if (isSelected) { + this.div.classList.add("moving"); + pointerMoveOptions = { + passive: true, + capture: true, + signal + }; + this.#prevDragX = event.clientX; + this.#prevDragY = event.clientY; + pointerMoveCallback = e => { + const { + clientX: x, + clientY: y + } = e; + const [tx, ty] = this.screenToPageTranslation(x - this.#prevDragX, y - this.#prevDragY); + this.#prevDragX = x; + this.#prevDragY = y; + this._uiManager.dragSelectedEditors(tx, ty); + }; + window.addEventListener("pointermove", pointerMoveCallback, pointerMoveOptions); + } + const pointerUpCallback = () => { + window.removeEventListener("pointerup", pointerUpCallback); + window.removeEventListener("blur", pointerUpCallback); + if (isSelected) { + this.div.classList.remove("moving"); + window.removeEventListener("pointermove", pointerMoveCallback, pointerMoveOptions); + } + this.#hasBeenClicked = false; + if (!this._uiManager.endDragSession()) { + this.#selectOnPointerEvent(event); + } + }; + window.addEventListener("pointerup", pointerUpCallback, { + signal + }); + window.addEventListener("blur", pointerUpCallback, { + signal + }); + } + moveInDOM() { + if (this.#moveInDOMTimeout) { + clearTimeout(this.#moveInDOMTimeout); + } + this.#moveInDOMTimeout = setTimeout(() => { + this.#moveInDOMTimeout = null; + this.parent?.moveEditorInDOM(this); + }, 0); + } + _setParentAndPosition(parent, x, y) { + parent.changeParent(this); + this.x = x; + this.y = y; + this.fixAndSetPosition(); + } + getRect(tx, ty, rotation = this.rotation) { + const scale = this.parentScale; + const [pageWidth, pageHeight] = this.pageDimensions; + const [pageX, pageY] = this.pageTranslation; + const shiftX = tx / scale; + const shiftY = ty / scale; + const x = this.x * pageWidth; + const y = this.y * pageHeight; + const width = this.width * pageWidth; + const height = this.height * pageHeight; + switch (rotation) { + case 0: + return [x + shiftX + pageX, pageHeight - y - shiftY - height + pageY, x + shiftX + width + pageX, pageHeight - y - shiftY + pageY]; + case 90: + return [x + shiftY + pageX, pageHeight - y + shiftX + pageY, x + shiftY + height + pageX, pageHeight - y + shiftX + width + pageY]; + case 180: + return [x - shiftX - width + pageX, pageHeight - y + shiftY + pageY, x - shiftX + pageX, pageHeight - y + shiftY + height + pageY]; + case 270: + return [x - shiftY - height + pageX, pageHeight - y - shiftX - width + pageY, x - shiftY + pageX, pageHeight - y - shiftX + pageY]; + default: + throw new Error("Invalid rotation"); + } + } + getRectInCurrentCoords(rect, pageHeight) { + const [x1, y1, x2, y2] = rect; + const width = x2 - x1; + const height = y2 - y1; + switch (this.rotation) { + case 0: + return [x1, pageHeight - y2, width, height]; + case 90: + return [x1, pageHeight - y1, height, width]; + case 180: + return [x2, pageHeight - y1, width, height]; + case 270: + return [x2, pageHeight - y2, height, width]; + default: + throw new Error("Invalid rotation"); + } + } + onceAdded() {} + isEmpty() { + return false; + } + enableEditMode() { + this.#isInEditMode = true; + } + disableEditMode() { + this.#isInEditMode = false; + } + isInEditMode() { + return this.#isInEditMode; + } + shouldGetKeyboardEvents() { + return this.#isResizerEnabledForKeyboard; + } + needsToBeRebuilt() { + return this.div && !this.isAttachedToDOM; + } + rebuild() { + const signal = this._uiManager._signal; + this.div?.addEventListener("focusin", this.#boundFocusin, { + signal + }); + this.div?.addEventListener("focusout", this.#boundFocusout, { + signal + }); + } + rotate(_angle) {} + serialize(isForCopying = false, context = null) { + unreachable("An editor must be serializable"); + } + static deserialize(data, parent, uiManager) { + const editor = new this.prototype.constructor({ + parent, + id: parent.getNextId(), + uiManager + }); + editor.rotation = data.rotation; + editor.#accessibilityData = data.accessibilityData; + const [pageWidth, pageHeight] = editor.pageDimensions; + const [x, y, width, height] = editor.getRectInCurrentCoords(data.rect, pageHeight); + editor.x = x / pageWidth; + editor.y = y / pageHeight; + editor.width = width / pageWidth; + editor.height = height / pageHeight; + return editor; + } + get hasBeenModified() { + return !!this.annotationElementId && (this.deleted || this.serialize() !== null); + } + remove() { + this.div.removeEventListener("focusin", this.#boundFocusin); + this.div.removeEventListener("focusout", this.#boundFocusout); + if (!this.isEmpty()) { + this.commit(); + } + if (this.parent) { + this.parent.remove(this); + } else { + this._uiManager.removeEditor(this); + } + if (this.#moveInDOMTimeout) { + clearTimeout(this.#moveInDOMTimeout); + this.#moveInDOMTimeout = null; + } + this.#stopResizing(); + this.removeEditToolbar(); + if (this.#telemetryTimeouts) { + for (const timeout of this.#telemetryTimeouts.values()) { + clearTimeout(timeout); + } + this.#telemetryTimeouts = null; + } + this.parent = null; + } + get isResizable() { + return false; + } + makeResizable() { + if (this.isResizable) { + this.#createResizers(); + this.#resizersDiv.classList.remove("hidden"); + bindEvents(this, this.div, ["keydown"]); + } + } + get toolbarPosition() { + return null; + } + keydown(event) { + if (!this.isResizable || event.target !== this.div || event.key !== "Enter") { + return; + } + this._uiManager.setSelected(this); + this.#savedDimensions = { + savedX: this.x, + savedY: this.y, + savedWidth: this.width, + savedHeight: this.height + }; + const children = this.#resizersDiv.children; + if (!this.#allResizerDivs) { + this.#allResizerDivs = Array.from(children); + const boundResizerKeydown = this.#resizerKeydown.bind(this); + const boundResizerBlur = this.#resizerBlur.bind(this); + const signal = this._uiManager._signal; + for (const div of this.#allResizerDivs) { + const name = div.getAttribute("data-resizer-name"); + div.setAttribute("role", "spinbutton"); + div.addEventListener("keydown", boundResizerKeydown, { + signal + }); + div.addEventListener("blur", boundResizerBlur, { + signal + }); + div.addEventListener("focus", this.#resizerFocus.bind(this, name), { + signal + }); + AnnotationEditor._l10nPromise.get(`pdfjs-editor-resizer-label-${name}`).then(msg => div.setAttribute("aria-label", msg)); + } + } + const first = this.#allResizerDivs[0]; + let firstPosition = 0; + for (const div of children) { + if (div === first) { + break; + } + firstPosition++; + } + const nextFirstPosition = (360 - this.rotation + this.parentRotation) % 360 / 90 * (this.#allResizerDivs.length / 4); + if (nextFirstPosition !== firstPosition) { + if (nextFirstPosition < firstPosition) { + for (let i = 0; i < firstPosition - nextFirstPosition; i++) { + this.#resizersDiv.append(this.#resizersDiv.firstChild); + } + } else if (nextFirstPosition > firstPosition) { + for (let i = 0; i < nextFirstPosition - firstPosition; i++) { + this.#resizersDiv.firstChild.before(this.#resizersDiv.lastChild); + } + } + let i = 0; + for (const child of children) { + const div = this.#allResizerDivs[i++]; + const name = div.getAttribute("data-resizer-name"); + AnnotationEditor._l10nPromise.get(`pdfjs-editor-resizer-label-${name}`).then(msg => child.setAttribute("aria-label", msg)); + } + } + this.#setResizerTabIndex(0); + this.#isResizerEnabledForKeyboard = true; + this.#resizersDiv.firstChild.focus({ + focusVisible: true + }); + event.preventDefault(); + event.stopImmediatePropagation(); + } + #resizerKeydown(event) { + AnnotationEditor._resizerKeyboardManager.exec(this, event); + } + #resizerBlur(event) { + if (this.#isResizerEnabledForKeyboard && event.relatedTarget?.parentNode !== this.#resizersDiv) { + this.#stopResizing(); + } + } + #resizerFocus(name) { + this.#focusedResizerName = this.#isResizerEnabledForKeyboard ? name : ""; + } + #setResizerTabIndex(value) { + if (!this.#allResizerDivs) { + return; + } + for (const div of this.#allResizerDivs) { + div.tabIndex = value; + } + } + _resizeWithKeyboard(x, y) { + if (!this.#isResizerEnabledForKeyboard) { + return; + } + this.#resizerPointermove(this.#focusedResizerName, { + movementX: x, + movementY: y + }); + } + #stopResizing() { + this.#isResizerEnabledForKeyboard = false; + this.#setResizerTabIndex(-1); + if (this.#savedDimensions) { + const { + savedX, + savedY, + savedWidth, + savedHeight + } = this.#savedDimensions; + this.#addResizeToUndoStack(savedX, savedY, savedWidth, savedHeight); + this.#savedDimensions = null; + } + } + _stopResizingWithKeyboard() { + this.#stopResizing(); + this.div.focus(); + } + select() { + this.makeResizable(); + this.div?.classList.add("selectedEditor"); + if (!this.#editToolbar) { + this.addEditToolbar().then(() => { + if (this.div?.classList.contains("selectedEditor")) { + this.#editToolbar?.show(); + } + }); + return; + } + this.#editToolbar?.show(); + } + unselect() { + this.#resizersDiv?.classList.add("hidden"); + this.div?.classList.remove("selectedEditor"); + if (this.div?.contains(document.activeElement)) { + this._uiManager.currentLayer.div.focus({ + preventScroll: true + }); + } + this.#editToolbar?.hide(); + } + updateParams(type, value) {} + disableEditing() {} + enableEditing() {} + enterInEditMode() {} + getImageForAltText() { + return null; + } + get contentDiv() { + return this.div; + } + get isEditing() { + return this.#isEditing; + } + set isEditing(value) { + this.#isEditing = value; + if (!this.parent) { + return; + } + if (value) { + this.parent.setSelected(this); + this.parent.setActiveEditor(this); + } else { + this.parent.setActiveEditor(null); + } + } + setAspectRatio(width, height) { + this.#keepAspectRatio = true; + const aspectRatio = width / height; + const { + style + } = this.div; + style.aspectRatio = aspectRatio; + style.height = "auto"; + } + static get MIN_SIZE() { + return 16; + } + static canCreateNewEmptyEditor() { + return true; + } + get telemetryInitialData() { + return { + action: "added" + }; + } + get telemetryFinalData() { + return null; + } + _reportTelemetry(data, mustWait = false) { + if (mustWait) { + this.#telemetryTimeouts ||= new Map(); + const { + action + } = data; + let timeout = this.#telemetryTimeouts.get(action); + if (timeout) { + clearTimeout(timeout); + } + timeout = setTimeout(() => { + this._reportTelemetry(data); + this.#telemetryTimeouts.delete(action); + if (this.#telemetryTimeouts.size === 0) { + this.#telemetryTimeouts = null; + } + }, AnnotationEditor._telemetryTimeout); + this.#telemetryTimeouts.set(action, timeout); + return; + } + data.type ||= this.editorType; + this._uiManager._eventBus.dispatch("reporttelemetry", { + source: this, + details: { + type: "editing", + data + } + }); + } + show(visible = this._isVisible) { + this.div.classList.toggle("hidden", !visible); + this._isVisible = visible; + } + enable() { + if (this.div) { + this.div.tabIndex = 0; + } + this.#disabled = false; + } + disable() { + if (this.div) { + this.div.tabIndex = -1; + } + this.#disabled = true; + } + renderAnnotationElement(annotation) { + let content = annotation.container.querySelector(".annotationContent"); + if (!content) { + content = document.createElement("div"); + content.classList.add("annotationContent", this.editorType); + annotation.container.prepend(content); + } else if (content.nodeName === "CANVAS") { + const canvas = content; + content = document.createElement("div"); + content.classList.add("annotationContent", this.editorType); + canvas.before(content); + } + return content; + } + resetAnnotationElement(annotation) { + const { + firstChild + } = annotation.container; + if (firstChild.nodeName === "DIV" && firstChild.classList.contains("annotationContent")) { + firstChild.remove(); + } + } +} +class FakeEditor extends AnnotationEditor { + constructor(params) { + super(params); + this.annotationElementId = params.annotationElementId; + this.deleted = true; + } + serialize() { + return { + id: this.annotationElementId, + deleted: true, + pageIndex: this.pageIndex + }; + } +} + +;// CONCATENATED MODULE: ./src/shared/murmurhash3.js +const SEED = 0xc3d2e1f0; +const MASK_HIGH = 0xffff0000; +const MASK_LOW = 0xffff; +class MurmurHash3_64 { + constructor(seed) { + this.h1 = seed ? seed & 0xffffffff : SEED; + this.h2 = seed ? seed & 0xffffffff : SEED; + } + update(input) { + let data, length; + if (typeof input === "string") { + data = new Uint8Array(input.length * 2); + length = 0; + for (let i = 0, ii = input.length; i < ii; i++) { + const code = input.charCodeAt(i); + if (code <= 0xff) { + data[length++] = code; + } else { + data[length++] = code >>> 8; + data[length++] = code & 0xff; + } + } + } else if (ArrayBuffer.isView(input)) { + data = input.slice(); + length = data.byteLength; + } else { + throw new Error("Invalid data format, must be a string or TypedArray."); + } + const blockCounts = length >> 2; + const tailLength = length - blockCounts * 4; + const dataUint32 = new Uint32Array(data.buffer, 0, blockCounts); + let k1 = 0, + k2 = 0; + let h1 = this.h1, + h2 = this.h2; + const C1 = 0xcc9e2d51, + C2 = 0x1b873593; + const C1_LOW = C1 & MASK_LOW, + C2_LOW = C2 & MASK_LOW; + for (let i = 0; i < blockCounts; i++) { + if (i & 1) { + k1 = dataUint32[i]; + k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW; + k1 = k1 << 15 | k1 >>> 17; + k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW; + h1 ^= k1; + h1 = h1 << 13 | h1 >>> 19; + h1 = h1 * 5 + 0xe6546b64; + } else { + k2 = dataUint32[i]; + k2 = k2 * C1 & MASK_HIGH | k2 * C1_LOW & MASK_LOW; + k2 = k2 << 15 | k2 >>> 17; + k2 = k2 * C2 & MASK_HIGH | k2 * C2_LOW & MASK_LOW; + h2 ^= k2; + h2 = h2 << 13 | h2 >>> 19; + h2 = h2 * 5 + 0xe6546b64; + } + } + k1 = 0; + switch (tailLength) { + case 3: + k1 ^= data[blockCounts * 4 + 2] << 16; + case 2: + k1 ^= data[blockCounts * 4 + 1] << 8; + case 1: + k1 ^= data[blockCounts * 4]; + k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW; + k1 = k1 << 15 | k1 >>> 17; + k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW; + if (blockCounts & 1) { + h1 ^= k1; + } else { + h2 ^= k1; + } + } + this.h1 = h1; + this.h2 = h2; + } + hexdigest() { + let h1 = this.h1, + h2 = this.h2; + h1 ^= h2 >>> 1; + h1 = h1 * 0xed558ccd & MASK_HIGH | h1 * 0x8ccd & MASK_LOW; + h2 = h2 * 0xff51afd7 & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xafd7ed55 & MASK_HIGH) >>> 16; + h1 ^= h2 >>> 1; + h1 = h1 * 0x1a85ec53 & MASK_HIGH | h1 * 0xec53 & MASK_LOW; + h2 = h2 * 0xc4ceb9fe & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xb9fe1a85 & MASK_HIGH) >>> 16; + h1 ^= h2 >>> 1; + return (h1 >>> 0).toString(16).padStart(8, "0") + (h2 >>> 0).toString(16).padStart(8, "0"); + } +} + +;// CONCATENATED MODULE: ./src/display/annotation_storage.js + + + +const SerializableEmpty = Object.freeze({ + map: null, + hash: "", + transfer: undefined +}); +class AnnotationStorage { + #modified = false; + #storage = new Map(); + constructor() { + this.onSetModified = null; + this.onResetModified = null; + this.onAnnotationEditor = null; + } + getValue(key, defaultValue) { + const value = this.#storage.get(key); + if (value === undefined) { + return defaultValue; + } + return Object.assign(defaultValue, value); + } + getRawValue(key) { + return this.#storage.get(key); + } + remove(key) { + this.#storage.delete(key); + if (this.#storage.size === 0) { + this.resetModified(); + } + if (typeof this.onAnnotationEditor === "function") { + for (const value of this.#storage.values()) { + if (value instanceof AnnotationEditor) { + return; + } + } + this.onAnnotationEditor(null); + } + } + setValue(key, value) { + const obj = this.#storage.get(key); + let modified = false; + if (obj !== undefined) { + for (const [entry, val] of Object.entries(value)) { + if (obj[entry] !== val) { + modified = true; + obj[entry] = val; + } + } + } else { + modified = true; + this.#storage.set(key, value); + } + if (modified) { + this.#setModified(); + } + if (value instanceof AnnotationEditor && typeof this.onAnnotationEditor === "function") { + this.onAnnotationEditor(value.constructor._type); + } + } + has(key) { + return this.#storage.has(key); + } + getAll() { + return this.#storage.size > 0 ? objectFromMap(this.#storage) : null; + } + setAll(obj) { + for (const [key, val] of Object.entries(obj)) { + this.setValue(key, val); + } + } + get size() { + return this.#storage.size; + } + #setModified() { + if (!this.#modified) { + this.#modified = true; + if (typeof this.onSetModified === "function") { + this.onSetModified(); + } + } + } + resetModified() { + if (this.#modified) { + this.#modified = false; + if (typeof this.onResetModified === "function") { + this.onResetModified(); + } + } + } + get print() { + return new PrintAnnotationStorage(this); + } + get serializable() { + if (this.#storage.size === 0) { + return SerializableEmpty; + } + const map = new Map(), + hash = new MurmurHash3_64(), + transfer = []; + const context = Object.create(null); + let hasBitmap = false; + for (const [key, val] of this.#storage) { + const serialized = val instanceof AnnotationEditor ? val.serialize(false, context) : val; + if (serialized) { + map.set(key, serialized); + hash.update(`${key}:${JSON.stringify(serialized)}`); + hasBitmap ||= !!serialized.bitmap; + } + } + if (hasBitmap) { + for (const value of map.values()) { + if (value.bitmap) { + transfer.push(value.bitmap); + } + } + } + return map.size > 0 ? { + map, + hash: hash.hexdigest(), + transfer + } : SerializableEmpty; + } + get editorStats() { + let stats = null; + const typeToEditor = new Map(); + for (const value of this.#storage.values()) { + if (!(value instanceof AnnotationEditor)) { + continue; + } + const editorStats = value.telemetryFinalData; + if (!editorStats) { + continue; + } + const { + type + } = editorStats; + if (!typeToEditor.has(type)) { + typeToEditor.set(type, Object.getPrototypeOf(value).constructor); + } + stats ||= Object.create(null); + const map = stats[type] ||= new Map(); + for (const [key, val] of Object.entries(editorStats)) { + if (key === "type") { + continue; + } + let counters = map.get(key); + if (!counters) { + counters = new Map(); + map.set(key, counters); + } + const count = counters.get(val) ?? 0; + counters.set(val, count + 1); + } + } + for (const [type, editor] of typeToEditor) { + stats[type] = editor.computeTelemetryFinalData(stats[type]); + } + return stats; + } +} +class PrintAnnotationStorage extends AnnotationStorage { + #serializable; + constructor(parent) { + super(); + const { + map, + hash, + transfer + } = parent.serializable; + const clone = structuredClone(map, transfer ? { + transfer + } : null); + this.#serializable = { + map: clone, + hash, + transfer + }; + } + get print() { + unreachable("Should not call PrintAnnotationStorage.print"); + } + get serializable() { + return this.#serializable; + } +} + +;// CONCATENATED MODULE: ./src/display/font_loader.js + +class FontLoader { + #systemFonts = new Set(); + constructor({ + ownerDocument = globalThis.document, + styleElement = null + }) { + this._document = ownerDocument; + this.nativeFontFaces = new Set(); + this.styleElement = null; + this.loadingRequests = []; + this.loadTestFontId = 0; + } + addNativeFontFace(nativeFontFace) { + this.nativeFontFaces.add(nativeFontFace); + this._document.fonts.add(nativeFontFace); + } + removeNativeFontFace(nativeFontFace) { + this.nativeFontFaces.delete(nativeFontFace); + this._document.fonts.delete(nativeFontFace); + } + insertRule(rule) { + if (!this.styleElement) { + this.styleElement = this._document.createElement("style"); + this._document.documentElement.getElementsByTagName("head")[0].append(this.styleElement); + } + const styleSheet = this.styleElement.sheet; + styleSheet.insertRule(rule, styleSheet.cssRules.length); + } + clear() { + for (const nativeFontFace of this.nativeFontFaces) { + this._document.fonts.delete(nativeFontFace); + } + this.nativeFontFaces.clear(); + this.#systemFonts.clear(); + if (this.styleElement) { + this.styleElement.remove(); + this.styleElement = null; + } + } + async loadSystemFont({ + systemFontInfo: info, + _inspectFont + }) { + if (!info || this.#systemFonts.has(info.loadedName)) { + return; + } + assert(!this.disableFontFace, "loadSystemFont shouldn't be called when `disableFontFace` is set."); + if (this.isFontLoadingAPISupported) { + const { + loadedName, + src, + style + } = info; + const fontFace = new FontFace(loadedName, src, style); + this.addNativeFontFace(fontFace); + try { + await fontFace.load(); + this.#systemFonts.add(loadedName); + _inspectFont?.(info); + } catch { + warn(`Cannot load system font: ${info.baseFontName}, installing it could help to improve PDF rendering.`); + this.removeNativeFontFace(fontFace); + } + return; + } + unreachable("Not implemented: loadSystemFont without the Font Loading API."); + } + async bind(font) { + if (font.attached || font.missingFile && !font.systemFontInfo) { + return; + } + font.attached = true; + if (font.systemFontInfo) { + await this.loadSystemFont(font); + return; + } + if (this.isFontLoadingAPISupported) { + const nativeFontFace = font.createNativeFontFace(); + if (nativeFontFace) { + this.addNativeFontFace(nativeFontFace); + try { + await nativeFontFace.loaded; + } catch (ex) { + warn(`Failed to load font '${nativeFontFace.family}': '${ex}'.`); + font.disableFontFace = true; + throw ex; + } + } + return; + } + const rule = font.createFontFaceRule(); + if (rule) { + this.insertRule(rule); + if (this.isSyncFontLoadingSupported) { + return; + } + await new Promise(resolve => { + const request = this._queueLoadingCallback(resolve); + this._prepareFontLoadEvent(font, request); + }); + } + } + get isFontLoadingAPISupported() { + const hasFonts = !!this._document?.fonts; + return shadow(this, "isFontLoadingAPISupported", hasFonts); + } + get isSyncFontLoadingSupported() { + let supported = false; + if (isNodeJS) { + supported = true; + } else if (typeof navigator !== "undefined" && typeof navigator?.userAgent === "string" && /Mozilla\/5.0.*?rv:\d+.*? Gecko/.test(navigator.userAgent)) { + supported = true; + } + return shadow(this, "isSyncFontLoadingSupported", supported); + } + _queueLoadingCallback(callback) { + function completeRequest() { + assert(!request.done, "completeRequest() cannot be called twice."); + request.done = true; + while (loadingRequests.length > 0 && loadingRequests[0].done) { + const otherRequest = loadingRequests.shift(); + setTimeout(otherRequest.callback, 0); + } + } + const { + loadingRequests + } = this; + const request = { + done: false, + complete: completeRequest, + callback + }; + loadingRequests.push(request); + return request; + } + get _loadTestFont() { + const testFont = atob("T1RUTwALAIAAAwAwQ0ZGIDHtZg4AAAOYAAAAgUZGVE1lkzZwAAAEHAAAABxHREVGABQA" + "FQAABDgAAAAeT1MvMlYNYwkAAAEgAAAAYGNtYXABDQLUAAACNAAAAUJoZWFk/xVFDQAA" + "ALwAAAA2aGhlYQdkA+oAAAD0AAAAJGhtdHgD6AAAAAAEWAAAAAZtYXhwAAJQAAAAARgA" + "AAAGbmFtZVjmdH4AAAGAAAAAsXBvc3T/hgAzAAADeAAAACAAAQAAAAEAALZRFsRfDzz1" + "AAsD6AAAAADOBOTLAAAAAM4KHDwAAAAAA+gDIQAAAAgAAgAAAAAAAAABAAADIQAAAFoD" + "6AAAAAAD6AABAAAAAAAAAAAAAAAAAAAAAQAAUAAAAgAAAAQD6AH0AAUAAAKKArwAAACM" + "AooCvAAAAeAAMQECAAACAAYJAAAAAAAAAAAAAQAAAAAAAAAAAAAAAFBmRWQAwAAuAC4D" + "IP84AFoDIQAAAAAAAQAAAAAAAAAAACAAIAABAAAADgCuAAEAAAAAAAAAAQAAAAEAAAAA" + "AAEAAQAAAAEAAAAAAAIAAQAAAAEAAAAAAAMAAQAAAAEAAAAAAAQAAQAAAAEAAAAAAAUA" + "AQAAAAEAAAAAAAYAAQAAAAMAAQQJAAAAAgABAAMAAQQJAAEAAgABAAMAAQQJAAIAAgAB" + "AAMAAQQJAAMAAgABAAMAAQQJAAQAAgABAAMAAQQJAAUAAgABAAMAAQQJAAYAAgABWABY" + "AAAAAAAAAwAAAAMAAAAcAAEAAAAAADwAAwABAAAAHAAEACAAAAAEAAQAAQAAAC7//wAA" + "AC7////TAAEAAAAAAAABBgAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAD/gwAyAAAAAQAAAAAAAAAAAAAAAAAA" + "AAABAAQEAAEBAQJYAAEBASH4DwD4GwHEAvgcA/gXBIwMAYuL+nz5tQXkD5j3CBLnEQAC" + "AQEBIVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYAAABAQAADwACAQEEE/t3" + "Dov6fAH6fAT+fPp8+nwHDosMCvm1Cvm1DAz6fBQAAAAAAAABAAAAAMmJbzEAAAAAzgTj" + "FQAAAADOBOQpAAEAAAAAAAAADAAUAAQAAAABAAAAAgABAAAAAAAAAAAD6AAAAAAAAA=="); + return shadow(this, "_loadTestFont", testFont); + } + _prepareFontLoadEvent(font, request) { + function int32(data, offset) { + return data.charCodeAt(offset) << 24 | data.charCodeAt(offset + 1) << 16 | data.charCodeAt(offset + 2) << 8 | data.charCodeAt(offset + 3) & 0xff; + } + function spliceString(s, offset, remove, insert) { + const chunk1 = s.substring(0, offset); + const chunk2 = s.substring(offset + remove); + return chunk1 + insert + chunk2; + } + let i, ii; + const canvas = this._document.createElement("canvas"); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext("2d"); + let called = 0; + function isFontReady(name, callback) { + if (++called > 30) { + warn("Load test font never loaded."); + callback(); + return; + } + ctx.font = "30px " + name; + ctx.fillText(".", 0, 20); + const imageData = ctx.getImageData(0, 0, 1, 1); + if (imageData.data[3] > 0) { + callback(); + return; + } + setTimeout(isFontReady.bind(null, name, callback)); + } + const loadTestFontId = `lt${Date.now()}${this.loadTestFontId++}`; + let data = this._loadTestFont; + const COMMENT_OFFSET = 976; + data = spliceString(data, COMMENT_OFFSET, loadTestFontId.length, loadTestFontId); + const CFF_CHECKSUM_OFFSET = 16; + const XXXX_VALUE = 0x58585858; + let checksum = int32(data, CFF_CHECKSUM_OFFSET); + for (i = 0, ii = loadTestFontId.length - 3; i < ii; i += 4) { + checksum = checksum - XXXX_VALUE + int32(loadTestFontId, i) | 0; + } + if (i < loadTestFontId.length) { + checksum = checksum - XXXX_VALUE + int32(loadTestFontId + "XXX", i) | 0; + } + data = spliceString(data, CFF_CHECKSUM_OFFSET, 4, string32(checksum)); + const url = `url(data:font/opentype;base64,${btoa(data)});`; + const rule = `@font-face {font-family:"${loadTestFontId}";src:${url}}`; + this.insertRule(rule); + const div = this._document.createElement("div"); + div.style.visibility = "hidden"; + div.style.width = div.style.height = "10px"; + div.style.position = "absolute"; + div.style.top = div.style.left = "0px"; + for (const name of [font.loadedName, loadTestFontId]) { + const span = this._document.createElement("span"); + span.textContent = "Hi"; + span.style.fontFamily = name; + div.append(span); + } + this._document.body.append(div); + isFontReady(loadTestFontId, () => { + div.remove(); + request.complete(); + }); + } +} +class FontFaceObject { + constructor(translatedData, { + disableFontFace = false, + inspectFont = null + }) { + this.compiledGlyphs = Object.create(null); + for (const i in translatedData) { + this[i] = translatedData[i]; + } + this.disableFontFace = disableFontFace === true; + this._inspectFont = inspectFont; + } + createNativeFontFace() { + if (!this.data || this.disableFontFace) { + return null; + } + let nativeFontFace; + if (!this.cssFontInfo) { + nativeFontFace = new FontFace(this.loadedName, this.data, {}); + } else { + const css = { + weight: this.cssFontInfo.fontWeight + }; + if (this.cssFontInfo.italicAngle) { + css.style = `oblique ${this.cssFontInfo.italicAngle}deg`; + } + nativeFontFace = new FontFace(this.cssFontInfo.fontFamily, this.data, css); + } + this._inspectFont?.(this); + return nativeFontFace; + } + createFontFaceRule() { + if (!this.data || this.disableFontFace) { + return null; + } + const data = bytesToString(this.data); + const url = `url(data:${this.mimetype};base64,${btoa(data)});`; + let rule; + if (!this.cssFontInfo) { + rule = `@font-face {font-family:"${this.loadedName}";src:${url}}`; + } else { + let css = `font-weight: ${this.cssFontInfo.fontWeight};`; + if (this.cssFontInfo.italicAngle) { + css += `font-style: oblique ${this.cssFontInfo.italicAngle}deg;`; + } + rule = `@font-face {font-family:"${this.cssFontInfo.fontFamily}";${css}src:${url}}`; + } + this._inspectFont?.(this, url); + return rule; + } + getPathGenerator(objs, character) { + if (this.compiledGlyphs[character] !== undefined) { + return this.compiledGlyphs[character]; + } + let cmds; + try { + cmds = objs.get(this.loadedName + "_path_" + character); + } catch (ex) { + warn(`getPathGenerator - ignoring character: "${ex}".`); + } + if (!Array.isArray(cmds) || cmds.length === 0) { + return this.compiledGlyphs[character] = function (c, size) {}; + } + const commands = []; + for (let i = 0, ii = cmds.length; i < ii;) { + switch (cmds[i++]) { + case FontRenderOps.BEZIER_CURVE_TO: + { + const [a, b, c, d, e, f] = cmds.slice(i, i + 6); + commands.push(ctx => ctx.bezierCurveTo(a, b, c, d, e, f)); + i += 6; + } + break; + case FontRenderOps.MOVE_TO: + { + const [a, b] = cmds.slice(i, i + 2); + commands.push(ctx => ctx.moveTo(a, b)); + i += 2; + } + break; + case FontRenderOps.LINE_TO: + { + const [a, b] = cmds.slice(i, i + 2); + commands.push(ctx => ctx.lineTo(a, b)); + i += 2; + } + break; + case FontRenderOps.QUADRATIC_CURVE_TO: + { + const [a, b, c, d] = cmds.slice(i, i + 4); + commands.push(ctx => ctx.quadraticCurveTo(a, b, c, d)); + i += 4; + } + break; + case FontRenderOps.RESTORE: + commands.push(ctx => ctx.restore()); + break; + case FontRenderOps.SAVE: + commands.push(ctx => ctx.save()); + break; + case FontRenderOps.SCALE: + assert(commands.length === 2, "Scale command is only valid at the third position."); + break; + case FontRenderOps.TRANSFORM: + { + const [a, b, c, d, e, f] = cmds.slice(i, i + 6); + commands.push(ctx => ctx.transform(a, b, c, d, e, f)); + i += 6; + } + break; + case FontRenderOps.TRANSLATE: + { + const [a, b] = cmds.slice(i, i + 2); + commands.push(ctx => ctx.translate(a, b)); + i += 2; + } + break; + } + } + return this.compiledGlyphs[character] = function glyphDrawer(ctx, size) { + commands[0](ctx); + commands[1](ctx); + ctx.scale(size, -size); + for (let i = 2, ii = commands.length; i < ii; i++) { + commands[i](ctx); + } + }; + } +} + +;// CONCATENATED MODULE: ./src/display/node_utils.js + + +if (isNodeJS) { + var packageCapability = Promise.withResolvers(); + var packageMap = null; + const loadPackages = async () => { + const fs = await import( /*webpackIgnore: true*/"fs"), + http = await import( /*webpackIgnore: true*/"http"), + https = await import( /*webpackIgnore: true*/"https"), + url = await import( /*webpackIgnore: true*/"url"); + let canvas, path2d; + return new Map(Object.entries({ + fs, + http, + https, + url, + canvas, + path2d + })); + }; + loadPackages().then(map => { + packageMap = map; + packageCapability.resolve(); + }, reason => { + warn(`loadPackages: ${reason}`); + packageMap = new Map(); + packageCapability.resolve(); + }); +} +class NodePackages { + static get promise() { + return packageCapability.promise; + } + static get(name) { + return packageMap?.get(name); + } +} +const node_utils_fetchData = function (url) { + const fs = NodePackages.get("fs"); + return fs.promises.readFile(url).then(data => new Uint8Array(data)); +}; +class NodeFilterFactory extends BaseFilterFactory {} +class NodeCanvasFactory extends BaseCanvasFactory { + _createCanvas(width, height) { + const canvas = NodePackages.get("canvas"); + return canvas.createCanvas(width, height); + } +} +class NodeCMapReaderFactory extends BaseCMapReaderFactory { + _fetchData(url, compressionType) { + return node_utils_fetchData(url).then(data => ({ + cMapData: data, + compressionType + })); + } +} +class NodeStandardFontDataFactory extends BaseStandardFontDataFactory { + _fetchData(url) { + return node_utils_fetchData(url); + } +} + +;// CONCATENATED MODULE: ./src/display/pattern_helper.js + + +const PathType = { + FILL: "Fill", + STROKE: "Stroke", + SHADING: "Shading" +}; +function applyBoundingBox(ctx, bbox) { + if (!bbox) { + return; + } + const width = bbox[2] - bbox[0]; + const height = bbox[3] - bbox[1]; + const region = new Path2D(); + region.rect(bbox[0], bbox[1], width, height); + ctx.clip(region); +} +class BaseShadingPattern { + constructor() { + if (this.constructor === BaseShadingPattern) { + unreachable("Cannot initialize BaseShadingPattern."); + } + } + getPattern() { + unreachable("Abstract method `getPattern` called."); + } +} +class RadialAxialShadingPattern extends BaseShadingPattern { + constructor(IR) { + super(); + this._type = IR[1]; + this._bbox = IR[2]; + this._colorStops = IR[3]; + this._p0 = IR[4]; + this._p1 = IR[5]; + this._r0 = IR[6]; + this._r1 = IR[7]; + this.matrix = null; + } + _createGradient(ctx) { + let grad; + if (this._type === "axial") { + grad = ctx.createLinearGradient(this._p0[0], this._p0[1], this._p1[0], this._p1[1]); + } else if (this._type === "radial") { + grad = ctx.createRadialGradient(this._p0[0], this._p0[1], this._r0, this._p1[0], this._p1[1], this._r1); + } + for (const colorStop of this._colorStops) { + grad.addColorStop(colorStop[0], colorStop[1]); + } + return grad; + } + getPattern(ctx, owner, inverse, pathType) { + let pattern; + if (pathType === PathType.STROKE || pathType === PathType.FILL) { + const ownerBBox = owner.current.getClippedPathBoundingBox(pathType, getCurrentTransform(ctx)) || [0, 0, 0, 0]; + const width = Math.ceil(ownerBBox[2] - ownerBBox[0]) || 1; + const height = Math.ceil(ownerBBox[3] - ownerBBox[1]) || 1; + const tmpCanvas = owner.cachedCanvases.getCanvas("pattern", width, height, true); + const tmpCtx = tmpCanvas.context; + tmpCtx.clearRect(0, 0, tmpCtx.canvas.width, tmpCtx.canvas.height); + tmpCtx.beginPath(); + tmpCtx.rect(0, 0, tmpCtx.canvas.width, tmpCtx.canvas.height); + tmpCtx.translate(-ownerBBox[0], -ownerBBox[1]); + inverse = Util.transform(inverse, [1, 0, 0, 1, ownerBBox[0], ownerBBox[1]]); + tmpCtx.transform(...owner.baseTransform); + if (this.matrix) { + tmpCtx.transform(...this.matrix); + } + applyBoundingBox(tmpCtx, this._bbox); + tmpCtx.fillStyle = this._createGradient(tmpCtx); + tmpCtx.fill(); + pattern = ctx.createPattern(tmpCanvas.canvas, "no-repeat"); + const domMatrix = new DOMMatrix(inverse); + pattern.setTransform(domMatrix); + } else { + applyBoundingBox(ctx, this._bbox); + pattern = this._createGradient(ctx); + } + return pattern; + } +} +function drawTriangle(data, context, p1, p2, p3, c1, c2, c3) { + const coords = context.coords, + colors = context.colors; + const bytes = data.data, + rowSize = data.width * 4; + let tmp; + if (coords[p1 + 1] > coords[p2 + 1]) { + tmp = p1; + p1 = p2; + p2 = tmp; + tmp = c1; + c1 = c2; + c2 = tmp; + } + if (coords[p2 + 1] > coords[p3 + 1]) { + tmp = p2; + p2 = p3; + p3 = tmp; + tmp = c2; + c2 = c3; + c3 = tmp; + } + if (coords[p1 + 1] > coords[p2 + 1]) { + tmp = p1; + p1 = p2; + p2 = tmp; + tmp = c1; + c1 = c2; + c2 = tmp; + } + const x1 = (coords[p1] + context.offsetX) * context.scaleX; + const y1 = (coords[p1 + 1] + context.offsetY) * context.scaleY; + const x2 = (coords[p2] + context.offsetX) * context.scaleX; + const y2 = (coords[p2 + 1] + context.offsetY) * context.scaleY; + const x3 = (coords[p3] + context.offsetX) * context.scaleX; + const y3 = (coords[p3 + 1] + context.offsetY) * context.scaleY; + if (y1 >= y3) { + return; + } + const c1r = colors[c1], + c1g = colors[c1 + 1], + c1b = colors[c1 + 2]; + const c2r = colors[c2], + c2g = colors[c2 + 1], + c2b = colors[c2 + 2]; + const c3r = colors[c3], + c3g = colors[c3 + 1], + c3b = colors[c3 + 2]; + const minY = Math.round(y1), + maxY = Math.round(y3); + let xa, car, cag, cab; + let xb, cbr, cbg, cbb; + for (let y = minY; y <= maxY; y++) { + if (y < y2) { + const k = y < y1 ? 0 : (y1 - y) / (y1 - y2); + xa = x1 - (x1 - x2) * k; + car = c1r - (c1r - c2r) * k; + cag = c1g - (c1g - c2g) * k; + cab = c1b - (c1b - c2b) * k; + } else { + let k; + if (y > y3) { + k = 1; + } else if (y2 === y3) { + k = 0; + } else { + k = (y2 - y) / (y2 - y3); + } + xa = x2 - (x2 - x3) * k; + car = c2r - (c2r - c3r) * k; + cag = c2g - (c2g - c3g) * k; + cab = c2b - (c2b - c3b) * k; + } + let k; + if (y < y1) { + k = 0; + } else if (y > y3) { + k = 1; + } else { + k = (y1 - y) / (y1 - y3); + } + xb = x1 - (x1 - x3) * k; + cbr = c1r - (c1r - c3r) * k; + cbg = c1g - (c1g - c3g) * k; + cbb = c1b - (c1b - c3b) * k; + const x1_ = Math.round(Math.min(xa, xb)); + const x2_ = Math.round(Math.max(xa, xb)); + let j = rowSize * y + x1_ * 4; + for (let x = x1_; x <= x2_; x++) { + k = (xa - x) / (xa - xb); + if (k < 0) { + k = 0; + } else if (k > 1) { + k = 1; + } + bytes[j++] = car - (car - cbr) * k | 0; + bytes[j++] = cag - (cag - cbg) * k | 0; + bytes[j++] = cab - (cab - cbb) * k | 0; + bytes[j++] = 255; + } + } +} +function drawFigure(data, figure, context) { + const ps = figure.coords; + const cs = figure.colors; + let i, ii; + switch (figure.type) { + case "lattice": + const verticesPerRow = figure.verticesPerRow; + const rows = Math.floor(ps.length / verticesPerRow) - 1; + const cols = verticesPerRow - 1; + for (i = 0; i < rows; i++) { + let q = i * verticesPerRow; + for (let j = 0; j < cols; j++, q++) { + drawTriangle(data, context, ps[q], ps[q + 1], ps[q + verticesPerRow], cs[q], cs[q + 1], cs[q + verticesPerRow]); + drawTriangle(data, context, ps[q + verticesPerRow + 1], ps[q + 1], ps[q + verticesPerRow], cs[q + verticesPerRow + 1], cs[q + 1], cs[q + verticesPerRow]); + } + } + break; + case "triangles": + for (i = 0, ii = ps.length; i < ii; i += 3) { + drawTriangle(data, context, ps[i], ps[i + 1], ps[i + 2], cs[i], cs[i + 1], cs[i + 2]); + } + break; + default: + throw new Error("illegal figure"); + } +} +class MeshShadingPattern extends BaseShadingPattern { + constructor(IR) { + super(); + this._coords = IR[2]; + this._colors = IR[3]; + this._figures = IR[4]; + this._bounds = IR[5]; + this._bbox = IR[7]; + this._background = IR[8]; + this.matrix = null; + } + _createMeshCanvas(combinedScale, backgroundColor, cachedCanvases) { + const EXPECTED_SCALE = 1.1; + const MAX_PATTERN_SIZE = 3000; + const BORDER_SIZE = 2; + const offsetX = Math.floor(this._bounds[0]); + const offsetY = Math.floor(this._bounds[1]); + const boundsWidth = Math.ceil(this._bounds[2]) - offsetX; + const boundsHeight = Math.ceil(this._bounds[3]) - offsetY; + const width = Math.min(Math.ceil(Math.abs(boundsWidth * combinedScale[0] * EXPECTED_SCALE)), MAX_PATTERN_SIZE); + const height = Math.min(Math.ceil(Math.abs(boundsHeight * combinedScale[1] * EXPECTED_SCALE)), MAX_PATTERN_SIZE); + const scaleX = boundsWidth / width; + const scaleY = boundsHeight / height; + const context = { + coords: this._coords, + colors: this._colors, + offsetX: -offsetX, + offsetY: -offsetY, + scaleX: 1 / scaleX, + scaleY: 1 / scaleY + }; + const paddedWidth = width + BORDER_SIZE * 2; + const paddedHeight = height + BORDER_SIZE * 2; + const tmpCanvas = cachedCanvases.getCanvas("mesh", paddedWidth, paddedHeight, false); + const tmpCtx = tmpCanvas.context; + const data = tmpCtx.createImageData(width, height); + if (backgroundColor) { + const bytes = data.data; + for (let i = 0, ii = bytes.length; i < ii; i += 4) { + bytes[i] = backgroundColor[0]; + bytes[i + 1] = backgroundColor[1]; + bytes[i + 2] = backgroundColor[2]; + bytes[i + 3] = 255; + } + } + for (const figure of this._figures) { + drawFigure(data, figure, context); + } + tmpCtx.putImageData(data, BORDER_SIZE, BORDER_SIZE); + const canvas = tmpCanvas.canvas; + return { + canvas, + offsetX: offsetX - BORDER_SIZE * scaleX, + offsetY: offsetY - BORDER_SIZE * scaleY, + scaleX, + scaleY + }; + } + getPattern(ctx, owner, inverse, pathType) { + applyBoundingBox(ctx, this._bbox); + let scale; + if (pathType === PathType.SHADING) { + scale = Util.singularValueDecompose2dScale(getCurrentTransform(ctx)); + } else { + scale = Util.singularValueDecompose2dScale(owner.baseTransform); + if (this.matrix) { + const matrixScale = Util.singularValueDecompose2dScale(this.matrix); + scale = [scale[0] * matrixScale[0], scale[1] * matrixScale[1]]; + } + } + const temporaryPatternCanvas = this._createMeshCanvas(scale, pathType === PathType.SHADING ? null : this._background, owner.cachedCanvases); + if (pathType !== PathType.SHADING) { + ctx.setTransform(...owner.baseTransform); + if (this.matrix) { + ctx.transform(...this.matrix); + } + } + ctx.translate(temporaryPatternCanvas.offsetX, temporaryPatternCanvas.offsetY); + ctx.scale(temporaryPatternCanvas.scaleX, temporaryPatternCanvas.scaleY); + return ctx.createPattern(temporaryPatternCanvas.canvas, "no-repeat"); + } +} +class DummyShadingPattern extends BaseShadingPattern { + getPattern() { + return "hotpink"; + } +} +function getShadingPattern(IR) { + switch (IR[0]) { + case "RadialAxial": + return new RadialAxialShadingPattern(IR); + case "Mesh": + return new MeshShadingPattern(IR); + case "Dummy": + return new DummyShadingPattern(); + } + throw new Error(`Unknown IR type: ${IR[0]}`); +} +const PaintType = { + COLORED: 1, + UNCOLORED: 2 +}; +class TilingPattern { + static MAX_PATTERN_SIZE = 3000; + constructor(IR, color, ctx, canvasGraphicsFactory, baseTransform) { + this.operatorList = IR[2]; + this.matrix = IR[3]; + this.bbox = IR[4]; + this.xstep = IR[5]; + this.ystep = IR[6]; + this.paintType = IR[7]; + this.tilingType = IR[8]; + this.color = color; + this.ctx = ctx; + this.canvasGraphicsFactory = canvasGraphicsFactory; + this.baseTransform = baseTransform; + } + createPatternCanvas(owner) { + const operatorList = this.operatorList; + const bbox = this.bbox; + const xstep = this.xstep; + const ystep = this.ystep; + const paintType = this.paintType; + const tilingType = this.tilingType; + const color = this.color; + const canvasGraphicsFactory = this.canvasGraphicsFactory; + info("TilingType: " + tilingType); + const x0 = bbox[0], + y0 = bbox[1], + x1 = bbox[2], + y1 = bbox[3]; + const matrixScale = Util.singularValueDecompose2dScale(this.matrix); + const curMatrixScale = Util.singularValueDecompose2dScale(this.baseTransform); + const combinedScale = [matrixScale[0] * curMatrixScale[0], matrixScale[1] * curMatrixScale[1]]; + const dimx = this.getSizeAndScale(xstep, this.ctx.canvas.width, combinedScale[0]); + const dimy = this.getSizeAndScale(ystep, this.ctx.canvas.height, combinedScale[1]); + const tmpCanvas = owner.cachedCanvases.getCanvas("pattern", dimx.size, dimy.size, true); + const tmpCtx = tmpCanvas.context; + const graphics = canvasGraphicsFactory.createCanvasGraphics(tmpCtx); + graphics.groupLevel = owner.groupLevel; + this.setFillAndStrokeStyleToContext(graphics, paintType, color); + let adjustedX0 = x0; + let adjustedY0 = y0; + let adjustedX1 = x1; + let adjustedY1 = y1; + if (x0 < 0) { + adjustedX0 = 0; + adjustedX1 += Math.abs(x0); + } + if (y0 < 0) { + adjustedY0 = 0; + adjustedY1 += Math.abs(y0); + } + tmpCtx.translate(-(dimx.scale * adjustedX0), -(dimy.scale * adjustedY0)); + graphics.transform(dimx.scale, 0, 0, dimy.scale, 0, 0); + tmpCtx.save(); + this.clipBbox(graphics, adjustedX0, adjustedY0, adjustedX1, adjustedY1); + graphics.baseTransform = getCurrentTransform(graphics.ctx); + graphics.executeOperatorList(operatorList); + graphics.endDrawing(); + return { + canvas: tmpCanvas.canvas, + scaleX: dimx.scale, + scaleY: dimy.scale, + offsetX: adjustedX0, + offsetY: adjustedY0 + }; + } + getSizeAndScale(step, realOutputSize, scale) { + step = Math.abs(step); + const maxSize = Math.max(TilingPattern.MAX_PATTERN_SIZE, realOutputSize); + let size = Math.ceil(step * scale); + if (size >= maxSize) { + size = maxSize; + } else { + scale = size / step; + } + return { + scale, + size + }; + } + clipBbox(graphics, x0, y0, x1, y1) { + const bboxWidth = x1 - x0; + const bboxHeight = y1 - y0; + graphics.ctx.rect(x0, y0, bboxWidth, bboxHeight); + graphics.current.updateRectMinMax(getCurrentTransform(graphics.ctx), [x0, y0, x1, y1]); + graphics.clip(); + graphics.endPath(); + } + setFillAndStrokeStyleToContext(graphics, paintType, color) { + const context = graphics.ctx, + current = graphics.current; + switch (paintType) { + case PaintType.COLORED: + const ctx = this.ctx; + context.fillStyle = ctx.fillStyle; + context.strokeStyle = ctx.strokeStyle; + current.fillColor = ctx.fillStyle; + current.strokeColor = ctx.strokeStyle; + break; + case PaintType.UNCOLORED: + const cssColor = Util.makeHexColor(color[0], color[1], color[2]); + context.fillStyle = cssColor; + context.strokeStyle = cssColor; + current.fillColor = cssColor; + current.strokeColor = cssColor; + break; + default: + throw new FormatError(`Unsupported paint type: ${paintType}`); + } + } + getPattern(ctx, owner, inverse, pathType) { + let matrix = inverse; + if (pathType !== PathType.SHADING) { + matrix = Util.transform(matrix, owner.baseTransform); + if (this.matrix) { + matrix = Util.transform(matrix, this.matrix); + } + } + const temporaryPatternCanvas = this.createPatternCanvas(owner); + let domMatrix = new DOMMatrix(matrix); + domMatrix = domMatrix.translate(temporaryPatternCanvas.offsetX, temporaryPatternCanvas.offsetY); + domMatrix = domMatrix.scale(1 / temporaryPatternCanvas.scaleX, 1 / temporaryPatternCanvas.scaleY); + const pattern = ctx.createPattern(temporaryPatternCanvas.canvas, "repeat"); + pattern.setTransform(domMatrix); + return pattern; + } +} + +;// CONCATENATED MODULE: ./src/shared/image_utils.js + +function convertToRGBA(params) { + switch (params.kind) { + case ImageKind.GRAYSCALE_1BPP: + return convertBlackAndWhiteToRGBA(params); + case ImageKind.RGB_24BPP: + return convertRGBToRGBA(params); + } + return null; +} +function convertBlackAndWhiteToRGBA({ + src, + srcPos = 0, + dest, + width, + height, + nonBlackColor = 0xffffffff, + inverseDecode = false +}) { + const black = util_FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff; + const [zeroMapping, oneMapping] = inverseDecode ? [nonBlackColor, black] : [black, nonBlackColor]; + const widthInSource = width >> 3; + const widthRemainder = width & 7; + const srcLength = src.length; + dest = new Uint32Array(dest.buffer); + let destPos = 0; + for (let i = 0; i < height; i++) { + for (const max = srcPos + widthInSource; srcPos < max; srcPos++) { + const elem = srcPos < srcLength ? src[srcPos] : 255; + dest[destPos++] = elem & 0b10000000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b1000000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b100000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b10000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b1000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b100 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b10 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b1 ? oneMapping : zeroMapping; + } + if (widthRemainder === 0) { + continue; + } + const elem = srcPos < srcLength ? src[srcPos++] : 255; + for (let j = 0; j < widthRemainder; j++) { + dest[destPos++] = elem & 1 << 7 - j ? oneMapping : zeroMapping; + } + } + return { + srcPos, + destPos + }; +} +function convertRGBToRGBA({ + src, + srcPos = 0, + dest, + destPos = 0, + width, + height +}) { + let i = 0; + const len32 = src.length >> 2; + const src32 = new Uint32Array(src.buffer, srcPos, len32); + if (FeatureTest.isLittleEndian) { + for (; i < len32 - 2; i += 3, destPos += 4) { + const s1 = src32[i]; + const s2 = src32[i + 1]; + const s3 = src32[i + 2]; + dest[destPos] = s1 | 0xff000000; + dest[destPos + 1] = s1 >>> 24 | s2 << 8 | 0xff000000; + dest[destPos + 2] = s2 >>> 16 | s3 << 16 | 0xff000000; + dest[destPos + 3] = s3 >>> 8 | 0xff000000; + } + for (let j = i * 4, jj = src.length; j < jj; j += 3) { + dest[destPos++] = src[j] | src[j + 1] << 8 | src[j + 2] << 16 | 0xff000000; + } + } else { + for (; i < len32 - 2; i += 3, destPos += 4) { + const s1 = src32[i]; + const s2 = src32[i + 1]; + const s3 = src32[i + 2]; + dest[destPos] = s1 | 0xff; + dest[destPos + 1] = s1 << 24 | s2 >>> 8 | 0xff; + dest[destPos + 2] = s2 << 16 | s3 >>> 16 | 0xff; + dest[destPos + 3] = s3 << 8 | 0xff; + } + for (let j = i * 4, jj = src.length; j < jj; j += 3) { + dest[destPos++] = src[j] << 24 | src[j + 1] << 16 | src[j + 2] << 8 | 0xff; + } + } + return { + srcPos, + destPos + }; +} +function grayToRGBA(src, dest) { + if (FeatureTest.isLittleEndian) { + for (let i = 0, ii = src.length; i < ii; i++) { + dest[i] = src[i] * 0x10101 | 0xff000000; + } + } else { + for (let i = 0, ii = src.length; i < ii; i++) { + dest[i] = src[i] * 0x1010100 | 0x000000ff; + } + } +} + +;// CONCATENATED MODULE: ./src/display/canvas.js + + + + +const MIN_FONT_SIZE = 16; +const MAX_FONT_SIZE = 100; +const EXECUTION_TIME = 15; +const EXECUTION_STEPS = 10; +const MAX_SIZE_TO_COMPILE = 1000; +const FULL_CHUNK_HEIGHT = 16; +function mirrorContextOperations(ctx, destCtx) { + if (ctx._removeMirroring) { + throw new Error("Context is already forwarding operations."); + } + ctx.__originalSave = ctx.save; + ctx.__originalRestore = ctx.restore; + ctx.__originalRotate = ctx.rotate; + ctx.__originalScale = ctx.scale; + ctx.__originalTranslate = ctx.translate; + ctx.__originalTransform = ctx.transform; + ctx.__originalSetTransform = ctx.setTransform; + ctx.__originalResetTransform = ctx.resetTransform; + ctx.__originalClip = ctx.clip; + ctx.__originalMoveTo = ctx.moveTo; + ctx.__originalLineTo = ctx.lineTo; + ctx.__originalBezierCurveTo = ctx.bezierCurveTo; + ctx.__originalRect = ctx.rect; + ctx.__originalClosePath = ctx.closePath; + ctx.__originalBeginPath = ctx.beginPath; + ctx._removeMirroring = () => { + ctx.save = ctx.__originalSave; + ctx.restore = ctx.__originalRestore; + ctx.rotate = ctx.__originalRotate; + ctx.scale = ctx.__originalScale; + ctx.translate = ctx.__originalTranslate; + ctx.transform = ctx.__originalTransform; + ctx.setTransform = ctx.__originalSetTransform; + ctx.resetTransform = ctx.__originalResetTransform; + ctx.clip = ctx.__originalClip; + ctx.moveTo = ctx.__originalMoveTo; + ctx.lineTo = ctx.__originalLineTo; + ctx.bezierCurveTo = ctx.__originalBezierCurveTo; + ctx.rect = ctx.__originalRect; + ctx.closePath = ctx.__originalClosePath; + ctx.beginPath = ctx.__originalBeginPath; + delete ctx._removeMirroring; + }; + ctx.save = function ctxSave() { + destCtx.save(); + this.__originalSave(); + }; + ctx.restore = function ctxRestore() { + destCtx.restore(); + this.__originalRestore(); + }; + ctx.translate = function ctxTranslate(x, y) { + destCtx.translate(x, y); + this.__originalTranslate(x, y); + }; + ctx.scale = function ctxScale(x, y) { + destCtx.scale(x, y); + this.__originalScale(x, y); + }; + ctx.transform = function ctxTransform(a, b, c, d, e, f) { + destCtx.transform(a, b, c, d, e, f); + this.__originalTransform(a, b, c, d, e, f); + }; + ctx.setTransform = function ctxSetTransform(a, b, c, d, e, f) { + destCtx.setTransform(a, b, c, d, e, f); + this.__originalSetTransform(a, b, c, d, e, f); + }; + ctx.resetTransform = function ctxResetTransform() { + destCtx.resetTransform(); + this.__originalResetTransform(); + }; + ctx.rotate = function ctxRotate(angle) { + destCtx.rotate(angle); + this.__originalRotate(angle); + }; + ctx.clip = function ctxRotate(rule) { + destCtx.clip(rule); + this.__originalClip(rule); + }; + ctx.moveTo = function (x, y) { + destCtx.moveTo(x, y); + this.__originalMoveTo(x, y); + }; + ctx.lineTo = function (x, y) { + destCtx.lineTo(x, y); + this.__originalLineTo(x, y); + }; + ctx.bezierCurveTo = function (cp1x, cp1y, cp2x, cp2y, x, y) { + destCtx.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y); + this.__originalBezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y); + }; + ctx.rect = function (x, y, width, height) { + destCtx.rect(x, y, width, height); + this.__originalRect(x, y, width, height); + }; + ctx.closePath = function () { + destCtx.closePath(); + this.__originalClosePath(); + }; + ctx.beginPath = function () { + destCtx.beginPath(); + this.__originalBeginPath(); + }; +} +class CachedCanvases { + constructor(canvasFactory) { + this.canvasFactory = canvasFactory; + this.cache = Object.create(null); + } + getCanvas(id, width, height) { + let canvasEntry; + if (this.cache[id] !== undefined) { + canvasEntry = this.cache[id]; + this.canvasFactory.reset(canvasEntry, width, height); + } else { + canvasEntry = this.canvasFactory.create(width, height); + this.cache[id] = canvasEntry; + } + return canvasEntry; + } + delete(id) { + delete this.cache[id]; + } + clear() { + for (const id in this.cache) { + const canvasEntry = this.cache[id]; + this.canvasFactory.destroy(canvasEntry); + delete this.cache[id]; + } + } +} +function drawImageAtIntegerCoords(ctx, srcImg, srcX, srcY, srcW, srcH, destX, destY, destW, destH) { + const [a, b, c, d, tx, ty] = getCurrentTransform(ctx); + if (b === 0 && c === 0) { + const tlX = destX * a + tx; + const rTlX = Math.round(tlX); + const tlY = destY * d + ty; + const rTlY = Math.round(tlY); + const brX = (destX + destW) * a + tx; + const rWidth = Math.abs(Math.round(brX) - rTlX) || 1; + const brY = (destY + destH) * d + ty; + const rHeight = Math.abs(Math.round(brY) - rTlY) || 1; + ctx.setTransform(Math.sign(a), 0, 0, Math.sign(d), rTlX, rTlY); + ctx.drawImage(srcImg, srcX, srcY, srcW, srcH, 0, 0, rWidth, rHeight); + ctx.setTransform(a, b, c, d, tx, ty); + return [rWidth, rHeight]; + } + if (a === 0 && d === 0) { + const tlX = destY * c + tx; + const rTlX = Math.round(tlX); + const tlY = destX * b + ty; + const rTlY = Math.round(tlY); + const brX = (destY + destH) * c + tx; + const rWidth = Math.abs(Math.round(brX) - rTlX) || 1; + const brY = (destX + destW) * b + ty; + const rHeight = Math.abs(Math.round(brY) - rTlY) || 1; + ctx.setTransform(0, Math.sign(b), Math.sign(c), 0, rTlX, rTlY); + ctx.drawImage(srcImg, srcX, srcY, srcW, srcH, 0, 0, rHeight, rWidth); + ctx.setTransform(a, b, c, d, tx, ty); + return [rHeight, rWidth]; + } + ctx.drawImage(srcImg, srcX, srcY, srcW, srcH, destX, destY, destW, destH); + const scaleX = Math.hypot(a, b); + const scaleY = Math.hypot(c, d); + return [scaleX * destW, scaleY * destH]; +} +function compileType3Glyph(imgData) { + const { + width, + height + } = imgData; + if (width > MAX_SIZE_TO_COMPILE || height > MAX_SIZE_TO_COMPILE) { + return null; + } + const POINT_TO_PROCESS_LIMIT = 1000; + const POINT_TYPES = new Uint8Array([0, 2, 4, 0, 1, 0, 5, 4, 8, 10, 0, 8, 0, 2, 1, 0]); + const width1 = width + 1; + let points = new Uint8Array(width1 * (height + 1)); + let i, j, j0; + const lineSize = width + 7 & ~7; + let data = new Uint8Array(lineSize * height), + pos = 0; + for (const elem of imgData.data) { + let mask = 128; + while (mask > 0) { + data[pos++] = elem & mask ? 0 : 255; + mask >>= 1; + } + } + let count = 0; + pos = 0; + if (data[pos] !== 0) { + points[0] = 1; + ++count; + } + for (j = 1; j < width; j++) { + if (data[pos] !== data[pos + 1]) { + points[j] = data[pos] ? 2 : 1; + ++count; + } + pos++; + } + if (data[pos] !== 0) { + points[j] = 2; + ++count; + } + for (i = 1; i < height; i++) { + pos = i * lineSize; + j0 = i * width1; + if (data[pos - lineSize] !== data[pos]) { + points[j0] = data[pos] ? 1 : 8; + ++count; + } + let sum = (data[pos] ? 4 : 0) + (data[pos - lineSize] ? 8 : 0); + for (j = 1; j < width; j++) { + sum = (sum >> 2) + (data[pos + 1] ? 4 : 0) + (data[pos - lineSize + 1] ? 8 : 0); + if (POINT_TYPES[sum]) { + points[j0 + j] = POINT_TYPES[sum]; + ++count; + } + pos++; + } + if (data[pos - lineSize] !== data[pos]) { + points[j0 + j] = data[pos] ? 2 : 4; + ++count; + } + if (count > POINT_TO_PROCESS_LIMIT) { + return null; + } + } + pos = lineSize * (height - 1); + j0 = i * width1; + if (data[pos] !== 0) { + points[j0] = 8; + ++count; + } + for (j = 1; j < width; j++) { + if (data[pos] !== data[pos + 1]) { + points[j0 + j] = data[pos] ? 4 : 8; + ++count; + } + pos++; + } + if (data[pos] !== 0) { + points[j0 + j] = 4; + ++count; + } + if (count > POINT_TO_PROCESS_LIMIT) { + return null; + } + const steps = new Int32Array([0, width1, -1, 0, -width1, 0, 0, 0, 1]); + const path = new Path2D(); + for (i = 0; count && i <= height; i++) { + let p = i * width1; + const end = p + width; + while (p < end && !points[p]) { + p++; + } + if (p === end) { + continue; + } + path.moveTo(p % width1, i); + const p0 = p; + let type = points[p]; + do { + const step = steps[type]; + do { + p += step; + } while (!points[p]); + const pp = points[p]; + if (pp !== 5 && pp !== 10) { + type = pp; + points[p] = 0; + } else { + type = pp & 0x33 * type >> 4; + points[p] &= type >> 2 | type << 2; + } + path.lineTo(p % width1, p / width1 | 0); + if (!points[p]) { + --count; + } + } while (p0 !== p); + --i; + } + data = null; + points = null; + const drawOutline = function (c) { + c.save(); + c.scale(1 / width, -1 / height); + c.translate(0, -height); + c.fill(path); + c.beginPath(); + c.restore(); + }; + return drawOutline; +} +class CanvasExtraState { + constructor(width, height) { + this.alphaIsShape = false; + this.fontSize = 0; + this.fontSizeScale = 1; + this.textMatrix = IDENTITY_MATRIX; + this.textMatrixScale = 1; + this.fontMatrix = FONT_IDENTITY_MATRIX; + this.leading = 0; + this.x = 0; + this.y = 0; + this.lineX = 0; + this.lineY = 0; + this.charSpacing = 0; + this.wordSpacing = 0; + this.textHScale = 1; + this.textRenderingMode = TextRenderingMode.FILL; + this.textRise = 0; + this.fillColor = "#000000"; + this.strokeColor = "#000000"; + this.patternFill = false; + this.fillAlpha = 1; + this.strokeAlpha = 1; + this.lineWidth = 1; + this.activeSMask = null; + this.transferMaps = "none"; + this.startNewPathAndClipBox([0, 0, width, height]); + } + clone() { + const clone = Object.create(this); + clone.clipBox = this.clipBox.slice(); + return clone; + } + setCurrentPoint(x, y) { + this.x = x; + this.y = y; + } + updatePathMinMax(transform, x, y) { + [x, y] = Util.applyTransform([x, y], transform); + this.minX = Math.min(this.minX, x); + this.minY = Math.min(this.minY, y); + this.maxX = Math.max(this.maxX, x); + this.maxY = Math.max(this.maxY, y); + } + updateRectMinMax(transform, rect) { + const p1 = Util.applyTransform(rect, transform); + const p2 = Util.applyTransform(rect.slice(2), transform); + const p3 = Util.applyTransform([rect[0], rect[3]], transform); + const p4 = Util.applyTransform([rect[2], rect[1]], transform); + this.minX = Math.min(this.minX, p1[0], p2[0], p3[0], p4[0]); + this.minY = Math.min(this.minY, p1[1], p2[1], p3[1], p4[1]); + this.maxX = Math.max(this.maxX, p1[0], p2[0], p3[0], p4[0]); + this.maxY = Math.max(this.maxY, p1[1], p2[1], p3[1], p4[1]); + } + updateScalingPathMinMax(transform, minMax) { + Util.scaleMinMax(transform, minMax); + this.minX = Math.min(this.minX, minMax[0]); + this.minY = Math.min(this.minY, minMax[1]); + this.maxX = Math.max(this.maxX, minMax[2]); + this.maxY = Math.max(this.maxY, minMax[3]); + } + updateCurvePathMinMax(transform, x0, y0, x1, y1, x2, y2, x3, y3, minMax) { + const box = Util.bezierBoundingBox(x0, y0, x1, y1, x2, y2, x3, y3, minMax); + if (minMax) { + return; + } + this.updateRectMinMax(transform, box); + } + getPathBoundingBox(pathType = PathType.FILL, transform = null) { + const box = [this.minX, this.minY, this.maxX, this.maxY]; + if (pathType === PathType.STROKE) { + if (!transform) { + unreachable("Stroke bounding box must include transform."); + } + const scale = Util.singularValueDecompose2dScale(transform); + const xStrokePad = scale[0] * this.lineWidth / 2; + const yStrokePad = scale[1] * this.lineWidth / 2; + box[0] -= xStrokePad; + box[1] -= yStrokePad; + box[2] += xStrokePad; + box[3] += yStrokePad; + } + return box; + } + updateClipFromPath() { + const intersect = Util.intersect(this.clipBox, this.getPathBoundingBox()); + this.startNewPathAndClipBox(intersect || [0, 0, 0, 0]); + } + isEmptyClip() { + return this.minX === Infinity; + } + startNewPathAndClipBox(box) { + this.clipBox = box; + this.minX = Infinity; + this.minY = Infinity; + this.maxX = 0; + this.maxY = 0; + } + getClippedPathBoundingBox(pathType = PathType.FILL, transform = null) { + return Util.intersect(this.clipBox, this.getPathBoundingBox(pathType, transform)); + } +} +function putBinaryImageData(ctx, imgData) { + if (typeof ImageData !== "undefined" && imgData instanceof ImageData) { + ctx.putImageData(imgData, 0, 0); + return; + } + const height = imgData.height, + width = imgData.width; + const partialChunkHeight = height % FULL_CHUNK_HEIGHT; + const fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT; + const totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1; + const chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT); + let srcPos = 0, + destPos; + const src = imgData.data; + const dest = chunkImgData.data; + let i, j, thisChunkHeight, elemsInThisChunk; + if (imgData.kind === util_ImageKind.GRAYSCALE_1BPP) { + const srcLength = src.byteLength; + const dest32 = new Uint32Array(dest.buffer, 0, dest.byteLength >> 2); + const dest32DataLength = dest32.length; + const fullSrcDiff = width + 7 >> 3; + const white = 0xffffffff; + const black = util_FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff; + for (i = 0; i < totalChunks; i++) { + thisChunkHeight = i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight; + destPos = 0; + for (j = 0; j < thisChunkHeight; j++) { + const srcDiff = srcLength - srcPos; + let k = 0; + const kEnd = srcDiff > fullSrcDiff ? width : srcDiff * 8 - 7; + const kEndUnrolled = kEnd & ~7; + let mask = 0; + let srcByte = 0; + for (; k < kEndUnrolled; k += 8) { + srcByte = src[srcPos++]; + dest32[destPos++] = srcByte & 128 ? white : black; + dest32[destPos++] = srcByte & 64 ? white : black; + dest32[destPos++] = srcByte & 32 ? white : black; + dest32[destPos++] = srcByte & 16 ? white : black; + dest32[destPos++] = srcByte & 8 ? white : black; + dest32[destPos++] = srcByte & 4 ? white : black; + dest32[destPos++] = srcByte & 2 ? white : black; + dest32[destPos++] = srcByte & 1 ? white : black; + } + for (; k < kEnd; k++) { + if (mask === 0) { + srcByte = src[srcPos++]; + mask = 128; + } + dest32[destPos++] = srcByte & mask ? white : black; + mask >>= 1; + } + } + while (destPos < dest32DataLength) { + dest32[destPos++] = 0; + } + ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT); + } + } else if (imgData.kind === util_ImageKind.RGBA_32BPP) { + j = 0; + elemsInThisChunk = width * FULL_CHUNK_HEIGHT * 4; + for (i = 0; i < fullChunks; i++) { + dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk)); + srcPos += elemsInThisChunk; + ctx.putImageData(chunkImgData, 0, j); + j += FULL_CHUNK_HEIGHT; + } + if (i < totalChunks) { + elemsInThisChunk = width * partialChunkHeight * 4; + dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk)); + ctx.putImageData(chunkImgData, 0, j); + } + } else if (imgData.kind === util_ImageKind.RGB_24BPP) { + thisChunkHeight = FULL_CHUNK_HEIGHT; + elemsInThisChunk = width * thisChunkHeight; + for (i = 0; i < totalChunks; i++) { + if (i >= fullChunks) { + thisChunkHeight = partialChunkHeight; + elemsInThisChunk = width * thisChunkHeight; + } + destPos = 0; + for (j = elemsInThisChunk; j--;) { + dest[destPos++] = src[srcPos++]; + dest[destPos++] = src[srcPos++]; + dest[destPos++] = src[srcPos++]; + dest[destPos++] = 255; + } + ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT); + } + } else { + throw new Error(`bad image kind: ${imgData.kind}`); + } +} +function putBinaryImageMask(ctx, imgData) { + if (imgData.bitmap) { + ctx.drawImage(imgData.bitmap, 0, 0); + return; + } + const height = imgData.height, + width = imgData.width; + const partialChunkHeight = height % FULL_CHUNK_HEIGHT; + const fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT; + const totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1; + const chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT); + let srcPos = 0; + const src = imgData.data; + const dest = chunkImgData.data; + for (let i = 0; i < totalChunks; i++) { + const thisChunkHeight = i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight; + ({ + srcPos + } = convertBlackAndWhiteToRGBA({ + src, + srcPos, + dest, + width, + height: thisChunkHeight, + nonBlackColor: 0 + })); + ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT); + } +} +function copyCtxState(sourceCtx, destCtx) { + const properties = ["strokeStyle", "fillStyle", "fillRule", "globalAlpha", "lineWidth", "lineCap", "lineJoin", "miterLimit", "globalCompositeOperation", "font", "filter"]; + for (const property of properties) { + if (sourceCtx[property] !== undefined) { + destCtx[property] = sourceCtx[property]; + } + } + if (sourceCtx.setLineDash !== undefined) { + destCtx.setLineDash(sourceCtx.getLineDash()); + destCtx.lineDashOffset = sourceCtx.lineDashOffset; + } +} +function resetCtxToDefault(ctx) { + ctx.strokeStyle = ctx.fillStyle = "#000000"; + ctx.fillRule = "nonzero"; + ctx.globalAlpha = 1; + ctx.lineWidth = 1; + ctx.lineCap = "butt"; + ctx.lineJoin = "miter"; + ctx.miterLimit = 10; + ctx.globalCompositeOperation = "source-over"; + ctx.font = "10px sans-serif"; + if (ctx.setLineDash !== undefined) { + ctx.setLineDash([]); + ctx.lineDashOffset = 0; + } + if (!isNodeJS) { + const { + filter + } = ctx; + if (filter !== "none" && filter !== "") { + ctx.filter = "none"; + } + } +} +function getImageSmoothingEnabled(transform, interpolate) { + if (interpolate) { + return true; + } + const scale = Util.singularValueDecompose2dScale(transform); + scale[0] = Math.fround(scale[0]); + scale[1] = Math.fround(scale[1]); + const actualScale = Math.fround((globalThis.devicePixelRatio || 1) * PixelsPerInch.PDF_TO_CSS_UNITS); + return scale[0] <= actualScale && scale[1] <= actualScale; +} +const LINE_CAP_STYLES = ["butt", "round", "square"]; +const LINE_JOIN_STYLES = ["miter", "round", "bevel"]; +const NORMAL_CLIP = {}; +const EO_CLIP = {}; +class CanvasGraphics { + constructor(canvasCtx, commonObjs, objs, canvasFactory, filterFactory, { + optionalContentConfig, + markedContentStack = null + }, annotationCanvasMap, pageColors) { + this.ctx = canvasCtx; + this.current = new CanvasExtraState(this.ctx.canvas.width, this.ctx.canvas.height); + this.stateStack = []; + this.pendingClip = null; + this.pendingEOFill = false; + this.res = null; + this.xobjs = null; + this.commonObjs = commonObjs; + this.objs = objs; + this.canvasFactory = canvasFactory; + this.filterFactory = filterFactory; + this.groupStack = []; + this.processingType3 = null; + this.baseTransform = null; + this.baseTransformStack = []; + this.groupLevel = 0; + this.smaskStack = []; + this.smaskCounter = 0; + this.tempSMask = null; + this.suspendedCtx = null; + this.contentVisible = true; + this.markedContentStack = markedContentStack || []; + this.optionalContentConfig = optionalContentConfig; + this.cachedCanvases = new CachedCanvases(this.canvasFactory); + this.cachedPatterns = new Map(); + this.annotationCanvasMap = annotationCanvasMap; + this.viewportScale = 1; + this.outputScaleX = 1; + this.outputScaleY = 1; + this.pageColors = pageColors; + this._cachedScaleForStroking = [-1, 0]; + this._cachedGetSinglePixelWidth = null; + this._cachedBitmapsMap = new Map(); + } + getObject(data, fallback = null) { + if (typeof data === "string") { + return data.startsWith("g_") ? this.commonObjs.get(data) : this.objs.get(data); + } + return fallback; + } + beginDrawing({ + transform, + viewport, + transparency = false, + background = null + }) { + const width = this.ctx.canvas.width; + const height = this.ctx.canvas.height; + const savedFillStyle = this.ctx.fillStyle; + this.ctx.fillStyle = background || "#ffffff"; + this.ctx.fillRect(0, 0, width, height); + this.ctx.fillStyle = savedFillStyle; + if (transparency) { + const transparentCanvas = this.cachedCanvases.getCanvas("transparent", width, height); + this.compositeCtx = this.ctx; + this.transparentCanvas = transparentCanvas.canvas; + this.ctx = transparentCanvas.context; + this.ctx.save(); + this.ctx.transform(...getCurrentTransform(this.compositeCtx)); + } + this.ctx.save(); + resetCtxToDefault(this.ctx); + if (transform) { + this.ctx.transform(...transform); + this.outputScaleX = transform[0]; + this.outputScaleY = transform[0]; + } + this.ctx.transform(...viewport.transform); + this.viewportScale = viewport.scale; + this.baseTransform = getCurrentTransform(this.ctx); + } + executeOperatorList(operatorList, executionStartIdx, continueCallback, stepper) { + const argsArray = operatorList.argsArray; + const fnArray = operatorList.fnArray; + let i = executionStartIdx || 0; + const argsArrayLen = argsArray.length; + if (argsArrayLen === i) { + return i; + } + const chunkOperations = argsArrayLen - i > EXECUTION_STEPS && typeof continueCallback === "function"; + const endTime = chunkOperations ? Date.now() + EXECUTION_TIME : 0; + let steps = 0; + const commonObjs = this.commonObjs; + const objs = this.objs; + let fnId; + while (true) { + if (stepper !== undefined && i === stepper.nextBreakPoint) { + stepper.breakIt(i, continueCallback); + return i; + } + fnId = fnArray[i]; + if (fnId !== OPS.dependency) { + this[fnId].apply(this, argsArray[i]); + } else { + for (const depObjId of argsArray[i]) { + const objsPool = depObjId.startsWith("g_") ? commonObjs : objs; + if (!objsPool.has(depObjId)) { + objsPool.get(depObjId, continueCallback); + return i; + } + } + } + i++; + if (i === argsArrayLen) { + return i; + } + if (chunkOperations && ++steps > EXECUTION_STEPS) { + if (Date.now() > endTime) { + continueCallback(); + return i; + } + steps = 0; + } + } + } + #restoreInitialState() { + while (this.stateStack.length || this.inSMaskMode) { + this.restore(); + } + this.ctx.restore(); + if (this.transparentCanvas) { + this.ctx = this.compositeCtx; + this.ctx.save(); + this.ctx.setTransform(1, 0, 0, 1, 0, 0); + this.ctx.drawImage(this.transparentCanvas, 0, 0); + this.ctx.restore(); + this.transparentCanvas = null; + } + } + endDrawing() { + this.#restoreInitialState(); + this.cachedCanvases.clear(); + this.cachedPatterns.clear(); + for (const cache of this._cachedBitmapsMap.values()) { + for (const canvas of cache.values()) { + if (typeof HTMLCanvasElement !== "undefined" && canvas instanceof HTMLCanvasElement) { + canvas.width = canvas.height = 0; + } + } + cache.clear(); + } + this._cachedBitmapsMap.clear(); + this.#drawFilter(); + } + #drawFilter() { + if (this.pageColors) { + const hcmFilterId = this.filterFactory.addHCMFilter(this.pageColors.foreground, this.pageColors.background); + if (hcmFilterId !== "none") { + const savedFilter = this.ctx.filter; + this.ctx.filter = hcmFilterId; + this.ctx.drawImage(this.ctx.canvas, 0, 0); + this.ctx.filter = savedFilter; + } + } + } + _scaleImage(img, inverseTransform) { + const width = img.width; + const height = img.height; + let widthScale = Math.max(Math.hypot(inverseTransform[0], inverseTransform[1]), 1); + let heightScale = Math.max(Math.hypot(inverseTransform[2], inverseTransform[3]), 1); + let paintWidth = width, + paintHeight = height; + let tmpCanvasId = "prescale1"; + let tmpCanvas, tmpCtx; + while (widthScale > 2 && paintWidth > 1 || heightScale > 2 && paintHeight > 1) { + let newWidth = paintWidth, + newHeight = paintHeight; + if (widthScale > 2 && paintWidth > 1) { + newWidth = paintWidth >= 16384 ? Math.floor(paintWidth / 2) - 1 || 1 : Math.ceil(paintWidth / 2); + widthScale /= paintWidth / newWidth; + } + if (heightScale > 2 && paintHeight > 1) { + newHeight = paintHeight >= 16384 ? Math.floor(paintHeight / 2) - 1 || 1 : Math.ceil(paintHeight) / 2; + heightScale /= paintHeight / newHeight; + } + tmpCanvas = this.cachedCanvases.getCanvas(tmpCanvasId, newWidth, newHeight); + tmpCtx = tmpCanvas.context; + tmpCtx.clearRect(0, 0, newWidth, newHeight); + tmpCtx.drawImage(img, 0, 0, paintWidth, paintHeight, 0, 0, newWidth, newHeight); + img = tmpCanvas.canvas; + paintWidth = newWidth; + paintHeight = newHeight; + tmpCanvasId = tmpCanvasId === "prescale1" ? "prescale2" : "prescale1"; + } + return { + img, + paintWidth, + paintHeight + }; + } + _createMaskCanvas(img) { + const ctx = this.ctx; + const { + width, + height + } = img; + const fillColor = this.current.fillColor; + const isPatternFill = this.current.patternFill; + const currentTransform = getCurrentTransform(ctx); + let cache, cacheKey, scaled, maskCanvas; + if ((img.bitmap || img.data) && img.count > 1) { + const mainKey = img.bitmap || img.data.buffer; + cacheKey = JSON.stringify(isPatternFill ? currentTransform : [currentTransform.slice(0, 4), fillColor]); + cache = this._cachedBitmapsMap.get(mainKey); + if (!cache) { + cache = new Map(); + this._cachedBitmapsMap.set(mainKey, cache); + } + const cachedImage = cache.get(cacheKey); + if (cachedImage && !isPatternFill) { + const offsetX = Math.round(Math.min(currentTransform[0], currentTransform[2]) + currentTransform[4]); + const offsetY = Math.round(Math.min(currentTransform[1], currentTransform[3]) + currentTransform[5]); + return { + canvas: cachedImage, + offsetX, + offsetY + }; + } + scaled = cachedImage; + } + if (!scaled) { + maskCanvas = this.cachedCanvases.getCanvas("maskCanvas", width, height); + putBinaryImageMask(maskCanvas.context, img); + } + let maskToCanvas = Util.transform(currentTransform, [1 / width, 0, 0, -1 / height, 0, 0]); + maskToCanvas = Util.transform(maskToCanvas, [1, 0, 0, 1, 0, -height]); + const [minX, minY, maxX, maxY] = Util.getAxialAlignedBoundingBox([0, 0, width, height], maskToCanvas); + const drawnWidth = Math.round(maxX - minX) || 1; + const drawnHeight = Math.round(maxY - minY) || 1; + const fillCanvas = this.cachedCanvases.getCanvas("fillCanvas", drawnWidth, drawnHeight); + const fillCtx = fillCanvas.context; + const offsetX = minX; + const offsetY = minY; + fillCtx.translate(-offsetX, -offsetY); + fillCtx.transform(...maskToCanvas); + if (!scaled) { + scaled = this._scaleImage(maskCanvas.canvas, getCurrentTransformInverse(fillCtx)); + scaled = scaled.img; + if (cache && isPatternFill) { + cache.set(cacheKey, scaled); + } + } + fillCtx.imageSmoothingEnabled = getImageSmoothingEnabled(getCurrentTransform(fillCtx), img.interpolate); + drawImageAtIntegerCoords(fillCtx, scaled, 0, 0, scaled.width, scaled.height, 0, 0, width, height); + fillCtx.globalCompositeOperation = "source-in"; + const inverse = Util.transform(getCurrentTransformInverse(fillCtx), [1, 0, 0, 1, -offsetX, -offsetY]); + fillCtx.fillStyle = isPatternFill ? fillColor.getPattern(ctx, this, inverse, PathType.FILL) : fillColor; + fillCtx.fillRect(0, 0, width, height); + if (cache && !isPatternFill) { + this.cachedCanvases.delete("fillCanvas"); + cache.set(cacheKey, fillCanvas.canvas); + } + return { + canvas: fillCanvas.canvas, + offsetX: Math.round(offsetX), + offsetY: Math.round(offsetY) + }; + } + setLineWidth(width) { + if (width !== this.current.lineWidth) { + this._cachedScaleForStroking[0] = -1; + } + this.current.lineWidth = width; + this.ctx.lineWidth = width; + } + setLineCap(style) { + this.ctx.lineCap = LINE_CAP_STYLES[style]; + } + setLineJoin(style) { + this.ctx.lineJoin = LINE_JOIN_STYLES[style]; + } + setMiterLimit(limit) { + this.ctx.miterLimit = limit; + } + setDash(dashArray, dashPhase) { + const ctx = this.ctx; + if (ctx.setLineDash !== undefined) { + ctx.setLineDash(dashArray); + ctx.lineDashOffset = dashPhase; + } + } + setRenderingIntent(intent) {} + setFlatness(flatness) {} + setGState(states) { + for (const [key, value] of states) { + switch (key) { + case "LW": + this.setLineWidth(value); + break; + case "LC": + this.setLineCap(value); + break; + case "LJ": + this.setLineJoin(value); + break; + case "ML": + this.setMiterLimit(value); + break; + case "D": + this.setDash(value[0], value[1]); + break; + case "RI": + this.setRenderingIntent(value); + break; + case "FL": + this.setFlatness(value); + break; + case "Font": + this.setFont(value[0], value[1]); + break; + case "CA": + this.current.strokeAlpha = value; + break; + case "ca": + this.current.fillAlpha = value; + this.ctx.globalAlpha = value; + break; + case "BM": + this.ctx.globalCompositeOperation = value; + break; + case "SMask": + this.current.activeSMask = value ? this.tempSMask : null; + this.tempSMask = null; + this.checkSMaskState(); + break; + case "TR": + this.ctx.filter = this.current.transferMaps = this.filterFactory.addFilter(value); + break; + } + } + } + get inSMaskMode() { + return !!this.suspendedCtx; + } + checkSMaskState() { + const inSMaskMode = this.inSMaskMode; + if (this.current.activeSMask && !inSMaskMode) { + this.beginSMaskMode(); + } else if (!this.current.activeSMask && inSMaskMode) { + this.endSMaskMode(); + } + } + beginSMaskMode() { + if (this.inSMaskMode) { + throw new Error("beginSMaskMode called while already in smask mode"); + } + const drawnWidth = this.ctx.canvas.width; + const drawnHeight = this.ctx.canvas.height; + const cacheId = "smaskGroupAt" + this.groupLevel; + const scratchCanvas = this.cachedCanvases.getCanvas(cacheId, drawnWidth, drawnHeight); + this.suspendedCtx = this.ctx; + this.ctx = scratchCanvas.context; + const ctx = this.ctx; + ctx.setTransform(...getCurrentTransform(this.suspendedCtx)); + copyCtxState(this.suspendedCtx, ctx); + mirrorContextOperations(ctx, this.suspendedCtx); + this.setGState([["BM", "source-over"], ["ca", 1], ["CA", 1]]); + } + endSMaskMode() { + if (!this.inSMaskMode) { + throw new Error("endSMaskMode called while not in smask mode"); + } + this.ctx._removeMirroring(); + copyCtxState(this.ctx, this.suspendedCtx); + this.ctx = this.suspendedCtx; + this.suspendedCtx = null; + } + compose(dirtyBox) { + if (!this.current.activeSMask) { + return; + } + if (!dirtyBox) { + dirtyBox = [0, 0, this.ctx.canvas.width, this.ctx.canvas.height]; + } else { + dirtyBox[0] = Math.floor(dirtyBox[0]); + dirtyBox[1] = Math.floor(dirtyBox[1]); + dirtyBox[2] = Math.ceil(dirtyBox[2]); + dirtyBox[3] = Math.ceil(dirtyBox[3]); + } + const smask = this.current.activeSMask; + const suspendedCtx = this.suspendedCtx; + this.composeSMask(suspendedCtx, smask, this.ctx, dirtyBox); + this.ctx.save(); + this.ctx.setTransform(1, 0, 0, 1, 0, 0); + this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height); + this.ctx.restore(); + } + composeSMask(ctx, smask, layerCtx, layerBox) { + const layerOffsetX = layerBox[0]; + const layerOffsetY = layerBox[1]; + const layerWidth = layerBox[2] - layerOffsetX; + const layerHeight = layerBox[3] - layerOffsetY; + if (layerWidth === 0 || layerHeight === 0) { + return; + } + this.genericComposeSMask(smask.context, layerCtx, layerWidth, layerHeight, smask.subtype, smask.backdrop, smask.transferMap, layerOffsetX, layerOffsetY, smask.offsetX, smask.offsetY); + ctx.save(); + ctx.globalAlpha = 1; + ctx.globalCompositeOperation = "source-over"; + ctx.setTransform(1, 0, 0, 1, 0, 0); + ctx.drawImage(layerCtx.canvas, 0, 0); + ctx.restore(); + } + genericComposeSMask(maskCtx, layerCtx, width, height, subtype, backdrop, transferMap, layerOffsetX, layerOffsetY, maskOffsetX, maskOffsetY) { + let maskCanvas = maskCtx.canvas; + let maskX = layerOffsetX - maskOffsetX; + let maskY = layerOffsetY - maskOffsetY; + if (backdrop) { + if (maskX < 0 || maskY < 0 || maskX + width > maskCanvas.width || maskY + height > maskCanvas.height) { + const canvas = this.cachedCanvases.getCanvas("maskExtension", width, height); + const ctx = canvas.context; + ctx.drawImage(maskCanvas, -maskX, -maskY); + if (backdrop.some(c => c !== 0)) { + ctx.globalCompositeOperation = "destination-atop"; + ctx.fillStyle = Util.makeHexColor(...backdrop); + ctx.fillRect(0, 0, width, height); + ctx.globalCompositeOperation = "source-over"; + } + maskCanvas = canvas.canvas; + maskX = maskY = 0; + } else if (backdrop.some(c => c !== 0)) { + maskCtx.save(); + maskCtx.globalAlpha = 1; + maskCtx.setTransform(1, 0, 0, 1, 0, 0); + const clip = new Path2D(); + clip.rect(maskX, maskY, width, height); + maskCtx.clip(clip); + maskCtx.globalCompositeOperation = "destination-atop"; + maskCtx.fillStyle = Util.makeHexColor(...backdrop); + maskCtx.fillRect(maskX, maskY, width, height); + maskCtx.restore(); + } + } + layerCtx.save(); + layerCtx.globalAlpha = 1; + layerCtx.setTransform(1, 0, 0, 1, 0, 0); + if (subtype === "Alpha" && transferMap) { + layerCtx.filter = this.filterFactory.addAlphaFilter(transferMap); + } else if (subtype === "Luminosity") { + layerCtx.filter = this.filterFactory.addLuminosityFilter(transferMap); + } + const clip = new Path2D(); + clip.rect(layerOffsetX, layerOffsetY, width, height); + layerCtx.clip(clip); + layerCtx.globalCompositeOperation = "destination-in"; + layerCtx.drawImage(maskCanvas, maskX, maskY, width, height, layerOffsetX, layerOffsetY, width, height); + layerCtx.restore(); + } + save() { + if (this.inSMaskMode) { + copyCtxState(this.ctx, this.suspendedCtx); + this.suspendedCtx.save(); + } else { + this.ctx.save(); + } + const old = this.current; + this.stateStack.push(old); + this.current = old.clone(); + } + restore() { + if (this.stateStack.length === 0 && this.inSMaskMode) { + this.endSMaskMode(); + } + if (this.stateStack.length !== 0) { + this.current = this.stateStack.pop(); + if (this.inSMaskMode) { + this.suspendedCtx.restore(); + copyCtxState(this.suspendedCtx, this.ctx); + } else { + this.ctx.restore(); + } + this.checkSMaskState(); + this.pendingClip = null; + this._cachedScaleForStroking[0] = -1; + this._cachedGetSinglePixelWidth = null; + } + } + transform(a, b, c, d, e, f) { + this.ctx.transform(a, b, c, d, e, f); + this._cachedScaleForStroking[0] = -1; + this._cachedGetSinglePixelWidth = null; + } + constructPath(ops, args, minMax) { + const ctx = this.ctx; + const current = this.current; + let x = current.x, + y = current.y; + let startX, startY; + const currentTransform = getCurrentTransform(ctx); + const isScalingMatrix = currentTransform[0] === 0 && currentTransform[3] === 0 || currentTransform[1] === 0 && currentTransform[2] === 0; + const minMaxForBezier = isScalingMatrix ? minMax.slice(0) : null; + for (let i = 0, j = 0, ii = ops.length; i < ii; i++) { + switch (ops[i] | 0) { + case OPS.rectangle: + x = args[j++]; + y = args[j++]; + const width = args[j++]; + const height = args[j++]; + const xw = x + width; + const yh = y + height; + ctx.moveTo(x, y); + if (width === 0 || height === 0) { + ctx.lineTo(xw, yh); + } else { + ctx.lineTo(xw, y); + ctx.lineTo(xw, yh); + ctx.lineTo(x, yh); + } + if (!isScalingMatrix) { + current.updateRectMinMax(currentTransform, [x, y, xw, yh]); + } + ctx.closePath(); + break; + case OPS.moveTo: + x = args[j++]; + y = args[j++]; + ctx.moveTo(x, y); + if (!isScalingMatrix) { + current.updatePathMinMax(currentTransform, x, y); + } + break; + case OPS.lineTo: + x = args[j++]; + y = args[j++]; + ctx.lineTo(x, y); + if (!isScalingMatrix) { + current.updatePathMinMax(currentTransform, x, y); + } + break; + case OPS.curveTo: + startX = x; + startY = y; + x = args[j + 4]; + y = args[j + 5]; + ctx.bezierCurveTo(args[j], args[j + 1], args[j + 2], args[j + 3], x, y); + current.updateCurvePathMinMax(currentTransform, startX, startY, args[j], args[j + 1], args[j + 2], args[j + 3], x, y, minMaxForBezier); + j += 6; + break; + case OPS.curveTo2: + startX = x; + startY = y; + ctx.bezierCurveTo(x, y, args[j], args[j + 1], args[j + 2], args[j + 3]); + current.updateCurvePathMinMax(currentTransform, startX, startY, x, y, args[j], args[j + 1], args[j + 2], args[j + 3], minMaxForBezier); + x = args[j + 2]; + y = args[j + 3]; + j += 4; + break; + case OPS.curveTo3: + startX = x; + startY = y; + x = args[j + 2]; + y = args[j + 3]; + ctx.bezierCurveTo(args[j], args[j + 1], x, y, x, y); + current.updateCurvePathMinMax(currentTransform, startX, startY, args[j], args[j + 1], x, y, x, y, minMaxForBezier); + j += 4; + break; + case OPS.closePath: + ctx.closePath(); + break; + } + } + if (isScalingMatrix) { + current.updateScalingPathMinMax(currentTransform, minMaxForBezier); + } + current.setCurrentPoint(x, y); + } + closePath() { + this.ctx.closePath(); + } + stroke(consumePath = true) { + const ctx = this.ctx; + const strokeColor = this.current.strokeColor; + ctx.globalAlpha = this.current.strokeAlpha; + if (this.contentVisible) { + if (typeof strokeColor === "object" && strokeColor?.getPattern) { + ctx.save(); + ctx.strokeStyle = strokeColor.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.STROKE); + this.rescaleAndStroke(false); + ctx.restore(); + } else { + this.rescaleAndStroke(true); + } + } + if (consumePath) { + this.consumePath(this.current.getClippedPathBoundingBox()); + } + ctx.globalAlpha = this.current.fillAlpha; + } + closeStroke() { + this.closePath(); + this.stroke(); + } + fill(consumePath = true) { + const ctx = this.ctx; + const fillColor = this.current.fillColor; + const isPatternFill = this.current.patternFill; + let needRestore = false; + if (isPatternFill) { + ctx.save(); + ctx.fillStyle = fillColor.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.FILL); + needRestore = true; + } + const intersect = this.current.getClippedPathBoundingBox(); + if (this.contentVisible && intersect !== null) { + if (this.pendingEOFill) { + ctx.fill("evenodd"); + this.pendingEOFill = false; + } else { + ctx.fill(); + } + } + if (needRestore) { + ctx.restore(); + } + if (consumePath) { + this.consumePath(intersect); + } + } + eoFill() { + this.pendingEOFill = true; + this.fill(); + } + fillStroke() { + this.fill(false); + this.stroke(false); + this.consumePath(); + } + eoFillStroke() { + this.pendingEOFill = true; + this.fillStroke(); + } + closeFillStroke() { + this.closePath(); + this.fillStroke(); + } + closeEOFillStroke() { + this.pendingEOFill = true; + this.closePath(); + this.fillStroke(); + } + endPath() { + this.consumePath(); + } + clip() { + this.pendingClip = NORMAL_CLIP; + } + eoClip() { + this.pendingClip = EO_CLIP; + } + beginText() { + this.current.textMatrix = IDENTITY_MATRIX; + this.current.textMatrixScale = 1; + this.current.x = this.current.lineX = 0; + this.current.y = this.current.lineY = 0; + } + endText() { + const paths = this.pendingTextPaths; + const ctx = this.ctx; + if (paths === undefined) { + ctx.beginPath(); + return; + } + ctx.save(); + ctx.beginPath(); + for (const path of paths) { + ctx.setTransform(...path.transform); + ctx.translate(path.x, path.y); + path.addToPath(ctx, path.fontSize); + } + ctx.restore(); + ctx.clip(); + ctx.beginPath(); + delete this.pendingTextPaths; + } + setCharSpacing(spacing) { + this.current.charSpacing = spacing; + } + setWordSpacing(spacing) { + this.current.wordSpacing = spacing; + } + setHScale(scale) { + this.current.textHScale = scale / 100; + } + setLeading(leading) { + this.current.leading = -leading; + } + setFont(fontRefName, size) { + const fontObj = this.commonObjs.get(fontRefName); + const current = this.current; + if (!fontObj) { + throw new Error(`Can't find font for ${fontRefName}`); + } + current.fontMatrix = fontObj.fontMatrix || FONT_IDENTITY_MATRIX; + if (current.fontMatrix[0] === 0 || current.fontMatrix[3] === 0) { + warn("Invalid font matrix for font " + fontRefName); + } + if (size < 0) { + size = -size; + current.fontDirection = -1; + } else { + current.fontDirection = 1; + } + this.current.font = fontObj; + this.current.fontSize = size; + if (fontObj.isType3Font) { + return; + } + const name = fontObj.loadedName || "sans-serif"; + const typeface = fontObj.systemFontInfo?.css || `"${name}", ${fontObj.fallbackName}`; + let bold = "normal"; + if (fontObj.black) { + bold = "900"; + } else if (fontObj.bold) { + bold = "bold"; + } + const italic = fontObj.italic ? "italic" : "normal"; + let browserFontSize = size; + if (size < MIN_FONT_SIZE) { + browserFontSize = MIN_FONT_SIZE; + } else if (size > MAX_FONT_SIZE) { + browserFontSize = MAX_FONT_SIZE; + } + this.current.fontSizeScale = size / browserFontSize; + this.ctx.font = `${italic} ${bold} ${browserFontSize}px ${typeface}`; + } + setTextRenderingMode(mode) { + this.current.textRenderingMode = mode; + } + setTextRise(rise) { + this.current.textRise = rise; + } + moveText(x, y) { + this.current.x = this.current.lineX += x; + this.current.y = this.current.lineY += y; + } + setLeadingMoveText(x, y) { + this.setLeading(-y); + this.moveText(x, y); + } + setTextMatrix(a, b, c, d, e, f) { + this.current.textMatrix = [a, b, c, d, e, f]; + this.current.textMatrixScale = Math.hypot(a, b); + this.current.x = this.current.lineX = 0; + this.current.y = this.current.lineY = 0; + } + nextLine() { + this.moveText(0, this.current.leading); + } + paintChar(character, x, y, patternTransform) { + const ctx = this.ctx; + const current = this.current; + const font = current.font; + const textRenderingMode = current.textRenderingMode; + const fontSize = current.fontSize / current.fontSizeScale; + const fillStrokeMode = textRenderingMode & TextRenderingMode.FILL_STROKE_MASK; + const isAddToPathSet = !!(textRenderingMode & TextRenderingMode.ADD_TO_PATH_FLAG); + const patternFill = current.patternFill && !font.missingFile; + let addToPath; + if (font.disableFontFace || isAddToPathSet || patternFill) { + addToPath = font.getPathGenerator(this.commonObjs, character); + } + if (font.disableFontFace || patternFill) { + ctx.save(); + ctx.translate(x, y); + ctx.beginPath(); + addToPath(ctx, fontSize); + if (patternTransform) { + ctx.setTransform(...patternTransform); + } + if (fillStrokeMode === TextRenderingMode.FILL || fillStrokeMode === TextRenderingMode.FILL_STROKE) { + ctx.fill(); + } + if (fillStrokeMode === TextRenderingMode.STROKE || fillStrokeMode === TextRenderingMode.FILL_STROKE) { + ctx.stroke(); + } + ctx.restore(); + } else { + if (fillStrokeMode === TextRenderingMode.FILL || fillStrokeMode === TextRenderingMode.FILL_STROKE) { + ctx.fillText(character, x, y); + } + if (fillStrokeMode === TextRenderingMode.STROKE || fillStrokeMode === TextRenderingMode.FILL_STROKE) { + ctx.strokeText(character, x, y); + } + } + if (isAddToPathSet) { + const paths = this.pendingTextPaths ||= []; + paths.push({ + transform: getCurrentTransform(ctx), + x, + y, + fontSize, + addToPath + }); + } + } + get isFontSubpixelAAEnabled() { + const { + context: ctx + } = this.cachedCanvases.getCanvas("isFontSubpixelAAEnabled", 10, 10); + ctx.scale(1.5, 1); + ctx.fillText("I", 0, 10); + const data = ctx.getImageData(0, 0, 10, 10).data; + let enabled = false; + for (let i = 3; i < data.length; i += 4) { + if (data[i] > 0 && data[i] < 255) { + enabled = true; + break; + } + } + return shadow(this, "isFontSubpixelAAEnabled", enabled); + } + showText(glyphs) { + const current = this.current; + const font = current.font; + if (font.isType3Font) { + return this.showType3Text(glyphs); + } + const fontSize = current.fontSize; + if (fontSize === 0) { + return undefined; + } + const ctx = this.ctx; + const fontSizeScale = current.fontSizeScale; + const charSpacing = current.charSpacing; + const wordSpacing = current.wordSpacing; + const fontDirection = current.fontDirection; + const textHScale = current.textHScale * fontDirection; + const glyphsLength = glyphs.length; + const vertical = font.vertical; + const spacingDir = vertical ? 1 : -1; + const defaultVMetrics = font.defaultVMetrics; + const widthAdvanceScale = fontSize * current.fontMatrix[0]; + const simpleFillText = current.textRenderingMode === TextRenderingMode.FILL && !font.disableFontFace && !current.patternFill; + ctx.save(); + ctx.transform(...current.textMatrix); + ctx.translate(current.x, current.y + current.textRise); + if (fontDirection > 0) { + ctx.scale(textHScale, -1); + } else { + ctx.scale(textHScale, 1); + } + let patternTransform; + if (current.patternFill) { + ctx.save(); + const pattern = current.fillColor.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.FILL); + patternTransform = getCurrentTransform(ctx); + ctx.restore(); + ctx.fillStyle = pattern; + } + let lineWidth = current.lineWidth; + const scale = current.textMatrixScale; + if (scale === 0 || lineWidth === 0) { + const fillStrokeMode = current.textRenderingMode & TextRenderingMode.FILL_STROKE_MASK; + if (fillStrokeMode === TextRenderingMode.STROKE || fillStrokeMode === TextRenderingMode.FILL_STROKE) { + lineWidth = this.getSinglePixelWidth(); + } + } else { + lineWidth /= scale; + } + if (fontSizeScale !== 1.0) { + ctx.scale(fontSizeScale, fontSizeScale); + lineWidth /= fontSizeScale; + } + ctx.lineWidth = lineWidth; + if (font.isInvalidPDFjsFont) { + const chars = []; + let width = 0; + for (const glyph of glyphs) { + chars.push(glyph.unicode); + width += glyph.width; + } + ctx.fillText(chars.join(""), 0, 0); + current.x += width * widthAdvanceScale * textHScale; + ctx.restore(); + this.compose(); + return undefined; + } + let x = 0, + i; + for (i = 0; i < glyphsLength; ++i) { + const glyph = glyphs[i]; + if (typeof glyph === "number") { + x += spacingDir * glyph * fontSize / 1000; + continue; + } + let restoreNeeded = false; + const spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing; + const character = glyph.fontChar; + const accent = glyph.accent; + let scaledX, scaledY; + let width = glyph.width; + if (vertical) { + const vmetric = glyph.vmetric || defaultVMetrics; + const vx = -(glyph.vmetric ? vmetric[1] : width * 0.5) * widthAdvanceScale; + const vy = vmetric[2] * widthAdvanceScale; + width = vmetric ? -vmetric[0] : width; + scaledX = vx / fontSizeScale; + scaledY = (x + vy) / fontSizeScale; + } else { + scaledX = x / fontSizeScale; + scaledY = 0; + } + if (font.remeasure && width > 0) { + const measuredWidth = ctx.measureText(character).width * 1000 / fontSize * fontSizeScale; + if (width < measuredWidth && this.isFontSubpixelAAEnabled) { + const characterScaleX = width / measuredWidth; + restoreNeeded = true; + ctx.save(); + ctx.scale(characterScaleX, 1); + scaledX /= characterScaleX; + } else if (width !== measuredWidth) { + scaledX += (width - measuredWidth) / 2000 * fontSize / fontSizeScale; + } + } + if (this.contentVisible && (glyph.isInFont || font.missingFile)) { + if (simpleFillText && !accent) { + ctx.fillText(character, scaledX, scaledY); + } else { + this.paintChar(character, scaledX, scaledY, patternTransform); + if (accent) { + const scaledAccentX = scaledX + fontSize * accent.offset.x / fontSizeScale; + const scaledAccentY = scaledY - fontSize * accent.offset.y / fontSizeScale; + this.paintChar(accent.fontChar, scaledAccentX, scaledAccentY, patternTransform); + } + } + } + const charWidth = vertical ? width * widthAdvanceScale - spacing * fontDirection : width * widthAdvanceScale + spacing * fontDirection; + x += charWidth; + if (restoreNeeded) { + ctx.restore(); + } + } + if (vertical) { + current.y -= x; + } else { + current.x += x * textHScale; + } + ctx.restore(); + this.compose(); + return undefined; + } + showType3Text(glyphs) { + const ctx = this.ctx; + const current = this.current; + const font = current.font; + const fontSize = current.fontSize; + const fontDirection = current.fontDirection; + const spacingDir = font.vertical ? 1 : -1; + const charSpacing = current.charSpacing; + const wordSpacing = current.wordSpacing; + const textHScale = current.textHScale * fontDirection; + const fontMatrix = current.fontMatrix || FONT_IDENTITY_MATRIX; + const glyphsLength = glyphs.length; + const isTextInvisible = current.textRenderingMode === TextRenderingMode.INVISIBLE; + let i, glyph, width, spacingLength; + if (isTextInvisible || fontSize === 0) { + return; + } + this._cachedScaleForStroking[0] = -1; + this._cachedGetSinglePixelWidth = null; + ctx.save(); + ctx.transform(...current.textMatrix); + ctx.translate(current.x, current.y); + ctx.scale(textHScale, fontDirection); + for (i = 0; i < glyphsLength; ++i) { + glyph = glyphs[i]; + if (typeof glyph === "number") { + spacingLength = spacingDir * glyph * fontSize / 1000; + this.ctx.translate(spacingLength, 0); + current.x += spacingLength * textHScale; + continue; + } + const spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing; + const operatorList = font.charProcOperatorList[glyph.operatorListId]; + if (!operatorList) { + warn(`Type3 character "${glyph.operatorListId}" is not available.`); + continue; + } + if (this.contentVisible) { + this.processingType3 = glyph; + this.save(); + ctx.scale(fontSize, fontSize); + ctx.transform(...fontMatrix); + this.executeOperatorList(operatorList); + this.restore(); + } + const transformed = Util.applyTransform([glyph.width, 0], fontMatrix); + width = transformed[0] * fontSize + spacing; + ctx.translate(width, 0); + current.x += width * textHScale; + } + ctx.restore(); + this.processingType3 = null; + } + setCharWidth(xWidth, yWidth) {} + setCharWidthAndBounds(xWidth, yWidth, llx, lly, urx, ury) { + this.ctx.rect(llx, lly, urx - llx, ury - lly); + this.ctx.clip(); + this.endPath(); + } + getColorN_Pattern(IR) { + let pattern; + if (IR[0] === "TilingPattern") { + const color = IR[1]; + const baseTransform = this.baseTransform || getCurrentTransform(this.ctx); + const canvasGraphicsFactory = { + createCanvasGraphics: ctx => new CanvasGraphics(ctx, this.commonObjs, this.objs, this.canvasFactory, this.filterFactory, { + optionalContentConfig: this.optionalContentConfig, + markedContentStack: this.markedContentStack + }) + }; + pattern = new TilingPattern(IR, color, this.ctx, canvasGraphicsFactory, baseTransform); + } else { + pattern = this._getPattern(IR[1], IR[2]); + } + return pattern; + } + setStrokeColorN() { + this.current.strokeColor = this.getColorN_Pattern(arguments); + } + setFillColorN() { + this.current.fillColor = this.getColorN_Pattern(arguments); + this.current.patternFill = true; + } + setStrokeRGBColor(r, g, b) { + const color = Util.makeHexColor(r, g, b); + this.ctx.strokeStyle = color; + this.current.strokeColor = color; + } + setFillRGBColor(r, g, b) { + const color = Util.makeHexColor(r, g, b); + this.ctx.fillStyle = color; + this.current.fillColor = color; + this.current.patternFill = false; + } + _getPattern(objId, matrix = null) { + let pattern; + if (this.cachedPatterns.has(objId)) { + pattern = this.cachedPatterns.get(objId); + } else { + pattern = getShadingPattern(this.getObject(objId)); + this.cachedPatterns.set(objId, pattern); + } + if (matrix) { + pattern.matrix = matrix; + } + return pattern; + } + shadingFill(objId) { + if (!this.contentVisible) { + return; + } + const ctx = this.ctx; + this.save(); + const pattern = this._getPattern(objId); + ctx.fillStyle = pattern.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.SHADING); + const inv = getCurrentTransformInverse(ctx); + if (inv) { + const { + width, + height + } = ctx.canvas; + const [x0, y0, x1, y1] = Util.getAxialAlignedBoundingBox([0, 0, width, height], inv); + this.ctx.fillRect(x0, y0, x1 - x0, y1 - y0); + } else { + this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10); + } + this.compose(this.current.getClippedPathBoundingBox()); + this.restore(); + } + beginInlineImage() { + unreachable("Should not call beginInlineImage"); + } + beginImageData() { + unreachable("Should not call beginImageData"); + } + paintFormXObjectBegin(matrix, bbox) { + if (!this.contentVisible) { + return; + } + this.save(); + this.baseTransformStack.push(this.baseTransform); + if (matrix) { + this.transform(...matrix); + } + this.baseTransform = getCurrentTransform(this.ctx); + if (bbox) { + const width = bbox[2] - bbox[0]; + const height = bbox[3] - bbox[1]; + this.ctx.rect(bbox[0], bbox[1], width, height); + this.current.updateRectMinMax(getCurrentTransform(this.ctx), bbox); + this.clip(); + this.endPath(); + } + } + paintFormXObjectEnd() { + if (!this.contentVisible) { + return; + } + this.restore(); + this.baseTransform = this.baseTransformStack.pop(); + } + beginGroup(group) { + if (!this.contentVisible) { + return; + } + this.save(); + if (this.inSMaskMode) { + this.endSMaskMode(); + this.current.activeSMask = null; + } + const currentCtx = this.ctx; + if (!group.isolated) { + info("TODO: Support non-isolated groups."); + } + if (group.knockout) { + warn("Knockout groups not supported."); + } + const currentTransform = getCurrentTransform(currentCtx); + if (group.matrix) { + currentCtx.transform(...group.matrix); + } + if (!group.bbox) { + throw new Error("Bounding box is required."); + } + let bounds = Util.getAxialAlignedBoundingBox(group.bbox, getCurrentTransform(currentCtx)); + const canvasBounds = [0, 0, currentCtx.canvas.width, currentCtx.canvas.height]; + bounds = Util.intersect(bounds, canvasBounds) || [0, 0, 0, 0]; + const offsetX = Math.floor(bounds[0]); + const offsetY = Math.floor(bounds[1]); + const drawnWidth = Math.max(Math.ceil(bounds[2]) - offsetX, 1); + const drawnHeight = Math.max(Math.ceil(bounds[3]) - offsetY, 1); + this.current.startNewPathAndClipBox([0, 0, drawnWidth, drawnHeight]); + let cacheId = "groupAt" + this.groupLevel; + if (group.smask) { + cacheId += "_smask_" + this.smaskCounter++ % 2; + } + const scratchCanvas = this.cachedCanvases.getCanvas(cacheId, drawnWidth, drawnHeight); + const groupCtx = scratchCanvas.context; + groupCtx.translate(-offsetX, -offsetY); + groupCtx.transform(...currentTransform); + if (group.smask) { + this.smaskStack.push({ + canvas: scratchCanvas.canvas, + context: groupCtx, + offsetX, + offsetY, + subtype: group.smask.subtype, + backdrop: group.smask.backdrop, + transferMap: group.smask.transferMap || null, + startTransformInverse: null + }); + } else { + currentCtx.setTransform(1, 0, 0, 1, 0, 0); + currentCtx.translate(offsetX, offsetY); + currentCtx.save(); + } + copyCtxState(currentCtx, groupCtx); + this.ctx = groupCtx; + this.setGState([["BM", "source-over"], ["ca", 1], ["CA", 1]]); + this.groupStack.push(currentCtx); + this.groupLevel++; + } + endGroup(group) { + if (!this.contentVisible) { + return; + } + this.groupLevel--; + const groupCtx = this.ctx; + const ctx = this.groupStack.pop(); + this.ctx = ctx; + this.ctx.imageSmoothingEnabled = false; + if (group.smask) { + this.tempSMask = this.smaskStack.pop(); + this.restore(); + } else { + this.ctx.restore(); + const currentMtx = getCurrentTransform(this.ctx); + this.restore(); + this.ctx.save(); + this.ctx.setTransform(...currentMtx); + const dirtyBox = Util.getAxialAlignedBoundingBox([0, 0, groupCtx.canvas.width, groupCtx.canvas.height], currentMtx); + this.ctx.drawImage(groupCtx.canvas, 0, 0); + this.ctx.restore(); + this.compose(dirtyBox); + } + } + beginAnnotation(id, rect, transform, matrix, hasOwnCanvas) { + this.#restoreInitialState(); + resetCtxToDefault(this.ctx); + this.ctx.save(); + this.save(); + if (this.baseTransform) { + this.ctx.setTransform(...this.baseTransform); + } + if (rect) { + const width = rect[2] - rect[0]; + const height = rect[3] - rect[1]; + if (hasOwnCanvas && this.annotationCanvasMap) { + transform = transform.slice(); + transform[4] -= rect[0]; + transform[5] -= rect[1]; + rect = rect.slice(); + rect[0] = rect[1] = 0; + rect[2] = width; + rect[3] = height; + const [scaleX, scaleY] = Util.singularValueDecompose2dScale(getCurrentTransform(this.ctx)); + const { + viewportScale + } = this; + const canvasWidth = Math.ceil(width * this.outputScaleX * viewportScale); + const canvasHeight = Math.ceil(height * this.outputScaleY * viewportScale); + this.annotationCanvas = this.canvasFactory.create(canvasWidth, canvasHeight); + const { + canvas, + context + } = this.annotationCanvas; + this.annotationCanvasMap.set(id, canvas); + this.annotationCanvas.savedCtx = this.ctx; + this.ctx = context; + this.ctx.save(); + this.ctx.setTransform(scaleX, 0, 0, -scaleY, 0, height * scaleY); + resetCtxToDefault(this.ctx); + } else { + resetCtxToDefault(this.ctx); + this.ctx.rect(rect[0], rect[1], width, height); + this.ctx.clip(); + this.endPath(); + } + } + this.current = new CanvasExtraState(this.ctx.canvas.width, this.ctx.canvas.height); + this.transform(...transform); + this.transform(...matrix); + } + endAnnotation() { + if (this.annotationCanvas) { + this.ctx.restore(); + this.#drawFilter(); + this.ctx = this.annotationCanvas.savedCtx; + delete this.annotationCanvas.savedCtx; + delete this.annotationCanvas; + } + } + paintImageMaskXObject(img) { + if (!this.contentVisible) { + return; + } + const count = img.count; + img = this.getObject(img.data, img); + img.count = count; + const ctx = this.ctx; + const glyph = this.processingType3; + if (glyph) { + if (glyph.compiled === undefined) { + glyph.compiled = compileType3Glyph(img); + } + if (glyph.compiled) { + glyph.compiled(ctx); + return; + } + } + const mask = this._createMaskCanvas(img); + const maskCanvas = mask.canvas; + ctx.save(); + ctx.setTransform(1, 0, 0, 1, 0, 0); + ctx.drawImage(maskCanvas, mask.offsetX, mask.offsetY); + ctx.restore(); + this.compose(); + } + paintImageMaskXObjectRepeat(img, scaleX, skewX = 0, skewY = 0, scaleY, positions) { + if (!this.contentVisible) { + return; + } + img = this.getObject(img.data, img); + const ctx = this.ctx; + ctx.save(); + const currentTransform = getCurrentTransform(ctx); + ctx.transform(scaleX, skewX, skewY, scaleY, 0, 0); + const mask = this._createMaskCanvas(img); + ctx.setTransform(1, 0, 0, 1, mask.offsetX - currentTransform[4], mask.offsetY - currentTransform[5]); + for (let i = 0, ii = positions.length; i < ii; i += 2) { + const trans = Util.transform(currentTransform, [scaleX, skewX, skewY, scaleY, positions[i], positions[i + 1]]); + const [x, y] = Util.applyTransform([0, 0], trans); + ctx.drawImage(mask.canvas, x, y); + } + ctx.restore(); + this.compose(); + } + paintImageMaskXObjectGroup(images) { + if (!this.contentVisible) { + return; + } + const ctx = this.ctx; + const fillColor = this.current.fillColor; + const isPatternFill = this.current.patternFill; + for (const image of images) { + const { + data, + width, + height, + transform + } = image; + const maskCanvas = this.cachedCanvases.getCanvas("maskCanvas", width, height); + const maskCtx = maskCanvas.context; + maskCtx.save(); + const img = this.getObject(data, image); + putBinaryImageMask(maskCtx, img); + maskCtx.globalCompositeOperation = "source-in"; + maskCtx.fillStyle = isPatternFill ? fillColor.getPattern(maskCtx, this, getCurrentTransformInverse(ctx), PathType.FILL) : fillColor; + maskCtx.fillRect(0, 0, width, height); + maskCtx.restore(); + ctx.save(); + ctx.transform(...transform); + ctx.scale(1, -1); + drawImageAtIntegerCoords(ctx, maskCanvas.canvas, 0, 0, width, height, 0, -1, 1, 1); + ctx.restore(); + } + this.compose(); + } + paintImageXObject(objId) { + if (!this.contentVisible) { + return; + } + const imgData = this.getObject(objId); + if (!imgData) { + warn("Dependent image isn't ready yet"); + return; + } + this.paintInlineImageXObject(imgData); + } + paintImageXObjectRepeat(objId, scaleX, scaleY, positions) { + if (!this.contentVisible) { + return; + } + const imgData = this.getObject(objId); + if (!imgData) { + warn("Dependent image isn't ready yet"); + return; + } + const width = imgData.width; + const height = imgData.height; + const map = []; + for (let i = 0, ii = positions.length; i < ii; i += 2) { + map.push({ + transform: [scaleX, 0, 0, scaleY, positions[i], positions[i + 1]], + x: 0, + y: 0, + w: width, + h: height + }); + } + this.paintInlineImageXObjectGroup(imgData, map); + } + applyTransferMapsToCanvas(ctx) { + if (this.current.transferMaps !== "none") { + ctx.filter = this.current.transferMaps; + ctx.drawImage(ctx.canvas, 0, 0); + ctx.filter = "none"; + } + return ctx.canvas; + } + applyTransferMapsToBitmap(imgData) { + if (this.current.transferMaps === "none") { + return imgData.bitmap; + } + const { + bitmap, + width, + height + } = imgData; + const tmpCanvas = this.cachedCanvases.getCanvas("inlineImage", width, height); + const tmpCtx = tmpCanvas.context; + tmpCtx.filter = this.current.transferMaps; + tmpCtx.drawImage(bitmap, 0, 0); + tmpCtx.filter = "none"; + return tmpCanvas.canvas; + } + paintInlineImageXObject(imgData) { + if (!this.contentVisible) { + return; + } + const width = imgData.width; + const height = imgData.height; + const ctx = this.ctx; + this.save(); + if (!isNodeJS) { + const { + filter + } = ctx; + if (filter !== "none" && filter !== "") { + ctx.filter = "none"; + } + } + ctx.scale(1 / width, -1 / height); + let imgToPaint; + if (imgData.bitmap) { + imgToPaint = this.applyTransferMapsToBitmap(imgData); + } else if (typeof HTMLElement === "function" && imgData instanceof HTMLElement || !imgData.data) { + imgToPaint = imgData; + } else { + const tmpCanvas = this.cachedCanvases.getCanvas("inlineImage", width, height); + const tmpCtx = tmpCanvas.context; + putBinaryImageData(tmpCtx, imgData); + imgToPaint = this.applyTransferMapsToCanvas(tmpCtx); + } + const scaled = this._scaleImage(imgToPaint, getCurrentTransformInverse(ctx)); + ctx.imageSmoothingEnabled = getImageSmoothingEnabled(getCurrentTransform(ctx), imgData.interpolate); + drawImageAtIntegerCoords(ctx, scaled.img, 0, 0, scaled.paintWidth, scaled.paintHeight, 0, -height, width, height); + this.compose(); + this.restore(); + } + paintInlineImageXObjectGroup(imgData, map) { + if (!this.contentVisible) { + return; + } + const ctx = this.ctx; + let imgToPaint; + if (imgData.bitmap) { + imgToPaint = imgData.bitmap; + } else { + const w = imgData.width; + const h = imgData.height; + const tmpCanvas = this.cachedCanvases.getCanvas("inlineImage", w, h); + const tmpCtx = tmpCanvas.context; + putBinaryImageData(tmpCtx, imgData); + imgToPaint = this.applyTransferMapsToCanvas(tmpCtx); + } + for (const entry of map) { + ctx.save(); + ctx.transform(...entry.transform); + ctx.scale(1, -1); + drawImageAtIntegerCoords(ctx, imgToPaint, entry.x, entry.y, entry.w, entry.h, 0, -1, 1, 1); + ctx.restore(); + } + this.compose(); + } + paintSolidColorImageMask() { + if (!this.contentVisible) { + return; + } + this.ctx.fillRect(0, 0, 1, 1); + this.compose(); + } + markPoint(tag) {} + markPointProps(tag, properties) {} + beginMarkedContent(tag) { + this.markedContentStack.push({ + visible: true + }); + } + beginMarkedContentProps(tag, properties) { + if (tag === "OC") { + this.markedContentStack.push({ + visible: this.optionalContentConfig.isVisible(properties) + }); + } else { + this.markedContentStack.push({ + visible: true + }); + } + this.contentVisible = this.isContentVisible(); + } + endMarkedContent() { + this.markedContentStack.pop(); + this.contentVisible = this.isContentVisible(); + } + beginCompat() {} + endCompat() {} + consumePath(clipBox) { + const isEmpty = this.current.isEmptyClip(); + if (this.pendingClip) { + this.current.updateClipFromPath(); + } + if (!this.pendingClip) { + this.compose(clipBox); + } + const ctx = this.ctx; + if (this.pendingClip) { + if (!isEmpty) { + if (this.pendingClip === EO_CLIP) { + ctx.clip("evenodd"); + } else { + ctx.clip(); + } + } + this.pendingClip = null; + } + this.current.startNewPathAndClipBox(this.current.clipBox); + ctx.beginPath(); + } + getSinglePixelWidth() { + if (!this._cachedGetSinglePixelWidth) { + const m = getCurrentTransform(this.ctx); + if (m[1] === 0 && m[2] === 0) { + this._cachedGetSinglePixelWidth = 1 / Math.min(Math.abs(m[0]), Math.abs(m[3])); + } else { + const absDet = Math.abs(m[0] * m[3] - m[2] * m[1]); + const normX = Math.hypot(m[0], m[2]); + const normY = Math.hypot(m[1], m[3]); + this._cachedGetSinglePixelWidth = Math.max(normX, normY) / absDet; + } + } + return this._cachedGetSinglePixelWidth; + } + getScaleForStroking() { + if (this._cachedScaleForStroking[0] === -1) { + const { + lineWidth + } = this.current; + const { + a, + b, + c, + d + } = this.ctx.getTransform(); + let scaleX, scaleY; + if (b === 0 && c === 0) { + const normX = Math.abs(a); + const normY = Math.abs(d); + if (normX === normY) { + if (lineWidth === 0) { + scaleX = scaleY = 1 / normX; + } else { + const scaledLineWidth = normX * lineWidth; + scaleX = scaleY = scaledLineWidth < 1 ? 1 / scaledLineWidth : 1; + } + } else if (lineWidth === 0) { + scaleX = 1 / normX; + scaleY = 1 / normY; + } else { + const scaledXLineWidth = normX * lineWidth; + const scaledYLineWidth = normY * lineWidth; + scaleX = scaledXLineWidth < 1 ? 1 / scaledXLineWidth : 1; + scaleY = scaledYLineWidth < 1 ? 1 / scaledYLineWidth : 1; + } + } else { + const absDet = Math.abs(a * d - b * c); + const normX = Math.hypot(a, b); + const normY = Math.hypot(c, d); + if (lineWidth === 0) { + scaleX = normY / absDet; + scaleY = normX / absDet; + } else { + const baseArea = lineWidth * absDet; + scaleX = normY > baseArea ? normY / baseArea : 1; + scaleY = normX > baseArea ? normX / baseArea : 1; + } + } + this._cachedScaleForStroking[0] = scaleX; + this._cachedScaleForStroking[1] = scaleY; + } + return this._cachedScaleForStroking; + } + rescaleAndStroke(saveRestore) { + const { + ctx + } = this; + const { + lineWidth + } = this.current; + const [scaleX, scaleY] = this.getScaleForStroking(); + ctx.lineWidth = lineWidth || 1; + if (scaleX === 1 && scaleY === 1) { + ctx.stroke(); + return; + } + const dashes = ctx.getLineDash(); + if (saveRestore) { + ctx.save(); + } + ctx.scale(scaleX, scaleY); + if (dashes.length > 0) { + const scale = Math.max(scaleX, scaleY); + ctx.setLineDash(dashes.map(x => x / scale)); + ctx.lineDashOffset /= scale; + } + ctx.stroke(); + if (saveRestore) { + ctx.restore(); + } + } + isContentVisible() { + for (let i = this.markedContentStack.length - 1; i >= 0; i--) { + if (!this.markedContentStack[i].visible) { + return false; + } + } + return true; + } +} +for (const op in OPS) { + if (CanvasGraphics.prototype[op] !== undefined) { + CanvasGraphics.prototype[OPS[op]] = CanvasGraphics.prototype[op]; + } +} + +;// CONCATENATED MODULE: ./src/display/worker_options.js +class GlobalWorkerOptions { + static #port = null; + static #src = ""; + static get workerPort() { + return this.#port; + } + static set workerPort(val) { + if (!(typeof Worker !== "undefined" && val instanceof Worker) && val !== null) { + throw new Error("Invalid `workerPort` type."); + } + this.#port = val; + } + static get workerSrc() { + return this.#src; + } + static set workerSrc(val) { + if (typeof val !== "string") { + throw new Error("Invalid `workerSrc` type."); + } + this.#src = val; + } +} + +;// CONCATENATED MODULE: ./src/shared/message_handler.js + +const CallbackKind = { + UNKNOWN: 0, + DATA: 1, + ERROR: 2 +}; +const StreamKind = { + UNKNOWN: 0, + CANCEL: 1, + CANCEL_COMPLETE: 2, + CLOSE: 3, + ENQUEUE: 4, + ERROR: 5, + PULL: 6, + PULL_COMPLETE: 7, + START_COMPLETE: 8 +}; +function wrapReason(reason) { + if (!(reason instanceof Error || typeof reason === "object" && reason !== null)) { + unreachable('wrapReason: Expected "reason" to be a (possibly cloned) Error.'); + } + switch (reason.name) { + case "AbortException": + return new AbortException(reason.message); + case "MissingPDFException": + return new MissingPDFException(reason.message); + case "PasswordException": + return new PasswordException(reason.message, reason.code); + case "UnexpectedResponseException": + return new UnexpectedResponseException(reason.message, reason.status); + case "UnknownErrorException": + return new UnknownErrorException(reason.message, reason.details); + default: + return new UnknownErrorException(reason.message, reason.toString()); + } +} +class MessageHandler { + constructor(sourceName, targetName, comObj) { + this.sourceName = sourceName; + this.targetName = targetName; + this.comObj = comObj; + this.callbackId = 1; + this.streamId = 1; + this.streamSinks = Object.create(null); + this.streamControllers = Object.create(null); + this.callbackCapabilities = Object.create(null); + this.actionHandler = Object.create(null); + this._onComObjOnMessage = event => { + const data = event.data; + if (data.targetName !== this.sourceName) { + return; + } + if (data.stream) { + this.#processStreamMessage(data); + return; + } + if (data.callback) { + const callbackId = data.callbackId; + const capability = this.callbackCapabilities[callbackId]; + if (!capability) { + throw new Error(`Cannot resolve callback ${callbackId}`); + } + delete this.callbackCapabilities[callbackId]; + if (data.callback === CallbackKind.DATA) { + capability.resolve(data.data); + } else if (data.callback === CallbackKind.ERROR) { + capability.reject(wrapReason(data.reason)); + } else { + throw new Error("Unexpected callback case"); + } + return; + } + const action = this.actionHandler[data.action]; + if (!action) { + throw new Error(`Unknown action from worker: ${data.action}`); + } + if (data.callbackId) { + const cbSourceName = this.sourceName; + const cbTargetName = data.sourceName; + new Promise(function (resolve) { + resolve(action(data.data)); + }).then(function (result) { + comObj.postMessage({ + sourceName: cbSourceName, + targetName: cbTargetName, + callback: CallbackKind.DATA, + callbackId: data.callbackId, + data: result + }); + }, function (reason) { + comObj.postMessage({ + sourceName: cbSourceName, + targetName: cbTargetName, + callback: CallbackKind.ERROR, + callbackId: data.callbackId, + reason: wrapReason(reason) + }); + }); + return; + } + if (data.streamId) { + this.#createStreamSink(data); + return; + } + action(data.data); + }; + comObj.addEventListener("message", this._onComObjOnMessage); + } + on(actionName, handler) { + const ah = this.actionHandler; + if (ah[actionName]) { + throw new Error(`There is already an actionName called "${actionName}"`); + } + ah[actionName] = handler; + } + send(actionName, data, transfers) { + this.comObj.postMessage({ + sourceName: this.sourceName, + targetName: this.targetName, + action: actionName, + data + }, transfers); + } + sendWithPromise(actionName, data, transfers) { + const callbackId = this.callbackId++; + const capability = Promise.withResolvers(); + this.callbackCapabilities[callbackId] = capability; + try { + this.comObj.postMessage({ + sourceName: this.sourceName, + targetName: this.targetName, + action: actionName, + callbackId, + data + }, transfers); + } catch (ex) { + capability.reject(ex); + } + return capability.promise; + } + sendWithStream(actionName, data, queueingStrategy, transfers) { + const streamId = this.streamId++, + sourceName = this.sourceName, + targetName = this.targetName, + comObj = this.comObj; + return new ReadableStream({ + start: controller => { + const startCapability = Promise.withResolvers(); + this.streamControllers[streamId] = { + controller, + startCall: startCapability, + pullCall: null, + cancelCall: null, + isClosed: false + }; + comObj.postMessage({ + sourceName, + targetName, + action: actionName, + streamId, + data, + desiredSize: controller.desiredSize + }, transfers); + return startCapability.promise; + }, + pull: controller => { + const pullCapability = Promise.withResolvers(); + this.streamControllers[streamId].pullCall = pullCapability; + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL, + streamId, + desiredSize: controller.desiredSize + }); + return pullCapability.promise; + }, + cancel: reason => { + assert(reason instanceof Error, "cancel must have a valid reason"); + const cancelCapability = Promise.withResolvers(); + this.streamControllers[streamId].cancelCall = cancelCapability; + this.streamControllers[streamId].isClosed = true; + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CANCEL, + streamId, + reason: wrapReason(reason) + }); + return cancelCapability.promise; + } + }, queueingStrategy); + } + #createStreamSink(data) { + const streamId = data.streamId, + sourceName = this.sourceName, + targetName = data.sourceName, + comObj = this.comObj; + const self = this, + action = this.actionHandler[data.action]; + const streamSink = { + enqueue(chunk, size = 1, transfers) { + if (this.isCancelled) { + return; + } + const lastDesiredSize = this.desiredSize; + this.desiredSize -= size; + if (lastDesiredSize > 0 && this.desiredSize <= 0) { + this.sinkCapability = Promise.withResolvers(); + this.ready = this.sinkCapability.promise; + } + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.ENQUEUE, + streamId, + chunk + }, transfers); + }, + close() { + if (this.isCancelled) { + return; + } + this.isCancelled = true; + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CLOSE, + streamId + }); + delete self.streamSinks[streamId]; + }, + error(reason) { + assert(reason instanceof Error, "error must have a valid reason"); + if (this.isCancelled) { + return; + } + this.isCancelled = true; + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.ERROR, + streamId, + reason: wrapReason(reason) + }); + }, + sinkCapability: Promise.withResolvers(), + onPull: null, + onCancel: null, + isCancelled: false, + desiredSize: data.desiredSize, + ready: null + }; + streamSink.sinkCapability.resolve(); + streamSink.ready = streamSink.sinkCapability.promise; + this.streamSinks[streamId] = streamSink; + new Promise(function (resolve) { + resolve(action(data.data, streamSink)); + }).then(function () { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.START_COMPLETE, + streamId, + success: true + }); + }, function (reason) { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.START_COMPLETE, + streamId, + reason: wrapReason(reason) + }); + }); + } + #processStreamMessage(data) { + const streamId = data.streamId, + sourceName = this.sourceName, + targetName = data.sourceName, + comObj = this.comObj; + const streamController = this.streamControllers[streamId], + streamSink = this.streamSinks[streamId]; + switch (data.stream) { + case StreamKind.START_COMPLETE: + if (data.success) { + streamController.startCall.resolve(); + } else { + streamController.startCall.reject(wrapReason(data.reason)); + } + break; + case StreamKind.PULL_COMPLETE: + if (data.success) { + streamController.pullCall.resolve(); + } else { + streamController.pullCall.reject(wrapReason(data.reason)); + } + break; + case StreamKind.PULL: + if (!streamSink) { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL_COMPLETE, + streamId, + success: true + }); + break; + } + if (streamSink.desiredSize <= 0 && data.desiredSize > 0) { + streamSink.sinkCapability.resolve(); + } + streamSink.desiredSize = data.desiredSize; + new Promise(function (resolve) { + resolve(streamSink.onPull?.()); + }).then(function () { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL_COMPLETE, + streamId, + success: true + }); + }, function (reason) { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL_COMPLETE, + streamId, + reason: wrapReason(reason) + }); + }); + break; + case StreamKind.ENQUEUE: + assert(streamController, "enqueue should have stream controller"); + if (streamController.isClosed) { + break; + } + streamController.controller.enqueue(data.chunk); + break; + case StreamKind.CLOSE: + assert(streamController, "close should have stream controller"); + if (streamController.isClosed) { + break; + } + streamController.isClosed = true; + streamController.controller.close(); + this.#deleteStreamController(streamController, streamId); + break; + case StreamKind.ERROR: + assert(streamController, "error should have stream controller"); + streamController.controller.error(wrapReason(data.reason)); + this.#deleteStreamController(streamController, streamId); + break; + case StreamKind.CANCEL_COMPLETE: + if (data.success) { + streamController.cancelCall.resolve(); + } else { + streamController.cancelCall.reject(wrapReason(data.reason)); + } + this.#deleteStreamController(streamController, streamId); + break; + case StreamKind.CANCEL: + if (!streamSink) { + break; + } + new Promise(function (resolve) { + resolve(streamSink.onCancel?.(wrapReason(data.reason))); + }).then(function () { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CANCEL_COMPLETE, + streamId, + success: true + }); + }, function (reason) { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CANCEL_COMPLETE, + streamId, + reason: wrapReason(reason) + }); + }); + streamSink.sinkCapability.reject(wrapReason(data.reason)); + streamSink.isCancelled = true; + delete this.streamSinks[streamId]; + break; + default: + throw new Error("Unexpected stream case"); + } + } + async #deleteStreamController(streamController, streamId) { + await Promise.allSettled([streamController.startCall?.promise, streamController.pullCall?.promise, streamController.cancelCall?.promise]); + delete this.streamControllers[streamId]; + } + destroy() { + this.comObj.removeEventListener("message", this._onComObjOnMessage); + } +} + +;// CONCATENATED MODULE: ./src/display/metadata.js + +class Metadata { + #metadataMap; + #data; + constructor({ + parsedData, + rawData + }) { + this.#metadataMap = parsedData; + this.#data = rawData; + } + getRaw() { + return this.#data; + } + get(name) { + return this.#metadataMap.get(name) ?? null; + } + getAll() { + return objectFromMap(this.#metadataMap); + } + has(name) { + return this.#metadataMap.has(name); + } +} + +;// CONCATENATED MODULE: ./src/display/optional_content_config.js + + +const INTERNAL = Symbol("INTERNAL"); +class OptionalContentGroup { + #isDisplay = false; + #isPrint = false; + #userSet = false; + #visible = true; + constructor(renderingIntent, { + name, + intent, + usage + }) { + this.#isDisplay = !!(renderingIntent & RenderingIntentFlag.DISPLAY); + this.#isPrint = !!(renderingIntent & RenderingIntentFlag.PRINT); + this.name = name; + this.intent = intent; + this.usage = usage; + } + get visible() { + if (this.#userSet) { + return this.#visible; + } + if (!this.#visible) { + return false; + } + const { + print, + view + } = this.usage; + if (this.#isDisplay) { + return view?.viewState !== "OFF"; + } else if (this.#isPrint) { + return print?.printState !== "OFF"; + } + return true; + } + _setVisible(internal, visible, userSet = false) { + if (internal !== INTERNAL) { + unreachable("Internal method `_setVisible` called."); + } + this.#userSet = userSet; + this.#visible = visible; + } +} +class OptionalContentConfig { + #cachedGetHash = null; + #groups = new Map(); + #initialHash = null; + #order = null; + constructor(data, renderingIntent = RenderingIntentFlag.DISPLAY) { + this.renderingIntent = renderingIntent; + this.name = null; + this.creator = null; + if (data === null) { + return; + } + this.name = data.name; + this.creator = data.creator; + this.#order = data.order; + for (const group of data.groups) { + this.#groups.set(group.id, new OptionalContentGroup(renderingIntent, group)); + } + if (data.baseState === "OFF") { + for (const group of this.#groups.values()) { + group._setVisible(INTERNAL, false); + } + } + for (const on of data.on) { + this.#groups.get(on)._setVisible(INTERNAL, true); + } + for (const off of data.off) { + this.#groups.get(off)._setVisible(INTERNAL, false); + } + this.#initialHash = this.getHash(); + } + #evaluateVisibilityExpression(array) { + const length = array.length; + if (length < 2) { + return true; + } + const operator = array[0]; + for (let i = 1; i < length; i++) { + const element = array[i]; + let state; + if (Array.isArray(element)) { + state = this.#evaluateVisibilityExpression(element); + } else if (this.#groups.has(element)) { + state = this.#groups.get(element).visible; + } else { + warn(`Optional content group not found: ${element}`); + return true; + } + switch (operator) { + case "And": + if (!state) { + return false; + } + break; + case "Or": + if (state) { + return true; + } + break; + case "Not": + return !state; + default: + return true; + } + } + return operator === "And"; + } + isVisible(group) { + if (this.#groups.size === 0) { + return true; + } + if (!group) { + info("Optional content group not defined."); + return true; + } + if (group.type === "OCG") { + if (!this.#groups.has(group.id)) { + warn(`Optional content group not found: ${group.id}`); + return true; + } + return this.#groups.get(group.id).visible; + } else if (group.type === "OCMD") { + if (group.expression) { + return this.#evaluateVisibilityExpression(group.expression); + } + if (!group.policy || group.policy === "AnyOn") { + for (const id of group.ids) { + if (!this.#groups.has(id)) { + warn(`Optional content group not found: ${id}`); + return true; + } + if (this.#groups.get(id).visible) { + return true; + } + } + return false; + } else if (group.policy === "AllOn") { + for (const id of group.ids) { + if (!this.#groups.has(id)) { + warn(`Optional content group not found: ${id}`); + return true; + } + if (!this.#groups.get(id).visible) { + return false; + } + } + return true; + } else if (group.policy === "AnyOff") { + for (const id of group.ids) { + if (!this.#groups.has(id)) { + warn(`Optional content group not found: ${id}`); + return true; + } + if (!this.#groups.get(id).visible) { + return true; + } + } + return false; + } else if (group.policy === "AllOff") { + for (const id of group.ids) { + if (!this.#groups.has(id)) { + warn(`Optional content group not found: ${id}`); + return true; + } + if (this.#groups.get(id).visible) { + return false; + } + } + return true; + } + warn(`Unknown optional content policy ${group.policy}.`); + return true; + } + warn(`Unknown group type ${group.type}.`); + return true; + } + setVisibility(id, visible = true) { + const group = this.#groups.get(id); + if (!group) { + warn(`Optional content group not found: ${id}`); + return; + } + group._setVisible(INTERNAL, !!visible, true); + this.#cachedGetHash = null; + } + setOCGState({ + state, + preserveRB + }) { + let operator; + for (const elem of state) { + switch (elem) { + case "ON": + case "OFF": + case "Toggle": + operator = elem; + continue; + } + const group = this.#groups.get(elem); + if (!group) { + continue; + } + switch (operator) { + case "ON": + group._setVisible(INTERNAL, true); + break; + case "OFF": + group._setVisible(INTERNAL, false); + break; + case "Toggle": + group._setVisible(INTERNAL, !group.visible); + break; + } + } + this.#cachedGetHash = null; + } + get hasInitialVisibility() { + return this.#initialHash === null || this.getHash() === this.#initialHash; + } + getOrder() { + if (!this.#groups.size) { + return null; + } + if (this.#order) { + return this.#order.slice(); + } + return [...this.#groups.keys()]; + } + getGroups() { + return this.#groups.size > 0 ? objectFromMap(this.#groups) : null; + } + getGroup(id) { + return this.#groups.get(id) || null; + } + getHash() { + if (this.#cachedGetHash !== null) { + return this.#cachedGetHash; + } + const hash = new MurmurHash3_64(); + for (const [id, group] of this.#groups) { + hash.update(`${id}:${group.visible}`); + } + return this.#cachedGetHash = hash.hexdigest(); + } +} + +;// CONCATENATED MODULE: ./src/display/transport_stream.js + + +class PDFDataTransportStream { + constructor(pdfDataRangeTransport, { + disableRange = false, + disableStream = false + }) { + assert(pdfDataRangeTransport, 'PDFDataTransportStream - missing required "pdfDataRangeTransport" argument.'); + const { + length, + initialData, + progressiveDone, + contentDispositionFilename + } = pdfDataRangeTransport; + this._queuedChunks = []; + this._progressiveDone = progressiveDone; + this._contentDispositionFilename = contentDispositionFilename; + if (initialData?.length > 0) { + const buffer = initialData instanceof Uint8Array && initialData.byteLength === initialData.buffer.byteLength ? initialData.buffer : new Uint8Array(initialData).buffer; + this._queuedChunks.push(buffer); + } + this._pdfDataRangeTransport = pdfDataRangeTransport; + this._isStreamingSupported = !disableStream; + this._isRangeSupported = !disableRange; + this._contentLength = length; + this._fullRequestReader = null; + this._rangeReaders = []; + pdfDataRangeTransport.addRangeListener((begin, chunk) => { + this._onReceiveData({ + begin, + chunk + }); + }); + pdfDataRangeTransport.addProgressListener((loaded, total) => { + this._onProgress({ + loaded, + total + }); + }); + pdfDataRangeTransport.addProgressiveReadListener(chunk => { + this._onReceiveData({ + chunk + }); + }); + pdfDataRangeTransport.addProgressiveDoneListener(() => { + this._onProgressiveDone(); + }); + pdfDataRangeTransport.transportReady(); + } + _onReceiveData({ + begin, + chunk + }) { + const buffer = chunk instanceof Uint8Array && chunk.byteLength === chunk.buffer.byteLength ? chunk.buffer : new Uint8Array(chunk).buffer; + if (begin === undefined) { + if (this._fullRequestReader) { + this._fullRequestReader._enqueue(buffer); + } else { + this._queuedChunks.push(buffer); + } + } else { + const found = this._rangeReaders.some(function (rangeReader) { + if (rangeReader._begin !== begin) { + return false; + } + rangeReader._enqueue(buffer); + return true; + }); + assert(found, "_onReceiveData - no `PDFDataTransportStreamRangeReader` instance found."); + } + } + get _progressiveDataLength() { + return this._fullRequestReader?._loaded ?? 0; + } + _onProgress(evt) { + if (evt.total === undefined) { + this._rangeReaders[0]?.onProgress?.({ + loaded: evt.loaded + }); + } else { + this._fullRequestReader?.onProgress?.({ + loaded: evt.loaded, + total: evt.total + }); + } + } + _onProgressiveDone() { + this._fullRequestReader?.progressiveDone(); + this._progressiveDone = true; + } + _removeRangeReader(reader) { + const i = this._rangeReaders.indexOf(reader); + if (i >= 0) { + this._rangeReaders.splice(i, 1); + } + } + getFullReader() { + assert(!this._fullRequestReader, "PDFDataTransportStream.getFullReader can only be called once."); + const queuedChunks = this._queuedChunks; + this._queuedChunks = null; + return new PDFDataTransportStreamReader(this, queuedChunks, this._progressiveDone, this._contentDispositionFilename); + } + getRangeReader(begin, end) { + if (end <= this._progressiveDataLength) { + return null; + } + const reader = new PDFDataTransportStreamRangeReader(this, begin, end); + this._pdfDataRangeTransport.requestDataRange(begin, end); + this._rangeReaders.push(reader); + return reader; + } + cancelAllRequests(reason) { + this._fullRequestReader?.cancel(reason); + for (const reader of this._rangeReaders.slice(0)) { + reader.cancel(reason); + } + this._pdfDataRangeTransport.abort(); + } +} +class PDFDataTransportStreamReader { + constructor(stream, queuedChunks, progressiveDone = false, contentDispositionFilename = null) { + this._stream = stream; + this._done = progressiveDone || false; + this._filename = isPdfFile(contentDispositionFilename) ? contentDispositionFilename : null; + this._queuedChunks = queuedChunks || []; + this._loaded = 0; + for (const chunk of this._queuedChunks) { + this._loaded += chunk.byteLength; + } + this._requests = []; + this._headersReady = Promise.resolve(); + stream._fullRequestReader = this; + this.onProgress = null; + } + _enqueue(chunk) { + if (this._done) { + return; + } + if (this._requests.length > 0) { + const requestCapability = this._requests.shift(); + requestCapability.resolve({ + value: chunk, + done: false + }); + } else { + this._queuedChunks.push(chunk); + } + this._loaded += chunk.byteLength; + } + get headersReady() { + return this._headersReady; + } + get filename() { + return this._filename; + } + get isRangeSupported() { + return this._stream._isRangeSupported; + } + get isStreamingSupported() { + return this._stream._isStreamingSupported; + } + get contentLength() { + return this._stream._contentLength; + } + async read() { + if (this._queuedChunks.length > 0) { + const chunk = this._queuedChunks.shift(); + return { + value: chunk, + done: false + }; + } + if (this._done) { + return { + value: undefined, + done: true + }; + } + const requestCapability = Promise.withResolvers(); + this._requests.push(requestCapability); + return requestCapability.promise; + } + cancel(reason) { + this._done = true; + for (const requestCapability of this._requests) { + requestCapability.resolve({ + value: undefined, + done: true + }); + } + this._requests.length = 0; + } + progressiveDone() { + if (this._done) { + return; + } + this._done = true; + } +} +class PDFDataTransportStreamRangeReader { + constructor(stream, begin, end) { + this._stream = stream; + this._begin = begin; + this._end = end; + this._queuedChunk = null; + this._requests = []; + this._done = false; + this.onProgress = null; + } + _enqueue(chunk) { + if (this._done) { + return; + } + if (this._requests.length === 0) { + this._queuedChunk = chunk; + } else { + const requestsCapability = this._requests.shift(); + requestsCapability.resolve({ + value: chunk, + done: false + }); + for (const requestCapability of this._requests) { + requestCapability.resolve({ + value: undefined, + done: true + }); + } + this._requests.length = 0; + } + this._done = true; + this._stream._removeRangeReader(this); + } + get isStreamingSupported() { + return false; + } + async read() { + if (this._queuedChunk) { + const chunk = this._queuedChunk; + this._queuedChunk = null; + return { + value: chunk, + done: false + }; + } + if (this._done) { + return { + value: undefined, + done: true + }; + } + const requestCapability = Promise.withResolvers(); + this._requests.push(requestCapability); + return requestCapability.promise; + } + cancel(reason) { + this._done = true; + for (const requestCapability of this._requests) { + requestCapability.resolve({ + value: undefined, + done: true + }); + } + this._requests.length = 0; + this._stream._removeRangeReader(this); + } +} + +;// CONCATENATED MODULE: ./src/display/content_disposition.js + +function getFilenameFromContentDispositionHeader(contentDisposition) { + let needsEncodingFixup = true; + let tmp = toParamRegExp("filename\\*", "i").exec(contentDisposition); + if (tmp) { + tmp = tmp[1]; + let filename = rfc2616unquote(tmp); + filename = unescape(filename); + filename = rfc5987decode(filename); + filename = rfc2047decode(filename); + return fixupEncoding(filename); + } + tmp = rfc2231getparam(contentDisposition); + if (tmp) { + const filename = rfc2047decode(tmp); + return fixupEncoding(filename); + } + tmp = toParamRegExp("filename", "i").exec(contentDisposition); + if (tmp) { + tmp = tmp[1]; + let filename = rfc2616unquote(tmp); + filename = rfc2047decode(filename); + return fixupEncoding(filename); + } + function toParamRegExp(attributePattern, flags) { + return new RegExp("(?:^|;)\\s*" + attributePattern + "\\s*=\\s*" + "(" + '[^";\\s][^;\\s]*' + "|" + '"(?:[^"\\\\]|\\\\"?)+"?' + ")", flags); + } + function textdecode(encoding, value) { + if (encoding) { + if (!/^[\x00-\xFF]+$/.test(value)) { + return value; + } + try { + const decoder = new TextDecoder(encoding, { + fatal: true + }); + const buffer = stringToBytes(value); + value = decoder.decode(buffer); + needsEncodingFixup = false; + } catch {} + } + return value; + } + function fixupEncoding(value) { + if (needsEncodingFixup && /[\x80-\xff]/.test(value)) { + value = textdecode("utf-8", value); + if (needsEncodingFixup) { + value = textdecode("iso-8859-1", value); + } + } + return value; + } + function rfc2231getparam(contentDispositionStr) { + const matches = []; + let match; + const iter = toParamRegExp("filename\\*((?!0\\d)\\d+)(\\*?)", "ig"); + while ((match = iter.exec(contentDispositionStr)) !== null) { + let [, n, quot, part] = match; + n = parseInt(n, 10); + if (n in matches) { + if (n === 0) { + break; + } + continue; + } + matches[n] = [quot, part]; + } + const parts = []; + for (let n = 0; n < matches.length; ++n) { + if (!(n in matches)) { + break; + } + let [quot, part] = matches[n]; + part = rfc2616unquote(part); + if (quot) { + part = unescape(part); + if (n === 0) { + part = rfc5987decode(part); + } + } + parts.push(part); + } + return parts.join(""); + } + function rfc2616unquote(value) { + if (value.startsWith('"')) { + const parts = value.slice(1).split('\\"'); + for (let i = 0; i < parts.length; ++i) { + const quotindex = parts[i].indexOf('"'); + if (quotindex !== -1) { + parts[i] = parts[i].slice(0, quotindex); + parts.length = i + 1; + } + parts[i] = parts[i].replaceAll(/\\(.)/g, "$1"); + } + value = parts.join('"'); + } + return value; + } + function rfc5987decode(extvalue) { + const encodingend = extvalue.indexOf("'"); + if (encodingend === -1) { + return extvalue; + } + const encoding = extvalue.slice(0, encodingend); + const langvalue = extvalue.slice(encodingend + 1); + const value = langvalue.replace(/^[^']*'/, ""); + return textdecode(encoding, value); + } + function rfc2047decode(value) { + if (!value.startsWith("=?") || /[\x00-\x19\x80-\xff]/.test(value)) { + return value; + } + return value.replaceAll(/=\?([\w-]*)\?([QqBb])\?((?:[^?]|\?(?!=))*)\?=/g, function (matches, charset, encoding, text) { + if (encoding === "q" || encoding === "Q") { + text = text.replaceAll("_", " "); + text = text.replaceAll(/=([0-9a-fA-F]{2})/g, function (match, hex) { + return String.fromCharCode(parseInt(hex, 16)); + }); + return textdecode(charset, text); + } + try { + text = atob(text); + } catch {} + return textdecode(charset, text); + }); + } + return ""; +} + +;// CONCATENATED MODULE: ./src/display/network_utils.js + + + +function validateRangeRequestCapabilities({ + getResponseHeader, + isHttp, + rangeChunkSize, + disableRange +}) { + const returnValues = { + allowRangeRequests: false, + suggestedLength: undefined + }; + const length = parseInt(getResponseHeader("Content-Length"), 10); + if (!Number.isInteger(length)) { + return returnValues; + } + returnValues.suggestedLength = length; + if (length <= 2 * rangeChunkSize) { + return returnValues; + } + if (disableRange || !isHttp) { + return returnValues; + } + if (getResponseHeader("Accept-Ranges") !== "bytes") { + return returnValues; + } + const contentEncoding = getResponseHeader("Content-Encoding") || "identity"; + if (contentEncoding !== "identity") { + return returnValues; + } + returnValues.allowRangeRequests = true; + return returnValues; +} +function extractFilenameFromHeader(getResponseHeader) { + const contentDisposition = getResponseHeader("Content-Disposition"); + if (contentDisposition) { + let filename = getFilenameFromContentDispositionHeader(contentDisposition); + if (filename.includes("%")) { + try { + filename = decodeURIComponent(filename); + } catch {} + } + if (isPdfFile(filename)) { + return filename; + } + } + return null; +} +function createResponseStatusError(status, url) { + if (status === 404 || status === 0 && url.startsWith("file:")) { + return new MissingPDFException('Missing PDF "' + url + '".'); + } + return new UnexpectedResponseException(`Unexpected server response (${status}) while retrieving PDF "${url}".`, status); +} +function validateResponseStatus(status) { + return status === 200 || status === 206; +} + +;// CONCATENATED MODULE: ./src/display/fetch_stream.js + + +function createFetchOptions(headers, withCredentials, abortController) { + return { + method: "GET", + headers, + signal: abortController.signal, + mode: "cors", + credentials: withCredentials ? "include" : "same-origin", + redirect: "follow" + }; +} +function createHeaders(httpHeaders) { + const headers = new Headers(); + for (const property in httpHeaders) { + const value = httpHeaders[property]; + if (value === undefined) { + continue; + } + headers.append(property, value); + } + return headers; +} +function getArrayBuffer(val) { + if (val instanceof Uint8Array) { + return val.buffer; + } + if (val instanceof ArrayBuffer) { + return val; + } + warn(`getArrayBuffer - unexpected data format: ${val}`); + return new Uint8Array(val).buffer; +} +class PDFFetchStream { + constructor(source) { + this.source = source; + this.isHttp = /^https?:/i.test(source.url); + this.httpHeaders = this.isHttp && source.httpHeaders || {}; + this._fullRequestReader = null; + this._rangeRequestReaders = []; + } + get _progressiveDataLength() { + return this._fullRequestReader?._loaded ?? 0; + } + getFullReader() { + assert(!this._fullRequestReader, "PDFFetchStream.getFullReader can only be called once."); + this._fullRequestReader = new PDFFetchStreamReader(this); + return this._fullRequestReader; + } + getRangeReader(begin, end) { + if (end <= this._progressiveDataLength) { + return null; + } + const reader = new PDFFetchStreamRangeReader(this, begin, end); + this._rangeRequestReaders.push(reader); + return reader; + } + cancelAllRequests(reason) { + this._fullRequestReader?.cancel(reason); + for (const reader of this._rangeRequestReaders.slice(0)) { + reader.cancel(reason); + } + } +} +class PDFFetchStreamReader { + constructor(stream) { + this._stream = stream; + this._reader = null; + this._loaded = 0; + this._filename = null; + const source = stream.source; + this._withCredentials = source.withCredentials || false; + this._contentLength = source.length; + this._headersCapability = Promise.withResolvers(); + this._disableRange = source.disableRange || false; + this._rangeChunkSize = source.rangeChunkSize; + if (!this._rangeChunkSize && !this._disableRange) { + this._disableRange = true; + } + this._abortController = new AbortController(); + this._isStreamingSupported = !source.disableStream; + this._isRangeSupported = !source.disableRange; + this._headers = createHeaders(this._stream.httpHeaders); + const url = source.url; + fetch(url, createFetchOptions(this._headers, this._withCredentials, this._abortController)).then(response => { + if (!validateResponseStatus(response.status)) { + throw createResponseStatusError(response.status, url); + } + this._reader = response.body.getReader(); + this._headersCapability.resolve(); + const getResponseHeader = name => response.headers.get(name); + const { + allowRangeRequests, + suggestedLength + } = validateRangeRequestCapabilities({ + getResponseHeader, + isHttp: this._stream.isHttp, + rangeChunkSize: this._rangeChunkSize, + disableRange: this._disableRange + }); + this._isRangeSupported = allowRangeRequests; + this._contentLength = suggestedLength || this._contentLength; + this._filename = extractFilenameFromHeader(getResponseHeader); + if (!this._isStreamingSupported && this._isRangeSupported) { + this.cancel(new AbortException("Streaming is disabled.")); + } + }).catch(this._headersCapability.reject); + this.onProgress = null; + } + get headersReady() { + return this._headersCapability.promise; + } + get filename() { + return this._filename; + } + get contentLength() { + return this._contentLength; + } + get isRangeSupported() { + return this._isRangeSupported; + } + get isStreamingSupported() { + return this._isStreamingSupported; + } + async read() { + await this._headersCapability.promise; + const { + value, + done + } = await this._reader.read(); + if (done) { + return { + value, + done + }; + } + this._loaded += value.byteLength; + this.onProgress?.({ + loaded: this._loaded, + total: this._contentLength + }); + return { + value: getArrayBuffer(value), + done: false + }; + } + cancel(reason) { + this._reader?.cancel(reason); + this._abortController.abort(); + } +} +class PDFFetchStreamRangeReader { + constructor(stream, begin, end) { + this._stream = stream; + this._reader = null; + this._loaded = 0; + const source = stream.source; + this._withCredentials = source.withCredentials || false; + this._readCapability = Promise.withResolvers(); + this._isStreamingSupported = !source.disableStream; + this._abortController = new AbortController(); + this._headers = createHeaders(this._stream.httpHeaders); + this._headers.append("Range", `bytes=${begin}-${end - 1}`); + const url = source.url; + fetch(url, createFetchOptions(this._headers, this._withCredentials, this._abortController)).then(response => { + if (!validateResponseStatus(response.status)) { + throw createResponseStatusError(response.status, url); + } + this._readCapability.resolve(); + this._reader = response.body.getReader(); + }).catch(this._readCapability.reject); + this.onProgress = null; + } + get isStreamingSupported() { + return this._isStreamingSupported; + } + async read() { + await this._readCapability.promise; + const { + value, + done + } = await this._reader.read(); + if (done) { + return { + value, + done + }; + } + this._loaded += value.byteLength; + this.onProgress?.({ + loaded: this._loaded + }); + return { + value: getArrayBuffer(value), + done: false + }; + } + cancel(reason) { + this._reader?.cancel(reason); + this._abortController.abort(); + } +} + +;// CONCATENATED MODULE: ./src/display/network.js + + +const OK_RESPONSE = 200; +const PARTIAL_CONTENT_RESPONSE = 206; +function network_getArrayBuffer(xhr) { + const data = xhr.response; + if (typeof data !== "string") { + return data; + } + return stringToBytes(data).buffer; +} +class NetworkManager { + constructor(url, args = {}) { + this.url = url; + this.isHttp = /^https?:/i.test(url); + this.httpHeaders = this.isHttp && args.httpHeaders || Object.create(null); + this.withCredentials = args.withCredentials || false; + this.currXhrId = 0; + this.pendingRequests = Object.create(null); + } + requestRange(begin, end, listeners) { + const args = { + begin, + end + }; + for (const prop in listeners) { + args[prop] = listeners[prop]; + } + return this.request(args); + } + requestFull(listeners) { + return this.request(listeners); + } + request(args) { + const xhr = new XMLHttpRequest(); + const xhrId = this.currXhrId++; + const pendingRequest = this.pendingRequests[xhrId] = { + xhr + }; + xhr.open("GET", this.url); + xhr.withCredentials = this.withCredentials; + for (const property in this.httpHeaders) { + const value = this.httpHeaders[property]; + if (value === undefined) { + continue; + } + xhr.setRequestHeader(property, value); + } + if (this.isHttp && "begin" in args && "end" in args) { + xhr.setRequestHeader("Range", `bytes=${args.begin}-${args.end - 1}`); + pendingRequest.expectedStatus = PARTIAL_CONTENT_RESPONSE; + } else { + pendingRequest.expectedStatus = OK_RESPONSE; + } + xhr.responseType = "arraybuffer"; + if (args.onError) { + xhr.onerror = function (evt) { + args.onError(xhr.status); + }; + } + xhr.onreadystatechange = this.onStateChange.bind(this, xhrId); + xhr.onprogress = this.onProgress.bind(this, xhrId); + pendingRequest.onHeadersReceived = args.onHeadersReceived; + pendingRequest.onDone = args.onDone; + pendingRequest.onError = args.onError; + pendingRequest.onProgress = args.onProgress; + xhr.send(null); + return xhrId; + } + onProgress(xhrId, evt) { + const pendingRequest = this.pendingRequests[xhrId]; + if (!pendingRequest) { + return; + } + pendingRequest.onProgress?.(evt); + } + onStateChange(xhrId, evt) { + const pendingRequest = this.pendingRequests[xhrId]; + if (!pendingRequest) { + return; + } + const xhr = pendingRequest.xhr; + if (xhr.readyState >= 2 && pendingRequest.onHeadersReceived) { + pendingRequest.onHeadersReceived(); + delete pendingRequest.onHeadersReceived; + } + if (xhr.readyState !== 4) { + return; + } + if (!(xhrId in this.pendingRequests)) { + return; + } + delete this.pendingRequests[xhrId]; + if (xhr.status === 0 && this.isHttp) { + pendingRequest.onError?.(xhr.status); + return; + } + const xhrStatus = xhr.status || OK_RESPONSE; + const ok_response_on_range_request = xhrStatus === OK_RESPONSE && pendingRequest.expectedStatus === PARTIAL_CONTENT_RESPONSE; + if (!ok_response_on_range_request && xhrStatus !== pendingRequest.expectedStatus) { + pendingRequest.onError?.(xhr.status); + return; + } + const chunk = network_getArrayBuffer(xhr); + if (xhrStatus === PARTIAL_CONTENT_RESPONSE) { + const rangeHeader = xhr.getResponseHeader("Content-Range"); + const matches = /bytes (\d+)-(\d+)\/(\d+)/.exec(rangeHeader); + pendingRequest.onDone({ + begin: parseInt(matches[1], 10), + chunk + }); + } else if (chunk) { + pendingRequest.onDone({ + begin: 0, + chunk + }); + } else { + pendingRequest.onError?.(xhr.status); + } + } + getRequestXhr(xhrId) { + return this.pendingRequests[xhrId].xhr; + } + isPendingRequest(xhrId) { + return xhrId in this.pendingRequests; + } + abortRequest(xhrId) { + const xhr = this.pendingRequests[xhrId].xhr; + delete this.pendingRequests[xhrId]; + xhr.abort(); + } +} +class PDFNetworkStream { + constructor(source) { + this._source = source; + this._manager = new NetworkManager(source.url, { + httpHeaders: source.httpHeaders, + withCredentials: source.withCredentials + }); + this._rangeChunkSize = source.rangeChunkSize; + this._fullRequestReader = null; + this._rangeRequestReaders = []; + } + _onRangeRequestReaderClosed(reader) { + const i = this._rangeRequestReaders.indexOf(reader); + if (i >= 0) { + this._rangeRequestReaders.splice(i, 1); + } + } + getFullReader() { + assert(!this._fullRequestReader, "PDFNetworkStream.getFullReader can only be called once."); + this._fullRequestReader = new PDFNetworkStreamFullRequestReader(this._manager, this._source); + return this._fullRequestReader; + } + getRangeReader(begin, end) { + const reader = new PDFNetworkStreamRangeRequestReader(this._manager, begin, end); + reader.onClosed = this._onRangeRequestReaderClosed.bind(this); + this._rangeRequestReaders.push(reader); + return reader; + } + cancelAllRequests(reason) { + this._fullRequestReader?.cancel(reason); + for (const reader of this._rangeRequestReaders.slice(0)) { + reader.cancel(reason); + } + } +} +class PDFNetworkStreamFullRequestReader { + constructor(manager, source) { + this._manager = manager; + const args = { + onHeadersReceived: this._onHeadersReceived.bind(this), + onDone: this._onDone.bind(this), + onError: this._onError.bind(this), + onProgress: this._onProgress.bind(this) + }; + this._url = source.url; + this._fullRequestId = manager.requestFull(args); + this._headersReceivedCapability = Promise.withResolvers(); + this._disableRange = source.disableRange || false; + this._contentLength = source.length; + this._rangeChunkSize = source.rangeChunkSize; + if (!this._rangeChunkSize && !this._disableRange) { + this._disableRange = true; + } + this._isStreamingSupported = false; + this._isRangeSupported = false; + this._cachedChunks = []; + this._requests = []; + this._done = false; + this._storedError = undefined; + this._filename = null; + this.onProgress = null; + } + _onHeadersReceived() { + const fullRequestXhrId = this._fullRequestId; + const fullRequestXhr = this._manager.getRequestXhr(fullRequestXhrId); + const getResponseHeader = name => fullRequestXhr.getResponseHeader(name); + const { + allowRangeRequests, + suggestedLength + } = validateRangeRequestCapabilities({ + getResponseHeader, + isHttp: this._manager.isHttp, + rangeChunkSize: this._rangeChunkSize, + disableRange: this._disableRange + }); + if (allowRangeRequests) { + this._isRangeSupported = true; + } + this._contentLength = suggestedLength || this._contentLength; + this._filename = extractFilenameFromHeader(getResponseHeader); + if (this._isRangeSupported) { + this._manager.abortRequest(fullRequestXhrId); + } + this._headersReceivedCapability.resolve(); + } + _onDone(data) { + if (data) { + if (this._requests.length > 0) { + const requestCapability = this._requests.shift(); + requestCapability.resolve({ + value: data.chunk, + done: false + }); + } else { + this._cachedChunks.push(data.chunk); + } + } + this._done = true; + if (this._cachedChunks.length > 0) { + return; + } + for (const requestCapability of this._requests) { + requestCapability.resolve({ + value: undefined, + done: true + }); + } + this._requests.length = 0; + } + _onError(status) { + this._storedError = createResponseStatusError(status, this._url); + this._headersReceivedCapability.reject(this._storedError); + for (const requestCapability of this._requests) { + requestCapability.reject(this._storedError); + } + this._requests.length = 0; + this._cachedChunks.length = 0; + } + _onProgress(evt) { + this.onProgress?.({ + loaded: evt.loaded, + total: evt.lengthComputable ? evt.total : this._contentLength + }); + } + get filename() { + return this._filename; + } + get isRangeSupported() { + return this._isRangeSupported; + } + get isStreamingSupported() { + return this._isStreamingSupported; + } + get contentLength() { + return this._contentLength; + } + get headersReady() { + return this._headersReceivedCapability.promise; + } + async read() { + if (this._storedError) { + throw this._storedError; + } + if (this._cachedChunks.length > 0) { + const chunk = this._cachedChunks.shift(); + return { + value: chunk, + done: false + }; + } + if (this._done) { + return { + value: undefined, + done: true + }; + } + const requestCapability = Promise.withResolvers(); + this._requests.push(requestCapability); + return requestCapability.promise; + } + cancel(reason) { + this._done = true; + this._headersReceivedCapability.reject(reason); + for (const requestCapability of this._requests) { + requestCapability.resolve({ + value: undefined, + done: true + }); + } + this._requests.length = 0; + if (this._manager.isPendingRequest(this._fullRequestId)) { + this._manager.abortRequest(this._fullRequestId); + } + this._fullRequestReader = null; + } +} +class PDFNetworkStreamRangeRequestReader { + constructor(manager, begin, end) { + this._manager = manager; + const args = { + onDone: this._onDone.bind(this), + onError: this._onError.bind(this), + onProgress: this._onProgress.bind(this) + }; + this._url = manager.url; + this._requestId = manager.requestRange(begin, end, args); + this._requests = []; + this._queuedChunk = null; + this._done = false; + this._storedError = undefined; + this.onProgress = null; + this.onClosed = null; + } + _close() { + this.onClosed?.(this); + } + _onDone(data) { + const chunk = data.chunk; + if (this._requests.length > 0) { + const requestCapability = this._requests.shift(); + requestCapability.resolve({ + value: chunk, + done: false + }); + } else { + this._queuedChunk = chunk; + } + this._done = true; + for (const requestCapability of this._requests) { + requestCapability.resolve({ + value: undefined, + done: true + }); + } + this._requests.length = 0; + this._close(); + } + _onError(status) { + this._storedError = createResponseStatusError(status, this._url); + for (const requestCapability of this._requests) { + requestCapability.reject(this._storedError); + } + this._requests.length = 0; + this._queuedChunk = null; + } + _onProgress(evt) { + if (!this.isStreamingSupported) { + this.onProgress?.({ + loaded: evt.loaded + }); + } + } + get isStreamingSupported() { + return false; + } + async read() { + if (this._storedError) { + throw this._storedError; + } + if (this._queuedChunk !== null) { + const chunk = this._queuedChunk; + this._queuedChunk = null; + return { + value: chunk, + done: false + }; + } + if (this._done) { + return { + value: undefined, + done: true + }; + } + const requestCapability = Promise.withResolvers(); + this._requests.push(requestCapability); + return requestCapability.promise; + } + cancel(reason) { + this._done = true; + for (const requestCapability of this._requests) { + requestCapability.resolve({ + value: undefined, + done: true + }); + } + this._requests.length = 0; + if (this._manager.isPendingRequest(this._requestId)) { + this._manager.abortRequest(this._requestId); + } + this._close(); + } +} + +;// CONCATENATED MODULE: ./src/display/node_stream.js + + + +const fileUriRegex = /^file:\/\/\/[a-zA-Z]:\//; +function parseUrl(sourceUrl) { + const url = NodePackages.get("url"); + const parsedUrl = url.parse(sourceUrl); + if (parsedUrl.protocol === "file:" || parsedUrl.host) { + return parsedUrl; + } + if (/^[a-z]:[/\\]/i.test(sourceUrl)) { + return url.parse(`file:///${sourceUrl}`); + } + if (!parsedUrl.host) { + parsedUrl.protocol = "file:"; + } + return parsedUrl; +} +class PDFNodeStream { + constructor(source) { + this.source = source; + this.url = parseUrl(source.url); + this.isHttp = this.url.protocol === "http:" || this.url.protocol === "https:"; + this.isFsUrl = this.url.protocol === "file:"; + this.httpHeaders = this.isHttp && source.httpHeaders || {}; + this._fullRequestReader = null; + this._rangeRequestReaders = []; + } + get _progressiveDataLength() { + return this._fullRequestReader?._loaded ?? 0; + } + getFullReader() { + assert(!this._fullRequestReader, "PDFNodeStream.getFullReader can only be called once."); + this._fullRequestReader = this.isFsUrl ? new PDFNodeStreamFsFullReader(this) : new PDFNodeStreamFullReader(this); + return this._fullRequestReader; + } + getRangeReader(start, end) { + if (end <= this._progressiveDataLength) { + return null; + } + const rangeReader = this.isFsUrl ? new PDFNodeStreamFsRangeReader(this, start, end) : new PDFNodeStreamRangeReader(this, start, end); + this._rangeRequestReaders.push(rangeReader); + return rangeReader; + } + cancelAllRequests(reason) { + this._fullRequestReader?.cancel(reason); + for (const reader of this._rangeRequestReaders.slice(0)) { + reader.cancel(reason); + } + } +} +class BaseFullReader { + constructor(stream) { + this._url = stream.url; + this._done = false; + this._storedError = null; + this.onProgress = null; + const source = stream.source; + this._contentLength = source.length; + this._loaded = 0; + this._filename = null; + this._disableRange = source.disableRange || false; + this._rangeChunkSize = source.rangeChunkSize; + if (!this._rangeChunkSize && !this._disableRange) { + this._disableRange = true; + } + this._isStreamingSupported = !source.disableStream; + this._isRangeSupported = !source.disableRange; + this._readableStream = null; + this._readCapability = Promise.withResolvers(); + this._headersCapability = Promise.withResolvers(); + } + get headersReady() { + return this._headersCapability.promise; + } + get filename() { + return this._filename; + } + get contentLength() { + return this._contentLength; + } + get isRangeSupported() { + return this._isRangeSupported; + } + get isStreamingSupported() { + return this._isStreamingSupported; + } + async read() { + await this._readCapability.promise; + if (this._done) { + return { + value: undefined, + done: true + }; + } + if (this._storedError) { + throw this._storedError; + } + const chunk = this._readableStream.read(); + if (chunk === null) { + this._readCapability = Promise.withResolvers(); + return this.read(); + } + this._loaded += chunk.length; + this.onProgress?.({ + loaded: this._loaded, + total: this._contentLength + }); + const buffer = new Uint8Array(chunk).buffer; + return { + value: buffer, + done: false + }; + } + cancel(reason) { + if (!this._readableStream) { + this._error(reason); + return; + } + this._readableStream.destroy(reason); + } + _error(reason) { + this._storedError = reason; + this._readCapability.resolve(); + } + _setReadableStream(readableStream) { + this._readableStream = readableStream; + readableStream.on("readable", () => { + this._readCapability.resolve(); + }); + readableStream.on("end", () => { + readableStream.destroy(); + this._done = true; + this._readCapability.resolve(); + }); + readableStream.on("error", reason => { + this._error(reason); + }); + if (!this._isStreamingSupported && this._isRangeSupported) { + this._error(new AbortException("streaming is disabled")); + } + if (this._storedError) { + this._readableStream.destroy(this._storedError); + } + } +} +class BaseRangeReader { + constructor(stream) { + this._url = stream.url; + this._done = false; + this._storedError = null; + this.onProgress = null; + this._loaded = 0; + this._readableStream = null; + this._readCapability = Promise.withResolvers(); + const source = stream.source; + this._isStreamingSupported = !source.disableStream; + } + get isStreamingSupported() { + return this._isStreamingSupported; + } + async read() { + await this._readCapability.promise; + if (this._done) { + return { + value: undefined, + done: true + }; + } + if (this._storedError) { + throw this._storedError; + } + const chunk = this._readableStream.read(); + if (chunk === null) { + this._readCapability = Promise.withResolvers(); + return this.read(); + } + this._loaded += chunk.length; + this.onProgress?.({ + loaded: this._loaded + }); + const buffer = new Uint8Array(chunk).buffer; + return { + value: buffer, + done: false + }; + } + cancel(reason) { + if (!this._readableStream) { + this._error(reason); + return; + } + this._readableStream.destroy(reason); + } + _error(reason) { + this._storedError = reason; + this._readCapability.resolve(); + } + _setReadableStream(readableStream) { + this._readableStream = readableStream; + readableStream.on("readable", () => { + this._readCapability.resolve(); + }); + readableStream.on("end", () => { + readableStream.destroy(); + this._done = true; + this._readCapability.resolve(); + }); + readableStream.on("error", reason => { + this._error(reason); + }); + if (this._storedError) { + this._readableStream.destroy(this._storedError); + } + } +} +function createRequestOptions(parsedUrl, headers) { + return { + protocol: parsedUrl.protocol, + auth: parsedUrl.auth, + host: parsedUrl.hostname, + port: parsedUrl.port, + path: parsedUrl.path, + method: "GET", + headers + }; +} +class PDFNodeStreamFullReader extends BaseFullReader { + constructor(stream) { + super(stream); + const handleResponse = response => { + if (response.statusCode === 404) { + const error = new MissingPDFException(`Missing PDF "${this._url}".`); + this._storedError = error; + this._headersCapability.reject(error); + return; + } + this._headersCapability.resolve(); + this._setReadableStream(response); + const getResponseHeader = name => this._readableStream.headers[name.toLowerCase()]; + const { + allowRangeRequests, + suggestedLength + } = validateRangeRequestCapabilities({ + getResponseHeader, + isHttp: stream.isHttp, + rangeChunkSize: this._rangeChunkSize, + disableRange: this._disableRange + }); + this._isRangeSupported = allowRangeRequests; + this._contentLength = suggestedLength || this._contentLength; + this._filename = extractFilenameFromHeader(getResponseHeader); + }; + this._request = null; + if (this._url.protocol === "http:") { + const http = NodePackages.get("http"); + this._request = http.request(createRequestOptions(this._url, stream.httpHeaders), handleResponse); + } else { + const https = NodePackages.get("https"); + this._request = https.request(createRequestOptions(this._url, stream.httpHeaders), handleResponse); + } + this._request.on("error", reason => { + this._storedError = reason; + this._headersCapability.reject(reason); + }); + this._request.end(); + } +} +class PDFNodeStreamRangeReader extends BaseRangeReader { + constructor(stream, start, end) { + super(stream); + this._httpHeaders = {}; + for (const property in stream.httpHeaders) { + const value = stream.httpHeaders[property]; + if (value === undefined) { + continue; + } + this._httpHeaders[property] = value; + } + this._httpHeaders.Range = `bytes=${start}-${end - 1}`; + const handleResponse = response => { + if (response.statusCode === 404) { + const error = new MissingPDFException(`Missing PDF "${this._url}".`); + this._storedError = error; + return; + } + this._setReadableStream(response); + }; + this._request = null; + if (this._url.protocol === "http:") { + const http = NodePackages.get("http"); + this._request = http.request(createRequestOptions(this._url, this._httpHeaders), handleResponse); + } else { + const https = NodePackages.get("https"); + this._request = https.request(createRequestOptions(this._url, this._httpHeaders), handleResponse); + } + this._request.on("error", reason => { + this._storedError = reason; + }); + this._request.end(); + } +} +class PDFNodeStreamFsFullReader extends BaseFullReader { + constructor(stream) { + super(stream); + let path = decodeURIComponent(this._url.path); + if (fileUriRegex.test(this._url.href)) { + path = path.replace(/^\//, ""); + } + const fs = NodePackages.get("fs"); + fs.promises.lstat(path).then(stat => { + this._contentLength = stat.size; + this._setReadableStream(fs.createReadStream(path)); + this._headersCapability.resolve(); + }, error => { + if (error.code === "ENOENT") { + error = new MissingPDFException(`Missing PDF "${path}".`); + } + this._storedError = error; + this._headersCapability.reject(error); + }); + } +} +class PDFNodeStreamFsRangeReader extends BaseRangeReader { + constructor(stream, start, end) { + super(stream); + let path = decodeURIComponent(this._url.path); + if (fileUriRegex.test(this._url.href)) { + path = path.replace(/^\//, ""); + } + const fs = NodePackages.get("fs"); + this._setReadableStream(fs.createReadStream(path, { + start, + end: end - 1 + })); + } +} + +;// CONCATENATED MODULE: ./src/display/text_layer.js + + +const MAX_TEXT_DIVS_TO_RENDER = 100000; +const DEFAULT_FONT_SIZE = 30; +const DEFAULT_FONT_ASCENT = 0.8; +class TextLayer { + #capability = Promise.withResolvers(); + #container = null; + #disableProcessItems = false; + #fontInspectorEnabled = !!globalThis.FontInspector?.enabled; + #lang = null; + #layoutTextParams = null; + #pageHeight = 0; + #pageWidth = 0; + #reader = null; + #rootContainer = null; + #rotation = 0; + #scale = 0; + #styleCache = Object.create(null); + #textContentItemsStr = []; + #textContentSource = null; + #textDivs = []; + #textDivProperties = new WeakMap(); + #transform = null; + static #ascentCache = new Map(); + static #canvasContexts = new Map(); + static #minFontSize = null; + static #pendingTextLayers = new Set(); + constructor({ + textContentSource, + container, + viewport + }) { + if (textContentSource instanceof ReadableStream) { + this.#textContentSource = textContentSource; + } else if (typeof textContentSource === "object") { + this.#textContentSource = new ReadableStream({ + start(controller) { + controller.enqueue(textContentSource); + controller.close(); + } + }); + } else { + throw new Error('No "textContentSource" parameter specified.'); + } + this.#container = this.#rootContainer = container; + this.#scale = viewport.scale * (globalThis.devicePixelRatio || 1); + this.#rotation = viewport.rotation; + this.#layoutTextParams = { + prevFontSize: null, + prevFontFamily: null, + div: null, + properties: null, + ctx: null + }; + const { + pageWidth, + pageHeight, + pageX, + pageY + } = viewport.rawDims; + this.#transform = [1, 0, 0, -1, -pageX, pageY + pageHeight]; + this.#pageWidth = pageWidth; + this.#pageHeight = pageHeight; + TextLayer.#ensureMinFontSizeComputed(); + setLayerDimensions(container, viewport); + this.#capability.promise.catch(() => {}).then(() => { + TextLayer.#pendingTextLayers.delete(this); + this.#layoutTextParams = null; + this.#styleCache = null; + }); + } + render() { + const pump = () => { + this.#reader.read().then(({ + value, + done + }) => { + if (done) { + this.#capability.resolve(); + return; + } + this.#lang ??= value.lang; + Object.assign(this.#styleCache, value.styles); + this.#processItems(value.items); + pump(); + }, this.#capability.reject); + }; + this.#reader = this.#textContentSource.getReader(); + TextLayer.#pendingTextLayers.add(this); + pump(); + return this.#capability.promise; + } + update({ + viewport, + onBefore = null + }) { + const scale = viewport.scale * (globalThis.devicePixelRatio || 1); + const rotation = viewport.rotation; + if (rotation !== this.#rotation) { + onBefore?.(); + this.#rotation = rotation; + setLayerDimensions(this.#rootContainer, { + rotation + }); + } + if (scale !== this.#scale) { + onBefore?.(); + this.#scale = scale; + const params = { + prevFontSize: null, + prevFontFamily: null, + div: null, + properties: null, + ctx: TextLayer.#getCtx(this.#lang) + }; + for (const div of this.#textDivs) { + params.properties = this.#textDivProperties.get(div); + params.div = div; + this.#layout(params); + } + } + } + cancel() { + const abortEx = new AbortException("TextLayer task cancelled."); + this.#reader?.cancel(abortEx).catch(() => {}); + this.#reader = null; + this.#capability.reject(abortEx); + } + get textDivs() { + return this.#textDivs; + } + get textContentItemsStr() { + return this.#textContentItemsStr; + } + #processItems(items) { + if (this.#disableProcessItems) { + return; + } + this.#layoutTextParams.ctx ??= TextLayer.#getCtx(this.#lang); + const textDivs = this.#textDivs, + textContentItemsStr = this.#textContentItemsStr; + for (const item of items) { + if (textDivs.length > MAX_TEXT_DIVS_TO_RENDER) { + warn("Ignoring additional textDivs for performance reasons."); + this.#disableProcessItems = true; + return; + } + if (item.str === undefined) { + if (item.type === "beginMarkedContentProps" || item.type === "beginMarkedContent") { + const parent = this.#container; + this.#container = document.createElement("span"); + this.#container.classList.add("markedContent"); + if (item.id !== null) { + this.#container.setAttribute("id", `${item.id}`); + } + parent.append(this.#container); + } else if (item.type === "endMarkedContent") { + this.#container = this.#container.parentNode; + } + continue; + } + textContentItemsStr.push(item.str); + this.#appendText(item); + } + } + #appendText(geom) { + const textDiv = document.createElement("span"); + const textDivProperties = { + angle: 0, + canvasWidth: 0, + hasText: geom.str !== "", + hasEOL: geom.hasEOL, + fontSize: 0 + }; + this.#textDivs.push(textDiv); + const tx = Util.transform(this.#transform, geom.transform); + let angle = Math.atan2(tx[1], tx[0]); + const style = this.#styleCache[geom.fontName]; + if (style.vertical) { + angle += Math.PI / 2; + } + const fontFamily = this.#fontInspectorEnabled && style.fontSubstitution || style.fontFamily; + const fontHeight = Math.hypot(tx[2], tx[3]); + const fontAscent = fontHeight * TextLayer.#getAscent(fontFamily, this.#lang); + let left, top; + if (angle === 0) { + left = tx[4]; + top = tx[5] - fontAscent; + } else { + left = tx[4] + fontAscent * Math.sin(angle); + top = tx[5] - fontAscent * Math.cos(angle); + } + const scaleFactorStr = "calc(var(--scale-factor)*"; + const divStyle = textDiv.style; + if (this.#container === this.#rootContainer) { + divStyle.left = `${(100 * left / this.#pageWidth).toFixed(2)}%`; + divStyle.top = `${(100 * top / this.#pageHeight).toFixed(2)}%`; + } else { + divStyle.left = `${scaleFactorStr}${left.toFixed(2)}px)`; + divStyle.top = `${scaleFactorStr}${top.toFixed(2)}px)`; + } + divStyle.fontSize = `${scaleFactorStr}${(TextLayer.#minFontSize * fontHeight).toFixed(2)}px)`; + divStyle.fontFamily = fontFamily; + textDivProperties.fontSize = fontHeight; + textDiv.setAttribute("role", "presentation"); + textDiv.textContent = geom.str; + textDiv.dir = geom.dir; + if (this.#fontInspectorEnabled) { + textDiv.dataset.fontName = style.fontSubstitutionLoadedName || geom.fontName; + } + if (angle !== 0) { + textDivProperties.angle = angle * (180 / Math.PI); + } + let shouldScaleText = false; + if (geom.str.length > 1) { + shouldScaleText = true; + } else if (geom.str !== " " && geom.transform[0] !== geom.transform[3]) { + const absScaleX = Math.abs(geom.transform[0]), + absScaleY = Math.abs(geom.transform[3]); + if (absScaleX !== absScaleY && Math.max(absScaleX, absScaleY) / Math.min(absScaleX, absScaleY) > 1.5) { + shouldScaleText = true; + } + } + if (shouldScaleText) { + textDivProperties.canvasWidth = style.vertical ? geom.height : geom.width; + } + this.#textDivProperties.set(textDiv, textDivProperties); + this.#layoutTextParams.div = textDiv; + this.#layoutTextParams.properties = textDivProperties; + this.#layout(this.#layoutTextParams); + if (textDivProperties.hasText) { + this.#container.append(textDiv); + } + if (textDivProperties.hasEOL) { + const br = document.createElement("br"); + br.setAttribute("role", "presentation"); + this.#container.append(br); + } + } + #layout(params) { + const { + div, + properties, + ctx, + prevFontSize, + prevFontFamily + } = params; + const { + style + } = div; + let transform = ""; + if (TextLayer.#minFontSize > 1) { + transform = `scale(${1 / TextLayer.#minFontSize})`; + } + if (properties.canvasWidth !== 0 && properties.hasText) { + const { + fontFamily + } = style; + const { + canvasWidth, + fontSize + } = properties; + if (prevFontSize !== fontSize || prevFontFamily !== fontFamily) { + ctx.font = `${fontSize * this.#scale}px ${fontFamily}`; + params.prevFontSize = fontSize; + params.prevFontFamily = fontFamily; + } + const { + width + } = ctx.measureText(div.textContent); + if (width > 0) { + transform = `scaleX(${canvasWidth * this.#scale / width}) ${transform}`; + } + } + if (properties.angle !== 0) { + transform = `rotate(${properties.angle}deg) ${transform}`; + } + if (transform.length > 0) { + style.transform = transform; + } + } + static cleanup() { + if (this.#pendingTextLayers.size > 0) { + return; + } + this.#ascentCache.clear(); + for (const { + canvas + } of this.#canvasContexts.values()) { + canvas.remove(); + } + this.#canvasContexts.clear(); + } + static #getCtx(lang = null) { + let canvasContext = this.#canvasContexts.get(lang ||= ""); + if (!canvasContext) { + const canvas = document.createElement("canvas"); + canvas.className = "hiddenCanvasElement"; + canvas.lang = lang; + document.body.append(canvas); + canvasContext = canvas.getContext("2d", { + alpha: false, + willReadFrequently: true + }); + this.#canvasContexts.set(lang, canvasContext); + } + return canvasContext; + } + static #ensureMinFontSizeComputed() { + if (this.#minFontSize !== null) { + return; + } + const div = document.createElement("div"); + div.style.opacity = 0; + div.style.lineHeight = 1; + div.style.fontSize = "1px"; + div.textContent = "X"; + document.body.append(div); + this.#minFontSize = div.getBoundingClientRect().height; + div.remove(); + } + static #getAscent(fontFamily, lang) { + const cachedAscent = this.#ascentCache.get(fontFamily); + if (cachedAscent) { + return cachedAscent; + } + const ctx = this.#getCtx(lang); + const savedFont = ctx.font; + ctx.canvas.width = ctx.canvas.height = DEFAULT_FONT_SIZE; + ctx.font = `${DEFAULT_FONT_SIZE}px ${fontFamily}`; + const metrics = ctx.measureText(""); + let ascent = metrics.fontBoundingBoxAscent; + let descent = Math.abs(metrics.fontBoundingBoxDescent); + if (ascent) { + const ratio = ascent / (ascent + descent); + this.#ascentCache.set(fontFamily, ratio); + ctx.canvas.width = ctx.canvas.height = 0; + ctx.font = savedFont; + return ratio; + } + ctx.strokeStyle = "red"; + ctx.clearRect(0, 0, DEFAULT_FONT_SIZE, DEFAULT_FONT_SIZE); + ctx.strokeText("g", 0, 0); + let pixels = ctx.getImageData(0, 0, DEFAULT_FONT_SIZE, DEFAULT_FONT_SIZE).data; + descent = 0; + for (let i = pixels.length - 1 - 3; i >= 0; i -= 4) { + if (pixels[i] > 0) { + descent = Math.ceil(i / 4 / DEFAULT_FONT_SIZE); + break; + } + } + ctx.clearRect(0, 0, DEFAULT_FONT_SIZE, DEFAULT_FONT_SIZE); + ctx.strokeText("A", 0, DEFAULT_FONT_SIZE); + pixels = ctx.getImageData(0, 0, DEFAULT_FONT_SIZE, DEFAULT_FONT_SIZE).data; + ascent = 0; + for (let i = 0, ii = pixels.length; i < ii; i += 4) { + if (pixels[i] > 0) { + ascent = DEFAULT_FONT_SIZE - Math.floor(i / 4 / DEFAULT_FONT_SIZE); + break; + } + } + ctx.canvas.width = ctx.canvas.height = 0; + ctx.font = savedFont; + const ratio = ascent ? ascent / (ascent + descent) : DEFAULT_FONT_ASCENT; + this.#ascentCache.set(fontFamily, ratio); + return ratio; + } +} +function renderTextLayer() { + deprecated("`renderTextLayer`, please use `TextLayer` instead."); + const { + textContentSource, + container, + viewport, + ...rest + } = arguments[0]; + const restKeys = Object.keys(rest); + if (restKeys.length > 0) { + warn("Ignoring `renderTextLayer` parameters: " + restKeys.join(", ")); + } + const textLayer = new TextLayer({ + textContentSource, + container, + viewport + }); + const { + textDivs, + textContentItemsStr + } = textLayer; + const promise = textLayer.render(); + return { + promise, + textDivs, + textContentItemsStr + }; +} +function updateTextLayer() { + deprecated("`updateTextLayer`, please use `TextLayer` instead."); +} + +;// CONCATENATED MODULE: ./src/display/xfa_text.js +class XfaText { + static textContent(xfa) { + const items = []; + const output = { + items, + styles: Object.create(null) + }; + function walk(node) { + if (!node) { + return; + } + let str = null; + const name = node.name; + if (name === "#text") { + str = node.value; + } else if (!XfaText.shouldBuildText(name)) { + return; + } else if (node?.attributes?.textContent) { + str = node.attributes.textContent; + } else if (node.value) { + str = node.value; + } + if (str !== null) { + items.push({ + str + }); + } + if (!node.children) { + return; + } + for (const child of node.children) { + walk(child); + } + } + walk(xfa); + return output; + } + static shouldBuildText(name) { + return !(name === "textarea" || name === "input" || name === "option" || name === "select"); + } +} + +;// CONCATENATED MODULE: ./src/display/api.js + + + + + + + + + + + + + + + + +const DEFAULT_RANGE_CHUNK_SIZE = 65536; +const RENDERING_CANCELLED_TIMEOUT = 100; +const DELAYED_CLEANUP_TIMEOUT = 5000; +const DefaultCanvasFactory = isNodeJS ? NodeCanvasFactory : DOMCanvasFactory; +const DefaultCMapReaderFactory = isNodeJS ? NodeCMapReaderFactory : DOMCMapReaderFactory; +const DefaultFilterFactory = isNodeJS ? NodeFilterFactory : DOMFilterFactory; +const DefaultStandardFontDataFactory = isNodeJS ? NodeStandardFontDataFactory : DOMStandardFontDataFactory; +function getDocument(src = {}) { + if (typeof src === "string" || src instanceof URL) { + src = { + url: src + }; + } else if (src instanceof ArrayBuffer || ArrayBuffer.isView(src)) { + src = { + data: src + }; + } + const task = new PDFDocumentLoadingTask(); + const { + docId + } = task; + const url = src.url ? getUrlProp(src.url) : null; + const data = src.data ? getDataProp(src.data) : null; + const httpHeaders = src.httpHeaders || null; + const withCredentials = src.withCredentials === true; + const password = src.password ?? null; + const rangeTransport = src.range instanceof PDFDataRangeTransport ? src.range : null; + const rangeChunkSize = Number.isInteger(src.rangeChunkSize) && src.rangeChunkSize > 0 ? src.rangeChunkSize : DEFAULT_RANGE_CHUNK_SIZE; + let worker = src.worker instanceof PDFWorker ? src.worker : null; + const verbosity = src.verbosity; + const docBaseUrl = typeof src.docBaseUrl === "string" && !isDataScheme(src.docBaseUrl) ? src.docBaseUrl : null; + const cMapUrl = typeof src.cMapUrl === "string" ? src.cMapUrl : null; + const cMapPacked = src.cMapPacked !== false; + const CMapReaderFactory = src.CMapReaderFactory || DefaultCMapReaderFactory; + const standardFontDataUrl = typeof src.standardFontDataUrl === "string" ? src.standardFontDataUrl : null; + const StandardFontDataFactory = src.StandardFontDataFactory || DefaultStandardFontDataFactory; + const ignoreErrors = src.stopAtErrors !== true; + const maxImageSize = Number.isInteger(src.maxImageSize) && src.maxImageSize > -1 ? src.maxImageSize : -1; + const isEvalSupported = src.isEvalSupported !== false; + const isOffscreenCanvasSupported = typeof src.isOffscreenCanvasSupported === "boolean" ? src.isOffscreenCanvasSupported : !isNodeJS; + const canvasMaxAreaInBytes = Number.isInteger(src.canvasMaxAreaInBytes) ? src.canvasMaxAreaInBytes : -1; + const disableFontFace = typeof src.disableFontFace === "boolean" ? src.disableFontFace : isNodeJS; + const fontExtraProperties = src.fontExtraProperties === true; + const enableXfa = src.enableXfa === true; + const ownerDocument = src.ownerDocument || globalThis.document; + const disableRange = src.disableRange === true; + const disableStream = src.disableStream === true; + const disableAutoFetch = src.disableAutoFetch === true; + const pdfBug = src.pdfBug === true; + const enableHWA = src.enableHWA === true; + const length = rangeTransport ? rangeTransport.length : src.length ?? NaN; + const useSystemFonts = typeof src.useSystemFonts === "boolean" ? src.useSystemFonts : !isNodeJS && !disableFontFace; + const useWorkerFetch = typeof src.useWorkerFetch === "boolean" ? src.useWorkerFetch : CMapReaderFactory === DOMCMapReaderFactory && StandardFontDataFactory === DOMStandardFontDataFactory && cMapUrl && standardFontDataUrl && isValidFetchUrl(cMapUrl, document.baseURI) && isValidFetchUrl(standardFontDataUrl, document.baseURI); + const canvasFactory = src.canvasFactory || new DefaultCanvasFactory({ + ownerDocument, + enableHWA + }); + const filterFactory = src.filterFactory || new DefaultFilterFactory({ + docId, + ownerDocument + }); + const styleElement = null; + setVerbosityLevel(verbosity); + const transportFactory = { + canvasFactory, + filterFactory + }; + if (!useWorkerFetch) { + transportFactory.cMapReaderFactory = new CMapReaderFactory({ + baseUrl: cMapUrl, + isCompressed: cMapPacked + }); + transportFactory.standardFontDataFactory = new StandardFontDataFactory({ + baseUrl: standardFontDataUrl + }); + } + if (!worker) { + const workerParams = { + verbosity, + port: GlobalWorkerOptions.workerPort + }; + worker = workerParams.port ? PDFWorker.fromPort(workerParams) : new PDFWorker(workerParams); + task._worker = worker; + } + const docParams = { + docId, + apiVersion: "4.4.168", + data, + password, + disableAutoFetch, + rangeChunkSize, + length, + docBaseUrl, + enableXfa, + evaluatorOptions: { + maxImageSize, + disableFontFace, + ignoreErrors, + isEvalSupported, + isOffscreenCanvasSupported, + canvasMaxAreaInBytes, + fontExtraProperties, + useSystemFonts, + cMapUrl: useWorkerFetch ? cMapUrl : null, + standardFontDataUrl: useWorkerFetch ? standardFontDataUrl : null + } + }; + const transportParams = { + disableFontFace, + fontExtraProperties, + ownerDocument, + pdfBug, + styleElement, + loadingParams: { + disableAutoFetch, + enableXfa + } + }; + worker.promise.then(function () { + if (task.destroyed) { + throw new Error("Loading aborted"); + } + if (worker.destroyed) { + throw new Error("Worker was destroyed"); + } + const workerIdPromise = worker.messageHandler.sendWithPromise("GetDocRequest", docParams, data ? [data.buffer] : null); + let networkStream; + if (rangeTransport) { + networkStream = new PDFDataTransportStream(rangeTransport, { + disableRange, + disableStream + }); + } else if (!data) { + if (!url) { + throw new Error("getDocument - no `url` parameter provided."); + } + const createPDFNetworkStream = params => { + if (isNodeJS) { + const isFetchSupported = function () { + return typeof fetch !== "undefined" && typeof Response !== "undefined" && "body" in Response.prototype; + }; + return isFetchSupported() && isValidFetchUrl(params.url) ? new PDFFetchStream(params) : new PDFNodeStream(params); + } + return isValidFetchUrl(params.url) ? new PDFFetchStream(params) : new PDFNetworkStream(params); + }; + networkStream = createPDFNetworkStream({ + url, + length, + httpHeaders, + withCredentials, + rangeChunkSize, + disableRange, + disableStream + }); + } + return workerIdPromise.then(workerId => { + if (task.destroyed) { + throw new Error("Loading aborted"); + } + if (worker.destroyed) { + throw new Error("Worker was destroyed"); + } + const messageHandler = new MessageHandler(docId, workerId, worker.port); + const transport = new WorkerTransport(messageHandler, task, networkStream, transportParams, transportFactory); + task._transport = transport; + messageHandler.send("Ready", null); + }); + }).catch(task._capability.reject); + return task; +} +function getUrlProp(val) { + if (val instanceof URL) { + return val.href; + } + try { + return new URL(val, window.location).href; + } catch { + if (isNodeJS && typeof val === "string") { + return val; + } + } + throw new Error("Invalid PDF url data: " + "either string or URL-object is expected in the url property."); +} +function getDataProp(val) { + if (isNodeJS && typeof Buffer !== "undefined" && val instanceof Buffer) { + throw new Error("Please provide binary data as `Uint8Array`, rather than `Buffer`."); + } + if (val instanceof Uint8Array && val.byteLength === val.buffer.byteLength) { + return val; + } + if (typeof val === "string") { + return stringToBytes(val); + } + if (val instanceof ArrayBuffer || ArrayBuffer.isView(val) || typeof val === "object" && !isNaN(val?.length)) { + return new Uint8Array(val); + } + throw new Error("Invalid PDF binary data: either TypedArray, " + "string, or array-like object is expected in the data property."); +} +function isRefProxy(ref) { + return typeof ref === "object" && Number.isInteger(ref?.num) && ref.num >= 0 && Number.isInteger(ref?.gen) && ref.gen >= 0; +} +class PDFDocumentLoadingTask { + static #docId = 0; + constructor() { + this._capability = Promise.withResolvers(); + this._transport = null; + this._worker = null; + this.docId = `d${PDFDocumentLoadingTask.#docId++}`; + this.destroyed = false; + this.onPassword = null; + this.onProgress = null; + } + get promise() { + return this._capability.promise; + } + async destroy() { + this.destroyed = true; + try { + if (this._worker?.port) { + this._worker._pendingDestroy = true; + } + await this._transport?.destroy(); + } catch (ex) { + if (this._worker?.port) { + delete this._worker._pendingDestroy; + } + throw ex; + } + this._transport = null; + if (this._worker) { + this._worker.destroy(); + this._worker = null; + } + } +} +class PDFDataRangeTransport { + constructor(length, initialData, progressiveDone = false, contentDispositionFilename = null) { + this.length = length; + this.initialData = initialData; + this.progressiveDone = progressiveDone; + this.contentDispositionFilename = contentDispositionFilename; + this._rangeListeners = []; + this._progressListeners = []; + this._progressiveReadListeners = []; + this._progressiveDoneListeners = []; + this._readyCapability = Promise.withResolvers(); + } + addRangeListener(listener) { + this._rangeListeners.push(listener); + } + addProgressListener(listener) { + this._progressListeners.push(listener); + } + addProgressiveReadListener(listener) { + this._progressiveReadListeners.push(listener); + } + addProgressiveDoneListener(listener) { + this._progressiveDoneListeners.push(listener); + } + onDataRange(begin, chunk) { + for (const listener of this._rangeListeners) { + listener(begin, chunk); + } + } + onDataProgress(loaded, total) { + this._readyCapability.promise.then(() => { + for (const listener of this._progressListeners) { + listener(loaded, total); + } + }); + } + onDataProgressiveRead(chunk) { + this._readyCapability.promise.then(() => { + for (const listener of this._progressiveReadListeners) { + listener(chunk); + } + }); + } + onDataProgressiveDone() { + this._readyCapability.promise.then(() => { + for (const listener of this._progressiveDoneListeners) { + listener(); + } + }); + } + transportReady() { + this._readyCapability.resolve(); + } + requestDataRange(begin, end) { + unreachable("Abstract method PDFDataRangeTransport.requestDataRange"); + } + abort() {} +} +class PDFDocumentProxy { + constructor(pdfInfo, transport) { + this._pdfInfo = pdfInfo; + this._transport = transport; + } + get annotationStorage() { + return this._transport.annotationStorage; + } + get filterFactory() { + return this._transport.filterFactory; + } + get numPages() { + return this._pdfInfo.numPages; + } + get fingerprints() { + return this._pdfInfo.fingerprints; + } + get isPureXfa() { + return shadow(this, "isPureXfa", !!this._transport._htmlForXfa); + } + get allXfaHtml() { + return this._transport._htmlForXfa; + } + getPage(pageNumber) { + return this._transport.getPage(pageNumber); + } + getPageIndex(ref) { + return this._transport.getPageIndex(ref); + } + getDestinations() { + return this._transport.getDestinations(); + } + getDestination(id) { + return this._transport.getDestination(id); + } + getPageLabels() { + return this._transport.getPageLabels(); + } + getPageLayout() { + return this._transport.getPageLayout(); + } + getPageMode() { + return this._transport.getPageMode(); + } + getViewerPreferences() { + return this._transport.getViewerPreferences(); + } + getOpenAction() { + return this._transport.getOpenAction(); + } + getAttachments() { + return this._transport.getAttachments(); + } + getJSActions() { + return this._transport.getDocJSActions(); + } + getOutline() { + return this._transport.getOutline(); + } + getOptionalContentConfig({ + intent = "display" + } = {}) { + const { + renderingIntent + } = this._transport.getRenderingIntent(intent); + return this._transport.getOptionalContentConfig(renderingIntent); + } + getPermissions() { + return this._transport.getPermissions(); + } + getMetadata() { + return this._transport.getMetadata(); + } + getMarkInfo() { + return this._transport.getMarkInfo(); + } + getData() { + return this._transport.getData(); + } + saveDocument() { + return this._transport.saveDocument(); + } + getDownloadInfo() { + return this._transport.downloadInfoCapability.promise; + } + cleanup(keepLoadedFonts = false) { + return this._transport.startCleanup(keepLoadedFonts || this.isPureXfa); + } + destroy() { + return this.loadingTask.destroy(); + } + cachedPageNumber(ref) { + return this._transport.cachedPageNumber(ref); + } + get loadingParams() { + return this._transport.loadingParams; + } + get loadingTask() { + return this._transport.loadingTask; + } + getFieldObjects() { + return this._transport.getFieldObjects(); + } + hasJSActions() { + return this._transport.hasJSActions(); + } + getCalculationOrderIds() { + return this._transport.getCalculationOrderIds(); + } +} +class PDFPageProxy { + #delayedCleanupTimeout = null; + #pendingCleanup = false; + constructor(pageIndex, pageInfo, transport, pdfBug = false) { + this._pageIndex = pageIndex; + this._pageInfo = pageInfo; + this._transport = transport; + this._stats = pdfBug ? new StatTimer() : null; + this._pdfBug = pdfBug; + this.commonObjs = transport.commonObjs; + this.objs = new PDFObjects(); + this._maybeCleanupAfterRender = false; + this._intentStates = new Map(); + this.destroyed = false; + } + get pageNumber() { + return this._pageIndex + 1; + } + get rotate() { + return this._pageInfo.rotate; + } + get ref() { + return this._pageInfo.ref; + } + get userUnit() { + return this._pageInfo.userUnit; + } + get view() { + return this._pageInfo.view; + } + getViewport({ + scale, + rotation = this.rotate, + offsetX = 0, + offsetY = 0, + dontFlip = false + } = {}) { + return new PageViewport({ + viewBox: this.view, + scale, + rotation, + offsetX, + offsetY, + dontFlip + }); + } + getAnnotations({ + intent = "display" + } = {}) { + const { + renderingIntent + } = this._transport.getRenderingIntent(intent); + return this._transport.getAnnotations(this._pageIndex, renderingIntent); + } + getJSActions() { + return this._transport.getPageJSActions(this._pageIndex); + } + get filterFactory() { + return this._transport.filterFactory; + } + get isPureXfa() { + return shadow(this, "isPureXfa", !!this._transport._htmlForXfa); + } + async getXfa() { + return this._transport._htmlForXfa?.children[this._pageIndex] || null; + } + render({ + canvasContext, + viewport, + intent = "display", + annotationMode = AnnotationMode.ENABLE, + transform = null, + background = null, + optionalContentConfigPromise = null, + annotationCanvasMap = null, + pageColors = null, + printAnnotationStorage = null + }) { + this._stats?.time("Overall"); + const intentArgs = this._transport.getRenderingIntent(intent, annotationMode, printAnnotationStorage); + const { + renderingIntent, + cacheKey + } = intentArgs; + this.#pendingCleanup = false; + this.#abortDelayedCleanup(); + optionalContentConfigPromise ||= this._transport.getOptionalContentConfig(renderingIntent); + let intentState = this._intentStates.get(cacheKey); + if (!intentState) { + intentState = Object.create(null); + this._intentStates.set(cacheKey, intentState); + } + if (intentState.streamReaderCancelTimeout) { + clearTimeout(intentState.streamReaderCancelTimeout); + intentState.streamReaderCancelTimeout = null; + } + const intentPrint = !!(renderingIntent & RenderingIntentFlag.PRINT); + if (!intentState.displayReadyCapability) { + intentState.displayReadyCapability = Promise.withResolvers(); + intentState.operatorList = { + fnArray: [], + argsArray: [], + lastChunk: false, + separateAnnots: null + }; + this._stats?.time("Page Request"); + this._pumpOperatorList(intentArgs); + } + const complete = error => { + intentState.renderTasks.delete(internalRenderTask); + if (this._maybeCleanupAfterRender || intentPrint) { + this.#pendingCleanup = true; + } + this.#tryCleanup(!intentPrint); + if (error) { + internalRenderTask.capability.reject(error); + this._abortOperatorList({ + intentState, + reason: error instanceof Error ? error : new Error(error) + }); + } else { + internalRenderTask.capability.resolve(); + } + if (this._stats) { + this._stats.timeEnd("Rendering"); + this._stats.timeEnd("Overall"); + if (globalThis.Stats?.enabled) { + globalThis.Stats.add(this.pageNumber, this._stats); + } + } + }; + const internalRenderTask = new InternalRenderTask({ + callback: complete, + params: { + canvasContext, + viewport, + transform, + background + }, + objs: this.objs, + commonObjs: this.commonObjs, + annotationCanvasMap, + operatorList: intentState.operatorList, + pageIndex: this._pageIndex, + canvasFactory: this._transport.canvasFactory, + filterFactory: this._transport.filterFactory, + useRequestAnimationFrame: !intentPrint, + pdfBug: this._pdfBug, + pageColors + }); + (intentState.renderTasks ||= new Set()).add(internalRenderTask); + const renderTask = internalRenderTask.task; + Promise.all([intentState.displayReadyCapability.promise, optionalContentConfigPromise]).then(([transparency, optionalContentConfig]) => { + if (this.destroyed) { + complete(); + return; + } + this._stats?.time("Rendering"); + if (!(optionalContentConfig.renderingIntent & renderingIntent)) { + throw new Error("Must use the same `intent`-argument when calling the `PDFPageProxy.render` " + "and `PDFDocumentProxy.getOptionalContentConfig` methods."); + } + internalRenderTask.initializeGraphics({ + transparency, + optionalContentConfig + }); + internalRenderTask.operatorListChanged(); + }).catch(complete); + return renderTask; + } + getOperatorList({ + intent = "display", + annotationMode = AnnotationMode.ENABLE, + printAnnotationStorage = null + } = {}) { + function operatorListChanged() { + if (intentState.operatorList.lastChunk) { + intentState.opListReadCapability.resolve(intentState.operatorList); + intentState.renderTasks.delete(opListTask); + } + } + const intentArgs = this._transport.getRenderingIntent(intent, annotationMode, printAnnotationStorage, true); + let intentState = this._intentStates.get(intentArgs.cacheKey); + if (!intentState) { + intentState = Object.create(null); + this._intentStates.set(intentArgs.cacheKey, intentState); + } + let opListTask; + if (!intentState.opListReadCapability) { + opListTask = Object.create(null); + opListTask.operatorListChanged = operatorListChanged; + intentState.opListReadCapability = Promise.withResolvers(); + (intentState.renderTasks ||= new Set()).add(opListTask); + intentState.operatorList = { + fnArray: [], + argsArray: [], + lastChunk: false, + separateAnnots: null + }; + this._stats?.time("Page Request"); + this._pumpOperatorList(intentArgs); + } + return intentState.opListReadCapability.promise; + } + streamTextContent({ + includeMarkedContent = false, + disableNormalization = false + } = {}) { + const TEXT_CONTENT_CHUNK_SIZE = 100; + return this._transport.messageHandler.sendWithStream("GetTextContent", { + pageIndex: this._pageIndex, + includeMarkedContent: includeMarkedContent === true, + disableNormalization: disableNormalization === true + }, { + highWaterMark: TEXT_CONTENT_CHUNK_SIZE, + size(textContent) { + return textContent.items.length; + } + }); + } + getTextContent(params = {}) { + if (this._transport._htmlForXfa) { + return this.getXfa().then(xfa => XfaText.textContent(xfa)); + } + const readableStream = this.streamTextContent(params); + return new Promise(function (resolve, reject) { + function pump() { + reader.read().then(function ({ + value, + done + }) { + if (done) { + resolve(textContent); + return; + } + textContent.lang ??= value.lang; + Object.assign(textContent.styles, value.styles); + textContent.items.push(...value.items); + pump(); + }, reject); + } + const reader = readableStream.getReader(); + const textContent = { + items: [], + styles: Object.create(null), + lang: null + }; + pump(); + }); + } + getStructTree() { + return this._transport.getStructTree(this._pageIndex); + } + _destroy() { + this.destroyed = true; + const waitOn = []; + for (const intentState of this._intentStates.values()) { + this._abortOperatorList({ + intentState, + reason: new Error("Page was destroyed."), + force: true + }); + if (intentState.opListReadCapability) { + continue; + } + for (const internalRenderTask of intentState.renderTasks) { + waitOn.push(internalRenderTask.completed); + internalRenderTask.cancel(); + } + } + this.objs.clear(); + this.#pendingCleanup = false; + this.#abortDelayedCleanup(); + return Promise.all(waitOn); + } + cleanup(resetStats = false) { + this.#pendingCleanup = true; + const success = this.#tryCleanup(false); + if (resetStats && success) { + this._stats &&= new StatTimer(); + } + return success; + } + #tryCleanup(delayed = false) { + this.#abortDelayedCleanup(); + if (!this.#pendingCleanup || this.destroyed) { + return false; + } + if (delayed) { + this.#delayedCleanupTimeout = setTimeout(() => { + this.#delayedCleanupTimeout = null; + this.#tryCleanup(false); + }, DELAYED_CLEANUP_TIMEOUT); + return false; + } + for (const { + renderTasks, + operatorList + } of this._intentStates.values()) { + if (renderTasks.size > 0 || !operatorList.lastChunk) { + return false; + } + } + this._intentStates.clear(); + this.objs.clear(); + this.#pendingCleanup = false; + return true; + } + #abortDelayedCleanup() { + if (this.#delayedCleanupTimeout) { + clearTimeout(this.#delayedCleanupTimeout); + this.#delayedCleanupTimeout = null; + } + } + _startRenderPage(transparency, cacheKey) { + const intentState = this._intentStates.get(cacheKey); + if (!intentState) { + return; + } + this._stats?.timeEnd("Page Request"); + intentState.displayReadyCapability?.resolve(transparency); + } + _renderPageChunk(operatorListChunk, intentState) { + for (let i = 0, ii = operatorListChunk.length; i < ii; i++) { + intentState.operatorList.fnArray.push(operatorListChunk.fnArray[i]); + intentState.operatorList.argsArray.push(operatorListChunk.argsArray[i]); + } + intentState.operatorList.lastChunk = operatorListChunk.lastChunk; + intentState.operatorList.separateAnnots = operatorListChunk.separateAnnots; + for (const internalRenderTask of intentState.renderTasks) { + internalRenderTask.operatorListChanged(); + } + if (operatorListChunk.lastChunk) { + this.#tryCleanup(true); + } + } + _pumpOperatorList({ + renderingIntent, + cacheKey, + annotationStorageSerializable + }) { + const { + map, + transfer + } = annotationStorageSerializable; + const readableStream = this._transport.messageHandler.sendWithStream("GetOperatorList", { + pageIndex: this._pageIndex, + intent: renderingIntent, + cacheKey, + annotationStorage: map + }, transfer); + const reader = readableStream.getReader(); + const intentState = this._intentStates.get(cacheKey); + intentState.streamReader = reader; + const pump = () => { + reader.read().then(({ + value, + done + }) => { + if (done) { + intentState.streamReader = null; + return; + } + if (this._transport.destroyed) { + return; + } + this._renderPageChunk(value, intentState); + pump(); + }, reason => { + intentState.streamReader = null; + if (this._transport.destroyed) { + return; + } + if (intentState.operatorList) { + intentState.operatorList.lastChunk = true; + for (const internalRenderTask of intentState.renderTasks) { + internalRenderTask.operatorListChanged(); + } + this.#tryCleanup(true); + } + if (intentState.displayReadyCapability) { + intentState.displayReadyCapability.reject(reason); + } else if (intentState.opListReadCapability) { + intentState.opListReadCapability.reject(reason); + } else { + throw reason; + } + }); + }; + pump(); + } + _abortOperatorList({ + intentState, + reason, + force = false + }) { + if (!intentState.streamReader) { + return; + } + if (intentState.streamReaderCancelTimeout) { + clearTimeout(intentState.streamReaderCancelTimeout); + intentState.streamReaderCancelTimeout = null; + } + if (!force) { + if (intentState.renderTasks.size > 0) { + return; + } + if (reason instanceof RenderingCancelledException) { + let delay = RENDERING_CANCELLED_TIMEOUT; + if (reason.extraDelay > 0 && reason.extraDelay < 1000) { + delay += reason.extraDelay; + } + intentState.streamReaderCancelTimeout = setTimeout(() => { + intentState.streamReaderCancelTimeout = null; + this._abortOperatorList({ + intentState, + reason, + force: true + }); + }, delay); + return; + } + } + intentState.streamReader.cancel(new AbortException(reason.message)).catch(() => {}); + intentState.streamReader = null; + if (this._transport.destroyed) { + return; + } + for (const [curCacheKey, curIntentState] of this._intentStates) { + if (curIntentState === intentState) { + this._intentStates.delete(curCacheKey); + break; + } + } + this.cleanup(); + } + get stats() { + return this._stats; + } +} +class LoopbackPort { + #listeners = new Set(); + #deferred = Promise.resolve(); + postMessage(obj, transfer) { + const event = { + data: structuredClone(obj, transfer ? { + transfer + } : null) + }; + this.#deferred.then(() => { + for (const listener of this.#listeners) { + listener.call(this, event); + } + }); + } + addEventListener(name, listener) { + this.#listeners.add(listener); + } + removeEventListener(name, listener) { + this.#listeners.delete(listener); + } + terminate() { + this.#listeners.clear(); + } +} +const PDFWorkerUtil = { + isWorkerDisabled: false, + fakeWorkerId: 0 +}; +{ + if (isNodeJS) { + PDFWorkerUtil.isWorkerDisabled = true; + GlobalWorkerOptions.workerSrc ||= "./pdf.worker.mjs"; + } + PDFWorkerUtil.isSameOrigin = function (baseUrl, otherUrl) { + let base; + try { + base = new URL(baseUrl); + if (!base.origin || base.origin === "null") { + return false; + } + } catch { + return false; + } + const other = new URL(otherUrl, base); + return base.origin === other.origin; + }; + PDFWorkerUtil.createCDNWrapper = function (url) { + const wrapper = `await import("${url}");`; + return URL.createObjectURL(new Blob([wrapper], { + type: "text/javascript" + })); + }; +} +class PDFWorker { + static #workerPorts; + constructor({ + name = null, + port = null, + verbosity = getVerbosityLevel() + } = {}) { + this.name = name; + this.destroyed = false; + this.verbosity = verbosity; + this._readyCapability = Promise.withResolvers(); + this._port = null; + this._webWorker = null; + this._messageHandler = null; + if (port) { + if (PDFWorker.#workerPorts?.has(port)) { + throw new Error("Cannot use more than one PDFWorker per port."); + } + (PDFWorker.#workerPorts ||= new WeakMap()).set(port, this); + this._initializeFromPort(port); + return; + } + this._initialize(); + } + get promise() { + if (isNodeJS) { + return Promise.all([NodePackages.promise, this._readyCapability.promise]); + } + return this._readyCapability.promise; + } + #resolve() { + this._readyCapability.resolve(); + this._messageHandler.send("configure", { + verbosity: this.verbosity + }); + } + get port() { + return this._port; + } + get messageHandler() { + return this._messageHandler; + } + _initializeFromPort(port) { + this._port = port; + this._messageHandler = new MessageHandler("main", "worker", port); + this._messageHandler.on("ready", function () {}); + this.#resolve(); + } + _initialize() { + if (PDFWorkerUtil.isWorkerDisabled || PDFWorker.#mainThreadWorkerMessageHandler) { + this._setupFakeWorker(); + return; + } + let { + workerSrc + } = PDFWorker; + try { + if (!PDFWorkerUtil.isSameOrigin(window.location.href, workerSrc)) { + workerSrc = PDFWorkerUtil.createCDNWrapper(new URL(workerSrc, window.location).href); + } + const worker = new Worker(workerSrc, { + type: "module" + }); + const messageHandler = new MessageHandler("main", "worker", worker); + const terminateEarly = () => { + ac.abort(); + messageHandler.destroy(); + worker.terminate(); + if (this.destroyed) { + this._readyCapability.reject(new Error("Worker was destroyed")); + } else { + this._setupFakeWorker(); + } + }; + const ac = new AbortController(); + worker.addEventListener("error", () => { + if (!this._webWorker) { + terminateEarly(); + } + }, { + signal: ac.signal + }); + messageHandler.on("test", data => { + ac.abort(); + if (this.destroyed || !data) { + terminateEarly(); + return; + } + this._messageHandler = messageHandler; + this._port = worker; + this._webWorker = worker; + this.#resolve(); + }); + messageHandler.on("ready", data => { + ac.abort(); + if (this.destroyed) { + terminateEarly(); + return; + } + try { + sendTest(); + } catch { + this._setupFakeWorker(); + } + }); + const sendTest = () => { + const testObj = new Uint8Array(); + messageHandler.send("test", testObj, [testObj.buffer]); + }; + sendTest(); + return; + } catch { + info("The worker has been disabled."); + } + this._setupFakeWorker(); + } + _setupFakeWorker() { + if (!PDFWorkerUtil.isWorkerDisabled) { + warn("Setting up fake worker."); + PDFWorkerUtil.isWorkerDisabled = true; + } + PDFWorker._setupFakeWorkerGlobal.then(WorkerMessageHandler => { + if (this.destroyed) { + this._readyCapability.reject(new Error("Worker was destroyed")); + return; + } + const port = new LoopbackPort(); + this._port = port; + const id = `fake${PDFWorkerUtil.fakeWorkerId++}`; + const workerHandler = new MessageHandler(id + "_worker", id, port); + WorkerMessageHandler.setup(workerHandler, port); + this._messageHandler = new MessageHandler(id, id + "_worker", port); + this.#resolve(); + }).catch(reason => { + this._readyCapability.reject(new Error(`Setting up fake worker failed: "${reason.message}".`)); + }); + } + destroy() { + this.destroyed = true; + if (this._webWorker) { + this._webWorker.terminate(); + this._webWorker = null; + } + PDFWorker.#workerPorts?.delete(this._port); + this._port = null; + if (this._messageHandler) { + this._messageHandler.destroy(); + this._messageHandler = null; + } + } + static fromPort(params) { + if (!params?.port) { + throw new Error("PDFWorker.fromPort - invalid method signature."); + } + const cachedPort = this.#workerPorts?.get(params.port); + if (cachedPort) { + if (cachedPort._pendingDestroy) { + throw new Error("PDFWorker.fromPort - the worker is being destroyed.\n" + "Please remember to await `PDFDocumentLoadingTask.destroy()`-calls."); + } + return cachedPort; + } + return new PDFWorker(params); + } + static get workerSrc() { + if (GlobalWorkerOptions.workerSrc) { + return GlobalWorkerOptions.workerSrc; + } + throw new Error('No "GlobalWorkerOptions.workerSrc" specified.'); + } + static get #mainThreadWorkerMessageHandler() { + try { + return globalThis.pdfjsWorker?.WorkerMessageHandler || null; + } catch { + return null; + } + } + static get _setupFakeWorkerGlobal() { + const loader = async () => { + if (this.#mainThreadWorkerMessageHandler) { + return this.#mainThreadWorkerMessageHandler; + } + const worker = await import( /*webpackIgnore: true*/this.workerSrc); + return worker.WorkerMessageHandler; + }; + return shadow(this, "_setupFakeWorkerGlobal", loader()); + } +} +class WorkerTransport { + #methodPromises = new Map(); + #pageCache = new Map(); + #pagePromises = new Map(); + #pageRefCache = new Map(); + #passwordCapability = null; + constructor(messageHandler, loadingTask, networkStream, params, factory) { + this.messageHandler = messageHandler; + this.loadingTask = loadingTask; + this.commonObjs = new PDFObjects(); + this.fontLoader = new FontLoader({ + ownerDocument: params.ownerDocument, + styleElement: params.styleElement + }); + this.loadingParams = params.loadingParams; + this._params = params; + this.canvasFactory = factory.canvasFactory; + this.filterFactory = factory.filterFactory; + this.cMapReaderFactory = factory.cMapReaderFactory; + this.standardFontDataFactory = factory.standardFontDataFactory; + this.destroyed = false; + this.destroyCapability = null; + this._networkStream = networkStream; + this._fullReader = null; + this._lastProgress = null; + this.downloadInfoCapability = Promise.withResolvers(); + this.setupMessageHandler(); + } + #cacheSimpleMethod(name, data = null) { + const cachedPromise = this.#methodPromises.get(name); + if (cachedPromise) { + return cachedPromise; + } + const promise = this.messageHandler.sendWithPromise(name, data); + this.#methodPromises.set(name, promise); + return promise; + } + get annotationStorage() { + return shadow(this, "annotationStorage", new AnnotationStorage()); + } + getRenderingIntent(intent, annotationMode = AnnotationMode.ENABLE, printAnnotationStorage = null, isOpList = false) { + let renderingIntent = RenderingIntentFlag.DISPLAY; + let annotationStorageSerializable = SerializableEmpty; + switch (intent) { + case "any": + renderingIntent = RenderingIntentFlag.ANY; + break; + case "display": + break; + case "print": + renderingIntent = RenderingIntentFlag.PRINT; + break; + default: + warn(`getRenderingIntent - invalid intent: ${intent}`); + } + switch (annotationMode) { + case AnnotationMode.DISABLE: + renderingIntent += RenderingIntentFlag.ANNOTATIONS_DISABLE; + break; + case AnnotationMode.ENABLE: + break; + case AnnotationMode.ENABLE_FORMS: + renderingIntent += RenderingIntentFlag.ANNOTATIONS_FORMS; + break; + case AnnotationMode.ENABLE_STORAGE: + renderingIntent += RenderingIntentFlag.ANNOTATIONS_STORAGE; + const annotationStorage = renderingIntent & RenderingIntentFlag.PRINT && printAnnotationStorage instanceof PrintAnnotationStorage ? printAnnotationStorage : this.annotationStorage; + annotationStorageSerializable = annotationStorage.serializable; + break; + default: + warn(`getRenderingIntent - invalid annotationMode: ${annotationMode}`); + } + if (isOpList) { + renderingIntent += RenderingIntentFlag.OPLIST; + } + return { + renderingIntent, + cacheKey: `${renderingIntent}_${annotationStorageSerializable.hash}`, + annotationStorageSerializable + }; + } + destroy() { + if (this.destroyCapability) { + return this.destroyCapability.promise; + } + this.destroyed = true; + this.destroyCapability = Promise.withResolvers(); + this.#passwordCapability?.reject(new Error("Worker was destroyed during onPassword callback")); + const waitOn = []; + for (const page of this.#pageCache.values()) { + waitOn.push(page._destroy()); + } + this.#pageCache.clear(); + this.#pagePromises.clear(); + this.#pageRefCache.clear(); + if (this.hasOwnProperty("annotationStorage")) { + this.annotationStorage.resetModified(); + } + const terminated = this.messageHandler.sendWithPromise("Terminate", null); + waitOn.push(terminated); + Promise.all(waitOn).then(() => { + this.commonObjs.clear(); + this.fontLoader.clear(); + this.#methodPromises.clear(); + this.filterFactory.destroy(); + TextLayer.cleanup(); + this._networkStream?.cancelAllRequests(new AbortException("Worker was terminated.")); + if (this.messageHandler) { + this.messageHandler.destroy(); + this.messageHandler = null; + } + this.destroyCapability.resolve(); + }, this.destroyCapability.reject); + return this.destroyCapability.promise; + } + setupMessageHandler() { + const { + messageHandler, + loadingTask + } = this; + messageHandler.on("GetReader", (data, sink) => { + assert(this._networkStream, "GetReader - no `IPDFStream` instance available."); + this._fullReader = this._networkStream.getFullReader(); + this._fullReader.onProgress = evt => { + this._lastProgress = { + loaded: evt.loaded, + total: evt.total + }; + }; + sink.onPull = () => { + this._fullReader.read().then(function ({ + value, + done + }) { + if (done) { + sink.close(); + return; + } + assert(value instanceof ArrayBuffer, "GetReader - expected an ArrayBuffer."); + sink.enqueue(new Uint8Array(value), 1, [value]); + }).catch(reason => { + sink.error(reason); + }); + }; + sink.onCancel = reason => { + this._fullReader.cancel(reason); + sink.ready.catch(readyReason => { + if (this.destroyed) { + return; + } + throw readyReason; + }); + }; + }); + messageHandler.on("ReaderHeadersReady", data => { + const headersCapability = Promise.withResolvers(); + const fullReader = this._fullReader; + fullReader.headersReady.then(() => { + if (!fullReader.isStreamingSupported || !fullReader.isRangeSupported) { + if (this._lastProgress) { + loadingTask.onProgress?.(this._lastProgress); + } + fullReader.onProgress = evt => { + loadingTask.onProgress?.({ + loaded: evt.loaded, + total: evt.total + }); + }; + } + headersCapability.resolve({ + isStreamingSupported: fullReader.isStreamingSupported, + isRangeSupported: fullReader.isRangeSupported, + contentLength: fullReader.contentLength + }); + }, headersCapability.reject); + return headersCapability.promise; + }); + messageHandler.on("GetRangeReader", (data, sink) => { + assert(this._networkStream, "GetRangeReader - no `IPDFStream` instance available."); + const rangeReader = this._networkStream.getRangeReader(data.begin, data.end); + if (!rangeReader) { + sink.close(); + return; + } + sink.onPull = () => { + rangeReader.read().then(function ({ + value, + done + }) { + if (done) { + sink.close(); + return; + } + assert(value instanceof ArrayBuffer, "GetRangeReader - expected an ArrayBuffer."); + sink.enqueue(new Uint8Array(value), 1, [value]); + }).catch(reason => { + sink.error(reason); + }); + }; + sink.onCancel = reason => { + rangeReader.cancel(reason); + sink.ready.catch(readyReason => { + if (this.destroyed) { + return; + } + throw readyReason; + }); + }; + }); + messageHandler.on("GetDoc", ({ + pdfInfo + }) => { + this._numPages = pdfInfo.numPages; + this._htmlForXfa = pdfInfo.htmlForXfa; + delete pdfInfo.htmlForXfa; + loadingTask._capability.resolve(new PDFDocumentProxy(pdfInfo, this)); + }); + messageHandler.on("DocException", function (ex) { + let reason; + switch (ex.name) { + case "PasswordException": + reason = new PasswordException(ex.message, ex.code); + break; + case "InvalidPDFException": + reason = new InvalidPDFException(ex.message); + break; + case "MissingPDFException": + reason = new MissingPDFException(ex.message); + break; + case "UnexpectedResponseException": + reason = new UnexpectedResponseException(ex.message, ex.status); + break; + case "UnknownErrorException": + reason = new UnknownErrorException(ex.message, ex.details); + break; + default: + unreachable("DocException - expected a valid Error."); + } + loadingTask._capability.reject(reason); + }); + messageHandler.on("PasswordRequest", exception => { + this.#passwordCapability = Promise.withResolvers(); + if (loadingTask.onPassword) { + const updatePassword = password => { + if (password instanceof Error) { + this.#passwordCapability.reject(password); + } else { + this.#passwordCapability.resolve({ + password + }); + } + }; + try { + loadingTask.onPassword(updatePassword, exception.code); + } catch (ex) { + this.#passwordCapability.reject(ex); + } + } else { + this.#passwordCapability.reject(new PasswordException(exception.message, exception.code)); + } + return this.#passwordCapability.promise; + }); + messageHandler.on("DataLoaded", data => { + loadingTask.onProgress?.({ + loaded: data.length, + total: data.length + }); + this.downloadInfoCapability.resolve(data); + }); + messageHandler.on("StartRenderPage", data => { + if (this.destroyed) { + return; + } + const page = this.#pageCache.get(data.pageIndex); + page._startRenderPage(data.transparency, data.cacheKey); + }); + messageHandler.on("commonobj", ([id, type, exportedData]) => { + if (this.destroyed) { + return null; + } + if (this.commonObjs.has(id)) { + return null; + } + switch (type) { + case "Font": + const { + disableFontFace, + fontExtraProperties, + pdfBug + } = this._params; + if ("error" in exportedData) { + const exportedError = exportedData.error; + warn(`Error during font loading: ${exportedError}`); + this.commonObjs.resolve(id, exportedError); + break; + } + const inspectFont = pdfBug && globalThis.FontInspector?.enabled ? (font, url) => globalThis.FontInspector.fontAdded(font, url) : null; + const font = new FontFaceObject(exportedData, { + disableFontFace, + inspectFont + }); + this.fontLoader.bind(font).catch(() => messageHandler.sendWithPromise("FontFallback", { + id + })).finally(() => { + if (!fontExtraProperties && font.data) { + font.data = null; + } + this.commonObjs.resolve(id, font); + }); + break; + case "CopyLocalImage": + const { + imageRef + } = exportedData; + assert(imageRef, "The imageRef must be defined."); + for (const pageProxy of this.#pageCache.values()) { + for (const [, data] of pageProxy.objs) { + if (data?.ref !== imageRef) { + continue; + } + if (!data.dataLen) { + return null; + } + this.commonObjs.resolve(id, structuredClone(data)); + return data.dataLen; + } + } + break; + case "FontPath": + case "Image": + case "Pattern": + this.commonObjs.resolve(id, exportedData); + break; + default: + throw new Error(`Got unknown common object type ${type}`); + } + return null; + }); + messageHandler.on("obj", ([id, pageIndex, type, imageData]) => { + if (this.destroyed) { + return; + } + const pageProxy = this.#pageCache.get(pageIndex); + if (pageProxy.objs.has(id)) { + return; + } + if (pageProxy._intentStates.size === 0) { + imageData?.bitmap?.close(); + return; + } + switch (type) { + case "Image": + pageProxy.objs.resolve(id, imageData); + if (imageData?.dataLen > MAX_IMAGE_SIZE_TO_CACHE) { + pageProxy._maybeCleanupAfterRender = true; + } + break; + case "Pattern": + pageProxy.objs.resolve(id, imageData); + break; + default: + throw new Error(`Got unknown object type ${type}`); + } + }); + messageHandler.on("DocProgress", data => { + if (this.destroyed) { + return; + } + loadingTask.onProgress?.({ + loaded: data.loaded, + total: data.total + }); + }); + messageHandler.on("FetchBuiltInCMap", data => { + if (this.destroyed) { + return Promise.reject(new Error("Worker was destroyed.")); + } + if (!this.cMapReaderFactory) { + return Promise.reject(new Error("CMapReaderFactory not initialized, see the `useWorkerFetch` parameter.")); + } + return this.cMapReaderFactory.fetch(data); + }); + messageHandler.on("FetchStandardFontData", data => { + if (this.destroyed) { + return Promise.reject(new Error("Worker was destroyed.")); + } + if (!this.standardFontDataFactory) { + return Promise.reject(new Error("StandardFontDataFactory not initialized, see the `useWorkerFetch` parameter.")); + } + return this.standardFontDataFactory.fetch(data); + }); + } + getData() { + return this.messageHandler.sendWithPromise("GetData", null); + } + saveDocument() { + if (this.annotationStorage.size <= 0) { + warn("saveDocument called while `annotationStorage` is empty, " + "please use the getData-method instead."); + } + const { + map, + transfer + } = this.annotationStorage.serializable; + return this.messageHandler.sendWithPromise("SaveDocument", { + isPureXfa: !!this._htmlForXfa, + numPages: this._numPages, + annotationStorage: map, + filename: this._fullReader?.filename ?? null + }, transfer).finally(() => { + this.annotationStorage.resetModified(); + }); + } + getPage(pageNumber) { + if (!Number.isInteger(pageNumber) || pageNumber <= 0 || pageNumber > this._numPages) { + return Promise.reject(new Error("Invalid page request.")); + } + const pageIndex = pageNumber - 1, + cachedPromise = this.#pagePromises.get(pageIndex); + if (cachedPromise) { + return cachedPromise; + } + const promise = this.messageHandler.sendWithPromise("GetPage", { + pageIndex + }).then(pageInfo => { + if (this.destroyed) { + throw new Error("Transport destroyed"); + } + if (pageInfo.refStr) { + this.#pageRefCache.set(pageInfo.refStr, pageNumber); + } + const page = new PDFPageProxy(pageIndex, pageInfo, this, this._params.pdfBug); + this.#pageCache.set(pageIndex, page); + return page; + }); + this.#pagePromises.set(pageIndex, promise); + return promise; + } + getPageIndex(ref) { + if (!isRefProxy(ref)) { + return Promise.reject(new Error("Invalid pageIndex request.")); + } + return this.messageHandler.sendWithPromise("GetPageIndex", { + num: ref.num, + gen: ref.gen + }); + } + getAnnotations(pageIndex, intent) { + return this.messageHandler.sendWithPromise("GetAnnotations", { + pageIndex, + intent + }); + } + getFieldObjects() { + return this.#cacheSimpleMethod("GetFieldObjects"); + } + hasJSActions() { + return this.#cacheSimpleMethod("HasJSActions"); + } + getCalculationOrderIds() { + return this.messageHandler.sendWithPromise("GetCalculationOrderIds", null); + } + getDestinations() { + return this.messageHandler.sendWithPromise("GetDestinations", null); + } + getDestination(id) { + if (typeof id !== "string") { + return Promise.reject(new Error("Invalid destination request.")); + } + return this.messageHandler.sendWithPromise("GetDestination", { + id + }); + } + getPageLabels() { + return this.messageHandler.sendWithPromise("GetPageLabels", null); + } + getPageLayout() { + return this.messageHandler.sendWithPromise("GetPageLayout", null); + } + getPageMode() { + return this.messageHandler.sendWithPromise("GetPageMode", null); + } + getViewerPreferences() { + return this.messageHandler.sendWithPromise("GetViewerPreferences", null); + } + getOpenAction() { + return this.messageHandler.sendWithPromise("GetOpenAction", null); + } + getAttachments() { + return this.messageHandler.sendWithPromise("GetAttachments", null); + } + getDocJSActions() { + return this.#cacheSimpleMethod("GetDocJSActions"); + } + getPageJSActions(pageIndex) { + return this.messageHandler.sendWithPromise("GetPageJSActions", { + pageIndex + }); + } + getStructTree(pageIndex) { + return this.messageHandler.sendWithPromise("GetStructTree", { + pageIndex + }); + } + getOutline() { + return this.messageHandler.sendWithPromise("GetOutline", null); + } + getOptionalContentConfig(renderingIntent) { + return this.#cacheSimpleMethod("GetOptionalContentConfig").then(data => new OptionalContentConfig(data, renderingIntent)); + } + getPermissions() { + return this.messageHandler.sendWithPromise("GetPermissions", null); + } + getMetadata() { + const name = "GetMetadata", + cachedPromise = this.#methodPromises.get(name); + if (cachedPromise) { + return cachedPromise; + } + const promise = this.messageHandler.sendWithPromise(name, null).then(results => ({ + info: results[0], + metadata: results[1] ? new Metadata(results[1]) : null, + contentDispositionFilename: this._fullReader?.filename ?? null, + contentLength: this._fullReader?.contentLength ?? null + })); + this.#methodPromises.set(name, promise); + return promise; + } + getMarkInfo() { + return this.messageHandler.sendWithPromise("GetMarkInfo", null); + } + async startCleanup(keepLoadedFonts = false) { + if (this.destroyed) { + return; + } + await this.messageHandler.sendWithPromise("Cleanup", null); + for (const page of this.#pageCache.values()) { + const cleanupSuccessful = page.cleanup(); + if (!cleanupSuccessful) { + throw new Error(`startCleanup: Page ${page.pageNumber} is currently rendering.`); + } + } + this.commonObjs.clear(); + if (!keepLoadedFonts) { + this.fontLoader.clear(); + } + this.#methodPromises.clear(); + this.filterFactory.destroy(true); + TextLayer.cleanup(); + } + cachedPageNumber(ref) { + if (!isRefProxy(ref)) { + return null; + } + const refStr = ref.gen === 0 ? `${ref.num}R` : `${ref.num}R${ref.gen}`; + return this.#pageRefCache.get(refStr) ?? null; + } +} +const INITIAL_DATA = Symbol("INITIAL_DATA"); +class PDFObjects { + #objs = Object.create(null); + #ensureObj(objId) { + return this.#objs[objId] ||= { + ...Promise.withResolvers(), + data: INITIAL_DATA + }; + } + get(objId, callback = null) { + if (callback) { + const obj = this.#ensureObj(objId); + obj.promise.then(() => callback(obj.data)); + return null; + } + const obj = this.#objs[objId]; + if (!obj || obj.data === INITIAL_DATA) { + throw new Error(`Requesting object that isn't resolved yet ${objId}.`); + } + return obj.data; + } + has(objId) { + const obj = this.#objs[objId]; + return !!obj && obj.data !== INITIAL_DATA; + } + resolve(objId, data = null) { + const obj = this.#ensureObj(objId); + obj.data = data; + obj.resolve(); + } + clear() { + for (const objId in this.#objs) { + const { + data + } = this.#objs[objId]; + data?.bitmap?.close(); + } + this.#objs = Object.create(null); + } + *[Symbol.iterator]() { + for (const objId in this.#objs) { + const { + data + } = this.#objs[objId]; + if (data === INITIAL_DATA) { + continue; + } + yield [objId, data]; + } + } +} +class RenderTask { + #internalRenderTask = null; + constructor(internalRenderTask) { + this.#internalRenderTask = internalRenderTask; + this.onContinue = null; + } + get promise() { + return this.#internalRenderTask.capability.promise; + } + cancel(extraDelay = 0) { + this.#internalRenderTask.cancel(null, extraDelay); + } + get separateAnnots() { + const { + separateAnnots + } = this.#internalRenderTask.operatorList; + if (!separateAnnots) { + return false; + } + const { + annotationCanvasMap + } = this.#internalRenderTask; + return separateAnnots.form || separateAnnots.canvas && annotationCanvasMap?.size > 0; + } +} +class InternalRenderTask { + #rAF = null; + static #canvasInUse = new WeakSet(); + constructor({ + callback, + params, + objs, + commonObjs, + annotationCanvasMap, + operatorList, + pageIndex, + canvasFactory, + filterFactory, + useRequestAnimationFrame = false, + pdfBug = false, + pageColors = null + }) { + this.callback = callback; + this.params = params; + this.objs = objs; + this.commonObjs = commonObjs; + this.annotationCanvasMap = annotationCanvasMap; + this.operatorListIdx = null; + this.operatorList = operatorList; + this._pageIndex = pageIndex; + this.canvasFactory = canvasFactory; + this.filterFactory = filterFactory; + this._pdfBug = pdfBug; + this.pageColors = pageColors; + this.running = false; + this.graphicsReadyCallback = null; + this.graphicsReady = false; + this._useRequestAnimationFrame = useRequestAnimationFrame === true && typeof window !== "undefined"; + this.cancelled = false; + this.capability = Promise.withResolvers(); + this.task = new RenderTask(this); + this._cancelBound = this.cancel.bind(this); + this._continueBound = this._continue.bind(this); + this._scheduleNextBound = this._scheduleNext.bind(this); + this._nextBound = this._next.bind(this); + this._canvas = params.canvasContext.canvas; + } + get completed() { + return this.capability.promise.catch(function () {}); + } + initializeGraphics({ + transparency = false, + optionalContentConfig + }) { + if (this.cancelled) { + return; + } + if (this._canvas) { + if (InternalRenderTask.#canvasInUse.has(this._canvas)) { + throw new Error("Cannot use the same canvas during multiple render() operations. " + "Use different canvas or ensure previous operations were " + "cancelled or completed."); + } + InternalRenderTask.#canvasInUse.add(this._canvas); + } + if (this._pdfBug && globalThis.StepperManager?.enabled) { + this.stepper = globalThis.StepperManager.create(this._pageIndex); + this.stepper.init(this.operatorList); + this.stepper.nextBreakPoint = this.stepper.getNextBreakPoint(); + } + const { + canvasContext, + viewport, + transform, + background + } = this.params; + this.gfx = new CanvasGraphics(canvasContext, this.commonObjs, this.objs, this.canvasFactory, this.filterFactory, { + optionalContentConfig + }, this.annotationCanvasMap, this.pageColors); + this.gfx.beginDrawing({ + transform, + viewport, + transparency, + background + }); + this.operatorListIdx = 0; + this.graphicsReady = true; + this.graphicsReadyCallback?.(); + } + cancel(error = null, extraDelay = 0) { + this.running = false; + this.cancelled = true; + this.gfx?.endDrawing(); + if (this.#rAF) { + window.cancelAnimationFrame(this.#rAF); + this.#rAF = null; + } + InternalRenderTask.#canvasInUse.delete(this._canvas); + this.callback(error || new RenderingCancelledException(`Rendering cancelled, page ${this._pageIndex + 1}`, extraDelay)); + } + operatorListChanged() { + if (!this.graphicsReady) { + this.graphicsReadyCallback ||= this._continueBound; + return; + } + this.stepper?.updateOperatorList(this.operatorList); + if (this.running) { + return; + } + this._continue(); + } + _continue() { + this.running = true; + if (this.cancelled) { + return; + } + if (this.task.onContinue) { + this.task.onContinue(this._scheduleNextBound); + } else { + this._scheduleNext(); + } + } + _scheduleNext() { + if (this._useRequestAnimationFrame) { + this.#rAF = window.requestAnimationFrame(() => { + this.#rAF = null; + this._nextBound().catch(this._cancelBound); + }); + } else { + Promise.resolve().then(this._nextBound).catch(this._cancelBound); + } + } + async _next() { + if (this.cancelled) { + return; + } + this.operatorListIdx = this.gfx.executeOperatorList(this.operatorList, this.operatorListIdx, this._continueBound, this.stepper); + if (this.operatorListIdx === this.operatorList.argsArray.length) { + this.running = false; + if (this.operatorList.lastChunk) { + this.gfx.endDrawing(); + InternalRenderTask.#canvasInUse.delete(this._canvas); + this.callback(); + } + } + } +} +const version = "4.4.168"; +const build = "19fbc8998"; + +;// CONCATENATED MODULE: ./src/shared/scripting_utils.js +function makeColorComp(n) { + return Math.floor(Math.max(0, Math.min(1, n)) * 255).toString(16).padStart(2, "0"); +} +function scaleAndClamp(x) { + return Math.max(0, Math.min(255, 255 * x)); +} +class ColorConverters { + static CMYK_G([c, y, m, k]) { + return ["G", 1 - Math.min(1, 0.3 * c + 0.59 * m + 0.11 * y + k)]; + } + static G_CMYK([g]) { + return ["CMYK", 0, 0, 0, 1 - g]; + } + static G_RGB([g]) { + return ["RGB", g, g, g]; + } + static G_rgb([g]) { + g = scaleAndClamp(g); + return [g, g, g]; + } + static G_HTML([g]) { + const G = makeColorComp(g); + return `#${G}${G}${G}`; + } + static RGB_G([r, g, b]) { + return ["G", 0.3 * r + 0.59 * g + 0.11 * b]; + } + static RGB_rgb(color) { + return color.map(scaleAndClamp); + } + static RGB_HTML(color) { + return `#${color.map(makeColorComp).join("")}`; + } + static T_HTML() { + return "#00000000"; + } + static T_rgb() { + return [null]; + } + static CMYK_RGB([c, y, m, k]) { + return ["RGB", 1 - Math.min(1, c + k), 1 - Math.min(1, m + k), 1 - Math.min(1, y + k)]; + } + static CMYK_rgb([c, y, m, k]) { + return [scaleAndClamp(1 - Math.min(1, c + k)), scaleAndClamp(1 - Math.min(1, m + k)), scaleAndClamp(1 - Math.min(1, y + k))]; + } + static CMYK_HTML(components) { + const rgb = this.CMYK_RGB(components).slice(1); + return this.RGB_HTML(rgb); + } + static RGB_CMYK([r, g, b]) { + const c = 1 - r; + const m = 1 - g; + const y = 1 - b; + const k = Math.min(c, m, y); + return ["CMYK", c, m, y, k]; + } +} + +;// CONCATENATED MODULE: ./src/display/xfa_layer.js + +class XfaLayer { + static setupStorage(html, id, element, storage, intent) { + const storedData = storage.getValue(id, { + value: null + }); + switch (element.name) { + case "textarea": + if (storedData.value !== null) { + html.textContent = storedData.value; + } + if (intent === "print") { + break; + } + html.addEventListener("input", event => { + storage.setValue(id, { + value: event.target.value + }); + }); + break; + case "input": + if (element.attributes.type === "radio" || element.attributes.type === "checkbox") { + if (storedData.value === element.attributes.xfaOn) { + html.setAttribute("checked", true); + } else if (storedData.value === element.attributes.xfaOff) { + html.removeAttribute("checked"); + } + if (intent === "print") { + break; + } + html.addEventListener("change", event => { + storage.setValue(id, { + value: event.target.checked ? event.target.getAttribute("xfaOn") : event.target.getAttribute("xfaOff") + }); + }); + } else { + if (storedData.value !== null) { + html.setAttribute("value", storedData.value); + } + if (intent === "print") { + break; + } + html.addEventListener("input", event => { + storage.setValue(id, { + value: event.target.value + }); + }); + } + break; + case "select": + if (storedData.value !== null) { + html.setAttribute("value", storedData.value); + for (const option of element.children) { + if (option.attributes.value === storedData.value) { + option.attributes.selected = true; + } else if (option.attributes.hasOwnProperty("selected")) { + delete option.attributes.selected; + } + } + } + html.addEventListener("input", event => { + const options = event.target.options; + const value = options.selectedIndex === -1 ? "" : options[options.selectedIndex].value; + storage.setValue(id, { + value + }); + }); + break; + } + } + static setAttributes({ + html, + element, + storage = null, + intent, + linkService + }) { + const { + attributes + } = element; + const isHTMLAnchorElement = html instanceof HTMLAnchorElement; + if (attributes.type === "radio") { + attributes.name = `${attributes.name}-${intent}`; + } + for (const [key, value] of Object.entries(attributes)) { + if (value === null || value === undefined) { + continue; + } + switch (key) { + case "class": + if (value.length) { + html.setAttribute(key, value.join(" ")); + } + break; + case "dataId": + break; + case "id": + html.setAttribute("data-element-id", value); + break; + case "style": + Object.assign(html.style, value); + break; + case "textContent": + html.textContent = value; + break; + default: + if (!isHTMLAnchorElement || key !== "href" && key !== "newWindow") { + html.setAttribute(key, value); + } + } + } + if (isHTMLAnchorElement) { + linkService.addLinkAttributes(html, attributes.href, attributes.newWindow); + } + if (storage && attributes.dataId) { + this.setupStorage(html, attributes.dataId, element, storage); + } + } + static render(parameters) { + const storage = parameters.annotationStorage; + const linkService = parameters.linkService; + const root = parameters.xfaHtml; + const intent = parameters.intent || "display"; + const rootHtml = document.createElement(root.name); + if (root.attributes) { + this.setAttributes({ + html: rootHtml, + element: root, + intent, + linkService + }); + } + const isNotForRichText = intent !== "richText"; + const rootDiv = parameters.div; + rootDiv.append(rootHtml); + if (parameters.viewport) { + const transform = `matrix(${parameters.viewport.transform.join(",")})`; + rootDiv.style.transform = transform; + } + if (isNotForRichText) { + rootDiv.setAttribute("class", "xfaLayer xfaFont"); + } + const textDivs = []; + if (root.children.length === 0) { + if (root.value) { + const node = document.createTextNode(root.value); + rootHtml.append(node); + if (isNotForRichText && XfaText.shouldBuildText(root.name)) { + textDivs.push(node); + } + } + return { + textDivs + }; + } + const stack = [[root, -1, rootHtml]]; + while (stack.length > 0) { + const [parent, i, html] = stack.at(-1); + if (i + 1 === parent.children.length) { + stack.pop(); + continue; + } + const child = parent.children[++stack.at(-1)[1]]; + if (child === null) { + continue; + } + const { + name + } = child; + if (name === "#text") { + const node = document.createTextNode(child.value); + textDivs.push(node); + html.append(node); + continue; + } + const childHtml = child?.attributes?.xmlns ? document.createElementNS(child.attributes.xmlns, name) : document.createElement(name); + html.append(childHtml); + if (child.attributes) { + this.setAttributes({ + html: childHtml, + element: child, + storage, + intent, + linkService + }); + } + if (child.children?.length > 0) { + stack.push([child, -1, childHtml]); + } else if (child.value) { + const node = document.createTextNode(child.value); + if (isNotForRichText && XfaText.shouldBuildText(name)) { + textDivs.push(node); + } + childHtml.append(node); + } + } + for (const el of rootDiv.querySelectorAll(".xfaNonInteractive input, .xfaNonInteractive textarea")) { + el.setAttribute("readOnly", true); + } + return { + textDivs + }; + } + static update(parameters) { + const transform = `matrix(${parameters.viewport.transform.join(",")})`; + parameters.div.style.transform = transform; + parameters.div.hidden = false; + } +} + +;// CONCATENATED MODULE: ./src/display/annotation_layer.js + + + + + +const DEFAULT_TAB_INDEX = 1000; +const annotation_layer_DEFAULT_FONT_SIZE = 9; +const GetElementsByNameSet = new WeakSet(); +function getRectDims(rect) { + return { + width: rect[2] - rect[0], + height: rect[3] - rect[1] + }; +} +class AnnotationElementFactory { + static create(parameters) { + const subtype = parameters.data.annotationType; + switch (subtype) { + case AnnotationType.LINK: + return new LinkAnnotationElement(parameters); + case AnnotationType.TEXT: + return new TextAnnotationElement(parameters); + case AnnotationType.WIDGET: + const fieldType = parameters.data.fieldType; + switch (fieldType) { + case "Tx": + return new TextWidgetAnnotationElement(parameters); + case "Btn": + if (parameters.data.radioButton) { + return new RadioButtonWidgetAnnotationElement(parameters); + } else if (parameters.data.checkBox) { + return new CheckboxWidgetAnnotationElement(parameters); + } + return new PushButtonWidgetAnnotationElement(parameters); + case "Ch": + return new ChoiceWidgetAnnotationElement(parameters); + case "Sig": + return new SignatureWidgetAnnotationElement(parameters); + } + return new WidgetAnnotationElement(parameters); + case AnnotationType.POPUP: + return new PopupAnnotationElement(parameters); + case AnnotationType.FREETEXT: + return new FreeTextAnnotationElement(parameters); + case AnnotationType.LINE: + return new LineAnnotationElement(parameters); + case AnnotationType.SQUARE: + return new SquareAnnotationElement(parameters); + case AnnotationType.CIRCLE: + return new CircleAnnotationElement(parameters); + case AnnotationType.POLYLINE: + return new PolylineAnnotationElement(parameters); + case AnnotationType.CARET: + return new CaretAnnotationElement(parameters); + case AnnotationType.INK: + return new InkAnnotationElement(parameters); + case AnnotationType.POLYGON: + return new PolygonAnnotationElement(parameters); + case AnnotationType.HIGHLIGHT: + return new HighlightAnnotationElement(parameters); + case AnnotationType.UNDERLINE: + return new UnderlineAnnotationElement(parameters); + case AnnotationType.SQUIGGLY: + return new SquigglyAnnotationElement(parameters); + case AnnotationType.STRIKEOUT: + return new StrikeOutAnnotationElement(parameters); + case AnnotationType.STAMP: + return new StampAnnotationElement(parameters); + case AnnotationType.FILEATTACHMENT: + return new FileAttachmentAnnotationElement(parameters); + default: + return new AnnotationElement(parameters); + } + } +} +class AnnotationElement { + #updates = null; + #hasBorder = false; + #popupElement = null; + constructor(parameters, { + isRenderable = false, + ignoreBorder = false, + createQuadrilaterals = false + } = {}) { + this.isRenderable = isRenderable; + this.data = parameters.data; + this.layer = parameters.layer; + this.linkService = parameters.linkService; + this.downloadManager = parameters.downloadManager; + this.imageResourcesPath = parameters.imageResourcesPath; + this.renderForms = parameters.renderForms; + this.svgFactory = parameters.svgFactory; + this.annotationStorage = parameters.annotationStorage; + this.enableScripting = parameters.enableScripting; + this.hasJSActions = parameters.hasJSActions; + this._fieldObjects = parameters.fieldObjects; + this.parent = parameters.parent; + if (isRenderable) { + this.container = this._createContainer(ignoreBorder); + } + if (createQuadrilaterals) { + this._createQuadrilaterals(); + } + } + static _hasPopupData({ + titleObj, + contentsObj, + richText + }) { + return !!(titleObj?.str || contentsObj?.str || richText?.str); + } + get hasPopupData() { + return AnnotationElement._hasPopupData(this.data); + } + updateEdited(params) { + if (!this.container) { + return; + } + this.#updates ||= { + rect: this.data.rect.slice(0) + }; + const { + rect + } = params; + if (rect) { + this.#setRectEdited(rect); + } + this.#popupElement?.popup.updateEdited(params); + } + resetEdited() { + if (!this.#updates) { + return; + } + this.#setRectEdited(this.#updates.rect); + this.#popupElement?.popup.resetEdited(); + this.#updates = null; + } + #setRectEdited(rect) { + const { + container: { + style + }, + data: { + rect: currentRect, + rotation + }, + parent: { + viewport: { + rawDims: { + pageWidth, + pageHeight, + pageX, + pageY + } + } + } + } = this; + currentRect?.splice(0, 4, ...rect); + const { + width, + height + } = getRectDims(rect); + style.left = `${100 * (rect[0] - pageX) / pageWidth}%`; + style.top = `${100 * (pageHeight - rect[3] + pageY) / pageHeight}%`; + if (rotation === 0) { + style.width = `${100 * width / pageWidth}%`; + style.height = `${100 * height / pageHeight}%`; + } else { + this.setRotation(rotation); + } + } + _createContainer(ignoreBorder) { + const { + data, + parent: { + page, + viewport + } + } = this; + const container = document.createElement("section"); + container.setAttribute("data-annotation-id", data.id); + if (!(this instanceof WidgetAnnotationElement)) { + container.tabIndex = DEFAULT_TAB_INDEX; + } + const { + style + } = container; + style.zIndex = this.parent.zIndex++; + if (data.popupRef) { + container.setAttribute("aria-haspopup", "dialog"); + } + if (data.alternativeText) { + container.title = data.alternativeText; + } + if (data.noRotate) { + container.classList.add("norotate"); + } + if (!data.rect || this instanceof PopupAnnotationElement) { + const { + rotation + } = data; + if (!data.hasOwnCanvas && rotation !== 0) { + this.setRotation(rotation, container); + } + return container; + } + const { + width, + height + } = getRectDims(data.rect); + if (!ignoreBorder && data.borderStyle.width > 0) { + style.borderWidth = `${data.borderStyle.width}px`; + const horizontalRadius = data.borderStyle.horizontalCornerRadius; + const verticalRadius = data.borderStyle.verticalCornerRadius; + if (horizontalRadius > 0 || verticalRadius > 0) { + const radius = `calc(${horizontalRadius}px * var(--scale-factor)) / calc(${verticalRadius}px * var(--scale-factor))`; + style.borderRadius = radius; + } else if (this instanceof RadioButtonWidgetAnnotationElement) { + const radius = `calc(${width}px * var(--scale-factor)) / calc(${height}px * var(--scale-factor))`; + style.borderRadius = radius; + } + switch (data.borderStyle.style) { + case AnnotationBorderStyleType.SOLID: + style.borderStyle = "solid"; + break; + case AnnotationBorderStyleType.DASHED: + style.borderStyle = "dashed"; + break; + case AnnotationBorderStyleType.BEVELED: + warn("Unimplemented border style: beveled"); + break; + case AnnotationBorderStyleType.INSET: + warn("Unimplemented border style: inset"); + break; + case AnnotationBorderStyleType.UNDERLINE: + style.borderBottomStyle = "solid"; + break; + default: + break; + } + const borderColor = data.borderColor || null; + if (borderColor) { + this.#hasBorder = true; + style.borderColor = Util.makeHexColor(borderColor[0] | 0, borderColor[1] | 0, borderColor[2] | 0); + } else { + style.borderWidth = 0; + } + } + const rect = Util.normalizeRect([data.rect[0], page.view[3] - data.rect[1] + page.view[1], data.rect[2], page.view[3] - data.rect[3] + page.view[1]]); + const { + pageWidth, + pageHeight, + pageX, + pageY + } = viewport.rawDims; + style.left = `${100 * (rect[0] - pageX) / pageWidth}%`; + style.top = `${100 * (rect[1] - pageY) / pageHeight}%`; + const { + rotation + } = data; + if (data.hasOwnCanvas || rotation === 0) { + style.width = `${100 * width / pageWidth}%`; + style.height = `${100 * height / pageHeight}%`; + } else { + this.setRotation(rotation, container); + } + return container; + } + setRotation(angle, container = this.container) { + if (!this.data.rect) { + return; + } + const { + pageWidth, + pageHeight + } = this.parent.viewport.rawDims; + const { + width, + height + } = getRectDims(this.data.rect); + let elementWidth, elementHeight; + if (angle % 180 === 0) { + elementWidth = 100 * width / pageWidth; + elementHeight = 100 * height / pageHeight; + } else { + elementWidth = 100 * height / pageWidth; + elementHeight = 100 * width / pageHeight; + } + container.style.width = `${elementWidth}%`; + container.style.height = `${elementHeight}%`; + container.setAttribute("data-main-rotation", (360 - angle) % 360); + } + get _commonActions() { + const setColor = (jsName, styleName, event) => { + const color = event.detail[jsName]; + const colorType = color[0]; + const colorArray = color.slice(1); + event.target.style[styleName] = ColorConverters[`${colorType}_HTML`](colorArray); + this.annotationStorage.setValue(this.data.id, { + [styleName]: ColorConverters[`${colorType}_rgb`](colorArray) + }); + }; + return shadow(this, "_commonActions", { + display: event => { + const { + display + } = event.detail; + const hidden = display % 2 === 1; + this.container.style.visibility = hidden ? "hidden" : "visible"; + this.annotationStorage.setValue(this.data.id, { + noView: hidden, + noPrint: display === 1 || display === 2 + }); + }, + print: event => { + this.annotationStorage.setValue(this.data.id, { + noPrint: !event.detail.print + }); + }, + hidden: event => { + const { + hidden + } = event.detail; + this.container.style.visibility = hidden ? "hidden" : "visible"; + this.annotationStorage.setValue(this.data.id, { + noPrint: hidden, + noView: hidden + }); + }, + focus: event => { + setTimeout(() => event.target.focus({ + preventScroll: false + }), 0); + }, + userName: event => { + event.target.title = event.detail.userName; + }, + readonly: event => { + event.target.disabled = event.detail.readonly; + }, + required: event => { + this._setRequired(event.target, event.detail.required); + }, + bgColor: event => { + setColor("bgColor", "backgroundColor", event); + }, + fillColor: event => { + setColor("fillColor", "backgroundColor", event); + }, + fgColor: event => { + setColor("fgColor", "color", event); + }, + textColor: event => { + setColor("textColor", "color", event); + }, + borderColor: event => { + setColor("borderColor", "borderColor", event); + }, + strokeColor: event => { + setColor("strokeColor", "borderColor", event); + }, + rotation: event => { + const angle = event.detail.rotation; + this.setRotation(angle); + this.annotationStorage.setValue(this.data.id, { + rotation: angle + }); + } + }); + } + _dispatchEventFromSandbox(actions, jsEvent) { + const commonActions = this._commonActions; + for (const name of Object.keys(jsEvent.detail)) { + const action = actions[name] || commonActions[name]; + action?.(jsEvent); + } + } + _setDefaultPropertiesFromJS(element) { + if (!this.enableScripting) { + return; + } + const storedData = this.annotationStorage.getRawValue(this.data.id); + if (!storedData) { + return; + } + const commonActions = this._commonActions; + for (const [actionName, detail] of Object.entries(storedData)) { + const action = commonActions[actionName]; + if (action) { + const eventProxy = { + detail: { + [actionName]: detail + }, + target: element + }; + action(eventProxy); + delete storedData[actionName]; + } + } + } + _createQuadrilaterals() { + if (!this.container) { + return; + } + const { + quadPoints + } = this.data; + if (!quadPoints) { + return; + } + const [rectBlX, rectBlY, rectTrX, rectTrY] = this.data.rect.map(x => Math.fround(x)); + if (quadPoints.length === 8) { + const [trX, trY, blX, blY] = quadPoints.subarray(2, 6); + if (rectTrX === trX && rectTrY === trY && rectBlX === blX && rectBlY === blY) { + return; + } + } + const { + style + } = this.container; + let svgBuffer; + if (this.#hasBorder) { + const { + borderColor, + borderWidth + } = style; + style.borderWidth = 0; + svgBuffer = ["url('data:image/svg+xml;utf8,", ``, ``]; + this.container.classList.add("hasBorder"); + } + const width = rectTrX - rectBlX; + const height = rectTrY - rectBlY; + const { + svgFactory + } = this; + const svg = svgFactory.createElement("svg"); + svg.classList.add("quadrilateralsContainer"); + svg.setAttribute("width", 0); + svg.setAttribute("height", 0); + const defs = svgFactory.createElement("defs"); + svg.append(defs); + const clipPath = svgFactory.createElement("clipPath"); + const id = `clippath_${this.data.id}`; + clipPath.setAttribute("id", id); + clipPath.setAttribute("clipPathUnits", "objectBoundingBox"); + defs.append(clipPath); + for (let i = 2, ii = quadPoints.length; i < ii; i += 8) { + const trX = quadPoints[i]; + const trY = quadPoints[i + 1]; + const blX = quadPoints[i + 2]; + const blY = quadPoints[i + 3]; + const rect = svgFactory.createElement("rect"); + const x = (blX - rectBlX) / width; + const y = (rectTrY - trY) / height; + const rectWidth = (trX - blX) / width; + const rectHeight = (trY - blY) / height; + rect.setAttribute("x", x); + rect.setAttribute("y", y); + rect.setAttribute("width", rectWidth); + rect.setAttribute("height", rectHeight); + clipPath.append(rect); + svgBuffer?.push(``); + } + if (this.#hasBorder) { + svgBuffer.push(`')`); + style.backgroundImage = svgBuffer.join(""); + } + this.container.append(svg); + this.container.style.clipPath = `url(#${id})`; + } + _createPopup() { + const { + container, + data + } = this; + container.setAttribute("aria-haspopup", "dialog"); + const popup = this.#popupElement = new PopupAnnotationElement({ + data: { + color: data.color, + titleObj: data.titleObj, + modificationDate: data.modificationDate, + contentsObj: data.contentsObj, + richText: data.richText, + parentRect: data.rect, + borderStyle: 0, + id: `popup_${data.id}`, + rotation: data.rotation + }, + parent: this.parent, + elements: [this] + }); + this.parent.div.append(popup.render()); + } + render() { + unreachable("Abstract method `AnnotationElement.render` called"); + } + _getElementsByName(name, skipId = null) { + const fields = []; + if (this._fieldObjects) { + const fieldObj = this._fieldObjects[name]; + if (fieldObj) { + for (const { + page, + id, + exportValues + } of fieldObj) { + if (page === -1) { + continue; + } + if (id === skipId) { + continue; + } + const exportValue = typeof exportValues === "string" ? exportValues : null; + const domElement = document.querySelector(`[data-element-id="${id}"]`); + if (domElement && !GetElementsByNameSet.has(domElement)) { + warn(`_getElementsByName - element not allowed: ${id}`); + continue; + } + fields.push({ + id, + exportValue, + domElement + }); + } + } + return fields; + } + for (const domElement of document.getElementsByName(name)) { + const { + exportValue + } = domElement; + const id = domElement.getAttribute("data-element-id"); + if (id === skipId) { + continue; + } + if (!GetElementsByNameSet.has(domElement)) { + continue; + } + fields.push({ + id, + exportValue, + domElement + }); + } + return fields; + } + show() { + if (this.container) { + this.container.hidden = false; + } + this.popup?.maybeShow(); + } + hide() { + if (this.container) { + this.container.hidden = true; + } + this.popup?.forceHide(); + } + getElementsToTriggerPopup() { + return this.container; + } + addHighlightArea() { + const triggers = this.getElementsToTriggerPopup(); + if (Array.isArray(triggers)) { + for (const element of triggers) { + element.classList.add("highlightArea"); + } + } else { + triggers.classList.add("highlightArea"); + } + } + get _isEditable() { + return false; + } + _editOnDoubleClick() { + if (!this._isEditable) { + return; + } + const { + annotationEditorType: mode, + data: { + id: editId + } + } = this; + this.container.addEventListener("dblclick", () => { + this.linkService.eventBus?.dispatch("switchannotationeditormode", { + source: this, + mode, + editId + }); + }); + } +} +class LinkAnnotationElement extends AnnotationElement { + constructor(parameters, options = null) { + super(parameters, { + isRenderable: true, + ignoreBorder: !!options?.ignoreBorder, + createQuadrilaterals: true + }); + this.isTooltipOnly = parameters.data.isTooltipOnly; + } + render() { + const { + data, + linkService + } = this; + const link = document.createElement("a"); + link.setAttribute("data-element-id", data.id); + let isBound = false; + if (data.url) { + linkService.addLinkAttributes(link, data.url, data.newWindow); + isBound = true; + } else if (data.action) { + this._bindNamedAction(link, data.action); + isBound = true; + } else if (data.attachment) { + this.#bindAttachment(link, data.attachment, data.attachmentDest); + isBound = true; + } else if (data.setOCGState) { + this.#bindSetOCGState(link, data.setOCGState); + isBound = true; + } else if (data.dest) { + this._bindLink(link, data.dest); + isBound = true; + } else { + if (data.actions && (data.actions.Action || data.actions["Mouse Up"] || data.actions["Mouse Down"]) && this.enableScripting && this.hasJSActions) { + this._bindJSAction(link, data); + isBound = true; + } + if (data.resetForm) { + this._bindResetFormAction(link, data.resetForm); + isBound = true; + } else if (this.isTooltipOnly && !isBound) { + this._bindLink(link, ""); + isBound = true; + } + } + this.container.classList.add("linkAnnotation"); + if (isBound) { + this.container.append(link); + } + return this.container; + } + #setInternalLink() { + this.container.setAttribute("data-internal-link", ""); + } + _bindLink(link, destination) { + link.href = this.linkService.getDestinationHash(destination); + link.onclick = () => { + if (destination) { + this.linkService.goToDestination(destination); + } + return false; + }; + if (destination || destination === "") { + this.#setInternalLink(); + } + } + _bindNamedAction(link, action) { + link.href = this.linkService.getAnchorUrl(""); + link.onclick = () => { + this.linkService.executeNamedAction(action); + return false; + }; + this.#setInternalLink(); + } + #bindAttachment(link, attachment, dest = null) { + link.href = this.linkService.getAnchorUrl(""); + if (attachment.description) { + link.title = attachment.description; + } + link.onclick = () => { + this.downloadManager?.openOrDownloadData(attachment.content, attachment.filename, dest); + return false; + }; + this.#setInternalLink(); + } + #bindSetOCGState(link, action) { + link.href = this.linkService.getAnchorUrl(""); + link.onclick = () => { + this.linkService.executeSetOCGState(action); + return false; + }; + this.#setInternalLink(); + } + _bindJSAction(link, data) { + link.href = this.linkService.getAnchorUrl(""); + const map = new Map([["Action", "onclick"], ["Mouse Up", "onmouseup"], ["Mouse Down", "onmousedown"]]); + for (const name of Object.keys(data.actions)) { + const jsName = map.get(name); + if (!jsName) { + continue; + } + link[jsName] = () => { + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id: data.id, + name + } + }); + return false; + }; + } + if (!link.onclick) { + link.onclick = () => false; + } + this.#setInternalLink(); + } + _bindResetFormAction(link, resetForm) { + const otherClickAction = link.onclick; + if (!otherClickAction) { + link.href = this.linkService.getAnchorUrl(""); + } + this.#setInternalLink(); + if (!this._fieldObjects) { + warn(`_bindResetFormAction - "resetForm" action not supported, ` + "ensure that the `fieldObjects` parameter is provided."); + if (!otherClickAction) { + link.onclick = () => false; + } + return; + } + link.onclick = () => { + otherClickAction?.(); + const { + fields: resetFormFields, + refs: resetFormRefs, + include + } = resetForm; + const allFields = []; + if (resetFormFields.length !== 0 || resetFormRefs.length !== 0) { + const fieldIds = new Set(resetFormRefs); + for (const fieldName of resetFormFields) { + const fields = this._fieldObjects[fieldName] || []; + for (const { + id + } of fields) { + fieldIds.add(id); + } + } + for (const fields of Object.values(this._fieldObjects)) { + for (const field of fields) { + if (fieldIds.has(field.id) === include) { + allFields.push(field); + } + } + } + } else { + for (const fields of Object.values(this._fieldObjects)) { + allFields.push(...fields); + } + } + const storage = this.annotationStorage; + const allIds = []; + for (const field of allFields) { + const { + id + } = field; + allIds.push(id); + switch (field.type) { + case "text": + { + const value = field.defaultValue || ""; + storage.setValue(id, { + value + }); + break; + } + case "checkbox": + case "radiobutton": + { + const value = field.defaultValue === field.exportValues; + storage.setValue(id, { + value + }); + break; + } + case "combobox": + case "listbox": + { + const value = field.defaultValue || ""; + storage.setValue(id, { + value + }); + break; + } + default: + continue; + } + const domElement = document.querySelector(`[data-element-id="${id}"]`); + if (!domElement) { + continue; + } else if (!GetElementsByNameSet.has(domElement)) { + warn(`_bindResetFormAction - element not allowed: ${id}`); + continue; + } + domElement.dispatchEvent(new Event("resetform")); + } + if (this.enableScripting) { + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id: "app", + ids: allIds, + name: "ResetForm" + } + }); + } + return false; + }; + } +} +class TextAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true + }); + } + render() { + this.container.classList.add("textAnnotation"); + const image = document.createElement("img"); + image.src = this.imageResourcesPath + "annotation-" + this.data.name.toLowerCase() + ".svg"; + image.setAttribute("data-l10n-id", "pdfjs-text-annotation-type"); + image.setAttribute("data-l10n-args", JSON.stringify({ + type: this.data.name + })); + if (!this.data.popupRef && this.hasPopupData) { + this._createPopup(); + } + this.container.append(image); + return this.container; + } +} +class WidgetAnnotationElement extends AnnotationElement { + render() { + return this.container; + } + showElementAndHideCanvas(element) { + if (this.data.hasOwnCanvas) { + if (element.previousSibling?.nodeName === "CANVAS") { + element.previousSibling.hidden = true; + } + element.hidden = false; + } + } + _getKeyModifier(event) { + return util_FeatureTest.platform.isMac ? event.metaKey : event.ctrlKey; + } + _setEventListener(element, elementData, baseName, eventName, valueGetter) { + if (baseName.includes("mouse")) { + element.addEventListener(baseName, event => { + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id: this.data.id, + name: eventName, + value: valueGetter(event), + shift: event.shiftKey, + modifier: this._getKeyModifier(event) + } + }); + }); + } else { + element.addEventListener(baseName, event => { + if (baseName === "blur") { + if (!elementData.focused || !event.relatedTarget) { + return; + } + elementData.focused = false; + } else if (baseName === "focus") { + if (elementData.focused) { + return; + } + elementData.focused = true; + } + if (!valueGetter) { + return; + } + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id: this.data.id, + name: eventName, + value: valueGetter(event) + } + }); + }); + } + } + _setEventListeners(element, elementData, names, getter) { + for (const [baseName, eventName] of names) { + if (eventName === "Action" || this.data.actions?.[eventName]) { + if (eventName === "Focus" || eventName === "Blur") { + elementData ||= { + focused: false + }; + } + this._setEventListener(element, elementData, baseName, eventName, getter); + if (eventName === "Focus" && !this.data.actions?.Blur) { + this._setEventListener(element, elementData, "blur", "Blur", null); + } else if (eventName === "Blur" && !this.data.actions?.Focus) { + this._setEventListener(element, elementData, "focus", "Focus", null); + } + } + } + } + _setBackgroundColor(element) { + const color = this.data.backgroundColor || null; + element.style.backgroundColor = color === null ? "transparent" : Util.makeHexColor(color[0], color[1], color[2]); + } + _setTextStyle(element) { + const TEXT_ALIGNMENT = ["left", "center", "right"]; + const { + fontColor + } = this.data.defaultAppearanceData; + const fontSize = this.data.defaultAppearanceData.fontSize || annotation_layer_DEFAULT_FONT_SIZE; + const style = element.style; + let computedFontSize; + const BORDER_SIZE = 2; + const roundToOneDecimal = x => Math.round(10 * x) / 10; + if (this.data.multiLine) { + const height = Math.abs(this.data.rect[3] - this.data.rect[1] - BORDER_SIZE); + const numberOfLines = Math.round(height / (LINE_FACTOR * fontSize)) || 1; + const lineHeight = height / numberOfLines; + computedFontSize = Math.min(fontSize, roundToOneDecimal(lineHeight / LINE_FACTOR)); + } else { + const height = Math.abs(this.data.rect[3] - this.data.rect[1] - BORDER_SIZE); + computedFontSize = Math.min(fontSize, roundToOneDecimal(height / LINE_FACTOR)); + } + style.fontSize = `calc(${computedFontSize}px * var(--scale-factor))`; + style.color = Util.makeHexColor(fontColor[0], fontColor[1], fontColor[2]); + if (this.data.textAlignment !== null) { + style.textAlign = TEXT_ALIGNMENT[this.data.textAlignment]; + } + } + _setRequired(element, isRequired) { + if (isRequired) { + element.setAttribute("required", true); + } else { + element.removeAttribute("required"); + } + element.setAttribute("aria-required", isRequired); + } +} +class TextWidgetAnnotationElement extends WidgetAnnotationElement { + constructor(parameters) { + const isRenderable = parameters.renderForms || parameters.data.hasOwnCanvas || !parameters.data.hasAppearance && !!parameters.data.fieldValue; + super(parameters, { + isRenderable + }); + } + setPropertyOnSiblings(base, key, value, keyInStorage) { + const storage = this.annotationStorage; + for (const element of this._getElementsByName(base.name, base.id)) { + if (element.domElement) { + element.domElement[key] = value; + } + storage.setValue(element.id, { + [keyInStorage]: value + }); + } + } + render() { + const storage = this.annotationStorage; + const id = this.data.id; + this.container.classList.add("textWidgetAnnotation"); + let element = null; + if (this.renderForms) { + const storedData = storage.getValue(id, { + value: this.data.fieldValue + }); + let textContent = storedData.value || ""; + const maxLen = storage.getValue(id, { + charLimit: this.data.maxLen + }).charLimit; + if (maxLen && textContent.length > maxLen) { + textContent = textContent.slice(0, maxLen); + } + let fieldFormattedValues = storedData.formattedValue || this.data.textContent?.join("\n") || null; + if (fieldFormattedValues && this.data.comb) { + fieldFormattedValues = fieldFormattedValues.replaceAll(/\s+/g, ""); + } + const elementData = { + userValue: textContent, + formattedValue: fieldFormattedValues, + lastCommittedValue: null, + commitKey: 1, + focused: false + }; + if (this.data.multiLine) { + element = document.createElement("textarea"); + element.textContent = fieldFormattedValues ?? textContent; + if (this.data.doNotScroll) { + element.style.overflowY = "hidden"; + } + } else { + element = document.createElement("input"); + element.type = "text"; + element.setAttribute("value", fieldFormattedValues ?? textContent); + if (this.data.doNotScroll) { + element.style.overflowX = "hidden"; + } + } + if (this.data.hasOwnCanvas) { + element.hidden = true; + } + GetElementsByNameSet.add(element); + element.setAttribute("data-element-id", id); + element.disabled = this.data.readOnly; + element.name = this.data.fieldName; + element.tabIndex = DEFAULT_TAB_INDEX; + this._setRequired(element, this.data.required); + if (maxLen) { + element.maxLength = maxLen; + } + element.addEventListener("input", event => { + storage.setValue(id, { + value: event.target.value + }); + this.setPropertyOnSiblings(element, "value", event.target.value, "value"); + elementData.formattedValue = null; + }); + element.addEventListener("resetform", event => { + const defaultValue = this.data.defaultFieldValue ?? ""; + element.value = elementData.userValue = defaultValue; + elementData.formattedValue = null; + }); + let blurListener = event => { + const { + formattedValue + } = elementData; + if (formattedValue !== null && formattedValue !== undefined) { + event.target.value = formattedValue; + } + event.target.scrollLeft = 0; + }; + if (this.enableScripting && this.hasJSActions) { + element.addEventListener("focus", event => { + if (elementData.focused) { + return; + } + const { + target + } = event; + if (elementData.userValue) { + target.value = elementData.userValue; + } + elementData.lastCommittedValue = target.value; + elementData.commitKey = 1; + if (!this.data.actions?.Focus) { + elementData.focused = true; + } + }); + element.addEventListener("updatefromsandbox", jsEvent => { + this.showElementAndHideCanvas(jsEvent.target); + const actions = { + value(event) { + elementData.userValue = event.detail.value ?? ""; + storage.setValue(id, { + value: elementData.userValue.toString() + }); + event.target.value = elementData.userValue; + }, + formattedValue(event) { + const { + formattedValue + } = event.detail; + elementData.formattedValue = formattedValue; + if (formattedValue !== null && formattedValue !== undefined && event.target !== document.activeElement) { + event.target.value = formattedValue; + } + storage.setValue(id, { + formattedValue + }); + }, + selRange(event) { + event.target.setSelectionRange(...event.detail.selRange); + }, + charLimit: event => { + const { + charLimit + } = event.detail; + const { + target + } = event; + if (charLimit === 0) { + target.removeAttribute("maxLength"); + return; + } + target.setAttribute("maxLength", charLimit); + let value = elementData.userValue; + if (!value || value.length <= charLimit) { + return; + } + value = value.slice(0, charLimit); + target.value = elementData.userValue = value; + storage.setValue(id, { + value + }); + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id, + name: "Keystroke", + value, + willCommit: true, + commitKey: 1, + selStart: target.selectionStart, + selEnd: target.selectionEnd + } + }); + } + }; + this._dispatchEventFromSandbox(actions, jsEvent); + }); + element.addEventListener("keydown", event => { + elementData.commitKey = 1; + let commitKey = -1; + if (event.key === "Escape") { + commitKey = 0; + } else if (event.key === "Enter" && !this.data.multiLine) { + commitKey = 2; + } else if (event.key === "Tab") { + elementData.commitKey = 3; + } + if (commitKey === -1) { + return; + } + const { + value + } = event.target; + if (elementData.lastCommittedValue === value) { + return; + } + elementData.lastCommittedValue = value; + elementData.userValue = value; + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id, + name: "Keystroke", + value, + willCommit: true, + commitKey, + selStart: event.target.selectionStart, + selEnd: event.target.selectionEnd + } + }); + }); + const _blurListener = blurListener; + blurListener = null; + element.addEventListener("blur", event => { + if (!elementData.focused || !event.relatedTarget) { + return; + } + if (!this.data.actions?.Blur) { + elementData.focused = false; + } + const { + value + } = event.target; + elementData.userValue = value; + if (elementData.lastCommittedValue !== value) { + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id, + name: "Keystroke", + value, + willCommit: true, + commitKey: elementData.commitKey, + selStart: event.target.selectionStart, + selEnd: event.target.selectionEnd + } + }); + } + _blurListener(event); + }); + if (this.data.actions?.Keystroke) { + element.addEventListener("beforeinput", event => { + elementData.lastCommittedValue = null; + const { + data, + target + } = event; + const { + value, + selectionStart, + selectionEnd + } = target; + let selStart = selectionStart, + selEnd = selectionEnd; + switch (event.inputType) { + case "deleteWordBackward": + { + const match = value.substring(0, selectionStart).match(/\w*[^\w]*$/); + if (match) { + selStart -= match[0].length; + } + break; + } + case "deleteWordForward": + { + const match = value.substring(selectionStart).match(/^[^\w]*\w*/); + if (match) { + selEnd += match[0].length; + } + break; + } + case "deleteContentBackward": + if (selectionStart === selectionEnd) { + selStart -= 1; + } + break; + case "deleteContentForward": + if (selectionStart === selectionEnd) { + selEnd += 1; + } + break; + } + event.preventDefault(); + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id, + name: "Keystroke", + value, + change: data || "", + willCommit: false, + selStart, + selEnd + } + }); + }); + } + this._setEventListeners(element, elementData, [["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"]], event => event.target.value); + } + if (blurListener) { + element.addEventListener("blur", blurListener); + } + if (this.data.comb) { + const fieldWidth = this.data.rect[2] - this.data.rect[0]; + const combWidth = fieldWidth / maxLen; + element.classList.add("comb"); + element.style.letterSpacing = `calc(${combWidth}px * var(--scale-factor) - 1ch)`; + } + } else { + element = document.createElement("div"); + element.textContent = this.data.fieldValue; + element.style.verticalAlign = "middle"; + element.style.display = "table-cell"; + if (this.data.hasOwnCanvas) { + element.hidden = true; + } + } + this._setTextStyle(element); + this._setBackgroundColor(element); + this._setDefaultPropertiesFromJS(element); + this.container.append(element); + return this.container; + } +} +class SignatureWidgetAnnotationElement extends WidgetAnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: !!parameters.data.hasOwnCanvas + }); + } +} +class CheckboxWidgetAnnotationElement extends WidgetAnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: parameters.renderForms + }); + } + render() { + const storage = this.annotationStorage; + const data = this.data; + const id = data.id; + let value = storage.getValue(id, { + value: data.exportValue === data.fieldValue + }).value; + if (typeof value === "string") { + value = value !== "Off"; + storage.setValue(id, { + value + }); + } + this.container.classList.add("buttonWidgetAnnotation", "checkBox"); + const element = document.createElement("input"); + GetElementsByNameSet.add(element); + element.setAttribute("data-element-id", id); + element.disabled = data.readOnly; + this._setRequired(element, this.data.required); + element.type = "checkbox"; + element.name = data.fieldName; + if (value) { + element.setAttribute("checked", true); + } + element.setAttribute("exportValue", data.exportValue); + element.tabIndex = DEFAULT_TAB_INDEX; + element.addEventListener("change", event => { + const { + name, + checked + } = event.target; + for (const checkbox of this._getElementsByName(name, id)) { + const curChecked = checked && checkbox.exportValue === data.exportValue; + if (checkbox.domElement) { + checkbox.domElement.checked = curChecked; + } + storage.setValue(checkbox.id, { + value: curChecked + }); + } + storage.setValue(id, { + value: checked + }); + }); + element.addEventListener("resetform", event => { + const defaultValue = data.defaultFieldValue || "Off"; + event.target.checked = defaultValue === data.exportValue; + }); + if (this.enableScripting && this.hasJSActions) { + element.addEventListener("updatefromsandbox", jsEvent => { + const actions = { + value(event) { + event.target.checked = event.detail.value !== "Off"; + storage.setValue(id, { + value: event.target.checked + }); + } + }; + this._dispatchEventFromSandbox(actions, jsEvent); + }); + this._setEventListeners(element, null, [["change", "Validate"], ["change", "Action"], ["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"]], event => event.target.checked); + } + this._setBackgroundColor(element); + this._setDefaultPropertiesFromJS(element); + this.container.append(element); + return this.container; + } +} +class RadioButtonWidgetAnnotationElement extends WidgetAnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: parameters.renderForms + }); + } + render() { + this.container.classList.add("buttonWidgetAnnotation", "radioButton"); + const storage = this.annotationStorage; + const data = this.data; + const id = data.id; + let value = storage.getValue(id, { + value: data.fieldValue === data.buttonValue + }).value; + if (typeof value === "string") { + value = value !== data.buttonValue; + storage.setValue(id, { + value + }); + } + if (value) { + for (const radio of this._getElementsByName(data.fieldName, id)) { + storage.setValue(radio.id, { + value: false + }); + } + } + const element = document.createElement("input"); + GetElementsByNameSet.add(element); + element.setAttribute("data-element-id", id); + element.disabled = data.readOnly; + this._setRequired(element, this.data.required); + element.type = "radio"; + element.name = data.fieldName; + if (value) { + element.setAttribute("checked", true); + } + element.tabIndex = DEFAULT_TAB_INDEX; + element.addEventListener("change", event => { + const { + name, + checked + } = event.target; + for (const radio of this._getElementsByName(name, id)) { + storage.setValue(radio.id, { + value: false + }); + } + storage.setValue(id, { + value: checked + }); + }); + element.addEventListener("resetform", event => { + const defaultValue = data.defaultFieldValue; + event.target.checked = defaultValue !== null && defaultValue !== undefined && defaultValue === data.buttonValue; + }); + if (this.enableScripting && this.hasJSActions) { + const pdfButtonValue = data.buttonValue; + element.addEventListener("updatefromsandbox", jsEvent => { + const actions = { + value: event => { + const checked = pdfButtonValue === event.detail.value; + for (const radio of this._getElementsByName(event.target.name)) { + const curChecked = checked && radio.id === id; + if (radio.domElement) { + radio.domElement.checked = curChecked; + } + storage.setValue(radio.id, { + value: curChecked + }); + } + } + }; + this._dispatchEventFromSandbox(actions, jsEvent); + }); + this._setEventListeners(element, null, [["change", "Validate"], ["change", "Action"], ["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"]], event => event.target.checked); + } + this._setBackgroundColor(element); + this._setDefaultPropertiesFromJS(element); + this.container.append(element); + return this.container; + } +} +class PushButtonWidgetAnnotationElement extends LinkAnnotationElement { + constructor(parameters) { + super(parameters, { + ignoreBorder: parameters.data.hasAppearance + }); + } + render() { + const container = super.render(); + container.classList.add("buttonWidgetAnnotation", "pushButton"); + const linkElement = container.lastChild; + if (this.enableScripting && this.hasJSActions && linkElement) { + this._setDefaultPropertiesFromJS(linkElement); + linkElement.addEventListener("updatefromsandbox", jsEvent => { + this._dispatchEventFromSandbox({}, jsEvent); + }); + } + return container; + } +} +class ChoiceWidgetAnnotationElement extends WidgetAnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: parameters.renderForms + }); + } + render() { + this.container.classList.add("choiceWidgetAnnotation"); + const storage = this.annotationStorage; + const id = this.data.id; + const storedData = storage.getValue(id, { + value: this.data.fieldValue + }); + const selectElement = document.createElement("select"); + GetElementsByNameSet.add(selectElement); + selectElement.setAttribute("data-element-id", id); + selectElement.disabled = this.data.readOnly; + this._setRequired(selectElement, this.data.required); + selectElement.name = this.data.fieldName; + selectElement.tabIndex = DEFAULT_TAB_INDEX; + let addAnEmptyEntry = this.data.combo && this.data.options.length > 0; + if (!this.data.combo) { + selectElement.size = this.data.options.length; + if (this.data.multiSelect) { + selectElement.multiple = true; + } + } + selectElement.addEventListener("resetform", event => { + const defaultValue = this.data.defaultFieldValue; + for (const option of selectElement.options) { + option.selected = option.value === defaultValue; + } + }); + for (const option of this.data.options) { + const optionElement = document.createElement("option"); + optionElement.textContent = option.displayValue; + optionElement.value = option.exportValue; + if (storedData.value.includes(option.exportValue)) { + optionElement.setAttribute("selected", true); + addAnEmptyEntry = false; + } + selectElement.append(optionElement); + } + let removeEmptyEntry = null; + if (addAnEmptyEntry) { + const noneOptionElement = document.createElement("option"); + noneOptionElement.value = " "; + noneOptionElement.setAttribute("hidden", true); + noneOptionElement.setAttribute("selected", true); + selectElement.prepend(noneOptionElement); + removeEmptyEntry = () => { + noneOptionElement.remove(); + selectElement.removeEventListener("input", removeEmptyEntry); + removeEmptyEntry = null; + }; + selectElement.addEventListener("input", removeEmptyEntry); + } + const getValue = isExport => { + const name = isExport ? "value" : "textContent"; + const { + options, + multiple + } = selectElement; + if (!multiple) { + return options.selectedIndex === -1 ? null : options[options.selectedIndex][name]; + } + return Array.prototype.filter.call(options, option => option.selected).map(option => option[name]); + }; + let selectedValues = getValue(false); + const getItems = event => { + const options = event.target.options; + return Array.prototype.map.call(options, option => ({ + displayValue: option.textContent, + exportValue: option.value + })); + }; + if (this.enableScripting && this.hasJSActions) { + selectElement.addEventListener("updatefromsandbox", jsEvent => { + const actions = { + value(event) { + removeEmptyEntry?.(); + const value = event.detail.value; + const values = new Set(Array.isArray(value) ? value : [value]); + for (const option of selectElement.options) { + option.selected = values.has(option.value); + } + storage.setValue(id, { + value: getValue(true) + }); + selectedValues = getValue(false); + }, + multipleSelection(event) { + selectElement.multiple = true; + }, + remove(event) { + const options = selectElement.options; + const index = event.detail.remove; + options[index].selected = false; + selectElement.remove(index); + if (options.length > 0) { + const i = Array.prototype.findIndex.call(options, option => option.selected); + if (i === -1) { + options[0].selected = true; + } + } + storage.setValue(id, { + value: getValue(true), + items: getItems(event) + }); + selectedValues = getValue(false); + }, + clear(event) { + while (selectElement.length !== 0) { + selectElement.remove(0); + } + storage.setValue(id, { + value: null, + items: [] + }); + selectedValues = getValue(false); + }, + insert(event) { + const { + index, + displayValue, + exportValue + } = event.detail.insert; + const selectChild = selectElement.children[index]; + const optionElement = document.createElement("option"); + optionElement.textContent = displayValue; + optionElement.value = exportValue; + if (selectChild) { + selectChild.before(optionElement); + } else { + selectElement.append(optionElement); + } + storage.setValue(id, { + value: getValue(true), + items: getItems(event) + }); + selectedValues = getValue(false); + }, + items(event) { + const { + items + } = event.detail; + while (selectElement.length !== 0) { + selectElement.remove(0); + } + for (const item of items) { + const { + displayValue, + exportValue + } = item; + const optionElement = document.createElement("option"); + optionElement.textContent = displayValue; + optionElement.value = exportValue; + selectElement.append(optionElement); + } + if (selectElement.options.length > 0) { + selectElement.options[0].selected = true; + } + storage.setValue(id, { + value: getValue(true), + items: getItems(event) + }); + selectedValues = getValue(false); + }, + indices(event) { + const indices = new Set(event.detail.indices); + for (const option of event.target.options) { + option.selected = indices.has(option.index); + } + storage.setValue(id, { + value: getValue(true) + }); + selectedValues = getValue(false); + }, + editable(event) { + event.target.disabled = !event.detail.editable; + } + }; + this._dispatchEventFromSandbox(actions, jsEvent); + }); + selectElement.addEventListener("input", event => { + const exportValue = getValue(true); + const change = getValue(false); + storage.setValue(id, { + value: exportValue + }); + event.preventDefault(); + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id, + name: "Keystroke", + value: selectedValues, + change, + changeEx: exportValue, + willCommit: false, + commitKey: 1, + keyDown: false + } + }); + }); + this._setEventListeners(selectElement, null, [["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"], ["input", "Action"], ["input", "Validate"]], event => event.target.value); + } else { + selectElement.addEventListener("input", function (event) { + storage.setValue(id, { + value: getValue(true) + }); + }); + } + if (this.data.combo) { + this._setTextStyle(selectElement); + } else {} + this._setBackgroundColor(selectElement); + this._setDefaultPropertiesFromJS(selectElement); + this.container.append(selectElement); + return this.container; + } +} +class PopupAnnotationElement extends AnnotationElement { + constructor(parameters) { + const { + data, + elements + } = parameters; + super(parameters, { + isRenderable: AnnotationElement._hasPopupData(data) + }); + this.elements = elements; + this.popup = null; + } + render() { + this.container.classList.add("popupAnnotation"); + const popup = this.popup = new PopupElement({ + container: this.container, + color: this.data.color, + titleObj: this.data.titleObj, + modificationDate: this.data.modificationDate, + contentsObj: this.data.contentsObj, + richText: this.data.richText, + rect: this.data.rect, + parentRect: this.data.parentRect || null, + parent: this.parent, + elements: this.elements, + open: this.data.open + }); + const elementIds = []; + for (const element of this.elements) { + element.popup = popup; + elementIds.push(element.data.id); + element.addHighlightArea(); + } + this.container.setAttribute("aria-controls", elementIds.map(id => `${AnnotationPrefix}${id}`).join(",")); + return this.container; + } +} +class PopupElement { + #boundKeyDown = this.#keyDown.bind(this); + #boundHide = this.#hide.bind(this); + #boundShow = this.#show.bind(this); + #boundToggle = this.#toggle.bind(this); + #color = null; + #container = null; + #contentsObj = null; + #dateObj = null; + #elements = null; + #parent = null; + #parentRect = null; + #pinned = false; + #popup = null; + #position = null; + #rect = null; + #richText = null; + #titleObj = null; + #updates = null; + #wasVisible = false; + constructor({ + container, + color, + elements, + titleObj, + modificationDate, + contentsObj, + richText, + parent, + rect, + parentRect, + open + }) { + this.#container = container; + this.#titleObj = titleObj; + this.#contentsObj = contentsObj; + this.#richText = richText; + this.#parent = parent; + this.#color = color; + this.#rect = rect; + this.#parentRect = parentRect; + this.#elements = elements; + this.#dateObj = PDFDateString.toDateObject(modificationDate); + this.trigger = elements.flatMap(e => e.getElementsToTriggerPopup()); + for (const element of this.trigger) { + element.addEventListener("click", this.#boundToggle); + element.addEventListener("mouseenter", this.#boundShow); + element.addEventListener("mouseleave", this.#boundHide); + element.classList.add("popupTriggerArea"); + } + for (const element of elements) { + element.container?.addEventListener("keydown", this.#boundKeyDown); + } + this.#container.hidden = true; + if (open) { + this.#toggle(); + } + } + render() { + if (this.#popup) { + return; + } + const popup = this.#popup = document.createElement("div"); + popup.className = "popup"; + if (this.#color) { + const baseColor = popup.style.outlineColor = Util.makeHexColor(...this.#color); + if (CSS.supports("background-color", "color-mix(in srgb, red 30%, white)")) { + popup.style.backgroundColor = `color-mix(in srgb, ${baseColor} 30%, white)`; + } else { + const BACKGROUND_ENLIGHT = 0.7; + popup.style.backgroundColor = Util.makeHexColor(...this.#color.map(c => Math.floor(BACKGROUND_ENLIGHT * (255 - c) + c))); + } + } + const header = document.createElement("span"); + header.className = "header"; + const title = document.createElement("h1"); + header.append(title); + ({ + dir: title.dir, + str: title.textContent + } = this.#titleObj); + popup.append(header); + if (this.#dateObj) { + const modificationDate = document.createElement("span"); + modificationDate.classList.add("popupDate"); + modificationDate.setAttribute("data-l10n-id", "pdfjs-annotation-date-string"); + modificationDate.setAttribute("data-l10n-args", JSON.stringify({ + date: this.#dateObj.toLocaleDateString(), + time: this.#dateObj.toLocaleTimeString() + })); + header.append(modificationDate); + } + const html = this.#html; + if (html) { + XfaLayer.render({ + xfaHtml: html, + intent: "richText", + div: popup + }); + popup.lastChild.classList.add("richText", "popupContent"); + } else { + const contents = this._formatContents(this.#contentsObj); + popup.append(contents); + } + this.#container.append(popup); + } + get #html() { + const richText = this.#richText; + const contentsObj = this.#contentsObj; + if (richText?.str && (!contentsObj?.str || contentsObj.str === richText.str)) { + return this.#richText.html || null; + } + return null; + } + get #fontSize() { + return this.#html?.attributes?.style?.fontSize || 0; + } + get #fontColor() { + return this.#html?.attributes?.style?.color || null; + } + #makePopupContent(text) { + const popupLines = []; + const popupContent = { + str: text, + html: { + name: "div", + attributes: { + dir: "auto" + }, + children: [{ + name: "p", + children: popupLines + }] + } + }; + const lineAttributes = { + style: { + color: this.#fontColor, + fontSize: this.#fontSize ? `calc(${this.#fontSize}px * var(--scale-factor))` : "" + } + }; + for (const line of text.split("\n")) { + popupLines.push({ + name: "span", + value: line, + attributes: lineAttributes + }); + } + return popupContent; + } + _formatContents({ + str, + dir + }) { + const p = document.createElement("p"); + p.classList.add("popupContent"); + p.dir = dir; + const lines = str.split(/(?:\r\n?|\n)/); + for (let i = 0, ii = lines.length; i < ii; ++i) { + const line = lines[i]; + p.append(document.createTextNode(line)); + if (i < ii - 1) { + p.append(document.createElement("br")); + } + } + return p; + } + #keyDown(event) { + if (event.altKey || event.shiftKey || event.ctrlKey || event.metaKey) { + return; + } + if (event.key === "Enter" || event.key === "Escape" && this.#pinned) { + this.#toggle(); + } + } + updateEdited({ + rect, + popupContent + }) { + this.#updates ||= { + contentsObj: this.#contentsObj, + richText: this.#richText + }; + if (rect) { + this.#position = null; + } + if (popupContent) { + this.#richText = this.#makePopupContent(popupContent); + this.#contentsObj = null; + } + this.#popup?.remove(); + this.#popup = null; + } + resetEdited() { + if (!this.#updates) { + return; + } + ({ + contentsObj: this.#contentsObj, + richText: this.#richText + } = this.#updates); + this.#updates = null; + this.#popup?.remove(); + this.#popup = null; + this.#position = null; + } + #setPosition() { + if (this.#position !== null) { + return; + } + const { + page: { + view + }, + viewport: { + rawDims: { + pageWidth, + pageHeight, + pageX, + pageY + } + } + } = this.#parent; + let useParentRect = !!this.#parentRect; + let rect = useParentRect ? this.#parentRect : this.#rect; + for (const element of this.#elements) { + if (!rect || Util.intersect(element.data.rect, rect) !== null) { + rect = element.data.rect; + useParentRect = true; + break; + } + } + const normalizedRect = Util.normalizeRect([rect[0], view[3] - rect[1] + view[1], rect[2], view[3] - rect[3] + view[1]]); + const HORIZONTAL_SPACE_AFTER_ANNOTATION = 5; + const parentWidth = useParentRect ? rect[2] - rect[0] + HORIZONTAL_SPACE_AFTER_ANNOTATION : 0; + const popupLeft = normalizedRect[0] + parentWidth; + const popupTop = normalizedRect[1]; + this.#position = [100 * (popupLeft - pageX) / pageWidth, 100 * (popupTop - pageY) / pageHeight]; + const { + style + } = this.#container; + style.left = `${this.#position[0]}%`; + style.top = `${this.#position[1]}%`; + } + #toggle() { + this.#pinned = !this.#pinned; + if (this.#pinned) { + this.#show(); + this.#container.addEventListener("click", this.#boundToggle); + this.#container.addEventListener("keydown", this.#boundKeyDown); + } else { + this.#hide(); + this.#container.removeEventListener("click", this.#boundToggle); + this.#container.removeEventListener("keydown", this.#boundKeyDown); + } + } + #show() { + if (!this.#popup) { + this.render(); + } + if (!this.isVisible) { + this.#setPosition(); + this.#container.hidden = false; + this.#container.style.zIndex = parseInt(this.#container.style.zIndex) + 1000; + } else if (this.#pinned) { + this.#container.classList.add("focused"); + } + } + #hide() { + this.#container.classList.remove("focused"); + if (this.#pinned || !this.isVisible) { + return; + } + this.#container.hidden = true; + this.#container.style.zIndex = parseInt(this.#container.style.zIndex) - 1000; + } + forceHide() { + this.#wasVisible = this.isVisible; + if (!this.#wasVisible) { + return; + } + this.#container.hidden = true; + } + maybeShow() { + if (!this.#wasVisible) { + return; + } + if (!this.#popup) { + this.#show(); + } + this.#wasVisible = false; + this.#container.hidden = false; + } + get isVisible() { + return this.#container.hidden === false; + } +} +class FreeTextAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + this.textContent = parameters.data.textContent; + this.textPosition = parameters.data.textPosition; + this.annotationEditorType = AnnotationEditorType.FREETEXT; + } + render() { + this.container.classList.add("freeTextAnnotation"); + if (this.textContent) { + const content = document.createElement("div"); + content.classList.add("annotationTextContent"); + content.setAttribute("role", "comment"); + for (const line of this.textContent) { + const lineSpan = document.createElement("span"); + lineSpan.textContent = line; + content.append(lineSpan); + } + this.container.append(content); + } + if (!this.data.popupRef && this.hasPopupData) { + this._createPopup(); + } + this._editOnDoubleClick(); + return this.container; + } + get _isEditable() { + return this.data.hasOwnCanvas; + } +} +class LineAnnotationElement extends AnnotationElement { + #line = null; + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + } + render() { + this.container.classList.add("lineAnnotation"); + const data = this.data; + const { + width, + height + } = getRectDims(data.rect); + const svg = this.svgFactory.create(width, height, true); + const line = this.#line = this.svgFactory.createElement("svg:line"); + line.setAttribute("x1", data.rect[2] - data.lineCoordinates[0]); + line.setAttribute("y1", data.rect[3] - data.lineCoordinates[1]); + line.setAttribute("x2", data.rect[2] - data.lineCoordinates[2]); + line.setAttribute("y2", data.rect[3] - data.lineCoordinates[3]); + line.setAttribute("stroke-width", data.borderStyle.width || 1); + line.setAttribute("stroke", "transparent"); + line.setAttribute("fill", "transparent"); + svg.append(line); + this.container.append(svg); + if (!data.popupRef && this.hasPopupData) { + this._createPopup(); + } + return this.container; + } + getElementsToTriggerPopup() { + return this.#line; + } + addHighlightArea() { + this.container.classList.add("highlightArea"); + } +} +class SquareAnnotationElement extends AnnotationElement { + #square = null; + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + } + render() { + this.container.classList.add("squareAnnotation"); + const data = this.data; + const { + width, + height + } = getRectDims(data.rect); + const svg = this.svgFactory.create(width, height, true); + const borderWidth = data.borderStyle.width; + const square = this.#square = this.svgFactory.createElement("svg:rect"); + square.setAttribute("x", borderWidth / 2); + square.setAttribute("y", borderWidth / 2); + square.setAttribute("width", width - borderWidth); + square.setAttribute("height", height - borderWidth); + square.setAttribute("stroke-width", borderWidth || 1); + square.setAttribute("stroke", "transparent"); + square.setAttribute("fill", "transparent"); + svg.append(square); + this.container.append(svg); + if (!data.popupRef && this.hasPopupData) { + this._createPopup(); + } + return this.container; + } + getElementsToTriggerPopup() { + return this.#square; + } + addHighlightArea() { + this.container.classList.add("highlightArea"); + } +} +class CircleAnnotationElement extends AnnotationElement { + #circle = null; + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + } + render() { + this.container.classList.add("circleAnnotation"); + const data = this.data; + const { + width, + height + } = getRectDims(data.rect); + const svg = this.svgFactory.create(width, height, true); + const borderWidth = data.borderStyle.width; + const circle = this.#circle = this.svgFactory.createElement("svg:ellipse"); + circle.setAttribute("cx", width / 2); + circle.setAttribute("cy", height / 2); + circle.setAttribute("rx", width / 2 - borderWidth / 2); + circle.setAttribute("ry", height / 2 - borderWidth / 2); + circle.setAttribute("stroke-width", borderWidth || 1); + circle.setAttribute("stroke", "transparent"); + circle.setAttribute("fill", "transparent"); + svg.append(circle); + this.container.append(svg); + if (!data.popupRef && this.hasPopupData) { + this._createPopup(); + } + return this.container; + } + getElementsToTriggerPopup() { + return this.#circle; + } + addHighlightArea() { + this.container.classList.add("highlightArea"); + } +} +class PolylineAnnotationElement extends AnnotationElement { + #polyline = null; + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + this.containerClassName = "polylineAnnotation"; + this.svgElementName = "svg:polyline"; + } + render() { + this.container.classList.add(this.containerClassName); + const { + data: { + rect, + vertices, + borderStyle, + popupRef + } + } = this; + if (!vertices) { + return this.container; + } + const { + width, + height + } = getRectDims(rect); + const svg = this.svgFactory.create(width, height, true); + let points = []; + for (let i = 0, ii = vertices.length; i < ii; i += 2) { + const x = vertices[i] - rect[0]; + const y = rect[3] - vertices[i + 1]; + points.push(`${x},${y}`); + } + points = points.join(" "); + const polyline = this.#polyline = this.svgFactory.createElement(this.svgElementName); + polyline.setAttribute("points", points); + polyline.setAttribute("stroke-width", borderStyle.width || 1); + polyline.setAttribute("stroke", "transparent"); + polyline.setAttribute("fill", "transparent"); + svg.append(polyline); + this.container.append(svg); + if (!popupRef && this.hasPopupData) { + this._createPopup(); + } + return this.container; + } + getElementsToTriggerPopup() { + return this.#polyline; + } + addHighlightArea() { + this.container.classList.add("highlightArea"); + } +} +class PolygonAnnotationElement extends PolylineAnnotationElement { + constructor(parameters) { + super(parameters); + this.containerClassName = "polygonAnnotation"; + this.svgElementName = "svg:polygon"; + } +} +class CaretAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + } + render() { + this.container.classList.add("caretAnnotation"); + if (!this.data.popupRef && this.hasPopupData) { + this._createPopup(); + } + return this.container; + } +} +class InkAnnotationElement extends AnnotationElement { + #polylines = []; + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + this.containerClassName = "inkAnnotation"; + this.svgElementName = "svg:polyline"; + this.annotationEditorType = AnnotationEditorType.INK; + } + render() { + this.container.classList.add(this.containerClassName); + const { + data: { + rect, + inkLists, + borderStyle, + popupRef + } + } = this; + const { + width, + height + } = getRectDims(rect); + const svg = this.svgFactory.create(width, height, true); + for (const inkList of inkLists) { + let points = []; + for (let i = 0, ii = inkList.length; i < ii; i += 2) { + const x = inkList[i] - rect[0]; + const y = rect[3] - inkList[i + 1]; + points.push(`${x},${y}`); + } + points = points.join(" "); + const polyline = this.svgFactory.createElement(this.svgElementName); + this.#polylines.push(polyline); + polyline.setAttribute("points", points); + polyline.setAttribute("stroke-width", borderStyle.width || 1); + polyline.setAttribute("stroke", "transparent"); + polyline.setAttribute("fill", "transparent"); + if (!popupRef && this.hasPopupData) { + this._createPopup(); + } + svg.append(polyline); + } + this.container.append(svg); + return this.container; + } + getElementsToTriggerPopup() { + return this.#polylines; + } + addHighlightArea() { + this.container.classList.add("highlightArea"); + } +} +class HighlightAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true, + createQuadrilaterals: true + }); + } + render() { + if (!this.data.popupRef && this.hasPopupData) { + this._createPopup(); + } + this.container.classList.add("highlightAnnotation"); + return this.container; + } +} +class UnderlineAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true, + createQuadrilaterals: true + }); + } + render() { + if (!this.data.popupRef && this.hasPopupData) { + this._createPopup(); + } + this.container.classList.add("underlineAnnotation"); + return this.container; + } +} +class SquigglyAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true, + createQuadrilaterals: true + }); + } + render() { + if (!this.data.popupRef && this.hasPopupData) { + this._createPopup(); + } + this.container.classList.add("squigglyAnnotation"); + return this.container; + } +} +class StrikeOutAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true, + createQuadrilaterals: true + }); + } + render() { + if (!this.data.popupRef && this.hasPopupData) { + this._createPopup(); + } + this.container.classList.add("strikeoutAnnotation"); + return this.container; + } +} +class StampAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + } + render() { + this.container.classList.add("stampAnnotation"); + if (!this.data.popupRef && this.hasPopupData) { + this._createPopup(); + } + return this.container; + } +} +class FileAttachmentAnnotationElement extends AnnotationElement { + #trigger = null; + constructor(parameters) { + super(parameters, { + isRenderable: true + }); + const { + file + } = this.data; + this.filename = file.filename; + this.content = file.content; + this.linkService.eventBus?.dispatch("fileattachmentannotation", { + source: this, + ...file + }); + } + render() { + this.container.classList.add("fileAttachmentAnnotation"); + const { + container, + data + } = this; + let trigger; + if (data.hasAppearance || data.fillAlpha === 0) { + trigger = document.createElement("div"); + } else { + trigger = document.createElement("img"); + trigger.src = `${this.imageResourcesPath}annotation-${/paperclip/i.test(data.name) ? "paperclip" : "pushpin"}.svg`; + if (data.fillAlpha && data.fillAlpha < 1) { + trigger.style = `filter: opacity(${Math.round(data.fillAlpha * 100)}%);`; + } + } + trigger.addEventListener("dblclick", this.#download.bind(this)); + this.#trigger = trigger; + const { + isMac + } = util_FeatureTest.platform; + container.addEventListener("keydown", evt => { + if (evt.key === "Enter" && (isMac ? evt.metaKey : evt.ctrlKey)) { + this.#download(); + } + }); + if (!data.popupRef && this.hasPopupData) { + this._createPopup(); + } else { + trigger.classList.add("popupTriggerArea"); + } + container.append(trigger); + return container; + } + getElementsToTriggerPopup() { + return this.#trigger; + } + addHighlightArea() { + this.container.classList.add("highlightArea"); + } + #download() { + this.downloadManager?.openOrDownloadData(this.content, this.filename); + } +} +class AnnotationLayer { + #accessibilityManager = null; + #annotationCanvasMap = null; + #editableAnnotations = new Map(); + constructor({ + div, + accessibilityManager, + annotationCanvasMap, + annotationEditorUIManager, + page, + viewport + }) { + this.div = div; + this.#accessibilityManager = accessibilityManager; + this.#annotationCanvasMap = annotationCanvasMap; + this.page = page; + this.viewport = viewport; + this.zIndex = 0; + this._annotationEditorUIManager = annotationEditorUIManager; + } + #appendElement(element, id) { + const contentElement = element.firstChild || element; + contentElement.id = `${AnnotationPrefix}${id}`; + this.div.append(element); + this.#accessibilityManager?.moveElementInDOM(this.div, element, contentElement, false); + } + async render(params) { + const { + annotations + } = params; + const layer = this.div; + setLayerDimensions(layer, this.viewport); + const popupToElements = new Map(); + const elementParams = { + data: null, + layer, + linkService: params.linkService, + downloadManager: params.downloadManager, + imageResourcesPath: params.imageResourcesPath || "", + renderForms: params.renderForms !== false, + svgFactory: new DOMSVGFactory(), + annotationStorage: params.annotationStorage || new AnnotationStorage(), + enableScripting: params.enableScripting === true, + hasJSActions: params.hasJSActions, + fieldObjects: params.fieldObjects, + parent: this, + elements: null + }; + for (const data of annotations) { + if (data.noHTML) { + continue; + } + const isPopupAnnotation = data.annotationType === AnnotationType.POPUP; + if (!isPopupAnnotation) { + const { + width, + height + } = getRectDims(data.rect); + if (width <= 0 || height <= 0) { + continue; + } + } else { + const elements = popupToElements.get(data.id); + if (!elements) { + continue; + } + elementParams.elements = elements; + } + elementParams.data = data; + const element = AnnotationElementFactory.create(elementParams); + if (!element.isRenderable) { + continue; + } + if (!isPopupAnnotation && data.popupRef) { + const elements = popupToElements.get(data.popupRef); + if (!elements) { + popupToElements.set(data.popupRef, [element]); + } else { + elements.push(element); + } + } + const rendered = element.render(); + if (data.hidden) { + rendered.style.visibility = "hidden"; + } + this.#appendElement(rendered, data.id); + if (element.annotationEditorType > 0) { + this.#editableAnnotations.set(element.data.id, element); + this._annotationEditorUIManager?.renderAnnotationElement(element); + } + } + this.#setAnnotationCanvasMap(); + } + update({ + viewport + }) { + const layer = this.div; + this.viewport = viewport; + setLayerDimensions(layer, { + rotation: viewport.rotation + }); + this.#setAnnotationCanvasMap(); + layer.hidden = false; + } + #setAnnotationCanvasMap() { + if (!this.#annotationCanvasMap) { + return; + } + const layer = this.div; + for (const [id, canvas] of this.#annotationCanvasMap) { + const element = layer.querySelector(`[data-annotation-id="${id}"]`); + if (!element) { + continue; + } + canvas.className = "annotationContent"; + const { + firstChild + } = element; + if (!firstChild) { + element.append(canvas); + } else if (firstChild.nodeName === "CANVAS") { + firstChild.replaceWith(canvas); + } else if (!firstChild.classList.contains("annotationContent")) { + firstChild.before(canvas); + } else { + firstChild.after(canvas); + } + } + this.#annotationCanvasMap.clear(); + } + getEditableAnnotations() { + return Array.from(this.#editableAnnotations.values()); + } + getEditableAnnotation(id) { + return this.#editableAnnotations.get(id); + } +} + +;// CONCATENATED MODULE: ./src/display/editor/freetext.js + + + + +const EOL_PATTERN = /\r\n?|\n/g; +class FreeTextEditor extends AnnotationEditor { + #boundEditorDivBlur = this.editorDivBlur.bind(this); + #boundEditorDivFocus = this.editorDivFocus.bind(this); + #boundEditorDivInput = this.editorDivInput.bind(this); + #boundEditorDivKeydown = this.editorDivKeydown.bind(this); + #boundEditorDivPaste = this.editorDivPaste.bind(this); + #color; + #content = ""; + #editorDivId = `${this.id}-editor`; + #fontSize; + #initialData = null; + static _freeTextDefaultContent = ""; + static _internalPadding = 0; + static _defaultColor = null; + static _defaultFontSize = 10; + static get _keyboardManager() { + const proto = FreeTextEditor.prototype; + const arrowChecker = self => self.isEmpty(); + const small = AnnotationEditorUIManager.TRANSLATE_SMALL; + const big = AnnotationEditorUIManager.TRANSLATE_BIG; + return shadow(this, "_keyboardManager", new KeyboardManager([[["ctrl+s", "mac+meta+s", "ctrl+p", "mac+meta+p"], proto.commitOrRemove, { + bubbles: true + }], [["ctrl+Enter", "mac+meta+Enter", "Escape", "mac+Escape"], proto.commitOrRemove], [["ArrowLeft", "mac+ArrowLeft"], proto._translateEmpty, { + args: [-small, 0], + checker: arrowChecker + }], [["ctrl+ArrowLeft", "mac+shift+ArrowLeft"], proto._translateEmpty, { + args: [-big, 0], + checker: arrowChecker + }], [["ArrowRight", "mac+ArrowRight"], proto._translateEmpty, { + args: [small, 0], + checker: arrowChecker + }], [["ctrl+ArrowRight", "mac+shift+ArrowRight"], proto._translateEmpty, { + args: [big, 0], + checker: arrowChecker + }], [["ArrowUp", "mac+ArrowUp"], proto._translateEmpty, { + args: [0, -small], + checker: arrowChecker + }], [["ctrl+ArrowUp", "mac+shift+ArrowUp"], proto._translateEmpty, { + args: [0, -big], + checker: arrowChecker + }], [["ArrowDown", "mac+ArrowDown"], proto._translateEmpty, { + args: [0, small], + checker: arrowChecker + }], [["ctrl+ArrowDown", "mac+shift+ArrowDown"], proto._translateEmpty, { + args: [0, big], + checker: arrowChecker + }]])); + } + static _type = "freetext"; + static _editorType = AnnotationEditorType.FREETEXT; + constructor(params) { + super({ + ...params, + name: "freeTextEditor" + }); + this.#color = params.color || FreeTextEditor._defaultColor || AnnotationEditor._defaultLineColor; + this.#fontSize = params.fontSize || FreeTextEditor._defaultFontSize; + } + static initialize(l10n, uiManager) { + AnnotationEditor.initialize(l10n, uiManager, { + strings: ["pdfjs-free-text-default-content"] + }); + const style = getComputedStyle(document.documentElement); + this._internalPadding = parseFloat(style.getPropertyValue("--freetext-padding")); + } + static updateDefaultParams(type, value) { + switch (type) { + case AnnotationEditorParamsType.FREETEXT_SIZE: + FreeTextEditor._defaultFontSize = value; + break; + case AnnotationEditorParamsType.FREETEXT_COLOR: + FreeTextEditor._defaultColor = value; + break; + } + } + updateParams(type, value) { + switch (type) { + case AnnotationEditorParamsType.FREETEXT_SIZE: + this.#updateFontSize(value); + break; + case AnnotationEditorParamsType.FREETEXT_COLOR: + this.#updateColor(value); + break; + } + } + static get defaultPropertiesToUpdate() { + return [[AnnotationEditorParamsType.FREETEXT_SIZE, FreeTextEditor._defaultFontSize], [AnnotationEditorParamsType.FREETEXT_COLOR, FreeTextEditor._defaultColor || AnnotationEditor._defaultLineColor]]; + } + get propertiesToUpdate() { + return [[AnnotationEditorParamsType.FREETEXT_SIZE, this.#fontSize], [AnnotationEditorParamsType.FREETEXT_COLOR, this.#color]]; + } + #updateFontSize(fontSize) { + const setFontsize = size => { + this.editorDiv.style.fontSize = `calc(${size}px * var(--scale-factor))`; + this.translate(0, -(size - this.#fontSize) * this.parentScale); + this.#fontSize = size; + this.#setEditorDimensions(); + }; + const savedFontsize = this.#fontSize; + this.addCommands({ + cmd: setFontsize.bind(this, fontSize), + undo: setFontsize.bind(this, savedFontsize), + post: this._uiManager.updateUI.bind(this._uiManager, this), + mustExec: true, + type: AnnotationEditorParamsType.FREETEXT_SIZE, + overwriteIfSameType: true, + keepUndo: true + }); + } + #updateColor(color) { + const setColor = col => { + this.#color = this.editorDiv.style.color = col; + }; + const savedColor = this.#color; + this.addCommands({ + cmd: setColor.bind(this, color), + undo: setColor.bind(this, savedColor), + post: this._uiManager.updateUI.bind(this._uiManager, this), + mustExec: true, + type: AnnotationEditorParamsType.FREETEXT_COLOR, + overwriteIfSameType: true, + keepUndo: true + }); + } + _translateEmpty(x, y) { + this._uiManager.translateSelectedEditors(x, y, true); + } + getInitialTranslation() { + const scale = this.parentScale; + return [-FreeTextEditor._internalPadding * scale, -(FreeTextEditor._internalPadding + this.#fontSize) * scale]; + } + rebuild() { + if (!this.parent) { + return; + } + super.rebuild(); + if (this.div === null) { + return; + } + if (!this.isAttachedToDOM) { + this.parent.add(this); + } + } + enableEditMode() { + if (this.isInEditMode()) { + return; + } + this.parent.setEditingState(false); + this.parent.updateToolbar(AnnotationEditorType.FREETEXT); + super.enableEditMode(); + this.overlayDiv.classList.remove("enabled"); + this.editorDiv.contentEditable = true; + this._isDraggable = false; + this.div.removeAttribute("aria-activedescendant"); + const signal = this._uiManager._signal; + this.editorDiv.addEventListener("keydown", this.#boundEditorDivKeydown, { + signal + }); + this.editorDiv.addEventListener("focus", this.#boundEditorDivFocus, { + signal + }); + this.editorDiv.addEventListener("blur", this.#boundEditorDivBlur, { + signal + }); + this.editorDiv.addEventListener("input", this.#boundEditorDivInput, { + signal + }); + this.editorDiv.addEventListener("paste", this.#boundEditorDivPaste, { + signal + }); + } + disableEditMode() { + if (!this.isInEditMode()) { + return; + } + this.parent.setEditingState(true); + super.disableEditMode(); + this.overlayDiv.classList.add("enabled"); + this.editorDiv.contentEditable = false; + this.div.setAttribute("aria-activedescendant", this.#editorDivId); + this._isDraggable = true; + this.editorDiv.removeEventListener("keydown", this.#boundEditorDivKeydown); + this.editorDiv.removeEventListener("focus", this.#boundEditorDivFocus); + this.editorDiv.removeEventListener("blur", this.#boundEditorDivBlur); + this.editorDiv.removeEventListener("input", this.#boundEditorDivInput); + this.editorDiv.removeEventListener("paste", this.#boundEditorDivPaste); + this.div.focus({ + preventScroll: true + }); + this.isEditing = false; + this.parent.div.classList.add("freetextEditing"); + } + focusin(event) { + if (!this._focusEventsAllowed) { + return; + } + super.focusin(event); + if (event.target !== this.editorDiv) { + this.editorDiv.focus(); + } + } + onceAdded() { + if (this.width) { + return; + } + this.enableEditMode(); + this.editorDiv.focus(); + if (this._initialOptions?.isCentered) { + this.center(); + } + this._initialOptions = null; + } + isEmpty() { + return !this.editorDiv || this.editorDiv.innerText.trim() === ""; + } + remove() { + this.isEditing = false; + if (this.parent) { + this.parent.setEditingState(true); + this.parent.div.classList.add("freetextEditing"); + } + super.remove(); + } + #extractText() { + const buffer = []; + this.editorDiv.normalize(); + for (const child of this.editorDiv.childNodes) { + buffer.push(FreeTextEditor.#getNodeContent(child)); + } + return buffer.join("\n"); + } + #setEditorDimensions() { + const [parentWidth, parentHeight] = this.parentDimensions; + let rect; + if (this.isAttachedToDOM) { + rect = this.div.getBoundingClientRect(); + } else { + const { + currentLayer, + div + } = this; + const savedDisplay = div.style.display; + const savedVisibility = div.classList.contains("hidden"); + div.classList.remove("hidden"); + div.style.display = "hidden"; + currentLayer.div.append(this.div); + rect = div.getBoundingClientRect(); + div.remove(); + div.style.display = savedDisplay; + div.classList.toggle("hidden", savedVisibility); + } + if (this.rotation % 180 === this.parentRotation % 180) { + this.width = rect.width / parentWidth; + this.height = rect.height / parentHeight; + } else { + this.width = rect.height / parentWidth; + this.height = rect.width / parentHeight; + } + this.fixAndSetPosition(); + } + commit() { + if (!this.isInEditMode()) { + return; + } + super.commit(); + this.disableEditMode(); + const savedText = this.#content; + const newText = this.#content = this.#extractText().trimEnd(); + if (savedText === newText) { + return; + } + const setText = text => { + this.#content = text; + if (!text) { + this.remove(); + return; + } + this.#setContent(); + this._uiManager.rebuild(this); + this.#setEditorDimensions(); + }; + this.addCommands({ + cmd: () => { + setText(newText); + }, + undo: () => { + setText(savedText); + }, + mustExec: false + }); + this.#setEditorDimensions(); + } + shouldGetKeyboardEvents() { + return this.isInEditMode(); + } + enterInEditMode() { + this.enableEditMode(); + this.editorDiv.focus(); + } + dblclick(event) { + this.enterInEditMode(); + } + keydown(event) { + if (event.target === this.div && event.key === "Enter") { + this.enterInEditMode(); + event.preventDefault(); + } + } + editorDivKeydown(event) { + FreeTextEditor._keyboardManager.exec(this, event); + } + editorDivFocus(event) { + this.isEditing = true; + } + editorDivBlur(event) { + this.isEditing = false; + } + editorDivInput(event) { + this.parent.div.classList.toggle("freetextEditing", this.isEmpty()); + } + disableEditing() { + this.editorDiv.setAttribute("role", "comment"); + this.editorDiv.removeAttribute("aria-multiline"); + } + enableEditing() { + this.editorDiv.setAttribute("role", "textbox"); + this.editorDiv.setAttribute("aria-multiline", true); + } + render() { + if (this.div) { + return this.div; + } + let baseX, baseY; + if (this.width) { + baseX = this.x; + baseY = this.y; + } + super.render(); + this.editorDiv = document.createElement("div"); + this.editorDiv.className = "internal"; + this.editorDiv.setAttribute("id", this.#editorDivId); + this.editorDiv.setAttribute("data-l10n-id", "pdfjs-free-text"); + this.enableEditing(); + AnnotationEditor._l10nPromise.get("pdfjs-free-text-default-content").then(msg => this.editorDiv?.setAttribute("default-content", msg)); + this.editorDiv.contentEditable = true; + const { + style + } = this.editorDiv; + style.fontSize = `calc(${this.#fontSize}px * var(--scale-factor))`; + style.color = this.#color; + this.div.append(this.editorDiv); + this.overlayDiv = document.createElement("div"); + this.overlayDiv.classList.add("overlay", "enabled"); + this.div.append(this.overlayDiv); + bindEvents(this, this.div, ["dblclick", "keydown"]); + if (this.width) { + const [parentWidth, parentHeight] = this.parentDimensions; + if (this.annotationElementId) { + const { + position + } = this.#initialData; + let [tx, ty] = this.getInitialTranslation(); + [tx, ty] = this.pageTranslationToScreen(tx, ty); + const [pageWidth, pageHeight] = this.pageDimensions; + const [pageX, pageY] = this.pageTranslation; + let posX, posY; + switch (this.rotation) { + case 0: + posX = baseX + (position[0] - pageX) / pageWidth; + posY = baseY + this.height - (position[1] - pageY) / pageHeight; + break; + case 90: + posX = baseX + (position[0] - pageX) / pageWidth; + posY = baseY - (position[1] - pageY) / pageHeight; + [tx, ty] = [ty, -tx]; + break; + case 180: + posX = baseX - this.width + (position[0] - pageX) / pageWidth; + posY = baseY - (position[1] - pageY) / pageHeight; + [tx, ty] = [-tx, -ty]; + break; + case 270: + posX = baseX + (position[0] - pageX - this.height * pageHeight) / pageWidth; + posY = baseY + (position[1] - pageY - this.width * pageWidth) / pageHeight; + [tx, ty] = [-ty, tx]; + break; + } + this.setAt(posX * parentWidth, posY * parentHeight, tx, ty); + } else { + this.setAt(baseX * parentWidth, baseY * parentHeight, this.width * parentWidth, this.height * parentHeight); + } + this.#setContent(); + this._isDraggable = true; + this.editorDiv.contentEditable = false; + } else { + this._isDraggable = false; + this.editorDiv.contentEditable = true; + } + return this.div; + } + static #getNodeContent(node) { + return (node.nodeType === Node.TEXT_NODE ? node.nodeValue : node.innerText).replaceAll(EOL_PATTERN, ""); + } + editorDivPaste(event) { + const clipboardData = event.clipboardData || window.clipboardData; + const { + types + } = clipboardData; + if (types.length === 1 && types[0] === "text/plain") { + return; + } + event.preventDefault(); + const paste = FreeTextEditor.#deserializeContent(clipboardData.getData("text") || "").replaceAll(EOL_PATTERN, "\n"); + if (!paste) { + return; + } + const selection = window.getSelection(); + if (!selection.rangeCount) { + return; + } + this.editorDiv.normalize(); + selection.deleteFromDocument(); + const range = selection.getRangeAt(0); + if (!paste.includes("\n")) { + range.insertNode(document.createTextNode(paste)); + this.editorDiv.normalize(); + selection.collapseToStart(); + return; + } + const { + startContainer, + startOffset + } = range; + const bufferBefore = []; + const bufferAfter = []; + if (startContainer.nodeType === Node.TEXT_NODE) { + const parent = startContainer.parentElement; + bufferAfter.push(startContainer.nodeValue.slice(startOffset).replaceAll(EOL_PATTERN, "")); + if (parent !== this.editorDiv) { + let buffer = bufferBefore; + for (const child of this.editorDiv.childNodes) { + if (child === parent) { + buffer = bufferAfter; + continue; + } + buffer.push(FreeTextEditor.#getNodeContent(child)); + } + } + bufferBefore.push(startContainer.nodeValue.slice(0, startOffset).replaceAll(EOL_PATTERN, "")); + } else if (startContainer === this.editorDiv) { + let buffer = bufferBefore; + let i = 0; + for (const child of this.editorDiv.childNodes) { + if (i++ === startOffset) { + buffer = bufferAfter; + } + buffer.push(FreeTextEditor.#getNodeContent(child)); + } + } + this.#content = `${bufferBefore.join("\n")}${paste}${bufferAfter.join("\n")}`; + this.#setContent(); + const newRange = new Range(); + let beforeLength = bufferBefore.reduce((acc, line) => acc + line.length, 0); + for (const { + firstChild + } of this.editorDiv.childNodes) { + if (firstChild.nodeType === Node.TEXT_NODE) { + const length = firstChild.nodeValue.length; + if (beforeLength <= length) { + newRange.setStart(firstChild, beforeLength); + newRange.setEnd(firstChild, beforeLength); + break; + } + beforeLength -= length; + } + } + selection.removeAllRanges(); + selection.addRange(newRange); + } + #setContent() { + this.editorDiv.replaceChildren(); + if (!this.#content) { + return; + } + for (const line of this.#content.split("\n")) { + const div = document.createElement("div"); + div.append(line ? document.createTextNode(line) : document.createElement("br")); + this.editorDiv.append(div); + } + } + #serializeContent() { + return this.#content.replaceAll("\xa0", " "); + } + static #deserializeContent(content) { + return content.replaceAll(" ", "\xa0"); + } + get contentDiv() { + return this.editorDiv; + } + static deserialize(data, parent, uiManager) { + let initialData = null; + if (data instanceof FreeTextAnnotationElement) { + const { + data: { + defaultAppearanceData: { + fontSize, + fontColor + }, + rect, + rotation, + id + }, + textContent, + textPosition, + parent: { + page: { + pageNumber + } + } + } = data; + if (!textContent || textContent.length === 0) { + return null; + } + initialData = data = { + annotationType: AnnotationEditorType.FREETEXT, + color: Array.from(fontColor), + fontSize, + value: textContent.join("\n"), + position: textPosition, + pageIndex: pageNumber - 1, + rect: rect.slice(0), + rotation, + id, + deleted: false + }; + } + const editor = super.deserialize(data, parent, uiManager); + editor.#fontSize = data.fontSize; + editor.#color = Util.makeHexColor(...data.color); + editor.#content = FreeTextEditor.#deserializeContent(data.value); + editor.annotationElementId = data.id || null; + editor.#initialData = initialData; + return editor; + } + serialize(isForCopying = false) { + if (this.isEmpty()) { + return null; + } + if (this.deleted) { + return { + pageIndex: this.pageIndex, + id: this.annotationElementId, + deleted: true + }; + } + const padding = FreeTextEditor._internalPadding * this.parentScale; + const rect = this.getRect(padding, padding); + const color = AnnotationEditor._colorManager.convert(this.isAttachedToDOM ? getComputedStyle(this.editorDiv).color : this.#color); + const serialized = { + annotationType: AnnotationEditorType.FREETEXT, + color, + fontSize: this.#fontSize, + value: this.#serializeContent(), + pageIndex: this.pageIndex, + rect, + rotation: this.rotation, + structTreeParentId: this._structTreeParentId + }; + if (isForCopying) { + return serialized; + } + if (this.annotationElementId && !this.#hasElementChanged(serialized)) { + return null; + } + serialized.id = this.annotationElementId; + return serialized; + } + #hasElementChanged(serialized) { + const { + value, + fontSize, + color, + pageIndex + } = this.#initialData; + return this._hasBeenMoved || serialized.value !== value || serialized.fontSize !== fontSize || serialized.color.some((c, i) => c !== color[i]) || serialized.pageIndex !== pageIndex; + } + renderAnnotationElement(annotation) { + const content = super.renderAnnotationElement(annotation); + if (this.deleted) { + return content; + } + const { + style + } = content; + style.fontSize = `calc(${this.#fontSize}px * var(--scale-factor))`; + style.color = this.#color; + content.replaceChildren(); + for (const line of this.#content.split("\n")) { + const div = document.createElement("div"); + div.append(line ? document.createTextNode(line) : document.createElement("br")); + content.append(div); + } + const padding = FreeTextEditor._internalPadding * this.parentScale; + annotation.updateEdited({ + rect: this.getRect(padding, padding), + popupContent: this.#content + }); + return content; + } + resetAnnotationElement(annotation) { + super.resetAnnotationElement(annotation); + annotation.resetEdited(); + } +} + +;// CONCATENATED MODULE: ./src/display/editor/outliner.js + +class Outliner { + #box; + #verticalEdges = []; + #intervals = []; + constructor(boxes, borderWidth = 0, innerMargin = 0, isLTR = true) { + let minX = Infinity; + let maxX = -Infinity; + let minY = Infinity; + let maxY = -Infinity; + const NUMBER_OF_DIGITS = 4; + const EPSILON = 10 ** -NUMBER_OF_DIGITS; + for (const { + x, + y, + width, + height + } of boxes) { + const x1 = Math.floor((x - borderWidth) / EPSILON) * EPSILON; + const x2 = Math.ceil((x + width + borderWidth) / EPSILON) * EPSILON; + const y1 = Math.floor((y - borderWidth) / EPSILON) * EPSILON; + const y2 = Math.ceil((y + height + borderWidth) / EPSILON) * EPSILON; + const left = [x1, y1, y2, true]; + const right = [x2, y1, y2, false]; + this.#verticalEdges.push(left, right); + minX = Math.min(minX, x1); + maxX = Math.max(maxX, x2); + minY = Math.min(minY, y1); + maxY = Math.max(maxY, y2); + } + const bboxWidth = maxX - minX + 2 * innerMargin; + const bboxHeight = maxY - minY + 2 * innerMargin; + const shiftedMinX = minX - innerMargin; + const shiftedMinY = minY - innerMargin; + const lastEdge = this.#verticalEdges.at(isLTR ? -1 : -2); + const lastPoint = [lastEdge[0], lastEdge[2]]; + for (const edge of this.#verticalEdges) { + const [x, y1, y2] = edge; + edge[0] = (x - shiftedMinX) / bboxWidth; + edge[1] = (y1 - shiftedMinY) / bboxHeight; + edge[2] = (y2 - shiftedMinY) / bboxHeight; + } + this.#box = { + x: shiftedMinX, + y: shiftedMinY, + width: bboxWidth, + height: bboxHeight, + lastPoint + }; + } + getOutlines() { + this.#verticalEdges.sort((a, b) => a[0] - b[0] || a[1] - b[1] || a[2] - b[2]); + const outlineVerticalEdges = []; + for (const edge of this.#verticalEdges) { + if (edge[3]) { + outlineVerticalEdges.push(...this.#breakEdge(edge)); + this.#insert(edge); + } else { + this.#remove(edge); + outlineVerticalEdges.push(...this.#breakEdge(edge)); + } + } + return this.#getOutlines(outlineVerticalEdges); + } + #getOutlines(outlineVerticalEdges) { + const edges = []; + const allEdges = new Set(); + for (const edge of outlineVerticalEdges) { + const [x, y1, y2] = edge; + edges.push([x, y1, edge], [x, y2, edge]); + } + edges.sort((a, b) => a[1] - b[1] || a[0] - b[0]); + for (let i = 0, ii = edges.length; i < ii; i += 2) { + const edge1 = edges[i][2]; + const edge2 = edges[i + 1][2]; + edge1.push(edge2); + edge2.push(edge1); + allEdges.add(edge1); + allEdges.add(edge2); + } + const outlines = []; + let outline; + while (allEdges.size > 0) { + const edge = allEdges.values().next().value; + let [x, y1, y2, edge1, edge2] = edge; + allEdges.delete(edge); + let lastPointX = x; + let lastPointY = y1; + outline = [x, y2]; + outlines.push(outline); + while (true) { + let e; + if (allEdges.has(edge1)) { + e = edge1; + } else if (allEdges.has(edge2)) { + e = edge2; + } else { + break; + } + allEdges.delete(e); + [x, y1, y2, edge1, edge2] = e; + if (lastPointX !== x) { + outline.push(lastPointX, lastPointY, x, lastPointY === y1 ? y1 : y2); + lastPointX = x; + } + lastPointY = lastPointY === y1 ? y2 : y1; + } + outline.push(lastPointX, lastPointY); + } + return new HighlightOutline(outlines, this.#box); + } + #binarySearch(y) { + const array = this.#intervals; + let start = 0; + let end = array.length - 1; + while (start <= end) { + const middle = start + end >> 1; + const y1 = array[middle][0]; + if (y1 === y) { + return middle; + } + if (y1 < y) { + start = middle + 1; + } else { + end = middle - 1; + } + } + return end + 1; + } + #insert([, y1, y2]) { + const index = this.#binarySearch(y1); + this.#intervals.splice(index, 0, [y1, y2]); + } + #remove([, y1, y2]) { + const index = this.#binarySearch(y1); + for (let i = index; i < this.#intervals.length; i++) { + const [start, end] = this.#intervals[i]; + if (start !== y1) { + break; + } + if (start === y1 && end === y2) { + this.#intervals.splice(i, 1); + return; + } + } + for (let i = index - 1; i >= 0; i--) { + const [start, end] = this.#intervals[i]; + if (start !== y1) { + break; + } + if (start === y1 && end === y2) { + this.#intervals.splice(i, 1); + return; + } + } + } + #breakEdge(edge) { + const [x, y1, y2] = edge; + const results = [[x, y1, y2]]; + const index = this.#binarySearch(y2); + for (let i = 0; i < index; i++) { + const [start, end] = this.#intervals[i]; + for (let j = 0, jj = results.length; j < jj; j++) { + const [, y3, y4] = results[j]; + if (end <= y3 || y4 <= start) { + continue; + } + if (y3 >= start) { + if (y4 > end) { + results[j][1] = end; + } else { + if (jj === 1) { + return []; + } + results.splice(j, 1); + j--; + jj--; + } + continue; + } + results[j][2] = start; + if (y4 > end) { + results.push([x, end, y4]); + } + } + } + return results; + } +} +class Outline { + toSVGPath() { + throw new Error("Abstract method `toSVGPath` must be implemented."); + } + get box() { + throw new Error("Abstract getter `box` must be implemented."); + } + serialize(_bbox, _rotation) { + throw new Error("Abstract method `serialize` must be implemented."); + } + get free() { + return this instanceof FreeHighlightOutline; + } +} +class HighlightOutline extends Outline { + #box; + #outlines; + constructor(outlines, box) { + super(); + this.#outlines = outlines; + this.#box = box; + } + toSVGPath() { + const buffer = []; + for (const polygon of this.#outlines) { + let [prevX, prevY] = polygon; + buffer.push(`M${prevX} ${prevY}`); + for (let i = 2; i < polygon.length; i += 2) { + const x = polygon[i]; + const y = polygon[i + 1]; + if (x === prevX) { + buffer.push(`V${y}`); + prevY = y; + } else if (y === prevY) { + buffer.push(`H${x}`); + prevX = x; + } + } + buffer.push("Z"); + } + return buffer.join(" "); + } + serialize([blX, blY, trX, trY], _rotation) { + const outlines = []; + const width = trX - blX; + const height = trY - blY; + for (const outline of this.#outlines) { + const points = new Array(outline.length); + for (let i = 0; i < outline.length; i += 2) { + points[i] = blX + outline[i] * width; + points[i + 1] = trY - outline[i + 1] * height; + } + outlines.push(points); + } + return outlines; + } + get box() { + return this.#box; + } +} +class FreeOutliner { + #box; + #bottom = []; + #innerMargin; + #isLTR; + #top = []; + #last = new Float64Array(18); + #lastX; + #lastY; + #min; + #min_dist; + #scaleFactor; + #thickness; + #points = []; + static #MIN_DIST = 8; + static #MIN_DIFF = 2; + static #MIN = FreeOutliner.#MIN_DIST + FreeOutliner.#MIN_DIFF; + constructor({ + x, + y + }, box, scaleFactor, thickness, isLTR, innerMargin = 0) { + this.#box = box; + this.#thickness = thickness * scaleFactor; + this.#isLTR = isLTR; + this.#last.set([NaN, NaN, NaN, NaN, x, y], 6); + this.#innerMargin = innerMargin; + this.#min_dist = FreeOutliner.#MIN_DIST * scaleFactor; + this.#min = FreeOutliner.#MIN * scaleFactor; + this.#scaleFactor = scaleFactor; + this.#points.push(x, y); + } + get free() { + return true; + } + isEmpty() { + return isNaN(this.#last[8]); + } + #getLastCoords() { + const lastTop = this.#last.subarray(4, 6); + const lastBottom = this.#last.subarray(16, 18); + const [x, y, width, height] = this.#box; + return [(this.#lastX + (lastTop[0] - lastBottom[0]) / 2 - x) / width, (this.#lastY + (lastTop[1] - lastBottom[1]) / 2 - y) / height, (this.#lastX + (lastBottom[0] - lastTop[0]) / 2 - x) / width, (this.#lastY + (lastBottom[1] - lastTop[1]) / 2 - y) / height]; + } + add({ + x, + y + }) { + this.#lastX = x; + this.#lastY = y; + const [layerX, layerY, layerWidth, layerHeight] = this.#box; + let [x1, y1, x2, y2] = this.#last.subarray(8, 12); + const diffX = x - x2; + const diffY = y - y2; + const d = Math.hypot(diffX, diffY); + if (d < this.#min) { + return false; + } + const diffD = d - this.#min_dist; + const K = diffD / d; + const shiftX = K * diffX; + const shiftY = K * diffY; + let x0 = x1; + let y0 = y1; + x1 = x2; + y1 = y2; + x2 += shiftX; + y2 += shiftY; + this.#points?.push(x, y); + const nX = -shiftY / diffD; + const nY = shiftX / diffD; + const thX = nX * this.#thickness; + const thY = nY * this.#thickness; + this.#last.set(this.#last.subarray(2, 8), 0); + this.#last.set([x2 + thX, y2 + thY], 4); + this.#last.set(this.#last.subarray(14, 18), 12); + this.#last.set([x2 - thX, y2 - thY], 16); + if (isNaN(this.#last[6])) { + if (this.#top.length === 0) { + this.#last.set([x1 + thX, y1 + thY], 2); + this.#top.push(NaN, NaN, NaN, NaN, (x1 + thX - layerX) / layerWidth, (y1 + thY - layerY) / layerHeight); + this.#last.set([x1 - thX, y1 - thY], 14); + this.#bottom.push(NaN, NaN, NaN, NaN, (x1 - thX - layerX) / layerWidth, (y1 - thY - layerY) / layerHeight); + } + this.#last.set([x0, y0, x1, y1, x2, y2], 6); + return !this.isEmpty(); + } + this.#last.set([x0, y0, x1, y1, x2, y2], 6); + const angle = Math.abs(Math.atan2(y0 - y1, x0 - x1) - Math.atan2(shiftY, shiftX)); + if (angle < Math.PI / 2) { + [x1, y1, x2, y2] = this.#last.subarray(2, 6); + this.#top.push(NaN, NaN, NaN, NaN, ((x1 + x2) / 2 - layerX) / layerWidth, ((y1 + y2) / 2 - layerY) / layerHeight); + [x1, y1, x0, y0] = this.#last.subarray(14, 18); + this.#bottom.push(NaN, NaN, NaN, NaN, ((x0 + x1) / 2 - layerX) / layerWidth, ((y0 + y1) / 2 - layerY) / layerHeight); + return true; + } + [x0, y0, x1, y1, x2, y2] = this.#last.subarray(0, 6); + this.#top.push(((x0 + 5 * x1) / 6 - layerX) / layerWidth, ((y0 + 5 * y1) / 6 - layerY) / layerHeight, ((5 * x1 + x2) / 6 - layerX) / layerWidth, ((5 * y1 + y2) / 6 - layerY) / layerHeight, ((x1 + x2) / 2 - layerX) / layerWidth, ((y1 + y2) / 2 - layerY) / layerHeight); + [x2, y2, x1, y1, x0, y0] = this.#last.subarray(12, 18); + this.#bottom.push(((x0 + 5 * x1) / 6 - layerX) / layerWidth, ((y0 + 5 * y1) / 6 - layerY) / layerHeight, ((5 * x1 + x2) / 6 - layerX) / layerWidth, ((5 * y1 + y2) / 6 - layerY) / layerHeight, ((x1 + x2) / 2 - layerX) / layerWidth, ((y1 + y2) / 2 - layerY) / layerHeight); + return true; + } + toSVGPath() { + if (this.isEmpty()) { + return ""; + } + const top = this.#top; + const bottom = this.#bottom; + const lastTop = this.#last.subarray(4, 6); + const lastBottom = this.#last.subarray(16, 18); + const [x, y, width, height] = this.#box; + const [lastTopX, lastTopY, lastBottomX, lastBottomY] = this.#getLastCoords(); + if (isNaN(this.#last[6]) && !this.isEmpty()) { + return `M${(this.#last[2] - x) / width} ${(this.#last[3] - y) / height} L${(this.#last[4] - x) / width} ${(this.#last[5] - y) / height} L${lastTopX} ${lastTopY} L${lastBottomX} ${lastBottomY} L${(this.#last[16] - x) / width} ${(this.#last[17] - y) / height} L${(this.#last[14] - x) / width} ${(this.#last[15] - y) / height} Z`; + } + const buffer = []; + buffer.push(`M${top[4]} ${top[5]}`); + for (let i = 6; i < top.length; i += 6) { + if (isNaN(top[i])) { + buffer.push(`L${top[i + 4]} ${top[i + 5]}`); + } else { + buffer.push(`C${top[i]} ${top[i + 1]} ${top[i + 2]} ${top[i + 3]} ${top[i + 4]} ${top[i + 5]}`); + } + } + buffer.push(`L${(lastTop[0] - x) / width} ${(lastTop[1] - y) / height} L${lastTopX} ${lastTopY} L${lastBottomX} ${lastBottomY} L${(lastBottom[0] - x) / width} ${(lastBottom[1] - y) / height}`); + for (let i = bottom.length - 6; i >= 6; i -= 6) { + if (isNaN(bottom[i])) { + buffer.push(`L${bottom[i + 4]} ${bottom[i + 5]}`); + } else { + buffer.push(`C${bottom[i]} ${bottom[i + 1]} ${bottom[i + 2]} ${bottom[i + 3]} ${bottom[i + 4]} ${bottom[i + 5]}`); + } + } + buffer.push(`L${bottom[4]} ${bottom[5]} Z`); + return buffer.join(" "); + } + getOutlines() { + const top = this.#top; + const bottom = this.#bottom; + const last = this.#last; + const lastTop = last.subarray(4, 6); + const lastBottom = last.subarray(16, 18); + const [layerX, layerY, layerWidth, layerHeight] = this.#box; + const points = new Float64Array((this.#points?.length ?? 0) + 2); + for (let i = 0, ii = points.length - 2; i < ii; i += 2) { + points[i] = (this.#points[i] - layerX) / layerWidth; + points[i + 1] = (this.#points[i + 1] - layerY) / layerHeight; + } + points[points.length - 2] = (this.#lastX - layerX) / layerWidth; + points[points.length - 1] = (this.#lastY - layerY) / layerHeight; + const [lastTopX, lastTopY, lastBottomX, lastBottomY] = this.#getLastCoords(); + if (isNaN(last[6]) && !this.isEmpty()) { + const outline = new Float64Array(36); + outline.set([NaN, NaN, NaN, NaN, (last[2] - layerX) / layerWidth, (last[3] - layerY) / layerHeight, NaN, NaN, NaN, NaN, (last[4] - layerX) / layerWidth, (last[5] - layerY) / layerHeight, NaN, NaN, NaN, NaN, lastTopX, lastTopY, NaN, NaN, NaN, NaN, lastBottomX, lastBottomY, NaN, NaN, NaN, NaN, (last[16] - layerX) / layerWidth, (last[17] - layerY) / layerHeight, NaN, NaN, NaN, NaN, (last[14] - layerX) / layerWidth, (last[15] - layerY) / layerHeight], 0); + return new FreeHighlightOutline(outline, points, this.#box, this.#scaleFactor, this.#innerMargin, this.#isLTR); + } + const outline = new Float64Array(this.#top.length + 24 + this.#bottom.length); + let N = top.length; + for (let i = 0; i < N; i += 2) { + if (isNaN(top[i])) { + outline[i] = outline[i + 1] = NaN; + continue; + } + outline[i] = top[i]; + outline[i + 1] = top[i + 1]; + } + outline.set([NaN, NaN, NaN, NaN, (lastTop[0] - layerX) / layerWidth, (lastTop[1] - layerY) / layerHeight, NaN, NaN, NaN, NaN, lastTopX, lastTopY, NaN, NaN, NaN, NaN, lastBottomX, lastBottomY, NaN, NaN, NaN, NaN, (lastBottom[0] - layerX) / layerWidth, (lastBottom[1] - layerY) / layerHeight], N); + N += 24; + for (let i = bottom.length - 6; i >= 6; i -= 6) { + for (let j = 0; j < 6; j += 2) { + if (isNaN(bottom[i + j])) { + outline[N] = outline[N + 1] = NaN; + N += 2; + continue; + } + outline[N] = bottom[i + j]; + outline[N + 1] = bottom[i + j + 1]; + N += 2; + } + } + outline.set([NaN, NaN, NaN, NaN, bottom[4], bottom[5]], N); + return new FreeHighlightOutline(outline, points, this.#box, this.#scaleFactor, this.#innerMargin, this.#isLTR); + } +} +class FreeHighlightOutline extends Outline { + #box; + #bbox = null; + #innerMargin; + #isLTR; + #points; + #scaleFactor; + #outline; + constructor(outline, points, box, scaleFactor, innerMargin, isLTR) { + super(); + this.#outline = outline; + this.#points = points; + this.#box = box; + this.#scaleFactor = scaleFactor; + this.#innerMargin = innerMargin; + this.#isLTR = isLTR; + this.#computeMinMax(isLTR); + const { + x, + y, + width, + height + } = this.#bbox; + for (let i = 0, ii = outline.length; i < ii; i += 2) { + outline[i] = (outline[i] - x) / width; + outline[i + 1] = (outline[i + 1] - y) / height; + } + for (let i = 0, ii = points.length; i < ii; i += 2) { + points[i] = (points[i] - x) / width; + points[i + 1] = (points[i + 1] - y) / height; + } + } + toSVGPath() { + const buffer = [`M${this.#outline[4]} ${this.#outline[5]}`]; + for (let i = 6, ii = this.#outline.length; i < ii; i += 6) { + if (isNaN(this.#outline[i])) { + buffer.push(`L${this.#outline[i + 4]} ${this.#outline[i + 5]}`); + continue; + } + buffer.push(`C${this.#outline[i]} ${this.#outline[i + 1]} ${this.#outline[i + 2]} ${this.#outline[i + 3]} ${this.#outline[i + 4]} ${this.#outline[i + 5]}`); + } + buffer.push("Z"); + return buffer.join(" "); + } + serialize([blX, blY, trX, trY], rotation) { + const width = trX - blX; + const height = trY - blY; + let outline; + let points; + switch (rotation) { + case 0: + outline = this.#rescale(this.#outline, blX, trY, width, -height); + points = this.#rescale(this.#points, blX, trY, width, -height); + break; + case 90: + outline = this.#rescaleAndSwap(this.#outline, blX, blY, width, height); + points = this.#rescaleAndSwap(this.#points, blX, blY, width, height); + break; + case 180: + outline = this.#rescale(this.#outline, trX, blY, -width, height); + points = this.#rescale(this.#points, trX, blY, -width, height); + break; + case 270: + outline = this.#rescaleAndSwap(this.#outline, trX, trY, -width, -height); + points = this.#rescaleAndSwap(this.#points, trX, trY, -width, -height); + break; + } + return { + outline: Array.from(outline), + points: [Array.from(points)] + }; + } + #rescale(src, tx, ty, sx, sy) { + const dest = new Float64Array(src.length); + for (let i = 0, ii = src.length; i < ii; i += 2) { + dest[i] = tx + src[i] * sx; + dest[i + 1] = ty + src[i + 1] * sy; + } + return dest; + } + #rescaleAndSwap(src, tx, ty, sx, sy) { + const dest = new Float64Array(src.length); + for (let i = 0, ii = src.length; i < ii; i += 2) { + dest[i] = tx + src[i + 1] * sx; + dest[i + 1] = ty + src[i] * sy; + } + return dest; + } + #computeMinMax(isLTR) { + const outline = this.#outline; + let lastX = outline[4]; + let lastY = outline[5]; + let minX = lastX; + let minY = lastY; + let maxX = lastX; + let maxY = lastY; + let lastPointX = lastX; + let lastPointY = lastY; + const ltrCallback = isLTR ? Math.max : Math.min; + for (let i = 6, ii = outline.length; i < ii; i += 6) { + if (isNaN(outline[i])) { + minX = Math.min(minX, outline[i + 4]); + minY = Math.min(minY, outline[i + 5]); + maxX = Math.max(maxX, outline[i + 4]); + maxY = Math.max(maxY, outline[i + 5]); + if (lastPointY < outline[i + 5]) { + lastPointX = outline[i + 4]; + lastPointY = outline[i + 5]; + } else if (lastPointY === outline[i + 5]) { + lastPointX = ltrCallback(lastPointX, outline[i + 4]); + } + } else { + const bbox = Util.bezierBoundingBox(lastX, lastY, ...outline.slice(i, i + 6)); + minX = Math.min(minX, bbox[0]); + minY = Math.min(minY, bbox[1]); + maxX = Math.max(maxX, bbox[2]); + maxY = Math.max(maxY, bbox[3]); + if (lastPointY < bbox[3]) { + lastPointX = bbox[2]; + lastPointY = bbox[3]; + } else if (lastPointY === bbox[3]) { + lastPointX = ltrCallback(lastPointX, bbox[2]); + } + } + lastX = outline[i + 4]; + lastY = outline[i + 5]; + } + const x = minX - this.#innerMargin, + y = minY - this.#innerMargin, + width = maxX - minX + 2 * this.#innerMargin, + height = maxY - minY + 2 * this.#innerMargin; + this.#bbox = { + x, + y, + width, + height, + lastPoint: [lastPointX, lastPointY] + }; + } + get box() { + return this.#bbox; + } + getNewOutline(thickness, innerMargin) { + const { + x, + y, + width, + height + } = this.#bbox; + const [layerX, layerY, layerWidth, layerHeight] = this.#box; + const sx = width * layerWidth; + const sy = height * layerHeight; + const tx = x * layerWidth + layerX; + const ty = y * layerHeight + layerY; + const outliner = new FreeOutliner({ + x: this.#points[0] * sx + tx, + y: this.#points[1] * sy + ty + }, this.#box, this.#scaleFactor, thickness, this.#isLTR, innerMargin ?? this.#innerMargin); + for (let i = 2; i < this.#points.length; i += 2) { + outliner.add({ + x: this.#points[i] * sx + tx, + y: this.#points[i + 1] * sy + ty + }); + } + return outliner.getOutlines(); + } +} + +;// CONCATENATED MODULE: ./src/display/editor/color_picker.js + + + +class ColorPicker { + #boundKeyDown = this.#keyDown.bind(this); + #boundPointerDown = this.#pointerDown.bind(this); + #button = null; + #buttonSwatch = null; + #defaultColor; + #dropdown = null; + #dropdownWasFromKeyboard = false; + #isMainColorPicker = false; + #editor = null; + #eventBus; + #uiManager = null; + #type; + static get _keyboardManager() { + return shadow(this, "_keyboardManager", new KeyboardManager([[["Escape", "mac+Escape"], ColorPicker.prototype._hideDropdownFromKeyboard], [[" ", "mac+ "], ColorPicker.prototype._colorSelectFromKeyboard], [["ArrowDown", "ArrowRight", "mac+ArrowDown", "mac+ArrowRight"], ColorPicker.prototype._moveToNext], [["ArrowUp", "ArrowLeft", "mac+ArrowUp", "mac+ArrowLeft"], ColorPicker.prototype._moveToPrevious], [["Home", "mac+Home"], ColorPicker.prototype._moveToBeginning], [["End", "mac+End"], ColorPicker.prototype._moveToEnd]])); + } + constructor({ + editor = null, + uiManager = null + }) { + if (editor) { + this.#isMainColorPicker = false; + this.#type = AnnotationEditorParamsType.HIGHLIGHT_COLOR; + this.#editor = editor; + } else { + this.#isMainColorPicker = true; + this.#type = AnnotationEditorParamsType.HIGHLIGHT_DEFAULT_COLOR; + } + this.#uiManager = editor?._uiManager || uiManager; + this.#eventBus = this.#uiManager._eventBus; + this.#defaultColor = editor?.color || this.#uiManager?.highlightColors.values().next().value || "#FFFF98"; + } + renderButton() { + const button = this.#button = document.createElement("button"); + button.className = "colorPicker"; + button.tabIndex = "0"; + button.setAttribute("data-l10n-id", "pdfjs-editor-colorpicker-button"); + button.setAttribute("aria-haspopup", true); + const signal = this.#uiManager._signal; + button.addEventListener("click", this.#openDropdown.bind(this), { + signal + }); + button.addEventListener("keydown", this.#boundKeyDown, { + signal + }); + const swatch = this.#buttonSwatch = document.createElement("span"); + swatch.className = "swatch"; + swatch.setAttribute("aria-hidden", true); + swatch.style.backgroundColor = this.#defaultColor; + button.append(swatch); + return button; + } + renderMainDropdown() { + const dropdown = this.#dropdown = this.#getDropdownRoot(); + dropdown.setAttribute("aria-orientation", "horizontal"); + dropdown.setAttribute("aria-labelledby", "highlightColorPickerLabel"); + return dropdown; + } + #getDropdownRoot() { + const div = document.createElement("div"); + const signal = this.#uiManager._signal; + div.addEventListener("contextmenu", noContextMenu, { + signal + }); + div.className = "dropdown"; + div.role = "listbox"; + div.setAttribute("aria-multiselectable", false); + div.setAttribute("aria-orientation", "vertical"); + div.setAttribute("data-l10n-id", "pdfjs-editor-colorpicker-dropdown"); + for (const [name, color] of this.#uiManager.highlightColors) { + const button = document.createElement("button"); + button.tabIndex = "0"; + button.role = "option"; + button.setAttribute("data-color", color); + button.title = name; + button.setAttribute("data-l10n-id", `pdfjs-editor-colorpicker-${name}`); + const swatch = document.createElement("span"); + button.append(swatch); + swatch.className = "swatch"; + swatch.style.backgroundColor = color; + button.setAttribute("aria-selected", color === this.#defaultColor); + button.addEventListener("click", this.#colorSelect.bind(this, color), { + signal + }); + div.append(button); + } + div.addEventListener("keydown", this.#boundKeyDown, { + signal + }); + return div; + } + #colorSelect(color, event) { + event.stopPropagation(); + this.#eventBus.dispatch("switchannotationeditorparams", { + source: this, + type: this.#type, + value: color + }); + } + _colorSelectFromKeyboard(event) { + if (event.target === this.#button) { + this.#openDropdown(event); + return; + } + const color = event.target.getAttribute("data-color"); + if (!color) { + return; + } + this.#colorSelect(color, event); + } + _moveToNext(event) { + if (!this.#isDropdownVisible) { + this.#openDropdown(event); + return; + } + if (event.target === this.#button) { + this.#dropdown.firstChild?.focus(); + return; + } + event.target.nextSibling?.focus(); + } + _moveToPrevious(event) { + if (event.target === this.#dropdown?.firstChild || event.target === this.#button) { + if (this.#isDropdownVisible) { + this._hideDropdownFromKeyboard(); + } + return; + } + if (!this.#isDropdownVisible) { + this.#openDropdown(event); + } + event.target.previousSibling?.focus(); + } + _moveToBeginning(event) { + if (!this.#isDropdownVisible) { + this.#openDropdown(event); + return; + } + this.#dropdown.firstChild?.focus(); + } + _moveToEnd(event) { + if (!this.#isDropdownVisible) { + this.#openDropdown(event); + return; + } + this.#dropdown.lastChild?.focus(); + } + #keyDown(event) { + ColorPicker._keyboardManager.exec(this, event); + } + #openDropdown(event) { + if (this.#isDropdownVisible) { + this.hideDropdown(); + return; + } + this.#dropdownWasFromKeyboard = event.detail === 0; + window.addEventListener("pointerdown", this.#boundPointerDown, { + signal: this.#uiManager._signal + }); + if (this.#dropdown) { + this.#dropdown.classList.remove("hidden"); + return; + } + const root = this.#dropdown = this.#getDropdownRoot(); + this.#button.append(root); + } + #pointerDown(event) { + if (this.#dropdown?.contains(event.target)) { + return; + } + this.hideDropdown(); + } + hideDropdown() { + this.#dropdown?.classList.add("hidden"); + window.removeEventListener("pointerdown", this.#boundPointerDown); + } + get #isDropdownVisible() { + return this.#dropdown && !this.#dropdown.classList.contains("hidden"); + } + _hideDropdownFromKeyboard() { + if (this.#isMainColorPicker) { + return; + } + if (!this.#isDropdownVisible) { + this.#editor?.unselect(); + return; + } + this.hideDropdown(); + this.#button.focus({ + preventScroll: true, + focusVisible: this.#dropdownWasFromKeyboard + }); + } + updateColor(color) { + if (this.#buttonSwatch) { + this.#buttonSwatch.style.backgroundColor = color; + } + if (!this.#dropdown) { + return; + } + const i = this.#uiManager.highlightColors.values(); + for (const child of this.#dropdown.children) { + child.setAttribute("aria-selected", i.next().value === color); + } + } + destroy() { + this.#button?.remove(); + this.#button = null; + this.#buttonSwatch = null; + this.#dropdown?.remove(); + this.#dropdown = null; + } +} + +;// CONCATENATED MODULE: ./src/display/editor/highlight.js + + + + + + +class HighlightEditor extends AnnotationEditor { + #anchorNode = null; + #anchorOffset = 0; + #boxes; + #clipPathId = null; + #colorPicker = null; + #focusOutlines = null; + #focusNode = null; + #focusOffset = 0; + #highlightDiv = null; + #highlightOutlines = null; + #id = null; + #isFreeHighlight = false; + #boundKeydown = this.#keydown.bind(this); + #lastPoint = null; + #opacity; + #outlineId = null; + #text = ""; + #thickness; + #methodOfCreation = ""; + static _defaultColor = null; + static _defaultOpacity = 1; + static _defaultThickness = 12; + static _l10nPromise; + static _type = "highlight"; + static _editorType = AnnotationEditorType.HIGHLIGHT; + static _freeHighlightId = -1; + static _freeHighlight = null; + static _freeHighlightClipId = ""; + static get _keyboardManager() { + const proto = HighlightEditor.prototype; + return shadow(this, "_keyboardManager", new KeyboardManager([[["ArrowLeft", "mac+ArrowLeft"], proto._moveCaret, { + args: [0] + }], [["ArrowRight", "mac+ArrowRight"], proto._moveCaret, { + args: [1] + }], [["ArrowUp", "mac+ArrowUp"], proto._moveCaret, { + args: [2] + }], [["ArrowDown", "mac+ArrowDown"], proto._moveCaret, { + args: [3] + }]])); + } + constructor(params) { + super({ + ...params, + name: "highlightEditor" + }); + this.color = params.color || HighlightEditor._defaultColor; + this.#thickness = params.thickness || HighlightEditor._defaultThickness; + this.#opacity = params.opacity || HighlightEditor._defaultOpacity; + this.#boxes = params.boxes || null; + this.#methodOfCreation = params.methodOfCreation || ""; + this.#text = params.text || ""; + this._isDraggable = false; + if (params.highlightId > -1) { + this.#isFreeHighlight = true; + this.#createFreeOutlines(params); + this.#addToDrawLayer(); + } else { + this.#anchorNode = params.anchorNode; + this.#anchorOffset = params.anchorOffset; + this.#focusNode = params.focusNode; + this.#focusOffset = params.focusOffset; + this.#createOutlines(); + this.#addToDrawLayer(); + this.rotate(this.rotation); + } + } + get telemetryInitialData() { + return { + action: "added", + type: this.#isFreeHighlight ? "free_highlight" : "highlight", + color: this._uiManager.highlightColorNames.get(this.color), + thickness: this.#thickness, + methodOfCreation: this.#methodOfCreation + }; + } + get telemetryFinalData() { + return { + type: "highlight", + color: this._uiManager.highlightColorNames.get(this.color) + }; + } + static computeTelemetryFinalData(data) { + return { + numberOfColors: data.get("color").size + }; + } + #createOutlines() { + const outliner = new Outliner(this.#boxes, 0.001); + this.#highlightOutlines = outliner.getOutlines(); + ({ + x: this.x, + y: this.y, + width: this.width, + height: this.height + } = this.#highlightOutlines.box); + const outlinerForOutline = new Outliner(this.#boxes, 0.0025, 0.001, this._uiManager.direction === "ltr"); + this.#focusOutlines = outlinerForOutline.getOutlines(); + const { + lastPoint + } = this.#focusOutlines.box; + this.#lastPoint = [(lastPoint[0] - this.x) / this.width, (lastPoint[1] - this.y) / this.height]; + } + #createFreeOutlines({ + highlightOutlines, + highlightId, + clipPathId + }) { + this.#highlightOutlines = highlightOutlines; + const extraThickness = 1.5; + this.#focusOutlines = highlightOutlines.getNewOutline(this.#thickness / 2 + extraThickness, 0.0025); + if (highlightId >= 0) { + this.#id = highlightId; + this.#clipPathId = clipPathId; + this.parent.drawLayer.finalizeLine(highlightId, highlightOutlines); + this.#outlineId = this.parent.drawLayer.highlightOutline(this.#focusOutlines); + } else if (this.parent) { + const angle = this.parent.viewport.rotation; + this.parent.drawLayer.updateLine(this.#id, highlightOutlines); + this.parent.drawLayer.updateBox(this.#id, HighlightEditor.#rotateBbox(this.#highlightOutlines.box, (angle - this.rotation + 360) % 360)); + this.parent.drawLayer.updateLine(this.#outlineId, this.#focusOutlines); + this.parent.drawLayer.updateBox(this.#outlineId, HighlightEditor.#rotateBbox(this.#focusOutlines.box, angle)); + } + const { + x, + y, + width, + height + } = highlightOutlines.box; + switch (this.rotation) { + case 0: + this.x = x; + this.y = y; + this.width = width; + this.height = height; + break; + case 90: + { + const [pageWidth, pageHeight] = this.parentDimensions; + this.x = y; + this.y = 1 - x; + this.width = width * pageHeight / pageWidth; + this.height = height * pageWidth / pageHeight; + break; + } + case 180: + this.x = 1 - x; + this.y = 1 - y; + this.width = width; + this.height = height; + break; + case 270: + { + const [pageWidth, pageHeight] = this.parentDimensions; + this.x = 1 - y; + this.y = x; + this.width = width * pageHeight / pageWidth; + this.height = height * pageWidth / pageHeight; + break; + } + } + const { + lastPoint + } = this.#focusOutlines.box; + this.#lastPoint = [(lastPoint[0] - x) / width, (lastPoint[1] - y) / height]; + } + static initialize(l10n, uiManager) { + AnnotationEditor.initialize(l10n, uiManager); + HighlightEditor._defaultColor ||= uiManager.highlightColors?.values().next().value || "#fff066"; + } + static updateDefaultParams(type, value) { + switch (type) { + case AnnotationEditorParamsType.HIGHLIGHT_DEFAULT_COLOR: + HighlightEditor._defaultColor = value; + break; + case AnnotationEditorParamsType.HIGHLIGHT_THICKNESS: + HighlightEditor._defaultThickness = value; + break; + } + } + translateInPage(x, y) {} + get toolbarPosition() { + return this.#lastPoint; + } + updateParams(type, value) { + switch (type) { + case AnnotationEditorParamsType.HIGHLIGHT_COLOR: + this.#updateColor(value); + break; + case AnnotationEditorParamsType.HIGHLIGHT_THICKNESS: + this.#updateThickness(value); + break; + } + } + static get defaultPropertiesToUpdate() { + return [[AnnotationEditorParamsType.HIGHLIGHT_DEFAULT_COLOR, HighlightEditor._defaultColor], [AnnotationEditorParamsType.HIGHLIGHT_THICKNESS, HighlightEditor._defaultThickness]]; + } + get propertiesToUpdate() { + return [[AnnotationEditorParamsType.HIGHLIGHT_COLOR, this.color || HighlightEditor._defaultColor], [AnnotationEditorParamsType.HIGHLIGHT_THICKNESS, this.#thickness || HighlightEditor._defaultThickness], [AnnotationEditorParamsType.HIGHLIGHT_FREE, this.#isFreeHighlight]]; + } + #updateColor(color) { + const setColor = col => { + this.color = col; + this.parent?.drawLayer.changeColor(this.#id, col); + this.#colorPicker?.updateColor(col); + }; + const savedColor = this.color; + this.addCommands({ + cmd: setColor.bind(this, color), + undo: setColor.bind(this, savedColor), + post: this._uiManager.updateUI.bind(this._uiManager, this), + mustExec: true, + type: AnnotationEditorParamsType.HIGHLIGHT_COLOR, + overwriteIfSameType: true, + keepUndo: true + }); + this._reportTelemetry({ + action: "color_changed", + color: this._uiManager.highlightColorNames.get(color) + }, true); + } + #updateThickness(thickness) { + const savedThickness = this.#thickness; + const setThickness = th => { + this.#thickness = th; + this.#changeThickness(th); + }; + this.addCommands({ + cmd: setThickness.bind(this, thickness), + undo: setThickness.bind(this, savedThickness), + post: this._uiManager.updateUI.bind(this._uiManager, this), + mustExec: true, + type: AnnotationEditorParamsType.INK_THICKNESS, + overwriteIfSameType: true, + keepUndo: true + }); + this._reportTelemetry({ + action: "thickness_changed", + thickness + }, true); + } + async addEditToolbar() { + const toolbar = await super.addEditToolbar(); + if (!toolbar) { + return null; + } + if (this._uiManager.highlightColors) { + this.#colorPicker = new ColorPicker({ + editor: this + }); + toolbar.addColorPicker(this.#colorPicker); + } + return toolbar; + } + disableEditing() { + super.disableEditing(); + this.div.classList.toggle("disabled", true); + } + enableEditing() { + super.enableEditing(); + this.div.classList.toggle("disabled", false); + } + fixAndSetPosition() { + return super.fixAndSetPosition(this.#getRotation()); + } + getBaseTranslation() { + return [0, 0]; + } + getRect(tx, ty) { + return super.getRect(tx, ty, this.#getRotation()); + } + onceAdded() { + this.parent.addUndoableEditor(this); + this.div.focus(); + } + remove() { + this.#cleanDrawLayer(); + this._reportTelemetry({ + action: "deleted" + }); + super.remove(); + } + rebuild() { + if (!this.parent) { + return; + } + super.rebuild(); + if (this.div === null) { + return; + } + this.#addToDrawLayer(); + if (!this.isAttachedToDOM) { + this.parent.add(this); + } + } + setParent(parent) { + let mustBeSelected = false; + if (this.parent && !parent) { + this.#cleanDrawLayer(); + } else if (parent) { + this.#addToDrawLayer(parent); + mustBeSelected = !this.parent && this.div?.classList.contains("selectedEditor"); + } + super.setParent(parent); + this.show(this._isVisible); + if (mustBeSelected) { + this.select(); + } + } + #changeThickness(thickness) { + if (!this.#isFreeHighlight) { + return; + } + this.#createFreeOutlines({ + highlightOutlines: this.#highlightOutlines.getNewOutline(thickness / 2) + }); + this.fixAndSetPosition(); + const [parentWidth, parentHeight] = this.parentDimensions; + this.setDims(this.width * parentWidth, this.height * parentHeight); + } + #cleanDrawLayer() { + if (this.#id === null || !this.parent) { + return; + } + this.parent.drawLayer.remove(this.#id); + this.#id = null; + this.parent.drawLayer.remove(this.#outlineId); + this.#outlineId = null; + } + #addToDrawLayer(parent = this.parent) { + if (this.#id !== null) { + return; + } + ({ + id: this.#id, + clipPathId: this.#clipPathId + } = parent.drawLayer.highlight(this.#highlightOutlines, this.color, this.#opacity)); + this.#outlineId = parent.drawLayer.highlightOutline(this.#focusOutlines); + if (this.#highlightDiv) { + this.#highlightDiv.style.clipPath = this.#clipPathId; + } + } + static #rotateBbox({ + x, + y, + width, + height + }, angle) { + switch (angle) { + case 90: + return { + x: 1 - y - height, + y: x, + width: height, + height: width + }; + case 180: + return { + x: 1 - x - width, + y: 1 - y - height, + width, + height + }; + case 270: + return { + x: y, + y: 1 - x - width, + width: height, + height: width + }; + } + return { + x, + y, + width, + height + }; + } + rotate(angle) { + const { + drawLayer + } = this.parent; + let box; + if (this.#isFreeHighlight) { + angle = (angle - this.rotation + 360) % 360; + box = HighlightEditor.#rotateBbox(this.#highlightOutlines.box, angle); + } else { + box = HighlightEditor.#rotateBbox(this, angle); + } + drawLayer.rotate(this.#id, angle); + drawLayer.rotate(this.#outlineId, angle); + drawLayer.updateBox(this.#id, box); + drawLayer.updateBox(this.#outlineId, HighlightEditor.#rotateBbox(this.#focusOutlines.box, angle)); + } + render() { + if (this.div) { + return this.div; + } + const div = super.render(); + if (this.#text) { + div.setAttribute("aria-label", this.#text); + div.setAttribute("role", "mark"); + } + if (this.#isFreeHighlight) { + div.classList.add("free"); + } else { + this.div.addEventListener("keydown", this.#boundKeydown, { + signal: this._uiManager._signal + }); + } + const highlightDiv = this.#highlightDiv = document.createElement("div"); + div.append(highlightDiv); + highlightDiv.setAttribute("aria-hidden", "true"); + highlightDiv.className = "internal"; + highlightDiv.style.clipPath = this.#clipPathId; + const [parentWidth, parentHeight] = this.parentDimensions; + this.setDims(this.width * parentWidth, this.height * parentHeight); + bindEvents(this, this.#highlightDiv, ["pointerover", "pointerleave"]); + this.enableEditing(); + return div; + } + pointerover() { + this.parent.drawLayer.addClass(this.#outlineId, "hovered"); + } + pointerleave() { + this.parent.drawLayer.removeClass(this.#outlineId, "hovered"); + } + #keydown(event) { + HighlightEditor._keyboardManager.exec(this, event); + } + _moveCaret(direction) { + this.parent.unselect(this); + switch (direction) { + case 0: + case 2: + this.#setCaret(true); + break; + case 1: + case 3: + this.#setCaret(false); + break; + } + } + #setCaret(start) { + if (!this.#anchorNode) { + return; + } + const selection = window.getSelection(); + if (start) { + selection.setPosition(this.#anchorNode, this.#anchorOffset); + } else { + selection.setPosition(this.#focusNode, this.#focusOffset); + } + } + select() { + super.select(); + if (!this.#outlineId) { + return; + } + this.parent?.drawLayer.removeClass(this.#outlineId, "hovered"); + this.parent?.drawLayer.addClass(this.#outlineId, "selected"); + } + unselect() { + super.unselect(); + if (!this.#outlineId) { + return; + } + this.parent?.drawLayer.removeClass(this.#outlineId, "selected"); + if (!this.#isFreeHighlight) { + this.#setCaret(false); + } + } + get _mustFixPosition() { + return !this.#isFreeHighlight; + } + show(visible = this._isVisible) { + super.show(visible); + if (this.parent) { + this.parent.drawLayer.show(this.#id, visible); + this.parent.drawLayer.show(this.#outlineId, visible); + } + } + #getRotation() { + return this.#isFreeHighlight ? this.rotation : 0; + } + #serializeBoxes() { + if (this.#isFreeHighlight) { + return null; + } + const [pageWidth, pageHeight] = this.pageDimensions; + const boxes = this.#boxes; + const quadPoints = new Float32Array(boxes.length * 8); + let i = 0; + for (const { + x, + y, + width, + height + } of boxes) { + const sx = x * pageWidth; + const sy = (1 - y - height) * pageHeight; + quadPoints[i] = quadPoints[i + 4] = sx; + quadPoints[i + 1] = quadPoints[i + 3] = sy; + quadPoints[i + 2] = quadPoints[i + 6] = sx + width * pageWidth; + quadPoints[i + 5] = quadPoints[i + 7] = sy + height * pageHeight; + i += 8; + } + return quadPoints; + } + #serializeOutlines(rect) { + return this.#highlightOutlines.serialize(rect, this.#getRotation()); + } + static startHighlighting(parent, isLTR, { + target: textLayer, + x, + y + }) { + const { + x: layerX, + y: layerY, + width: parentWidth, + height: parentHeight + } = textLayer.getBoundingClientRect(); + const pointerMove = e => { + this.#highlightMove(parent, e); + }; + const signal = parent._signal; + const pointerDownOptions = { + capture: true, + passive: false, + signal + }; + const pointerDown = e => { + e.preventDefault(); + e.stopPropagation(); + }; + const pointerUpCallback = e => { + textLayer.removeEventListener("pointermove", pointerMove); + window.removeEventListener("blur", pointerUpCallback); + window.removeEventListener("pointerup", pointerUpCallback); + window.removeEventListener("pointerdown", pointerDown, pointerDownOptions); + window.removeEventListener("contextmenu", noContextMenu); + this.#endHighlight(parent, e); + }; + window.addEventListener("blur", pointerUpCallback, { + signal + }); + window.addEventListener("pointerup", pointerUpCallback, { + signal + }); + window.addEventListener("pointerdown", pointerDown, pointerDownOptions); + window.addEventListener("contextmenu", noContextMenu, { + signal + }); + textLayer.addEventListener("pointermove", pointerMove, { + signal + }); + this._freeHighlight = new FreeOutliner({ + x, + y + }, [layerX, layerY, parentWidth, parentHeight], parent.scale, this._defaultThickness / 2, isLTR, 0.001); + ({ + id: this._freeHighlightId, + clipPathId: this._freeHighlightClipId + } = parent.drawLayer.highlight(this._freeHighlight, this._defaultColor, this._defaultOpacity, true)); + } + static #highlightMove(parent, event) { + if (this._freeHighlight.add(event)) { + parent.drawLayer.updatePath(this._freeHighlightId, this._freeHighlight); + } + } + static #endHighlight(parent, event) { + if (!this._freeHighlight.isEmpty()) { + parent.createAndAddNewEditor(event, false, { + highlightId: this._freeHighlightId, + highlightOutlines: this._freeHighlight.getOutlines(), + clipPathId: this._freeHighlightClipId, + methodOfCreation: "main_toolbar" + }); + } else { + parent.drawLayer.removeFreeHighlight(this._freeHighlightId); + } + this._freeHighlightId = -1; + this._freeHighlight = null; + this._freeHighlightClipId = ""; + } + static deserialize(data, parent, uiManager) { + const editor = super.deserialize(data, parent, uiManager); + const { + rect: [blX, blY, trX, trY], + color, + quadPoints + } = data; + editor.color = Util.makeHexColor(...color); + editor.#opacity = data.opacity; + const [pageWidth, pageHeight] = editor.pageDimensions; + editor.width = (trX - blX) / pageWidth; + editor.height = (trY - blY) / pageHeight; + const boxes = editor.#boxes = []; + for (let i = 0; i < quadPoints.length; i += 8) { + boxes.push({ + x: (quadPoints[4] - trX) / pageWidth, + y: (trY - (1 - quadPoints[i + 5])) / pageHeight, + width: (quadPoints[i + 2] - quadPoints[i]) / pageWidth, + height: (quadPoints[i + 5] - quadPoints[i + 1]) / pageHeight + }); + } + editor.#createOutlines(); + return editor; + } + serialize(isForCopying = false) { + if (this.isEmpty() || isForCopying) { + return null; + } + const rect = this.getRect(0, 0); + const color = AnnotationEditor._colorManager.convert(this.color); + return { + annotationType: AnnotationEditorType.HIGHLIGHT, + color, + opacity: this.#opacity, + thickness: this.#thickness, + quadPoints: this.#serializeBoxes(), + outlines: this.#serializeOutlines(rect), + pageIndex: this.pageIndex, + rect, + rotation: this.#getRotation(), + structTreeParentId: this._structTreeParentId + }; + } + static canCreateNewEmptyEditor() { + return false; + } +} + +;// CONCATENATED MODULE: ./src/display/editor/ink.js + + + + + +class InkEditor extends AnnotationEditor { + #baseHeight = 0; + #baseWidth = 0; + #boundCanvasPointermove = this.canvasPointermove.bind(this); + #boundCanvasPointerleave = this.canvasPointerleave.bind(this); + #boundCanvasPointerup = this.canvasPointerup.bind(this); + #boundCanvasPointerdown = this.canvasPointerdown.bind(this); + #canvasContextMenuTimeoutId = null; + #currentPath2D = new Path2D(); + #disableEditing = false; + #hasSomethingToDraw = false; + #isCanvasInitialized = false; + #observer = null; + #realWidth = 0; + #realHeight = 0; + #requestFrameCallback = null; + static _defaultColor = null; + static _defaultOpacity = 1; + static _defaultThickness = 1; + static _type = "ink"; + static _editorType = AnnotationEditorType.INK; + constructor(params) { + super({ + ...params, + name: "inkEditor" + }); + this.color = params.color || null; + this.thickness = params.thickness || null; + this.opacity = params.opacity || null; + this.paths = []; + this.bezierPath2D = []; + this.allRawPaths = []; + this.currentPath = []; + this.scaleFactor = 1; + this.translationX = this.translationY = 0; + this.x = 0; + this.y = 0; + this._willKeepAspectRatio = true; + } + static initialize(l10n, uiManager) { + AnnotationEditor.initialize(l10n, uiManager); + } + static updateDefaultParams(type, value) { + switch (type) { + case AnnotationEditorParamsType.INK_THICKNESS: + InkEditor._defaultThickness = value; + break; + case AnnotationEditorParamsType.INK_COLOR: + InkEditor._defaultColor = value; + break; + case AnnotationEditorParamsType.INK_OPACITY: + InkEditor._defaultOpacity = value / 100; + break; + } + } + updateParams(type, value) { + switch (type) { + case AnnotationEditorParamsType.INK_THICKNESS: + this.#updateThickness(value); + break; + case AnnotationEditorParamsType.INK_COLOR: + this.#updateColor(value); + break; + case AnnotationEditorParamsType.INK_OPACITY: + this.#updateOpacity(value); + break; + } + } + static get defaultPropertiesToUpdate() { + return [[AnnotationEditorParamsType.INK_THICKNESS, InkEditor._defaultThickness], [AnnotationEditorParamsType.INK_COLOR, InkEditor._defaultColor || AnnotationEditor._defaultLineColor], [AnnotationEditorParamsType.INK_OPACITY, Math.round(InkEditor._defaultOpacity * 100)]]; + } + get propertiesToUpdate() { + return [[AnnotationEditorParamsType.INK_THICKNESS, this.thickness || InkEditor._defaultThickness], [AnnotationEditorParamsType.INK_COLOR, this.color || InkEditor._defaultColor || AnnotationEditor._defaultLineColor], [AnnotationEditorParamsType.INK_OPACITY, Math.round(100 * (this.opacity ?? InkEditor._defaultOpacity))]]; + } + #updateThickness(thickness) { + const setThickness = th => { + this.thickness = th; + this.#fitToContent(); + }; + const savedThickness = this.thickness; + this.addCommands({ + cmd: setThickness.bind(this, thickness), + undo: setThickness.bind(this, savedThickness), + post: this._uiManager.updateUI.bind(this._uiManager, this), + mustExec: true, + type: AnnotationEditorParamsType.INK_THICKNESS, + overwriteIfSameType: true, + keepUndo: true + }); + } + #updateColor(color) { + const setColor = col => { + this.color = col; + this.#redraw(); + }; + const savedColor = this.color; + this.addCommands({ + cmd: setColor.bind(this, color), + undo: setColor.bind(this, savedColor), + post: this._uiManager.updateUI.bind(this._uiManager, this), + mustExec: true, + type: AnnotationEditorParamsType.INK_COLOR, + overwriteIfSameType: true, + keepUndo: true + }); + } + #updateOpacity(opacity) { + const setOpacity = op => { + this.opacity = op; + this.#redraw(); + }; + opacity /= 100; + const savedOpacity = this.opacity; + this.addCommands({ + cmd: setOpacity.bind(this, opacity), + undo: setOpacity.bind(this, savedOpacity), + post: this._uiManager.updateUI.bind(this._uiManager, this), + mustExec: true, + type: AnnotationEditorParamsType.INK_OPACITY, + overwriteIfSameType: true, + keepUndo: true + }); + } + rebuild() { + if (!this.parent) { + return; + } + super.rebuild(); + if (this.div === null) { + return; + } + if (!this.canvas) { + this.#createCanvas(); + this.#createObserver(); + } + if (!this.isAttachedToDOM) { + this.parent.add(this); + this.#setCanvasDims(); + } + this.#fitToContent(); + } + remove() { + if (this.canvas === null) { + return; + } + if (!this.isEmpty()) { + this.commit(); + } + this.canvas.width = this.canvas.height = 0; + this.canvas.remove(); + this.canvas = null; + if (this.#canvasContextMenuTimeoutId) { + clearTimeout(this.#canvasContextMenuTimeoutId); + this.#canvasContextMenuTimeoutId = null; + } + this.#observer?.disconnect(); + this.#observer = null; + super.remove(); + } + setParent(parent) { + if (!this.parent && parent) { + this._uiManager.removeShouldRescale(this); + } else if (this.parent && parent === null) { + this._uiManager.addShouldRescale(this); + } + super.setParent(parent); + } + onScaleChanging() { + const [parentWidth, parentHeight] = this.parentDimensions; + const width = this.width * parentWidth; + const height = this.height * parentHeight; + this.setDimensions(width, height); + } + enableEditMode() { + if (this.#disableEditing || this.canvas === null) { + return; + } + super.enableEditMode(); + this._isDraggable = false; + this.canvas.addEventListener("pointerdown", this.#boundCanvasPointerdown, { + signal: this._uiManager._signal + }); + } + disableEditMode() { + if (!this.isInEditMode() || this.canvas === null) { + return; + } + super.disableEditMode(); + this._isDraggable = !this.isEmpty(); + this.div.classList.remove("editing"); + this.canvas.removeEventListener("pointerdown", this.#boundCanvasPointerdown); + } + onceAdded() { + this._isDraggable = !this.isEmpty(); + } + isEmpty() { + return this.paths.length === 0 || this.paths.length === 1 && this.paths[0].length === 0; + } + #getInitialBBox() { + const { + parentRotation, + parentDimensions: [width, height] + } = this; + switch (parentRotation) { + case 90: + return [0, height, height, width]; + case 180: + return [width, height, width, height]; + case 270: + return [width, 0, height, width]; + default: + return [0, 0, width, height]; + } + } + #setStroke() { + const { + ctx, + color, + opacity, + thickness, + parentScale, + scaleFactor + } = this; + ctx.lineWidth = thickness * parentScale / scaleFactor; + ctx.lineCap = "round"; + ctx.lineJoin = "round"; + ctx.miterLimit = 10; + ctx.strokeStyle = `${color}${opacityToHex(opacity)}`; + } + #startDrawing(x, y) { + const signal = this._uiManager._signal; + this.canvas.addEventListener("contextmenu", noContextMenu, { + signal + }); + this.canvas.addEventListener("pointerleave", this.#boundCanvasPointerleave, { + signal + }); + this.canvas.addEventListener("pointermove", this.#boundCanvasPointermove, { + signal + }); + this.canvas.addEventListener("pointerup", this.#boundCanvasPointerup, { + signal + }); + this.canvas.removeEventListener("pointerdown", this.#boundCanvasPointerdown); + this.isEditing = true; + if (!this.#isCanvasInitialized) { + this.#isCanvasInitialized = true; + this.#setCanvasDims(); + this.thickness ||= InkEditor._defaultThickness; + this.color ||= InkEditor._defaultColor || AnnotationEditor._defaultLineColor; + this.opacity ??= InkEditor._defaultOpacity; + } + this.currentPath.push([x, y]); + this.#hasSomethingToDraw = false; + this.#setStroke(); + this.#requestFrameCallback = () => { + this.#drawPoints(); + if (this.#requestFrameCallback) { + window.requestAnimationFrame(this.#requestFrameCallback); + } + }; + window.requestAnimationFrame(this.#requestFrameCallback); + } + #draw(x, y) { + const [lastX, lastY] = this.currentPath.at(-1); + if (this.currentPath.length > 1 && x === lastX && y === lastY) { + return; + } + const currentPath = this.currentPath; + let path2D = this.#currentPath2D; + currentPath.push([x, y]); + this.#hasSomethingToDraw = true; + if (currentPath.length <= 2) { + path2D.moveTo(...currentPath[0]); + path2D.lineTo(x, y); + return; + } + if (currentPath.length === 3) { + this.#currentPath2D = path2D = new Path2D(); + path2D.moveTo(...currentPath[0]); + } + this.#makeBezierCurve(path2D, ...currentPath.at(-3), ...currentPath.at(-2), x, y); + } + #endPath() { + if (this.currentPath.length === 0) { + return; + } + const lastPoint = this.currentPath.at(-1); + this.#currentPath2D.lineTo(...lastPoint); + } + #stopDrawing(x, y) { + this.#requestFrameCallback = null; + x = Math.min(Math.max(x, 0), this.canvas.width); + y = Math.min(Math.max(y, 0), this.canvas.height); + this.#draw(x, y); + this.#endPath(); + let bezier; + if (this.currentPath.length !== 1) { + bezier = this.#generateBezierPoints(); + } else { + const xy = [x, y]; + bezier = [[xy, xy.slice(), xy.slice(), xy]]; + } + const path2D = this.#currentPath2D; + const currentPath = this.currentPath; + this.currentPath = []; + this.#currentPath2D = new Path2D(); + const cmd = () => { + this.allRawPaths.push(currentPath); + this.paths.push(bezier); + this.bezierPath2D.push(path2D); + this._uiManager.rebuild(this); + }; + const undo = () => { + this.allRawPaths.pop(); + this.paths.pop(); + this.bezierPath2D.pop(); + if (this.paths.length === 0) { + this.remove(); + } else { + if (!this.canvas) { + this.#createCanvas(); + this.#createObserver(); + } + this.#fitToContent(); + } + }; + this.addCommands({ + cmd, + undo, + mustExec: true + }); + } + #drawPoints() { + if (!this.#hasSomethingToDraw) { + return; + } + this.#hasSomethingToDraw = false; + const thickness = Math.ceil(this.thickness * this.parentScale); + const lastPoints = this.currentPath.slice(-3); + const x = lastPoints.map(xy => xy[0]); + const y = lastPoints.map(xy => xy[1]); + const xMin = Math.min(...x) - thickness; + const xMax = Math.max(...x) + thickness; + const yMin = Math.min(...y) - thickness; + const yMax = Math.max(...y) + thickness; + const { + ctx + } = this; + ctx.save(); + ctx.clearRect(0, 0, this.canvas.width, this.canvas.height); + for (const path of this.bezierPath2D) { + ctx.stroke(path); + } + ctx.stroke(this.#currentPath2D); + ctx.restore(); + } + #makeBezierCurve(path2D, x0, y0, x1, y1, x2, y2) { + const prevX = (x0 + x1) / 2; + const prevY = (y0 + y1) / 2; + const x3 = (x1 + x2) / 2; + const y3 = (y1 + y2) / 2; + path2D.bezierCurveTo(prevX + 2 * (x1 - prevX) / 3, prevY + 2 * (y1 - prevY) / 3, x3 + 2 * (x1 - x3) / 3, y3 + 2 * (y1 - y3) / 3, x3, y3); + } + #generateBezierPoints() { + const path = this.currentPath; + if (path.length <= 2) { + return [[path[0], path[0], path.at(-1), path.at(-1)]]; + } + const bezierPoints = []; + let i; + let [x0, y0] = path[0]; + for (i = 1; i < path.length - 2; i++) { + const [x1, y1] = path[i]; + const [x2, y2] = path[i + 1]; + const x3 = (x1 + x2) / 2; + const y3 = (y1 + y2) / 2; + const control1 = [x0 + 2 * (x1 - x0) / 3, y0 + 2 * (y1 - y0) / 3]; + const control2 = [x3 + 2 * (x1 - x3) / 3, y3 + 2 * (y1 - y3) / 3]; + bezierPoints.push([[x0, y0], control1, control2, [x3, y3]]); + [x0, y0] = [x3, y3]; + } + const [x1, y1] = path[i]; + const [x2, y2] = path[i + 1]; + const control1 = [x0 + 2 * (x1 - x0) / 3, y0 + 2 * (y1 - y0) / 3]; + const control2 = [x2 + 2 * (x1 - x2) / 3, y2 + 2 * (y1 - y2) / 3]; + bezierPoints.push([[x0, y0], control1, control2, [x2, y2]]); + return bezierPoints; + } + #redraw() { + if (this.isEmpty()) { + this.#updateTransform(); + return; + } + this.#setStroke(); + const { + canvas, + ctx + } = this; + ctx.setTransform(1, 0, 0, 1, 0, 0); + ctx.clearRect(0, 0, canvas.width, canvas.height); + this.#updateTransform(); + for (const path of this.bezierPath2D) { + ctx.stroke(path); + } + } + commit() { + if (this.#disableEditing) { + return; + } + super.commit(); + this.isEditing = false; + this.disableEditMode(); + this.setInForeground(); + this.#disableEditing = true; + this.div.classList.add("disabled"); + this.#fitToContent(true); + this.select(); + this.parent.addInkEditorIfNeeded(true); + this.moveInDOM(); + this.div.focus({ + preventScroll: true + }); + } + focusin(event) { + if (!this._focusEventsAllowed) { + return; + } + super.focusin(event); + this.enableEditMode(); + } + canvasPointerdown(event) { + if (event.button !== 0 || !this.isInEditMode() || this.#disableEditing) { + return; + } + this.setInForeground(); + event.preventDefault(); + if (!this.div.contains(document.activeElement)) { + this.div.focus({ + preventScroll: true + }); + } + this.#startDrawing(event.offsetX, event.offsetY); + } + canvasPointermove(event) { + event.preventDefault(); + this.#draw(event.offsetX, event.offsetY); + } + canvasPointerup(event) { + event.preventDefault(); + this.#endDrawing(event); + } + canvasPointerleave(event) { + this.#endDrawing(event); + } + #endDrawing(event) { + this.canvas.removeEventListener("pointerleave", this.#boundCanvasPointerleave); + this.canvas.removeEventListener("pointermove", this.#boundCanvasPointermove); + this.canvas.removeEventListener("pointerup", this.#boundCanvasPointerup); + this.canvas.addEventListener("pointerdown", this.#boundCanvasPointerdown, { + signal: this._uiManager._signal + }); + if (this.#canvasContextMenuTimeoutId) { + clearTimeout(this.#canvasContextMenuTimeoutId); + } + this.#canvasContextMenuTimeoutId = setTimeout(() => { + this.#canvasContextMenuTimeoutId = null; + this.canvas.removeEventListener("contextmenu", noContextMenu); + }, 10); + this.#stopDrawing(event.offsetX, event.offsetY); + this.addToAnnotationStorage(); + this.setInBackground(); + } + #createCanvas() { + this.canvas = document.createElement("canvas"); + this.canvas.width = this.canvas.height = 0; + this.canvas.className = "inkEditorCanvas"; + this.canvas.setAttribute("data-l10n-id", "pdfjs-ink-canvas"); + this.div.append(this.canvas); + this.ctx = this.canvas.getContext("2d"); + } + #createObserver() { + this.#observer = new ResizeObserver(entries => { + const rect = entries[0].contentRect; + if (rect.width && rect.height) { + this.setDimensions(rect.width, rect.height); + } + }); + this.#observer.observe(this.div); + this._uiManager._signal.addEventListener("abort", () => { + this.#observer?.disconnect(); + this.#observer = null; + }, { + once: true + }); + } + get isResizable() { + return !this.isEmpty() && this.#disableEditing; + } + render() { + if (this.div) { + return this.div; + } + let baseX, baseY; + if (this.width) { + baseX = this.x; + baseY = this.y; + } + super.render(); + this.div.setAttribute("data-l10n-id", "pdfjs-ink"); + const [x, y, w, h] = this.#getInitialBBox(); + this.setAt(x, y, 0, 0); + this.setDims(w, h); + this.#createCanvas(); + if (this.width) { + const [parentWidth, parentHeight] = this.parentDimensions; + this.setAspectRatio(this.width * parentWidth, this.height * parentHeight); + this.setAt(baseX * parentWidth, baseY * parentHeight, this.width * parentWidth, this.height * parentHeight); + this.#isCanvasInitialized = true; + this.#setCanvasDims(); + this.setDims(this.width * parentWidth, this.height * parentHeight); + this.#redraw(); + this.div.classList.add("disabled"); + } else { + this.div.classList.add("editing"); + this.enableEditMode(); + } + this.#createObserver(); + return this.div; + } + #setCanvasDims() { + if (!this.#isCanvasInitialized) { + return; + } + const [parentWidth, parentHeight] = this.parentDimensions; + this.canvas.width = Math.ceil(this.width * parentWidth); + this.canvas.height = Math.ceil(this.height * parentHeight); + this.#updateTransform(); + } + setDimensions(width, height) { + const roundedWidth = Math.round(width); + const roundedHeight = Math.round(height); + if (this.#realWidth === roundedWidth && this.#realHeight === roundedHeight) { + return; + } + this.#realWidth = roundedWidth; + this.#realHeight = roundedHeight; + this.canvas.style.visibility = "hidden"; + const [parentWidth, parentHeight] = this.parentDimensions; + this.width = width / parentWidth; + this.height = height / parentHeight; + this.fixAndSetPosition(); + if (this.#disableEditing) { + this.#setScaleFactor(width, height); + } + this.#setCanvasDims(); + this.#redraw(); + this.canvas.style.visibility = "visible"; + this.fixDims(); + } + #setScaleFactor(width, height) { + const padding = this.#getPadding(); + const scaleFactorW = (width - padding) / this.#baseWidth; + const scaleFactorH = (height - padding) / this.#baseHeight; + this.scaleFactor = Math.min(scaleFactorW, scaleFactorH); + } + #updateTransform() { + const padding = this.#getPadding() / 2; + this.ctx.setTransform(this.scaleFactor, 0, 0, this.scaleFactor, this.translationX * this.scaleFactor + padding, this.translationY * this.scaleFactor + padding); + } + static #buildPath2D(bezier) { + const path2D = new Path2D(); + for (let i = 0, ii = bezier.length; i < ii; i++) { + const [first, control1, control2, second] = bezier[i]; + if (i === 0) { + path2D.moveTo(...first); + } + path2D.bezierCurveTo(control1[0], control1[1], control2[0], control2[1], second[0], second[1]); + } + return path2D; + } + static #toPDFCoordinates(points, rect, rotation) { + const [blX, blY, trX, trY] = rect; + switch (rotation) { + case 0: + for (let i = 0, ii = points.length; i < ii; i += 2) { + points[i] += blX; + points[i + 1] = trY - points[i + 1]; + } + break; + case 90: + for (let i = 0, ii = points.length; i < ii; i += 2) { + const x = points[i]; + points[i] = points[i + 1] + blX; + points[i + 1] = x + blY; + } + break; + case 180: + for (let i = 0, ii = points.length; i < ii; i += 2) { + points[i] = trX - points[i]; + points[i + 1] += blY; + } + break; + case 270: + for (let i = 0, ii = points.length; i < ii; i += 2) { + const x = points[i]; + points[i] = trX - points[i + 1]; + points[i + 1] = trY - x; + } + break; + default: + throw new Error("Invalid rotation"); + } + return points; + } + static #fromPDFCoordinates(points, rect, rotation) { + const [blX, blY, trX, trY] = rect; + switch (rotation) { + case 0: + for (let i = 0, ii = points.length; i < ii; i += 2) { + points[i] -= blX; + points[i + 1] = trY - points[i + 1]; + } + break; + case 90: + for (let i = 0, ii = points.length; i < ii; i += 2) { + const x = points[i]; + points[i] = points[i + 1] - blY; + points[i + 1] = x - blX; + } + break; + case 180: + for (let i = 0, ii = points.length; i < ii; i += 2) { + points[i] = trX - points[i]; + points[i + 1] -= blY; + } + break; + case 270: + for (let i = 0, ii = points.length; i < ii; i += 2) { + const x = points[i]; + points[i] = trY - points[i + 1]; + points[i + 1] = trX - x; + } + break; + default: + throw new Error("Invalid rotation"); + } + return points; + } + #serializePaths(s, tx, ty, rect) { + const paths = []; + const padding = this.thickness / 2; + const shiftX = s * tx + padding; + const shiftY = s * ty + padding; + for (const bezier of this.paths) { + const buffer = []; + const points = []; + for (let j = 0, jj = bezier.length; j < jj; j++) { + const [first, control1, control2, second] = bezier[j]; + if (first[0] === second[0] && first[1] === second[1] && jj === 1) { + const p0 = s * first[0] + shiftX; + const p1 = s * first[1] + shiftY; + buffer.push(p0, p1); + points.push(p0, p1); + break; + } + const p10 = s * first[0] + shiftX; + const p11 = s * first[1] + shiftY; + const p20 = s * control1[0] + shiftX; + const p21 = s * control1[1] + shiftY; + const p30 = s * control2[0] + shiftX; + const p31 = s * control2[1] + shiftY; + const p40 = s * second[0] + shiftX; + const p41 = s * second[1] + shiftY; + if (j === 0) { + buffer.push(p10, p11); + points.push(p10, p11); + } + buffer.push(p20, p21, p30, p31, p40, p41); + points.push(p20, p21); + if (j === jj - 1) { + points.push(p40, p41); + } + } + paths.push({ + bezier: InkEditor.#toPDFCoordinates(buffer, rect, this.rotation), + points: InkEditor.#toPDFCoordinates(points, rect, this.rotation) + }); + } + return paths; + } + #getBbox() { + let xMin = Infinity; + let xMax = -Infinity; + let yMin = Infinity; + let yMax = -Infinity; + for (const path of this.paths) { + for (const [first, control1, control2, second] of path) { + const bbox = Util.bezierBoundingBox(...first, ...control1, ...control2, ...second); + xMin = Math.min(xMin, bbox[0]); + yMin = Math.min(yMin, bbox[1]); + xMax = Math.max(xMax, bbox[2]); + yMax = Math.max(yMax, bbox[3]); + } + } + return [xMin, yMin, xMax, yMax]; + } + #getPadding() { + return this.#disableEditing ? Math.ceil(this.thickness * this.parentScale) : 0; + } + #fitToContent(firstTime = false) { + if (this.isEmpty()) { + return; + } + if (!this.#disableEditing) { + this.#redraw(); + return; + } + const bbox = this.#getBbox(); + const padding = this.#getPadding(); + this.#baseWidth = Math.max(AnnotationEditor.MIN_SIZE, bbox[2] - bbox[0]); + this.#baseHeight = Math.max(AnnotationEditor.MIN_SIZE, bbox[3] - bbox[1]); + const width = Math.ceil(padding + this.#baseWidth * this.scaleFactor); + const height = Math.ceil(padding + this.#baseHeight * this.scaleFactor); + const [parentWidth, parentHeight] = this.parentDimensions; + this.width = width / parentWidth; + this.height = height / parentHeight; + this.setAspectRatio(width, height); + const prevTranslationX = this.translationX; + const prevTranslationY = this.translationY; + this.translationX = -bbox[0]; + this.translationY = -bbox[1]; + this.#setCanvasDims(); + this.#redraw(); + this.#realWidth = width; + this.#realHeight = height; + this.setDims(width, height); + const unscaledPadding = firstTime ? padding / this.scaleFactor / 2 : 0; + this.translate(prevTranslationX - this.translationX - unscaledPadding, prevTranslationY - this.translationY - unscaledPadding); + } + static deserialize(data, parent, uiManager) { + if (data instanceof InkAnnotationElement) { + return null; + } + const editor = super.deserialize(data, parent, uiManager); + editor.thickness = data.thickness; + editor.color = Util.makeHexColor(...data.color); + editor.opacity = data.opacity; + const [pageWidth, pageHeight] = editor.pageDimensions; + const width = editor.width * pageWidth; + const height = editor.height * pageHeight; + const scaleFactor = editor.parentScale; + const padding = data.thickness / 2; + editor.#disableEditing = true; + editor.#realWidth = Math.round(width); + editor.#realHeight = Math.round(height); + const { + paths, + rect, + rotation + } = data; + for (let { + bezier + } of paths) { + bezier = InkEditor.#fromPDFCoordinates(bezier, rect, rotation); + const path = []; + editor.paths.push(path); + let p0 = scaleFactor * (bezier[0] - padding); + let p1 = scaleFactor * (bezier[1] - padding); + for (let i = 2, ii = bezier.length; i < ii; i += 6) { + const p10 = scaleFactor * (bezier[i] - padding); + const p11 = scaleFactor * (bezier[i + 1] - padding); + const p20 = scaleFactor * (bezier[i + 2] - padding); + const p21 = scaleFactor * (bezier[i + 3] - padding); + const p30 = scaleFactor * (bezier[i + 4] - padding); + const p31 = scaleFactor * (bezier[i + 5] - padding); + path.push([[p0, p1], [p10, p11], [p20, p21], [p30, p31]]); + p0 = p30; + p1 = p31; + } + const path2D = this.#buildPath2D(path); + editor.bezierPath2D.push(path2D); + } + const bbox = editor.#getBbox(); + editor.#baseWidth = Math.max(AnnotationEditor.MIN_SIZE, bbox[2] - bbox[0]); + editor.#baseHeight = Math.max(AnnotationEditor.MIN_SIZE, bbox[3] - bbox[1]); + editor.#setScaleFactor(width, height); + return editor; + } + serialize() { + if (this.isEmpty()) { + return null; + } + const rect = this.getRect(0, 0); + const color = AnnotationEditor._colorManager.convert(this.ctx.strokeStyle); + return { + annotationType: AnnotationEditorType.INK, + color, + thickness: this.thickness, + opacity: this.opacity, + paths: this.#serializePaths(this.scaleFactor / this.parentScale, this.translationX, this.translationY, rect), + pageIndex: this.pageIndex, + rect, + rotation: this.rotation, + structTreeParentId: this._structTreeParentId + }; + } +} + +;// CONCATENATED MODULE: ./src/display/editor/stamp.js + + + + +class StampEditor extends AnnotationEditor { + #bitmap = null; + #bitmapId = null; + #bitmapPromise = null; + #bitmapUrl = null; + #bitmapFile = null; + #bitmapFileName = ""; + #canvas = null; + #observer = null; + #resizeTimeoutId = null; + #isSvg = false; + #hasBeenAddedInUndoStack = false; + static _type = "stamp"; + static _editorType = AnnotationEditorType.STAMP; + constructor(params) { + super({ + ...params, + name: "stampEditor" + }); + this.#bitmapUrl = params.bitmapUrl; + this.#bitmapFile = params.bitmapFile; + } + static initialize(l10n, uiManager) { + AnnotationEditor.initialize(l10n, uiManager); + } + static get supportedTypes() { + const types = ["apng", "avif", "bmp", "gif", "jpeg", "png", "svg+xml", "webp", "x-icon"]; + return shadow(this, "supportedTypes", types.map(type => `image/${type}`)); + } + static get supportedTypesStr() { + return shadow(this, "supportedTypesStr", this.supportedTypes.join(",")); + } + static isHandlingMimeForPasting(mime) { + return this.supportedTypes.includes(mime); + } + static paste(item, parent) { + parent.pasteEditor(AnnotationEditorType.STAMP, { + bitmapFile: item.getAsFile() + }); + } + #getBitmapFetched(data, fromId = false) { + if (!data) { + this.remove(); + return; + } + this.#bitmap = data.bitmap; + if (!fromId) { + this.#bitmapId = data.id; + this.#isSvg = data.isSvg; + } + if (data.file) { + this.#bitmapFileName = data.file.name; + } + this.#createCanvas(); + } + #getBitmapDone() { + this.#bitmapPromise = null; + this._uiManager.enableWaiting(false); + if (this.#canvas) { + this.div.focus(); + } + } + #getBitmap() { + if (this.#bitmapId) { + this._uiManager.enableWaiting(true); + this._uiManager.imageManager.getFromId(this.#bitmapId).then(data => this.#getBitmapFetched(data, true)).finally(() => this.#getBitmapDone()); + return; + } + if (this.#bitmapUrl) { + const url = this.#bitmapUrl; + this.#bitmapUrl = null; + this._uiManager.enableWaiting(true); + this.#bitmapPromise = this._uiManager.imageManager.getFromUrl(url).then(data => this.#getBitmapFetched(data)).finally(() => this.#getBitmapDone()); + return; + } + if (this.#bitmapFile) { + const file = this.#bitmapFile; + this.#bitmapFile = null; + this._uiManager.enableWaiting(true); + this.#bitmapPromise = this._uiManager.imageManager.getFromFile(file).then(data => this.#getBitmapFetched(data)).finally(() => this.#getBitmapDone()); + return; + } + const input = document.createElement("input"); + input.type = "file"; + input.accept = StampEditor.supportedTypesStr; + const signal = this._uiManager._signal; + this.#bitmapPromise = new Promise(resolve => { + input.addEventListener("change", async () => { + if (!input.files || input.files.length === 0) { + this.remove(); + } else { + this._uiManager.enableWaiting(true); + const data = await this._uiManager.imageManager.getFromFile(input.files[0]); + this.#getBitmapFetched(data); + } + resolve(); + }, { + signal + }); + input.addEventListener("cancel", () => { + this.remove(); + resolve(); + }, { + signal + }); + }).finally(() => this.#getBitmapDone()); + input.click(); + } + remove() { + if (this.#bitmapId) { + this.#bitmap = null; + this._uiManager.imageManager.deleteId(this.#bitmapId); + this.#canvas?.remove(); + this.#canvas = null; + this.#observer?.disconnect(); + this.#observer = null; + if (this.#resizeTimeoutId) { + clearTimeout(this.#resizeTimeoutId); + this.#resizeTimeoutId = null; + } + } + super.remove(); + } + rebuild() { + if (!this.parent) { + if (this.#bitmapId) { + this.#getBitmap(); + } + return; + } + super.rebuild(); + if (this.div === null) { + return; + } + if (this.#bitmapId && this.#canvas === null) { + this.#getBitmap(); + } + if (!this.isAttachedToDOM) { + this.parent.add(this); + } + } + onceAdded() { + this._isDraggable = true; + this.div.focus(); + } + isEmpty() { + return !(this.#bitmapPromise || this.#bitmap || this.#bitmapUrl || this.#bitmapFile || this.#bitmapId); + } + get isResizable() { + return true; + } + render() { + if (this.div) { + return this.div; + } + let baseX, baseY; + if (this.width) { + baseX = this.x; + baseY = this.y; + } + super.render(); + this.div.hidden = true; + this.addAltTextButton(); + if (this.#bitmap) { + this.#createCanvas(); + } else { + this.#getBitmap(); + } + if (this.width) { + const [parentWidth, parentHeight] = this.parentDimensions; + this.setAt(baseX * parentWidth, baseY * parentHeight, this.width * parentWidth, this.height * parentHeight); + } + return this.div; + } + #createCanvas() { + const { + div + } = this; + let { + width, + height + } = this.#bitmap; + const [pageWidth, pageHeight] = this.pageDimensions; + const MAX_RATIO = 0.75; + if (this.width) { + width = this.width * pageWidth; + height = this.height * pageHeight; + } else if (width > MAX_RATIO * pageWidth || height > MAX_RATIO * pageHeight) { + const factor = Math.min(MAX_RATIO * pageWidth / width, MAX_RATIO * pageHeight / height); + width *= factor; + height *= factor; + } + const [parentWidth, parentHeight] = this.parentDimensions; + this.setDims(width * parentWidth / pageWidth, height * parentHeight / pageHeight); + this._uiManager.enableWaiting(false); + const canvas = this.#canvas = document.createElement("canvas"); + div.append(canvas); + div.hidden = false; + this.#drawBitmap(width, height); + this.#createObserver(); + if (!this.#hasBeenAddedInUndoStack) { + this.parent.addUndoableEditor(this); + this.#hasBeenAddedInUndoStack = true; + } + this._reportTelemetry({ + action: "inserted_image" + }); + if (this.#bitmapFileName) { + canvas.setAttribute("aria-label", this.#bitmapFileName); + } + } + #setDimensions(width, height) { + const [parentWidth, parentHeight] = this.parentDimensions; + this.width = width / parentWidth; + this.height = height / parentHeight; + this.setDims(width, height); + if (this._initialOptions?.isCentered) { + this.center(); + } else { + this.fixAndSetPosition(); + } + this._initialOptions = null; + if (this.#resizeTimeoutId !== null) { + clearTimeout(this.#resizeTimeoutId); + } + const TIME_TO_WAIT = 200; + this.#resizeTimeoutId = setTimeout(() => { + this.#resizeTimeoutId = null; + this.#drawBitmap(width, height); + }, TIME_TO_WAIT); + } + #scaleBitmap(width, height) { + const { + width: bitmapWidth, + height: bitmapHeight + } = this.#bitmap; + let newWidth = bitmapWidth; + let newHeight = bitmapHeight; + let bitmap = this.#bitmap; + while (newWidth > 2 * width || newHeight > 2 * height) { + const prevWidth = newWidth; + const prevHeight = newHeight; + if (newWidth > 2 * width) { + newWidth = newWidth >= 16384 ? Math.floor(newWidth / 2) - 1 : Math.ceil(newWidth / 2); + } + if (newHeight > 2 * height) { + newHeight = newHeight >= 16384 ? Math.floor(newHeight / 2) - 1 : Math.ceil(newHeight / 2); + } + const offscreen = new OffscreenCanvas(newWidth, newHeight); + const ctx = offscreen.getContext("2d"); + ctx.drawImage(bitmap, 0, 0, prevWidth, prevHeight, 0, 0, newWidth, newHeight); + bitmap = offscreen.transferToImageBitmap(); + } + return bitmap; + } + #drawBitmap(width, height) { + width = Math.ceil(width); + height = Math.ceil(height); + const canvas = this.#canvas; + if (!canvas || canvas.width === width && canvas.height === height) { + return; + } + canvas.width = width; + canvas.height = height; + const bitmap = this.#isSvg ? this.#bitmap : this.#scaleBitmap(width, height); + if (this._uiManager.hasMLManager && !this.hasAltText()) { + const offscreen = new OffscreenCanvas(width, height); + const ctx = offscreen.getContext("2d"); + ctx.drawImage(bitmap, 0, 0, bitmap.width, bitmap.height, 0, 0, width, height); + this._uiManager.mlGuess({ + service: "image-to-text", + request: { + data: ctx.getImageData(0, 0, width, height).data, + width, + height, + channels: 4 + } + }).then(response => { + const altText = response?.output || ""; + if (this.parent && altText && !this.hasAltText()) { + this.altTextData = { + altText, + decorative: false + }; + } + }); + } + const ctx = canvas.getContext("2d"); + ctx.filter = this._uiManager.hcmFilter; + ctx.drawImage(bitmap, 0, 0, bitmap.width, bitmap.height, 0, 0, width, height); + } + getImageForAltText() { + return this.#canvas; + } + #serializeBitmap(toUrl) { + if (toUrl) { + if (this.#isSvg) { + const url = this._uiManager.imageManager.getSvgUrl(this.#bitmapId); + if (url) { + return url; + } + } + const canvas = document.createElement("canvas"); + ({ + width: canvas.width, + height: canvas.height + } = this.#bitmap); + const ctx = canvas.getContext("2d"); + ctx.drawImage(this.#bitmap, 0, 0); + return canvas.toDataURL(); + } + if (this.#isSvg) { + const [pageWidth, pageHeight] = this.pageDimensions; + const width = Math.round(this.width * pageWidth * PixelsPerInch.PDF_TO_CSS_UNITS); + const height = Math.round(this.height * pageHeight * PixelsPerInch.PDF_TO_CSS_UNITS); + const offscreen = new OffscreenCanvas(width, height); + const ctx = offscreen.getContext("2d"); + ctx.drawImage(this.#bitmap, 0, 0, this.#bitmap.width, this.#bitmap.height, 0, 0, width, height); + return offscreen.transferToImageBitmap(); + } + return structuredClone(this.#bitmap); + } + #createObserver() { + if (!this._uiManager._signal) { + return; + } + this.#observer = new ResizeObserver(entries => { + const rect = entries[0].contentRect; + if (rect.width && rect.height) { + this.#setDimensions(rect.width, rect.height); + } + }); + this.#observer.observe(this.div); + this._uiManager._signal.addEventListener("abort", () => { + this.#observer?.disconnect(); + this.#observer = null; + }, { + once: true + }); + } + static deserialize(data, parent, uiManager) { + if (data instanceof StampAnnotationElement) { + return null; + } + const editor = super.deserialize(data, parent, uiManager); + const { + rect, + bitmapUrl, + bitmapId, + isSvg, + accessibilityData + } = data; + if (bitmapId && uiManager.imageManager.isValidId(bitmapId)) { + editor.#bitmapId = bitmapId; + } else { + editor.#bitmapUrl = bitmapUrl; + } + editor.#isSvg = isSvg; + const [parentWidth, parentHeight] = editor.pageDimensions; + editor.width = (rect[2] - rect[0]) / parentWidth; + editor.height = (rect[3] - rect[1]) / parentHeight; + if (accessibilityData) { + editor.altTextData = accessibilityData; + } + return editor; + } + serialize(isForCopying = false, context = null) { + if (this.isEmpty()) { + return null; + } + const serialized = { + annotationType: AnnotationEditorType.STAMP, + bitmapId: this.#bitmapId, + pageIndex: this.pageIndex, + rect: this.getRect(0, 0), + rotation: this.rotation, + isSvg: this.#isSvg, + structTreeParentId: this._structTreeParentId + }; + if (isForCopying) { + serialized.bitmapUrl = this.#serializeBitmap(true); + serialized.accessibilityData = this.altTextData; + return serialized; + } + const { + decorative, + altText + } = this.altTextData; + if (!decorative && altText) { + serialized.accessibilityData = { + type: "Figure", + alt: altText + }; + } + if (context === null) { + return serialized; + } + context.stamps ||= new Map(); + const area = this.#isSvg ? (serialized.rect[2] - serialized.rect[0]) * (serialized.rect[3] - serialized.rect[1]) : null; + if (!context.stamps.has(this.#bitmapId)) { + context.stamps.set(this.#bitmapId, { + area, + serialized + }); + serialized.bitmap = this.#serializeBitmap(false); + } else if (this.#isSvg) { + const prevData = context.stamps.get(this.#bitmapId); + if (area > prevData.area) { + prevData.area = area; + prevData.serialized.bitmap.close(); + prevData.serialized.bitmap = this.#serializeBitmap(false); + } + } + return serialized; + } +} + +;// CONCATENATED MODULE: ./src/display/editor/annotation_editor_layer.js + + + + + + + +class AnnotationEditorLayer { + #accessibilityManager; + #allowClick = false; + #annotationLayer = null; + #boundPointerup = null; + #boundPointerdown = null; + #boundTextLayerPointerDown = null; + #editorFocusTimeoutId = null; + #editors = new Map(); + #hadPointerDown = false; + #isCleaningUp = false; + #isDisabling = false; + #textLayer = null; + #uiManager; + static _initialized = false; + static #editorTypes = new Map([FreeTextEditor, InkEditor, StampEditor, HighlightEditor].map(type => [type._editorType, type])); + constructor({ + uiManager, + pageIndex, + div, + accessibilityManager, + annotationLayer, + drawLayer, + textLayer, + viewport, + l10n + }) { + const editorTypes = [...AnnotationEditorLayer.#editorTypes.values()]; + if (!AnnotationEditorLayer._initialized) { + AnnotationEditorLayer._initialized = true; + for (const editorType of editorTypes) { + editorType.initialize(l10n, uiManager); + } + } + uiManager.registerEditorTypes(editorTypes); + this.#uiManager = uiManager; + this.pageIndex = pageIndex; + this.div = div; + this.#accessibilityManager = accessibilityManager; + this.#annotationLayer = annotationLayer; + this.viewport = viewport; + this.#textLayer = textLayer; + this.drawLayer = drawLayer; + this.#uiManager.addLayer(this); + } + get isEmpty() { + return this.#editors.size === 0; + } + get isInvisible() { + return this.isEmpty && this.#uiManager.getMode() === AnnotationEditorType.NONE; + } + updateToolbar(mode) { + this.#uiManager.updateToolbar(mode); + } + updateMode(mode = this.#uiManager.getMode()) { + this.#cleanup(); + switch (mode) { + case AnnotationEditorType.NONE: + this.disableTextSelection(); + this.togglePointerEvents(false); + this.toggleAnnotationLayerPointerEvents(true); + this.disableClick(); + return; + case AnnotationEditorType.INK: + this.addInkEditorIfNeeded(false); + this.disableTextSelection(); + this.togglePointerEvents(true); + this.disableClick(); + break; + case AnnotationEditorType.HIGHLIGHT: + this.enableTextSelection(); + this.togglePointerEvents(false); + this.disableClick(); + break; + default: + this.disableTextSelection(); + this.togglePointerEvents(true); + this.enableClick(); + } + this.toggleAnnotationLayerPointerEvents(false); + const { + classList + } = this.div; + for (const editorType of AnnotationEditorLayer.#editorTypes.values()) { + classList.toggle(`${editorType._type}Editing`, mode === editorType._editorType); + } + this.div.hidden = false; + } + hasTextLayer(textLayer) { + return textLayer === this.#textLayer?.div; + } + addInkEditorIfNeeded(isCommitting) { + if (this.#uiManager.getMode() !== AnnotationEditorType.INK) { + return; + } + if (!isCommitting) { + for (const editor of this.#editors.values()) { + if (editor.isEmpty()) { + editor.setInBackground(); + return; + } + } + } + const editor = this.createAndAddNewEditor({ + offsetX: 0, + offsetY: 0 + }, false); + editor.setInBackground(); + } + setEditingState(isEditing) { + this.#uiManager.setEditingState(isEditing); + } + addCommands(params) { + this.#uiManager.addCommands(params); + } + togglePointerEvents(enabled = false) { + this.div.classList.toggle("disabled", !enabled); + } + toggleAnnotationLayerPointerEvents(enabled = false) { + this.#annotationLayer?.div.classList.toggle("disabled", !enabled); + } + enable() { + this.div.tabIndex = 0; + this.togglePointerEvents(true); + const annotationElementIds = new Set(); + for (const editor of this.#editors.values()) { + editor.enableEditing(); + editor.show(true); + if (editor.annotationElementId) { + this.#uiManager.removeChangedExistingAnnotation(editor); + annotationElementIds.add(editor.annotationElementId); + } + } + if (!this.#annotationLayer) { + return; + } + const editables = this.#annotationLayer.getEditableAnnotations(); + for (const editable of editables) { + editable.hide(); + if (this.#uiManager.isDeletedAnnotationElement(editable.data.id)) { + continue; + } + if (annotationElementIds.has(editable.data.id)) { + continue; + } + const editor = this.deserialize(editable); + if (!editor) { + continue; + } + this.addOrRebuild(editor); + editor.enableEditing(); + } + } + disable() { + this.#isDisabling = true; + this.div.tabIndex = -1; + this.togglePointerEvents(false); + const changedAnnotations = new Map(); + const resetAnnotations = new Map(); + for (const editor of this.#editors.values()) { + editor.disableEditing(); + if (!editor.annotationElementId) { + continue; + } + if (editor.serialize() !== null) { + changedAnnotations.set(editor.annotationElementId, editor); + continue; + } else { + resetAnnotations.set(editor.annotationElementId, editor); + } + this.getEditableAnnotation(editor.annotationElementId)?.show(); + editor.remove(); + } + if (this.#annotationLayer) { + const editables = this.#annotationLayer.getEditableAnnotations(); + for (const editable of editables) { + const { + id + } = editable.data; + if (this.#uiManager.isDeletedAnnotationElement(id)) { + continue; + } + let editor = resetAnnotations.get(id); + if (editor) { + editor.resetAnnotationElement(editable); + editor.show(false); + editable.show(); + continue; + } + editor = changedAnnotations.get(id); + if (editor) { + this.#uiManager.addChangedExistingAnnotation(editor); + editor.renderAnnotationElement(editable); + editor.show(false); + } + editable.show(); + } + } + this.#cleanup(); + if (this.isEmpty) { + this.div.hidden = true; + } + const { + classList + } = this.div; + for (const editorType of AnnotationEditorLayer.#editorTypes.values()) { + classList.remove(`${editorType._type}Editing`); + } + this.disableTextSelection(); + this.toggleAnnotationLayerPointerEvents(true); + this.#isDisabling = false; + } + getEditableAnnotation(id) { + return this.#annotationLayer?.getEditableAnnotation(id) || null; + } + setActiveEditor(editor) { + const currentActive = this.#uiManager.getActive(); + if (currentActive === editor) { + return; + } + this.#uiManager.setActiveEditor(editor); + } + enableTextSelection() { + this.div.tabIndex = -1; + if (this.#textLayer?.div && !this.#boundTextLayerPointerDown) { + this.#boundTextLayerPointerDown = this.#textLayerPointerDown.bind(this); + this.#textLayer.div.addEventListener("pointerdown", this.#boundTextLayerPointerDown, { + signal: this.#uiManager._signal + }); + this.#textLayer.div.classList.add("highlighting"); + } + } + disableTextSelection() { + this.div.tabIndex = 0; + if (this.#textLayer?.div && this.#boundTextLayerPointerDown) { + this.#textLayer.div.removeEventListener("pointerdown", this.#boundTextLayerPointerDown); + this.#boundTextLayerPointerDown = null; + this.#textLayer.div.classList.remove("highlighting"); + } + } + #textLayerPointerDown(event) { + this.#uiManager.unselectAll(); + if (event.target === this.#textLayer.div) { + const { + isMac + } = util_FeatureTest.platform; + if (event.button !== 0 || event.ctrlKey && isMac) { + return; + } + this.#uiManager.showAllEditors("highlight", true, true); + this.#textLayer.div.classList.add("free"); + HighlightEditor.startHighlighting(this, this.#uiManager.direction === "ltr", event); + this.#textLayer.div.addEventListener("pointerup", () => { + this.#textLayer.div.classList.remove("free"); + }, { + once: true, + signal: this.#uiManager._signal + }); + event.preventDefault(); + } + } + enableClick() { + if (this.#boundPointerdown) { + return; + } + const signal = this.#uiManager._signal; + this.#boundPointerdown = this.pointerdown.bind(this); + this.#boundPointerup = this.pointerup.bind(this); + this.div.addEventListener("pointerdown", this.#boundPointerdown, { + signal + }); + this.div.addEventListener("pointerup", this.#boundPointerup, { + signal + }); + } + disableClick() { + if (!this.#boundPointerdown) { + return; + } + this.div.removeEventListener("pointerdown", this.#boundPointerdown); + this.div.removeEventListener("pointerup", this.#boundPointerup); + this.#boundPointerdown = null; + this.#boundPointerup = null; + } + attach(editor) { + this.#editors.set(editor.id, editor); + const { + annotationElementId + } = editor; + if (annotationElementId && this.#uiManager.isDeletedAnnotationElement(annotationElementId)) { + this.#uiManager.removeDeletedAnnotationElement(editor); + } + } + detach(editor) { + this.#editors.delete(editor.id); + this.#accessibilityManager?.removePointerInTextLayer(editor.contentDiv); + if (!this.#isDisabling && editor.annotationElementId) { + this.#uiManager.addDeletedAnnotationElement(editor); + } + } + remove(editor) { + this.detach(editor); + this.#uiManager.removeEditor(editor); + editor.div.remove(); + editor.isAttachedToDOM = false; + if (!this.#isCleaningUp) { + this.addInkEditorIfNeeded(false); + } + } + changeParent(editor) { + if (editor.parent === this) { + return; + } + if (editor.parent && editor.annotationElementId) { + this.#uiManager.addDeletedAnnotationElement(editor.annotationElementId); + AnnotationEditor.deleteAnnotationElement(editor); + editor.annotationElementId = null; + } + this.attach(editor); + editor.parent?.detach(editor); + editor.setParent(this); + if (editor.div && editor.isAttachedToDOM) { + editor.div.remove(); + this.div.append(editor.div); + } + } + add(editor) { + if (editor.parent === this && editor.isAttachedToDOM) { + return; + } + this.changeParent(editor); + this.#uiManager.addEditor(editor); + this.attach(editor); + if (!editor.isAttachedToDOM) { + const div = editor.render(); + this.div.append(div); + editor.isAttachedToDOM = true; + } + editor.fixAndSetPosition(); + editor.onceAdded(); + this.#uiManager.addToAnnotationStorage(editor); + editor._reportTelemetry(editor.telemetryInitialData); + } + moveEditorInDOM(editor) { + if (!editor.isAttachedToDOM) { + return; + } + const { + activeElement + } = document; + if (editor.div.contains(activeElement) && !this.#editorFocusTimeoutId) { + editor._focusEventsAllowed = false; + this.#editorFocusTimeoutId = setTimeout(() => { + this.#editorFocusTimeoutId = null; + if (!editor.div.contains(document.activeElement)) { + editor.div.addEventListener("focusin", () => { + editor._focusEventsAllowed = true; + }, { + once: true, + signal: this.#uiManager._signal + }); + activeElement.focus(); + } else { + editor._focusEventsAllowed = true; + } + }, 0); + } + editor._structTreeParentId = this.#accessibilityManager?.moveElementInDOM(this.div, editor.div, editor.contentDiv, true); + } + addOrRebuild(editor) { + if (editor.needsToBeRebuilt()) { + editor.parent ||= this; + editor.rebuild(); + editor.show(); + } else { + this.add(editor); + } + } + addUndoableEditor(editor) { + const cmd = () => editor._uiManager.rebuild(editor); + const undo = () => { + editor.remove(); + }; + this.addCommands({ + cmd, + undo, + mustExec: false + }); + } + getNextId() { + return this.#uiManager.getId(); + } + get #currentEditorType() { + return AnnotationEditorLayer.#editorTypes.get(this.#uiManager.getMode()); + } + get _signal() { + return this.#uiManager._signal; + } + #createNewEditor(params) { + const editorType = this.#currentEditorType; + return editorType ? new editorType.prototype.constructor(params) : null; + } + canCreateNewEmptyEditor() { + return this.#currentEditorType?.canCreateNewEmptyEditor(); + } + pasteEditor(mode, params) { + this.#uiManager.updateToolbar(mode); + this.#uiManager.updateMode(mode); + const { + offsetX, + offsetY + } = this.#getCenterPoint(); + const id = this.getNextId(); + const editor = this.#createNewEditor({ + parent: this, + id, + x: offsetX, + y: offsetY, + uiManager: this.#uiManager, + isCentered: true, + ...params + }); + if (editor) { + this.add(editor); + } + } + deserialize(data) { + return AnnotationEditorLayer.#editorTypes.get(data.annotationType ?? data.annotationEditorType)?.deserialize(data, this, this.#uiManager) || null; + } + createAndAddNewEditor(event, isCentered, data = {}) { + const id = this.getNextId(); + const editor = this.#createNewEditor({ + parent: this, + id, + x: event.offsetX, + y: event.offsetY, + uiManager: this.#uiManager, + isCentered, + ...data + }); + if (editor) { + this.add(editor); + } + return editor; + } + #getCenterPoint() { + const { + x, + y, + width, + height + } = this.div.getBoundingClientRect(); + const tlX = Math.max(0, x); + const tlY = Math.max(0, y); + const brX = Math.min(window.innerWidth, x + width); + const brY = Math.min(window.innerHeight, y + height); + const centerX = (tlX + brX) / 2 - x; + const centerY = (tlY + brY) / 2 - y; + const [offsetX, offsetY] = this.viewport.rotation % 180 === 0 ? [centerX, centerY] : [centerY, centerX]; + return { + offsetX, + offsetY + }; + } + addNewEditor() { + this.createAndAddNewEditor(this.#getCenterPoint(), true); + } + setSelected(editor) { + this.#uiManager.setSelected(editor); + } + toggleSelected(editor) { + this.#uiManager.toggleSelected(editor); + } + isSelected(editor) { + return this.#uiManager.isSelected(editor); + } + unselect(editor) { + this.#uiManager.unselect(editor); + } + pointerup(event) { + const { + isMac + } = util_FeatureTest.platform; + if (event.button !== 0 || event.ctrlKey && isMac) { + return; + } + if (event.target !== this.div) { + return; + } + if (!this.#hadPointerDown) { + return; + } + this.#hadPointerDown = false; + if (!this.#allowClick) { + this.#allowClick = true; + return; + } + if (this.#uiManager.getMode() === AnnotationEditorType.STAMP) { + this.#uiManager.unselectAll(); + return; + } + this.createAndAddNewEditor(event, false); + } + pointerdown(event) { + if (this.#uiManager.getMode() === AnnotationEditorType.HIGHLIGHT) { + this.enableTextSelection(); + } + if (this.#hadPointerDown) { + this.#hadPointerDown = false; + return; + } + const { + isMac + } = util_FeatureTest.platform; + if (event.button !== 0 || event.ctrlKey && isMac) { + return; + } + if (event.target !== this.div) { + return; + } + this.#hadPointerDown = true; + const editor = this.#uiManager.getActive(); + this.#allowClick = !editor || editor.isEmpty(); + } + findNewParent(editor, x, y) { + const layer = this.#uiManager.findParent(x, y); + if (layer === null || layer === this) { + return false; + } + layer.changeParent(editor); + return true; + } + destroy() { + if (this.#uiManager.getActive()?.parent === this) { + this.#uiManager.commitOrRemove(); + this.#uiManager.setActiveEditor(null); + } + if (this.#editorFocusTimeoutId) { + clearTimeout(this.#editorFocusTimeoutId); + this.#editorFocusTimeoutId = null; + } + for (const editor of this.#editors.values()) { + this.#accessibilityManager?.removePointerInTextLayer(editor.contentDiv); + editor.setParent(null); + editor.isAttachedToDOM = false; + editor.div.remove(); + } + this.div = null; + this.#editors.clear(); + this.#uiManager.removeLayer(this); + } + #cleanup() { + this.#isCleaningUp = true; + for (const editor of this.#editors.values()) { + if (editor.isEmpty()) { + editor.remove(); + } + } + this.#isCleaningUp = false; + } + render({ + viewport + }) { + this.viewport = viewport; + setLayerDimensions(this.div, viewport); + for (const editor of this.#uiManager.getEditors(this.pageIndex)) { + this.add(editor); + editor.rebuild(); + } + this.updateMode(); + } + update({ + viewport + }) { + this.#uiManager.commitOrRemove(); + this.#cleanup(); + const oldRotation = this.viewport.rotation; + const rotation = viewport.rotation; + this.viewport = viewport; + setLayerDimensions(this.div, { + rotation + }); + if (oldRotation !== rotation) { + for (const editor of this.#editors.values()) { + editor.rotate(rotation); + } + } + this.addInkEditorIfNeeded(false); + } + get pageDimensions() { + const { + pageWidth, + pageHeight + } = this.viewport.rawDims; + return [pageWidth, pageHeight]; + } + get scale() { + return this.#uiManager.viewParameters.realScale; + } +} + +;// CONCATENATED MODULE: ./src/display/draw_layer.js + + +class DrawLayer { + #parent = null; + #id = 0; + #mapping = new Map(); + #toUpdate = new Map(); + constructor({ + pageIndex + }) { + this.pageIndex = pageIndex; + } + setParent(parent) { + if (!this.#parent) { + this.#parent = parent; + return; + } + if (this.#parent !== parent) { + if (this.#mapping.size > 0) { + for (const root of this.#mapping.values()) { + root.remove(); + parent.append(root); + } + } + this.#parent = parent; + } + } + static get _svgFactory() { + return shadow(this, "_svgFactory", new DOMSVGFactory()); + } + static #setBox(element, { + x = 0, + y = 0, + width = 1, + height = 1 + } = {}) { + const { + style + } = element; + style.top = `${100 * y}%`; + style.left = `${100 * x}%`; + style.width = `${100 * width}%`; + style.height = `${100 * height}%`; + } + #createSVG(box) { + const svg = DrawLayer._svgFactory.create(1, 1, true); + this.#parent.append(svg); + svg.setAttribute("aria-hidden", true); + DrawLayer.#setBox(svg, box); + return svg; + } + #createClipPath(defs, pathId) { + const clipPath = DrawLayer._svgFactory.createElement("clipPath"); + defs.append(clipPath); + const clipPathId = `clip_${pathId}`; + clipPath.setAttribute("id", clipPathId); + clipPath.setAttribute("clipPathUnits", "objectBoundingBox"); + const clipPathUse = DrawLayer._svgFactory.createElement("use"); + clipPath.append(clipPathUse); + clipPathUse.setAttribute("href", `#${pathId}`); + clipPathUse.classList.add("clip"); + return clipPathId; + } + highlight(outlines, color, opacity, isPathUpdatable = false) { + const id = this.#id++; + const root = this.#createSVG(outlines.box); + root.classList.add("highlight"); + if (outlines.free) { + root.classList.add("free"); + } + const defs = DrawLayer._svgFactory.createElement("defs"); + root.append(defs); + const path = DrawLayer._svgFactory.createElement("path"); + defs.append(path); + const pathId = `path_p${this.pageIndex}_${id}`; + path.setAttribute("id", pathId); + path.setAttribute("d", outlines.toSVGPath()); + if (isPathUpdatable) { + this.#toUpdate.set(id, path); + } + const clipPathId = this.#createClipPath(defs, pathId); + const use = DrawLayer._svgFactory.createElement("use"); + root.append(use); + root.setAttribute("fill", color); + root.setAttribute("fill-opacity", opacity); + use.setAttribute("href", `#${pathId}`); + this.#mapping.set(id, root); + return { + id, + clipPathId: `url(#${clipPathId})` + }; + } + highlightOutline(outlines) { + const id = this.#id++; + const root = this.#createSVG(outlines.box); + root.classList.add("highlightOutline"); + const defs = DrawLayer._svgFactory.createElement("defs"); + root.append(defs); + const path = DrawLayer._svgFactory.createElement("path"); + defs.append(path); + const pathId = `path_p${this.pageIndex}_${id}`; + path.setAttribute("id", pathId); + path.setAttribute("d", outlines.toSVGPath()); + path.setAttribute("vector-effect", "non-scaling-stroke"); + let maskId; + if (outlines.free) { + root.classList.add("free"); + const mask = DrawLayer._svgFactory.createElement("mask"); + defs.append(mask); + maskId = `mask_p${this.pageIndex}_${id}`; + mask.setAttribute("id", maskId); + mask.setAttribute("maskUnits", "objectBoundingBox"); + const rect = DrawLayer._svgFactory.createElement("rect"); + mask.append(rect); + rect.setAttribute("width", "1"); + rect.setAttribute("height", "1"); + rect.setAttribute("fill", "white"); + const use = DrawLayer._svgFactory.createElement("use"); + mask.append(use); + use.setAttribute("href", `#${pathId}`); + use.setAttribute("stroke", "none"); + use.setAttribute("fill", "black"); + use.setAttribute("fill-rule", "nonzero"); + use.classList.add("mask"); + } + const use1 = DrawLayer._svgFactory.createElement("use"); + root.append(use1); + use1.setAttribute("href", `#${pathId}`); + if (maskId) { + use1.setAttribute("mask", `url(#${maskId})`); + } + const use2 = use1.cloneNode(); + root.append(use2); + use1.classList.add("mainOutline"); + use2.classList.add("secondaryOutline"); + this.#mapping.set(id, root); + return id; + } + finalizeLine(id, line) { + const path = this.#toUpdate.get(id); + this.#toUpdate.delete(id); + this.updateBox(id, line.box); + path.setAttribute("d", line.toSVGPath()); + } + updateLine(id, line) { + const root = this.#mapping.get(id); + const defs = root.firstChild; + const path = defs.firstChild; + path.setAttribute("d", line.toSVGPath()); + } + removeFreeHighlight(id) { + this.remove(id); + this.#toUpdate.delete(id); + } + updatePath(id, line) { + this.#toUpdate.get(id).setAttribute("d", line.toSVGPath()); + } + updateBox(id, box) { + DrawLayer.#setBox(this.#mapping.get(id), box); + } + show(id, visible) { + this.#mapping.get(id).classList.toggle("hidden", !visible); + } + rotate(id, angle) { + this.#mapping.get(id).setAttribute("data-main-rotation", angle); + } + changeColor(id, color) { + this.#mapping.get(id).setAttribute("fill", color); + } + changeOpacity(id, opacity) { + this.#mapping.get(id).setAttribute("fill-opacity", opacity); + } + addClass(id, className) { + this.#mapping.get(id).classList.add(className); + } + removeClass(id, className) { + this.#mapping.get(id).classList.remove(className); + } + remove(id) { + if (this.#parent === null) { + return; + } + this.#mapping.get(id).remove(); + this.#mapping.delete(id); + } + destroy() { + this.#parent = null; + for (const root of this.#mapping.values()) { + root.remove(); + } + this.#mapping.clear(); + } +} + +;// CONCATENATED MODULE: ./src/pdf.js + + + + + + + + + + + + +const pdfjsVersion = "4.4.168"; +const pdfjsBuild = "19fbc8998"; + +var __webpack_exports__AbortException = __webpack_exports__.AbortException; +var __webpack_exports__AnnotationEditorLayer = __webpack_exports__.AnnotationEditorLayer; +var __webpack_exports__AnnotationEditorParamsType = __webpack_exports__.AnnotationEditorParamsType; +var __webpack_exports__AnnotationEditorType = __webpack_exports__.AnnotationEditorType; +var __webpack_exports__AnnotationEditorUIManager = __webpack_exports__.AnnotationEditorUIManager; +var __webpack_exports__AnnotationLayer = __webpack_exports__.AnnotationLayer; +var __webpack_exports__AnnotationMode = __webpack_exports__.AnnotationMode; +var __webpack_exports__CMapCompressionType = __webpack_exports__.CMapCompressionType; +var __webpack_exports__ColorPicker = __webpack_exports__.ColorPicker; +var __webpack_exports__DOMSVGFactory = __webpack_exports__.DOMSVGFactory; +var __webpack_exports__DrawLayer = __webpack_exports__.DrawLayer; +var __webpack_exports__FeatureTest = __webpack_exports__.FeatureTest; +var __webpack_exports__GlobalWorkerOptions = __webpack_exports__.GlobalWorkerOptions; +var __webpack_exports__ImageKind = __webpack_exports__.ImageKind; +var __webpack_exports__InvalidPDFException = __webpack_exports__.InvalidPDFException; +var __webpack_exports__MissingPDFException = __webpack_exports__.MissingPDFException; +var __webpack_exports__OPS = __webpack_exports__.OPS; +var __webpack_exports__Outliner = __webpack_exports__.Outliner; +var __webpack_exports__PDFDataRangeTransport = __webpack_exports__.PDFDataRangeTransport; +var __webpack_exports__PDFDateString = __webpack_exports__.PDFDateString; +var __webpack_exports__PDFWorker = __webpack_exports__.PDFWorker; +var __webpack_exports__PasswordResponses = __webpack_exports__.PasswordResponses; +var __webpack_exports__PermissionFlag = __webpack_exports__.PermissionFlag; +var __webpack_exports__PixelsPerInch = __webpack_exports__.PixelsPerInch; +var __webpack_exports__RenderingCancelledException = __webpack_exports__.RenderingCancelledException; +var __webpack_exports__TextLayer = __webpack_exports__.TextLayer; +var __webpack_exports__UnexpectedResponseException = __webpack_exports__.UnexpectedResponseException; +var __webpack_exports__Util = __webpack_exports__.Util; +var __webpack_exports__VerbosityLevel = __webpack_exports__.VerbosityLevel; +var __webpack_exports__XfaLayer = __webpack_exports__.XfaLayer; +var __webpack_exports__build = __webpack_exports__.build; +var __webpack_exports__createValidAbsoluteUrl = __webpack_exports__.createValidAbsoluteUrl; +var __webpack_exports__fetchData = __webpack_exports__.fetchData; +var __webpack_exports__getDocument = __webpack_exports__.getDocument; +var __webpack_exports__getFilenameFromUrl = __webpack_exports__.getFilenameFromUrl; +var __webpack_exports__getPdfFilenameFromUrl = __webpack_exports__.getPdfFilenameFromUrl; +var __webpack_exports__getXfaPageViewport = __webpack_exports__.getXfaPageViewport; +var __webpack_exports__isDataScheme = __webpack_exports__.isDataScheme; +var __webpack_exports__isPdfFile = __webpack_exports__.isPdfFile; +var __webpack_exports__noContextMenu = __webpack_exports__.noContextMenu; +var __webpack_exports__normalizeUnicode = __webpack_exports__.normalizeUnicode; +var __webpack_exports__renderTextLayer = __webpack_exports__.renderTextLayer; +var __webpack_exports__setLayerDimensions = __webpack_exports__.setLayerDimensions; +var __webpack_exports__shadow = __webpack_exports__.shadow; +var __webpack_exports__updateTextLayer = __webpack_exports__.updateTextLayer; +var __webpack_exports__version = __webpack_exports__.version; +export { __webpack_exports__AbortException as AbortException, __webpack_exports__AnnotationEditorLayer as AnnotationEditorLayer, __webpack_exports__AnnotationEditorParamsType as AnnotationEditorParamsType, __webpack_exports__AnnotationEditorType as AnnotationEditorType, __webpack_exports__AnnotationEditorUIManager as AnnotationEditorUIManager, __webpack_exports__AnnotationLayer as AnnotationLayer, __webpack_exports__AnnotationMode as AnnotationMode, __webpack_exports__CMapCompressionType as CMapCompressionType, __webpack_exports__ColorPicker as ColorPicker, __webpack_exports__DOMSVGFactory as DOMSVGFactory, __webpack_exports__DrawLayer as DrawLayer, __webpack_exports__FeatureTest as FeatureTest, __webpack_exports__GlobalWorkerOptions as GlobalWorkerOptions, __webpack_exports__ImageKind as ImageKind, __webpack_exports__InvalidPDFException as InvalidPDFException, __webpack_exports__MissingPDFException as MissingPDFException, __webpack_exports__OPS as OPS, __webpack_exports__Outliner as Outliner, __webpack_exports__PDFDataRangeTransport as PDFDataRangeTransport, __webpack_exports__PDFDateString as PDFDateString, __webpack_exports__PDFWorker as PDFWorker, __webpack_exports__PasswordResponses as PasswordResponses, __webpack_exports__PermissionFlag as PermissionFlag, __webpack_exports__PixelsPerInch as PixelsPerInch, __webpack_exports__RenderingCancelledException as RenderingCancelledException, __webpack_exports__TextLayer as TextLayer, __webpack_exports__UnexpectedResponseException as UnexpectedResponseException, __webpack_exports__Util as Util, __webpack_exports__VerbosityLevel as VerbosityLevel, __webpack_exports__XfaLayer as XfaLayer, __webpack_exports__build as build, __webpack_exports__createValidAbsoluteUrl as createValidAbsoluteUrl, __webpack_exports__fetchData as fetchData, __webpack_exports__getDocument as getDocument, __webpack_exports__getFilenameFromUrl as getFilenameFromUrl, __webpack_exports__getPdfFilenameFromUrl as getPdfFilenameFromUrl, __webpack_exports__getXfaPageViewport as getXfaPageViewport, __webpack_exports__isDataScheme as isDataScheme, __webpack_exports__isPdfFile as isPdfFile, __webpack_exports__noContextMenu as noContextMenu, __webpack_exports__normalizeUnicode as normalizeUnicode, __webpack_exports__renderTextLayer as renderTextLayer, __webpack_exports__setLayerDimensions as setLayerDimensions, __webpack_exports__shadow as shadow, __webpack_exports__updateTextLayer as updateTextLayer, __webpack_exports__version as version }; + +//# sourceMappingURL=pdf.mjs.map \ No newline at end of file diff --git a/src/renderer/public/lib/build/pdf.mjs.map b/src/renderer/public/lib/build/pdf.mjs.map new file mode 100644 index 0000000..cf1115a --- /dev/null +++ b/src/renderer/public/lib/build/pdf.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"pdf.mjs","mappings":"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E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAC7E,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC7E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAC7E,MAAM,EAAE,MAAM,EAAE,MA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","sources":["webpack://pdf.js/webpack/bootstrap","webpack://pdf.js/webpack/runtime/define property getters","webpack://pdf.js/webpack/runtime/hasOwnProperty shorthand","webpack://pdf.js/./src/shared/util.js","webpack://pdf.js/./src/display/base_factory.js","webpack://pdf.js/./src/display/display_utils.js","webpack://pdf.js/./src/display/editor/toolbar.js","webpack://pdf.js/./src/display/editor/tools.js","webpack://pdf.js/./src/display/editor/alt_text.js","webpack://pdf.js/./src/display/editor/editor.js","webpack://pdf.js/./src/shared/murmurhash3.js","webpack://pdf.js/./src/display/annotation_storage.js","webpack://pdf.js/./src/display/font_loader.js","webpack://pdf.js/./src/display/node_utils.js","webpack://pdf.js/./src/display/pattern_helper.js","webpack://pdf.js/./src/shared/image_utils.js","webpack://pdf.js/./src/display/canvas.js","webpack://pdf.js/./src/display/worker_options.js","webpack://pdf.js/./src/shared/message_handler.js","webpack://pdf.js/./src/display/metadata.js","webpack://pdf.js/./src/display/optional_content_config.js","webpack://pdf.js/./src/display/transport_stream.js","webpack://pdf.js/./src/display/content_disposition.js","webpack://pdf.js/./src/display/network_utils.js","webpack://pdf.js/./src/display/fetch_stream.js","webpack://pdf.js/./src/display/network.js","webpack://pdf.js/./src/display/node_stream.js","webpack://pdf.js/./src/display/text_layer.js","webpack://pdf.js/./src/display/xfa_text.js","webpack://pdf.js/./src/display/api.js","webpack://pdf.js/./src/shared/scripting_utils.js","webpack://pdf.js/./src/display/xfa_layer.js","webpack://pdf.js/./src/display/annotation_layer.js","webpack://pdf.js/./src/display/editor/freetext.js","webpack://pdf.js/./src/display/editor/outliner.js","webpack://pdf.js/./src/display/editor/color_picker.js","webpack://pdf.js/./src/display/editor/highlight.js","webpack://pdf.js/./src/display/editor/ink.js","webpack://pdf.js/./src/display/editor/stamp.js","webpack://pdf.js/./src/display/editor/annotation_editor_layer.js","webpack://pdf.js/./src/display/draw_layer.js","webpack://pdf.js/./src/pdf.js"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* globals process */\n\n// NW.js / Electron is a browser context, but copies some Node.js objects; see\n// http://docs.nwjs.io/en/latest/For%20Users/Advanced/JavaScript%20Contexts%20in%20NW.js/#access-nodejs-and-nwjs-api-in-browser-context\n// https://www.electronjs.org/docs/api/process#processversionselectron-readonly\n// https://www.electronjs.org/docs/api/process#processtype-readonly\nconst isNodeJS =\n (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) &&\n typeof process === \"object\" &&\n process + \"\" === \"[object process]\" &&\n !process.versions.nw &&\n !(process.versions.electron && process.type && process.type !== \"browser\");\n\nconst IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0];\nconst FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0];\n\nconst MAX_IMAGE_SIZE_TO_CACHE = 10e6; // Ten megabytes.\n\n// Represent the percentage of the height of a single-line field over\n// the font size. Acrobat seems to use this value.\nconst LINE_FACTOR = 1.35;\nconst LINE_DESCENT_FACTOR = 0.35;\nconst BASELINE_FACTOR = LINE_DESCENT_FACTOR / LINE_FACTOR;\n\n/**\n * Refer to the `WorkerTransport.getRenderingIntent`-method in the API, to see\n * how these flags are being used:\n * - ANY, DISPLAY, and PRINT are the normal rendering intents, note the\n * `PDFPageProxy.{render, getOperatorList, getAnnotations}`-methods.\n * - ANNOTATIONS_FORMS, ANNOTATIONS_STORAGE, ANNOTATIONS_DISABLE control which\n * annotations are rendered onto the canvas (i.e. by being included in the\n * operatorList), note the `PDFPageProxy.{render, getOperatorList}`-methods\n * and their `annotationMode`-option.\n * - OPLIST is used with the `PDFPageProxy.getOperatorList`-method, note the\n * `OperatorList`-constructor (on the worker-thread).\n */\nconst RenderingIntentFlag = {\n ANY: 0x01,\n DISPLAY: 0x02,\n PRINT: 0x04,\n SAVE: 0x08,\n ANNOTATIONS_FORMS: 0x10,\n ANNOTATIONS_STORAGE: 0x20,\n ANNOTATIONS_DISABLE: 0x40,\n OPLIST: 0x100,\n};\n\nconst AnnotationMode = {\n DISABLE: 0,\n ENABLE: 1,\n ENABLE_FORMS: 2,\n ENABLE_STORAGE: 3,\n};\n\nconst AnnotationEditorPrefix = \"pdfjs_internal_editor_\";\n\nconst AnnotationEditorType = {\n DISABLE: -1,\n NONE: 0,\n FREETEXT: 3,\n HIGHLIGHT: 9,\n STAMP: 13,\n INK: 15,\n};\n\nconst AnnotationEditorParamsType = {\n RESIZE: 1,\n CREATE: 2,\n FREETEXT_SIZE: 11,\n FREETEXT_COLOR: 12,\n FREETEXT_OPACITY: 13,\n INK_COLOR: 21,\n INK_THICKNESS: 22,\n INK_OPACITY: 23,\n HIGHLIGHT_COLOR: 31,\n HIGHLIGHT_DEFAULT_COLOR: 32,\n HIGHLIGHT_THICKNESS: 33,\n HIGHLIGHT_FREE: 34,\n HIGHLIGHT_SHOW_ALL: 35,\n};\n\n// Permission flags from Table 22, Section 7.6.3.2 of the PDF specification.\nconst PermissionFlag = {\n PRINT: 0x04,\n MODIFY_CONTENTS: 0x08,\n COPY: 0x10,\n MODIFY_ANNOTATIONS: 0x20,\n FILL_INTERACTIVE_FORMS: 0x100,\n COPY_FOR_ACCESSIBILITY: 0x200,\n ASSEMBLE: 0x400,\n PRINT_HIGH_QUALITY: 0x800,\n};\n\nconst TextRenderingMode = {\n FILL: 0,\n STROKE: 1,\n FILL_STROKE: 2,\n INVISIBLE: 3,\n FILL_ADD_TO_PATH: 4,\n STROKE_ADD_TO_PATH: 5,\n FILL_STROKE_ADD_TO_PATH: 6,\n ADD_TO_PATH: 7,\n FILL_STROKE_MASK: 3,\n ADD_TO_PATH_FLAG: 4,\n};\n\nconst ImageKind = {\n GRAYSCALE_1BPP: 1,\n RGB_24BPP: 2,\n RGBA_32BPP: 3,\n};\n\nconst AnnotationType = {\n TEXT: 1,\n LINK: 2,\n FREETEXT: 3,\n LINE: 4,\n SQUARE: 5,\n CIRCLE: 6,\n POLYGON: 7,\n POLYLINE: 8,\n HIGHLIGHT: 9,\n UNDERLINE: 10,\n SQUIGGLY: 11,\n STRIKEOUT: 12,\n STAMP: 13,\n CARET: 14,\n INK: 15,\n POPUP: 16,\n FILEATTACHMENT: 17,\n SOUND: 18,\n MOVIE: 19,\n WIDGET: 20,\n SCREEN: 21,\n PRINTERMARK: 22,\n TRAPNET: 23,\n WATERMARK: 24,\n THREED: 25,\n REDACT: 26,\n};\n\nconst AnnotationReplyType = {\n GROUP: \"Group\",\n REPLY: \"R\",\n};\n\nconst AnnotationFlag = {\n INVISIBLE: 0x01,\n HIDDEN: 0x02,\n PRINT: 0x04,\n NOZOOM: 0x08,\n NOROTATE: 0x10,\n NOVIEW: 0x20,\n READONLY: 0x40,\n LOCKED: 0x80,\n TOGGLENOVIEW: 0x100,\n LOCKEDCONTENTS: 0x200,\n};\n\nconst AnnotationFieldFlag = {\n READONLY: 0x0000001,\n REQUIRED: 0x0000002,\n NOEXPORT: 0x0000004,\n MULTILINE: 0x0001000,\n PASSWORD: 0x0002000,\n NOTOGGLETOOFF: 0x0004000,\n RADIO: 0x0008000,\n PUSHBUTTON: 0x0010000,\n COMBO: 0x0020000,\n EDIT: 0x0040000,\n SORT: 0x0080000,\n FILESELECT: 0x0100000,\n MULTISELECT: 0x0200000,\n DONOTSPELLCHECK: 0x0400000,\n DONOTSCROLL: 0x0800000,\n COMB: 0x1000000,\n RICHTEXT: 0x2000000,\n RADIOSINUNISON: 0x2000000,\n COMMITONSELCHANGE: 0x4000000,\n};\n\nconst AnnotationBorderStyleType = {\n SOLID: 1,\n DASHED: 2,\n BEVELED: 3,\n INSET: 4,\n UNDERLINE: 5,\n};\n\nconst AnnotationActionEventType = {\n E: \"Mouse Enter\",\n X: \"Mouse Exit\",\n D: \"Mouse Down\",\n U: \"Mouse Up\",\n Fo: \"Focus\",\n Bl: \"Blur\",\n PO: \"PageOpen\",\n PC: \"PageClose\",\n PV: \"PageVisible\",\n PI: \"PageInvisible\",\n K: \"Keystroke\",\n F: \"Format\",\n V: \"Validate\",\n C: \"Calculate\",\n};\n\nconst DocumentActionEventType = {\n WC: \"WillClose\",\n WS: \"WillSave\",\n DS: \"DidSave\",\n WP: \"WillPrint\",\n DP: \"DidPrint\",\n};\n\nconst PageActionEventType = {\n O: \"PageOpen\",\n C: \"PageClose\",\n};\n\nconst VerbosityLevel = {\n ERRORS: 0,\n WARNINGS: 1,\n INFOS: 5,\n};\n\nconst CMapCompressionType = {\n NONE: 0,\n BINARY: 1,\n};\n\n// All the possible operations for an operator list.\nconst OPS = {\n // Intentionally start from 1 so it is easy to spot bad operators that will be\n // 0's.\n // PLEASE NOTE: We purposely keep any removed operators commented out, since\n // re-numbering the list would risk breaking third-party users.\n dependency: 1,\n setLineWidth: 2,\n setLineCap: 3,\n setLineJoin: 4,\n setMiterLimit: 5,\n setDash: 6,\n setRenderingIntent: 7,\n setFlatness: 8,\n setGState: 9,\n save: 10,\n restore: 11,\n transform: 12,\n moveTo: 13,\n lineTo: 14,\n curveTo: 15,\n curveTo2: 16,\n curveTo3: 17,\n closePath: 18,\n rectangle: 19,\n stroke: 20,\n closeStroke: 21,\n fill: 22,\n eoFill: 23,\n fillStroke: 24,\n eoFillStroke: 25,\n closeFillStroke: 26,\n closeEOFillStroke: 27,\n endPath: 28,\n clip: 29,\n eoClip: 30,\n beginText: 31,\n endText: 32,\n setCharSpacing: 33,\n setWordSpacing: 34,\n setHScale: 35,\n setLeading: 36,\n setFont: 37,\n setTextRenderingMode: 38,\n setTextRise: 39,\n moveText: 40,\n setLeadingMoveText: 41,\n setTextMatrix: 42,\n nextLine: 43,\n showText: 44,\n showSpacedText: 45,\n nextLineShowText: 46,\n nextLineSetSpacingShowText: 47,\n setCharWidth: 48,\n setCharWidthAndBounds: 49,\n setStrokeColorSpace: 50,\n setFillColorSpace: 51,\n setStrokeColor: 52,\n setStrokeColorN: 53,\n setFillColor: 54,\n setFillColorN: 55,\n setStrokeGray: 56,\n setFillGray: 57,\n setStrokeRGBColor: 58,\n setFillRGBColor: 59,\n setStrokeCMYKColor: 60,\n setFillCMYKColor: 61,\n shadingFill: 62,\n beginInlineImage: 63,\n beginImageData: 64,\n endInlineImage: 65,\n paintXObject: 66,\n markPoint: 67,\n markPointProps: 68,\n beginMarkedContent: 69,\n beginMarkedContentProps: 70,\n endMarkedContent: 71,\n beginCompat: 72,\n endCompat: 73,\n paintFormXObjectBegin: 74,\n paintFormXObjectEnd: 75,\n beginGroup: 76,\n endGroup: 77,\n // beginAnnotations: 78,\n // endAnnotations: 79,\n beginAnnotation: 80,\n endAnnotation: 81,\n // paintJpegXObject: 82,\n paintImageMaskXObject: 83,\n paintImageMaskXObjectGroup: 84,\n paintImageXObject: 85,\n paintInlineImageXObject: 86,\n paintInlineImageXObjectGroup: 87,\n paintImageXObjectRepeat: 88,\n paintImageMaskXObjectRepeat: 89,\n paintSolidColorImageMask: 90,\n constructPath: 91,\n};\n\nconst PasswordResponses = {\n NEED_PASSWORD: 1,\n INCORRECT_PASSWORD: 2,\n};\n\nlet verbosity = VerbosityLevel.WARNINGS;\n\nfunction setVerbosityLevel(level) {\n if (Number.isInteger(level)) {\n verbosity = level;\n }\n}\n\nfunction getVerbosityLevel() {\n return verbosity;\n}\n\n// A notice for devs. These are good for things that are helpful to devs, such\n// as warning that Workers were disabled, which is important to devs but not\n// end users.\nfunction info(msg) {\n if (verbosity >= VerbosityLevel.INFOS) {\n console.log(`Info: ${msg}`);\n }\n}\n\n// Non-fatal warnings.\nfunction warn(msg) {\n if (verbosity >= VerbosityLevel.WARNINGS) {\n console.log(`Warning: ${msg}`);\n }\n}\n\nfunction unreachable(msg) {\n throw new Error(msg);\n}\n\nfunction assert(cond, msg) {\n if (!cond) {\n unreachable(msg);\n }\n}\n\n// Checks if URLs use one of the allowed protocols, e.g. to avoid XSS.\nfunction _isValidProtocol(url) {\n switch (url?.protocol) {\n case \"http:\":\n case \"https:\":\n case \"ftp:\":\n case \"mailto:\":\n case \"tel:\":\n return true;\n default:\n return false;\n }\n}\n\n/**\n * Attempts to create a valid absolute URL.\n *\n * @param {URL|string} url - An absolute, or relative, URL.\n * @param {URL|string} [baseUrl] - An absolute URL.\n * @param {Object} [options]\n * @returns Either a valid {URL}, or `null` otherwise.\n */\nfunction createValidAbsoluteUrl(url, baseUrl = null, options = null) {\n if (!url) {\n return null;\n }\n try {\n if (options && typeof url === \"string\") {\n // Let URLs beginning with \"www.\" default to using the \"http://\" protocol.\n if (options.addDefaultProtocol && url.startsWith(\"www.\")) {\n const dots = url.match(/\\./g);\n // Avoid accidentally matching a *relative* URL pointing to a file named\n // e.g. \"www.pdf\" or similar.\n if (dots?.length >= 2) {\n url = `http://${url}`;\n }\n }\n\n // According to ISO 32000-1:2008, section 12.6.4.7, URIs should be encoded\n // in 7-bit ASCII. Some bad PDFs use UTF-8 encoding; see bug 1122280.\n if (options.tryConvertEncoding) {\n try {\n url = stringToUTF8String(url);\n } catch {}\n }\n }\n\n const absoluteUrl = baseUrl ? new URL(url, baseUrl) : new URL(url);\n if (_isValidProtocol(absoluteUrl)) {\n return absoluteUrl;\n }\n } catch {\n /* `new URL()` will throw on incorrect data. */\n }\n return null;\n}\n\nfunction shadow(obj, prop, value, nonSerializable = false) {\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n assert(\n prop in obj,\n `shadow: Property \"${prop && prop.toString()}\" not found in object.`\n );\n }\n Object.defineProperty(obj, prop, {\n value,\n enumerable: !nonSerializable,\n configurable: true,\n writable: false,\n });\n return value;\n}\n\n/**\n * @type {any}\n */\nconst BaseException = (function BaseExceptionClosure() {\n // eslint-disable-next-line no-shadow\n function BaseException(message, name) {\n if (this.constructor === BaseException) {\n unreachable(\"Cannot initialize BaseException.\");\n }\n this.message = message;\n this.name = name;\n }\n BaseException.prototype = new Error();\n BaseException.constructor = BaseException;\n\n return BaseException;\n})();\n\nclass PasswordException extends BaseException {\n constructor(msg, code) {\n super(msg, \"PasswordException\");\n this.code = code;\n }\n}\n\nclass UnknownErrorException extends BaseException {\n constructor(msg, details) {\n super(msg, \"UnknownErrorException\");\n this.details = details;\n }\n}\n\nclass InvalidPDFException extends BaseException {\n constructor(msg) {\n super(msg, \"InvalidPDFException\");\n }\n}\n\nclass MissingPDFException extends BaseException {\n constructor(msg) {\n super(msg, \"MissingPDFException\");\n }\n}\n\nclass UnexpectedResponseException extends BaseException {\n constructor(msg, status) {\n super(msg, \"UnexpectedResponseException\");\n this.status = status;\n }\n}\n\n/**\n * Error caused during parsing PDF data.\n */\nclass FormatError extends BaseException {\n constructor(msg) {\n super(msg, \"FormatError\");\n }\n}\n\n/**\n * Error used to indicate task cancellation.\n */\nclass AbortException extends BaseException {\n constructor(msg) {\n super(msg, \"AbortException\");\n }\n}\n\nfunction bytesToString(bytes) {\n if (typeof bytes !== \"object\" || bytes?.length === undefined) {\n unreachable(\"Invalid argument for bytesToString\");\n }\n const length = bytes.length;\n const MAX_ARGUMENT_COUNT = 8192;\n if (length < MAX_ARGUMENT_COUNT) {\n return String.fromCharCode.apply(null, bytes);\n }\n const strBuf = [];\n for (let i = 0; i < length; i += MAX_ARGUMENT_COUNT) {\n const chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length);\n const chunk = bytes.subarray(i, chunkEnd);\n strBuf.push(String.fromCharCode.apply(null, chunk));\n }\n return strBuf.join(\"\");\n}\n\nfunction stringToBytes(str) {\n if (typeof str !== \"string\") {\n unreachable(\"Invalid argument for stringToBytes\");\n }\n const length = str.length;\n const bytes = new Uint8Array(length);\n for (let i = 0; i < length; ++i) {\n bytes[i] = str.charCodeAt(i) & 0xff;\n }\n return bytes;\n}\n\nfunction string32(value) {\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n assert(\n typeof value === \"number\" && Math.abs(value) < 2 ** 32,\n `string32: Unexpected input \"${value}\".`\n );\n }\n return String.fromCharCode(\n (value >> 24) & 0xff,\n (value >> 16) & 0xff,\n (value >> 8) & 0xff,\n value & 0xff\n );\n}\n\nfunction objectSize(obj) {\n return Object.keys(obj).length;\n}\n\n// Ensure that the returned Object has a `null` prototype; hence why\n// `Object.fromEntries(...)` is not used.\nfunction objectFromMap(map) {\n const obj = Object.create(null);\n for (const [key, value] of map) {\n obj[key] = value;\n }\n return obj;\n}\n\n// Checks the endianness of the platform.\nfunction isLittleEndian() {\n const buffer8 = new Uint8Array(4);\n buffer8[0] = 1;\n const view32 = new Uint32Array(buffer8.buffer, 0, 1);\n return view32[0] === 1;\n}\n\n// Checks if it's possible to eval JS expressions.\nfunction isEvalSupported() {\n try {\n new Function(\"\"); // eslint-disable-line no-new, no-new-func\n return true;\n } catch {\n return false;\n }\n}\n\nclass FeatureTest {\n static get isLittleEndian() {\n return shadow(this, \"isLittleEndian\", isLittleEndian());\n }\n\n static get isEvalSupported() {\n return shadow(this, \"isEvalSupported\", isEvalSupported());\n }\n\n static get isOffscreenCanvasSupported() {\n return shadow(\n this,\n \"isOffscreenCanvasSupported\",\n typeof OffscreenCanvas !== \"undefined\"\n );\n }\n\n static get platform() {\n if (\n (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n (typeof navigator !== \"undefined\" &&\n typeof navigator?.platform === \"string\")\n ) {\n return shadow(this, \"platform\", {\n isMac: navigator.platform.includes(\"Mac\"),\n });\n }\n return shadow(this, \"platform\", { isMac: false });\n }\n\n static get isCSSRoundSupported() {\n return shadow(\n this,\n \"isCSSRoundSupported\",\n globalThis.CSS?.supports?.(\"width: round(1.5px, 1px)\")\n );\n }\n}\n\nconst hexNumbers = Array.from(Array(256).keys(), n =>\n n.toString(16).padStart(2, \"0\")\n);\n\nclass Util {\n static makeHexColor(r, g, b) {\n return `#${hexNumbers[r]}${hexNumbers[g]}${hexNumbers[b]}`;\n }\n\n // Apply a scaling matrix to some min/max values.\n // If a scaling factor is negative then min and max must be\n // swapped.\n static scaleMinMax(transform, minMax) {\n let temp;\n if (transform[0]) {\n if (transform[0] < 0) {\n temp = minMax[0];\n minMax[0] = minMax[2];\n minMax[2] = temp;\n }\n minMax[0] *= transform[0];\n minMax[2] *= transform[0];\n\n if (transform[3] < 0) {\n temp = minMax[1];\n minMax[1] = minMax[3];\n minMax[3] = temp;\n }\n minMax[1] *= transform[3];\n minMax[3] *= transform[3];\n } else {\n temp = minMax[0];\n minMax[0] = minMax[1];\n minMax[1] = temp;\n temp = minMax[2];\n minMax[2] = minMax[3];\n minMax[3] = temp;\n\n if (transform[1] < 0) {\n temp = minMax[1];\n minMax[1] = minMax[3];\n minMax[3] = temp;\n }\n minMax[1] *= transform[1];\n minMax[3] *= transform[1];\n\n if (transform[2] < 0) {\n temp = minMax[0];\n minMax[0] = minMax[2];\n minMax[2] = temp;\n }\n minMax[0] *= transform[2];\n minMax[2] *= transform[2];\n }\n minMax[0] += transform[4];\n minMax[1] += transform[5];\n minMax[2] += transform[4];\n minMax[3] += transform[5];\n }\n\n // Concatenates two transformation matrices together and returns the result.\n static transform(m1, m2) {\n return [\n m1[0] * m2[0] + m1[2] * m2[1],\n m1[1] * m2[0] + m1[3] * m2[1],\n m1[0] * m2[2] + m1[2] * m2[3],\n m1[1] * m2[2] + m1[3] * m2[3],\n m1[0] * m2[4] + m1[2] * m2[5] + m1[4],\n m1[1] * m2[4] + m1[3] * m2[5] + m1[5],\n ];\n }\n\n // For 2d affine transforms\n static applyTransform(p, m) {\n const xt = p[0] * m[0] + p[1] * m[2] + m[4];\n const yt = p[0] * m[1] + p[1] * m[3] + m[5];\n return [xt, yt];\n }\n\n static applyInverseTransform(p, m) {\n const d = m[0] * m[3] - m[1] * m[2];\n const xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d;\n const yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d;\n return [xt, yt];\n }\n\n // Applies the transform to the rectangle and finds the minimum axially\n // aligned bounding box.\n static getAxialAlignedBoundingBox(r, m) {\n const p1 = this.applyTransform(r, m);\n const p2 = this.applyTransform(r.slice(2, 4), m);\n const p3 = this.applyTransform([r[0], r[3]], m);\n const p4 = this.applyTransform([r[2], r[1]], m);\n return [\n Math.min(p1[0], p2[0], p3[0], p4[0]),\n Math.min(p1[1], p2[1], p3[1], p4[1]),\n Math.max(p1[0], p2[0], p3[0], p4[0]),\n Math.max(p1[1], p2[1], p3[1], p4[1]),\n ];\n }\n\n static inverseTransform(m) {\n const d = m[0] * m[3] - m[1] * m[2];\n return [\n m[3] / d,\n -m[1] / d,\n -m[2] / d,\n m[0] / d,\n (m[2] * m[5] - m[4] * m[3]) / d,\n (m[4] * m[1] - m[5] * m[0]) / d,\n ];\n }\n\n // This calculation uses Singular Value Decomposition.\n // The SVD can be represented with formula A = USV. We are interested in the\n // matrix S here because it represents the scale values.\n static singularValueDecompose2dScale(m) {\n const transpose = [m[0], m[2], m[1], m[3]];\n\n // Multiply matrix m with its transpose.\n const a = m[0] * transpose[0] + m[1] * transpose[2];\n const b = m[0] * transpose[1] + m[1] * transpose[3];\n const c = m[2] * transpose[0] + m[3] * transpose[2];\n const d = m[2] * transpose[1] + m[3] * transpose[3];\n\n // Solve the second degree polynomial to get roots.\n const first = (a + d) / 2;\n const second = Math.sqrt((a + d) ** 2 - 4 * (a * d - c * b)) / 2;\n const sx = first + second || 1;\n const sy = first - second || 1;\n\n // Scale values are the square roots of the eigenvalues.\n return [Math.sqrt(sx), Math.sqrt(sy)];\n }\n\n // Normalize rectangle rect=[x1, y1, x2, y2] so that (x1,y1) < (x2,y2)\n // For coordinate systems whose origin lies in the bottom-left, this\n // means normalization to (BL,TR) ordering. For systems with origin in the\n // top-left, this means (TL,BR) ordering.\n static normalizeRect(rect) {\n const r = rect.slice(0); // clone rect\n if (rect[0] > rect[2]) {\n r[0] = rect[2];\n r[2] = rect[0];\n }\n if (rect[1] > rect[3]) {\n r[1] = rect[3];\n r[3] = rect[1];\n }\n return r;\n }\n\n // Returns a rectangle [x1, y1, x2, y2] corresponding to the\n // intersection of rect1 and rect2. If no intersection, returns 'null'\n // The rectangle coordinates of rect1, rect2 should be [x1, y1, x2, y2]\n static intersect(rect1, rect2) {\n const xLow = Math.max(\n Math.min(rect1[0], rect1[2]),\n Math.min(rect2[0], rect2[2])\n );\n const xHigh = Math.min(\n Math.max(rect1[0], rect1[2]),\n Math.max(rect2[0], rect2[2])\n );\n if (xLow > xHigh) {\n return null;\n }\n const yLow = Math.max(\n Math.min(rect1[1], rect1[3]),\n Math.min(rect2[1], rect2[3])\n );\n const yHigh = Math.min(\n Math.max(rect1[1], rect1[3]),\n Math.max(rect2[1], rect2[3])\n );\n if (yLow > yHigh) {\n return null;\n }\n\n return [xLow, yLow, xHigh, yHigh];\n }\n\n static #getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, t, minMax) {\n if (t <= 0 || t >= 1) {\n return;\n }\n const mt = 1 - t;\n const tt = t * t;\n const ttt = tt * t;\n const x = mt * (mt * (mt * x0 + 3 * t * x1) + 3 * tt * x2) + ttt * x3;\n const y = mt * (mt * (mt * y0 + 3 * t * y1) + 3 * tt * y2) + ttt * y3;\n minMax[0] = Math.min(minMax[0], x);\n minMax[1] = Math.min(minMax[1], y);\n minMax[2] = Math.max(minMax[2], x);\n minMax[3] = Math.max(minMax[3], y);\n }\n\n static #getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, a, b, c, minMax) {\n if (Math.abs(a) < 1e-12) {\n if (Math.abs(b) >= 1e-12) {\n this.#getExtremumOnCurve(\n x0,\n x1,\n x2,\n x3,\n y0,\n y1,\n y2,\n y3,\n -c / b,\n minMax\n );\n }\n return;\n }\n\n const delta = b ** 2 - 4 * c * a;\n if (delta < 0) {\n return;\n }\n const sqrtDelta = Math.sqrt(delta);\n const a2 = 2 * a;\n this.#getExtremumOnCurve(\n x0,\n x1,\n x2,\n x3,\n y0,\n y1,\n y2,\n y3,\n (-b + sqrtDelta) / a2,\n minMax\n );\n this.#getExtremumOnCurve(\n x0,\n x1,\n x2,\n x3,\n y0,\n y1,\n y2,\n y3,\n (-b - sqrtDelta) / a2,\n minMax\n );\n }\n\n // From https://github.com/adobe-webplatform/Snap.svg/blob/b365287722a72526000ac4bfcf0ce4cac2faa015/src/path.js#L852\n static bezierBoundingBox(x0, y0, x1, y1, x2, y2, x3, y3, minMax) {\n if (minMax) {\n minMax[0] = Math.min(minMax[0], x0, x3);\n minMax[1] = Math.min(minMax[1], y0, y3);\n minMax[2] = Math.max(minMax[2], x0, x3);\n minMax[3] = Math.max(minMax[3], y0, y3);\n } else {\n minMax = [\n Math.min(x0, x3),\n Math.min(y0, y3),\n Math.max(x0, x3),\n Math.max(y0, y3),\n ];\n }\n this.#getExtremum(\n x0,\n x1,\n x2,\n x3,\n y0,\n y1,\n y2,\n y3,\n 3 * (-x0 + 3 * (x1 - x2) + x3),\n 6 * (x0 - 2 * x1 + x2),\n 3 * (x1 - x0),\n minMax\n );\n this.#getExtremum(\n x0,\n x1,\n x2,\n x3,\n y0,\n y1,\n y2,\n y3,\n 3 * (-y0 + 3 * (y1 - y2) + y3),\n 6 * (y0 - 2 * y1 + y2),\n 3 * (y1 - y0),\n minMax\n );\n return minMax;\n }\n}\n\nconst PDFStringTranslateTable = [\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2d8,\n 0x2c7, 0x2c6, 0x2d9, 0x2dd, 0x2db, 0x2da, 0x2dc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x192,\n 0x2044, 0x2039, 0x203a, 0x2212, 0x2030, 0x201e, 0x201c, 0x201d, 0x2018,\n 0x2019, 0x201a, 0x2122, 0xfb01, 0xfb02, 0x141, 0x152, 0x160, 0x178, 0x17d,\n 0x131, 0x142, 0x153, 0x161, 0x17e, 0, 0x20ac,\n];\n\nfunction stringToPDFString(str) {\n // See section 7.9.2.2 Text String Type.\n // The string can contain some language codes bracketed with 0x0b,\n // so we must remove them.\n if (str[0] >= \"\\xEF\") {\n let encoding;\n if (str[0] === \"\\xFE\" && str[1] === \"\\xFF\") {\n encoding = \"utf-16be\";\n if (str.length % 2 === 1) {\n str = str.slice(0, -1);\n }\n } else if (str[0] === \"\\xFF\" && str[1] === \"\\xFE\") {\n encoding = \"utf-16le\";\n if (str.length % 2 === 1) {\n str = str.slice(0, -1);\n }\n } else if (str[0] === \"\\xEF\" && str[1] === \"\\xBB\" && str[2] === \"\\xBF\") {\n encoding = \"utf-8\";\n }\n\n if (encoding) {\n try {\n const decoder = new TextDecoder(encoding, { fatal: true });\n const buffer = stringToBytes(str);\n const decoded = decoder.decode(buffer);\n if (!decoded.includes(\"\\x1b\")) {\n return decoded;\n }\n return decoded.replaceAll(/\\x1b[^\\x1b]*(?:\\x1b|$)/g, \"\");\n } catch (ex) {\n warn(`stringToPDFString: \"${ex}\".`);\n }\n }\n }\n // ISO Latin 1\n const strBuf = [];\n for (let i = 0, ii = str.length; i < ii; i++) {\n const charCode = str.charCodeAt(i);\n if (charCode === 0x1b) {\n // eslint-disable-next-line no-empty\n while (++i < ii && str.charCodeAt(i) !== 0x1b) {}\n continue;\n }\n const code = PDFStringTranslateTable[charCode];\n strBuf.push(code ? String.fromCharCode(code) : str.charAt(i));\n }\n return strBuf.join(\"\");\n}\n\nfunction stringToUTF8String(str) {\n return decodeURIComponent(escape(str));\n}\n\nfunction utf8StringToString(str) {\n return unescape(encodeURIComponent(str));\n}\n\nfunction isArrayEqual(arr1, arr2) {\n if (arr1.length !== arr2.length) {\n return false;\n }\n for (let i = 0, ii = arr1.length; i < ii; i++) {\n if (arr1[i] !== arr2[i]) {\n return false;\n }\n }\n return true;\n}\n\nfunction getModificationDate(date = new Date()) {\n const buffer = [\n date.getUTCFullYear().toString(),\n (date.getUTCMonth() + 1).toString().padStart(2, \"0\"),\n date.getUTCDate().toString().padStart(2, \"0\"),\n date.getUTCHours().toString().padStart(2, \"0\"),\n date.getUTCMinutes().toString().padStart(2, \"0\"),\n date.getUTCSeconds().toString().padStart(2, \"0\"),\n ];\n\n return buffer.join(\"\");\n}\n\nlet NormalizeRegex = null;\nlet NormalizationMap = null;\nfunction normalizeUnicode(str) {\n if (!NormalizeRegex) {\n // In order to generate the following regex:\n // - create a PDF containing all the chars in the range 0000-FFFF with\n // a NFKC which is different of the char.\n // - copy and paste all those chars and get the ones where NFKC is\n // required.\n // It appears that most the chars here contain some ligatures.\n NormalizeRegex =\n /([\\u00a0\\u00b5\\u037e\\u0eb3\\u2000-\\u200a\\u202f\\u2126\\ufb00-\\ufb04\\ufb06\\ufb20-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40-\\ufb41\\ufb43-\\ufb44\\ufb46-\\ufba1\\ufba4-\\ufba9\\ufbae-\\ufbb1\\ufbd3-\\ufbdc\\ufbde-\\ufbe7\\ufbea-\\ufbf8\\ufbfc-\\ufbfd\\ufc00-\\ufc5d\\ufc64-\\ufcf1\\ufcf5-\\ufd3d\\ufd88\\ufdf4\\ufdfa-\\ufdfb\\ufe71\\ufe77\\ufe79\\ufe7b\\ufe7d]+)|(\\ufb05+)/gu;\n NormalizationMap = new Map([[\"ſt\", \"ſt\"]]);\n }\n return str.replaceAll(NormalizeRegex, (_, p1, p2) =>\n p1 ? p1.normalize(\"NFKC\") : NormalizationMap.get(p2)\n );\n}\n\nfunction getUuid() {\n if (\n (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n (typeof crypto !== \"undefined\" && typeof crypto?.randomUUID === \"function\")\n ) {\n return crypto.randomUUID();\n }\n const buf = new Uint8Array(32);\n if (\n typeof crypto !== \"undefined\" &&\n typeof crypto?.getRandomValues === \"function\"\n ) {\n crypto.getRandomValues(buf);\n } else {\n for (let i = 0; i < 32; i++) {\n buf[i] = Math.floor(Math.random() * 255);\n }\n }\n return bytesToString(buf);\n}\n\nconst AnnotationPrefix = \"pdfjs_internal_id_\";\n\nconst FontRenderOps = {\n BEZIER_CURVE_TO: 0,\n MOVE_TO: 1,\n LINE_TO: 2,\n QUADRATIC_CURVE_TO: 3,\n RESTORE: 4,\n SAVE: 5,\n SCALE: 6,\n TRANSFORM: 7,\n TRANSLATE: 8,\n};\n\nexport {\n AbortException,\n AnnotationActionEventType,\n AnnotationBorderStyleType,\n AnnotationEditorParamsType,\n AnnotationEditorPrefix,\n AnnotationEditorType,\n AnnotationFieldFlag,\n AnnotationFlag,\n AnnotationMode,\n AnnotationPrefix,\n AnnotationReplyType,\n AnnotationType,\n assert,\n BaseException,\n BASELINE_FACTOR,\n bytesToString,\n CMapCompressionType,\n createValidAbsoluteUrl,\n DocumentActionEventType,\n FeatureTest,\n FONT_IDENTITY_MATRIX,\n FontRenderOps,\n FormatError,\n getModificationDate,\n getUuid,\n getVerbosityLevel,\n IDENTITY_MATRIX,\n ImageKind,\n info,\n InvalidPDFException,\n isArrayEqual,\n isNodeJS,\n LINE_DESCENT_FACTOR,\n LINE_FACTOR,\n MAX_IMAGE_SIZE_TO_CACHE,\n MissingPDFException,\n normalizeUnicode,\n objectFromMap,\n objectSize,\n OPS,\n PageActionEventType,\n PasswordException,\n PasswordResponses,\n PermissionFlag,\n RenderingIntentFlag,\n setVerbosityLevel,\n shadow,\n string32,\n stringToBytes,\n stringToPDFString,\n stringToUTF8String,\n TextRenderingMode,\n UnexpectedResponseException,\n UnknownErrorException,\n unreachable,\n utf8StringToString,\n Util,\n VerbosityLevel,\n warn,\n};\n","/* Copyright 2015 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { CMapCompressionType, unreachable } from \"../shared/util.js\";\n\nclass BaseFilterFactory {\n constructor() {\n if (this.constructor === BaseFilterFactory) {\n unreachable(\"Cannot initialize BaseFilterFactory.\");\n }\n }\n\n addFilter(maps) {\n return \"none\";\n }\n\n addHCMFilter(fgColor, bgColor) {\n return \"none\";\n }\n\n addAlphaFilter(map) {\n return \"none\";\n }\n\n addLuminosityFilter(map) {\n return \"none\";\n }\n\n addHighlightHCMFilter(filterName, fgColor, bgColor, newFgColor, newBgColor) {\n return \"none\";\n }\n\n destroy(keepHCM = false) {}\n}\n\nclass BaseCanvasFactory {\n #enableHWA = false;\n\n constructor({ enableHWA = false } = {}) {\n if (this.constructor === BaseCanvasFactory) {\n unreachable(\"Cannot initialize BaseCanvasFactory.\");\n }\n this.#enableHWA = enableHWA;\n }\n\n create(width, height) {\n if (width <= 0 || height <= 0) {\n throw new Error(\"Invalid canvas size\");\n }\n const canvas = this._createCanvas(width, height);\n return {\n canvas,\n context: canvas.getContext(\"2d\", {\n willReadFrequently: !this.#enableHWA,\n }),\n };\n }\n\n reset(canvasAndContext, width, height) {\n if (!canvasAndContext.canvas) {\n throw new Error(\"Canvas is not specified\");\n }\n if (width <= 0 || height <= 0) {\n throw new Error(\"Invalid canvas size\");\n }\n canvasAndContext.canvas.width = width;\n canvasAndContext.canvas.height = height;\n }\n\n destroy(canvasAndContext) {\n if (!canvasAndContext.canvas) {\n throw new Error(\"Canvas is not specified\");\n }\n // Zeroing the width and height cause Firefox to release graphics\n // resources immediately, which can greatly reduce memory consumption.\n canvasAndContext.canvas.width = 0;\n canvasAndContext.canvas.height = 0;\n canvasAndContext.canvas = null;\n canvasAndContext.context = null;\n }\n\n /**\n * @ignore\n */\n _createCanvas(width, height) {\n unreachable(\"Abstract method `_createCanvas` called.\");\n }\n}\n\nclass BaseCMapReaderFactory {\n constructor({ baseUrl = null, isCompressed = true }) {\n if (this.constructor === BaseCMapReaderFactory) {\n unreachable(\"Cannot initialize BaseCMapReaderFactory.\");\n }\n this.baseUrl = baseUrl;\n this.isCompressed = isCompressed;\n }\n\n async fetch({ name }) {\n if (!this.baseUrl) {\n throw new Error(\n 'The CMap \"baseUrl\" parameter must be specified, ensure that ' +\n 'the \"cMapUrl\" and \"cMapPacked\" API parameters are provided.'\n );\n }\n if (!name) {\n throw new Error(\"CMap name must be specified.\");\n }\n const url = this.baseUrl + name + (this.isCompressed ? \".bcmap\" : \"\");\n const compressionType = this.isCompressed\n ? CMapCompressionType.BINARY\n : CMapCompressionType.NONE;\n\n return this._fetchData(url, compressionType).catch(reason => {\n throw new Error(\n `Unable to load ${this.isCompressed ? \"binary \" : \"\"}CMap at: ${url}`\n );\n });\n }\n\n /**\n * @ignore\n */\n _fetchData(url, compressionType) {\n unreachable(\"Abstract method `_fetchData` called.\");\n }\n}\n\nclass BaseStandardFontDataFactory {\n constructor({ baseUrl = null }) {\n if (this.constructor === BaseStandardFontDataFactory) {\n unreachable(\"Cannot initialize BaseStandardFontDataFactory.\");\n }\n this.baseUrl = baseUrl;\n }\n\n async fetch({ filename }) {\n if (!this.baseUrl) {\n throw new Error(\n 'The standard font \"baseUrl\" parameter must be specified, ensure that ' +\n 'the \"standardFontDataUrl\" API parameter is provided.'\n );\n }\n if (!filename) {\n throw new Error(\"Font filename must be specified.\");\n }\n const url = `${this.baseUrl}${filename}`;\n\n return this._fetchData(url).catch(reason => {\n throw new Error(`Unable to load font data at: ${url}`);\n });\n }\n\n /**\n * @ignore\n */\n _fetchData(url) {\n unreachable(\"Abstract method `_fetchData` called.\");\n }\n}\n\nclass BaseSVGFactory {\n constructor() {\n if (this.constructor === BaseSVGFactory) {\n unreachable(\"Cannot initialize BaseSVGFactory.\");\n }\n }\n\n create(width, height, skipDimensions = false) {\n if (width <= 0 || height <= 0) {\n throw new Error(\"Invalid SVG dimensions\");\n }\n const svg = this._createSVG(\"svg:svg\");\n svg.setAttribute(\"version\", \"1.1\");\n\n if (!skipDimensions) {\n svg.setAttribute(\"width\", `${width}px`);\n svg.setAttribute(\"height\", `${height}px`);\n }\n\n svg.setAttribute(\"preserveAspectRatio\", \"none\");\n svg.setAttribute(\"viewBox\", `0 0 ${width} ${height}`);\n\n return svg;\n }\n\n createElement(type) {\n if (typeof type !== \"string\") {\n throw new Error(\"Invalid SVG element type\");\n }\n return this._createSVG(type);\n }\n\n /**\n * @ignore\n */\n _createSVG(type) {\n unreachable(\"Abstract method `_createSVG` called.\");\n }\n}\n\nexport {\n BaseCanvasFactory,\n BaseCMapReaderFactory,\n BaseFilterFactory,\n BaseStandardFontDataFactory,\n BaseSVGFactory,\n};\n","/* Copyright 2015 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n BaseCanvasFactory,\n BaseCMapReaderFactory,\n BaseFilterFactory,\n BaseStandardFontDataFactory,\n BaseSVGFactory,\n} from \"./base_factory.js\";\nimport {\n BaseException,\n FeatureTest,\n shadow,\n stringToBytes,\n Util,\n warn,\n} from \"../shared/util.js\";\n\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\n\nclass PixelsPerInch {\n static CSS = 96.0;\n\n static PDF = 72.0;\n\n static PDF_TO_CSS_UNITS = this.CSS / this.PDF;\n}\n\n/**\n * FilterFactory aims to create some SVG filters we can use when drawing an\n * image (or whatever) on a canvas.\n * Filters aren't applied with ctx.putImageData because it just overwrites the\n * underlying pixels.\n * With these filters, it's possible for example to apply some transfer maps on\n * an image without the need to apply them on the pixel arrays: the renderer\n * does the magic for us.\n */\nclass DOMFilterFactory extends BaseFilterFactory {\n #_cache;\n\n #_defs;\n\n #docId;\n\n #document;\n\n #_hcmCache;\n\n #id = 0;\n\n constructor({ docId, ownerDocument = globalThis.document } = {}) {\n super();\n this.#docId = docId;\n this.#document = ownerDocument;\n }\n\n get #cache() {\n return (this.#_cache ||= new Map());\n }\n\n get #hcmCache() {\n return (this.#_hcmCache ||= new Map());\n }\n\n get #defs() {\n if (!this.#_defs) {\n const div = this.#document.createElement(\"div\");\n const { style } = div;\n style.visibility = \"hidden\";\n style.contain = \"strict\";\n style.width = style.height = 0;\n style.position = \"absolute\";\n style.top = style.left = 0;\n style.zIndex = -1;\n\n const svg = this.#document.createElementNS(SVG_NS, \"svg\");\n svg.setAttribute(\"width\", 0);\n svg.setAttribute(\"height\", 0);\n this.#_defs = this.#document.createElementNS(SVG_NS, \"defs\");\n div.append(svg);\n svg.append(this.#_defs);\n this.#document.body.append(div);\n }\n return this.#_defs;\n }\n\n #createTables(maps) {\n if (maps.length === 1) {\n const mapR = maps[0];\n const buffer = new Array(256);\n for (let i = 0; i < 256; i++) {\n buffer[i] = mapR[i] / 255;\n }\n\n const table = buffer.join(\",\");\n return [table, table, table];\n }\n\n const [mapR, mapG, mapB] = maps;\n const bufferR = new Array(256);\n const bufferG = new Array(256);\n const bufferB = new Array(256);\n for (let i = 0; i < 256; i++) {\n bufferR[i] = mapR[i] / 255;\n bufferG[i] = mapG[i] / 255;\n bufferB[i] = mapB[i] / 255;\n }\n return [bufferR.join(\",\"), bufferG.join(\",\"), bufferB.join(\",\")];\n }\n\n addFilter(maps) {\n if (!maps) {\n return \"none\";\n }\n\n // When a page is zoomed the page is re-drawn but the maps are likely\n // the same.\n let value = this.#cache.get(maps);\n if (value) {\n return value;\n }\n\n const [tableR, tableG, tableB] = this.#createTables(maps);\n const key = maps.length === 1 ? tableR : `${tableR}${tableG}${tableB}`;\n\n value = this.#cache.get(key);\n if (value) {\n this.#cache.set(maps, value);\n return value;\n }\n\n // We create a SVG filter: feComponentTransferElement\n // https://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement\n\n const id = `g_${this.#docId}_transfer_map_${this.#id++}`;\n const url = `url(#${id})`;\n this.#cache.set(maps, url);\n this.#cache.set(key, url);\n\n const filter = this.#createFilter(id);\n this.#addTransferMapConversion(tableR, tableG, tableB, filter);\n\n return url;\n }\n\n addHCMFilter(fgColor, bgColor) {\n const key = `${fgColor}-${bgColor}`;\n const filterName = \"base\";\n let info = this.#hcmCache.get(filterName);\n if (info?.key === key) {\n return info.url;\n }\n\n if (info) {\n info.filter?.remove();\n info.key = key;\n info.url = \"none\";\n info.filter = null;\n } else {\n info = {\n key,\n url: \"none\",\n filter: null,\n };\n this.#hcmCache.set(filterName, info);\n }\n\n if (!fgColor || !bgColor) {\n return info.url;\n }\n\n const fgRGB = this.#getRGB(fgColor);\n fgColor = Util.makeHexColor(...fgRGB);\n const bgRGB = this.#getRGB(bgColor);\n bgColor = Util.makeHexColor(...bgRGB);\n this.#defs.style.color = \"\";\n\n if (\n (fgColor === \"#000000\" && bgColor === \"#ffffff\") ||\n fgColor === bgColor\n ) {\n return info.url;\n }\n\n // https://developer.mozilla.org/en-US/docs/Web/Accessibility/Understanding_Colors_and_Luminance\n //\n // Relative luminance:\n // https://www.w3.org/TR/WCAG20/#relativeluminancedef\n //\n // We compute the rounded luminance of the default background color.\n // Then for every color in the pdf, if its rounded luminance is the\n // same as the background one then it's replaced by the new\n // background color else by the foreground one.\n const map = new Array(256);\n for (let i = 0; i <= 255; i++) {\n const x = i / 255;\n map[i] = x <= 0.03928 ? x / 12.92 : ((x + 0.055) / 1.055) ** 2.4;\n }\n const table = map.join(\",\");\n\n const id = `g_${this.#docId}_hcm_filter`;\n const filter = (info.filter = this.#createFilter(id));\n this.#addTransferMapConversion(table, table, table, filter);\n this.#addGrayConversion(filter);\n\n const getSteps = (c, n) => {\n const start = fgRGB[c] / 255;\n const end = bgRGB[c] / 255;\n const arr = new Array(n + 1);\n for (let i = 0; i <= n; i++) {\n arr[i] = start + (i / n) * (end - start);\n }\n return arr.join(\",\");\n };\n this.#addTransferMapConversion(\n getSteps(0, 5),\n getSteps(1, 5),\n getSteps(2, 5),\n filter\n );\n\n info.url = `url(#${id})`;\n return info.url;\n }\n\n addAlphaFilter(map) {\n // When a page is zoomed the page is re-drawn but the maps are likely\n // the same.\n let value = this.#cache.get(map);\n if (value) {\n return value;\n }\n\n const [tableA] = this.#createTables([map]);\n const key = `alpha_${tableA}`;\n\n value = this.#cache.get(key);\n if (value) {\n this.#cache.set(map, value);\n return value;\n }\n\n const id = `g_${this.#docId}_alpha_map_${this.#id++}`;\n const url = `url(#${id})`;\n this.#cache.set(map, url);\n this.#cache.set(key, url);\n\n const filter = this.#createFilter(id);\n this.#addTransferMapAlphaConversion(tableA, filter);\n\n return url;\n }\n\n addLuminosityFilter(map) {\n // When a page is zoomed the page is re-drawn but the maps are likely\n // the same.\n let value = this.#cache.get(map || \"luminosity\");\n if (value) {\n return value;\n }\n\n let tableA, key;\n if (map) {\n [tableA] = this.#createTables([map]);\n key = `luminosity_${tableA}`;\n } else {\n key = \"luminosity\";\n }\n\n value = this.#cache.get(key);\n if (value) {\n this.#cache.set(map, value);\n return value;\n }\n\n const id = `g_${this.#docId}_luminosity_map_${this.#id++}`;\n const url = `url(#${id})`;\n this.#cache.set(map, url);\n this.#cache.set(key, url);\n\n const filter = this.#createFilter(id);\n this.#addLuminosityConversion(filter);\n if (map) {\n this.#addTransferMapAlphaConversion(tableA, filter);\n }\n\n return url;\n }\n\n addHighlightHCMFilter(filterName, fgColor, bgColor, newFgColor, newBgColor) {\n const key = `${fgColor}-${bgColor}-${newFgColor}-${newBgColor}`;\n let info = this.#hcmCache.get(filterName);\n if (info?.key === key) {\n return info.url;\n }\n\n if (info) {\n info.filter?.remove();\n info.key = key;\n info.url = \"none\";\n info.filter = null;\n } else {\n info = {\n key,\n url: \"none\",\n filter: null,\n };\n this.#hcmCache.set(filterName, info);\n }\n\n if (!fgColor || !bgColor) {\n return info.url;\n }\n\n const [fgRGB, bgRGB] = [fgColor, bgColor].map(this.#getRGB.bind(this));\n let fgGray = Math.round(\n 0.2126 * fgRGB[0] + 0.7152 * fgRGB[1] + 0.0722 * fgRGB[2]\n );\n let bgGray = Math.round(\n 0.2126 * bgRGB[0] + 0.7152 * bgRGB[1] + 0.0722 * bgRGB[2]\n );\n let [newFgRGB, newBgRGB] = [newFgColor, newBgColor].map(\n this.#getRGB.bind(this)\n );\n if (bgGray < fgGray) {\n [fgGray, bgGray, newFgRGB, newBgRGB] = [\n bgGray,\n fgGray,\n newBgRGB,\n newFgRGB,\n ];\n }\n this.#defs.style.color = \"\";\n\n // Now we can create the filters to highlight some canvas parts.\n // The colors in the pdf will almost be Canvas and CanvasText, hence we\n // want to filter them to finally get Highlight and HighlightText.\n // Since we're in HCM the background color and the foreground color should\n // be really different when converted to grayscale (if they're not then it\n // means that we've a poor contrast). Once the canvas colors are converted\n // to grayscale we can easily map them on their new colors.\n // The grayscale step is important because if we've something like:\n // fgColor = #FF....\n // bgColor = #FF....\n // then we are enable to map the red component on the new red components\n // which can be different.\n\n const getSteps = (fg, bg, n) => {\n const arr = new Array(256);\n const step = (bgGray - fgGray) / n;\n const newStart = fg / 255;\n const newStep = (bg - fg) / (255 * n);\n let prev = 0;\n for (let i = 0; i <= n; i++) {\n const k = Math.round(fgGray + i * step);\n const value = newStart + i * newStep;\n for (let j = prev; j <= k; j++) {\n arr[j] = value;\n }\n prev = k + 1;\n }\n for (let i = prev; i < 256; i++) {\n arr[i] = arr[prev - 1];\n }\n return arr.join(\",\");\n };\n\n const id = `g_${this.#docId}_hcm_${filterName}_filter`;\n const filter = (info.filter = this.#createFilter(id));\n\n this.#addGrayConversion(filter);\n this.#addTransferMapConversion(\n getSteps(newFgRGB[0], newBgRGB[0], 5),\n getSteps(newFgRGB[1], newBgRGB[1], 5),\n getSteps(newFgRGB[2], newBgRGB[2], 5),\n filter\n );\n\n info.url = `url(#${id})`;\n return info.url;\n }\n\n destroy(keepHCM = false) {\n if (keepHCM && this.#hcmCache.size !== 0) {\n return;\n }\n if (this.#_defs) {\n this.#_defs.parentNode.parentNode.remove();\n this.#_defs = null;\n }\n if (this.#_cache) {\n this.#_cache.clear();\n this.#_cache = null;\n }\n this.#id = 0;\n }\n\n #addLuminosityConversion(filter) {\n const feColorMatrix = this.#document.createElementNS(\n SVG_NS,\n \"feColorMatrix\"\n );\n feColorMatrix.setAttribute(\"type\", \"matrix\");\n feColorMatrix.setAttribute(\n \"values\",\n \"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.59 0.11 0 0\"\n );\n filter.append(feColorMatrix);\n }\n\n #addGrayConversion(filter) {\n const feColorMatrix = this.#document.createElementNS(\n SVG_NS,\n \"feColorMatrix\"\n );\n feColorMatrix.setAttribute(\"type\", \"matrix\");\n feColorMatrix.setAttribute(\n \"values\",\n \"0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0 0 0 1 0\"\n );\n filter.append(feColorMatrix);\n }\n\n #createFilter(id) {\n const filter = this.#document.createElementNS(SVG_NS, \"filter\");\n filter.setAttribute(\"color-interpolation-filters\", \"sRGB\");\n filter.setAttribute(\"id\", id);\n this.#defs.append(filter);\n\n return filter;\n }\n\n #appendFeFunc(feComponentTransfer, func, table) {\n const feFunc = this.#document.createElementNS(SVG_NS, func);\n feFunc.setAttribute(\"type\", \"discrete\");\n feFunc.setAttribute(\"tableValues\", table);\n feComponentTransfer.append(feFunc);\n }\n\n #addTransferMapConversion(rTable, gTable, bTable, filter) {\n const feComponentTransfer = this.#document.createElementNS(\n SVG_NS,\n \"feComponentTransfer\"\n );\n filter.append(feComponentTransfer);\n this.#appendFeFunc(feComponentTransfer, \"feFuncR\", rTable);\n this.#appendFeFunc(feComponentTransfer, \"feFuncG\", gTable);\n this.#appendFeFunc(feComponentTransfer, \"feFuncB\", bTable);\n }\n\n #addTransferMapAlphaConversion(aTable, filter) {\n const feComponentTransfer = this.#document.createElementNS(\n SVG_NS,\n \"feComponentTransfer\"\n );\n filter.append(feComponentTransfer);\n this.#appendFeFunc(feComponentTransfer, \"feFuncA\", aTable);\n }\n\n #getRGB(color) {\n this.#defs.style.color = color;\n return getRGB(getComputedStyle(this.#defs).getPropertyValue(\"color\"));\n }\n}\n\nclass DOMCanvasFactory extends BaseCanvasFactory {\n constructor({ ownerDocument = globalThis.document, enableHWA = false } = {}) {\n super({ enableHWA });\n this._document = ownerDocument;\n }\n\n /**\n * @ignore\n */\n _createCanvas(width, height) {\n const canvas = this._document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n return canvas;\n }\n}\n\nasync function fetchData(url, type = \"text\") {\n if (\n (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n isValidFetchUrl(url, document.baseURI)\n ) {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(response.statusText);\n }\n switch (type) {\n case \"arraybuffer\":\n return response.arrayBuffer();\n case \"blob\":\n return response.blob();\n case \"json\":\n return response.json();\n }\n return response.text();\n }\n\n // The Fetch API is not supported.\n return new Promise((resolve, reject) => {\n const request = new XMLHttpRequest();\n request.open(\"GET\", url, /* async = */ true);\n request.responseType = type;\n\n request.onreadystatechange = () => {\n if (request.readyState !== XMLHttpRequest.DONE) {\n return;\n }\n if (request.status === 200 || request.status === 0) {\n switch (type) {\n case \"arraybuffer\":\n case \"blob\":\n case \"json\":\n resolve(request.response);\n return;\n }\n resolve(request.responseText);\n return;\n }\n reject(new Error(request.statusText));\n };\n\n request.send(null);\n });\n}\n\nclass DOMCMapReaderFactory extends BaseCMapReaderFactory {\n /**\n * @ignore\n */\n _fetchData(url, compressionType) {\n return fetchData(\n url,\n /* type = */ this.isCompressed ? \"arraybuffer\" : \"text\"\n ).then(data => ({\n cMapData:\n data instanceof ArrayBuffer\n ? new Uint8Array(data)\n : stringToBytes(data),\n compressionType,\n }));\n }\n}\n\nclass DOMStandardFontDataFactory extends BaseStandardFontDataFactory {\n /**\n * @ignore\n */\n _fetchData(url) {\n return fetchData(url, /* type = */ \"arraybuffer\").then(\n data => new Uint8Array(data)\n );\n }\n}\n\nclass DOMSVGFactory extends BaseSVGFactory {\n /**\n * @ignore\n */\n _createSVG(type) {\n return document.createElementNS(SVG_NS, type);\n }\n}\n\n/**\n * @typedef {Object} PageViewportParameters\n * @property {Array} viewBox - The xMin, yMin, xMax and\n * yMax coordinates.\n * @property {number} scale - The scale of the viewport.\n * @property {number} rotation - The rotation, in degrees, of the viewport.\n * @property {number} [offsetX] - The horizontal, i.e. x-axis, offset. The\n * default value is `0`.\n * @property {number} [offsetY] - The vertical, i.e. y-axis, offset. The\n * default value is `0`.\n * @property {boolean} [dontFlip] - If true, the y-axis will not be flipped.\n * The default value is `false`.\n */\n\n/**\n * @typedef {Object} PageViewportCloneParameters\n * @property {number} [scale] - The scale, overriding the one in the cloned\n * viewport. The default value is `this.scale`.\n * @property {number} [rotation] - The rotation, in degrees, overriding the one\n * in the cloned viewport. The default value is `this.rotation`.\n * @property {number} [offsetX] - The horizontal, i.e. x-axis, offset.\n * The default value is `this.offsetX`.\n * @property {number} [offsetY] - The vertical, i.e. y-axis, offset.\n * The default value is `this.offsetY`.\n * @property {boolean} [dontFlip] - If true, the x-axis will not be flipped.\n * The default value is `false`.\n */\n\n/**\n * PDF page viewport created based on scale, rotation and offset.\n */\nclass PageViewport {\n /**\n * @param {PageViewportParameters}\n */\n constructor({\n viewBox,\n scale,\n rotation,\n offsetX = 0,\n offsetY = 0,\n dontFlip = false,\n }) {\n this.viewBox = viewBox;\n this.scale = scale;\n this.rotation = rotation;\n this.offsetX = offsetX;\n this.offsetY = offsetY;\n\n // creating transform to convert pdf coordinate system to the normal\n // canvas like coordinates taking in account scale and rotation\n const centerX = (viewBox[2] + viewBox[0]) / 2;\n const centerY = (viewBox[3] + viewBox[1]) / 2;\n let rotateA, rotateB, rotateC, rotateD;\n // Normalize the rotation, by clamping it to the [0, 360) range.\n rotation %= 360;\n if (rotation < 0) {\n rotation += 360;\n }\n switch (rotation) {\n case 180:\n rotateA = -1;\n rotateB = 0;\n rotateC = 0;\n rotateD = 1;\n break;\n case 90:\n rotateA = 0;\n rotateB = 1;\n rotateC = 1;\n rotateD = 0;\n break;\n case 270:\n rotateA = 0;\n rotateB = -1;\n rotateC = -1;\n rotateD = 0;\n break;\n case 0:\n rotateA = 1;\n rotateB = 0;\n rotateC = 0;\n rotateD = -1;\n break;\n default:\n throw new Error(\n \"PageViewport: Invalid rotation, must be a multiple of 90 degrees.\"\n );\n }\n\n if (dontFlip) {\n rotateC = -rotateC;\n rotateD = -rotateD;\n }\n\n let offsetCanvasX, offsetCanvasY;\n let width, height;\n if (rotateA === 0) {\n offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX;\n offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY;\n width = (viewBox[3] - viewBox[1]) * scale;\n height = (viewBox[2] - viewBox[0]) * scale;\n } else {\n offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX;\n offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY;\n width = (viewBox[2] - viewBox[0]) * scale;\n height = (viewBox[3] - viewBox[1]) * scale;\n }\n // creating transform for the following operations:\n // translate(-centerX, -centerY), rotate and flip vertically,\n // scale, and translate(offsetCanvasX, offsetCanvasY)\n this.transform = [\n rotateA * scale,\n rotateB * scale,\n rotateC * scale,\n rotateD * scale,\n offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY,\n offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY,\n ];\n\n this.width = width;\n this.height = height;\n }\n\n /**\n * The original, un-scaled, viewport dimensions.\n * @type {Object}\n */\n get rawDims() {\n const { viewBox } = this;\n return shadow(this, \"rawDims\", {\n pageWidth: viewBox[2] - viewBox[0],\n pageHeight: viewBox[3] - viewBox[1],\n pageX: viewBox[0],\n pageY: viewBox[1],\n });\n }\n\n /**\n * Clones viewport, with optional additional properties.\n * @param {PageViewportCloneParameters} [params]\n * @returns {PageViewport} Cloned viewport.\n */\n clone({\n scale = this.scale,\n rotation = this.rotation,\n offsetX = this.offsetX,\n offsetY = this.offsetY,\n dontFlip = false,\n } = {}) {\n return new PageViewport({\n viewBox: this.viewBox.slice(),\n scale,\n rotation,\n offsetX,\n offsetY,\n dontFlip,\n });\n }\n\n /**\n * Converts PDF point to the viewport coordinates. For examples, useful for\n * converting PDF location into canvas pixel coordinates.\n * @param {number} x - The x-coordinate.\n * @param {number} y - The y-coordinate.\n * @returns {Array} Array containing `x`- and `y`-coordinates of the\n * point in the viewport coordinate space.\n * @see {@link convertToPdfPoint}\n * @see {@link convertToViewportRectangle}\n */\n convertToViewportPoint(x, y) {\n return Util.applyTransform([x, y], this.transform);\n }\n\n /**\n * Converts PDF rectangle to the viewport coordinates.\n * @param {Array} rect - The xMin, yMin, xMax and yMax coordinates.\n * @returns {Array} Array containing corresponding coordinates of the\n * rectangle in the viewport coordinate space.\n * @see {@link convertToViewportPoint}\n */\n convertToViewportRectangle(rect) {\n const topLeft = Util.applyTransform([rect[0], rect[1]], this.transform);\n const bottomRight = Util.applyTransform([rect[2], rect[3]], this.transform);\n return [topLeft[0], topLeft[1], bottomRight[0], bottomRight[1]];\n }\n\n /**\n * Converts viewport coordinates to the PDF location. For examples, useful\n * for converting canvas pixel location into PDF one.\n * @param {number} x - The x-coordinate.\n * @param {number} y - The y-coordinate.\n * @returns {Array} Array containing `x`- and `y`-coordinates of the\n * point in the PDF coordinate space.\n * @see {@link convertToViewportPoint}\n */\n convertToPdfPoint(x, y) {\n return Util.applyInverseTransform([x, y], this.transform);\n }\n}\n\nclass RenderingCancelledException extends BaseException {\n constructor(msg, extraDelay = 0) {\n super(msg, \"RenderingCancelledException\");\n this.extraDelay = extraDelay;\n }\n}\n\nfunction isDataScheme(url) {\n const ii = url.length;\n let i = 0;\n while (i < ii && url[i].trim() === \"\") {\n i++;\n }\n return url.substring(i, i + 5).toLowerCase() === \"data:\";\n}\n\nfunction isPdfFile(filename) {\n return typeof filename === \"string\" && /\\.pdf$/i.test(filename);\n}\n\n/**\n * Gets the filename from a given URL.\n * @param {string} url\n * @returns {string}\n */\nfunction getFilenameFromUrl(url) {\n [url] = url.split(/[#?]/, 1);\n return url.substring(url.lastIndexOf(\"/\") + 1);\n}\n\n/**\n * Returns the filename or guessed filename from the url (see issue 3455).\n * @param {string} url - The original PDF location.\n * @param {string} defaultFilename - The value returned if the filename is\n * unknown, or the protocol is unsupported.\n * @returns {string} Guessed PDF filename.\n */\nfunction getPdfFilenameFromUrl(url, defaultFilename = \"document.pdf\") {\n if (typeof url !== \"string\") {\n return defaultFilename;\n }\n if (isDataScheme(url)) {\n warn('getPdfFilenameFromUrl: ignore \"data:\"-URL for performance reasons.');\n return defaultFilename;\n }\n const reURI = /^(?:(?:[^:]+:)?\\/\\/[^/]+)?([^?#]*)(\\?[^#]*)?(#.*)?$/;\n // SCHEME HOST 1.PATH 2.QUERY 3.REF\n // Pattern to get last matching NAME.pdf\n const reFilename = /[^/?#=]+\\.pdf\\b(?!.*\\.pdf\\b)/i;\n const splitURI = reURI.exec(url);\n let suggestedFilename =\n reFilename.exec(splitURI[1]) ||\n reFilename.exec(splitURI[2]) ||\n reFilename.exec(splitURI[3]);\n if (suggestedFilename) {\n suggestedFilename = suggestedFilename[0];\n if (suggestedFilename.includes(\"%\")) {\n // URL-encoded %2Fpath%2Fto%2Ffile.pdf should be file.pdf\n try {\n suggestedFilename = reFilename.exec(\n decodeURIComponent(suggestedFilename)\n )[0];\n } catch {\n // Possible (extremely rare) errors:\n // URIError \"Malformed URI\", e.g. for \"%AA.pdf\"\n // TypeError \"null has no properties\", e.g. for \"%2F.pdf\"\n }\n }\n }\n return suggestedFilename || defaultFilename;\n}\n\nclass StatTimer {\n started = Object.create(null);\n\n times = [];\n\n time(name) {\n if (name in this.started) {\n warn(`Timer is already running for ${name}`);\n }\n this.started[name] = Date.now();\n }\n\n timeEnd(name) {\n if (!(name in this.started)) {\n warn(`Timer has not been started for ${name}`);\n }\n this.times.push({\n name,\n start: this.started[name],\n end: Date.now(),\n });\n // Remove timer from started so it can be called again.\n delete this.started[name];\n }\n\n toString() {\n // Find the longest name for padding purposes.\n const outBuf = [];\n let longest = 0;\n for (const { name } of this.times) {\n longest = Math.max(name.length, longest);\n }\n for (const { name, start, end } of this.times) {\n outBuf.push(`${name.padEnd(longest)} ${end - start}ms\\n`);\n }\n return outBuf.join(\"\");\n }\n}\n\nfunction isValidFetchUrl(url, baseUrl) {\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n throw new Error(\"Not implemented: isValidFetchUrl\");\n }\n try {\n const { protocol } = baseUrl ? new URL(url, baseUrl) : new URL(url);\n // The Fetch API only supports the http/https protocols, and not file/ftp.\n return protocol === \"http:\" || protocol === \"https:\";\n } catch {\n return false; // `new URL()` will throw on incorrect data.\n }\n}\n\n/**\n * Event handler to suppress context menu.\n */\nfunction noContextMenu(e) {\n e.preventDefault();\n}\n\n// Deprecated API function -- display regardless of the `verbosity` setting.\nfunction deprecated(details) {\n console.log(\"Deprecated API usage: \" + details);\n}\n\nlet pdfDateStringRegex;\n\nclass PDFDateString {\n /**\n * Convert a PDF date string to a JavaScript `Date` object.\n *\n * The PDF date string format is described in section 7.9.4 of the official\n * PDF 32000-1:2008 specification. However, in the PDF 1.7 reference (sixth\n * edition) Adobe describes the same format including a trailing apostrophe.\n * This syntax in incorrect, but Adobe Acrobat creates PDF files that contain\n * them. We ignore all apostrophes as they are not necessary for date parsing.\n *\n * Moreover, Adobe Acrobat doesn't handle changing the date to universal time\n * and doesn't use the user's time zone (effectively ignoring the HH' and mm'\n * parts of the date string).\n *\n * @param {string} input\n * @returns {Date|null}\n */\n static toDateObject(input) {\n if (!input || typeof input !== \"string\") {\n return null;\n }\n\n // Lazily initialize the regular expression.\n pdfDateStringRegex ||= new RegExp(\n \"^D:\" + // Prefix (required)\n \"(\\\\d{4})\" + // Year (required)\n \"(\\\\d{2})?\" + // Month (optional)\n \"(\\\\d{2})?\" + // Day (optional)\n \"(\\\\d{2})?\" + // Hour (optional)\n \"(\\\\d{2})?\" + // Minute (optional)\n \"(\\\\d{2})?\" + // Second (optional)\n \"([Z|+|-])?\" + // Universal time relation (optional)\n \"(\\\\d{2})?\" + // Offset hour (optional)\n \"'?\" + // Splitting apostrophe (optional)\n \"(\\\\d{2})?\" + // Offset minute (optional)\n \"'?\" // Trailing apostrophe (optional)\n );\n\n // Optional fields that don't satisfy the requirements from the regular\n // expression (such as incorrect digit counts or numbers that are out of\n // range) will fall back the defaults from the specification.\n const matches = pdfDateStringRegex.exec(input);\n if (!matches) {\n return null;\n }\n\n // JavaScript's `Date` object expects the month to be between 0 and 11\n // instead of 1 and 12, so we have to correct for that.\n const year = parseInt(matches[1], 10);\n let month = parseInt(matches[2], 10);\n month = month >= 1 && month <= 12 ? month - 1 : 0;\n let day = parseInt(matches[3], 10);\n day = day >= 1 && day <= 31 ? day : 1;\n let hour = parseInt(matches[4], 10);\n hour = hour >= 0 && hour <= 23 ? hour : 0;\n let minute = parseInt(matches[5], 10);\n minute = minute >= 0 && minute <= 59 ? minute : 0;\n let second = parseInt(matches[6], 10);\n second = second >= 0 && second <= 59 ? second : 0;\n const universalTimeRelation = matches[7] || \"Z\";\n let offsetHour = parseInt(matches[8], 10);\n offsetHour = offsetHour >= 0 && offsetHour <= 23 ? offsetHour : 0;\n let offsetMinute = parseInt(matches[9], 10) || 0;\n offsetMinute = offsetMinute >= 0 && offsetMinute <= 59 ? offsetMinute : 0;\n\n // Universal time relation 'Z' means that the local time is equal to the\n // universal time, whereas the relations '+'/'-' indicate that the local\n // time is later respectively earlier than the universal time. Every date\n // is normalized to universal time.\n if (universalTimeRelation === \"-\") {\n hour += offsetHour;\n minute += offsetMinute;\n } else if (universalTimeRelation === \"+\") {\n hour -= offsetHour;\n minute -= offsetMinute;\n }\n\n return new Date(Date.UTC(year, month, day, hour, minute, second));\n }\n}\n\n/**\n * NOTE: This is (mostly) intended to support printing of XFA forms.\n */\nfunction getXfaPageViewport(xfaPage, { scale = 1, rotation = 0 }) {\n const { width, height } = xfaPage.attributes.style;\n const viewBox = [0, 0, parseInt(width), parseInt(height)];\n\n return new PageViewport({\n viewBox,\n scale,\n rotation,\n });\n}\n\nfunction getRGB(color) {\n if (color.startsWith(\"#\")) {\n const colorRGB = parseInt(color.slice(1), 16);\n return [\n (colorRGB & 0xff0000) >> 16,\n (colorRGB & 0x00ff00) >> 8,\n colorRGB & 0x0000ff,\n ];\n }\n\n if (color.startsWith(\"rgb(\")) {\n // getComputedStyle(...).color returns a `rgb(R, G, B)` color.\n return color\n .slice(/* \"rgb(\".length */ 4, -1) // Strip out \"rgb(\" and \")\".\n .split(\",\")\n .map(x => parseInt(x));\n }\n\n if (color.startsWith(\"rgba(\")) {\n return color\n .slice(/* \"rgba(\".length */ 5, -1) // Strip out \"rgba(\" and \")\".\n .split(\",\")\n .map(x => parseInt(x))\n .slice(0, 3);\n }\n\n warn(`Not a valid color format: \"${color}\"`);\n return [0, 0, 0];\n}\n\nfunction getColorValues(colors) {\n const span = document.createElement(\"span\");\n span.style.visibility = \"hidden\";\n document.body.append(span);\n for (const name of colors.keys()) {\n span.style.color = name;\n const computedColor = window.getComputedStyle(span).color;\n colors.set(name, getRGB(computedColor));\n }\n span.remove();\n}\n\nfunction getCurrentTransform(ctx) {\n const { a, b, c, d, e, f } = ctx.getTransform();\n return [a, b, c, d, e, f];\n}\n\nfunction getCurrentTransformInverse(ctx) {\n const { a, b, c, d, e, f } = ctx.getTransform().invertSelf();\n return [a, b, c, d, e, f];\n}\n\n/**\n * @param {HTMLDivElement} div\n * @param {PageViewport} viewport\n * @param {boolean} mustFlip\n * @param {boolean} mustRotate\n */\nfunction setLayerDimensions(\n div,\n viewport,\n mustFlip = false,\n mustRotate = true\n) {\n if (viewport instanceof PageViewport) {\n const { pageWidth, pageHeight } = viewport.rawDims;\n const { style } = div;\n const useRound = FeatureTest.isCSSRoundSupported;\n\n const w = `var(--scale-factor) * ${pageWidth}px`,\n h = `var(--scale-factor) * ${pageHeight}px`;\n const widthStr = useRound ? `round(${w}, 1px)` : `calc(${w})`,\n heightStr = useRound ? `round(${h}, 1px)` : `calc(${h})`;\n\n if (!mustFlip || viewport.rotation % 180 === 0) {\n style.width = widthStr;\n style.height = heightStr;\n } else {\n style.width = heightStr;\n style.height = widthStr;\n }\n }\n\n if (mustRotate) {\n div.setAttribute(\"data-main-rotation\", viewport.rotation);\n }\n}\n\nexport {\n deprecated,\n DOMCanvasFactory,\n DOMCMapReaderFactory,\n DOMFilterFactory,\n DOMStandardFontDataFactory,\n DOMSVGFactory,\n fetchData,\n getColorValues,\n getCurrentTransform,\n getCurrentTransformInverse,\n getFilenameFromUrl,\n getPdfFilenameFromUrl,\n getRGB,\n getXfaPageViewport,\n isDataScheme,\n isPdfFile,\n isValidFetchUrl,\n noContextMenu,\n PageViewport,\n PDFDateString,\n PixelsPerInch,\n RenderingCancelledException,\n setLayerDimensions,\n StatTimer,\n};\n","/* Copyright 2023 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { noContextMenu } from \"../display_utils.js\";\n\nclass EditorToolbar {\n #toolbar = null;\n\n #colorPicker = null;\n\n #editor;\n\n #buttons = null;\n\n constructor(editor) {\n this.#editor = editor;\n }\n\n render() {\n const editToolbar = (this.#toolbar = document.createElement(\"div\"));\n editToolbar.className = \"editToolbar\";\n editToolbar.setAttribute(\"role\", \"toolbar\");\n const signal = this.#editor._uiManager._signal;\n editToolbar.addEventListener(\"contextmenu\", noContextMenu, { signal });\n editToolbar.addEventListener(\"pointerdown\", EditorToolbar.#pointerDown, {\n signal,\n });\n\n const buttons = (this.#buttons = document.createElement(\"div\"));\n buttons.className = \"buttons\";\n editToolbar.append(buttons);\n\n const position = this.#editor.toolbarPosition;\n if (position) {\n const { style } = editToolbar;\n const x =\n this.#editor._uiManager.direction === \"ltr\"\n ? 1 - position[0]\n : position[0];\n style.insetInlineEnd = `${100 * x}%`;\n style.top = `calc(${\n 100 * position[1]\n }% + var(--editor-toolbar-vert-offset))`;\n }\n\n this.#addDeleteButton();\n\n return editToolbar;\n }\n\n static #pointerDown(e) {\n e.stopPropagation();\n }\n\n #focusIn(e) {\n this.#editor._focusEventsAllowed = false;\n e.preventDefault();\n e.stopPropagation();\n }\n\n #focusOut(e) {\n this.#editor._focusEventsAllowed = true;\n e.preventDefault();\n e.stopPropagation();\n }\n\n #addListenersToElement(element) {\n // If we're clicking on a button with the keyboard or with\n // the mouse, we don't want to trigger any focus events on\n // the editor.\n const signal = this.#editor._uiManager._signal;\n element.addEventListener(\"focusin\", this.#focusIn.bind(this), {\n capture: true,\n signal,\n });\n element.addEventListener(\"focusout\", this.#focusOut.bind(this), {\n capture: true,\n signal,\n });\n element.addEventListener(\"contextmenu\", noContextMenu, { signal });\n }\n\n hide() {\n this.#toolbar.classList.add(\"hidden\");\n this.#colorPicker?.hideDropdown();\n }\n\n show() {\n this.#toolbar.classList.remove(\"hidden\");\n }\n\n #addDeleteButton() {\n const button = document.createElement(\"button\");\n button.className = \"delete\";\n button.tabIndex = 0;\n button.setAttribute(\n \"data-l10n-id\",\n `pdfjs-editor-remove-${this.#editor.editorType}-button`\n );\n this.#addListenersToElement(button);\n button.addEventListener(\n \"click\",\n e => {\n this.#editor._uiManager.delete();\n },\n { signal: this.#editor._uiManager._signal }\n );\n this.#buttons.append(button);\n }\n\n get #divider() {\n const divider = document.createElement(\"div\");\n divider.className = \"divider\";\n return divider;\n }\n\n addAltTextButton(button) {\n this.#addListenersToElement(button);\n this.#buttons.prepend(button, this.#divider);\n }\n\n addColorPicker(colorPicker) {\n this.#colorPicker = colorPicker;\n const button = colorPicker.renderButton();\n this.#addListenersToElement(button);\n this.#buttons.prepend(button, this.#divider);\n }\n\n remove() {\n this.#toolbar.remove();\n this.#colorPicker?.destroy();\n this.#colorPicker = null;\n }\n}\n\nclass HighlightToolbar {\n #buttons = null;\n\n #toolbar = null;\n\n #uiManager;\n\n constructor(uiManager) {\n this.#uiManager = uiManager;\n }\n\n #render() {\n const editToolbar = (this.#toolbar = document.createElement(\"div\"));\n editToolbar.className = \"editToolbar\";\n editToolbar.setAttribute(\"role\", \"toolbar\");\n editToolbar.addEventListener(\"contextmenu\", noContextMenu, {\n signal: this.#uiManager._signal,\n });\n\n const buttons = (this.#buttons = document.createElement(\"div\"));\n buttons.className = \"buttons\";\n editToolbar.append(buttons);\n\n this.#addHighlightButton();\n\n return editToolbar;\n }\n\n #getLastPoint(boxes, isLTR) {\n let lastY = 0;\n let lastX = 0;\n for (const box of boxes) {\n const y = box.y + box.height;\n if (y < lastY) {\n continue;\n }\n const x = box.x + (isLTR ? box.width : 0);\n if (y > lastY) {\n lastX = x;\n lastY = y;\n continue;\n }\n if (isLTR) {\n if (x > lastX) {\n lastX = x;\n }\n } else if (x < lastX) {\n lastX = x;\n }\n }\n return [isLTR ? 1 - lastX : lastX, lastY];\n }\n\n show(parent, boxes, isLTR) {\n const [x, y] = this.#getLastPoint(boxes, isLTR);\n const { style } = (this.#toolbar ||= this.#render());\n parent.append(this.#toolbar);\n style.insetInlineEnd = `${100 * x}%`;\n style.top = `calc(${100 * y}% + var(--editor-toolbar-vert-offset))`;\n }\n\n hide() {\n this.#toolbar.remove();\n }\n\n #addHighlightButton() {\n const button = document.createElement(\"button\");\n button.className = \"highlightButton\";\n button.tabIndex = 0;\n button.setAttribute(\"data-l10n-id\", `pdfjs-highlight-floating-button1`);\n const span = document.createElement(\"span\");\n button.append(span);\n span.className = \"visuallyHidden\";\n span.setAttribute(\"data-l10n-id\", \"pdfjs-highlight-floating-button-label\");\n const signal = this.#uiManager._signal;\n button.addEventListener(\"contextmenu\", noContextMenu, { signal });\n button.addEventListener(\n \"click\",\n () => {\n this.#uiManager.highlightSelection(\"floating_button\");\n },\n { signal }\n );\n this.#buttons.append(button);\n }\n}\n\nexport { EditorToolbar, HighlightToolbar };\n","/* Copyright 2022 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./editor.js\").AnnotationEditor} AnnotationEditor */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"./annotation_editor_layer.js\").AnnotationEditorLayer} AnnotationEditorLayer */\n\nimport {\n AnnotationEditorParamsType,\n AnnotationEditorPrefix,\n AnnotationEditorType,\n FeatureTest,\n getUuid,\n shadow,\n Util,\n warn,\n} from \"../../shared/util.js\";\nimport {\n fetchData,\n getColorValues,\n getRGB,\n PixelsPerInch,\n} from \"../display_utils.js\";\nimport { HighlightToolbar } from \"./toolbar.js\";\n\nfunction bindEvents(obj, element, names) {\n for (const name of names) {\n element.addEventListener(name, obj[name].bind(obj));\n }\n}\n\n/**\n * Convert a number between 0 and 100 into an hex number between 0 and 255.\n * @param {number} opacity\n * @return {string}\n */\nfunction opacityToHex(opacity) {\n return Math.round(Math.min(255, Math.max(1, 255 * opacity)))\n .toString(16)\n .padStart(2, \"0\");\n}\n\n/**\n * Class to create some unique ids for the different editors.\n */\nclass IdManager {\n #id = 0;\n\n constructor() {\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\")) {\n Object.defineProperty(this, \"reset\", {\n value: () => (this.#id = 0),\n });\n }\n }\n\n /**\n * Get a unique id.\n * @returns {string}\n */\n get id() {\n return `${AnnotationEditorPrefix}${this.#id++}`;\n }\n}\n\n/**\n * Class to manage the images used by the editors.\n * The main idea is to try to minimize the memory used by the images.\n * The images are cached and reused when possible\n * We use a refCounter to know when an image is not used anymore but we need to\n * be able to restore an image after a remove+undo, so we keep a file reference\n * or an url one.\n */\nclass ImageManager {\n #baseId = getUuid();\n\n #id = 0;\n\n #cache = null;\n\n static get _isSVGFittingCanvas() {\n // By default, Firefox doesn't rescale without preserving the aspect ratio\n // when drawing an SVG image on a canvas, see https://bugzilla.mozilla.org/1547776.\n // The \"workaround\" is to append \"svgView(preserveAspectRatio(none))\" to the\n // url, but according to comment #15, it seems that it leads to unexpected\n // behavior in Safari.\n const svg = `data:image/svg+xml;charset=UTF-8,`;\n const canvas = new OffscreenCanvas(1, 3);\n const ctx = canvas.getContext(\"2d\", { willReadFrequently: true });\n const image = new Image();\n image.src = svg;\n const promise = image.decode().then(() => {\n ctx.drawImage(image, 0, 0, 1, 1, 0, 0, 1, 3);\n return new Uint32Array(ctx.getImageData(0, 0, 1, 1).data.buffer)[0] === 0;\n });\n\n return shadow(this, \"_isSVGFittingCanvas\", promise);\n }\n\n async #get(key, rawData) {\n this.#cache ||= new Map();\n let data = this.#cache.get(key);\n if (data === null) {\n // We already tried to load the image but it failed.\n return null;\n }\n if (data?.bitmap) {\n data.refCounter += 1;\n return data;\n }\n try {\n data ||= {\n bitmap: null,\n id: `image_${this.#baseId}_${this.#id++}`,\n refCounter: 0,\n isSvg: false,\n };\n let image;\n if (typeof rawData === \"string\") {\n data.url = rawData;\n image = await fetchData(rawData, \"blob\");\n } else {\n image = data.file = rawData;\n }\n\n if (image.type === \"image/svg+xml\") {\n // Unfortunately, createImageBitmap doesn't work with SVG images.\n // (see https://bugzilla.mozilla.org/1841972).\n const mustRemoveAspectRatioPromise = ImageManager._isSVGFittingCanvas;\n const fileReader = new FileReader();\n const imageElement = new Image();\n const imagePromise = new Promise((resolve, reject) => {\n imageElement.onload = () => {\n data.bitmap = imageElement;\n data.isSvg = true;\n resolve();\n };\n fileReader.onload = async () => {\n const url = (data.svgUrl = fileReader.result);\n // We need to set the preserveAspectRatio to none in order to let\n // the image fits the canvas when resizing.\n imageElement.src = (await mustRemoveAspectRatioPromise)\n ? `${url}#svgView(preserveAspectRatio(none))`\n : url;\n };\n imageElement.onerror = fileReader.onerror = reject;\n });\n fileReader.readAsDataURL(image);\n await imagePromise;\n } else {\n data.bitmap = await createImageBitmap(image);\n }\n data.refCounter = 1;\n } catch (e) {\n console.error(e);\n data = null;\n }\n this.#cache.set(key, data);\n if (data) {\n this.#cache.set(data.id, data);\n }\n return data;\n }\n\n async getFromFile(file) {\n const { lastModified, name, size, type } = file;\n return this.#get(`${lastModified}_${name}_${size}_${type}`, file);\n }\n\n async getFromUrl(url) {\n return this.#get(url, url);\n }\n\n async getFromId(id) {\n this.#cache ||= new Map();\n const data = this.#cache.get(id);\n if (!data) {\n return null;\n }\n if (data.bitmap) {\n data.refCounter += 1;\n return data;\n }\n\n if (data.file) {\n return this.getFromFile(data.file);\n }\n return this.getFromUrl(data.url);\n }\n\n getSvgUrl(id) {\n const data = this.#cache.get(id);\n if (!data?.isSvg) {\n return null;\n }\n return data.svgUrl;\n }\n\n deleteId(id) {\n this.#cache ||= new Map();\n const data = this.#cache.get(id);\n if (!data) {\n return;\n }\n data.refCounter -= 1;\n if (data.refCounter !== 0) {\n return;\n }\n data.bitmap = null;\n }\n\n // We can use the id only if it belongs this manager.\n // We must take care of having the right manager because we can copy/paste\n // some images from other documents, hence it'd be a pity to use an id from an\n // other manager.\n isValidId(id) {\n return id.startsWith(`image_${this.#baseId}_`);\n }\n}\n\n/**\n * Class to handle undo/redo.\n * Commands are just saved in a buffer.\n * If we hit some memory issues we could likely use a circular buffer.\n * It has to be used as a singleton.\n */\nclass CommandManager {\n #commands = [];\n\n #locked = false;\n\n #maxSize;\n\n #position = -1;\n\n constructor(maxSize = 128) {\n this.#maxSize = maxSize;\n }\n\n /**\n * @typedef {Object} addOptions\n * @property {function} cmd\n * @property {function} undo\n * @property {function} [post]\n * @property {boolean} mustExec\n * @property {number} type\n * @property {boolean} overwriteIfSameType\n * @property {boolean} keepUndo\n */\n\n /**\n * Add a new couple of commands to be used in case of redo/undo.\n * @param {addOptions} options\n */\n add({\n cmd,\n undo,\n post,\n mustExec,\n type = NaN,\n overwriteIfSameType = false,\n keepUndo = false,\n }) {\n if (mustExec) {\n cmd();\n }\n\n if (this.#locked) {\n return;\n }\n\n const save = { cmd, undo, post, type };\n if (this.#position === -1) {\n if (this.#commands.length > 0) {\n // All the commands have been undone and then a new one is added\n // hence we clear the queue.\n this.#commands.length = 0;\n }\n this.#position = 0;\n this.#commands.push(save);\n return;\n }\n\n if (overwriteIfSameType && this.#commands[this.#position].type === type) {\n // For example when we change a color we don't want to\n // be able to undo all the steps, hence we only want to\n // keep the last undoable action in this sequence of actions.\n if (keepUndo) {\n save.undo = this.#commands[this.#position].undo;\n }\n this.#commands[this.#position] = save;\n return;\n }\n\n const next = this.#position + 1;\n if (next === this.#maxSize) {\n this.#commands.splice(0, 1);\n } else {\n this.#position = next;\n if (next < this.#commands.length) {\n this.#commands.splice(next);\n }\n }\n\n this.#commands.push(save);\n }\n\n /**\n * Undo the last command.\n */\n undo() {\n if (this.#position === -1) {\n // Nothing to undo.\n return;\n }\n\n // Avoid to insert something during the undo execution.\n this.#locked = true;\n const { undo, post } = this.#commands[this.#position];\n undo();\n post?.();\n this.#locked = false;\n\n this.#position -= 1;\n }\n\n /**\n * Redo the last command.\n */\n redo() {\n if (this.#position < this.#commands.length - 1) {\n this.#position += 1;\n\n // Avoid to insert something during the redo execution.\n this.#locked = true;\n const { cmd, post } = this.#commands[this.#position];\n cmd();\n post?.();\n this.#locked = false;\n }\n }\n\n /**\n * Check if there is something to undo.\n * @returns {boolean}\n */\n hasSomethingToUndo() {\n return this.#position !== -1;\n }\n\n /**\n * Check if there is something to redo.\n * @returns {boolean}\n */\n hasSomethingToRedo() {\n return this.#position < this.#commands.length - 1;\n }\n\n destroy() {\n this.#commands = null;\n }\n}\n\n/**\n * Class to handle the different keyboards shortcuts we can have on mac or\n * non-mac OSes.\n */\nclass KeyboardManager {\n /**\n * Create a new keyboard manager class.\n * @param {Array} callbacks - an array containing an array of shortcuts\n * and a callback to call.\n * A shortcut is a string like `ctrl+c` or `mac+ctrl+c` for mac OS.\n */\n constructor(callbacks) {\n this.buffer = [];\n this.callbacks = new Map();\n this.allKeys = new Set();\n\n const { isMac } = FeatureTest.platform;\n for (const [keys, callback, options = {}] of callbacks) {\n for (const key of keys) {\n const isMacKey = key.startsWith(\"mac+\");\n if (isMac && isMacKey) {\n this.callbacks.set(key.slice(4), { callback, options });\n this.allKeys.add(key.split(\"+\").at(-1));\n } else if (!isMac && !isMacKey) {\n this.callbacks.set(key, { callback, options });\n this.allKeys.add(key.split(\"+\").at(-1));\n }\n }\n }\n }\n\n /**\n * Serialize an event into a string in order to match a\n * potential key for a callback.\n * @param {KeyboardEvent} event\n * @returns {string}\n */\n #serialize(event) {\n if (event.altKey) {\n this.buffer.push(\"alt\");\n }\n if (event.ctrlKey) {\n this.buffer.push(\"ctrl\");\n }\n if (event.metaKey) {\n this.buffer.push(\"meta\");\n }\n if (event.shiftKey) {\n this.buffer.push(\"shift\");\n }\n this.buffer.push(event.key);\n const str = this.buffer.join(\"+\");\n this.buffer.length = 0;\n\n return str;\n }\n\n /**\n * Execute a callback, if any, for a given keyboard event.\n * The self is used as `this` in the callback.\n * @param {Object} self\n * @param {KeyboardEvent} event\n * @returns\n */\n exec(self, event) {\n if (!this.allKeys.has(event.key)) {\n return;\n }\n const info = this.callbacks.get(this.#serialize(event));\n if (!info) {\n return;\n }\n const {\n callback,\n options: { bubbles = false, args = [], checker = null },\n } = info;\n\n if (checker && !checker(self, event)) {\n return;\n }\n callback.bind(self, ...args, event)();\n\n // For example, ctrl+s in a FreeText must be handled by the viewer, hence\n // the event must bubble.\n if (!bubbles) {\n event.stopPropagation();\n event.preventDefault();\n }\n }\n}\n\nclass ColorManager {\n static _colorsMapping = new Map([\n [\"CanvasText\", [0, 0, 0]],\n [\"Canvas\", [255, 255, 255]],\n ]);\n\n get _colors() {\n if (\n typeof PDFJSDev !== \"undefined\" &&\n PDFJSDev.test(\"LIB\") &&\n typeof document === \"undefined\"\n ) {\n return shadow(this, \"_colors\", ColorManager._colorsMapping);\n }\n\n const colors = new Map([\n [\"CanvasText\", null],\n [\"Canvas\", null],\n ]);\n getColorValues(colors);\n return shadow(this, \"_colors\", colors);\n }\n\n /**\n * In High Contrast Mode, the color on the screen is not always the\n * real color used in the pdf.\n * For example in some cases white can appear to be black but when saving\n * we want to have white.\n * @param {string} color\n * @returns {Array}\n */\n convert(color) {\n const rgb = getRGB(color);\n if (!window.matchMedia(\"(forced-colors: active)\").matches) {\n return rgb;\n }\n\n for (const [name, RGB] of this._colors) {\n if (RGB.every((x, i) => x === rgb[i])) {\n return ColorManager._colorsMapping.get(name);\n }\n }\n return rgb;\n }\n\n /**\n * An input element must have its color value as a hex string\n * and not as color name.\n * So this function converts a name into an hex string.\n * @param {string} name\n * @returns {string}\n */\n getHexCode(name) {\n const rgb = this._colors.get(name);\n if (!rgb) {\n return name;\n }\n return Util.makeHexColor(...rgb);\n }\n}\n\n/**\n * A pdf has several pages and each of them when it will rendered\n * will have an AnnotationEditorLayer which will contain the some\n * new Annotations associated to an editor in order to modify them.\n *\n * This class is used to manage all the different layers, editors and\n * some action like copy/paste, undo/redo, ...\n */\nclass AnnotationEditorUIManager {\n #abortController = new AbortController();\n\n #activeEditor = null;\n\n #allEditors = new Map();\n\n #allLayers = new Map();\n\n #altTextManager = null;\n\n #annotationStorage = null;\n\n #changedExistingAnnotations = null;\n\n #commandManager = new CommandManager();\n\n #currentPageIndex = 0;\n\n #deletedAnnotationsElementIds = new Set();\n\n #draggingEditors = null;\n\n #editorTypes = null;\n\n #editorsToRescale = new Set();\n\n #enableHighlightFloatingButton = false;\n\n #filterFactory = null;\n\n #focusMainContainerTimeoutId = null;\n\n #highlightColors = null;\n\n #highlightWhenShiftUp = false;\n\n #highlightToolbar = null;\n\n #idManager = new IdManager();\n\n #isEnabled = false;\n\n #isWaiting = false;\n\n #lastActiveElement = null;\n\n #mainHighlightColorPicker = null;\n\n #mlManager = null;\n\n #mode = AnnotationEditorType.NONE;\n\n #selectedEditors = new Set();\n\n #selectedTextNode = null;\n\n #pageColors = null;\n\n #showAllStates = null;\n\n #boundBlur = this.blur.bind(this);\n\n #boundFocus = this.focus.bind(this);\n\n #boundCopy = this.copy.bind(this);\n\n #boundCut = this.cut.bind(this);\n\n #boundPaste = this.paste.bind(this);\n\n #boundKeydown = this.keydown.bind(this);\n\n #boundKeyup = this.keyup.bind(this);\n\n #boundOnEditingAction = this.onEditingAction.bind(this);\n\n #boundOnPageChanging = this.onPageChanging.bind(this);\n\n #boundOnScaleChanging = this.onScaleChanging.bind(this);\n\n #boundOnRotationChanging = this.onRotationChanging.bind(this);\n\n #previousStates = {\n isEditing: false,\n isEmpty: true,\n hasSomethingToUndo: false,\n hasSomethingToRedo: false,\n hasSelectedEditor: false,\n hasSelectedText: false,\n };\n\n #translation = [0, 0];\n\n #translationTimeoutId = null;\n\n #container = null;\n\n #viewer = null;\n\n static TRANSLATE_SMALL = 1; // page units.\n\n static TRANSLATE_BIG = 10; // page units.\n\n static get _keyboardManager() {\n const proto = AnnotationEditorUIManager.prototype;\n\n /**\n * If the focused element is an input, we don't want to handle the arrow.\n * For example, sliders can be controlled with the arrow keys.\n */\n const arrowChecker = self =>\n self.#container.contains(document.activeElement) &&\n document.activeElement.tagName !== \"BUTTON\" &&\n self.hasSomethingToControl();\n\n const textInputChecker = (_self, { target: el }) => {\n if (el instanceof HTMLInputElement) {\n const { type } = el;\n return type !== \"text\" && type !== \"number\";\n }\n return true;\n };\n\n const small = this.TRANSLATE_SMALL;\n const big = this.TRANSLATE_BIG;\n\n return shadow(\n this,\n \"_keyboardManager\",\n new KeyboardManager([\n [\n [\"ctrl+a\", \"mac+meta+a\"],\n proto.selectAll,\n { checker: textInputChecker },\n ],\n [[\"ctrl+z\", \"mac+meta+z\"], proto.undo, { checker: textInputChecker }],\n [\n // On mac, depending of the OS version, the event.key is either \"z\" or\n // \"Z\" when the user presses \"meta+shift+z\".\n [\n \"ctrl+y\",\n \"ctrl+shift+z\",\n \"mac+meta+shift+z\",\n \"ctrl+shift+Z\",\n \"mac+meta+shift+Z\",\n ],\n proto.redo,\n { checker: textInputChecker },\n ],\n [\n [\n \"Backspace\",\n \"alt+Backspace\",\n \"ctrl+Backspace\",\n \"shift+Backspace\",\n \"mac+Backspace\",\n \"mac+alt+Backspace\",\n \"mac+ctrl+Backspace\",\n \"Delete\",\n \"ctrl+Delete\",\n \"shift+Delete\",\n \"mac+Delete\",\n ],\n proto.delete,\n { checker: textInputChecker },\n ],\n [\n [\"Enter\", \"mac+Enter\"],\n proto.addNewEditorFromKeyboard,\n {\n // Those shortcuts can be used in the toolbar for some other actions\n // like zooming, hence we need to check if the container has the\n // focus.\n checker: (self, { target: el }) =>\n !(el instanceof HTMLButtonElement) &&\n self.#container.contains(el) &&\n !self.isEnterHandled,\n },\n ],\n [\n [\" \", \"mac+ \"],\n proto.addNewEditorFromKeyboard,\n {\n // Those shortcuts can be used in the toolbar for some other actions\n // like zooming, hence we need to check if the container has the\n // focus.\n checker: (self, { target: el }) =>\n !(el instanceof HTMLButtonElement) &&\n self.#container.contains(document.activeElement),\n },\n ],\n [[\"Escape\", \"mac+Escape\"], proto.unselectAll],\n [\n [\"ArrowLeft\", \"mac+ArrowLeft\"],\n proto.translateSelectedEditors,\n { args: [-small, 0], checker: arrowChecker },\n ],\n [\n [\"ctrl+ArrowLeft\", \"mac+shift+ArrowLeft\"],\n proto.translateSelectedEditors,\n { args: [-big, 0], checker: arrowChecker },\n ],\n [\n [\"ArrowRight\", \"mac+ArrowRight\"],\n proto.translateSelectedEditors,\n { args: [small, 0], checker: arrowChecker },\n ],\n [\n [\"ctrl+ArrowRight\", \"mac+shift+ArrowRight\"],\n proto.translateSelectedEditors,\n { args: [big, 0], checker: arrowChecker },\n ],\n [\n [\"ArrowUp\", \"mac+ArrowUp\"],\n proto.translateSelectedEditors,\n { args: [0, -small], checker: arrowChecker },\n ],\n [\n [\"ctrl+ArrowUp\", \"mac+shift+ArrowUp\"],\n proto.translateSelectedEditors,\n { args: [0, -big], checker: arrowChecker },\n ],\n [\n [\"ArrowDown\", \"mac+ArrowDown\"],\n proto.translateSelectedEditors,\n { args: [0, small], checker: arrowChecker },\n ],\n [\n [\"ctrl+ArrowDown\", \"mac+shift+ArrowDown\"],\n proto.translateSelectedEditors,\n { args: [0, big], checker: arrowChecker },\n ],\n ])\n );\n }\n\n constructor(\n container,\n viewer,\n altTextManager,\n eventBus,\n pdfDocument,\n pageColors,\n highlightColors,\n enableHighlightFloatingButton,\n mlManager\n ) {\n this._signal = this.#abortController.signal;\n this.#container = container;\n this.#viewer = viewer;\n this.#altTextManager = altTextManager;\n this._eventBus = eventBus;\n this._eventBus._on(\"editingaction\", this.#boundOnEditingAction);\n this._eventBus._on(\"pagechanging\", this.#boundOnPageChanging);\n this._eventBus._on(\"scalechanging\", this.#boundOnScaleChanging);\n this._eventBus._on(\"rotationchanging\", this.#boundOnRotationChanging);\n this.#addSelectionListener();\n this.#addDragAndDropListeners();\n this.#addKeyboardManager();\n this.#annotationStorage = pdfDocument.annotationStorage;\n this.#filterFactory = pdfDocument.filterFactory;\n this.#pageColors = pageColors;\n this.#highlightColors = highlightColors || null;\n this.#enableHighlightFloatingButton = enableHighlightFloatingButton;\n this.#mlManager = mlManager || null;\n this.viewParameters = {\n realScale: PixelsPerInch.PDF_TO_CSS_UNITS,\n rotation: 0,\n };\n this.isShiftKeyDown = false;\n\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\")) {\n Object.defineProperty(this, \"reset\", {\n value: () => {\n this.selectAll();\n this.delete();\n this.#idManager.reset();\n },\n });\n }\n }\n\n destroy() {\n this.#abortController?.abort();\n this.#abortController = null;\n this._signal = null;\n\n this._eventBus._off(\"editingaction\", this.#boundOnEditingAction);\n this._eventBus._off(\"pagechanging\", this.#boundOnPageChanging);\n this._eventBus._off(\"scalechanging\", this.#boundOnScaleChanging);\n this._eventBus._off(\"rotationchanging\", this.#boundOnRotationChanging);\n for (const layer of this.#allLayers.values()) {\n layer.destroy();\n }\n this.#allLayers.clear();\n this.#allEditors.clear();\n this.#editorsToRescale.clear();\n this.#activeEditor = null;\n this.#selectedEditors.clear();\n this.#commandManager.destroy();\n this.#altTextManager?.destroy();\n this.#highlightToolbar?.hide();\n this.#highlightToolbar = null;\n if (this.#focusMainContainerTimeoutId) {\n clearTimeout(this.#focusMainContainerTimeoutId);\n this.#focusMainContainerTimeoutId = null;\n }\n if (this.#translationTimeoutId) {\n clearTimeout(this.#translationTimeoutId);\n this.#translationTimeoutId = null;\n }\n }\n\n async mlGuess(data) {\n return this.#mlManager?.guess(data) || null;\n }\n\n get hasMLManager() {\n return !!this.#mlManager;\n }\n\n get hcmFilter() {\n return shadow(\n this,\n \"hcmFilter\",\n this.#pageColors\n ? this.#filterFactory.addHCMFilter(\n this.#pageColors.foreground,\n this.#pageColors.background\n )\n : \"none\"\n );\n }\n\n get direction() {\n return shadow(\n this,\n \"direction\",\n getComputedStyle(this.#container).direction\n );\n }\n\n get highlightColors() {\n return shadow(\n this,\n \"highlightColors\",\n this.#highlightColors\n ? new Map(\n this.#highlightColors\n .split(\",\")\n .map(pair => pair.split(\"=\").map(x => x.trim()))\n )\n : null\n );\n }\n\n get highlightColorNames() {\n return shadow(\n this,\n \"highlightColorNames\",\n this.highlightColors\n ? new Map(Array.from(this.highlightColors, e => e.reverse()))\n : null\n );\n }\n\n setMainHighlightColorPicker(colorPicker) {\n this.#mainHighlightColorPicker = colorPicker;\n }\n\n editAltText(editor) {\n this.#altTextManager?.editAltText(this, editor);\n }\n\n onPageChanging({ pageNumber }) {\n this.#currentPageIndex = pageNumber - 1;\n }\n\n focusMainContainer() {\n this.#container.focus();\n }\n\n findParent(x, y) {\n for (const layer of this.#allLayers.values()) {\n const {\n x: layerX,\n y: layerY,\n width,\n height,\n } = layer.div.getBoundingClientRect();\n if (\n x >= layerX &&\n x <= layerX + width &&\n y >= layerY &&\n y <= layerY + height\n ) {\n return layer;\n }\n }\n return null;\n }\n\n disableUserSelect(value = false) {\n this.#viewer.classList.toggle(\"noUserSelect\", value);\n }\n\n addShouldRescale(editor) {\n this.#editorsToRescale.add(editor);\n }\n\n removeShouldRescale(editor) {\n this.#editorsToRescale.delete(editor);\n }\n\n onScaleChanging({ scale }) {\n this.commitOrRemove();\n this.viewParameters.realScale = scale * PixelsPerInch.PDF_TO_CSS_UNITS;\n for (const editor of this.#editorsToRescale) {\n editor.onScaleChanging();\n }\n }\n\n onRotationChanging({ pagesRotation }) {\n this.commitOrRemove();\n this.viewParameters.rotation = pagesRotation;\n }\n\n #getAnchorElementForSelection({ anchorNode }) {\n return anchorNode.nodeType === Node.TEXT_NODE\n ? anchorNode.parentElement\n : anchorNode;\n }\n\n highlightSelection(methodOfCreation = \"\") {\n const selection = document.getSelection();\n if (!selection || selection.isCollapsed) {\n return;\n }\n const { anchorNode, anchorOffset, focusNode, focusOffset } = selection;\n const text = selection.toString();\n const anchorElement = this.#getAnchorElementForSelection(selection);\n const textLayer = anchorElement.closest(\".textLayer\");\n const boxes = this.getSelectionBoxes(textLayer);\n if (!boxes) {\n return;\n }\n selection.empty();\n if (this.#mode === AnnotationEditorType.NONE) {\n this._eventBus.dispatch(\"showannotationeditorui\", {\n source: this,\n mode: AnnotationEditorType.HIGHLIGHT,\n });\n this.showAllEditors(\"highlight\", true, /* updateButton = */ true);\n }\n for (const layer of this.#allLayers.values()) {\n if (layer.hasTextLayer(textLayer)) {\n layer.createAndAddNewEditor({ x: 0, y: 0 }, false, {\n methodOfCreation,\n boxes,\n anchorNode,\n anchorOffset,\n focusNode,\n focusOffset,\n text,\n });\n break;\n }\n }\n }\n\n #displayHighlightToolbar() {\n const selection = document.getSelection();\n if (!selection || selection.isCollapsed) {\n return;\n }\n const anchorElement = this.#getAnchorElementForSelection(selection);\n const textLayer = anchorElement.closest(\".textLayer\");\n const boxes = this.getSelectionBoxes(textLayer);\n if (!boxes) {\n return;\n }\n this.#highlightToolbar ||= new HighlightToolbar(this);\n this.#highlightToolbar.show(textLayer, boxes, this.direction === \"ltr\");\n }\n\n /**\n * Add an editor in the annotation storage.\n * @param {AnnotationEditor} editor\n */\n addToAnnotationStorage(editor) {\n if (\n !editor.isEmpty() &&\n this.#annotationStorage &&\n !this.#annotationStorage.has(editor.id)\n ) {\n this.#annotationStorage.setValue(editor.id, editor);\n }\n }\n\n #selectionChange() {\n const selection = document.getSelection();\n if (!selection || selection.isCollapsed) {\n if (this.#selectedTextNode) {\n this.#highlightToolbar?.hide();\n this.#selectedTextNode = null;\n this.#dispatchUpdateStates({\n hasSelectedText: false,\n });\n }\n return;\n }\n const { anchorNode } = selection;\n if (anchorNode === this.#selectedTextNode) {\n return;\n }\n\n const anchorElement = this.#getAnchorElementForSelection(selection);\n const textLayer = anchorElement.closest(\".textLayer\");\n if (!textLayer) {\n if (this.#selectedTextNode) {\n this.#highlightToolbar?.hide();\n this.#selectedTextNode = null;\n this.#dispatchUpdateStates({\n hasSelectedText: false,\n });\n }\n return;\n }\n this.#highlightToolbar?.hide();\n this.#selectedTextNode = anchorNode;\n this.#dispatchUpdateStates({\n hasSelectedText: true,\n });\n\n if (\n this.#mode !== AnnotationEditorType.HIGHLIGHT &&\n this.#mode !== AnnotationEditorType.NONE\n ) {\n return;\n }\n\n if (this.#mode === AnnotationEditorType.HIGHLIGHT) {\n this.showAllEditors(\"highlight\", true, /* updateButton = */ true);\n }\n\n this.#highlightWhenShiftUp = this.isShiftKeyDown;\n if (!this.isShiftKeyDown) {\n const signal = this._signal;\n const pointerup = e => {\n if (e.type === \"pointerup\" && e.button !== 0) {\n // Do nothing on right click.\n return;\n }\n window.removeEventListener(\"pointerup\", pointerup);\n window.removeEventListener(\"blur\", pointerup);\n if (e.type === \"pointerup\") {\n this.#onSelectEnd(\"main_toolbar\");\n }\n };\n window.addEventListener(\"pointerup\", pointerup, { signal });\n window.addEventListener(\"blur\", pointerup, { signal });\n }\n }\n\n #onSelectEnd(methodOfCreation = \"\") {\n if (this.#mode === AnnotationEditorType.HIGHLIGHT) {\n this.highlightSelection(methodOfCreation);\n } else if (this.#enableHighlightFloatingButton) {\n this.#displayHighlightToolbar();\n }\n }\n\n #addSelectionListener() {\n document.addEventListener(\n \"selectionchange\",\n this.#selectionChange.bind(this),\n {\n signal: this._signal,\n }\n );\n }\n\n #addFocusManager() {\n const signal = this._signal;\n window.addEventListener(\"focus\", this.#boundFocus, { signal });\n window.addEventListener(\"blur\", this.#boundBlur, { signal });\n }\n\n #removeFocusManager() {\n window.removeEventListener(\"focus\", this.#boundFocus);\n window.removeEventListener(\"blur\", this.#boundBlur);\n }\n\n blur() {\n this.isShiftKeyDown = false;\n if (this.#highlightWhenShiftUp) {\n this.#highlightWhenShiftUp = false;\n this.#onSelectEnd(\"main_toolbar\");\n }\n if (!this.hasSelection) {\n return;\n }\n // When several editors are selected and the window loses focus, we want to\n // keep the last active element in order to be able to focus it again when\n // the window gets the focus back but we don't want to trigger any focus\n // callbacks else only one editor will be selected.\n const { activeElement } = document;\n for (const editor of this.#selectedEditors) {\n if (editor.div.contains(activeElement)) {\n this.#lastActiveElement = [editor, activeElement];\n editor._focusEventsAllowed = false;\n break;\n }\n }\n }\n\n focus() {\n if (!this.#lastActiveElement) {\n return;\n }\n const [lastEditor, lastActiveElement] = this.#lastActiveElement;\n this.#lastActiveElement = null;\n lastActiveElement.addEventListener(\n \"focusin\",\n () => {\n lastEditor._focusEventsAllowed = true;\n },\n { once: true, signal: this._signal }\n );\n lastActiveElement.focus();\n }\n\n #addKeyboardManager() {\n const signal = this._signal;\n // The keyboard events are caught at the container level in order to be able\n // to execute some callbacks even if the current page doesn't have focus.\n window.addEventListener(\"keydown\", this.#boundKeydown, { signal });\n window.addEventListener(\"keyup\", this.#boundKeyup, { signal });\n }\n\n #removeKeyboardManager() {\n window.removeEventListener(\"keydown\", this.#boundKeydown);\n window.removeEventListener(\"keyup\", this.#boundKeyup);\n }\n\n #addCopyPasteListeners() {\n const signal = this._signal;\n document.addEventListener(\"copy\", this.#boundCopy, { signal });\n document.addEventListener(\"cut\", this.#boundCut, { signal });\n document.addEventListener(\"paste\", this.#boundPaste, { signal });\n }\n\n #removeCopyPasteListeners() {\n document.removeEventListener(\"copy\", this.#boundCopy);\n document.removeEventListener(\"cut\", this.#boundCut);\n document.removeEventListener(\"paste\", this.#boundPaste);\n }\n\n #addDragAndDropListeners() {\n const signal = this._signal;\n document.addEventListener(\"dragover\", this.dragOver.bind(this), { signal });\n document.addEventListener(\"drop\", this.drop.bind(this), { signal });\n }\n\n addEditListeners() {\n this.#addKeyboardManager();\n this.#addCopyPasteListeners();\n }\n\n removeEditListeners() {\n this.#removeKeyboardManager();\n this.#removeCopyPasteListeners();\n }\n\n dragOver(event) {\n for (const { type } of event.dataTransfer.items) {\n for (const editorType of this.#editorTypes) {\n if (editorType.isHandlingMimeForPasting(type)) {\n event.dataTransfer.dropEffect = \"copy\";\n event.preventDefault();\n return;\n }\n }\n }\n }\n\n /**\n * Drop callback.\n * @param {DragEvent} event\n */\n drop(event) {\n for (const item of event.dataTransfer.items) {\n for (const editorType of this.#editorTypes) {\n if (editorType.isHandlingMimeForPasting(item.type)) {\n editorType.paste(item, this.currentLayer);\n event.preventDefault();\n return;\n }\n }\n }\n }\n\n /**\n * Copy callback.\n * @param {ClipboardEvent} event\n */\n copy(event) {\n event.preventDefault();\n\n // An editor is being edited so just commit it.\n this.#activeEditor?.commitOrRemove();\n\n if (!this.hasSelection) {\n return;\n }\n\n const editors = [];\n for (const editor of this.#selectedEditors) {\n const serialized = editor.serialize(/* isForCopying = */ true);\n if (serialized) {\n editors.push(serialized);\n }\n }\n if (editors.length === 0) {\n return;\n }\n\n event.clipboardData.setData(\"application/pdfjs\", JSON.stringify(editors));\n }\n\n /**\n * Cut callback.\n * @param {ClipboardEvent} event\n */\n cut(event) {\n this.copy(event);\n this.delete();\n }\n\n /**\n * Paste callback.\n * @param {ClipboardEvent} event\n */\n paste(event) {\n event.preventDefault();\n const { clipboardData } = event;\n for (const item of clipboardData.items) {\n for (const editorType of this.#editorTypes) {\n if (editorType.isHandlingMimeForPasting(item.type)) {\n editorType.paste(item, this.currentLayer);\n return;\n }\n }\n }\n\n let data = clipboardData.getData(\"application/pdfjs\");\n if (!data) {\n return;\n }\n\n try {\n data = JSON.parse(data);\n } catch (ex) {\n warn(`paste: \"${ex.message}\".`);\n return;\n }\n\n if (!Array.isArray(data)) {\n return;\n }\n\n this.unselectAll();\n const layer = this.currentLayer;\n\n try {\n const newEditors = [];\n for (const editor of data) {\n const deserializedEditor = layer.deserialize(editor);\n if (!deserializedEditor) {\n return;\n }\n newEditors.push(deserializedEditor);\n }\n\n const cmd = () => {\n for (const editor of newEditors) {\n this.#addEditorToLayer(editor);\n }\n this.#selectEditors(newEditors);\n };\n const undo = () => {\n for (const editor of newEditors) {\n editor.remove();\n }\n };\n this.addCommands({ cmd, undo, mustExec: true });\n } catch (ex) {\n warn(`paste: \"${ex.message}\".`);\n }\n }\n\n /**\n * Keydown callback.\n * @param {KeyboardEvent} event\n */\n keydown(event) {\n if (!this.isShiftKeyDown && event.key === \"Shift\") {\n this.isShiftKeyDown = true;\n }\n if (\n this.#mode !== AnnotationEditorType.NONE &&\n !this.isEditorHandlingKeyboard\n ) {\n AnnotationEditorUIManager._keyboardManager.exec(this, event);\n }\n }\n\n /**\n * Keyup callback.\n * @param {KeyboardEvent} event\n */\n keyup(event) {\n if (this.isShiftKeyDown && event.key === \"Shift\") {\n this.isShiftKeyDown = false;\n if (this.#highlightWhenShiftUp) {\n this.#highlightWhenShiftUp = false;\n this.#onSelectEnd(\"main_toolbar\");\n }\n }\n }\n\n /**\n * Execute an action for a given name.\n * For example, the user can click on the \"Undo\" entry in the context menu\n * and it'll trigger the undo action.\n */\n onEditingAction({ name }) {\n switch (name) {\n case \"undo\":\n case \"redo\":\n case \"delete\":\n case \"selectAll\":\n this[name]();\n break;\n case \"highlightSelection\":\n this.highlightSelection(\"context_menu\");\n break;\n }\n }\n\n /**\n * Update the different possible states of this manager, e.g. is there\n * something to undo, redo, ...\n * @param {Object} details\n */\n #dispatchUpdateStates(details) {\n const hasChanged = Object.entries(details).some(\n ([key, value]) => this.#previousStates[key] !== value\n );\n\n if (hasChanged) {\n this._eventBus.dispatch(\"annotationeditorstateschanged\", {\n source: this,\n details: Object.assign(this.#previousStates, details),\n });\n // We could listen on our own event but it sounds like a bit weird and\n // it's a way to simpler to handle that stuff here instead of having to\n // add something in every place where an editor can be unselected.\n if (\n this.#mode === AnnotationEditorType.HIGHLIGHT &&\n details.hasSelectedEditor === false\n ) {\n this.#dispatchUpdateUI([\n [AnnotationEditorParamsType.HIGHLIGHT_FREE, true],\n ]);\n }\n }\n }\n\n #dispatchUpdateUI(details) {\n this._eventBus.dispatch(\"annotationeditorparamschanged\", {\n source: this,\n details,\n });\n }\n\n /**\n * Set the editing state.\n * It can be useful to temporarily disable it when the user is editing a\n * FreeText annotation.\n * @param {boolean} isEditing\n */\n setEditingState(isEditing) {\n if (isEditing) {\n this.#addFocusManager();\n this.#addCopyPasteListeners();\n this.#dispatchUpdateStates({\n isEditing: this.#mode !== AnnotationEditorType.NONE,\n isEmpty: this.#isEmpty(),\n hasSomethingToUndo: this.#commandManager.hasSomethingToUndo(),\n hasSomethingToRedo: this.#commandManager.hasSomethingToRedo(),\n hasSelectedEditor: false,\n });\n } else {\n this.#removeFocusManager();\n this.#removeCopyPasteListeners();\n this.#dispatchUpdateStates({\n isEditing: false,\n });\n this.disableUserSelect(false);\n }\n }\n\n registerEditorTypes(types) {\n if (this.#editorTypes) {\n return;\n }\n this.#editorTypes = types;\n for (const editorType of this.#editorTypes) {\n this.#dispatchUpdateUI(editorType.defaultPropertiesToUpdate);\n }\n }\n\n /**\n * Get an id.\n * @returns {string}\n */\n getId() {\n return this.#idManager.id;\n }\n\n get currentLayer() {\n return this.#allLayers.get(this.#currentPageIndex);\n }\n\n getLayer(pageIndex) {\n return this.#allLayers.get(pageIndex);\n }\n\n get currentPageIndex() {\n return this.#currentPageIndex;\n }\n\n /**\n * Add a new layer for a page which will contains the editors.\n * @param {AnnotationEditorLayer} layer\n */\n addLayer(layer) {\n this.#allLayers.set(layer.pageIndex, layer);\n if (this.#isEnabled) {\n layer.enable();\n } else {\n layer.disable();\n }\n }\n\n /**\n * Remove a layer.\n * @param {AnnotationEditorLayer} layer\n */\n removeLayer(layer) {\n this.#allLayers.delete(layer.pageIndex);\n }\n\n /**\n * Change the editor mode (None, FreeText, Ink, ...)\n * @param {number} mode\n * @param {string|null} editId\n * @param {boolean} [isFromKeyboard] - true if the mode change is due to a\n * keyboard action.\n */\n updateMode(mode, editId = null, isFromKeyboard = false) {\n if (this.#mode === mode) {\n return;\n }\n this.#mode = mode;\n if (mode === AnnotationEditorType.NONE) {\n this.setEditingState(false);\n this.#disableAll();\n return;\n }\n this.setEditingState(true);\n this.#enableAll();\n this.unselectAll();\n for (const layer of this.#allLayers.values()) {\n layer.updateMode(mode);\n }\n if (!editId && isFromKeyboard) {\n this.addNewEditorFromKeyboard();\n return;\n }\n\n if (!editId) {\n return;\n }\n for (const editor of this.#allEditors.values()) {\n if (editor.annotationElementId === editId) {\n this.setSelected(editor);\n editor.enterInEditMode();\n break;\n }\n }\n }\n\n addNewEditorFromKeyboard() {\n if (this.currentLayer.canCreateNewEmptyEditor()) {\n this.currentLayer.addNewEditor();\n }\n }\n\n /**\n * Update the toolbar if it's required to reflect the tool currently used.\n * @param {number} mode\n * @returns {undefined}\n */\n updateToolbar(mode) {\n if (mode === this.#mode) {\n return;\n }\n this._eventBus.dispatch(\"switchannotationeditormode\", {\n source: this,\n mode,\n });\n }\n\n /**\n * Update a parameter in the current editor or globally.\n * @param {number} type\n * @param {*} value\n */\n updateParams(type, value) {\n if (!this.#editorTypes) {\n return;\n }\n\n switch (type) {\n case AnnotationEditorParamsType.CREATE:\n this.currentLayer.addNewEditor();\n return;\n case AnnotationEditorParamsType.HIGHLIGHT_DEFAULT_COLOR:\n this.#mainHighlightColorPicker?.updateColor(value);\n break;\n case AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL:\n this._eventBus.dispatch(\"reporttelemetry\", {\n source: this,\n details: {\n type: \"editing\",\n data: {\n type: \"highlight\",\n action: \"toggle_visibility\",\n },\n },\n });\n (this.#showAllStates ||= new Map()).set(type, value);\n this.showAllEditors(\"highlight\", value);\n break;\n }\n\n for (const editor of this.#selectedEditors) {\n editor.updateParams(type, value);\n }\n\n for (const editorType of this.#editorTypes) {\n editorType.updateDefaultParams(type, value);\n }\n }\n\n showAllEditors(type, visible, updateButton = false) {\n for (const editor of this.#allEditors.values()) {\n if (editor.editorType === type) {\n editor.show(visible);\n }\n }\n const state =\n this.#showAllStates?.get(AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL) ??\n true;\n if (state !== visible) {\n this.#dispatchUpdateUI([\n [AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL, visible],\n ]);\n }\n }\n\n enableWaiting(mustWait = false) {\n if (this.#isWaiting === mustWait) {\n return;\n }\n this.#isWaiting = mustWait;\n for (const layer of this.#allLayers.values()) {\n if (mustWait) {\n layer.disableClick();\n } else {\n layer.enableClick();\n }\n layer.div.classList.toggle(\"waiting\", mustWait);\n }\n }\n\n /**\n * Enable all the layers.\n */\n #enableAll() {\n if (!this.#isEnabled) {\n this.#isEnabled = true;\n for (const layer of this.#allLayers.values()) {\n layer.enable();\n }\n for (const editor of this.#allEditors.values()) {\n editor.enable();\n }\n }\n }\n\n /**\n * Disable all the layers.\n */\n #disableAll() {\n this.unselectAll();\n if (this.#isEnabled) {\n this.#isEnabled = false;\n for (const layer of this.#allLayers.values()) {\n layer.disable();\n }\n for (const editor of this.#allEditors.values()) {\n editor.disable();\n }\n }\n }\n\n /**\n * Get all the editors belonging to a given page.\n * @param {number} pageIndex\n * @returns {Array}\n */\n getEditors(pageIndex) {\n const editors = [];\n for (const editor of this.#allEditors.values()) {\n if (editor.pageIndex === pageIndex) {\n editors.push(editor);\n }\n }\n return editors;\n }\n\n /**\n * Get an editor with the given id.\n * @param {string} id\n * @returns {AnnotationEditor}\n */\n getEditor(id) {\n return this.#allEditors.get(id);\n }\n\n /**\n * Add a new editor.\n * @param {AnnotationEditor} editor\n */\n addEditor(editor) {\n this.#allEditors.set(editor.id, editor);\n }\n\n /**\n * Remove an editor.\n * @param {AnnotationEditor} editor\n */\n removeEditor(editor) {\n if (editor.div.contains(document.activeElement)) {\n if (this.#focusMainContainerTimeoutId) {\n clearTimeout(this.#focusMainContainerTimeoutId);\n }\n this.#focusMainContainerTimeoutId = setTimeout(() => {\n // When the div is removed from DOM the focus can move on the\n // document.body, so we need to move it back to the main container.\n this.focusMainContainer();\n this.#focusMainContainerTimeoutId = null;\n }, 0);\n }\n this.#allEditors.delete(editor.id);\n this.unselect(editor);\n if (\n !editor.annotationElementId ||\n !this.#deletedAnnotationsElementIds.has(editor.annotationElementId)\n ) {\n this.#annotationStorage?.remove(editor.id);\n }\n }\n\n /**\n * The annotation element with the given id has been deleted.\n * @param {AnnotationEditor} editor\n */\n addDeletedAnnotationElement(editor) {\n this.#deletedAnnotationsElementIds.add(editor.annotationElementId);\n this.addChangedExistingAnnotation(editor);\n editor.deleted = true;\n }\n\n /**\n * Check if the annotation element with the given id has been deleted.\n * @param {string} annotationElementId\n * @returns {boolean}\n */\n isDeletedAnnotationElement(annotationElementId) {\n return this.#deletedAnnotationsElementIds.has(annotationElementId);\n }\n\n /**\n * The annotation element with the given id have been restored.\n * @param {AnnotationEditor} editor\n */\n removeDeletedAnnotationElement(editor) {\n this.#deletedAnnotationsElementIds.delete(editor.annotationElementId);\n this.removeChangedExistingAnnotation(editor);\n editor.deleted = false;\n }\n\n /**\n * Add an editor to the layer it belongs to or add it to the global map.\n * @param {AnnotationEditor} editor\n */\n #addEditorToLayer(editor) {\n const layer = this.#allLayers.get(editor.pageIndex);\n if (layer) {\n layer.addOrRebuild(editor);\n } else {\n this.addEditor(editor);\n this.addToAnnotationStorage(editor);\n }\n }\n\n /**\n * Set the given editor as the active one.\n * @param {AnnotationEditor} editor\n */\n setActiveEditor(editor) {\n if (this.#activeEditor === editor) {\n return;\n }\n\n this.#activeEditor = editor;\n if (editor) {\n this.#dispatchUpdateUI(editor.propertiesToUpdate);\n }\n }\n\n get #lastSelectedEditor() {\n let ed = null;\n for (ed of this.#selectedEditors) {\n // Iterate to get the last element.\n }\n return ed;\n }\n\n /**\n * Update the UI of the active editor.\n * @param {AnnotationEditor} editor\n */\n updateUI(editor) {\n if (this.#lastSelectedEditor === editor) {\n this.#dispatchUpdateUI(editor.propertiesToUpdate);\n }\n }\n\n /**\n * Add or remove an editor the current selection.\n * @param {AnnotationEditor} editor\n */\n toggleSelected(editor) {\n if (this.#selectedEditors.has(editor)) {\n this.#selectedEditors.delete(editor);\n editor.unselect();\n this.#dispatchUpdateStates({\n hasSelectedEditor: this.hasSelection,\n });\n return;\n }\n this.#selectedEditors.add(editor);\n editor.select();\n this.#dispatchUpdateUI(editor.propertiesToUpdate);\n this.#dispatchUpdateStates({\n hasSelectedEditor: true,\n });\n }\n\n /**\n * Set the last selected editor.\n * @param {AnnotationEditor} editor\n */\n setSelected(editor) {\n for (const ed of this.#selectedEditors) {\n if (ed !== editor) {\n ed.unselect();\n }\n }\n this.#selectedEditors.clear();\n\n this.#selectedEditors.add(editor);\n editor.select();\n this.#dispatchUpdateUI(editor.propertiesToUpdate);\n this.#dispatchUpdateStates({\n hasSelectedEditor: true,\n });\n }\n\n /**\n * Check if the editor is selected.\n * @param {AnnotationEditor} editor\n */\n isSelected(editor) {\n return this.#selectedEditors.has(editor);\n }\n\n get firstSelectedEditor() {\n return this.#selectedEditors.values().next().value;\n }\n\n /**\n * Unselect an editor.\n * @param {AnnotationEditor} editor\n */\n unselect(editor) {\n editor.unselect();\n this.#selectedEditors.delete(editor);\n this.#dispatchUpdateStates({\n hasSelectedEditor: this.hasSelection,\n });\n }\n\n get hasSelection() {\n return this.#selectedEditors.size !== 0;\n }\n\n get isEnterHandled() {\n return (\n this.#selectedEditors.size === 1 &&\n this.firstSelectedEditor.isEnterHandled\n );\n }\n\n /**\n * Undo the last command.\n */\n undo() {\n this.#commandManager.undo();\n this.#dispatchUpdateStates({\n hasSomethingToUndo: this.#commandManager.hasSomethingToUndo(),\n hasSomethingToRedo: true,\n isEmpty: this.#isEmpty(),\n });\n }\n\n /**\n * Redo the last undoed command.\n */\n redo() {\n this.#commandManager.redo();\n this.#dispatchUpdateStates({\n hasSomethingToUndo: true,\n hasSomethingToRedo: this.#commandManager.hasSomethingToRedo(),\n isEmpty: this.#isEmpty(),\n });\n }\n\n /**\n * Add a command to execute (cmd) and another one to undo it.\n * @param {Object} params\n */\n addCommands(params) {\n this.#commandManager.add(params);\n this.#dispatchUpdateStates({\n hasSomethingToUndo: true,\n hasSomethingToRedo: false,\n isEmpty: this.#isEmpty(),\n });\n }\n\n #isEmpty() {\n if (this.#allEditors.size === 0) {\n return true;\n }\n\n if (this.#allEditors.size === 1) {\n for (const editor of this.#allEditors.values()) {\n return editor.isEmpty();\n }\n }\n\n return false;\n }\n\n /**\n * Delete the current editor or all.\n */\n delete() {\n this.commitOrRemove();\n if (!this.hasSelection) {\n return;\n }\n\n const editors = [...this.#selectedEditors];\n const cmd = () => {\n for (const editor of editors) {\n editor.remove();\n }\n };\n const undo = () => {\n for (const editor of editors) {\n this.#addEditorToLayer(editor);\n }\n };\n\n this.addCommands({ cmd, undo, mustExec: true });\n }\n\n commitOrRemove() {\n // An editor is being edited so just commit it.\n this.#activeEditor?.commitOrRemove();\n }\n\n hasSomethingToControl() {\n return this.#activeEditor || this.hasSelection;\n }\n\n /**\n * Select the editors.\n * @param {Array} editors\n */\n #selectEditors(editors) {\n for (const editor of this.#selectedEditors) {\n editor.unselect();\n }\n this.#selectedEditors.clear();\n for (const editor of editors) {\n if (editor.isEmpty()) {\n continue;\n }\n this.#selectedEditors.add(editor);\n editor.select();\n }\n this.#dispatchUpdateStates({ hasSelectedEditor: this.hasSelection });\n }\n\n /**\n * Select all the editors.\n */\n selectAll() {\n for (const editor of this.#selectedEditors) {\n editor.commit();\n }\n this.#selectEditors(this.#allEditors.values());\n }\n\n /**\n * Unselect all the selected editors.\n */\n unselectAll() {\n if (this.#activeEditor) {\n // An editor is being edited so just commit it.\n this.#activeEditor.commitOrRemove();\n if (this.#mode !== AnnotationEditorType.NONE) {\n // If the mode is NONE, we want to really unselect the editor, hence we\n // mustn't return here.\n return;\n }\n }\n\n if (!this.hasSelection) {\n return;\n }\n for (const editor of this.#selectedEditors) {\n editor.unselect();\n }\n this.#selectedEditors.clear();\n this.#dispatchUpdateStates({\n hasSelectedEditor: false,\n });\n }\n\n translateSelectedEditors(x, y, noCommit = false) {\n if (!noCommit) {\n this.commitOrRemove();\n }\n if (!this.hasSelection) {\n return;\n }\n\n this.#translation[0] += x;\n this.#translation[1] += y;\n const [totalX, totalY] = this.#translation;\n const editors = [...this.#selectedEditors];\n\n // We don't want to have an undo/redo for each translation so we wait a bit\n // before adding the command to the command manager.\n const TIME_TO_WAIT = 1000;\n\n if (this.#translationTimeoutId) {\n clearTimeout(this.#translationTimeoutId);\n }\n\n this.#translationTimeoutId = setTimeout(() => {\n this.#translationTimeoutId = null;\n this.#translation[0] = this.#translation[1] = 0;\n\n this.addCommands({\n cmd: () => {\n for (const editor of editors) {\n if (this.#allEditors.has(editor.id)) {\n editor.translateInPage(totalX, totalY);\n }\n }\n },\n undo: () => {\n for (const editor of editors) {\n if (this.#allEditors.has(editor.id)) {\n editor.translateInPage(-totalX, -totalY);\n }\n }\n },\n mustExec: false,\n });\n }, TIME_TO_WAIT);\n\n for (const editor of editors) {\n editor.translateInPage(x, y);\n }\n }\n\n /**\n * Set up the drag session for moving the selected editors.\n */\n setUpDragSession() {\n // Note: don't use any references to the editor's parent which can be null\n // if the editor belongs to a destroyed page.\n if (!this.hasSelection) {\n return;\n }\n // Avoid to have spurious text selection in the text layer when dragging.\n this.disableUserSelect(true);\n this.#draggingEditors = new Map();\n for (const editor of this.#selectedEditors) {\n this.#draggingEditors.set(editor, {\n savedX: editor.x,\n savedY: editor.y,\n savedPageIndex: editor.pageIndex,\n newX: 0,\n newY: 0,\n newPageIndex: -1,\n });\n }\n }\n\n /**\n * Ends the drag session.\n * @returns {boolean} true if at least one editor has been moved.\n */\n endDragSession() {\n if (!this.#draggingEditors) {\n return false;\n }\n this.disableUserSelect(false);\n const map = this.#draggingEditors;\n this.#draggingEditors = null;\n let mustBeAddedInUndoStack = false;\n\n for (const [{ x, y, pageIndex }, value] of map) {\n value.newX = x;\n value.newY = y;\n value.newPageIndex = pageIndex;\n mustBeAddedInUndoStack ||=\n x !== value.savedX ||\n y !== value.savedY ||\n pageIndex !== value.savedPageIndex;\n }\n\n if (!mustBeAddedInUndoStack) {\n return false;\n }\n\n const move = (editor, x, y, pageIndex) => {\n if (this.#allEditors.has(editor.id)) {\n // The editor can be undone/redone on a page which is not visible (and\n // which potentially has no annotation editor layer), hence we need to\n // use the pageIndex instead of the parent.\n const parent = this.#allLayers.get(pageIndex);\n if (parent) {\n editor._setParentAndPosition(parent, x, y);\n } else {\n editor.pageIndex = pageIndex;\n editor.x = x;\n editor.y = y;\n }\n }\n };\n\n this.addCommands({\n cmd: () => {\n for (const [editor, { newX, newY, newPageIndex }] of map) {\n move(editor, newX, newY, newPageIndex);\n }\n },\n undo: () => {\n for (const [editor, { savedX, savedY, savedPageIndex }] of map) {\n move(editor, savedX, savedY, savedPageIndex);\n }\n },\n mustExec: true,\n });\n\n return true;\n }\n\n /**\n * Drag the set of selected editors.\n * @param {number} tx\n * @param {number} ty\n */\n dragSelectedEditors(tx, ty) {\n if (!this.#draggingEditors) {\n return;\n }\n for (const editor of this.#draggingEditors.keys()) {\n editor.drag(tx, ty);\n }\n }\n\n /**\n * Rebuild the editor (usually on undo/redo actions) on a potentially\n * non-rendered page.\n * @param {AnnotationEditor} editor\n */\n rebuild(editor) {\n if (editor.parent === null) {\n const parent = this.getLayer(editor.pageIndex);\n if (parent) {\n parent.changeParent(editor);\n parent.addOrRebuild(editor);\n } else {\n this.addEditor(editor);\n this.addToAnnotationStorage(editor);\n editor.rebuild();\n }\n } else {\n editor.parent.addOrRebuild(editor);\n }\n }\n\n get isEditorHandlingKeyboard() {\n return (\n this.getActive()?.shouldGetKeyboardEvents() ||\n (this.#selectedEditors.size === 1 &&\n this.firstSelectedEditor.shouldGetKeyboardEvents())\n );\n }\n\n /**\n * Is the current editor the one passed as argument?\n * @param {AnnotationEditor} editor\n * @returns\n */\n isActive(editor) {\n return this.#activeEditor === editor;\n }\n\n /**\n * Get the current active editor.\n * @returns {AnnotationEditor|null}\n */\n getActive() {\n return this.#activeEditor;\n }\n\n /**\n * Get the current editor mode.\n * @returns {number}\n */\n getMode() {\n return this.#mode;\n }\n\n get imageManager() {\n return shadow(this, \"imageManager\", new ImageManager());\n }\n\n getSelectionBoxes(textLayer) {\n if (!textLayer) {\n return null;\n }\n const selection = document.getSelection();\n for (let i = 0, ii = selection.rangeCount; i < ii; i++) {\n if (\n !textLayer.contains(selection.getRangeAt(i).commonAncestorContainer)\n ) {\n return null;\n }\n }\n\n const {\n x: layerX,\n y: layerY,\n width: parentWidth,\n height: parentHeight,\n } = textLayer.getBoundingClientRect();\n\n // We must rotate the boxes because we want to have them in the non-rotated\n // page coordinates.\n let rotator;\n switch (textLayer.getAttribute(\"data-main-rotation\")) {\n case \"90\":\n rotator = (x, y, w, h) => ({\n x: (y - layerY) / parentHeight,\n y: 1 - (x + w - layerX) / parentWidth,\n width: h / parentHeight,\n height: w / parentWidth,\n });\n break;\n case \"180\":\n rotator = (x, y, w, h) => ({\n x: 1 - (x + w - layerX) / parentWidth,\n y: 1 - (y + h - layerY) / parentHeight,\n width: w / parentWidth,\n height: h / parentHeight,\n });\n break;\n case \"270\":\n rotator = (x, y, w, h) => ({\n x: 1 - (y + h - layerY) / parentHeight,\n y: (x - layerX) / parentWidth,\n width: h / parentHeight,\n height: w / parentWidth,\n });\n break;\n default:\n rotator = (x, y, w, h) => ({\n x: (x - layerX) / parentWidth,\n y: (y - layerY) / parentHeight,\n width: w / parentWidth,\n height: h / parentHeight,\n });\n break;\n }\n\n const boxes = [];\n for (let i = 0, ii = selection.rangeCount; i < ii; i++) {\n const range = selection.getRangeAt(i);\n if (range.collapsed) {\n continue;\n }\n for (const { x, y, width, height } of range.getClientRects()) {\n if (width === 0 || height === 0) {\n continue;\n }\n boxes.push(rotator(x, y, width, height));\n }\n }\n return boxes.length === 0 ? null : boxes;\n }\n\n addChangedExistingAnnotation({ annotationElementId, id }) {\n (this.#changedExistingAnnotations ||= new Map()).set(\n annotationElementId,\n id\n );\n }\n\n removeChangedExistingAnnotation({ annotationElementId }) {\n this.#changedExistingAnnotations?.delete(annotationElementId);\n }\n\n renderAnnotationElement(annotation) {\n const editorId = this.#changedExistingAnnotations?.get(annotation.data.id);\n if (!editorId) {\n return;\n }\n const editor = this.#annotationStorage.getRawValue(editorId);\n if (!editor) {\n return;\n }\n if (this.#mode === AnnotationEditorType.NONE && !editor.hasBeenModified) {\n return;\n }\n editor.renderAnnotationElement(annotation);\n }\n}\n\nexport {\n AnnotationEditorUIManager,\n bindEvents,\n ColorManager,\n CommandManager,\n KeyboardManager,\n opacityToHex,\n};\n","/* Copyright 2023 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { noContextMenu } from \"../display_utils.js\";\n\nclass AltText {\n #altText = \"\";\n\n #altTextDecorative = false;\n\n #altTextButton = null;\n\n #altTextTooltip = null;\n\n #altTextTooltipTimeout = null;\n\n #altTextWasFromKeyBoard = false;\n\n #editor = null;\n\n static _l10nPromise = null;\n\n constructor(editor) {\n this.#editor = editor;\n }\n\n static initialize(l10nPromise) {\n AltText._l10nPromise ||= l10nPromise;\n }\n\n async render() {\n const altText = (this.#altTextButton = document.createElement(\"button\"));\n altText.className = \"altText\";\n const msg = await AltText._l10nPromise.get(\n \"pdfjs-editor-alt-text-button-label\"\n );\n altText.textContent = msg;\n altText.setAttribute(\"aria-label\", msg);\n altText.tabIndex = \"0\";\n const signal = this.#editor._uiManager._signal;\n altText.addEventListener(\"contextmenu\", noContextMenu, { signal });\n altText.addEventListener(\"pointerdown\", event => event.stopPropagation(), {\n signal,\n });\n\n const onClick = event => {\n event.preventDefault();\n this.#editor._uiManager.editAltText(this.#editor);\n };\n altText.addEventListener(\"click\", onClick, { capture: true, signal });\n altText.addEventListener(\n \"keydown\",\n event => {\n if (event.target === altText && event.key === \"Enter\") {\n this.#altTextWasFromKeyBoard = true;\n onClick(event);\n }\n },\n { signal }\n );\n await this.#setState();\n\n return altText;\n }\n\n finish() {\n if (!this.#altTextButton) {\n return;\n }\n this.#altTextButton.focus({ focusVisible: this.#altTextWasFromKeyBoard });\n this.#altTextWasFromKeyBoard = false;\n }\n\n isEmpty() {\n return !this.#altText && !this.#altTextDecorative;\n }\n\n get data() {\n return {\n altText: this.#altText,\n decorative: this.#altTextDecorative,\n };\n }\n\n /**\n * Set the alt text data.\n */\n set data({ altText, decorative }) {\n if (this.#altText === altText && this.#altTextDecorative === decorative) {\n return;\n }\n this.#altText = altText;\n this.#altTextDecorative = decorative;\n this.#setState();\n }\n\n toggle(enabled = false) {\n if (!this.#altTextButton) {\n return;\n }\n if (!enabled && this.#altTextTooltipTimeout) {\n clearTimeout(this.#altTextTooltipTimeout);\n this.#altTextTooltipTimeout = null;\n }\n this.#altTextButton.disabled = !enabled;\n }\n\n destroy() {\n this.#altTextButton?.remove();\n this.#altTextButton = null;\n this.#altTextTooltip = null;\n }\n\n async #setState() {\n const button = this.#altTextButton;\n if (!button) {\n return;\n }\n if (!this.#altText && !this.#altTextDecorative) {\n button.classList.remove(\"done\");\n this.#altTextTooltip?.remove();\n return;\n }\n button.classList.add(\"done\");\n\n AltText._l10nPromise\n .get(\"pdfjs-editor-alt-text-edit-button-label\")\n .then(msg => {\n button.setAttribute(\"aria-label\", msg);\n });\n let tooltip = this.#altTextTooltip;\n if (!tooltip) {\n this.#altTextTooltip = tooltip = document.createElement(\"span\");\n tooltip.className = \"tooltip\";\n tooltip.setAttribute(\"role\", \"tooltip\");\n const id = (tooltip.id = `alt-text-tooltip-${this.#editor.id}`);\n button.setAttribute(\"aria-describedby\", id);\n\n const DELAY_TO_SHOW_TOOLTIP = 100;\n const signal = this.#editor._uiManager._signal;\n signal.addEventListener(\n \"abort\",\n () => {\n clearTimeout(this.#altTextTooltipTimeout);\n this.#altTextTooltipTimeout = null;\n },\n { once: true }\n );\n button.addEventListener(\n \"mouseenter\",\n () => {\n this.#altTextTooltipTimeout = setTimeout(() => {\n this.#altTextTooltipTimeout = null;\n this.#altTextTooltip.classList.add(\"show\");\n this.#editor._reportTelemetry({\n action: \"alt_text_tooltip\",\n });\n }, DELAY_TO_SHOW_TOOLTIP);\n },\n { signal }\n );\n button.addEventListener(\n \"mouseleave\",\n () => {\n if (this.#altTextTooltipTimeout) {\n clearTimeout(this.#altTextTooltipTimeout);\n this.#altTextTooltipTimeout = null;\n }\n this.#altTextTooltip?.classList.remove(\"show\");\n },\n { signal }\n );\n }\n tooltip.innerText = this.#altTextDecorative\n ? await AltText._l10nPromise.get(\n \"pdfjs-editor-alt-text-decorative-tooltip\"\n )\n : this.#altText;\n\n if (!tooltip.parentNode) {\n button.append(tooltip);\n }\n\n const element = this.#editor.getImageForAltText();\n element?.setAttribute(\"aria-describedby\", tooltip.id);\n }\n}\n\nexport { AltText };\n","/* Copyright 2022 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// eslint-disable-next-line max-len\n/** @typedef {import(\"./annotation_editor_layer.js\").AnnotationEditorLayer} AnnotationEditorLayer */\n\nimport {\n AnnotationEditorUIManager,\n bindEvents,\n ColorManager,\n KeyboardManager,\n} from \"./tools.js\";\nimport { FeatureTest, shadow, unreachable } from \"../../shared/util.js\";\nimport { AltText } from \"./alt_text.js\";\nimport { EditorToolbar } from \"./toolbar.js\";\nimport { noContextMenu } from \"../display_utils.js\";\n\n/**\n * @typedef {Object} AnnotationEditorParameters\n * @property {AnnotationEditorUIManager} uiManager - the global manager\n * @property {AnnotationEditorLayer} parent - the layer containing this editor\n * @property {string} id - editor id\n * @property {number} x - x-coordinate\n * @property {number} y - y-coordinate\n */\n\n/**\n * Base class for editors.\n */\nclass AnnotationEditor {\n #accessibilityData = null;\n\n #allResizerDivs = null;\n\n #altText = null;\n\n #disabled = false;\n\n #keepAspectRatio = false;\n\n #resizersDiv = null;\n\n #savedDimensions = null;\n\n #boundFocusin = this.focusin.bind(this);\n\n #boundFocusout = this.focusout.bind(this);\n\n #editToolbar = null;\n\n #focusedResizerName = \"\";\n\n #hasBeenClicked = false;\n\n #initialPosition = null;\n\n #isEditing = false;\n\n #isInEditMode = false;\n\n #isResizerEnabledForKeyboard = false;\n\n #moveInDOMTimeout = null;\n\n #prevDragX = 0;\n\n #prevDragY = 0;\n\n #telemetryTimeouts = null;\n\n _initialOptions = Object.create(null);\n\n _isVisible = true;\n\n _uiManager = null;\n\n _focusEventsAllowed = true;\n\n _l10nPromise = null;\n\n #isDraggable = false;\n\n #zIndex = AnnotationEditor._zIndex++;\n\n static _borderLineWidth = -1;\n\n static _colorManager = new ColorManager();\n\n static _zIndex = 1;\n\n // Time to wait (in ms) before sending the telemetry data.\n // We wait a bit to avoid sending too many requests when changing something\n // like the thickness of a line.\n static _telemetryTimeout = 1000;\n\n static get _resizerKeyboardManager() {\n const resize = AnnotationEditor.prototype._resizeWithKeyboard;\n const small = AnnotationEditorUIManager.TRANSLATE_SMALL;\n const big = AnnotationEditorUIManager.TRANSLATE_BIG;\n\n return shadow(\n this,\n \"_resizerKeyboardManager\",\n new KeyboardManager([\n [[\"ArrowLeft\", \"mac+ArrowLeft\"], resize, { args: [-small, 0] }],\n [\n [\"ctrl+ArrowLeft\", \"mac+shift+ArrowLeft\"],\n resize,\n { args: [-big, 0] },\n ],\n [[\"ArrowRight\", \"mac+ArrowRight\"], resize, { args: [small, 0] }],\n [\n [\"ctrl+ArrowRight\", \"mac+shift+ArrowRight\"],\n resize,\n { args: [big, 0] },\n ],\n [[\"ArrowUp\", \"mac+ArrowUp\"], resize, { args: [0, -small] }],\n [[\"ctrl+ArrowUp\", \"mac+shift+ArrowUp\"], resize, { args: [0, -big] }],\n [[\"ArrowDown\", \"mac+ArrowDown\"], resize, { args: [0, small] }],\n [[\"ctrl+ArrowDown\", \"mac+shift+ArrowDown\"], resize, { args: [0, big] }],\n [\n [\"Escape\", \"mac+Escape\"],\n AnnotationEditor.prototype._stopResizingWithKeyboard,\n ],\n ])\n );\n }\n\n /**\n * @param {AnnotationEditorParameters} parameters\n */\n constructor(parameters) {\n if (this.constructor === AnnotationEditor) {\n unreachable(\"Cannot initialize AnnotationEditor.\");\n }\n\n this.parent = parameters.parent;\n this.id = parameters.id;\n this.width = this.height = null;\n this.pageIndex = parameters.parent.pageIndex;\n this.name = parameters.name;\n this.div = null;\n this._uiManager = parameters.uiManager;\n this.annotationElementId = null;\n this._willKeepAspectRatio = false;\n this._initialOptions.isCentered = parameters.isCentered;\n this._structTreeParentId = null;\n\n const {\n rotation,\n rawDims: { pageWidth, pageHeight, pageX, pageY },\n } = this.parent.viewport;\n\n this.rotation = rotation;\n this.pageRotation =\n (360 + rotation - this._uiManager.viewParameters.rotation) % 360;\n this.pageDimensions = [pageWidth, pageHeight];\n this.pageTranslation = [pageX, pageY];\n\n const [width, height] = this.parentDimensions;\n this.x = parameters.x / width;\n this.y = parameters.y / height;\n\n this.isAttachedToDOM = false;\n this.deleted = false;\n }\n\n get editorType() {\n return Object.getPrototypeOf(this).constructor._type;\n }\n\n static get _defaultLineColor() {\n return shadow(\n this,\n \"_defaultLineColor\",\n this._colorManager.getHexCode(\"CanvasText\")\n );\n }\n\n static deleteAnnotationElement(editor) {\n const fakeEditor = new FakeEditor({\n id: editor.parent.getNextId(),\n parent: editor.parent,\n uiManager: editor._uiManager,\n });\n fakeEditor.annotationElementId = editor.annotationElementId;\n fakeEditor.deleted = true;\n fakeEditor._uiManager.addToAnnotationStorage(fakeEditor);\n }\n\n /**\n * Initialize the l10n stuff for this type of editor.\n * @param {Object} l10n\n */\n static initialize(l10n, _uiManager, options) {\n AnnotationEditor._l10nPromise ||= new Map(\n [\n \"pdfjs-editor-alt-text-button-label\",\n \"pdfjs-editor-alt-text-edit-button-label\",\n \"pdfjs-editor-alt-text-decorative-tooltip\",\n \"pdfjs-editor-resizer-label-topLeft\",\n \"pdfjs-editor-resizer-label-topMiddle\",\n \"pdfjs-editor-resizer-label-topRight\",\n \"pdfjs-editor-resizer-label-middleRight\",\n \"pdfjs-editor-resizer-label-bottomRight\",\n \"pdfjs-editor-resizer-label-bottomMiddle\",\n \"pdfjs-editor-resizer-label-bottomLeft\",\n \"pdfjs-editor-resizer-label-middleLeft\",\n ].map(str => [\n str,\n l10n.get(str.replaceAll(/([A-Z])/g, c => `-${c.toLowerCase()}`)),\n ])\n );\n if (options?.strings) {\n for (const str of options.strings) {\n AnnotationEditor._l10nPromise.set(str, l10n.get(str));\n }\n }\n if (AnnotationEditor._borderLineWidth !== -1) {\n return;\n }\n const style = getComputedStyle(document.documentElement);\n AnnotationEditor._borderLineWidth =\n parseFloat(style.getPropertyValue(\"--outline-width\")) || 0;\n }\n\n /**\n * Update the default parameters for this type of editor.\n * @param {number} _type\n * @param {*} _value\n */\n static updateDefaultParams(_type, _value) {}\n\n /**\n * Get the default properties to set in the UI for this type of editor.\n * @returns {Array}\n */\n static get defaultPropertiesToUpdate() {\n return [];\n }\n\n /**\n * Check if this kind of editor is able to handle the given mime type for\n * pasting.\n * @param {string} mime\n * @returns {boolean}\n */\n static isHandlingMimeForPasting(mime) {\n return false;\n }\n\n /**\n * Extract the data from the clipboard item and delegate the creation of the\n * editor to the parent.\n * @param {DataTransferItem} item\n * @param {AnnotationEditorLayer} parent\n */\n static paste(item, parent) {\n unreachable(\"Not implemented\");\n }\n\n /**\n * Get the properties to update in the UI for this editor.\n * @returns {Array}\n */\n get propertiesToUpdate() {\n return [];\n }\n\n get _isDraggable() {\n return this.#isDraggable;\n }\n\n set _isDraggable(value) {\n this.#isDraggable = value;\n this.div?.classList.toggle(\"draggable\", value);\n }\n\n /**\n * @returns {boolean} true if the editor handles the Enter key itself.\n */\n get isEnterHandled() {\n return true;\n }\n\n center() {\n const [pageWidth, pageHeight] = this.pageDimensions;\n switch (this.parentRotation) {\n case 90:\n this.x -= (this.height * pageHeight) / (pageWidth * 2);\n this.y += (this.width * pageWidth) / (pageHeight * 2);\n break;\n case 180:\n this.x += this.width / 2;\n this.y += this.height / 2;\n break;\n case 270:\n this.x += (this.height * pageHeight) / (pageWidth * 2);\n this.y -= (this.width * pageWidth) / (pageHeight * 2);\n break;\n default:\n this.x -= this.width / 2;\n this.y -= this.height / 2;\n break;\n }\n this.fixAndSetPosition();\n }\n\n /**\n * Add some commands into the CommandManager (undo/redo stuff).\n * @param {Object} params\n */\n addCommands(params) {\n this._uiManager.addCommands(params);\n }\n\n get currentLayer() {\n return this._uiManager.currentLayer;\n }\n\n /**\n * This editor will be behind the others.\n */\n setInBackground() {\n this.div.style.zIndex = 0;\n }\n\n /**\n * This editor will be in the foreground.\n */\n setInForeground() {\n this.div.style.zIndex = this.#zIndex;\n }\n\n setParent(parent) {\n if (parent !== null) {\n this.pageIndex = parent.pageIndex;\n this.pageDimensions = parent.pageDimensions;\n } else {\n // The editor is being removed from the DOM, so we need to stop resizing.\n this.#stopResizing();\n }\n this.parent = parent;\n }\n\n /**\n * onfocus callback.\n */\n focusin(event) {\n if (!this._focusEventsAllowed) {\n return;\n }\n if (!this.#hasBeenClicked) {\n this.parent.setSelected(this);\n } else {\n this.#hasBeenClicked = false;\n }\n }\n\n /**\n * onblur callback.\n * @param {FocusEvent} event\n */\n focusout(event) {\n if (!this._focusEventsAllowed) {\n return;\n }\n\n if (!this.isAttachedToDOM) {\n return;\n }\n\n // In case of focusout, the relatedTarget is the element which\n // is grabbing the focus.\n // So if the related target is an element under the div for this\n // editor, then the editor isn't unactive.\n const target = event.relatedTarget;\n if (target?.closest(`#${this.id}`)) {\n return;\n }\n\n event.preventDefault();\n\n if (!this.parent?.isMultipleSelection) {\n this.commitOrRemove();\n }\n }\n\n commitOrRemove() {\n if (this.isEmpty()) {\n this.remove();\n } else {\n this.commit();\n }\n }\n\n /**\n * Commit the data contained in this editor.\n */\n commit() {\n this.addToAnnotationStorage();\n }\n\n addToAnnotationStorage() {\n this._uiManager.addToAnnotationStorage(this);\n }\n\n /**\n * Set the editor position within its parent.\n * @param {number} x\n * @param {number} y\n * @param {number} tx - x-translation in screen coordinates.\n * @param {number} ty - y-translation in screen coordinates.\n */\n setAt(x, y, tx, ty) {\n const [width, height] = this.parentDimensions;\n [tx, ty] = this.screenToPageTranslation(tx, ty);\n\n this.x = (x + tx) / width;\n this.y = (y + ty) / height;\n\n this.fixAndSetPosition();\n }\n\n #translate([width, height], x, y) {\n [x, y] = this.screenToPageTranslation(x, y);\n\n this.x += x / width;\n this.y += y / height;\n\n this.fixAndSetPosition();\n }\n\n /**\n * Translate the editor position within its parent.\n * @param {number} x - x-translation in screen coordinates.\n * @param {number} y - y-translation in screen coordinates.\n */\n translate(x, y) {\n // We don't change the initial position because the move here hasn't been\n // done by the user.\n this.#translate(this.parentDimensions, x, y);\n }\n\n /**\n * Translate the editor position within its page and adjust the scroll\n * in order to have the editor in the view.\n * @param {number} x - x-translation in page coordinates.\n * @param {number} y - y-translation in page coordinates.\n */\n translateInPage(x, y) {\n this.#initialPosition ||= [this.x, this.y];\n this.#translate(this.pageDimensions, x, y);\n this.div.scrollIntoView({ block: \"nearest\" });\n }\n\n drag(tx, ty) {\n this.#initialPosition ||= [this.x, this.y];\n const [parentWidth, parentHeight] = this.parentDimensions;\n this.x += tx / parentWidth;\n this.y += ty / parentHeight;\n if (this.parent && (this.x < 0 || this.x > 1 || this.y < 0 || this.y > 1)) {\n // It's possible to not have a parent: for example, when the user is\n // dragging all the selected editors but this one on a page which has been\n // destroyed.\n // It's why we need to check for it. In such a situation, it isn't really\n // a problem to not find a new parent: it's something which is related to\n // what the user is seeing, hence it depends on how pages are layed out.\n\n // The element will be outside of its parent so change the parent.\n const { x, y } = this.div.getBoundingClientRect();\n if (this.parent.findNewParent(this, x, y)) {\n this.x -= Math.floor(this.x);\n this.y -= Math.floor(this.y);\n }\n }\n\n // The editor can be moved wherever the user wants, so we don't need to fix\n // the position: it'll be done when the user will release the mouse button.\n\n let { x, y } = this;\n const [bx, by] = this.getBaseTranslation();\n x += bx;\n y += by;\n\n this.div.style.left = `${(100 * x).toFixed(2)}%`;\n this.div.style.top = `${(100 * y).toFixed(2)}%`;\n this.div.scrollIntoView({ block: \"nearest\" });\n }\n\n get _hasBeenMoved() {\n return (\n !!this.#initialPosition &&\n (this.#initialPosition[0] !== this.x ||\n this.#initialPosition[1] !== this.y)\n );\n }\n\n /**\n * Get the translation to take into account the editor border.\n * The CSS engine positions the element by taking the border into account so\n * we must apply the opposite translation to have the editor in the right\n * position.\n * @returns {Array}\n */\n getBaseTranslation() {\n const [parentWidth, parentHeight] = this.parentDimensions;\n const { _borderLineWidth } = AnnotationEditor;\n const x = _borderLineWidth / parentWidth;\n const y = _borderLineWidth / parentHeight;\n switch (this.rotation) {\n case 90:\n return [-x, y];\n case 180:\n return [x, y];\n case 270:\n return [x, -y];\n default:\n return [-x, -y];\n }\n }\n\n /**\n * @returns {boolean} true if position must be fixed (i.e. make the x and y\n * living in the page).\n */\n get _mustFixPosition() {\n return true;\n }\n\n /**\n * Fix the position of the editor in order to keep it inside its parent page.\n * @param {number} [rotation] - the rotation of the page.\n */\n fixAndSetPosition(rotation = this.rotation) {\n const [pageWidth, pageHeight] = this.pageDimensions;\n let { x, y, width, height } = this;\n width *= pageWidth;\n height *= pageHeight;\n x *= pageWidth;\n y *= pageHeight;\n\n if (this._mustFixPosition) {\n switch (rotation) {\n case 0:\n x = Math.max(0, Math.min(pageWidth - width, x));\n y = Math.max(0, Math.min(pageHeight - height, y));\n break;\n case 90:\n x = Math.max(0, Math.min(pageWidth - height, x));\n y = Math.min(pageHeight, Math.max(width, y));\n break;\n case 180:\n x = Math.min(pageWidth, Math.max(width, x));\n y = Math.min(pageHeight, Math.max(height, y));\n break;\n case 270:\n x = Math.min(pageWidth, Math.max(height, x));\n y = Math.max(0, Math.min(pageHeight - width, y));\n break;\n }\n }\n\n this.x = x /= pageWidth;\n this.y = y /= pageHeight;\n\n const [bx, by] = this.getBaseTranslation();\n x += bx;\n y += by;\n\n const { style } = this.div;\n style.left = `${(100 * x).toFixed(2)}%`;\n style.top = `${(100 * y).toFixed(2)}%`;\n\n this.moveInDOM();\n }\n\n static #rotatePoint(x, y, angle) {\n switch (angle) {\n case 90:\n return [y, -x];\n case 180:\n return [-x, -y];\n case 270:\n return [-y, x];\n default:\n return [x, y];\n }\n }\n\n /**\n * Convert a screen translation into a page one.\n * @param {number} x\n * @param {number} y\n */\n screenToPageTranslation(x, y) {\n return AnnotationEditor.#rotatePoint(x, y, this.parentRotation);\n }\n\n /**\n * Convert a page translation into a screen one.\n * @param {number} x\n * @param {number} y\n */\n pageTranslationToScreen(x, y) {\n return AnnotationEditor.#rotatePoint(x, y, 360 - this.parentRotation);\n }\n\n #getRotationMatrix(rotation) {\n switch (rotation) {\n case 90: {\n const [pageWidth, pageHeight] = this.pageDimensions;\n return [0, -pageWidth / pageHeight, pageHeight / pageWidth, 0];\n }\n case 180:\n return [-1, 0, 0, -1];\n case 270: {\n const [pageWidth, pageHeight] = this.pageDimensions;\n return [0, pageWidth / pageHeight, -pageHeight / pageWidth, 0];\n }\n default:\n return [1, 0, 0, 1];\n }\n }\n\n get parentScale() {\n return this._uiManager.viewParameters.realScale;\n }\n\n get parentRotation() {\n return (this._uiManager.viewParameters.rotation + this.pageRotation) % 360;\n }\n\n get parentDimensions() {\n const {\n parentScale,\n pageDimensions: [pageWidth, pageHeight],\n } = this;\n const scaledWidth = pageWidth * parentScale;\n const scaledHeight = pageHeight * parentScale;\n return FeatureTest.isCSSRoundSupported\n ? [Math.round(scaledWidth), Math.round(scaledHeight)]\n : [scaledWidth, scaledHeight];\n }\n\n /**\n * Set the dimensions of this editor.\n * @param {number} width\n * @param {number} height\n */\n setDims(width, height) {\n const [parentWidth, parentHeight] = this.parentDimensions;\n this.div.style.width = `${((100 * width) / parentWidth).toFixed(2)}%`;\n if (!this.#keepAspectRatio) {\n this.div.style.height = `${((100 * height) / parentHeight).toFixed(2)}%`;\n }\n }\n\n fixDims() {\n const { style } = this.div;\n const { height, width } = style;\n const widthPercent = width.endsWith(\"%\");\n const heightPercent = !this.#keepAspectRatio && height.endsWith(\"%\");\n if (widthPercent && heightPercent) {\n return;\n }\n\n const [parentWidth, parentHeight] = this.parentDimensions;\n if (!widthPercent) {\n style.width = `${((100 * parseFloat(width)) / parentWidth).toFixed(2)}%`;\n }\n if (!this.#keepAspectRatio && !heightPercent) {\n style.height = `${((100 * parseFloat(height)) / parentHeight).toFixed(\n 2\n )}%`;\n }\n }\n\n /**\n * Get the translation used to position this editor when it's created.\n * @returns {Array}\n */\n getInitialTranslation() {\n return [0, 0];\n }\n\n #createResizers() {\n if (this.#resizersDiv) {\n return;\n }\n this.#resizersDiv = document.createElement(\"div\");\n this.#resizersDiv.classList.add(\"resizers\");\n // When the resizers are used with the keyboard, they're focusable, hence\n // we want to have them in this order (top left, top middle, top right, ...)\n // in the DOM to have the focus order correct.\n const classes = this._willKeepAspectRatio\n ? [\"topLeft\", \"topRight\", \"bottomRight\", \"bottomLeft\"]\n : [\n \"topLeft\",\n \"topMiddle\",\n \"topRight\",\n \"middleRight\",\n \"bottomRight\",\n \"bottomMiddle\",\n \"bottomLeft\",\n \"middleLeft\",\n ];\n const signal = this._uiManager._signal;\n for (const name of classes) {\n const div = document.createElement(\"div\");\n this.#resizersDiv.append(div);\n div.classList.add(\"resizer\", name);\n div.setAttribute(\"data-resizer-name\", name);\n div.addEventListener(\n \"pointerdown\",\n this.#resizerPointerdown.bind(this, name),\n { signal }\n );\n div.addEventListener(\"contextmenu\", noContextMenu, { signal });\n div.tabIndex = -1;\n }\n this.div.prepend(this.#resizersDiv);\n }\n\n #resizerPointerdown(name, event) {\n event.preventDefault();\n const { isMac } = FeatureTest.platform;\n if (event.button !== 0 || (event.ctrlKey && isMac)) {\n return;\n }\n\n this.#altText?.toggle(false);\n\n const boundResizerPointermove = this.#resizerPointermove.bind(this, name);\n const savedDraggable = this._isDraggable;\n this._isDraggable = false;\n const signal = this._uiManager._signal;\n const pointerMoveOptions = { passive: true, capture: true, signal };\n this.parent.togglePointerEvents(false);\n window.addEventListener(\n \"pointermove\",\n boundResizerPointermove,\n pointerMoveOptions\n );\n window.addEventListener(\"contextmenu\", noContextMenu, { signal });\n const savedX = this.x;\n const savedY = this.y;\n const savedWidth = this.width;\n const savedHeight = this.height;\n const savedParentCursor = this.parent.div.style.cursor;\n const savedCursor = this.div.style.cursor;\n this.div.style.cursor = this.parent.div.style.cursor =\n window.getComputedStyle(event.target).cursor;\n\n const pointerUpCallback = () => {\n this.parent.togglePointerEvents(true);\n this.#altText?.toggle(true);\n this._isDraggable = savedDraggable;\n window.removeEventListener(\"pointerup\", pointerUpCallback);\n window.removeEventListener(\"blur\", pointerUpCallback);\n window.removeEventListener(\n \"pointermove\",\n boundResizerPointermove,\n pointerMoveOptions\n );\n window.removeEventListener(\"contextmenu\", noContextMenu);\n this.parent.div.style.cursor = savedParentCursor;\n this.div.style.cursor = savedCursor;\n\n this.#addResizeToUndoStack(savedX, savedY, savedWidth, savedHeight);\n };\n window.addEventListener(\"pointerup\", pointerUpCallback, { signal });\n // If the user switches to another window (with alt+tab), then we end the\n // resize session.\n window.addEventListener(\"blur\", pointerUpCallback, { signal });\n }\n\n #addResizeToUndoStack(savedX, savedY, savedWidth, savedHeight) {\n const newX = this.x;\n const newY = this.y;\n const newWidth = this.width;\n const newHeight = this.height;\n if (\n newX === savedX &&\n newY === savedY &&\n newWidth === savedWidth &&\n newHeight === savedHeight\n ) {\n return;\n }\n\n this.addCommands({\n cmd: () => {\n this.width = newWidth;\n this.height = newHeight;\n this.x = newX;\n this.y = newY;\n const [parentWidth, parentHeight] = this.parentDimensions;\n this.setDims(parentWidth * newWidth, parentHeight * newHeight);\n this.fixAndSetPosition();\n },\n undo: () => {\n this.width = savedWidth;\n this.height = savedHeight;\n this.x = savedX;\n this.y = savedY;\n const [parentWidth, parentHeight] = this.parentDimensions;\n this.setDims(parentWidth * savedWidth, parentHeight * savedHeight);\n this.fixAndSetPosition();\n },\n mustExec: true,\n });\n }\n\n #resizerPointermove(name, event) {\n const [parentWidth, parentHeight] = this.parentDimensions;\n const savedX = this.x;\n const savedY = this.y;\n const savedWidth = this.width;\n const savedHeight = this.height;\n const minWidth = AnnotationEditor.MIN_SIZE / parentWidth;\n const minHeight = AnnotationEditor.MIN_SIZE / parentHeight;\n\n // 10000 because we multiply by 100 and use toFixed(2) in fixAndSetPosition.\n // Without rounding, the positions of the corners other than the top left\n // one can be slightly wrong.\n const round = x => Math.round(x * 10000) / 10000;\n const rotationMatrix = this.#getRotationMatrix(this.rotation);\n const transf = (x, y) => [\n rotationMatrix[0] * x + rotationMatrix[2] * y,\n rotationMatrix[1] * x + rotationMatrix[3] * y,\n ];\n const invRotationMatrix = this.#getRotationMatrix(360 - this.rotation);\n const invTransf = (x, y) => [\n invRotationMatrix[0] * x + invRotationMatrix[2] * y,\n invRotationMatrix[1] * x + invRotationMatrix[3] * y,\n ];\n let getPoint;\n let getOpposite;\n let isDiagonal = false;\n let isHorizontal = false;\n\n switch (name) {\n case \"topLeft\":\n isDiagonal = true;\n getPoint = (w, h) => [0, 0];\n getOpposite = (w, h) => [w, h];\n break;\n case \"topMiddle\":\n getPoint = (w, h) => [w / 2, 0];\n getOpposite = (w, h) => [w / 2, h];\n break;\n case \"topRight\":\n isDiagonal = true;\n getPoint = (w, h) => [w, 0];\n getOpposite = (w, h) => [0, h];\n break;\n case \"middleRight\":\n isHorizontal = true;\n getPoint = (w, h) => [w, h / 2];\n getOpposite = (w, h) => [0, h / 2];\n break;\n case \"bottomRight\":\n isDiagonal = true;\n getPoint = (w, h) => [w, h];\n getOpposite = (w, h) => [0, 0];\n break;\n case \"bottomMiddle\":\n getPoint = (w, h) => [w / 2, h];\n getOpposite = (w, h) => [w / 2, 0];\n break;\n case \"bottomLeft\":\n isDiagonal = true;\n getPoint = (w, h) => [0, h];\n getOpposite = (w, h) => [w, 0];\n break;\n case \"middleLeft\":\n isHorizontal = true;\n getPoint = (w, h) => [0, h / 2];\n getOpposite = (w, h) => [w, h / 2];\n break;\n }\n\n const point = getPoint(savedWidth, savedHeight);\n const oppositePoint = getOpposite(savedWidth, savedHeight);\n let transfOppositePoint = transf(...oppositePoint);\n const oppositeX = round(savedX + transfOppositePoint[0]);\n const oppositeY = round(savedY + transfOppositePoint[1]);\n let ratioX = 1;\n let ratioY = 1;\n\n let [deltaX, deltaY] = this.screenToPageTranslation(\n event.movementX,\n event.movementY\n );\n [deltaX, deltaY] = invTransf(deltaX / parentWidth, deltaY / parentHeight);\n\n if (isDiagonal) {\n const oldDiag = Math.hypot(savedWidth, savedHeight);\n ratioX = ratioY = Math.max(\n Math.min(\n Math.hypot(\n oppositePoint[0] - point[0] - deltaX,\n oppositePoint[1] - point[1] - deltaY\n ) / oldDiag,\n // Avoid the editor to be larger than the page.\n 1 / savedWidth,\n 1 / savedHeight\n ),\n // Avoid the editor to be smaller than the minimum size.\n minWidth / savedWidth,\n minHeight / savedHeight\n );\n } else if (isHorizontal) {\n ratioX =\n Math.max(\n minWidth,\n Math.min(1, Math.abs(oppositePoint[0] - point[0] - deltaX))\n ) / savedWidth;\n } else {\n ratioY =\n Math.max(\n minHeight,\n Math.min(1, Math.abs(oppositePoint[1] - point[1] - deltaY))\n ) / savedHeight;\n }\n\n const newWidth = round(savedWidth * ratioX);\n const newHeight = round(savedHeight * ratioY);\n transfOppositePoint = transf(...getOpposite(newWidth, newHeight));\n const newX = oppositeX - transfOppositePoint[0];\n const newY = oppositeY - transfOppositePoint[1];\n\n this.width = newWidth;\n this.height = newHeight;\n this.x = newX;\n this.y = newY;\n\n this.setDims(parentWidth * newWidth, parentHeight * newHeight);\n this.fixAndSetPosition();\n }\n\n altTextFinish() {\n this.#altText?.finish();\n }\n\n /**\n * Add a toolbar for this editor.\n * @returns {Promise}\n */\n async addEditToolbar() {\n if (this.#editToolbar || this.#isInEditMode) {\n return this.#editToolbar;\n }\n this.#editToolbar = new EditorToolbar(this);\n this.div.append(this.#editToolbar.render());\n if (this.#altText) {\n this.#editToolbar.addAltTextButton(await this.#altText.render());\n }\n\n return this.#editToolbar;\n }\n\n removeEditToolbar() {\n if (!this.#editToolbar) {\n return;\n }\n this.#editToolbar.remove();\n this.#editToolbar = null;\n\n // We destroy the alt text but we don't null it because we want to be able\n // to restore it in case the user undoes the deletion.\n this.#altText?.destroy();\n }\n\n getClientDimensions() {\n return this.div.getBoundingClientRect();\n }\n\n async addAltTextButton() {\n if (this.#altText) {\n return;\n }\n AltText.initialize(AnnotationEditor._l10nPromise);\n this.#altText = new AltText(this);\n if (this.#accessibilityData) {\n this.#altText.data = this.#accessibilityData;\n this.#accessibilityData = null;\n }\n await this.addEditToolbar();\n }\n\n get altTextData() {\n return this.#altText?.data;\n }\n\n /**\n * Set the alt text data.\n */\n set altTextData(data) {\n if (!this.#altText) {\n return;\n }\n this.#altText.data = data;\n }\n\n hasAltText() {\n return !this.#altText?.isEmpty();\n }\n\n /**\n * Render this editor in a div.\n * @returns {HTMLDivElement | null}\n */\n render() {\n this.div = document.createElement(\"div\");\n this.div.setAttribute(\"data-editor-rotation\", (360 - this.rotation) % 360);\n this.div.className = this.name;\n this.div.setAttribute(\"id\", this.id);\n this.div.tabIndex = this.#disabled ? -1 : 0;\n if (!this._isVisible) {\n this.div.classList.add(\"hidden\");\n }\n\n this.setInForeground();\n\n const signal = this._uiManager._signal;\n this.div.addEventListener(\"focusin\", this.#boundFocusin, { signal });\n this.div.addEventListener(\"focusout\", this.#boundFocusout, { signal });\n\n const [parentWidth, parentHeight] = this.parentDimensions;\n if (this.parentRotation % 180 !== 0) {\n this.div.style.maxWidth = `${((100 * parentHeight) / parentWidth).toFixed(\n 2\n )}%`;\n this.div.style.maxHeight = `${(\n (100 * parentWidth) /\n parentHeight\n ).toFixed(2)}%`;\n }\n\n const [tx, ty] = this.getInitialTranslation();\n this.translate(tx, ty);\n\n bindEvents(this, this.div, [\"pointerdown\"]);\n\n return this.div;\n }\n\n /**\n * Onpointerdown callback.\n * @param {PointerEvent} event\n */\n pointerdown(event) {\n const { isMac } = FeatureTest.platform;\n if (event.button !== 0 || (event.ctrlKey && isMac)) {\n // Avoid to focus this editor because of a non-left click.\n event.preventDefault();\n return;\n }\n\n this.#hasBeenClicked = true;\n\n if (this._isDraggable) {\n this.#setUpDragSession(event);\n return;\n }\n\n this.#selectOnPointerEvent(event);\n }\n\n #selectOnPointerEvent(event) {\n const { isMac } = FeatureTest.platform;\n if (\n (event.ctrlKey && !isMac) ||\n event.shiftKey ||\n (event.metaKey && isMac)\n ) {\n this.parent.toggleSelected(this);\n } else {\n this.parent.setSelected(this);\n }\n }\n\n #setUpDragSession(event) {\n const isSelected = this._uiManager.isSelected(this);\n this._uiManager.setUpDragSession();\n\n let pointerMoveOptions, pointerMoveCallback;\n const signal = this._uiManager._signal;\n if (isSelected) {\n this.div.classList.add(\"moving\");\n pointerMoveOptions = { passive: true, capture: true, signal };\n this.#prevDragX = event.clientX;\n this.#prevDragY = event.clientY;\n pointerMoveCallback = e => {\n const { clientX: x, clientY: y } = e;\n const [tx, ty] = this.screenToPageTranslation(\n x - this.#prevDragX,\n y - this.#prevDragY\n );\n this.#prevDragX = x;\n this.#prevDragY = y;\n this._uiManager.dragSelectedEditors(tx, ty);\n };\n window.addEventListener(\n \"pointermove\",\n pointerMoveCallback,\n pointerMoveOptions\n );\n }\n\n const pointerUpCallback = () => {\n window.removeEventListener(\"pointerup\", pointerUpCallback);\n window.removeEventListener(\"blur\", pointerUpCallback);\n if (isSelected) {\n this.div.classList.remove(\"moving\");\n window.removeEventListener(\n \"pointermove\",\n pointerMoveCallback,\n pointerMoveOptions\n );\n }\n\n this.#hasBeenClicked = false;\n if (!this._uiManager.endDragSession()) {\n this.#selectOnPointerEvent(event);\n }\n };\n window.addEventListener(\"pointerup\", pointerUpCallback, { signal });\n // If the user is using alt+tab during the dragging session, the pointerup\n // event could be not fired, but a blur event is fired so we can use it in\n // order to interrupt the dragging session.\n window.addEventListener(\"blur\", pointerUpCallback, { signal });\n }\n\n moveInDOM() {\n // Moving the editor in the DOM can be expensive, so we wait a bit before.\n // It's important to not block the UI (for example when changing the font\n // size in a FreeText).\n if (this.#moveInDOMTimeout) {\n clearTimeout(this.#moveInDOMTimeout);\n }\n this.#moveInDOMTimeout = setTimeout(() => {\n this.#moveInDOMTimeout = null;\n this.parent?.moveEditorInDOM(this);\n }, 0);\n }\n\n _setParentAndPosition(parent, x, y) {\n parent.changeParent(this);\n this.x = x;\n this.y = y;\n this.fixAndSetPosition();\n }\n\n /**\n * Convert the current rect into a page one.\n * @param {number} tx - x-translation in screen coordinates.\n * @param {number} ty - y-translation in screen coordinates.\n * @param {number} [rotation] - the rotation of the page.\n */\n getRect(tx, ty, rotation = this.rotation) {\n const scale = this.parentScale;\n const [pageWidth, pageHeight] = this.pageDimensions;\n const [pageX, pageY] = this.pageTranslation;\n const shiftX = tx / scale;\n const shiftY = ty / scale;\n const x = this.x * pageWidth;\n const y = this.y * pageHeight;\n const width = this.width * pageWidth;\n const height = this.height * pageHeight;\n\n switch (rotation) {\n case 0:\n return [\n x + shiftX + pageX,\n pageHeight - y - shiftY - height + pageY,\n x + shiftX + width + pageX,\n pageHeight - y - shiftY + pageY,\n ];\n case 90:\n return [\n x + shiftY + pageX,\n pageHeight - y + shiftX + pageY,\n x + shiftY + height + pageX,\n pageHeight - y + shiftX + width + pageY,\n ];\n case 180:\n return [\n x - shiftX - width + pageX,\n pageHeight - y + shiftY + pageY,\n x - shiftX + pageX,\n pageHeight - y + shiftY + height + pageY,\n ];\n case 270:\n return [\n x - shiftY - height + pageX,\n pageHeight - y - shiftX - width + pageY,\n x - shiftY + pageX,\n pageHeight - y - shiftX + pageY,\n ];\n default:\n throw new Error(\"Invalid rotation\");\n }\n }\n\n getRectInCurrentCoords(rect, pageHeight) {\n const [x1, y1, x2, y2] = rect;\n\n const width = x2 - x1;\n const height = y2 - y1;\n\n switch (this.rotation) {\n case 0:\n return [x1, pageHeight - y2, width, height];\n case 90:\n return [x1, pageHeight - y1, height, width];\n case 180:\n return [x2, pageHeight - y1, width, height];\n case 270:\n return [x2, pageHeight - y2, height, width];\n default:\n throw new Error(\"Invalid rotation\");\n }\n }\n\n /**\n * Executed once this editor has been rendered.\n */\n onceAdded() {}\n\n /**\n * Check if the editor contains something.\n * @returns {boolean}\n */\n isEmpty() {\n return false;\n }\n\n /**\n * Enable edit mode.\n */\n enableEditMode() {\n this.#isInEditMode = true;\n }\n\n /**\n * Disable edit mode.\n */\n disableEditMode() {\n this.#isInEditMode = false;\n }\n\n /**\n * Check if the editor is edited.\n * @returns {boolean}\n */\n isInEditMode() {\n return this.#isInEditMode;\n }\n\n /**\n * If it returns true, then this editor handles the keyboard\n * events itself.\n * @returns {boolean}\n */\n shouldGetKeyboardEvents() {\n return this.#isResizerEnabledForKeyboard;\n }\n\n /**\n * Check if this editor needs to be rebuilt or not.\n * @returns {boolean}\n */\n needsToBeRebuilt() {\n return this.div && !this.isAttachedToDOM;\n }\n\n /**\n * Rebuild the editor in case it has been removed on undo.\n *\n * To implement in subclasses.\n */\n rebuild() {\n const signal = this._uiManager._signal;\n this.div?.addEventListener(\"focusin\", this.#boundFocusin, { signal });\n this.div?.addEventListener(\"focusout\", this.#boundFocusout, { signal });\n }\n\n /**\n * Rotate the editor.\n * @param {number} angle\n */\n rotate(_angle) {}\n\n /**\n * Serialize the editor.\n * The result of the serialization will be used to construct a\n * new annotation to add to the pdf document.\n *\n * To implement in subclasses.\n * @param {boolean} [isForCopying]\n * @param {Object | null} [context]\n * @returns {Object | null}\n */\n serialize(isForCopying = false, context = null) {\n unreachable(\"An editor must be serializable\");\n }\n\n /**\n * Deserialize the editor.\n * The result of the deserialization is a new editor.\n *\n * @param {Object} data\n * @param {AnnotationEditorLayer} parent\n * @param {AnnotationEditorUIManager} uiManager\n * @returns {AnnotationEditor | null}\n */\n static deserialize(data, parent, uiManager) {\n const editor = new this.prototype.constructor({\n parent,\n id: parent.getNextId(),\n uiManager,\n });\n editor.rotation = data.rotation;\n editor.#accessibilityData = data.accessibilityData;\n\n const [pageWidth, pageHeight] = editor.pageDimensions;\n const [x, y, width, height] = editor.getRectInCurrentCoords(\n data.rect,\n pageHeight\n );\n editor.x = x / pageWidth;\n editor.y = y / pageHeight;\n editor.width = width / pageWidth;\n editor.height = height / pageHeight;\n\n return editor;\n }\n\n /**\n * Check if an existing annotation associated with this editor has been\n * modified.\n * @returns {boolean}\n */\n get hasBeenModified() {\n return (\n !!this.annotationElementId && (this.deleted || this.serialize() !== null)\n );\n }\n\n /**\n * Remove this editor.\n * It's used on ctrl+backspace action.\n */\n remove() {\n this.div.removeEventListener(\"focusin\", this.#boundFocusin);\n this.div.removeEventListener(\"focusout\", this.#boundFocusout);\n\n if (!this.isEmpty()) {\n // The editor is removed but it can be back at some point thanks to\n // undo/redo so we must commit it before.\n this.commit();\n }\n if (this.parent) {\n this.parent.remove(this);\n } else {\n this._uiManager.removeEditor(this);\n }\n\n if (this.#moveInDOMTimeout) {\n clearTimeout(this.#moveInDOMTimeout);\n this.#moveInDOMTimeout = null;\n }\n this.#stopResizing();\n this.removeEditToolbar();\n if (this.#telemetryTimeouts) {\n for (const timeout of this.#telemetryTimeouts.values()) {\n clearTimeout(timeout);\n }\n this.#telemetryTimeouts = null;\n }\n this.parent = null;\n }\n\n /**\n * @returns {boolean} true if this editor can be resized.\n */\n get isResizable() {\n return false;\n }\n\n /**\n * Add the resizers to this editor.\n */\n makeResizable() {\n if (this.isResizable) {\n this.#createResizers();\n this.#resizersDiv.classList.remove(\"hidden\");\n bindEvents(this, this.div, [\"keydown\"]);\n }\n }\n\n get toolbarPosition() {\n return null;\n }\n\n /**\n * onkeydown callback.\n * @param {KeyboardEvent} event\n */\n keydown(event) {\n if (\n !this.isResizable ||\n event.target !== this.div ||\n event.key !== \"Enter\"\n ) {\n return;\n }\n this._uiManager.setSelected(this);\n this.#savedDimensions = {\n savedX: this.x,\n savedY: this.y,\n savedWidth: this.width,\n savedHeight: this.height,\n };\n const children = this.#resizersDiv.children;\n if (!this.#allResizerDivs) {\n this.#allResizerDivs = Array.from(children);\n const boundResizerKeydown = this.#resizerKeydown.bind(this);\n const boundResizerBlur = this.#resizerBlur.bind(this);\n const signal = this._uiManager._signal;\n for (const div of this.#allResizerDivs) {\n const name = div.getAttribute(\"data-resizer-name\");\n div.setAttribute(\"role\", \"spinbutton\");\n div.addEventListener(\"keydown\", boundResizerKeydown, { signal });\n div.addEventListener(\"blur\", boundResizerBlur, { signal });\n div.addEventListener(\"focus\", this.#resizerFocus.bind(this, name), {\n signal,\n });\n AnnotationEditor._l10nPromise\n .get(`pdfjs-editor-resizer-label-${name}`)\n .then(msg => div.setAttribute(\"aria-label\", msg));\n }\n }\n\n // We want to have the resizers in the visual order, so we move the first\n // (top-left) to the right place.\n const first = this.#allResizerDivs[0];\n let firstPosition = 0;\n for (const div of children) {\n if (div === first) {\n break;\n }\n firstPosition++;\n }\n const nextFirstPosition =\n (((360 - this.rotation + this.parentRotation) % 360) / 90) *\n (this.#allResizerDivs.length / 4);\n\n if (nextFirstPosition !== firstPosition) {\n // We need to reorder the resizers in the DOM in order to have the focus\n // on the top-left one.\n if (nextFirstPosition < firstPosition) {\n for (let i = 0; i < firstPosition - nextFirstPosition; i++) {\n this.#resizersDiv.append(this.#resizersDiv.firstChild);\n }\n } else if (nextFirstPosition > firstPosition) {\n for (let i = 0; i < nextFirstPosition - firstPosition; i++) {\n this.#resizersDiv.firstChild.before(this.#resizersDiv.lastChild);\n }\n }\n\n let i = 0;\n for (const child of children) {\n const div = this.#allResizerDivs[i++];\n const name = div.getAttribute(\"data-resizer-name\");\n AnnotationEditor._l10nPromise\n .get(`pdfjs-editor-resizer-label-${name}`)\n .then(msg => child.setAttribute(\"aria-label\", msg));\n }\n }\n\n this.#setResizerTabIndex(0);\n this.#isResizerEnabledForKeyboard = true;\n this.#resizersDiv.firstChild.focus({ focusVisible: true });\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n\n #resizerKeydown(event) {\n AnnotationEditor._resizerKeyboardManager.exec(this, event);\n }\n\n #resizerBlur(event) {\n if (\n this.#isResizerEnabledForKeyboard &&\n event.relatedTarget?.parentNode !== this.#resizersDiv\n ) {\n this.#stopResizing();\n }\n }\n\n #resizerFocus(name) {\n this.#focusedResizerName = this.#isResizerEnabledForKeyboard ? name : \"\";\n }\n\n #setResizerTabIndex(value) {\n if (!this.#allResizerDivs) {\n return;\n }\n for (const div of this.#allResizerDivs) {\n div.tabIndex = value;\n }\n }\n\n _resizeWithKeyboard(x, y) {\n if (!this.#isResizerEnabledForKeyboard) {\n return;\n }\n this.#resizerPointermove(this.#focusedResizerName, {\n movementX: x,\n movementY: y,\n });\n }\n\n #stopResizing() {\n this.#isResizerEnabledForKeyboard = false;\n this.#setResizerTabIndex(-1);\n if (this.#savedDimensions) {\n const { savedX, savedY, savedWidth, savedHeight } = this.#savedDimensions;\n this.#addResizeToUndoStack(savedX, savedY, savedWidth, savedHeight);\n this.#savedDimensions = null;\n }\n }\n\n _stopResizingWithKeyboard() {\n this.#stopResizing();\n this.div.focus();\n }\n\n /**\n * Select this editor.\n */\n select() {\n this.makeResizable();\n this.div?.classList.add(\"selectedEditor\");\n if (!this.#editToolbar) {\n this.addEditToolbar().then(() => {\n if (this.div?.classList.contains(\"selectedEditor\")) {\n // The editor can have been unselected while we were waiting for the\n // edit toolbar to be created, hence we want to be sure that this\n // editor is still selected.\n this.#editToolbar?.show();\n }\n });\n return;\n }\n this.#editToolbar?.show();\n }\n\n /**\n * Unselect this editor.\n */\n unselect() {\n this.#resizersDiv?.classList.add(\"hidden\");\n this.div?.classList.remove(\"selectedEditor\");\n if (this.div?.contains(document.activeElement)) {\n // Don't use this.div.blur() because we don't know where the focus will\n // go.\n this._uiManager.currentLayer.div.focus({\n preventScroll: true,\n });\n }\n this.#editToolbar?.hide();\n }\n\n /**\n * Update some parameters which have been changed through the UI.\n * @param {number} type\n * @param {*} value\n */\n updateParams(type, value) {}\n\n /**\n * When the user disables the editing mode some editors can change some of\n * their properties.\n */\n disableEditing() {}\n\n /**\n * When the user enables the editing mode some editors can change some of\n * their properties.\n */\n enableEditing() {}\n\n /**\n * The editor is about to be edited.\n */\n enterInEditMode() {}\n\n /**\n * @returns {HTMLElement | null} the element requiring an alt text.\n */\n getImageForAltText() {\n return null;\n }\n\n /**\n * Get the div which really contains the displayed content.\n * @returns {HTMLDivElement | undefined}\n */\n get contentDiv() {\n return this.div;\n }\n\n /**\n * If true then the editor is currently edited.\n * @type {boolean}\n */\n get isEditing() {\n return this.#isEditing;\n }\n\n /**\n * When set to true, it means that this editor is currently edited.\n * @param {boolean} value\n */\n set isEditing(value) {\n this.#isEditing = value;\n if (!this.parent) {\n return;\n }\n if (value) {\n this.parent.setSelected(this);\n this.parent.setActiveEditor(this);\n } else {\n this.parent.setActiveEditor(null);\n }\n }\n\n /**\n * Set the aspect ratio to use when resizing.\n * @param {number} width\n * @param {number} height\n */\n setAspectRatio(width, height) {\n this.#keepAspectRatio = true;\n const aspectRatio = width / height;\n const { style } = this.div;\n style.aspectRatio = aspectRatio;\n style.height = \"auto\";\n }\n\n static get MIN_SIZE() {\n return 16;\n }\n\n static canCreateNewEmptyEditor() {\n return true;\n }\n\n /**\n * Get the data to report to the telemetry when the editor is added.\n * @returns {Object}\n */\n get telemetryInitialData() {\n return { action: \"added\" };\n }\n\n /**\n * The telemetry data to use when saving/printing.\n * @returns {Object|null}\n */\n get telemetryFinalData() {\n return null;\n }\n\n _reportTelemetry(data, mustWait = false) {\n if (mustWait) {\n this.#telemetryTimeouts ||= new Map();\n const { action } = data;\n let timeout = this.#telemetryTimeouts.get(action);\n if (timeout) {\n clearTimeout(timeout);\n }\n timeout = setTimeout(() => {\n this._reportTelemetry(data);\n this.#telemetryTimeouts.delete(action);\n if (this.#telemetryTimeouts.size === 0) {\n this.#telemetryTimeouts = null;\n }\n }, AnnotationEditor._telemetryTimeout);\n this.#telemetryTimeouts.set(action, timeout);\n return;\n }\n data.type ||= this.editorType;\n this._uiManager._eventBus.dispatch(\"reporttelemetry\", {\n source: this,\n details: {\n type: \"editing\",\n data,\n },\n });\n }\n\n /**\n * Show or hide this editor.\n * @param {boolean|undefined} visible\n */\n show(visible = this._isVisible) {\n this.div.classList.toggle(\"hidden\", !visible);\n this._isVisible = visible;\n }\n\n enable() {\n if (this.div) {\n this.div.tabIndex = 0;\n }\n this.#disabled = false;\n }\n\n disable() {\n if (this.div) {\n this.div.tabIndex = -1;\n }\n this.#disabled = true;\n }\n\n /**\n * Render an annotation in the annotation layer.\n * @param {Object} annotation\n * @returns {HTMLElement}\n */\n renderAnnotationElement(annotation) {\n let content = annotation.container.querySelector(\".annotationContent\");\n if (!content) {\n content = document.createElement(\"div\");\n content.classList.add(\"annotationContent\", this.editorType);\n annotation.container.prepend(content);\n } else if (content.nodeName === \"CANVAS\") {\n const canvas = content;\n content = document.createElement(\"div\");\n content.classList.add(\"annotationContent\", this.editorType);\n canvas.before(content);\n }\n\n return content;\n }\n\n resetAnnotationElement(annotation) {\n const { firstChild } = annotation.container;\n if (\n firstChild.nodeName === \"DIV\" &&\n firstChild.classList.contains(\"annotationContent\")\n ) {\n firstChild.remove();\n }\n }\n}\n\n// This class is used to fake an editor which has been deleted.\nclass FakeEditor extends AnnotationEditor {\n constructor(params) {\n super(params);\n this.annotationElementId = params.annotationElementId;\n this.deleted = true;\n }\n\n serialize() {\n return {\n id: this.annotationElementId,\n deleted: true,\n pageIndex: this.pageIndex,\n };\n }\n}\n\nexport { AnnotationEditor };\n","/* Copyright 2014 Opera Software ASA\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n *\n * Based on https://code.google.com/p/smhasher/wiki/MurmurHash3.\n * Hashes roughly 100 KB per millisecond on i7 3.4 GHz.\n */\n\nconst SEED = 0xc3d2e1f0;\n// Workaround for missing math precision in JS.\nconst MASK_HIGH = 0xffff0000;\nconst MASK_LOW = 0xffff;\n\nclass MurmurHash3_64 {\n constructor(seed) {\n this.h1 = seed ? seed & 0xffffffff : SEED;\n this.h2 = seed ? seed & 0xffffffff : SEED;\n }\n\n update(input) {\n let data, length;\n if (typeof input === \"string\") {\n data = new Uint8Array(input.length * 2);\n length = 0;\n for (let i = 0, ii = input.length; i < ii; i++) {\n const code = input.charCodeAt(i);\n if (code <= 0xff) {\n data[length++] = code;\n } else {\n data[length++] = code >>> 8;\n data[length++] = code & 0xff;\n }\n }\n } else if (ArrayBuffer.isView(input)) {\n data = input.slice();\n length = data.byteLength;\n } else {\n throw new Error(\"Invalid data format, must be a string or TypedArray.\");\n }\n\n const blockCounts = length >> 2;\n const tailLength = length - blockCounts * 4;\n // We don't care about endianness here.\n const dataUint32 = new Uint32Array(data.buffer, 0, blockCounts);\n let k1 = 0,\n k2 = 0;\n let h1 = this.h1,\n h2 = this.h2;\n const C1 = 0xcc9e2d51,\n C2 = 0x1b873593;\n const C1_LOW = C1 & MASK_LOW,\n C2_LOW = C2 & MASK_LOW;\n\n for (let i = 0; i < blockCounts; i++) {\n if (i & 1) {\n k1 = dataUint32[i];\n k1 = ((k1 * C1) & MASK_HIGH) | ((k1 * C1_LOW) & MASK_LOW);\n k1 = (k1 << 15) | (k1 >>> 17);\n k1 = ((k1 * C2) & MASK_HIGH) | ((k1 * C2_LOW) & MASK_LOW);\n h1 ^= k1;\n h1 = (h1 << 13) | (h1 >>> 19);\n h1 = h1 * 5 + 0xe6546b64;\n } else {\n k2 = dataUint32[i];\n k2 = ((k2 * C1) & MASK_HIGH) | ((k2 * C1_LOW) & MASK_LOW);\n k2 = (k2 << 15) | (k2 >>> 17);\n k2 = ((k2 * C2) & MASK_HIGH) | ((k2 * C2_LOW) & MASK_LOW);\n h2 ^= k2;\n h2 = (h2 << 13) | (h2 >>> 19);\n h2 = h2 * 5 + 0xe6546b64;\n }\n }\n\n k1 = 0;\n\n switch (tailLength) {\n case 3:\n k1 ^= data[blockCounts * 4 + 2] << 16;\n /* falls through */\n case 2:\n k1 ^= data[blockCounts * 4 + 1] << 8;\n /* falls through */\n case 1:\n k1 ^= data[blockCounts * 4];\n /* falls through */\n\n k1 = ((k1 * C1) & MASK_HIGH) | ((k1 * C1_LOW) & MASK_LOW);\n k1 = (k1 << 15) | (k1 >>> 17);\n k1 = ((k1 * C2) & MASK_HIGH) | ((k1 * C2_LOW) & MASK_LOW);\n if (blockCounts & 1) {\n h1 ^= k1;\n } else {\n h2 ^= k1;\n }\n }\n\n this.h1 = h1;\n this.h2 = h2;\n }\n\n hexdigest() {\n let h1 = this.h1,\n h2 = this.h2;\n\n h1 ^= h2 >>> 1;\n h1 = ((h1 * 0xed558ccd) & MASK_HIGH) | ((h1 * 0x8ccd) & MASK_LOW);\n h2 =\n ((h2 * 0xff51afd7) & MASK_HIGH) |\n (((((h2 << 16) | (h1 >>> 16)) * 0xafd7ed55) & MASK_HIGH) >>> 16);\n h1 ^= h2 >>> 1;\n h1 = ((h1 * 0x1a85ec53) & MASK_HIGH) | ((h1 * 0xec53) & MASK_LOW);\n h2 =\n ((h2 * 0xc4ceb9fe) & MASK_HIGH) |\n (((((h2 << 16) | (h1 >>> 16)) * 0xb9fe1a85) & MASK_HIGH) >>> 16);\n h1 ^= h2 >>> 1;\n\n return (\n (h1 >>> 0).toString(16).padStart(8, \"0\") +\n (h2 >>> 0).toString(16).padStart(8, \"0\")\n );\n }\n}\n\nexport { MurmurHash3_64 };\n","/* Copyright 2020 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { objectFromMap, unreachable } from \"../shared/util.js\";\nimport { AnnotationEditor } from \"./editor/editor.js\";\nimport { MurmurHash3_64 } from \"../shared/murmurhash3.js\";\n\nconst SerializableEmpty = Object.freeze({\n map: null,\n hash: \"\",\n transfer: undefined,\n});\n\n/**\n * Key/value storage for annotation data in forms.\n */\nclass AnnotationStorage {\n #modified = false;\n\n #storage = new Map();\n\n constructor() {\n // Callbacks to signal when the modification state is set or reset.\n // This is used by the viewer to only bind on `beforeunload` if forms\n // are actually edited to prevent doing so unconditionally since that\n // can have undesirable effects.\n this.onSetModified = null;\n this.onResetModified = null;\n this.onAnnotationEditor = null;\n }\n\n /**\n * Get the value for a given key if it exists, or return the default value.\n * @param {string} key\n * @param {Object} defaultValue\n * @returns {Object}\n */\n getValue(key, defaultValue) {\n const value = this.#storage.get(key);\n if (value === undefined) {\n return defaultValue;\n }\n\n return Object.assign(defaultValue, value);\n }\n\n /**\n * Get the value for a given key.\n * @param {string} key\n * @returns {Object}\n */\n getRawValue(key) {\n return this.#storage.get(key);\n }\n\n /**\n * Remove a value from the storage.\n * @param {string} key\n */\n remove(key) {\n this.#storage.delete(key);\n\n if (this.#storage.size === 0) {\n this.resetModified();\n }\n\n if (typeof this.onAnnotationEditor === \"function\") {\n for (const value of this.#storage.values()) {\n if (value instanceof AnnotationEditor) {\n return;\n }\n }\n this.onAnnotationEditor(null);\n }\n }\n\n /**\n * Set the value for a given key\n * @param {string} key\n * @param {Object} value\n */\n setValue(key, value) {\n const obj = this.#storage.get(key);\n let modified = false;\n if (obj !== undefined) {\n for (const [entry, val] of Object.entries(value)) {\n if (obj[entry] !== val) {\n modified = true;\n obj[entry] = val;\n }\n }\n } else {\n modified = true;\n this.#storage.set(key, value);\n }\n if (modified) {\n this.#setModified();\n }\n\n if (\n value instanceof AnnotationEditor &&\n typeof this.onAnnotationEditor === \"function\"\n ) {\n this.onAnnotationEditor(value.constructor._type);\n }\n }\n\n /**\n * Check if the storage contains the given key.\n * @param {string} key\n * @returns {boolean}\n */\n has(key) {\n return this.#storage.has(key);\n }\n\n /**\n * @returns {Object | null}\n */\n getAll() {\n return this.#storage.size > 0 ? objectFromMap(this.#storage) : null;\n }\n\n /**\n * @param {Object} obj\n */\n setAll(obj) {\n for (const [key, val] of Object.entries(obj)) {\n this.setValue(key, val);\n }\n }\n\n get size() {\n return this.#storage.size;\n }\n\n #setModified() {\n if (!this.#modified) {\n this.#modified = true;\n if (typeof this.onSetModified === \"function\") {\n this.onSetModified();\n }\n }\n }\n\n resetModified() {\n if (this.#modified) {\n this.#modified = false;\n if (typeof this.onResetModified === \"function\") {\n this.onResetModified();\n }\n }\n }\n\n /**\n * @returns {PrintAnnotationStorage}\n */\n get print() {\n return new PrintAnnotationStorage(this);\n }\n\n /**\n * PLEASE NOTE: Only intended for usage within the API itself.\n * @ignore\n */\n get serializable() {\n if (this.#storage.size === 0) {\n return SerializableEmpty;\n }\n const map = new Map(),\n hash = new MurmurHash3_64(),\n transfer = [];\n const context = Object.create(null);\n let hasBitmap = false;\n\n for (const [key, val] of this.#storage) {\n const serialized =\n val instanceof AnnotationEditor\n ? val.serialize(/* isForCopying = */ false, context)\n : val;\n if (serialized) {\n map.set(key, serialized);\n\n hash.update(`${key}:${JSON.stringify(serialized)}`);\n hasBitmap ||= !!serialized.bitmap;\n }\n }\n\n if (hasBitmap) {\n // We must transfer the bitmap data separately, since it can be changed\n // during serialization with SVG images.\n for (const value of map.values()) {\n if (value.bitmap) {\n transfer.push(value.bitmap);\n }\n }\n }\n\n return map.size > 0\n ? { map, hash: hash.hexdigest(), transfer }\n : SerializableEmpty;\n }\n\n get editorStats() {\n let stats = null;\n const typeToEditor = new Map();\n for (const value of this.#storage.values()) {\n if (!(value instanceof AnnotationEditor)) {\n continue;\n }\n const editorStats = value.telemetryFinalData;\n if (!editorStats) {\n continue;\n }\n const { type } = editorStats;\n if (!typeToEditor.has(type)) {\n typeToEditor.set(type, Object.getPrototypeOf(value).constructor);\n }\n stats ||= Object.create(null);\n const map = (stats[type] ||= new Map());\n for (const [key, val] of Object.entries(editorStats)) {\n if (key === \"type\") {\n continue;\n }\n let counters = map.get(key);\n if (!counters) {\n counters = new Map();\n map.set(key, counters);\n }\n const count = counters.get(val) ?? 0;\n counters.set(val, count + 1);\n }\n }\n for (const [type, editor] of typeToEditor) {\n stats[type] = editor.computeTelemetryFinalData(stats[type]);\n }\n return stats;\n }\n}\n\n/**\n * A special `AnnotationStorage` for use during printing, where the serializable\n * data is *frozen* upon initialization, to prevent scripting from modifying its\n * contents. (Necessary since printing is triggered synchronously in browsers.)\n */\nclass PrintAnnotationStorage extends AnnotationStorage {\n #serializable;\n\n constructor(parent) {\n super();\n const { map, hash, transfer } = parent.serializable;\n // Create a *copy* of the data, since Objects are passed by reference in JS.\n const clone = structuredClone(map, transfer ? { transfer } : null);\n\n this.#serializable = { map: clone, hash, transfer };\n }\n\n /**\n * @returns {PrintAnnotationStorage}\n */\n // eslint-disable-next-line getter-return\n get print() {\n unreachable(\"Should not call PrintAnnotationStorage.print\");\n }\n\n /**\n * PLEASE NOTE: Only intended for usage within the API itself.\n * @ignore\n */\n get serializable() {\n return this.#serializable;\n }\n}\n\nexport { AnnotationStorage, PrintAnnotationStorage, SerializableEmpty };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n assert,\n bytesToString,\n FontRenderOps,\n isNodeJS,\n shadow,\n string32,\n unreachable,\n warn,\n} from \"../shared/util.js\";\n\nclass FontLoader {\n #systemFonts = new Set();\n\n constructor({\n ownerDocument = globalThis.document,\n styleElement = null, // For testing only.\n }) {\n this._document = ownerDocument;\n\n this.nativeFontFaces = new Set();\n this.styleElement =\n typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")\n ? styleElement\n : null;\n\n if (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) {\n this.loadingRequests = [];\n this.loadTestFontId = 0;\n }\n }\n\n addNativeFontFace(nativeFontFace) {\n this.nativeFontFaces.add(nativeFontFace);\n this._document.fonts.add(nativeFontFace);\n }\n\n removeNativeFontFace(nativeFontFace) {\n this.nativeFontFaces.delete(nativeFontFace);\n this._document.fonts.delete(nativeFontFace);\n }\n\n insertRule(rule) {\n if (!this.styleElement) {\n this.styleElement = this._document.createElement(\"style\");\n this._document.documentElement\n .getElementsByTagName(\"head\")[0]\n .append(this.styleElement);\n }\n const styleSheet = this.styleElement.sheet;\n styleSheet.insertRule(rule, styleSheet.cssRules.length);\n }\n\n clear() {\n for (const nativeFontFace of this.nativeFontFaces) {\n this._document.fonts.delete(nativeFontFace);\n }\n this.nativeFontFaces.clear();\n this.#systemFonts.clear();\n\n if (this.styleElement) {\n // Note: ChildNode.remove doesn't throw if the parentNode is undefined.\n this.styleElement.remove();\n this.styleElement = null;\n }\n }\n\n async loadSystemFont({ systemFontInfo: info, _inspectFont }) {\n if (!info || this.#systemFonts.has(info.loadedName)) {\n return;\n }\n assert(\n !this.disableFontFace,\n \"loadSystemFont shouldn't be called when `disableFontFace` is set.\"\n );\n\n if (this.isFontLoadingAPISupported) {\n const { loadedName, src, style } = info;\n const fontFace = new FontFace(loadedName, src, style);\n this.addNativeFontFace(fontFace);\n try {\n await fontFace.load();\n this.#systemFonts.add(loadedName);\n _inspectFont?.(info);\n } catch {\n warn(\n `Cannot load system font: ${info.baseFontName}, installing it could help to improve PDF rendering.`\n );\n\n this.removeNativeFontFace(fontFace);\n }\n return;\n }\n\n unreachable(\n \"Not implemented: loadSystemFont without the Font Loading API.\"\n );\n }\n\n async bind(font) {\n // Add the font to the DOM only once; skip if the font is already loaded.\n if (font.attached || (font.missingFile && !font.systemFontInfo)) {\n return;\n }\n font.attached = true;\n\n if (font.systemFontInfo) {\n await this.loadSystemFont(font);\n return;\n }\n\n if (this.isFontLoadingAPISupported) {\n const nativeFontFace = font.createNativeFontFace();\n if (nativeFontFace) {\n this.addNativeFontFace(nativeFontFace);\n try {\n await nativeFontFace.loaded;\n } catch (ex) {\n warn(`Failed to load font '${nativeFontFace.family}': '${ex}'.`);\n\n // When font loading failed, fall back to the built-in font renderer.\n font.disableFontFace = true;\n throw ex;\n }\n }\n return; // The font was, asynchronously, loaded.\n }\n\n // !this.isFontLoadingAPISupported\n const rule = font.createFontFaceRule();\n if (rule) {\n this.insertRule(rule);\n\n if (this.isSyncFontLoadingSupported) {\n return; // The font was, synchronously, loaded.\n }\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n throw new Error(\"Not implemented: async font loading\");\n }\n await new Promise(resolve => {\n const request = this._queueLoadingCallback(resolve);\n this._prepareFontLoadEvent(font, request);\n });\n // The font was, asynchronously, loaded.\n }\n }\n\n get isFontLoadingAPISupported() {\n const hasFonts = !!this._document?.fonts;\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n return shadow(\n this,\n \"isFontLoadingAPISupported\",\n hasFonts && !this.styleElement\n );\n }\n return shadow(this, \"isFontLoadingAPISupported\", hasFonts);\n }\n\n get isSyncFontLoadingSupported() {\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n return shadow(this, \"isSyncFontLoadingSupported\", true);\n }\n\n let supported = false;\n if (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"CHROME\")) {\n if (isNodeJS) {\n // Node.js - we can pretend that sync font loading is supported.\n supported = true;\n } else if (\n typeof navigator !== \"undefined\" &&\n typeof navigator?.userAgent === \"string\" &&\n // User agent string sniffing is bad, but there is no reliable way to\n // tell if the font is fully loaded and ready to be used with canvas.\n /Mozilla\\/5.0.*?rv:\\d+.*? Gecko/.test(navigator.userAgent)\n ) {\n // Firefox, from version 14, supports synchronous font loading.\n supported = true;\n }\n }\n return shadow(this, \"isSyncFontLoadingSupported\", supported);\n }\n\n _queueLoadingCallback(callback) {\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n throw new Error(\"Not implemented: _queueLoadingCallback\");\n }\n\n function completeRequest() {\n assert(!request.done, \"completeRequest() cannot be called twice.\");\n request.done = true;\n\n // Sending all completed requests in order of how they were queued.\n while (loadingRequests.length > 0 && loadingRequests[0].done) {\n const otherRequest = loadingRequests.shift();\n setTimeout(otherRequest.callback, 0);\n }\n }\n\n const { loadingRequests } = this;\n const request = {\n done: false,\n complete: completeRequest,\n callback,\n };\n loadingRequests.push(request);\n return request;\n }\n\n get _loadTestFont() {\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n throw new Error(\"Not implemented: _loadTestFont\");\n }\n\n // This is a CFF font with 1 glyph for '.' that fills its entire width\n // and height.\n const testFont = atob(\n \"T1RUTwALAIAAAwAwQ0ZGIDHtZg4AAAOYAAAAgUZGVE1lkzZwAAAEHAAAABxHREVGABQA\" +\n \"FQAABDgAAAAeT1MvMlYNYwkAAAEgAAAAYGNtYXABDQLUAAACNAAAAUJoZWFk/xVFDQAA\" +\n \"ALwAAAA2aGhlYQdkA+oAAAD0AAAAJGhtdHgD6AAAAAAEWAAAAAZtYXhwAAJQAAAAARgA\" +\n \"AAAGbmFtZVjmdH4AAAGAAAAAsXBvc3T/hgAzAAADeAAAACAAAQAAAAEAALZRFsRfDzz1\" +\n \"AAsD6AAAAADOBOTLAAAAAM4KHDwAAAAAA+gDIQAAAAgAAgAAAAAAAAABAAADIQAAAFoD\" +\n \"6AAAAAAD6AABAAAAAAAAAAAAAAAAAAAAAQAAUAAAAgAAAAQD6AH0AAUAAAKKArwAAACM\" +\n \"AooCvAAAAeAAMQECAAACAAYJAAAAAAAAAAAAAQAAAAAAAAAAAAAAAFBmRWQAwAAuAC4D\" +\n \"IP84AFoDIQAAAAAAAQAAAAAAAAAAACAAIAABAAAADgCuAAEAAAAAAAAAAQAAAAEAAAAA\" +\n \"AAEAAQAAAAEAAAAAAAIAAQAAAAEAAAAAAAMAAQAAAAEAAAAAAAQAAQAAAAEAAAAAAAUA\" +\n \"AQAAAAEAAAAAAAYAAQAAAAMAAQQJAAAAAgABAAMAAQQJAAEAAgABAAMAAQQJAAIAAgAB\" +\n \"AAMAAQQJAAMAAgABAAMAAQQJAAQAAgABAAMAAQQJAAUAAgABAAMAAQQJAAYAAgABWABY\" +\n \"AAAAAAAAAwAAAAMAAAAcAAEAAAAAADwAAwABAAAAHAAEACAAAAAEAAQAAQAAAC7//wAA\" +\n \"AC7////TAAEAAAAAAAABBgAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\" +\n \"AAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\" +\n \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\" +\n \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\" +\n \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\" +\n \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAD/gwAyAAAAAQAAAAAAAAAAAAAAAAAA\" +\n \"AAABAAQEAAEBAQJYAAEBASH4DwD4GwHEAvgcA/gXBIwMAYuL+nz5tQXkD5j3CBLnEQAC\" +\n \"AQEBIVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYAAABAQAADwACAQEEE/t3\" +\n \"Dov6fAH6fAT+fPp8+nwHDosMCvm1Cvm1DAz6fBQAAAAAAAABAAAAAMmJbzEAAAAAzgTj\" +\n \"FQAAAADOBOQpAAEAAAAAAAAADAAUAAQAAAABAAAAAgABAAAAAAAAAAAD6AAAAAAAAA==\"\n );\n return shadow(this, \"_loadTestFont\", testFont);\n }\n\n _prepareFontLoadEvent(font, request) {\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n throw new Error(\"Not implemented: _prepareFontLoadEvent\");\n }\n\n /** Hack begin */\n // There's currently no event when a font has finished downloading so the\n // following code is a dirty hack to 'guess' when a font is ready.\n // It's assumed fonts are loaded in order, so add a known test font after\n // the desired fonts and then test for the loading of that test font.\n\n function int32(data, offset) {\n return (\n (data.charCodeAt(offset) << 24) |\n (data.charCodeAt(offset + 1) << 16) |\n (data.charCodeAt(offset + 2) << 8) |\n (data.charCodeAt(offset + 3) & 0xff)\n );\n }\n function spliceString(s, offset, remove, insert) {\n const chunk1 = s.substring(0, offset);\n const chunk2 = s.substring(offset + remove);\n return chunk1 + insert + chunk2;\n }\n let i, ii;\n\n // The temporary canvas is used to determine if fonts are loaded.\n const canvas = this._document.createElement(\"canvas\");\n canvas.width = 1;\n canvas.height = 1;\n const ctx = canvas.getContext(\"2d\");\n\n let called = 0;\n function isFontReady(name, callback) {\n // With setTimeout clamping this gives the font ~100ms to load.\n if (++called > 30) {\n warn(\"Load test font never loaded.\");\n callback();\n return;\n }\n ctx.font = \"30px \" + name;\n ctx.fillText(\".\", 0, 20);\n const imageData = ctx.getImageData(0, 0, 1, 1);\n if (imageData.data[3] > 0) {\n callback();\n return;\n }\n setTimeout(isFontReady.bind(null, name, callback));\n }\n\n const loadTestFontId = `lt${Date.now()}${this.loadTestFontId++}`;\n // Chromium seems to cache fonts based on a hash of the actual font data,\n // so the font must be modified for each load test else it will appear to\n // be loaded already.\n // TODO: This could maybe be made faster by avoiding the btoa of the full\n // font by splitting it in chunks before hand and padding the font id.\n let data = this._loadTestFont;\n const COMMENT_OFFSET = 976; // has to be on 4 byte boundary (for checksum)\n data = spliceString(\n data,\n COMMENT_OFFSET,\n loadTestFontId.length,\n loadTestFontId\n );\n // CFF checksum is important for IE, adjusting it\n const CFF_CHECKSUM_OFFSET = 16;\n const XXXX_VALUE = 0x58585858; // the \"comment\" filled with 'X'\n let checksum = int32(data, CFF_CHECKSUM_OFFSET);\n for (i = 0, ii = loadTestFontId.length - 3; i < ii; i += 4) {\n checksum = (checksum - XXXX_VALUE + int32(loadTestFontId, i)) | 0;\n }\n if (i < loadTestFontId.length) {\n // align to 4 bytes boundary\n checksum = (checksum - XXXX_VALUE + int32(loadTestFontId + \"XXX\", i)) | 0;\n }\n data = spliceString(data, CFF_CHECKSUM_OFFSET, 4, string32(checksum));\n\n const url = `url(data:font/opentype;base64,${btoa(data)});`;\n const rule = `@font-face {font-family:\"${loadTestFontId}\";src:${url}}`;\n this.insertRule(rule);\n\n const div = this._document.createElement(\"div\");\n div.style.visibility = \"hidden\";\n div.style.width = div.style.height = \"10px\";\n div.style.position = \"absolute\";\n div.style.top = div.style.left = \"0px\";\n\n for (const name of [font.loadedName, loadTestFontId]) {\n const span = this._document.createElement(\"span\");\n span.textContent = \"Hi\";\n span.style.fontFamily = name;\n div.append(span);\n }\n this._document.body.append(div);\n\n isFontReady(loadTestFontId, () => {\n div.remove();\n request.complete();\n });\n /** Hack end */\n }\n}\n\nclass FontFaceObject {\n constructor(translatedData, { disableFontFace = false, inspectFont = null }) {\n this.compiledGlyphs = Object.create(null);\n // importing translated data\n for (const i in translatedData) {\n this[i] = translatedData[i];\n }\n this.disableFontFace = disableFontFace === true;\n this._inspectFont = inspectFont;\n }\n\n createNativeFontFace() {\n if (!this.data || this.disableFontFace) {\n return null;\n }\n let nativeFontFace;\n if (!this.cssFontInfo) {\n nativeFontFace = new FontFace(this.loadedName, this.data, {});\n } else {\n const css = {\n weight: this.cssFontInfo.fontWeight,\n };\n if (this.cssFontInfo.italicAngle) {\n css.style = `oblique ${this.cssFontInfo.italicAngle}deg`;\n }\n nativeFontFace = new FontFace(\n this.cssFontInfo.fontFamily,\n this.data,\n css\n );\n }\n\n this._inspectFont?.(this);\n return nativeFontFace;\n }\n\n createFontFaceRule() {\n if (!this.data || this.disableFontFace) {\n return null;\n }\n const data = bytesToString(this.data);\n // Add the @font-face rule to the document.\n const url = `url(data:${this.mimetype};base64,${btoa(data)});`;\n let rule;\n if (!this.cssFontInfo) {\n rule = `@font-face {font-family:\"${this.loadedName}\";src:${url}}`;\n } else {\n let css = `font-weight: ${this.cssFontInfo.fontWeight};`;\n if (this.cssFontInfo.italicAngle) {\n css += `font-style: oblique ${this.cssFontInfo.italicAngle}deg;`;\n }\n rule = `@font-face {font-family:\"${this.cssFontInfo.fontFamily}\";${css}src:${url}}`;\n }\n\n this._inspectFont?.(this, url);\n return rule;\n }\n\n getPathGenerator(objs, character) {\n if (this.compiledGlyphs[character] !== undefined) {\n return this.compiledGlyphs[character];\n }\n\n let cmds;\n try {\n cmds = objs.get(this.loadedName + \"_path_\" + character);\n } catch (ex) {\n warn(`getPathGenerator - ignoring character: \"${ex}\".`);\n }\n\n if (!Array.isArray(cmds) || cmds.length === 0) {\n return (this.compiledGlyphs[character] = function (c, size) {\n // No-op function, to allow rendering to continue.\n });\n }\n\n const commands = [];\n for (let i = 0, ii = cmds.length; i < ii; ) {\n switch (cmds[i++]) {\n case FontRenderOps.BEZIER_CURVE_TO:\n {\n const [a, b, c, d, e, f] = cmds.slice(i, i + 6);\n commands.push(ctx => ctx.bezierCurveTo(a, b, c, d, e, f));\n i += 6;\n }\n break;\n case FontRenderOps.MOVE_TO:\n {\n const [a, b] = cmds.slice(i, i + 2);\n commands.push(ctx => ctx.moveTo(a, b));\n i += 2;\n }\n break;\n case FontRenderOps.LINE_TO:\n {\n const [a, b] = cmds.slice(i, i + 2);\n commands.push(ctx => ctx.lineTo(a, b));\n i += 2;\n }\n break;\n case FontRenderOps.QUADRATIC_CURVE_TO:\n {\n const [a, b, c, d] = cmds.slice(i, i + 4);\n commands.push(ctx => ctx.quadraticCurveTo(a, b, c, d));\n i += 4;\n }\n break;\n case FontRenderOps.RESTORE:\n commands.push(ctx => ctx.restore());\n break;\n case FontRenderOps.SAVE:\n commands.push(ctx => ctx.save());\n break;\n case FontRenderOps.SCALE:\n // The scale command must be at the third position, after save and\n // transform (for the font matrix) commands (see also\n // font_renderer.js).\n // The goal is to just scale the canvas and then run the commands loop\n // without the need to pass the size parameter to each command.\n assert(\n commands.length === 2,\n \"Scale command is only valid at the third position.\"\n );\n break;\n case FontRenderOps.TRANSFORM:\n {\n const [a, b, c, d, e, f] = cmds.slice(i, i + 6);\n commands.push(ctx => ctx.transform(a, b, c, d, e, f));\n i += 6;\n }\n break;\n case FontRenderOps.TRANSLATE:\n {\n const [a, b] = cmds.slice(i, i + 2);\n commands.push(ctx => ctx.translate(a, b));\n i += 2;\n }\n break;\n }\n }\n\n return (this.compiledGlyphs[character] = function glyphDrawer(ctx, size) {\n commands[0](ctx);\n commands[1](ctx);\n ctx.scale(size, -size);\n for (let i = 2, ii = commands.length; i < ii; i++) {\n commands[i](ctx);\n }\n });\n }\n}\n\nexport { FontFaceObject, FontLoader };\n","/* Copyright 2020 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n BaseCanvasFactory,\n BaseCMapReaderFactory,\n BaseFilterFactory,\n BaseStandardFontDataFactory,\n} from \"./base_factory.js\";\nimport { isNodeJS, warn } from \"../shared/util.js\";\n\nif (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n throw new Error(\n 'Module \"./node_utils.js\" shall not be used with MOZCENTRAL builds.'\n );\n}\n\nif (isNodeJS) {\n // eslint-disable-next-line no-var\n var packageCapability = Promise.withResolvers();\n // eslint-disable-next-line no-var\n var packageMap = null;\n\n const loadPackages = async () => {\n // Native packages.\n const fs = await __non_webpack_import__(\"fs\"),\n http = await __non_webpack_import__(\"http\"),\n https = await __non_webpack_import__(\"https\"),\n url = await __non_webpack_import__(\"url\");\n\n // Optional, third-party, packages.\n let canvas, path2d;\n if (typeof PDFJSDev !== \"undefined\" && !PDFJSDev.test(\"SKIP_BABEL\")) {\n try {\n canvas = await __non_webpack_import__(\"canvas\");\n } catch {}\n try {\n path2d = await __non_webpack_import__(\"path2d\");\n } catch {}\n }\n\n return new Map(Object.entries({ fs, http, https, url, canvas, path2d }));\n };\n\n loadPackages().then(\n map => {\n packageMap = map;\n packageCapability.resolve();\n\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"SKIP_BABEL\")) {\n return;\n }\n if (!globalThis.DOMMatrix) {\n const DOMMatrix = map.get(\"canvas\")?.DOMMatrix;\n\n if (DOMMatrix) {\n globalThis.DOMMatrix = DOMMatrix;\n } else {\n warn(\"Cannot polyfill `DOMMatrix`, rendering may be broken.\");\n }\n }\n if (!globalThis.Path2D) {\n const CanvasRenderingContext2D =\n map.get(\"canvas\")?.CanvasRenderingContext2D;\n const applyPath2DToCanvasRenderingContext =\n map.get(\"path2d\")?.applyPath2DToCanvasRenderingContext;\n const Path2D = map.get(\"path2d\")?.Path2D;\n\n if (\n CanvasRenderingContext2D &&\n applyPath2DToCanvasRenderingContext &&\n Path2D\n ) {\n applyPath2DToCanvasRenderingContext(CanvasRenderingContext2D);\n globalThis.Path2D = Path2D;\n } else {\n warn(\"Cannot polyfill `Path2D`, rendering may be broken.\");\n }\n }\n },\n reason => {\n warn(`loadPackages: ${reason}`);\n\n packageMap = new Map();\n packageCapability.resolve();\n }\n );\n}\n\nclass NodePackages {\n static get promise() {\n return packageCapability.promise;\n }\n\n static get(name) {\n return packageMap?.get(name);\n }\n}\n\nconst fetchData = function (url) {\n const fs = NodePackages.get(\"fs\");\n return fs.promises.readFile(url).then(data => new Uint8Array(data));\n};\n\nclass NodeFilterFactory extends BaseFilterFactory {}\n\nclass NodeCanvasFactory extends BaseCanvasFactory {\n /**\n * @ignore\n */\n _createCanvas(width, height) {\n const canvas = NodePackages.get(\"canvas\");\n return canvas.createCanvas(width, height);\n }\n}\n\nclass NodeCMapReaderFactory extends BaseCMapReaderFactory {\n /**\n * @ignore\n */\n _fetchData(url, compressionType) {\n return fetchData(url).then(data => ({ cMapData: data, compressionType }));\n }\n}\n\nclass NodeStandardFontDataFactory extends BaseStandardFontDataFactory {\n /**\n * @ignore\n */\n _fetchData(url) {\n return fetchData(url);\n }\n}\n\nexport {\n NodeCanvasFactory,\n NodeCMapReaderFactory,\n NodeFilterFactory,\n NodePackages,\n NodeStandardFontDataFactory,\n};\n","/* Copyright 2014 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FormatError, info, unreachable, Util } from \"../shared/util.js\";\nimport { getCurrentTransform } from \"./display_utils.js\";\n\nconst PathType = {\n FILL: \"Fill\",\n STROKE: \"Stroke\",\n SHADING: \"Shading\",\n};\n\nfunction applyBoundingBox(ctx, bbox) {\n if (!bbox) {\n return;\n }\n const width = bbox[2] - bbox[0];\n const height = bbox[3] - bbox[1];\n const region = new Path2D();\n region.rect(bbox[0], bbox[1], width, height);\n ctx.clip(region);\n}\n\nclass BaseShadingPattern {\n constructor() {\n if (this.constructor === BaseShadingPattern) {\n unreachable(\"Cannot initialize BaseShadingPattern.\");\n }\n }\n\n getPattern() {\n unreachable(\"Abstract method `getPattern` called.\");\n }\n}\n\nclass RadialAxialShadingPattern extends BaseShadingPattern {\n constructor(IR) {\n super();\n this._type = IR[1];\n this._bbox = IR[2];\n this._colorStops = IR[3];\n this._p0 = IR[4];\n this._p1 = IR[5];\n this._r0 = IR[6];\n this._r1 = IR[7];\n this.matrix = null;\n }\n\n _createGradient(ctx) {\n let grad;\n if (this._type === \"axial\") {\n grad = ctx.createLinearGradient(\n this._p0[0],\n this._p0[1],\n this._p1[0],\n this._p1[1]\n );\n } else if (this._type === \"radial\") {\n grad = ctx.createRadialGradient(\n this._p0[0],\n this._p0[1],\n this._r0,\n this._p1[0],\n this._p1[1],\n this._r1\n );\n }\n\n for (const colorStop of this._colorStops) {\n grad.addColorStop(colorStop[0], colorStop[1]);\n }\n return grad;\n }\n\n getPattern(ctx, owner, inverse, pathType) {\n let pattern;\n if (pathType === PathType.STROKE || pathType === PathType.FILL) {\n const ownerBBox = owner.current.getClippedPathBoundingBox(\n pathType,\n getCurrentTransform(ctx)\n ) || [0, 0, 0, 0];\n // Create a canvas that is only as big as the current path. This doesn't\n // allow us to cache the pattern, but it generally creates much smaller\n // canvases and saves memory use. See bug 1722807 for an example.\n const width = Math.ceil(ownerBBox[2] - ownerBBox[0]) || 1;\n const height = Math.ceil(ownerBBox[3] - ownerBBox[1]) || 1;\n\n const tmpCanvas = owner.cachedCanvases.getCanvas(\n \"pattern\",\n width,\n height,\n true\n );\n\n const tmpCtx = tmpCanvas.context;\n tmpCtx.clearRect(0, 0, tmpCtx.canvas.width, tmpCtx.canvas.height);\n tmpCtx.beginPath();\n tmpCtx.rect(0, 0, tmpCtx.canvas.width, tmpCtx.canvas.height);\n // Non shading fill patterns are positioned relative to the base transform\n // (usually the page's initial transform), but we may have created a\n // smaller canvas based on the path, so we must account for the shift.\n tmpCtx.translate(-ownerBBox[0], -ownerBBox[1]);\n inverse = Util.transform(inverse, [\n 1,\n 0,\n 0,\n 1,\n ownerBBox[0],\n ownerBBox[1],\n ]);\n\n tmpCtx.transform(...owner.baseTransform);\n if (this.matrix) {\n tmpCtx.transform(...this.matrix);\n }\n applyBoundingBox(tmpCtx, this._bbox);\n\n tmpCtx.fillStyle = this._createGradient(tmpCtx);\n tmpCtx.fill();\n\n pattern = ctx.createPattern(tmpCanvas.canvas, \"no-repeat\");\n const domMatrix = new DOMMatrix(inverse);\n pattern.setTransform(domMatrix);\n } else {\n // Shading fills are applied relative to the current matrix which is also\n // how canvas gradients work, so there's no need to do anything special\n // here.\n applyBoundingBox(ctx, this._bbox);\n pattern = this._createGradient(ctx);\n }\n return pattern;\n }\n}\n\nfunction drawTriangle(data, context, p1, p2, p3, c1, c2, c3) {\n // Very basic Gouraud-shaded triangle rasterization algorithm.\n const coords = context.coords,\n colors = context.colors;\n const bytes = data.data,\n rowSize = data.width * 4;\n let tmp;\n if (coords[p1 + 1] > coords[p2 + 1]) {\n tmp = p1;\n p1 = p2;\n p2 = tmp;\n tmp = c1;\n c1 = c2;\n c2 = tmp;\n }\n if (coords[p2 + 1] > coords[p3 + 1]) {\n tmp = p2;\n p2 = p3;\n p3 = tmp;\n tmp = c2;\n c2 = c3;\n c3 = tmp;\n }\n if (coords[p1 + 1] > coords[p2 + 1]) {\n tmp = p1;\n p1 = p2;\n p2 = tmp;\n tmp = c1;\n c1 = c2;\n c2 = tmp;\n }\n const x1 = (coords[p1] + context.offsetX) * context.scaleX;\n const y1 = (coords[p1 + 1] + context.offsetY) * context.scaleY;\n const x2 = (coords[p2] + context.offsetX) * context.scaleX;\n const y2 = (coords[p2 + 1] + context.offsetY) * context.scaleY;\n const x3 = (coords[p3] + context.offsetX) * context.scaleX;\n const y3 = (coords[p3 + 1] + context.offsetY) * context.scaleY;\n if (y1 >= y3) {\n return;\n }\n const c1r = colors[c1],\n c1g = colors[c1 + 1],\n c1b = colors[c1 + 2];\n const c2r = colors[c2],\n c2g = colors[c2 + 1],\n c2b = colors[c2 + 2];\n const c3r = colors[c3],\n c3g = colors[c3 + 1],\n c3b = colors[c3 + 2];\n\n const minY = Math.round(y1),\n maxY = Math.round(y3);\n let xa, car, cag, cab;\n let xb, cbr, cbg, cbb;\n for (let y = minY; y <= maxY; y++) {\n if (y < y2) {\n const k = y < y1 ? 0 : (y1 - y) / (y1 - y2);\n xa = x1 - (x1 - x2) * k;\n car = c1r - (c1r - c2r) * k;\n cag = c1g - (c1g - c2g) * k;\n cab = c1b - (c1b - c2b) * k;\n } else {\n let k;\n if (y > y3) {\n k = 1;\n } else if (y2 === y3) {\n k = 0;\n } else {\n k = (y2 - y) / (y2 - y3);\n }\n xa = x2 - (x2 - x3) * k;\n car = c2r - (c2r - c3r) * k;\n cag = c2g - (c2g - c3g) * k;\n cab = c2b - (c2b - c3b) * k;\n }\n\n let k;\n if (y < y1) {\n k = 0;\n } else if (y > y3) {\n k = 1;\n } else {\n k = (y1 - y) / (y1 - y3);\n }\n xb = x1 - (x1 - x3) * k;\n cbr = c1r - (c1r - c3r) * k;\n cbg = c1g - (c1g - c3g) * k;\n cbb = c1b - (c1b - c3b) * k;\n const x1_ = Math.round(Math.min(xa, xb));\n const x2_ = Math.round(Math.max(xa, xb));\n let j = rowSize * y + x1_ * 4;\n for (let x = x1_; x <= x2_; x++) {\n k = (xa - x) / (xa - xb);\n if (k < 0) {\n k = 0;\n } else if (k > 1) {\n k = 1;\n }\n bytes[j++] = (car - (car - cbr) * k) | 0;\n bytes[j++] = (cag - (cag - cbg) * k) | 0;\n bytes[j++] = (cab - (cab - cbb) * k) | 0;\n bytes[j++] = 255;\n }\n }\n}\n\nfunction drawFigure(data, figure, context) {\n const ps = figure.coords;\n const cs = figure.colors;\n let i, ii;\n switch (figure.type) {\n case \"lattice\":\n const verticesPerRow = figure.verticesPerRow;\n const rows = Math.floor(ps.length / verticesPerRow) - 1;\n const cols = verticesPerRow - 1;\n for (i = 0; i < rows; i++) {\n let q = i * verticesPerRow;\n for (let j = 0; j < cols; j++, q++) {\n drawTriangle(\n data,\n context,\n ps[q],\n ps[q + 1],\n ps[q + verticesPerRow],\n cs[q],\n cs[q + 1],\n cs[q + verticesPerRow]\n );\n drawTriangle(\n data,\n context,\n ps[q + verticesPerRow + 1],\n ps[q + 1],\n ps[q + verticesPerRow],\n cs[q + verticesPerRow + 1],\n cs[q + 1],\n cs[q + verticesPerRow]\n );\n }\n }\n break;\n case \"triangles\":\n for (i = 0, ii = ps.length; i < ii; i += 3) {\n drawTriangle(\n data,\n context,\n ps[i],\n ps[i + 1],\n ps[i + 2],\n cs[i],\n cs[i + 1],\n cs[i + 2]\n );\n }\n break;\n default:\n throw new Error(\"illegal figure\");\n }\n}\n\nclass MeshShadingPattern extends BaseShadingPattern {\n constructor(IR) {\n super();\n this._coords = IR[2];\n this._colors = IR[3];\n this._figures = IR[4];\n this._bounds = IR[5];\n this._bbox = IR[7];\n this._background = IR[8];\n this.matrix = null;\n }\n\n _createMeshCanvas(combinedScale, backgroundColor, cachedCanvases) {\n // we will increase scale on some weird factor to let antialiasing take\n // care of \"rough\" edges\n const EXPECTED_SCALE = 1.1;\n // MAX_PATTERN_SIZE is used to avoid OOM situation.\n const MAX_PATTERN_SIZE = 3000; // 10in @ 300dpi shall be enough\n // We need to keep transparent border around our pattern for fill():\n // createPattern with 'no-repeat' will bleed edges across entire area.\n const BORDER_SIZE = 2;\n\n const offsetX = Math.floor(this._bounds[0]);\n const offsetY = Math.floor(this._bounds[1]);\n const boundsWidth = Math.ceil(this._bounds[2]) - offsetX;\n const boundsHeight = Math.ceil(this._bounds[3]) - offsetY;\n\n const width = Math.min(\n Math.ceil(Math.abs(boundsWidth * combinedScale[0] * EXPECTED_SCALE)),\n MAX_PATTERN_SIZE\n );\n const height = Math.min(\n Math.ceil(Math.abs(boundsHeight * combinedScale[1] * EXPECTED_SCALE)),\n MAX_PATTERN_SIZE\n );\n const scaleX = boundsWidth / width;\n const scaleY = boundsHeight / height;\n\n const context = {\n coords: this._coords,\n colors: this._colors,\n offsetX: -offsetX,\n offsetY: -offsetY,\n scaleX: 1 / scaleX,\n scaleY: 1 / scaleY,\n };\n\n const paddedWidth = width + BORDER_SIZE * 2;\n const paddedHeight = height + BORDER_SIZE * 2;\n\n const tmpCanvas = cachedCanvases.getCanvas(\n \"mesh\",\n paddedWidth,\n paddedHeight,\n false\n );\n const tmpCtx = tmpCanvas.context;\n\n const data = tmpCtx.createImageData(width, height);\n if (backgroundColor) {\n const bytes = data.data;\n for (let i = 0, ii = bytes.length; i < ii; i += 4) {\n bytes[i] = backgroundColor[0];\n bytes[i + 1] = backgroundColor[1];\n bytes[i + 2] = backgroundColor[2];\n bytes[i + 3] = 255;\n }\n }\n for (const figure of this._figures) {\n drawFigure(data, figure, context);\n }\n tmpCtx.putImageData(data, BORDER_SIZE, BORDER_SIZE);\n const canvas = tmpCanvas.canvas;\n\n return {\n canvas,\n offsetX: offsetX - BORDER_SIZE * scaleX,\n offsetY: offsetY - BORDER_SIZE * scaleY,\n scaleX,\n scaleY,\n };\n }\n\n getPattern(ctx, owner, inverse, pathType) {\n applyBoundingBox(ctx, this._bbox);\n let scale;\n if (pathType === PathType.SHADING) {\n scale = Util.singularValueDecompose2dScale(getCurrentTransform(ctx));\n } else {\n // Obtain scale from matrix and current transformation matrix.\n scale = Util.singularValueDecompose2dScale(owner.baseTransform);\n if (this.matrix) {\n const matrixScale = Util.singularValueDecompose2dScale(this.matrix);\n scale = [scale[0] * matrixScale[0], scale[1] * matrixScale[1]];\n }\n }\n\n // Rasterizing on the main thread since sending/queue large canvases\n // might cause OOM.\n const temporaryPatternCanvas = this._createMeshCanvas(\n scale,\n pathType === PathType.SHADING ? null : this._background,\n owner.cachedCanvases\n );\n\n if (pathType !== PathType.SHADING) {\n ctx.setTransform(...owner.baseTransform);\n if (this.matrix) {\n ctx.transform(...this.matrix);\n }\n }\n\n ctx.translate(\n temporaryPatternCanvas.offsetX,\n temporaryPatternCanvas.offsetY\n );\n ctx.scale(temporaryPatternCanvas.scaleX, temporaryPatternCanvas.scaleY);\n\n return ctx.createPattern(temporaryPatternCanvas.canvas, \"no-repeat\");\n }\n}\n\nclass DummyShadingPattern extends BaseShadingPattern {\n getPattern() {\n return \"hotpink\";\n }\n}\n\nfunction getShadingPattern(IR) {\n switch (IR[0]) {\n case \"RadialAxial\":\n return new RadialAxialShadingPattern(IR);\n case \"Mesh\":\n return new MeshShadingPattern(IR);\n case \"Dummy\":\n return new DummyShadingPattern();\n }\n throw new Error(`Unknown IR type: ${IR[0]}`);\n}\n\nconst PaintType = {\n COLORED: 1,\n UNCOLORED: 2,\n};\n\nclass TilingPattern {\n // 10in @ 300dpi shall be enough.\n static MAX_PATTERN_SIZE = 3000;\n\n constructor(IR, color, ctx, canvasGraphicsFactory, baseTransform) {\n this.operatorList = IR[2];\n this.matrix = IR[3];\n this.bbox = IR[4];\n this.xstep = IR[5];\n this.ystep = IR[6];\n this.paintType = IR[7];\n this.tilingType = IR[8];\n this.color = color;\n this.ctx = ctx;\n this.canvasGraphicsFactory = canvasGraphicsFactory;\n this.baseTransform = baseTransform;\n }\n\n createPatternCanvas(owner) {\n const operatorList = this.operatorList;\n const bbox = this.bbox;\n const xstep = this.xstep;\n const ystep = this.ystep;\n const paintType = this.paintType;\n const tilingType = this.tilingType;\n const color = this.color;\n const canvasGraphicsFactory = this.canvasGraphicsFactory;\n\n info(\"TilingType: \" + tilingType);\n\n // A tiling pattern as defined by PDF spec 8.7.2 is a cell whose size is\n // described by bbox, and may repeat regularly by shifting the cell by\n // xstep and ystep.\n // Because the HTML5 canvas API does not support pattern repetition with\n // gaps in between, we use the xstep/ystep instead of the bbox's size.\n //\n // This has the following consequences (similarly for ystep):\n //\n // - If xstep is the same as bbox, then there is no observable difference.\n //\n // - If xstep is larger than bbox, then the pattern canvas is partially\n // empty: the area bounded by bbox is painted, the outside area is void.\n //\n // - If xstep is smaller than bbox, then the pixels between xstep and the\n // bbox boundary will be missing. This is INCORRECT behavior.\n // \"Figures on adjacent tiles should not overlap\" (PDF spec 8.7.3.1),\n // but overlapping cells without common pixels are still valid.\n // TODO: Fix the implementation, to allow this scenario to be painted\n // correctly.\n\n const x0 = bbox[0],\n y0 = bbox[1],\n x1 = bbox[2],\n y1 = bbox[3];\n\n // Obtain scale from matrix and current transformation matrix.\n const matrixScale = Util.singularValueDecompose2dScale(this.matrix);\n const curMatrixScale = Util.singularValueDecompose2dScale(\n this.baseTransform\n );\n const combinedScale = [\n matrixScale[0] * curMatrixScale[0],\n matrixScale[1] * curMatrixScale[1],\n ];\n\n // Use width and height values that are as close as possible to the end\n // result when the pattern is used. Too low value makes the pattern look\n // blurry. Too large value makes it look too crispy.\n const dimx = this.getSizeAndScale(\n xstep,\n this.ctx.canvas.width,\n combinedScale[0]\n );\n const dimy = this.getSizeAndScale(\n ystep,\n this.ctx.canvas.height,\n combinedScale[1]\n );\n\n const tmpCanvas = owner.cachedCanvases.getCanvas(\n \"pattern\",\n dimx.size,\n dimy.size,\n true\n );\n const tmpCtx = tmpCanvas.context;\n const graphics = canvasGraphicsFactory.createCanvasGraphics(tmpCtx);\n graphics.groupLevel = owner.groupLevel;\n\n this.setFillAndStrokeStyleToContext(graphics, paintType, color);\n\n let adjustedX0 = x0;\n let adjustedY0 = y0;\n let adjustedX1 = x1;\n let adjustedY1 = y1;\n // Some bounding boxes have negative x0/y0 coordinates which will cause the\n // some of the drawing to be off of the canvas. To avoid this shift the\n // bounding box over.\n if (x0 < 0) {\n adjustedX0 = 0;\n adjustedX1 += Math.abs(x0);\n }\n if (y0 < 0) {\n adjustedY0 = 0;\n adjustedY1 += Math.abs(y0);\n }\n tmpCtx.translate(-(dimx.scale * adjustedX0), -(dimy.scale * adjustedY0));\n graphics.transform(dimx.scale, 0, 0, dimy.scale, 0, 0);\n\n // To match CanvasGraphics beginDrawing we must save the context here or\n // else we end up with unbalanced save/restores.\n tmpCtx.save();\n\n this.clipBbox(graphics, adjustedX0, adjustedY0, adjustedX1, adjustedY1);\n\n graphics.baseTransform = getCurrentTransform(graphics.ctx);\n\n graphics.executeOperatorList(operatorList);\n\n graphics.endDrawing();\n\n return {\n canvas: tmpCanvas.canvas,\n scaleX: dimx.scale,\n scaleY: dimy.scale,\n offsetX: adjustedX0,\n offsetY: adjustedY0,\n };\n }\n\n getSizeAndScale(step, realOutputSize, scale) {\n // xstep / ystep may be negative -- normalize.\n step = Math.abs(step);\n // MAX_PATTERN_SIZE is used to avoid OOM situation.\n // Use the destination canvas's size if it is bigger than the hard-coded\n // limit of MAX_PATTERN_SIZE to avoid clipping patterns that cover the\n // whole canvas.\n const maxSize = Math.max(TilingPattern.MAX_PATTERN_SIZE, realOutputSize);\n let size = Math.ceil(step * scale);\n if (size >= maxSize) {\n size = maxSize;\n } else {\n scale = size / step;\n }\n return { scale, size };\n }\n\n clipBbox(graphics, x0, y0, x1, y1) {\n const bboxWidth = x1 - x0;\n const bboxHeight = y1 - y0;\n graphics.ctx.rect(x0, y0, bboxWidth, bboxHeight);\n graphics.current.updateRectMinMax(getCurrentTransform(graphics.ctx), [\n x0,\n y0,\n x1,\n y1,\n ]);\n graphics.clip();\n graphics.endPath();\n }\n\n setFillAndStrokeStyleToContext(graphics, paintType, color) {\n const context = graphics.ctx,\n current = graphics.current;\n switch (paintType) {\n case PaintType.COLORED:\n const ctx = this.ctx;\n context.fillStyle = ctx.fillStyle;\n context.strokeStyle = ctx.strokeStyle;\n current.fillColor = ctx.fillStyle;\n current.strokeColor = ctx.strokeStyle;\n break;\n case PaintType.UNCOLORED:\n const cssColor = Util.makeHexColor(color[0], color[1], color[2]);\n context.fillStyle = cssColor;\n context.strokeStyle = cssColor;\n // Set color needed by image masks (fixes issues 3226 and 8741).\n current.fillColor = cssColor;\n current.strokeColor = cssColor;\n break;\n default:\n throw new FormatError(`Unsupported paint type: ${paintType}`);\n }\n }\n\n getPattern(ctx, owner, inverse, pathType) {\n // PDF spec 8.7.2 NOTE 1: pattern's matrix is relative to initial matrix.\n let matrix = inverse;\n if (pathType !== PathType.SHADING) {\n matrix = Util.transform(matrix, owner.baseTransform);\n if (this.matrix) {\n matrix = Util.transform(matrix, this.matrix);\n }\n }\n\n const temporaryPatternCanvas = this.createPatternCanvas(owner);\n\n let domMatrix = new DOMMatrix(matrix);\n // Rescale and so that the ctx.createPattern call generates a pattern with\n // the desired size.\n domMatrix = domMatrix.translate(\n temporaryPatternCanvas.offsetX,\n temporaryPatternCanvas.offsetY\n );\n domMatrix = domMatrix.scale(\n 1 / temporaryPatternCanvas.scaleX,\n 1 / temporaryPatternCanvas.scaleY\n );\n\n const pattern = ctx.createPattern(temporaryPatternCanvas.canvas, \"repeat\");\n pattern.setTransform(domMatrix);\n\n return pattern;\n }\n}\n\nexport { getShadingPattern, PathType, TilingPattern };\n","/* Copyright 2022 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FeatureTest, ImageKind } from \"./util.js\";\n\nfunction convertToRGBA(params) {\n switch (params.kind) {\n case ImageKind.GRAYSCALE_1BPP:\n return convertBlackAndWhiteToRGBA(params);\n case ImageKind.RGB_24BPP:\n return convertRGBToRGBA(params);\n }\n\n return null;\n}\n\nfunction convertBlackAndWhiteToRGBA({\n src,\n srcPos = 0,\n dest,\n width,\n height,\n nonBlackColor = 0xffffffff,\n inverseDecode = false,\n}) {\n const black = FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff;\n const [zeroMapping, oneMapping] = inverseDecode\n ? [nonBlackColor, black]\n : [black, nonBlackColor];\n const widthInSource = width >> 3;\n const widthRemainder = width & 7;\n const srcLength = src.length;\n dest = new Uint32Array(dest.buffer);\n let destPos = 0;\n\n for (let i = 0; i < height; i++) {\n for (const max = srcPos + widthInSource; srcPos < max; srcPos++) {\n const elem = srcPos < srcLength ? src[srcPos] : 255;\n dest[destPos++] = elem & 0b10000000 ? oneMapping : zeroMapping;\n dest[destPos++] = elem & 0b1000000 ? oneMapping : zeroMapping;\n dest[destPos++] = elem & 0b100000 ? oneMapping : zeroMapping;\n dest[destPos++] = elem & 0b10000 ? oneMapping : zeroMapping;\n dest[destPos++] = elem & 0b1000 ? oneMapping : zeroMapping;\n dest[destPos++] = elem & 0b100 ? oneMapping : zeroMapping;\n dest[destPos++] = elem & 0b10 ? oneMapping : zeroMapping;\n dest[destPos++] = elem & 0b1 ? oneMapping : zeroMapping;\n }\n if (widthRemainder === 0) {\n continue;\n }\n const elem = srcPos < srcLength ? src[srcPos++] : 255;\n for (let j = 0; j < widthRemainder; j++) {\n dest[destPos++] = elem & (1 << (7 - j)) ? oneMapping : zeroMapping;\n }\n }\n return { srcPos, destPos };\n}\n\nfunction convertRGBToRGBA({\n src,\n srcPos = 0,\n dest,\n destPos = 0,\n width,\n height,\n}) {\n let i = 0;\n const len32 = src.length >> 2;\n const src32 = new Uint32Array(src.buffer, srcPos, len32);\n\n if (FeatureTest.isLittleEndian) {\n // It's a way faster to do the shuffle manually instead of working\n // component by component with some Uint8 arrays.\n for (; i < len32 - 2; i += 3, destPos += 4) {\n const s1 = src32[i]; // R2B1G1R1\n const s2 = src32[i + 1]; // G3R3B2G2\n const s3 = src32[i + 2]; // B4G4R4B3\n\n dest[destPos] = s1 | 0xff000000;\n dest[destPos + 1] = (s1 >>> 24) | (s2 << 8) | 0xff000000;\n dest[destPos + 2] = (s2 >>> 16) | (s3 << 16) | 0xff000000;\n dest[destPos + 3] = (s3 >>> 8) | 0xff000000;\n }\n\n for (let j = i * 4, jj = src.length; j < jj; j += 3) {\n dest[destPos++] =\n src[j] | (src[j + 1] << 8) | (src[j + 2] << 16) | 0xff000000;\n }\n } else {\n for (; i < len32 - 2; i += 3, destPos += 4) {\n const s1 = src32[i]; // R1G1B1R2\n const s2 = src32[i + 1]; // G2B2R3G3\n const s3 = src32[i + 2]; // B3R4G4B4\n\n dest[destPos] = s1 | 0xff;\n dest[destPos + 1] = (s1 << 24) | (s2 >>> 8) | 0xff;\n dest[destPos + 2] = (s2 << 16) | (s3 >>> 16) | 0xff;\n dest[destPos + 3] = (s3 << 8) | 0xff;\n }\n\n for (let j = i * 4, jj = src.length; j < jj; j += 3) {\n dest[destPos++] =\n (src[j] << 24) | (src[j + 1] << 16) | (src[j + 2] << 8) | 0xff;\n }\n }\n\n return { srcPos, destPos };\n}\n\nfunction grayToRGBA(src, dest) {\n if (FeatureTest.isLittleEndian) {\n for (let i = 0, ii = src.length; i < ii; i++) {\n dest[i] = (src[i] * 0x10101) | 0xff000000;\n }\n } else {\n for (let i = 0, ii = src.length; i < ii; i++) {\n dest[i] = (src[i] * 0x1010100) | 0x000000ff;\n }\n }\n}\n\nexport { convertBlackAndWhiteToRGBA, convertToRGBA, grayToRGBA };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n FeatureTest,\n FONT_IDENTITY_MATRIX,\n IDENTITY_MATRIX,\n ImageKind,\n info,\n isNodeJS,\n OPS,\n shadow,\n TextRenderingMode,\n unreachable,\n Util,\n warn,\n} from \"../shared/util.js\";\nimport {\n getCurrentTransform,\n getCurrentTransformInverse,\n PixelsPerInch,\n} from \"./display_utils.js\";\nimport {\n getShadingPattern,\n PathType,\n TilingPattern,\n} from \"./pattern_helper.js\";\nimport { convertBlackAndWhiteToRGBA } from \"../shared/image_utils.js\";\n\n// contexts store most of the state we need natively.\n// However, PDF needs a bit more state, which we store here.\n// Minimal font size that would be used during canvas fillText operations.\nconst MIN_FONT_SIZE = 16;\n// Maximum font size that would be used during canvas fillText operations.\nconst MAX_FONT_SIZE = 100;\n\n// Defines the time the `executeOperatorList`-method is going to be executing\n// before it stops and schedules a continue of execution.\nconst EXECUTION_TIME = 15; // ms\n// Defines the number of steps before checking the execution time.\nconst EXECUTION_STEPS = 10;\n\n// To disable Type3 compilation, set the value to `-1`.\nconst MAX_SIZE_TO_COMPILE = 1000;\n\nconst FULL_CHUNK_HEIGHT = 16;\n\n/**\n * Overrides certain methods on a 2d ctx so that when they are called they\n * will also call the same method on the destCtx. The methods that are\n * overridden are all the transformation state modifiers, path creation, and\n * save/restore. We only forward these specific methods because they are the\n * only state modifiers that we cannot copy over when we switch contexts.\n *\n * To remove mirroring call `ctx._removeMirroring()`.\n *\n * @param {Object} ctx - The 2d canvas context that will duplicate its calls on\n * the destCtx.\n * @param {Object} destCtx - The 2d canvas context that will receive the\n * forwarded calls.\n */\nfunction mirrorContextOperations(ctx, destCtx) {\n if (ctx._removeMirroring) {\n throw new Error(\"Context is already forwarding operations.\");\n }\n ctx.__originalSave = ctx.save;\n ctx.__originalRestore = ctx.restore;\n ctx.__originalRotate = ctx.rotate;\n ctx.__originalScale = ctx.scale;\n ctx.__originalTranslate = ctx.translate;\n ctx.__originalTransform = ctx.transform;\n ctx.__originalSetTransform = ctx.setTransform;\n ctx.__originalResetTransform = ctx.resetTransform;\n ctx.__originalClip = ctx.clip;\n ctx.__originalMoveTo = ctx.moveTo;\n ctx.__originalLineTo = ctx.lineTo;\n ctx.__originalBezierCurveTo = ctx.bezierCurveTo;\n ctx.__originalRect = ctx.rect;\n ctx.__originalClosePath = ctx.closePath;\n ctx.__originalBeginPath = ctx.beginPath;\n\n ctx._removeMirroring = () => {\n ctx.save = ctx.__originalSave;\n ctx.restore = ctx.__originalRestore;\n ctx.rotate = ctx.__originalRotate;\n ctx.scale = ctx.__originalScale;\n ctx.translate = ctx.__originalTranslate;\n ctx.transform = ctx.__originalTransform;\n ctx.setTransform = ctx.__originalSetTransform;\n ctx.resetTransform = ctx.__originalResetTransform;\n\n ctx.clip = ctx.__originalClip;\n ctx.moveTo = ctx.__originalMoveTo;\n ctx.lineTo = ctx.__originalLineTo;\n ctx.bezierCurveTo = ctx.__originalBezierCurveTo;\n ctx.rect = ctx.__originalRect;\n ctx.closePath = ctx.__originalClosePath;\n ctx.beginPath = ctx.__originalBeginPath;\n delete ctx._removeMirroring;\n };\n\n ctx.save = function ctxSave() {\n destCtx.save();\n this.__originalSave();\n };\n\n ctx.restore = function ctxRestore() {\n destCtx.restore();\n this.__originalRestore();\n };\n\n ctx.translate = function ctxTranslate(x, y) {\n destCtx.translate(x, y);\n this.__originalTranslate(x, y);\n };\n\n ctx.scale = function ctxScale(x, y) {\n destCtx.scale(x, y);\n this.__originalScale(x, y);\n };\n\n ctx.transform = function ctxTransform(a, b, c, d, e, f) {\n destCtx.transform(a, b, c, d, e, f);\n this.__originalTransform(a, b, c, d, e, f);\n };\n\n ctx.setTransform = function ctxSetTransform(a, b, c, d, e, f) {\n destCtx.setTransform(a, b, c, d, e, f);\n this.__originalSetTransform(a, b, c, d, e, f);\n };\n\n ctx.resetTransform = function ctxResetTransform() {\n destCtx.resetTransform();\n this.__originalResetTransform();\n };\n\n ctx.rotate = function ctxRotate(angle) {\n destCtx.rotate(angle);\n this.__originalRotate(angle);\n };\n\n ctx.clip = function ctxRotate(rule) {\n destCtx.clip(rule);\n this.__originalClip(rule);\n };\n\n ctx.moveTo = function (x, y) {\n destCtx.moveTo(x, y);\n this.__originalMoveTo(x, y);\n };\n\n ctx.lineTo = function (x, y) {\n destCtx.lineTo(x, y);\n this.__originalLineTo(x, y);\n };\n\n ctx.bezierCurveTo = function (cp1x, cp1y, cp2x, cp2y, x, y) {\n destCtx.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);\n this.__originalBezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);\n };\n\n ctx.rect = function (x, y, width, height) {\n destCtx.rect(x, y, width, height);\n this.__originalRect(x, y, width, height);\n };\n\n ctx.closePath = function () {\n destCtx.closePath();\n this.__originalClosePath();\n };\n\n ctx.beginPath = function () {\n destCtx.beginPath();\n this.__originalBeginPath();\n };\n}\n\nclass CachedCanvases {\n constructor(canvasFactory) {\n this.canvasFactory = canvasFactory;\n this.cache = Object.create(null);\n }\n\n getCanvas(id, width, height) {\n let canvasEntry;\n if (this.cache[id] !== undefined) {\n canvasEntry = this.cache[id];\n this.canvasFactory.reset(canvasEntry, width, height);\n } else {\n canvasEntry = this.canvasFactory.create(width, height);\n this.cache[id] = canvasEntry;\n }\n return canvasEntry;\n }\n\n delete(id) {\n delete this.cache[id];\n }\n\n clear() {\n for (const id in this.cache) {\n const canvasEntry = this.cache[id];\n this.canvasFactory.destroy(canvasEntry);\n delete this.cache[id];\n }\n }\n}\n\nfunction drawImageAtIntegerCoords(\n ctx,\n srcImg,\n srcX,\n srcY,\n srcW,\n srcH,\n destX,\n destY,\n destW,\n destH\n) {\n const [a, b, c, d, tx, ty] = getCurrentTransform(ctx);\n if (b === 0 && c === 0) {\n // top-left corner is at (X, Y) and\n // bottom-right one is at (X + width, Y + height).\n\n // If leftX is 4.321 then it's rounded to 4.\n // If width is 10.432 then it's rounded to 11 because\n // rightX = leftX + width = 14.753 which is rounded to 15\n // so after rounding the total width is 11 (15 - 4).\n // It's why we can't just floor/ceil uniformly, it just depends\n // on the values we've.\n\n const tlX = destX * a + tx;\n const rTlX = Math.round(tlX);\n const tlY = destY * d + ty;\n const rTlY = Math.round(tlY);\n const brX = (destX + destW) * a + tx;\n\n // Some pdf contains images with 1x1 images so in case of 0-width after\n // scaling we must fallback on 1 to be sure there is something.\n const rWidth = Math.abs(Math.round(brX) - rTlX) || 1;\n const brY = (destY + destH) * d + ty;\n const rHeight = Math.abs(Math.round(brY) - rTlY) || 1;\n\n // We must apply a transformation in order to apply it on the image itself.\n // For example if a == 1 && d == -1, it means that the image itself is\n // mirrored w.r.t. the x-axis.\n ctx.setTransform(Math.sign(a), 0, 0, Math.sign(d), rTlX, rTlY);\n ctx.drawImage(srcImg, srcX, srcY, srcW, srcH, 0, 0, rWidth, rHeight);\n ctx.setTransform(a, b, c, d, tx, ty);\n\n return [rWidth, rHeight];\n }\n\n if (a === 0 && d === 0) {\n // This path is taken in issue9462.pdf (page 3).\n const tlX = destY * c + tx;\n const rTlX = Math.round(tlX);\n const tlY = destX * b + ty;\n const rTlY = Math.round(tlY);\n const brX = (destY + destH) * c + tx;\n const rWidth = Math.abs(Math.round(brX) - rTlX) || 1;\n const brY = (destX + destW) * b + ty;\n const rHeight = Math.abs(Math.round(brY) - rTlY) || 1;\n\n ctx.setTransform(0, Math.sign(b), Math.sign(c), 0, rTlX, rTlY);\n ctx.drawImage(srcImg, srcX, srcY, srcW, srcH, 0, 0, rHeight, rWidth);\n ctx.setTransform(a, b, c, d, tx, ty);\n\n return [rHeight, rWidth];\n }\n\n // Not a scale matrix so let the render handle the case without rounding.\n ctx.drawImage(srcImg, srcX, srcY, srcW, srcH, destX, destY, destW, destH);\n\n const scaleX = Math.hypot(a, b);\n const scaleY = Math.hypot(c, d);\n return [scaleX * destW, scaleY * destH];\n}\n\nfunction compileType3Glyph(imgData) {\n const { width, height } = imgData;\n if (width > MAX_SIZE_TO_COMPILE || height > MAX_SIZE_TO_COMPILE) {\n return null;\n }\n\n const POINT_TO_PROCESS_LIMIT = 1000;\n const POINT_TYPES = new Uint8Array([\n 0, 2, 4, 0, 1, 0, 5, 4, 8, 10, 0, 8, 0, 2, 1, 0,\n ]);\n\n const width1 = width + 1;\n let points = new Uint8Array(width1 * (height + 1));\n let i, j, j0;\n\n // decodes bit-packed mask data\n const lineSize = (width + 7) & ~7;\n let data = new Uint8Array(lineSize * height),\n pos = 0;\n for (const elem of imgData.data) {\n let mask = 128;\n while (mask > 0) {\n data[pos++] = elem & mask ? 0 : 255;\n mask >>= 1;\n }\n }\n\n // finding interesting points: every point is located between mask pixels,\n // so there will be points of the (width + 1)x(height + 1) grid. Every point\n // will have flags assigned based on neighboring mask pixels:\n // 4 | 8\n // --P--\n // 2 | 1\n // We are interested only in points with the flags:\n // - outside corners: 1, 2, 4, 8;\n // - inside corners: 7, 11, 13, 14;\n // - and, intersections: 5, 10.\n let count = 0;\n pos = 0;\n if (data[pos] !== 0) {\n points[0] = 1;\n ++count;\n }\n for (j = 1; j < width; j++) {\n if (data[pos] !== data[pos + 1]) {\n points[j] = data[pos] ? 2 : 1;\n ++count;\n }\n pos++;\n }\n if (data[pos] !== 0) {\n points[j] = 2;\n ++count;\n }\n for (i = 1; i < height; i++) {\n pos = i * lineSize;\n j0 = i * width1;\n if (data[pos - lineSize] !== data[pos]) {\n points[j0] = data[pos] ? 1 : 8;\n ++count;\n }\n // 'sum' is the position of the current pixel configuration in the 'TYPES'\n // array (in order 8-1-2-4, so we can use '>>2' to shift the column).\n let sum = (data[pos] ? 4 : 0) + (data[pos - lineSize] ? 8 : 0);\n for (j = 1; j < width; j++) {\n sum =\n (sum >> 2) +\n (data[pos + 1] ? 4 : 0) +\n (data[pos - lineSize + 1] ? 8 : 0);\n if (POINT_TYPES[sum]) {\n points[j0 + j] = POINT_TYPES[sum];\n ++count;\n }\n pos++;\n }\n if (data[pos - lineSize] !== data[pos]) {\n points[j0 + j] = data[pos] ? 2 : 4;\n ++count;\n }\n\n if (count > POINT_TO_PROCESS_LIMIT) {\n return null;\n }\n }\n\n pos = lineSize * (height - 1);\n j0 = i * width1;\n if (data[pos] !== 0) {\n points[j0] = 8;\n ++count;\n }\n for (j = 1; j < width; j++) {\n if (data[pos] !== data[pos + 1]) {\n points[j0 + j] = data[pos] ? 4 : 8;\n ++count;\n }\n pos++;\n }\n if (data[pos] !== 0) {\n points[j0 + j] = 4;\n ++count;\n }\n if (count > POINT_TO_PROCESS_LIMIT) {\n return null;\n }\n\n // building outlines\n const steps = new Int32Array([0, width1, -1, 0, -width1, 0, 0, 0, 1]);\n const path = new Path2D();\n\n for (i = 0; count && i <= height; i++) {\n let p = i * width1;\n const end = p + width;\n while (p < end && !points[p]) {\n p++;\n }\n if (p === end) {\n continue;\n }\n path.moveTo(p % width1, i);\n\n const p0 = p;\n let type = points[p];\n do {\n const step = steps[type];\n do {\n p += step;\n } while (!points[p]);\n\n const pp = points[p];\n if (pp !== 5 && pp !== 10) {\n // set new direction\n type = pp;\n // delete mark\n points[p] = 0;\n } else {\n // type is 5 or 10, ie, a crossing\n // set new direction\n type = pp & ((0x33 * type) >> 4);\n // set new type for \"future hit\"\n points[p] &= (type >> 2) | (type << 2);\n }\n path.lineTo(p % width1, (p / width1) | 0);\n\n if (!points[p]) {\n --count;\n }\n } while (p0 !== p);\n --i;\n }\n\n // Immediately release the, potentially large, `Uint8Array`s after parsing.\n data = null;\n points = null;\n\n const drawOutline = function (c) {\n c.save();\n // the path shall be painted in [0..1]x[0..1] space\n c.scale(1 / width, -1 / height);\n c.translate(0, -height);\n c.fill(path);\n c.beginPath();\n c.restore();\n };\n\n return drawOutline;\n}\n\nclass CanvasExtraState {\n constructor(width, height) {\n // Are soft masks and alpha values shapes or opacities?\n this.alphaIsShape = false;\n this.fontSize = 0;\n this.fontSizeScale = 1;\n this.textMatrix = IDENTITY_MATRIX;\n this.textMatrixScale = 1;\n this.fontMatrix = FONT_IDENTITY_MATRIX;\n this.leading = 0;\n // Current point (in user coordinates)\n this.x = 0;\n this.y = 0;\n // Start of text line (in text coordinates)\n this.lineX = 0;\n this.lineY = 0;\n // Character and word spacing\n this.charSpacing = 0;\n this.wordSpacing = 0;\n this.textHScale = 1;\n this.textRenderingMode = TextRenderingMode.FILL;\n this.textRise = 0;\n // Default fore and background colors\n this.fillColor = \"#000000\";\n this.strokeColor = \"#000000\";\n this.patternFill = false;\n // Note: fill alpha applies to all non-stroking operations\n this.fillAlpha = 1;\n this.strokeAlpha = 1;\n this.lineWidth = 1;\n this.activeSMask = null;\n this.transferMaps = \"none\";\n\n this.startNewPathAndClipBox([0, 0, width, height]);\n }\n\n clone() {\n const clone = Object.create(this);\n clone.clipBox = this.clipBox.slice();\n return clone;\n }\n\n setCurrentPoint(x, y) {\n this.x = x;\n this.y = y;\n }\n\n updatePathMinMax(transform, x, y) {\n [x, y] = Util.applyTransform([x, y], transform);\n this.minX = Math.min(this.minX, x);\n this.minY = Math.min(this.minY, y);\n this.maxX = Math.max(this.maxX, x);\n this.maxY = Math.max(this.maxY, y);\n }\n\n updateRectMinMax(transform, rect) {\n const p1 = Util.applyTransform(rect, transform);\n const p2 = Util.applyTransform(rect.slice(2), transform);\n const p3 = Util.applyTransform([rect[0], rect[3]], transform);\n const p4 = Util.applyTransform([rect[2], rect[1]], transform);\n\n this.minX = Math.min(this.minX, p1[0], p2[0], p3[0], p4[0]);\n this.minY = Math.min(this.minY, p1[1], p2[1], p3[1], p4[1]);\n this.maxX = Math.max(this.maxX, p1[0], p2[0], p3[0], p4[0]);\n this.maxY = Math.max(this.maxY, p1[1], p2[1], p3[1], p4[1]);\n }\n\n updateScalingPathMinMax(transform, minMax) {\n Util.scaleMinMax(transform, minMax);\n this.minX = Math.min(this.minX, minMax[0]);\n this.minY = Math.min(this.minY, minMax[1]);\n this.maxX = Math.max(this.maxX, minMax[2]);\n this.maxY = Math.max(this.maxY, minMax[3]);\n }\n\n updateCurvePathMinMax(transform, x0, y0, x1, y1, x2, y2, x3, y3, minMax) {\n const box = Util.bezierBoundingBox(x0, y0, x1, y1, x2, y2, x3, y3, minMax);\n if (minMax) {\n return;\n }\n this.updateRectMinMax(transform, box);\n }\n\n getPathBoundingBox(pathType = PathType.FILL, transform = null) {\n const box = [this.minX, this.minY, this.maxX, this.maxY];\n if (pathType === PathType.STROKE) {\n if (!transform) {\n unreachable(\"Stroke bounding box must include transform.\");\n }\n // Stroked paths can be outside of the path bounding box by 1/2 the line\n // width.\n const scale = Util.singularValueDecompose2dScale(transform);\n const xStrokePad = (scale[0] * this.lineWidth) / 2;\n const yStrokePad = (scale[1] * this.lineWidth) / 2;\n box[0] -= xStrokePad;\n box[1] -= yStrokePad;\n box[2] += xStrokePad;\n box[3] += yStrokePad;\n }\n return box;\n }\n\n updateClipFromPath() {\n const intersect = Util.intersect(this.clipBox, this.getPathBoundingBox());\n this.startNewPathAndClipBox(intersect || [0, 0, 0, 0]);\n }\n\n isEmptyClip() {\n return this.minX === Infinity;\n }\n\n startNewPathAndClipBox(box) {\n this.clipBox = box;\n this.minX = Infinity;\n this.minY = Infinity;\n this.maxX = 0;\n this.maxY = 0;\n }\n\n getClippedPathBoundingBox(pathType = PathType.FILL, transform = null) {\n return Util.intersect(\n this.clipBox,\n this.getPathBoundingBox(pathType, transform)\n );\n }\n}\n\nfunction putBinaryImageData(ctx, imgData) {\n if (typeof ImageData !== \"undefined\" && imgData instanceof ImageData) {\n ctx.putImageData(imgData, 0, 0);\n return;\n }\n\n // Put the image data to the canvas in chunks, rather than putting the\n // whole image at once. This saves JS memory, because the ImageData object\n // is smaller. It also possibly saves C++ memory within the implementation\n // of putImageData(). (E.g. in Firefox we make two short-lived copies of\n // the data passed to putImageData()). |n| shouldn't be too small, however,\n // because too many putImageData() calls will slow things down.\n //\n // Note: as written, if the last chunk is partial, the putImageData() call\n // will (conceptually) put pixels past the bounds of the canvas. But\n // that's ok; any such pixels are ignored.\n\n const height = imgData.height,\n width = imgData.width;\n const partialChunkHeight = height % FULL_CHUNK_HEIGHT;\n const fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT;\n const totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1;\n\n const chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT);\n let srcPos = 0,\n destPos;\n const src = imgData.data;\n const dest = chunkImgData.data;\n let i, j, thisChunkHeight, elemsInThisChunk;\n\n // There are multiple forms in which the pixel data can be passed, and\n // imgData.kind tells us which one this is.\n if (imgData.kind === ImageKind.GRAYSCALE_1BPP) {\n // Grayscale, 1 bit per pixel (i.e. black-and-white).\n const srcLength = src.byteLength;\n const dest32 = new Uint32Array(dest.buffer, 0, dest.byteLength >> 2);\n const dest32DataLength = dest32.length;\n const fullSrcDiff = (width + 7) >> 3;\n const white = 0xffffffff;\n const black = FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff;\n\n for (i = 0; i < totalChunks; i++) {\n thisChunkHeight = i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight;\n destPos = 0;\n for (j = 0; j < thisChunkHeight; j++) {\n const srcDiff = srcLength - srcPos;\n let k = 0;\n const kEnd = srcDiff > fullSrcDiff ? width : srcDiff * 8 - 7;\n const kEndUnrolled = kEnd & ~7;\n let mask = 0;\n let srcByte = 0;\n for (; k < kEndUnrolled; k += 8) {\n srcByte = src[srcPos++];\n dest32[destPos++] = srcByte & 128 ? white : black;\n dest32[destPos++] = srcByte & 64 ? white : black;\n dest32[destPos++] = srcByte & 32 ? white : black;\n dest32[destPos++] = srcByte & 16 ? white : black;\n dest32[destPos++] = srcByte & 8 ? white : black;\n dest32[destPos++] = srcByte & 4 ? white : black;\n dest32[destPos++] = srcByte & 2 ? white : black;\n dest32[destPos++] = srcByte & 1 ? white : black;\n }\n for (; k < kEnd; k++) {\n if (mask === 0) {\n srcByte = src[srcPos++];\n mask = 128;\n }\n\n dest32[destPos++] = srcByte & mask ? white : black;\n mask >>= 1;\n }\n }\n // We ran out of input. Make all remaining pixels transparent.\n while (destPos < dest32DataLength) {\n dest32[destPos++] = 0;\n }\n\n ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);\n }\n } else if (imgData.kind === ImageKind.RGBA_32BPP) {\n // RGBA, 32-bits per pixel.\n j = 0;\n elemsInThisChunk = width * FULL_CHUNK_HEIGHT * 4;\n for (i = 0; i < fullChunks; i++) {\n dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk));\n srcPos += elemsInThisChunk;\n\n ctx.putImageData(chunkImgData, 0, j);\n j += FULL_CHUNK_HEIGHT;\n }\n if (i < totalChunks) {\n elemsInThisChunk = width * partialChunkHeight * 4;\n dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk));\n\n ctx.putImageData(chunkImgData, 0, j);\n }\n } else if (imgData.kind === ImageKind.RGB_24BPP) {\n // RGB, 24-bits per pixel.\n thisChunkHeight = FULL_CHUNK_HEIGHT;\n elemsInThisChunk = width * thisChunkHeight;\n for (i = 0; i < totalChunks; i++) {\n if (i >= fullChunks) {\n thisChunkHeight = partialChunkHeight;\n elemsInThisChunk = width * thisChunkHeight;\n }\n\n destPos = 0;\n for (j = elemsInThisChunk; j--; ) {\n dest[destPos++] = src[srcPos++];\n dest[destPos++] = src[srcPos++];\n dest[destPos++] = src[srcPos++];\n dest[destPos++] = 255;\n }\n\n ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);\n }\n } else {\n throw new Error(`bad image kind: ${imgData.kind}`);\n }\n}\n\nfunction putBinaryImageMask(ctx, imgData) {\n if (imgData.bitmap) {\n // The bitmap has been created in the worker.\n ctx.drawImage(imgData.bitmap, 0, 0);\n return;\n }\n\n // Slow path: OffscreenCanvas isn't available in the worker.\n const height = imgData.height,\n width = imgData.width;\n const partialChunkHeight = height % FULL_CHUNK_HEIGHT;\n const fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT;\n const totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1;\n\n const chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT);\n let srcPos = 0;\n const src = imgData.data;\n const dest = chunkImgData.data;\n\n for (let i = 0; i < totalChunks; i++) {\n const thisChunkHeight =\n i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight;\n\n // Expand the mask so it can be used by the canvas. Any required\n // inversion has already been handled.\n\n ({ srcPos } = convertBlackAndWhiteToRGBA({\n src,\n srcPos,\n dest,\n width,\n height: thisChunkHeight,\n nonBlackColor: 0,\n }));\n\n ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);\n }\n}\n\nfunction copyCtxState(sourceCtx, destCtx) {\n const properties = [\n \"strokeStyle\",\n \"fillStyle\",\n \"fillRule\",\n \"globalAlpha\",\n \"lineWidth\",\n \"lineCap\",\n \"lineJoin\",\n \"miterLimit\",\n \"globalCompositeOperation\",\n \"font\",\n \"filter\",\n ];\n for (const property of properties) {\n if (sourceCtx[property] !== undefined) {\n destCtx[property] = sourceCtx[property];\n }\n }\n if (sourceCtx.setLineDash !== undefined) {\n destCtx.setLineDash(sourceCtx.getLineDash());\n destCtx.lineDashOffset = sourceCtx.lineDashOffset;\n }\n}\n\nfunction resetCtxToDefault(ctx) {\n ctx.strokeStyle = ctx.fillStyle = \"#000000\";\n ctx.fillRule = \"nonzero\";\n ctx.globalAlpha = 1;\n ctx.lineWidth = 1;\n ctx.lineCap = \"butt\";\n ctx.lineJoin = \"miter\";\n ctx.miterLimit = 10;\n ctx.globalCompositeOperation = \"source-over\";\n ctx.font = \"10px sans-serif\";\n if (ctx.setLineDash !== undefined) {\n ctx.setLineDash([]);\n ctx.lineDashOffset = 0;\n }\n if (\n (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n !isNodeJS\n ) {\n const { filter } = ctx;\n if (filter !== \"none\" && filter !== \"\") {\n ctx.filter = \"none\";\n }\n }\n}\n\nfunction getImageSmoothingEnabled(transform, interpolate) {\n // In section 8.9.5.3 of the PDF spec, it's mentioned that the interpolate\n // flag should be used when the image is upscaled.\n // In Firefox, smoothing is always used when downscaling images (bug 1360415).\n\n if (interpolate) {\n return true;\n }\n\n const scale = Util.singularValueDecompose2dScale(transform);\n // Round to a 32bit float so that `<=` check below will pass for numbers that\n // are very close, but not exactly the same 64bit floats.\n scale[0] = Math.fround(scale[0]);\n scale[1] = Math.fround(scale[1]);\n const actualScale = Math.fround(\n (globalThis.devicePixelRatio || 1) * PixelsPerInch.PDF_TO_CSS_UNITS\n );\n return scale[0] <= actualScale && scale[1] <= actualScale;\n}\n\nconst LINE_CAP_STYLES = [\"butt\", \"round\", \"square\"];\nconst LINE_JOIN_STYLES = [\"miter\", \"round\", \"bevel\"];\nconst NORMAL_CLIP = {};\nconst EO_CLIP = {};\n\nclass CanvasGraphics {\n constructor(\n canvasCtx,\n commonObjs,\n objs,\n canvasFactory,\n filterFactory,\n { optionalContentConfig, markedContentStack = null },\n annotationCanvasMap,\n pageColors\n ) {\n this.ctx = canvasCtx;\n this.current = new CanvasExtraState(\n this.ctx.canvas.width,\n this.ctx.canvas.height\n );\n this.stateStack = [];\n this.pendingClip = null;\n this.pendingEOFill = false;\n this.res = null;\n this.xobjs = null;\n this.commonObjs = commonObjs;\n this.objs = objs;\n this.canvasFactory = canvasFactory;\n this.filterFactory = filterFactory;\n this.groupStack = [];\n this.processingType3 = null;\n // Patterns are painted relative to the initial page/form transform, see\n // PDF spec 8.7.2 NOTE 1.\n this.baseTransform = null;\n this.baseTransformStack = [];\n this.groupLevel = 0;\n this.smaskStack = [];\n this.smaskCounter = 0;\n this.tempSMask = null;\n this.suspendedCtx = null;\n this.contentVisible = true;\n this.markedContentStack = markedContentStack || [];\n this.optionalContentConfig = optionalContentConfig;\n this.cachedCanvases = new CachedCanvases(this.canvasFactory);\n this.cachedPatterns = new Map();\n this.annotationCanvasMap = annotationCanvasMap;\n this.viewportScale = 1;\n this.outputScaleX = 1;\n this.outputScaleY = 1;\n this.pageColors = pageColors;\n\n this._cachedScaleForStroking = [-1, 0];\n this._cachedGetSinglePixelWidth = null;\n this._cachedBitmapsMap = new Map();\n }\n\n getObject(data, fallback = null) {\n if (typeof data === \"string\") {\n return data.startsWith(\"g_\")\n ? this.commonObjs.get(data)\n : this.objs.get(data);\n }\n return fallback;\n }\n\n beginDrawing({\n transform,\n viewport,\n transparency = false,\n background = null,\n }) {\n // For pdfs that use blend modes we have to clear the canvas else certain\n // blend modes can look wrong since we'd be blending with a white\n // backdrop. The problem with a transparent backdrop though is we then\n // don't get sub pixel anti aliasing on text, creating temporary\n // transparent canvas when we have blend modes.\n const width = this.ctx.canvas.width;\n const height = this.ctx.canvas.height;\n\n const savedFillStyle = this.ctx.fillStyle;\n this.ctx.fillStyle = background || \"#ffffff\";\n this.ctx.fillRect(0, 0, width, height);\n this.ctx.fillStyle = savedFillStyle;\n\n if (transparency) {\n const transparentCanvas = this.cachedCanvases.getCanvas(\n \"transparent\",\n width,\n height\n );\n this.compositeCtx = this.ctx;\n this.transparentCanvas = transparentCanvas.canvas;\n this.ctx = transparentCanvas.context;\n this.ctx.save();\n // The transform can be applied before rendering, transferring it to\n // the new canvas.\n this.ctx.transform(...getCurrentTransform(this.compositeCtx));\n }\n\n this.ctx.save();\n resetCtxToDefault(this.ctx);\n if (transform) {\n this.ctx.transform(...transform);\n this.outputScaleX = transform[0];\n this.outputScaleY = transform[0];\n }\n this.ctx.transform(...viewport.transform);\n this.viewportScale = viewport.scale;\n\n this.baseTransform = getCurrentTransform(this.ctx);\n }\n\n executeOperatorList(\n operatorList,\n executionStartIdx,\n continueCallback,\n stepper\n ) {\n const argsArray = operatorList.argsArray;\n const fnArray = operatorList.fnArray;\n let i = executionStartIdx || 0;\n const argsArrayLen = argsArray.length;\n\n // Sometimes the OperatorList to execute is empty.\n if (argsArrayLen === i) {\n return i;\n }\n\n const chunkOperations =\n argsArrayLen - i > EXECUTION_STEPS &&\n typeof continueCallback === \"function\";\n const endTime = chunkOperations ? Date.now() + EXECUTION_TIME : 0;\n let steps = 0;\n\n const commonObjs = this.commonObjs;\n const objs = this.objs;\n let fnId;\n\n while (true) {\n if (stepper !== undefined && i === stepper.nextBreakPoint) {\n stepper.breakIt(i, continueCallback);\n return i;\n }\n\n fnId = fnArray[i];\n\n if (fnId !== OPS.dependency) {\n // eslint-disable-next-line prefer-spread\n this[fnId].apply(this, argsArray[i]);\n } else {\n for (const depObjId of argsArray[i]) {\n const objsPool = depObjId.startsWith(\"g_\") ? commonObjs : objs;\n\n // If the promise isn't resolved yet, add the continueCallback\n // to the promise and bail out.\n if (!objsPool.has(depObjId)) {\n objsPool.get(depObjId, continueCallback);\n return i;\n }\n }\n }\n\n i++;\n\n // If the entire operatorList was executed, stop as were done.\n if (i === argsArrayLen) {\n return i;\n }\n\n // If the execution took longer then a certain amount of time and\n // `continueCallback` is specified, interrupt the execution.\n if (chunkOperations && ++steps > EXECUTION_STEPS) {\n if (Date.now() > endTime) {\n continueCallback();\n return i;\n }\n steps = 0;\n }\n\n // If the operatorList isn't executed completely yet OR the execution\n // time was short enough, do another execution round.\n }\n }\n\n #restoreInitialState() {\n // Finishing all opened operations such as SMask group painting.\n while (this.stateStack.length || this.inSMaskMode) {\n this.restore();\n }\n\n this.ctx.restore();\n\n if (this.transparentCanvas) {\n this.ctx = this.compositeCtx;\n this.ctx.save();\n this.ctx.setTransform(1, 0, 0, 1, 0, 0); // Avoid apply transform twice\n this.ctx.drawImage(this.transparentCanvas, 0, 0);\n this.ctx.restore();\n this.transparentCanvas = null;\n }\n }\n\n endDrawing() {\n this.#restoreInitialState();\n\n this.cachedCanvases.clear();\n this.cachedPatterns.clear();\n\n for (const cache of this._cachedBitmapsMap.values()) {\n for (const canvas of cache.values()) {\n if (\n typeof HTMLCanvasElement !== \"undefined\" &&\n canvas instanceof HTMLCanvasElement\n ) {\n canvas.width = canvas.height = 0;\n }\n }\n cache.clear();\n }\n this._cachedBitmapsMap.clear();\n this.#drawFilter();\n }\n\n #drawFilter() {\n if (this.pageColors) {\n const hcmFilterId = this.filterFactory.addHCMFilter(\n this.pageColors.foreground,\n this.pageColors.background\n );\n if (hcmFilterId !== \"none\") {\n const savedFilter = this.ctx.filter;\n this.ctx.filter = hcmFilterId;\n this.ctx.drawImage(this.ctx.canvas, 0, 0);\n this.ctx.filter = savedFilter;\n }\n }\n }\n\n _scaleImage(img, inverseTransform) {\n // Vertical or horizontal scaling shall not be more than 2 to not lose the\n // pixels during drawImage operation, painting on the temporary canvas(es)\n // that are twice smaller in size.\n const width = img.width;\n const height = img.height;\n let widthScale = Math.max(\n Math.hypot(inverseTransform[0], inverseTransform[1]),\n 1\n );\n let heightScale = Math.max(\n Math.hypot(inverseTransform[2], inverseTransform[3]),\n 1\n );\n\n let paintWidth = width,\n paintHeight = height;\n let tmpCanvasId = \"prescale1\";\n let tmpCanvas, tmpCtx;\n while (\n (widthScale > 2 && paintWidth > 1) ||\n (heightScale > 2 && paintHeight > 1)\n ) {\n let newWidth = paintWidth,\n newHeight = paintHeight;\n if (widthScale > 2 && paintWidth > 1) {\n // See bug 1820511 (Windows specific bug).\n // TODO: once the above bug is fixed we could revert to:\n // newWidth = Math.ceil(paintWidth / 2);\n newWidth =\n paintWidth >= 16384\n ? Math.floor(paintWidth / 2) - 1 || 1\n : Math.ceil(paintWidth / 2);\n widthScale /= paintWidth / newWidth;\n }\n if (heightScale > 2 && paintHeight > 1) {\n // TODO: see the comment above.\n newHeight =\n paintHeight >= 16384\n ? Math.floor(paintHeight / 2) - 1 || 1\n : Math.ceil(paintHeight) / 2;\n heightScale /= paintHeight / newHeight;\n }\n tmpCanvas = this.cachedCanvases.getCanvas(\n tmpCanvasId,\n newWidth,\n newHeight\n );\n tmpCtx = tmpCanvas.context;\n tmpCtx.clearRect(0, 0, newWidth, newHeight);\n tmpCtx.drawImage(\n img,\n 0,\n 0,\n paintWidth,\n paintHeight,\n 0,\n 0,\n newWidth,\n newHeight\n );\n img = tmpCanvas.canvas;\n paintWidth = newWidth;\n paintHeight = newHeight;\n tmpCanvasId = tmpCanvasId === \"prescale1\" ? \"prescale2\" : \"prescale1\";\n }\n return {\n img,\n paintWidth,\n paintHeight,\n };\n }\n\n _createMaskCanvas(img) {\n const ctx = this.ctx;\n const { width, height } = img;\n const fillColor = this.current.fillColor;\n const isPatternFill = this.current.patternFill;\n const currentTransform = getCurrentTransform(ctx);\n\n let cache, cacheKey, scaled, maskCanvas;\n if ((img.bitmap || img.data) && img.count > 1) {\n const mainKey = img.bitmap || img.data.buffer;\n // We're reusing the same image several times, so we can cache it.\n // In case we've a pattern fill we just keep the scaled version of\n // the image.\n // Only the scaling part matters, the translation part is just used\n // to compute offsets (but not when filling patterns see #15573).\n // TODO: handle the case of a pattern fill if it's possible.\n cacheKey = JSON.stringify(\n isPatternFill\n ? currentTransform\n : [currentTransform.slice(0, 4), fillColor]\n );\n\n cache = this._cachedBitmapsMap.get(mainKey);\n if (!cache) {\n cache = new Map();\n this._cachedBitmapsMap.set(mainKey, cache);\n }\n const cachedImage = cache.get(cacheKey);\n if (cachedImage && !isPatternFill) {\n const offsetX = Math.round(\n Math.min(currentTransform[0], currentTransform[2]) +\n currentTransform[4]\n );\n const offsetY = Math.round(\n Math.min(currentTransform[1], currentTransform[3]) +\n currentTransform[5]\n );\n return {\n canvas: cachedImage,\n offsetX,\n offsetY,\n };\n }\n scaled = cachedImage;\n }\n\n if (!scaled) {\n maskCanvas = this.cachedCanvases.getCanvas(\"maskCanvas\", width, height);\n putBinaryImageMask(maskCanvas.context, img);\n }\n\n // Create the mask canvas at the size it will be drawn at and also set\n // its transform to match the current transform so if there are any\n // patterns applied they will be applied relative to the correct\n // transform.\n\n let maskToCanvas = Util.transform(currentTransform, [\n 1 / width,\n 0,\n 0,\n -1 / height,\n 0,\n 0,\n ]);\n maskToCanvas = Util.transform(maskToCanvas, [1, 0, 0, 1, 0, -height]);\n const [minX, minY, maxX, maxY] = Util.getAxialAlignedBoundingBox(\n [0, 0, width, height],\n maskToCanvas\n );\n const drawnWidth = Math.round(maxX - minX) || 1;\n const drawnHeight = Math.round(maxY - minY) || 1;\n const fillCanvas = this.cachedCanvases.getCanvas(\n \"fillCanvas\",\n drawnWidth,\n drawnHeight\n );\n const fillCtx = fillCanvas.context;\n\n // The offset will be the top-left cordinate mask.\n // If objToCanvas is [a,b,c,d,e,f] then:\n // - offsetX = min(a, c) + e\n // - offsetY = min(b, d) + f\n const offsetX = minX;\n const offsetY = minY;\n fillCtx.translate(-offsetX, -offsetY);\n fillCtx.transform(...maskToCanvas);\n\n if (!scaled) {\n // Pre-scale if needed to improve image smoothing.\n scaled = this._scaleImage(\n maskCanvas.canvas,\n getCurrentTransformInverse(fillCtx)\n );\n scaled = scaled.img;\n if (cache && isPatternFill) {\n cache.set(cacheKey, scaled);\n }\n }\n\n fillCtx.imageSmoothingEnabled = getImageSmoothingEnabled(\n getCurrentTransform(fillCtx),\n img.interpolate\n );\n\n drawImageAtIntegerCoords(\n fillCtx,\n scaled,\n 0,\n 0,\n scaled.width,\n scaled.height,\n 0,\n 0,\n width,\n height\n );\n fillCtx.globalCompositeOperation = \"source-in\";\n\n const inverse = Util.transform(getCurrentTransformInverse(fillCtx), [\n 1,\n 0,\n 0,\n 1,\n -offsetX,\n -offsetY,\n ]);\n fillCtx.fillStyle = isPatternFill\n ? fillColor.getPattern(ctx, this, inverse, PathType.FILL)\n : fillColor;\n\n fillCtx.fillRect(0, 0, width, height);\n\n if (cache && !isPatternFill) {\n // The fill canvas is put in the cache associated to the mask image\n // so we must remove from the cached canvas: it mustn't be used again.\n this.cachedCanvases.delete(\"fillCanvas\");\n cache.set(cacheKey, fillCanvas.canvas);\n }\n\n // Round the offsets to avoid drawing fractional pixels.\n return {\n canvas: fillCanvas.canvas,\n offsetX: Math.round(offsetX),\n offsetY: Math.round(offsetY),\n };\n }\n\n // Graphics state\n setLineWidth(width) {\n if (width !== this.current.lineWidth) {\n this._cachedScaleForStroking[0] = -1;\n }\n this.current.lineWidth = width;\n this.ctx.lineWidth = width;\n }\n\n setLineCap(style) {\n this.ctx.lineCap = LINE_CAP_STYLES[style];\n }\n\n setLineJoin(style) {\n this.ctx.lineJoin = LINE_JOIN_STYLES[style];\n }\n\n setMiterLimit(limit) {\n this.ctx.miterLimit = limit;\n }\n\n setDash(dashArray, dashPhase) {\n const ctx = this.ctx;\n if (ctx.setLineDash !== undefined) {\n ctx.setLineDash(dashArray);\n ctx.lineDashOffset = dashPhase;\n }\n }\n\n setRenderingIntent(intent) {\n // This operation is ignored since we haven't found a use case for it yet.\n }\n\n setFlatness(flatness) {\n // This operation is ignored since we haven't found a use case for it yet.\n }\n\n setGState(states) {\n for (const [key, value] of states) {\n switch (key) {\n case \"LW\":\n this.setLineWidth(value);\n break;\n case \"LC\":\n this.setLineCap(value);\n break;\n case \"LJ\":\n this.setLineJoin(value);\n break;\n case \"ML\":\n this.setMiterLimit(value);\n break;\n case \"D\":\n this.setDash(value[0], value[1]);\n break;\n case \"RI\":\n this.setRenderingIntent(value);\n break;\n case \"FL\":\n this.setFlatness(value);\n break;\n case \"Font\":\n this.setFont(value[0], value[1]);\n break;\n case \"CA\":\n this.current.strokeAlpha = value;\n break;\n case \"ca\":\n this.current.fillAlpha = value;\n this.ctx.globalAlpha = value;\n break;\n case \"BM\":\n this.ctx.globalCompositeOperation = value;\n break;\n case \"SMask\":\n this.current.activeSMask = value ? this.tempSMask : null;\n this.tempSMask = null;\n this.checkSMaskState();\n break;\n case \"TR\":\n this.ctx.filter = this.current.transferMaps =\n this.filterFactory.addFilter(value);\n break;\n }\n }\n }\n\n get inSMaskMode() {\n return !!this.suspendedCtx;\n }\n\n checkSMaskState() {\n const inSMaskMode = this.inSMaskMode;\n if (this.current.activeSMask && !inSMaskMode) {\n this.beginSMaskMode();\n } else if (!this.current.activeSMask && inSMaskMode) {\n this.endSMaskMode();\n }\n // Else, the state is okay and nothing needs to be done.\n }\n\n /**\n * Soft mask mode takes the current main drawing canvas and replaces it with\n * a temporary canvas. Any drawing operations that happen on the temporary\n * canvas need to be composed with the main canvas that was suspended (see\n * `compose()`). The temporary canvas also duplicates many of its operations\n * on the suspended canvas to keep them in sync, so that when the soft mask\n * mode ends any clipping paths or transformations will still be active and in\n * the right order on the canvas' graphics state stack.\n */\n beginSMaskMode() {\n if (this.inSMaskMode) {\n throw new Error(\"beginSMaskMode called while already in smask mode\");\n }\n const drawnWidth = this.ctx.canvas.width;\n const drawnHeight = this.ctx.canvas.height;\n const cacheId = \"smaskGroupAt\" + this.groupLevel;\n const scratchCanvas = this.cachedCanvases.getCanvas(\n cacheId,\n drawnWidth,\n drawnHeight\n );\n this.suspendedCtx = this.ctx;\n this.ctx = scratchCanvas.context;\n const ctx = this.ctx;\n ctx.setTransform(...getCurrentTransform(this.suspendedCtx));\n copyCtxState(this.suspendedCtx, ctx);\n mirrorContextOperations(ctx, this.suspendedCtx);\n\n this.setGState([\n [\"BM\", \"source-over\"],\n [\"ca\", 1],\n [\"CA\", 1],\n ]);\n }\n\n endSMaskMode() {\n if (!this.inSMaskMode) {\n throw new Error(\"endSMaskMode called while not in smask mode\");\n }\n // The soft mask is done, now restore the suspended canvas as the main\n // drawing canvas.\n this.ctx._removeMirroring();\n copyCtxState(this.ctx, this.suspendedCtx);\n this.ctx = this.suspendedCtx;\n\n this.suspendedCtx = null;\n }\n\n compose(dirtyBox) {\n if (!this.current.activeSMask) {\n return;\n }\n\n if (!dirtyBox) {\n dirtyBox = [0, 0, this.ctx.canvas.width, this.ctx.canvas.height];\n } else {\n dirtyBox[0] = Math.floor(dirtyBox[0]);\n dirtyBox[1] = Math.floor(dirtyBox[1]);\n dirtyBox[2] = Math.ceil(dirtyBox[2]);\n dirtyBox[3] = Math.ceil(dirtyBox[3]);\n }\n const smask = this.current.activeSMask;\n const suspendedCtx = this.suspendedCtx;\n\n this.composeSMask(suspendedCtx, smask, this.ctx, dirtyBox);\n // Whatever was drawn has been moved to the suspended canvas, now clear it\n // out of the current canvas.\n this.ctx.save();\n this.ctx.setTransform(1, 0, 0, 1, 0, 0);\n this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height);\n this.ctx.restore();\n }\n\n composeSMask(ctx, smask, layerCtx, layerBox) {\n const layerOffsetX = layerBox[0];\n const layerOffsetY = layerBox[1];\n const layerWidth = layerBox[2] - layerOffsetX;\n const layerHeight = layerBox[3] - layerOffsetY;\n if (layerWidth === 0 || layerHeight === 0) {\n return;\n }\n this.genericComposeSMask(\n smask.context,\n layerCtx,\n layerWidth,\n layerHeight,\n smask.subtype,\n smask.backdrop,\n smask.transferMap,\n layerOffsetX,\n layerOffsetY,\n smask.offsetX,\n smask.offsetY\n );\n ctx.save();\n ctx.globalAlpha = 1;\n ctx.globalCompositeOperation = \"source-over\";\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.drawImage(layerCtx.canvas, 0, 0);\n ctx.restore();\n }\n\n genericComposeSMask(\n maskCtx,\n layerCtx,\n width,\n height,\n subtype,\n backdrop,\n transferMap,\n layerOffsetX,\n layerOffsetY,\n maskOffsetX,\n maskOffsetY\n ) {\n let maskCanvas = maskCtx.canvas;\n let maskX = layerOffsetX - maskOffsetX;\n let maskY = layerOffsetY - maskOffsetY;\n\n if (backdrop) {\n if (\n maskX < 0 ||\n maskY < 0 ||\n maskX + width > maskCanvas.width ||\n maskY + height > maskCanvas.height\n ) {\n const canvas = this.cachedCanvases.getCanvas(\n \"maskExtension\",\n width,\n height\n );\n const ctx = canvas.context;\n ctx.drawImage(maskCanvas, -maskX, -maskY);\n if (backdrop.some(c => c !== 0)) {\n ctx.globalCompositeOperation = \"destination-atop\";\n ctx.fillStyle = Util.makeHexColor(...backdrop);\n ctx.fillRect(0, 0, width, height);\n ctx.globalCompositeOperation = \"source-over\";\n }\n\n maskCanvas = canvas.canvas;\n maskX = maskY = 0;\n } else if (backdrop.some(c => c !== 0)) {\n maskCtx.save();\n maskCtx.globalAlpha = 1;\n maskCtx.setTransform(1, 0, 0, 1, 0, 0);\n const clip = new Path2D();\n clip.rect(maskX, maskY, width, height);\n maskCtx.clip(clip);\n maskCtx.globalCompositeOperation = \"destination-atop\";\n maskCtx.fillStyle = Util.makeHexColor(...backdrop);\n maskCtx.fillRect(maskX, maskY, width, height);\n maskCtx.restore();\n }\n }\n\n layerCtx.save();\n layerCtx.globalAlpha = 1;\n layerCtx.setTransform(1, 0, 0, 1, 0, 0);\n\n if (subtype === \"Alpha\" && transferMap) {\n layerCtx.filter = this.filterFactory.addAlphaFilter(transferMap);\n } else if (subtype === \"Luminosity\") {\n layerCtx.filter = this.filterFactory.addLuminosityFilter(transferMap);\n }\n\n const clip = new Path2D();\n clip.rect(layerOffsetX, layerOffsetY, width, height);\n layerCtx.clip(clip);\n layerCtx.globalCompositeOperation = \"destination-in\";\n layerCtx.drawImage(\n maskCanvas,\n maskX,\n maskY,\n width,\n height,\n layerOffsetX,\n layerOffsetY,\n width,\n height\n );\n layerCtx.restore();\n }\n\n save() {\n if (this.inSMaskMode) {\n // SMask mode may be turned on/off causing us to lose graphics state.\n // Copy the temporary canvas state to the main(suspended) canvas to keep\n // it in sync.\n copyCtxState(this.ctx, this.suspendedCtx);\n // Don't bother calling save on the temporary canvas since state is not\n // saved there.\n this.suspendedCtx.save();\n } else {\n this.ctx.save();\n }\n const old = this.current;\n this.stateStack.push(old);\n this.current = old.clone();\n }\n\n restore() {\n if (this.stateStack.length === 0 && this.inSMaskMode) {\n this.endSMaskMode();\n }\n if (this.stateStack.length !== 0) {\n this.current = this.stateStack.pop();\n if (this.inSMaskMode) {\n // Graphics state is stored on the main(suspended) canvas. Restore its\n // state then copy it over to the temporary canvas.\n this.suspendedCtx.restore();\n copyCtxState(this.suspendedCtx, this.ctx);\n } else {\n this.ctx.restore();\n }\n this.checkSMaskState();\n\n // Ensure that the clipping path is reset (fixes issue6413.pdf).\n this.pendingClip = null;\n\n this._cachedScaleForStroking[0] = -1;\n this._cachedGetSinglePixelWidth = null;\n }\n }\n\n transform(a, b, c, d, e, f) {\n this.ctx.transform(a, b, c, d, e, f);\n\n this._cachedScaleForStroking[0] = -1;\n this._cachedGetSinglePixelWidth = null;\n }\n\n // Path\n constructPath(ops, args, minMax) {\n const ctx = this.ctx;\n const current = this.current;\n let x = current.x,\n y = current.y;\n let startX, startY;\n const currentTransform = getCurrentTransform(ctx);\n\n // Most of the time the current transform is a scaling matrix\n // so we don't need to transform points before computing min/max:\n // we can compute min/max first and then smartly \"apply\" the\n // transform (see Util.scaleMinMax).\n // For rectangle, moveTo and lineTo, min/max are computed in the\n // worker (see evaluator.js).\n const isScalingMatrix =\n (currentTransform[0] === 0 && currentTransform[3] === 0) ||\n (currentTransform[1] === 0 && currentTransform[2] === 0);\n const minMaxForBezier = isScalingMatrix ? minMax.slice(0) : null;\n\n for (let i = 0, j = 0, ii = ops.length; i < ii; i++) {\n switch (ops[i] | 0) {\n case OPS.rectangle:\n x = args[j++];\n y = args[j++];\n const width = args[j++];\n const height = args[j++];\n\n const xw = x + width;\n const yh = y + height;\n ctx.moveTo(x, y);\n if (width === 0 || height === 0) {\n ctx.lineTo(xw, yh);\n } else {\n ctx.lineTo(xw, y);\n ctx.lineTo(xw, yh);\n ctx.lineTo(x, yh);\n }\n if (!isScalingMatrix) {\n current.updateRectMinMax(currentTransform, [x, y, xw, yh]);\n }\n ctx.closePath();\n break;\n case OPS.moveTo:\n x = args[j++];\n y = args[j++];\n ctx.moveTo(x, y);\n if (!isScalingMatrix) {\n current.updatePathMinMax(currentTransform, x, y);\n }\n break;\n case OPS.lineTo:\n x = args[j++];\n y = args[j++];\n ctx.lineTo(x, y);\n if (!isScalingMatrix) {\n current.updatePathMinMax(currentTransform, x, y);\n }\n break;\n case OPS.curveTo:\n startX = x;\n startY = y;\n x = args[j + 4];\n y = args[j + 5];\n ctx.bezierCurveTo(\n args[j],\n args[j + 1],\n args[j + 2],\n args[j + 3],\n x,\n y\n );\n current.updateCurvePathMinMax(\n currentTransform,\n startX,\n startY,\n args[j],\n args[j + 1],\n args[j + 2],\n args[j + 3],\n x,\n y,\n minMaxForBezier\n );\n j += 6;\n break;\n case OPS.curveTo2:\n startX = x;\n startY = y;\n ctx.bezierCurveTo(\n x,\n y,\n args[j],\n args[j + 1],\n args[j + 2],\n args[j + 3]\n );\n current.updateCurvePathMinMax(\n currentTransform,\n startX,\n startY,\n x,\n y,\n args[j],\n args[j + 1],\n args[j + 2],\n args[j + 3],\n minMaxForBezier\n );\n x = args[j + 2];\n y = args[j + 3];\n j += 4;\n break;\n case OPS.curveTo3:\n startX = x;\n startY = y;\n x = args[j + 2];\n y = args[j + 3];\n ctx.bezierCurveTo(args[j], args[j + 1], x, y, x, y);\n current.updateCurvePathMinMax(\n currentTransform,\n startX,\n startY,\n args[j],\n args[j + 1],\n x,\n y,\n x,\n y,\n minMaxForBezier\n );\n j += 4;\n break;\n case OPS.closePath:\n ctx.closePath();\n break;\n }\n }\n\n if (isScalingMatrix) {\n current.updateScalingPathMinMax(currentTransform, minMaxForBezier);\n }\n\n current.setCurrentPoint(x, y);\n }\n\n closePath() {\n this.ctx.closePath();\n }\n\n stroke(consumePath = true) {\n const ctx = this.ctx;\n const strokeColor = this.current.strokeColor;\n // For stroke we want to temporarily change the global alpha to the\n // stroking alpha.\n ctx.globalAlpha = this.current.strokeAlpha;\n if (this.contentVisible) {\n if (typeof strokeColor === \"object\" && strokeColor?.getPattern) {\n ctx.save();\n ctx.strokeStyle = strokeColor.getPattern(\n ctx,\n this,\n getCurrentTransformInverse(ctx),\n PathType.STROKE\n );\n this.rescaleAndStroke(/* saveRestore */ false);\n ctx.restore();\n } else {\n this.rescaleAndStroke(/* saveRestore */ true);\n }\n }\n if (consumePath) {\n this.consumePath(this.current.getClippedPathBoundingBox());\n }\n // Restore the global alpha to the fill alpha\n ctx.globalAlpha = this.current.fillAlpha;\n }\n\n closeStroke() {\n this.closePath();\n this.stroke();\n }\n\n fill(consumePath = true) {\n const ctx = this.ctx;\n const fillColor = this.current.fillColor;\n const isPatternFill = this.current.patternFill;\n let needRestore = false;\n\n if (isPatternFill) {\n ctx.save();\n ctx.fillStyle = fillColor.getPattern(\n ctx,\n this,\n getCurrentTransformInverse(ctx),\n PathType.FILL\n );\n needRestore = true;\n }\n\n const intersect = this.current.getClippedPathBoundingBox();\n if (this.contentVisible && intersect !== null) {\n if (this.pendingEOFill) {\n ctx.fill(\"evenodd\");\n this.pendingEOFill = false;\n } else {\n ctx.fill();\n }\n }\n\n if (needRestore) {\n ctx.restore();\n }\n if (consumePath) {\n this.consumePath(intersect);\n }\n }\n\n eoFill() {\n this.pendingEOFill = true;\n this.fill();\n }\n\n fillStroke() {\n this.fill(false);\n this.stroke(false);\n\n this.consumePath();\n }\n\n eoFillStroke() {\n this.pendingEOFill = true;\n this.fillStroke();\n }\n\n closeFillStroke() {\n this.closePath();\n this.fillStroke();\n }\n\n closeEOFillStroke() {\n this.pendingEOFill = true;\n this.closePath();\n this.fillStroke();\n }\n\n endPath() {\n this.consumePath();\n }\n\n // Clipping\n clip() {\n this.pendingClip = NORMAL_CLIP;\n }\n\n eoClip() {\n this.pendingClip = EO_CLIP;\n }\n\n // Text\n beginText() {\n this.current.textMatrix = IDENTITY_MATRIX;\n this.current.textMatrixScale = 1;\n this.current.x = this.current.lineX = 0;\n this.current.y = this.current.lineY = 0;\n }\n\n endText() {\n const paths = this.pendingTextPaths;\n const ctx = this.ctx;\n if (paths === undefined) {\n ctx.beginPath();\n return;\n }\n\n ctx.save();\n ctx.beginPath();\n for (const path of paths) {\n ctx.setTransform(...path.transform);\n ctx.translate(path.x, path.y);\n path.addToPath(ctx, path.fontSize);\n }\n ctx.restore();\n ctx.clip();\n ctx.beginPath();\n delete this.pendingTextPaths;\n }\n\n setCharSpacing(spacing) {\n this.current.charSpacing = spacing;\n }\n\n setWordSpacing(spacing) {\n this.current.wordSpacing = spacing;\n }\n\n setHScale(scale) {\n this.current.textHScale = scale / 100;\n }\n\n setLeading(leading) {\n this.current.leading = -leading;\n }\n\n setFont(fontRefName, size) {\n const fontObj = this.commonObjs.get(fontRefName);\n const current = this.current;\n\n if (!fontObj) {\n throw new Error(`Can't find font for ${fontRefName}`);\n }\n current.fontMatrix = fontObj.fontMatrix || FONT_IDENTITY_MATRIX;\n\n // A valid matrix needs all main diagonal elements to be non-zero\n // This also ensures we bypass FF bugzilla bug #719844.\n if (current.fontMatrix[0] === 0 || current.fontMatrix[3] === 0) {\n warn(\"Invalid font matrix for font \" + fontRefName);\n }\n\n // The spec for Tf (setFont) says that 'size' specifies the font 'scale',\n // and in some docs this can be negative (inverted x-y axes).\n if (size < 0) {\n size = -size;\n current.fontDirection = -1;\n } else {\n current.fontDirection = 1;\n }\n\n this.current.font = fontObj;\n this.current.fontSize = size;\n\n if (fontObj.isType3Font) {\n return; // we don't need ctx.font for Type3 fonts\n }\n\n const name = fontObj.loadedName || \"sans-serif\";\n const typeface =\n fontObj.systemFontInfo?.css || `\"${name}\", ${fontObj.fallbackName}`;\n\n let bold = \"normal\";\n if (fontObj.black) {\n bold = \"900\";\n } else if (fontObj.bold) {\n bold = \"bold\";\n }\n const italic = fontObj.italic ? \"italic\" : \"normal\";\n\n // Some font backends cannot handle fonts below certain size.\n // Keeping the font at minimal size and using the fontSizeScale to change\n // the current transformation matrix before the fillText/strokeText.\n // See https://bugzilla.mozilla.org/show_bug.cgi?id=726227\n let browserFontSize = size;\n if (size < MIN_FONT_SIZE) {\n browserFontSize = MIN_FONT_SIZE;\n } else if (size > MAX_FONT_SIZE) {\n browserFontSize = MAX_FONT_SIZE;\n }\n this.current.fontSizeScale = size / browserFontSize;\n\n this.ctx.font = `${italic} ${bold} ${browserFontSize}px ${typeface}`;\n }\n\n setTextRenderingMode(mode) {\n this.current.textRenderingMode = mode;\n }\n\n setTextRise(rise) {\n this.current.textRise = rise;\n }\n\n moveText(x, y) {\n this.current.x = this.current.lineX += x;\n this.current.y = this.current.lineY += y;\n }\n\n setLeadingMoveText(x, y) {\n this.setLeading(-y);\n this.moveText(x, y);\n }\n\n setTextMatrix(a, b, c, d, e, f) {\n this.current.textMatrix = [a, b, c, d, e, f];\n this.current.textMatrixScale = Math.hypot(a, b);\n\n this.current.x = this.current.lineX = 0;\n this.current.y = this.current.lineY = 0;\n }\n\n nextLine() {\n this.moveText(0, this.current.leading);\n }\n\n paintChar(character, x, y, patternTransform) {\n const ctx = this.ctx;\n const current = this.current;\n const font = current.font;\n const textRenderingMode = current.textRenderingMode;\n const fontSize = current.fontSize / current.fontSizeScale;\n const fillStrokeMode =\n textRenderingMode & TextRenderingMode.FILL_STROKE_MASK;\n const isAddToPathSet = !!(\n textRenderingMode & TextRenderingMode.ADD_TO_PATH_FLAG\n );\n const patternFill = current.patternFill && !font.missingFile;\n\n let addToPath;\n if (font.disableFontFace || isAddToPathSet || patternFill) {\n addToPath = font.getPathGenerator(this.commonObjs, character);\n }\n\n if (font.disableFontFace || patternFill) {\n ctx.save();\n ctx.translate(x, y);\n ctx.beginPath();\n addToPath(ctx, fontSize);\n if (patternTransform) {\n ctx.setTransform(...patternTransform);\n }\n if (\n fillStrokeMode === TextRenderingMode.FILL ||\n fillStrokeMode === TextRenderingMode.FILL_STROKE\n ) {\n ctx.fill();\n }\n if (\n fillStrokeMode === TextRenderingMode.STROKE ||\n fillStrokeMode === TextRenderingMode.FILL_STROKE\n ) {\n ctx.stroke();\n }\n ctx.restore();\n } else {\n if (\n fillStrokeMode === TextRenderingMode.FILL ||\n fillStrokeMode === TextRenderingMode.FILL_STROKE\n ) {\n ctx.fillText(character, x, y);\n }\n if (\n fillStrokeMode === TextRenderingMode.STROKE ||\n fillStrokeMode === TextRenderingMode.FILL_STROKE\n ) {\n ctx.strokeText(character, x, y);\n }\n }\n\n if (isAddToPathSet) {\n const paths = (this.pendingTextPaths ||= []);\n paths.push({\n transform: getCurrentTransform(ctx),\n x,\n y,\n fontSize,\n addToPath,\n });\n }\n }\n\n get isFontSubpixelAAEnabled() {\n // Checks if anti-aliasing is enabled when scaled text is painted.\n // On Windows GDI scaled fonts looks bad.\n const { context: ctx } = this.cachedCanvases.getCanvas(\n \"isFontSubpixelAAEnabled\",\n 10,\n 10\n );\n ctx.scale(1.5, 1);\n ctx.fillText(\"I\", 0, 10);\n const data = ctx.getImageData(0, 0, 10, 10).data;\n let enabled = false;\n for (let i = 3; i < data.length; i += 4) {\n if (data[i] > 0 && data[i] < 255) {\n enabled = true;\n break;\n }\n }\n return shadow(this, \"isFontSubpixelAAEnabled\", enabled);\n }\n\n showText(glyphs) {\n const current = this.current;\n const font = current.font;\n if (font.isType3Font) {\n return this.showType3Text(glyphs);\n }\n\n const fontSize = current.fontSize;\n if (fontSize === 0) {\n return undefined;\n }\n\n const ctx = this.ctx;\n const fontSizeScale = current.fontSizeScale;\n const charSpacing = current.charSpacing;\n const wordSpacing = current.wordSpacing;\n const fontDirection = current.fontDirection;\n const textHScale = current.textHScale * fontDirection;\n const glyphsLength = glyphs.length;\n const vertical = font.vertical;\n const spacingDir = vertical ? 1 : -1;\n const defaultVMetrics = font.defaultVMetrics;\n const widthAdvanceScale = fontSize * current.fontMatrix[0];\n\n const simpleFillText =\n current.textRenderingMode === TextRenderingMode.FILL &&\n !font.disableFontFace &&\n !current.patternFill;\n\n ctx.save();\n ctx.transform(...current.textMatrix);\n ctx.translate(current.x, current.y + current.textRise);\n\n if (fontDirection > 0) {\n ctx.scale(textHScale, -1);\n } else {\n ctx.scale(textHScale, 1);\n }\n\n let patternTransform;\n if (current.patternFill) {\n ctx.save();\n const pattern = current.fillColor.getPattern(\n ctx,\n this,\n getCurrentTransformInverse(ctx),\n PathType.FILL\n );\n patternTransform = getCurrentTransform(ctx);\n ctx.restore();\n ctx.fillStyle = pattern;\n }\n\n let lineWidth = current.lineWidth;\n const scale = current.textMatrixScale;\n if (scale === 0 || lineWidth === 0) {\n const fillStrokeMode =\n current.textRenderingMode & TextRenderingMode.FILL_STROKE_MASK;\n if (\n fillStrokeMode === TextRenderingMode.STROKE ||\n fillStrokeMode === TextRenderingMode.FILL_STROKE\n ) {\n lineWidth = this.getSinglePixelWidth();\n }\n } else {\n lineWidth /= scale;\n }\n\n if (fontSizeScale !== 1.0) {\n ctx.scale(fontSizeScale, fontSizeScale);\n lineWidth /= fontSizeScale;\n }\n\n ctx.lineWidth = lineWidth;\n\n if (font.isInvalidPDFjsFont) {\n const chars = [];\n let width = 0;\n for (const glyph of glyphs) {\n chars.push(glyph.unicode);\n width += glyph.width;\n }\n ctx.fillText(chars.join(\"\"), 0, 0);\n current.x += width * widthAdvanceScale * textHScale;\n ctx.restore();\n this.compose();\n\n return undefined;\n }\n\n let x = 0,\n i;\n for (i = 0; i < glyphsLength; ++i) {\n const glyph = glyphs[i];\n if (typeof glyph === \"number\") {\n x += (spacingDir * glyph * fontSize) / 1000;\n continue;\n }\n\n let restoreNeeded = false;\n const spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing;\n const character = glyph.fontChar;\n const accent = glyph.accent;\n let scaledX, scaledY;\n let width = glyph.width;\n if (vertical) {\n const vmetric = glyph.vmetric || defaultVMetrics;\n const vx =\n -(glyph.vmetric ? vmetric[1] : width * 0.5) * widthAdvanceScale;\n const vy = vmetric[2] * widthAdvanceScale;\n\n width = vmetric ? -vmetric[0] : width;\n scaledX = vx / fontSizeScale;\n scaledY = (x + vy) / fontSizeScale;\n } else {\n scaledX = x / fontSizeScale;\n scaledY = 0;\n }\n\n if (font.remeasure && width > 0) {\n // Some standard fonts may not have the exact width: rescale per\n // character if measured width is greater than expected glyph width\n // and subpixel-aa is enabled, otherwise just center the glyph.\n const measuredWidth =\n ((ctx.measureText(character).width * 1000) / fontSize) *\n fontSizeScale;\n if (width < measuredWidth && this.isFontSubpixelAAEnabled) {\n const characterScaleX = width / measuredWidth;\n restoreNeeded = true;\n ctx.save();\n ctx.scale(characterScaleX, 1);\n scaledX /= characterScaleX;\n } else if (width !== measuredWidth) {\n scaledX +=\n (((width - measuredWidth) / 2000) * fontSize) / fontSizeScale;\n }\n }\n\n // Only attempt to draw the glyph if it is actually in the embedded font\n // file or if there isn't a font file so the fallback font is shown.\n if (this.contentVisible && (glyph.isInFont || font.missingFile)) {\n if (simpleFillText && !accent) {\n // common case\n ctx.fillText(character, scaledX, scaledY);\n } else {\n this.paintChar(character, scaledX, scaledY, patternTransform);\n if (accent) {\n const scaledAccentX =\n scaledX + (fontSize * accent.offset.x) / fontSizeScale;\n const scaledAccentY =\n scaledY - (fontSize * accent.offset.y) / fontSizeScale;\n this.paintChar(\n accent.fontChar,\n scaledAccentX,\n scaledAccentY,\n patternTransform\n );\n }\n }\n }\n\n const charWidth = vertical\n ? width * widthAdvanceScale - spacing * fontDirection\n : width * widthAdvanceScale + spacing * fontDirection;\n x += charWidth;\n\n if (restoreNeeded) {\n ctx.restore();\n }\n }\n if (vertical) {\n current.y -= x;\n } else {\n current.x += x * textHScale;\n }\n ctx.restore();\n this.compose();\n\n return undefined;\n }\n\n showType3Text(glyphs) {\n // Type3 fonts - each glyph is a \"mini-PDF\"\n const ctx = this.ctx;\n const current = this.current;\n const font = current.font;\n const fontSize = current.fontSize;\n const fontDirection = current.fontDirection;\n const spacingDir = font.vertical ? 1 : -1;\n const charSpacing = current.charSpacing;\n const wordSpacing = current.wordSpacing;\n const textHScale = current.textHScale * fontDirection;\n const fontMatrix = current.fontMatrix || FONT_IDENTITY_MATRIX;\n const glyphsLength = glyphs.length;\n const isTextInvisible =\n current.textRenderingMode === TextRenderingMode.INVISIBLE;\n let i, glyph, width, spacingLength;\n\n if (isTextInvisible || fontSize === 0) {\n return;\n }\n this._cachedScaleForStroking[0] = -1;\n this._cachedGetSinglePixelWidth = null;\n\n ctx.save();\n ctx.transform(...current.textMatrix);\n ctx.translate(current.x, current.y);\n\n ctx.scale(textHScale, fontDirection);\n\n for (i = 0; i < glyphsLength; ++i) {\n glyph = glyphs[i];\n if (typeof glyph === \"number\") {\n spacingLength = (spacingDir * glyph * fontSize) / 1000;\n this.ctx.translate(spacingLength, 0);\n current.x += spacingLength * textHScale;\n continue;\n }\n\n const spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing;\n const operatorList = font.charProcOperatorList[glyph.operatorListId];\n if (!operatorList) {\n warn(`Type3 character \"${glyph.operatorListId}\" is not available.`);\n continue;\n }\n if (this.contentVisible) {\n this.processingType3 = glyph;\n this.save();\n ctx.scale(fontSize, fontSize);\n ctx.transform(...fontMatrix);\n this.executeOperatorList(operatorList);\n this.restore();\n }\n\n const transformed = Util.applyTransform([glyph.width, 0], fontMatrix);\n width = transformed[0] * fontSize + spacing;\n\n ctx.translate(width, 0);\n current.x += width * textHScale;\n }\n ctx.restore();\n this.processingType3 = null;\n }\n\n // Type3 fonts\n setCharWidth(xWidth, yWidth) {\n // We can safely ignore this since the width should be the same\n // as the width in the Widths array.\n }\n\n setCharWidthAndBounds(xWidth, yWidth, llx, lly, urx, ury) {\n this.ctx.rect(llx, lly, urx - llx, ury - lly);\n this.ctx.clip();\n this.endPath();\n }\n\n // Color\n getColorN_Pattern(IR) {\n let pattern;\n if (IR[0] === \"TilingPattern\") {\n const color = IR[1];\n const baseTransform = this.baseTransform || getCurrentTransform(this.ctx);\n const canvasGraphicsFactory = {\n createCanvasGraphics: ctx =>\n new CanvasGraphics(\n ctx,\n this.commonObjs,\n this.objs,\n this.canvasFactory,\n this.filterFactory,\n {\n optionalContentConfig: this.optionalContentConfig,\n markedContentStack: this.markedContentStack,\n }\n ),\n };\n pattern = new TilingPattern(\n IR,\n color,\n this.ctx,\n canvasGraphicsFactory,\n baseTransform\n );\n } else {\n pattern = this._getPattern(IR[1], IR[2]);\n }\n return pattern;\n }\n\n setStrokeColorN() {\n this.current.strokeColor = this.getColorN_Pattern(arguments);\n }\n\n setFillColorN() {\n this.current.fillColor = this.getColorN_Pattern(arguments);\n this.current.patternFill = true;\n }\n\n setStrokeRGBColor(r, g, b) {\n const color = Util.makeHexColor(r, g, b);\n this.ctx.strokeStyle = color;\n this.current.strokeColor = color;\n }\n\n setFillRGBColor(r, g, b) {\n const color = Util.makeHexColor(r, g, b);\n this.ctx.fillStyle = color;\n this.current.fillColor = color;\n this.current.patternFill = false;\n }\n\n _getPattern(objId, matrix = null) {\n let pattern;\n if (this.cachedPatterns.has(objId)) {\n pattern = this.cachedPatterns.get(objId);\n } else {\n pattern = getShadingPattern(this.getObject(objId));\n this.cachedPatterns.set(objId, pattern);\n }\n if (matrix) {\n pattern.matrix = matrix;\n }\n return pattern;\n }\n\n shadingFill(objId) {\n if (!this.contentVisible) {\n return;\n }\n const ctx = this.ctx;\n\n this.save();\n const pattern = this._getPattern(objId);\n ctx.fillStyle = pattern.getPattern(\n ctx,\n this,\n getCurrentTransformInverse(ctx),\n PathType.SHADING\n );\n\n const inv = getCurrentTransformInverse(ctx);\n if (inv) {\n const { width, height } = ctx.canvas;\n const [x0, y0, x1, y1] = Util.getAxialAlignedBoundingBox(\n [0, 0, width, height],\n inv\n );\n\n this.ctx.fillRect(x0, y0, x1 - x0, y1 - y0);\n } else {\n // HACK to draw the gradient onto an infinite rectangle.\n // PDF gradients are drawn across the entire image while\n // Canvas only allows gradients to be drawn in a rectangle\n // The following bug should allow us to remove this.\n // https://bugzilla.mozilla.org/show_bug.cgi?id=664884\n\n this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10);\n }\n\n this.compose(this.current.getClippedPathBoundingBox());\n this.restore();\n }\n\n // Images\n beginInlineImage() {\n unreachable(\"Should not call beginInlineImage\");\n }\n\n beginImageData() {\n unreachable(\"Should not call beginImageData\");\n }\n\n paintFormXObjectBegin(matrix, bbox) {\n if (!this.contentVisible) {\n return;\n }\n this.save();\n this.baseTransformStack.push(this.baseTransform);\n\n if (matrix) {\n this.transform(...matrix);\n }\n this.baseTransform = getCurrentTransform(this.ctx);\n\n if (bbox) {\n const width = bbox[2] - bbox[0];\n const height = bbox[3] - bbox[1];\n this.ctx.rect(bbox[0], bbox[1], width, height);\n this.current.updateRectMinMax(getCurrentTransform(this.ctx), bbox);\n this.clip();\n this.endPath();\n }\n }\n\n paintFormXObjectEnd() {\n if (!this.contentVisible) {\n return;\n }\n this.restore();\n this.baseTransform = this.baseTransformStack.pop();\n }\n\n beginGroup(group) {\n if (!this.contentVisible) {\n return;\n }\n\n this.save();\n // If there's an active soft mask we don't want it enabled for the group, so\n // clear it out. The mask and suspended canvas will be restored in endGroup.\n if (this.inSMaskMode) {\n this.endSMaskMode();\n this.current.activeSMask = null;\n }\n\n const currentCtx = this.ctx;\n // TODO non-isolated groups - according to Rik at adobe non-isolated\n // group results aren't usually that different and they even have tools\n // that ignore this setting. Notes from Rik on implementing:\n // - When you encounter an transparency group, create a new canvas with\n // the dimensions of the bbox\n // - copy the content from the previous canvas to the new canvas\n // - draw as usual\n // - remove the backdrop alpha:\n // alphaNew = 1 - (1 - alpha)/(1 - alphaBackdrop) with 'alpha' the alpha\n // value of your transparency group and 'alphaBackdrop' the alpha of the\n // backdrop\n // - remove background color:\n // colorNew = color - alphaNew *colorBackdrop /(1 - alphaNew)\n if (!group.isolated) {\n info(\"TODO: Support non-isolated groups.\");\n }\n\n // TODO knockout - supposedly possible with the clever use of compositing\n // modes.\n if (group.knockout) {\n warn(\"Knockout groups not supported.\");\n }\n\n const currentTransform = getCurrentTransform(currentCtx);\n if (group.matrix) {\n currentCtx.transform(...group.matrix);\n }\n if (!group.bbox) {\n throw new Error(\"Bounding box is required.\");\n }\n\n // Based on the current transform figure out how big the bounding box\n // will actually be.\n let bounds = Util.getAxialAlignedBoundingBox(\n group.bbox,\n getCurrentTransform(currentCtx)\n );\n // Clip the bounding box to the current canvas.\n const canvasBounds = [\n 0,\n 0,\n currentCtx.canvas.width,\n currentCtx.canvas.height,\n ];\n bounds = Util.intersect(bounds, canvasBounds) || [0, 0, 0, 0];\n // Use ceil in case we're between sizes so we don't create canvas that is\n // too small and make the canvas at least 1x1 pixels.\n const offsetX = Math.floor(bounds[0]);\n const offsetY = Math.floor(bounds[1]);\n const drawnWidth = Math.max(Math.ceil(bounds[2]) - offsetX, 1);\n const drawnHeight = Math.max(Math.ceil(bounds[3]) - offsetY, 1);\n\n this.current.startNewPathAndClipBox([0, 0, drawnWidth, drawnHeight]);\n\n let cacheId = \"groupAt\" + this.groupLevel;\n if (group.smask) {\n // Using two cache entries is case if masks are used one after another.\n cacheId += \"_smask_\" + (this.smaskCounter++ % 2);\n }\n const scratchCanvas = this.cachedCanvases.getCanvas(\n cacheId,\n drawnWidth,\n drawnHeight\n );\n const groupCtx = scratchCanvas.context;\n\n // Since we created a new canvas that is just the size of the bounding box\n // we have to translate the group ctx.\n groupCtx.translate(-offsetX, -offsetY);\n groupCtx.transform(...currentTransform);\n\n if (group.smask) {\n // Saving state and cached mask to be used in setGState.\n this.smaskStack.push({\n canvas: scratchCanvas.canvas,\n context: groupCtx,\n offsetX,\n offsetY,\n subtype: group.smask.subtype,\n backdrop: group.smask.backdrop,\n transferMap: group.smask.transferMap || null,\n startTransformInverse: null, // used during suspend operation\n });\n } else {\n // Setup the current ctx so when the group is popped we draw it at the\n // right location.\n currentCtx.setTransform(1, 0, 0, 1, 0, 0);\n currentCtx.translate(offsetX, offsetY);\n currentCtx.save();\n }\n // The transparency group inherits all off the current graphics state\n // except the blend mode, soft mask, and alpha constants.\n copyCtxState(currentCtx, groupCtx);\n this.ctx = groupCtx;\n this.setGState([\n [\"BM\", \"source-over\"],\n [\"ca\", 1],\n [\"CA\", 1],\n ]);\n this.groupStack.push(currentCtx);\n this.groupLevel++;\n }\n\n endGroup(group) {\n if (!this.contentVisible) {\n return;\n }\n this.groupLevel--;\n const groupCtx = this.ctx;\n const ctx = this.groupStack.pop();\n this.ctx = ctx;\n // Turn off image smoothing to avoid sub pixel interpolation which can\n // look kind of blurry for some pdfs.\n this.ctx.imageSmoothingEnabled = false;\n\n if (group.smask) {\n this.tempSMask = this.smaskStack.pop();\n this.restore();\n } else {\n this.ctx.restore();\n const currentMtx = getCurrentTransform(this.ctx);\n this.restore();\n this.ctx.save();\n this.ctx.setTransform(...currentMtx);\n const dirtyBox = Util.getAxialAlignedBoundingBox(\n [0, 0, groupCtx.canvas.width, groupCtx.canvas.height],\n currentMtx\n );\n this.ctx.drawImage(groupCtx.canvas, 0, 0);\n this.ctx.restore();\n this.compose(dirtyBox);\n }\n }\n\n beginAnnotation(id, rect, transform, matrix, hasOwnCanvas) {\n // The annotations are drawn just after the page content.\n // The page content drawing can potentially have set a transform,\n // a clipping path, whatever...\n // So in order to have something clean, we restore the initial state.\n this.#restoreInitialState();\n resetCtxToDefault(this.ctx);\n\n this.ctx.save();\n this.save();\n\n if (this.baseTransform) {\n this.ctx.setTransform(...this.baseTransform);\n }\n\n if (rect) {\n const width = rect[2] - rect[0];\n const height = rect[3] - rect[1];\n\n if (hasOwnCanvas && this.annotationCanvasMap) {\n transform = transform.slice();\n transform[4] -= rect[0];\n transform[5] -= rect[1];\n\n rect = rect.slice();\n rect[0] = rect[1] = 0;\n rect[2] = width;\n rect[3] = height;\n\n const [scaleX, scaleY] = Util.singularValueDecompose2dScale(\n getCurrentTransform(this.ctx)\n );\n const { viewportScale } = this;\n const canvasWidth = Math.ceil(\n width * this.outputScaleX * viewportScale\n );\n const canvasHeight = Math.ceil(\n height * this.outputScaleY * viewportScale\n );\n\n this.annotationCanvas = this.canvasFactory.create(\n canvasWidth,\n canvasHeight\n );\n const { canvas, context } = this.annotationCanvas;\n this.annotationCanvasMap.set(id, canvas);\n this.annotationCanvas.savedCtx = this.ctx;\n this.ctx = context;\n this.ctx.save();\n this.ctx.setTransform(scaleX, 0, 0, -scaleY, 0, height * scaleY);\n\n resetCtxToDefault(this.ctx);\n } else {\n resetCtxToDefault(this.ctx);\n\n this.ctx.rect(rect[0], rect[1], width, height);\n this.ctx.clip();\n this.endPath();\n }\n }\n\n this.current = new CanvasExtraState(\n this.ctx.canvas.width,\n this.ctx.canvas.height\n );\n\n this.transform(...transform);\n this.transform(...matrix);\n }\n\n endAnnotation() {\n if (this.annotationCanvas) {\n this.ctx.restore();\n this.#drawFilter();\n\n this.ctx = this.annotationCanvas.savedCtx;\n delete this.annotationCanvas.savedCtx;\n delete this.annotationCanvas;\n }\n }\n\n paintImageMaskXObject(img) {\n if (!this.contentVisible) {\n return;\n }\n const count = img.count;\n img = this.getObject(img.data, img);\n img.count = count;\n\n const ctx = this.ctx;\n const glyph = this.processingType3;\n\n if (glyph) {\n if (glyph.compiled === undefined) {\n glyph.compiled = compileType3Glyph(img);\n }\n\n if (glyph.compiled) {\n glyph.compiled(ctx);\n return;\n }\n }\n const mask = this._createMaskCanvas(img);\n const maskCanvas = mask.canvas;\n\n ctx.save();\n // The mask is drawn with the transform applied. Reset the current\n // transform to draw to the identity.\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.drawImage(maskCanvas, mask.offsetX, mask.offsetY);\n ctx.restore();\n this.compose();\n }\n\n paintImageMaskXObjectRepeat(\n img,\n scaleX,\n skewX = 0,\n skewY = 0,\n scaleY,\n positions\n ) {\n if (!this.contentVisible) {\n return;\n }\n\n img = this.getObject(img.data, img);\n\n const ctx = this.ctx;\n ctx.save();\n const currentTransform = getCurrentTransform(ctx);\n ctx.transform(scaleX, skewX, skewY, scaleY, 0, 0);\n const mask = this._createMaskCanvas(img);\n\n ctx.setTransform(\n 1,\n 0,\n 0,\n 1,\n mask.offsetX - currentTransform[4],\n mask.offsetY - currentTransform[5]\n );\n for (let i = 0, ii = positions.length; i < ii; i += 2) {\n const trans = Util.transform(currentTransform, [\n scaleX,\n skewX,\n skewY,\n scaleY,\n positions[i],\n positions[i + 1],\n ]);\n\n const [x, y] = Util.applyTransform([0, 0], trans);\n ctx.drawImage(mask.canvas, x, y);\n }\n ctx.restore();\n this.compose();\n }\n\n paintImageMaskXObjectGroup(images) {\n if (!this.contentVisible) {\n return;\n }\n const ctx = this.ctx;\n\n const fillColor = this.current.fillColor;\n const isPatternFill = this.current.patternFill;\n\n for (const image of images) {\n const { data, width, height, transform } = image;\n\n const maskCanvas = this.cachedCanvases.getCanvas(\n \"maskCanvas\",\n width,\n height\n );\n const maskCtx = maskCanvas.context;\n maskCtx.save();\n\n const img = this.getObject(data, image);\n putBinaryImageMask(maskCtx, img);\n\n maskCtx.globalCompositeOperation = \"source-in\";\n\n maskCtx.fillStyle = isPatternFill\n ? fillColor.getPattern(\n maskCtx,\n this,\n getCurrentTransformInverse(ctx),\n PathType.FILL\n )\n : fillColor;\n maskCtx.fillRect(0, 0, width, height);\n\n maskCtx.restore();\n\n ctx.save();\n ctx.transform(...transform);\n ctx.scale(1, -1);\n drawImageAtIntegerCoords(\n ctx,\n maskCanvas.canvas,\n 0,\n 0,\n width,\n height,\n 0,\n -1,\n 1,\n 1\n );\n ctx.restore();\n }\n this.compose();\n }\n\n paintImageXObject(objId) {\n if (!this.contentVisible) {\n return;\n }\n const imgData = this.getObject(objId);\n if (!imgData) {\n warn(\"Dependent image isn't ready yet\");\n return;\n }\n\n this.paintInlineImageXObject(imgData);\n }\n\n paintImageXObjectRepeat(objId, scaleX, scaleY, positions) {\n if (!this.contentVisible) {\n return;\n }\n const imgData = this.getObject(objId);\n if (!imgData) {\n warn(\"Dependent image isn't ready yet\");\n return;\n }\n\n const width = imgData.width;\n const height = imgData.height;\n const map = [];\n for (let i = 0, ii = positions.length; i < ii; i += 2) {\n map.push({\n transform: [scaleX, 0, 0, scaleY, positions[i], positions[i + 1]],\n x: 0,\n y: 0,\n w: width,\n h: height,\n });\n }\n this.paintInlineImageXObjectGroup(imgData, map);\n }\n\n applyTransferMapsToCanvas(ctx) {\n if (this.current.transferMaps !== \"none\") {\n ctx.filter = this.current.transferMaps;\n ctx.drawImage(ctx.canvas, 0, 0);\n ctx.filter = \"none\";\n }\n return ctx.canvas;\n }\n\n applyTransferMapsToBitmap(imgData) {\n if (this.current.transferMaps === \"none\") {\n return imgData.bitmap;\n }\n const { bitmap, width, height } = imgData;\n const tmpCanvas = this.cachedCanvases.getCanvas(\n \"inlineImage\",\n width,\n height\n );\n const tmpCtx = tmpCanvas.context;\n tmpCtx.filter = this.current.transferMaps;\n tmpCtx.drawImage(bitmap, 0, 0);\n tmpCtx.filter = \"none\";\n\n return tmpCanvas.canvas;\n }\n\n paintInlineImageXObject(imgData) {\n if (!this.contentVisible) {\n return;\n }\n const width = imgData.width;\n const height = imgData.height;\n const ctx = this.ctx;\n\n this.save();\n\n if (\n (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n !isNodeJS\n ) {\n // The filter, if any, will be applied in applyTransferMapsToBitmap.\n // It must be applied to the image before rescaling else some artifacts\n // could appear.\n // The final restore will reset it to its value.\n const { filter } = ctx;\n if (filter !== \"none\" && filter !== \"\") {\n ctx.filter = \"none\";\n }\n }\n\n // scale the image to the unit square\n ctx.scale(1 / width, -1 / height);\n\n let imgToPaint;\n if (imgData.bitmap) {\n imgToPaint = this.applyTransferMapsToBitmap(imgData);\n } else if (\n (typeof HTMLElement === \"function\" && imgData instanceof HTMLElement) ||\n !imgData.data\n ) {\n // typeof check is needed due to node.js support, see issue #8489\n imgToPaint = imgData;\n } else {\n const tmpCanvas = this.cachedCanvases.getCanvas(\n \"inlineImage\",\n width,\n height\n );\n const tmpCtx = tmpCanvas.context;\n putBinaryImageData(tmpCtx, imgData);\n imgToPaint = this.applyTransferMapsToCanvas(tmpCtx);\n }\n\n const scaled = this._scaleImage(\n imgToPaint,\n getCurrentTransformInverse(ctx)\n );\n ctx.imageSmoothingEnabled = getImageSmoothingEnabled(\n getCurrentTransform(ctx),\n imgData.interpolate\n );\n\n drawImageAtIntegerCoords(\n ctx,\n scaled.img,\n 0,\n 0,\n scaled.paintWidth,\n scaled.paintHeight,\n 0,\n -height,\n width,\n height\n );\n this.compose();\n this.restore();\n }\n\n paintInlineImageXObjectGroup(imgData, map) {\n if (!this.contentVisible) {\n return;\n }\n const ctx = this.ctx;\n let imgToPaint;\n if (imgData.bitmap) {\n imgToPaint = imgData.bitmap;\n } else {\n const w = imgData.width;\n const h = imgData.height;\n\n const tmpCanvas = this.cachedCanvases.getCanvas(\"inlineImage\", w, h);\n const tmpCtx = tmpCanvas.context;\n putBinaryImageData(tmpCtx, imgData);\n imgToPaint = this.applyTransferMapsToCanvas(tmpCtx);\n }\n\n for (const entry of map) {\n ctx.save();\n ctx.transform(...entry.transform);\n ctx.scale(1, -1);\n drawImageAtIntegerCoords(\n ctx,\n imgToPaint,\n entry.x,\n entry.y,\n entry.w,\n entry.h,\n 0,\n -1,\n 1,\n 1\n );\n ctx.restore();\n }\n this.compose();\n }\n\n paintSolidColorImageMask() {\n if (!this.contentVisible) {\n return;\n }\n this.ctx.fillRect(0, 0, 1, 1);\n this.compose();\n }\n\n // Marked content\n\n markPoint(tag) {\n // TODO Marked content.\n }\n\n markPointProps(tag, properties) {\n // TODO Marked content.\n }\n\n beginMarkedContent(tag) {\n this.markedContentStack.push({\n visible: true,\n });\n }\n\n beginMarkedContentProps(tag, properties) {\n if (tag === \"OC\") {\n this.markedContentStack.push({\n visible: this.optionalContentConfig.isVisible(properties),\n });\n } else {\n this.markedContentStack.push({\n visible: true,\n });\n }\n this.contentVisible = this.isContentVisible();\n }\n\n endMarkedContent() {\n this.markedContentStack.pop();\n this.contentVisible = this.isContentVisible();\n }\n\n // Compatibility\n\n beginCompat() {\n // TODO ignore undefined operators (should we do that anyway?)\n }\n\n endCompat() {\n // TODO stop ignoring undefined operators\n }\n\n // Helper functions\n\n consumePath(clipBox) {\n const isEmpty = this.current.isEmptyClip();\n if (this.pendingClip) {\n this.current.updateClipFromPath();\n }\n if (!this.pendingClip) {\n this.compose(clipBox);\n }\n const ctx = this.ctx;\n if (this.pendingClip) {\n if (!isEmpty) {\n if (this.pendingClip === EO_CLIP) {\n ctx.clip(\"evenodd\");\n } else {\n ctx.clip();\n }\n }\n this.pendingClip = null;\n }\n this.current.startNewPathAndClipBox(this.current.clipBox);\n ctx.beginPath();\n }\n\n getSinglePixelWidth() {\n if (!this._cachedGetSinglePixelWidth) {\n const m = getCurrentTransform(this.ctx);\n if (m[1] === 0 && m[2] === 0) {\n // Fast path\n this._cachedGetSinglePixelWidth =\n 1 / Math.min(Math.abs(m[0]), Math.abs(m[3]));\n } else {\n const absDet = Math.abs(m[0] * m[3] - m[2] * m[1]);\n const normX = Math.hypot(m[0], m[2]);\n const normY = Math.hypot(m[1], m[3]);\n this._cachedGetSinglePixelWidth = Math.max(normX, normY) / absDet;\n }\n }\n return this._cachedGetSinglePixelWidth;\n }\n\n getScaleForStroking() {\n // A pixel has thicknessX = thicknessY = 1;\n // A transformed pixel is a parallelogram and the thicknesses\n // corresponds to the heights.\n // The goal of this function is to rescale before setting the\n // lineWidth in order to have both thicknesses greater or equal\n // to 1 after transform.\n if (this._cachedScaleForStroking[0] === -1) {\n const { lineWidth } = this.current;\n const { a, b, c, d } = this.ctx.getTransform();\n let scaleX, scaleY;\n\n if (b === 0 && c === 0) {\n // Fast path\n const normX = Math.abs(a);\n const normY = Math.abs(d);\n if (normX === normY) {\n if (lineWidth === 0) {\n scaleX = scaleY = 1 / normX;\n } else {\n const scaledLineWidth = normX * lineWidth;\n scaleX = scaleY = scaledLineWidth < 1 ? 1 / scaledLineWidth : 1;\n }\n } else if (lineWidth === 0) {\n scaleX = 1 / normX;\n scaleY = 1 / normY;\n } else {\n const scaledXLineWidth = normX * lineWidth;\n const scaledYLineWidth = normY * lineWidth;\n scaleX = scaledXLineWidth < 1 ? 1 / scaledXLineWidth : 1;\n scaleY = scaledYLineWidth < 1 ? 1 / scaledYLineWidth : 1;\n }\n } else {\n // A pixel (base (x, y)) is transformed by M into a parallelogram:\n // - its area is |det(M)|;\n // - heightY (orthogonal to Mx) has a length: |det(M)| / norm(Mx);\n // - heightX (orthogonal to My) has a length: |det(M)| / norm(My).\n // heightX and heightY are the thicknesses of the transformed pixel\n // and they must be both greater or equal to 1.\n const absDet = Math.abs(a * d - b * c);\n const normX = Math.hypot(a, b);\n const normY = Math.hypot(c, d);\n if (lineWidth === 0) {\n scaleX = normY / absDet;\n scaleY = normX / absDet;\n } else {\n const baseArea = lineWidth * absDet;\n scaleX = normY > baseArea ? normY / baseArea : 1;\n scaleY = normX > baseArea ? normX / baseArea : 1;\n }\n }\n this._cachedScaleForStroking[0] = scaleX;\n this._cachedScaleForStroking[1] = scaleY;\n }\n return this._cachedScaleForStroking;\n }\n\n // Rescale before stroking in order to have a final lineWidth\n // with both thicknesses greater or equal to 1.\n rescaleAndStroke(saveRestore) {\n const { ctx } = this;\n const { lineWidth } = this.current;\n const [scaleX, scaleY] = this.getScaleForStroking();\n\n ctx.lineWidth = lineWidth || 1;\n\n if (scaleX === 1 && scaleY === 1) {\n ctx.stroke();\n return;\n }\n\n const dashes = ctx.getLineDash();\n if (saveRestore) {\n ctx.save();\n }\n\n ctx.scale(scaleX, scaleY);\n\n // How the dashed line is rendered depends on the current transform...\n // so we added a rescale to handle too thin lines and consequently\n // the way the line is dashed will be modified.\n // If scaleX === scaleY, the dashed lines will be rendered correctly\n // else we'll have some bugs (but only with too thin lines).\n // Here we take the max... why not taking the min... or something else.\n // Anyway, as said it's buggy when scaleX !== scaleY.\n if (dashes.length > 0) {\n const scale = Math.max(scaleX, scaleY);\n ctx.setLineDash(dashes.map(x => x / scale));\n ctx.lineDashOffset /= scale;\n }\n\n ctx.stroke();\n\n if (saveRestore) {\n ctx.restore();\n }\n }\n\n isContentVisible() {\n for (let i = this.markedContentStack.length - 1; i >= 0; i--) {\n if (!this.markedContentStack[i].visible) {\n return false;\n }\n }\n return true;\n }\n}\n\nfor (const op in OPS) {\n if (CanvasGraphics.prototype[op] !== undefined) {\n CanvasGraphics.prototype[OPS[op]] = CanvasGraphics.prototype[op];\n }\n}\n\nexport { CanvasGraphics };\n","/* Copyright 2018 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nclass GlobalWorkerOptions {\n static #port = null;\n\n static #src = \"\";\n\n /**\n * @type {Worker | null}\n */\n static get workerPort() {\n return this.#port;\n }\n\n /**\n * @param {Worker | null} workerPort - Defines global port for worker process.\n * Overrides the `workerSrc` option.\n */\n static set workerPort(val) {\n if (\n !(typeof Worker !== \"undefined\" && val instanceof Worker) &&\n val !== null\n ) {\n throw new Error(\"Invalid `workerPort` type.\");\n }\n this.#port = val;\n }\n\n /**\n * @type {string}\n */\n static get workerSrc() {\n return this.#src;\n }\n\n /**\n * @param {string} workerSrc - A string containing the path and filename of\n * the worker file.\n *\n * NOTE: The `workerSrc` option should always be set, in order to prevent\n * any issues when using the PDF.js library.\n */\n static set workerSrc(val) {\n if (typeof val !== \"string\") {\n throw new Error(\"Invalid `workerSrc` type.\");\n }\n this.#src = val;\n }\n}\n\nexport { GlobalWorkerOptions };\n","/* Copyright 2018 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n AbortException,\n assert,\n MissingPDFException,\n PasswordException,\n UnexpectedResponseException,\n UnknownErrorException,\n unreachable,\n} from \"./util.js\";\n\nconst CallbackKind = {\n UNKNOWN: 0,\n DATA: 1,\n ERROR: 2,\n};\n\nconst StreamKind = {\n UNKNOWN: 0,\n CANCEL: 1,\n CANCEL_COMPLETE: 2,\n CLOSE: 3,\n ENQUEUE: 4,\n ERROR: 5,\n PULL: 6,\n PULL_COMPLETE: 7,\n START_COMPLETE: 8,\n};\n\nfunction wrapReason(reason) {\n if (\n !(\n reason instanceof Error ||\n (typeof reason === \"object\" && reason !== null)\n )\n ) {\n unreachable(\n 'wrapReason: Expected \"reason\" to be a (possibly cloned) Error.'\n );\n }\n switch (reason.name) {\n case \"AbortException\":\n return new AbortException(reason.message);\n case \"MissingPDFException\":\n return new MissingPDFException(reason.message);\n case \"PasswordException\":\n return new PasswordException(reason.message, reason.code);\n case \"UnexpectedResponseException\":\n return new UnexpectedResponseException(reason.message, reason.status);\n case \"UnknownErrorException\":\n return new UnknownErrorException(reason.message, reason.details);\n default:\n return new UnknownErrorException(reason.message, reason.toString());\n }\n}\n\nclass MessageHandler {\n constructor(sourceName, targetName, comObj) {\n this.sourceName = sourceName;\n this.targetName = targetName;\n this.comObj = comObj;\n this.callbackId = 1;\n this.streamId = 1;\n this.streamSinks = Object.create(null);\n this.streamControllers = Object.create(null);\n this.callbackCapabilities = Object.create(null);\n this.actionHandler = Object.create(null);\n\n this._onComObjOnMessage = event => {\n const data = event.data;\n if (data.targetName !== this.sourceName) {\n return;\n }\n if (data.stream) {\n this.#processStreamMessage(data);\n return;\n }\n if (data.callback) {\n const callbackId = data.callbackId;\n const capability = this.callbackCapabilities[callbackId];\n if (!capability) {\n throw new Error(`Cannot resolve callback ${callbackId}`);\n }\n delete this.callbackCapabilities[callbackId];\n\n if (data.callback === CallbackKind.DATA) {\n capability.resolve(data.data);\n } else if (data.callback === CallbackKind.ERROR) {\n capability.reject(wrapReason(data.reason));\n } else {\n throw new Error(\"Unexpected callback case\");\n }\n return;\n }\n const action = this.actionHandler[data.action];\n if (!action) {\n throw new Error(`Unknown action from worker: ${data.action}`);\n }\n if (data.callbackId) {\n const cbSourceName = this.sourceName;\n const cbTargetName = data.sourceName;\n\n new Promise(function (resolve) {\n resolve(action(data.data));\n }).then(\n function (result) {\n comObj.postMessage({\n sourceName: cbSourceName,\n targetName: cbTargetName,\n callback: CallbackKind.DATA,\n callbackId: data.callbackId,\n data: result,\n });\n },\n function (reason) {\n comObj.postMessage({\n sourceName: cbSourceName,\n targetName: cbTargetName,\n callback: CallbackKind.ERROR,\n callbackId: data.callbackId,\n reason: wrapReason(reason),\n });\n }\n );\n return;\n }\n if (data.streamId) {\n this.#createStreamSink(data);\n return;\n }\n action(data.data);\n };\n comObj.addEventListener(\"message\", this._onComObjOnMessage);\n }\n\n on(actionName, handler) {\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n assert(\n typeof handler === \"function\",\n 'MessageHandler.on: Expected \"handler\" to be a function.'\n );\n }\n const ah = this.actionHandler;\n if (ah[actionName]) {\n throw new Error(`There is already an actionName called \"${actionName}\"`);\n }\n ah[actionName] = handler;\n }\n\n /**\n * Sends a message to the comObj to invoke the action with the supplied data.\n * @param {string} actionName - Action to call.\n * @param {JSON} data - JSON data to send.\n * @param {Array} [transfers] - List of transfers/ArrayBuffers.\n */\n send(actionName, data, transfers) {\n this.comObj.postMessage(\n {\n sourceName: this.sourceName,\n targetName: this.targetName,\n action: actionName,\n data,\n },\n transfers\n );\n }\n\n /**\n * Sends a message to the comObj to invoke the action with the supplied data.\n * Expects that the other side will callback with the response.\n * @param {string} actionName - Action to call.\n * @param {JSON} data - JSON data to send.\n * @param {Array} [transfers] - List of transfers/ArrayBuffers.\n * @returns {Promise} Promise to be resolved with response data.\n */\n sendWithPromise(actionName, data, transfers) {\n const callbackId = this.callbackId++;\n const capability = Promise.withResolvers();\n this.callbackCapabilities[callbackId] = capability;\n try {\n this.comObj.postMessage(\n {\n sourceName: this.sourceName,\n targetName: this.targetName,\n action: actionName,\n callbackId,\n data,\n },\n transfers\n );\n } catch (ex) {\n capability.reject(ex);\n }\n return capability.promise;\n }\n\n /**\n * Sends a message to the comObj to invoke the action with the supplied data.\n * Expect that the other side will callback to signal 'start_complete'.\n * @param {string} actionName - Action to call.\n * @param {JSON} data - JSON data to send.\n * @param {Object} queueingStrategy - Strategy to signal backpressure based on\n * internal queue.\n * @param {Array} [transfers] - List of transfers/ArrayBuffers.\n * @returns {ReadableStream} ReadableStream to read data in chunks.\n */\n sendWithStream(actionName, data, queueingStrategy, transfers) {\n const streamId = this.streamId++,\n sourceName = this.sourceName,\n targetName = this.targetName,\n comObj = this.comObj;\n\n return new ReadableStream(\n {\n start: controller => {\n const startCapability = Promise.withResolvers();\n this.streamControllers[streamId] = {\n controller,\n startCall: startCapability,\n pullCall: null,\n cancelCall: null,\n isClosed: false,\n };\n comObj.postMessage(\n {\n sourceName,\n targetName,\n action: actionName,\n streamId,\n data,\n desiredSize: controller.desiredSize,\n },\n transfers\n );\n // Return Promise for Async process, to signal success/failure.\n return startCapability.promise;\n },\n\n pull: controller => {\n const pullCapability = Promise.withResolvers();\n this.streamControllers[streamId].pullCall = pullCapability;\n comObj.postMessage({\n sourceName,\n targetName,\n stream: StreamKind.PULL,\n streamId,\n desiredSize: controller.desiredSize,\n });\n // Returning Promise will not call \"pull\"\n // again until current pull is resolved.\n return pullCapability.promise;\n },\n\n cancel: reason => {\n assert(reason instanceof Error, \"cancel must have a valid reason\");\n const cancelCapability = Promise.withResolvers();\n this.streamControllers[streamId].cancelCall = cancelCapability;\n this.streamControllers[streamId].isClosed = true;\n comObj.postMessage({\n sourceName,\n targetName,\n stream: StreamKind.CANCEL,\n streamId,\n reason: wrapReason(reason),\n });\n // Return Promise to signal success or failure.\n return cancelCapability.promise;\n },\n },\n queueingStrategy\n );\n }\n\n #createStreamSink(data) {\n const streamId = data.streamId,\n sourceName = this.sourceName,\n targetName = data.sourceName,\n comObj = this.comObj;\n const self = this,\n action = this.actionHandler[data.action];\n\n const streamSink = {\n enqueue(chunk, size = 1, transfers) {\n if (this.isCancelled) {\n return;\n }\n const lastDesiredSize = this.desiredSize;\n this.desiredSize -= size;\n // Enqueue decreases the desiredSize property of sink,\n // so when it changes from positive to negative,\n // set ready as unresolved promise.\n if (lastDesiredSize > 0 && this.desiredSize <= 0) {\n this.sinkCapability = Promise.withResolvers();\n this.ready = this.sinkCapability.promise;\n }\n comObj.postMessage(\n {\n sourceName,\n targetName,\n stream: StreamKind.ENQUEUE,\n streamId,\n chunk,\n },\n transfers\n );\n },\n\n close() {\n if (this.isCancelled) {\n return;\n }\n this.isCancelled = true;\n comObj.postMessage({\n sourceName,\n targetName,\n stream: StreamKind.CLOSE,\n streamId,\n });\n delete self.streamSinks[streamId];\n },\n\n error(reason) {\n assert(reason instanceof Error, \"error must have a valid reason\");\n if (this.isCancelled) {\n return;\n }\n this.isCancelled = true;\n comObj.postMessage({\n sourceName,\n targetName,\n stream: StreamKind.ERROR,\n streamId,\n reason: wrapReason(reason),\n });\n },\n\n sinkCapability: Promise.withResolvers(),\n onPull: null,\n onCancel: null,\n isCancelled: false,\n desiredSize: data.desiredSize,\n ready: null,\n };\n\n streamSink.sinkCapability.resolve();\n streamSink.ready = streamSink.sinkCapability.promise;\n this.streamSinks[streamId] = streamSink;\n\n new Promise(function (resolve) {\n resolve(action(data.data, streamSink));\n }).then(\n function () {\n comObj.postMessage({\n sourceName,\n targetName,\n stream: StreamKind.START_COMPLETE,\n streamId,\n success: true,\n });\n },\n function (reason) {\n comObj.postMessage({\n sourceName,\n targetName,\n stream: StreamKind.START_COMPLETE,\n streamId,\n reason: wrapReason(reason),\n });\n }\n );\n }\n\n #processStreamMessage(data) {\n const streamId = data.streamId,\n sourceName = this.sourceName,\n targetName = data.sourceName,\n comObj = this.comObj;\n const streamController = this.streamControllers[streamId],\n streamSink = this.streamSinks[streamId];\n\n switch (data.stream) {\n case StreamKind.START_COMPLETE:\n if (data.success) {\n streamController.startCall.resolve();\n } else {\n streamController.startCall.reject(wrapReason(data.reason));\n }\n break;\n case StreamKind.PULL_COMPLETE:\n if (data.success) {\n streamController.pullCall.resolve();\n } else {\n streamController.pullCall.reject(wrapReason(data.reason));\n }\n break;\n case StreamKind.PULL:\n // Ignore any pull after close is called.\n if (!streamSink) {\n comObj.postMessage({\n sourceName,\n targetName,\n stream: StreamKind.PULL_COMPLETE,\n streamId,\n success: true,\n });\n break;\n }\n // Pull increases the desiredSize property of sink, so when it changes\n // from negative to positive, set ready property as resolved promise.\n if (streamSink.desiredSize <= 0 && data.desiredSize > 0) {\n streamSink.sinkCapability.resolve();\n }\n // Reset desiredSize property of sink on every pull.\n streamSink.desiredSize = data.desiredSize;\n\n new Promise(function (resolve) {\n resolve(streamSink.onPull?.());\n }).then(\n function () {\n comObj.postMessage({\n sourceName,\n targetName,\n stream: StreamKind.PULL_COMPLETE,\n streamId,\n success: true,\n });\n },\n function (reason) {\n comObj.postMessage({\n sourceName,\n targetName,\n stream: StreamKind.PULL_COMPLETE,\n streamId,\n reason: wrapReason(reason),\n });\n }\n );\n break;\n case StreamKind.ENQUEUE:\n assert(streamController, \"enqueue should have stream controller\");\n if (streamController.isClosed) {\n break;\n }\n streamController.controller.enqueue(data.chunk);\n break;\n case StreamKind.CLOSE:\n assert(streamController, \"close should have stream controller\");\n if (streamController.isClosed) {\n break;\n }\n streamController.isClosed = true;\n streamController.controller.close();\n this.#deleteStreamController(streamController, streamId);\n break;\n case StreamKind.ERROR:\n assert(streamController, \"error should have stream controller\");\n streamController.controller.error(wrapReason(data.reason));\n this.#deleteStreamController(streamController, streamId);\n break;\n case StreamKind.CANCEL_COMPLETE:\n if (data.success) {\n streamController.cancelCall.resolve();\n } else {\n streamController.cancelCall.reject(wrapReason(data.reason));\n }\n this.#deleteStreamController(streamController, streamId);\n break;\n case StreamKind.CANCEL:\n if (!streamSink) {\n break;\n }\n\n new Promise(function (resolve) {\n resolve(streamSink.onCancel?.(wrapReason(data.reason)));\n }).then(\n function () {\n comObj.postMessage({\n sourceName,\n targetName,\n stream: StreamKind.CANCEL_COMPLETE,\n streamId,\n success: true,\n });\n },\n function (reason) {\n comObj.postMessage({\n sourceName,\n targetName,\n stream: StreamKind.CANCEL_COMPLETE,\n streamId,\n reason: wrapReason(reason),\n });\n }\n );\n streamSink.sinkCapability.reject(wrapReason(data.reason));\n streamSink.isCancelled = true;\n delete this.streamSinks[streamId];\n break;\n default:\n throw new Error(\"Unexpected stream case\");\n }\n }\n\n async #deleteStreamController(streamController, streamId) {\n // Delete the `streamController` only when the start, pull, and cancel\n // capabilities have settled, to prevent `TypeError`s.\n await Promise.allSettled([\n streamController.startCall?.promise,\n streamController.pullCall?.promise,\n streamController.cancelCall?.promise,\n ]);\n delete this.streamControllers[streamId];\n }\n\n destroy() {\n this.comObj.removeEventListener(\"message\", this._onComObjOnMessage);\n }\n}\n\nexport { MessageHandler };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { objectFromMap } from \"../shared/util.js\";\n\nclass Metadata {\n #metadataMap;\n\n #data;\n\n constructor({ parsedData, rawData }) {\n this.#metadataMap = parsedData;\n this.#data = rawData;\n }\n\n getRaw() {\n return this.#data;\n }\n\n get(name) {\n return this.#metadataMap.get(name) ?? null;\n }\n\n getAll() {\n return objectFromMap(this.#metadataMap);\n }\n\n has(name) {\n return this.#metadataMap.has(name);\n }\n}\n\nexport { Metadata };\n","/* Copyright 2020 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n info,\n objectFromMap,\n RenderingIntentFlag,\n unreachable,\n warn,\n} from \"../shared/util.js\";\nimport { MurmurHash3_64 } from \"../shared/murmurhash3.js\";\n\nconst INTERNAL = Symbol(\"INTERNAL\");\n\nclass OptionalContentGroup {\n #isDisplay = false;\n\n #isPrint = false;\n\n #userSet = false;\n\n #visible = true;\n\n constructor(renderingIntent, { name, intent, usage }) {\n this.#isDisplay = !!(renderingIntent & RenderingIntentFlag.DISPLAY);\n this.#isPrint = !!(renderingIntent & RenderingIntentFlag.PRINT);\n\n this.name = name;\n this.intent = intent;\n this.usage = usage;\n }\n\n /**\n * @type {boolean}\n */\n get visible() {\n if (this.#userSet) {\n return this.#visible;\n }\n if (!this.#visible) {\n return false;\n }\n const { print, view } = this.usage;\n\n if (this.#isDisplay) {\n return view?.viewState !== \"OFF\";\n } else if (this.#isPrint) {\n return print?.printState !== \"OFF\";\n }\n return true;\n }\n\n /**\n * @ignore\n */\n _setVisible(internal, visible, userSet = false) {\n if (internal !== INTERNAL) {\n unreachable(\"Internal method `_setVisible` called.\");\n }\n this.#userSet = userSet;\n this.#visible = visible;\n }\n}\n\nclass OptionalContentConfig {\n #cachedGetHash = null;\n\n #groups = new Map();\n\n #initialHash = null;\n\n #order = null;\n\n constructor(data, renderingIntent = RenderingIntentFlag.DISPLAY) {\n this.renderingIntent = renderingIntent;\n\n this.name = null;\n this.creator = null;\n\n if (data === null) {\n return;\n }\n this.name = data.name;\n this.creator = data.creator;\n this.#order = data.order;\n for (const group of data.groups) {\n this.#groups.set(\n group.id,\n new OptionalContentGroup(renderingIntent, group)\n );\n }\n\n if (data.baseState === \"OFF\") {\n for (const group of this.#groups.values()) {\n group._setVisible(INTERNAL, false);\n }\n }\n\n for (const on of data.on) {\n this.#groups.get(on)._setVisible(INTERNAL, true);\n }\n\n for (const off of data.off) {\n this.#groups.get(off)._setVisible(INTERNAL, false);\n }\n\n // The following code must always run *last* in the constructor.\n this.#initialHash = this.getHash();\n }\n\n #evaluateVisibilityExpression(array) {\n const length = array.length;\n if (length < 2) {\n return true;\n }\n const operator = array[0];\n for (let i = 1; i < length; i++) {\n const element = array[i];\n let state;\n if (Array.isArray(element)) {\n state = this.#evaluateVisibilityExpression(element);\n } else if (this.#groups.has(element)) {\n state = this.#groups.get(element).visible;\n } else {\n warn(`Optional content group not found: ${element}`);\n return true;\n }\n switch (operator) {\n case \"And\":\n if (!state) {\n return false;\n }\n break;\n case \"Or\":\n if (state) {\n return true;\n }\n break;\n case \"Not\":\n return !state;\n default:\n return true;\n }\n }\n return operator === \"And\";\n }\n\n isVisible(group) {\n if (this.#groups.size === 0) {\n return true;\n }\n if (!group) {\n info(\"Optional content group not defined.\");\n return true;\n }\n if (group.type === \"OCG\") {\n if (!this.#groups.has(group.id)) {\n warn(`Optional content group not found: ${group.id}`);\n return true;\n }\n return this.#groups.get(group.id).visible;\n } else if (group.type === \"OCMD\") {\n // Per the spec, the expression should be preferred if available.\n if (group.expression) {\n return this.#evaluateVisibilityExpression(group.expression);\n }\n if (!group.policy || group.policy === \"AnyOn\") {\n // Default\n for (const id of group.ids) {\n if (!this.#groups.has(id)) {\n warn(`Optional content group not found: ${id}`);\n return true;\n }\n if (this.#groups.get(id).visible) {\n return true;\n }\n }\n return false;\n } else if (group.policy === \"AllOn\") {\n for (const id of group.ids) {\n if (!this.#groups.has(id)) {\n warn(`Optional content group not found: ${id}`);\n return true;\n }\n if (!this.#groups.get(id).visible) {\n return false;\n }\n }\n return true;\n } else if (group.policy === \"AnyOff\") {\n for (const id of group.ids) {\n if (!this.#groups.has(id)) {\n warn(`Optional content group not found: ${id}`);\n return true;\n }\n if (!this.#groups.get(id).visible) {\n return true;\n }\n }\n return false;\n } else if (group.policy === \"AllOff\") {\n for (const id of group.ids) {\n if (!this.#groups.has(id)) {\n warn(`Optional content group not found: ${id}`);\n return true;\n }\n if (this.#groups.get(id).visible) {\n return false;\n }\n }\n return true;\n }\n warn(`Unknown optional content policy ${group.policy}.`);\n return true;\n }\n warn(`Unknown group type ${group.type}.`);\n return true;\n }\n\n setVisibility(id, visible = true) {\n const group = this.#groups.get(id);\n if (!group) {\n warn(`Optional content group not found: ${id}`);\n return;\n }\n group._setVisible(INTERNAL, !!visible, /* userSet = */ true);\n\n this.#cachedGetHash = null;\n }\n\n setOCGState({ state, preserveRB }) {\n let operator;\n\n for (const elem of state) {\n switch (elem) {\n case \"ON\":\n case \"OFF\":\n case \"Toggle\":\n operator = elem;\n continue;\n }\n\n const group = this.#groups.get(elem);\n if (!group) {\n continue;\n }\n switch (operator) {\n case \"ON\":\n group._setVisible(INTERNAL, true);\n break;\n case \"OFF\":\n group._setVisible(INTERNAL, false);\n break;\n case \"Toggle\":\n group._setVisible(INTERNAL, !group.visible);\n break;\n }\n }\n\n this.#cachedGetHash = null;\n }\n\n get hasInitialVisibility() {\n return this.#initialHash === null || this.getHash() === this.#initialHash;\n }\n\n getOrder() {\n if (!this.#groups.size) {\n return null;\n }\n if (this.#order) {\n return this.#order.slice();\n }\n return [...this.#groups.keys()];\n }\n\n getGroups() {\n return this.#groups.size > 0 ? objectFromMap(this.#groups) : null;\n }\n\n getGroup(id) {\n return this.#groups.get(id) || null;\n }\n\n getHash() {\n if (this.#cachedGetHash !== null) {\n return this.#cachedGetHash;\n }\n const hash = new MurmurHash3_64();\n\n for (const [id, group] of this.#groups) {\n hash.update(`${id}:${group.visible}`);\n }\n return (this.#cachedGetHash = hash.hexdigest());\n }\n}\n\nexport { OptionalContentConfig };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"../interfaces\").IPDFStream} IPDFStream */\n/** @typedef {import(\"../interfaces\").IPDFStreamReader} IPDFStreamReader */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../interfaces\").IPDFStreamRangeReader} IPDFStreamRangeReader */\n\nimport { assert } from \"../shared/util.js\";\nimport { isPdfFile } from \"./display_utils.js\";\n\n/** @implements {IPDFStream} */\nclass PDFDataTransportStream {\n constructor(\n pdfDataRangeTransport,\n { disableRange = false, disableStream = false }\n ) {\n assert(\n pdfDataRangeTransport,\n 'PDFDataTransportStream - missing required \"pdfDataRangeTransport\" argument.'\n );\n const { length, initialData, progressiveDone, contentDispositionFilename } =\n pdfDataRangeTransport;\n\n this._queuedChunks = [];\n this._progressiveDone = progressiveDone;\n this._contentDispositionFilename = contentDispositionFilename;\n\n if (initialData?.length > 0) {\n // Prevent any possible issues by only transferring a Uint8Array that\n // completely \"utilizes\" its underlying ArrayBuffer.\n const buffer =\n initialData instanceof Uint8Array &&\n initialData.byteLength === initialData.buffer.byteLength\n ? initialData.buffer\n : new Uint8Array(initialData).buffer;\n this._queuedChunks.push(buffer);\n }\n\n this._pdfDataRangeTransport = pdfDataRangeTransport;\n this._isStreamingSupported = !disableStream;\n this._isRangeSupported = !disableRange;\n this._contentLength = length;\n\n this._fullRequestReader = null;\n this._rangeReaders = [];\n\n pdfDataRangeTransport.addRangeListener((begin, chunk) => {\n this._onReceiveData({ begin, chunk });\n });\n\n pdfDataRangeTransport.addProgressListener((loaded, total) => {\n this._onProgress({ loaded, total });\n });\n\n pdfDataRangeTransport.addProgressiveReadListener(chunk => {\n this._onReceiveData({ chunk });\n });\n\n pdfDataRangeTransport.addProgressiveDoneListener(() => {\n this._onProgressiveDone();\n });\n\n pdfDataRangeTransport.transportReady();\n }\n\n _onReceiveData({ begin, chunk }) {\n // Prevent any possible issues by only transferring a Uint8Array that\n // completely \"utilizes\" its underlying ArrayBuffer.\n const buffer =\n chunk instanceof Uint8Array &&\n chunk.byteLength === chunk.buffer.byteLength\n ? chunk.buffer\n : new Uint8Array(chunk).buffer;\n\n if (begin === undefined) {\n if (this._fullRequestReader) {\n this._fullRequestReader._enqueue(buffer);\n } else {\n this._queuedChunks.push(buffer);\n }\n } else {\n const found = this._rangeReaders.some(function (rangeReader) {\n if (rangeReader._begin !== begin) {\n return false;\n }\n rangeReader._enqueue(buffer);\n return true;\n });\n assert(\n found,\n \"_onReceiveData - no `PDFDataTransportStreamRangeReader` instance found.\"\n );\n }\n }\n\n get _progressiveDataLength() {\n return this._fullRequestReader?._loaded ?? 0;\n }\n\n _onProgress(evt) {\n if (evt.total === undefined) {\n // Reporting to first range reader, if it exists.\n this._rangeReaders[0]?.onProgress?.({ loaded: evt.loaded });\n } else {\n this._fullRequestReader?.onProgress?.({\n loaded: evt.loaded,\n total: evt.total,\n });\n }\n }\n\n _onProgressiveDone() {\n this._fullRequestReader?.progressiveDone();\n this._progressiveDone = true;\n }\n\n _removeRangeReader(reader) {\n const i = this._rangeReaders.indexOf(reader);\n if (i >= 0) {\n this._rangeReaders.splice(i, 1);\n }\n }\n\n getFullReader() {\n assert(\n !this._fullRequestReader,\n \"PDFDataTransportStream.getFullReader can only be called once.\"\n );\n const queuedChunks = this._queuedChunks;\n this._queuedChunks = null;\n return new PDFDataTransportStreamReader(\n this,\n queuedChunks,\n this._progressiveDone,\n this._contentDispositionFilename\n );\n }\n\n getRangeReader(begin, end) {\n if (end <= this._progressiveDataLength) {\n return null;\n }\n const reader = new PDFDataTransportStreamRangeReader(this, begin, end);\n this._pdfDataRangeTransport.requestDataRange(begin, end);\n this._rangeReaders.push(reader);\n return reader;\n }\n\n cancelAllRequests(reason) {\n this._fullRequestReader?.cancel(reason);\n\n for (const reader of this._rangeReaders.slice(0)) {\n reader.cancel(reason);\n }\n this._pdfDataRangeTransport.abort();\n }\n}\n\n/** @implements {IPDFStreamReader} */\nclass PDFDataTransportStreamReader {\n constructor(\n stream,\n queuedChunks,\n progressiveDone = false,\n contentDispositionFilename = null\n ) {\n this._stream = stream;\n this._done = progressiveDone || false;\n this._filename = isPdfFile(contentDispositionFilename)\n ? contentDispositionFilename\n : null;\n this._queuedChunks = queuedChunks || [];\n this._loaded = 0;\n for (const chunk of this._queuedChunks) {\n this._loaded += chunk.byteLength;\n }\n this._requests = [];\n this._headersReady = Promise.resolve();\n stream._fullRequestReader = this;\n\n this.onProgress = null;\n }\n\n _enqueue(chunk) {\n if (this._done) {\n return; // Ignore new data.\n }\n if (this._requests.length > 0) {\n const requestCapability = this._requests.shift();\n requestCapability.resolve({ value: chunk, done: false });\n } else {\n this._queuedChunks.push(chunk);\n }\n this._loaded += chunk.byteLength;\n }\n\n get headersReady() {\n return this._headersReady;\n }\n\n get filename() {\n return this._filename;\n }\n\n get isRangeSupported() {\n return this._stream._isRangeSupported;\n }\n\n get isStreamingSupported() {\n return this._stream._isStreamingSupported;\n }\n\n get contentLength() {\n return this._stream._contentLength;\n }\n\n async read() {\n if (this._queuedChunks.length > 0) {\n const chunk = this._queuedChunks.shift();\n return { value: chunk, done: false };\n }\n if (this._done) {\n return { value: undefined, done: true };\n }\n const requestCapability = Promise.withResolvers();\n this._requests.push(requestCapability);\n return requestCapability.promise;\n }\n\n cancel(reason) {\n this._done = true;\n for (const requestCapability of this._requests) {\n requestCapability.resolve({ value: undefined, done: true });\n }\n this._requests.length = 0;\n }\n\n progressiveDone() {\n if (this._done) {\n return;\n }\n this._done = true;\n }\n}\n\n/** @implements {IPDFStreamRangeReader} */\nclass PDFDataTransportStreamRangeReader {\n constructor(stream, begin, end) {\n this._stream = stream;\n this._begin = begin;\n this._end = end;\n this._queuedChunk = null;\n this._requests = [];\n this._done = false;\n\n this.onProgress = null;\n }\n\n _enqueue(chunk) {\n if (this._done) {\n return; // ignore new data\n }\n if (this._requests.length === 0) {\n this._queuedChunk = chunk;\n } else {\n const requestsCapability = this._requests.shift();\n requestsCapability.resolve({ value: chunk, done: false });\n for (const requestCapability of this._requests) {\n requestCapability.resolve({ value: undefined, done: true });\n }\n this._requests.length = 0;\n }\n this._done = true;\n this._stream._removeRangeReader(this);\n }\n\n get isStreamingSupported() {\n return false;\n }\n\n async read() {\n if (this._queuedChunk) {\n const chunk = this._queuedChunk;\n this._queuedChunk = null;\n return { value: chunk, done: false };\n }\n if (this._done) {\n return { value: undefined, done: true };\n }\n const requestCapability = Promise.withResolvers();\n this._requests.push(requestCapability);\n return requestCapability.promise;\n }\n\n cancel(reason) {\n this._done = true;\n for (const requestCapability of this._requests) {\n requestCapability.resolve({ value: undefined, done: true });\n }\n this._requests.length = 0;\n this._stream._removeRangeReader(this);\n }\n}\n\nexport { PDFDataTransportStream };\n","/* Copyright 2017 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { stringToBytes } from \"../shared/util.js\";\n\n// This getFilenameFromContentDispositionHeader function is adapted from\n// https://github.com/Rob--W/open-in-browser/blob/7e2e35a38b8b4e981b11da7b2f01df0149049e92/extension/content-disposition.js\n// with the following changes:\n// - Modified to conform to PDF.js's coding style.\n// - Move return to the end of the function to prevent Babel from dropping the\n// function declarations.\n\n/**\n * Extract file name from the Content-Disposition HTTP response header.\n *\n * @param {string} contentDisposition\n * @returns {string} Filename, if found in the Content-Disposition header.\n */\nfunction getFilenameFromContentDispositionHeader(contentDisposition) {\n let needsEncodingFixup = true;\n\n // filename*=ext-value (\"ext-value\" from RFC 5987, referenced by RFC 6266).\n let tmp = toParamRegExp(\"filename\\\\*\", \"i\").exec(contentDisposition);\n if (tmp) {\n tmp = tmp[1];\n let filename = rfc2616unquote(tmp);\n filename = unescape(filename);\n filename = rfc5987decode(filename);\n filename = rfc2047decode(filename);\n return fixupEncoding(filename);\n }\n\n // Continuations (RFC 2231 section 3, referenced by RFC 5987 section 3.1).\n // filename*n*=part\n // filename*n=part\n tmp = rfc2231getparam(contentDisposition);\n if (tmp) {\n // RFC 2047, section\n const filename = rfc2047decode(tmp);\n return fixupEncoding(filename);\n }\n\n // filename=value (RFC 5987, section 4.1).\n tmp = toParamRegExp(\"filename\", \"i\").exec(contentDisposition);\n if (tmp) {\n tmp = tmp[1];\n let filename = rfc2616unquote(tmp);\n filename = rfc2047decode(filename);\n return fixupEncoding(filename);\n }\n\n // After this line there are only function declarations. We cannot put\n // \"return\" here for readability because babel would then drop the function\n // declarations...\n function toParamRegExp(attributePattern, flags) {\n return new RegExp(\n \"(?:^|;)\\\\s*\" +\n attributePattern +\n \"\\\\s*=\\\\s*\" +\n // Captures: value = token | quoted-string\n // (RFC 2616, section 3.6 and referenced by RFC 6266 4.1)\n \"(\" +\n '[^\";\\\\s][^;\\\\s]*' +\n \"|\" +\n '\"(?:[^\"\\\\\\\\]|\\\\\\\\\"?)+\"?' +\n \")\",\n flags\n );\n }\n function textdecode(encoding, value) {\n if (encoding) {\n if (!/^[\\x00-\\xFF]+$/.test(value)) {\n return value;\n }\n try {\n const decoder = new TextDecoder(encoding, { fatal: true });\n const buffer = stringToBytes(value);\n value = decoder.decode(buffer);\n needsEncodingFixup = false;\n } catch {\n // TextDecoder constructor threw - unrecognized encoding.\n }\n }\n return value;\n }\n function fixupEncoding(value) {\n if (needsEncodingFixup && /[\\x80-\\xff]/.test(value)) {\n // Maybe multi-byte UTF-8.\n value = textdecode(\"utf-8\", value);\n if (needsEncodingFixup) {\n // Try iso-8859-1 encoding.\n value = textdecode(\"iso-8859-1\", value);\n }\n }\n return value;\n }\n function rfc2231getparam(contentDispositionStr) {\n const matches = [];\n let match;\n // Iterate over all filename*n= and filename*n*= with n being an integer\n // of at least zero. Any non-zero number must not start with '0'.\n const iter = toParamRegExp(\"filename\\\\*((?!0\\\\d)\\\\d+)(\\\\*?)\", \"ig\");\n while ((match = iter.exec(contentDispositionStr)) !== null) {\n let [, n, quot, part] = match; // eslint-disable-line prefer-const\n n = parseInt(n, 10);\n if (n in matches) {\n // Ignore anything after the invalid second filename*0.\n if (n === 0) {\n break;\n }\n continue;\n }\n matches[n] = [quot, part];\n }\n const parts = [];\n for (let n = 0; n < matches.length; ++n) {\n if (!(n in matches)) {\n // Numbers must be consecutive. Truncate when there is a hole.\n break;\n }\n let [quot, part] = matches[n]; // eslint-disable-line prefer-const\n part = rfc2616unquote(part);\n if (quot) {\n part = unescape(part);\n if (n === 0) {\n part = rfc5987decode(part);\n }\n }\n parts.push(part);\n }\n return parts.join(\"\");\n }\n function rfc2616unquote(value) {\n if (value.startsWith('\"')) {\n const parts = value.slice(1).split('\\\\\"');\n // Find the first unescaped \" and terminate there.\n for (let i = 0; i < parts.length; ++i) {\n const quotindex = parts[i].indexOf('\"');\n if (quotindex !== -1) {\n parts[i] = parts[i].slice(0, quotindex);\n parts.length = i + 1; // Truncates and stop the iteration.\n }\n parts[i] = parts[i].replaceAll(/\\\\(.)/g, \"$1\");\n }\n value = parts.join('\"');\n }\n return value;\n }\n function rfc5987decode(extvalue) {\n // Decodes \"ext-value\" from RFC 5987.\n const encodingend = extvalue.indexOf(\"'\");\n if (encodingend === -1) {\n // Some servers send \"filename*=\" without encoding 'language' prefix,\n // e.g. in https://github.com/Rob--W/open-in-browser/issues/26\n // Let's accept the value like Firefox (57) (Chrome 62 rejects it).\n return extvalue;\n }\n const encoding = extvalue.slice(0, encodingend);\n const langvalue = extvalue.slice(encodingend + 1);\n // Ignore language (RFC 5987 section 3.2.1, and RFC 6266 section 4.1 ).\n const value = langvalue.replace(/^[^']*'/, \"\");\n return textdecode(encoding, value);\n }\n function rfc2047decode(value) {\n // RFC 2047-decode the result. Firefox tried to drop support for it, but\n // backed out because some servers use it - https://bugzil.la/875615\n // Firefox's condition for decoding is here: https://searchfox.org/mozilla-central/rev/4a590a5a15e35d88a3b23dd6ac3c471cf85b04a8/netwerk/mime/nsMIMEHeaderParamImpl.cpp#742-748\n\n // We are more strict and only recognize RFC 2047-encoding if the value\n // starts with \"=?\", since then it is likely that the full value is\n // RFC 2047-encoded.\n\n // Firefox also decodes words even where RFC 2047 section 5 states:\n // \"An 'encoded-word' MUST NOT appear within a 'quoted-string'.\"\n if (!value.startsWith(\"=?\") || /[\\x00-\\x19\\x80-\\xff]/.test(value)) {\n return value;\n }\n // RFC 2047, section 2.4\n // encoded-word = \"=?\" charset \"?\" encoding \"?\" encoded-text \"?=\"\n // charset = token (but let's restrict to characters that denote a\n // possibly valid encoding).\n // encoding = q or b\n // encoded-text = any printable ASCII character other than ? or space.\n // ... but Firefox permits ? and space.\n return value.replaceAll(\n /=\\?([\\w-]*)\\?([QqBb])\\?((?:[^?]|\\?(?!=))*)\\?=/g,\n function (matches, charset, encoding, text) {\n if (encoding === \"q\" || encoding === \"Q\") {\n // RFC 2047 section 4.2.\n text = text.replaceAll(\"_\", \" \");\n text = text.replaceAll(/=([0-9a-fA-F]{2})/g, function (match, hex) {\n return String.fromCharCode(parseInt(hex, 16));\n });\n return textdecode(charset, text);\n } // else encoding is b or B - base64 (RFC 2047 section 4.1)\n try {\n text = atob(text);\n } catch {}\n return textdecode(charset, text);\n }\n );\n }\n\n return \"\";\n}\n\nexport { getFilenameFromContentDispositionHeader };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n assert,\n MissingPDFException,\n UnexpectedResponseException,\n} from \"../shared/util.js\";\nimport { getFilenameFromContentDispositionHeader } from \"./content_disposition.js\";\nimport { isPdfFile } from \"./display_utils.js\";\n\nfunction validateRangeRequestCapabilities({\n getResponseHeader,\n isHttp,\n rangeChunkSize,\n disableRange,\n}) {\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n assert(\n Number.isInteger(rangeChunkSize) && rangeChunkSize > 0,\n \"rangeChunkSize must be an integer larger than zero.\"\n );\n }\n const returnValues = {\n allowRangeRequests: false,\n suggestedLength: undefined,\n };\n\n const length = parseInt(getResponseHeader(\"Content-Length\"), 10);\n if (!Number.isInteger(length)) {\n return returnValues;\n }\n\n returnValues.suggestedLength = length;\n\n if (length <= 2 * rangeChunkSize) {\n // The file size is smaller than the size of two chunks, so it does not\n // make any sense to abort the request and retry with a range request.\n return returnValues;\n }\n\n if (disableRange || !isHttp) {\n return returnValues;\n }\n if (getResponseHeader(\"Accept-Ranges\") !== \"bytes\") {\n return returnValues;\n }\n\n const contentEncoding = getResponseHeader(\"Content-Encoding\") || \"identity\";\n if (contentEncoding !== \"identity\") {\n return returnValues;\n }\n\n returnValues.allowRangeRequests = true;\n return returnValues;\n}\n\nfunction extractFilenameFromHeader(getResponseHeader) {\n const contentDisposition = getResponseHeader(\"Content-Disposition\");\n if (contentDisposition) {\n let filename = getFilenameFromContentDispositionHeader(contentDisposition);\n if (filename.includes(\"%\")) {\n try {\n filename = decodeURIComponent(filename);\n } catch {}\n }\n if (isPdfFile(filename)) {\n return filename;\n }\n }\n return null;\n}\n\nfunction createResponseStatusError(status, url) {\n if (status === 404 || (status === 0 && url.startsWith(\"file:\"))) {\n return new MissingPDFException('Missing PDF \"' + url + '\".');\n }\n return new UnexpectedResponseException(\n `Unexpected server response (${status}) while retrieving PDF \"${url}\".`,\n status\n );\n}\n\nfunction validateResponseStatus(status) {\n return status === 200 || status === 206;\n}\n\nexport {\n createResponseStatusError,\n extractFilenameFromHeader,\n validateRangeRequestCapabilities,\n validateResponseStatus,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AbortException, assert, warn } from \"../shared/util.js\";\nimport {\n createResponseStatusError,\n extractFilenameFromHeader,\n validateRangeRequestCapabilities,\n validateResponseStatus,\n} from \"./network_utils.js\";\n\nif (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n throw new Error(\n 'Module \"./fetch_stream.js\" shall not be used with MOZCENTRAL builds.'\n );\n}\n\nfunction createFetchOptions(headers, withCredentials, abortController) {\n return {\n method: \"GET\",\n headers,\n signal: abortController.signal,\n mode: \"cors\",\n credentials: withCredentials ? \"include\" : \"same-origin\",\n redirect: \"follow\",\n };\n}\n\nfunction createHeaders(httpHeaders) {\n const headers = new Headers();\n for (const property in httpHeaders) {\n const value = httpHeaders[property];\n if (value === undefined) {\n continue;\n }\n headers.append(property, value);\n }\n return headers;\n}\n\nfunction getArrayBuffer(val) {\n if (val instanceof Uint8Array) {\n return val.buffer;\n }\n if (val instanceof ArrayBuffer) {\n return val;\n }\n warn(`getArrayBuffer - unexpected data format: ${val}`);\n return new Uint8Array(val).buffer;\n}\n\n/** @implements {IPDFStream} */\nclass PDFFetchStream {\n constructor(source) {\n this.source = source;\n this.isHttp = /^https?:/i.test(source.url);\n this.httpHeaders = (this.isHttp && source.httpHeaders) || {};\n\n this._fullRequestReader = null;\n this._rangeRequestReaders = [];\n }\n\n get _progressiveDataLength() {\n return this._fullRequestReader?._loaded ?? 0;\n }\n\n getFullReader() {\n assert(\n !this._fullRequestReader,\n \"PDFFetchStream.getFullReader can only be called once.\"\n );\n this._fullRequestReader = new PDFFetchStreamReader(this);\n return this._fullRequestReader;\n }\n\n getRangeReader(begin, end) {\n if (end <= this._progressiveDataLength) {\n return null;\n }\n const reader = new PDFFetchStreamRangeReader(this, begin, end);\n this._rangeRequestReaders.push(reader);\n return reader;\n }\n\n cancelAllRequests(reason) {\n this._fullRequestReader?.cancel(reason);\n\n for (const reader of this._rangeRequestReaders.slice(0)) {\n reader.cancel(reason);\n }\n }\n}\n\n/** @implements {IPDFStreamReader} */\nclass PDFFetchStreamReader {\n constructor(stream) {\n this._stream = stream;\n this._reader = null;\n this._loaded = 0;\n this._filename = null;\n const source = stream.source;\n this._withCredentials = source.withCredentials || false;\n this._contentLength = source.length;\n this._headersCapability = Promise.withResolvers();\n this._disableRange = source.disableRange || false;\n this._rangeChunkSize = source.rangeChunkSize;\n if (!this._rangeChunkSize && !this._disableRange) {\n this._disableRange = true;\n }\n\n this._abortController = new AbortController();\n this._isStreamingSupported = !source.disableStream;\n this._isRangeSupported = !source.disableRange;\n\n this._headers = createHeaders(this._stream.httpHeaders);\n\n const url = source.url;\n fetch(\n url,\n createFetchOptions(\n this._headers,\n this._withCredentials,\n this._abortController\n )\n )\n .then(response => {\n if (!validateResponseStatus(response.status)) {\n throw createResponseStatusError(response.status, url);\n }\n this._reader = response.body.getReader();\n this._headersCapability.resolve();\n\n const getResponseHeader = name => response.headers.get(name);\n\n const { allowRangeRequests, suggestedLength } =\n validateRangeRequestCapabilities({\n getResponseHeader,\n isHttp: this._stream.isHttp,\n rangeChunkSize: this._rangeChunkSize,\n disableRange: this._disableRange,\n });\n\n this._isRangeSupported = allowRangeRequests;\n // Setting right content length.\n this._contentLength = suggestedLength || this._contentLength;\n\n this._filename = extractFilenameFromHeader(getResponseHeader);\n\n // We need to stop reading when range is supported and streaming is\n // disabled.\n if (!this._isStreamingSupported && this._isRangeSupported) {\n this.cancel(new AbortException(\"Streaming is disabled.\"));\n }\n })\n .catch(this._headersCapability.reject);\n\n this.onProgress = null;\n }\n\n get headersReady() {\n return this._headersCapability.promise;\n }\n\n get filename() {\n return this._filename;\n }\n\n get contentLength() {\n return this._contentLength;\n }\n\n get isRangeSupported() {\n return this._isRangeSupported;\n }\n\n get isStreamingSupported() {\n return this._isStreamingSupported;\n }\n\n async read() {\n await this._headersCapability.promise;\n const { value, done } = await this._reader.read();\n if (done) {\n return { value, done };\n }\n this._loaded += value.byteLength;\n this.onProgress?.({\n loaded: this._loaded,\n total: this._contentLength,\n });\n\n return { value: getArrayBuffer(value), done: false };\n }\n\n cancel(reason) {\n this._reader?.cancel(reason);\n this._abortController.abort();\n }\n}\n\n/** @implements {IPDFStreamRangeReader} */\nclass PDFFetchStreamRangeReader {\n constructor(stream, begin, end) {\n this._stream = stream;\n this._reader = null;\n this._loaded = 0;\n const source = stream.source;\n this._withCredentials = source.withCredentials || false;\n this._readCapability = Promise.withResolvers();\n this._isStreamingSupported = !source.disableStream;\n\n this._abortController = new AbortController();\n this._headers = createHeaders(this._stream.httpHeaders);\n this._headers.append(\"Range\", `bytes=${begin}-${end - 1}`);\n\n const url = source.url;\n fetch(\n url,\n createFetchOptions(\n this._headers,\n this._withCredentials,\n this._abortController\n )\n )\n .then(response => {\n if (!validateResponseStatus(response.status)) {\n throw createResponseStatusError(response.status, url);\n }\n this._readCapability.resolve();\n this._reader = response.body.getReader();\n })\n .catch(this._readCapability.reject);\n\n this.onProgress = null;\n }\n\n get isStreamingSupported() {\n return this._isStreamingSupported;\n }\n\n async read() {\n await this._readCapability.promise;\n const { value, done } = await this._reader.read();\n if (done) {\n return { value, done };\n }\n this._loaded += value.byteLength;\n this.onProgress?.({ loaded: this._loaded });\n\n return { value: getArrayBuffer(value), done: false };\n }\n\n cancel(reason) {\n this._reader?.cancel(reason);\n this._abortController.abort();\n }\n}\n\nexport { PDFFetchStream };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert, stringToBytes } from \"../shared/util.js\";\nimport {\n createResponseStatusError,\n extractFilenameFromHeader,\n validateRangeRequestCapabilities,\n} from \"./network_utils.js\";\n\nif (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n throw new Error(\n 'Module \"./network.js\" shall not be used with MOZCENTRAL builds.'\n );\n}\n\nconst OK_RESPONSE = 200;\nconst PARTIAL_CONTENT_RESPONSE = 206;\n\nfunction getArrayBuffer(xhr) {\n const data = xhr.response;\n if (typeof data !== \"string\") {\n return data;\n }\n return stringToBytes(data).buffer;\n}\n\nclass NetworkManager {\n constructor(url, args = {}) {\n this.url = url;\n this.isHttp = /^https?:/i.test(url);\n this.httpHeaders = (this.isHttp && args.httpHeaders) || Object.create(null);\n this.withCredentials = args.withCredentials || false;\n\n this.currXhrId = 0;\n this.pendingRequests = Object.create(null);\n }\n\n requestRange(begin, end, listeners) {\n const args = {\n begin,\n end,\n };\n for (const prop in listeners) {\n args[prop] = listeners[prop];\n }\n return this.request(args);\n }\n\n requestFull(listeners) {\n return this.request(listeners);\n }\n\n request(args) {\n const xhr = new XMLHttpRequest();\n const xhrId = this.currXhrId++;\n const pendingRequest = (this.pendingRequests[xhrId] = { xhr });\n\n xhr.open(\"GET\", this.url);\n xhr.withCredentials = this.withCredentials;\n for (const property in this.httpHeaders) {\n const value = this.httpHeaders[property];\n if (value === undefined) {\n continue;\n }\n xhr.setRequestHeader(property, value);\n }\n if (this.isHttp && \"begin\" in args && \"end\" in args) {\n xhr.setRequestHeader(\"Range\", `bytes=${args.begin}-${args.end - 1}`);\n pendingRequest.expectedStatus = PARTIAL_CONTENT_RESPONSE;\n } else {\n pendingRequest.expectedStatus = OK_RESPONSE;\n }\n xhr.responseType = \"arraybuffer\";\n\n if (args.onError) {\n xhr.onerror = function (evt) {\n args.onError(xhr.status);\n };\n }\n xhr.onreadystatechange = this.onStateChange.bind(this, xhrId);\n xhr.onprogress = this.onProgress.bind(this, xhrId);\n\n pendingRequest.onHeadersReceived = args.onHeadersReceived;\n pendingRequest.onDone = args.onDone;\n pendingRequest.onError = args.onError;\n pendingRequest.onProgress = args.onProgress;\n\n xhr.send(null);\n\n return xhrId;\n }\n\n onProgress(xhrId, evt) {\n const pendingRequest = this.pendingRequests[xhrId];\n if (!pendingRequest) {\n return; // Maybe abortRequest was called...\n }\n pendingRequest.onProgress?.(evt);\n }\n\n onStateChange(xhrId, evt) {\n const pendingRequest = this.pendingRequests[xhrId];\n if (!pendingRequest) {\n return; // Maybe abortRequest was called...\n }\n\n const xhr = pendingRequest.xhr;\n if (xhr.readyState >= 2 && pendingRequest.onHeadersReceived) {\n pendingRequest.onHeadersReceived();\n delete pendingRequest.onHeadersReceived;\n }\n\n if (xhr.readyState !== 4) {\n return;\n }\n\n if (!(xhrId in this.pendingRequests)) {\n // The XHR request might have been aborted in onHeadersReceived()\n // callback, in which case we should abort request.\n return;\n }\n\n delete this.pendingRequests[xhrId];\n\n // Success status == 0 can be on ftp, file and other protocols.\n if (xhr.status === 0 && this.isHttp) {\n pendingRequest.onError?.(xhr.status);\n return;\n }\n const xhrStatus = xhr.status || OK_RESPONSE;\n\n // From http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35.2:\n // \"A server MAY ignore the Range header\". This means it's possible to\n // get a 200 rather than a 206 response from a range request.\n const ok_response_on_range_request =\n xhrStatus === OK_RESPONSE &&\n pendingRequest.expectedStatus === PARTIAL_CONTENT_RESPONSE;\n\n if (\n !ok_response_on_range_request &&\n xhrStatus !== pendingRequest.expectedStatus\n ) {\n pendingRequest.onError?.(xhr.status);\n return;\n }\n\n const chunk = getArrayBuffer(xhr);\n if (xhrStatus === PARTIAL_CONTENT_RESPONSE) {\n const rangeHeader = xhr.getResponseHeader(\"Content-Range\");\n const matches = /bytes (\\d+)-(\\d+)\\/(\\d+)/.exec(rangeHeader);\n pendingRequest.onDone({\n begin: parseInt(matches[1], 10),\n chunk,\n });\n } else if (chunk) {\n pendingRequest.onDone({\n begin: 0,\n chunk,\n });\n } else {\n pendingRequest.onError?.(xhr.status);\n }\n }\n\n getRequestXhr(xhrId) {\n return this.pendingRequests[xhrId].xhr;\n }\n\n isPendingRequest(xhrId) {\n return xhrId in this.pendingRequests;\n }\n\n abortRequest(xhrId) {\n const xhr = this.pendingRequests[xhrId].xhr;\n delete this.pendingRequests[xhrId];\n xhr.abort();\n }\n}\n\n/** @implements {IPDFStream} */\nclass PDFNetworkStream {\n constructor(source) {\n this._source = source;\n this._manager = new NetworkManager(source.url, {\n httpHeaders: source.httpHeaders,\n withCredentials: source.withCredentials,\n });\n this._rangeChunkSize = source.rangeChunkSize;\n this._fullRequestReader = null;\n this._rangeRequestReaders = [];\n }\n\n _onRangeRequestReaderClosed(reader) {\n const i = this._rangeRequestReaders.indexOf(reader);\n if (i >= 0) {\n this._rangeRequestReaders.splice(i, 1);\n }\n }\n\n getFullReader() {\n assert(\n !this._fullRequestReader,\n \"PDFNetworkStream.getFullReader can only be called once.\"\n );\n this._fullRequestReader = new PDFNetworkStreamFullRequestReader(\n this._manager,\n this._source\n );\n return this._fullRequestReader;\n }\n\n getRangeReader(begin, end) {\n const reader = new PDFNetworkStreamRangeRequestReader(\n this._manager,\n begin,\n end\n );\n reader.onClosed = this._onRangeRequestReaderClosed.bind(this);\n this._rangeRequestReaders.push(reader);\n return reader;\n }\n\n cancelAllRequests(reason) {\n this._fullRequestReader?.cancel(reason);\n\n for (const reader of this._rangeRequestReaders.slice(0)) {\n reader.cancel(reason);\n }\n }\n}\n\n/** @implements {IPDFStreamReader} */\nclass PDFNetworkStreamFullRequestReader {\n constructor(manager, source) {\n this._manager = manager;\n\n const args = {\n onHeadersReceived: this._onHeadersReceived.bind(this),\n onDone: this._onDone.bind(this),\n onError: this._onError.bind(this),\n onProgress: this._onProgress.bind(this),\n };\n this._url = source.url;\n this._fullRequestId = manager.requestFull(args);\n this._headersReceivedCapability = Promise.withResolvers();\n this._disableRange = source.disableRange || false;\n this._contentLength = source.length; // Optional\n this._rangeChunkSize = source.rangeChunkSize;\n if (!this._rangeChunkSize && !this._disableRange) {\n this._disableRange = true;\n }\n\n this._isStreamingSupported = false;\n this._isRangeSupported = false;\n\n this._cachedChunks = [];\n this._requests = [];\n this._done = false;\n this._storedError = undefined;\n this._filename = null;\n\n this.onProgress = null;\n }\n\n _onHeadersReceived() {\n const fullRequestXhrId = this._fullRequestId;\n const fullRequestXhr = this._manager.getRequestXhr(fullRequestXhrId);\n\n const getResponseHeader = name => fullRequestXhr.getResponseHeader(name);\n\n const { allowRangeRequests, suggestedLength } =\n validateRangeRequestCapabilities({\n getResponseHeader,\n isHttp: this._manager.isHttp,\n rangeChunkSize: this._rangeChunkSize,\n disableRange: this._disableRange,\n });\n\n if (allowRangeRequests) {\n this._isRangeSupported = true;\n }\n // Setting right content length.\n this._contentLength = suggestedLength || this._contentLength;\n\n this._filename = extractFilenameFromHeader(getResponseHeader);\n\n if (this._isRangeSupported) {\n // NOTE: by cancelling the full request, and then issuing range\n // requests, there will be an issue for sites where you can only\n // request the pdf once. However, if this is the case, then the\n // server should not be returning that it can support range requests.\n this._manager.abortRequest(fullRequestXhrId);\n }\n\n this._headersReceivedCapability.resolve();\n }\n\n _onDone(data) {\n if (data) {\n if (this._requests.length > 0) {\n const requestCapability = this._requests.shift();\n requestCapability.resolve({ value: data.chunk, done: false });\n } else {\n this._cachedChunks.push(data.chunk);\n }\n }\n this._done = true;\n if (this._cachedChunks.length > 0) {\n return;\n }\n for (const requestCapability of this._requests) {\n requestCapability.resolve({ value: undefined, done: true });\n }\n this._requests.length = 0;\n }\n\n _onError(status) {\n this._storedError = createResponseStatusError(status, this._url);\n this._headersReceivedCapability.reject(this._storedError);\n for (const requestCapability of this._requests) {\n requestCapability.reject(this._storedError);\n }\n this._requests.length = 0;\n this._cachedChunks.length = 0;\n }\n\n _onProgress(evt) {\n this.onProgress?.({\n loaded: evt.loaded,\n total: evt.lengthComputable ? evt.total : this._contentLength,\n });\n }\n\n get filename() {\n return this._filename;\n }\n\n get isRangeSupported() {\n return this._isRangeSupported;\n }\n\n get isStreamingSupported() {\n return this._isStreamingSupported;\n }\n\n get contentLength() {\n return this._contentLength;\n }\n\n get headersReady() {\n return this._headersReceivedCapability.promise;\n }\n\n async read() {\n if (this._storedError) {\n throw this._storedError;\n }\n if (this._cachedChunks.length > 0) {\n const chunk = this._cachedChunks.shift();\n return { value: chunk, done: false };\n }\n if (this._done) {\n return { value: undefined, done: true };\n }\n const requestCapability = Promise.withResolvers();\n this._requests.push(requestCapability);\n return requestCapability.promise;\n }\n\n cancel(reason) {\n this._done = true;\n this._headersReceivedCapability.reject(reason);\n for (const requestCapability of this._requests) {\n requestCapability.resolve({ value: undefined, done: true });\n }\n this._requests.length = 0;\n if (this._manager.isPendingRequest(this._fullRequestId)) {\n this._manager.abortRequest(this._fullRequestId);\n }\n this._fullRequestReader = null;\n }\n}\n\n/** @implements {IPDFStreamRangeReader} */\nclass PDFNetworkStreamRangeRequestReader {\n constructor(manager, begin, end) {\n this._manager = manager;\n\n const args = {\n onDone: this._onDone.bind(this),\n onError: this._onError.bind(this),\n onProgress: this._onProgress.bind(this),\n };\n this._url = manager.url;\n this._requestId = manager.requestRange(begin, end, args);\n this._requests = [];\n this._queuedChunk = null;\n this._done = false;\n this._storedError = undefined;\n\n this.onProgress = null;\n this.onClosed = null;\n }\n\n _close() {\n this.onClosed?.(this);\n }\n\n _onDone(data) {\n const chunk = data.chunk;\n if (this._requests.length > 0) {\n const requestCapability = this._requests.shift();\n requestCapability.resolve({ value: chunk, done: false });\n } else {\n this._queuedChunk = chunk;\n }\n this._done = true;\n for (const requestCapability of this._requests) {\n requestCapability.resolve({ value: undefined, done: true });\n }\n this._requests.length = 0;\n this._close();\n }\n\n _onError(status) {\n this._storedError = createResponseStatusError(status, this._url);\n for (const requestCapability of this._requests) {\n requestCapability.reject(this._storedError);\n }\n this._requests.length = 0;\n this._queuedChunk = null;\n }\n\n _onProgress(evt) {\n if (!this.isStreamingSupported) {\n this.onProgress?.({ loaded: evt.loaded });\n }\n }\n\n get isStreamingSupported() {\n return false;\n }\n\n async read() {\n if (this._storedError) {\n throw this._storedError;\n }\n if (this._queuedChunk !== null) {\n const chunk = this._queuedChunk;\n this._queuedChunk = null;\n return { value: chunk, done: false };\n }\n if (this._done) {\n return { value: undefined, done: true };\n }\n const requestCapability = Promise.withResolvers();\n this._requests.push(requestCapability);\n return requestCapability.promise;\n }\n\n cancel(reason) {\n this._done = true;\n for (const requestCapability of this._requests) {\n requestCapability.resolve({ value: undefined, done: true });\n }\n this._requests.length = 0;\n if (this._manager.isPendingRequest(this._requestId)) {\n this._manager.abortRequest(this._requestId);\n }\n this._close();\n }\n}\n\nexport { PDFNetworkStream };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AbortException, assert, MissingPDFException } from \"../shared/util.js\";\nimport {\n extractFilenameFromHeader,\n validateRangeRequestCapabilities,\n} from \"./network_utils.js\";\nimport { NodePackages } from \"./node_utils.js\";\n\nif (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n throw new Error(\n 'Module \"./node_stream.js\" shall not be used with MOZCENTRAL builds.'\n );\n}\n\nconst fileUriRegex = /^file:\\/\\/\\/[a-zA-Z]:\\//;\n\nfunction parseUrl(sourceUrl) {\n const url = NodePackages.get(\"url\");\n const parsedUrl = url.parse(sourceUrl);\n if (parsedUrl.protocol === \"file:\" || parsedUrl.host) {\n return parsedUrl;\n }\n // Prepending 'file:///' to Windows absolute path.\n if (/^[a-z]:[/\\\\]/i.test(sourceUrl)) {\n return url.parse(`file:///${sourceUrl}`);\n }\n // Changes protocol to 'file:' if url refers to filesystem.\n if (!parsedUrl.host) {\n parsedUrl.protocol = \"file:\";\n }\n return parsedUrl;\n}\n\nclass PDFNodeStream {\n constructor(source) {\n this.source = source;\n this.url = parseUrl(source.url);\n this.isHttp =\n this.url.protocol === \"http:\" || this.url.protocol === \"https:\";\n // Check if url refers to filesystem.\n this.isFsUrl = this.url.protocol === \"file:\";\n this.httpHeaders = (this.isHttp && source.httpHeaders) || {};\n\n this._fullRequestReader = null;\n this._rangeRequestReaders = [];\n }\n\n get _progressiveDataLength() {\n return this._fullRequestReader?._loaded ?? 0;\n }\n\n getFullReader() {\n assert(\n !this._fullRequestReader,\n \"PDFNodeStream.getFullReader can only be called once.\"\n );\n this._fullRequestReader = this.isFsUrl\n ? new PDFNodeStreamFsFullReader(this)\n : new PDFNodeStreamFullReader(this);\n return this._fullRequestReader;\n }\n\n getRangeReader(start, end) {\n if (end <= this._progressiveDataLength) {\n return null;\n }\n const rangeReader = this.isFsUrl\n ? new PDFNodeStreamFsRangeReader(this, start, end)\n : new PDFNodeStreamRangeReader(this, start, end);\n this._rangeRequestReaders.push(rangeReader);\n return rangeReader;\n }\n\n cancelAllRequests(reason) {\n this._fullRequestReader?.cancel(reason);\n\n for (const reader of this._rangeRequestReaders.slice(0)) {\n reader.cancel(reason);\n }\n }\n}\n\nclass BaseFullReader {\n constructor(stream) {\n this._url = stream.url;\n this._done = false;\n this._storedError = null;\n this.onProgress = null;\n const source = stream.source;\n this._contentLength = source.length; // optional\n this._loaded = 0;\n this._filename = null;\n\n this._disableRange = source.disableRange || false;\n this._rangeChunkSize = source.rangeChunkSize;\n if (!this._rangeChunkSize && !this._disableRange) {\n this._disableRange = true;\n }\n\n this._isStreamingSupported = !source.disableStream;\n this._isRangeSupported = !source.disableRange;\n\n this._readableStream = null;\n this._readCapability = Promise.withResolvers();\n this._headersCapability = Promise.withResolvers();\n }\n\n get headersReady() {\n return this._headersCapability.promise;\n }\n\n get filename() {\n return this._filename;\n }\n\n get contentLength() {\n return this._contentLength;\n }\n\n get isRangeSupported() {\n return this._isRangeSupported;\n }\n\n get isStreamingSupported() {\n return this._isStreamingSupported;\n }\n\n async read() {\n await this._readCapability.promise;\n if (this._done) {\n return { value: undefined, done: true };\n }\n if (this._storedError) {\n throw this._storedError;\n }\n\n const chunk = this._readableStream.read();\n if (chunk === null) {\n this._readCapability = Promise.withResolvers();\n return this.read();\n }\n this._loaded += chunk.length;\n this.onProgress?.({\n loaded: this._loaded,\n total: this._contentLength,\n });\n\n // Ensure that `read()` method returns ArrayBuffer.\n const buffer = new Uint8Array(chunk).buffer;\n return { value: buffer, done: false };\n }\n\n cancel(reason) {\n // Call `this._error()` method when cancel is called\n // before _readableStream is set.\n if (!this._readableStream) {\n this._error(reason);\n return;\n }\n this._readableStream.destroy(reason);\n }\n\n _error(reason) {\n this._storedError = reason;\n this._readCapability.resolve();\n }\n\n _setReadableStream(readableStream) {\n this._readableStream = readableStream;\n readableStream.on(\"readable\", () => {\n this._readCapability.resolve();\n });\n\n readableStream.on(\"end\", () => {\n // Destroy readable to minimize resource usage.\n readableStream.destroy();\n this._done = true;\n this._readCapability.resolve();\n });\n\n readableStream.on(\"error\", reason => {\n this._error(reason);\n });\n\n // We need to stop reading when range is supported and streaming is\n // disabled.\n if (!this._isStreamingSupported && this._isRangeSupported) {\n this._error(new AbortException(\"streaming is disabled\"));\n }\n\n // Destroy ReadableStream if already in errored state.\n if (this._storedError) {\n this._readableStream.destroy(this._storedError);\n }\n }\n}\n\nclass BaseRangeReader {\n constructor(stream) {\n this._url = stream.url;\n this._done = false;\n this._storedError = null;\n this.onProgress = null;\n this._loaded = 0;\n this._readableStream = null;\n this._readCapability = Promise.withResolvers();\n const source = stream.source;\n this._isStreamingSupported = !source.disableStream;\n }\n\n get isStreamingSupported() {\n return this._isStreamingSupported;\n }\n\n async read() {\n await this._readCapability.promise;\n if (this._done) {\n return { value: undefined, done: true };\n }\n if (this._storedError) {\n throw this._storedError;\n }\n\n const chunk = this._readableStream.read();\n if (chunk === null) {\n this._readCapability = Promise.withResolvers();\n return this.read();\n }\n this._loaded += chunk.length;\n this.onProgress?.({ loaded: this._loaded });\n\n // Ensure that `read()` method returns ArrayBuffer.\n const buffer = new Uint8Array(chunk).buffer;\n return { value: buffer, done: false };\n }\n\n cancel(reason) {\n // Call `this._error()` method when cancel is called\n // before _readableStream is set.\n if (!this._readableStream) {\n this._error(reason);\n return;\n }\n this._readableStream.destroy(reason);\n }\n\n _error(reason) {\n this._storedError = reason;\n this._readCapability.resolve();\n }\n\n _setReadableStream(readableStream) {\n this._readableStream = readableStream;\n readableStream.on(\"readable\", () => {\n this._readCapability.resolve();\n });\n\n readableStream.on(\"end\", () => {\n // Destroy readableStream to minimize resource usage.\n readableStream.destroy();\n this._done = true;\n this._readCapability.resolve();\n });\n\n readableStream.on(\"error\", reason => {\n this._error(reason);\n });\n\n // Destroy readableStream if already in errored state.\n if (this._storedError) {\n this._readableStream.destroy(this._storedError);\n }\n }\n}\n\nfunction createRequestOptions(parsedUrl, headers) {\n return {\n protocol: parsedUrl.protocol,\n auth: parsedUrl.auth,\n host: parsedUrl.hostname,\n port: parsedUrl.port,\n path: parsedUrl.path,\n method: \"GET\",\n headers,\n };\n}\n\nclass PDFNodeStreamFullReader extends BaseFullReader {\n constructor(stream) {\n super(stream);\n\n const handleResponse = response => {\n if (response.statusCode === 404) {\n const error = new MissingPDFException(`Missing PDF \"${this._url}\".`);\n this._storedError = error;\n this._headersCapability.reject(error);\n return;\n }\n this._headersCapability.resolve();\n this._setReadableStream(response);\n\n // Make sure that headers name are in lower case, as mentioned\n // here: https://nodejs.org/api/http.html#http_message_headers.\n const getResponseHeader = name =>\n this._readableStream.headers[name.toLowerCase()];\n\n const { allowRangeRequests, suggestedLength } =\n validateRangeRequestCapabilities({\n getResponseHeader,\n isHttp: stream.isHttp,\n rangeChunkSize: this._rangeChunkSize,\n disableRange: this._disableRange,\n });\n\n this._isRangeSupported = allowRangeRequests;\n // Setting right content length.\n this._contentLength = suggestedLength || this._contentLength;\n\n this._filename = extractFilenameFromHeader(getResponseHeader);\n };\n\n this._request = null;\n if (this._url.protocol === \"http:\") {\n const http = NodePackages.get(\"http\");\n this._request = http.request(\n createRequestOptions(this._url, stream.httpHeaders),\n handleResponse\n );\n } else {\n const https = NodePackages.get(\"https\");\n this._request = https.request(\n createRequestOptions(this._url, stream.httpHeaders),\n handleResponse\n );\n }\n\n this._request.on(\"error\", reason => {\n this._storedError = reason;\n this._headersCapability.reject(reason);\n });\n // Note: `request.end(data)` is used to write `data` to request body\n // and notify end of request. But one should always call `request.end()`\n // even if there is no data to write -- (to notify the end of request).\n this._request.end();\n }\n}\n\nclass PDFNodeStreamRangeReader extends BaseRangeReader {\n constructor(stream, start, end) {\n super(stream);\n\n this._httpHeaders = {};\n for (const property in stream.httpHeaders) {\n const value = stream.httpHeaders[property];\n if (value === undefined) {\n continue;\n }\n this._httpHeaders[property] = value;\n }\n this._httpHeaders.Range = `bytes=${start}-${end - 1}`;\n\n const handleResponse = response => {\n if (response.statusCode === 404) {\n const error = new MissingPDFException(`Missing PDF \"${this._url}\".`);\n this._storedError = error;\n return;\n }\n this._setReadableStream(response);\n };\n\n this._request = null;\n if (this._url.protocol === \"http:\") {\n const http = NodePackages.get(\"http\");\n this._request = http.request(\n createRequestOptions(this._url, this._httpHeaders),\n handleResponse\n );\n } else {\n const https = NodePackages.get(\"https\");\n this._request = https.request(\n createRequestOptions(this._url, this._httpHeaders),\n handleResponse\n );\n }\n\n this._request.on(\"error\", reason => {\n this._storedError = reason;\n });\n this._request.end();\n }\n}\n\nclass PDFNodeStreamFsFullReader extends BaseFullReader {\n constructor(stream) {\n super(stream);\n\n let path = decodeURIComponent(this._url.path);\n\n // Remove the extra slash to get right path from url like `file:///C:/`\n if (fileUriRegex.test(this._url.href)) {\n path = path.replace(/^\\//, \"\");\n }\n\n const fs = NodePackages.get(\"fs\");\n fs.promises.lstat(path).then(\n stat => {\n // Setting right content length.\n this._contentLength = stat.size;\n\n this._setReadableStream(fs.createReadStream(path));\n this._headersCapability.resolve();\n },\n error => {\n if (error.code === \"ENOENT\") {\n error = new MissingPDFException(`Missing PDF \"${path}\".`);\n }\n this._storedError = error;\n this._headersCapability.reject(error);\n }\n );\n }\n}\n\nclass PDFNodeStreamFsRangeReader extends BaseRangeReader {\n constructor(stream, start, end) {\n super(stream);\n\n let path = decodeURIComponent(this._url.path);\n\n // Remove the extra slash to get right path from url like `file:///C:/`\n if (fileUriRegex.test(this._url.href)) {\n path = path.replace(/^\\//, \"\");\n }\n\n const fs = NodePackages.get(\"fs\");\n this._setReadableStream(fs.createReadStream(path, { start, end: end - 1 }));\n }\n}\n\nexport { PDFNodeStream };\n","/* Copyright 2015 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./display_utils\").PageViewport} PageViewport */\n/** @typedef {import(\"./api\").TextContent} TextContent */\n\nimport { AbortException, Util, warn } from \"../shared/util.js\";\nimport { deprecated, setLayerDimensions } from \"./display_utils.js\";\n\n/**\n * @typedef {Object} TextLayerParameters\n * @property {ReadableStream | TextContent} textContentSource - Text content to\n * render, i.e. the value returned by the page's `streamTextContent` or\n * `getTextContent` method.\n * @property {HTMLElement} container - The DOM node that will contain the text\n * runs.\n * @property {PageViewport} viewport - The target viewport to properly layout\n * the text runs.\n */\n\n/**\n * @typedef {Object} TextLayerUpdateParameters\n * @property {PageViewport} viewport - The target viewport to properly layout\n * the text runs.\n * @property {function} [onBefore] - Callback invoked before the textLayer is\n * updated in the DOM.\n */\n\nconst MAX_TEXT_DIVS_TO_RENDER = 100000;\nconst DEFAULT_FONT_SIZE = 30;\nconst DEFAULT_FONT_ASCENT = 0.8;\n\nclass TextLayer {\n #capability = Promise.withResolvers();\n\n #container = null;\n\n #disableProcessItems = false;\n\n #fontInspectorEnabled = !!globalThis.FontInspector?.enabled;\n\n #lang = null;\n\n #layoutTextParams = null;\n\n #pageHeight = 0;\n\n #pageWidth = 0;\n\n #reader = null;\n\n #rootContainer = null;\n\n #rotation = 0;\n\n #scale = 0;\n\n #styleCache = Object.create(null);\n\n #textContentItemsStr = [];\n\n #textContentSource = null;\n\n #textDivs = [];\n\n #textDivProperties = new WeakMap();\n\n #transform = null;\n\n static #ascentCache = new Map();\n\n static #canvasContexts = new Map();\n\n static #minFontSize = null;\n\n static #pendingTextLayers = new Set();\n\n /**\n * @param {TextLayerParameters} options\n */\n constructor({ textContentSource, container, viewport }) {\n if (textContentSource instanceof ReadableStream) {\n this.#textContentSource = textContentSource;\n } else if (\n (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) &&\n typeof textContentSource === \"object\"\n ) {\n this.#textContentSource = new ReadableStream({\n start(controller) {\n controller.enqueue(textContentSource);\n controller.close();\n },\n });\n } else {\n throw new Error('No \"textContentSource\" parameter specified.');\n }\n this.#container = this.#rootContainer = container;\n\n this.#scale = viewport.scale * (globalThis.devicePixelRatio || 1);\n this.#rotation = viewport.rotation;\n this.#layoutTextParams = {\n prevFontSize: null,\n prevFontFamily: null,\n div: null,\n properties: null,\n ctx: null,\n };\n const { pageWidth, pageHeight, pageX, pageY } = viewport.rawDims;\n this.#transform = [1, 0, 0, -1, -pageX, pageY + pageHeight];\n this.#pageWidth = pageWidth;\n this.#pageHeight = pageHeight;\n\n TextLayer.#ensureMinFontSizeComputed();\n\n setLayerDimensions(container, viewport);\n\n // Always clean-up the temporary canvas once rendering is no longer pending.\n this.#capability.promise\n .catch(() => {\n // Avoid \"Uncaught promise\" messages in the console.\n })\n .then(() => {\n TextLayer.#pendingTextLayers.delete(this);\n this.#layoutTextParams = null;\n this.#styleCache = null;\n });\n\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n // For testing purposes.\n Object.defineProperty(this, \"pageWidth\", {\n get() {\n return this.#pageWidth;\n },\n });\n Object.defineProperty(this, \"pageHeight\", {\n get() {\n return this.#pageHeight;\n },\n });\n }\n }\n\n /**\n * Render the textLayer.\n * @returns {Promise}\n */\n render() {\n const pump = () => {\n this.#reader.read().then(({ value, done }) => {\n if (done) {\n this.#capability.resolve();\n return;\n }\n this.#lang ??= value.lang;\n Object.assign(this.#styleCache, value.styles);\n this.#processItems(value.items);\n pump();\n }, this.#capability.reject);\n };\n this.#reader = this.#textContentSource.getReader();\n TextLayer.#pendingTextLayers.add(this);\n pump();\n\n return this.#capability.promise;\n }\n\n /**\n * Update a previously rendered textLayer, if necessary.\n * @param {TextLayerUpdateParameters} options\n * @returns {undefined}\n */\n update({ viewport, onBefore = null }) {\n const scale = viewport.scale * (globalThis.devicePixelRatio || 1);\n const rotation = viewport.rotation;\n\n if (rotation !== this.#rotation) {\n onBefore?.();\n this.#rotation = rotation;\n setLayerDimensions(this.#rootContainer, { rotation });\n }\n\n if (scale !== this.#scale) {\n onBefore?.();\n this.#scale = scale;\n const params = {\n prevFontSize: null,\n prevFontFamily: null,\n div: null,\n properties: null,\n ctx: TextLayer.#getCtx(this.#lang),\n };\n for (const div of this.#textDivs) {\n params.properties = this.#textDivProperties.get(div);\n params.div = div;\n this.#layout(params);\n }\n }\n }\n\n /**\n * Cancel rendering of the textLayer.\n * @returns {undefined}\n */\n cancel() {\n const abortEx = new AbortException(\"TextLayer task cancelled.\");\n\n this.#reader?.cancel(abortEx).catch(() => {\n // Avoid \"Uncaught promise\" messages in the console.\n });\n this.#reader = null;\n\n this.#capability.reject(abortEx);\n }\n\n /**\n * @type {Array} HTML elements that correspond to the text items\n * of the textContent input.\n * This is output and will initially be set to an empty array.\n */\n get textDivs() {\n return this.#textDivs;\n }\n\n /**\n * @type {Array} Strings that correspond to the `str` property of\n * the text items of the textContent input.\n * This is output and will initially be set to an empty array\n */\n get textContentItemsStr() {\n return this.#textContentItemsStr;\n }\n\n #processItems(items) {\n if (this.#disableProcessItems) {\n return;\n }\n this.#layoutTextParams.ctx ??= TextLayer.#getCtx(this.#lang);\n\n const textDivs = this.#textDivs,\n textContentItemsStr = this.#textContentItemsStr;\n\n for (const item of items) {\n // No point in rendering many divs as it would make the browser\n // unusable even after the divs are rendered.\n if (textDivs.length > MAX_TEXT_DIVS_TO_RENDER) {\n warn(\"Ignoring additional textDivs for performance reasons.\");\n\n this.#disableProcessItems = true; // Avoid multiple warnings for one page.\n return;\n }\n\n if (item.str === undefined) {\n if (\n item.type === \"beginMarkedContentProps\" ||\n item.type === \"beginMarkedContent\"\n ) {\n const parent = this.#container;\n this.#container = document.createElement(\"span\");\n this.#container.classList.add(\"markedContent\");\n if (item.id !== null) {\n this.#container.setAttribute(\"id\", `${item.id}`);\n }\n parent.append(this.#container);\n } else if (item.type === \"endMarkedContent\") {\n this.#container = this.#container.parentNode;\n }\n continue;\n }\n textContentItemsStr.push(item.str);\n this.#appendText(item);\n }\n }\n\n #appendText(geom) {\n // Initialize all used properties to keep the caches monomorphic.\n const textDiv = document.createElement(\"span\");\n const textDivProperties = {\n angle: 0,\n canvasWidth: 0,\n hasText: geom.str !== \"\",\n hasEOL: geom.hasEOL,\n fontSize: 0,\n };\n this.#textDivs.push(textDiv);\n\n const tx = Util.transform(this.#transform, geom.transform);\n let angle = Math.atan2(tx[1], tx[0]);\n const style = this.#styleCache[geom.fontName];\n if (style.vertical) {\n angle += Math.PI / 2;\n }\n\n const fontFamily =\n (this.#fontInspectorEnabled && style.fontSubstitution) ||\n style.fontFamily;\n const fontHeight = Math.hypot(tx[2], tx[3]);\n const fontAscent =\n fontHeight * TextLayer.#getAscent(fontFamily, this.#lang);\n\n let left, top;\n if (angle === 0) {\n left = tx[4];\n top = tx[5] - fontAscent;\n } else {\n left = tx[4] + fontAscent * Math.sin(angle);\n top = tx[5] - fontAscent * Math.cos(angle);\n }\n\n const scaleFactorStr = \"calc(var(--scale-factor)*\";\n const divStyle = textDiv.style;\n // Setting the style properties individually, rather than all at once,\n // should be OK since the `textDiv` isn't appended to the document yet.\n if (this.#container === this.#rootContainer) {\n divStyle.left = `${((100 * left) / this.#pageWidth).toFixed(2)}%`;\n divStyle.top = `${((100 * top) / this.#pageHeight).toFixed(2)}%`;\n } else {\n // We're in a marked content span, hence we can't use percents.\n divStyle.left = `${scaleFactorStr}${left.toFixed(2)}px)`;\n divStyle.top = `${scaleFactorStr}${top.toFixed(2)}px)`;\n }\n // We multiply the font size by #minFontSize, and then #layout will\n // scale the element by 1/#minFontSize. This allows us to effectively\n // ignore the minimum font size enforced by the browser, so that the text\n // layer s can always match the size of the text in the canvas.\n divStyle.fontSize = `${scaleFactorStr}${(TextLayer.#minFontSize * fontHeight).toFixed(2)}px)`;\n divStyle.fontFamily = fontFamily;\n\n textDivProperties.fontSize = fontHeight;\n\n // Keeps screen readers from pausing on every new text span.\n textDiv.setAttribute(\"role\", \"presentation\");\n\n textDiv.textContent = geom.str;\n // geom.dir may be 'ttb' for vertical texts.\n textDiv.dir = geom.dir;\n\n // `fontName` is only used by the FontInspector, and we only use `dataset`\n // here to make the font name available in the debugger.\n if (this.#fontInspectorEnabled) {\n textDiv.dataset.fontName =\n style.fontSubstitutionLoadedName || geom.fontName;\n }\n if (angle !== 0) {\n textDivProperties.angle = angle * (180 / Math.PI);\n }\n // We don't bother scaling single-char text divs, because it has very\n // little effect on text highlighting. This makes scrolling on docs with\n // lots of such divs a lot faster.\n let shouldScaleText = false;\n if (geom.str.length > 1) {\n shouldScaleText = true;\n } else if (geom.str !== \" \" && geom.transform[0] !== geom.transform[3]) {\n const absScaleX = Math.abs(geom.transform[0]),\n absScaleY = Math.abs(geom.transform[3]);\n // When the horizontal/vertical scaling differs significantly, also scale\n // even single-char text to improve highlighting (fixes issue11713.pdf).\n if (\n absScaleX !== absScaleY &&\n Math.max(absScaleX, absScaleY) / Math.min(absScaleX, absScaleY) > 1.5\n ) {\n shouldScaleText = true;\n }\n }\n if (shouldScaleText) {\n textDivProperties.canvasWidth = style.vertical ? geom.height : geom.width;\n }\n this.#textDivProperties.set(textDiv, textDivProperties);\n\n // Finally, layout and append the text to the DOM.\n this.#layoutTextParams.div = textDiv;\n this.#layoutTextParams.properties = textDivProperties;\n this.#layout(this.#layoutTextParams);\n\n if (textDivProperties.hasText) {\n this.#container.append(textDiv);\n }\n if (textDivProperties.hasEOL) {\n const br = document.createElement(\"br\");\n br.setAttribute(\"role\", \"presentation\");\n this.#container.append(br);\n }\n }\n\n #layout(params) {\n const { div, properties, ctx, prevFontSize, prevFontFamily } = params;\n const { style } = div;\n\n let transform = \"\";\n if (TextLayer.#minFontSize > 1) {\n transform = `scale(${1 / TextLayer.#minFontSize})`;\n }\n\n if (properties.canvasWidth !== 0 && properties.hasText) {\n const { fontFamily } = style;\n const { canvasWidth, fontSize } = properties;\n\n if (prevFontSize !== fontSize || prevFontFamily !== fontFamily) {\n ctx.font = `${fontSize * this.#scale}px ${fontFamily}`;\n params.prevFontSize = fontSize;\n params.prevFontFamily = fontFamily;\n }\n\n // Only measure the width for multi-char text divs, see `appendText`.\n const { width } = ctx.measureText(div.textContent);\n\n if (width > 0) {\n transform = `scaleX(${(canvasWidth * this.#scale) / width}) ${transform}`;\n }\n }\n if (properties.angle !== 0) {\n transform = `rotate(${properties.angle}deg) ${transform}`;\n }\n if (transform.length > 0) {\n style.transform = transform;\n }\n }\n\n /**\n * Clean-up global textLayer data.\n * @returns {undefined}\n */\n static cleanup() {\n if (this.#pendingTextLayers.size > 0) {\n return;\n }\n this.#ascentCache.clear();\n\n for (const { canvas } of this.#canvasContexts.values()) {\n canvas.remove();\n }\n this.#canvasContexts.clear();\n }\n\n static #getCtx(lang = null) {\n let canvasContext = this.#canvasContexts.get((lang ||= \"\"));\n if (!canvasContext) {\n // We don't use an OffscreenCanvas here because we use serif/sans serif\n // fonts with it and they depends on the locale.\n // In Firefox, the element get a lang attribute that depends on\n // what Fluent returns for the locale and the OffscreenCanvas uses\n // the OS locale.\n // Those two locales can be different and consequently the used fonts will\n // be different (see bug 1869001).\n // Ideally, we should use in the text layer the fonts we've in the pdf (or\n // their replacements when they aren't embedded) and then we can use an\n // OffscreenCanvas.\n const canvas = document.createElement(\"canvas\");\n canvas.className = \"hiddenCanvasElement\";\n canvas.lang = lang;\n document.body.append(canvas);\n canvasContext = canvas.getContext(\"2d\", {\n alpha: false,\n willReadFrequently: true,\n });\n this.#canvasContexts.set(lang, canvasContext);\n }\n return canvasContext;\n }\n\n /**\n * Compute the minimum font size enforced by the browser.\n */\n static #ensureMinFontSizeComputed() {\n if (this.#minFontSize !== null) {\n return;\n }\n const div = document.createElement(\"div\");\n div.style.opacity = 0;\n div.style.lineHeight = 1;\n div.style.fontSize = \"1px\";\n div.textContent = \"X\";\n document.body.append(div);\n // In `display:block` elements contain a single line of text,\n // the height matches the line height (which, when set to 1,\n // matches the actual font size).\n this.#minFontSize = div.getBoundingClientRect().height;\n div.remove();\n }\n\n static #getAscent(fontFamily, lang) {\n const cachedAscent = this.#ascentCache.get(fontFamily);\n if (cachedAscent) {\n return cachedAscent;\n }\n const ctx = this.#getCtx(lang);\n\n const savedFont = ctx.font;\n ctx.canvas.width = ctx.canvas.height = DEFAULT_FONT_SIZE;\n ctx.font = `${DEFAULT_FONT_SIZE}px ${fontFamily}`;\n const metrics = ctx.measureText(\"\");\n\n // Both properties aren't available by default in Firefox.\n let ascent = metrics.fontBoundingBoxAscent;\n let descent = Math.abs(metrics.fontBoundingBoxDescent);\n if (ascent) {\n const ratio = ascent / (ascent + descent);\n this.#ascentCache.set(fontFamily, ratio);\n\n ctx.canvas.width = ctx.canvas.height = 0;\n ctx.font = savedFont;\n return ratio;\n }\n\n // Try basic heuristic to guess ascent/descent.\n // Draw a g with baseline at 0,0 and then get the line\n // number where a pixel has non-null red component (starting\n // from bottom).\n ctx.strokeStyle = \"red\";\n ctx.clearRect(0, 0, DEFAULT_FONT_SIZE, DEFAULT_FONT_SIZE);\n ctx.strokeText(\"g\", 0, 0);\n let pixels = ctx.getImageData(\n 0,\n 0,\n DEFAULT_FONT_SIZE,\n DEFAULT_FONT_SIZE\n ).data;\n descent = 0;\n for (let i = pixels.length - 1 - 3; i >= 0; i -= 4) {\n if (pixels[i] > 0) {\n descent = Math.ceil(i / 4 / DEFAULT_FONT_SIZE);\n break;\n }\n }\n\n // Draw an A with baseline at 0,DEFAULT_FONT_SIZE and then get the line\n // number where a pixel has non-null red component (starting\n // from top).\n ctx.clearRect(0, 0, DEFAULT_FONT_SIZE, DEFAULT_FONT_SIZE);\n ctx.strokeText(\"A\", 0, DEFAULT_FONT_SIZE);\n pixels = ctx.getImageData(0, 0, DEFAULT_FONT_SIZE, DEFAULT_FONT_SIZE).data;\n ascent = 0;\n for (let i = 0, ii = pixels.length; i < ii; i += 4) {\n if (pixels[i] > 0) {\n ascent = DEFAULT_FONT_SIZE - Math.floor(i / 4 / DEFAULT_FONT_SIZE);\n break;\n }\n }\n\n ctx.canvas.width = ctx.canvas.height = 0;\n ctx.font = savedFont;\n\n const ratio = ascent ? ascent / (ascent + descent) : DEFAULT_FONT_ASCENT;\n this.#ascentCache.set(fontFamily, ratio);\n return ratio;\n }\n}\n\nfunction renderTextLayer() {\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n return;\n }\n deprecated(\"`renderTextLayer`, please use `TextLayer` instead.\");\n\n const { textContentSource, container, viewport, ...rest } = arguments[0];\n const restKeys = Object.keys(rest);\n if (restKeys.length > 0) {\n warn(\"Ignoring `renderTextLayer` parameters: \" + restKeys.join(\", \"));\n }\n\n const textLayer = new TextLayer({\n textContentSource,\n container,\n viewport,\n });\n\n const { textDivs, textContentItemsStr } = textLayer;\n const promise = textLayer.render();\n\n // eslint-disable-next-line consistent-return\n return {\n promise,\n textDivs,\n textContentItemsStr,\n };\n}\n\nfunction updateTextLayer() {\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n return;\n }\n deprecated(\"`updateTextLayer`, please use `TextLayer` instead.\");\n}\n\nexport { renderTextLayer, TextLayer, updateTextLayer };\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./api\").TextContent} TextContent */\n\nclass XfaText {\n /**\n * Walk an XFA tree and create an array of text nodes that is compatible\n * with a regular PDFs TextContent. Currently, only TextItem.str is supported,\n * all other fields and styles haven't been implemented.\n *\n * @param {Object} xfa - An XFA fake DOM object.\n *\n * @returns {TextContent}\n */\n static textContent(xfa) {\n const items = [];\n const output = {\n items,\n styles: Object.create(null),\n };\n function walk(node) {\n if (!node) {\n return;\n }\n let str = null;\n const name = node.name;\n if (name === \"#text\") {\n str = node.value;\n } else if (!XfaText.shouldBuildText(name)) {\n return;\n } else if (node?.attributes?.textContent) {\n str = node.attributes.textContent;\n } else if (node.value) {\n str = node.value;\n }\n if (str !== null) {\n items.push({\n str,\n });\n }\n if (!node.children) {\n return;\n }\n for (const child of node.children) {\n walk(child);\n }\n }\n walk(xfa);\n return output;\n }\n\n /**\n * @param {string} name - DOM node name. (lower case)\n *\n * @returns {boolean} true if the DOM node should have a corresponding text\n * node.\n */\n static shouldBuildText(name) {\n return !(\n name === \"textarea\" ||\n name === \"input\" ||\n name === \"option\" ||\n name === \"select\"\n );\n }\n}\n\nexport { XfaText };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @module pdfjsLib\n */\n\nimport {\n AbortException,\n AnnotationMode,\n assert,\n getVerbosityLevel,\n info,\n InvalidPDFException,\n isNodeJS,\n MAX_IMAGE_SIZE_TO_CACHE,\n MissingPDFException,\n PasswordException,\n RenderingIntentFlag,\n setVerbosityLevel,\n shadow,\n stringToBytes,\n UnexpectedResponseException,\n UnknownErrorException,\n unreachable,\n warn,\n} from \"../shared/util.js\";\nimport {\n AnnotationStorage,\n PrintAnnotationStorage,\n SerializableEmpty,\n} from \"./annotation_storage.js\";\nimport {\n DOMCanvasFactory,\n DOMCMapReaderFactory,\n DOMFilterFactory,\n DOMStandardFontDataFactory,\n isDataScheme,\n isValidFetchUrl,\n PageViewport,\n RenderingCancelledException,\n StatTimer,\n} from \"./display_utils.js\";\nimport { FontFaceObject, FontLoader } from \"./font_loader.js\";\nimport {\n NodeCanvasFactory,\n NodeCMapReaderFactory,\n NodeFilterFactory,\n NodePackages,\n NodeStandardFontDataFactory,\n} from \"display-node_utils\";\nimport { CanvasGraphics } from \"./canvas.js\";\nimport { GlobalWorkerOptions } from \"./worker_options.js\";\nimport { MessageHandler } from \"../shared/message_handler.js\";\nimport { Metadata } from \"./metadata.js\";\nimport { OptionalContentConfig } from \"./optional_content_config.js\";\nimport { PDFDataTransportStream } from \"./transport_stream.js\";\nimport { PDFFetchStream } from \"display-fetch_stream\";\nimport { PDFNetworkStream } from \"display-network\";\nimport { PDFNodeStream } from \"display-node_stream\";\nimport { TextLayer } from \"./text_layer.js\";\nimport { XfaText } from \"./xfa_text.js\";\n\nconst DEFAULT_RANGE_CHUNK_SIZE = 65536; // 2^16 = 65536\nconst RENDERING_CANCELLED_TIMEOUT = 100; // ms\nconst DELAYED_CLEANUP_TIMEOUT = 5000; // ms\n\nconst DefaultCanvasFactory =\n typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"GENERIC\") && isNodeJS\n ? NodeCanvasFactory\n : DOMCanvasFactory;\nconst DefaultCMapReaderFactory =\n typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"GENERIC\") && isNodeJS\n ? NodeCMapReaderFactory\n : DOMCMapReaderFactory;\nconst DefaultFilterFactory =\n typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"GENERIC\") && isNodeJS\n ? NodeFilterFactory\n : DOMFilterFactory;\nconst DefaultStandardFontDataFactory =\n typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"GENERIC\") && isNodeJS\n ? NodeStandardFontDataFactory\n : DOMStandardFontDataFactory;\n\n/**\n * @typedef { Int8Array | Uint8Array | Uint8ClampedArray |\n * Int16Array | Uint16Array |\n * Int32Array | Uint32Array | Float32Array |\n * Float64Array\n * } TypedArray\n */\n\n/**\n * @typedef {Object} RefProxy\n * @property {number} num\n * @property {number} gen\n */\n\n/**\n * Document initialization / loading parameters object.\n *\n * @typedef {Object} DocumentInitParameters\n * @property {string | URL} [url] - The URL of the PDF.\n * @property {TypedArray | ArrayBuffer | Array | string} [data] -\n * Binary PDF data.\n * Use TypedArrays (Uint8Array) to improve the memory usage. If PDF data is\n * BASE64-encoded, use `atob()` to convert it to a binary string first.\n *\n * NOTE: If TypedArrays are used they will generally be transferred to the\n * worker-thread. This will help reduce main-thread memory usage, however\n * it will take ownership of the TypedArrays.\n * @property {Object} [httpHeaders] - Basic authentication headers.\n * @property {boolean} [withCredentials] - Indicates whether or not\n * cross-site Access-Control requests should be made using credentials such\n * as cookies or authorization headers. The default is `false`.\n * @property {string} [password] - For decrypting password-protected PDFs.\n * @property {number} [length] - The PDF file length. It's used for progress\n * reports and range requests operations.\n * @property {PDFDataRangeTransport} [range] - Allows for using a custom range\n * transport implementation.\n * @property {number} [rangeChunkSize] - Specify maximum number of bytes fetched\n * per range request. The default value is {@link DEFAULT_RANGE_CHUNK_SIZE}.\n * @property {PDFWorker} [worker] - The worker that will be used for loading and\n * parsing the PDF data.\n * @property {number} [verbosity] - Controls the logging level; the constants\n * from {@link VerbosityLevel} should be used.\n * @property {string} [docBaseUrl] - The base URL of the document, used when\n * attempting to recover valid absolute URLs for annotations, and outline\n * items, that (incorrectly) only specify relative URLs.\n * @property {string} [cMapUrl] - The URL where the predefined Adobe CMaps are\n * located. Include the trailing slash.\n * @property {boolean} [cMapPacked] - Specifies if the Adobe CMaps are binary\n * packed or not. The default value is `true`.\n * @property {Object} [CMapReaderFactory] - The factory that will be used when\n * reading built-in CMap files. Providing a custom factory is useful for\n * environments without Fetch API or `XMLHttpRequest` support, such as\n * Node.js. The default value is {DOMCMapReaderFactory}.\n * @property {boolean} [useSystemFonts] - When `true`, fonts that aren't\n * embedded in the PDF document will fallback to a system font.\n * The default value is `true` in web environments and `false` in Node.js;\n * unless `disableFontFace === true` in which case this defaults to `false`\n * regardless of the environment (to prevent completely broken fonts).\n * @property {string} [standardFontDataUrl] - The URL where the standard font\n * files are located. Include the trailing slash.\n * @property {Object} [StandardFontDataFactory] - The factory that will be used\n * when reading the standard font files. Providing a custom factory is useful\n * for environments without Fetch API or `XMLHttpRequest` support, such as\n * Node.js. The default value is {DOMStandardFontDataFactory}.\n * @property {boolean} [useWorkerFetch] - Enable using the Fetch API in the\n * worker-thread when reading CMap and standard font files. When `true`,\n * the `CMapReaderFactory` and `StandardFontDataFactory` options are ignored.\n * The default value is `true` in web environments and `false` in Node.js.\n * @property {boolean} [stopAtErrors] - Reject certain promises, e.g.\n * `getOperatorList`, `getTextContent`, and `RenderTask`, when the associated\n * PDF data cannot be successfully parsed, instead of attempting to recover\n * whatever possible of the data. The default value is `false`.\n * @property {number} [maxImageSize] - The maximum allowed image size in total\n * pixels, i.e. width * height. Images above this value will not be rendered.\n * Use -1 for no limit, which is also the default value.\n * @property {boolean} [isEvalSupported] - Determines if we can evaluate strings\n * as JavaScript. Primarily used to improve performance of PDF functions.\n * The default value is `true`.\n * @property {boolean} [isOffscreenCanvasSupported] - Determines if we can use\n * `OffscreenCanvas` in the worker. Primarily used to improve performance of\n * image conversion/rendering.\n * The default value is `true` in web environments and `false` in Node.js.\n * @property {number} [canvasMaxAreaInBytes] - The integer value is used to\n * know when an image must be resized (uses `OffscreenCanvas` in the worker).\n * If it's -1 then a possibly slow algorithm is used to guess the max value.\n * @property {boolean} [disableFontFace] - By default fonts are converted to\n * OpenType fonts and loaded via the Font Loading API or `@font-face` rules.\n * If disabled, fonts will be rendered using a built-in font renderer that\n * constructs the glyphs with primitive path commands.\n * The default value is `false` in web environments and `true` in Node.js.\n * @property {boolean} [fontExtraProperties] - Include additional properties,\n * which are unused during rendering of PDF documents, when exporting the\n * parsed font data from the worker-thread. This may be useful for debugging\n * purposes (and backwards compatibility), but note that it will lead to\n * increased memory usage. The default value is `false`.\n * @property {boolean} [enableXfa] - Render Xfa forms if any.\n * The default value is `false`.\n * @property {HTMLDocument} [ownerDocument] - Specify an explicit document\n * context to create elements with and to load resources, such as fonts,\n * into. Defaults to the current document.\n * @property {boolean} [disableRange] - Disable range request loading of PDF\n * files. When enabled, and if the server supports partial content requests,\n * then the PDF will be fetched in chunks. The default value is `false`.\n * @property {boolean} [disableStream] - Disable streaming of PDF file data.\n * By default PDF.js attempts to load PDF files in chunks. The default value\n * is `false`.\n * @property {boolean} [disableAutoFetch] - Disable pre-fetching of PDF file\n * data. When range requests are enabled PDF.js will automatically keep\n * fetching more data even if it isn't needed to display the current page.\n * The default value is `false`.\n *\n * NOTE: It is also necessary to disable streaming, see above, in order for\n * disabling of pre-fetching to work correctly.\n * @property {boolean} [pdfBug] - Enables special hooks for debugging PDF.js\n * (see `web/debugger.js`). The default value is `false`.\n * @property {Object} [canvasFactory] - The factory instance that will be used\n * when creating canvases. The default value is {new DOMCanvasFactory()}.\n * @property {Object} [filterFactory] - A factory instance that will be used\n * to create SVG filters when rendering some images on the main canvas.\n * @property {boolean} [enableHWA] - Enables hardware acceleration for\n * rendering. The default value is `false`.\n */\n\n/**\n * This is the main entry point for loading a PDF and interacting with it.\n *\n * NOTE: If a URL is used to fetch the PDF data a standard Fetch API call (or\n * XHR as fallback) is used, which means it must follow same origin rules,\n * e.g. no cross-domain requests without CORS.\n *\n * @param {string | URL | TypedArray | ArrayBuffer | DocumentInitParameters}\n * src - Can be a URL where a PDF file is located, a typed array (Uint8Array)\n * already populated with data, or a parameter object.\n * @returns {PDFDocumentLoadingTask}\n */\nfunction getDocument(src = {}) {\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n if (typeof src === \"string\" || src instanceof URL) {\n src = { url: src };\n } else if (src instanceof ArrayBuffer || ArrayBuffer.isView(src)) {\n src = { data: src };\n }\n }\n const task = new PDFDocumentLoadingTask();\n const { docId } = task;\n\n const url = src.url ? getUrlProp(src.url) : null;\n const data = src.data ? getDataProp(src.data) : null;\n const httpHeaders = src.httpHeaders || null;\n const withCredentials = src.withCredentials === true;\n const password = src.password ?? null;\n const rangeTransport =\n src.range instanceof PDFDataRangeTransport ? src.range : null;\n const rangeChunkSize =\n Number.isInteger(src.rangeChunkSize) && src.rangeChunkSize > 0\n ? src.rangeChunkSize\n : DEFAULT_RANGE_CHUNK_SIZE;\n let worker = src.worker instanceof PDFWorker ? src.worker : null;\n const verbosity = src.verbosity;\n // Ignore \"data:\"-URLs, since they can't be used to recover valid absolute\n // URLs anyway. We want to avoid sending them to the worker-thread, since\n // they contain the *entire* PDF document and can thus be arbitrarily long.\n const docBaseUrl =\n typeof src.docBaseUrl === \"string\" && !isDataScheme(src.docBaseUrl)\n ? src.docBaseUrl\n : null;\n const cMapUrl = typeof src.cMapUrl === \"string\" ? src.cMapUrl : null;\n const cMapPacked = src.cMapPacked !== false;\n const CMapReaderFactory = src.CMapReaderFactory || DefaultCMapReaderFactory;\n const standardFontDataUrl =\n typeof src.standardFontDataUrl === \"string\"\n ? src.standardFontDataUrl\n : null;\n const StandardFontDataFactory =\n src.StandardFontDataFactory || DefaultStandardFontDataFactory;\n const ignoreErrors = src.stopAtErrors !== true;\n const maxImageSize =\n Number.isInteger(src.maxImageSize) && src.maxImageSize > -1\n ? src.maxImageSize\n : -1;\n const isEvalSupported = src.isEvalSupported !== false;\n const isOffscreenCanvasSupported =\n typeof src.isOffscreenCanvasSupported === \"boolean\"\n ? src.isOffscreenCanvasSupported\n : !isNodeJS;\n const canvasMaxAreaInBytes = Number.isInteger(src.canvasMaxAreaInBytes)\n ? src.canvasMaxAreaInBytes\n : -1;\n const disableFontFace =\n typeof src.disableFontFace === \"boolean\" ? src.disableFontFace : isNodeJS;\n const fontExtraProperties = src.fontExtraProperties === true;\n const enableXfa = src.enableXfa === true;\n const ownerDocument = src.ownerDocument || globalThis.document;\n const disableRange = src.disableRange === true;\n const disableStream = src.disableStream === true;\n const disableAutoFetch = src.disableAutoFetch === true;\n const pdfBug = src.pdfBug === true;\n const enableHWA = src.enableHWA === true;\n\n // Parameters whose default values depend on other parameters.\n const length = rangeTransport ? rangeTransport.length : src.length ?? NaN;\n const useSystemFonts =\n typeof src.useSystemFonts === \"boolean\"\n ? src.useSystemFonts\n : !isNodeJS && !disableFontFace;\n const useWorkerFetch =\n typeof src.useWorkerFetch === \"boolean\"\n ? src.useWorkerFetch\n : (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n (CMapReaderFactory === DOMCMapReaderFactory &&\n StandardFontDataFactory === DOMStandardFontDataFactory &&\n cMapUrl &&\n standardFontDataUrl &&\n isValidFetchUrl(cMapUrl, document.baseURI) &&\n isValidFetchUrl(standardFontDataUrl, document.baseURI));\n const canvasFactory =\n src.canvasFactory || new DefaultCanvasFactory({ ownerDocument, enableHWA });\n const filterFactory =\n src.filterFactory || new DefaultFilterFactory({ docId, ownerDocument });\n\n // Parameters only intended for development/testing purposes.\n const styleElement =\n typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")\n ? src.styleElement\n : null;\n\n // Set the main-thread verbosity level.\n setVerbosityLevel(verbosity);\n\n // Ensure that the various factories can be initialized, when necessary,\n // since the user may provide *custom* ones.\n const transportFactory = {\n canvasFactory,\n filterFactory,\n };\n if (!useWorkerFetch) {\n transportFactory.cMapReaderFactory = new CMapReaderFactory({\n baseUrl: cMapUrl,\n isCompressed: cMapPacked,\n });\n transportFactory.standardFontDataFactory = new StandardFontDataFactory({\n baseUrl: standardFontDataUrl,\n });\n }\n\n if (!worker) {\n const workerParams = {\n verbosity,\n port: GlobalWorkerOptions.workerPort,\n };\n // Worker was not provided -- creating and owning our own. If message port\n // is specified in global worker options, using it.\n worker = workerParams.port\n ? PDFWorker.fromPort(workerParams)\n : new PDFWorker(workerParams);\n task._worker = worker;\n }\n\n const docParams = {\n docId,\n apiVersion:\n typeof PDFJSDev !== \"undefined\" && !PDFJSDev.test(\"TESTING\")\n ? PDFJSDev.eval(\"BUNDLE_VERSION\")\n : null,\n data,\n password,\n disableAutoFetch,\n rangeChunkSize,\n length,\n docBaseUrl,\n enableXfa,\n evaluatorOptions: {\n maxImageSize,\n disableFontFace,\n ignoreErrors,\n isEvalSupported,\n isOffscreenCanvasSupported,\n canvasMaxAreaInBytes,\n fontExtraProperties,\n useSystemFonts,\n cMapUrl: useWorkerFetch ? cMapUrl : null,\n standardFontDataUrl: useWorkerFetch ? standardFontDataUrl : null,\n },\n };\n const transportParams = {\n disableFontFace,\n fontExtraProperties,\n ownerDocument,\n pdfBug,\n styleElement,\n loadingParams: {\n disableAutoFetch,\n enableXfa,\n },\n };\n\n worker.promise\n .then(function () {\n if (task.destroyed) {\n throw new Error(\"Loading aborted\");\n }\n if (worker.destroyed) {\n throw new Error(\"Worker was destroyed\");\n }\n\n const workerIdPromise = worker.messageHandler.sendWithPromise(\n \"GetDocRequest\",\n docParams,\n data ? [data.buffer] : null\n );\n\n let networkStream;\n if (rangeTransport) {\n networkStream = new PDFDataTransportStream(rangeTransport, {\n disableRange,\n disableStream,\n });\n } else if (!data) {\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n throw new Error(\"Not implemented: createPDFNetworkStream\");\n }\n if (!url) {\n throw new Error(\"getDocument - no `url` parameter provided.\");\n }\n const createPDFNetworkStream = params => {\n if (\n typeof PDFJSDev !== \"undefined\" &&\n PDFJSDev.test(\"GENERIC\") &&\n isNodeJS\n ) {\n const isFetchSupported = function () {\n return (\n typeof fetch !== \"undefined\" &&\n typeof Response !== \"undefined\" &&\n \"body\" in Response.prototype\n );\n };\n return isFetchSupported() && isValidFetchUrl(params.url)\n ? new PDFFetchStream(params)\n : new PDFNodeStream(params);\n }\n return isValidFetchUrl(params.url)\n ? new PDFFetchStream(params)\n : new PDFNetworkStream(params);\n };\n\n networkStream = createPDFNetworkStream({\n url,\n length,\n httpHeaders,\n withCredentials,\n rangeChunkSize,\n disableRange,\n disableStream,\n });\n }\n\n return workerIdPromise.then(workerId => {\n if (task.destroyed) {\n throw new Error(\"Loading aborted\");\n }\n if (worker.destroyed) {\n throw new Error(\"Worker was destroyed\");\n }\n\n const messageHandler = new MessageHandler(docId, workerId, worker.port);\n const transport = new WorkerTransport(\n messageHandler,\n task,\n networkStream,\n transportParams,\n transportFactory\n );\n task._transport = transport;\n messageHandler.send(\"Ready\", null);\n });\n })\n .catch(task._capability.reject);\n\n return task;\n}\n\nfunction getUrlProp(val) {\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n return null; // The 'url' is unused with `PDFDataRangeTransport`.\n }\n if (val instanceof URL) {\n return val.href;\n }\n try {\n // The full path is required in the 'url' field.\n return new URL(val, window.location).href;\n } catch {\n if (\n typeof PDFJSDev !== \"undefined\" &&\n PDFJSDev.test(\"GENERIC\") &&\n isNodeJS &&\n typeof val === \"string\"\n ) {\n return val; // Use the url as-is in Node.js environments.\n }\n }\n throw new Error(\n \"Invalid PDF url data: \" +\n \"either string or URL-object is expected in the url property.\"\n );\n}\n\nfunction getDataProp(val) {\n // Converting string or array-like data to Uint8Array.\n if (\n typeof PDFJSDev !== \"undefined\" &&\n PDFJSDev.test(\"GENERIC\") &&\n isNodeJS &&\n typeof Buffer !== \"undefined\" && // eslint-disable-line no-undef\n val instanceof Buffer // eslint-disable-line no-undef\n ) {\n throw new Error(\n \"Please provide binary data as `Uint8Array`, rather than `Buffer`.\"\n );\n }\n if (val instanceof Uint8Array && val.byteLength === val.buffer.byteLength) {\n // Use the data as-is when it's already a Uint8Array that completely\n // \"utilizes\" its underlying ArrayBuffer, to prevent any possible\n // issues when transferring it to the worker-thread.\n return val;\n }\n if (typeof val === \"string\") {\n return stringToBytes(val);\n }\n if (\n val instanceof ArrayBuffer ||\n ArrayBuffer.isView(val) ||\n (typeof val === \"object\" && !isNaN(val?.length))\n ) {\n return new Uint8Array(val);\n }\n throw new Error(\n \"Invalid PDF binary data: either TypedArray, \" +\n \"string, or array-like object is expected in the data property.\"\n );\n}\n\nfunction isRefProxy(ref) {\n return (\n typeof ref === \"object\" &&\n Number.isInteger(ref?.num) &&\n ref.num >= 0 &&\n Number.isInteger(ref?.gen) &&\n ref.gen >= 0\n );\n}\n\n/**\n * @typedef {Object} OnProgressParameters\n * @property {number} loaded - Currently loaded number of bytes.\n * @property {number} total - Total number of bytes in the PDF file.\n */\n\n/**\n * The loading task controls the operations required to load a PDF document\n * (such as network requests) and provides a way to listen for completion,\n * after which individual pages can be rendered.\n */\nclass PDFDocumentLoadingTask {\n static #docId = 0;\n\n constructor() {\n this._capability = Promise.withResolvers();\n this._transport = null;\n this._worker = null;\n\n /**\n * Unique identifier for the document loading task.\n * @type {string}\n */\n this.docId = `d${PDFDocumentLoadingTask.#docId++}`;\n\n /**\n * Whether the loading task is destroyed or not.\n * @type {boolean}\n */\n this.destroyed = false;\n\n /**\n * Callback to request a password if a wrong or no password was provided.\n * The callback receives two parameters: a function that should be called\n * with the new password, and a reason (see {@link PasswordResponses}).\n * @type {function}\n */\n this.onPassword = null;\n\n /**\n * Callback to be able to monitor the loading progress of the PDF file\n * (necessary to implement e.g. a loading bar).\n * The callback receives an {@link OnProgressParameters} argument.\n * @type {function}\n */\n this.onProgress = null;\n }\n\n /**\n * Promise for document loading task completion.\n * @type {Promise}\n */\n get promise() {\n return this._capability.promise;\n }\n\n /**\n * Abort all network requests and destroy the worker.\n * @returns {Promise} A promise that is resolved when destruction is\n * completed.\n */\n async destroy() {\n this.destroyed = true;\n try {\n if (this._worker?.port) {\n this._worker._pendingDestroy = true;\n }\n await this._transport?.destroy();\n } catch (ex) {\n if (this._worker?.port) {\n delete this._worker._pendingDestroy;\n }\n throw ex;\n }\n\n this._transport = null;\n if (this._worker) {\n this._worker.destroy();\n this._worker = null;\n }\n }\n}\n\n/**\n * Abstract class to support range requests file loading.\n *\n * NOTE: The TypedArrays passed to the constructor and relevant methods below\n * will generally be transferred to the worker-thread. This will help reduce\n * main-thread memory usage, however it will take ownership of the TypedArrays.\n */\nclass PDFDataRangeTransport {\n /**\n * @param {number} length\n * @param {Uint8Array|null} initialData\n * @param {boolean} [progressiveDone]\n * @param {string} [contentDispositionFilename]\n */\n constructor(\n length,\n initialData,\n progressiveDone = false,\n contentDispositionFilename = null\n ) {\n this.length = length;\n this.initialData = initialData;\n this.progressiveDone = progressiveDone;\n this.contentDispositionFilename = contentDispositionFilename;\n\n this._rangeListeners = [];\n this._progressListeners = [];\n this._progressiveReadListeners = [];\n this._progressiveDoneListeners = [];\n this._readyCapability = Promise.withResolvers();\n }\n\n /**\n * @param {function} listener\n */\n addRangeListener(listener) {\n this._rangeListeners.push(listener);\n }\n\n /**\n * @param {function} listener\n */\n addProgressListener(listener) {\n this._progressListeners.push(listener);\n }\n\n /**\n * @param {function} listener\n */\n addProgressiveReadListener(listener) {\n this._progressiveReadListeners.push(listener);\n }\n\n /**\n * @param {function} listener\n */\n addProgressiveDoneListener(listener) {\n this._progressiveDoneListeners.push(listener);\n }\n\n /**\n * @param {number} begin\n * @param {Uint8Array|null} chunk\n */\n onDataRange(begin, chunk) {\n for (const listener of this._rangeListeners) {\n listener(begin, chunk);\n }\n }\n\n /**\n * @param {number} loaded\n * @param {number|undefined} total\n */\n onDataProgress(loaded, total) {\n this._readyCapability.promise.then(() => {\n for (const listener of this._progressListeners) {\n listener(loaded, total);\n }\n });\n }\n\n /**\n * @param {Uint8Array|null} chunk\n */\n onDataProgressiveRead(chunk) {\n this._readyCapability.promise.then(() => {\n for (const listener of this._progressiveReadListeners) {\n listener(chunk);\n }\n });\n }\n\n onDataProgressiveDone() {\n this._readyCapability.promise.then(() => {\n for (const listener of this._progressiveDoneListeners) {\n listener();\n }\n });\n }\n\n transportReady() {\n this._readyCapability.resolve();\n }\n\n /**\n * @param {number} begin\n * @param {number} end\n */\n requestDataRange(begin, end) {\n unreachable(\"Abstract method PDFDataRangeTransport.requestDataRange\");\n }\n\n abort() {}\n}\n\n/**\n * Proxy to a `PDFDocument` in the worker thread.\n */\nclass PDFDocumentProxy {\n constructor(pdfInfo, transport) {\n this._pdfInfo = pdfInfo;\n this._transport = transport;\n\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n // For testing purposes.\n Object.defineProperty(this, \"getNetworkStreamName\", {\n value: () => this._transport.getNetworkStreamName(),\n });\n Object.defineProperty(this, \"getXFADatasets\", {\n value: () => this._transport.getXFADatasets(),\n });\n Object.defineProperty(this, \"getXRefPrevValue\", {\n value: () => this._transport.getXRefPrevValue(),\n });\n Object.defineProperty(this, \"getStartXRefPos\", {\n value: () => this._transport.getStartXRefPos(),\n });\n Object.defineProperty(this, \"getAnnotArray\", {\n value: pageIndex => this._transport.getAnnotArray(pageIndex),\n });\n }\n }\n\n /**\n * @type {AnnotationStorage} Storage for annotation data in forms.\n */\n get annotationStorage() {\n return this._transport.annotationStorage;\n }\n\n /**\n * @type {Object} The filter factory instance.\n */\n get filterFactory() {\n return this._transport.filterFactory;\n }\n\n /**\n * @type {number} Total number of pages in the PDF file.\n */\n get numPages() {\n return this._pdfInfo.numPages;\n }\n\n /**\n * @type {Array} A (not guaranteed to be) unique ID to\n * identify the PDF document.\n * NOTE: The first element will always be defined for all PDF documents,\n * whereas the second element is only defined for *modified* PDF documents.\n */\n get fingerprints() {\n return this._pdfInfo.fingerprints;\n }\n\n /**\n * @type {boolean} True if only XFA form.\n */\n get isPureXfa() {\n return shadow(this, \"isPureXfa\", !!this._transport._htmlForXfa);\n }\n\n /**\n * NOTE: This is (mostly) intended to support printing of XFA forms.\n *\n * @type {Object | null} An object representing a HTML tree structure\n * to render the XFA, or `null` when no XFA form exists.\n */\n get allXfaHtml() {\n return this._transport._htmlForXfa;\n }\n\n /**\n * @param {number} pageNumber - The page number to get. The first page is 1.\n * @returns {Promise} A promise that is resolved with\n * a {@link PDFPageProxy} object.\n */\n getPage(pageNumber) {\n return this._transport.getPage(pageNumber);\n }\n\n /**\n * @param {RefProxy} ref - The page reference.\n * @returns {Promise} A promise that is resolved with the page index,\n * starting from zero, that is associated with the reference.\n */\n getPageIndex(ref) {\n return this._transport.getPageIndex(ref);\n }\n\n /**\n * @returns {Promise>>} A promise that is resolved\n * with a mapping from named destinations to references.\n *\n * This can be slow for large documents. Use `getDestination` instead.\n */\n getDestinations() {\n return this._transport.getDestinations();\n }\n\n /**\n * @param {string} id - The named destination to get.\n * @returns {Promise | null>} A promise that is resolved with all\n * information of the given named destination, or `null` when the named\n * destination is not present in the PDF file.\n */\n getDestination(id) {\n return this._transport.getDestination(id);\n }\n\n /**\n * @returns {Promise | null>} A promise that is resolved with\n * an {Array} containing the page labels that correspond to the page\n * indexes, or `null` when no page labels are present in the PDF file.\n */\n getPageLabels() {\n return this._transport.getPageLabels();\n }\n\n /**\n * @returns {Promise} A promise that is resolved with a {string}\n * containing the page layout name.\n */\n getPageLayout() {\n return this._transport.getPageLayout();\n }\n\n /**\n * @returns {Promise} A promise that is resolved with a {string}\n * containing the page mode name.\n */\n getPageMode() {\n return this._transport.getPageMode();\n }\n\n /**\n * @returns {Promise} A promise that is resolved with an\n * {Object} containing the viewer preferences, or `null` when no viewer\n * preferences are present in the PDF file.\n */\n getViewerPreferences() {\n return this._transport.getViewerPreferences();\n }\n\n /**\n * @returns {Promise} A promise that is resolved with an {Array}\n * containing the destination, or `null` when no open action is present\n * in the PDF.\n */\n getOpenAction() {\n return this._transport.getOpenAction();\n }\n\n /**\n * @returns {Promise} A promise that is resolved with a lookup table\n * for mapping named attachments to their content.\n */\n getAttachments() {\n return this._transport.getAttachments();\n }\n\n /**\n * @returns {Promise} A promise that is resolved with\n * an {Object} with the JavaScript actions:\n * - from the name tree.\n * - from A or AA entries in the catalog dictionary.\n * , or `null` if no JavaScript exists.\n */\n getJSActions() {\n return this._transport.getDocJSActions();\n }\n\n /**\n * @typedef {Object} OutlineNode\n * @property {string} title\n * @property {boolean} bold\n * @property {boolean} italic\n * @property {Uint8ClampedArray} color - The color in RGB format to use for\n * display purposes.\n * @property {string | Array | null} dest\n * @property {string | null} url\n * @property {string | undefined} unsafeUrl\n * @property {boolean | undefined} newWindow\n * @property {number | undefined} count\n * @property {Array} items\n */\n\n /**\n * @returns {Promise>} A promise that is resolved with an\n * {Array} that is a tree outline (if it has one) of the PDF file.\n */\n getOutline() {\n return this._transport.getOutline();\n }\n\n /**\n * @typedef {Object} GetOptionalContentConfigParameters\n * @property {string} [intent] - Determines the optional content groups that\n * are visible by default; valid values are:\n * - 'display' (viewable groups).\n * - 'print' (printable groups).\n * - 'any' (all groups).\n * The default value is 'display'.\n */\n\n /**\n * @param {GetOptionalContentConfigParameters} [params] - Optional content\n * config parameters.\n * @returns {Promise} A promise that is resolved with\n * an {@link OptionalContentConfig} that contains all the optional content\n * groups (assuming that the document has any).\n */\n getOptionalContentConfig({ intent = \"display\" } = {}) {\n const { renderingIntent } = this._transport.getRenderingIntent(intent);\n\n return this._transport.getOptionalContentConfig(renderingIntent);\n }\n\n /**\n * @returns {Promise | null>} A promise that is resolved with\n * an {Array} that contains the permission flags for the PDF document, or\n * `null` when no permissions are present in the PDF file.\n */\n getPermissions() {\n return this._transport.getPermissions();\n }\n\n /**\n * @returns {Promise<{ info: Object, metadata: Metadata }>} A promise that is\n * resolved with an {Object} that has `info` and `metadata` properties.\n * `info` is an {Object} filled with anything available in the information\n * dictionary and similarly `metadata` is a {Metadata} object with\n * information from the metadata section of the PDF.\n */\n getMetadata() {\n return this._transport.getMetadata();\n }\n\n /**\n * @typedef {Object} MarkInfo\n * Properties correspond to Table 321 of the PDF 32000-1:2008 spec.\n * @property {boolean} Marked\n * @property {boolean} UserProperties\n * @property {boolean} Suspects\n */\n\n /**\n * @returns {Promise} A promise that is resolved with\n * a {MarkInfo} object that contains the MarkInfo flags for the PDF\n * document, or `null` when no MarkInfo values are present in the PDF file.\n */\n getMarkInfo() {\n return this._transport.getMarkInfo();\n }\n\n /**\n * @returns {Promise} A promise that is resolved with a\n * {Uint8Array} containing the raw data of the PDF document.\n */\n getData() {\n return this._transport.getData();\n }\n\n /**\n * @returns {Promise} A promise that is resolved with a\n * {Uint8Array} containing the full data of the saved document.\n */\n saveDocument() {\n return this._transport.saveDocument();\n }\n\n /**\n * @returns {Promise<{ length: number }>} A promise that is resolved when the\n * document's data is loaded. It is resolved with an {Object} that contains\n * the `length` property that indicates size of the PDF data in bytes.\n */\n getDownloadInfo() {\n return this._transport.downloadInfoCapability.promise;\n }\n\n /**\n * Cleans up resources allocated by the document on both the main and worker\n * threads.\n *\n * NOTE: Do not, under any circumstances, call this method when rendering is\n * currently ongoing since that may lead to rendering errors.\n *\n * @param {boolean} [keepLoadedFonts] - Let fonts remain attached to the DOM.\n * NOTE: This will increase persistent memory usage, hence don't use this\n * option unless absolutely necessary. The default value is `false`.\n * @returns {Promise} A promise that is resolved when clean-up has finished.\n */\n cleanup(keepLoadedFonts = false) {\n return this._transport.startCleanup(keepLoadedFonts || this.isPureXfa);\n }\n\n /**\n * Destroys the current document instance and terminates the worker.\n */\n destroy() {\n return this.loadingTask.destroy();\n }\n\n /**\n * @param {RefProxy} ref - The page reference.\n * @returns {number | null} The page number, if it's cached.\n */\n cachedPageNumber(ref) {\n return this._transport.cachedPageNumber(ref);\n }\n\n /**\n * @type {DocumentInitParameters} A subset of the current\n * {DocumentInitParameters}, which are needed in the viewer.\n */\n get loadingParams() {\n return this._transport.loadingParams;\n }\n\n /**\n * @type {PDFDocumentLoadingTask} The loadingTask for the current document.\n */\n get loadingTask() {\n return this._transport.loadingTask;\n }\n\n /**\n * @returns {Promise> | null>} A promise that is\n * resolved with an {Object} containing /AcroForm field data for the JS\n * sandbox, or `null` when no field data is present in the PDF file.\n */\n getFieldObjects() {\n return this._transport.getFieldObjects();\n }\n\n /**\n * @returns {Promise} A promise that is resolved with `true`\n * if some /AcroForm fields have JavaScript actions.\n */\n hasJSActions() {\n return this._transport.hasJSActions();\n }\n\n /**\n * @returns {Promise | null>} A promise that is resolved with an\n * {Array} containing IDs of annotations that have a calculation\n * action, or `null` when no such annotations are present in the PDF file.\n */\n getCalculationOrderIds() {\n return this._transport.getCalculationOrderIds();\n }\n}\n\n/**\n * Page getViewport parameters.\n *\n * @typedef {Object} GetViewportParameters\n * @property {number} scale - The desired scale of the viewport.\n * @property {number} [rotation] - The desired rotation, in degrees, of\n * the viewport. If omitted it defaults to the page rotation.\n * @property {number} [offsetX] - The horizontal, i.e. x-axis, offset.\n * The default value is `0`.\n * @property {number} [offsetY] - The vertical, i.e. y-axis, offset.\n * The default value is `0`.\n * @property {boolean} [dontFlip] - If true, the y-axis will not be\n * flipped. The default value is `false`.\n */\n\n/**\n * Page getTextContent parameters.\n *\n * @typedef {Object} getTextContentParameters\n * @property {boolean} [includeMarkedContent] - When true include marked\n * content items in the items array of TextContent. The default is `false`.\n * @property {boolean} [disableNormalization] - When true the text is *not*\n * normalized in the worker-thread. The default is `false`.\n */\n\n/**\n * Page text content.\n *\n * @typedef {Object} TextContent\n * @property {Array} items - Array of\n * {@link TextItem} and {@link TextMarkedContent} objects. TextMarkedContent\n * items are included when includeMarkedContent is true.\n * @property {Object} styles - {@link TextStyle} objects,\n * indexed by font name.\n * @property {string | null} lang - The document /Lang attribute.\n */\n\n/**\n * Page text content part.\n *\n * @typedef {Object} TextItem\n * @property {string} str - Text content.\n * @property {string} dir - Text direction: 'ttb', 'ltr' or 'rtl'.\n * @property {Array} transform - Transformation matrix.\n * @property {number} width - Width in device space.\n * @property {number} height - Height in device space.\n * @property {string} fontName - Font name used by PDF.js for converted font.\n * @property {boolean} hasEOL - Indicating if the text content is followed by a\n * line-break.\n */\n\n/**\n * Page text marked content part.\n *\n * @typedef {Object} TextMarkedContent\n * @property {string} type - Either 'beginMarkedContent',\n * 'beginMarkedContentProps', or 'endMarkedContent'.\n * @property {string} id - The marked content identifier. Only used for type\n * 'beginMarkedContentProps'.\n */\n\n/**\n * Text style.\n *\n * @typedef {Object} TextStyle\n * @property {number} ascent - Font ascent.\n * @property {number} descent - Font descent.\n * @property {boolean} vertical - Whether or not the text is in vertical mode.\n * @property {string} fontFamily - The possible font family.\n */\n\n/**\n * Page annotation parameters.\n *\n * @typedef {Object} GetAnnotationsParameters\n * @property {string} [intent] - Determines the annotations that are fetched,\n * can be 'display' (viewable annotations), 'print' (printable annotations),\n * or 'any' (all annotations). The default value is 'display'.\n */\n\n/**\n * Page render parameters.\n *\n * @typedef {Object} RenderParameters\n * @property {CanvasRenderingContext2D} canvasContext - A 2D context of a DOM\n * Canvas object.\n * @property {PageViewport} viewport - Rendering viewport obtained by calling\n * the `PDFPageProxy.getViewport` method.\n * @property {string} [intent] - Rendering intent, can be 'display', 'print',\n * or 'any'. The default value is 'display'.\n * @property {number} [annotationMode] Controls which annotations are rendered\n * onto the canvas, for annotations with appearance-data; the values from\n * {@link AnnotationMode} should be used. The following values are supported:\n * - `AnnotationMode.DISABLE`, which disables all annotations.\n * - `AnnotationMode.ENABLE`, which includes all possible annotations (thus\n * it also depends on the `intent`-option, see above).\n * - `AnnotationMode.ENABLE_FORMS`, which excludes annotations that contain\n * interactive form elements (those will be rendered in the display layer).\n * - `AnnotationMode.ENABLE_STORAGE`, which includes all possible annotations\n * (as above) but where interactive form elements are updated with data\n * from the {@link AnnotationStorage}-instance; useful e.g. for printing.\n * The default value is `AnnotationMode.ENABLE`.\n * @property {Array} [transform] - Additional transform, applied just\n * before viewport transform.\n * @property {CanvasGradient | CanvasPattern | string} [background] - Background\n * to use for the canvas.\n * Any valid `canvas.fillStyle` can be used: a `DOMString` parsed as CSS\n * value, a `CanvasGradient` object (a linear or radial gradient) or\n * a `CanvasPattern` object (a repetitive image). The default value is\n * 'rgb(255,255,255)'.\n *\n * NOTE: This option may be partially, or completely, ignored when the\n * `pageColors`-option is used.\n * @property {Object} [pageColors] - Overwrites background and foreground colors\n * with user defined ones in order to improve readability in high contrast\n * mode.\n * @property {Promise} [optionalContentConfigPromise] -\n * A promise that should resolve with an {@link OptionalContentConfig}\n * created from `PDFDocumentProxy.getOptionalContentConfig`. If `null`,\n * the configuration will be fetched automatically with the default visibility\n * states set.\n * @property {Map} [annotationCanvasMap] - Map some\n * annotation ids with canvases used to render them.\n * @property {PrintAnnotationStorage} [printAnnotationStorage]\n */\n\n/**\n * Page getOperatorList parameters.\n *\n * @typedef {Object} GetOperatorListParameters\n * @property {string} [intent] - Rendering intent, can be 'display', 'print',\n * or 'any'. The default value is 'display'.\n * @property {number} [annotationMode] Controls which annotations are included\n * in the operatorList, for annotations with appearance-data; the values from\n * {@link AnnotationMode} should be used. The following values are supported:\n * - `AnnotationMode.DISABLE`, which disables all annotations.\n * - `AnnotationMode.ENABLE`, which includes all possible annotations (thus\n * it also depends on the `intent`-option, see above).\n * - `AnnotationMode.ENABLE_FORMS`, which excludes annotations that contain\n * interactive form elements (those will be rendered in the display layer).\n * - `AnnotationMode.ENABLE_STORAGE`, which includes all possible annotations\n * (as above) but where interactive form elements are updated with data\n * from the {@link AnnotationStorage}-instance; useful e.g. for printing.\n * The default value is `AnnotationMode.ENABLE`.\n * @property {PrintAnnotationStorage} [printAnnotationStorage]\n */\n\n/**\n * Structure tree node. The root node will have a role \"Root\".\n *\n * @typedef {Object} StructTreeNode\n * @property {Array} children - Array of\n * {@link StructTreeNode} and {@link StructTreeContent} objects.\n * @property {string} role - element's role, already mapped if a role map exists\n * in the PDF.\n */\n\n/**\n * Structure tree content.\n *\n * @typedef {Object} StructTreeContent\n * @property {string} type - either \"content\" for page and stream structure\n * elements or \"object\" for object references.\n * @property {string} id - unique id that will map to the text layer.\n */\n\n/**\n * PDF page operator list.\n *\n * @typedef {Object} PDFOperatorList\n * @property {Array} fnArray - Array containing the operator functions.\n * @property {Array} argsArray - Array containing the arguments of the\n * functions.\n */\n\n/**\n * Proxy to a `PDFPage` in the worker thread.\n */\nclass PDFPageProxy {\n #delayedCleanupTimeout = null;\n\n #pendingCleanup = false;\n\n constructor(pageIndex, pageInfo, transport, pdfBug = false) {\n this._pageIndex = pageIndex;\n this._pageInfo = pageInfo;\n this._transport = transport;\n this._stats = pdfBug ? new StatTimer() : null;\n this._pdfBug = pdfBug;\n /** @type {PDFObjects} */\n this.commonObjs = transport.commonObjs;\n this.objs = new PDFObjects();\n\n this._maybeCleanupAfterRender = false;\n this._intentStates = new Map();\n this.destroyed = false;\n }\n\n /**\n * @type {number} Page number of the page. First page is 1.\n */\n get pageNumber() {\n return this._pageIndex + 1;\n }\n\n /**\n * @type {number} The number of degrees the page is rotated clockwise.\n */\n get rotate() {\n return this._pageInfo.rotate;\n }\n\n /**\n * @type {RefProxy | null} The reference that points to this page.\n */\n get ref() {\n return this._pageInfo.ref;\n }\n\n /**\n * @type {number} The default size of units in 1/72nds of an inch.\n */\n get userUnit() {\n return this._pageInfo.userUnit;\n }\n\n /**\n * @type {Array} An array of the visible portion of the PDF page in\n * user space units [x1, y1, x2, y2].\n */\n get view() {\n return this._pageInfo.view;\n }\n\n /**\n * @param {GetViewportParameters} params - Viewport parameters.\n * @returns {PageViewport} Contains 'width' and 'height' properties\n * along with transforms required for rendering.\n */\n getViewport({\n scale,\n rotation = this.rotate,\n offsetX = 0,\n offsetY = 0,\n dontFlip = false,\n } = {}) {\n return new PageViewport({\n viewBox: this.view,\n scale,\n rotation,\n offsetX,\n offsetY,\n dontFlip,\n });\n }\n\n /**\n * @param {GetAnnotationsParameters} [params] - Annotation parameters.\n * @returns {Promise>} A promise that is resolved with an\n * {Array} of the annotation objects.\n */\n getAnnotations({ intent = \"display\" } = {}) {\n const { renderingIntent } = this._transport.getRenderingIntent(intent);\n\n return this._transport.getAnnotations(this._pageIndex, renderingIntent);\n }\n\n /**\n * @returns {Promise} A promise that is resolved with an\n * {Object} with JS actions.\n */\n getJSActions() {\n return this._transport.getPageJSActions(this._pageIndex);\n }\n\n /**\n * @type {Object} The filter factory instance.\n */\n get filterFactory() {\n return this._transport.filterFactory;\n }\n\n /**\n * @type {boolean} True if only XFA form.\n */\n get isPureXfa() {\n return shadow(this, \"isPureXfa\", !!this._transport._htmlForXfa);\n }\n\n /**\n * @returns {Promise} A promise that is resolved with\n * an {Object} with a fake DOM object (a tree structure where elements\n * are {Object} with a name, attributes (class, style, ...), value and\n * children, very similar to a HTML DOM tree), or `null` if no XFA exists.\n */\n async getXfa() {\n return this._transport._htmlForXfa?.children[this._pageIndex] || null;\n }\n\n /**\n * Begins the process of rendering a page to the desired context.\n *\n * @param {RenderParameters} params - Page render parameters.\n * @returns {RenderTask} An object that contains a promise that is\n * resolved when the page finishes rendering.\n */\n render({\n canvasContext,\n viewport,\n intent = \"display\",\n annotationMode = AnnotationMode.ENABLE,\n transform = null,\n background = null,\n optionalContentConfigPromise = null,\n annotationCanvasMap = null,\n pageColors = null,\n printAnnotationStorage = null,\n }) {\n this._stats?.time(\"Overall\");\n\n const intentArgs = this._transport.getRenderingIntent(\n intent,\n annotationMode,\n printAnnotationStorage\n );\n const { renderingIntent, cacheKey } = intentArgs;\n // If there was a pending destroy, cancel it so no cleanup happens during\n // this call to render...\n this.#pendingCleanup = false;\n // ... and ensure that a delayed cleanup is always aborted.\n this.#abortDelayedCleanup();\n\n optionalContentConfigPromise ||=\n this._transport.getOptionalContentConfig(renderingIntent);\n\n let intentState = this._intentStates.get(cacheKey);\n if (!intentState) {\n intentState = Object.create(null);\n this._intentStates.set(cacheKey, intentState);\n }\n\n // Ensure that a pending `streamReader` cancel timeout is always aborted.\n if (intentState.streamReaderCancelTimeout) {\n clearTimeout(intentState.streamReaderCancelTimeout);\n intentState.streamReaderCancelTimeout = null;\n }\n\n const intentPrint = !!(renderingIntent & RenderingIntentFlag.PRINT);\n\n // If there's no displayReadyCapability yet, then the operatorList\n // was never requested before. Make the request and create the promise.\n if (!intentState.displayReadyCapability) {\n intentState.displayReadyCapability = Promise.withResolvers();\n intentState.operatorList = {\n fnArray: [],\n argsArray: [],\n lastChunk: false,\n separateAnnots: null,\n };\n\n this._stats?.time(\"Page Request\");\n this._pumpOperatorList(intentArgs);\n }\n\n const complete = error => {\n intentState.renderTasks.delete(internalRenderTask);\n\n // Attempt to reduce memory usage during *printing*, by always running\n // cleanup immediately once rendering has finished.\n if (this._maybeCleanupAfterRender || intentPrint) {\n this.#pendingCleanup = true;\n }\n this.#tryCleanup(/* delayed = */ !intentPrint);\n\n if (error) {\n internalRenderTask.capability.reject(error);\n\n this._abortOperatorList({\n intentState,\n reason: error instanceof Error ? error : new Error(error),\n });\n } else {\n internalRenderTask.capability.resolve();\n }\n\n if (this._stats) {\n this._stats.timeEnd(\"Rendering\");\n this._stats.timeEnd(\"Overall\");\n\n if (globalThis.Stats?.enabled) {\n globalThis.Stats.add(this.pageNumber, this._stats);\n }\n }\n };\n\n const internalRenderTask = new InternalRenderTask({\n callback: complete,\n // Only include the required properties, and *not* the entire object.\n params: {\n canvasContext,\n viewport,\n transform,\n background,\n },\n objs: this.objs,\n commonObjs: this.commonObjs,\n annotationCanvasMap,\n operatorList: intentState.operatorList,\n pageIndex: this._pageIndex,\n canvasFactory: this._transport.canvasFactory,\n filterFactory: this._transport.filterFactory,\n useRequestAnimationFrame: !intentPrint,\n pdfBug: this._pdfBug,\n pageColors,\n });\n\n (intentState.renderTasks ||= new Set()).add(internalRenderTask);\n const renderTask = internalRenderTask.task;\n\n Promise.all([\n intentState.displayReadyCapability.promise,\n optionalContentConfigPromise,\n ])\n .then(([transparency, optionalContentConfig]) => {\n if (this.destroyed) {\n complete();\n return;\n }\n this._stats?.time(\"Rendering\");\n\n if (!(optionalContentConfig.renderingIntent & renderingIntent)) {\n throw new Error(\n \"Must use the same `intent`-argument when calling the `PDFPageProxy.render` \" +\n \"and `PDFDocumentProxy.getOptionalContentConfig` methods.\"\n );\n }\n internalRenderTask.initializeGraphics({\n transparency,\n optionalContentConfig,\n });\n internalRenderTask.operatorListChanged();\n })\n .catch(complete);\n\n return renderTask;\n }\n\n /**\n * @param {GetOperatorListParameters} params - Page getOperatorList\n * parameters.\n * @returns {Promise} A promise resolved with an\n * {@link PDFOperatorList} object that represents the page's operator list.\n */\n getOperatorList({\n intent = \"display\",\n annotationMode = AnnotationMode.ENABLE,\n printAnnotationStorage = null,\n } = {}) {\n if (typeof PDFJSDev !== \"undefined\" && !PDFJSDev.test(\"GENERIC\")) {\n throw new Error(\"Not implemented: getOperatorList\");\n }\n function operatorListChanged() {\n if (intentState.operatorList.lastChunk) {\n intentState.opListReadCapability.resolve(intentState.operatorList);\n\n intentState.renderTasks.delete(opListTask);\n }\n }\n\n const intentArgs = this._transport.getRenderingIntent(\n intent,\n annotationMode,\n printAnnotationStorage,\n /* isOpList = */ true\n );\n let intentState = this._intentStates.get(intentArgs.cacheKey);\n if (!intentState) {\n intentState = Object.create(null);\n this._intentStates.set(intentArgs.cacheKey, intentState);\n }\n let opListTask;\n\n if (!intentState.opListReadCapability) {\n opListTask = Object.create(null);\n opListTask.operatorListChanged = operatorListChanged;\n intentState.opListReadCapability = Promise.withResolvers();\n (intentState.renderTasks ||= new Set()).add(opListTask);\n intentState.operatorList = {\n fnArray: [],\n argsArray: [],\n lastChunk: false,\n separateAnnots: null,\n };\n\n this._stats?.time(\"Page Request\");\n this._pumpOperatorList(intentArgs);\n }\n return intentState.opListReadCapability.promise;\n }\n\n /**\n * NOTE: All occurrences of whitespace will be replaced by\n * standard spaces (0x20).\n *\n * @param {getTextContentParameters} params - getTextContent parameters.\n * @returns {ReadableStream} Stream for reading text content chunks.\n */\n streamTextContent({\n includeMarkedContent = false,\n disableNormalization = false,\n } = {}) {\n const TEXT_CONTENT_CHUNK_SIZE = 100;\n\n return this._transport.messageHandler.sendWithStream(\n \"GetTextContent\",\n {\n pageIndex: this._pageIndex,\n includeMarkedContent: includeMarkedContent === true,\n disableNormalization: disableNormalization === true,\n },\n {\n highWaterMark: TEXT_CONTENT_CHUNK_SIZE,\n size(textContent) {\n return textContent.items.length;\n },\n }\n );\n }\n\n /**\n * NOTE: All occurrences of whitespace will be replaced by\n * standard spaces (0x20).\n *\n * @param {getTextContentParameters} params - getTextContent parameters.\n * @returns {Promise} A promise that is resolved with a\n * {@link TextContent} object that represents the page's text content.\n */\n getTextContent(params = {}) {\n if (this._transport._htmlForXfa) {\n // TODO: We need to revisit this once the XFA foreground patch lands and\n // only do this for non-foreground XFA.\n return this.getXfa().then(xfa => XfaText.textContent(xfa));\n }\n const readableStream = this.streamTextContent(params);\n\n return new Promise(function (resolve, reject) {\n function pump() {\n reader.read().then(function ({ value, done }) {\n if (done) {\n resolve(textContent);\n return;\n }\n textContent.lang ??= value.lang;\n Object.assign(textContent.styles, value.styles);\n textContent.items.push(...value.items);\n pump();\n }, reject);\n }\n\n const reader = readableStream.getReader();\n const textContent = {\n items: [],\n styles: Object.create(null),\n lang: null,\n };\n pump();\n });\n }\n\n /**\n * @returns {Promise} A promise that is resolved with a\n * {@link StructTreeNode} object that represents the page's structure tree,\n * or `null` when no structure tree is present for the current page.\n */\n getStructTree() {\n return this._transport.getStructTree(this._pageIndex);\n }\n\n /**\n * Destroys the page object.\n * @private\n */\n _destroy() {\n this.destroyed = true;\n\n const waitOn = [];\n for (const intentState of this._intentStates.values()) {\n this._abortOperatorList({\n intentState,\n reason: new Error(\"Page was destroyed.\"),\n force: true,\n });\n\n if (intentState.opListReadCapability) {\n // Avoid errors below, since the renderTasks are just stubs.\n continue;\n }\n for (const internalRenderTask of intentState.renderTasks) {\n waitOn.push(internalRenderTask.completed);\n internalRenderTask.cancel();\n }\n }\n this.objs.clear();\n this.#pendingCleanup = false;\n this.#abortDelayedCleanup();\n\n return Promise.all(waitOn);\n }\n\n /**\n * Cleans up resources allocated by the page.\n *\n * @param {boolean} [resetStats] - Reset page stats, if enabled.\n * The default value is `false`.\n * @returns {boolean} Indicates if clean-up was successfully run.\n */\n cleanup(resetStats = false) {\n this.#pendingCleanup = true;\n const success = this.#tryCleanup(/* delayed = */ false);\n\n if (resetStats && success) {\n this._stats &&= new StatTimer();\n }\n return success;\n }\n\n /**\n * Attempts to clean up if rendering is in a state where that's possible.\n * @param {boolean} [delayed] - Delay the cleanup, to e.g. improve zooming\n * performance in documents with large images.\n * The default value is `false`.\n * @returns {boolean} Indicates if clean-up was successfully run.\n */\n #tryCleanup(delayed = false) {\n this.#abortDelayedCleanup();\n\n if (!this.#pendingCleanup || this.destroyed) {\n return false;\n }\n if (delayed) {\n this.#delayedCleanupTimeout = setTimeout(() => {\n this.#delayedCleanupTimeout = null;\n this.#tryCleanup(/* delayed = */ false);\n }, DELAYED_CLEANUP_TIMEOUT);\n\n return false;\n }\n for (const { renderTasks, operatorList } of this._intentStates.values()) {\n if (renderTasks.size > 0 || !operatorList.lastChunk) {\n return false;\n }\n }\n this._intentStates.clear();\n this.objs.clear();\n this.#pendingCleanup = false;\n return true;\n }\n\n #abortDelayedCleanup() {\n if (this.#delayedCleanupTimeout) {\n clearTimeout(this.#delayedCleanupTimeout);\n this.#delayedCleanupTimeout = null;\n }\n }\n\n /**\n * @private\n */\n _startRenderPage(transparency, cacheKey) {\n const intentState = this._intentStates.get(cacheKey);\n if (!intentState) {\n return; // Rendering was cancelled.\n }\n this._stats?.timeEnd(\"Page Request\");\n\n // TODO Refactor RenderPageRequest to separate rendering\n // and operator list logic\n intentState.displayReadyCapability?.resolve(transparency);\n }\n\n /**\n * @private\n */\n _renderPageChunk(operatorListChunk, intentState) {\n // Add the new chunk to the current operator list.\n for (let i = 0, ii = operatorListChunk.length; i < ii; i++) {\n intentState.operatorList.fnArray.push(operatorListChunk.fnArray[i]);\n intentState.operatorList.argsArray.push(operatorListChunk.argsArray[i]);\n }\n intentState.operatorList.lastChunk = operatorListChunk.lastChunk;\n intentState.operatorList.separateAnnots = operatorListChunk.separateAnnots;\n\n // Notify all the rendering tasks there are more operators to be consumed.\n for (const internalRenderTask of intentState.renderTasks) {\n internalRenderTask.operatorListChanged();\n }\n\n if (operatorListChunk.lastChunk) {\n this.#tryCleanup(/* delayed = */ true);\n }\n }\n\n /**\n * @private\n */\n _pumpOperatorList({\n renderingIntent,\n cacheKey,\n annotationStorageSerializable,\n }) {\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n assert(\n Number.isInteger(renderingIntent) && renderingIntent > 0,\n '_pumpOperatorList: Expected valid \"renderingIntent\" argument.'\n );\n }\n const { map, transfer } = annotationStorageSerializable;\n\n const readableStream = this._transport.messageHandler.sendWithStream(\n \"GetOperatorList\",\n {\n pageIndex: this._pageIndex,\n intent: renderingIntent,\n cacheKey,\n annotationStorage: map,\n },\n transfer\n );\n const reader = readableStream.getReader();\n\n const intentState = this._intentStates.get(cacheKey);\n intentState.streamReader = reader;\n\n const pump = () => {\n reader.read().then(\n ({ value, done }) => {\n if (done) {\n intentState.streamReader = null;\n return;\n }\n if (this._transport.destroyed) {\n return; // Ignore any pending requests if the worker was terminated.\n }\n this._renderPageChunk(value, intentState);\n pump();\n },\n reason => {\n intentState.streamReader = null;\n\n if (this._transport.destroyed) {\n return; // Ignore any pending requests if the worker was terminated.\n }\n if (intentState.operatorList) {\n // Mark operator list as complete.\n intentState.operatorList.lastChunk = true;\n\n for (const internalRenderTask of intentState.renderTasks) {\n internalRenderTask.operatorListChanged();\n }\n this.#tryCleanup(/* delayed = */ true);\n }\n\n if (intentState.displayReadyCapability) {\n intentState.displayReadyCapability.reject(reason);\n } else if (intentState.opListReadCapability) {\n intentState.opListReadCapability.reject(reason);\n } else {\n throw reason;\n }\n }\n );\n };\n pump();\n }\n\n /**\n * @private\n */\n _abortOperatorList({ intentState, reason, force = false }) {\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n assert(\n reason instanceof Error,\n '_abortOperatorList: Expected valid \"reason\" argument.'\n );\n }\n\n if (!intentState.streamReader) {\n return;\n }\n // Ensure that a pending `streamReader` cancel timeout is always aborted.\n if (intentState.streamReaderCancelTimeout) {\n clearTimeout(intentState.streamReaderCancelTimeout);\n intentState.streamReaderCancelTimeout = null;\n }\n\n if (!force) {\n // Ensure that an Error occurring in *only* one `InternalRenderTask`, e.g.\n // multiple render() calls on the same canvas, won't break all rendering.\n if (intentState.renderTasks.size > 0) {\n return;\n }\n // Don't immediately abort parsing on the worker-thread when rendering is\n // cancelled, since that will unnecessarily delay re-rendering when (for\n // partially parsed pages) e.g. zooming/rotation occurs in the viewer.\n if (reason instanceof RenderingCancelledException) {\n let delay = RENDERING_CANCELLED_TIMEOUT;\n if (reason.extraDelay > 0 && reason.extraDelay < /* ms = */ 1000) {\n // Above, we prevent the total delay from becoming arbitrarily large.\n delay += reason.extraDelay;\n }\n\n intentState.streamReaderCancelTimeout = setTimeout(() => {\n intentState.streamReaderCancelTimeout = null;\n this._abortOperatorList({ intentState, reason, force: true });\n }, delay);\n return;\n }\n }\n intentState.streamReader\n .cancel(new AbortException(reason.message))\n .catch(() => {\n // Avoid \"Uncaught promise\" messages in the console.\n });\n intentState.streamReader = null;\n\n if (this._transport.destroyed) {\n return; // Ignore any pending requests if the worker was terminated.\n }\n // Remove the current `intentState`, since a cancelled `getOperatorList`\n // call on the worker-thread cannot be re-started...\n for (const [curCacheKey, curIntentState] of this._intentStates) {\n if (curIntentState === intentState) {\n this._intentStates.delete(curCacheKey);\n break;\n }\n }\n // ... and force clean-up to ensure that any old state is always removed.\n this.cleanup();\n }\n\n /**\n * @type {StatTimer | null} Returns page stats, if enabled; returns `null`\n * otherwise.\n */\n get stats() {\n return this._stats;\n }\n}\n\nclass LoopbackPort {\n #listeners = new Set();\n\n #deferred = Promise.resolve();\n\n postMessage(obj, transfer) {\n const event = {\n data: structuredClone(obj, transfer ? { transfer } : null),\n };\n\n this.#deferred.then(() => {\n for (const listener of this.#listeners) {\n listener.call(this, event);\n }\n });\n }\n\n addEventListener(name, listener) {\n this.#listeners.add(listener);\n }\n\n removeEventListener(name, listener) {\n this.#listeners.delete(listener);\n }\n\n terminate() {\n this.#listeners.clear();\n }\n}\n\n/**\n * @typedef {Object} PDFWorkerParameters\n * @property {string} [name] - The name of the worker.\n * @property {Worker} [port] - The `workerPort` object.\n * @property {number} [verbosity] - Controls the logging level;\n * the constants from {@link VerbosityLevel} should be used.\n */\n\nconst PDFWorkerUtil = {\n isWorkerDisabled: false,\n fakeWorkerId: 0,\n};\nif (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n if (isNodeJS) {\n // Workers aren't supported in Node.js, force-disabling them there.\n PDFWorkerUtil.isWorkerDisabled = true;\n\n GlobalWorkerOptions.workerSrc ||= PDFJSDev.test(\"LIB\")\n ? \"../pdf.worker.js\"\n : \"./pdf.worker.mjs\";\n }\n\n // Check if URLs have the same origin. For non-HTTP based URLs, returns false.\n PDFWorkerUtil.isSameOrigin = function (baseUrl, otherUrl) {\n let base;\n try {\n base = new URL(baseUrl);\n if (!base.origin || base.origin === \"null\") {\n return false; // non-HTTP url\n }\n } catch {\n return false;\n }\n\n const other = new URL(otherUrl, base);\n return base.origin === other.origin;\n };\n\n PDFWorkerUtil.createCDNWrapper = function (url) {\n // We will rely on blob URL's property to specify origin.\n // We want this function to fail in case if createObjectURL or Blob do not\n // exist or fail for some reason -- our Worker creation will fail anyway.\n const wrapper = `await import(\"${url}\");`;\n return URL.createObjectURL(\n new Blob([wrapper], { type: \"text/javascript\" })\n );\n };\n}\n\n/**\n * PDF.js web worker abstraction that controls the instantiation of PDF\n * documents. Message handlers are used to pass information from the main\n * thread to the worker thread and vice versa. If the creation of a web\n * worker is not possible, a \"fake\" worker will be used instead.\n *\n * @param {PDFWorkerParameters} params - The worker initialization parameters.\n */\nclass PDFWorker {\n static #workerPorts;\n\n constructor({\n name = null,\n port = null,\n verbosity = getVerbosityLevel(),\n } = {}) {\n this.name = name;\n this.destroyed = false;\n this.verbosity = verbosity;\n\n this._readyCapability = Promise.withResolvers();\n this._port = null;\n this._webWorker = null;\n this._messageHandler = null;\n\n if (\n (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) &&\n port\n ) {\n if (PDFWorker.#workerPorts?.has(port)) {\n throw new Error(\"Cannot use more than one PDFWorker per port.\");\n }\n (PDFWorker.#workerPorts ||= new WeakMap()).set(port, this);\n this._initializeFromPort(port);\n return;\n }\n this._initialize();\n }\n\n /**\n * Promise for worker initialization completion.\n * @type {Promise}\n */\n get promise() {\n if (\n typeof PDFJSDev !== \"undefined\" &&\n PDFJSDev.test(\"GENERIC\") &&\n isNodeJS\n ) {\n // Ensure that all Node.js packages/polyfills have loaded.\n return Promise.all([NodePackages.promise, this._readyCapability.promise]);\n }\n return this._readyCapability.promise;\n }\n\n #resolve() {\n this._readyCapability.resolve();\n // Send global setting, e.g. verbosity level.\n this._messageHandler.send(\"configure\", {\n verbosity: this.verbosity,\n });\n }\n\n /**\n * The current `workerPort`, when it exists.\n * @type {Worker}\n */\n get port() {\n return this._port;\n }\n\n /**\n * The current MessageHandler-instance.\n * @type {MessageHandler}\n */\n get messageHandler() {\n return this._messageHandler;\n }\n\n _initializeFromPort(port) {\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n throw new Error(\"Not implemented: _initializeFromPort\");\n }\n this._port = port;\n this._messageHandler = new MessageHandler(\"main\", \"worker\", port);\n this._messageHandler.on(\"ready\", function () {\n // Ignoring \"ready\" event -- MessageHandler should already be initialized\n // and ready to accept messages.\n });\n this.#resolve();\n }\n\n _initialize() {\n // If worker support isn't disabled explicit and the browser has worker\n // support, create a new web worker and test if it/the browser fulfills\n // all requirements to run parts of pdf.js in a web worker.\n // Right now, the requirement is, that an Uint8Array is still an\n // Uint8Array as it arrives on the worker.\n if (\n PDFWorkerUtil.isWorkerDisabled ||\n PDFWorker.#mainThreadWorkerMessageHandler\n ) {\n this._setupFakeWorker();\n return;\n }\n let { workerSrc } = PDFWorker;\n\n try {\n // Wraps workerSrc path into blob URL, if the former does not belong\n // to the same origin.\n if (\n typeof PDFJSDev !== \"undefined\" &&\n PDFJSDev.test(\"GENERIC\") &&\n !PDFWorkerUtil.isSameOrigin(window.location.href, workerSrc)\n ) {\n workerSrc = PDFWorkerUtil.createCDNWrapper(\n new URL(workerSrc, window.location).href\n );\n }\n\n const worker = new Worker(workerSrc, { type: \"module\" });\n const messageHandler = new MessageHandler(\"main\", \"worker\", worker);\n const terminateEarly = () => {\n ac.abort();\n messageHandler.destroy();\n worker.terminate();\n if (this.destroyed) {\n this._readyCapability.reject(new Error(\"Worker was destroyed\"));\n } else {\n // Fall back to fake worker if the termination is caused by an\n // error (e.g. NetworkError / SecurityError).\n this._setupFakeWorker();\n }\n };\n\n const ac = new AbortController();\n worker.addEventListener(\n \"error\",\n () => {\n if (!this._webWorker) {\n // Worker failed to initialize due to an error. Clean up and fall\n // back to the fake worker.\n terminateEarly();\n }\n },\n { signal: ac.signal }\n );\n\n messageHandler.on(\"test\", data => {\n ac.abort();\n if (this.destroyed || !data) {\n terminateEarly();\n return;\n }\n this._messageHandler = messageHandler;\n this._port = worker;\n this._webWorker = worker;\n\n this.#resolve();\n });\n\n messageHandler.on(\"ready\", data => {\n ac.abort();\n if (this.destroyed) {\n terminateEarly();\n return;\n }\n try {\n sendTest();\n } catch {\n // We need fallback to a faked worker.\n this._setupFakeWorker();\n }\n });\n\n const sendTest = () => {\n const testObj = new Uint8Array();\n // Ensure that we can use `postMessage` transfers.\n messageHandler.send(\"test\", testObj, [testObj.buffer]);\n };\n\n // It might take time for the worker to initialize. We will try to send\n // the \"test\" message immediately, and once the \"ready\" message arrives.\n // The worker shall process only the first received \"test\" message.\n sendTest();\n return;\n } catch {\n info(\"The worker has been disabled.\");\n }\n // Either workers are not supported or have thrown an exception.\n // Thus, we fallback to a faked worker.\n this._setupFakeWorker();\n }\n\n _setupFakeWorker() {\n if (!PDFWorkerUtil.isWorkerDisabled) {\n warn(\"Setting up fake worker.\");\n PDFWorkerUtil.isWorkerDisabled = true;\n }\n\n PDFWorker._setupFakeWorkerGlobal\n .then(WorkerMessageHandler => {\n if (this.destroyed) {\n this._readyCapability.reject(new Error(\"Worker was destroyed\"));\n return;\n }\n const port = new LoopbackPort();\n this._port = port;\n\n // All fake workers use the same port, making id unique.\n const id = `fake${PDFWorkerUtil.fakeWorkerId++}`;\n\n // If the main thread is our worker, setup the handling for the\n // messages -- the main thread sends to it self.\n const workerHandler = new MessageHandler(id + \"_worker\", id, port);\n WorkerMessageHandler.setup(workerHandler, port);\n\n this._messageHandler = new MessageHandler(id, id + \"_worker\", port);\n this.#resolve();\n })\n .catch(reason => {\n this._readyCapability.reject(\n new Error(`Setting up fake worker failed: \"${reason.message}\".`)\n );\n });\n }\n\n /**\n * Destroys the worker instance.\n */\n destroy() {\n this.destroyed = true;\n if (this._webWorker) {\n // We need to terminate only web worker created resource.\n this._webWorker.terminate();\n this._webWorker = null;\n }\n PDFWorker.#workerPorts?.delete(this._port);\n this._port = null;\n if (this._messageHandler) {\n this._messageHandler.destroy();\n this._messageHandler = null;\n }\n }\n\n /**\n * @param {PDFWorkerParameters} params - The worker initialization parameters.\n */\n static fromPort(params) {\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n throw new Error(\"Not implemented: fromPort\");\n }\n if (!params?.port) {\n throw new Error(\"PDFWorker.fromPort - invalid method signature.\");\n }\n const cachedPort = this.#workerPorts?.get(params.port);\n if (cachedPort) {\n if (cachedPort._pendingDestroy) {\n throw new Error(\n \"PDFWorker.fromPort - the worker is being destroyed.\\n\" +\n \"Please remember to await `PDFDocumentLoadingTask.destroy()`-calls.\"\n );\n }\n return cachedPort;\n }\n return new PDFWorker(params);\n }\n\n /**\n * The current `workerSrc`, when it exists.\n * @type {string}\n */\n static get workerSrc() {\n if (GlobalWorkerOptions.workerSrc) {\n return GlobalWorkerOptions.workerSrc;\n }\n throw new Error('No \"GlobalWorkerOptions.workerSrc\" specified.');\n }\n\n static get #mainThreadWorkerMessageHandler() {\n try {\n return globalThis.pdfjsWorker?.WorkerMessageHandler || null;\n } catch {\n return null;\n }\n }\n\n // Loads worker code into the main-thread.\n static get _setupFakeWorkerGlobal() {\n const loader = async () => {\n if (this.#mainThreadWorkerMessageHandler) {\n // The worker was already loaded using e.g. a ` + + + + + + + + +
+ +
+
+
+
+ + + + +
+
+ +
+
+
+ + +
+
+
+
+
+
+ + + +
+
+
+ +
+ + + + + + + + + + + + +
+
+
+
+ + + + +
+ +
+ +
+ + +
+ + +
+
+
+
+
+
+
+
+
+ +
+
+
+
+ +
+ +
+ +
+
+ +
+
+ + +
+
+ +
+ File name: +

-

+
+
+ File size: +

-

+
+
+
+ Title: +

-

+
+
+ Author: +

-

+
+
+ Subject: +

-

+
+
+ Keywords: +

-

+
+
+ Creation Date: +

-

+
+
+ Modification Date: +

-

+
+
+ Creator: +

-

+
+
+
+ PDF Producer: +

-

+
+
+ PDF Version: +

-

+
+
+ Page Count: +

-

+
+
+ Page Size: +

-

+
+
+
+ Fast Web View: +

-

+
+
+ +
+
+ +
+
+ Choose an option + + Alt text (alternative text) helps when people can’t see the image or when it doesn’t load. + +
+
+
+
+ + +
+
+ + Aim for 1-2 sentences that describe the subject, setting, or actions. + +
+
+
+ +
+
+
+
+
+ + +
+
+ + This is used for ornamental images, like borders or watermarks. + +
+
+
+
+ + +
+
+
+ +
+ Preparing document for printing… +
+
+ + 0% +
+
+ +
+
+
+ +
+
+ + diff --git a/src/renderer/public/pdfjs-dist/web/viewer.mjs b/src/renderer/public/pdfjs-dist/web/viewer.mjs new file mode 100644 index 0000000..0ae4fbc --- /dev/null +++ b/src/renderer/public/pdfjs-dist/web/viewer.mjs @@ -0,0 +1,14444 @@ +/** + * @licstart The following is the entire license notice for the + * JavaScript code in this page + * + * Copyright 2023 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @licend The above is the entire license notice for the + * JavaScript code in this page + */ + +/******/ // The require scope +/******/ var __webpack_require__ = {}; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; + +// EXPORTS +__webpack_require__.d(__webpack_exports__, { + PDFViewerApplication: () => (/* reexport */ PDFViewerApplication), + PDFViewerApplicationConstants: () => (/* binding */ AppConstants), + PDFViewerApplicationOptions: () => (/* reexport */ AppOptions) +}); + +;// CONCATENATED MODULE: ./web/ui_utils.js +const DEFAULT_SCALE_VALUE = "auto"; +const DEFAULT_SCALE = 1.0; +const DEFAULT_SCALE_DELTA = 1.1; +const MIN_SCALE = 0.1; +const MAX_SCALE = 10.0; +const UNKNOWN_SCALE = 0; +const MAX_AUTO_SCALE = 1.25; +const SCROLLBAR_PADDING = 40; +const VERTICAL_PADDING = 5; +const RenderingStates = { + INITIAL: 0, + RUNNING: 1, + PAUSED: 2, + FINISHED: 3 +}; +const PresentationModeState = { + UNKNOWN: 0, + NORMAL: 1, + CHANGING: 2, + FULLSCREEN: 3 +}; +const SidebarView = { + UNKNOWN: -1, + NONE: 0, + THUMBS: 1, + OUTLINE: 2, + ATTACHMENTS: 3, + LAYERS: 4 +}; +const TextLayerMode = { + DISABLE: 0, + ENABLE: 1, + ENABLE_PERMISSIONS: 2 +}; +const ScrollMode = { + UNKNOWN: -1, + VERTICAL: 0, + HORIZONTAL: 1, + WRAPPED: 2, + PAGE: 3 +}; +const SpreadMode = { + UNKNOWN: -1, + NONE: 0, + ODD: 1, + EVEN: 2 +}; +const CursorTool = { + SELECT: 0, + HAND: 1, + ZOOM: 2 +}; +const AutoPrintRegExp = /\bprint\s*\(/; +class OutputScale { + constructor() { + const pixelRatio = window.devicePixelRatio || 1; + this.sx = pixelRatio; + this.sy = pixelRatio; + } + get scaled() { + return this.sx !== 1 || this.sy !== 1; + } +} +function scrollIntoView(element, spot, scrollMatches = false) { + let parent = element.offsetParent; + if (!parent) { + console.error("offsetParent is not set -- cannot scroll"); + return; + } + let offsetY = element.offsetTop + element.clientTop; + let offsetX = element.offsetLeft + element.clientLeft; + while (parent.clientHeight === parent.scrollHeight && parent.clientWidth === parent.scrollWidth || scrollMatches && (parent.classList.contains("markedContent") || getComputedStyle(parent).overflow === "hidden")) { + offsetY += parent.offsetTop; + offsetX += parent.offsetLeft; + parent = parent.offsetParent; + if (!parent) { + return; + } + } + if (spot) { + if (spot.top !== undefined) { + offsetY += spot.top; + } + if (spot.left !== undefined) { + offsetX += spot.left; + parent.scrollLeft = offsetX; + } + } + parent.scrollTop = offsetY; +} +function watchScroll(viewAreaElement, callback) { + const debounceScroll = function (evt) { + if (rAF) { + return; + } + rAF = window.requestAnimationFrame(function viewAreaElementScrolled() { + rAF = null; + const currentX = viewAreaElement.scrollLeft; + const lastX = state.lastX; + if (currentX !== lastX) { + state.right = currentX > lastX; + } + state.lastX = currentX; + const currentY = viewAreaElement.scrollTop; + const lastY = state.lastY; + if (currentY !== lastY) { + state.down = currentY > lastY; + } + state.lastY = currentY; + callback(state); + }); + }; + const state = { + right: true, + down: true, + lastX: viewAreaElement.scrollLeft, + lastY: viewAreaElement.scrollTop, + _eventHandler: debounceScroll + }; + let rAF = null; + viewAreaElement.addEventListener("scroll", debounceScroll, true); + return state; +} +function parseQueryString(query) { + const params = new Map(); + for (const [key, value] of new URLSearchParams(query)) { + params.set(key.toLowerCase(), value); + } + return params; +} +const InvisibleCharsRegExp = /[\x00-\x1F]/g; +function removeNullCharacters(str, replaceInvisible = false) { + if (!InvisibleCharsRegExp.test(str)) { + return str; + } + if (replaceInvisible) { + return str.replaceAll(InvisibleCharsRegExp, m => m === "\x00" ? "" : " "); + } + return str.replaceAll("\x00", ""); +} +function binarySearchFirstItem(items, condition, start = 0) { + let minIndex = start; + let maxIndex = items.length - 1; + if (maxIndex < 0 || !condition(items[maxIndex])) { + return items.length; + } + if (condition(items[minIndex])) { + return minIndex; + } + while (minIndex < maxIndex) { + const currentIndex = minIndex + maxIndex >> 1; + const currentItem = items[currentIndex]; + if (condition(currentItem)) { + maxIndex = currentIndex; + } else { + minIndex = currentIndex + 1; + } + } + return minIndex; +} +function approximateFraction(x) { + if (Math.floor(x) === x) { + return [x, 1]; + } + const xinv = 1 / x; + const limit = 8; + if (xinv > limit) { + return [1, limit]; + } else if (Math.floor(xinv) === xinv) { + return [1, xinv]; + } + const x_ = x > 1 ? xinv : x; + let a = 0, + b = 1, + c = 1, + d = 1; + while (true) { + const p = a + c, + q = b + d; + if (q > limit) { + break; + } + if (x_ <= p / q) { + c = p; + d = q; + } else { + a = p; + b = q; + } + } + let result; + if (x_ - a / b < c / d - x_) { + result = x_ === x ? [a, b] : [b, a]; + } else { + result = x_ === x ? [c, d] : [d, c]; + } + return result; +} +function roundToDivide(x, div) { + const r = x % div; + return r === 0 ? x : Math.round(x - r + div); +} +function getPageSizeInches({ + view, + userUnit, + rotate +}) { + const [x1, y1, x2, y2] = view; + const changeOrientation = rotate % 180 !== 0; + const width = (x2 - x1) / 72 * userUnit; + const height = (y2 - y1) / 72 * userUnit; + return { + width: changeOrientation ? height : width, + height: changeOrientation ? width : height + }; +} +function backtrackBeforeAllVisibleElements(index, views, top) { + if (index < 2) { + return index; + } + let elt = views[index].div; + let pageTop = elt.offsetTop + elt.clientTop; + if (pageTop >= top) { + elt = views[index - 1].div; + pageTop = elt.offsetTop + elt.clientTop; + } + for (let i = index - 2; i >= 0; --i) { + elt = views[i].div; + if (elt.offsetTop + elt.clientTop + elt.clientHeight <= pageTop) { + break; + } + index = i; + } + return index; +} +function getVisibleElements({ + scrollEl, + views, + sortByVisibility = false, + horizontal = false, + rtl = false +}) { + const top = scrollEl.scrollTop, + bottom = top + scrollEl.clientHeight; + const left = scrollEl.scrollLeft, + right = left + scrollEl.clientWidth; + function isElementBottomAfterViewTop(view) { + const element = view.div; + const elementBottom = element.offsetTop + element.clientTop + element.clientHeight; + return elementBottom > top; + } + function isElementNextAfterViewHorizontally(view) { + const element = view.div; + const elementLeft = element.offsetLeft + element.clientLeft; + const elementRight = elementLeft + element.clientWidth; + return rtl ? elementLeft < right : elementRight > left; + } + const visible = [], + ids = new Set(), + numViews = views.length; + let firstVisibleElementInd = binarySearchFirstItem(views, horizontal ? isElementNextAfterViewHorizontally : isElementBottomAfterViewTop); + if (firstVisibleElementInd > 0 && firstVisibleElementInd < numViews && !horizontal) { + firstVisibleElementInd = backtrackBeforeAllVisibleElements(firstVisibleElementInd, views, top); + } + let lastEdge = horizontal ? right : -1; + for (let i = firstVisibleElementInd; i < numViews; i++) { + const view = views[i], + element = view.div; + const currentWidth = element.offsetLeft + element.clientLeft; + const currentHeight = element.offsetTop + element.clientTop; + const viewWidth = element.clientWidth, + viewHeight = element.clientHeight; + const viewRight = currentWidth + viewWidth; + const viewBottom = currentHeight + viewHeight; + if (lastEdge === -1) { + if (viewBottom >= bottom) { + lastEdge = viewBottom; + } + } else if ((horizontal ? currentWidth : currentHeight) > lastEdge) { + break; + } + if (viewBottom <= top || currentHeight >= bottom || viewRight <= left || currentWidth >= right) { + continue; + } + const hiddenHeight = Math.max(0, top - currentHeight) + Math.max(0, viewBottom - bottom); + const hiddenWidth = Math.max(0, left - currentWidth) + Math.max(0, viewRight - right); + const fractionHeight = (viewHeight - hiddenHeight) / viewHeight, + fractionWidth = (viewWidth - hiddenWidth) / viewWidth; + const percent = fractionHeight * fractionWidth * 100 | 0; + visible.push({ + id: view.id, + x: currentWidth, + y: currentHeight, + view, + percent, + widthPercent: fractionWidth * 100 | 0 + }); + ids.add(view.id); + } + const first = visible[0], + last = visible.at(-1); + if (sortByVisibility) { + visible.sort(function (a, b) { + const pc = a.percent - b.percent; + if (Math.abs(pc) > 0.001) { + return -pc; + } + return a.id - b.id; + }); + } + return { + first, + last, + views: visible, + ids + }; +} +function normalizeWheelEventDirection(evt) { + let delta = Math.hypot(evt.deltaX, evt.deltaY); + const angle = Math.atan2(evt.deltaY, evt.deltaX); + if (-0.25 * Math.PI < angle && angle < 0.75 * Math.PI) { + delta = -delta; + } + return delta; +} +function normalizeWheelEventDelta(evt) { + const deltaMode = evt.deltaMode; + let delta = normalizeWheelEventDirection(evt); + const MOUSE_PIXELS_PER_LINE = 30; + const MOUSE_LINES_PER_PAGE = 30; + if (deltaMode === WheelEvent.DOM_DELTA_PIXEL) { + delta /= MOUSE_PIXELS_PER_LINE * MOUSE_LINES_PER_PAGE; + } else if (deltaMode === WheelEvent.DOM_DELTA_LINE) { + delta /= MOUSE_LINES_PER_PAGE; + } + return delta; +} +function isValidRotation(angle) { + return Number.isInteger(angle) && angle % 90 === 0; +} +function isValidScrollMode(mode) { + return Number.isInteger(mode) && Object.values(ScrollMode).includes(mode) && mode !== ScrollMode.UNKNOWN; +} +function isValidSpreadMode(mode) { + return Number.isInteger(mode) && Object.values(SpreadMode).includes(mode) && mode !== SpreadMode.UNKNOWN; +} +function isPortraitOrientation(size) { + return size.width <= size.height; +} +const animationStarted = new Promise(function (resolve) { + window.requestAnimationFrame(resolve); +}); +const docStyle = document.documentElement.style; +function clamp(v, min, max) { + return Math.min(Math.max(v, min), max); +} +class ProgressBar { + #classList = null; + #disableAutoFetchTimeout = null; + #percent = 0; + #style = null; + #visible = true; + constructor(bar) { + this.#classList = bar.classList; + this.#style = bar.style; + } + get percent() { + return this.#percent; + } + set percent(val) { + this.#percent = clamp(val, 0, 100); + if (isNaN(val)) { + this.#classList.add("indeterminate"); + return; + } + this.#classList.remove("indeterminate"); + this.#style.setProperty("--progressBar-percent", `${this.#percent}%`); + } + setWidth(viewer) { + if (!viewer) { + return; + } + const container = viewer.parentNode; + const scrollbarWidth = container.offsetWidth - viewer.offsetWidth; + if (scrollbarWidth > 0) { + this.#style.setProperty("--progressBar-end-offset", `${scrollbarWidth}px`); + } + } + setDisableAutoFetch(delay = 5000) { + if (isNaN(this.#percent)) { + return; + } + if (this.#disableAutoFetchTimeout) { + clearTimeout(this.#disableAutoFetchTimeout); + } + this.show(); + this.#disableAutoFetchTimeout = setTimeout(() => { + this.#disableAutoFetchTimeout = null; + this.hide(); + }, delay); + } + hide() { + if (!this.#visible) { + return; + } + this.#visible = false; + this.#classList.add("hidden"); + } + show() { + if (this.#visible) { + return; + } + this.#visible = true; + this.#classList.remove("hidden"); + } +} +function getActiveOrFocusedElement() { + let curRoot = document; + let curActiveOrFocused = curRoot.activeElement || curRoot.querySelector(":focus"); + while (curActiveOrFocused?.shadowRoot) { + curRoot = curActiveOrFocused.shadowRoot; + curActiveOrFocused = curRoot.activeElement || curRoot.querySelector(":focus"); + } + return curActiveOrFocused; +} +function apiPageLayoutToViewerModes(layout) { + let scrollMode = ScrollMode.VERTICAL, + spreadMode = SpreadMode.NONE; + switch (layout) { + case "SinglePage": + scrollMode = ScrollMode.PAGE; + break; + case "OneColumn": + break; + case "TwoPageLeft": + scrollMode = ScrollMode.PAGE; + case "TwoColumnLeft": + spreadMode = SpreadMode.ODD; + break; + case "TwoPageRight": + scrollMode = ScrollMode.PAGE; + case "TwoColumnRight": + spreadMode = SpreadMode.EVEN; + break; + } + return { + scrollMode, + spreadMode + }; +} +function apiPageModeToSidebarView(mode) { + switch (mode) { + case "UseNone": + return SidebarView.NONE; + case "UseThumbs": + return SidebarView.THUMBS; + case "UseOutlines": + return SidebarView.OUTLINE; + case "UseAttachments": + return SidebarView.ATTACHMENTS; + case "UseOC": + return SidebarView.LAYERS; + } + return SidebarView.NONE; +} +function toggleCheckedBtn(button, toggle, view = null) { + button.classList.toggle("toggled", toggle); + button.setAttribute("aria-checked", toggle); + view?.classList.toggle("hidden", !toggle); +} +function toggleExpandedBtn(button, toggle, view = null) { + button.classList.toggle("toggled", toggle); + button.setAttribute("aria-expanded", toggle); + view?.classList.toggle("hidden", !toggle); +} + +;// CONCATENATED MODULE: ./web/app_options.js +{ + var compatibilityParams = Object.create(null); + const userAgent = navigator.userAgent || ""; + const platform = navigator.platform || ""; + const maxTouchPoints = navigator.maxTouchPoints || 1; + const isAndroid = /Android/.test(userAgent); + const isIOS = /\b(iPad|iPhone|iPod)(?=;)/.test(userAgent) || platform === "MacIntel" && maxTouchPoints > 1; + (function checkCanvasSizeLimitation() { + if (isIOS || isAndroid) { + compatibilityParams.maxCanvasPixels = 5242880; + } + })(); +} +const OptionKind = { + BROWSER: 0x01, + VIEWER: 0x02, + API: 0x04, + WORKER: 0x08, + PREFERENCE: 0x80 +}; +const defaultOptions = { + canvasMaxAreaInBytes: { + value: -1, + kind: OptionKind.BROWSER + OptionKind.API + }, + isInAutomation: { + value: false, + kind: OptionKind.BROWSER + }, + supportsCaretBrowsingMode: { + value: false, + kind: OptionKind.BROWSER + }, + supportsDocumentFonts: { + value: true, + kind: OptionKind.BROWSER + }, + supportsIntegratedFind: { + value: false, + kind: OptionKind.BROWSER + }, + supportsMouseWheelZoomCtrlKey: { + value: true, + kind: OptionKind.BROWSER + }, + supportsMouseWheelZoomMetaKey: { + value: true, + kind: OptionKind.BROWSER + }, + supportsPinchToZoom: { + value: true, + kind: OptionKind.BROWSER + }, + annotationEditorMode: { + value: 0, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + annotationMode: { + value: 2, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + cursorToolOnLoad: { + value: 0, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + debuggerSrc: { + value: "./debugger.mjs", + kind: OptionKind.VIEWER + }, + defaultZoomDelay: { + value: 400, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + defaultZoomValue: { + value: "", + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + disableHistory: { + value: false, + kind: OptionKind.VIEWER + }, + disablePageLabels: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enableHighlightEditor: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enableHighlightFloatingButton: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enableML: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enablePermissions: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enablePrintAutoRotate: { + value: true, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enableScripting: { + value: true, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enableStampEditor: { + value: true, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + externalLinkRel: { + value: "noopener noreferrer nofollow", + kind: OptionKind.VIEWER + }, + externalLinkTarget: { + value: 0, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + highlightEditorColors: { + value: "yellow=#FFFF98,green=#53FFBC,blue=#80EBFF,pink=#FFCBE6,red=#FF4F5F", + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + historyUpdateUrl: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + ignoreDestinationZoom: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + imageResourcesPath: { + value: "./images/", + kind: OptionKind.VIEWER + }, + maxCanvasPixels: { + value: 2 ** 25, + kind: OptionKind.VIEWER + }, + forcePageColors: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + pageColorsBackground: { + value: "Canvas", + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + pageColorsForeground: { + value: "CanvasText", + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + pdfBugEnabled: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + printResolution: { + value: 150, + kind: OptionKind.VIEWER + }, + sidebarViewOnLoad: { + value: -1, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + scrollModeOnLoad: { + value: -1, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + spreadModeOnLoad: { + value: -1, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + textLayerMode: { + value: 1, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + viewOnLoad: { + value: 0, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + cMapPacked: { + value: true, + kind: OptionKind.API + }, + cMapUrl: { + value: "../web/cmaps/", + kind: OptionKind.API + }, + disableAutoFetch: { + value: false, + kind: OptionKind.API + OptionKind.PREFERENCE + }, + disableFontFace: { + value: false, + kind: OptionKind.API + OptionKind.PREFERENCE + }, + disableRange: { + value: false, + kind: OptionKind.API + OptionKind.PREFERENCE + }, + disableStream: { + value: false, + kind: OptionKind.API + OptionKind.PREFERENCE + }, + docBaseUrl: { + value: "", + kind: OptionKind.API + }, + enableXfa: { + value: true, + kind: OptionKind.API + OptionKind.PREFERENCE + }, + fontExtraProperties: { + value: false, + kind: OptionKind.API + }, + isEvalSupported: { + value: true, + kind: OptionKind.API + }, + isOffscreenCanvasSupported: { + value: true, + kind: OptionKind.API + }, + maxImageSize: { + value: -1, + kind: OptionKind.API + }, + pdfBug: { + value: false, + kind: OptionKind.API + }, + standardFontDataUrl: { + value: "../web/standard_fonts/", + kind: OptionKind.API + }, + verbosity: { + value: 1, + kind: OptionKind.API + }, + workerPort: { + value: null, + kind: OptionKind.WORKER + }, + workerSrc: { + value: "../build/pdf.worker.mjs", + kind: OptionKind.WORKER + } +}; +{ + defaultOptions.defaultUrl = { + value: "compressed.tracemonkey-pldi-09.pdf", + kind: OptionKind.VIEWER + }; + defaultOptions.sandboxBundleSrc = { + value: "../build/pdf.sandbox.mjs", + kind: OptionKind.VIEWER + }; + defaultOptions.viewerCssTheme = { + value: 0, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }; +} +{ + defaultOptions.disablePreferences = { + value: false, + kind: OptionKind.VIEWER + }; + defaultOptions.locale = { + value: navigator.language || "en-US", + kind: OptionKind.VIEWER + }; +} +const userOptions = Object.create(null); +{ + for (const name in compatibilityParams) { + userOptions[name] = compatibilityParams[name]; + } +} +class AppOptions { + constructor() { + throw new Error("Cannot initialize AppOptions."); + } + static get(name) { + return userOptions[name] ?? defaultOptions[name]?.value ?? undefined; + } + static getAll(kind = null, defaultOnly = false) { + const options = Object.create(null); + for (const name in defaultOptions) { + const defaultOption = defaultOptions[name]; + if (kind && !(kind & defaultOption.kind)) { + continue; + } + options[name] = defaultOnly ? defaultOption.value : userOptions[name] ?? defaultOption.value; + } + return options; + } + static set(name, value) { + userOptions[name] = value; + } + static setAll(options, init = false) { + if (init) { + if (this.get("disablePreferences")) { + return; + } + for (const name in userOptions) { + if (compatibilityParams[name] !== undefined) { + continue; + } + console.warn("setAll: The Preferences may override manually set AppOptions; " + 'please use the "disablePreferences"-option in order to prevent that.'); + break; + } + } + for (const name in options) { + userOptions[name] = options[name]; + } + } + static remove(name) { + delete userOptions[name]; + const val = compatibilityParams[name]; + if (val !== undefined) { + userOptions[name] = val; + } + } +} + +;// CONCATENATED MODULE: ./web/pdf_link_service.js + +const DEFAULT_LINK_REL = "noopener noreferrer nofollow"; +const LinkTarget = { + NONE: 0, + SELF: 1, + BLANK: 2, + PARENT: 3, + TOP: 4 +}; +class PDFLinkService { + externalLinkEnabled = true; + constructor({ + eventBus, + externalLinkTarget = null, + externalLinkRel = null, + ignoreDestinationZoom = false + } = {}) { + this.eventBus = eventBus; + this.externalLinkTarget = externalLinkTarget; + this.externalLinkRel = externalLinkRel; + this._ignoreDestinationZoom = ignoreDestinationZoom; + this.baseUrl = null; + this.pdfDocument = null; + this.pdfViewer = null; + this.pdfHistory = null; + } + setDocument(pdfDocument, baseUrl = null) { + this.baseUrl = baseUrl; + this.pdfDocument = pdfDocument; + } + setViewer(pdfViewer) { + this.pdfViewer = pdfViewer; + } + setHistory(pdfHistory) { + this.pdfHistory = pdfHistory; + } + get pagesCount() { + return this.pdfDocument ? this.pdfDocument.numPages : 0; + } + get page() { + return this.pdfDocument ? this.pdfViewer.currentPageNumber : 1; + } + set page(value) { + if (this.pdfDocument) { + this.pdfViewer.currentPageNumber = value; + } + } + get rotation() { + return this.pdfDocument ? this.pdfViewer.pagesRotation : 0; + } + set rotation(value) { + if (this.pdfDocument) { + this.pdfViewer.pagesRotation = value; + } + } + get isInPresentationMode() { + return this.pdfDocument ? this.pdfViewer.isInPresentationMode : false; + } + async goToDestination(dest) { + if (!this.pdfDocument) { + return; + } + let namedDest, explicitDest, pageNumber; + if (typeof dest === "string") { + namedDest = dest; + explicitDest = await this.pdfDocument.getDestination(dest); + } else { + namedDest = null; + explicitDest = await dest; + } + if (!Array.isArray(explicitDest)) { + console.error(`goToDestination: "${explicitDest}" is not a valid destination array, for dest="${dest}".`); + return; + } + const [destRef] = explicitDest; + if (destRef && typeof destRef === "object") { + pageNumber = this.pdfDocument.cachedPageNumber(destRef); + if (!pageNumber) { + try { + pageNumber = (await this.pdfDocument.getPageIndex(destRef)) + 1; + } catch { + console.error(`goToDestination: "${destRef}" is not a valid page reference, for dest="${dest}".`); + return; + } + } + } else if (Number.isInteger(destRef)) { + pageNumber = destRef + 1; + } + if (!pageNumber || pageNumber < 1 || pageNumber > this.pagesCount) { + console.error(`goToDestination: "${pageNumber}" is not a valid page number, for dest="${dest}".`); + return; + } + if (this.pdfHistory) { + this.pdfHistory.pushCurrentPosition(); + this.pdfHistory.push({ + namedDest, + explicitDest, + pageNumber + }); + } + this.pdfViewer.scrollPageIntoView({ + pageNumber, + destArray: explicitDest, + ignoreDestinationZoom: this._ignoreDestinationZoom + }); + } + goToPage(val) { + if (!this.pdfDocument) { + return; + } + const pageNumber = typeof val === "string" && this.pdfViewer.pageLabelToPageNumber(val) || val | 0; + if (!(Number.isInteger(pageNumber) && pageNumber > 0 && pageNumber <= this.pagesCount)) { + console.error(`PDFLinkService.goToPage: "${val}" is not a valid page.`); + return; + } + if (this.pdfHistory) { + this.pdfHistory.pushCurrentPosition(); + this.pdfHistory.pushPage(pageNumber); + } + this.pdfViewer.scrollPageIntoView({ + pageNumber + }); + } + addLinkAttributes(link, url, newWindow = false) { + if (!url || typeof url !== "string") { + throw new Error('A valid "url" parameter must provided.'); + } + const target = newWindow ? LinkTarget.BLANK : this.externalLinkTarget, + rel = this.externalLinkRel; + if (this.externalLinkEnabled) { + link.href = link.title = url; + } else { + link.href = ""; + link.title = `Disabled: ${url}`; + link.onclick = () => false; + } + let targetStr = ""; + switch (target) { + case LinkTarget.NONE: + break; + case LinkTarget.SELF: + targetStr = "_self"; + break; + case LinkTarget.BLANK: + targetStr = "_blank"; + break; + case LinkTarget.PARENT: + targetStr = "_parent"; + break; + case LinkTarget.TOP: + targetStr = "_top"; + break; + } + link.target = targetStr; + link.rel = typeof rel === "string" ? rel : DEFAULT_LINK_REL; + } + getDestinationHash(dest) { + if (typeof dest === "string") { + if (dest.length > 0) { + return this.getAnchorUrl("#" + escape(dest)); + } + } else if (Array.isArray(dest)) { + const str = JSON.stringify(dest); + if (str.length > 0) { + return this.getAnchorUrl("#" + escape(str)); + } + } + return this.getAnchorUrl(""); + } + getAnchorUrl(anchor) { + return this.baseUrl ? this.baseUrl + anchor : anchor; + } + setHash(hash) { + if (!this.pdfDocument) { + return; + } + let pageNumber, dest; + if (hash.includes("=")) { + const params = parseQueryString(hash); + if (params.has("search")) { + const query = params.get("search").replaceAll('"', ""), + phrase = params.get("phrase") === "true"; + this.eventBus.dispatch("findfromurlhash", { + source: this, + query: phrase ? query : query.match(/\S+/g) + }); + } + if (params.has("page")) { + pageNumber = params.get("page") | 0 || 1; + } + if (params.has("zoom")) { + const zoomArgs = params.get("zoom").split(","); + const zoomArg = zoomArgs[0]; + const zoomArgNumber = parseFloat(zoomArg); + if (!zoomArg.includes("Fit")) { + dest = [null, { + name: "XYZ" + }, zoomArgs.length > 1 ? zoomArgs[1] | 0 : null, zoomArgs.length > 2 ? zoomArgs[2] | 0 : null, zoomArgNumber ? zoomArgNumber / 100 : zoomArg]; + } else if (zoomArg === "Fit" || zoomArg === "FitB") { + dest = [null, { + name: zoomArg + }]; + } else if (zoomArg === "FitH" || zoomArg === "FitBH" || zoomArg === "FitV" || zoomArg === "FitBV") { + dest = [null, { + name: zoomArg + }, zoomArgs.length > 1 ? zoomArgs[1] | 0 : null]; + } else if (zoomArg === "FitR") { + if (zoomArgs.length !== 5) { + console.error('PDFLinkService.setHash: Not enough parameters for "FitR".'); + } else { + dest = [null, { + name: zoomArg + }, zoomArgs[1] | 0, zoomArgs[2] | 0, zoomArgs[3] | 0, zoomArgs[4] | 0]; + } + } else { + console.error(`PDFLinkService.setHash: "${zoomArg}" is not a valid zoom value.`); + } + } + if (dest) { + this.pdfViewer.scrollPageIntoView({ + pageNumber: pageNumber || this.page, + destArray: dest, + allowNegativeOffset: true + }); + } else if (pageNumber) { + this.page = pageNumber; + } + if (params.has("pagemode")) { + this.eventBus.dispatch("pagemode", { + source: this, + mode: params.get("pagemode") + }); + } + if (params.has("nameddest")) { + this.goToDestination(params.get("nameddest")); + } + return; + } + dest = unescape(hash); + try { + dest = JSON.parse(dest); + if (!Array.isArray(dest)) { + dest = dest.toString(); + } + } catch {} + if (typeof dest === "string" || PDFLinkService.#isValidExplicitDest(dest)) { + this.goToDestination(dest); + return; + } + console.error(`PDFLinkService.setHash: "${unescape(hash)}" is not a valid destination.`); + } + executeNamedAction(action) { + if (!this.pdfDocument) { + return; + } + switch (action) { + case "GoBack": + this.pdfHistory?.back(); + break; + case "GoForward": + this.pdfHistory?.forward(); + break; + case "NextPage": + this.pdfViewer.nextPage(); + break; + case "PrevPage": + this.pdfViewer.previousPage(); + break; + case "LastPage": + this.page = this.pagesCount; + break; + case "FirstPage": + this.page = 1; + break; + default: + break; + } + this.eventBus.dispatch("namedaction", { + source: this, + action + }); + } + async executeSetOCGState(action) { + if (!this.pdfDocument) { + return; + } + const pdfDocument = this.pdfDocument, + optionalContentConfig = await this.pdfViewer.optionalContentConfigPromise; + if (pdfDocument !== this.pdfDocument) { + return; + } + optionalContentConfig.setOCGState(action); + this.pdfViewer.optionalContentConfigPromise = Promise.resolve(optionalContentConfig); + } + static #isValidExplicitDest(dest) { + if (!Array.isArray(dest) || dest.length < 2) { + return false; + } + const [page, zoom, ...args] = dest; + if (!(typeof page === "object" && Number.isInteger(page?.num) && Number.isInteger(page?.gen)) && !Number.isInteger(page)) { + return false; + } + if (!(typeof zoom === "object" && typeof zoom?.name === "string")) { + return false; + } + let allowNull = true; + switch (zoom.name) { + case "XYZ": + if (args.length !== 3) { + return false; + } + break; + case "Fit": + case "FitB": + return args.length === 0; + case "FitH": + case "FitBH": + case "FitV": + case "FitBV": + if (args.length !== 1) { + return false; + } + break; + case "FitR": + if (args.length !== 4) { + return false; + } + allowNull = false; + break; + default: + return false; + } + for (const arg of args) { + if (!(typeof arg === "number" || allowNull && arg === null)) { + return false; + } + } + return true; + } +} +class SimpleLinkService extends PDFLinkService { + setDocument(pdfDocument, baseUrl = null) {} +} + +;// CONCATENATED MODULE: ./web/pdfjs.js +const { + AbortException, + AnnotationEditorLayer, + AnnotationEditorParamsType, + AnnotationEditorType, + AnnotationEditorUIManager, + AnnotationLayer, + AnnotationMode, + build, + CMapCompressionType, + ColorPicker, + createValidAbsoluteUrl, + DOMSVGFactory, + DrawLayer, + FeatureTest, + fetchData, + getDocument, + getFilenameFromUrl, + getPdfFilenameFromUrl: pdfjs_getPdfFilenameFromUrl, + getXfaPageViewport, + GlobalWorkerOptions, + ImageKind, + InvalidPDFException, + isDataScheme, + isPdfFile, + MissingPDFException, + noContextMenu, + normalizeUnicode, + OPS, + Outliner, + PasswordResponses, + PDFDataRangeTransport, + PDFDateString, + PDFWorker, + PermissionFlag, + PixelsPerInch, + RenderingCancelledException, + renderTextLayer, + setLayerDimensions, + shadow, + TextLayer, + UnexpectedResponseException, + updateTextLayer, + Util, + VerbosityLevel, + version, + XfaLayer +} = globalThis.pdfjsLib; + +;// CONCATENATED MODULE: ./web/event_utils.js +const WaitOnType = { + EVENT: "event", + TIMEOUT: "timeout" +}; +async function waitOnEventOrTimeout({ + target, + name, + delay = 0 +}) { + if (typeof target !== "object" || !(name && typeof name === "string") || !(Number.isInteger(delay) && delay >= 0)) { + throw new Error("waitOnEventOrTimeout - invalid parameters."); + } + const { + promise, + resolve + } = Promise.withResolvers(); + const ac = new AbortController(); + function handler(type) { + ac.abort(); + clearTimeout(timeout); + resolve(type); + } + const evtMethod = target instanceof EventBus ? "_on" : "addEventListener"; + target[evtMethod](name, handler.bind(null, WaitOnType.EVENT), { + signal: ac.signal + }); + const timeout = setTimeout(handler.bind(null, WaitOnType.TIMEOUT), delay); + return promise; +} +class EventBus { + #listeners = Object.create(null); + on(eventName, listener, options = null) { + this._on(eventName, listener, { + external: true, + once: options?.once, + signal: options?.signal + }); + } + off(eventName, listener, options = null) { + this._off(eventName, listener); + } + dispatch(eventName, data) { + const eventListeners = this.#listeners[eventName]; + if (!eventListeners || eventListeners.length === 0) { + return; + } + let externalListeners; + for (const { + listener, + external, + once + } of eventListeners.slice(0)) { + if (once) { + this._off(eventName, listener); + } + if (external) { + (externalListeners ||= []).push(listener); + continue; + } + listener(data); + } + if (externalListeners) { + for (const listener of externalListeners) { + listener(data); + } + externalListeners = null; + } + } + _on(eventName, listener, options = null) { + let rmAbort = null; + if (options?.signal instanceof AbortSignal) { + const { + signal + } = options; + if (signal.aborted) { + console.error("Cannot use an `aborted` signal."); + return; + } + const onAbort = () => this._off(eventName, listener); + rmAbort = () => signal.removeEventListener("abort", onAbort); + signal.addEventListener("abort", onAbort); + } + const eventListeners = this.#listeners[eventName] ||= []; + eventListeners.push({ + listener, + external: options?.external === true, + once: options?.once === true, + rmAbort + }); + } + _off(eventName, listener, options = null) { + const eventListeners = this.#listeners[eventName]; + if (!eventListeners) { + return; + } + for (let i = 0, ii = eventListeners.length; i < ii; i++) { + const evt = eventListeners[i]; + if (evt.listener === listener) { + evt.rmAbort?.(); + eventListeners.splice(i, 1); + return; + } + } + } +} +class AutomationEventBus extends EventBus { + dispatch(eventName, data) { + throw new Error("Not implemented: AutomationEventBus.dispatch"); + } +} + +;// CONCATENATED MODULE: ./web/external_services.js +class BaseExternalServices { + constructor() { + if (this.constructor === BaseExternalServices) { + throw new Error("Cannot initialize BaseExternalServices."); + } + } + updateFindControlState(data) {} + updateFindMatchesCount(data) {} + initPassiveLoading() {} + reportTelemetry(data) {} + async createL10n() { + throw new Error("Not implemented: createL10n"); + } + createScripting() { + throw new Error("Not implemented: createScripting"); + } + updateEditorStates(data) { + throw new Error("Not implemented: updateEditorStates"); + } + async getNimbusExperimentData() {} +} + +;// CONCATENATED MODULE: ./web/preferences.js + +class BasePreferences { + #browserDefaults = Object.freeze({ + canvasMaxAreaInBytes: -1, + isInAutomation: false, + supportsCaretBrowsingMode: false, + supportsDocumentFonts: true, + supportsIntegratedFind: false, + supportsMouseWheelZoomCtrlKey: true, + supportsMouseWheelZoomMetaKey: true, + supportsPinchToZoom: true + }); + #defaults = Object.freeze({ + annotationEditorMode: 0, + annotationMode: 2, + cursorToolOnLoad: 0, + defaultZoomDelay: 400, + defaultZoomValue: "", + disablePageLabels: false, + enableHighlightEditor: false, + enableHighlightFloatingButton: false, + enableML: false, + enablePermissions: false, + enablePrintAutoRotate: true, + enableScripting: true, + enableStampEditor: true, + externalLinkTarget: 0, + highlightEditorColors: "yellow=#FFFF98,green=#53FFBC,blue=#80EBFF,pink=#FFCBE6,red=#FF4F5F", + historyUpdateUrl: false, + ignoreDestinationZoom: false, + forcePageColors: false, + pageColorsBackground: "Canvas", + pageColorsForeground: "CanvasText", + pdfBugEnabled: false, + sidebarViewOnLoad: -1, + scrollModeOnLoad: -1, + spreadModeOnLoad: -1, + textLayerMode: 1, + viewOnLoad: 0, + disableAutoFetch: false, + disableFontFace: false, + disableRange: false, + disableStream: false, + enableXfa: true, + viewerCssTheme: 0 + }); + #prefs = Object.create(null); + #initializedPromise = null; + constructor() { + if (this.constructor === BasePreferences) { + throw new Error("Cannot initialize BasePreferences."); + } + this.#initializedPromise = this._readFromStorage(this.#defaults).then(({ + browserPrefs, + prefs + }) => { + const options = Object.create(null); + for (const [name, val] of Object.entries(this.#browserDefaults)) { + const prefVal = browserPrefs?.[name]; + options[name] = typeof prefVal === typeof val ? prefVal : val; + } + for (const [name, val] of Object.entries(this.#defaults)) { + const prefVal = prefs?.[name]; + options[name] = this.#prefs[name] = typeof prefVal === typeof val ? prefVal : val; + } + AppOptions.setAll(options, true); + }); + } + async _writeToStorage(prefObj) { + throw new Error("Not implemented: _writeToStorage"); + } + async _readFromStorage(prefObj) { + throw new Error("Not implemented: _readFromStorage"); + } + #updatePref({ + name, + value + }) { + throw new Error("Not implemented: #updatePref"); + } + async reset() { + await this.#initializedPromise; + const oldPrefs = structuredClone(this.#prefs); + this.#prefs = Object.create(null); + try { + await this._writeToStorage(this.#defaults); + } catch (reason) { + this.#prefs = oldPrefs; + throw reason; + } + } + async set(name, value) { + await this.#initializedPromise; + const defaultValue = this.#defaults[name], + oldPrefs = structuredClone(this.#prefs); + if (defaultValue === undefined) { + throw new Error(`Set preference: "${name}" is undefined.`); + } else if (value === undefined) { + throw new Error("Set preference: no value is specified."); + } + const valueType = typeof value, + defaultType = typeof defaultValue; + if (valueType !== defaultType) { + if (valueType === "number" && defaultType === "string") { + value = value.toString(); + } else { + throw new Error(`Set preference: "${value}" is a ${valueType}, expected a ${defaultType}.`); + } + } else if (valueType === "number" && !Number.isInteger(value)) { + throw new Error(`Set preference: "${value}" must be an integer.`); + } + this.#prefs[name] = value; + try { + await this._writeToStorage(this.#prefs); + } catch (reason) { + this.#prefs = oldPrefs; + throw reason; + } + } + async get(name) { + await this.#initializedPromise; + const defaultValue = this.#defaults[name]; + if (defaultValue === undefined) { + throw new Error(`Get preference: "${name}" is undefined.`); + } + return this.#prefs[name] ?? defaultValue; + } + get initializedPromise() { + return this.#initializedPromise; + } +} + +;// CONCATENATED MODULE: ./node_modules/@fluent/bundle/esm/types.js +class FluentType { + constructor(value) { + this.value = value; + } + valueOf() { + return this.value; + } +} +class FluentNone extends FluentType { + constructor(value = "???") { + super(value); + } + toString(scope) { + return `{${this.value}}`; + } +} +class FluentNumber extends FluentType { + constructor(value, opts = {}) { + super(value); + this.opts = opts; + } + toString(scope) { + try { + const nf = scope.memoizeIntlObject(Intl.NumberFormat, this.opts); + return nf.format(this.value); + } catch (err) { + scope.reportError(err); + return this.value.toString(10); + } + } +} +class FluentDateTime extends FluentType { + constructor(value, opts = {}) { + super(value); + this.opts = opts; + } + toString(scope) { + try { + const dtf = scope.memoizeIntlObject(Intl.DateTimeFormat, this.opts); + return dtf.format(this.value); + } catch (err) { + scope.reportError(err); + return new Date(this.value).toISOString(); + } + } +} +;// CONCATENATED MODULE: ./node_modules/@fluent/bundle/esm/resolver.js + +const MAX_PLACEABLES = 100; +const FSI = "\u2068"; +const PDI = "\u2069"; +function match(scope, selector, key) { + if (key === selector) { + return true; + } + if (key instanceof FluentNumber && selector instanceof FluentNumber && key.value === selector.value) { + return true; + } + if (selector instanceof FluentNumber && typeof key === "string") { + let category = scope.memoizeIntlObject(Intl.PluralRules, selector.opts).select(selector.value); + if (key === category) { + return true; + } + } + return false; +} +function getDefault(scope, variants, star) { + if (variants[star]) { + return resolvePattern(scope, variants[star].value); + } + scope.reportError(new RangeError("No default")); + return new FluentNone(); +} +function getArguments(scope, args) { + const positional = []; + const named = Object.create(null); + for (const arg of args) { + if (arg.type === "narg") { + named[arg.name] = resolveExpression(scope, arg.value); + } else { + positional.push(resolveExpression(scope, arg)); + } + } + return { + positional, + named + }; +} +function resolveExpression(scope, expr) { + switch (expr.type) { + case "str": + return expr.value; + case "num": + return new FluentNumber(expr.value, { + minimumFractionDigits: expr.precision + }); + case "var": + return resolveVariableReference(scope, expr); + case "mesg": + return resolveMessageReference(scope, expr); + case "term": + return resolveTermReference(scope, expr); + case "func": + return resolveFunctionReference(scope, expr); + case "select": + return resolveSelectExpression(scope, expr); + default: + return new FluentNone(); + } +} +function resolveVariableReference(scope, { + name +}) { + let arg; + if (scope.params) { + if (Object.prototype.hasOwnProperty.call(scope.params, name)) { + arg = scope.params[name]; + } else { + return new FluentNone(`$${name}`); + } + } else if (scope.args && Object.prototype.hasOwnProperty.call(scope.args, name)) { + arg = scope.args[name]; + } else { + scope.reportError(new ReferenceError(`Unknown variable: $${name}`)); + return new FluentNone(`$${name}`); + } + if (arg instanceof FluentType) { + return arg; + } + switch (typeof arg) { + case "string": + return arg; + case "number": + return new FluentNumber(arg); + case "object": + if (arg instanceof Date) { + return new FluentDateTime(arg.getTime()); + } + default: + scope.reportError(new TypeError(`Variable type not supported: $${name}, ${typeof arg}`)); + return new FluentNone(`$${name}`); + } +} +function resolveMessageReference(scope, { + name, + attr +}) { + const message = scope.bundle._messages.get(name); + if (!message) { + scope.reportError(new ReferenceError(`Unknown message: ${name}`)); + return new FluentNone(name); + } + if (attr) { + const attribute = message.attributes[attr]; + if (attribute) { + return resolvePattern(scope, attribute); + } + scope.reportError(new ReferenceError(`Unknown attribute: ${attr}`)); + return new FluentNone(`${name}.${attr}`); + } + if (message.value) { + return resolvePattern(scope, message.value); + } + scope.reportError(new ReferenceError(`No value: ${name}`)); + return new FluentNone(name); +} +function resolveTermReference(scope, { + name, + attr, + args +}) { + const id = `-${name}`; + const term = scope.bundle._terms.get(id); + if (!term) { + scope.reportError(new ReferenceError(`Unknown term: ${id}`)); + return new FluentNone(id); + } + if (attr) { + const attribute = term.attributes[attr]; + if (attribute) { + scope.params = getArguments(scope, args).named; + const resolved = resolvePattern(scope, attribute); + scope.params = null; + return resolved; + } + scope.reportError(new ReferenceError(`Unknown attribute: ${attr}`)); + return new FluentNone(`${id}.${attr}`); + } + scope.params = getArguments(scope, args).named; + const resolved = resolvePattern(scope, term.value); + scope.params = null; + return resolved; +} +function resolveFunctionReference(scope, { + name, + args +}) { + let func = scope.bundle._functions[name]; + if (!func) { + scope.reportError(new ReferenceError(`Unknown function: ${name}()`)); + return new FluentNone(`${name}()`); + } + if (typeof func !== "function") { + scope.reportError(new TypeError(`Function ${name}() is not callable`)); + return new FluentNone(`${name}()`); + } + try { + let resolved = getArguments(scope, args); + return func(resolved.positional, resolved.named); + } catch (err) { + scope.reportError(err); + return new FluentNone(`${name}()`); + } +} +function resolveSelectExpression(scope, { + selector, + variants, + star +}) { + let sel = resolveExpression(scope, selector); + if (sel instanceof FluentNone) { + return getDefault(scope, variants, star); + } + for (const variant of variants) { + const key = resolveExpression(scope, variant.key); + if (match(scope, sel, key)) { + return resolvePattern(scope, variant.value); + } + } + return getDefault(scope, variants, star); +} +function resolveComplexPattern(scope, ptn) { + if (scope.dirty.has(ptn)) { + scope.reportError(new RangeError("Cyclic reference")); + return new FluentNone(); + } + scope.dirty.add(ptn); + const result = []; + const useIsolating = scope.bundle._useIsolating && ptn.length > 1; + for (const elem of ptn) { + if (typeof elem === "string") { + result.push(scope.bundle._transform(elem)); + continue; + } + scope.placeables++; + if (scope.placeables > MAX_PLACEABLES) { + scope.dirty.delete(ptn); + throw new RangeError(`Too many placeables expanded: ${scope.placeables}, ` + `max allowed is ${MAX_PLACEABLES}`); + } + if (useIsolating) { + result.push(FSI); + } + result.push(resolveExpression(scope, elem).toString(scope)); + if (useIsolating) { + result.push(PDI); + } + } + scope.dirty.delete(ptn); + return result.join(""); +} +function resolvePattern(scope, value) { + if (typeof value === "string") { + return scope.bundle._transform(value); + } + return resolveComplexPattern(scope, value); +} +;// CONCATENATED MODULE: ./node_modules/@fluent/bundle/esm/scope.js +class Scope { + constructor(bundle, errors, args) { + this.dirty = new WeakSet(); + this.params = null; + this.placeables = 0; + this.bundle = bundle; + this.errors = errors; + this.args = args; + } + reportError(error) { + if (!this.errors || !(error instanceof Error)) { + throw error; + } + this.errors.push(error); + } + memoizeIntlObject(ctor, opts) { + let cache = this.bundle._intls.get(ctor); + if (!cache) { + cache = {}; + this.bundle._intls.set(ctor, cache); + } + let id = JSON.stringify(opts); + if (!cache[id]) { + cache[id] = new ctor(this.bundle.locales, opts); + } + return cache[id]; + } +} +;// CONCATENATED MODULE: ./node_modules/@fluent/bundle/esm/builtins.js + +function values(opts, allowed) { + const unwrapped = Object.create(null); + for (const [name, opt] of Object.entries(opts)) { + if (allowed.includes(name)) { + unwrapped[name] = opt.valueOf(); + } + } + return unwrapped; +} +const NUMBER_ALLOWED = ["unitDisplay", "currencyDisplay", "useGrouping", "minimumIntegerDigits", "minimumFractionDigits", "maximumFractionDigits", "minimumSignificantDigits", "maximumSignificantDigits"]; +function NUMBER(args, opts) { + let arg = args[0]; + if (arg instanceof FluentNone) { + return new FluentNone(`NUMBER(${arg.valueOf()})`); + } + if (arg instanceof FluentNumber) { + return new FluentNumber(arg.valueOf(), { + ...arg.opts, + ...values(opts, NUMBER_ALLOWED) + }); + } + if (arg instanceof FluentDateTime) { + return new FluentNumber(arg.valueOf(), { + ...values(opts, NUMBER_ALLOWED) + }); + } + throw new TypeError("Invalid argument to NUMBER"); +} +const DATETIME_ALLOWED = ["dateStyle", "timeStyle", "fractionalSecondDigits", "dayPeriod", "hour12", "weekday", "era", "year", "month", "day", "hour", "minute", "second", "timeZoneName"]; +function DATETIME(args, opts) { + let arg = args[0]; + if (arg instanceof FluentNone) { + return new FluentNone(`DATETIME(${arg.valueOf()})`); + } + if (arg instanceof FluentDateTime) { + return new FluentDateTime(arg.valueOf(), { + ...arg.opts, + ...values(opts, DATETIME_ALLOWED) + }); + } + if (arg instanceof FluentNumber) { + return new FluentDateTime(arg.valueOf(), { + ...values(opts, DATETIME_ALLOWED) + }); + } + throw new TypeError("Invalid argument to DATETIME"); +} +;// CONCATENATED MODULE: ./node_modules/@fluent/bundle/esm/memoizer.js +const cache = new Map(); +function getMemoizerForLocale(locales) { + const stringLocale = Array.isArray(locales) ? locales.join(" ") : locales; + let memoizer = cache.get(stringLocale); + if (memoizer === undefined) { + memoizer = new Map(); + cache.set(stringLocale, memoizer); + } + return memoizer; +} +;// CONCATENATED MODULE: ./node_modules/@fluent/bundle/esm/bundle.js + + + + + +class FluentBundle { + constructor(locales, { + functions, + useIsolating = true, + transform = v => v + } = {}) { + this._terms = new Map(); + this._messages = new Map(); + this.locales = Array.isArray(locales) ? locales : [locales]; + this._functions = { + NUMBER: NUMBER, + DATETIME: DATETIME, + ...functions + }; + this._useIsolating = useIsolating; + this._transform = transform; + this._intls = getMemoizerForLocale(locales); + } + hasMessage(id) { + return this._messages.has(id); + } + getMessage(id) { + return this._messages.get(id); + } + addResource(res, { + allowOverrides = false + } = {}) { + const errors = []; + for (let i = 0; i < res.body.length; i++) { + let entry = res.body[i]; + if (entry.id.startsWith("-")) { + if (allowOverrides === false && this._terms.has(entry.id)) { + errors.push(new Error(`Attempt to override an existing term: "${entry.id}"`)); + continue; + } + this._terms.set(entry.id, entry); + } else { + if (allowOverrides === false && this._messages.has(entry.id)) { + errors.push(new Error(`Attempt to override an existing message: "${entry.id}"`)); + continue; + } + this._messages.set(entry.id, entry); + } + } + return errors; + } + formatPattern(pattern, args = null, errors = null) { + if (typeof pattern === "string") { + return this._transform(pattern); + } + let scope = new Scope(this, errors, args); + try { + let value = resolveComplexPattern(scope, pattern); + return value.toString(scope); + } catch (err) { + if (scope.errors && err instanceof Error) { + scope.errors.push(err); + return new FluentNone().toString(scope); + } + throw err; + } + } +} +;// CONCATENATED MODULE: ./node_modules/@fluent/bundle/esm/resource.js +const RE_MESSAGE_START = /^(-?[a-zA-Z][\w-]*) *= */gm; +const RE_ATTRIBUTE_START = /\.([a-zA-Z][\w-]*) *= */y; +const RE_VARIANT_START = /\*?\[/y; +const RE_NUMBER_LITERAL = /(-?[0-9]+(?:\.([0-9]+))?)/y; +const RE_IDENTIFIER = /([a-zA-Z][\w-]*)/y; +const RE_REFERENCE = /([$-])?([a-zA-Z][\w-]*)(?:\.([a-zA-Z][\w-]*))?/y; +const RE_FUNCTION_NAME = /^[A-Z][A-Z0-9_-]*$/; +const RE_TEXT_RUN = /([^{}\n\r]+)/y; +const RE_STRING_RUN = /([^\\"\n\r]*)/y; +const RE_STRING_ESCAPE = /\\([\\"])/y; +const RE_UNICODE_ESCAPE = /\\u([a-fA-F0-9]{4})|\\U([a-fA-F0-9]{6})/y; +const RE_LEADING_NEWLINES = /^\n+/; +const RE_TRAILING_SPACES = / +$/; +const RE_BLANK_LINES = / *\r?\n/g; +const RE_INDENT = /( *)$/; +const TOKEN_BRACE_OPEN = /{\s*/y; +const TOKEN_BRACE_CLOSE = /\s*}/y; +const TOKEN_BRACKET_OPEN = /\[\s*/y; +const TOKEN_BRACKET_CLOSE = /\s*] */y; +const TOKEN_PAREN_OPEN = /\s*\(\s*/y; +const TOKEN_ARROW = /\s*->\s*/y; +const TOKEN_COLON = /\s*:\s*/y; +const TOKEN_COMMA = /\s*,?\s*/y; +const TOKEN_BLANK = /\s+/y; +class FluentResource { + constructor(source) { + this.body = []; + RE_MESSAGE_START.lastIndex = 0; + let cursor = 0; + while (true) { + let next = RE_MESSAGE_START.exec(source); + if (next === null) { + break; + } + cursor = RE_MESSAGE_START.lastIndex; + try { + this.body.push(parseMessage(next[1])); + } catch (err) { + if (err instanceof SyntaxError) { + continue; + } + throw err; + } + } + function test(re) { + re.lastIndex = cursor; + return re.test(source); + } + function consumeChar(char, errorClass) { + if (source[cursor] === char) { + cursor++; + return true; + } + if (errorClass) { + throw new errorClass(`Expected ${char}`); + } + return false; + } + function consumeToken(re, errorClass) { + if (test(re)) { + cursor = re.lastIndex; + return true; + } + if (errorClass) { + throw new errorClass(`Expected ${re.toString()}`); + } + return false; + } + function match(re) { + re.lastIndex = cursor; + let result = re.exec(source); + if (result === null) { + throw new SyntaxError(`Expected ${re.toString()}`); + } + cursor = re.lastIndex; + return result; + } + function match1(re) { + return match(re)[1]; + } + function parseMessage(id) { + let value = parsePattern(); + let attributes = parseAttributes(); + if (value === null && Object.keys(attributes).length === 0) { + throw new SyntaxError("Expected message value or attributes"); + } + return { + id, + value, + attributes + }; + } + function parseAttributes() { + let attrs = Object.create(null); + while (test(RE_ATTRIBUTE_START)) { + let name = match1(RE_ATTRIBUTE_START); + let value = parsePattern(); + if (value === null) { + throw new SyntaxError("Expected attribute value"); + } + attrs[name] = value; + } + return attrs; + } + function parsePattern() { + let first; + if (test(RE_TEXT_RUN)) { + first = match1(RE_TEXT_RUN); + } + if (source[cursor] === "{" || source[cursor] === "}") { + return parsePatternElements(first ? [first] : [], Infinity); + } + let indent = parseIndent(); + if (indent) { + if (first) { + return parsePatternElements([first, indent], indent.length); + } + indent.value = trim(indent.value, RE_LEADING_NEWLINES); + return parsePatternElements([indent], indent.length); + } + if (first) { + return trim(first, RE_TRAILING_SPACES); + } + return null; + } + function parsePatternElements(elements = [], commonIndent) { + while (true) { + if (test(RE_TEXT_RUN)) { + elements.push(match1(RE_TEXT_RUN)); + continue; + } + if (source[cursor] === "{") { + elements.push(parsePlaceable()); + continue; + } + if (source[cursor] === "}") { + throw new SyntaxError("Unbalanced closing brace"); + } + let indent = parseIndent(); + if (indent) { + elements.push(indent); + commonIndent = Math.min(commonIndent, indent.length); + continue; + } + break; + } + let lastIndex = elements.length - 1; + let lastElement = elements[lastIndex]; + if (typeof lastElement === "string") { + elements[lastIndex] = trim(lastElement, RE_TRAILING_SPACES); + } + let baked = []; + for (let element of elements) { + if (element instanceof Indent) { + element = element.value.slice(0, element.value.length - commonIndent); + } + if (element) { + baked.push(element); + } + } + return baked; + } + function parsePlaceable() { + consumeToken(TOKEN_BRACE_OPEN, SyntaxError); + let selector = parseInlineExpression(); + if (consumeToken(TOKEN_BRACE_CLOSE)) { + return selector; + } + if (consumeToken(TOKEN_ARROW)) { + let variants = parseVariants(); + consumeToken(TOKEN_BRACE_CLOSE, SyntaxError); + return { + type: "select", + selector, + ...variants + }; + } + throw new SyntaxError("Unclosed placeable"); + } + function parseInlineExpression() { + if (source[cursor] === "{") { + return parsePlaceable(); + } + if (test(RE_REFERENCE)) { + let [, sigil, name, attr = null] = match(RE_REFERENCE); + if (sigil === "$") { + return { + type: "var", + name + }; + } + if (consumeToken(TOKEN_PAREN_OPEN)) { + let args = parseArguments(); + if (sigil === "-") { + return { + type: "term", + name, + attr, + args + }; + } + if (RE_FUNCTION_NAME.test(name)) { + return { + type: "func", + name, + args + }; + } + throw new SyntaxError("Function names must be all upper-case"); + } + if (sigil === "-") { + return { + type: "term", + name, + attr, + args: [] + }; + } + return { + type: "mesg", + name, + attr + }; + } + return parseLiteral(); + } + function parseArguments() { + let args = []; + while (true) { + switch (source[cursor]) { + case ")": + cursor++; + return args; + case undefined: + throw new SyntaxError("Unclosed argument list"); + } + args.push(parseArgument()); + consumeToken(TOKEN_COMMA); + } + } + function parseArgument() { + let expr = parseInlineExpression(); + if (expr.type !== "mesg") { + return expr; + } + if (consumeToken(TOKEN_COLON)) { + return { + type: "narg", + name: expr.name, + value: parseLiteral() + }; + } + return expr; + } + function parseVariants() { + let variants = []; + let count = 0; + let star; + while (test(RE_VARIANT_START)) { + if (consumeChar("*")) { + star = count; + } + let key = parseVariantKey(); + let value = parsePattern(); + if (value === null) { + throw new SyntaxError("Expected variant value"); + } + variants[count++] = { + key, + value + }; + } + if (count === 0) { + return null; + } + if (star === undefined) { + throw new SyntaxError("Expected default variant"); + } + return { + variants, + star + }; + } + function parseVariantKey() { + consumeToken(TOKEN_BRACKET_OPEN, SyntaxError); + let key; + if (test(RE_NUMBER_LITERAL)) { + key = parseNumberLiteral(); + } else { + key = { + type: "str", + value: match1(RE_IDENTIFIER) + }; + } + consumeToken(TOKEN_BRACKET_CLOSE, SyntaxError); + return key; + } + function parseLiteral() { + if (test(RE_NUMBER_LITERAL)) { + return parseNumberLiteral(); + } + if (source[cursor] === '"') { + return parseStringLiteral(); + } + throw new SyntaxError("Invalid expression"); + } + function parseNumberLiteral() { + let [, value, fraction = ""] = match(RE_NUMBER_LITERAL); + let precision = fraction.length; + return { + type: "num", + value: parseFloat(value), + precision + }; + } + function parseStringLiteral() { + consumeChar('"', SyntaxError); + let value = ""; + while (true) { + value += match1(RE_STRING_RUN); + if (source[cursor] === "\\") { + value += parseEscapeSequence(); + continue; + } + if (consumeChar('"')) { + return { + type: "str", + value + }; + } + throw new SyntaxError("Unclosed string literal"); + } + } + function parseEscapeSequence() { + if (test(RE_STRING_ESCAPE)) { + return match1(RE_STRING_ESCAPE); + } + if (test(RE_UNICODE_ESCAPE)) { + let [, codepoint4, codepoint6] = match(RE_UNICODE_ESCAPE); + let codepoint = parseInt(codepoint4 || codepoint6, 16); + return codepoint <= 0xd7ff || 0xe000 <= codepoint ? String.fromCodePoint(codepoint) : "�"; + } + throw new SyntaxError("Unknown escape sequence"); + } + function parseIndent() { + let start = cursor; + consumeToken(TOKEN_BLANK); + switch (source[cursor]) { + case ".": + case "[": + case "*": + case "}": + case undefined: + return false; + case "{": + return makeIndent(source.slice(start, cursor)); + } + if (source[cursor - 1] === " ") { + return makeIndent(source.slice(start, cursor)); + } + return false; + } + function trim(text, re) { + return text.replace(re, ""); + } + function makeIndent(blank) { + let value = blank.replace(RE_BLANK_LINES, "\n"); + let length = RE_INDENT.exec(blank)[1].length; + return new Indent(value, length); + } + } +} +class Indent { + constructor(value, length) { + this.value = value; + this.length = length; + } +} +;// CONCATENATED MODULE: ./node_modules/@fluent/bundle/esm/index.js + + + +;// CONCATENATED MODULE: ./node_modules/@fluent/dom/esm/overlay.js +const reOverlay = /<|&#?\w+;/; +const TEXT_LEVEL_ELEMENTS = { + "http://www.w3.org/1999/xhtml": ["em", "strong", "small", "s", "cite", "q", "dfn", "abbr", "data", "time", "code", "var", "samp", "kbd", "sub", "sup", "i", "b", "u", "mark", "bdi", "bdo", "span", "br", "wbr"] +}; +const LOCALIZABLE_ATTRIBUTES = { + "http://www.w3.org/1999/xhtml": { + global: ["title", "aria-label", "aria-valuetext"], + a: ["download"], + area: ["download", "alt"], + input: ["alt", "placeholder"], + menuitem: ["label"], + menu: ["label"], + optgroup: ["label"], + option: ["label"], + track: ["label"], + img: ["alt"], + textarea: ["placeholder"], + th: ["abbr"] + }, + "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul": { + global: ["accesskey", "aria-label", "aria-valuetext", "label", "title", "tooltiptext"], + description: ["value"], + key: ["key", "keycode"], + label: ["value"], + textbox: ["placeholder", "value"] + } +}; +function translateElement(element, translation) { + const { + value + } = translation; + if (typeof value === "string") { + if (element.localName === "title" && element.namespaceURI === "http://www.w3.org/1999/xhtml") { + element.textContent = value; + } else if (!reOverlay.test(value)) { + element.textContent = value; + } else { + const templateElement = element.ownerDocument.createElementNS("http://www.w3.org/1999/xhtml", "template"); + templateElement.innerHTML = value; + overlayChildNodes(templateElement.content, element); + } + } + overlayAttributes(translation, element); +} +function overlayChildNodes(fromFragment, toElement) { + for (const childNode of fromFragment.childNodes) { + if (childNode.nodeType === childNode.TEXT_NODE) { + continue; + } + if (childNode.hasAttribute("data-l10n-name")) { + const sanitized = getNodeForNamedElement(toElement, childNode); + fromFragment.replaceChild(sanitized, childNode); + continue; + } + if (isElementAllowed(childNode)) { + const sanitized = createSanitizedElement(childNode); + fromFragment.replaceChild(sanitized, childNode); + continue; + } + console.warn(`An element of forbidden type "${childNode.localName}" was found in ` + "the translation. Only safe text-level elements and elements with " + "data-l10n-name are allowed."); + fromFragment.replaceChild(createTextNodeFromTextContent(childNode), childNode); + } + toElement.textContent = ""; + toElement.appendChild(fromFragment); +} +function hasAttribute(attributes, name) { + if (!attributes) { + return false; + } + for (let attr of attributes) { + if (attr.name === name) { + return true; + } + } + return false; +} +function overlayAttributes(fromElement, toElement) { + const explicitlyAllowed = toElement.hasAttribute("data-l10n-attrs") ? toElement.getAttribute("data-l10n-attrs").split(",").map(i => i.trim()) : null; + for (const attr of Array.from(toElement.attributes)) { + if (isAttrNameLocalizable(attr.name, toElement, explicitlyAllowed) && !hasAttribute(fromElement.attributes, attr.name)) { + toElement.removeAttribute(attr.name); + } + } + if (!fromElement.attributes) { + return; + } + for (const attr of Array.from(fromElement.attributes)) { + if (isAttrNameLocalizable(attr.name, toElement, explicitlyAllowed) && toElement.getAttribute(attr.name) !== attr.value) { + toElement.setAttribute(attr.name, attr.value); + } + } +} +function getNodeForNamedElement(sourceElement, translatedChild) { + const childName = translatedChild.getAttribute("data-l10n-name"); + const sourceChild = sourceElement.querySelector(`[data-l10n-name="${childName}"]`); + if (!sourceChild) { + console.warn(`An element named "${childName}" wasn't found in the source.`); + return createTextNodeFromTextContent(translatedChild); + } + if (sourceChild.localName !== translatedChild.localName) { + console.warn(`An element named "${childName}" was found in the translation ` + `but its type ${translatedChild.localName} didn't match the ` + `element found in the source (${sourceChild.localName}).`); + return createTextNodeFromTextContent(translatedChild); + } + sourceElement.removeChild(sourceChild); + const clone = sourceChild.cloneNode(false); + return shallowPopulateUsing(translatedChild, clone); +} +function createSanitizedElement(element) { + const clone = element.ownerDocument.createElement(element.localName); + return shallowPopulateUsing(element, clone); +} +function createTextNodeFromTextContent(element) { + return element.ownerDocument.createTextNode(element.textContent); +} +function isElementAllowed(element) { + const allowed = TEXT_LEVEL_ELEMENTS[element.namespaceURI]; + return allowed && allowed.includes(element.localName); +} +function isAttrNameLocalizable(name, element, explicitlyAllowed = null) { + if (explicitlyAllowed && explicitlyAllowed.includes(name)) { + return true; + } + const allowed = LOCALIZABLE_ATTRIBUTES[element.namespaceURI]; + if (!allowed) { + return false; + } + const attrName = name.toLowerCase(); + const elemName = element.localName; + if (allowed.global.includes(attrName)) { + return true; + } + if (!allowed[elemName]) { + return false; + } + if (allowed[elemName].includes(attrName)) { + return true; + } + if (element.namespaceURI === "http://www.w3.org/1999/xhtml" && elemName === "input" && attrName === "value") { + const type = element.type.toLowerCase(); + if (type === "submit" || type === "button" || type === "reset") { + return true; + } + } + return false; +} +function shallowPopulateUsing(fromElement, toElement) { + toElement.textContent = fromElement.textContent; + overlayAttributes(fromElement, toElement); + return toElement; +} +;// CONCATENATED MODULE: ./node_modules/cached-iterable/src/cached_iterable.mjs +class CachedIterable extends Array { + static from(iterable) { + if (iterable instanceof this) { + return iterable; + } + return new this(iterable); + } +} +;// CONCATENATED MODULE: ./node_modules/cached-iterable/src/cached_sync_iterable.mjs + +class CachedSyncIterable extends CachedIterable { + constructor(iterable) { + super(); + if (Symbol.iterator in Object(iterable)) { + this.iterator = iterable[Symbol.iterator](); + } else { + throw new TypeError("Argument must implement the iteration protocol."); + } + } + [Symbol.iterator]() { + const cached = this; + let cur = 0; + return { + next() { + if (cached.length <= cur) { + cached.push(cached.iterator.next()); + } + return cached[cur++]; + } + }; + } + touchNext(count = 1) { + let idx = 0; + while (idx++ < count) { + const last = this[this.length - 1]; + if (last && last.done) { + break; + } + this.push(this.iterator.next()); + } + return this[this.length - 1]; + } +} +;// CONCATENATED MODULE: ./node_modules/cached-iterable/src/cached_async_iterable.mjs + +class CachedAsyncIterable extends CachedIterable { + constructor(iterable) { + super(); + if (Symbol.asyncIterator in Object(iterable)) { + this.iterator = iterable[Symbol.asyncIterator](); + } else if (Symbol.iterator in Object(iterable)) { + this.iterator = iterable[Symbol.iterator](); + } else { + throw new TypeError("Argument must implement the iteration protocol."); + } + } + [Symbol.asyncIterator]() { + const cached = this; + let cur = 0; + return { + async next() { + if (cached.length <= cur) { + cached.push(cached.iterator.next()); + } + return cached[cur++]; + } + }; + } + async touchNext(count = 1) { + let idx = 0; + while (idx++ < count) { + const last = this[this.length - 1]; + if (last && (await last).done) { + break; + } + this.push(this.iterator.next()); + } + return this[this.length - 1]; + } +} +;// CONCATENATED MODULE: ./node_modules/cached-iterable/src/index.mjs + + +;// CONCATENATED MODULE: ./node_modules/@fluent/dom/esm/localization.js + +class Localization { + constructor(resourceIds = [], generateBundles) { + this.resourceIds = resourceIds; + this.generateBundles = generateBundles; + this.onChange(true); + } + addResourceIds(resourceIds, eager = false) { + this.resourceIds.push(...resourceIds); + this.onChange(eager); + return this.resourceIds.length; + } + removeResourceIds(resourceIds) { + this.resourceIds = this.resourceIds.filter(r => !resourceIds.includes(r)); + this.onChange(); + return this.resourceIds.length; + } + async formatWithFallback(keys, method) { + const translations = []; + let hasAtLeastOneBundle = false; + for await (const bundle of this.bundles) { + hasAtLeastOneBundle = true; + const missingIds = keysFromBundle(method, bundle, keys, translations); + if (missingIds.size === 0) { + break; + } + if (typeof console !== "undefined") { + const locale = bundle.locales[0]; + const ids = Array.from(missingIds).join(", "); + console.warn(`[fluent] Missing translations in ${locale}: ${ids}`); + } + } + if (!hasAtLeastOneBundle && typeof console !== "undefined") { + console.warn(`[fluent] Request for keys failed because no resource bundles got generated. + keys: ${JSON.stringify(keys)}. + resourceIds: ${JSON.stringify(this.resourceIds)}.`); + } + return translations; + } + formatMessages(keys) { + return this.formatWithFallback(keys, messageFromBundle); + } + formatValues(keys) { + return this.formatWithFallback(keys, valueFromBundle); + } + async formatValue(id, args) { + const [val] = await this.formatValues([{ + id, + args + }]); + return val; + } + handleEvent() { + this.onChange(); + } + onChange(eager = false) { + this.bundles = CachedAsyncIterable.from(this.generateBundles(this.resourceIds)); + if (eager) { + this.bundles.touchNext(2); + } + } +} +function valueFromBundle(bundle, errors, message, args) { + if (message.value) { + return bundle.formatPattern(message.value, args, errors); + } + return null; +} +function messageFromBundle(bundle, errors, message, args) { + const formatted = { + value: null, + attributes: null + }; + if (message.value) { + formatted.value = bundle.formatPattern(message.value, args, errors); + } + let attrNames = Object.keys(message.attributes); + if (attrNames.length > 0) { + formatted.attributes = new Array(attrNames.length); + for (let [i, name] of attrNames.entries()) { + let value = bundle.formatPattern(message.attributes[name], args, errors); + formatted.attributes[i] = { + name, + value + }; + } + } + return formatted; +} +function keysFromBundle(method, bundle, keys, translations) { + const messageErrors = []; + const missingIds = new Set(); + keys.forEach(({ + id, + args + }, i) => { + if (translations[i] !== undefined) { + return; + } + let message = bundle.getMessage(id); + if (message) { + messageErrors.length = 0; + translations[i] = method(bundle, messageErrors, message, args); + if (messageErrors.length > 0 && typeof console !== "undefined") { + const locale = bundle.locales[0]; + const errors = messageErrors.join(", "); + console.warn(`[fluent][resolver] errors in ${locale}/${id}: ${errors}.`); + } + } else { + missingIds.add(id); + } + }); + return missingIds; +} +;// CONCATENATED MODULE: ./node_modules/@fluent/dom/esm/dom_localization.js + + +const L10NID_ATTR_NAME = "data-l10n-id"; +const L10NARGS_ATTR_NAME = "data-l10n-args"; +const L10N_ELEMENT_QUERY = `[${L10NID_ATTR_NAME}]`; +class DOMLocalization extends Localization { + constructor(resourceIds, generateBundles) { + super(resourceIds, generateBundles); + this.roots = new Set(); + this.pendingrAF = null; + this.pendingElements = new Set(); + this.windowElement = null; + this.mutationObserver = null; + this.observerConfig = { + attributes: true, + characterData: false, + childList: true, + subtree: true, + attributeFilter: [L10NID_ATTR_NAME, L10NARGS_ATTR_NAME] + }; + } + onChange(eager = false) { + super.onChange(eager); + if (this.roots) { + this.translateRoots(); + } + } + setAttributes(element, id, args) { + element.setAttribute(L10NID_ATTR_NAME, id); + if (args) { + element.setAttribute(L10NARGS_ATTR_NAME, JSON.stringify(args)); + } else { + element.removeAttribute(L10NARGS_ATTR_NAME); + } + return element; + } + getAttributes(element) { + return { + id: element.getAttribute(L10NID_ATTR_NAME), + args: JSON.parse(element.getAttribute(L10NARGS_ATTR_NAME) || null) + }; + } + connectRoot(newRoot) { + for (const root of this.roots) { + if (root === newRoot || root.contains(newRoot) || newRoot.contains(root)) { + throw new Error("Cannot add a root that overlaps with existing root."); + } + } + if (this.windowElement) { + if (this.windowElement !== newRoot.ownerDocument.defaultView) { + throw new Error(`Cannot connect a root: + DOMLocalization already has a root from a different window.`); + } + } else { + this.windowElement = newRoot.ownerDocument.defaultView; + this.mutationObserver = new this.windowElement.MutationObserver(mutations => this.translateMutations(mutations)); + } + this.roots.add(newRoot); + this.mutationObserver.observe(newRoot, this.observerConfig); + } + disconnectRoot(root) { + this.roots.delete(root); + this.pauseObserving(); + if (this.roots.size === 0) { + this.mutationObserver = null; + this.windowElement = null; + this.pendingrAF = null; + this.pendingElements.clear(); + return true; + } + this.resumeObserving(); + return false; + } + translateRoots() { + const roots = Array.from(this.roots); + return Promise.all(roots.map(root => this.translateFragment(root))); + } + pauseObserving() { + if (!this.mutationObserver) { + return; + } + this.translateMutations(this.mutationObserver.takeRecords()); + this.mutationObserver.disconnect(); + } + resumeObserving() { + if (!this.mutationObserver) { + return; + } + for (const root of this.roots) { + this.mutationObserver.observe(root, this.observerConfig); + } + } + translateMutations(mutations) { + for (const mutation of mutations) { + switch (mutation.type) { + case "attributes": + if (mutation.target.hasAttribute("data-l10n-id")) { + this.pendingElements.add(mutation.target); + } + break; + case "childList": + for (const addedNode of mutation.addedNodes) { + if (addedNode.nodeType === addedNode.ELEMENT_NODE) { + if (addedNode.childElementCount) { + for (const element of this.getTranslatables(addedNode)) { + this.pendingElements.add(element); + } + } else if (addedNode.hasAttribute(L10NID_ATTR_NAME)) { + this.pendingElements.add(addedNode); + } + } + } + break; + } + } + if (this.pendingElements.size > 0) { + if (this.pendingrAF === null) { + this.pendingrAF = this.windowElement.requestAnimationFrame(() => { + this.translateElements(Array.from(this.pendingElements)); + this.pendingElements.clear(); + this.pendingrAF = null; + }); + } + } + } + translateFragment(frag) { + return this.translateElements(this.getTranslatables(frag)); + } + async translateElements(elements) { + if (!elements.length) { + return undefined; + } + const keys = elements.map(this.getKeysForElement); + const translations = await this.formatMessages(keys); + return this.applyTranslations(elements, translations); + } + applyTranslations(elements, translations) { + this.pauseObserving(); + for (let i = 0; i < elements.length; i++) { + if (translations[i] !== undefined) { + translateElement(elements[i], translations[i]); + } + } + this.resumeObserving(); + } + getTranslatables(element) { + const nodes = Array.from(element.querySelectorAll(L10N_ELEMENT_QUERY)); + if (typeof element.hasAttribute === "function" && element.hasAttribute(L10NID_ATTR_NAME)) { + nodes.push(element); + } + return nodes; + } + getKeysForElement(element) { + return { + id: element.getAttribute(L10NID_ATTR_NAME), + args: JSON.parse(element.getAttribute(L10NARGS_ATTR_NAME) || null) + }; + } +} +;// CONCATENATED MODULE: ./node_modules/@fluent/dom/esm/index.js + + +;// CONCATENATED MODULE: ./web/l10n.js +class L10n { + #dir; + #lang; + #l10n; + constructor({ + lang, + isRTL + }, l10n = null) { + this.#lang = L10n.#fixupLangCode(lang); + this.#l10n = l10n; + this.#dir = isRTL ?? L10n.#isRTL(this.#lang) ? "rtl" : "ltr"; + } + _setL10n(l10n) { + this.#l10n = l10n; + } + getLanguage() { + return this.#lang; + } + getDirection() { + return this.#dir; + } + async get(ids, args = null, fallback) { + if (Array.isArray(ids)) { + ids = ids.map(id => ({ + id + })); + const messages = await this.#l10n.formatMessages(ids); + return messages.map(message => message.value); + } + const messages = await this.#l10n.formatMessages([{ + id: ids, + args + }]); + return messages?.[0].value || fallback; + } + async translate(element) { + try { + this.#l10n.connectRoot(element); + await this.#l10n.translateRoots(); + } catch {} + } + pause() { + this.#l10n.pauseObserving(); + } + resume() { + this.#l10n.resumeObserving(); + } + static #fixupLangCode(langCode) { + langCode = langCode?.toLowerCase() || "en-us"; + const PARTIAL_LANG_CODES = { + en: "en-us", + es: "es-es", + fy: "fy-nl", + ga: "ga-ie", + gu: "gu-in", + hi: "hi-in", + hy: "hy-am", + nb: "nb-no", + ne: "ne-np", + nn: "nn-no", + pa: "pa-in", + pt: "pt-pt", + sv: "sv-se", + zh: "zh-cn" + }; + return PARTIAL_LANG_CODES[langCode] || langCode; + } + static #isRTL(lang) { + const shortCode = lang.split("-", 1)[0]; + return ["ar", "he", "fa", "ps", "ur"].includes(shortCode); + } +} +const GenericL10n = null; + +;// CONCATENATED MODULE: ./web/genericl10n.js + + + + +function createBundle(lang, text) { + const resource = new FluentResource(text); + const bundle = new FluentBundle(lang); + const errors = bundle.addResource(resource); + if (errors.length) { + console.error("L10n errors", errors); + } + return bundle; +} +class genericl10n_GenericL10n extends L10n { + constructor(lang) { + super({ + lang + }); + const generateBundles = !lang ? genericl10n_GenericL10n.#generateBundlesFallback.bind(genericl10n_GenericL10n, this.getLanguage()) : genericl10n_GenericL10n.#generateBundles.bind(genericl10n_GenericL10n, "en-us", this.getLanguage()); + this._setL10n(new DOMLocalization([], generateBundles)); + } + static async *#generateBundles(defaultLang, baseLang) { + const { + baseURL, + paths + } = await this.#getPaths(); + const langs = [baseLang]; + if (defaultLang !== baseLang) { + const shortLang = baseLang.split("-", 1)[0]; + if (shortLang !== baseLang) { + langs.push(shortLang); + } + langs.push(defaultLang); + } + for (const lang of langs) { + const bundle = await this.#createBundle(lang, baseURL, paths); + if (bundle) { + yield bundle; + } + if (lang === "en-us") { + yield this.#createBundleFallback(lang); + } + } + } + static async #createBundle(lang, baseURL, paths) { + const path = paths[lang]; + if (!path) { + return null; + } + const url = new URL(path, baseURL); + const text = await fetchData(url, "text"); + return createBundle(lang, text); + } + static async #getPaths() { + try { + const { + href + } = document.querySelector(`link[type="application/l10n"]`); + const paths = await fetchData(href, "json"); + return { + baseURL: href.replace(/[^/]*$/, "") || "./", + paths + }; + } catch {} + return { + baseURL: "./", + paths: Object.create(null) + }; + } + static async *#generateBundlesFallback(lang) { + yield this.#createBundleFallback(lang); + } + static async #createBundleFallback(lang) { + const text = "pdfjs-previous-button =\n .title = Previous Page\npdfjs-previous-button-label = Previous\npdfjs-next-button =\n .title = Next Page\npdfjs-next-button-label = Next\npdfjs-page-input =\n .title = Page\npdfjs-of-pages = of { $pagesCount }\npdfjs-page-of-pages = ({ $pageNumber } of { $pagesCount })\npdfjs-zoom-out-button =\n .title = Zoom Out\npdfjs-zoom-out-button-label = Zoom Out\npdfjs-zoom-in-button =\n .title = Zoom In\npdfjs-zoom-in-button-label = Zoom In\npdfjs-zoom-select =\n .title = Zoom\npdfjs-presentation-mode-button =\n .title = Switch to Presentation Mode\npdfjs-presentation-mode-button-label = Presentation Mode\npdfjs-open-file-button =\n .title = Open File\npdfjs-open-file-button-label = Open\npdfjs-print-button =\n .title = Print\npdfjs-print-button-label = Print\npdfjs-save-button =\n .title = Save\npdfjs-save-button-label = Save\npdfjs-download-button =\n .title = Download\npdfjs-download-button-label = Download\npdfjs-bookmark-button =\n .title = Current Page (View URL from Current Page)\npdfjs-bookmark-button-label = Current Page\npdfjs-tools-button =\n .title = Tools\npdfjs-tools-button-label = Tools\npdfjs-first-page-button =\n .title = Go to First Page\npdfjs-first-page-button-label = Go to First Page\npdfjs-last-page-button =\n .title = Go to Last Page\npdfjs-last-page-button-label = Go to Last Page\npdfjs-page-rotate-cw-button =\n .title = Rotate Clockwise\npdfjs-page-rotate-cw-button-label = Rotate Clockwise\npdfjs-page-rotate-ccw-button =\n .title = Rotate Counterclockwise\npdfjs-page-rotate-ccw-button-label = Rotate Counterclockwise\npdfjs-cursor-text-select-tool-button =\n .title = Enable Text Selection Tool\npdfjs-cursor-text-select-tool-button-label = Text Selection Tool\npdfjs-cursor-hand-tool-button =\n .title = Enable Hand Tool\npdfjs-cursor-hand-tool-button-label = Hand Tool\npdfjs-scroll-page-button =\n .title = Use Page Scrolling\npdfjs-scroll-page-button-label = Page Scrolling\npdfjs-scroll-vertical-button =\n .title = Use Vertical Scrolling\npdfjs-scroll-vertical-button-label = Vertical Scrolling\npdfjs-scroll-horizontal-button =\n .title = Use Horizontal Scrolling\npdfjs-scroll-horizontal-button-label = Horizontal Scrolling\npdfjs-scroll-wrapped-button =\n .title = Use Wrapped Scrolling\npdfjs-scroll-wrapped-button-label = Wrapped Scrolling\npdfjs-spread-none-button =\n .title = Do not join page spreads\npdfjs-spread-none-button-label = No Spreads\npdfjs-spread-odd-button =\n .title = Join page spreads starting with odd-numbered pages\npdfjs-spread-odd-button-label = Odd Spreads\npdfjs-spread-even-button =\n .title = Join page spreads starting with even-numbered pages\npdfjs-spread-even-button-label = Even Spreads\npdfjs-document-properties-button =\n .title = Document Properties\u2026\npdfjs-document-properties-button-label = Document Properties\u2026\npdfjs-document-properties-file-name = File name:\npdfjs-document-properties-file-size = File size:\npdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes)\npdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes)\npdfjs-document-properties-title = Title:\npdfjs-document-properties-author = Author:\npdfjs-document-properties-subject = Subject:\npdfjs-document-properties-keywords = Keywords:\npdfjs-document-properties-creation-date = Creation Date:\npdfjs-document-properties-modification-date = Modification Date:\npdfjs-document-properties-date-string = { $date }, { $time }\npdfjs-document-properties-creator = Creator:\npdfjs-document-properties-producer = PDF Producer:\npdfjs-document-properties-version = PDF Version:\npdfjs-document-properties-page-count = Page Count:\npdfjs-document-properties-page-size = Page Size:\npdfjs-document-properties-page-size-unit-inches = in\npdfjs-document-properties-page-size-unit-millimeters = mm\npdfjs-document-properties-page-size-orientation-portrait = portrait\npdfjs-document-properties-page-size-orientation-landscape = landscape\npdfjs-document-properties-page-size-name-a-three = A3\npdfjs-document-properties-page-size-name-a-four = A4\npdfjs-document-properties-page-size-name-letter = Letter\npdfjs-document-properties-page-size-name-legal = Legal\npdfjs-document-properties-page-size-dimension-string = { $width } \xD7 { $height } { $unit } ({ $orientation })\npdfjs-document-properties-page-size-dimension-name-string = { $width } \xD7 { $height } { $unit } ({ $name }, { $orientation })\npdfjs-document-properties-linearized = Fast Web View:\npdfjs-document-properties-linearized-yes = Yes\npdfjs-document-properties-linearized-no = No\npdfjs-document-properties-close-button = Close\npdfjs-print-progress-message = Preparing document for printing\u2026\npdfjs-print-progress-percent = { $progress }%\npdfjs-print-progress-close-button = Cancel\npdfjs-printing-not-supported = Warning: Printing is not fully supported by this browser.\npdfjs-printing-not-ready = Warning: The PDF is not fully loaded for printing.\npdfjs-toggle-sidebar-button =\n .title = Toggle Sidebar\npdfjs-toggle-sidebar-notification-button =\n .title = Toggle Sidebar (document contains outline/attachments/layers)\npdfjs-toggle-sidebar-button-label = Toggle Sidebar\npdfjs-document-outline-button =\n .title = Show Document Outline (double-click to expand/collapse all items)\npdfjs-document-outline-button-label = Document Outline\npdfjs-attachments-button =\n .title = Show Attachments\npdfjs-attachments-button-label = Attachments\npdfjs-layers-button =\n .title = Show Layers (double-click to reset all layers to the default state)\npdfjs-layers-button-label = Layers\npdfjs-thumbs-button =\n .title = Show Thumbnails\npdfjs-thumbs-button-label = Thumbnails\npdfjs-current-outline-item-button =\n .title = Find Current Outline Item\npdfjs-current-outline-item-button-label = Current Outline Item\npdfjs-findbar-button =\n .title = Find in Document\npdfjs-findbar-button-label = Find\npdfjs-additional-layers = Additional Layers\npdfjs-thumb-page-title =\n .title = Page { $page }\npdfjs-thumb-page-canvas =\n .aria-label = Thumbnail of Page { $page }\npdfjs-find-input =\n .title = Find\n .placeholder = Find in document\u2026\npdfjs-find-previous-button =\n .title = Find the previous occurrence of the phrase\npdfjs-find-previous-button-label = Previous\npdfjs-find-next-button =\n .title = Find the next occurrence of the phrase\npdfjs-find-next-button-label = Next\npdfjs-find-highlight-checkbox = Highlight All\npdfjs-find-match-case-checkbox-label = Match Case\npdfjs-find-match-diacritics-checkbox-label = Match Diacritics\npdfjs-find-entire-word-checkbox-label = Whole Words\npdfjs-find-reached-top = Reached top of document, continued from bottom\npdfjs-find-reached-bottom = Reached end of document, continued from top\npdfjs-find-match-count =\n { $total ->\n [one] { $current } of { $total } match\n *[other] { $current } of { $total } matches\n }\npdfjs-find-match-count-limit =\n { $limit ->\n [one] More than { $limit } match\n *[other] More than { $limit } matches\n }\npdfjs-find-not-found = Phrase not found\npdfjs-page-scale-width = Page Width\npdfjs-page-scale-fit = Page Fit\npdfjs-page-scale-auto = Automatic Zoom\npdfjs-page-scale-actual = Actual Size\npdfjs-page-scale-percent = { $scale }%\npdfjs-page-landmark =\n .aria-label = Page { $page }\npdfjs-loading-error = An error occurred while loading the PDF.\npdfjs-invalid-file-error = Invalid or corrupted PDF file.\npdfjs-missing-file-error = Missing PDF file.\npdfjs-unexpected-response-error = Unexpected server response.\npdfjs-rendering-error = An error occurred while rendering the page.\npdfjs-annotation-date-string = { $date }, { $time }\npdfjs-text-annotation-type =\n .alt = [{ $type } Annotation]\npdfjs-password-label = Enter the password to open this PDF file.\npdfjs-password-invalid = Invalid password. Please try again.\npdfjs-password-ok-button = OK\npdfjs-password-cancel-button = Cancel\npdfjs-web-fonts-disabled = Web fonts are disabled: unable to use embedded PDF fonts.\npdfjs-editor-free-text-button =\n .title = Text\npdfjs-editor-free-text-button-label = Text\npdfjs-editor-ink-button =\n .title = Draw\npdfjs-editor-ink-button-label = Draw\npdfjs-editor-stamp-button =\n .title = Add or edit images\npdfjs-editor-stamp-button-label = Add or edit images\npdfjs-editor-highlight-button =\n .title = Highlight\npdfjs-editor-highlight-button-label = Highlight\npdfjs-highlight-floating-button1 =\n .title = Highlight\n .aria-label = Highlight\npdfjs-highlight-floating-button-label = Highlight\npdfjs-editor-remove-ink-button =\n .title = Remove drawing\npdfjs-editor-remove-freetext-button =\n .title = Remove text\npdfjs-editor-remove-stamp-button =\n .title = Remove image\npdfjs-editor-remove-highlight-button =\n .title = Remove highlight\npdfjs-editor-free-text-color-input = Color\npdfjs-editor-free-text-size-input = Size\npdfjs-editor-ink-color-input = Color\npdfjs-editor-ink-thickness-input = Thickness\npdfjs-editor-ink-opacity-input = Opacity\npdfjs-editor-stamp-add-image-button =\n .title = Add image\npdfjs-editor-stamp-add-image-button-label = Add image\npdfjs-editor-free-highlight-thickness-input = Thickness\npdfjs-editor-free-highlight-thickness-title =\n .title = Change thickness when highlighting items other than text\npdfjs-free-text =\n .aria-label = Text Editor\npdfjs-free-text-default-content = Start typing\u2026\npdfjs-ink =\n .aria-label = Draw Editor\npdfjs-ink-canvas =\n .aria-label = User-created image\npdfjs-editor-alt-text-button-label = Alt text\npdfjs-editor-alt-text-edit-button-label = Edit alt text\npdfjs-editor-alt-text-dialog-label = Choose an option\npdfjs-editor-alt-text-dialog-description = Alt text (alternative text) helps when people can\u2019t see the image or when it doesn\u2019t load.\npdfjs-editor-alt-text-add-description-label = Add a description\npdfjs-editor-alt-text-add-description-description = Aim for 1-2 sentences that describe the subject, setting, or actions.\npdfjs-editor-alt-text-mark-decorative-label = Mark as decorative\npdfjs-editor-alt-text-mark-decorative-description = This is used for ornamental images, like borders or watermarks.\npdfjs-editor-alt-text-cancel-button = Cancel\npdfjs-editor-alt-text-save-button = Save\npdfjs-editor-alt-text-decorative-tooltip = Marked as decorative\npdfjs-editor-alt-text-textarea =\n .placeholder = For example, \u201CA young man sits down at a table to eat a meal\u201D\npdfjs-editor-resizer-label-top-left = Top left corner \u2014 resize\npdfjs-editor-resizer-label-top-middle = Top middle \u2014 resize\npdfjs-editor-resizer-label-top-right = Top right corner \u2014 resize\npdfjs-editor-resizer-label-middle-right = Middle right \u2014 resize\npdfjs-editor-resizer-label-bottom-right = Bottom right corner \u2014 resize\npdfjs-editor-resizer-label-bottom-middle = Bottom middle \u2014 resize\npdfjs-editor-resizer-label-bottom-left = Bottom left corner \u2014 resize\npdfjs-editor-resizer-label-middle-left = Middle left \u2014 resize\npdfjs-editor-highlight-colorpicker-label = Highlight color\npdfjs-editor-colorpicker-button =\n .title = Change color\npdfjs-editor-colorpicker-dropdown =\n .aria-label = Color choices\npdfjs-editor-colorpicker-yellow =\n .title = Yellow\npdfjs-editor-colorpicker-green =\n .title = Green\npdfjs-editor-colorpicker-blue =\n .title = Blue\npdfjs-editor-colorpicker-pink =\n .title = Pink\npdfjs-editor-colorpicker-red =\n .title = Red\npdfjs-editor-highlight-show-all-button-label = Show all\npdfjs-editor-highlight-show-all-button =\n .title = Show all"; + return createBundle(lang, text); + } +} + +;// CONCATENATED MODULE: ./web/generic_scripting.js + +async function docProperties(pdfDocument) { + const url = "", + baseUrl = url.split("#", 1)[0]; + let { + info, + metadata, + contentDispositionFilename, + contentLength + } = await pdfDocument.getMetadata(); + if (!contentLength) { + const { + length + } = await pdfDocument.getDownloadInfo(); + contentLength = length; + } + return { + ...info, + baseURL: baseUrl, + filesize: contentLength, + filename: contentDispositionFilename || getPdfFilenameFromUrl(url), + metadata: metadata?.getRaw(), + authors: metadata?.get("dc:creator"), + numPages: pdfDocument.numPages, + URL: url + }; +} +class GenericScripting { + constructor(sandboxBundleSrc) { + this._ready = new Promise((resolve, reject) => { + const sandbox = import( /*webpackIgnore: true*/sandboxBundleSrc); + sandbox.then(pdfjsSandbox => { + resolve(pdfjsSandbox.QuickJSSandbox()); + }).catch(reject); + }); + } + async createSandbox(data) { + const sandbox = await this._ready; + sandbox.create(data); + } + async dispatchEventInSandbox(event) { + const sandbox = await this._ready; + setTimeout(() => sandbox.dispatchEvent(event), 0); + } + async destroySandbox() { + const sandbox = await this._ready; + sandbox.nukeSandbox(); + } +} + +;// CONCATENATED MODULE: ./web/genericcom.js + + + + + +function initCom(app) {} +class Preferences extends BasePreferences { + async _writeToStorage(prefObj) { + localStorage.setItem("pdfjs.preferences", JSON.stringify(prefObj)); + } + async _readFromStorage(prefObj) { + return { + prefs: JSON.parse(localStorage.getItem("pdfjs.preferences")) + }; + } +} +class ExternalServices extends BaseExternalServices { + async createL10n() { + return new genericl10n_GenericL10n(AppOptions.get("locale")); + } + createScripting() { + return new GenericScripting(AppOptions.get("sandboxBundleSrc")); + } +} +class MLManager { + async guess() { + return null; + } +} + +;// CONCATENATED MODULE: ./web/alt_text_manager.js + +class AltTextManager { + #boundUpdateUIState = this.#updateUIState.bind(this); + #boundSetPosition = this.#setPosition.bind(this); + #boundOnClick = this.#onClick.bind(this); + #currentEditor = null; + #cancelButton; + #dialog; + #eventBus; + #hasUsedPointer = false; + #optionDescription; + #optionDecorative; + #overlayManager; + #saveButton; + #textarea; + #uiManager; + #previousAltText = null; + #svgElement = null; + #rectElement = null; + #container; + #telemetryData = null; + constructor({ + dialog, + optionDescription, + optionDecorative, + textarea, + cancelButton, + saveButton + }, container, overlayManager, eventBus) { + this.#dialog = dialog; + this.#optionDescription = optionDescription; + this.#optionDecorative = optionDecorative; + this.#textarea = textarea; + this.#cancelButton = cancelButton; + this.#saveButton = saveButton; + this.#overlayManager = overlayManager; + this.#eventBus = eventBus; + this.#container = container; + dialog.addEventListener("close", this.#close.bind(this)); + dialog.addEventListener("contextmenu", event => { + if (event.target !== this.#textarea) { + event.preventDefault(); + } + }); + cancelButton.addEventListener("click", this.#finish.bind(this)); + saveButton.addEventListener("click", this.#save.bind(this)); + optionDescription.addEventListener("change", this.#boundUpdateUIState); + optionDecorative.addEventListener("change", this.#boundUpdateUIState); + this.#overlayManager.register(dialog); + } + get _elements() { + return shadow(this, "_elements", [this.#optionDescription, this.#optionDecorative, this.#textarea, this.#saveButton, this.#cancelButton]); + } + #createSVGElement() { + if (this.#svgElement) { + return; + } + const svgFactory = new DOMSVGFactory(); + const svg = this.#svgElement = svgFactory.createElement("svg"); + svg.setAttribute("width", "0"); + svg.setAttribute("height", "0"); + const defs = svgFactory.createElement("defs"); + svg.append(defs); + const mask = svgFactory.createElement("mask"); + defs.append(mask); + mask.setAttribute("id", "alttext-manager-mask"); + mask.setAttribute("maskContentUnits", "objectBoundingBox"); + let rect = svgFactory.createElement("rect"); + mask.append(rect); + rect.setAttribute("fill", "white"); + rect.setAttribute("width", "1"); + rect.setAttribute("height", "1"); + rect.setAttribute("x", "0"); + rect.setAttribute("y", "0"); + rect = this.#rectElement = svgFactory.createElement("rect"); + mask.append(rect); + rect.setAttribute("fill", "black"); + this.#dialog.append(svg); + } + async editAltText(uiManager, editor) { + if (this.#currentEditor || !editor) { + return; + } + this.#createSVGElement(); + this.#hasUsedPointer = false; + for (const element of this._elements) { + element.addEventListener("click", this.#boundOnClick); + } + const { + altText, + decorative + } = editor.altTextData; + if (decorative === true) { + this.#optionDecorative.checked = true; + this.#optionDescription.checked = false; + } else { + this.#optionDecorative.checked = false; + this.#optionDescription.checked = true; + } + this.#previousAltText = this.#textarea.value = altText?.trim() || ""; + this.#updateUIState(); + this.#currentEditor = editor; + this.#uiManager = uiManager; + this.#uiManager.removeEditListeners(); + this.#eventBus._on("resize", this.#boundSetPosition); + try { + await this.#overlayManager.open(this.#dialog); + this.#setPosition(); + } catch (ex) { + this.#close(); + throw ex; + } + } + #setPosition() { + if (!this.#currentEditor) { + return; + } + const dialog = this.#dialog; + const { + style + } = dialog; + const { + x: containerX, + y: containerY, + width: containerW, + height: containerH + } = this.#container.getBoundingClientRect(); + const { + innerWidth: windowW, + innerHeight: windowH + } = window; + const { + width: dialogW, + height: dialogH + } = dialog.getBoundingClientRect(); + const { + x, + y, + width, + height + } = this.#currentEditor.getClientDimensions(); + const MARGIN = 10; + const isLTR = this.#uiManager.direction === "ltr"; + const xs = Math.max(x, containerX); + const xe = Math.min(x + width, containerX + containerW); + const ys = Math.max(y, containerY); + const ye = Math.min(y + height, containerY + containerH); + this.#rectElement.setAttribute("width", `${(xe - xs) / windowW}`); + this.#rectElement.setAttribute("height", `${(ye - ys) / windowH}`); + this.#rectElement.setAttribute("x", `${xs / windowW}`); + this.#rectElement.setAttribute("y", `${ys / windowH}`); + let left = null; + let top = Math.max(y, 0); + top += Math.min(windowH - (top + dialogH), 0); + if (isLTR) { + if (x + width + MARGIN + dialogW < windowW) { + left = x + width + MARGIN; + } else if (x > dialogW + MARGIN) { + left = x - dialogW - MARGIN; + } + } else if (x > dialogW + MARGIN) { + left = x - dialogW - MARGIN; + } else if (x + width + MARGIN + dialogW < windowW) { + left = x + width + MARGIN; + } + if (left === null) { + top = null; + left = Math.max(x, 0); + left += Math.min(windowW - (left + dialogW), 0); + if (y > dialogH + MARGIN) { + top = y - dialogH - MARGIN; + } else if (y + height + MARGIN + dialogH < windowH) { + top = y + height + MARGIN; + } + } + if (top !== null) { + dialog.classList.add("positioned"); + if (isLTR) { + style.left = `${left}px`; + } else { + style.right = `${windowW - left - dialogW}px`; + } + style.top = `${top}px`; + } else { + dialog.classList.remove("positioned"); + style.left = ""; + style.top = ""; + } + } + #finish() { + if (this.#overlayManager.active === this.#dialog) { + this.#overlayManager.close(this.#dialog); + } + } + #close() { + this.#currentEditor._reportTelemetry(this.#telemetryData || { + action: "alt_text_cancel", + alt_text_keyboard: !this.#hasUsedPointer + }); + this.#telemetryData = null; + this.#removeOnClickListeners(); + this.#uiManager?.addEditListeners(); + this.#eventBus._off("resize", this.#boundSetPosition); + this.#currentEditor.altTextFinish(); + this.#currentEditor = null; + this.#uiManager = null; + } + #updateUIState() { + this.#textarea.disabled = this.#optionDecorative.checked; + } + #save() { + const altText = this.#textarea.value.trim(); + const decorative = this.#optionDecorative.checked; + this.#currentEditor.altTextData = { + altText, + decorative + }; + this.#telemetryData = { + action: "alt_text_save", + alt_text_description: !!altText, + alt_text_edit: !!this.#previousAltText && this.#previousAltText !== altText, + alt_text_decorative: decorative, + alt_text_keyboard: !this.#hasUsedPointer + }; + this.#finish(); + } + #onClick(evt) { + if (evt.detail === 0) { + return; + } + this.#hasUsedPointer = true; + this.#removeOnClickListeners(); + } + #removeOnClickListeners() { + for (const element of this._elements) { + element.removeEventListener("click", this.#boundOnClick); + } + } + destroy() { + this.#uiManager = null; + this.#finish(); + this.#svgElement?.remove(); + this.#svgElement = this.#rectElement = null; + } +} + +;// CONCATENATED MODULE: ./web/annotation_editor_params.js + +class AnnotationEditorParams { + constructor(options, eventBus) { + this.eventBus = eventBus; + this.#bindListeners(options); + } + #bindListeners({ + editorFreeTextFontSize, + editorFreeTextColor, + editorInkColor, + editorInkThickness, + editorInkOpacity, + editorStampAddImage, + editorFreeHighlightThickness, + editorHighlightShowAll + }) { + const dispatchEvent = (typeStr, value) => { + this.eventBus.dispatch("switchannotationeditorparams", { + source: this, + type: AnnotationEditorParamsType[typeStr], + value + }); + }; + editorFreeTextFontSize.addEventListener("input", function () { + dispatchEvent("FREETEXT_SIZE", this.valueAsNumber); + }); + editorFreeTextColor.addEventListener("input", function () { + dispatchEvent("FREETEXT_COLOR", this.value); + }); + editorInkColor.addEventListener("input", function () { + dispatchEvent("INK_COLOR", this.value); + }); + editorInkThickness.addEventListener("input", function () { + dispatchEvent("INK_THICKNESS", this.valueAsNumber); + }); + editorInkOpacity.addEventListener("input", function () { + dispatchEvent("INK_OPACITY", this.valueAsNumber); + }); + editorStampAddImage.addEventListener("click", () => { + dispatchEvent("CREATE"); + }); + editorFreeHighlightThickness.addEventListener("input", function () { + dispatchEvent("HIGHLIGHT_THICKNESS", this.valueAsNumber); + }); + editorHighlightShowAll.addEventListener("click", function () { + const checked = this.getAttribute("aria-pressed") === "true"; + this.setAttribute("aria-pressed", !checked); + dispatchEvent("HIGHLIGHT_SHOW_ALL", !checked); + }); + this.eventBus._on("annotationeditorparamschanged", evt => { + for (const [type, value] of evt.details) { + switch (type) { + case AnnotationEditorParamsType.FREETEXT_SIZE: + editorFreeTextFontSize.value = value; + break; + case AnnotationEditorParamsType.FREETEXT_COLOR: + editorFreeTextColor.value = value; + break; + case AnnotationEditorParamsType.INK_COLOR: + editorInkColor.value = value; + break; + case AnnotationEditorParamsType.INK_THICKNESS: + editorInkThickness.value = value; + break; + case AnnotationEditorParamsType.INK_OPACITY: + editorInkOpacity.value = value; + break; + case AnnotationEditorParamsType.HIGHLIGHT_THICKNESS: + editorFreeHighlightThickness.value = value; + break; + case AnnotationEditorParamsType.HIGHLIGHT_FREE: + editorFreeHighlightThickness.disabled = !value; + break; + case AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL: + editorHighlightShowAll.setAttribute("aria-pressed", value); + break; + } + } + }); + } +} + +;// CONCATENATED MODULE: ./web/caret_browsing.js +const PRECISION = 1e-1; +class CaretBrowsingMode { + #mainContainer; + #toolBarHeight; + #viewerContainer; + constructor(mainContainer, viewerContainer, toolbarContainer) { + this.#mainContainer = mainContainer; + this.#viewerContainer = viewerContainer; + this.#toolBarHeight = toolbarContainer?.getBoundingClientRect().height ?? 0; + } + #isOnSameLine(rect1, rect2) { + const top1 = rect1.y; + const bot1 = rect1.bottom; + const mid1 = rect1.y + rect1.height / 2; + const top2 = rect2.y; + const bot2 = rect2.bottom; + const mid2 = rect2.y + rect2.height / 2; + return top1 <= mid2 && mid2 <= bot1 || top2 <= mid1 && mid1 <= bot2; + } + #isUnderOver(rect, x, y, isUp) { + const midY = rect.y + rect.height / 2; + return (isUp ? y >= midY : y <= midY) && rect.x - PRECISION <= x && x <= rect.right + PRECISION; + } + #isVisible(rect) { + return rect.top >= this.#toolBarHeight && rect.left >= 0 && rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && rect.right <= (window.innerWidth || document.documentElement.clientWidth); + } + #getCaretPosition(selection, isUp) { + const { + focusNode, + focusOffset + } = selection; + const range = document.createRange(); + range.setStart(focusNode, focusOffset); + range.setEnd(focusNode, focusOffset); + const rect = range.getBoundingClientRect(); + return [rect.x, isUp ? rect.top : rect.bottom]; + } + static #caretPositionFromPoint(x, y) { + if (!document.caretPositionFromPoint) { + const { + startContainer: offsetNode, + startOffset: offset + } = document.caretRangeFromPoint(x, y); + return { + offsetNode, + offset + }; + } + return document.caretPositionFromPoint(x, y); + } + #setCaretPositionHelper(selection, caretX, select, element, rect) { + rect ||= element.getBoundingClientRect(); + if (caretX <= rect.x + PRECISION) { + if (select) { + selection.extend(element.firstChild, 0); + } else { + selection.setPosition(element.firstChild, 0); + } + return; + } + if (rect.right - PRECISION <= caretX) { + const { + lastChild + } = element; + if (select) { + selection.extend(lastChild, lastChild.length); + } else { + selection.setPosition(lastChild, lastChild.length); + } + return; + } + const midY = rect.y + rect.height / 2; + let caretPosition = CaretBrowsingMode.#caretPositionFromPoint(caretX, midY); + let parentElement = caretPosition.offsetNode?.parentElement; + if (parentElement && parentElement !== element) { + const elementsAtPoint = document.elementsFromPoint(caretX, midY); + const savedVisibilities = []; + for (const el of elementsAtPoint) { + if (el === element) { + break; + } + const { + style + } = el; + savedVisibilities.push([el, style.visibility]); + style.visibility = "hidden"; + } + caretPosition = CaretBrowsingMode.#caretPositionFromPoint(caretX, midY); + parentElement = caretPosition.offsetNode?.parentElement; + for (const [el, visibility] of savedVisibilities) { + el.style.visibility = visibility; + } + } + if (parentElement !== element) { + if (select) { + selection.extend(element.firstChild, 0); + } else { + selection.setPosition(element.firstChild, 0); + } + return; + } + if (select) { + selection.extend(caretPosition.offsetNode, caretPosition.offset); + } else { + selection.setPosition(caretPosition.offsetNode, caretPosition.offset); + } + } + #setCaretPosition(select, selection, newLineElement, newLineElementRect, caretX) { + if (this.#isVisible(newLineElementRect)) { + this.#setCaretPositionHelper(selection, caretX, select, newLineElement, newLineElementRect); + return; + } + this.#mainContainer.addEventListener("scrollend", this.#setCaretPositionHelper.bind(this, selection, caretX, select, newLineElement, null), { + once: true + }); + newLineElement.scrollIntoView(); + } + #getNodeOnNextPage(textLayer, isUp) { + while (true) { + const page = textLayer.closest(".page"); + const pageNumber = parseInt(page.getAttribute("data-page-number")); + const nextPage = isUp ? pageNumber - 1 : pageNumber + 1; + textLayer = this.#viewerContainer.querySelector(`.page[data-page-number="${nextPage}"] .textLayer`); + if (!textLayer) { + return null; + } + const walker = document.createTreeWalker(textLayer, NodeFilter.SHOW_TEXT); + const node = isUp ? walker.lastChild() : walker.firstChild(); + if (node) { + return node; + } + } + } + moveCaret(isUp, select) { + const selection = document.getSelection(); + if (selection.rangeCount === 0) { + return; + } + const { + focusNode + } = selection; + const focusElement = focusNode.nodeType !== Node.ELEMENT_NODE ? focusNode.parentElement : focusNode; + const root = focusElement.closest(".textLayer"); + if (!root) { + return; + } + const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT); + walker.currentNode = focusNode; + const focusRect = focusElement.getBoundingClientRect(); + let newLineElement = null; + const nodeIterator = (isUp ? walker.previousSibling : walker.nextSibling).bind(walker); + while (nodeIterator()) { + const element = walker.currentNode.parentElement; + if (!this.#isOnSameLine(focusRect, element.getBoundingClientRect())) { + newLineElement = element; + break; + } + } + if (!newLineElement) { + const node = this.#getNodeOnNextPage(root, isUp); + if (!node) { + return; + } + if (select) { + const lastNode = (isUp ? walker.firstChild() : walker.lastChild()) || focusNode; + selection.extend(lastNode, isUp ? 0 : lastNode.length); + const range = document.createRange(); + range.setStart(node, isUp ? node.length : 0); + range.setEnd(node, isUp ? node.length : 0); + selection.addRange(range); + return; + } + const [caretX] = this.#getCaretPosition(selection, isUp); + const { + parentElement + } = node; + this.#setCaretPosition(select, selection, parentElement, parentElement.getBoundingClientRect(), caretX); + return; + } + const [caretX, caretY] = this.#getCaretPosition(selection, isUp); + const newLineElementRect = newLineElement.getBoundingClientRect(); + if (this.#isUnderOver(newLineElementRect, caretX, caretY, isUp)) { + this.#setCaretPosition(select, selection, newLineElement, newLineElementRect, caretX); + return; + } + while (nodeIterator()) { + const element = walker.currentNode.parentElement; + const elementRect = element.getBoundingClientRect(); + if (!this.#isOnSameLine(newLineElementRect, elementRect)) { + break; + } + if (this.#isUnderOver(elementRect, caretX, caretY, isUp)) { + this.#setCaretPosition(select, selection, element, elementRect, caretX); + return; + } + } + this.#setCaretPosition(select, selection, newLineElement, newLineElementRect, caretX); + } +} + +;// CONCATENATED MODULE: ./web/download_manager.js + +function download(blobUrl, filename) { + const a = document.createElement("a"); + if (!a.click) { + throw new Error('DownloadManager: "a.click()" is not supported.'); + } + a.href = blobUrl; + a.target = "_parent"; + if ("download" in a) { + a.download = filename; + } + (document.body || document.documentElement).append(a); + a.click(); + a.remove(); +} +class DownloadManager { + #openBlobUrls = new WeakMap(); + downloadUrl(url, filename, _options) { + if (!createValidAbsoluteUrl(url, "http://example.com")) { + console.error(`downloadUrl - not a valid URL: ${url}`); + return; + } + download(url + "#pdfjs.action=download", filename); + } + downloadData(data, filename, contentType) { + const blobUrl = URL.createObjectURL(new Blob([data], { + type: contentType + })); + download(blobUrl, filename); + } + openOrDownloadData(data, filename, dest = null) { + const isPdfData = isPdfFile(filename); + const contentType = isPdfData ? "application/pdf" : ""; + if (isPdfData) { + let blobUrl = this.#openBlobUrls.get(data); + if (!blobUrl) { + blobUrl = URL.createObjectURL(new Blob([data], { + type: contentType + })); + this.#openBlobUrls.set(data, blobUrl); + } + let viewerUrl; + viewerUrl = "?file=" + encodeURIComponent(blobUrl + "#" + filename); + if (dest) { + viewerUrl += `#${escape(dest)}`; + } + try { + window.open(viewerUrl); + return true; + } catch (ex) { + console.error(`openOrDownloadData: ${ex}`); + URL.revokeObjectURL(blobUrl); + this.#openBlobUrls.delete(data); + } + } + this.downloadData(data, filename, contentType); + return false; + } + download(blob, url, filename, _options) { + const blobUrl = URL.createObjectURL(blob); + download(blobUrl, filename); + } +} + +;// CONCATENATED MODULE: ./web/overlay_manager.js +class OverlayManager { + #overlays = new WeakMap(); + #active = null; + get active() { + return this.#active; + } + async register(dialog, canForceClose = false) { + if (typeof dialog !== "object") { + throw new Error("Not enough parameters."); + } else if (this.#overlays.has(dialog)) { + throw new Error("The overlay is already registered."); + } + this.#overlays.set(dialog, { + canForceClose + }); + dialog.addEventListener("cancel", evt => { + this.#active = null; + }); + } + async open(dialog) { + if (!this.#overlays.has(dialog)) { + throw new Error("The overlay does not exist."); + } else if (this.#active) { + if (this.#active === dialog) { + throw new Error("The overlay is already active."); + } else if (this.#overlays.get(dialog).canForceClose) { + await this.close(); + } else { + throw new Error("Another overlay is currently active."); + } + } + this.#active = dialog; + dialog.showModal(); + } + async close(dialog = this.#active) { + if (!this.#overlays.has(dialog)) { + throw new Error("The overlay does not exist."); + } else if (!this.#active) { + throw new Error("The overlay is currently not active."); + } else if (this.#active !== dialog) { + throw new Error("Another overlay is currently active."); + } + dialog.close(); + this.#active = null; + } +} + +;// CONCATENATED MODULE: ./web/password_prompt.js + +class PasswordPrompt { + #activeCapability = null; + #updateCallback = null; + #reason = null; + constructor(options, overlayManager, isViewerEmbedded = false) { + this.dialog = options.dialog; + this.label = options.label; + this.input = options.input; + this.submitButton = options.submitButton; + this.cancelButton = options.cancelButton; + this.overlayManager = overlayManager; + this._isViewerEmbedded = isViewerEmbedded; + this.submitButton.addEventListener("click", this.#verify.bind(this)); + this.cancelButton.addEventListener("click", this.close.bind(this)); + this.input.addEventListener("keydown", e => { + if (e.keyCode === 13) { + this.#verify(); + } + }); + this.overlayManager.register(this.dialog, true); + this.dialog.addEventListener("close", this.#cancel.bind(this)); + } + async open() { + await this.#activeCapability?.promise; + this.#activeCapability = Promise.withResolvers(); + try { + await this.overlayManager.open(this.dialog); + } catch (ex) { + this.#activeCapability.resolve(); + throw ex; + } + const passwordIncorrect = this.#reason === PasswordResponses.INCORRECT_PASSWORD; + if (!this._isViewerEmbedded || passwordIncorrect) { + this.input.focus(); + } + this.label.setAttribute("data-l10n-id", `pdfjs-password-${passwordIncorrect ? "invalid" : "label"}`); + } + async close() { + if (this.overlayManager.active === this.dialog) { + this.overlayManager.close(this.dialog); + } + } + #verify() { + const password = this.input.value; + if (password?.length > 0) { + this.#invokeCallback(password); + } + } + #cancel() { + this.#invokeCallback(new Error("PasswordPrompt cancelled.")); + this.#activeCapability.resolve(); + } + #invokeCallback(password) { + if (!this.#updateCallback) { + return; + } + this.close(); + this.input.value = ""; + this.#updateCallback(password); + this.#updateCallback = null; + } + async setUpdateCallback(updateCallback, reason) { + if (this.#activeCapability) { + await this.#activeCapability.promise; + } + this.#updateCallback = updateCallback; + this.#reason = reason; + } +} + +;// CONCATENATED MODULE: ./web/base_tree_viewer.js + +const TREEITEM_OFFSET_TOP = -100; +const TREEITEM_SELECTED_CLASS = "selected"; +class BaseTreeViewer { + constructor(options) { + if (this.constructor === BaseTreeViewer) { + throw new Error("Cannot initialize BaseTreeViewer."); + } + this.container = options.container; + this.eventBus = options.eventBus; + this._l10n = options.l10n; + this.reset(); + } + reset() { + this._pdfDocument = null; + this._lastToggleIsShow = true; + this._currentTreeItem = null; + this.container.textContent = ""; + this.container.classList.remove("treeWithDeepNesting"); + } + _dispatchEvent(count) { + throw new Error("Not implemented: _dispatchEvent"); + } + _bindLink(element, params) { + throw new Error("Not implemented: _bindLink"); + } + _normalizeTextContent(str) { + return removeNullCharacters(str, true) || "\u2013"; + } + _addToggleButton(div, hidden = false) { + const toggler = document.createElement("div"); + toggler.className = "treeItemToggler"; + if (hidden) { + toggler.classList.add("treeItemsHidden"); + } + toggler.onclick = evt => { + evt.stopPropagation(); + toggler.classList.toggle("treeItemsHidden"); + if (evt.shiftKey) { + const shouldShowAll = !toggler.classList.contains("treeItemsHidden"); + this._toggleTreeItem(div, shouldShowAll); + } + }; + div.prepend(toggler); + } + _toggleTreeItem(root, show = false) { + this._l10n.pause(); + this._lastToggleIsShow = show; + for (const toggler of root.querySelectorAll(".treeItemToggler")) { + toggler.classList.toggle("treeItemsHidden", !show); + } + this._l10n.resume(); + } + _toggleAllTreeItems() { + this._toggleTreeItem(this.container, !this._lastToggleIsShow); + } + _finishRendering(fragment, count, hasAnyNesting = false) { + if (hasAnyNesting) { + this.container.classList.add("treeWithDeepNesting"); + this._lastToggleIsShow = !fragment.querySelector(".treeItemsHidden"); + } + this._l10n.pause(); + this.container.append(fragment); + this._l10n.resume(); + this._dispatchEvent(count); + } + render(params) { + throw new Error("Not implemented: render"); + } + _updateCurrentTreeItem(treeItem = null) { + if (this._currentTreeItem) { + this._currentTreeItem.classList.remove(TREEITEM_SELECTED_CLASS); + this._currentTreeItem = null; + } + if (treeItem) { + treeItem.classList.add(TREEITEM_SELECTED_CLASS); + this._currentTreeItem = treeItem; + } + } + _scrollToCurrentTreeItem(treeItem) { + if (!treeItem) { + return; + } + this._l10n.pause(); + let currentNode = treeItem.parentNode; + while (currentNode && currentNode !== this.container) { + if (currentNode.classList.contains("treeItem")) { + const toggler = currentNode.firstElementChild; + toggler?.classList.remove("treeItemsHidden"); + } + currentNode = currentNode.parentNode; + } + this._l10n.resume(); + this._updateCurrentTreeItem(treeItem); + this.container.scrollTo(treeItem.offsetLeft, treeItem.offsetTop + TREEITEM_OFFSET_TOP); + } +} + +;// CONCATENATED MODULE: ./web/pdf_attachment_viewer.js + + +class PDFAttachmentViewer extends BaseTreeViewer { + constructor(options) { + super(options); + this.downloadManager = options.downloadManager; + this.eventBus._on("fileattachmentannotation", this.#appendAttachment.bind(this)); + } + reset(keepRenderedCapability = false) { + super.reset(); + this._attachments = null; + if (!keepRenderedCapability) { + this._renderedCapability = Promise.withResolvers(); + } + this._pendingDispatchEvent = false; + } + async _dispatchEvent(attachmentsCount) { + this._renderedCapability.resolve(); + if (attachmentsCount === 0 && !this._pendingDispatchEvent) { + this._pendingDispatchEvent = true; + await waitOnEventOrTimeout({ + target: this.eventBus, + name: "annotationlayerrendered", + delay: 1000 + }); + if (!this._pendingDispatchEvent) { + return; + } + } + this._pendingDispatchEvent = false; + this.eventBus.dispatch("attachmentsloaded", { + source: this, + attachmentsCount + }); + } + _bindLink(element, { + content, + description, + filename + }) { + if (description) { + element.title = description; + } + element.onclick = () => { + this.downloadManager.openOrDownloadData(content, filename); + return false; + }; + } + render({ + attachments, + keepRenderedCapability = false + }) { + if (this._attachments) { + this.reset(keepRenderedCapability); + } + this._attachments = attachments || null; + if (!attachments) { + this._dispatchEvent(0); + return; + } + const fragment = document.createDocumentFragment(); + let attachmentsCount = 0; + for (const name in attachments) { + const item = attachments[name]; + const div = document.createElement("div"); + div.className = "treeItem"; + const element = document.createElement("a"); + this._bindLink(element, item); + element.textContent = this._normalizeTextContent(item.filename); + div.append(element); + fragment.append(div); + attachmentsCount++; + } + this._finishRendering(fragment, attachmentsCount); + } + #appendAttachment(item) { + const renderedPromise = this._renderedCapability.promise; + renderedPromise.then(() => { + if (renderedPromise !== this._renderedCapability.promise) { + return; + } + const attachments = this._attachments || Object.create(null); + for (const name in attachments) { + if (item.filename === name) { + return; + } + } + attachments[item.filename] = item; + this.render({ + attachments, + keepRenderedCapability: true + }); + }); + } +} + +;// CONCATENATED MODULE: ./web/grab_to_pan.js +const CSS_CLASS_GRAB = "grab-to-pan-grab"; +class GrabToPan { + constructor({ + element + }) { + this.element = element; + this.document = element.ownerDocument; + this.activate = this.activate.bind(this); + this.deactivate = this.deactivate.bind(this); + this.toggle = this.toggle.bind(this); + this._onMouseDown = this.#onMouseDown.bind(this); + this._onMouseMove = this.#onMouseMove.bind(this); + this._endPan = this.#endPan.bind(this); + const overlay = this.overlay = document.createElement("div"); + overlay.className = "grab-to-pan-grabbing"; + } + activate() { + if (!this.active) { + this.active = true; + this.element.addEventListener("mousedown", this._onMouseDown, true); + this.element.classList.add(CSS_CLASS_GRAB); + } + } + deactivate() { + if (this.active) { + this.active = false; + this.element.removeEventListener("mousedown", this._onMouseDown, true); + this._endPan(); + this.element.classList.remove(CSS_CLASS_GRAB); + } + } + toggle() { + if (this.active) { + this.deactivate(); + } else { + this.activate(); + } + } + ignoreTarget(node) { + return node.matches("a[href], a[href] *, input, textarea, button, button *, select, option"); + } + #onMouseDown(event) { + if (event.button !== 0 || this.ignoreTarget(event.target)) { + return; + } + if (event.originalTarget) { + try { + event.originalTarget.tagName; + } catch { + return; + } + } + this.scrollLeftStart = this.element.scrollLeft; + this.scrollTopStart = this.element.scrollTop; + this.clientXStart = event.clientX; + this.clientYStart = event.clientY; + this.document.addEventListener("mousemove", this._onMouseMove, true); + this.document.addEventListener("mouseup", this._endPan, true); + this.element.addEventListener("scroll", this._endPan, true); + event.preventDefault(); + event.stopPropagation(); + const focusedElement = document.activeElement; + if (focusedElement && !focusedElement.contains(event.target)) { + focusedElement.blur(); + } + } + #onMouseMove(event) { + this.element.removeEventListener("scroll", this._endPan, true); + if (!(event.buttons & 1)) { + this._endPan(); + return; + } + const xDiff = event.clientX - this.clientXStart; + const yDiff = event.clientY - this.clientYStart; + this.element.scrollTo({ + top: this.scrollTopStart - yDiff, + left: this.scrollLeftStart - xDiff, + behavior: "instant" + }); + if (!this.overlay.parentNode) { + document.body.append(this.overlay); + } + } + #endPan() { + this.element.removeEventListener("scroll", this._endPan, true); + this.document.removeEventListener("mousemove", this._onMouseMove, true); + this.document.removeEventListener("mouseup", this._endPan, true); + this.overlay.remove(); + } +} + +;// CONCATENATED MODULE: ./web/pdf_cursor_tools.js + + + +class PDFCursorTools { + #active = CursorTool.SELECT; + #prevActive = null; + constructor({ + container, + eventBus, + cursorToolOnLoad = CursorTool.SELECT + }) { + this.container = container; + this.eventBus = eventBus; + this.#addEventListeners(); + Promise.resolve().then(() => { + this.switchTool(cursorToolOnLoad); + }); + } + get activeTool() { + return this.#active; + } + switchTool(tool) { + if (this.#prevActive !== null) { + return; + } + if (tool === this.#active) { + return; + } + const disableActiveTool = () => { + switch (this.#active) { + case CursorTool.SELECT: + break; + case CursorTool.HAND: + this._handTool.deactivate(); + break; + case CursorTool.ZOOM: + } + }; + switch (tool) { + case CursorTool.SELECT: + disableActiveTool(); + break; + case CursorTool.HAND: + disableActiveTool(); + this._handTool.activate(); + break; + case CursorTool.ZOOM: + default: + console.error(`switchTool: "${tool}" is an unsupported value.`); + return; + } + this.#active = tool; + this.eventBus.dispatch("cursortoolchanged", { + source: this, + tool + }); + } + #addEventListeners() { + this.eventBus._on("switchcursortool", evt => { + if (!evt.reset) { + this.switchTool(evt.tool); + } else if (this.#prevActive !== null) { + annotationEditorMode = AnnotationEditorType.NONE; + presentationModeState = PresentationModeState.NORMAL; + enableActive(); + } + }); + let annotationEditorMode = AnnotationEditorType.NONE, + presentationModeState = PresentationModeState.NORMAL; + const disableActive = () => { + const prevActive = this.#active; + this.switchTool(CursorTool.SELECT); + this.#prevActive ??= prevActive; + }; + const enableActive = () => { + const prevActive = this.#prevActive; + if (prevActive !== null && annotationEditorMode === AnnotationEditorType.NONE && presentationModeState === PresentationModeState.NORMAL) { + this.#prevActive = null; + this.switchTool(prevActive); + } + }; + this.eventBus._on("annotationeditormodechanged", ({ + mode + }) => { + annotationEditorMode = mode; + if (mode === AnnotationEditorType.NONE) { + enableActive(); + } else { + disableActive(); + } + }); + this.eventBus._on("presentationmodechanged", ({ + state + }) => { + presentationModeState = state; + if (state === PresentationModeState.NORMAL) { + enableActive(); + } else if (state === PresentationModeState.FULLSCREEN) { + disableActive(); + } + }); + } + get _handTool() { + return shadow(this, "_handTool", new GrabToPan({ + element: this.container + })); + } +} + +;// CONCATENATED MODULE: ./web/pdf_document_properties.js + + +const DEFAULT_FIELD_CONTENT = "-"; +const NON_METRIC_LOCALES = ["en-us", "en-lr", "my"]; +const US_PAGE_NAMES = { + "8.5x11": "letter", + "8.5x14": "legal" +}; +const METRIC_PAGE_NAMES = { + "297x420": "a-three", + "210x297": "a-four" +}; +function getPageName(size, isPortrait, pageNames) { + const width = isPortrait ? size.width : size.height; + const height = isPortrait ? size.height : size.width; + return pageNames[`${width}x${height}`]; +} +class PDFDocumentProperties { + #fieldData = null; + constructor({ + dialog, + fields, + closeButton + }, overlayManager, eventBus, l10n, fileNameLookup) { + this.dialog = dialog; + this.fields = fields; + this.overlayManager = overlayManager; + this.l10n = l10n; + this._fileNameLookup = fileNameLookup; + this.#reset(); + closeButton.addEventListener("click", this.close.bind(this)); + this.overlayManager.register(this.dialog); + eventBus._on("pagechanging", evt => { + this._currentPageNumber = evt.pageNumber; + }); + eventBus._on("rotationchanging", evt => { + this._pagesRotation = evt.pagesRotation; + }); + this._isNonMetricLocale = NON_METRIC_LOCALES.includes(l10n.getLanguage()); + } + async open() { + await Promise.all([this.overlayManager.open(this.dialog), this._dataAvailableCapability.promise]); + const currentPageNumber = this._currentPageNumber; + const pagesRotation = this._pagesRotation; + if (this.#fieldData && currentPageNumber === this.#fieldData._currentPageNumber && pagesRotation === this.#fieldData._pagesRotation) { + this.#updateUI(); + return; + } + const { + info, + contentLength + } = await this.pdfDocument.getMetadata(); + const [fileName, fileSize, creationDate, modificationDate, pageSize, isLinearized] = await Promise.all([this._fileNameLookup(), this.#parseFileSize(contentLength), this.#parseDate(info.CreationDate), this.#parseDate(info.ModDate), this.pdfDocument.getPage(currentPageNumber).then(pdfPage => { + return this.#parsePageSize(getPageSizeInches(pdfPage), pagesRotation); + }), this.#parseLinearization(info.IsLinearized)]); + this.#fieldData = Object.freeze({ + fileName, + fileSize, + title: info.Title, + author: info.Author, + subject: info.Subject, + keywords: info.Keywords, + creationDate, + modificationDate, + creator: info.Creator, + producer: info.Producer, + version: info.PDFFormatVersion, + pageCount: this.pdfDocument.numPages, + pageSize, + linearized: isLinearized, + _currentPageNumber: currentPageNumber, + _pagesRotation: pagesRotation + }); + this.#updateUI(); + const { + length + } = await this.pdfDocument.getDownloadInfo(); + if (contentLength === length) { + return; + } + const data = Object.assign(Object.create(null), this.#fieldData); + data.fileSize = await this.#parseFileSize(length); + this.#fieldData = Object.freeze(data); + this.#updateUI(); + } + async close() { + this.overlayManager.close(this.dialog); + } + setDocument(pdfDocument) { + if (this.pdfDocument) { + this.#reset(); + this.#updateUI(true); + } + if (!pdfDocument) { + return; + } + this.pdfDocument = pdfDocument; + this._dataAvailableCapability.resolve(); + } + #reset() { + this.pdfDocument = null; + this.#fieldData = null; + this._dataAvailableCapability = Promise.withResolvers(); + this._currentPageNumber = 1; + this._pagesRotation = 0; + } + #updateUI(reset = false) { + if (reset || !this.#fieldData) { + for (const id in this.fields) { + this.fields[id].textContent = DEFAULT_FIELD_CONTENT; + } + return; + } + if (this.overlayManager.active !== this.dialog) { + return; + } + for (const id in this.fields) { + const content = this.#fieldData[id]; + this.fields[id].textContent = content || content === 0 ? content : DEFAULT_FIELD_CONTENT; + } + } + async #parseFileSize(fileSize = 0) { + const kb = fileSize / 1024, + mb = kb / 1024; + if (!kb) { + return undefined; + } + return this.l10n.get(`pdfjs-document-properties-${mb >= 1 ? "mb" : "kb"}`, { + size_mb: mb >= 1 && (+mb.toPrecision(3)).toLocaleString(), + size_kb: mb < 1 && (+kb.toPrecision(3)).toLocaleString(), + size_b: fileSize.toLocaleString() + }); + } + async #parsePageSize(pageSizeInches, pagesRotation) { + if (!pageSizeInches) { + return undefined; + } + if (pagesRotation % 180 !== 0) { + pageSizeInches = { + width: pageSizeInches.height, + height: pageSizeInches.width + }; + } + const isPortrait = isPortraitOrientation(pageSizeInches); + let sizeInches = { + width: Math.round(pageSizeInches.width * 100) / 100, + height: Math.round(pageSizeInches.height * 100) / 100 + }; + let sizeMillimeters = { + width: Math.round(pageSizeInches.width * 25.4 * 10) / 10, + height: Math.round(pageSizeInches.height * 25.4 * 10) / 10 + }; + let rawName = getPageName(sizeInches, isPortrait, US_PAGE_NAMES) || getPageName(sizeMillimeters, isPortrait, METRIC_PAGE_NAMES); + if (!rawName && !(Number.isInteger(sizeMillimeters.width) && Number.isInteger(sizeMillimeters.height))) { + const exactMillimeters = { + width: pageSizeInches.width * 25.4, + height: pageSizeInches.height * 25.4 + }; + const intMillimeters = { + width: Math.round(sizeMillimeters.width), + height: Math.round(sizeMillimeters.height) + }; + if (Math.abs(exactMillimeters.width - intMillimeters.width) < 0.1 && Math.abs(exactMillimeters.height - intMillimeters.height) < 0.1) { + rawName = getPageName(intMillimeters, isPortrait, METRIC_PAGE_NAMES); + if (rawName) { + sizeInches = { + width: Math.round(intMillimeters.width / 25.4 * 100) / 100, + height: Math.round(intMillimeters.height / 25.4 * 100) / 100 + }; + sizeMillimeters = intMillimeters; + } + } + } + const [{ + width, + height + }, unit, name, orientation] = await Promise.all([this._isNonMetricLocale ? sizeInches : sizeMillimeters, this.l10n.get(`pdfjs-document-properties-page-size-unit-${this._isNonMetricLocale ? "inches" : "millimeters"}`), rawName && this.l10n.get(`pdfjs-document-properties-page-size-name-${rawName}`), this.l10n.get(`pdfjs-document-properties-page-size-orientation-${isPortrait ? "portrait" : "landscape"}`)]); + return this.l10n.get(`pdfjs-document-properties-page-size-dimension-${name ? "name-" : ""}string`, { + width: width.toLocaleString(), + height: height.toLocaleString(), + unit, + name, + orientation + }); + } + async #parseDate(inputDate) { + const dateObject = PDFDateString.toDateObject(inputDate); + if (!dateObject) { + return undefined; + } + return this.l10n.get("pdfjs-document-properties-date-string", { + date: dateObject.toLocaleDateString(), + time: dateObject.toLocaleTimeString() + }); + } + #parseLinearization(isLinearized) { + return this.l10n.get(`pdfjs-document-properties-linearized-${isLinearized ? "yes" : "no"}`); + } +} + +;// CONCATENATED MODULE: ./web/pdf_find_utils.js +const CharacterType = { + SPACE: 0, + ALPHA_LETTER: 1, + PUNCT: 2, + HAN_LETTER: 3, + KATAKANA_LETTER: 4, + HIRAGANA_LETTER: 5, + HALFWIDTH_KATAKANA_LETTER: 6, + THAI_LETTER: 7 +}; +function isAlphabeticalScript(charCode) { + return charCode < 0x2e80; +} +function isAscii(charCode) { + return (charCode & 0xff80) === 0; +} +function isAsciiAlpha(charCode) { + return charCode >= 0x61 && charCode <= 0x7a || charCode >= 0x41 && charCode <= 0x5a; +} +function isAsciiDigit(charCode) { + return charCode >= 0x30 && charCode <= 0x39; +} +function isAsciiSpace(charCode) { + return charCode === 0x20 || charCode === 0x09 || charCode === 0x0d || charCode === 0x0a; +} +function isHan(charCode) { + return charCode >= 0x3400 && charCode <= 0x9fff || charCode >= 0xf900 && charCode <= 0xfaff; +} +function isKatakana(charCode) { + return charCode >= 0x30a0 && charCode <= 0x30ff; +} +function isHiragana(charCode) { + return charCode >= 0x3040 && charCode <= 0x309f; +} +function isHalfwidthKatakana(charCode) { + return charCode >= 0xff60 && charCode <= 0xff9f; +} +function isThai(charCode) { + return (charCode & 0xff80) === 0x0e00; +} +function getCharacterType(charCode) { + if (isAlphabeticalScript(charCode)) { + if (isAscii(charCode)) { + if (isAsciiSpace(charCode)) { + return CharacterType.SPACE; + } else if (isAsciiAlpha(charCode) || isAsciiDigit(charCode) || charCode === 0x5f) { + return CharacterType.ALPHA_LETTER; + } + return CharacterType.PUNCT; + } else if (isThai(charCode)) { + return CharacterType.THAI_LETTER; + } else if (charCode === 0xa0) { + return CharacterType.SPACE; + } + return CharacterType.ALPHA_LETTER; + } + if (isHan(charCode)) { + return CharacterType.HAN_LETTER; + } else if (isKatakana(charCode)) { + return CharacterType.KATAKANA_LETTER; + } else if (isHiragana(charCode)) { + return CharacterType.HIRAGANA_LETTER; + } else if (isHalfwidthKatakana(charCode)) { + return CharacterType.HALFWIDTH_KATAKANA_LETTER; + } + return CharacterType.ALPHA_LETTER; +} +let NormalizeWithNFKC; +function getNormalizeWithNFKC() { + NormalizeWithNFKC ||= ` ¨ª¯²-µ¸-º¼-¾IJ-ijĿ-ŀʼnſDŽ-njDZ-dzʰ-ʸ˘-˝ˠ-ˤʹͺ;΄-΅·ϐ-ϖϰ-ϲϴ-ϵϹևٵ-ٸक़-य़ড়-ঢ়য়ਲ਼ਸ਼ਖ਼-ਜ਼ਫ਼ଡ଼-ଢ଼ำຳໜ-ໝ༌གྷཌྷདྷབྷཛྷཀྵჼᴬ-ᴮᴰ-ᴺᴼ-ᵍᵏ-ᵪᵸᶛ-ᶿẚ-ẛάέήίόύώΆ᾽-῁ΈΉ῍-῏ΐΊ῝-῟ΰΎ῭-`ΌΏ´-῾ - ‑‗․-… ″-‴‶-‷‼‾⁇-⁉⁗ ⁰-ⁱ⁴-₎ₐ-ₜ₨℀-℃℅-ℇ℉-ℓℕ-№ℙ-ℝ℠-™ℤΩℨK-ℭℯ-ℱℳ-ℹ℻-⅀ⅅ-ⅉ⅐-ⅿ↉∬-∭∯-∰〈-〉①-⓪⨌⩴-⩶⫝̸ⱼ-ⱽⵯ⺟⻳⼀-⿕ 〶〸-〺゛-゜ゟヿㄱ-ㆎ㆒-㆟㈀-㈞㈠-㉇㉐-㉾㊀-㏿ꚜ-ꚝꝰꟲ-ꟴꟸ-ꟹꭜ-ꭟꭩ豈-嗀塚晴凞-羽蘒諸逸-都飯-舘並-龎ff-stﬓ-ﬗיִײַ-זּטּ-לּמּנּ-סּףּ-פּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-﷼︐-︙︰-﹄﹇-﹒﹔-﹦﹨-﹫ﹰ-ﹲﹴﹶ-ﻼ!-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ¢-₩`; + return NormalizeWithNFKC; +} + +;// CONCATENATED MODULE: ./web/pdf_find_controller.js + + +const FindState = { + FOUND: 0, + NOT_FOUND: 1, + WRAPPED: 2, + PENDING: 3 +}; +const FIND_TIMEOUT = 250; +const MATCH_SCROLL_OFFSET_TOP = -50; +const MATCH_SCROLL_OFFSET_LEFT = -400; +const CHARACTERS_TO_NORMALIZE = { + "\u2010": "-", + "\u2018": "'", + "\u2019": "'", + "\u201A": "'", + "\u201B": "'", + "\u201C": '"', + "\u201D": '"', + "\u201E": '"', + "\u201F": '"', + "\u00BC": "1/4", + "\u00BD": "1/2", + "\u00BE": "3/4" +}; +const DIACRITICS_EXCEPTION = new Set([0x3099, 0x309a, 0x094d, 0x09cd, 0x0a4d, 0x0acd, 0x0b4d, 0x0bcd, 0x0c4d, 0x0ccd, 0x0d3b, 0x0d3c, 0x0d4d, 0x0dca, 0x0e3a, 0x0eba, 0x0f84, 0x1039, 0x103a, 0x1714, 0x1734, 0x17d2, 0x1a60, 0x1b44, 0x1baa, 0x1bab, 0x1bf2, 0x1bf3, 0x2d7f, 0xa806, 0xa82c, 0xa8c4, 0xa953, 0xa9c0, 0xaaf6, 0xabed, 0x0c56, 0x0f71, 0x0f72, 0x0f7a, 0x0f7b, 0x0f7c, 0x0f7d, 0x0f80, 0x0f74]); +let DIACRITICS_EXCEPTION_STR; +const DIACRITICS_REG_EXP = /\p{M}+/gu; +const SPECIAL_CHARS_REG_EXP = /([.*+?^${}()|[\]\\])|(\p{P})|(\s+)|(\p{M})|(\p{L})/gu; +const NOT_DIACRITIC_FROM_END_REG_EXP = /([^\p{M}])\p{M}*$/u; +const NOT_DIACRITIC_FROM_START_REG_EXP = /^\p{M}*([^\p{M}])/u; +const SYLLABLES_REG_EXP = /[\uAC00-\uD7AF\uFA6C\uFACF-\uFAD1\uFAD5-\uFAD7]+/g; +const SYLLABLES_LENGTHS = new Map(); +const FIRST_CHAR_SYLLABLES_REG_EXP = "[\\u1100-\\u1112\\ud7a4-\\ud7af\\ud84a\\ud84c\\ud850\\ud854\\ud857\\ud85f]"; +const NFKC_CHARS_TO_NORMALIZE = new Map(); +let noSyllablesRegExp = null; +let withSyllablesRegExp = null; +function normalize(text) { + const syllablePositions = []; + let m; + while ((m = SYLLABLES_REG_EXP.exec(text)) !== null) { + let { + index + } = m; + for (const char of m[0]) { + let len = SYLLABLES_LENGTHS.get(char); + if (!len) { + len = char.normalize("NFD").length; + SYLLABLES_LENGTHS.set(char, len); + } + syllablePositions.push([len, index++]); + } + } + let normalizationRegex; + if (syllablePositions.length === 0 && noSyllablesRegExp) { + normalizationRegex = noSyllablesRegExp; + } else if (syllablePositions.length > 0 && withSyllablesRegExp) { + normalizationRegex = withSyllablesRegExp; + } else { + const replace = Object.keys(CHARACTERS_TO_NORMALIZE).join(""); + const toNormalizeWithNFKC = getNormalizeWithNFKC(); + const CJK = "(?:\\p{Ideographic}|[\u3040-\u30FF])"; + const HKDiacritics = "(?:\u3099|\u309A)"; + const regexp = `([${replace}])|([${toNormalizeWithNFKC}])|(${HKDiacritics}\\n)|(\\p{M}+(?:-\\n)?)|(\\S-\\n)|(${CJK}\\n)|(\\n)`; + if (syllablePositions.length === 0) { + normalizationRegex = noSyllablesRegExp = new RegExp(regexp + "|(\\u0000)", "gum"); + } else { + normalizationRegex = withSyllablesRegExp = new RegExp(regexp + `|(${FIRST_CHAR_SYLLABLES_REG_EXP})`, "gum"); + } + } + const rawDiacriticsPositions = []; + while ((m = DIACRITICS_REG_EXP.exec(text)) !== null) { + rawDiacriticsPositions.push([m[0].length, m.index]); + } + let normalized = text.normalize("NFD"); + const positions = [[0, 0]]; + let rawDiacriticsIndex = 0; + let syllableIndex = 0; + let shift = 0; + let shiftOrigin = 0; + let eol = 0; + let hasDiacritics = false; + normalized = normalized.replace(normalizationRegex, (match, p1, p2, p3, p4, p5, p6, p7, p8, i) => { + i -= shiftOrigin; + if (p1) { + const replacement = CHARACTERS_TO_NORMALIZE[p1]; + const jj = replacement.length; + for (let j = 1; j < jj; j++) { + positions.push([i - shift + j, shift - j]); + } + shift -= jj - 1; + return replacement; + } + if (p2) { + let replacement = NFKC_CHARS_TO_NORMALIZE.get(p2); + if (!replacement) { + replacement = p2.normalize("NFKC"); + NFKC_CHARS_TO_NORMALIZE.set(p2, replacement); + } + const jj = replacement.length; + for (let j = 1; j < jj; j++) { + positions.push([i - shift + j, shift - j]); + } + shift -= jj - 1; + return replacement; + } + if (p3) { + hasDiacritics = true; + if (i + eol === rawDiacriticsPositions[rawDiacriticsIndex]?.[1]) { + ++rawDiacriticsIndex; + } else { + positions.push([i - 1 - shift + 1, shift - 1]); + shift -= 1; + shiftOrigin += 1; + } + positions.push([i - shift + 1, shift]); + shiftOrigin += 1; + eol += 1; + return p3.charAt(0); + } + if (p4) { + const hasTrailingDashEOL = p4.endsWith("\n"); + const len = hasTrailingDashEOL ? p4.length - 2 : p4.length; + hasDiacritics = true; + let jj = len; + if (i + eol === rawDiacriticsPositions[rawDiacriticsIndex]?.[1]) { + jj -= rawDiacriticsPositions[rawDiacriticsIndex][0]; + ++rawDiacriticsIndex; + } + for (let j = 1; j <= jj; j++) { + positions.push([i - 1 - shift + j, shift - j]); + } + shift -= jj; + shiftOrigin += jj; + if (hasTrailingDashEOL) { + i += len - 1; + positions.push([i - shift + 1, 1 + shift]); + shift += 1; + shiftOrigin += 1; + eol += 1; + return p4.slice(0, len); + } + return p4; + } + if (p5) { + const len = p5.length - 2; + positions.push([i - shift + len, 1 + shift]); + shift += 1; + shiftOrigin += 1; + eol += 1; + return p5.slice(0, -2); + } + if (p6) { + const len = p6.length - 1; + positions.push([i - shift + len, shift]); + shiftOrigin += 1; + eol += 1; + return p6.slice(0, -1); + } + if (p7) { + positions.push([i - shift + 1, shift - 1]); + shift -= 1; + shiftOrigin += 1; + eol += 1; + return " "; + } + if (i + eol === syllablePositions[syllableIndex]?.[1]) { + const newCharLen = syllablePositions[syllableIndex][0] - 1; + ++syllableIndex; + for (let j = 1; j <= newCharLen; j++) { + positions.push([i - (shift - j), shift - j]); + } + shift -= newCharLen; + shiftOrigin += newCharLen; + } + return p8; + }); + positions.push([normalized.length, shift]); + return [normalized, positions, hasDiacritics]; +} +function getOriginalIndex(diffs, pos, len) { + if (!diffs) { + return [pos, len]; + } + const start = pos; + const end = pos + len - 1; + let i = binarySearchFirstItem(diffs, x => x[0] >= start); + if (diffs[i][0] > start) { + --i; + } + let j = binarySearchFirstItem(diffs, x => x[0] >= end, i); + if (diffs[j][0] > end) { + --j; + } + const oldStart = start + diffs[i][1]; + const oldEnd = end + diffs[j][1]; + const oldLen = oldEnd + 1 - oldStart; + return [oldStart, oldLen]; +} +class PDFFindController { + #state = null; + #updateMatchesCountOnProgress = true; + #visitedPagesCount = 0; + constructor({ + linkService, + eventBus, + updateMatchesCountOnProgress = true + }) { + this._linkService = linkService; + this._eventBus = eventBus; + this.#updateMatchesCountOnProgress = updateMatchesCountOnProgress; + this.onIsPageVisible = null; + this.#reset(); + eventBus._on("find", this.#onFind.bind(this)); + eventBus._on("findbarclose", this.#onFindBarClose.bind(this)); + } + get highlightMatches() { + return this._highlightMatches; + } + get pageMatches() { + return this._pageMatches; + } + get pageMatchesLength() { + return this._pageMatchesLength; + } + get selected() { + return this._selected; + } + get state() { + return this.#state; + } + setDocument(pdfDocument) { + if (this._pdfDocument) { + this.#reset(); + } + if (!pdfDocument) { + return; + } + this._pdfDocument = pdfDocument; + this._firstPageCapability.resolve(); + } + #onFind(state) { + if (!state) { + return; + } + const pdfDocument = this._pdfDocument; + const { + type + } = state; + if (this.#state === null || this.#shouldDirtyMatch(state)) { + this._dirtyMatch = true; + } + this.#state = state; + if (type !== "highlightallchange") { + this.#updateUIState(FindState.PENDING); + } + this._firstPageCapability.promise.then(() => { + if (!this._pdfDocument || pdfDocument && this._pdfDocument !== pdfDocument) { + return; + } + this.#extractText(); + const findbarClosed = !this._highlightMatches; + const pendingTimeout = !!this._findTimeout; + if (this._findTimeout) { + clearTimeout(this._findTimeout); + this._findTimeout = null; + } + if (!type) { + this._findTimeout = setTimeout(() => { + this.#nextMatch(); + this._findTimeout = null; + }, FIND_TIMEOUT); + } else if (this._dirtyMatch) { + this.#nextMatch(); + } else if (type === "again") { + this.#nextMatch(); + if (findbarClosed && this.#state.highlightAll) { + this.#updateAllPages(); + } + } else if (type === "highlightallchange") { + if (pendingTimeout) { + this.#nextMatch(); + } else { + this._highlightMatches = true; + } + this.#updateAllPages(); + } else { + this.#nextMatch(); + } + }); + } + scrollMatchIntoView({ + element = null, + selectedLeft = 0, + pageIndex = -1, + matchIndex = -1 + }) { + if (!this._scrollMatches || !element) { + return; + } else if (matchIndex === -1 || matchIndex !== this._selected.matchIdx) { + return; + } else if (pageIndex === -1 || pageIndex !== this._selected.pageIdx) { + return; + } + this._scrollMatches = false; + const spot = { + top: MATCH_SCROLL_OFFSET_TOP, + left: selectedLeft + MATCH_SCROLL_OFFSET_LEFT + }; + scrollIntoView(element, spot, true); + } + #reset() { + this._highlightMatches = false; + this._scrollMatches = false; + this._pdfDocument = null; + this._pageMatches = []; + this._pageMatchesLength = []; + this.#visitedPagesCount = 0; + this.#state = null; + this._selected = { + pageIdx: -1, + matchIdx: -1 + }; + this._offset = { + pageIdx: null, + matchIdx: null, + wrapped: false + }; + this._extractTextPromises = []; + this._pageContents = []; + this._pageDiffs = []; + this._hasDiacritics = []; + this._matchesCountTotal = 0; + this._pagesToSearch = null; + this._pendingFindMatches = new Set(); + this._resumePageIdx = null; + this._dirtyMatch = false; + clearTimeout(this._findTimeout); + this._findTimeout = null; + this._firstPageCapability = Promise.withResolvers(); + } + get #query() { + const { + query + } = this.#state; + if (typeof query === "string") { + if (query !== this._rawQuery) { + this._rawQuery = query; + [this._normalizedQuery] = normalize(query); + } + return this._normalizedQuery; + } + return (query || []).filter(q => !!q).map(q => normalize(q)[0]); + } + #shouldDirtyMatch(state) { + const newQuery = state.query, + prevQuery = this.#state.query; + const newType = typeof newQuery, + prevType = typeof prevQuery; + if (newType !== prevType) { + return true; + } + if (newType === "string") { + if (newQuery !== prevQuery) { + return true; + } + } else if (JSON.stringify(newQuery) !== JSON.stringify(prevQuery)) { + return true; + } + switch (state.type) { + case "again": + const pageNumber = this._selected.pageIdx + 1; + const linkService = this._linkService; + return pageNumber >= 1 && pageNumber <= linkService.pagesCount && pageNumber !== linkService.page && !(this.onIsPageVisible?.(pageNumber) ?? true); + case "highlightallchange": + return false; + } + return true; + } + #isEntireWord(content, startIdx, length) { + let match = content.slice(0, startIdx).match(NOT_DIACRITIC_FROM_END_REG_EXP); + if (match) { + const first = content.charCodeAt(startIdx); + const limit = match[1].charCodeAt(0); + if (getCharacterType(first) === getCharacterType(limit)) { + return false; + } + } + match = content.slice(startIdx + length).match(NOT_DIACRITIC_FROM_START_REG_EXP); + if (match) { + const last = content.charCodeAt(startIdx + length - 1); + const limit = match[1].charCodeAt(0); + if (getCharacterType(last) === getCharacterType(limit)) { + return false; + } + } + return true; + } + #calculateRegExpMatch(query, entireWord, pageIndex, pageContent) { + const matches = this._pageMatches[pageIndex] = []; + const matchesLength = this._pageMatchesLength[pageIndex] = []; + if (!query) { + return; + } + const diffs = this._pageDiffs[pageIndex]; + let match; + while ((match = query.exec(pageContent)) !== null) { + if (entireWord && !this.#isEntireWord(pageContent, match.index, match[0].length)) { + continue; + } + const [matchPos, matchLen] = getOriginalIndex(diffs, match.index, match[0].length); + if (matchLen) { + matches.push(matchPos); + matchesLength.push(matchLen); + } + } + } + #convertToRegExpString(query, hasDiacritics) { + const { + matchDiacritics + } = this.#state; + let isUnicode = false; + query = query.replaceAll(SPECIAL_CHARS_REG_EXP, (match, p1, p2, p3, p4, p5) => { + if (p1) { + return `[ ]*\\${p1}[ ]*`; + } + if (p2) { + return `[ ]*${p2}[ ]*`; + } + if (p3) { + return "[ ]+"; + } + if (matchDiacritics) { + return p4 || p5; + } + if (p4) { + return DIACRITICS_EXCEPTION.has(p4.charCodeAt(0)) ? p4 : ""; + } + if (hasDiacritics) { + isUnicode = true; + return `${p5}\\p{M}*`; + } + return p5; + }); + const trailingSpaces = "[ ]*"; + if (query.endsWith(trailingSpaces)) { + query = query.slice(0, query.length - trailingSpaces.length); + } + if (matchDiacritics) { + if (hasDiacritics) { + DIACRITICS_EXCEPTION_STR ||= String.fromCharCode(...DIACRITICS_EXCEPTION); + isUnicode = true; + query = `${query}(?=[${DIACRITICS_EXCEPTION_STR}]|[^\\p{M}]|$)`; + } + } + return [isUnicode, query]; + } + #calculateMatch(pageIndex) { + let query = this.#query; + if (query.length === 0) { + return; + } + const { + caseSensitive, + entireWord + } = this.#state; + const pageContent = this._pageContents[pageIndex]; + const hasDiacritics = this._hasDiacritics[pageIndex]; + let isUnicode = false; + if (typeof query === "string") { + [isUnicode, query] = this.#convertToRegExpString(query, hasDiacritics); + } else { + query = query.sort().reverse().map(q => { + const [isUnicodePart, queryPart] = this.#convertToRegExpString(q, hasDiacritics); + isUnicode ||= isUnicodePart; + return `(${queryPart})`; + }).join("|"); + } + const flags = `g${isUnicode ? "u" : ""}${caseSensitive ? "" : "i"}`; + query = query ? new RegExp(query, flags) : null; + this.#calculateRegExpMatch(query, entireWord, pageIndex, pageContent); + if (this.#state.highlightAll) { + this.#updatePage(pageIndex); + } + if (this._resumePageIdx === pageIndex) { + this._resumePageIdx = null; + this.#nextPageMatch(); + } + const pageMatchesCount = this._pageMatches[pageIndex].length; + this._matchesCountTotal += pageMatchesCount; + if (this.#updateMatchesCountOnProgress) { + if (pageMatchesCount > 0) { + this.#updateUIResultsCount(); + } + } else if (++this.#visitedPagesCount === this._linkService.pagesCount) { + this.#updateUIResultsCount(); + } + } + #extractText() { + if (this._extractTextPromises.length > 0) { + return; + } + let deferred = Promise.resolve(); + const textOptions = { + disableNormalization: true + }; + for (let i = 0, ii = this._linkService.pagesCount; i < ii; i++) { + const { + promise, + resolve + } = Promise.withResolvers(); + this._extractTextPromises[i] = promise; + deferred = deferred.then(() => { + return this._pdfDocument.getPage(i + 1).then(pdfPage => pdfPage.getTextContent(textOptions)).then(textContent => { + const strBuf = []; + for (const textItem of textContent.items) { + strBuf.push(textItem.str); + if (textItem.hasEOL) { + strBuf.push("\n"); + } + } + [this._pageContents[i], this._pageDiffs[i], this._hasDiacritics[i]] = normalize(strBuf.join("")); + resolve(); + }, reason => { + console.error(`Unable to get text content for page ${i + 1}`, reason); + this._pageContents[i] = ""; + this._pageDiffs[i] = null; + this._hasDiacritics[i] = false; + resolve(); + }); + }); + } + } + #updatePage(index) { + if (this._scrollMatches && this._selected.pageIdx === index) { + this._linkService.page = index + 1; + } + this._eventBus.dispatch("updatetextlayermatches", { + source: this, + pageIndex: index + }); + } + #updateAllPages() { + this._eventBus.dispatch("updatetextlayermatches", { + source: this, + pageIndex: -1 + }); + } + #nextMatch() { + const previous = this.#state.findPrevious; + const currentPageIndex = this._linkService.page - 1; + const numPages = this._linkService.pagesCount; + this._highlightMatches = true; + if (this._dirtyMatch) { + this._dirtyMatch = false; + this._selected.pageIdx = this._selected.matchIdx = -1; + this._offset.pageIdx = currentPageIndex; + this._offset.matchIdx = null; + this._offset.wrapped = false; + this._resumePageIdx = null; + this._pageMatches.length = 0; + this._pageMatchesLength.length = 0; + this.#visitedPagesCount = 0; + this._matchesCountTotal = 0; + this.#updateAllPages(); + for (let i = 0; i < numPages; i++) { + if (this._pendingFindMatches.has(i)) { + continue; + } + this._pendingFindMatches.add(i); + this._extractTextPromises[i].then(() => { + this._pendingFindMatches.delete(i); + this.#calculateMatch(i); + }); + } + } + const query = this.#query; + if (query.length === 0) { + this.#updateUIState(FindState.FOUND); + return; + } + if (this._resumePageIdx) { + return; + } + const offset = this._offset; + this._pagesToSearch = numPages; + if (offset.matchIdx !== null) { + const numPageMatches = this._pageMatches[offset.pageIdx].length; + if (!previous && offset.matchIdx + 1 < numPageMatches || previous && offset.matchIdx > 0) { + offset.matchIdx = previous ? offset.matchIdx - 1 : offset.matchIdx + 1; + this.#updateMatch(true); + return; + } + this.#advanceOffsetPage(previous); + } + this.#nextPageMatch(); + } + #matchesReady(matches) { + const offset = this._offset; + const numMatches = matches.length; + const previous = this.#state.findPrevious; + if (numMatches) { + offset.matchIdx = previous ? numMatches - 1 : 0; + this.#updateMatch(true); + return true; + } + this.#advanceOffsetPage(previous); + if (offset.wrapped) { + offset.matchIdx = null; + if (this._pagesToSearch < 0) { + this.#updateMatch(false); + return true; + } + } + return false; + } + #nextPageMatch() { + if (this._resumePageIdx !== null) { + console.error("There can only be one pending page."); + } + let matches = null; + do { + const pageIdx = this._offset.pageIdx; + matches = this._pageMatches[pageIdx]; + if (!matches) { + this._resumePageIdx = pageIdx; + break; + } + } while (!this.#matchesReady(matches)); + } + #advanceOffsetPage(previous) { + const offset = this._offset; + const numPages = this._linkService.pagesCount; + offset.pageIdx = previous ? offset.pageIdx - 1 : offset.pageIdx + 1; + offset.matchIdx = null; + this._pagesToSearch--; + if (offset.pageIdx >= numPages || offset.pageIdx < 0) { + offset.pageIdx = previous ? numPages - 1 : 0; + offset.wrapped = true; + } + } + #updateMatch(found = false) { + let state = FindState.NOT_FOUND; + const wrapped = this._offset.wrapped; + this._offset.wrapped = false; + if (found) { + const previousPage = this._selected.pageIdx; + this._selected.pageIdx = this._offset.pageIdx; + this._selected.matchIdx = this._offset.matchIdx; + state = wrapped ? FindState.WRAPPED : FindState.FOUND; + if (previousPage !== -1 && previousPage !== this._selected.pageIdx) { + this.#updatePage(previousPage); + } + } + this.#updateUIState(state, this.#state.findPrevious); + if (this._selected.pageIdx !== -1) { + this._scrollMatches = true; + this.#updatePage(this._selected.pageIdx); + } + } + #onFindBarClose(evt) { + const pdfDocument = this._pdfDocument; + this._firstPageCapability.promise.then(() => { + if (!this._pdfDocument || pdfDocument && this._pdfDocument !== pdfDocument) { + return; + } + if (this._findTimeout) { + clearTimeout(this._findTimeout); + this._findTimeout = null; + } + if (this._resumePageIdx) { + this._resumePageIdx = null; + this._dirtyMatch = true; + } + this.#updateUIState(FindState.FOUND); + this._highlightMatches = false; + this.#updateAllPages(); + }); + } + #requestMatchesCount() { + const { + pageIdx, + matchIdx + } = this._selected; + let current = 0, + total = this._matchesCountTotal; + if (matchIdx !== -1) { + for (let i = 0; i < pageIdx; i++) { + current += this._pageMatches[i]?.length || 0; + } + current += matchIdx + 1; + } + if (current < 1 || current > total) { + current = total = 0; + } + return { + current, + total + }; + } + #updateUIResultsCount() { + this._eventBus.dispatch("updatefindmatchescount", { + source: this, + matchesCount: this.#requestMatchesCount() + }); + } + #updateUIState(state, previous = false) { + if (!this.#updateMatchesCountOnProgress && (this.#visitedPagesCount !== this._linkService.pagesCount || state === FindState.PENDING)) { + return; + } + this._eventBus.dispatch("updatefindcontrolstate", { + source: this, + state, + previous, + matchesCount: this.#requestMatchesCount(), + rawQuery: this.#state?.query ?? null + }); + } +} + +;// CONCATENATED MODULE: ./web/pdf_find_bar.js + + +const MATCHES_COUNT_LIMIT = 1000; +class PDFFindBar { + #resizeObserver = new ResizeObserver(this.#resizeObserverCallback.bind(this)); + constructor(options, eventBus) { + this.opened = false; + this.bar = options.bar; + this.toggleButton = options.toggleButton; + this.findField = options.findField; + this.highlightAll = options.highlightAllCheckbox; + this.caseSensitive = options.caseSensitiveCheckbox; + this.matchDiacritics = options.matchDiacriticsCheckbox; + this.entireWord = options.entireWordCheckbox; + this.findMsg = options.findMsg; + this.findResultsCount = options.findResultsCount; + this.findPreviousButton = options.findPreviousButton; + this.findNextButton = options.findNextButton; + this.eventBus = eventBus; + this.toggleButton.addEventListener("click", () => { + this.toggle(); + }); + this.findField.addEventListener("input", () => { + this.dispatchEvent(""); + }); + this.bar.addEventListener("keydown", e => { + switch (e.keyCode) { + case 13: + if (e.target === this.findField) { + this.dispatchEvent("again", e.shiftKey); + } + break; + case 27: + this.close(); + break; + } + }); + this.findPreviousButton.addEventListener("click", () => { + this.dispatchEvent("again", true); + }); + this.findNextButton.addEventListener("click", () => { + this.dispatchEvent("again", false); + }); + this.highlightAll.addEventListener("click", () => { + this.dispatchEvent("highlightallchange"); + }); + this.caseSensitive.addEventListener("click", () => { + this.dispatchEvent("casesensitivitychange"); + }); + this.entireWord.addEventListener("click", () => { + this.dispatchEvent("entirewordchange"); + }); + this.matchDiacritics.addEventListener("click", () => { + this.dispatchEvent("diacriticmatchingchange"); + }); + } + reset() { + this.updateUIState(); + } + dispatchEvent(type, findPrev = false) { + this.eventBus.dispatch("find", { + source: this, + type, + query: this.findField.value, + caseSensitive: this.caseSensitive.checked, + entireWord: this.entireWord.checked, + highlightAll: this.highlightAll.checked, + findPrevious: findPrev, + matchDiacritics: this.matchDiacritics.checked + }); + } + updateUIState(state, previous, matchesCount) { + const { + findField, + findMsg + } = this; + let findMsgId = "", + status = ""; + switch (state) { + case FindState.FOUND: + break; + case FindState.PENDING: + status = "pending"; + break; + case FindState.NOT_FOUND: + findMsgId = "pdfjs-find-not-found"; + status = "notFound"; + break; + case FindState.WRAPPED: + findMsgId = `pdfjs-find-reached-${previous ? "top" : "bottom"}`; + break; + } + findField.setAttribute("data-status", status); + findField.setAttribute("aria-invalid", state === FindState.NOT_FOUND); + findMsg.setAttribute("data-status", status); + if (findMsgId) { + findMsg.setAttribute("data-l10n-id", findMsgId); + } else { + findMsg.removeAttribute("data-l10n-id"); + findMsg.textContent = ""; + } + this.updateResultsCount(matchesCount); + } + updateResultsCount({ + current = 0, + total = 0 + } = {}) { + const { + findResultsCount + } = this; + if (total > 0) { + const limit = MATCHES_COUNT_LIMIT; + findResultsCount.setAttribute("data-l10n-id", `pdfjs-find-match-count${total > limit ? "-limit" : ""}`); + findResultsCount.setAttribute("data-l10n-args", JSON.stringify({ + limit, + current, + total + })); + } else { + findResultsCount.removeAttribute("data-l10n-id"); + findResultsCount.textContent = ""; + } + } + open() { + if (!this.opened) { + this.#resizeObserver.observe(this.bar.parentNode); + this.#resizeObserver.observe(this.bar); + this.opened = true; + toggleExpandedBtn(this.toggleButton, true, this.bar); + } + this.findField.select(); + this.findField.focus(); + } + close() { + if (!this.opened) { + return; + } + this.#resizeObserver.disconnect(); + this.opened = false; + toggleExpandedBtn(this.toggleButton, false, this.bar); + this.eventBus.dispatch("findbarclose", { + source: this + }); + } + toggle() { + if (this.opened) { + this.close(); + } else { + this.open(); + } + } + #resizeObserverCallback(entries) { + const { + bar + } = this; + bar.classList.remove("wrapContainers"); + const findbarHeight = bar.clientHeight; + const inputContainerHeight = bar.firstElementChild.clientHeight; + if (findbarHeight > inputContainerHeight) { + bar.classList.add("wrapContainers"); + } + } +} + +;// CONCATENATED MODULE: ./web/pdf_history.js + + +const HASH_CHANGE_TIMEOUT = 1000; +const POSITION_UPDATED_THRESHOLD = 50; +const UPDATE_VIEWAREA_TIMEOUT = 1000; +function getCurrentHash() { + return document.location.hash; +} +class PDFHistory { + #eventAbortController = null; + constructor({ + linkService, + eventBus + }) { + this.linkService = linkService; + this.eventBus = eventBus; + this._initialized = false; + this._fingerprint = ""; + this.reset(); + this.eventBus._on("pagesinit", () => { + this._isPagesLoaded = false; + this.eventBus._on("pagesloaded", evt => { + this._isPagesLoaded = !!evt.pagesCount; + }, { + once: true + }); + }); + } + initialize({ + fingerprint, + resetHistory = false, + updateUrl = false + }) { + if (!fingerprint || typeof fingerprint !== "string") { + console.error('PDFHistory.initialize: The "fingerprint" must be a non-empty string.'); + return; + } + if (this._initialized) { + this.reset(); + } + const reInitialized = this._fingerprint !== "" && this._fingerprint !== fingerprint; + this._fingerprint = fingerprint; + this._updateUrl = updateUrl === true; + this._initialized = true; + this.#bindEvents(); + const state = window.history.state; + this._popStateInProgress = false; + this._blockHashChange = 0; + this._currentHash = getCurrentHash(); + this._numPositionUpdates = 0; + this._uid = this._maxUid = 0; + this._destination = null; + this._position = null; + if (!this.#isValidState(state, true) || resetHistory) { + const { + hash, + page, + rotation + } = this.#parseCurrentHash(true); + if (!hash || reInitialized || resetHistory) { + this.#pushOrReplaceState(null, true); + return; + } + this.#pushOrReplaceState({ + hash, + page, + rotation + }, true); + return; + } + const destination = state.destination; + this.#updateInternalState(destination, state.uid, true); + if (destination.rotation !== undefined) { + this._initialRotation = destination.rotation; + } + if (destination.dest) { + this._initialBookmark = JSON.stringify(destination.dest); + this._destination.page = null; + } else if (destination.hash) { + this._initialBookmark = destination.hash; + } else if (destination.page) { + this._initialBookmark = `page=${destination.page}`; + } + } + reset() { + if (this._initialized) { + this.#pageHide(); + this._initialized = false; + this.#unbindEvents(); + } + if (this._updateViewareaTimeout) { + clearTimeout(this._updateViewareaTimeout); + this._updateViewareaTimeout = null; + } + this._initialBookmark = null; + this._initialRotation = null; + } + push({ + namedDest = null, + explicitDest, + pageNumber + }) { + if (!this._initialized) { + return; + } + if (namedDest && typeof namedDest !== "string") { + console.error("PDFHistory.push: " + `"${namedDest}" is not a valid namedDest parameter.`); + return; + } else if (!Array.isArray(explicitDest)) { + console.error("PDFHistory.push: " + `"${explicitDest}" is not a valid explicitDest parameter.`); + return; + } else if (!this.#isValidPage(pageNumber)) { + if (pageNumber !== null || this._destination) { + console.error("PDFHistory.push: " + `"${pageNumber}" is not a valid pageNumber parameter.`); + return; + } + } + const hash = namedDest || JSON.stringify(explicitDest); + if (!hash) { + return; + } + let forceReplace = false; + if (this._destination && (isDestHashesEqual(this._destination.hash, hash) || isDestArraysEqual(this._destination.dest, explicitDest))) { + if (this._destination.page) { + return; + } + forceReplace = true; + } + if (this._popStateInProgress && !forceReplace) { + return; + } + this.#pushOrReplaceState({ + dest: explicitDest, + hash, + page: pageNumber, + rotation: this.linkService.rotation + }, forceReplace); + if (!this._popStateInProgress) { + this._popStateInProgress = true; + Promise.resolve().then(() => { + this._popStateInProgress = false; + }); + } + } + pushPage(pageNumber) { + if (!this._initialized) { + return; + } + if (!this.#isValidPage(pageNumber)) { + console.error(`PDFHistory.pushPage: "${pageNumber}" is not a valid page number.`); + return; + } + if (this._destination?.page === pageNumber) { + return; + } + if (this._popStateInProgress) { + return; + } + this.#pushOrReplaceState({ + dest: null, + hash: `page=${pageNumber}`, + page: pageNumber, + rotation: this.linkService.rotation + }); + if (!this._popStateInProgress) { + this._popStateInProgress = true; + Promise.resolve().then(() => { + this._popStateInProgress = false; + }); + } + } + pushCurrentPosition() { + if (!this._initialized || this._popStateInProgress) { + return; + } + this.#tryPushCurrentPosition(); + } + back() { + if (!this._initialized || this._popStateInProgress) { + return; + } + const state = window.history.state; + if (this.#isValidState(state) && state.uid > 0) { + window.history.back(); + } + } + forward() { + if (!this._initialized || this._popStateInProgress) { + return; + } + const state = window.history.state; + if (this.#isValidState(state) && state.uid < this._maxUid) { + window.history.forward(); + } + } + get popStateInProgress() { + return this._initialized && (this._popStateInProgress || this._blockHashChange > 0); + } + get initialBookmark() { + return this._initialized ? this._initialBookmark : null; + } + get initialRotation() { + return this._initialized ? this._initialRotation : null; + } + #pushOrReplaceState(destination, forceReplace = false) { + const shouldReplace = forceReplace || !this._destination; + const newState = { + fingerprint: this._fingerprint, + uid: shouldReplace ? this._uid : this._uid + 1, + destination + }; + this.#updateInternalState(destination, newState.uid); + let newUrl; + if (this._updateUrl && destination?.hash) { + const baseUrl = document.location.href.split("#", 1)[0]; + if (!baseUrl.startsWith("file://")) { + newUrl = `${baseUrl}#${destination.hash}`; + } + } + if (shouldReplace) { + window.history.replaceState(newState, "", newUrl); + } else { + window.history.pushState(newState, "", newUrl); + } + } + #tryPushCurrentPosition(temporary = false) { + if (!this._position) { + return; + } + let position = this._position; + if (temporary) { + position = Object.assign(Object.create(null), this._position); + position.temporary = true; + } + if (!this._destination) { + this.#pushOrReplaceState(position); + return; + } + if (this._destination.temporary) { + this.#pushOrReplaceState(position, true); + return; + } + if (this._destination.hash === position.hash) { + return; + } + if (!this._destination.page && (POSITION_UPDATED_THRESHOLD <= 0 || this._numPositionUpdates <= POSITION_UPDATED_THRESHOLD)) { + return; + } + let forceReplace = false; + if (this._destination.page >= position.first && this._destination.page <= position.page) { + if (this._destination.dest !== undefined || !this._destination.first) { + return; + } + forceReplace = true; + } + this.#pushOrReplaceState(position, forceReplace); + } + #isValidPage(val) { + return Number.isInteger(val) && val > 0 && val <= this.linkService.pagesCount; + } + #isValidState(state, checkReload = false) { + if (!state) { + return false; + } + if (state.fingerprint !== this._fingerprint) { + if (checkReload) { + if (typeof state.fingerprint !== "string" || state.fingerprint.length !== this._fingerprint.length) { + return false; + } + const [perfEntry] = performance.getEntriesByType("navigation"); + if (perfEntry?.type !== "reload") { + return false; + } + } else { + return false; + } + } + if (!Number.isInteger(state.uid) || state.uid < 0) { + return false; + } + if (state.destination === null || typeof state.destination !== "object") { + return false; + } + return true; + } + #updateInternalState(destination, uid, removeTemporary = false) { + if (this._updateViewareaTimeout) { + clearTimeout(this._updateViewareaTimeout); + this._updateViewareaTimeout = null; + } + if (removeTemporary && destination?.temporary) { + delete destination.temporary; + } + this._destination = destination; + this._uid = uid; + this._maxUid = Math.max(this._maxUid, uid); + this._numPositionUpdates = 0; + } + #parseCurrentHash(checkNameddest = false) { + const hash = unescape(getCurrentHash()).substring(1); + const params = parseQueryString(hash); + const nameddest = params.get("nameddest") || ""; + let page = params.get("page") | 0; + if (!this.#isValidPage(page) || checkNameddest && nameddest.length > 0) { + page = null; + } + return { + hash, + page, + rotation: this.linkService.rotation + }; + } + #updateViewarea({ + location + }) { + if (this._updateViewareaTimeout) { + clearTimeout(this._updateViewareaTimeout); + this._updateViewareaTimeout = null; + } + this._position = { + hash: location.pdfOpenParams.substring(1), + page: this.linkService.page, + first: location.pageNumber, + rotation: location.rotation + }; + if (this._popStateInProgress) { + return; + } + if (POSITION_UPDATED_THRESHOLD > 0 && this._isPagesLoaded && this._destination && !this._destination.page) { + this._numPositionUpdates++; + } + if (UPDATE_VIEWAREA_TIMEOUT > 0) { + this._updateViewareaTimeout = setTimeout(() => { + if (!this._popStateInProgress) { + this.#tryPushCurrentPosition(true); + } + this._updateViewareaTimeout = null; + }, UPDATE_VIEWAREA_TIMEOUT); + } + } + #popState({ + state + }) { + const newHash = getCurrentHash(), + hashChanged = this._currentHash !== newHash; + this._currentHash = newHash; + if (!state) { + this._uid++; + const { + hash, + page, + rotation + } = this.#parseCurrentHash(); + this.#pushOrReplaceState({ + hash, + page, + rotation + }, true); + return; + } + if (!this.#isValidState(state)) { + return; + } + this._popStateInProgress = true; + if (hashChanged) { + this._blockHashChange++; + waitOnEventOrTimeout({ + target: window, + name: "hashchange", + delay: HASH_CHANGE_TIMEOUT + }).then(() => { + this._blockHashChange--; + }); + } + const destination = state.destination; + this.#updateInternalState(destination, state.uid, true); + if (isValidRotation(destination.rotation)) { + this.linkService.rotation = destination.rotation; + } + if (destination.dest) { + this.linkService.goToDestination(destination.dest); + } else if (destination.hash) { + this.linkService.setHash(destination.hash); + } else if (destination.page) { + this.linkService.page = destination.page; + } + Promise.resolve().then(() => { + this._popStateInProgress = false; + }); + } + #pageHide() { + if (!this._destination || this._destination.temporary) { + this.#tryPushCurrentPosition(); + } + } + #bindEvents() { + if (this.#eventAbortController) { + return; + } + this.#eventAbortController = new AbortController(); + const { + signal + } = this.#eventAbortController; + this.eventBus._on("updateviewarea", this.#updateViewarea.bind(this), { + signal + }); + window.addEventListener("popstate", this.#popState.bind(this), { + signal + }); + window.addEventListener("pagehide", this.#pageHide.bind(this), { + signal + }); + } + #unbindEvents() { + this.#eventAbortController?.abort(); + this.#eventAbortController = null; + } +} +function isDestHashesEqual(destHash, pushHash) { + if (typeof destHash !== "string" || typeof pushHash !== "string") { + return false; + } + if (destHash === pushHash) { + return true; + } + const nameddest = parseQueryString(destHash).get("nameddest"); + if (nameddest === pushHash) { + return true; + } + return false; +} +function isDestArraysEqual(firstDest, secondDest) { + function isEntryEqual(first, second) { + if (typeof first !== typeof second) { + return false; + } + if (Array.isArray(first) || Array.isArray(second)) { + return false; + } + if (first !== null && typeof first === "object" && second !== null) { + if (Object.keys(first).length !== Object.keys(second).length) { + return false; + } + for (const key in first) { + if (!isEntryEqual(first[key], second[key])) { + return false; + } + } + return true; + } + return first === second || Number.isNaN(first) && Number.isNaN(second); + } + if (!(Array.isArray(firstDest) && Array.isArray(secondDest))) { + return false; + } + if (firstDest.length !== secondDest.length) { + return false; + } + for (let i = 0, ii = firstDest.length; i < ii; i++) { + if (!isEntryEqual(firstDest[i], secondDest[i])) { + return false; + } + } + return true; +} + +;// CONCATENATED MODULE: ./web/pdf_layer_viewer.js + +class PDFLayerViewer extends BaseTreeViewer { + constructor(options) { + super(options); + this.eventBus._on("optionalcontentconfigchanged", evt => { + this.#updateLayers(evt.promise); + }); + this.eventBus._on("resetlayers", () => { + this.#updateLayers(); + }); + this.eventBus._on("togglelayerstree", this._toggleAllTreeItems.bind(this)); + } + reset() { + super.reset(); + this._optionalContentConfig = null; + this._optionalContentHash = null; + } + _dispatchEvent(layersCount) { + this.eventBus.dispatch("layersloaded", { + source: this, + layersCount + }); + } + _bindLink(element, { + groupId, + input + }) { + const setVisibility = () => { + this._optionalContentConfig.setVisibility(groupId, input.checked); + this._optionalContentHash = this._optionalContentConfig.getHash(); + this.eventBus.dispatch("optionalcontentconfig", { + source: this, + promise: Promise.resolve(this._optionalContentConfig) + }); + }; + element.onclick = evt => { + if (evt.target === input) { + setVisibility(); + return true; + } else if (evt.target !== element) { + return true; + } + input.checked = !input.checked; + setVisibility(); + return false; + }; + } + async _setNestedName(element, { + name = null + }) { + if (typeof name === "string") { + element.textContent = this._normalizeTextContent(name); + return; + } + element.textContent = await this._l10n.get("pdfjs-additional-layers"); + element.style.fontStyle = "italic"; + } + _addToggleButton(div, { + name = null + }) { + super._addToggleButton(div, name === null); + } + _toggleAllTreeItems() { + if (!this._optionalContentConfig) { + return; + } + super._toggleAllTreeItems(); + } + render({ + optionalContentConfig, + pdfDocument + }) { + if (this._optionalContentConfig) { + this.reset(); + } + this._optionalContentConfig = optionalContentConfig || null; + this._pdfDocument = pdfDocument || null; + const groups = optionalContentConfig?.getOrder(); + if (!groups) { + this._dispatchEvent(0); + return; + } + this._optionalContentHash = optionalContentConfig.getHash(); + const fragment = document.createDocumentFragment(), + queue = [{ + parent: fragment, + groups + }]; + let layersCount = 0, + hasAnyNesting = false; + while (queue.length > 0) { + const levelData = queue.shift(); + for (const groupId of levelData.groups) { + const div = document.createElement("div"); + div.className = "treeItem"; + const element = document.createElement("a"); + div.append(element); + if (typeof groupId === "object") { + hasAnyNesting = true; + this._addToggleButton(div, groupId); + this._setNestedName(element, groupId); + const itemsDiv = document.createElement("div"); + itemsDiv.className = "treeItems"; + div.append(itemsDiv); + queue.push({ + parent: itemsDiv, + groups: groupId.order + }); + } else { + const group = optionalContentConfig.getGroup(groupId); + const input = document.createElement("input"); + this._bindLink(element, { + groupId, + input + }); + input.type = "checkbox"; + input.checked = group.visible; + const label = document.createElement("label"); + label.textContent = this._normalizeTextContent(group.name); + label.append(input); + element.append(label); + layersCount++; + } + levelData.parent.append(div); + } + } + this._finishRendering(fragment, layersCount, hasAnyNesting); + } + async #updateLayers(promise = null) { + if (!this._optionalContentConfig) { + return; + } + const pdfDocument = this._pdfDocument; + const optionalContentConfig = await (promise || pdfDocument.getOptionalContentConfig({ + intent: "display" + })); + if (pdfDocument !== this._pdfDocument) { + return; + } + if (promise) { + if (optionalContentConfig.getHash() === this._optionalContentHash) { + return; + } + } else { + this.eventBus.dispatch("optionalcontentconfig", { + source: this, + promise: Promise.resolve(optionalContentConfig) + }); + } + this.render({ + optionalContentConfig, + pdfDocument: this._pdfDocument + }); + } +} + +;// CONCATENATED MODULE: ./web/pdf_outline_viewer.js + + +class PDFOutlineViewer extends BaseTreeViewer { + constructor(options) { + super(options); + this.linkService = options.linkService; + this.downloadManager = options.downloadManager; + this.eventBus._on("toggleoutlinetree", this._toggleAllTreeItems.bind(this)); + this.eventBus._on("currentoutlineitem", this._currentOutlineItem.bind(this)); + this.eventBus._on("pagechanging", evt => { + this._currentPageNumber = evt.pageNumber; + }); + this.eventBus._on("pagesloaded", evt => { + this._isPagesLoaded = !!evt.pagesCount; + this._currentOutlineItemCapability?.resolve(this._isPagesLoaded); + }); + this.eventBus._on("sidebarviewchanged", evt => { + this._sidebarView = evt.view; + }); + } + reset() { + super.reset(); + this._outline = null; + this._pageNumberToDestHashCapability = null; + this._currentPageNumber = 1; + this._isPagesLoaded = null; + this._currentOutlineItemCapability?.resolve(false); + this._currentOutlineItemCapability = null; + } + _dispatchEvent(outlineCount) { + this._currentOutlineItemCapability = Promise.withResolvers(); + if (outlineCount === 0 || this._pdfDocument?.loadingParams.disableAutoFetch) { + this._currentOutlineItemCapability.resolve(false); + } else if (this._isPagesLoaded !== null) { + this._currentOutlineItemCapability.resolve(this._isPagesLoaded); + } + this.eventBus.dispatch("outlineloaded", { + source: this, + outlineCount, + currentOutlineItemPromise: this._currentOutlineItemCapability.promise + }); + } + _bindLink(element, { + url, + newWindow, + action, + attachment, + dest, + setOCGState + }) { + const { + linkService + } = this; + if (url) { + linkService.addLinkAttributes(element, url, newWindow); + return; + } + if (action) { + element.href = linkService.getAnchorUrl(""); + element.onclick = () => { + linkService.executeNamedAction(action); + return false; + }; + return; + } + if (attachment) { + element.href = linkService.getAnchorUrl(""); + element.onclick = () => { + this.downloadManager.openOrDownloadData(attachment.content, attachment.filename); + return false; + }; + return; + } + if (setOCGState) { + element.href = linkService.getAnchorUrl(""); + element.onclick = () => { + linkService.executeSetOCGState(setOCGState); + return false; + }; + return; + } + element.href = linkService.getDestinationHash(dest); + element.onclick = evt => { + this._updateCurrentTreeItem(evt.target.parentNode); + if (dest) { + linkService.goToDestination(dest); + } + return false; + }; + } + _setStyles(element, { + bold, + italic + }) { + if (bold) { + element.style.fontWeight = "bold"; + } + if (italic) { + element.style.fontStyle = "italic"; + } + } + _addToggleButton(div, { + count, + items + }) { + let hidden = false; + if (count < 0) { + let totalCount = items.length; + if (totalCount > 0) { + const queue = [...items]; + while (queue.length > 0) { + const { + count: nestedCount, + items: nestedItems + } = queue.shift(); + if (nestedCount > 0 && nestedItems.length > 0) { + totalCount += nestedItems.length; + queue.push(...nestedItems); + } + } + } + if (Math.abs(count) === totalCount) { + hidden = true; + } + } + super._addToggleButton(div, hidden); + } + _toggleAllTreeItems() { + if (!this._outline) { + return; + } + super._toggleAllTreeItems(); + } + render({ + outline, + pdfDocument + }) { + if (this._outline) { + this.reset(); + } + this._outline = outline || null; + this._pdfDocument = pdfDocument || null; + if (!outline) { + this._dispatchEvent(0); + return; + } + const fragment = document.createDocumentFragment(); + const queue = [{ + parent: fragment, + items: outline + }]; + let outlineCount = 0, + hasAnyNesting = false; + while (queue.length > 0) { + const levelData = queue.shift(); + for (const item of levelData.items) { + const div = document.createElement("div"); + div.className = "treeItem"; + const element = document.createElement("a"); + this._bindLink(element, item); + this._setStyles(element, item); + element.textContent = this._normalizeTextContent(item.title); + div.append(element); + if (item.items.length > 0) { + hasAnyNesting = true; + this._addToggleButton(div, item); + const itemsDiv = document.createElement("div"); + itemsDiv.className = "treeItems"; + div.append(itemsDiv); + queue.push({ + parent: itemsDiv, + items: item.items + }); + } + levelData.parent.append(div); + outlineCount++; + } + } + this._finishRendering(fragment, outlineCount, hasAnyNesting); + } + async _currentOutlineItem() { + if (!this._isPagesLoaded) { + throw new Error("_currentOutlineItem: All pages have not been loaded."); + } + if (!this._outline || !this._pdfDocument) { + return; + } + const pageNumberToDestHash = await this._getPageNumberToDestHash(this._pdfDocument); + if (!pageNumberToDestHash) { + return; + } + this._updateCurrentTreeItem(null); + if (this._sidebarView !== SidebarView.OUTLINE) { + return; + } + for (let i = this._currentPageNumber; i > 0; i--) { + const destHash = pageNumberToDestHash.get(i); + if (!destHash) { + continue; + } + const linkElement = this.container.querySelector(`a[href="${destHash}"]`); + if (!linkElement) { + continue; + } + this._scrollToCurrentTreeItem(linkElement.parentNode); + break; + } + } + async _getPageNumberToDestHash(pdfDocument) { + if (this._pageNumberToDestHashCapability) { + return this._pageNumberToDestHashCapability.promise; + } + this._pageNumberToDestHashCapability = Promise.withResolvers(); + const pageNumberToDestHash = new Map(), + pageNumberNesting = new Map(); + const queue = [{ + nesting: 0, + items: this._outline + }]; + while (queue.length > 0) { + const levelData = queue.shift(), + currentNesting = levelData.nesting; + for (const { + dest, + items + } of levelData.items) { + let explicitDest, pageNumber; + if (typeof dest === "string") { + explicitDest = await pdfDocument.getDestination(dest); + if (pdfDocument !== this._pdfDocument) { + return null; + } + } else { + explicitDest = dest; + } + if (Array.isArray(explicitDest)) { + const [destRef] = explicitDest; + if (destRef && typeof destRef === "object") { + pageNumber = pdfDocument.cachedPageNumber(destRef); + } else if (Number.isInteger(destRef)) { + pageNumber = destRef + 1; + } + if (Number.isInteger(pageNumber) && (!pageNumberToDestHash.has(pageNumber) || currentNesting > pageNumberNesting.get(pageNumber))) { + const destHash = this.linkService.getDestinationHash(dest); + pageNumberToDestHash.set(pageNumber, destHash); + pageNumberNesting.set(pageNumber, currentNesting); + } + } + if (items.length > 0) { + queue.push({ + nesting: currentNesting + 1, + items + }); + } + } + } + this._pageNumberToDestHashCapability.resolve(pageNumberToDestHash.size > 0 ? pageNumberToDestHash : null); + return this._pageNumberToDestHashCapability.promise; + } +} + +;// CONCATENATED MODULE: ./web/pdf_presentation_mode.js + + +const DELAY_BEFORE_HIDING_CONTROLS = 3000; +const ACTIVE_SELECTOR = "pdfPresentationMode"; +const CONTROLS_SELECTOR = "pdfPresentationModeControls"; +const MOUSE_SCROLL_COOLDOWN_TIME = 50; +const PAGE_SWITCH_THRESHOLD = 0.1; +const SWIPE_MIN_DISTANCE_THRESHOLD = 50; +const SWIPE_ANGLE_THRESHOLD = Math.PI / 6; +class PDFPresentationMode { + #state = PresentationModeState.UNKNOWN; + #args = null; + #fullscreenChangeAbortController = null; + #windowAbortController = null; + constructor({ + container, + pdfViewer, + eventBus + }) { + this.container = container; + this.pdfViewer = pdfViewer; + this.eventBus = eventBus; + this.contextMenuOpen = false; + this.mouseScrollTimeStamp = 0; + this.mouseScrollDelta = 0; + this.touchSwipeState = null; + } + async request() { + const { + container, + pdfViewer + } = this; + if (this.active || !pdfViewer.pagesCount || !container.requestFullscreen) { + return false; + } + this.#addFullscreenChangeListeners(); + this.#notifyStateChange(PresentationModeState.CHANGING); + const promise = container.requestFullscreen(); + this.#args = { + pageNumber: pdfViewer.currentPageNumber, + scaleValue: pdfViewer.currentScaleValue, + scrollMode: pdfViewer.scrollMode, + spreadMode: null, + annotationEditorMode: null + }; + if (pdfViewer.spreadMode !== SpreadMode.NONE && !(pdfViewer.pageViewsReady && pdfViewer.hasEqualPageSizes)) { + console.warn("Ignoring Spread modes when entering PresentationMode, " + "since the document may contain varying page sizes."); + this.#args.spreadMode = pdfViewer.spreadMode; + } + if (pdfViewer.annotationEditorMode !== AnnotationEditorType.DISABLE) { + this.#args.annotationEditorMode = pdfViewer.annotationEditorMode; + } + try { + await promise; + pdfViewer.focus(); + return true; + } catch { + this.#removeFullscreenChangeListeners(); + this.#notifyStateChange(PresentationModeState.NORMAL); + } + return false; + } + get active() { + return this.#state === PresentationModeState.CHANGING || this.#state === PresentationModeState.FULLSCREEN; + } + #mouseWheel(evt) { + if (!this.active) { + return; + } + evt.preventDefault(); + const delta = normalizeWheelEventDelta(evt); + const currentTime = Date.now(); + const storedTime = this.mouseScrollTimeStamp; + if (currentTime > storedTime && currentTime - storedTime < MOUSE_SCROLL_COOLDOWN_TIME) { + return; + } + if (this.mouseScrollDelta > 0 && delta < 0 || this.mouseScrollDelta < 0 && delta > 0) { + this.#resetMouseScrollState(); + } + this.mouseScrollDelta += delta; + if (Math.abs(this.mouseScrollDelta) >= PAGE_SWITCH_THRESHOLD) { + const totalDelta = this.mouseScrollDelta; + this.#resetMouseScrollState(); + const success = totalDelta > 0 ? this.pdfViewer.previousPage() : this.pdfViewer.nextPage(); + if (success) { + this.mouseScrollTimeStamp = currentTime; + } + } + } + #notifyStateChange(state) { + this.#state = state; + this.eventBus.dispatch("presentationmodechanged", { + source: this, + state + }); + } + #enter() { + this.#notifyStateChange(PresentationModeState.FULLSCREEN); + this.container.classList.add(ACTIVE_SELECTOR); + setTimeout(() => { + this.pdfViewer.scrollMode = ScrollMode.PAGE; + if (this.#args.spreadMode !== null) { + this.pdfViewer.spreadMode = SpreadMode.NONE; + } + this.pdfViewer.currentPageNumber = this.#args.pageNumber; + this.pdfViewer.currentScaleValue = "page-fit"; + if (this.#args.annotationEditorMode !== null) { + this.pdfViewer.annotationEditorMode = { + mode: AnnotationEditorType.NONE + }; + } + }, 0); + this.#addWindowListeners(); + this.#showControls(); + this.contextMenuOpen = false; + document.getSelection().empty(); + } + #exit() { + const pageNumber = this.pdfViewer.currentPageNumber; + this.container.classList.remove(ACTIVE_SELECTOR); + setTimeout(() => { + this.#removeFullscreenChangeListeners(); + this.#notifyStateChange(PresentationModeState.NORMAL); + this.pdfViewer.scrollMode = this.#args.scrollMode; + if (this.#args.spreadMode !== null) { + this.pdfViewer.spreadMode = this.#args.spreadMode; + } + this.pdfViewer.currentScaleValue = this.#args.scaleValue; + this.pdfViewer.currentPageNumber = pageNumber; + if (this.#args.annotationEditorMode !== null) { + this.pdfViewer.annotationEditorMode = { + mode: this.#args.annotationEditorMode + }; + } + this.#args = null; + }, 0); + this.#removeWindowListeners(); + this.#hideControls(); + this.#resetMouseScrollState(); + this.contextMenuOpen = false; + } + #mouseDown(evt) { + if (this.contextMenuOpen) { + this.contextMenuOpen = false; + evt.preventDefault(); + return; + } + if (evt.button !== 0) { + return; + } + if (evt.target.href && evt.target.parentNode?.hasAttribute("data-internal-link")) { + return; + } + evt.preventDefault(); + if (evt.shiftKey) { + this.pdfViewer.previousPage(); + } else { + this.pdfViewer.nextPage(); + } + } + #contextMenu() { + this.contextMenuOpen = true; + } + #showControls() { + if (this.controlsTimeout) { + clearTimeout(this.controlsTimeout); + } else { + this.container.classList.add(CONTROLS_SELECTOR); + } + this.controlsTimeout = setTimeout(() => { + this.container.classList.remove(CONTROLS_SELECTOR); + delete this.controlsTimeout; + }, DELAY_BEFORE_HIDING_CONTROLS); + } + #hideControls() { + if (!this.controlsTimeout) { + return; + } + clearTimeout(this.controlsTimeout); + this.container.classList.remove(CONTROLS_SELECTOR); + delete this.controlsTimeout; + } + #resetMouseScrollState() { + this.mouseScrollTimeStamp = 0; + this.mouseScrollDelta = 0; + } + #touchSwipe(evt) { + if (!this.active) { + return; + } + if (evt.touches.length > 1) { + this.touchSwipeState = null; + return; + } + switch (evt.type) { + case "touchstart": + this.touchSwipeState = { + startX: evt.touches[0].pageX, + startY: evt.touches[0].pageY, + endX: evt.touches[0].pageX, + endY: evt.touches[0].pageY + }; + break; + case "touchmove": + if (this.touchSwipeState === null) { + return; + } + this.touchSwipeState.endX = evt.touches[0].pageX; + this.touchSwipeState.endY = evt.touches[0].pageY; + evt.preventDefault(); + break; + case "touchend": + if (this.touchSwipeState === null) { + return; + } + let delta = 0; + const dx = this.touchSwipeState.endX - this.touchSwipeState.startX; + const dy = this.touchSwipeState.endY - this.touchSwipeState.startY; + const absAngle = Math.abs(Math.atan2(dy, dx)); + if (Math.abs(dx) > SWIPE_MIN_DISTANCE_THRESHOLD && (absAngle <= SWIPE_ANGLE_THRESHOLD || absAngle >= Math.PI - SWIPE_ANGLE_THRESHOLD)) { + delta = dx; + } else if (Math.abs(dy) > SWIPE_MIN_DISTANCE_THRESHOLD && Math.abs(absAngle - Math.PI / 2) <= SWIPE_ANGLE_THRESHOLD) { + delta = dy; + } + if (delta > 0) { + this.pdfViewer.previousPage(); + } else if (delta < 0) { + this.pdfViewer.nextPage(); + } + break; + } + } + #addWindowListeners() { + if (this.#windowAbortController) { + return; + } + this.#windowAbortController = new AbortController(); + const { + signal + } = this.#windowAbortController; + const touchSwipeBind = this.#touchSwipe.bind(this); + window.addEventListener("mousemove", this.#showControls.bind(this), { + signal + }); + window.addEventListener("mousedown", this.#mouseDown.bind(this), { + signal + }); + window.addEventListener("wheel", this.#mouseWheel.bind(this), { + passive: false, + signal + }); + window.addEventListener("keydown", this.#resetMouseScrollState.bind(this), { + signal + }); + window.addEventListener("contextmenu", this.#contextMenu.bind(this), { + signal + }); + window.addEventListener("touchstart", touchSwipeBind, { + signal + }); + window.addEventListener("touchmove", touchSwipeBind, { + signal + }); + window.addEventListener("touchend", touchSwipeBind, { + signal + }); + } + #removeWindowListeners() { + this.#windowAbortController?.abort(); + this.#windowAbortController = null; + } + #addFullscreenChangeListeners() { + if (this.#fullscreenChangeAbortController) { + return; + } + this.#fullscreenChangeAbortController = new AbortController(); + window.addEventListener("fullscreenchange", () => { + if (document.fullscreenElement) { + this.#enter(); + } else { + this.#exit(); + } + }, { + signal: this.#fullscreenChangeAbortController.signal + }); + } + #removeFullscreenChangeListeners() { + this.#fullscreenChangeAbortController?.abort(); + this.#fullscreenChangeAbortController = null; + } +} + +;// CONCATENATED MODULE: ./web/xfa_layer_builder.js + +class XfaLayerBuilder { + constructor({ + pdfPage, + annotationStorage = null, + linkService, + xfaHtml = null + }) { + this.pdfPage = pdfPage; + this.annotationStorage = annotationStorage; + this.linkService = linkService; + this.xfaHtml = xfaHtml; + this.div = null; + this._cancelled = false; + } + async render(viewport, intent = "display") { + if (intent === "print") { + const parameters = { + viewport: viewport.clone({ + dontFlip: true + }), + div: this.div, + xfaHtml: this.xfaHtml, + annotationStorage: this.annotationStorage, + linkService: this.linkService, + intent + }; + this.div = document.createElement("div"); + parameters.div = this.div; + return XfaLayer.render(parameters); + } + const xfaHtml = await this.pdfPage.getXfa(); + if (this._cancelled || !xfaHtml) { + return { + textDivs: [] + }; + } + const parameters = { + viewport: viewport.clone({ + dontFlip: true + }), + div: this.div, + xfaHtml, + annotationStorage: this.annotationStorage, + linkService: this.linkService, + intent + }; + if (this.div) { + return XfaLayer.update(parameters); + } + this.div = document.createElement("div"); + parameters.div = this.div; + return XfaLayer.render(parameters); + } + cancel() { + this._cancelled = true; + } + hide() { + if (!this.div) { + return; + } + this.div.hidden = true; + } +} + +;// CONCATENATED MODULE: ./web/print_utils.js + + + +function getXfaHtmlForPrinting(printContainer, pdfDocument) { + const xfaHtml = pdfDocument.allXfaHtml; + const linkService = new SimpleLinkService(); + const scale = Math.round(PixelsPerInch.PDF_TO_CSS_UNITS * 100) / 100; + for (const xfaPage of xfaHtml.children) { + const page = document.createElement("div"); + page.className = "xfaPrintedPage"; + printContainer.append(page); + const builder = new XfaLayerBuilder({ + pdfPage: null, + annotationStorage: pdfDocument.annotationStorage, + linkService, + xfaHtml: xfaPage + }); + const viewport = getXfaPageViewport(xfaPage, { + scale + }); + builder.render(viewport, "print"); + page.append(builder.div); + } +} + +;// CONCATENATED MODULE: ./web/pdf_print_service.js + + +let activeService = null; +let dialog = null; +let overlayManager = null; +let viewerApp = { + initialized: false +}; +function renderPage(activeServiceOnEntry, pdfDocument, pageNumber, size, printResolution, optionalContentConfigPromise, printAnnotationStoragePromise) { + const scratchCanvas = activeService.scratchCanvas; + const PRINT_UNITS = printResolution / PixelsPerInch.PDF; + scratchCanvas.width = Math.floor(size.width * PRINT_UNITS); + scratchCanvas.height = Math.floor(size.height * PRINT_UNITS); + const ctx = scratchCanvas.getContext("2d"); + ctx.save(); + ctx.fillStyle = "rgb(255, 255, 255)"; + ctx.fillRect(0, 0, scratchCanvas.width, scratchCanvas.height); + ctx.restore(); + return Promise.all([pdfDocument.getPage(pageNumber), printAnnotationStoragePromise]).then(function ([pdfPage, printAnnotationStorage]) { + const renderContext = { + canvasContext: ctx, + transform: [PRINT_UNITS, 0, 0, PRINT_UNITS, 0, 0], + viewport: pdfPage.getViewport({ + scale: 1, + rotation: size.rotation + }), + intent: "print", + annotationMode: AnnotationMode.ENABLE_STORAGE, + optionalContentConfigPromise, + printAnnotationStorage + }; + const renderTask = pdfPage.render(renderContext); + return renderTask.promise.catch(reason => { + if (!(reason instanceof RenderingCancelledException)) { + console.error(reason); + } + throw reason; + }); + }); +} +class PDFPrintService { + constructor({ + pdfDocument, + pagesOverview, + printContainer, + printResolution, + printAnnotationStoragePromise = null + }) { + this.pdfDocument = pdfDocument; + this.pagesOverview = pagesOverview; + this.printContainer = printContainer; + this._printResolution = printResolution || 150; + this._optionalContentConfigPromise = pdfDocument.getOptionalContentConfig({ + intent: "print" + }); + this._printAnnotationStoragePromise = printAnnotationStoragePromise || Promise.resolve(); + this.currentPage = -1; + this.scratchCanvas = document.createElement("canvas"); + } + layout() { + this.throwIfInactive(); + const body = document.querySelector("body"); + body.setAttribute("data-pdfjsprinting", true); + const { + width, + height + } = this.pagesOverview[0]; + const hasEqualPageSizes = this.pagesOverview.every(size => size.width === width && size.height === height); + if (!hasEqualPageSizes) { + console.warn("Not all pages have the same size. The printed result may be incorrect!"); + } + this.pageStyleSheet = document.createElement("style"); + this.pageStyleSheet.textContent = `@page { size: ${width}pt ${height}pt;}`; + body.append(this.pageStyleSheet); + } + destroy() { + if (activeService !== this) { + return; + } + this.printContainer.textContent = ""; + const body = document.querySelector("body"); + body.removeAttribute("data-pdfjsprinting"); + if (this.pageStyleSheet) { + this.pageStyleSheet.remove(); + this.pageStyleSheet = null; + } + this.scratchCanvas.width = this.scratchCanvas.height = 0; + this.scratchCanvas = null; + activeService = null; + ensureOverlay().then(function () { + if (overlayManager.active === dialog) { + overlayManager.close(dialog); + } + }); + } + renderPages() { + if (this.pdfDocument.isPureXfa) { + getXfaHtmlForPrinting(this.printContainer, this.pdfDocument); + return Promise.resolve(); + } + const pageCount = this.pagesOverview.length; + const renderNextPage = (resolve, reject) => { + this.throwIfInactive(); + if (++this.currentPage >= pageCount) { + renderProgress(pageCount, pageCount); + resolve(); + return; + } + const index = this.currentPage; + renderProgress(index, pageCount); + renderPage(this, this.pdfDocument, index + 1, this.pagesOverview[index], this._printResolution, this._optionalContentConfigPromise, this._printAnnotationStoragePromise).then(this.useRenderedPage.bind(this)).then(function () { + renderNextPage(resolve, reject); + }, reject); + }; + return new Promise(renderNextPage); + } + useRenderedPage() { + this.throwIfInactive(); + const img = document.createElement("img"); + const scratchCanvas = this.scratchCanvas; + if ("toBlob" in scratchCanvas) { + scratchCanvas.toBlob(function (blob) { + img.src = URL.createObjectURL(blob); + }); + } else { + img.src = scratchCanvas.toDataURL(); + } + const wrapper = document.createElement("div"); + wrapper.className = "printedPage"; + wrapper.append(img); + this.printContainer.append(wrapper); + return new Promise(function (resolve, reject) { + img.onload = resolve; + img.onerror = reject; + }); + } + performPrint() { + this.throwIfInactive(); + return new Promise(resolve => { + setTimeout(() => { + if (!this.active) { + resolve(); + return; + } + print.call(window); + setTimeout(resolve, 20); + }, 0); + }); + } + get active() { + return this === activeService; + } + throwIfInactive() { + if (!this.active) { + throw new Error("This print request was cancelled or completed."); + } + } +} +const print = window.print; +window.print = function () { + if (activeService) { + console.warn("Ignored window.print() because of a pending print job."); + return; + } + ensureOverlay().then(function () { + if (activeService) { + overlayManager.open(dialog); + } + }); + try { + dispatchEvent("beforeprint"); + } finally { + if (!activeService) { + console.error("Expected print service to be initialized."); + ensureOverlay().then(function () { + if (overlayManager.active === dialog) { + overlayManager.close(dialog); + } + }); + return; + } + const activeServiceOnEntry = activeService; + activeService.renderPages().then(function () { + return activeServiceOnEntry.performPrint(); + }).catch(function () {}).then(function () { + if (activeServiceOnEntry.active) { + abort(); + } + }); + } +}; +function dispatchEvent(eventType) { + const event = new CustomEvent(eventType, { + bubbles: false, + cancelable: false, + detail: "custom" + }); + window.dispatchEvent(event); +} +function abort() { + if (activeService) { + activeService.destroy(); + dispatchEvent("afterprint"); + } +} +function renderProgress(index, total) { + dialog ||= document.getElementById("printServiceDialog"); + const progress = Math.round(100 * index / total); + const progressBar = dialog.querySelector("progress"); + const progressPerc = dialog.querySelector(".relative-progress"); + progressBar.value = progress; + progressPerc.setAttribute("data-l10n-args", JSON.stringify({ + progress + })); +} +window.addEventListener("keydown", function (event) { + if (event.keyCode === 80 && (event.ctrlKey || event.metaKey) && !event.altKey && (!event.shiftKey || window.chrome || window.opera)) { + window.print(); + event.preventDefault(); + event.stopImmediatePropagation(); + } +}, true); +if ("onbeforeprint" in window) { + const stopPropagationIfNeeded = function (event) { + if (event.detail !== "custom") { + event.stopImmediatePropagation(); + } + }; + window.addEventListener("beforeprint", stopPropagationIfNeeded); + window.addEventListener("afterprint", stopPropagationIfNeeded); +} +let overlayPromise; +function ensureOverlay() { + if (!overlayPromise) { + overlayManager = viewerApp.overlayManager; + if (!overlayManager) { + throw new Error("The overlay manager has not yet been initialized."); + } + dialog ||= document.getElementById("printServiceDialog"); + overlayPromise = overlayManager.register(dialog, true); + document.getElementById("printCancel").onclick = abort; + dialog.addEventListener("close", abort); + } + return overlayPromise; +} +class PDFPrintServiceFactory { + static initGlobals(app) { + viewerApp = app; + } + static get supportsPrinting() { + return shadow(this, "supportsPrinting", true); + } + static createPrintService(params) { + if (activeService) { + throw new Error("The print service is created and active."); + } + return activeService = new PDFPrintService(params); + } +} + +;// CONCATENATED MODULE: ./web/pdf_rendering_queue.js + + +const CLEANUP_TIMEOUT = 30000; +class PDFRenderingQueue { + constructor() { + this.pdfViewer = null; + this.pdfThumbnailViewer = null; + this.onIdle = null; + this.highestPriorityPage = null; + this.idleTimeout = null; + this.printing = false; + this.isThumbnailViewEnabled = false; + Object.defineProperty(this, "hasViewer", { + value: () => !!this.pdfViewer + }); + } + setViewer(pdfViewer) { + this.pdfViewer = pdfViewer; + } + setThumbnailViewer(pdfThumbnailViewer) { + this.pdfThumbnailViewer = pdfThumbnailViewer; + } + isHighestPriority(view) { + return this.highestPriorityPage === view.renderingId; + } + renderHighestPriority(currentlyVisiblePages) { + if (this.idleTimeout) { + clearTimeout(this.idleTimeout); + this.idleTimeout = null; + } + if (this.pdfViewer.forceRendering(currentlyVisiblePages)) { + return; + } + if (this.isThumbnailViewEnabled && this.pdfThumbnailViewer?.forceRendering()) { + return; + } + if (this.printing) { + return; + } + if (this.onIdle) { + this.idleTimeout = setTimeout(this.onIdle.bind(this), CLEANUP_TIMEOUT); + } + } + getHighestPriority(visible, views, scrolledDown, preRenderExtra = false) { + const visibleViews = visible.views, + numVisible = visibleViews.length; + if (numVisible === 0) { + return null; + } + for (let i = 0; i < numVisible; i++) { + const view = visibleViews[i].view; + if (!this.isViewFinished(view)) { + return view; + } + } + const firstId = visible.first.id, + lastId = visible.last.id; + if (lastId - firstId + 1 > numVisible) { + const visibleIds = visible.ids; + for (let i = 1, ii = lastId - firstId; i < ii; i++) { + const holeId = scrolledDown ? firstId + i : lastId - i; + if (visibleIds.has(holeId)) { + continue; + } + const holeView = views[holeId - 1]; + if (!this.isViewFinished(holeView)) { + return holeView; + } + } + } + let preRenderIndex = scrolledDown ? lastId : firstId - 2; + let preRenderView = views[preRenderIndex]; + if (preRenderView && !this.isViewFinished(preRenderView)) { + return preRenderView; + } + if (preRenderExtra) { + preRenderIndex += scrolledDown ? 1 : -1; + preRenderView = views[preRenderIndex]; + if (preRenderView && !this.isViewFinished(preRenderView)) { + return preRenderView; + } + } + return null; + } + isViewFinished(view) { + return view.renderingState === RenderingStates.FINISHED; + } + renderView(view) { + switch (view.renderingState) { + case RenderingStates.FINISHED: + return false; + case RenderingStates.PAUSED: + this.highestPriorityPage = view.renderingId; + view.resume(); + break; + case RenderingStates.RUNNING: + this.highestPriorityPage = view.renderingId; + break; + case RenderingStates.INITIAL: + this.highestPriorityPage = view.renderingId; + view.draw().finally(() => { + this.renderHighestPriority(); + }).catch(reason => { + if (reason instanceof RenderingCancelledException) { + return; + } + console.error(`renderView: "${reason}"`); + }); + break; + } + return true; + } +} + +;// CONCATENATED MODULE: ./web/pdf_scripting_manager.js + + +class PDFScriptingManager { + #closeCapability = null; + #destroyCapability = null; + #docProperties = null; + #eventAbortController = null; + #eventBus = null; + #externalServices = null; + #pdfDocument = null; + #pdfViewer = null; + #ready = false; + #scripting = null; + #willPrintCapability = null; + constructor({ + eventBus, + externalServices = null, + docProperties = null + }) { + this.#eventBus = eventBus; + this.#externalServices = externalServices; + this.#docProperties = docProperties; + } + setViewer(pdfViewer) { + this.#pdfViewer = pdfViewer; + } + async setDocument(pdfDocument) { + if (this.#pdfDocument) { + await this.#destroyScripting(); + } + this.#pdfDocument = pdfDocument; + if (!pdfDocument) { + return; + } + const [objects, calculationOrder, docActions] = await Promise.all([pdfDocument.getFieldObjects(), pdfDocument.getCalculationOrderIds(), pdfDocument.getJSActions()]); + if (!objects && !docActions) { + await this.#destroyScripting(); + return; + } + if (pdfDocument !== this.#pdfDocument) { + return; + } + try { + this.#scripting = this.#initScripting(); + } catch (error) { + console.error(`setDocument: "${error.message}".`); + await this.#destroyScripting(); + return; + } + const eventBus = this.#eventBus; + this.#eventAbortController = new AbortController(); + const { + signal + } = this.#eventAbortController; + eventBus._on("updatefromsandbox", event => { + if (event?.source === window) { + this.#updateFromSandbox(event.detail); + } + }, { + signal + }); + eventBus._on("dispatcheventinsandbox", event => { + this.#scripting?.dispatchEventInSandbox(event.detail); + }, { + signal + }); + eventBus._on("pagechanging", ({ + pageNumber, + previous + }) => { + if (pageNumber === previous) { + return; + } + this.#dispatchPageClose(previous); + this.#dispatchPageOpen(pageNumber); + }, { + signal + }); + eventBus._on("pagerendered", ({ + pageNumber + }) => { + if (!this._pageOpenPending.has(pageNumber)) { + return; + } + if (pageNumber !== this.#pdfViewer.currentPageNumber) { + return; + } + this.#dispatchPageOpen(pageNumber); + }, { + signal + }); + eventBus._on("pagesdestroy", async () => { + await this.#dispatchPageClose(this.#pdfViewer.currentPageNumber); + await this.#scripting?.dispatchEventInSandbox({ + id: "doc", + name: "WillClose" + }); + this.#closeCapability?.resolve(); + }, { + signal + }); + try { + const docProperties = await this.#docProperties(pdfDocument); + if (pdfDocument !== this.#pdfDocument) { + return; + } + await this.#scripting.createSandbox({ + objects, + calculationOrder, + appInfo: { + platform: navigator.platform, + language: navigator.language + }, + docInfo: { + ...docProperties, + actions: docActions + } + }); + eventBus.dispatch("sandboxcreated", { + source: this + }); + } catch (error) { + console.error(`setDocument: "${error.message}".`); + await this.#destroyScripting(); + return; + } + await this.#scripting?.dispatchEventInSandbox({ + id: "doc", + name: "Open" + }); + await this.#dispatchPageOpen(this.#pdfViewer.currentPageNumber, true); + Promise.resolve().then(() => { + if (pdfDocument === this.#pdfDocument) { + this.#ready = true; + } + }); + } + async dispatchWillSave() { + return this.#scripting?.dispatchEventInSandbox({ + id: "doc", + name: "WillSave" + }); + } + async dispatchDidSave() { + return this.#scripting?.dispatchEventInSandbox({ + id: "doc", + name: "DidSave" + }); + } + async dispatchWillPrint() { + if (!this.#scripting) { + return; + } + await this.#willPrintCapability?.promise; + this.#willPrintCapability = Promise.withResolvers(); + try { + await this.#scripting.dispatchEventInSandbox({ + id: "doc", + name: "WillPrint" + }); + } catch (ex) { + this.#willPrintCapability.resolve(); + this.#willPrintCapability = null; + throw ex; + } + await this.#willPrintCapability.promise; + } + async dispatchDidPrint() { + return this.#scripting?.dispatchEventInSandbox({ + id: "doc", + name: "DidPrint" + }); + } + get destroyPromise() { + return this.#destroyCapability?.promise || null; + } + get ready() { + return this.#ready; + } + get _pageOpenPending() { + return shadow(this, "_pageOpenPending", new Set()); + } + get _visitedPages() { + return shadow(this, "_visitedPages", new Map()); + } + async #updateFromSandbox(detail) { + const pdfViewer = this.#pdfViewer; + const isInPresentationMode = pdfViewer.isInPresentationMode || pdfViewer.isChangingPresentationMode; + const { + id, + siblings, + command, + value + } = detail; + if (!id) { + switch (command) { + case "clear": + console.clear(); + break; + case "error": + console.error(value); + break; + case "layout": + if (!isInPresentationMode) { + const modes = apiPageLayoutToViewerModes(value); + pdfViewer.spreadMode = modes.spreadMode; + } + break; + case "page-num": + pdfViewer.currentPageNumber = value + 1; + break; + case "print": + await pdfViewer.pagesPromise; + this.#eventBus.dispatch("print", { + source: this + }); + break; + case "println": + console.log(value); + break; + case "zoom": + if (!isInPresentationMode) { + pdfViewer.currentScaleValue = value; + } + break; + case "SaveAs": + this.#eventBus.dispatch("download", { + source: this + }); + break; + case "FirstPage": + pdfViewer.currentPageNumber = 1; + break; + case "LastPage": + pdfViewer.currentPageNumber = pdfViewer.pagesCount; + break; + case "NextPage": + pdfViewer.nextPage(); + break; + case "PrevPage": + pdfViewer.previousPage(); + break; + case "ZoomViewIn": + if (!isInPresentationMode) { + pdfViewer.increaseScale(); + } + break; + case "ZoomViewOut": + if (!isInPresentationMode) { + pdfViewer.decreaseScale(); + } + break; + case "WillPrintFinished": + this.#willPrintCapability?.resolve(); + this.#willPrintCapability = null; + break; + } + return; + } + if (isInPresentationMode && detail.focus) { + return; + } + delete detail.id; + delete detail.siblings; + const ids = siblings ? [id, ...siblings] : [id]; + for (const elementId of ids) { + const element = document.querySelector(`[data-element-id="${elementId}"]`); + if (element) { + element.dispatchEvent(new CustomEvent("updatefromsandbox", { + detail + })); + } else { + this.#pdfDocument?.annotationStorage.setValue(elementId, detail); + } + } + } + async #dispatchPageOpen(pageNumber, initialize = false) { + const pdfDocument = this.#pdfDocument, + visitedPages = this._visitedPages; + if (initialize) { + this.#closeCapability = Promise.withResolvers(); + } + if (!this.#closeCapability) { + return; + } + const pageView = this.#pdfViewer.getPageView(pageNumber - 1); + if (pageView?.renderingState !== RenderingStates.FINISHED) { + this._pageOpenPending.add(pageNumber); + return; + } + this._pageOpenPending.delete(pageNumber); + const actionsPromise = (async () => { + const actions = await (!visitedPages.has(pageNumber) ? pageView.pdfPage?.getJSActions() : null); + if (pdfDocument !== this.#pdfDocument) { + return; + } + await this.#scripting?.dispatchEventInSandbox({ + id: "page", + name: "PageOpen", + pageNumber, + actions + }); + })(); + visitedPages.set(pageNumber, actionsPromise); + } + async #dispatchPageClose(pageNumber) { + const pdfDocument = this.#pdfDocument, + visitedPages = this._visitedPages; + if (!this.#closeCapability) { + return; + } + if (this._pageOpenPending.has(pageNumber)) { + return; + } + const actionsPromise = visitedPages.get(pageNumber); + if (!actionsPromise) { + return; + } + visitedPages.set(pageNumber, null); + await actionsPromise; + if (pdfDocument !== this.#pdfDocument) { + return; + } + await this.#scripting?.dispatchEventInSandbox({ + id: "page", + name: "PageClose", + pageNumber + }); + } + #initScripting() { + this.#destroyCapability = Promise.withResolvers(); + if (this.#scripting) { + throw new Error("#initScripting: Scripting already exists."); + } + return this.#externalServices.createScripting(); + } + async #destroyScripting() { + if (!this.#scripting) { + this.#pdfDocument = null; + this.#destroyCapability?.resolve(); + return; + } + if (this.#closeCapability) { + await Promise.race([this.#closeCapability.promise, new Promise(resolve => { + setTimeout(resolve, 1000); + })]).catch(() => {}); + this.#closeCapability = null; + } + this.#pdfDocument = null; + try { + await this.#scripting.destroySandbox(); + } catch {} + this.#willPrintCapability?.reject(new Error("Scripting destroyed.")); + this.#willPrintCapability = null; + this.#eventAbortController?.abort(); + this.#eventAbortController = null; + this._pageOpenPending.clear(); + this._visitedPages.clear(); + this.#scripting = null; + this.#ready = false; + this.#destroyCapability?.resolve(); + } +} + +;// CONCATENATED MODULE: ./web/pdf_sidebar.js + +const SIDEBAR_WIDTH_VAR = "--sidebar-width"; +const SIDEBAR_MIN_WIDTH = 200; +const SIDEBAR_RESIZING_CLASS = "sidebarResizing"; +const UI_NOTIFICATION_CLASS = "pdfSidebarNotification"; +class PDFSidebar { + #isRTL = false; + #mouseMoveBound = this.#mouseMove.bind(this); + #mouseUpBound = this.#mouseUp.bind(this); + #outerContainerWidth = null; + #width = null; + constructor({ + elements, + eventBus, + l10n + }) { + this.isOpen = false; + this.active = SidebarView.THUMBS; + this.isInitialViewSet = false; + this.isInitialEventDispatched = false; + this.onToggled = null; + this.onUpdateThumbnails = null; + this.outerContainer = elements.outerContainer; + this.sidebarContainer = elements.sidebarContainer; + this.toggleButton = elements.toggleButton; + this.resizer = elements.resizer; + this.thumbnailButton = elements.thumbnailButton; + this.outlineButton = elements.outlineButton; + this.attachmentsButton = elements.attachmentsButton; + this.layersButton = elements.layersButton; + this.thumbnailView = elements.thumbnailView; + this.outlineView = elements.outlineView; + this.attachmentsView = elements.attachmentsView; + this.layersView = elements.layersView; + this._currentOutlineItemButton = elements.currentOutlineItemButton; + this.eventBus = eventBus; + this.#isRTL = l10n.getDirection() === "rtl"; + this.#addEventListeners(); + } + reset() { + this.isInitialViewSet = false; + this.isInitialEventDispatched = false; + this.#hideUINotification(true); + // this.switchView(SidebarView.THUMBS);默认开启书签模式 + this.switchView(SidebarView.OUTLINE); + this.outlineButton.disabled = false; + this.attachmentsButton.disabled = false; + this.layersButton.disabled = false; + this._currentOutlineItemButton.disabled = true; + } + get visibleView() { + return this.isOpen ? this.active : SidebarView.NONE; + } + setInitialView(view = SidebarView.NONE) { + if (this.isInitialViewSet) { + return; + } + this.isInitialViewSet = true; + if (view === SidebarView.NONE || view === SidebarView.UNKNOWN) { + this.#dispatchEvent(); + return; + } + this.switchView(view, true); + if (!this.isInitialEventDispatched) { + this.#dispatchEvent(); + } + } + switchView(view, forceOpen = false) { + const isViewChanged = view !== this.active; + let forceRendering = false; + switch (view) { + case SidebarView.NONE: + if (this.isOpen) { + this.close(); + } + return; + case SidebarView.THUMBS: + if (this.isOpen && isViewChanged) { + forceRendering = true; + } + break; + case SidebarView.OUTLINE: + if (this.outlineButton.disabled) { + return; + } + break; + case SidebarView.ATTACHMENTS: + if (this.attachmentsButton.disabled) { + return; + } + break; + case SidebarView.LAYERS: + if (this.layersButton.disabled) { + return; + } + break; + default: + console.error(`PDFSidebar.switchView: "${view}" is not a valid view.`); + return; + } + this.active = view; + toggleCheckedBtn(this.thumbnailButton, view === SidebarView.THUMBS, this.thumbnailView); + toggleCheckedBtn(this.outlineButton, view === SidebarView.OUTLINE, this.outlineView); + toggleCheckedBtn(this.attachmentsButton, view === SidebarView.ATTACHMENTS, this.attachmentsView); + toggleCheckedBtn(this.layersButton, view === SidebarView.LAYERS, this.layersView); + if (forceOpen && !this.isOpen) { + this.open(); + return; + } + if (forceRendering) { + this.onUpdateThumbnails(); + this.onToggled(); + } + if (isViewChanged) { + this.#dispatchEvent(); + } + } + open() { + if (this.isOpen) { + return; + } + this.isOpen = true; + toggleExpandedBtn(this.toggleButton, true); + this.outerContainer.classList.add("sidebarMoving", "sidebarOpen"); + if (this.active === SidebarView.THUMBS) { + this.onUpdateThumbnails(); + } + this.onToggled(); + this.#dispatchEvent(); + this.#hideUINotification(); + } + close(evt = null) { + if (!this.isOpen) { + return; + } + this.isOpen = false; + toggleExpandedBtn(this.toggleButton, false); + this.outerContainer.classList.add("sidebarMoving"); + this.outerContainer.classList.remove("sidebarOpen"); + this.onToggled(); + this.#dispatchEvent(); + if (evt?.detail > 0) { + this.toggleButton.blur(); + } + } + toggle(evt = null) { + if (this.isOpen) { + this.close(evt); + } else { + this.open(); + } + } + #dispatchEvent() { + if (this.isInitialViewSet) { + this.isInitialEventDispatched ||= true; + } + this.eventBus.dispatch("sidebarviewchanged", { + source: this, + view: this.visibleView + }); + } + #showUINotification() { + this.toggleButton.setAttribute("data-l10n-id", "pdfjs-toggle-sidebar-notification-button"); + if (!this.isOpen) { + this.toggleButton.classList.add(UI_NOTIFICATION_CLASS); + } + } + #hideUINotification(reset = false) { + if (this.isOpen || reset) { + this.toggleButton.classList.remove(UI_NOTIFICATION_CLASS); + } + if (reset) { + this.toggleButton.setAttribute("data-l10n-id", "pdfjs-toggle-sidebar-button"); + } + } + #addEventListeners() { + this.sidebarContainer.addEventListener("transitionend", evt => { + if (evt.target === this.sidebarContainer) { + this.outerContainer.classList.remove("sidebarMoving"); + this.eventBus.dispatch("resize", { + source: this + }); + } + }); + this.toggleButton.addEventListener("click", evt => { + this.toggle(evt); + }); + this.thumbnailButton.addEventListener("click", () => { + this.switchView(SidebarView.THUMBS); + }); + this.outlineButton.addEventListener("click", () => { + this.switchView(SidebarView.OUTLINE); + }); + this.outlineButton.addEventListener("dblclick", () => { + this.eventBus.dispatch("toggleoutlinetree", { + source: this + }); + }); + this.attachmentsButton.addEventListener("click", () => { + this.switchView(SidebarView.ATTACHMENTS); + }); + this.layersButton.addEventListener("click", () => { + this.switchView(SidebarView.LAYERS); + }); + this.layersButton.addEventListener("dblclick", () => { + this.eventBus.dispatch("resetlayers", { + source: this + }); + }); + this._currentOutlineItemButton.addEventListener("click", () => { + this.eventBus.dispatch("currentoutlineitem", { + source: this + }); + }); + const onTreeLoaded = (count, button, view) => { + button.disabled = !count; + if (count) { + this.#showUINotification(); + } else if (this.active === view) { + this.switchView(SidebarView.THUMBS); + } + }; + this.eventBus._on("outlineloaded", evt => { + onTreeLoaded(evt.outlineCount, this.outlineButton, SidebarView.OUTLINE); + evt.currentOutlineItemPromise.then(enabled => { + if (!this.isInitialViewSet) { + return; + } + this._currentOutlineItemButton.disabled = !enabled; + }); + }); + this.eventBus._on("attachmentsloaded", evt => { + onTreeLoaded(evt.attachmentsCount, this.attachmentsButton, SidebarView.ATTACHMENTS); + }); + this.eventBus._on("layersloaded", evt => { + onTreeLoaded(evt.layersCount, this.layersButton, SidebarView.LAYERS); + }); + this.eventBus._on("presentationmodechanged", evt => { + if (evt.state === PresentationModeState.NORMAL && this.visibleView === SidebarView.THUMBS) { + this.onUpdateThumbnails(); + } + }); + this.resizer.addEventListener("mousedown", evt => { + if (evt.button !== 0) { + return; + } + this.outerContainer.classList.add(SIDEBAR_RESIZING_CLASS); + window.addEventListener("mousemove", this.#mouseMoveBound); + window.addEventListener("mouseup", this.#mouseUpBound); + }); + this.eventBus._on("resize", evt => { + if (evt.source !== window) { + return; + } + this.#outerContainerWidth = null; + if (!this.#width) { + return; + } + if (!this.isOpen) { + this.#updateWidth(this.#width); + return; + } + this.outerContainer.classList.add(SIDEBAR_RESIZING_CLASS); + const updated = this.#updateWidth(this.#width); + Promise.resolve().then(() => { + this.outerContainer.classList.remove(SIDEBAR_RESIZING_CLASS); + if (updated) { + this.eventBus.dispatch("resize", { + source: this + }); + } + }); + }); + } + get outerContainerWidth() { + return this.#outerContainerWidth ||= this.outerContainer.clientWidth; + } + #updateWidth(width = 0) { + const maxWidth = Math.floor(this.outerContainerWidth / 2); + if (width > maxWidth) { + width = maxWidth; + } + if (width < SIDEBAR_MIN_WIDTH) { + width = SIDEBAR_MIN_WIDTH; + } + if (width === this.#width) { + return false; + } + this.#width = width; + docStyle.setProperty(SIDEBAR_WIDTH_VAR, `${width}px`); + return true; + } + #mouseMove(evt) { + let width = evt.clientX; + if (this.#isRTL) { + width = this.outerContainerWidth - width; + } + this.#updateWidth(width); + } + #mouseUp(evt) { + this.outerContainer.classList.remove(SIDEBAR_RESIZING_CLASS); + this.eventBus.dispatch("resize", { + source: this + }); + window.removeEventListener("mousemove", this.#mouseMoveBound); + window.removeEventListener("mouseup", this.#mouseUpBound); + } +} + +;// CONCATENATED MODULE: ./web/pdf_thumbnail_view.js + + +const DRAW_UPSCALE_FACTOR = 2; +const MAX_NUM_SCALING_STEPS = 3; +const THUMBNAIL_WIDTH = 98; +class TempImageFactory { + static #tempCanvas = null; + static getCanvas(width, height) { + const tempCanvas = this.#tempCanvas ||= document.createElement("canvas"); + tempCanvas.width = width; + tempCanvas.height = height; + const ctx = tempCanvas.getContext("2d", { + alpha: false + }); + ctx.save(); + ctx.fillStyle = "rgb(255, 255, 255)"; + ctx.fillRect(0, 0, width, height); + ctx.restore(); + return [tempCanvas, tempCanvas.getContext("2d")]; + } + static destroyCanvas() { + const tempCanvas = this.#tempCanvas; + if (tempCanvas) { + tempCanvas.width = 0; + tempCanvas.height = 0; + } + this.#tempCanvas = null; + } +} +class PDFThumbnailView { + constructor({ + container, + eventBus, + id, + defaultViewport, + optionalContentConfigPromise, + linkService, + renderingQueue, + pageColors + }) { + this.id = id; + this.renderingId = "thumbnail" + id; + this.pageLabel = null; + this.pdfPage = null; + this.rotation = 0; + this.viewport = defaultViewport; + this.pdfPageRotate = defaultViewport.rotation; + this._optionalContentConfigPromise = optionalContentConfigPromise || null; + this.pageColors = pageColors || null; + this.eventBus = eventBus; + this.linkService = linkService; + this.renderingQueue = renderingQueue; + this.renderTask = null; + this.renderingState = RenderingStates.INITIAL; + this.resume = null; + const anchor = document.createElement("a"); + anchor.href = linkService.getAnchorUrl("#page=" + id); + anchor.setAttribute("data-l10n-id", "pdfjs-thumb-page-title"); + anchor.setAttribute("data-l10n-args", this.#pageL10nArgs); + anchor.onclick = function () { + linkService.goToPage(id); + return false; + }; + this.anchor = anchor; + const div = document.createElement("div"); + div.className = "thumbnail"; + div.setAttribute("data-page-number", this.id); + this.div = div; + this.#updateDims(); + const img = document.createElement("div"); + img.className = "thumbnailImage"; + this._placeholderImg = img; + div.append(img); + anchor.append(div); + container.append(anchor); + } + #updateDims() { + const { + width, + height + } = this.viewport; + const ratio = width / height; + this.canvasWidth = THUMBNAIL_WIDTH; + this.canvasHeight = this.canvasWidth / ratio | 0; + this.scale = this.canvasWidth / width; + const { + style + } = this.div; + style.setProperty("--thumbnail-width", `${this.canvasWidth}px`); + style.setProperty("--thumbnail-height", `${this.canvasHeight}px`); + } + setPdfPage(pdfPage) { + this.pdfPage = pdfPage; + this.pdfPageRotate = pdfPage.rotate; + const totalRotation = (this.rotation + this.pdfPageRotate) % 360; + this.viewport = pdfPage.getViewport({ + scale: 1, + rotation: totalRotation + }); + this.reset(); + } + reset() { + this.cancelRendering(); + this.renderingState = RenderingStates.INITIAL; + this.div.removeAttribute("data-loaded"); + this.image?.replaceWith(this._placeholderImg); + this.#updateDims(); + if (this.image) { + this.image.removeAttribute("src"); + delete this.image; + } + } + update({ + rotation = null + }) { + if (typeof rotation === "number") { + this.rotation = rotation; + } + const totalRotation = (this.rotation + this.pdfPageRotate) % 360; + this.viewport = this.viewport.clone({ + scale: 1, + rotation: totalRotation + }); + this.reset(); + } + cancelRendering() { + if (this.renderTask) { + this.renderTask.cancel(); + this.renderTask = null; + } + this.resume = null; + } + #getPageDrawContext(upscaleFactor = 1) { + const canvas = document.createElement("canvas"); + const ctx = canvas.getContext("2d", { + alpha: false + }); + const outputScale = new OutputScale(); + canvas.width = upscaleFactor * this.canvasWidth * outputScale.sx | 0; + canvas.height = upscaleFactor * this.canvasHeight * outputScale.sy | 0; + const transform = outputScale.scaled ? [outputScale.sx, 0, 0, outputScale.sy, 0, 0] : null; + return { + ctx, + canvas, + transform + }; + } + #convertCanvasToImage(canvas) { + if (this.renderingState !== RenderingStates.FINISHED) { + throw new Error("#convertCanvasToImage: Rendering has not finished."); + } + const reducedCanvas = this.#reduceImage(canvas); + const image = document.createElement("img"); + image.className = "thumbnailImage"; + image.setAttribute("data-l10n-id", "pdfjs-thumb-page-canvas"); + image.setAttribute("data-l10n-args", this.#pageL10nArgs); + image.src = reducedCanvas.toDataURL(); + this.image = image; + this.div.setAttribute("data-loaded", true); + this._placeholderImg.replaceWith(image); + reducedCanvas.width = 0; + reducedCanvas.height = 0; + } + async #finishRenderTask(renderTask, canvas, error = null) { + if (renderTask === this.renderTask) { + this.renderTask = null; + } + if (error instanceof RenderingCancelledException) { + return; + } + this.renderingState = RenderingStates.FINISHED; + this.#convertCanvasToImage(canvas); + if (error) { + throw error; + } + } + async draw() { + if (this.renderingState !== RenderingStates.INITIAL) { + console.error("Must be in new state before drawing"); + return undefined; + } + const { + pdfPage + } = this; + if (!pdfPage) { + this.renderingState = RenderingStates.FINISHED; + throw new Error("pdfPage is not loaded"); + } + this.renderingState = RenderingStates.RUNNING; + const { + ctx, + canvas, + transform + } = this.#getPageDrawContext(DRAW_UPSCALE_FACTOR); + const drawViewport = this.viewport.clone({ + scale: DRAW_UPSCALE_FACTOR * this.scale + }); + const renderContinueCallback = cont => { + if (!this.renderingQueue.isHighestPriority(this)) { + this.renderingState = RenderingStates.PAUSED; + this.resume = () => { + this.renderingState = RenderingStates.RUNNING; + cont(); + }; + return; + } + cont(); + }; + const renderContext = { + canvasContext: ctx, + transform, + viewport: drawViewport, + optionalContentConfigPromise: this._optionalContentConfigPromise, + pageColors: this.pageColors + }; + const renderTask = this.renderTask = pdfPage.render(renderContext); + renderTask.onContinue = renderContinueCallback; + const resultPromise = renderTask.promise.then(() => this.#finishRenderTask(renderTask, canvas), error => this.#finishRenderTask(renderTask, canvas, error)); + resultPromise.finally(() => { + canvas.width = 0; + canvas.height = 0; + this.eventBus.dispatch("thumbnailrendered", { + source: this, + pageNumber: this.id, + pdfPage: this.pdfPage + }); + }); + return resultPromise; + } + setImage(pageView) { + if (this.renderingState !== RenderingStates.INITIAL) { + return; + } + const { + thumbnailCanvas: canvas, + pdfPage, + scale + } = pageView; + if (!canvas) { + return; + } + if (!this.pdfPage) { + this.setPdfPage(pdfPage); + } + if (scale < this.scale) { + return; + } + this.renderingState = RenderingStates.FINISHED; + this.#convertCanvasToImage(canvas); + } + #reduceImage(img) { + const { + ctx, + canvas + } = this.#getPageDrawContext(); + if (img.width <= 2 * canvas.width) { + ctx.drawImage(img, 0, 0, img.width, img.height, 0, 0, canvas.width, canvas.height); + return canvas; + } + let reducedWidth = canvas.width << MAX_NUM_SCALING_STEPS; + let reducedHeight = canvas.height << MAX_NUM_SCALING_STEPS; + const [reducedImage, reducedImageCtx] = TempImageFactory.getCanvas(reducedWidth, reducedHeight); + while (reducedWidth > img.width || reducedHeight > img.height) { + reducedWidth >>= 1; + reducedHeight >>= 1; + } + reducedImageCtx.drawImage(img, 0, 0, img.width, img.height, 0, 0, reducedWidth, reducedHeight); + while (reducedWidth > 2 * canvas.width) { + reducedImageCtx.drawImage(reducedImage, 0, 0, reducedWidth, reducedHeight, 0, 0, reducedWidth >> 1, reducedHeight >> 1); + reducedWidth >>= 1; + reducedHeight >>= 1; + } + ctx.drawImage(reducedImage, 0, 0, reducedWidth, reducedHeight, 0, 0, canvas.width, canvas.height); + return canvas; + } + get #pageL10nArgs() { + return JSON.stringify({ + page: this.pageLabel ?? this.id + }); + } + setPageLabel(label) { + this.pageLabel = typeof label === "string" ? label : null; + this.anchor.setAttribute("data-l10n-args", this.#pageL10nArgs); + if (this.renderingState !== RenderingStates.FINISHED) { + return; + } + this.image?.setAttribute("data-l10n-args", this.#pageL10nArgs); + } +} + +;// CONCATENATED MODULE: ./web/pdf_thumbnail_viewer.js + + +const THUMBNAIL_SCROLL_MARGIN = -19; +const THUMBNAIL_SELECTED_CLASS = "selected"; +class PDFThumbnailViewer { + constructor({ + container, + eventBus, + linkService, + renderingQueue, + pageColors + }) { + this.container = container; + this.eventBus = eventBus; + this.linkService = linkService; + this.renderingQueue = renderingQueue; + this.pageColors = pageColors || null; + this.scroll = watchScroll(this.container, this.#scrollUpdated.bind(this)); + this.#resetView(); + } + #scrollUpdated() { + this.renderingQueue.renderHighestPriority(); + } + getThumbnail(index) { + return this._thumbnails[index]; + } + #getVisibleThumbs() { + return getVisibleElements({ + scrollEl: this.container, + views: this._thumbnails + }); + } + scrollThumbnailIntoView(pageNumber) { + if (!this.pdfDocument) { + return; + } + const thumbnailView = this._thumbnails[pageNumber - 1]; + if (!thumbnailView) { + console.error('scrollThumbnailIntoView: Invalid "pageNumber" parameter.'); + return; + } + if (pageNumber !== this._currentPageNumber) { + const prevThumbnailView = this._thumbnails[this._currentPageNumber - 1]; + prevThumbnailView.div.classList.remove(THUMBNAIL_SELECTED_CLASS); + thumbnailView.div.classList.add(THUMBNAIL_SELECTED_CLASS); + } + const { + first, + last, + views + } = this.#getVisibleThumbs(); + if (views.length > 0) { + let shouldScroll = false; + if (pageNumber <= first.id || pageNumber >= last.id) { + shouldScroll = true; + } else { + for (const { + id, + percent + } of views) { + if (id !== pageNumber) { + continue; + } + shouldScroll = percent < 100; + break; + } + } + if (shouldScroll) { + scrollIntoView(thumbnailView.div, { + top: THUMBNAIL_SCROLL_MARGIN + }); + } + } + this._currentPageNumber = pageNumber; + } + get pagesRotation() { + return this._pagesRotation; + } + set pagesRotation(rotation) { + if (!isValidRotation(rotation)) { + throw new Error("Invalid thumbnails rotation angle."); + } + if (!this.pdfDocument) { + return; + } + if (this._pagesRotation === rotation) { + return; + } + this._pagesRotation = rotation; + const updateArgs = { + rotation + }; + for (const thumbnail of this._thumbnails) { + thumbnail.update(updateArgs); + } + } + cleanup() { + for (const thumbnail of this._thumbnails) { + if (thumbnail.renderingState !== RenderingStates.FINISHED) { + thumbnail.reset(); + } + } + TempImageFactory.destroyCanvas(); + } + #resetView() { + this._thumbnails = []; + this._currentPageNumber = 1; + this._pageLabels = null; + this._pagesRotation = 0; + this.container.textContent = ""; + } + setDocument(pdfDocument) { + if (this.pdfDocument) { + this.#cancelRendering(); + this.#resetView(); + } + this.pdfDocument = pdfDocument; + if (!pdfDocument) { + return; + } + const firstPagePromise = pdfDocument.getPage(1); + const optionalContentConfigPromise = pdfDocument.getOptionalContentConfig({ + intent: "display" + }); + firstPagePromise.then(firstPdfPage => { + const pagesCount = pdfDocument.numPages; + const viewport = firstPdfPage.getViewport({ + scale: 1 + }); + for (let pageNum = 1; pageNum <= pagesCount; ++pageNum) { + const thumbnail = new PDFThumbnailView({ + container: this.container, + eventBus: this.eventBus, + id: pageNum, + defaultViewport: viewport.clone(), + optionalContentConfigPromise, + linkService: this.linkService, + renderingQueue: this.renderingQueue, + pageColors: this.pageColors + }); + this._thumbnails.push(thumbnail); + } + this._thumbnails[0]?.setPdfPage(firstPdfPage); + const thumbnailView = this._thumbnails[this._currentPageNumber - 1]; + thumbnailView.div.classList.add(THUMBNAIL_SELECTED_CLASS); + }).catch(reason => { + console.error("Unable to initialize thumbnail viewer", reason); + }); + } + #cancelRendering() { + for (const thumbnail of this._thumbnails) { + thumbnail.cancelRendering(); + } + } + setPageLabels(labels) { + if (!this.pdfDocument) { + return; + } + if (!labels) { + this._pageLabels = null; + } else if (!(Array.isArray(labels) && this.pdfDocument.numPages === labels.length)) { + this._pageLabels = null; + console.error("PDFThumbnailViewer_setPageLabels: Invalid page labels."); + } else { + this._pageLabels = labels; + } + for (let i = 0, ii = this._thumbnails.length; i < ii; i++) { + this._thumbnails[i].setPageLabel(this._pageLabels?.[i] ?? null); + } + } + async #ensurePdfPageLoaded(thumbView) { + if (thumbView.pdfPage) { + return thumbView.pdfPage; + } + try { + const pdfPage = await this.pdfDocument.getPage(thumbView.id); + if (!thumbView.pdfPage) { + thumbView.setPdfPage(pdfPage); + } + return pdfPage; + } catch (reason) { + console.error("Unable to get page for thumb view", reason); + return null; + } + } + #getScrollAhead(visible) { + if (visible.first?.id === 1) { + return true; + } else if (visible.last?.id === this._thumbnails.length) { + return false; + } + return this.scroll.down; + } + forceRendering() { + const visibleThumbs = this.#getVisibleThumbs(); + const scrollAhead = this.#getScrollAhead(visibleThumbs); + const thumbView = this.renderingQueue.getHighestPriority(visibleThumbs, this._thumbnails, scrollAhead); + if (thumbView) { + this.#ensurePdfPageLoaded(thumbView).then(() => { + this.renderingQueue.renderView(thumbView); + }); + return true; + } + return false; + } +} + +;// CONCATENATED MODULE: ./web/annotation_editor_layer_builder.js + + +class AnnotationEditorLayerBuilder { + #annotationLayer = null; + #drawLayer = null; + #onAppend = null; + #textLayer = null; + #uiManager; + constructor(options) { + this.pdfPage = options.pdfPage; + this.accessibilityManager = options.accessibilityManager; + this.l10n = options.l10n; + this.l10n ||= new genericl10n_GenericL10n(); + this.annotationEditorLayer = null; + this.div = null; + this._cancelled = false; + this.#uiManager = options.uiManager; + this.#annotationLayer = options.annotationLayer || null; + this.#textLayer = options.textLayer || null; + this.#drawLayer = options.drawLayer || null; + this.#onAppend = options.onAppend || null; + } + async render(viewport, intent = "display") { + if (intent !== "display") { + return; + } + if (this._cancelled) { + return; + } + const clonedViewport = viewport.clone({ + dontFlip: true + }); + if (this.div) { + this.annotationEditorLayer.update({ + viewport: clonedViewport + }); + this.show(); + return; + } + const div = this.div = document.createElement("div"); + div.className = "annotationEditorLayer"; + div.hidden = true; + div.dir = this.#uiManager.direction; + this.#onAppend?.(div); + this.annotationEditorLayer = new AnnotationEditorLayer({ + uiManager: this.#uiManager, + div, + accessibilityManager: this.accessibilityManager, + pageIndex: this.pdfPage.pageNumber - 1, + l10n: this.l10n, + viewport: clonedViewport, + annotationLayer: this.#annotationLayer, + textLayer: this.#textLayer, + drawLayer: this.#drawLayer + }); + const parameters = { + viewport: clonedViewport, + div, + annotations: null, + intent + }; + this.annotationEditorLayer.render(parameters); + this.show(); + } + cancel() { + this._cancelled = true; + if (!this.div) { + return; + } + this.annotationEditorLayer.destroy(); + } + hide() { + if (!this.div) { + return; + } + this.div.hidden = true; + } + show() { + if (!this.div || this.annotationEditorLayer.isInvisible) { + return; + } + this.div.hidden = false; + } +} + +;// CONCATENATED MODULE: ./web/annotation_layer_builder.js + + +class AnnotationLayerBuilder { + #onAppend = null; + #eventAbortController = null; + constructor({ + pdfPage, + linkService, + downloadManager, + annotationStorage = null, + imageResourcesPath = "", + renderForms = true, + enableScripting = false, + hasJSActionsPromise = null, + fieldObjectsPromise = null, + annotationCanvasMap = null, + accessibilityManager = null, + annotationEditorUIManager = null, + onAppend = null + }) { + this.pdfPage = pdfPage; + this.linkService = linkService; + this.downloadManager = downloadManager; + this.imageResourcesPath = imageResourcesPath; + this.renderForms = renderForms; + this.annotationStorage = annotationStorage; + this.enableScripting = enableScripting; + this._hasJSActionsPromise = hasJSActionsPromise || Promise.resolve(false); + this._fieldObjectsPromise = fieldObjectsPromise || Promise.resolve(null); + this._annotationCanvasMap = annotationCanvasMap; + this._accessibilityManager = accessibilityManager; + this._annotationEditorUIManager = annotationEditorUIManager; + this.#onAppend = onAppend; + this.annotationLayer = null; + this.div = null; + this._cancelled = false; + this._eventBus = linkService.eventBus; + } + async render(viewport, intent = "display") { + if (this.div) { + if (this._cancelled || !this.annotationLayer) { + return; + } + this.annotationLayer.update({ + viewport: viewport.clone({ + dontFlip: true + }) + }); + return; + } + const [annotations, hasJSActions, fieldObjects] = await Promise.all([this.pdfPage.getAnnotations({ + intent + }), this._hasJSActionsPromise, this._fieldObjectsPromise]); + if (this._cancelled) { + return; + } + const div = this.div = document.createElement("div"); + div.className = "annotationLayer"; + this.#onAppend?.(div); + if (annotations.length === 0) { + this.hide(); + return; + } + this.annotationLayer = new AnnotationLayer({ + div, + accessibilityManager: this._accessibilityManager, + annotationCanvasMap: this._annotationCanvasMap, + annotationEditorUIManager: this._annotationEditorUIManager, + page: this.pdfPage, + viewport: viewport.clone({ + dontFlip: true + }) + }); + await this.annotationLayer.render({ + annotations, + imageResourcesPath: this.imageResourcesPath, + renderForms: this.renderForms, + linkService: this.linkService, + downloadManager: this.downloadManager, + annotationStorage: this.annotationStorage, + enableScripting: this.enableScripting, + hasJSActions, + fieldObjects + }); + if (this.linkService.isInPresentationMode) { + this.#updatePresentationModeState(PresentationModeState.FULLSCREEN); + } + if (!this.#eventAbortController) { + this.#eventAbortController = new AbortController(); + this._eventBus?._on("presentationmodechanged", evt => { + this.#updatePresentationModeState(evt.state); + }, { + signal: this.#eventAbortController.signal + }); + } + } + cancel() { + this._cancelled = true; + this.#eventAbortController?.abort(); + this.#eventAbortController = null; + } + hide() { + if (!this.div) { + return; + } + this.div.hidden = true; + } + #updatePresentationModeState(state) { + if (!this.div) { + return; + } + let disableFormElements = false; + switch (state) { + case PresentationModeState.FULLSCREEN: + disableFormElements = true; + break; + case PresentationModeState.NORMAL: + break; + default: + return; + } + for (const section of this.div.childNodes) { + if (section.hasAttribute("data-internal-link")) { + continue; + } + section.inert = disableFormElements; + } + } +} + +;// CONCATENATED MODULE: ./web/draw_layer_builder.js + +class DrawLayerBuilder { + #drawLayer = null; + constructor(options) { + this.pageIndex = options.pageIndex; + } + async render(intent = "display") { + if (intent !== "display" || this.#drawLayer || this._cancelled) { + return; + } + this.#drawLayer = new DrawLayer({ + pageIndex: this.pageIndex + }); + } + cancel() { + this._cancelled = true; + if (!this.#drawLayer) { + return; + } + this.#drawLayer.destroy(); + this.#drawLayer = null; + } + setParent(parent) { + this.#drawLayer?.setParent(parent); + } + getDrawLayer() { + return this.#drawLayer; + } +} + +;// CONCATENATED MODULE: ./web/struct_tree_layer_builder.js + +const PDF_ROLE_TO_HTML_ROLE = { + Document: null, + DocumentFragment: null, + Part: "group", + Sect: "group", + Div: "group", + Aside: "note", + NonStruct: "none", + P: null, + H: "heading", + Title: null, + FENote: "note", + Sub: "group", + Lbl: null, + Span: null, + Em: null, + Strong: null, + Link: "link", + Annot: "note", + Form: "form", + Ruby: null, + RB: null, + RT: null, + RP: null, + Warichu: null, + WT: null, + WP: null, + L: "list", + LI: "listitem", + LBody: null, + Table: "table", + TR: "row", + TH: "columnheader", + TD: "cell", + THead: "columnheader", + TBody: null, + TFoot: null, + Caption: null, + Figure: "figure", + Formula: null, + Artifact: null +}; +const HEADING_PATTERN = /^H(\d+)$/; +class StructTreeLayerBuilder { + #treeDom = undefined; + get renderingDone() { + return this.#treeDom !== undefined; + } + render(structTree) { + if (this.#treeDom !== undefined) { + return this.#treeDom; + } + const treeDom = this.#walk(structTree); + treeDom?.classList.add("structTree"); + return this.#treeDom = treeDom; + } + hide() { + if (this.#treeDom && !this.#treeDom.hidden) { + this.#treeDom.hidden = true; + } + } + show() { + if (this.#treeDom?.hidden) { + this.#treeDom.hidden = false; + } + } + #setAttributes(structElement, htmlElement) { + const { + alt, + id, + lang + } = structElement; + if (alt !== undefined) { + htmlElement.setAttribute("aria-label", removeNullCharacters(alt)); + } + if (id !== undefined) { + htmlElement.setAttribute("aria-owns", id); + } + if (lang !== undefined) { + htmlElement.setAttribute("lang", removeNullCharacters(lang, true)); + } + } + #walk(node) { + if (!node) { + return null; + } + const element = document.createElement("span"); + if ("role" in node) { + const { + role + } = node; + const match = role.match(HEADING_PATTERN); + if (match) { + element.setAttribute("role", "heading"); + element.setAttribute("aria-level", match[1]); + } else if (PDF_ROLE_TO_HTML_ROLE[role]) { + element.setAttribute("role", PDF_ROLE_TO_HTML_ROLE[role]); + } + } + this.#setAttributes(node, element); + if (node.children) { + if (node.children.length === 1 && "id" in node.children[0]) { + this.#setAttributes(node.children[0], element); + } else { + for (const kid of node.children) { + element.append(this.#walk(kid)); + } + } + } + return element; + } +} + +;// CONCATENATED MODULE: ./web/text_accessibility.js + +class TextAccessibilityManager { + #enabled = false; + #textChildren = null; + #textNodes = new Map(); + #waitingElements = new Map(); + setTextMapping(textDivs) { + this.#textChildren = textDivs; + } + static #compareElementPositions(e1, e2) { + const rect1 = e1.getBoundingClientRect(); + const rect2 = e2.getBoundingClientRect(); + if (rect1.width === 0 && rect1.height === 0) { + return +1; + } + if (rect2.width === 0 && rect2.height === 0) { + return -1; + } + const top1 = rect1.y; + const bot1 = rect1.y + rect1.height; + const mid1 = rect1.y + rect1.height / 2; + const top2 = rect2.y; + const bot2 = rect2.y + rect2.height; + const mid2 = rect2.y + rect2.height / 2; + if (mid1 <= top2 && mid2 >= bot1) { + return -1; + } + if (mid2 <= top1 && mid1 >= bot2) { + return +1; + } + const centerX1 = rect1.x + rect1.width / 2; + const centerX2 = rect2.x + rect2.width / 2; + return centerX1 - centerX2; + } + enable() { + if (this.#enabled) { + throw new Error("TextAccessibilityManager is already enabled."); + } + if (!this.#textChildren) { + throw new Error("Text divs and strings have not been set."); + } + this.#enabled = true; + this.#textChildren = this.#textChildren.slice(); + this.#textChildren.sort(TextAccessibilityManager.#compareElementPositions); + if (this.#textNodes.size > 0) { + const textChildren = this.#textChildren; + for (const [id, nodeIndex] of this.#textNodes) { + const element = document.getElementById(id); + if (!element) { + this.#textNodes.delete(id); + continue; + } + this.#addIdToAriaOwns(id, textChildren[nodeIndex]); + } + } + for (const [element, isRemovable] of this.#waitingElements) { + this.addPointerInTextLayer(element, isRemovable); + } + this.#waitingElements.clear(); + } + disable() { + if (!this.#enabled) { + return; + } + this.#waitingElements.clear(); + this.#textChildren = null; + this.#enabled = false; + } + removePointerInTextLayer(element) { + if (!this.#enabled) { + this.#waitingElements.delete(element); + return; + } + const children = this.#textChildren; + if (!children || children.length === 0) { + return; + } + const { + id + } = element; + const nodeIndex = this.#textNodes.get(id); + if (nodeIndex === undefined) { + return; + } + const node = children[nodeIndex]; + this.#textNodes.delete(id); + let owns = node.getAttribute("aria-owns"); + if (owns?.includes(id)) { + owns = owns.split(" ").filter(x => x !== id).join(" "); + if (owns) { + node.setAttribute("aria-owns", owns); + } else { + node.removeAttribute("aria-owns"); + node.setAttribute("role", "presentation"); + } + } + } + #addIdToAriaOwns(id, node) { + const owns = node.getAttribute("aria-owns"); + if (!owns?.includes(id)) { + node.setAttribute("aria-owns", owns ? `${owns} ${id}` : id); + } + node.removeAttribute("role"); + } + addPointerInTextLayer(element, isRemovable) { + const { + id + } = element; + if (!id) { + return null; + } + if (!this.#enabled) { + this.#waitingElements.set(element, isRemovable); + return null; + } + if (isRemovable) { + this.removePointerInTextLayer(element); + } + const children = this.#textChildren; + if (!children || children.length === 0) { + return null; + } + const index = binarySearchFirstItem(children, node => TextAccessibilityManager.#compareElementPositions(element, node) < 0); + const nodeIndex = Math.max(0, index - 1); + const child = children[nodeIndex]; + this.#addIdToAriaOwns(id, child); + this.#textNodes.set(id, nodeIndex); + const parent = child.parentNode; + return parent?.classList.contains("markedContent") ? parent.id : null; + } + moveElementInDOM(container, element, contentElement, isRemovable) { + const id = this.addPointerInTextLayer(contentElement, isRemovable); + if (!container.hasChildNodes()) { + container.append(element); + return id; + } + const children = Array.from(container.childNodes).filter(node => node !== element); + if (children.length === 0) { + return id; + } + const elementToCompare = contentElement || element; + const index = binarySearchFirstItem(children, node => TextAccessibilityManager.#compareElementPositions(elementToCompare, node) < 0); + if (index === 0) { + children[0].before(element); + } else { + children[index - 1].after(element); + } + return id; + } +} + +;// CONCATENATED MODULE: ./web/text_highlighter.js +class TextHighlighter { + #eventAbortController = null; + constructor({ + findController, + eventBus, + pageIndex + }) { + this.findController = findController; + this.matches = []; + this.eventBus = eventBus; + this.pageIdx = pageIndex; + this.textDivs = null; + this.textContentItemsStr = null; + this.enabled = false; + } + setTextMapping(divs, texts) { + this.textDivs = divs; + this.textContentItemsStr = texts; + } + enable() { + if (!this.textDivs || !this.textContentItemsStr) { + throw new Error("Text divs and strings have not been set."); + } + if (this.enabled) { + throw new Error("TextHighlighter is already enabled."); + } + this.enabled = true; + if (!this.#eventAbortController) { + this.#eventAbortController = new AbortController(); + this.eventBus._on("updatetextlayermatches", evt => { + if (evt.pageIndex === this.pageIdx || evt.pageIndex === -1) { + this._updateMatches(); + } + }, { + signal: this.#eventAbortController.signal + }); + } + this._updateMatches(); + } + disable() { + if (!this.enabled) { + return; + } + this.enabled = false; + this.#eventAbortController?.abort(); + this.#eventAbortController = null; + this._updateMatches(true); + } + _convertMatches(matches, matchesLength) { + if (!matches) { + return []; + } + const { + textContentItemsStr + } = this; + let i = 0, + iIndex = 0; + const end = textContentItemsStr.length - 1; + const result = []; + for (let m = 0, mm = matches.length; m < mm; m++) { + let matchIdx = matches[m]; + while (i !== end && matchIdx >= iIndex + textContentItemsStr[i].length) { + iIndex += textContentItemsStr[i].length; + i++; + } + if (i === textContentItemsStr.length) { + console.error("Could not find a matching mapping"); + } + const match = { + begin: { + divIdx: i, + offset: matchIdx - iIndex + } + }; + matchIdx += matchesLength[m]; + while (i !== end && matchIdx > iIndex + textContentItemsStr[i].length) { + iIndex += textContentItemsStr[i].length; + i++; + } + match.end = { + divIdx: i, + offset: matchIdx - iIndex + }; + result.push(match); + } + return result; + } + _renderMatches(matches) { + if (matches.length === 0) { + return; + } + const { + findController, + pageIdx + } = this; + const { + textContentItemsStr, + textDivs + } = this; + const isSelectedPage = pageIdx === findController.selected.pageIdx; + const selectedMatchIdx = findController.selected.matchIdx; + const highlightAll = findController.state.highlightAll; + let prevEnd = null; + const infinity = { + divIdx: -1, + offset: undefined + }; + function beginText(begin, className) { + const divIdx = begin.divIdx; + textDivs[divIdx].textContent = ""; + return appendTextToDiv(divIdx, 0, begin.offset, className); + } + function appendTextToDiv(divIdx, fromOffset, toOffset, className) { + let div = textDivs[divIdx]; + if (div.nodeType === Node.TEXT_NODE) { + const span = document.createElement("span"); + div.before(span); + span.append(div); + textDivs[divIdx] = span; + div = span; + } + const content = textContentItemsStr[divIdx].substring(fromOffset, toOffset); + const node = document.createTextNode(content); + if (className) { + const span = document.createElement("span"); + span.className = `${className} appended`; + span.append(node); + div.append(span); + return className.includes("selected") ? span.offsetLeft : 0; + } + div.append(node); + return 0; + } + let i0 = selectedMatchIdx, + i1 = i0 + 1; + if (highlightAll) { + i0 = 0; + i1 = matches.length; + } else if (!isSelectedPage) { + return; + } + let lastDivIdx = -1; + let lastOffset = -1; + for (let i = i0; i < i1; i++) { + const match = matches[i]; + const begin = match.begin; + if (begin.divIdx === lastDivIdx && begin.offset === lastOffset) { + continue; + } + lastDivIdx = begin.divIdx; + lastOffset = begin.offset; + const end = match.end; + const isSelected = isSelectedPage && i === selectedMatchIdx; + const highlightSuffix = isSelected ? " selected" : ""; + let selectedLeft = 0; + if (!prevEnd || begin.divIdx !== prevEnd.divIdx) { + if (prevEnd !== null) { + appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset); + } + beginText(begin); + } else { + appendTextToDiv(prevEnd.divIdx, prevEnd.offset, begin.offset); + } + if (begin.divIdx === end.divIdx) { + selectedLeft = appendTextToDiv(begin.divIdx, begin.offset, end.offset, "highlight" + highlightSuffix); + } else { + selectedLeft = appendTextToDiv(begin.divIdx, begin.offset, infinity.offset, "highlight begin" + highlightSuffix); + for (let n0 = begin.divIdx + 1, n1 = end.divIdx; n0 < n1; n0++) { + textDivs[n0].className = "highlight middle" + highlightSuffix; + } + beginText(end, "highlight end" + highlightSuffix); + } + prevEnd = end; + if (isSelected) { + findController.scrollMatchIntoView({ + element: textDivs[begin.divIdx], + selectedLeft, + pageIndex: pageIdx, + matchIndex: selectedMatchIdx + }); + } + } + if (prevEnd) { + appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset); + } + } + _updateMatches(reset = false) { + if (!this.enabled && !reset) { + return; + } + const { + findController, + matches, + pageIdx + } = this; + const { + textContentItemsStr, + textDivs + } = this; + let clearedUntilDivIdx = -1; + for (const match of matches) { + const begin = Math.max(clearedUntilDivIdx, match.begin.divIdx); + for (let n = begin, end = match.end.divIdx; n <= end; n++) { + const div = textDivs[n]; + div.textContent = textContentItemsStr[n]; + div.className = ""; + } + clearedUntilDivIdx = match.end.divIdx + 1; + } + if (!findController?.highlightMatches || reset) { + return; + } + const pageMatches = findController.pageMatches[pageIdx] || null; + const pageMatchesLength = findController.pageMatchesLength[pageIdx] || null; + this.matches = this._convertMatches(pageMatches, pageMatchesLength); + this._renderMatches(this.matches); + } +} + +;// CONCATENATED MODULE: ./web/text_layer_builder.js + + +class TextLayerBuilder { + #enablePermissions = false; + #onAppend = null; + #renderingDone = false; + #textLayer = null; + static #textLayers = new Map(); + static #selectionChangeAbortController = null; + constructor({ + pdfPage, + highlighter = null, + accessibilityManager = null, + enablePermissions = false, + onAppend = null + }) { + this.pdfPage = pdfPage; + this.highlighter = highlighter; + this.accessibilityManager = accessibilityManager; + this.#enablePermissions = enablePermissions === true; + this.#onAppend = onAppend; + this.div = document.createElement("div"); + this.div.tabIndex = 0; + this.div.className = "textLayer"; + } + #finishRendering() { + this.#renderingDone = true; + const endOfContent = document.createElement("div"); + endOfContent.className = "endOfContent"; + this.div.append(endOfContent); + this.#bindMouse(endOfContent); + } + async render(viewport, textContentParams = null) { + if (this.#renderingDone && this.#textLayer) { + this.#textLayer.update({ + viewport, + onBefore: this.hide.bind(this) + }); + this.show(); + return; + } + this.cancel(); + this.#textLayer = new TextLayer({ + textContentSource: this.pdfPage.streamTextContent(textContentParams || { + includeMarkedContent: true, + disableNormalization: true + }), + container: this.div, + viewport + }); + const { + textDivs, + textContentItemsStr + } = this.#textLayer; + this.highlighter?.setTextMapping(textDivs, textContentItemsStr); + this.accessibilityManager?.setTextMapping(textDivs); + await this.#textLayer.render(); + this.#finishRendering(); + this.#onAppend?.(this.div); + this.highlighter?.enable(); + this.accessibilityManager?.enable(); + } + hide() { + if (!this.div.hidden && this.#renderingDone) { + this.highlighter?.disable(); + this.div.hidden = true; + } + } + show() { + if (this.div.hidden && this.#renderingDone) { + this.div.hidden = false; + this.highlighter?.enable(); + } + } + cancel() { + this.#textLayer?.cancel(); + this.#textLayer = null; + this.highlighter?.disable(); + this.accessibilityManager?.disable(); + TextLayerBuilder.#removeGlobalSelectionListener(this.div); + } + #bindMouse(end) { + const { + div + } = this; + div.addEventListener("mousedown", evt => { + end.classList.add("active"); + }); + div.addEventListener("copy", event => { + if (!this.#enablePermissions) { + const selection = document.getSelection(); + event.clipboardData.setData("text/plain", removeNullCharacters(normalizeUnicode(selection.toString()))); + } + event.preventDefault(); + event.stopPropagation(); + }); + TextLayerBuilder.#textLayers.set(div, end); + TextLayerBuilder.#enableGlobalSelectionListener(); + } + static #removeGlobalSelectionListener(textLayerDiv) { + this.#textLayers.delete(textLayerDiv); + if (this.#textLayers.size === 0) { + this.#selectionChangeAbortController?.abort(); + this.#selectionChangeAbortController = null; + } + } + static #enableGlobalSelectionListener() { + if (this.#selectionChangeAbortController) { + return; + } + this.#selectionChangeAbortController = new AbortController(); + const { + signal + } = this.#selectionChangeAbortController; + const reset = (end, textLayer) => { + textLayer.append(end); + end.style.width = ""; + end.style.height = ""; + end.classList.remove("active"); + }; + document.addEventListener("pointerup", () => { + this.#textLayers.forEach(reset); + }, { + signal + }); + var isFirefox, prevRange; + document.addEventListener("selectionchange", () => { + const selection = document.getSelection(); + if (selection.rangeCount === 0) { + this.#textLayers.forEach(reset); + return; + } + const activeTextLayers = new Set(); + for (let i = 0; i < selection.rangeCount; i++) { + const range = selection.getRangeAt(i); + for (const textLayerDiv of this.#textLayers.keys()) { + if (!activeTextLayers.has(textLayerDiv) && range.intersectsNode(textLayerDiv)) { + activeTextLayers.add(textLayerDiv); + } + } + } + for (const [textLayerDiv, endDiv] of this.#textLayers) { + if (activeTextLayers.has(textLayerDiv)) { + endDiv.classList.add("active"); + } else { + reset(endDiv, textLayerDiv); + } + } + isFirefox ??= getComputedStyle(this.#textLayers.values().next().value).getPropertyValue("-moz-user-select") === "none"; + if (isFirefox) { + return; + } + const range = selection.getRangeAt(0); + const modifyStart = prevRange && (range.compareBoundaryPoints(Range.END_TO_END, prevRange) === 0 || range.compareBoundaryPoints(Range.START_TO_END, prevRange) === 0); + let anchor = modifyStart ? range.startContainer : range.endContainer; + if (anchor.nodeType === Node.TEXT_NODE) { + anchor = anchor.parentNode; + } + const parentTextLayer = anchor.parentElement.closest(".textLayer"); + const endDiv = this.#textLayers.get(parentTextLayer); + if (endDiv) { + endDiv.style.width = parentTextLayer.style.width; + endDiv.style.height = parentTextLayer.style.height; + anchor.parentElement.insertBefore(endDiv, modifyStart ? anchor : anchor.nextSibling); + } + prevRange = range.cloneRange(); + }, { + signal + }); + } +} + +;// CONCATENATED MODULE: ./web/pdf_page_view.js + + + + + + + + + + + + + +const DEFAULT_LAYER_PROPERTIES = null; +const LAYERS_ORDER = new Map([["canvasWrapper", 0], ["textLayer", 1], ["annotationLayer", 2], ["annotationEditorLayer", 3], ["xfaLayer", 3]]); +class PDFPageView { + #annotationMode = AnnotationMode.ENABLE_FORMS; + #hasRestrictedScaling = false; + #layerProperties = null; + #loadingId = null; + #previousRotation = null; + #renderError = null; + #renderingState = RenderingStates.INITIAL; + #textLayerMode = TextLayerMode.ENABLE; + #useThumbnailCanvas = { + directDrawing: true, + initialOptionalContent: true, + regularAnnotations: true + }; + #viewportMap = new WeakMap(); + #layers = [null, null, null, null]; + constructor(options) { + const container = options.container; + const defaultViewport = options.defaultViewport; + this.id = options.id; + this.renderingId = "page" + this.id; + this.#layerProperties = options.layerProperties || DEFAULT_LAYER_PROPERTIES; + this.pdfPage = null; + this.pageLabel = null; + this.rotation = 0; + this.scale = options.scale || DEFAULT_SCALE; + this.viewport = defaultViewport; + this.pdfPageRotate = defaultViewport.rotation; + this._optionalContentConfigPromise = options.optionalContentConfigPromise || null; + this.#textLayerMode = options.textLayerMode ?? TextLayerMode.ENABLE; + this.#annotationMode = options.annotationMode ?? AnnotationMode.ENABLE_FORMS; + this.imageResourcesPath = options.imageResourcesPath || ""; + this.maxCanvasPixels = options.maxCanvasPixels ?? AppOptions.get("maxCanvasPixels"); + this.pageColors = options.pageColors || null; + this.eventBus = options.eventBus; + this.renderingQueue = options.renderingQueue; + this.l10n = options.l10n; + this.l10n ||= new genericl10n_GenericL10n(); + this.renderTask = null; + this.resume = null; + this._isStandalone = !this.renderingQueue?.hasViewer(); + this._container = container; + this._annotationCanvasMap = null; + this.annotationLayer = null; + this.annotationEditorLayer = null; + this.textLayer = null; + this.zoomLayer = null; + this.xfaLayer = null; + this.structTreeLayer = null; + this.drawLayer = null; + const div = document.createElement("div"); + div.className = "page"; + div.setAttribute("data-page-number", this.id); + div.setAttribute("role", "region"); + div.setAttribute("data-l10n-id", "pdfjs-page-landmark"); + div.setAttribute("data-l10n-args", JSON.stringify({ + page: this.id + })); + this.div = div; + this.#setDimensions(); + container?.append(div); + if (this._isStandalone) { + container?.style.setProperty("--scale-factor", this.scale * PixelsPerInch.PDF_TO_CSS_UNITS); + const { + optionalContentConfigPromise + } = options; + if (optionalContentConfigPromise) { + optionalContentConfigPromise.then(optionalContentConfig => { + if (optionalContentConfigPromise !== this._optionalContentConfigPromise) { + return; + } + this.#useThumbnailCanvas.initialOptionalContent = optionalContentConfig.hasInitialVisibility; + }); + } + if (!options.l10n) { + this.l10n.translate(this.div); + } + } + } + #addLayer(div, name) { + const pos = LAYERS_ORDER.get(name); + const oldDiv = this.#layers[pos]; + this.#layers[pos] = div; + if (oldDiv) { + oldDiv.replaceWith(div); + return; + } + for (let i = pos - 1; i >= 0; i--) { + const layer = this.#layers[i]; + if (layer) { + layer.after(div); + return; + } + } + this.div.prepend(div); + } + get renderingState() { + return this.#renderingState; + } + set renderingState(state) { + if (state === this.#renderingState) { + return; + } + this.#renderingState = state; + if (this.#loadingId) { + clearTimeout(this.#loadingId); + this.#loadingId = null; + } + switch (state) { + case RenderingStates.PAUSED: + this.div.classList.remove("loading"); + break; + case RenderingStates.RUNNING: + this.div.classList.add("loadingIcon"); + this.#loadingId = setTimeout(() => { + this.div.classList.add("loading"); + this.#loadingId = null; + }, 0); + break; + case RenderingStates.INITIAL: + case RenderingStates.FINISHED: + this.div.classList.remove("loadingIcon", "loading"); + break; + } + } + #setDimensions() { + const { + viewport + } = this; + if (this.pdfPage) { + if (this.#previousRotation === viewport.rotation) { + return; + } + this.#previousRotation = viewport.rotation; + } + setLayerDimensions(this.div, viewport, true, false); + } + setPdfPage(pdfPage) { + if (this._isStandalone && (this.pageColors?.foreground === "CanvasText" || this.pageColors?.background === "Canvas")) { + this._container?.style.setProperty("--hcm-highlight-filter", pdfPage.filterFactory.addHighlightHCMFilter("highlight", "CanvasText", "Canvas", "HighlightText", "Highlight")); + this._container?.style.setProperty("--hcm-highlight-selected-filter", pdfPage.filterFactory.addHighlightHCMFilter("highlight_selected", "CanvasText", "Canvas", "HighlightText", "Highlight")); + } + this.pdfPage = pdfPage; + this.pdfPageRotate = pdfPage.rotate; + const totalRotation = (this.rotation + this.pdfPageRotate) % 360; + this.viewport = pdfPage.getViewport({ + scale: this.scale * PixelsPerInch.PDF_TO_CSS_UNITS, + rotation: totalRotation + }); + this.#setDimensions(); + this.reset(); + } + destroy() { + this.reset(); + this.pdfPage?.cleanup(); + } + get _textHighlighter() { + return shadow(this, "_textHighlighter", new TextHighlighter({ + pageIndex: this.id - 1, + eventBus: this.eventBus, + findController: this.#layerProperties.findController + })); + } + #dispatchLayerRendered(name, error) { + this.eventBus.dispatch(name, { + source: this, + pageNumber: this.id, + error + }); + } + async #renderAnnotationLayer() { + let error = null; + try { + await this.annotationLayer.render(this.viewport, "display"); + } catch (ex) { + console.error(`#renderAnnotationLayer: "${ex}".`); + error = ex; + } finally { + this.#dispatchLayerRendered("annotationlayerrendered", error); + } + } + async #renderAnnotationEditorLayer() { + let error = null; + try { + await this.annotationEditorLayer.render(this.viewport, "display"); + } catch (ex) { + console.error(`#renderAnnotationEditorLayer: "${ex}".`); + error = ex; + } finally { + this.#dispatchLayerRendered("annotationeditorlayerrendered", error); + } + } + async #renderDrawLayer() { + try { + await this.drawLayer.render("display"); + } catch (ex) { + console.error(`#renderDrawLayer: "${ex}".`); + } + } + async #renderXfaLayer() { + let error = null; + try { + const result = await this.xfaLayer.render(this.viewport, "display"); + if (result?.textDivs && this._textHighlighter) { + this.#buildXfaTextContentItems(result.textDivs); + } + } catch (ex) { + console.error(`#renderXfaLayer: "${ex}".`); + error = ex; + } finally { + if (this.xfaLayer?.div) { + this.l10n.pause(); + this.#addLayer(this.xfaLayer.div, "xfaLayer"); + this.l10n.resume(); + } + this.#dispatchLayerRendered("xfalayerrendered", error); + } + } + async #renderTextLayer() { + if (!this.textLayer) { + return; + } + let error = null; + try { + await this.textLayer.render(this.viewport); + } catch (ex) { + if (ex instanceof AbortException) { + return; + } + console.error(`#renderTextLayer: "${ex}".`); + error = ex; + } + this.#dispatchLayerRendered("textlayerrendered", error); + this.#renderStructTreeLayer(); + } + async #renderStructTreeLayer() { + if (!this.textLayer) { + return; + } + this.structTreeLayer ||= new StructTreeLayerBuilder(); + const tree = await (!this.structTreeLayer.renderingDone ? this.pdfPage.getStructTree() : null); + const treeDom = this.structTreeLayer?.render(tree); + if (treeDom) { + this.l10n.pause(); + this.canvas?.append(treeDom); + this.l10n.resume(); + } + this.structTreeLayer?.show(); + } + async #buildXfaTextContentItems(textDivs) { + const text = await this.pdfPage.getTextContent(); + const items = []; + for (const item of text.items) { + items.push(item.str); + } + this._textHighlighter.setTextMapping(textDivs, items); + this._textHighlighter.enable(); + } + _resetZoomLayer(removeFromDOM = false) { + if (!this.zoomLayer) { + return; + } + const zoomLayerCanvas = this.zoomLayer.firstChild; + this.#viewportMap.delete(zoomLayerCanvas); + zoomLayerCanvas.width = 0; + zoomLayerCanvas.height = 0; + if (removeFromDOM) { + this.zoomLayer.remove(); + } + this.zoomLayer = null; + } + reset({ + keepZoomLayer = false, + keepAnnotationLayer = false, + keepAnnotationEditorLayer = false, + keepXfaLayer = false, + keepTextLayer = false + } = {}) { + this.cancelRendering({ + keepAnnotationLayer, + keepAnnotationEditorLayer, + keepXfaLayer, + keepTextLayer + }); + this.renderingState = RenderingStates.INITIAL; + const div = this.div; + const childNodes = div.childNodes, + zoomLayerNode = keepZoomLayer && this.zoomLayer || null, + annotationLayerNode = keepAnnotationLayer && this.annotationLayer?.div || null, + annotationEditorLayerNode = keepAnnotationEditorLayer && this.annotationEditorLayer?.div || null, + xfaLayerNode = keepXfaLayer && this.xfaLayer?.div || null, + textLayerNode = keepTextLayer && this.textLayer?.div || null; + for (let i = childNodes.length - 1; i >= 0; i--) { + const node = childNodes[i]; + switch (node) { + case zoomLayerNode: + case annotationLayerNode: + case annotationEditorLayerNode: + case xfaLayerNode: + case textLayerNode: + continue; + } + node.remove(); + const layerIndex = this.#layers.indexOf(node); + if (layerIndex >= 0) { + this.#layers[layerIndex] = null; + } + } + div.removeAttribute("data-loaded"); + if (annotationLayerNode) { + this.annotationLayer.hide(); + } + if (annotationEditorLayerNode) { + this.annotationEditorLayer.hide(); + } + if (xfaLayerNode) { + this.xfaLayer.hide(); + } + if (textLayerNode) { + this.textLayer.hide(); + } + this.structTreeLayer?.hide(); + if (!zoomLayerNode) { + if (this.canvas) { + this.#viewportMap.delete(this.canvas); + this.canvas.width = 0; + this.canvas.height = 0; + delete this.canvas; + } + this._resetZoomLayer(); + } + } + update({ + scale = 0, + rotation = null, + optionalContentConfigPromise = null, + drawingDelay = -1 + }) { + this.scale = scale || this.scale; + if (typeof rotation === "number") { + this.rotation = rotation; + } + if (optionalContentConfigPromise instanceof Promise) { + this._optionalContentConfigPromise = optionalContentConfigPromise; + optionalContentConfigPromise.then(optionalContentConfig => { + if (optionalContentConfigPromise !== this._optionalContentConfigPromise) { + return; + } + this.#useThumbnailCanvas.initialOptionalContent = optionalContentConfig.hasInitialVisibility; + }); + } + this.#useThumbnailCanvas.directDrawing = true; + const totalRotation = (this.rotation + this.pdfPageRotate) % 360; + this.viewport = this.viewport.clone({ + scale: this.scale * PixelsPerInch.PDF_TO_CSS_UNITS, + rotation: totalRotation + }); + this.#setDimensions(); + if (this._isStandalone) { + this._container?.style.setProperty("--scale-factor", this.viewport.scale); + } + if (this.canvas) { + let onlyCssZoom = false; + if (this.#hasRestrictedScaling) { + if (this.maxCanvasPixels === 0) { + onlyCssZoom = true; + } else if (this.maxCanvasPixels > 0) { + const { + width, + height + } = this.viewport; + const { + sx, + sy + } = this.outputScale; + onlyCssZoom = (Math.floor(width) * sx | 0) * (Math.floor(height) * sy | 0) > this.maxCanvasPixels; + } + } + const postponeDrawing = drawingDelay >= 0 && drawingDelay < 1000; + if (postponeDrawing || onlyCssZoom) { + if (postponeDrawing && !onlyCssZoom && this.renderingState !== RenderingStates.FINISHED) { + this.cancelRendering({ + keepZoomLayer: true, + keepAnnotationLayer: true, + keepAnnotationEditorLayer: true, + keepXfaLayer: true, + keepTextLayer: true, + cancelExtraDelay: drawingDelay + }); + this.renderingState = RenderingStates.FINISHED; + this.#useThumbnailCanvas.directDrawing = false; + } + this.cssTransform({ + target: this.canvas, + redrawAnnotationLayer: true, + redrawAnnotationEditorLayer: true, + redrawXfaLayer: true, + redrawTextLayer: !postponeDrawing, + hideTextLayer: postponeDrawing + }); + if (postponeDrawing) { + return; + } + this.eventBus.dispatch("pagerendered", { + source: this, + pageNumber: this.id, + cssTransform: true, + timestamp: performance.now(), + error: this.#renderError + }); + return; + } + if (!this.zoomLayer && !this.canvas.hidden) { + this.zoomLayer = this.canvas.parentNode; + this.zoomLayer.style.position = "absolute"; + } + } + if (this.zoomLayer) { + this.cssTransform({ + target: this.zoomLayer.firstChild + }); + } + this.reset({ + keepZoomLayer: true, + keepAnnotationLayer: true, + keepAnnotationEditorLayer: true, + keepXfaLayer: true, + keepTextLayer: true + }); + } + cancelRendering({ + keepAnnotationLayer = false, + keepAnnotationEditorLayer = false, + keepXfaLayer = false, + keepTextLayer = false, + cancelExtraDelay = 0 + } = {}) { + if (this.renderTask) { + this.renderTask.cancel(cancelExtraDelay); + this.renderTask = null; + } + this.resume = null; + if (this.textLayer && (!keepTextLayer || !this.textLayer.div)) { + this.textLayer.cancel(); + this.textLayer = null; + } + if (this.structTreeLayer && !this.textLayer) { + this.structTreeLayer = null; + } + if (this.annotationLayer && (!keepAnnotationLayer || !this.annotationLayer.div)) { + this.annotationLayer.cancel(); + this.annotationLayer = null; + this._annotationCanvasMap = null; + } + if (this.annotationEditorLayer && (!keepAnnotationEditorLayer || !this.annotationEditorLayer.div)) { + if (this.drawLayer) { + this.drawLayer.cancel(); + this.drawLayer = null; + } + this.annotationEditorLayer.cancel(); + this.annotationEditorLayer = null; + } + if (this.xfaLayer && (!keepXfaLayer || !this.xfaLayer.div)) { + this.xfaLayer.cancel(); + this.xfaLayer = null; + this._textHighlighter?.disable(); + } + } + cssTransform({ + target, + redrawAnnotationLayer = false, + redrawAnnotationEditorLayer = false, + redrawXfaLayer = false, + redrawTextLayer = false, + hideTextLayer = false + }) { + if (!target.hasAttribute("zooming")) { + target.setAttribute("zooming", true); + const { + style + } = target; + style.width = style.height = ""; + } + const originalViewport = this.#viewportMap.get(target); + if (this.viewport !== originalViewport) { + const relativeRotation = this.viewport.rotation - originalViewport.rotation; + const absRotation = Math.abs(relativeRotation); + let scaleX = 1, + scaleY = 1; + if (absRotation === 90 || absRotation === 270) { + const { + width, + height + } = this.viewport; + scaleX = height / width; + scaleY = width / height; + } + target.style.transform = `rotate(${relativeRotation}deg) scale(${scaleX}, ${scaleY})`; + } + if (redrawAnnotationLayer && this.annotationLayer) { + this.#renderAnnotationLayer(); + } + if (redrawAnnotationEditorLayer && this.annotationEditorLayer) { + if (this.drawLayer) { + this.#renderDrawLayer(); + } + this.#renderAnnotationEditorLayer(); + } + if (redrawXfaLayer && this.xfaLayer) { + this.#renderXfaLayer(); + } + if (this.textLayer) { + if (hideTextLayer) { + this.textLayer.hide(); + this.structTreeLayer?.hide(); + } else if (redrawTextLayer) { + this.#renderTextLayer(); + } + } + } + get width() { + return this.viewport.width; + } + get height() { + return this.viewport.height; + } + getPagePoint(x, y) { + return this.viewport.convertToPdfPoint(x, y); + } + async #finishRenderTask(renderTask, error = null) { + if (renderTask === this.renderTask) { + this.renderTask = null; + } + if (error instanceof RenderingCancelledException) { + this.#renderError = null; + return; + } + this.#renderError = error; + this.renderingState = RenderingStates.FINISHED; + this._resetZoomLayer(true); + this.#useThumbnailCanvas.regularAnnotations = !renderTask.separateAnnots; + this.eventBus.dispatch("pagerendered", { + source: this, + pageNumber: this.id, + cssTransform: false, + timestamp: performance.now(), + error: this.#renderError + }); + if (error) { + throw error; + } + } + async draw() { + if (this.renderingState !== RenderingStates.INITIAL) { + console.error("Must be in new state before drawing"); + this.reset(); + } + const { + div, + l10n, + pageColors, + pdfPage, + viewport + } = this; + if (!pdfPage) { + this.renderingState = RenderingStates.FINISHED; + throw new Error("pdfPage is not loaded"); + } + this.renderingState = RenderingStates.RUNNING; + const canvasWrapper = document.createElement("div"); + canvasWrapper.classList.add("canvasWrapper"); + this.#addLayer(canvasWrapper, "canvasWrapper"); + if (!this.textLayer && this.#textLayerMode !== TextLayerMode.DISABLE && !pdfPage.isPureXfa) { + this._accessibilityManager ||= new TextAccessibilityManager(); + this.textLayer = new TextLayerBuilder({ + pdfPage, + highlighter: this._textHighlighter, + accessibilityManager: this._accessibilityManager, + enablePermissions: this.#textLayerMode === TextLayerMode.ENABLE_PERMISSIONS, + onAppend: textLayerDiv => { + this.l10n.pause(); + this.#addLayer(textLayerDiv, "textLayer"); + this.l10n.resume(); + } + }); + } + if (!this.annotationLayer && this.#annotationMode !== AnnotationMode.DISABLE) { + const { + annotationStorage, + annotationEditorUIManager, + downloadManager, + enableScripting, + fieldObjectsPromise, + hasJSActionsPromise, + linkService + } = this.#layerProperties; + this._annotationCanvasMap ||= new Map(); + this.annotationLayer = new AnnotationLayerBuilder({ + pdfPage, + annotationStorage, + imageResourcesPath: this.imageResourcesPath, + renderForms: this.#annotationMode === AnnotationMode.ENABLE_FORMS, + linkService, + downloadManager, + enableScripting, + hasJSActionsPromise, + fieldObjectsPromise, + annotationCanvasMap: this._annotationCanvasMap, + accessibilityManager: this._accessibilityManager, + annotationEditorUIManager, + onAppend: annotationLayerDiv => { + this.#addLayer(annotationLayerDiv, "annotationLayer"); + } + }); + } + const renderContinueCallback = cont => { + showCanvas?.(false); + if (this.renderingQueue && !this.renderingQueue.isHighestPriority(this)) { + this.renderingState = RenderingStates.PAUSED; + this.resume = () => { + this.renderingState = RenderingStates.RUNNING; + cont(); + }; + return; + } + cont(); + }; + const { + width, + height + } = viewport; + const canvas = document.createElement("canvas"); + canvas.setAttribute("role", "presentation"); + canvas.hidden = true; + const hasHCM = !!(pageColors?.background && pageColors?.foreground); + let showCanvas = isLastShow => { + if (!hasHCM || isLastShow) { + canvas.hidden = false; + showCanvas = null; + } + }; + canvasWrapper.append(canvas); + this.canvas = canvas; + const ctx = canvas.getContext("2d", { + alpha: false + }); + const outputScale = this.outputScale = new OutputScale(); + if (this.maxCanvasPixels === 0) { + const invScale = 1 / this.scale; + outputScale.sx *= invScale; + outputScale.sy *= invScale; + this.#hasRestrictedScaling = true; + } else if (this.maxCanvasPixels > 0) { + const pixelsInViewport = width * height; + const maxScale = Math.sqrt(this.maxCanvasPixels / pixelsInViewport); + if (outputScale.sx > maxScale || outputScale.sy > maxScale) { + outputScale.sx = maxScale; + outputScale.sy = maxScale; + this.#hasRestrictedScaling = true; + } else { + this.#hasRestrictedScaling = false; + } + } + const sfx = approximateFraction(outputScale.sx); + const sfy = approximateFraction(outputScale.sy); + canvas.width = roundToDivide(width * outputScale.sx, sfx[0]); + canvas.height = roundToDivide(height * outputScale.sy, sfy[0]); + const { + style + } = canvas; + style.width = roundToDivide(width, sfx[1]) + "px"; + style.height = roundToDivide(height, sfy[1]) + "px"; + this.#viewportMap.set(canvas, viewport); + const transform = outputScale.scaled ? [outputScale.sx, 0, 0, outputScale.sy, 0, 0] : null; + const renderContext = { + canvasContext: ctx, + transform, + viewport, + annotationMode: this.#annotationMode, + optionalContentConfigPromise: this._optionalContentConfigPromise, + annotationCanvasMap: this._annotationCanvasMap, + pageColors + }; + const renderTask = this.renderTask = pdfPage.render(renderContext); + renderTask.onContinue = renderContinueCallback; + const resultPromise = renderTask.promise.then(async () => { + showCanvas?.(true); + await this.#finishRenderTask(renderTask); + this.#renderTextLayer(); + if (this.annotationLayer) { + await this.#renderAnnotationLayer(); + } + const { + annotationEditorUIManager + } = this.#layerProperties; + if (!annotationEditorUIManager) { + return; + } + this.drawLayer ||= new DrawLayerBuilder({ + pageIndex: this.id + }); + await this.#renderDrawLayer(); + this.drawLayer.setParent(canvasWrapper); + if (!this.annotationEditorLayer) { + this.annotationEditorLayer = new AnnotationEditorLayerBuilder({ + uiManager: annotationEditorUIManager, + pdfPage, + l10n, + accessibilityManager: this._accessibilityManager, + annotationLayer: this.annotationLayer?.annotationLayer, + textLayer: this.textLayer, + drawLayer: this.drawLayer.getDrawLayer(), + onAppend: annotationEditorLayerDiv => { + this.#addLayer(annotationEditorLayerDiv, "annotationEditorLayer"); + } + }); + } + this.#renderAnnotationEditorLayer(); + }, error => { + if (!(error instanceof RenderingCancelledException)) { + showCanvas?.(true); + } + return this.#finishRenderTask(renderTask, error); + }); + if (pdfPage.isPureXfa) { + if (!this.xfaLayer) { + const { + annotationStorage, + linkService + } = this.#layerProperties; + this.xfaLayer = new XfaLayerBuilder({ + pdfPage, + annotationStorage, + linkService + }); + } + this.#renderXfaLayer(); + } + div.setAttribute("data-loaded", true); + this.eventBus.dispatch("pagerender", { + source: this, + pageNumber: this.id + }); + return resultPromise; + } + setPageLabel(label) { + this.pageLabel = typeof label === "string" ? label : null; + this.div.setAttribute("data-l10n-args", JSON.stringify({ + page: this.pageLabel ?? this.id + })); + if (this.pageLabel !== null) { + this.div.setAttribute("data-page-label", this.pageLabel); + } else { + this.div.removeAttribute("data-page-label"); + } + } + get thumbnailCanvas() { + const { + directDrawing, + initialOptionalContent, + regularAnnotations + } = this.#useThumbnailCanvas; + return directDrawing && initialOptionalContent && regularAnnotations ? this.canvas : null; + } +} + +;// CONCATENATED MODULE: ./web/pdf_viewer.js + + + + + + +const DEFAULT_CACHE_SIZE = 10; +const PagesCountLimit = { + FORCE_SCROLL_MODE_PAGE: 15000, + FORCE_LAZY_PAGE_INIT: 7500, + PAUSE_EAGER_PAGE_INIT: 250 +}; +function isValidAnnotationEditorMode(mode) { + return Object.values(AnnotationEditorType).includes(mode) && mode !== AnnotationEditorType.DISABLE; +} +class PDFPageViewBuffer { + #buf = new Set(); + #size = 0; + constructor(size) { + this.#size = size; + } + push(view) { + const buf = this.#buf; + if (buf.has(view)) { + buf.delete(view); + } + buf.add(view); + if (buf.size > this.#size) { + this.#destroyFirstView(); + } + } + resize(newSize, idsToKeep = null) { + this.#size = newSize; + const buf = this.#buf; + if (idsToKeep) { + const ii = buf.size; + let i = 1; + for (const view of buf) { + if (idsToKeep.has(view.id)) { + buf.delete(view); + buf.add(view); + } + if (++i > ii) { + break; + } + } + } + while (buf.size > this.#size) { + this.#destroyFirstView(); + } + } + has(view) { + return this.#buf.has(view); + } + [Symbol.iterator]() { + return this.#buf.keys(); + } + #destroyFirstView() { + const firstView = this.#buf.keys().next().value; + firstView?.destroy(); + this.#buf.delete(firstView); + } +} +class PDFViewer { + #buffer = null; + #altTextManager = null; + #annotationEditorHighlightColors = null; + #annotationEditorMode = AnnotationEditorType.NONE; + #annotationEditorUIManager = null; + #annotationMode = AnnotationMode.ENABLE_FORMS; + #containerTopLeft = null; + #enableHighlightFloatingButton = false; + #enablePermissions = false; + #eventAbortController = null; + #mlManager = null; + #getAllTextInProgress = false; + #hiddenCopyElement = null; + #interruptCopyCondition = false; + #previousContainerHeight = 0; + #resizeObserver = new ResizeObserver(this.#resizeObserverCallback.bind(this)); + #scrollModePageState = null; + #scaleTimeoutId = null; + #textLayerMode = TextLayerMode.ENABLE; + constructor(options) { + const viewerVersion = "4.3.136"; + if (version !== viewerVersion) { + throw new Error(`The API version "${version}" does not match the Viewer version "${viewerVersion}".`); + } + this.container = options.container; + this.viewer = options.viewer || options.container.firstElementChild; + if (this.container?.tagName !== "DIV" || this.viewer?.tagName !== "DIV") { + throw new Error("Invalid `container` and/or `viewer` option."); + } + if (this.container.offsetParent && getComputedStyle(this.container).position !== "absolute") { + throw new Error("The `container` must be absolutely positioned."); + } + this.#resizeObserver.observe(this.container); + this.eventBus = options.eventBus; + this.linkService = options.linkService || new SimpleLinkService(); + this.downloadManager = options.downloadManager || null; + this.findController = options.findController || null; + this.#altTextManager = options.altTextManager || null; + if (this.findController) { + this.findController.onIsPageVisible = pageNumber => this._getVisiblePages().ids.has(pageNumber); + } + this._scriptingManager = options.scriptingManager || null; + this.#textLayerMode = options.textLayerMode ?? TextLayerMode.ENABLE; + this.#annotationMode = options.annotationMode ?? AnnotationMode.ENABLE_FORMS; + this.#annotationEditorMode = options.annotationEditorMode ?? AnnotationEditorType.NONE; + this.#annotationEditorHighlightColors = options.annotationEditorHighlightColors || null; + this.#enableHighlightFloatingButton = options.enableHighlightFloatingButton === true; + this.imageResourcesPath = options.imageResourcesPath || ""; + this.enablePrintAutoRotate = options.enablePrintAutoRotate || false; + this.removePageBorders = options.removePageBorders || false; + this.maxCanvasPixels = options.maxCanvasPixels; + this.l10n = options.l10n; + this.l10n ||= new genericl10n_GenericL10n(); + this.#enablePermissions = options.enablePermissions || false; + this.pageColors = options.pageColors || null; + this.#mlManager = options.mlManager || null; + this.defaultRenderingQueue = !options.renderingQueue; + if (this.defaultRenderingQueue) { + this.renderingQueue = new PDFRenderingQueue(); + this.renderingQueue.setViewer(this); + } else { + this.renderingQueue = options.renderingQueue; + } + this.scroll = watchScroll(this.container, this._scrollUpdate.bind(this)); + this.presentationModeState = PresentationModeState.UNKNOWN; + this._resetView(); + if (this.removePageBorders) { + this.viewer.classList.add("removePageBorders"); + } + this.#updateContainerHeightCss(); + this.eventBus._on("thumbnailrendered", ({ + pageNumber, + pdfPage + }) => { + const pageView = this._pages[pageNumber - 1]; + if (!this.#buffer.has(pageView)) { + pdfPage?.cleanup(); + } + }); + if (!options.l10n) { + this.l10n.translate(this.container); + } + } + get pagesCount() { + return this._pages.length; + } + getPageView(index) { + return this._pages[index]; + } + getCachedPageViews() { + return new Set(this.#buffer); + } + get pageViewsReady() { + return this._pages.every(pageView => pageView?.pdfPage); + } + get renderForms() { + return this.#annotationMode === AnnotationMode.ENABLE_FORMS; + } + get enableScripting() { + return !!this._scriptingManager; + } + get currentPageNumber() { + return this._currentPageNumber; + } + set currentPageNumber(val) { + if (!Number.isInteger(val)) { + throw new Error("Invalid page number."); + } + if (!this.pdfDocument) { + return; + } + if (!this._setCurrentPageNumber(val, true)) { + console.error(`currentPageNumber: "${val}" is not a valid page.`); + } + } + _setCurrentPageNumber(val, resetCurrentPageView = false) { + if (this._currentPageNumber === val) { + if (resetCurrentPageView) { + this.#resetCurrentPageView(); + } + return true; + } + if (!(0 < val && val <= this.pagesCount)) { + return false; + } + const previous = this._currentPageNumber; + this._currentPageNumber = val; + this.eventBus.dispatch("pagechanging", { + source: this, + pageNumber: val, + pageLabel: this._pageLabels?.[val - 1] ?? null, + previous + }); + if (resetCurrentPageView) { + this.#resetCurrentPageView(); + } + return true; + } + get currentPageLabel() { + return this._pageLabels?.[this._currentPageNumber - 1] ?? null; + } + set currentPageLabel(val) { + if (!this.pdfDocument) { + return; + } + let page = val | 0; + if (this._pageLabels) { + const i = this._pageLabels.indexOf(val); + if (i >= 0) { + page = i + 1; + } + } + if (!this._setCurrentPageNumber(page, true)) { + console.error(`currentPageLabel: "${val}" is not a valid page.`); + } + } + get currentScale() { + return this._currentScale !== UNKNOWN_SCALE ? this._currentScale : DEFAULT_SCALE; + } + set currentScale(val) { + if (isNaN(val)) { + throw new Error("Invalid numeric scale."); + } + if (!this.pdfDocument) { + return; + } + this.#setScale(val, { + noScroll: false + }); + } + get currentScaleValue() { + return this._currentScaleValue; + } + set currentScaleValue(val) { + if (!this.pdfDocument) { + return; + } + this.#setScale(val, { + noScroll: false + }); + } + get pagesRotation() { + return this._pagesRotation; + } + set pagesRotation(rotation) { + if (!isValidRotation(rotation)) { + throw new Error("Invalid pages rotation angle."); + } + if (!this.pdfDocument) { + return; + } + rotation %= 360; + if (rotation < 0) { + rotation += 360; + } + if (this._pagesRotation === rotation) { + return; + } + this._pagesRotation = rotation; + const pageNumber = this._currentPageNumber; + this.refresh(true, { + rotation + }); + if (this._currentScaleValue) { + this.#setScale(this._currentScaleValue, { + noScroll: true + }); + } + this.eventBus.dispatch("rotationchanging", { + source: this, + pagesRotation: rotation, + pageNumber + }); + if (this.defaultRenderingQueue) { + this.update(); + } + } + get firstPagePromise() { + return this.pdfDocument ? this._firstPageCapability.promise : null; + } + get onePageRendered() { + return this.pdfDocument ? this._onePageRenderedCapability.promise : null; + } + get pagesPromise() { + return this.pdfDocument ? this._pagesCapability.promise : null; + } + get _layerProperties() { + const self = this; + return shadow(this, "_layerProperties", { + get annotationEditorUIManager() { + return self.#annotationEditorUIManager; + }, + get annotationStorage() { + return self.pdfDocument?.annotationStorage; + }, + get downloadManager() { + return self.downloadManager; + }, + get enableScripting() { + return !!self._scriptingManager; + }, + get fieldObjectsPromise() { + return self.pdfDocument?.getFieldObjects(); + }, + get findController() { + return self.findController; + }, + get hasJSActionsPromise() { + return self.pdfDocument?.hasJSActions(); + }, + get linkService() { + return self.linkService; + } + }); + } + #initializePermissions(permissions) { + const params = { + annotationEditorMode: this.#annotationEditorMode, + annotationMode: this.#annotationMode, + textLayerMode: this.#textLayerMode + }; + if (!permissions) { + return params; + } + if (!permissions.includes(PermissionFlag.COPY) && this.#textLayerMode === TextLayerMode.ENABLE) { + params.textLayerMode = TextLayerMode.ENABLE_PERMISSIONS; + } + if (!permissions.includes(PermissionFlag.MODIFY_CONTENTS)) { + params.annotationEditorMode = AnnotationEditorType.DISABLE; + } + if (!permissions.includes(PermissionFlag.MODIFY_ANNOTATIONS) && !permissions.includes(PermissionFlag.FILL_INTERACTIVE_FORMS) && this.#annotationMode === AnnotationMode.ENABLE_FORMS) { + params.annotationMode = AnnotationMode.ENABLE; + } + return params; + } + async #onePageRenderedOrForceFetch(signal) { + if (document.visibilityState === "hidden" || !this.container.offsetParent || this._getVisiblePages().views.length === 0) { + return; + } + const hiddenCapability = Promise.withResolvers(); + function onVisibilityChange() { + if (document.visibilityState === "hidden") { + hiddenCapability.resolve(); + } + } + document.addEventListener("visibilitychange", onVisibilityChange, { + signal + }); + await Promise.race([this._onePageRenderedCapability.promise, hiddenCapability.promise]); + document.removeEventListener("visibilitychange", onVisibilityChange); + } + async getAllText() { + const texts = []; + const buffer = []; + for (let pageNum = 1, pagesCount = this.pdfDocument.numPages; pageNum <= pagesCount; ++pageNum) { + if (this.#interruptCopyCondition) { + return null; + } + buffer.length = 0; + const page = await this.pdfDocument.getPage(pageNum); + const { + items + } = await page.getTextContent(); + for (const item of items) { + if (item.str) { + buffer.push(item.str); + } + if (item.hasEOL) { + buffer.push("\n"); + } + } + texts.push(removeNullCharacters(buffer.join(""))); + } + return texts.join("\n"); + } + #copyCallback(textLayerMode, event) { + const selection = document.getSelection(); + const { + focusNode, + anchorNode + } = selection; + if (anchorNode && focusNode && selection.containsNode(this.#hiddenCopyElement)) { + if (this.#getAllTextInProgress || textLayerMode === TextLayerMode.ENABLE_PERMISSIONS) { + event.preventDefault(); + event.stopPropagation(); + return; + } + this.#getAllTextInProgress = true; + const savedCursor = this.container.style.cursor; + this.container.style.cursor = "wait"; + const interruptCopy = ev => this.#interruptCopyCondition = ev.key === "Escape"; + window.addEventListener("keydown", interruptCopy); + this.getAllText().then(async text => { + if (text !== null) { + await navigator.clipboard.writeText(text); + } + }).catch(reason => { + console.warn(`Something goes wrong when extracting the text: ${reason.message}`); + }).finally(() => { + this.#getAllTextInProgress = false; + this.#interruptCopyCondition = false; + window.removeEventListener("keydown", interruptCopy); + this.container.style.cursor = savedCursor; + }); + event.preventDefault(); + event.stopPropagation(); + } + } + setDocument(pdfDocument) { + if (this.pdfDocument) { + this.eventBus.dispatch("pagesdestroy", { + source: this + }); + this._cancelRendering(); + this._resetView(); + this.findController?.setDocument(null); + this._scriptingManager?.setDocument(null); + if (this.#annotationEditorUIManager) { + this.#annotationEditorUIManager.destroy(); + this.#annotationEditorUIManager = null; + } + } + this.pdfDocument = pdfDocument; + if (!pdfDocument) { + return; + } + const pagesCount = pdfDocument.numPages; + const firstPagePromise = pdfDocument.getPage(1); + const optionalContentConfigPromise = pdfDocument.getOptionalContentConfig({ + intent: "display" + }); + const permissionsPromise = this.#enablePermissions ? pdfDocument.getPermissions() : Promise.resolve(); + const { + eventBus, + pageColors, + viewer + } = this; + this.#eventAbortController = new AbortController(); + const { + signal + } = this.#eventAbortController; + if (pagesCount > PagesCountLimit.FORCE_SCROLL_MODE_PAGE) { + console.warn("Forcing PAGE-scrolling for performance reasons, given the length of the document."); + const mode = this._scrollMode = ScrollMode.PAGE; + eventBus.dispatch("scrollmodechanged", { + source: this, + mode + }); + } + this._pagesCapability.promise.then(() => { + eventBus.dispatch("pagesloaded", { + source: this, + pagesCount + }); + }, () => {}); + const onBeforeDraw = evt => { + const pageView = this._pages[evt.pageNumber - 1]; + if (!pageView) { + return; + } + this.#buffer.push(pageView); + }; + eventBus._on("pagerender", onBeforeDraw, { + signal + }); + const onAfterDraw = evt => { + if (evt.cssTransform) { + return; + } + this._onePageRenderedCapability.resolve({ + timestamp: evt.timestamp + }); + eventBus._off("pagerendered", onAfterDraw); + }; + eventBus._on("pagerendered", onAfterDraw, { + signal + }); + Promise.all([firstPagePromise, permissionsPromise]).then(([firstPdfPage, permissions]) => { + if (pdfDocument !== this.pdfDocument) { + return; + } + this._firstPageCapability.resolve(firstPdfPage); + this._optionalContentConfigPromise = optionalContentConfigPromise; + const { + annotationEditorMode, + annotationMode, + textLayerMode + } = this.#initializePermissions(permissions); + if (textLayerMode !== TextLayerMode.DISABLE) { + const element = this.#hiddenCopyElement = document.createElement("div"); + element.id = "hiddenCopyElement"; + viewer.before(element); + } + if (annotationEditorMode !== AnnotationEditorType.DISABLE) { + const mode = annotationEditorMode; + if (pdfDocument.isPureXfa) { + console.warn("Warning: XFA-editing is not implemented."); + } else if (isValidAnnotationEditorMode(mode)) { + this.#annotationEditorUIManager = new AnnotationEditorUIManager(this.container, viewer, this.#altTextManager, eventBus, pdfDocument, pageColors, this.#annotationEditorHighlightColors, this.#enableHighlightFloatingButton, this.#mlManager); + eventBus.dispatch("annotationeditoruimanager", { + source: this, + uiManager: this.#annotationEditorUIManager + }); + if (mode !== AnnotationEditorType.NONE) { + this.#annotationEditorUIManager.updateMode(mode); + } + } else { + console.error(`Invalid AnnotationEditor mode: ${mode}`); + } + } + const viewerElement = this._scrollMode === ScrollMode.PAGE ? null : viewer; + const scale = this.currentScale; + const viewport = firstPdfPage.getViewport({ + scale: scale * PixelsPerInch.PDF_TO_CSS_UNITS + }); + viewer.style.setProperty("--scale-factor", viewport.scale); + if (pageColors?.foreground === "CanvasText" || pageColors?.background === "Canvas") { + viewer.style.setProperty("--hcm-highlight-filter", pdfDocument.filterFactory.addHighlightHCMFilter("highlight", "CanvasText", "Canvas", "HighlightText", "Highlight")); + viewer.style.setProperty("--hcm-highlight-selected-filter", pdfDocument.filterFactory.addHighlightHCMFilter("highlight_selected", "CanvasText", "Canvas", "HighlightText", "ButtonText")); + } + for (let pageNum = 1; pageNum <= pagesCount; ++pageNum) { + const pageView = new PDFPageView({ + container: viewerElement, + eventBus, + id: pageNum, + scale, + defaultViewport: viewport.clone(), + optionalContentConfigPromise, + renderingQueue: this.renderingQueue, + textLayerMode, + annotationMode, + imageResourcesPath: this.imageResourcesPath, + maxCanvasPixels: this.maxCanvasPixels, + pageColors, + l10n: this.l10n, + layerProperties: this._layerProperties + }); + this._pages.push(pageView); + } + this._pages[0]?.setPdfPage(firstPdfPage); + if (this._scrollMode === ScrollMode.PAGE) { + this.#ensurePageViewVisible(); + } else if (this._spreadMode !== SpreadMode.NONE) { + this._updateSpreadMode(); + } + this.#onePageRenderedOrForceFetch(signal).then(async () => { + if (pdfDocument !== this.pdfDocument) { + return; + } + this.findController?.setDocument(pdfDocument); + this._scriptingManager?.setDocument(pdfDocument); + if (this.#hiddenCopyElement) { + document.addEventListener("copy", this.#copyCallback.bind(this, textLayerMode), { + signal + }); + } + if (this.#annotationEditorUIManager) { + eventBus.dispatch("annotationeditormodechanged", { + source: this, + mode: this.#annotationEditorMode + }); + } + if (pdfDocument.loadingParams.disableAutoFetch || pagesCount > PagesCountLimit.FORCE_LAZY_PAGE_INIT) { + this._pagesCapability.resolve(); + return; + } + let getPagesLeft = pagesCount - 1; + if (getPagesLeft <= 0) { + this._pagesCapability.resolve(); + return; + } + for (let pageNum = 2; pageNum <= pagesCount; ++pageNum) { + const promise = pdfDocument.getPage(pageNum).then(pdfPage => { + const pageView = this._pages[pageNum - 1]; + if (!pageView.pdfPage) { + pageView.setPdfPage(pdfPage); + } + if (--getPagesLeft === 0) { + this._pagesCapability.resolve(); + } + }, reason => { + console.error(`Unable to get page ${pageNum} to initialize viewer`, reason); + if (--getPagesLeft === 0) { + this._pagesCapability.resolve(); + } + }); + if (pageNum % PagesCountLimit.PAUSE_EAGER_PAGE_INIT === 0) { + await promise; + } + } + }); + eventBus.dispatch("pagesinit", { + source: this + }); + pdfDocument.getMetadata().then(({ + info + }) => { + if (pdfDocument !== this.pdfDocument) { + return; + } + if (info.Language) { + viewer.lang = info.Language; + } + }); + if (this.defaultRenderingQueue) { + this.update(); + } + }).catch(reason => { + console.error("Unable to initialize viewer", reason); + this._pagesCapability.reject(reason); + }); + } + setPageLabels(labels) { + if (!this.pdfDocument) { + return; + } + if (!labels) { + this._pageLabels = null; + } else if (!(Array.isArray(labels) && this.pdfDocument.numPages === labels.length)) { + this._pageLabels = null; + console.error(`setPageLabels: Invalid page labels.`); + } else { + this._pageLabels = labels; + } + for (let i = 0, ii = this._pages.length; i < ii; i++) { + this._pages[i].setPageLabel(this._pageLabels?.[i] ?? null); + } + } + _resetView() { + this._pages = []; + this._currentPageNumber = 1; + this._currentScale = UNKNOWN_SCALE; + this._currentScaleValue = null; + this._pageLabels = null; + this.#buffer = new PDFPageViewBuffer(DEFAULT_CACHE_SIZE); + this._location = null; + this._pagesRotation = 0; + this._optionalContentConfigPromise = null; + this._firstPageCapability = Promise.withResolvers(); + this._onePageRenderedCapability = Promise.withResolvers(); + this._pagesCapability = Promise.withResolvers(); + this._scrollMode = ScrollMode.VERTICAL; + this._previousScrollMode = ScrollMode.UNKNOWN; + this._spreadMode = SpreadMode.NONE; + this.#scrollModePageState = { + previousPageNumber: 1, + scrollDown: true, + pages: [] + }; + this.#eventAbortController?.abort(); + this.#eventAbortController = null; + this.viewer.textContent = ""; + this._updateScrollMode(); + this.viewer.removeAttribute("lang"); + this.#hiddenCopyElement?.remove(); + this.#hiddenCopyElement = null; + } + #ensurePageViewVisible() { + if (this._scrollMode !== ScrollMode.PAGE) { + throw new Error("#ensurePageViewVisible: Invalid scrollMode value."); + } + const pageNumber = this._currentPageNumber, + state = this.#scrollModePageState, + viewer = this.viewer; + viewer.textContent = ""; + state.pages.length = 0; + if (this._spreadMode === SpreadMode.NONE && !this.isInPresentationMode) { + const pageView = this._pages[pageNumber - 1]; + viewer.append(pageView.div); + state.pages.push(pageView); + } else { + const pageIndexSet = new Set(), + parity = this._spreadMode - 1; + if (parity === -1) { + pageIndexSet.add(pageNumber - 1); + } else if (pageNumber % 2 !== parity) { + pageIndexSet.add(pageNumber - 1); + pageIndexSet.add(pageNumber); + } else { + pageIndexSet.add(pageNumber - 2); + pageIndexSet.add(pageNumber - 1); + } + const spread = document.createElement("div"); + spread.className = "spread"; + if (this.isInPresentationMode) { + const dummyPage = document.createElement("div"); + dummyPage.className = "dummyPage"; + spread.append(dummyPage); + } + for (const i of pageIndexSet) { + const pageView = this._pages[i]; + if (!pageView) { + continue; + } + spread.append(pageView.div); + state.pages.push(pageView); + } + viewer.append(spread); + } + state.scrollDown = pageNumber >= state.previousPageNumber; + state.previousPageNumber = pageNumber; + } + _scrollUpdate() { + if (this.pagesCount === 0) { + return; + } + this.update(); + } + #scrollIntoView(pageView, pageSpot = null) { + const { + div, + id + } = pageView; + if (this._currentPageNumber !== id) { + this._setCurrentPageNumber(id); + } + if (this._scrollMode === ScrollMode.PAGE) { + this.#ensurePageViewVisible(); + this.update(); + } + if (!pageSpot && !this.isInPresentationMode) { + const left = div.offsetLeft + div.clientLeft, + right = left + div.clientWidth; + const { + scrollLeft, + clientWidth + } = this.container; + if (this._scrollMode === ScrollMode.HORIZONTAL || left < scrollLeft || right > scrollLeft + clientWidth) { + pageSpot = { + left: 0, + top: 0 + }; + } + } + scrollIntoView(div, pageSpot); + if (!this._currentScaleValue && this._location) { + this._location = null; + } + } + #isSameScale(newScale) { + return newScale === this._currentScale || Math.abs(newScale - this._currentScale) < 1e-15; + } + #setScaleUpdatePages(newScale, newValue, { + noScroll = false, + preset = false, + drawingDelay = -1, + origin = null + }) { + this._currentScaleValue = newValue.toString(); + if (this.#isSameScale(newScale)) { + if (preset) { + this.eventBus.dispatch("scalechanging", { + source: this, + scale: newScale, + presetValue: newValue + }); + } + return; + } + this.viewer.style.setProperty("--scale-factor", newScale * PixelsPerInch.PDF_TO_CSS_UNITS); + const postponeDrawing = drawingDelay >= 0 && drawingDelay < 1000; + this.refresh(true, { + scale: newScale, + drawingDelay: postponeDrawing ? drawingDelay : -1 + }); + if (postponeDrawing) { + this.#scaleTimeoutId = setTimeout(() => { + this.#scaleTimeoutId = null; + this.refresh(); + }, drawingDelay); + } + const previousScale = this._currentScale; + this._currentScale = newScale; + if (!noScroll) { + let page = this._currentPageNumber, + dest; + if (this._location && !(this.isInPresentationMode || this.isChangingPresentationMode)) { + page = this._location.pageNumber; + dest = [null, { + name: "XYZ" + }, this._location.left, this._location.top, null]; + } + this.scrollPageIntoView({ + pageNumber: page, + destArray: dest, + allowNegativeOffset: true + }); + if (Array.isArray(origin)) { + const scaleDiff = newScale / previousScale - 1; + const [top, left] = this.containerTopLeft; + this.container.scrollLeft += (origin[0] - left) * scaleDiff; + this.container.scrollTop += (origin[1] - top) * scaleDiff; + } + } + this.eventBus.dispatch("scalechanging", { + source: this, + scale: newScale, + presetValue: preset ? newValue : undefined + }); + if (this.defaultRenderingQueue) { + this.update(); + } + } + get #pageWidthScaleFactor() { + if (this._spreadMode !== SpreadMode.NONE && this._scrollMode !== ScrollMode.HORIZONTAL) { + return 2; + } + return 1; + } + #setScale(value, options) { + let scale = parseFloat(value); + if (scale > 0) { + options.preset = false; + this.#setScaleUpdatePages(scale, value, options); + } else { + const currentPage = this._pages[this._currentPageNumber - 1]; + if (!currentPage) { + return; + } + let hPadding = SCROLLBAR_PADDING, + vPadding = VERTICAL_PADDING; + if (this.isInPresentationMode) { + hPadding = vPadding = 4; + if (this._spreadMode !== SpreadMode.NONE) { + hPadding *= 2; + } + } else if (this.removePageBorders) { + hPadding = vPadding = 0; + } else if (this._scrollMode === ScrollMode.HORIZONTAL) { + [hPadding, vPadding] = [vPadding, hPadding]; + } + const pageWidthScale = (this.container.clientWidth - hPadding) / currentPage.width * currentPage.scale / this.#pageWidthScaleFactor; + const pageHeightScale = (this.container.clientHeight - vPadding) / currentPage.height * currentPage.scale; + switch (value) { + case "page-actual": + scale = 1; + break; + case "page-width": + scale = pageWidthScale; + break; + case "page-height": + scale = pageHeightScale; + break; + case "page-fit": + scale = Math.min(pageWidthScale, pageHeightScale); + break; + case "auto": + const horizontalScale = isPortraitOrientation(currentPage) ? pageWidthScale : Math.min(pageHeightScale, pageWidthScale); + scale = Math.min(MAX_AUTO_SCALE, horizontalScale); + break; + default: + console.error(`#setScale: "${value}" is an unknown zoom value.`); + return; + } + options.preset = true; + this.#setScaleUpdatePages(scale, value, options); + } + } + #resetCurrentPageView() { + const pageView = this._pages[this._currentPageNumber - 1]; + if (this.isInPresentationMode) { + this.#setScale(this._currentScaleValue, { + noScroll: true + }); + } + this.#scrollIntoView(pageView); + } + pageLabelToPageNumber(label) { + if (!this._pageLabels) { + return null; + } + const i = this._pageLabels.indexOf(label); + if (i < 0) { + return null; + } + return i + 1; + } + scrollPageIntoView({ + pageNumber, + destArray = null, + allowNegativeOffset = false, + ignoreDestinationZoom = false + }) { + if (!this.pdfDocument) { + return; + } + const pageView = Number.isInteger(pageNumber) && this._pages[pageNumber - 1]; + if (!pageView) { + console.error(`scrollPageIntoView: "${pageNumber}" is not a valid pageNumber parameter.`); + return; + } + if (this.isInPresentationMode || !destArray) { + this._setCurrentPageNumber(pageNumber, true); + return; + } + let x = 0, + y = 0; + let width = 0, + height = 0, + widthScale, + heightScale; + const changeOrientation = pageView.rotation % 180 !== 0; + const pageWidth = (changeOrientation ? pageView.height : pageView.width) / pageView.scale / PixelsPerInch.PDF_TO_CSS_UNITS; + const pageHeight = (changeOrientation ? pageView.width : pageView.height) / pageView.scale / PixelsPerInch.PDF_TO_CSS_UNITS; + let scale = 0; + switch (destArray[1].name) { + case "XYZ": + x = destArray[2]; + y = destArray[3]; + scale = destArray[4]; + x = x !== null ? x : 0; + y = y !== null ? y : pageHeight; + break; + case "Fit": + case "FitB": + scale = "page-fit"; + break; + case "FitH": + case "FitBH": + y = destArray[2]; + scale = "page-width"; + if (y === null && this._location) { + x = this._location.left; + y = this._location.top; + } else if (typeof y !== "number" || y < 0) { + y = pageHeight; + } + break; + case "FitV": + case "FitBV": + x = destArray[2]; + width = pageWidth; + height = pageHeight; + scale = "page-height"; + break; + case "FitR": + x = destArray[2]; + y = destArray[3]; + width = destArray[4] - x; + height = destArray[5] - y; + let hPadding = SCROLLBAR_PADDING, + vPadding = VERTICAL_PADDING; + if (this.removePageBorders) { + hPadding = vPadding = 0; + } + widthScale = (this.container.clientWidth - hPadding) / width / PixelsPerInch.PDF_TO_CSS_UNITS; + heightScale = (this.container.clientHeight - vPadding) / height / PixelsPerInch.PDF_TO_CSS_UNITS; + scale = Math.min(Math.abs(widthScale), Math.abs(heightScale)); + break; + default: + console.error(`scrollPageIntoView: "${destArray[1].name}" is not a valid destination type.`); + return; + } + if (!ignoreDestinationZoom) { + if (scale && scale !== this._currentScale) { + this.currentScaleValue = scale; + } else if (this._currentScale === UNKNOWN_SCALE) { + this.currentScaleValue = DEFAULT_SCALE_VALUE; + } + } + if (scale === "page-fit" && !destArray[4]) { + this.#scrollIntoView(pageView); + return; + } + const boundingRect = [pageView.viewport.convertToViewportPoint(x, y), pageView.viewport.convertToViewportPoint(x + width, y + height)]; + let left = Math.min(boundingRect[0][0], boundingRect[1][0]); + let top = Math.min(boundingRect[0][1], boundingRect[1][1]); + if (!allowNegativeOffset) { + left = Math.max(left, 0); + top = Math.max(top, 0); + } + this.#scrollIntoView(pageView, { + left, + top + }); + } + _updateLocation(firstPage) { + const currentScale = this._currentScale; + const currentScaleValue = this._currentScaleValue; + const normalizedScaleValue = parseFloat(currentScaleValue) === currentScale ? Math.round(currentScale * 10000) / 100 : currentScaleValue; + const pageNumber = firstPage.id; + const currentPageView = this._pages[pageNumber - 1]; + const container = this.container; + const topLeft = currentPageView.getPagePoint(container.scrollLeft - firstPage.x, container.scrollTop - firstPage.y); + const intLeft = Math.round(topLeft[0]); + const intTop = Math.round(topLeft[1]); + let pdfOpenParams = `#page=${pageNumber}`; + if (!this.isInPresentationMode) { + pdfOpenParams += `&zoom=${normalizedScaleValue},${intLeft},${intTop}`; + } + this._location = { + pageNumber, + scale: normalizedScaleValue, + top: intTop, + left: intLeft, + rotation: this._pagesRotation, + pdfOpenParams + }; + } + update() { + const visible = this._getVisiblePages(); + const visiblePages = visible.views, + numVisiblePages = visiblePages.length; + if (numVisiblePages === 0) { + return; + } + const newCacheSize = Math.max(DEFAULT_CACHE_SIZE, 2 * numVisiblePages + 1); + this.#buffer.resize(newCacheSize, visible.ids); + this.renderingQueue.renderHighestPriority(visible); + const isSimpleLayout = this._spreadMode === SpreadMode.NONE && (this._scrollMode === ScrollMode.PAGE || this._scrollMode === ScrollMode.VERTICAL); + const currentId = this._currentPageNumber; + let stillFullyVisible = false; + for (const page of visiblePages) { + if (page.percent < 100) { + break; + } + if (page.id === currentId && isSimpleLayout) { + stillFullyVisible = true; + break; + } + } + this._setCurrentPageNumber(stillFullyVisible ? currentId : visiblePages[0].id); + this._updateLocation(visible.first); + this.eventBus.dispatch("updateviewarea", { + source: this, + location: this._location + }); + } + containsElement(element) { + return this.container.contains(element); + } + focus() { + this.container.focus(); + } + get _isContainerRtl() { + return getComputedStyle(this.container).direction === "rtl"; + } + get isInPresentationMode() { + return this.presentationModeState === PresentationModeState.FULLSCREEN; + } + get isChangingPresentationMode() { + return this.presentationModeState === PresentationModeState.CHANGING; + } + get isHorizontalScrollbarEnabled() { + return this.isInPresentationMode ? false : this.container.scrollWidth > this.container.clientWidth; + } + get isVerticalScrollbarEnabled() { + return this.isInPresentationMode ? false : this.container.scrollHeight > this.container.clientHeight; + } + _getVisiblePages() { + const views = this._scrollMode === ScrollMode.PAGE ? this.#scrollModePageState.pages : this._pages, + horizontal = this._scrollMode === ScrollMode.HORIZONTAL, + rtl = horizontal && this._isContainerRtl; + return getVisibleElements({ + scrollEl: this.container, + views, + sortByVisibility: true, + horizontal, + rtl + }); + } + cleanup() { + for (const pageView of this._pages) { + if (pageView.renderingState !== RenderingStates.FINISHED) { + pageView.reset(); + } + } + } + _cancelRendering() { + for (const pageView of this._pages) { + pageView.cancelRendering(); + } + } + async #ensurePdfPageLoaded(pageView) { + if (pageView.pdfPage) { + return pageView.pdfPage; + } + try { + const pdfPage = await this.pdfDocument.getPage(pageView.id); + if (!pageView.pdfPage) { + pageView.setPdfPage(pdfPage); + } + return pdfPage; + } catch (reason) { + console.error("Unable to get page for page view", reason); + return null; + } + } + #getScrollAhead(visible) { + if (visible.first?.id === 1) { + return true; + } else if (visible.last?.id === this.pagesCount) { + return false; + } + switch (this._scrollMode) { + case ScrollMode.PAGE: + return this.#scrollModePageState.scrollDown; + case ScrollMode.HORIZONTAL: + return this.scroll.right; + } + return this.scroll.down; + } + forceRendering(currentlyVisiblePages) { + const visiblePages = currentlyVisiblePages || this._getVisiblePages(); + const scrollAhead = this.#getScrollAhead(visiblePages); + const preRenderExtra = this._spreadMode !== SpreadMode.NONE && this._scrollMode !== ScrollMode.HORIZONTAL; + const pageView = this.renderingQueue.getHighestPriority(visiblePages, this._pages, scrollAhead, preRenderExtra); + if (pageView) { + this.#ensurePdfPageLoaded(pageView).then(() => { + this.renderingQueue.renderView(pageView); + }); + return true; + } + return false; + } + get hasEqualPageSizes() { + const firstPageView = this._pages[0]; + for (let i = 1, ii = this._pages.length; i < ii; ++i) { + const pageView = this._pages[i]; + if (pageView.width !== firstPageView.width || pageView.height !== firstPageView.height) { + return false; + } + } + return true; + } + getPagesOverview() { + let initialOrientation; + return this._pages.map(pageView => { + const viewport = pageView.pdfPage.getViewport({ + scale: 1 + }); + const orientation = isPortraitOrientation(viewport); + if (initialOrientation === undefined) { + initialOrientation = orientation; + } else if (this.enablePrintAutoRotate && orientation !== initialOrientation) { + return { + width: viewport.height, + height: viewport.width, + rotation: (viewport.rotation - 90) % 360 + }; + } + return { + width: viewport.width, + height: viewport.height, + rotation: viewport.rotation + }; + }); + } + get optionalContentConfigPromise() { + if (!this.pdfDocument) { + return Promise.resolve(null); + } + if (!this._optionalContentConfigPromise) { + console.error("optionalContentConfigPromise: Not initialized yet."); + return this.pdfDocument.getOptionalContentConfig({ + intent: "display" + }); + } + return this._optionalContentConfigPromise; + } + set optionalContentConfigPromise(promise) { + if (!(promise instanceof Promise)) { + throw new Error(`Invalid optionalContentConfigPromise: ${promise}`); + } + if (!this.pdfDocument) { + return; + } + if (!this._optionalContentConfigPromise) { + return; + } + this._optionalContentConfigPromise = promise; + this.refresh(false, { + optionalContentConfigPromise: promise + }); + this.eventBus.dispatch("optionalcontentconfigchanged", { + source: this, + promise + }); + } + get scrollMode() { + return this._scrollMode; + } + set scrollMode(mode) { + if (this._scrollMode === mode) { + return; + } + if (!isValidScrollMode(mode)) { + throw new Error(`Invalid scroll mode: ${mode}`); + } + if (this.pagesCount > PagesCountLimit.FORCE_SCROLL_MODE_PAGE) { + return; + } + this._previousScrollMode = this._scrollMode; + this._scrollMode = mode; + this.eventBus.dispatch("scrollmodechanged", { + source: this, + mode + }); + this._updateScrollMode(this._currentPageNumber); + } + _updateScrollMode(pageNumber = null) { + const scrollMode = this._scrollMode, + viewer = this.viewer; + viewer.classList.toggle("scrollHorizontal", scrollMode === ScrollMode.HORIZONTAL); + viewer.classList.toggle("scrollWrapped", scrollMode === ScrollMode.WRAPPED); + if (!this.pdfDocument || !pageNumber) { + return; + } + if (scrollMode === ScrollMode.PAGE) { + this.#ensurePageViewVisible(); + } else if (this._previousScrollMode === ScrollMode.PAGE) { + this._updateSpreadMode(); + } + if (this._currentScaleValue && isNaN(this._currentScaleValue)) { + this.#setScale(this._currentScaleValue, { + noScroll: true + }); + } + this._setCurrentPageNumber(pageNumber, true); + this.update(); + } + get spreadMode() { + return this._spreadMode; + } + set spreadMode(mode) { + if (this._spreadMode === mode) { + return; + } + if (!isValidSpreadMode(mode)) { + throw new Error(`Invalid spread mode: ${mode}`); + } + this._spreadMode = mode; + this.eventBus.dispatch("spreadmodechanged", { + source: this, + mode + }); + this._updateSpreadMode(this._currentPageNumber); + } + _updateSpreadMode(pageNumber = null) { + if (!this.pdfDocument) { + return; + } + const viewer = this.viewer, + pages = this._pages; + if (this._scrollMode === ScrollMode.PAGE) { + this.#ensurePageViewVisible(); + } else { + viewer.textContent = ""; + if (this._spreadMode === SpreadMode.NONE) { + for (const pageView of this._pages) { + viewer.append(pageView.div); + } + } else { + const parity = this._spreadMode - 1; + let spread = null; + for (let i = 0, ii = pages.length; i < ii; ++i) { + if (spread === null) { + spread = document.createElement("div"); + spread.className = "spread"; + viewer.append(spread); + } else if (i % 2 === parity) { + spread = spread.cloneNode(false); + viewer.append(spread); + } + spread.append(pages[i].div); + } + } + } + if (!pageNumber) { + return; + } + if (this._currentScaleValue && isNaN(this._currentScaleValue)) { + this.#setScale(this._currentScaleValue, { + noScroll: true + }); + } + this._setCurrentPageNumber(pageNumber, true); + this.update(); + } + _getPageAdvance(currentPageNumber, previous = false) { + switch (this._scrollMode) { + case ScrollMode.WRAPPED: + { + const { + views + } = this._getVisiblePages(), + pageLayout = new Map(); + for (const { + id, + y, + percent, + widthPercent + } of views) { + if (percent === 0 || widthPercent < 100) { + continue; + } + let yArray = pageLayout.get(y); + if (!yArray) { + pageLayout.set(y, yArray ||= []); + } + yArray.push(id); + } + for (const yArray of pageLayout.values()) { + const currentIndex = yArray.indexOf(currentPageNumber); + if (currentIndex === -1) { + continue; + } + const numPages = yArray.length; + if (numPages === 1) { + break; + } + if (previous) { + for (let i = currentIndex - 1, ii = 0; i >= ii; i--) { + const currentId = yArray[i], + expectedId = yArray[i + 1] - 1; + if (currentId < expectedId) { + return currentPageNumber - expectedId; + } + } + } else { + for (let i = currentIndex + 1, ii = numPages; i < ii; i++) { + const currentId = yArray[i], + expectedId = yArray[i - 1] + 1; + if (currentId > expectedId) { + return expectedId - currentPageNumber; + } + } + } + if (previous) { + const firstId = yArray[0]; + if (firstId < currentPageNumber) { + return currentPageNumber - firstId + 1; + } + } else { + const lastId = yArray[numPages - 1]; + if (lastId > currentPageNumber) { + return lastId - currentPageNumber + 1; + } + } + break; + } + break; + } + case ScrollMode.HORIZONTAL: + { + break; + } + case ScrollMode.PAGE: + case ScrollMode.VERTICAL: + { + if (this._spreadMode === SpreadMode.NONE) { + break; + } + const parity = this._spreadMode - 1; + if (previous && currentPageNumber % 2 !== parity) { + break; + } else if (!previous && currentPageNumber % 2 === parity) { + break; + } + const { + views + } = this._getVisiblePages(), + expectedId = previous ? currentPageNumber - 1 : currentPageNumber + 1; + for (const { + id, + percent, + widthPercent + } of views) { + if (id !== expectedId) { + continue; + } + if (percent > 0 && widthPercent === 100) { + return 2; + } + break; + } + break; + } + } + return 1; + } + nextPage() { + const currentPageNumber = this._currentPageNumber, + pagesCount = this.pagesCount; + if (currentPageNumber >= pagesCount) { + return false; + } + const advance = this._getPageAdvance(currentPageNumber, false) || 1; + this.currentPageNumber = Math.min(currentPageNumber + advance, pagesCount); + return true; + } + previousPage() { + const currentPageNumber = this._currentPageNumber; + if (currentPageNumber <= 1) { + return false; + } + const advance = this._getPageAdvance(currentPageNumber, true) || 1; + this.currentPageNumber = Math.max(currentPageNumber - advance, 1); + return true; + } + updateScale({ + drawingDelay, + scaleFactor = null, + steps = null, + origin + }) { + if (steps === null && scaleFactor === null) { + throw new Error("Invalid updateScale options: either `steps` or `scaleFactor` must be provided."); + } + if (!this.pdfDocument) { + return; + } + let newScale = this._currentScale; + if (scaleFactor > 0 && scaleFactor !== 1) { + newScale = Math.round(newScale * scaleFactor * 100) / 100; + } else if (steps) { + const delta = steps > 0 ? DEFAULT_SCALE_DELTA : 1 / DEFAULT_SCALE_DELTA; + const round = steps > 0 ? Math.ceil : Math.floor; + steps = Math.abs(steps); + do { + newScale = round((newScale * delta).toFixed(2) * 10) / 10; + } while (--steps > 0); + } + newScale = Math.max(MIN_SCALE, Math.min(MAX_SCALE, newScale)); + this.#setScale(newScale, { + noScroll: false, + drawingDelay, + origin + }); + } + increaseScale(options = {}) { + this.updateScale({ + ...options, + steps: options.steps ?? 1 + }); + } + decreaseScale(options = {}) { + this.updateScale({ + ...options, + steps: -(options.steps ?? 1) + }); + } + #updateContainerHeightCss(height = this.container.clientHeight) { + if (height !== this.#previousContainerHeight) { + this.#previousContainerHeight = height; + docStyle.setProperty("--viewer-container-height", `${height}px`); + } + } + #resizeObserverCallback(entries) { + for (const entry of entries) { + if (entry.target === this.container) { + this.#updateContainerHeightCss(Math.floor(entry.borderBoxSize[0].blockSize)); + this.#containerTopLeft = null; + break; + } + } + } + get containerTopLeft() { + return this.#containerTopLeft ||= [this.container.offsetTop, this.container.offsetLeft]; + } + get annotationEditorMode() { + return this.#annotationEditorUIManager ? this.#annotationEditorMode : AnnotationEditorType.DISABLE; + } + set annotationEditorMode({ + mode, + editId = null, + isFromKeyboard = false + }) { + if (!this.#annotationEditorUIManager) { + throw new Error(`The AnnotationEditor is not enabled.`); + } + if (this.#annotationEditorMode === mode) { + return; + } + if (!isValidAnnotationEditorMode(mode)) { + throw new Error(`Invalid AnnotationEditor mode: ${mode}`); + } + if (!this.pdfDocument) { + return; + } + this.#annotationEditorMode = mode; + this.eventBus.dispatch("annotationeditormodechanged", { + source: this, + mode + }); + this.#annotationEditorUIManager.updateMode(mode, editId, isFromKeyboard); + } + set annotationEditorParams({ + type, + value + }) { + if (!this.#annotationEditorUIManager) { + throw new Error(`The AnnotationEditor is not enabled.`); + } + this.#annotationEditorUIManager.updateParams(type, value); + } + refresh(noUpdate = false, updateArgs = Object.create(null)) { + if (!this.pdfDocument) { + return; + } + for (const pageView of this._pages) { + pageView.update(updateArgs); + } + if (this.#scaleTimeoutId !== null) { + clearTimeout(this.#scaleTimeoutId); + this.#scaleTimeoutId = null; + } + if (!noUpdate) { + this.update(); + } + } +} + +;// CONCATENATED MODULE: ./web/secondary_toolbar.js + + +class SecondaryToolbar { + #opts; + constructor(options, eventBus) { + this.#opts = options; + const buttons = [{ + element: options.presentationModeButton, + eventName: "presentationmode", + close: true + }, { + element: options.printButton, + eventName: "print", + close: true + }, { + element: options.downloadButton, + eventName: "download", + close: true + }, { + element: options.viewBookmarkButton, + eventName: null, + close: true + }, { + element: options.firstPageButton, + eventName: "firstpage", + close: true + }, { + element: options.lastPageButton, + eventName: "lastpage", + close: true + }, { + element: options.pageRotateCwButton, + eventName: "rotatecw", + close: false + }, { + element: options.pageRotateCcwButton, + eventName: "rotateccw", + close: false + }, { + element: options.cursorSelectToolButton, + eventName: "switchcursortool", + eventDetails: { + tool: CursorTool.SELECT + }, + close: true + }, { + element: options.cursorHandToolButton, + eventName: "switchcursortool", + eventDetails: { + tool: CursorTool.HAND + }, + close: true + }, { + element: options.scrollPageButton, + eventName: "switchscrollmode", + eventDetails: { + mode: ScrollMode.PAGE + }, + close: true + }, { + element: options.scrollVerticalButton, + eventName: "switchscrollmode", + eventDetails: { + mode: ScrollMode.VERTICAL + }, + close: true + }, { + element: options.scrollHorizontalButton, + eventName: "switchscrollmode", + eventDetails: { + mode: ScrollMode.HORIZONTAL + }, + close: true + }, { + element: options.scrollWrappedButton, + eventName: "switchscrollmode", + eventDetails: { + mode: ScrollMode.WRAPPED + }, + close: true + }, { + element: options.spreadNoneButton, + eventName: "switchspreadmode", + eventDetails: { + mode: SpreadMode.NONE + }, + close: true + }, { + element: options.spreadOddButton, + eventName: "switchspreadmode", + eventDetails: { + mode: SpreadMode.ODD + }, + close: true + }, { + element: options.spreadEvenButton, + eventName: "switchspreadmode", + eventDetails: { + mode: SpreadMode.EVEN + }, + close: true + }, { + element: options.documentPropertiesButton, + eventName: "documentproperties", + close: true + }]; + buttons.push({ + element: options.openFileButton, + eventName: "openfile", + close: true + }); + this.eventBus = eventBus; + this.opened = false; + this.#bindListeners(buttons); + this.reset(); + } + get isOpen() { + return this.opened; + } + setPageNumber(pageNumber) { + this.pageNumber = pageNumber; + this.#updateUIState(); + } + setPagesCount(pagesCount) { + this.pagesCount = pagesCount; + this.#updateUIState(); + } + reset() { + this.pageNumber = 0; + this.pagesCount = 0; + this.#updateUIState(); + this.eventBus.dispatch("switchcursortool", { + source: this, + reset: true + }); + this.#scrollModeChanged({ + mode: ScrollMode.VERTICAL + }); + this.#spreadModeChanged({ + mode: SpreadMode.NONE + }); + } + #updateUIState() { + const { + firstPageButton, + lastPageButton, + pageRotateCwButton, + pageRotateCcwButton + } = this.#opts; + firstPageButton.disabled = this.pageNumber <= 1; + lastPageButton.disabled = this.pageNumber >= this.pagesCount; + pageRotateCwButton.disabled = this.pagesCount === 0; + pageRotateCcwButton.disabled = this.pagesCount === 0; + } + #bindListeners(buttons) { + const { + eventBus + } = this; + const { + toggleButton + } = this.#opts; + toggleButton.addEventListener("click", this.toggle.bind(this)); + for (const { + element, + eventName, + close, + eventDetails + } of buttons) { + element.addEventListener("click", evt => { + if (eventName !== null) { + eventBus.dispatch(eventName, { + source: this, + ...eventDetails + }); + } + if (close) { + this.close(); + } + eventBus.dispatch("reporttelemetry", { + source: this, + details: { + type: "buttons", + data: { + id: element.id + } + } + }); + }); + } + eventBus._on("cursortoolchanged", this.#cursorToolChanged.bind(this)); + eventBus._on("scrollmodechanged", this.#scrollModeChanged.bind(this)); + eventBus._on("spreadmodechanged", this.#spreadModeChanged.bind(this)); + } + #cursorToolChanged({ + tool + }) { + const { + cursorSelectToolButton, + cursorHandToolButton + } = this.#opts; + toggleCheckedBtn(cursorSelectToolButton, tool === CursorTool.SELECT); + toggleCheckedBtn(cursorHandToolButton, tool === CursorTool.HAND); + } + #scrollModeChanged({ + mode + }) { + const { + scrollPageButton, + scrollVerticalButton, + scrollHorizontalButton, + scrollWrappedButton, + spreadNoneButton, + spreadOddButton, + spreadEvenButton + } = this.#opts; + toggleCheckedBtn(scrollPageButton, mode === ScrollMode.PAGE); + toggleCheckedBtn(scrollVerticalButton, mode === ScrollMode.VERTICAL); + toggleCheckedBtn(scrollHorizontalButton, mode === ScrollMode.HORIZONTAL); + toggleCheckedBtn(scrollWrappedButton, mode === ScrollMode.WRAPPED); + const forceScrollModePage = this.pagesCount > PagesCountLimit.FORCE_SCROLL_MODE_PAGE; + scrollPageButton.disabled = forceScrollModePage; + scrollVerticalButton.disabled = forceScrollModePage; + scrollHorizontalButton.disabled = forceScrollModePage; + scrollWrappedButton.disabled = forceScrollModePage; + const isHorizontal = mode === ScrollMode.HORIZONTAL; + spreadNoneButton.disabled = isHorizontal; + spreadOddButton.disabled = isHorizontal; + spreadEvenButton.disabled = isHorizontal; + } + #spreadModeChanged({ + mode + }) { + const { + spreadNoneButton, + spreadOddButton, + spreadEvenButton + } = this.#opts; + toggleCheckedBtn(spreadNoneButton, mode === SpreadMode.NONE); + toggleCheckedBtn(spreadOddButton, mode === SpreadMode.ODD); + toggleCheckedBtn(spreadEvenButton, mode === SpreadMode.EVEN); + } + open() { + if (this.opened) { + return; + } + this.opened = true; + const { + toggleButton, + toolbar + } = this.#opts; + toggleExpandedBtn(toggleButton, true, toolbar); + } + close() { + if (!this.opened) { + return; + } + this.opened = false; + const { + toggleButton, + toolbar + } = this.#opts; + toggleExpandedBtn(toggleButton, false, toolbar); + } + toggle() { + if (this.opened) { + this.close(); + } else { + this.open(); + } + } +} + +;// CONCATENATED MODULE: ./web/toolbar.js + + +class Toolbar { + #opts; + constructor(options, eventBus) { + this.#opts = options; + this.eventBus = eventBus; + const buttons = [{ + element: options.previous, + eventName: "previouspage" + }, { + element: options.next, + eventName: "nextpage" + }, { + element: options.zoomIn, + eventName: "zoomin" + }, { + element: options.zoomOut, + eventName: "zoomout" + }, { + element: options.print, + eventName: "print" + }, { + element: options.download, + eventName: "download" + }, { + element: options.editorFreeTextButton, + eventName: "switchannotationeditormode", + eventDetails: { + get mode() { + const { + classList + } = options.editorFreeTextButton; + return classList.contains("toggled") ? AnnotationEditorType.NONE : AnnotationEditorType.FREETEXT; + } + } + }, { + element: options.editorHighlightButton, + eventName: "switchannotationeditormode", + eventDetails: { + get mode() { + const { + classList + } = options.editorHighlightButton; + return classList.contains("toggled") ? AnnotationEditorType.NONE : AnnotationEditorType.HIGHLIGHT; + } + } + }, { + element: options.editorInkButton, + eventName: "switchannotationeditormode", + eventDetails: { + get mode() { + const { + classList + } = options.editorInkButton; + return classList.contains("toggled") ? AnnotationEditorType.NONE : AnnotationEditorType.INK; + } + } + }, { + element: options.editorStampButton, + eventName: "switchannotationeditormode", + eventDetails: { + get mode() { + const { + classList + } = options.editorStampButton; + return classList.contains("toggled") ? AnnotationEditorType.NONE : AnnotationEditorType.STAMP; + } + } + }]; + this.#bindListeners(buttons); + if (options.editorHighlightColorPicker) { + eventBus._on("annotationeditoruimanager", ({ + uiManager + }) => { + this.#setAnnotationEditorUIManager(uiManager, options.editorHighlightColorPicker); + }, { + once: true + }); + } + eventBus._on("showannotationeditorui", ({ + mode + }) => { + switch (mode) { + case AnnotationEditorType.HIGHLIGHT: + options.editorHighlightButton.click(); + break; + } + }); + this.reset(); + } + #setAnnotationEditorUIManager(uiManager, parentContainer) { + const colorPicker = new ColorPicker({ + uiManager + }); + uiManager.setMainHighlightColorPicker(colorPicker); + parentContainer.append(colorPicker.renderMainDropdown()); + } + setPageNumber(pageNumber, pageLabel) { + this.pageNumber = pageNumber; + this.pageLabel = pageLabel; + this.#updateUIState(false); + } + setPagesCount(pagesCount, hasPageLabels) { + this.pagesCount = pagesCount; + this.hasPageLabels = hasPageLabels; + this.#updateUIState(true); + } + setPageScale(pageScaleValue, pageScale) { + this.pageScaleValue = (pageScaleValue || pageScale).toString(); + this.pageScale = pageScale; + this.#updateUIState(false); + } + reset() { + this.pageNumber = 0; + this.pageLabel = null; + this.hasPageLabels = false; + this.pagesCount = 0; + this.pageScaleValue = DEFAULT_SCALE_VALUE; + this.pageScale = DEFAULT_SCALE; + this.#updateUIState(true); + this.updateLoadingIndicatorState(); + this.#editorModeChanged({ + mode: AnnotationEditorType.DISABLE + }); + } + #bindListeners(buttons) { + const { + eventBus + } = this; + const { + pageNumber, + scaleSelect + } = this.#opts; + const self = this; + for (const { + element, + eventName, + eventDetails + } of buttons) { + element.addEventListener("click", evt => { + if (eventName !== null) { + eventBus.dispatch(eventName, { + source: this, + ...eventDetails, + isFromKeyboard: evt.detail === 0 + }); + } + }); + } + pageNumber.addEventListener("click", function () { + this.select(); + }); + pageNumber.addEventListener("change", function () { + eventBus.dispatch("pagenumberchanged", { + source: self, + value: this.value + }); + }); + scaleSelect.addEventListener("change", function () { + if (this.value === "custom") { + return; + } + eventBus.dispatch("scalechanged", { + source: self, + value: this.value + }); + }); + scaleSelect.addEventListener("click", function ({ + target + }) { + if (this.value === self.pageScaleValue && target.tagName.toUpperCase() === "OPTION") { + this.blur(); + } + }); + scaleSelect.oncontextmenu = noContextMenu; + eventBus._on("annotationeditormodechanged", this.#editorModeChanged.bind(this)); + } + #editorModeChanged({ + mode + }) { + const { + editorFreeTextButton, + editorFreeTextParamsToolbar, + editorHighlightButton, + editorHighlightParamsToolbar, + editorInkButton, + editorInkParamsToolbar, + editorStampButton, + editorStampParamsToolbar + } = this.#opts; + toggleCheckedBtn(editorFreeTextButton, mode === AnnotationEditorType.FREETEXT, editorFreeTextParamsToolbar); + toggleCheckedBtn(editorHighlightButton, mode === AnnotationEditorType.HIGHLIGHT, editorHighlightParamsToolbar); + toggleCheckedBtn(editorInkButton, mode === AnnotationEditorType.INK, editorInkParamsToolbar); + toggleCheckedBtn(editorStampButton, mode === AnnotationEditorType.STAMP, editorStampParamsToolbar); + const isDisable = mode === AnnotationEditorType.DISABLE; + editorFreeTextButton.disabled = isDisable; + editorHighlightButton.disabled = isDisable; + editorInkButton.disabled = isDisable; + editorStampButton.disabled = isDisable; + } + #updateUIState(resetNumPages = false) { + const { + pageNumber, + pagesCount, + pageScaleValue, + pageScale + } = this; + const opts = this.#opts; + if (resetNumPages) { + if (this.hasPageLabels) { + opts.pageNumber.type = "text"; + opts.numPages.setAttribute("data-l10n-id", "pdfjs-page-of-pages"); + } else { + opts.pageNumber.type = "number"; + opts.numPages.setAttribute("data-l10n-id", "pdfjs-of-pages"); + opts.numPages.setAttribute("data-l10n-args", JSON.stringify({ + pagesCount + })); + } + opts.pageNumber.max = pagesCount; + } + if (this.hasPageLabels) { + opts.pageNumber.value = this.pageLabel; + opts.numPages.setAttribute("data-l10n-args", JSON.stringify({ + pageNumber, + pagesCount + })); + } else { + opts.pageNumber.value = pageNumber; + } + opts.previous.disabled = pageNumber <= 1; + opts.next.disabled = pageNumber >= pagesCount; + opts.zoomOut.disabled = pageScale <= MIN_SCALE; + opts.zoomIn.disabled = pageScale >= MAX_SCALE; + let predefinedValueFound = false; + for (const option of opts.scaleSelect.options) { + if (option.value !== pageScaleValue) { + option.selected = false; + continue; + } + option.selected = true; + predefinedValueFound = true; + } + if (!predefinedValueFound) { + opts.customScaleOption.selected = true; + opts.customScaleOption.setAttribute("data-l10n-args", JSON.stringify({ + scale: Math.round(pageScale * 10000) / 100 + })); + } + } + updateLoadingIndicatorState(loading = false) { + const { + pageNumber + } = this.#opts; + pageNumber.classList.toggle("loading", loading); + } +} + +;// CONCATENATED MODULE: ./web/view_history.js +const DEFAULT_VIEW_HISTORY_CACHE_SIZE = 20; +class ViewHistory { + constructor(fingerprint, cacheSize = DEFAULT_VIEW_HISTORY_CACHE_SIZE) { + this.fingerprint = fingerprint; + this.cacheSize = cacheSize; + this._initializedPromise = this._readFromStorage().then(databaseStr => { + const database = JSON.parse(databaseStr || "{}"); + let index = -1; + if (!Array.isArray(database.files)) { + database.files = []; + } else { + while (database.files.length >= this.cacheSize) { + database.files.shift(); + } + for (let i = 0, ii = database.files.length; i < ii; i++) { + const branch = database.files[i]; + if (branch.fingerprint === this.fingerprint) { + index = i; + break; + } + } + } + if (index === -1) { + index = database.files.push({ + fingerprint: this.fingerprint + }) - 1; + } + this.file = database.files[index]; + this.database = database; + }); + } + async _writeToStorage() { + const databaseStr = JSON.stringify(this.database); + localStorage.setItem("pdfjs.history", databaseStr); + } + async _readFromStorage() { + return localStorage.getItem("pdfjs.history"); + } + async set(name, val) { + await this._initializedPromise; + this.file[name] = val; + return this._writeToStorage(); + } + async setMultiple(properties) { + await this._initializedPromise; + for (const name in properties) { + this.file[name] = properties[name]; + } + return this._writeToStorage(); + } + async get(name, defaultValue) { + await this._initializedPromise; + const val = this.file[name]; + return val !== undefined ? val : defaultValue; + } + async getMultiple(properties) { + await this._initializedPromise; + const values = Object.create(null); + for (const name in properties) { + const val = this.file[name]; + values[name] = val !== undefined ? val : properties[name]; + } + return values; + } +} + +;// CONCATENATED MODULE: ./web/app.js + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +const FORCE_PAGES_LOADED_TIMEOUT = 10000; +const WHEEL_ZOOM_DISABLED_TIMEOUT = 1000; +const ViewOnLoad = { + UNKNOWN: -1, + PREVIOUS: 0, + INITIAL: 1 +}; +const PDFViewerApplication = { + initialBookmark: document.location.hash.substring(1), + _initializedCapability: { + ...Promise.withResolvers(), + settled: false + }, + appConfig: null, + pdfDocument: null, + pdfLoadingTask: null, + printService: null, + pdfViewer: null, + pdfThumbnailViewer: null, + pdfRenderingQueue: null, + pdfPresentationMode: null, + pdfDocumentProperties: null, + pdfLinkService: null, + pdfHistory: null, + pdfSidebar: null, + pdfOutlineViewer: null, + pdfAttachmentViewer: null, + pdfLayerViewer: null, + pdfCursorTools: null, + pdfScriptingManager: null, + store: null, + downloadManager: null, + overlayManager: null, + preferences: null, + toolbar: null, + secondaryToolbar: null, + eventBus: null, + l10n: null, + annotationEditorParams: null, + isInitialViewSet: false, + downloadComplete: false, + isViewerEmbedded: window.parent !== window, + url: "", + baseUrl: "", + _downloadUrl: "", + _eventBusAbortController: null, + _windowAbortController: null, + documentInfo: null, + metadata: null, + _contentDispositionFilename: null, + _contentLength: null, + _saveInProgress: false, + _wheelUnusedTicks: 0, + _wheelUnusedFactor: 1, + _touchUnusedTicks: 0, + _touchUnusedFactor: 1, + _PDFBug: null, + _hasAnnotationEditors: false, + _title: document.title, + _printAnnotationStoragePromise: null, + _touchInfo: null, + _isCtrlKeyDown: false, + _nimbusDataPromise: null, + _caretBrowsing: null, + _isScrolling: false, + async initialize(appConfig) { + let l10nPromise; + this.appConfig = appConfig; + try { + await this.preferences.initializedPromise; + } catch (ex) { + console.error(`initialize: "${ex.message}".`); + } + if (AppOptions.get("pdfBugEnabled")) { + await this._parseHashParams(); + } + let mode; + switch (AppOptions.get("viewerCssTheme")) { + case 1: + mode = "is-light"; + break; + case 2: + mode = "is-dark"; + break; + } + if (mode) { + document.documentElement.classList.add(mode); + } + l10nPromise = this.externalServices.createL10n(); + this.l10n = await l10nPromise; + document.getElementsByTagName("html")[0].dir = this.l10n.getDirection(); + this.l10n.translate(appConfig.appContainer || document.documentElement); + if (this.isViewerEmbedded && AppOptions.get("externalLinkTarget") === LinkTarget.NONE) { + AppOptions.set("externalLinkTarget", LinkTarget.TOP); + } + await this._initializeViewerComponents(); + this.bindEvents(); + this.bindWindowEvents(); + this._initializedCapability.settled = true; + this._initializedCapability.resolve(); + }, + async _parseHashParams() { + const hash = document.location.hash.substring(1); + if (!hash) { + return; + } + const { + mainContainer, + viewerContainer + } = this.appConfig, + params = parseQueryString(hash); + const loadPDFBug = async () => { + if (this._PDFBug) { + return; + } + const { + PDFBug + } = await import( /*webpackIgnore: true*/AppOptions.get("debuggerSrc")); + this._PDFBug = PDFBug; + }; + if (params.get("disableworker") === "true") { + try { + GlobalWorkerOptions.workerSrc ||= AppOptions.get("workerSrc"); + await import( /*webpackIgnore: true*/PDFWorker.workerSrc); + } catch (ex) { + console.error(`_parseHashParams: "${ex.message}".`); + } + } + if (params.has("disablerange")) { + AppOptions.set("disableRange", params.get("disablerange") === "true"); + } + if (params.has("disablestream")) { + AppOptions.set("disableStream", params.get("disablestream") === "true"); + } + if (params.has("disableautofetch")) { + AppOptions.set("disableAutoFetch", params.get("disableautofetch") === "true"); + } + if (params.has("disablefontface")) { + AppOptions.set("disableFontFace", params.get("disablefontface") === "true"); + } + if (params.has("disablehistory")) { + AppOptions.set("disableHistory", params.get("disablehistory") === "true"); + } + if (params.has("verbosity")) { + AppOptions.set("verbosity", params.get("verbosity") | 0); + } + if (params.has("textlayer")) { + switch (params.get("textlayer")) { + case "off": + AppOptions.set("textLayerMode", TextLayerMode.DISABLE); + break; + case "visible": + case "shadow": + case "hover": + viewerContainer.classList.add(`textLayer-${params.get("textlayer")}`); + try { + await loadPDFBug(); + this._PDFBug.loadCSS(); + } catch (ex) { + console.error(`_parseHashParams: "${ex.message}".`); + } + break; + } + } + if (params.has("pdfbug")) { + AppOptions.setAll({ + pdfBug: true, + fontExtraProperties: true + }); + const enabled = params.get("pdfbug").split(","); + try { + await loadPDFBug(); + this._PDFBug.init(mainContainer, enabled); + } catch (ex) { + console.error(`_parseHashParams: "${ex.message}".`); + } + } + if (params.has("locale")) { + AppOptions.set("locale", params.get("locale")); + } + }, + async _initializeViewerComponents() { + const { + appConfig, + externalServices, + l10n + } = this; + const eventBus = AppOptions.get("isInAutomation") ? new AutomationEventBus() : new EventBus(); + this.eventBus = eventBus; + this.overlayManager = new OverlayManager(); + const pdfRenderingQueue = new PDFRenderingQueue(); + pdfRenderingQueue.onIdle = this._cleanup.bind(this); + this.pdfRenderingQueue = pdfRenderingQueue; + const pdfLinkService = new PDFLinkService({ + eventBus, + externalLinkTarget: AppOptions.get("externalLinkTarget"), + externalLinkRel: AppOptions.get("externalLinkRel"), + ignoreDestinationZoom: AppOptions.get("ignoreDestinationZoom") + }); + this.pdfLinkService = pdfLinkService; + const downloadManager = this.downloadManager = new DownloadManager(); + const findController = new PDFFindController({ + linkService: pdfLinkService, + eventBus, + updateMatchesCountOnProgress: true + }); + this.findController = findController; + const pdfScriptingManager = new PDFScriptingManager({ + eventBus, + externalServices, + docProperties: this._scriptingDocProperties.bind(this) + }); + this.pdfScriptingManager = pdfScriptingManager; + const container = appConfig.mainContainer, + viewer = appConfig.viewerContainer; + const annotationEditorMode = AppOptions.get("annotationEditorMode"); + const pageColors = AppOptions.get("forcePageColors") || window.matchMedia("(forced-colors: active)").matches ? { + background: AppOptions.get("pageColorsBackground"), + foreground: AppOptions.get("pageColorsForeground") + } : null; + const altTextManager = appConfig.altTextDialog ? new AltTextManager(appConfig.altTextDialog, container, this.overlayManager, eventBus) : null; + const pdfViewer = new PDFViewer({ + container, + viewer, + eventBus, + renderingQueue: pdfRenderingQueue, + linkService: pdfLinkService, + downloadManager, + altTextManager, + findController, + scriptingManager: AppOptions.get("enableScripting") && pdfScriptingManager, + l10n, + textLayerMode: AppOptions.get("textLayerMode"), + annotationMode: AppOptions.get("annotationMode"), + annotationEditorMode, + annotationEditorHighlightColors: AppOptions.get("highlightEditorColors"), + enableHighlightFloatingButton: AppOptions.get("enableHighlightFloatingButton"), + imageResourcesPath: AppOptions.get("imageResourcesPath"), + enablePrintAutoRotate: AppOptions.get("enablePrintAutoRotate"), + maxCanvasPixels: AppOptions.get("maxCanvasPixels"), + enablePermissions: AppOptions.get("enablePermissions"), + pageColors, + mlManager: this.mlManager + }); + this.pdfViewer = pdfViewer; + pdfRenderingQueue.setViewer(pdfViewer); + pdfLinkService.setViewer(pdfViewer); + pdfScriptingManager.setViewer(pdfViewer); + if (appConfig.sidebar?.thumbnailView) { + this.pdfThumbnailViewer = new PDFThumbnailViewer({ + container: appConfig.sidebar.thumbnailView, + eventBus, + renderingQueue: pdfRenderingQueue, + linkService: pdfLinkService, + pageColors + }); + pdfRenderingQueue.setThumbnailViewer(this.pdfThumbnailViewer); + } + if (!this.isViewerEmbedded && !AppOptions.get("disableHistory")) { + this.pdfHistory = new PDFHistory({ + linkService: pdfLinkService, + eventBus + }); + pdfLinkService.setHistory(this.pdfHistory); + } + if (!this.supportsIntegratedFind && appConfig.findBar) { + this.findBar = new PDFFindBar(appConfig.findBar, eventBus); + } + if (appConfig.annotationEditorParams) { + if (annotationEditorMode !== AnnotationEditorType.DISABLE) { + if (AppOptions.get("enableStampEditor")) { + appConfig.toolbar?.editorStampButton?.classList.remove("hidden"); + } + const editorHighlightButton = appConfig.toolbar?.editorHighlightButton; + if (editorHighlightButton && AppOptions.get("enableHighlightEditor")) { + editorHighlightButton.hidden = false; + } + this.annotationEditorParams = new AnnotationEditorParams(appConfig.annotationEditorParams, eventBus); + } else { + for (const id of ["editorModeButtons", "editorModeSeparator"]) { + document.getElementById(id)?.classList.add("hidden"); + } + } + } + if (appConfig.documentProperties) { + this.pdfDocumentProperties = new PDFDocumentProperties(appConfig.documentProperties, this.overlayManager, eventBus, l10n, () => this._docFilename); + } + if (appConfig.secondaryToolbar?.cursorHandToolButton) { + this.pdfCursorTools = new PDFCursorTools({ + container, + eventBus, + cursorToolOnLoad: AppOptions.get("cursorToolOnLoad") + }); + } + if (appConfig.toolbar) { + this.toolbar = new Toolbar(appConfig.toolbar, eventBus); + } + if (appConfig.secondaryToolbar) { + this.secondaryToolbar = new SecondaryToolbar(appConfig.secondaryToolbar, eventBus); + } + if (this.supportsFullscreen && appConfig.secondaryToolbar?.presentationModeButton) { + this.pdfPresentationMode = new PDFPresentationMode({ + container, + pdfViewer, + eventBus + }); + } + if (appConfig.passwordOverlay) { + this.passwordPrompt = new PasswordPrompt(appConfig.passwordOverlay, this.overlayManager, this.isViewerEmbedded); + } + if (appConfig.sidebar?.outlineView) { + this.pdfOutlineViewer = new PDFOutlineViewer({ + container: appConfig.sidebar.outlineView, + eventBus, + l10n, + linkService: pdfLinkService, + downloadManager + }); + } + if (appConfig.sidebar?.attachmentsView) { + this.pdfAttachmentViewer = new PDFAttachmentViewer({ + container: appConfig.sidebar.attachmentsView, + eventBus, + l10n, + downloadManager + }); + } + if (appConfig.sidebar?.layersView) { + this.pdfLayerViewer = new PDFLayerViewer({ + container: appConfig.sidebar.layersView, + eventBus, + l10n + }); + } + if (appConfig.sidebar) { + this.pdfSidebar = new PDFSidebar({ + elements: appConfig.sidebar, + eventBus, + l10n + }); + this.pdfSidebar.onToggled = this.forceRendering.bind(this); + this.pdfSidebar.onUpdateThumbnails = () => { + for (const pageView of pdfViewer.getCachedPageViews()) { + if (pageView.renderingState === RenderingStates.FINISHED) { + this.pdfThumbnailViewer.getThumbnail(pageView.id - 1)?.setImage(pageView); + } + } + this.pdfThumbnailViewer.scrollThumbnailIntoView(pdfViewer.currentPageNumber); + }; + } + }, + async run(config) { + this.preferences = new Preferences(); + await this.initialize(config); + const { + appConfig, + eventBus + } = this; + let file; + const queryString = document.location.search.substring(1); + const params = parseQueryString(queryString); + file = params.get("file") ?? AppOptions.get("defaultUrl"); + validateFileURL(file); + const fileInput = this._openFileInput = document.createElement("input"); + fileInput.id = "fileInput"; + fileInput.hidden = true; + fileInput.type = "file"; + fileInput.value = null; + document.body.append(fileInput); + fileInput.addEventListener("change", function (evt) { + const { + files + } = evt.target; + if (!files || files.length === 0) { + return; + } + eventBus.dispatch("fileinputchange", { + source: this, + fileInput: evt.target + }); + }); + appConfig.mainContainer.addEventListener("dragover", function (evt) { + evt.preventDefault(); + evt.dataTransfer.dropEffect = evt.dataTransfer.effectAllowed === "copy" ? "copy" : "move"; + }); + appConfig.mainContainer.addEventListener("drop", function (evt) { + evt.preventDefault(); + const { + files + } = evt.dataTransfer; + if (!files || files.length === 0) { + return; + } + eventBus.dispatch("fileinputchange", { + source: this, + fileInput: evt.dataTransfer + }); + }); + if (!AppOptions.get("supportsDocumentFonts")) { + AppOptions.set("disableFontFace", true); + this.l10n.get("pdfjs-web-fonts-disabled").then(msg => { + console.warn(msg); + }); + } + if (!this.supportsPrinting) { + appConfig.toolbar?.print?.classList.add("hidden"); + appConfig.secondaryToolbar?.printButton.classList.add("hidden"); + } + if (!this.supportsFullscreen) { + appConfig.secondaryToolbar?.presentationModeButton.classList.add("hidden"); + } + if (this.supportsIntegratedFind) { + appConfig.toolbar?.viewFind?.classList.add("hidden"); + } + if (file) { + this.open({ + url: file + }); + } else { + this._hideViewBookmark(); + } + }, + get externalServices() { + return shadow(this, "externalServices", new ExternalServices()); + }, + get mlManager() { + return shadow(this, "mlManager", AppOptions.get("enableML") === true ? new MLManager() : null); + }, + get initialized() { + return this._initializedCapability.settled; + }, + get initializedPromise() { + return this._initializedCapability.promise; + }, + updateZoom(steps, scaleFactor, origin) { + if (this.pdfViewer.isInPresentationMode) { + return; + } + this.pdfViewer.updateScale({ + drawingDelay: AppOptions.get("defaultZoomDelay"), + steps, + scaleFactor, + origin + }); + }, + zoomIn() { + this.updateZoom(1); + }, + zoomOut() { + this.updateZoom(-1); + }, + zoomReset() { + if (this.pdfViewer.isInPresentationMode) { + return; + } + this.pdfViewer.currentScaleValue = DEFAULT_SCALE_VALUE; + }, + get pagesCount() { + return this.pdfDocument ? this.pdfDocument.numPages : 0; + }, + get page() { + return this.pdfViewer.currentPageNumber; + }, + set page(val) { + this.pdfViewer.currentPageNumber = val; + }, + get supportsPrinting() { + return PDFPrintServiceFactory.supportsPrinting; + }, + get supportsFullscreen() { + return shadow(this, "supportsFullscreen", document.fullscreenEnabled); + }, + get supportsPinchToZoom() { + return shadow(this, "supportsPinchToZoom", AppOptions.get("supportsPinchToZoom")); + }, + get supportsIntegratedFind() { + return shadow(this, "supportsIntegratedFind", AppOptions.get("supportsIntegratedFind")); + }, + get loadingBar() { + const barElement = document.getElementById("loadingBar"); + const bar = barElement ? new ProgressBar(barElement) : null; + return shadow(this, "loadingBar", bar); + }, + get supportsMouseWheelZoomCtrlKey() { + return shadow(this, "supportsMouseWheelZoomCtrlKey", AppOptions.get("supportsMouseWheelZoomCtrlKey")); + }, + get supportsMouseWheelZoomMetaKey() { + return shadow(this, "supportsMouseWheelZoomMetaKey", AppOptions.get("supportsMouseWheelZoomMetaKey")); + }, + get supportsCaretBrowsingMode() { + return AppOptions.get("supportsCaretBrowsingMode"); + }, + moveCaret(isUp, select) { + this._caretBrowsing ||= new CaretBrowsingMode(this.appConfig.mainContainer, this.appConfig.viewerContainer, this.appConfig.toolbar?.container); + this._caretBrowsing.moveCaret(isUp, select); + }, + setTitleUsingUrl(url = "", downloadUrl = null) { + this.url = url; + this.baseUrl = url.split("#", 1)[0]; + if (downloadUrl) { + this._downloadUrl = downloadUrl === url ? this.baseUrl : downloadUrl.split("#", 1)[0]; + } + if (isDataScheme(url)) { + this._hideViewBookmark(); + } + let title = pdfjs_getPdfFilenameFromUrl(url, ""); + if (!title) { + try { + title = decodeURIComponent(getFilenameFromUrl(url)) || url; + } catch { + title = url; + } + } + this.setTitle(title); + }, + setTitle(title = this._title) { + this._title = title; + if (this.isViewerEmbedded) { + return; + } + const editorIndicator = this._hasAnnotationEditors && !this.pdfRenderingQueue.printing; + document.title = `${editorIndicator ? "* " : ""}${title}`; + }, + get _docFilename() { + return this._contentDispositionFilename || pdfjs_getPdfFilenameFromUrl(this.url); + }, + _hideViewBookmark() { + const { + secondaryToolbar + } = this.appConfig; + secondaryToolbar?.viewBookmarkButton.classList.add("hidden"); + if (secondaryToolbar?.presentationModeButton.classList.contains("hidden")) { + document.getElementById("viewBookmarkSeparator")?.classList.add("hidden"); + } + }, + async close() { + this._unblockDocumentLoadEvent(); + this._hideViewBookmark(); + if (!this.pdfLoadingTask) { + return; + } + if (this.pdfDocument?.annotationStorage.size > 0 && this._annotationStorageModified) { + try { + await this.save(); + } catch {} + } + const promises = []; + promises.push(this.pdfLoadingTask.destroy()); + this.pdfLoadingTask = null; + if (this.pdfDocument) { + this.pdfDocument = null; + this.pdfThumbnailViewer?.setDocument(null); + this.pdfViewer.setDocument(null); + this.pdfLinkService.setDocument(null); + this.pdfDocumentProperties?.setDocument(null); + } + this.pdfLinkService.externalLinkEnabled = true; + this.store = null; + this.isInitialViewSet = false; + this.downloadComplete = false; + this.url = ""; + this.baseUrl = ""; + this._downloadUrl = ""; + this.documentInfo = null; + this.metadata = null; + this._contentDispositionFilename = null; + this._contentLength = null; + this._saveInProgress = false; + this._hasAnnotationEditors = false; + promises.push(this.pdfScriptingManager.destroyPromise, this.passwordPrompt.close()); + this.setTitle(); + this.pdfSidebar?.reset(); + this.pdfOutlineViewer?.reset(); + this.pdfAttachmentViewer?.reset(); + this.pdfLayerViewer?.reset(); + this.pdfHistory?.reset(); + this.findBar?.reset(); + this.toolbar?.reset(); + this.secondaryToolbar?.reset(); + this._PDFBug?.cleanup(); + await Promise.all(promises); + }, + async open(args) { + if (this.pdfLoadingTask) { + await this.close(); + } + const workerParams = AppOptions.getAll(OptionKind.WORKER); + Object.assign(GlobalWorkerOptions, workerParams); + if (args.url) { + this.setTitleUsingUrl(args.originalUrl || args.url, args.url); + } + const apiParams = AppOptions.getAll(OptionKind.API); + const loadingTask = getDocument({ + ...apiParams, + ...args + }); + this.pdfLoadingTask = loadingTask; + loadingTask.onPassword = (updateCallback, reason) => { + if (this.isViewerEmbedded) { + this._unblockDocumentLoadEvent(); + } + this.pdfLinkService.externalLinkEnabled = false; + this.passwordPrompt.setUpdateCallback(updateCallback, reason); + this.passwordPrompt.open(); + }; + loadingTask.onProgress = ({ + loaded, + total + }) => { + this.progress(loaded / total); + }; + return loadingTask.promise.then(pdfDocument => { + this.load(pdfDocument); + }, reason => { + if (loadingTask !== this.pdfLoadingTask) { + return undefined; + } + let key = "pdfjs-loading-error"; + if (reason instanceof InvalidPDFException) { + key = "pdfjs-invalid-file-error"; + } else if (reason instanceof MissingPDFException) { + key = "pdfjs-missing-file-error"; + } else if (reason instanceof UnexpectedResponseException) { + key = "pdfjs-unexpected-response-error"; + } + return this._documentError(key, { + message: reason.message + }).then(() => { + throw reason; + }); + }); + }, + _ensureDownloadComplete() { + if (this.pdfDocument && this.downloadComplete) { + return; + } + throw new Error("PDF document not downloaded."); + }, + async download(options = {}) { + const url = this._downloadUrl, + filename = this._docFilename; + try { + this._ensureDownloadComplete(); + const data = await this.pdfDocument.getData(); + const blob = new Blob([data], { + type: "application/pdf" + }); + await this.downloadManager.download(blob, url, filename, options); + } catch { + await this.downloadManager.downloadUrl(url, filename, options); + } + }, + async save(options = {}) { + if (this._saveInProgress) { + return; + } + this._saveInProgress = true; + await this.pdfScriptingManager.dispatchWillSave(); + const url = this._downloadUrl, + filename = this._docFilename; + try { + this._ensureDownloadComplete(); + const data = await this.pdfDocument.saveDocument(); + const blob = new Blob([data], { + type: "application/pdf" + }); + await this.downloadManager.download(blob, url, filename, options); + } catch (reason) { + console.error(`Error when saving the document: ${reason.message}`); + await this.download(options); + } finally { + await this.pdfScriptingManager.dispatchDidSave(); + this._saveInProgress = false; + } + if (this._hasAnnotationEditors) { + this.externalServices.reportTelemetry({ + type: "editing", + data: { + type: "save", + stats: this.pdfDocument?.annotationStorage.editorStats + } + }); + } + }, + downloadOrSave(options = {}) { + if (this.pdfDocument?.annotationStorage.size > 0) { + this.save(options); + } else { + this.download(options); + } + }, + async _documentError(key, moreInfo = null) { + this._unblockDocumentLoadEvent(); + const message = await this._otherError(key || "pdfjs-loading-error", moreInfo); + this.eventBus.dispatch("documenterror", { + source: this, + message, + reason: moreInfo?.message ?? null + }); + }, + async _otherError(key, moreInfo = null) { + const message = await this.l10n.get(key); + const moreInfoText = [`PDF.js v${version || "?"} (build: ${build || "?"})`]; + if (moreInfo) { + moreInfoText.push(`Message: ${moreInfo.message}`); + if (moreInfo.stack) { + moreInfoText.push(`Stack: ${moreInfo.stack}`); + } else { + if (moreInfo.filename) { + moreInfoText.push(`File: ${moreInfo.filename}`); + } + if (moreInfo.lineNumber) { + moreInfoText.push(`Line: ${moreInfo.lineNumber}`); + } + } + } + console.error(`${message}\n\n${moreInfoText.join("\n")}`); + return message; + }, + progress(level) { + if (!this.loadingBar || this.downloadComplete) { + return; + } + const percent = Math.round(level * 100); + if (percent <= this.loadingBar.percent) { + return; + } + this.loadingBar.percent = percent; + if (this.pdfDocument?.loadingParams.disableAutoFetch ?? AppOptions.get("disableAutoFetch")) { + this.loadingBar.setDisableAutoFetch(); + } + }, + load(pdfDocument) { + this.pdfDocument = pdfDocument; + pdfDocument.getDownloadInfo().then(({ + length + }) => { + this._contentLength = length; + this.downloadComplete = true; + this.loadingBar?.hide(); + firstPagePromise.then(() => { + this.eventBus.dispatch("documentloaded", { + source: this + }); + }); + }); + const pageLayoutPromise = pdfDocument.getPageLayout().catch(() => {}); + const pageModePromise = pdfDocument.getPageMode().catch(() => {}); + const openActionPromise = pdfDocument.getOpenAction().catch(() => {}); + this.toolbar?.setPagesCount(pdfDocument.numPages, false); + this.secondaryToolbar?.setPagesCount(pdfDocument.numPages); + this.pdfLinkService.setDocument(pdfDocument); + this.pdfDocumentProperties?.setDocument(pdfDocument); + const pdfViewer = this.pdfViewer; + pdfViewer.setDocument(pdfDocument); + const { + firstPagePromise, + onePageRendered, + pagesPromise + } = pdfViewer; + this.pdfThumbnailViewer?.setDocument(pdfDocument); + const storedPromise = (this.store = new ViewHistory(pdfDocument.fingerprints[0])).getMultiple({ + page: null, + zoom: DEFAULT_SCALE_VALUE, + scrollLeft: "0", + scrollTop: "0", + rotation: null, + sidebarView: SidebarView.UNKNOWN, + scrollMode: ScrollMode.UNKNOWN, + spreadMode: SpreadMode.UNKNOWN + }).catch(() => {}); + firstPagePromise.then(pdfPage => { + this.loadingBar?.setWidth(this.appConfig.viewerContainer); + this._initializeAnnotationStorageCallbacks(pdfDocument); + Promise.all([animationStarted, storedPromise, pageLayoutPromise, pageModePromise, openActionPromise]).then(async ([timeStamp, stored, pageLayout, pageMode, openAction]) => { + const viewOnLoad = AppOptions.get("viewOnLoad"); + this._initializePdfHistory({ + fingerprint: pdfDocument.fingerprints[0], + viewOnLoad, + initialDest: openAction?.dest + }); + const initialBookmark = this.initialBookmark; + const zoom = AppOptions.get("defaultZoomValue"); + let hash = zoom ? `zoom=${zoom}` : null; + let rotation = null; + let sidebarView = AppOptions.get("sidebarViewOnLoad"); + let scrollMode = AppOptions.get("scrollModeOnLoad"); + let spreadMode = AppOptions.get("spreadModeOnLoad"); + if (stored?.page && viewOnLoad !== ViewOnLoad.INITIAL) { + hash = `page=${stored.page}&zoom=${zoom || stored.zoom},` + `${stored.scrollLeft},${stored.scrollTop}`; + rotation = parseInt(stored.rotation, 10); + if (sidebarView === SidebarView.UNKNOWN) { + sidebarView = stored.sidebarView | 0; + } + if (scrollMode === ScrollMode.UNKNOWN) { + scrollMode = stored.scrollMode | 0; + } + if (spreadMode === SpreadMode.UNKNOWN) { + spreadMode = stored.spreadMode | 0; + } + } + if (pageMode && sidebarView === SidebarView.UNKNOWN) { + sidebarView = apiPageModeToSidebarView(pageMode); + } + if (pageLayout && scrollMode === ScrollMode.UNKNOWN && spreadMode === SpreadMode.UNKNOWN) { + const modes = apiPageLayoutToViewerModes(pageLayout); + spreadMode = modes.spreadMode; + } + this.setInitialView(hash, { + rotation, + sidebarView, + scrollMode, + spreadMode + }); + this.eventBus.dispatch("documentinit", { + source: this + }); + if (!this.isViewerEmbedded) { + pdfViewer.focus(); + } + await Promise.race([pagesPromise, new Promise(resolve => { + setTimeout(resolve, FORCE_PAGES_LOADED_TIMEOUT); + })]); + if (!initialBookmark && !hash) { + return; + } + if (pdfViewer.hasEqualPageSizes) { + return; + } + this.initialBookmark = initialBookmark; + pdfViewer.currentScaleValue = pdfViewer.currentScaleValue; + this.setInitialView(hash); + }).catch(() => { + this.setInitialView(); + }).then(function () { + pdfViewer.update(); + }); + }); + pagesPromise.then(() => { + this._unblockDocumentLoadEvent(); + this._initializeAutoPrint(pdfDocument, openActionPromise); + }, reason => { + this._documentError("pdfjs-loading-error", { + message: reason.message + }); + }); + onePageRendered.then(data => { + this.externalServices.reportTelemetry({ + type: "pageInfo", + timestamp: data.timestamp + }); + if (this.pdfOutlineViewer) { + pdfDocument.getOutline().then(outline => { + if (pdfDocument !== this.pdfDocument) { + return; + } + this.pdfOutlineViewer.render({ + outline, + pdfDocument + }); + }); + } + if (this.pdfAttachmentViewer) { + pdfDocument.getAttachments().then(attachments => { + if (pdfDocument !== this.pdfDocument) { + return; + } + this.pdfAttachmentViewer.render({ + attachments + }); + }); + } + if (this.pdfLayerViewer) { + pdfViewer.optionalContentConfigPromise.then(optionalContentConfig => { + if (pdfDocument !== this.pdfDocument) { + return; + } + this.pdfLayerViewer.render({ + optionalContentConfig, + pdfDocument + }); + }); + } + }); + this._initializePageLabels(pdfDocument); + this._initializeMetadata(pdfDocument); + }, + async _scriptingDocProperties(pdfDocument) { + if (!this.documentInfo) { + await new Promise(resolve => { + this.eventBus._on("metadataloaded", resolve, { + once: true + }); + }); + if (pdfDocument !== this.pdfDocument) { + return null; + } + } + if (!this._contentLength) { + await new Promise(resolve => { + this.eventBus._on("documentloaded", resolve, { + once: true + }); + }); + if (pdfDocument !== this.pdfDocument) { + return null; + } + } + return { + ...this.documentInfo, + baseURL: this.baseUrl, + filesize: this._contentLength, + filename: this._docFilename, + metadata: this.metadata?.getRaw(), + authors: this.metadata?.get("dc:creator"), + numPages: this.pagesCount, + URL: this.url + }; + }, + async _initializeAutoPrint(pdfDocument, openActionPromise) { + const [openAction, jsActions] = await Promise.all([openActionPromise, this.pdfViewer.enableScripting ? null : pdfDocument.getJSActions()]); + if (pdfDocument !== this.pdfDocument) { + return; + } + let triggerAutoPrint = openAction?.action === "Print"; + if (jsActions) { + console.warn("Warning: JavaScript support is not enabled"); + for (const name in jsActions) { + if (triggerAutoPrint) { + break; + } + switch (name) { + case "WillClose": + case "WillSave": + case "DidSave": + case "WillPrint": + case "DidPrint": + continue; + } + triggerAutoPrint = jsActions[name].some(js => AutoPrintRegExp.test(js)); + } + } + if (triggerAutoPrint) { + this.triggerPrinting(); + } + }, + async _initializeMetadata(pdfDocument) { + const { + info, + metadata, + contentDispositionFilename, + contentLength + } = await pdfDocument.getMetadata(); + if (pdfDocument !== this.pdfDocument) { + return; + } + this.documentInfo = info; + this.metadata = metadata; + this._contentDispositionFilename ??= contentDispositionFilename; + this._contentLength ??= contentLength; + console.log(`PDF ${pdfDocument.fingerprints[0]} [${info.PDFFormatVersion} ` + `${(info.Producer || "-").trim()} / ${(info.Creator || "-").trim()}] ` + `(PDF.js: ${version || "?"} [${build || "?"}])`); + let pdfTitle = info.Title; + const metadataTitle = metadata?.get("dc:title"); + if (metadataTitle) { + if (metadataTitle !== "Untitled" && !/[\uFFF0-\uFFFF]/g.test(metadataTitle)) { + pdfTitle = metadataTitle; + } + } + if (pdfTitle) { + this.setTitle(`${pdfTitle} - ${this._contentDispositionFilename || this._title}`); + } else if (this._contentDispositionFilename) { + this.setTitle(this._contentDispositionFilename); + } + if (info.IsXFAPresent && !info.IsAcroFormPresent && !pdfDocument.isPureXfa) { + if (pdfDocument.loadingParams.enableXfa) { + console.warn("Warning: XFA Foreground documents are not supported"); + } else { + console.warn("Warning: XFA support is not enabled"); + } + } else if ((info.IsAcroFormPresent || info.IsXFAPresent) && !this.pdfViewer.renderForms) { + console.warn("Warning: Interactive form support is not enabled"); + } + if (info.IsSignaturesPresent) { + console.warn("Warning: Digital signatures validation is not supported"); + } + this.eventBus.dispatch("metadataloaded", { + source: this + }); + }, + async _initializePageLabels(pdfDocument) { + const labels = await pdfDocument.getPageLabels(); + if (pdfDocument !== this.pdfDocument) { + return; + } + if (!labels || AppOptions.get("disablePageLabels")) { + return; + } + const numLabels = labels.length; + let standardLabels = 0, + emptyLabels = 0; + for (let i = 0; i < numLabels; i++) { + const label = labels[i]; + if (label === (i + 1).toString()) { + standardLabels++; + } else if (label === "") { + emptyLabels++; + } else { + break; + } + } + if (standardLabels >= numLabels || emptyLabels >= numLabels) { + return; + } + const { + pdfViewer, + pdfThumbnailViewer, + toolbar + } = this; + pdfViewer.setPageLabels(labels); + pdfThumbnailViewer?.setPageLabels(labels); + toolbar?.setPagesCount(numLabels, true); + toolbar?.setPageNumber(pdfViewer.currentPageNumber, pdfViewer.currentPageLabel); + }, + _initializePdfHistory({ + fingerprint, + viewOnLoad, + initialDest = null + }) { + if (!this.pdfHistory) { + return; + } + this.pdfHistory.initialize({ + fingerprint, + resetHistory: viewOnLoad === ViewOnLoad.INITIAL, + updateUrl: AppOptions.get("historyUpdateUrl") + }); + if (this.pdfHistory.initialBookmark) { + this.initialBookmark = this.pdfHistory.initialBookmark; + this.initialRotation = this.pdfHistory.initialRotation; + } + if (initialDest && !this.initialBookmark && viewOnLoad === ViewOnLoad.UNKNOWN) { + this.initialBookmark = JSON.stringify(initialDest); + this.pdfHistory.push({ + explicitDest: initialDest, + pageNumber: null + }); + } + }, + _initializeAnnotationStorageCallbacks(pdfDocument) { + if (pdfDocument !== this.pdfDocument) { + return; + } + const { + annotationStorage + } = pdfDocument; + annotationStorage.onSetModified = () => { + window.addEventListener("beforeunload", beforeUnload); + this._annotationStorageModified = true; + }; + annotationStorage.onResetModified = () => { + window.removeEventListener("beforeunload", beforeUnload); + delete this._annotationStorageModified; + }; + annotationStorage.onAnnotationEditor = typeStr => { + this._hasAnnotationEditors = !!typeStr; + this.setTitle(); + }; + }, + setInitialView(storedHash, { + rotation, + sidebarView, + scrollMode, + spreadMode + } = {}) { + const setRotation = angle => { + if (isValidRotation(angle)) { + this.pdfViewer.pagesRotation = angle; + } + }; + const setViewerModes = (scroll, spread) => { + if (isValidScrollMode(scroll)) { + this.pdfViewer.scrollMode = scroll; + } + if (isValidSpreadMode(spread)) { + //默认双页 + // this.pdfViewer.spreadMode = spread; + this.pdfViewer.spreadMode = 1; + } + }; + this.isInitialViewSet = true; + this.pdfSidebar?.setInitialView(sidebarView); + //默认双页 + // setViewerModes(scrollMode, spreadMode); + setViewerModes(scrollMode, 1); + if (this.initialBookmark) { + setRotation(this.initialRotation); + delete this.initialRotation; + this.pdfLinkService.setHash(this.initialBookmark); + this.initialBookmark = null; + } else if (storedHash) { + setRotation(rotation); + this.pdfLinkService.setHash(storedHash); + } + this.toolbar?.setPageNumber(this.pdfViewer.currentPageNumber, this.pdfViewer.currentPageLabel); + this.secondaryToolbar?.setPageNumber(this.pdfViewer.currentPageNumber); + if (!this.pdfViewer.currentScaleValue) { + this.pdfViewer.currentScaleValue = DEFAULT_SCALE_VALUE; + } + }, + _cleanup() { + if (!this.pdfDocument) { + return; + } + this.pdfViewer.cleanup(); + this.pdfThumbnailViewer?.cleanup(); + this.pdfDocument.cleanup(AppOptions.get("fontExtraProperties")); + }, + forceRendering() { + this.pdfRenderingQueue.printing = !!this.printService; + this.pdfRenderingQueue.isThumbnailViewEnabled = this.pdfSidebar?.visibleView === SidebarView.THUMBS; + this.pdfRenderingQueue.renderHighestPriority(); + }, + beforePrint() { + this._printAnnotationStoragePromise = this.pdfScriptingManager.dispatchWillPrint().catch(() => {}).then(() => this.pdfDocument?.annotationStorage.print); + if (this.printService) { + return; + } + if (!this.supportsPrinting) { + this._otherError("pdfjs-printing-not-supported"); + return; + } + if (!this.pdfViewer.pageViewsReady) { + this.l10n.get("pdfjs-printing-not-ready").then(msg => { + window.alert(msg); + }); + return; + } + this.printService = PDFPrintServiceFactory.createPrintService({ + pdfDocument: this.pdfDocument, + pagesOverview: this.pdfViewer.getPagesOverview(), + printContainer: this.appConfig.printContainer, + printResolution: AppOptions.get("printResolution"), + printAnnotationStoragePromise: this._printAnnotationStoragePromise + }); + this.forceRendering(); + this.setTitle(); + this.printService.layout(); + if (this._hasAnnotationEditors) { + this.externalServices.reportTelemetry({ + type: "editing", + data: { + type: "print", + stats: this.pdfDocument?.annotationStorage.editorStats + } + }); + } + }, + afterPrint() { + if (this._printAnnotationStoragePromise) { + this._printAnnotationStoragePromise.then(() => { + this.pdfScriptingManager.dispatchDidPrint(); + }); + this._printAnnotationStoragePromise = null; + } + if (this.printService) { + this.printService.destroy(); + this.printService = null; + this.pdfDocument?.annotationStorage.resetModified(); + } + this.forceRendering(); + this.setTitle(); + }, + rotatePages(delta) { + this.pdfViewer.pagesRotation += delta; + }, + requestPresentationMode() { + this.pdfPresentationMode?.request(); + }, + triggerPrinting() { + if (!this.supportsPrinting) { + return; + } + window.print(); + }, + bindEvents() { + if (this._eventBusAbortController) { + return; + } + this._eventBusAbortController = new AbortController(); + const { + eventBus, + _eventBusAbortController: { + signal + } + } = this; + eventBus._on("resize", webViewerResize, { + signal + }); + eventBus._on("hashchange", webViewerHashchange, { + signal + }); + eventBus._on("beforeprint", this.beforePrint.bind(this), { + signal + }); + eventBus._on("afterprint", this.afterPrint.bind(this), { + signal + }); + eventBus._on("pagerender", webViewerPageRender, { + signal + }); + eventBus._on("pagerendered", webViewerPageRendered, { + signal + }); + eventBus._on("updateviewarea", webViewerUpdateViewarea, { + signal + }); + eventBus._on("pagechanging", webViewerPageChanging, { + signal + }); + eventBus._on("scalechanging", webViewerScaleChanging, { + signal + }); + eventBus._on("rotationchanging", webViewerRotationChanging, { + signal + }); + eventBus._on("sidebarviewchanged", webViewerSidebarViewChanged, { + signal + }); + eventBus._on("pagemode", webViewerPageMode, { + signal + }); + eventBus._on("namedaction", webViewerNamedAction, { + signal + }); + eventBus._on("presentationmodechanged", webViewerPresentationModeChanged, { + signal + }); + eventBus._on("presentationmode", webViewerPresentationMode, { + signal + }); + eventBus._on("switchannotationeditormode", webViewerSwitchAnnotationEditorMode, { + signal + }); + eventBus._on("switchannotationeditorparams", webViewerSwitchAnnotationEditorParams, { + signal + }); + eventBus._on("print", webViewerPrint, { + signal + }); + eventBus._on("download", webViewerDownload, { + signal + }); + eventBus._on("firstpage", webViewerFirstPage, { + signal + }); + eventBus._on("lastpage", webViewerLastPage, { + signal + }); + eventBus._on("nextpage", webViewerNextPage, { + signal + }); + eventBus._on("previouspage", webViewerPreviousPage, { + signal + }); + eventBus._on("zoomin", webViewerZoomIn, { + signal + }); + eventBus._on("zoomout", webViewerZoomOut, { + signal + }); + eventBus._on("zoomreset", webViewerZoomReset, { + signal + }); + eventBus._on("pagenumberchanged", webViewerPageNumberChanged, { + signal + }); + eventBus._on("scalechanged", webViewerScaleChanged, { + signal + }); + eventBus._on("rotatecw", webViewerRotateCw, { + signal + }); + eventBus._on("rotateccw", webViewerRotateCcw, { + signal + }); + eventBus._on("optionalcontentconfig", webViewerOptionalContentConfig, { + signal + }); + eventBus._on("switchscrollmode", webViewerSwitchScrollMode, { + signal + }); + eventBus._on("scrollmodechanged", webViewerScrollModeChanged, { + signal + }); + eventBus._on("switchspreadmode", webViewerSwitchSpreadMode, { + signal + }); + eventBus._on("spreadmodechanged", webViewerSpreadModeChanged, { + signal + }); + eventBus._on("documentproperties", webViewerDocumentProperties, { + signal + }); + eventBus._on("findfromurlhash", webViewerFindFromUrlHash, { + signal + }); + eventBus._on("updatefindmatchescount", webViewerUpdateFindMatchesCount, { + signal + }); + eventBus._on("updatefindcontrolstate", webViewerUpdateFindControlState, { + signal + }); + eventBus._on("fileinputchange", webViewerFileInputChange, { + signal + }); + eventBus._on("openfile", webViewerOpenFile, { + signal + }); + }, + bindWindowEvents() { + if (this._windowAbortController) { + return; + } + this._windowAbortController = new AbortController(); + const { + eventBus, + appConfig: { + mainContainer + }, + _windowAbortController: { + signal + } + } = this; + function addWindowResolutionChange(evt = null) { + if (evt) { + webViewerResolutionChange(evt); + } + const mediaQueryList = window.matchMedia(`(resolution: ${window.devicePixelRatio || 1}dppx)`); + mediaQueryList.addEventListener("change", addWindowResolutionChange, { + once: true, + signal + }); + } + addWindowResolutionChange(); + window.addEventListener("visibilitychange", webViewerVisibilityChange, { + signal + }); + window.addEventListener("wheel", webViewerWheel, { + passive: false, + signal + }); + window.addEventListener("touchstart", webViewerTouchStart, { + passive: false, + signal + }); + window.addEventListener("touchmove", webViewerTouchMove, { + passive: false, + signal + }); + window.addEventListener("touchend", webViewerTouchEnd, { + passive: false, + signal + }); + window.addEventListener("click", webViewerClick, { + signal + }); + window.addEventListener("keydown", webViewerKeyDown, { + signal + }); + window.addEventListener("keyup", webViewerKeyUp, { + signal + }); + window.addEventListener("resize", () => { + eventBus.dispatch("resize", { + source: window + }); + }, { + signal + }); + window.addEventListener("hashchange", () => { + eventBus.dispatch("hashchange", { + source: window, + hash: document.location.hash.substring(1) + }); + }, { + signal + }); + window.addEventListener("beforeprint", () => { + eventBus.dispatch("beforeprint", { + source: window + }); + }, { + signal + }); + window.addEventListener("afterprint", () => { + eventBus.dispatch("afterprint", { + source: window + }); + }, { + signal + }); + window.addEventListener("updatefromsandbox", event => { + eventBus.dispatch("updatefromsandbox", { + source: window, + detail: event.detail + }); + }, { + signal + }); + if (!("onscrollend" in document.documentElement)) { + return; + } + ({ + scrollTop: this._lastScrollTop, + scrollLeft: this._lastScrollLeft + } = mainContainer); + const scrollend = () => { + ({ + scrollTop: this._lastScrollTop, + scrollLeft: this._lastScrollLeft + } = mainContainer); + this._isScrolling = false; + mainContainer.addEventListener("scroll", scroll, { + passive: true, + signal + }); + mainContainer.removeEventListener("scrollend", scrollend); + mainContainer.removeEventListener("blur", scrollend); + }; + const scroll = () => { + if (this._isCtrlKeyDown) { + return; + } + if (this._lastScrollTop === mainContainer.scrollTop && this._lastScrollLeft === mainContainer.scrollLeft) { + return; + } + mainContainer.removeEventListener("scroll", scroll, { + passive: true + }); + this._isScrolling = true; + mainContainer.addEventListener("scrollend", scrollend, { + signal + }); + mainContainer.addEventListener("blur", scrollend, { + signal + }); + }; + mainContainer.addEventListener("scroll", scroll, { + passive: true, + signal + }); + }, + unbindEvents() { + this._eventBusAbortController?.abort(); + this._eventBusAbortController = null; + }, + unbindWindowEvents() { + this._windowAbortController?.abort(); + this._windowAbortController = null; + }, + _accumulateTicks(ticks, prop) { + if (this[prop] > 0 && ticks < 0 || this[prop] < 0 && ticks > 0) { + this[prop] = 0; + } + this[prop] += ticks; + const wholeTicks = Math.trunc(this[prop]); + this[prop] -= wholeTicks; + return wholeTicks; + }, + _accumulateFactor(previousScale, factor, prop) { + if (factor === 1) { + return 1; + } + if (this[prop] > 1 && factor < 1 || this[prop] < 1 && factor > 1) { + this[prop] = 1; + } + const newFactor = Math.floor(previousScale * factor * this[prop] * 100) / (100 * previousScale); + this[prop] = factor / newFactor; + return newFactor; + }, + _unblockDocumentLoadEvent() { + document.blockUnblockOnload?.(false); + this._unblockDocumentLoadEvent = () => {}; + }, + get scriptingReady() { + return this.pdfScriptingManager.ready; + } +}; +initCom(PDFViewerApplication); +{ + PDFPrintServiceFactory.initGlobals(PDFViewerApplication); +} +{ + const HOSTED_VIEWER_ORIGINS = ["null", "http://mozilla.github.io", "https://mozilla.github.io"]; + var validateFileURL = function (file) { + if (!file) { + return; + } + try { + const viewerOrigin = new URL(window.location.href).origin || "null"; + if (HOSTED_VIEWER_ORIGINS.includes(viewerOrigin)) { + return; + } + const fileOrigin = new URL(file, window.location.href).origin; + // if (fileOrigin !== viewerOrigin) { + // throw new Error("file origin does not match viewer's"); + // } + } catch (ex) { + PDFViewerApplication._documentError("pdfjs-loading-error", { + message: ex.message + }); + throw ex; + } + }; +} +function webViewerPageRender({ + pageNumber +}) { + if (pageNumber === PDFViewerApplication.page) { + PDFViewerApplication.toolbar?.updateLoadingIndicatorState(true); + } +} +function webViewerPageRendered({ + pageNumber, + error +}) { + if (pageNumber === PDFViewerApplication.page) { + PDFViewerApplication.toolbar?.updateLoadingIndicatorState(false); + } + if (PDFViewerApplication.pdfSidebar?.visibleView === SidebarView.THUMBS) { + const pageView = PDFViewerApplication.pdfViewer.getPageView(pageNumber - 1); + const thumbnailView = PDFViewerApplication.pdfThumbnailViewer?.getThumbnail(pageNumber - 1); + if (pageView) { + thumbnailView?.setImage(pageView); + } + } + if (error) { + PDFViewerApplication._otherError("pdfjs-rendering-error", error); + } +} +function webViewerPageMode({ + mode +}) { + let view; + switch (mode) { + case "thumbs": + view = SidebarView.THUMBS; + break; + case "bookmarks": + case "outline": + view = SidebarView.OUTLINE; + break; + case "attachments": + view = SidebarView.ATTACHMENTS; + break; + case "layers": + view = SidebarView.LAYERS; + break; + case "none": + view = SidebarView.NONE; + break; + default: + console.error('Invalid "pagemode" hash parameter: ' + mode); + return; + } + PDFViewerApplication.pdfSidebar?.switchView(view, true); +} +function webViewerNamedAction(evt) { + switch (evt.action) { + case "GoToPage": + PDFViewerApplication.appConfig.toolbar?.pageNumber.select(); + break; + case "Find": + if (!PDFViewerApplication.supportsIntegratedFind) { + PDFViewerApplication.findBar?.toggle(); + } + break; + case "Print": + PDFViewerApplication.triggerPrinting(); + break; + case "SaveAs": + PDFViewerApplication.downloadOrSave(); + break; + } +} +function webViewerPresentationModeChanged(evt) { + PDFViewerApplication.pdfViewer.presentationModeState = evt.state; +} +function webViewerSidebarViewChanged({ + view +}) { + PDFViewerApplication.pdfRenderingQueue.isThumbnailViewEnabled = view === SidebarView.THUMBS; + if (PDFViewerApplication.isInitialViewSet) { + PDFViewerApplication.store?.set("sidebarView", view).catch(() => {}); + } +} +function webViewerUpdateViewarea({ + location +}) { + if (PDFViewerApplication.isInitialViewSet) { + PDFViewerApplication.store?.setMultiple({ + page: location.pageNumber, + zoom: location.scale, + scrollLeft: location.left, + scrollTop: location.top, + rotation: location.rotation + }).catch(() => {}); + } + if (PDFViewerApplication.appConfig.secondaryToolbar) { + const href = PDFViewerApplication.pdfLinkService.getAnchorUrl(location.pdfOpenParams); + PDFViewerApplication.appConfig.secondaryToolbar.viewBookmarkButton.href = href; + } +} +function webViewerScrollModeChanged(evt) { + if (PDFViewerApplication.isInitialViewSet && !PDFViewerApplication.pdfViewer.isInPresentationMode) { + PDFViewerApplication.store?.set("scrollMode", evt.mode).catch(() => {}); + } +} +function webViewerSpreadModeChanged(evt) { + if (PDFViewerApplication.isInitialViewSet && !PDFViewerApplication.pdfViewer.isInPresentationMode) { + PDFViewerApplication.store?.set("spreadMode", evt.mode).catch(() => {}); + } +} +function webViewerResize() { + const { + pdfDocument, + pdfViewer, + pdfRenderingQueue + } = PDFViewerApplication; + if (pdfRenderingQueue.printing && window.matchMedia("print").matches) { + return; + } + if (!pdfDocument) { + return; + } + const currentScaleValue = pdfViewer.currentScaleValue; + if (currentScaleValue === "auto" || currentScaleValue === "page-fit" || currentScaleValue === "page-width") { + pdfViewer.currentScaleValue = currentScaleValue; + } + pdfViewer.update(); +} +function webViewerHashchange(evt) { + const hash = evt.hash; + if (!hash) { + return; + } + if (!PDFViewerApplication.isInitialViewSet) { + PDFViewerApplication.initialBookmark = hash; + } else if (!PDFViewerApplication.pdfHistory?.popStateInProgress) { + PDFViewerApplication.pdfLinkService.setHash(hash); + } +} +{ + var webViewerFileInputChange = function (evt) { + if (PDFViewerApplication.pdfViewer?.isInPresentationMode) { + return; + } + const file = evt.fileInput.files[0]; + PDFViewerApplication.open({ + url: URL.createObjectURL(file), + originalUrl: file.name + }); + }; + var webViewerOpenFile = function (evt) { + PDFViewerApplication._openFileInput?.click(); + }; +} +function webViewerPresentationMode() { + PDFViewerApplication.requestPresentationMode(); +} +function webViewerSwitchAnnotationEditorMode(evt) { + PDFViewerApplication.pdfViewer.annotationEditorMode = evt; +} +function webViewerSwitchAnnotationEditorParams(evt) { + PDFViewerApplication.pdfViewer.annotationEditorParams = evt; +} +function webViewerPrint() { + PDFViewerApplication.triggerPrinting(); +} +function webViewerDownload() { + PDFViewerApplication.downloadOrSave(); +} +function webViewerFirstPage() { + PDFViewerApplication.page = 1; +} +function webViewerLastPage() { + PDFViewerApplication.page = PDFViewerApplication.pagesCount; +} +function webViewerNextPage() { + PDFViewerApplication.pdfViewer.nextPage(); +} +function webViewerPreviousPage() { + PDFViewerApplication.pdfViewer.previousPage(); +} +function webViewerZoomIn() { + PDFViewerApplication.zoomIn(); +} +function webViewerZoomOut() { + PDFViewerApplication.zoomOut(); +} +function webViewerZoomReset() { + PDFViewerApplication.zoomReset(); +} +function webViewerPageNumberChanged(evt) { + const pdfViewer = PDFViewerApplication.pdfViewer; + if (evt.value !== "") { + PDFViewerApplication.pdfLinkService.goToPage(evt.value); + } + if (evt.value !== pdfViewer.currentPageNumber.toString() && evt.value !== pdfViewer.currentPageLabel) { + PDFViewerApplication.toolbar?.setPageNumber(pdfViewer.currentPageNumber, pdfViewer.currentPageLabel); + } +} +function webViewerScaleChanged(evt) { + PDFViewerApplication.pdfViewer.currentScaleValue = evt.value; +} +function webViewerRotateCw() { + PDFViewerApplication.rotatePages(90); +} +function webViewerRotateCcw() { + PDFViewerApplication.rotatePages(-90); +} +function webViewerOptionalContentConfig(evt) { + PDFViewerApplication.pdfViewer.optionalContentConfigPromise = evt.promise; +} +function webViewerSwitchScrollMode(evt) { + PDFViewerApplication.pdfViewer.scrollMode = evt.mode; +} +function webViewerSwitchSpreadMode(evt) { + PDFViewerApplication.pdfViewer.spreadMode = evt.mode; +} +function webViewerDocumentProperties() { + PDFViewerApplication.pdfDocumentProperties?.open(); +} +function webViewerFindFromUrlHash(evt) { + PDFViewerApplication.eventBus.dispatch("find", { + source: evt.source, + type: "", + query: evt.query, + caseSensitive: false, + entireWord: false, + highlightAll: true, + findPrevious: false, + matchDiacritics: true + }); +} +function webViewerUpdateFindMatchesCount({ + matchesCount +}) { + if (PDFViewerApplication.supportsIntegratedFind) { + PDFViewerApplication.externalServices.updateFindMatchesCount(matchesCount); + } else { + PDFViewerApplication.findBar?.updateResultsCount(matchesCount); + } +} +function webViewerUpdateFindControlState({ + state, + previous, + matchesCount, + rawQuery +}) { + if (PDFViewerApplication.supportsIntegratedFind) { + PDFViewerApplication.externalServices.updateFindControlState({ + result: state, + findPrevious: previous, + matchesCount, + rawQuery + }); + } else { + PDFViewerApplication.findBar?.updateUIState(state, previous, matchesCount); + } +} +function webViewerScaleChanging(evt) { + PDFViewerApplication.toolbar?.setPageScale(evt.presetValue, evt.scale); + PDFViewerApplication.pdfViewer.update(); +} +function webViewerRotationChanging(evt) { + if (PDFViewerApplication.pdfThumbnailViewer) { + PDFViewerApplication.pdfThumbnailViewer.pagesRotation = evt.pagesRotation; + } + PDFViewerApplication.forceRendering(); + PDFViewerApplication.pdfViewer.currentPageNumber = evt.pageNumber; +} +function webViewerPageChanging({ + pageNumber, + pageLabel +}) { + PDFViewerApplication.toolbar?.setPageNumber(pageNumber, pageLabel); + PDFViewerApplication.secondaryToolbar?.setPageNumber(pageNumber); + if (PDFViewerApplication.pdfSidebar?.visibleView === SidebarView.THUMBS) { + PDFViewerApplication.pdfThumbnailViewer?.scrollThumbnailIntoView(pageNumber); + } + const currentPage = PDFViewerApplication.pdfViewer.getPageView(pageNumber - 1); + PDFViewerApplication.toolbar?.updateLoadingIndicatorState(currentPage?.renderingState === RenderingStates.RUNNING); +} +function webViewerResolutionChange(evt) { + PDFViewerApplication.pdfViewer.refresh(); +} +function webViewerVisibilityChange(evt) { + if (document.visibilityState === "visible") { + setZoomDisabledTimeout(); + } +} +let zoomDisabledTimeout = null; +function setZoomDisabledTimeout() { + if (zoomDisabledTimeout) { + clearTimeout(zoomDisabledTimeout); + } + zoomDisabledTimeout = setTimeout(function () { + zoomDisabledTimeout = null; + }, WHEEL_ZOOM_DISABLED_TIMEOUT); +} +function webViewerWheel(evt) { + const { + pdfViewer, + supportsMouseWheelZoomCtrlKey, + supportsMouseWheelZoomMetaKey, + supportsPinchToZoom + } = PDFViewerApplication; + if (pdfViewer.isInPresentationMode) { + return; + } + const deltaMode = evt.deltaMode; + let scaleFactor = Math.exp(-evt.deltaY / 100); + const isBuiltInMac = false; + const isPinchToZoom = evt.ctrlKey && !PDFViewerApplication._isCtrlKeyDown && deltaMode === WheelEvent.DOM_DELTA_PIXEL && evt.deltaX === 0 && (Math.abs(scaleFactor - 1) < 0.05 || isBuiltInMac) && evt.deltaZ === 0; + const origin = [evt.clientX, evt.clientY]; + if (isPinchToZoom || evt.ctrlKey && supportsMouseWheelZoomCtrlKey || evt.metaKey && supportsMouseWheelZoomMetaKey) { + evt.preventDefault(); + if (PDFViewerApplication._isScrolling || zoomDisabledTimeout || document.visibilityState === "hidden" || PDFViewerApplication.overlayManager.active) { + return; + } + if (isPinchToZoom && supportsPinchToZoom) { + scaleFactor = PDFViewerApplication._accumulateFactor(pdfViewer.currentScale, scaleFactor, "_wheelUnusedFactor"); + PDFViewerApplication.updateZoom(null, scaleFactor, origin); + } else { + const delta = normalizeWheelEventDirection(evt); + let ticks = 0; + if (deltaMode === WheelEvent.DOM_DELTA_LINE || deltaMode === WheelEvent.DOM_DELTA_PAGE) { + if (Math.abs(delta) >= 1) { + ticks = Math.sign(delta); + } else { + ticks = PDFViewerApplication._accumulateTicks(delta, "_wheelUnusedTicks"); + } + } else { + const PIXELS_PER_LINE_SCALE = 30; + ticks = PDFViewerApplication._accumulateTicks(delta / PIXELS_PER_LINE_SCALE, "_wheelUnusedTicks"); + } + PDFViewerApplication.updateZoom(ticks, null, origin); + } + } +} +function webViewerTouchStart(evt) { + if (PDFViewerApplication.pdfViewer.isInPresentationMode || evt.touches.length < 2) { + return; + } + evt.preventDefault(); + if (evt.touches.length !== 2 || PDFViewerApplication.overlayManager.active) { + PDFViewerApplication._touchInfo = null; + return; + } + let [touch0, touch1] = evt.touches; + if (touch0.identifier > touch1.identifier) { + [touch0, touch1] = [touch1, touch0]; + } + PDFViewerApplication._touchInfo = { + touch0X: touch0.pageX, + touch0Y: touch0.pageY, + touch1X: touch1.pageX, + touch1Y: touch1.pageY + }; +} +function webViewerTouchMove(evt) { + if (!PDFViewerApplication._touchInfo || evt.touches.length !== 2) { + return; + } + const { + pdfViewer, + _touchInfo, + supportsPinchToZoom + } = PDFViewerApplication; + let [touch0, touch1] = evt.touches; + if (touch0.identifier > touch1.identifier) { + [touch0, touch1] = [touch1, touch0]; + } + const { + pageX: page0X, + pageY: page0Y + } = touch0; + const { + pageX: page1X, + pageY: page1Y + } = touch1; + const { + touch0X: pTouch0X, + touch0Y: pTouch0Y, + touch1X: pTouch1X, + touch1Y: pTouch1Y + } = _touchInfo; + if (Math.abs(pTouch0X - page0X) <= 1 && Math.abs(pTouch0Y - page0Y) <= 1 && Math.abs(pTouch1X - page1X) <= 1 && Math.abs(pTouch1Y - page1Y) <= 1) { + return; + } + _touchInfo.touch0X = page0X; + _touchInfo.touch0Y = page0Y; + _touchInfo.touch1X = page1X; + _touchInfo.touch1Y = page1Y; + if (pTouch0X === page0X && pTouch0Y === page0Y) { + const v1X = pTouch1X - page0X; + const v1Y = pTouch1Y - page0Y; + const v2X = page1X - page0X; + const v2Y = page1Y - page0Y; + const det = v1X * v2Y - v1Y * v2X; + if (Math.abs(det) > 0.02 * Math.hypot(v1X, v1Y) * Math.hypot(v2X, v2Y)) { + return; + } + } else if (pTouch1X === page1X && pTouch1Y === page1Y) { + const v1X = pTouch0X - page1X; + const v1Y = pTouch0Y - page1Y; + const v2X = page0X - page1X; + const v2Y = page0Y - page1Y; + const det = v1X * v2Y - v1Y * v2X; + if (Math.abs(det) > 0.02 * Math.hypot(v1X, v1Y) * Math.hypot(v2X, v2Y)) { + return; + } + } else { + const diff0X = page0X - pTouch0X; + const diff1X = page1X - pTouch1X; + const diff0Y = page0Y - pTouch0Y; + const diff1Y = page1Y - pTouch1Y; + const dotProduct = diff0X * diff1X + diff0Y * diff1Y; + if (dotProduct >= 0) { + return; + } + } + evt.preventDefault(); + const origin = [(page0X + page1X) / 2, (page0Y + page1Y) / 2]; + const distance = Math.hypot(page0X - page1X, page0Y - page1Y) || 1; + const pDistance = Math.hypot(pTouch0X - pTouch1X, pTouch0Y - pTouch1Y) || 1; + if (supportsPinchToZoom) { + const newScaleFactor = PDFViewerApplication._accumulateFactor(pdfViewer.currentScale, distance / pDistance, "_touchUnusedFactor"); + PDFViewerApplication.updateZoom(null, newScaleFactor, origin); + } else { + const PIXELS_PER_LINE_SCALE = 30; + const ticks = PDFViewerApplication._accumulateTicks((distance - pDistance) / PIXELS_PER_LINE_SCALE, "_touchUnusedTicks"); + PDFViewerApplication.updateZoom(ticks, null, origin); + } +} +function webViewerTouchEnd(evt) { + if (!PDFViewerApplication._touchInfo) { + return; + } + evt.preventDefault(); + PDFViewerApplication._touchInfo = null; + PDFViewerApplication._touchUnusedTicks = 0; + PDFViewerApplication._touchUnusedFactor = 1; +} +function webViewerClick(evt) { + if (!PDFViewerApplication.secondaryToolbar?.isOpen) { + return; + } + const appConfig = PDFViewerApplication.appConfig; + if (PDFViewerApplication.pdfViewer.containsElement(evt.target) || appConfig.toolbar?.container.contains(evt.target) && evt.target !== appConfig.secondaryToolbar?.toggleButton) { + PDFViewerApplication.secondaryToolbar.close(); + } +} +function webViewerKeyUp(evt) { + if (evt.key === "Control") { + PDFViewerApplication._isCtrlKeyDown = false; + } +} +function webViewerKeyDown(evt) { + PDFViewerApplication._isCtrlKeyDown = evt.key === "Control"; + if (PDFViewerApplication.overlayManager.active) { + return; + } + const { + eventBus, + pdfViewer + } = PDFViewerApplication; + const isViewerInPresentationMode = pdfViewer.isInPresentationMode; + let handled = false, + ensureViewerFocused = false; + const cmd = (evt.ctrlKey ? 1 : 0) | (evt.altKey ? 2 : 0) | (evt.shiftKey ? 4 : 0) | (evt.metaKey ? 8 : 0); + if (cmd === 1 || cmd === 8 || cmd === 5 || cmd === 12) { + switch (evt.keyCode) { + case 70: + if (!PDFViewerApplication.supportsIntegratedFind && !evt.shiftKey) { + PDFViewerApplication.findBar?.open(); + handled = true; + } + break; + case 71: + if (!PDFViewerApplication.supportsIntegratedFind) { + const { + state + } = PDFViewerApplication.findController; + if (state) { + const newState = { + source: window, + type: "again", + findPrevious: cmd === 5 || cmd === 12 + }; + eventBus.dispatch("find", { + ...state, + ...newState + }); + } + handled = true; + } + break; + case 61: + case 107: + case 187: + case 171: + PDFViewerApplication.zoomIn(); + handled = true; + break; + case 173: + case 109: + case 189: + PDFViewerApplication.zoomOut(); + handled = true; + break; + case 48: + case 96: + if (!isViewerInPresentationMode) { + setTimeout(function () { + PDFViewerApplication.zoomReset(); + }); + handled = false; + } + break; + case 38: + if (isViewerInPresentationMode || PDFViewerApplication.page > 1) { + PDFViewerApplication.page = 1; + handled = true; + ensureViewerFocused = true; + } + break; + case 40: + if (isViewerInPresentationMode || PDFViewerApplication.page < PDFViewerApplication.pagesCount) { + PDFViewerApplication.page = PDFViewerApplication.pagesCount; + handled = true; + ensureViewerFocused = true; + } + break; + } + } + if (cmd === 1 || cmd === 8) { + switch (evt.keyCode) { + case 83: + eventBus.dispatch("download", { + source: window + }); + handled = true; + break; + case 79: + { + eventBus.dispatch("openfile", { + source: window + }); + handled = true; + } + break; + } + } + if (cmd === 3 || cmd === 10) { + switch (evt.keyCode) { + case 80: + PDFViewerApplication.requestPresentationMode(); + handled = true; + PDFViewerApplication.externalServices.reportTelemetry({ + type: "buttons", + data: { + id: "presentationModeKeyboard" + } + }); + break; + case 71: + if (PDFViewerApplication.appConfig.toolbar) { + PDFViewerApplication.appConfig.toolbar.pageNumber.select(); + handled = true; + } + break; + } + } + if (handled) { + if (ensureViewerFocused && !isViewerInPresentationMode) { + pdfViewer.focus(); + } + evt.preventDefault(); + return; + } + const curElement = getActiveOrFocusedElement(); + const curElementTagName = curElement?.tagName.toUpperCase(); + if (curElementTagName === "INPUT" || curElementTagName === "TEXTAREA" || curElementTagName === "SELECT" || curElementTagName === "BUTTON" && (evt.keyCode === 13 || evt.keyCode === 32) || curElement?.isContentEditable) { + if (evt.keyCode !== 27) { + return; + } + } + if (cmd === 0) { + let turnPage = 0, + turnOnlyIfPageFit = false; + switch (evt.keyCode) { + case 38: + if (PDFViewerApplication.supportsCaretBrowsingMode) { + PDFViewerApplication.moveCaret(true, false); + handled = true; + break; + } + case 33: + if (pdfViewer.isVerticalScrollbarEnabled) { + turnOnlyIfPageFit = true; + } + turnPage = -1; + break; + case 8: + if (!isViewerInPresentationMode) { + turnOnlyIfPageFit = true; + } + turnPage = -1; + break; + case 37: + if (PDFViewerApplication.supportsCaretBrowsingMode) { + return; + } + if (pdfViewer.isHorizontalScrollbarEnabled) { + turnOnlyIfPageFit = true; + } + case 75: + case 80: + turnPage = -1; + break; + case 27: + if (PDFViewerApplication.secondaryToolbar?.isOpen) { + PDFViewerApplication.secondaryToolbar.close(); + handled = true; + } + if (!PDFViewerApplication.supportsIntegratedFind && PDFViewerApplication.findBar?.opened) { + PDFViewerApplication.findBar.close(); + handled = true; + } + break; + case 40: + if (PDFViewerApplication.supportsCaretBrowsingMode) { + PDFViewerApplication.moveCaret(false, false); + handled = true; + break; + } + case 34: + if (pdfViewer.isVerticalScrollbarEnabled) { + turnOnlyIfPageFit = true; + } + turnPage = 1; + break; + case 13: + case 32: + if (!isViewerInPresentationMode) { + turnOnlyIfPageFit = true; + } + turnPage = 1; + break; + case 39: + if (PDFViewerApplication.supportsCaretBrowsingMode) { + return; + } + if (pdfViewer.isHorizontalScrollbarEnabled) { + turnOnlyIfPageFit = true; + } + case 74: + case 78: + turnPage = 1; + break; + case 36: + if (isViewerInPresentationMode || PDFViewerApplication.page > 1) { + PDFViewerApplication.page = 1; + handled = true; + ensureViewerFocused = true; + } + break; + case 35: + if (isViewerInPresentationMode || PDFViewerApplication.page < PDFViewerApplication.pagesCount) { + PDFViewerApplication.page = PDFViewerApplication.pagesCount; + handled = true; + ensureViewerFocused = true; + } + break; + case 83: + PDFViewerApplication.pdfCursorTools?.switchTool(CursorTool.SELECT); + break; + case 72: + PDFViewerApplication.pdfCursorTools?.switchTool(CursorTool.HAND); + break; + case 82: + PDFViewerApplication.rotatePages(90); + break; + case 115: + PDFViewerApplication.pdfSidebar?.toggle(); + break; + } + if (turnPage !== 0 && (!turnOnlyIfPageFit || pdfViewer.currentScaleValue === "page-fit")) { + if (turnPage > 0) { + pdfViewer.nextPage(); + } else { + pdfViewer.previousPage(); + } + handled = true; + } + } + if (cmd === 4) { + switch (evt.keyCode) { + case 13: + case 32: + if (!isViewerInPresentationMode && pdfViewer.currentScaleValue !== "page-fit") { + break; + } + pdfViewer.previousPage(); + handled = true; + break; + case 38: + PDFViewerApplication.moveCaret(true, true); + handled = true; + break; + case 40: + PDFViewerApplication.moveCaret(false, true); + handled = true; + break; + case 82: + PDFViewerApplication.rotatePages(-90); + break; + } + } + if (!handled && !isViewerInPresentationMode) { + if (evt.keyCode >= 33 && evt.keyCode <= 40 || evt.keyCode === 32 && curElementTagName !== "BUTTON") { + ensureViewerFocused = true; + } + } + if (ensureViewerFocused && !pdfViewer.containsElement(curElement)) { + pdfViewer.focus(); + } + if (handled) { + evt.preventDefault(); + } +} +function beforeUnload(evt) { + evt.preventDefault(); + evt.returnValue = ""; + return false; +} +function webViewerAnnotationEditorStatesChanged(data) { + PDFViewerApplication.externalServices.updateEditorStates(data); +} +function webViewerReportTelemetry({ + details +}) { + PDFViewerApplication.externalServices.reportTelemetry(details); +} + +;// CONCATENATED MODULE: ./web/viewer.js + + + + +const pdfjsVersion = "4.3.136"; +const pdfjsBuild = "0cec64437"; +const AppConstants = { + LinkTarget: LinkTarget, + RenderingStates: RenderingStates, + ScrollMode: ScrollMode, + SpreadMode: SpreadMode +}; +window.PDFViewerApplication = PDFViewerApplication; +window.PDFViewerApplicationConstants = AppConstants; +window.PDFViewerApplicationOptions = AppOptions; +function getViewerConfiguration() { + return { + appContainer: document.body, + mainContainer: document.getElementById("viewerContainer"), + viewerContainer: document.getElementById("viewer"), + toolbar: { + container: document.getElementById("toolbarViewer"), + numPages: document.getElementById("numPages"), + pageNumber: document.getElementById("pageNumber"), + scaleSelect: document.getElementById("scaleSelect"), + customScaleOption: document.getElementById("customScaleOption"), + previous: document.getElementById("previous"), + next: document.getElementById("next"), + zoomIn: document.getElementById("zoomIn"), + zoomOut: document.getElementById("zoomOut"), + viewFind: document.getElementById("viewFind"), + print: document.getElementById("print"), + editorFreeTextButton: document.getElementById("editorFreeText"), + editorFreeTextParamsToolbar: document.getElementById("editorFreeTextParamsToolbar"), + editorHighlightButton: document.getElementById("editorHighlight"), + editorHighlightParamsToolbar: document.getElementById("editorHighlightParamsToolbar"), + editorHighlightColorPicker: document.getElementById("editorHighlightColorPicker"), + editorInkButton: document.getElementById("editorInk"), + editorInkParamsToolbar: document.getElementById("editorInkParamsToolbar"), + editorStampButton: document.getElementById("editorStamp"), + editorStampParamsToolbar: document.getElementById("editorStampParamsToolbar"), + download: document.getElementById("download") + }, + secondaryToolbar: { + toolbar: document.getElementById("secondaryToolbar"), + toggleButton: document.getElementById("secondaryToolbarToggle"), + presentationModeButton: document.getElementById("presentationMode"), + openFileButton: document.getElementById("secondaryOpenFile"), + printButton: document.getElementById("secondaryPrint"), + downloadButton: document.getElementById("secondaryDownload"), + viewBookmarkButton: document.getElementById("viewBookmark"), + firstPageButton: document.getElementById("firstPage"), + lastPageButton: document.getElementById("lastPage"), + pageRotateCwButton: document.getElementById("pageRotateCw"), + pageRotateCcwButton: document.getElementById("pageRotateCcw"), + cursorSelectToolButton: document.getElementById("cursorSelectTool"), + cursorHandToolButton: document.getElementById("cursorHandTool"), + scrollPageButton: document.getElementById("scrollPage"), + scrollVerticalButton: document.getElementById("scrollVertical"), + scrollHorizontalButton: document.getElementById("scrollHorizontal"), + scrollWrappedButton: document.getElementById("scrollWrapped"), + spreadNoneButton: document.getElementById("spreadNone"), + spreadOddButton: document.getElementById("spreadOdd"), + spreadEvenButton: document.getElementById("spreadEven"), + documentPropertiesButton: document.getElementById("documentProperties") + }, + sidebar: { + outerContainer: document.getElementById("outerContainer"), + sidebarContainer: document.getElementById("sidebarContainer"), + toggleButton: document.getElementById("sidebarToggle"), + resizer: document.getElementById("sidebarResizer"), + thumbnailButton: document.getElementById("viewThumbnail"), + outlineButton: document.getElementById("viewOutline"), + attachmentsButton: document.getElementById("viewAttachments"), + layersButton: document.getElementById("viewLayers"), + thumbnailView: document.getElementById("thumbnailView"), + outlineView: document.getElementById("outlineView"), + attachmentsView: document.getElementById("attachmentsView"), + layersView: document.getElementById("layersView"), + currentOutlineItemButton: document.getElementById("currentOutlineItem") + }, + findBar: { + bar: document.getElementById("findbar"), + toggleButton: document.getElementById("viewFind"), + findField: document.getElementById("findInput"), + highlightAllCheckbox: document.getElementById("findHighlightAll"), + caseSensitiveCheckbox: document.getElementById("findMatchCase"), + matchDiacriticsCheckbox: document.getElementById("findMatchDiacritics"), + entireWordCheckbox: document.getElementById("findEntireWord"), + findMsg: document.getElementById("findMsg"), + findResultsCount: document.getElementById("findResultsCount"), + findPreviousButton: document.getElementById("findPrevious"), + findNextButton: document.getElementById("findNext") + }, + passwordOverlay: { + dialog: document.getElementById("passwordDialog"), + label: document.getElementById("passwordText"), + input: document.getElementById("password"), + submitButton: document.getElementById("passwordSubmit"), + cancelButton: document.getElementById("passwordCancel") + }, + documentProperties: { + dialog: document.getElementById("documentPropertiesDialog"), + closeButton: document.getElementById("documentPropertiesClose"), + fields: { + fileName: document.getElementById("fileNameField"), + fileSize: document.getElementById("fileSizeField"), + title: document.getElementById("titleField"), + author: document.getElementById("authorField"), + subject: document.getElementById("subjectField"), + keywords: document.getElementById("keywordsField"), + creationDate: document.getElementById("creationDateField"), + modificationDate: document.getElementById("modificationDateField"), + creator: document.getElementById("creatorField"), + producer: document.getElementById("producerField"), + version: document.getElementById("versionField"), + pageCount: document.getElementById("pageCountField"), + pageSize: document.getElementById("pageSizeField"), + linearized: document.getElementById("linearizedField") + } + }, + altTextDialog: { + dialog: document.getElementById("altTextDialog"), + optionDescription: document.getElementById("descriptionButton"), + optionDecorative: document.getElementById("decorativeButton"), + textarea: document.getElementById("descriptionTextarea"), + cancelButton: document.getElementById("altTextCancel"), + saveButton: document.getElementById("altTextSave") + }, + annotationEditorParams: { + editorFreeTextFontSize: document.getElementById("editorFreeTextFontSize"), + editorFreeTextColor: document.getElementById("editorFreeTextColor"), + editorInkColor: document.getElementById("editorInkColor"), + editorInkThickness: document.getElementById("editorInkThickness"), + editorInkOpacity: document.getElementById("editorInkOpacity"), + editorStampAddImage: document.getElementById("editorStampAddImage"), + editorFreeHighlightThickness: document.getElementById("editorFreeHighlightThickness"), + editorHighlightShowAll: document.getElementById("editorHighlightShowAll") + }, + printContainer: document.getElementById("printContainer") + }; +} +function webViewerLoad() { + const config = getViewerConfiguration(); + const event = new CustomEvent("webviewerloaded", { + bubbles: true, + cancelable: true, + detail: { + source: window + } + }); + try { + parent.document.dispatchEvent(event); + } catch (ex) { + console.error(`webviewerloaded: ${ex}`); + document.dispatchEvent(event); + } + PDFViewerApplication.run(config); +} +document.blockUnblockOnload?.(true); +if (document.readyState === "interactive" || document.readyState === "complete") { + webViewerLoad(); +} else { + document.addEventListener("DOMContentLoaded", webViewerLoad, true); +} + +var __webpack_exports__PDFViewerApplication = __webpack_exports__.PDFViewerApplication; +var __webpack_exports__PDFViewerApplicationConstants = __webpack_exports__.PDFViewerApplicationConstants; +var __webpack_exports__PDFViewerApplicationOptions = __webpack_exports__.PDFViewerApplicationOptions; +export { __webpack_exports__PDFViewerApplication as PDFViewerApplication, __webpack_exports__PDFViewerApplicationConstants as PDFViewerApplicationConstants, __webpack_exports__PDFViewerApplicationOptions as PDFViewerApplicationOptions }; + +//# sourceMappingURL=viewer.mjs.map \ No newline at end of file diff --git a/src/renderer/public/pdfjs-dist/web/viewer.mjs.map b/src/renderer/public/pdfjs-dist/web/viewer.mjs.map new file mode 100644 index 0000000..5208ece --- /dev/null +++ b/src/renderer/public/pdfjs-dist/web/viewer.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"viewer.mjs","mappings":"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","sources":["webpack://pdf.js/webpack/bootstrap","webpack://pdf.js/webpack/runtime/define property getters","webpack://pdf.js/webpack/runtime/hasOwnProperty shorthand","webpack://pdf.js/./web/ui_utils.js","webpack://pdf.js/./web/app_options.js","webpack://pdf.js/./web/pdf_link_service.js","webpack://pdf.js/./web/pdfjs.js","webpack://pdf.js/./web/event_utils.js","webpack://pdf.js/./web/external_services.js","webpack://pdf.js/./web/preferences.js","webpack://pdf.js/./node_modules/@fluent/bundle/esm/types.js","webpack://pdf.js/./node_modules/@fluent/bundle/esm/resolver.js","webpack://pdf.js/./node_modules/@fluent/bundle/esm/scope.js","webpack://pdf.js/./node_modules/@fluent/bundle/esm/builtins.js","webpack://pdf.js/./node_modules/@fluent/bundle/esm/memoizer.js","webpack://pdf.js/./node_modules/@fluent/bundle/esm/bundle.js","webpack://pdf.js/./node_modules/@fluent/bundle/esm/resource.js","webpack://pdf.js/./node_modules/@fluent/bundle/esm/index.js","webpack://pdf.js/./node_modules/@fluent/dom/esm/overlay.js","webpack://pdf.js/./node_modules/cached-iterable/src/cached_iterable.mjs","webpack://pdf.js/./node_modules/cached-iterable/src/cached_sync_iterable.mjs","webpack://pdf.js/./node_modules/cached-iterable/src/cached_async_iterable.mjs","webpack://pdf.js/./node_modules/cached-iterable/src/index.mjs","webpack://pdf.js/./node_modules/@fluent/dom/esm/localization.js","webpack://pdf.js/./node_modules/@fluent/dom/esm/dom_localization.js","webpack://pdf.js/./node_modules/@fluent/dom/esm/index.js","webpack://pdf.js/./web/l10n.js","webpack://pdf.js/./web/genericl10n.js","webpack://pdf.js/./web/generic_scripting.js","webpack://pdf.js/./web/genericcom.js","webpack://pdf.js/./web/alt_text_manager.js","webpack://pdf.js/./web/annotation_editor_params.js","webpack://pdf.js/./web/caret_browsing.js","webpack://pdf.js/./web/download_manager.js","webpack://pdf.js/./web/overlay_manager.js","webpack://pdf.js/./web/password_prompt.js","webpack://pdf.js/./web/base_tree_viewer.js","webpack://pdf.js/./web/pdf_attachment_viewer.js","webpack://pdf.js/./web/grab_to_pan.js","webpack://pdf.js/./web/pdf_cursor_tools.js","webpack://pdf.js/./web/pdf_document_properties.js","webpack://pdf.js/./web/pdf_find_utils.js","webpack://pdf.js/./web/pdf_find_controller.js","webpack://pdf.js/./web/pdf_find_bar.js","webpack://pdf.js/./web/pdf_history.js","webpack://pdf.js/./web/pdf_layer_viewer.js","webpack://pdf.js/./web/pdf_outline_viewer.js","webpack://pdf.js/./web/pdf_presentation_mode.js","webpack://pdf.js/./web/xfa_layer_builder.js","webpack://pdf.js/./web/print_utils.js","webpack://pdf.js/./web/pdf_print_service.js","webpack://pdf.js/./web/pdf_rendering_queue.js","webpack://pdf.js/./web/pdf_scripting_manager.js","webpack://pdf.js/./web/pdf_sidebar.js","webpack://pdf.js/./web/pdf_thumbnail_view.js","webpack://pdf.js/./web/pdf_thumbnail_viewer.js","webpack://pdf.js/./web/annotation_editor_layer_builder.js","webpack://pdf.js/./web/annotation_layer_builder.js","webpack://pdf.js/./web/draw_layer_builder.js","webpack://pdf.js/./web/struct_tree_layer_builder.js","webpack://pdf.js/./web/text_accessibility.js","webpack://pdf.js/./web/text_highlighter.js","webpack://pdf.js/./web/text_layer_builder.js","webpack://pdf.js/./web/pdf_page_view.js","webpack://pdf.js/./web/pdf_viewer.js","webpack://pdf.js/./web/secondary_toolbar.js","webpack://pdf.js/./web/toolbar.js","webpack://pdf.js/./web/view_history.js","webpack://pdf.js/./web/app.js","webpack://pdf.js/./web/viewer.js"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst DEFAULT_SCALE_VALUE = \"auto\";\nconst DEFAULT_SCALE = 1.0;\nconst DEFAULT_SCALE_DELTA = 1.1;\nconst MIN_SCALE = 0.1;\nconst MAX_SCALE = 10.0;\nconst UNKNOWN_SCALE = 0;\nconst MAX_AUTO_SCALE = 1.25;\nconst SCROLLBAR_PADDING = 40;\nconst VERTICAL_PADDING = 5;\n\nconst RenderingStates = {\n INITIAL: 0,\n RUNNING: 1,\n PAUSED: 2,\n FINISHED: 3,\n};\n\nconst PresentationModeState = {\n UNKNOWN: 0,\n NORMAL: 1,\n CHANGING: 2,\n FULLSCREEN: 3,\n};\n\nconst SidebarView = {\n UNKNOWN: -1,\n NONE: 0,\n THUMBS: 1, // Default value.\n OUTLINE: 2,\n ATTACHMENTS: 3,\n LAYERS: 4,\n};\n\nconst TextLayerMode = {\n DISABLE: 0,\n ENABLE: 1,\n ENABLE_PERMISSIONS: 2,\n};\n\nconst ScrollMode = {\n UNKNOWN: -1,\n VERTICAL: 0, // Default value.\n HORIZONTAL: 1,\n WRAPPED: 2,\n PAGE: 3,\n};\n\nconst SpreadMode = {\n UNKNOWN: -1,\n NONE: 0, // Default value.\n ODD: 1,\n EVEN: 2,\n};\n\nconst CursorTool = {\n SELECT: 0, // The default value.\n HAND: 1,\n ZOOM: 2,\n};\n\n// Used by `PDFViewerApplication`, and by the API unit-tests.\nconst AutoPrintRegExp = /\\bprint\\s*\\(/;\n\n/**\n * Scale factors for the canvas, necessary with HiDPI displays.\n */\nclass OutputScale {\n constructor() {\n const pixelRatio = window.devicePixelRatio || 1;\n\n /**\n * @type {number} Horizontal scale.\n */\n this.sx = pixelRatio;\n\n /**\n * @type {number} Vertical scale.\n */\n this.sy = pixelRatio;\n }\n\n /**\n * @type {boolean} Returns `true` when scaling is required, `false` otherwise.\n */\n get scaled() {\n return this.sx !== 1 || this.sy !== 1;\n }\n}\n\n/**\n * Scrolls specified element into view of its parent.\n * @param {HTMLElement} element - The element to be visible.\n * @param {Object} [spot] - An object with optional top and left properties,\n * specifying the offset from the top left edge.\n * @param {number} [spot.left]\n * @param {number} [spot.top]\n * @param {boolean} [scrollMatches] - When scrolling search results into view,\n * ignore elements that either: Contains marked content identifiers,\n * or have the CSS-rule `overflow: hidden;` set. The default value is `false`.\n */\nfunction scrollIntoView(element, spot, scrollMatches = false) {\n // Assuming offsetParent is available (it's not available when viewer is in\n // hidden iframe or object). We have to scroll: if the offsetParent is not set\n // producing the error. See also animationStarted.\n let parent = element.offsetParent;\n if (!parent) {\n console.error(\"offsetParent is not set -- cannot scroll\");\n return;\n }\n let offsetY = element.offsetTop + element.clientTop;\n let offsetX = element.offsetLeft + element.clientLeft;\n while (\n (parent.clientHeight === parent.scrollHeight &&\n parent.clientWidth === parent.scrollWidth) ||\n (scrollMatches &&\n (parent.classList.contains(\"markedContent\") ||\n getComputedStyle(parent).overflow === \"hidden\"))\n ) {\n offsetY += parent.offsetTop;\n offsetX += parent.offsetLeft;\n\n parent = parent.offsetParent;\n if (!parent) {\n return; // no need to scroll\n }\n }\n if (spot) {\n if (spot.top !== undefined) {\n offsetY += spot.top;\n }\n if (spot.left !== undefined) {\n offsetX += spot.left;\n parent.scrollLeft = offsetX;\n }\n }\n parent.scrollTop = offsetY;\n}\n\n/**\n * Helper function to start monitoring the scroll event and converting them into\n * PDF.js friendly one: with scroll debounce and scroll direction.\n */\nfunction watchScroll(viewAreaElement, callback) {\n const debounceScroll = function (evt) {\n if (rAF) {\n return;\n }\n // schedule an invocation of scroll for next animation frame.\n rAF = window.requestAnimationFrame(function viewAreaElementScrolled() {\n rAF = null;\n\n const currentX = viewAreaElement.scrollLeft;\n const lastX = state.lastX;\n if (currentX !== lastX) {\n state.right = currentX > lastX;\n }\n state.lastX = currentX;\n const currentY = viewAreaElement.scrollTop;\n const lastY = state.lastY;\n if (currentY !== lastY) {\n state.down = currentY > lastY;\n }\n state.lastY = currentY;\n callback(state);\n });\n };\n\n const state = {\n right: true,\n down: true,\n lastX: viewAreaElement.scrollLeft,\n lastY: viewAreaElement.scrollTop,\n _eventHandler: debounceScroll,\n };\n\n let rAF = null;\n viewAreaElement.addEventListener(\"scroll\", debounceScroll, true);\n return state;\n}\n\n/**\n * Helper function to parse query string (e.g. ?param1=value¶m2=...).\n * @param {string} query\n * @returns {Map}\n */\nfunction parseQueryString(query) {\n const params = new Map();\n for (const [key, value] of new URLSearchParams(query)) {\n params.set(key.toLowerCase(), value);\n }\n return params;\n}\n\nconst InvisibleCharsRegExp = /[\\x00-\\x1F]/g;\n\n/**\n * @param {string} str\n * @param {boolean} [replaceInvisible]\n */\nfunction removeNullCharacters(str, replaceInvisible = false) {\n if (!InvisibleCharsRegExp.test(str)) {\n return str;\n }\n if (replaceInvisible) {\n return str.replaceAll(InvisibleCharsRegExp, m => (m === \"\\x00\" ? \"\" : \" \"));\n }\n return str.replaceAll(\"\\x00\", \"\");\n}\n\n/**\n * Use binary search to find the index of the first item in a given array which\n * passes a given condition. The items are expected to be sorted in the sense\n * that if the condition is true for one item in the array, then it is also true\n * for all following items.\n *\n * @returns {number} Index of the first array element to pass the test,\n * or |items.length| if no such element exists.\n */\nfunction binarySearchFirstItem(items, condition, start = 0) {\n let minIndex = start;\n let maxIndex = items.length - 1;\n\n if (maxIndex < 0 || !condition(items[maxIndex])) {\n return items.length;\n }\n if (condition(items[minIndex])) {\n return minIndex;\n }\n\n while (minIndex < maxIndex) {\n const currentIndex = (minIndex + maxIndex) >> 1;\n const currentItem = items[currentIndex];\n if (condition(currentItem)) {\n maxIndex = currentIndex;\n } else {\n minIndex = currentIndex + 1;\n }\n }\n return minIndex; /* === maxIndex */\n}\n\n/**\n * Approximates float number as a fraction using Farey sequence (max order\n * of 8).\n * @param {number} x - Positive float number.\n * @returns {Array} Estimated fraction: the first array item is a numerator,\n * the second one is a denominator.\n */\nfunction approximateFraction(x) {\n // Fast paths for int numbers or their inversions.\n if (Math.floor(x) === x) {\n return [x, 1];\n }\n const xinv = 1 / x;\n const limit = 8;\n if (xinv > limit) {\n return [1, limit];\n } else if (Math.floor(xinv) === xinv) {\n return [1, xinv];\n }\n\n const x_ = x > 1 ? xinv : x;\n // a/b and c/d are neighbours in Farey sequence.\n let a = 0,\n b = 1,\n c = 1,\n d = 1;\n // Limiting search to order 8.\n while (true) {\n // Generating next term in sequence (order of q).\n const p = a + c,\n q = b + d;\n if (q > limit) {\n break;\n }\n if (x_ <= p / q) {\n c = p;\n d = q;\n } else {\n a = p;\n b = q;\n }\n }\n let result;\n // Select closest of the neighbours to x.\n if (x_ - a / b < c / d - x_) {\n result = x_ === x ? [a, b] : [b, a];\n } else {\n result = x_ === x ? [c, d] : [d, c];\n }\n return result;\n}\n\nfunction roundToDivide(x, div) {\n const r = x % div;\n return r === 0 ? x : Math.round(x - r + div);\n}\n\n/**\n * @typedef {Object} GetPageSizeInchesParameters\n * @property {number[]} view\n * @property {number} userUnit\n * @property {number} rotate\n */\n\n/**\n * @typedef {Object} PageSize\n * @property {number} width - In inches.\n * @property {number} height - In inches.\n */\n\n/**\n * Gets the size of the specified page, converted from PDF units to inches.\n * @param {GetPageSizeInchesParameters} params\n * @returns {PageSize}\n */\nfunction getPageSizeInches({ view, userUnit, rotate }) {\n const [x1, y1, x2, y2] = view;\n // We need to take the page rotation into account as well.\n const changeOrientation = rotate % 180 !== 0;\n\n const width = ((x2 - x1) / 72) * userUnit;\n const height = ((y2 - y1) / 72) * userUnit;\n\n return {\n width: changeOrientation ? height : width,\n height: changeOrientation ? width : height,\n };\n}\n\n/**\n * Helper function for getVisibleElements.\n *\n * @param {number} index - initial guess at the first visible element\n * @param {Array} views - array of pages, into which `index` is an index\n * @param {number} top - the top of the scroll pane\n * @returns {number} less than or equal to `index` that is definitely at or\n * before the first visible element in `views`, but not by too much. (Usually,\n * this will be the first element in the first partially visible row in\n * `views`, although sometimes it goes back one row further.)\n */\nfunction backtrackBeforeAllVisibleElements(index, views, top) {\n // binarySearchFirstItem's assumption is that the input is ordered, with only\n // one index where the conditions flips from false to true: [false ...,\n // true...]. With vertical scrolling and spreads, it is possible to have\n // [false ..., true, false, true ...]. With wrapped scrolling we can have a\n // similar sequence, with many more mixed true and false in the middle.\n //\n // So there is no guarantee that the binary search yields the index of the\n // first visible element. It could have been any of the other visible elements\n // that were preceded by a hidden element.\n\n // Of course, if either this element or the previous (hidden) element is also\n // the first element, there's nothing to worry about.\n if (index < 2) {\n return index;\n }\n\n // That aside, the possible cases are represented below.\n //\n // **** = fully hidden\n // A*B* = mix of partially visible and/or hidden pages\n // CDEF = fully visible\n //\n // (1) Binary search could have returned A, in which case we can stop.\n // (2) Binary search could also have returned B, in which case we need to\n // check the whole row.\n // (3) Binary search could also have returned C, in which case we need to\n // check the whole previous row.\n //\n // There's one other possibility:\n //\n // **** = fully hidden\n // ABCD = mix of fully and/or partially visible pages\n //\n // (4) Binary search could only have returned A.\n\n // Initially assume that we need to find the beginning of the current row\n // (case 1, 2, or 4), which means finding a page that is above the current\n // page's top. If the found page is partially visible, we're definitely not in\n // case 3, and this assumption is correct.\n let elt = views[index].div;\n let pageTop = elt.offsetTop + elt.clientTop;\n\n if (pageTop >= top) {\n // The found page is fully visible, so we're actually either in case 3 or 4,\n // and unfortunately we can't tell the difference between them without\n // scanning the entire previous row, so we just conservatively assume that\n // we do need to backtrack to that row. In both cases, the previous page is\n // in the previous row, so use its top instead.\n elt = views[index - 1].div;\n pageTop = elt.offsetTop + elt.clientTop;\n }\n\n // Now we backtrack to the first page that still has its bottom below\n // `pageTop`, which is the top of a page in the first visible row (unless\n // we're in case 4, in which case it's the row before that).\n // `index` is found by binary search, so the page at `index - 1` is\n // invisible and we can start looking for potentially visible pages from\n // `index - 2`. (However, if this loop terminates on its first iteration,\n // which is the case when pages are stacked vertically, `index` should remain\n // unchanged, so we use a distinct loop variable.)\n for (let i = index - 2; i >= 0; --i) {\n elt = views[i].div;\n if (elt.offsetTop + elt.clientTop + elt.clientHeight <= pageTop) {\n // We have reached the previous row, so stop now.\n // This loop is expected to terminate relatively quickly because the\n // number of pages per row is expected to be small.\n break;\n }\n index = i;\n }\n return index;\n}\n\n/**\n * @typedef {Object} GetVisibleElementsParameters\n * @property {HTMLElement} scrollEl - A container that can possibly scroll.\n * @property {Array} views - Objects with a `div` property that contains an\n * HTMLElement, which should all be descendants of `scrollEl` satisfying the\n * relevant layout assumptions.\n * @property {boolean} sortByVisibility - If `true`, the returned elements are\n * sorted in descending order of the percent of their padding box that is\n * visible. The default value is `false`.\n * @property {boolean} horizontal - If `true`, the elements are assumed to be\n * laid out horizontally instead of vertically. The default value is `false`.\n * @property {boolean} rtl - If `true`, the `scrollEl` container is assumed to\n * be in right-to-left mode. The default value is `false`.\n */\n\n/**\n * Generic helper to find out what elements are visible within a scroll pane.\n *\n * Well, pretty generic. There are some assumptions placed on the elements\n * referenced by `views`:\n * - If `horizontal`, no left of any earlier element is to the right of the\n * left of any later element.\n * - Otherwise, `views` can be split into contiguous rows where, within a row,\n * no top of any element is below the bottom of any other element, and\n * between rows, no bottom of any element in an earlier row is below the\n * top of any element in a later row.\n *\n * (Here, top, left, etc. all refer to the padding edge of the element in\n * question. For pages, that ends up being equivalent to the bounding box of the\n * rendering canvas. Earlier and later refer to index in `views`, not page\n * layout.)\n *\n * @param {GetVisibleElementsParameters} params\n * @returns {Object} `{ first, last, views: [{ id, x, y, view, percent }] }`\n */\nfunction getVisibleElements({\n scrollEl,\n views,\n sortByVisibility = false,\n horizontal = false,\n rtl = false,\n}) {\n const top = scrollEl.scrollTop,\n bottom = top + scrollEl.clientHeight;\n const left = scrollEl.scrollLeft,\n right = left + scrollEl.clientWidth;\n\n // Throughout this \"generic\" function, comments will assume we're working with\n // PDF document pages, which is the most important and complex case. In this\n // case, the visible elements we're actually interested is the page canvas,\n // which is contained in a wrapper which adds no padding/border/margin, which\n // is itself contained in `view.div` which adds no padding (but does add a\n // border). So, as specified in this function's doc comment, this function\n // does all of its work on the padding edge of the provided views, starting at\n // offsetLeft/Top (which includes margin) and adding clientLeft/Top (which is\n // the border). Adding clientWidth/Height gets us the bottom-right corner of\n // the padding edge.\n function isElementBottomAfterViewTop(view) {\n const element = view.div;\n const elementBottom =\n element.offsetTop + element.clientTop + element.clientHeight;\n return elementBottom > top;\n }\n function isElementNextAfterViewHorizontally(view) {\n const element = view.div;\n const elementLeft = element.offsetLeft + element.clientLeft;\n const elementRight = elementLeft + element.clientWidth;\n return rtl ? elementLeft < right : elementRight > left;\n }\n\n const visible = [],\n ids = new Set(),\n numViews = views.length;\n let firstVisibleElementInd = binarySearchFirstItem(\n views,\n horizontal\n ? isElementNextAfterViewHorizontally\n : isElementBottomAfterViewTop\n );\n\n // Please note the return value of the `binarySearchFirstItem` function when\n // no valid element is found (hence the `firstVisibleElementInd` check below).\n if (\n firstVisibleElementInd > 0 &&\n firstVisibleElementInd < numViews &&\n !horizontal\n ) {\n // In wrapped scrolling (or vertical scrolling with spreads), with some page\n // sizes, isElementBottomAfterViewTop doesn't satisfy the binary search\n // condition: there can be pages with bottoms above the view top between\n // pages with bottoms below. This function detects and corrects that error;\n // see it for more comments.\n firstVisibleElementInd = backtrackBeforeAllVisibleElements(\n firstVisibleElementInd,\n views,\n top\n );\n }\n\n // lastEdge acts as a cutoff for us to stop looping, because we know all\n // subsequent pages will be hidden.\n //\n // When using wrapped scrolling or vertical scrolling with spreads, we can't\n // simply stop the first time we reach a page below the bottom of the view;\n // the tops of subsequent pages on the same row could still be visible. In\n // horizontal scrolling, we don't have that issue, so we can stop as soon as\n // we pass `right`, without needing the code below that handles the -1 case.\n let lastEdge = horizontal ? right : -1;\n\n for (let i = firstVisibleElementInd; i < numViews; i++) {\n const view = views[i],\n element = view.div;\n const currentWidth = element.offsetLeft + element.clientLeft;\n const currentHeight = element.offsetTop + element.clientTop;\n const viewWidth = element.clientWidth,\n viewHeight = element.clientHeight;\n const viewRight = currentWidth + viewWidth;\n const viewBottom = currentHeight + viewHeight;\n\n if (lastEdge === -1) {\n // As commented above, this is only needed in non-horizontal cases.\n // Setting lastEdge to the bottom of the first page that is partially\n // visible ensures that the next page fully below lastEdge is on the\n // next row, which has to be fully hidden along with all subsequent rows.\n if (viewBottom >= bottom) {\n lastEdge = viewBottom;\n }\n } else if ((horizontal ? currentWidth : currentHeight) > lastEdge) {\n break;\n }\n\n if (\n viewBottom <= top ||\n currentHeight >= bottom ||\n viewRight <= left ||\n currentWidth >= right\n ) {\n continue;\n }\n\n const hiddenHeight =\n Math.max(0, top - currentHeight) + Math.max(0, viewBottom - bottom);\n const hiddenWidth =\n Math.max(0, left - currentWidth) + Math.max(0, viewRight - right);\n\n const fractionHeight = (viewHeight - hiddenHeight) / viewHeight,\n fractionWidth = (viewWidth - hiddenWidth) / viewWidth;\n const percent = (fractionHeight * fractionWidth * 100) | 0;\n\n visible.push({\n id: view.id,\n x: currentWidth,\n y: currentHeight,\n view,\n percent,\n widthPercent: (fractionWidth * 100) | 0,\n });\n ids.add(view.id);\n }\n\n const first = visible[0],\n last = visible.at(-1);\n\n if (sortByVisibility) {\n visible.sort(function (a, b) {\n const pc = a.percent - b.percent;\n if (Math.abs(pc) > 0.001) {\n return -pc;\n }\n return a.id - b.id; // ensure stability\n });\n }\n return { first, last, views: visible, ids };\n}\n\nfunction normalizeWheelEventDirection(evt) {\n let delta = Math.hypot(evt.deltaX, evt.deltaY);\n const angle = Math.atan2(evt.deltaY, evt.deltaX);\n if (-0.25 * Math.PI < angle && angle < 0.75 * Math.PI) {\n // All that is left-up oriented has to change the sign.\n delta = -delta;\n }\n return delta;\n}\n\nfunction normalizeWheelEventDelta(evt) {\n const deltaMode = evt.deltaMode; // Avoid being affected by bug 1392460.\n let delta = normalizeWheelEventDirection(evt);\n\n const MOUSE_PIXELS_PER_LINE = 30;\n const MOUSE_LINES_PER_PAGE = 30;\n\n // Converts delta to per-page units\n if (deltaMode === WheelEvent.DOM_DELTA_PIXEL) {\n delta /= MOUSE_PIXELS_PER_LINE * MOUSE_LINES_PER_PAGE;\n } else if (deltaMode === WheelEvent.DOM_DELTA_LINE) {\n delta /= MOUSE_LINES_PER_PAGE;\n }\n return delta;\n}\n\nfunction isValidRotation(angle) {\n return Number.isInteger(angle) && angle % 90 === 0;\n}\n\nfunction isValidScrollMode(mode) {\n return (\n Number.isInteger(mode) &&\n Object.values(ScrollMode).includes(mode) &&\n mode !== ScrollMode.UNKNOWN\n );\n}\n\nfunction isValidSpreadMode(mode) {\n return (\n Number.isInteger(mode) &&\n Object.values(SpreadMode).includes(mode) &&\n mode !== SpreadMode.UNKNOWN\n );\n}\n\nfunction isPortraitOrientation(size) {\n return size.width <= size.height;\n}\n\n/**\n * Promise that is resolved when DOM window becomes visible.\n */\nconst animationStarted = new Promise(function (resolve) {\n if (\n typeof PDFJSDev !== \"undefined\" &&\n PDFJSDev.test(\"LIB\") &&\n typeof window === \"undefined\"\n ) {\n // Prevent \"ReferenceError: window is not defined\" errors when running the\n // unit-tests in Node.js environments.\n setTimeout(resolve, 20);\n return;\n }\n window.requestAnimationFrame(resolve);\n});\n\nconst docStyle =\n typeof PDFJSDev !== \"undefined\" &&\n PDFJSDev.test(\"LIB\") &&\n typeof document === \"undefined\"\n ? null\n : document.documentElement.style;\n\nfunction clamp(v, min, max) {\n return Math.min(Math.max(v, min), max);\n}\n\nclass ProgressBar {\n #classList = null;\n\n #disableAutoFetchTimeout = null;\n\n #percent = 0;\n\n #style = null;\n\n #visible = true;\n\n constructor(bar) {\n this.#classList = bar.classList;\n this.#style = bar.style;\n }\n\n get percent() {\n return this.#percent;\n }\n\n set percent(val) {\n this.#percent = clamp(val, 0, 100);\n\n if (isNaN(val)) {\n this.#classList.add(\"indeterminate\");\n return;\n }\n this.#classList.remove(\"indeterminate\");\n\n this.#style.setProperty(\"--progressBar-percent\", `${this.#percent}%`);\n }\n\n setWidth(viewer) {\n if (!viewer) {\n return;\n }\n const container = viewer.parentNode;\n const scrollbarWidth = container.offsetWidth - viewer.offsetWidth;\n if (scrollbarWidth > 0) {\n this.#style.setProperty(\n \"--progressBar-end-offset\",\n `${scrollbarWidth}px`\n );\n }\n }\n\n setDisableAutoFetch(delay = /* ms = */ 5000) {\n if (isNaN(this.#percent)) {\n return;\n }\n if (this.#disableAutoFetchTimeout) {\n clearTimeout(this.#disableAutoFetchTimeout);\n }\n this.show();\n\n this.#disableAutoFetchTimeout = setTimeout(() => {\n this.#disableAutoFetchTimeout = null;\n this.hide();\n }, delay);\n }\n\n hide() {\n if (!this.#visible) {\n return;\n }\n this.#visible = false;\n this.#classList.add(\"hidden\");\n }\n\n show() {\n if (this.#visible) {\n return;\n }\n this.#visible = true;\n this.#classList.remove(\"hidden\");\n }\n}\n\n/**\n * Get the active or focused element in current DOM.\n *\n * Recursively search for the truly active or focused element in case there are\n * shadow DOMs.\n *\n * @returns {Element} the truly active or focused element.\n */\nfunction getActiveOrFocusedElement() {\n let curRoot = document;\n let curActiveOrFocused =\n curRoot.activeElement || curRoot.querySelector(\":focus\");\n\n while (curActiveOrFocused?.shadowRoot) {\n curRoot = curActiveOrFocused.shadowRoot;\n curActiveOrFocused =\n curRoot.activeElement || curRoot.querySelector(\":focus\");\n }\n\n return curActiveOrFocused;\n}\n\n/**\n * Converts API PageLayout values to the format used by `BaseViewer`.\n * @param {string} layout - The API PageLayout value.\n * @returns {Object}\n */\nfunction apiPageLayoutToViewerModes(layout) {\n let scrollMode = ScrollMode.VERTICAL,\n spreadMode = SpreadMode.NONE;\n\n switch (layout) {\n case \"SinglePage\":\n scrollMode = ScrollMode.PAGE;\n break;\n case \"OneColumn\":\n break;\n case \"TwoPageLeft\":\n scrollMode = ScrollMode.PAGE;\n /* falls through */\n case \"TwoColumnLeft\":\n spreadMode = SpreadMode.ODD;\n break;\n case \"TwoPageRight\":\n scrollMode = ScrollMode.PAGE;\n /* falls through */\n case \"TwoColumnRight\":\n spreadMode = SpreadMode.EVEN;\n break;\n }\n return { scrollMode, spreadMode };\n}\n\n/**\n * Converts API PageMode values to the format used by `PDFSidebar`.\n * NOTE: There's also a \"FullScreen\" parameter which is not possible to support,\n * since the Fullscreen API used in browsers requires that entering\n * fullscreen mode only occurs as a result of a user-initiated event.\n * @param {string} mode - The API PageMode value.\n * @returns {number} A value from {SidebarView}.\n */\nfunction apiPageModeToSidebarView(mode) {\n switch (mode) {\n case \"UseNone\":\n return SidebarView.NONE;\n case \"UseThumbs\":\n return SidebarView.THUMBS;\n case \"UseOutlines\":\n return SidebarView.OUTLINE;\n case \"UseAttachments\":\n return SidebarView.ATTACHMENTS;\n case \"UseOC\":\n return SidebarView.LAYERS;\n }\n return SidebarView.NONE; // Default value.\n}\n\nfunction toggleCheckedBtn(button, toggle, view = null) {\n button.classList.toggle(\"toggled\", toggle);\n button.setAttribute(\"aria-checked\", toggle);\n\n view?.classList.toggle(\"hidden\", !toggle);\n}\n\nfunction toggleExpandedBtn(button, toggle, view = null) {\n button.classList.toggle(\"toggled\", toggle);\n button.setAttribute(\"aria-expanded\", toggle);\n\n view?.classList.toggle(\"hidden\", !toggle);\n}\n\nexport {\n animationStarted,\n apiPageLayoutToViewerModes,\n apiPageModeToSidebarView,\n approximateFraction,\n AutoPrintRegExp,\n backtrackBeforeAllVisibleElements, // only exported for testing\n binarySearchFirstItem,\n CursorTool,\n DEFAULT_SCALE,\n DEFAULT_SCALE_DELTA,\n DEFAULT_SCALE_VALUE,\n docStyle,\n getActiveOrFocusedElement,\n getPageSizeInches,\n getVisibleElements,\n isPortraitOrientation,\n isValidRotation,\n isValidScrollMode,\n isValidSpreadMode,\n MAX_AUTO_SCALE,\n MAX_SCALE,\n MIN_SCALE,\n normalizeWheelEventDelta,\n normalizeWheelEventDirection,\n OutputScale,\n parseQueryString,\n PresentationModeState,\n ProgressBar,\n removeNullCharacters,\n RenderingStates,\n roundToDivide,\n SCROLLBAR_PADDING,\n scrollIntoView,\n ScrollMode,\n SidebarView,\n SpreadMode,\n TextLayerMode,\n toggleCheckedBtn,\n toggleExpandedBtn,\n UNKNOWN_SCALE,\n VERTICAL_PADDING,\n watchScroll,\n};\n","/* Copyright 2018 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nif (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n // eslint-disable-next-line no-var\n var compatibilityParams = Object.create(null);\n if (\n typeof PDFJSDev !== \"undefined\" &&\n PDFJSDev.test(\"LIB\") &&\n typeof navigator === \"undefined\"\n ) {\n globalThis.navigator = Object.create(null);\n }\n const userAgent = navigator.userAgent || \"\";\n const platform = navigator.platform || \"\";\n const maxTouchPoints = navigator.maxTouchPoints || 1;\n\n const isAndroid = /Android/.test(userAgent);\n const isIOS =\n /\\b(iPad|iPhone|iPod)(?=;)/.test(userAgent) ||\n (platform === \"MacIntel\" && maxTouchPoints > 1);\n\n // Limit canvas size to 5 mega-pixels on mobile.\n // Support: Android, iOS\n (function checkCanvasSizeLimitation() {\n if (isIOS || isAndroid) {\n compatibilityParams.maxCanvasPixels = 5242880;\n }\n })();\n}\n\nconst OptionKind = {\n BROWSER: 0x01,\n VIEWER: 0x02,\n API: 0x04,\n WORKER: 0x08,\n PREFERENCE: 0x80,\n};\n\n/**\n * NOTE: These options are used to generate the `default_preferences.json` file,\n * see `OptionKind.PREFERENCE`, hence the values below must use only\n * primitive types and cannot rely on any imported types.\n */\nconst defaultOptions = {\n canvasMaxAreaInBytes: {\n /** @type {number} */\n value: -1,\n kind: OptionKind.BROWSER + OptionKind.API,\n },\n isInAutomation: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.BROWSER,\n },\n supportsCaretBrowsingMode: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.BROWSER,\n },\n supportsDocumentFonts: {\n /** @type {boolean} */\n value: true,\n kind: OptionKind.BROWSER,\n },\n supportsIntegratedFind: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.BROWSER,\n },\n supportsMouseWheelZoomCtrlKey: {\n /** @type {boolean} */\n value: true,\n kind: OptionKind.BROWSER,\n },\n supportsMouseWheelZoomMetaKey: {\n /** @type {boolean} */\n value: true,\n kind: OptionKind.BROWSER,\n },\n supportsPinchToZoom: {\n /** @type {boolean} */\n value: true,\n kind: OptionKind.BROWSER,\n },\n\n annotationEditorMode: {\n /** @type {number} */\n value: 0,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n annotationMode: {\n /** @type {number} */\n value: 2,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n cursorToolOnLoad: {\n /** @type {number} */\n value: 0,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n debuggerSrc: {\n /** @type {string} */\n value: \"./debugger.mjs\",\n kind: OptionKind.VIEWER,\n },\n defaultZoomDelay: {\n /** @type {number} */\n value: 400,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n defaultZoomValue: {\n /** @type {string} */\n value: \"\",\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n disableHistory: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.VIEWER,\n },\n disablePageLabels: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n enableHighlightEditor: {\n // We'll probably want to make some experiments before enabling this\n // in Firefox release, but it has to be temporary.\n // TODO: remove it when unnecessary.\n /** @type {boolean} */\n value: typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\"),\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n enableHighlightFloatingButton: {\n // We'll probably want to make some experiments before enabling this\n // in Firefox release, but it has to be temporary.\n // TODO: remove it when unnecessary.\n /** @type {boolean} */\n value: typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\"),\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n enableML: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n enablePermissions: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n enablePrintAutoRotate: {\n /** @type {boolean} */\n value: true,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n enableScripting: {\n /** @type {boolean} */\n value: typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"CHROME\"),\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n enableStampEditor: {\n // We'll probably want to make some experiments before enabling this\n // in Firefox release, but it has to be temporary.\n // TODO: remove it when unnecessary.\n /** @type {boolean} */\n value: true,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n externalLinkRel: {\n /** @type {string} */\n value: \"noopener noreferrer nofollow\",\n kind: OptionKind.VIEWER,\n },\n externalLinkTarget: {\n /** @type {number} */\n value: 0,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n highlightEditorColors: {\n /** @type {string} */\n value: \"yellow=#FFFF98,green=#53FFBC,blue=#80EBFF,pink=#FFCBE6,red=#FF4F5F\",\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n historyUpdateUrl: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n ignoreDestinationZoom: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n imageResourcesPath: {\n /** @type {string} */\n value:\n typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")\n ? \"resource://pdf.js/web/images/\"\n : \"./images/\",\n kind: OptionKind.VIEWER,\n },\n maxCanvasPixels: {\n /** @type {number} */\n value: 2 ** 25,\n kind: OptionKind.VIEWER,\n },\n forcePageColors: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n pageColorsBackground: {\n /** @type {string} */\n value: \"Canvas\",\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n pageColorsForeground: {\n /** @type {string} */\n value: \"CanvasText\",\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n pdfBugEnabled: {\n /** @type {boolean} */\n value: typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\"),\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n printResolution: {\n /** @type {number} */\n value: 150,\n kind: OptionKind.VIEWER,\n },\n sidebarViewOnLoad: {\n /** @type {number} */\n value: -1,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n scrollModeOnLoad: {\n /** @type {number} */\n value: -1,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n spreadModeOnLoad: {\n /** @type {number} */\n value: -1,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n textLayerMode: {\n /** @type {number} */\n value: 1,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n viewOnLoad: {\n /** @type {boolean} */\n value: 0,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n\n cMapPacked: {\n /** @type {boolean} */\n value: true,\n kind: OptionKind.API,\n },\n cMapUrl: {\n /** @type {string} */\n value:\n // eslint-disable-next-line no-nested-ternary\n typeof PDFJSDev === \"undefined\"\n ? \"../external/bcmaps/\"\n : PDFJSDev.test(\"MOZCENTRAL\")\n ? \"resource://pdf.js/web/cmaps/\"\n : \"../web/cmaps/\",\n kind: OptionKind.API,\n },\n disableAutoFetch: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.API + OptionKind.PREFERENCE,\n },\n disableFontFace: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.API + OptionKind.PREFERENCE,\n },\n disableRange: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.API + OptionKind.PREFERENCE,\n },\n disableStream: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.API + OptionKind.PREFERENCE,\n },\n docBaseUrl: {\n /** @type {string} */\n value: \"\",\n kind: OptionKind.API,\n },\n enableXfa: {\n /** @type {boolean} */\n value: true,\n kind: OptionKind.API + OptionKind.PREFERENCE,\n },\n fontExtraProperties: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.API,\n },\n isEvalSupported: {\n /** @type {boolean} */\n value: true,\n kind: OptionKind.API,\n },\n isOffscreenCanvasSupported: {\n /** @type {boolean} */\n value: true,\n kind: OptionKind.API,\n },\n maxImageSize: {\n /** @type {number} */\n value: -1,\n kind: OptionKind.API,\n },\n pdfBug: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.API,\n },\n standardFontDataUrl: {\n /** @type {string} */\n value:\n // eslint-disable-next-line no-nested-ternary\n typeof PDFJSDev === \"undefined\"\n ? \"../external/standard_fonts/\"\n : PDFJSDev.test(\"MOZCENTRAL\")\n ? \"resource://pdf.js/web/standard_fonts/\"\n : \"../web/standard_fonts/\",\n kind: OptionKind.API,\n },\n verbosity: {\n /** @type {number} */\n value: 1,\n kind: OptionKind.API,\n },\n\n workerPort: {\n /** @type {Object} */\n value: null,\n kind: OptionKind.WORKER,\n },\n workerSrc: {\n /** @type {string} */\n value:\n // eslint-disable-next-line no-nested-ternary\n typeof PDFJSDev === \"undefined\"\n ? \"../src/pdf.worker.js\"\n : PDFJSDev.test(\"MOZCENTRAL\")\n ? \"resource://pdf.js/build/pdf.worker.mjs\"\n : \"../build/pdf.worker.mjs\",\n kind: OptionKind.WORKER,\n },\n};\nif (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) {\n defaultOptions.defaultUrl = {\n /** @type {string} */\n value:\n typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"CHROME\")\n ? \"\"\n : \"compressed.tracemonkey-pldi-09.pdf\",\n kind: OptionKind.VIEWER,\n };\n defaultOptions.sandboxBundleSrc = {\n /** @type {string} */\n value:\n typeof PDFJSDev === \"undefined\"\n ? \"../build/dev-sandbox/pdf.sandbox.mjs\"\n : \"../build/pdf.sandbox.mjs\",\n kind: OptionKind.VIEWER,\n };\n defaultOptions.viewerCssTheme = {\n /** @type {number} */\n value: typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"CHROME\") ? 2 : 0,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n };\n}\nif (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n defaultOptions.disablePreferences = {\n /** @type {boolean} */\n value: typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\"),\n kind: OptionKind.VIEWER,\n };\n defaultOptions.locale = {\n /** @type {string} */\n value: navigator.language || \"en-US\",\n kind: OptionKind.VIEWER,\n };\n} else if (PDFJSDev.test(\"CHROME\")) {\n defaultOptions.disableTelemetry = {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n };\n}\n\nconst userOptions = Object.create(null);\n\nif (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n // Apply any compatibility-values to the user-options,\n // see also `AppOptions.remove` below.\n for (const name in compatibilityParams) {\n userOptions[name] = compatibilityParams[name];\n }\n}\n\nif (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING || LIB\")) {\n // Ensure that the `defaultOptions` are correctly specified.\n for (const name in defaultOptions) {\n const { value, kind } = defaultOptions[name];\n\n if (kind & OptionKind.PREFERENCE) {\n if (kind === OptionKind.PREFERENCE) {\n throw new Error(`Cannot use only \"PREFERENCE\" kind: ${name}`);\n }\n if (kind & OptionKind.BROWSER) {\n throw new Error(`Cannot mix \"PREFERENCE\" and \"BROWSER\" kind: ${name}`);\n }\n if (\n typeof compatibilityParams === \"object\" &&\n compatibilityParams[name] !== undefined\n ) {\n throw new Error(\n `Should not have compatibility-value for \"PREFERENCE\" kind: ${name}`\n );\n }\n // Only \"simple\" preference-values are allowed.\n if (\n typeof value !== \"boolean\" &&\n typeof value !== \"string\" &&\n !Number.isInteger(value)\n ) {\n throw new Error(`Invalid value for \"PREFERENCE\" kind: ${name}`);\n }\n }\n }\n}\n\nclass AppOptions {\n constructor() {\n throw new Error(\"Cannot initialize AppOptions.\");\n }\n\n static get(name) {\n return userOptions[name] ?? defaultOptions[name]?.value ?? undefined;\n }\n\n static getAll(kind = null, defaultOnly = false) {\n const options = Object.create(null);\n for (const name in defaultOptions) {\n const defaultOption = defaultOptions[name];\n\n if (kind && !(kind & defaultOption.kind)) {\n continue;\n }\n options[name] = defaultOnly\n ? defaultOption.value\n : userOptions[name] ?? defaultOption.value;\n }\n return options;\n }\n\n static set(name, value) {\n userOptions[name] = value;\n }\n\n static setAll(options, init = false) {\n if ((typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) && init) {\n if (this.get(\"disablePreferences\")) {\n // Give custom implementations of the default viewer a simpler way to\n // opt-out of having the `Preferences` override existing `AppOptions`.\n return;\n }\n for (const name in userOptions) {\n // Ignore any compatibility-values in the user-options.\n if (compatibilityParams[name] !== undefined) {\n continue;\n }\n console.warn(\n \"setAll: The Preferences may override manually set AppOptions; \" +\n 'please use the \"disablePreferences\"-option in order to prevent that.'\n );\n break;\n }\n }\n\n for (const name in options) {\n userOptions[name] = options[name];\n }\n }\n\n static remove(name) {\n delete userOptions[name];\n\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n // Re-apply a compatibility-value, if it exists, to the user-options.\n const val = compatibilityParams[name];\n if (val !== undefined) {\n userOptions[name] = val;\n }\n }\n }\n}\n\nexport { AppOptions, OptionKind };\n","/* Copyright 2015 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./event_utils\").EventBus} EventBus */\n/** @typedef {import(\"./interfaces\").IPDFLinkService} IPDFLinkService */\n\nimport { parseQueryString } from \"./ui_utils.js\";\n\nconst DEFAULT_LINK_REL = \"noopener noreferrer nofollow\";\n\nconst LinkTarget = {\n NONE: 0, // Default value.\n SELF: 1,\n BLANK: 2,\n PARENT: 3,\n TOP: 4,\n};\n\n/**\n * @typedef {Object} PDFLinkServiceOptions\n * @property {EventBus} eventBus - The application event bus.\n * @property {number} [externalLinkTarget] - Specifies the `target` attribute\n * for external links. Must use one of the values from {LinkTarget}.\n * Defaults to using no target.\n * @property {string} [externalLinkRel] - Specifies the `rel` attribute for\n * external links. Defaults to stripping the referrer.\n * @property {boolean} [ignoreDestinationZoom] - Ignores the zoom argument,\n * thus preserving the current zoom level in the viewer, when navigating\n * to internal destinations. The default value is `false`.\n */\n\n/**\n * Performs navigation functions inside PDF, such as opening specified page,\n * or destination.\n * @implements {IPDFLinkService}\n */\nclass PDFLinkService {\n externalLinkEnabled = true;\n\n /**\n * @param {PDFLinkServiceOptions} options\n */\n constructor({\n eventBus,\n externalLinkTarget = null,\n externalLinkRel = null,\n ignoreDestinationZoom = false,\n } = {}) {\n this.eventBus = eventBus;\n this.externalLinkTarget = externalLinkTarget;\n this.externalLinkRel = externalLinkRel;\n this._ignoreDestinationZoom = ignoreDestinationZoom;\n\n this.baseUrl = null;\n this.pdfDocument = null;\n this.pdfViewer = null;\n this.pdfHistory = null;\n }\n\n setDocument(pdfDocument, baseUrl = null) {\n this.baseUrl = baseUrl;\n this.pdfDocument = pdfDocument;\n }\n\n setViewer(pdfViewer) {\n this.pdfViewer = pdfViewer;\n }\n\n setHistory(pdfHistory) {\n this.pdfHistory = pdfHistory;\n }\n\n /**\n * @type {number}\n */\n get pagesCount() {\n return this.pdfDocument ? this.pdfDocument.numPages : 0;\n }\n\n /**\n * @type {number}\n */\n get page() {\n return this.pdfDocument ? this.pdfViewer.currentPageNumber : 1;\n }\n\n /**\n * @param {number} value\n */\n set page(value) {\n if (this.pdfDocument) {\n this.pdfViewer.currentPageNumber = value;\n }\n }\n\n /**\n * @type {number}\n */\n get rotation() {\n return this.pdfDocument ? this.pdfViewer.pagesRotation : 0;\n }\n\n /**\n * @param {number} value\n */\n set rotation(value) {\n if (this.pdfDocument) {\n this.pdfViewer.pagesRotation = value;\n }\n }\n\n /**\n * @type {boolean}\n */\n get isInPresentationMode() {\n return this.pdfDocument ? this.pdfViewer.isInPresentationMode : false;\n }\n\n /**\n * This method will, when available, also update the browser history.\n *\n * @param {string|Array} dest - The named, or explicit, PDF destination.\n */\n async goToDestination(dest) {\n if (!this.pdfDocument) {\n return;\n }\n let namedDest, explicitDest, pageNumber;\n if (typeof dest === \"string\") {\n namedDest = dest;\n explicitDest = await this.pdfDocument.getDestination(dest);\n } else {\n namedDest = null;\n explicitDest = await dest;\n }\n if (!Array.isArray(explicitDest)) {\n console.error(\n `goToDestination: \"${explicitDest}\" is not a valid destination array, for dest=\"${dest}\".`\n );\n return;\n }\n // Dest array looks like that: \n const [destRef] = explicitDest;\n\n if (destRef && typeof destRef === \"object\") {\n pageNumber = this.pdfDocument.cachedPageNumber(destRef);\n\n if (!pageNumber) {\n // Fetch the page reference if it's not yet available. This could\n // only occur during loading, before all pages have been resolved.\n try {\n pageNumber = (await this.pdfDocument.getPageIndex(destRef)) + 1;\n } catch {\n console.error(\n `goToDestination: \"${destRef}\" is not a valid page reference, for dest=\"${dest}\".`\n );\n return;\n }\n }\n } else if (Number.isInteger(destRef)) {\n pageNumber = destRef + 1;\n }\n if (!pageNumber || pageNumber < 1 || pageNumber > this.pagesCount) {\n console.error(\n `goToDestination: \"${pageNumber}\" is not a valid page number, for dest=\"${dest}\".`\n );\n return;\n }\n\n if (this.pdfHistory) {\n // Update the browser history before scrolling the new destination into\n // view, to be able to accurately capture the current document position.\n this.pdfHistory.pushCurrentPosition();\n this.pdfHistory.push({ namedDest, explicitDest, pageNumber });\n }\n\n this.pdfViewer.scrollPageIntoView({\n pageNumber,\n destArray: explicitDest,\n ignoreDestinationZoom: this._ignoreDestinationZoom,\n });\n }\n\n /**\n * This method will, when available, also update the browser history.\n *\n * @param {number|string} val - The page number, or page label.\n */\n goToPage(val) {\n if (!this.pdfDocument) {\n return;\n }\n const pageNumber =\n (typeof val === \"string\" && this.pdfViewer.pageLabelToPageNumber(val)) ||\n val | 0;\n if (\n !(\n Number.isInteger(pageNumber) &&\n pageNumber > 0 &&\n pageNumber <= this.pagesCount\n )\n ) {\n console.error(`PDFLinkService.goToPage: \"${val}\" is not a valid page.`);\n return;\n }\n\n if (this.pdfHistory) {\n // Update the browser history before scrolling the new page into view,\n // to be able to accurately capture the current document position.\n this.pdfHistory.pushCurrentPosition();\n this.pdfHistory.pushPage(pageNumber);\n }\n\n this.pdfViewer.scrollPageIntoView({ pageNumber });\n }\n\n /**\n * Adds various attributes (href, title, target, rel) to hyperlinks.\n * @param {HTMLAnchorElement} link\n * @param {string} url\n * @param {boolean} [newWindow]\n */\n addLinkAttributes(link, url, newWindow = false) {\n if (!url || typeof url !== \"string\") {\n throw new Error('A valid \"url\" parameter must provided.');\n }\n const target = newWindow ? LinkTarget.BLANK : this.externalLinkTarget,\n rel = this.externalLinkRel;\n\n if (this.externalLinkEnabled) {\n link.href = link.title = url;\n } else {\n link.href = \"\";\n link.title = `Disabled: ${url}`;\n link.onclick = () => false;\n }\n\n let targetStr = \"\"; // LinkTarget.NONE\n switch (target) {\n case LinkTarget.NONE:\n break;\n case LinkTarget.SELF:\n targetStr = \"_self\";\n break;\n case LinkTarget.BLANK:\n targetStr = \"_blank\";\n break;\n case LinkTarget.PARENT:\n targetStr = \"_parent\";\n break;\n case LinkTarget.TOP:\n targetStr = \"_top\";\n break;\n }\n link.target = targetStr;\n\n link.rel = typeof rel === \"string\" ? rel : DEFAULT_LINK_REL;\n }\n\n /**\n * @param {string|Array} dest - The PDF destination object.\n * @returns {string} The hyperlink to the PDF object.\n */\n getDestinationHash(dest) {\n if (typeof dest === \"string\") {\n if (dest.length > 0) {\n return this.getAnchorUrl(\"#\" + escape(dest));\n }\n } else if (Array.isArray(dest)) {\n const str = JSON.stringify(dest);\n if (str.length > 0) {\n return this.getAnchorUrl(\"#\" + escape(str));\n }\n }\n return this.getAnchorUrl(\"\");\n }\n\n /**\n * Prefix the full url on anchor links to make sure that links are resolved\n * relative to the current URL instead of the one defined in .\n * @param {string} anchor - The anchor hash, including the #.\n * @returns {string} The hyperlink to the PDF object.\n */\n getAnchorUrl(anchor) {\n return this.baseUrl ? this.baseUrl + anchor : anchor;\n }\n\n /**\n * @param {string} hash\n */\n setHash(hash) {\n if (!this.pdfDocument) {\n return;\n }\n let pageNumber, dest;\n if (hash.includes(\"=\")) {\n const params = parseQueryString(hash);\n if (params.has(\"search\")) {\n const query = params.get(\"search\").replaceAll('\"', \"\"),\n phrase = params.get(\"phrase\") === \"true\";\n\n this.eventBus.dispatch(\"findfromurlhash\", {\n source: this,\n query: phrase ? query : query.match(/\\S+/g),\n });\n }\n // borrowing syntax from \"Parameters for Opening PDF Files\"\n if (params.has(\"page\")) {\n pageNumber = params.get(\"page\") | 0 || 1;\n }\n if (params.has(\"zoom\")) {\n // Build the destination array.\n const zoomArgs = params.get(\"zoom\").split(\",\"); // scale,left,top\n const zoomArg = zoomArgs[0];\n const zoomArgNumber = parseFloat(zoomArg);\n\n if (!zoomArg.includes(\"Fit\")) {\n // If the zoomArg is a number, it has to get divided by 100. If it's\n // a string, it should stay as it is.\n dest = [\n null,\n { name: \"XYZ\" },\n zoomArgs.length > 1 ? zoomArgs[1] | 0 : null,\n zoomArgs.length > 2 ? zoomArgs[2] | 0 : null,\n zoomArgNumber ? zoomArgNumber / 100 : zoomArg,\n ];\n } else if (zoomArg === \"Fit\" || zoomArg === \"FitB\") {\n dest = [null, { name: zoomArg }];\n } else if (\n zoomArg === \"FitH\" ||\n zoomArg === \"FitBH\" ||\n zoomArg === \"FitV\" ||\n zoomArg === \"FitBV\"\n ) {\n dest = [\n null,\n { name: zoomArg },\n zoomArgs.length > 1 ? zoomArgs[1] | 0 : null,\n ];\n } else if (zoomArg === \"FitR\") {\n if (zoomArgs.length !== 5) {\n console.error(\n 'PDFLinkService.setHash: Not enough parameters for \"FitR\".'\n );\n } else {\n dest = [\n null,\n { name: zoomArg },\n zoomArgs[1] | 0,\n zoomArgs[2] | 0,\n zoomArgs[3] | 0,\n zoomArgs[4] | 0,\n ];\n }\n } else {\n console.error(\n `PDFLinkService.setHash: \"${zoomArg}\" is not a valid zoom value.`\n );\n }\n }\n if (dest) {\n this.pdfViewer.scrollPageIntoView({\n pageNumber: pageNumber || this.page,\n destArray: dest,\n allowNegativeOffset: true,\n });\n } else if (pageNumber) {\n this.page = pageNumber; // simple page\n }\n if (params.has(\"pagemode\")) {\n this.eventBus.dispatch(\"pagemode\", {\n source: this,\n mode: params.get(\"pagemode\"),\n });\n }\n // Ensure that this parameter is *always* handled last, in order to\n // guarantee that it won't be overridden (e.g. by the \"page\" parameter).\n if (params.has(\"nameddest\")) {\n this.goToDestination(params.get(\"nameddest\"));\n }\n\n if (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) {\n return;\n }\n // Support opening of PDF attachments in the Firefox PDF Viewer,\n // which uses a couple of non-standard hash parameters; refer to\n // `DownloadManager.openOrDownloadData` in the firefoxcom.js file.\n if (!params.has(\"filename\") || !params.has(\"filedest\")) {\n return;\n }\n hash = params.get(\"filedest\");\n }\n\n // Named (or explicit) destination.\n dest = unescape(hash);\n try {\n dest = JSON.parse(dest);\n\n if (!Array.isArray(dest)) {\n // Avoid incorrectly rejecting a valid named destination, such as\n // e.g. \"4.3\" or \"true\", because `JSON.parse` converted its type.\n dest = dest.toString();\n }\n } catch {}\n\n if (typeof dest === \"string\" || PDFLinkService.#isValidExplicitDest(dest)) {\n this.goToDestination(dest);\n return;\n }\n console.error(\n `PDFLinkService.setHash: \"${unescape(hash)}\" is not a valid destination.`\n );\n }\n\n /**\n * @param {string} action\n */\n executeNamedAction(action) {\n if (!this.pdfDocument) {\n return;\n }\n // See PDF reference, table 8.45 - Named action\n switch (action) {\n case \"GoBack\":\n this.pdfHistory?.back();\n break;\n\n case \"GoForward\":\n this.pdfHistory?.forward();\n break;\n\n case \"NextPage\":\n this.pdfViewer.nextPage();\n break;\n\n case \"PrevPage\":\n this.pdfViewer.previousPage();\n break;\n\n case \"LastPage\":\n this.page = this.pagesCount;\n break;\n\n case \"FirstPage\":\n this.page = 1;\n break;\n\n default:\n break; // No action according to spec\n }\n\n this.eventBus.dispatch(\"namedaction\", {\n source: this,\n action,\n });\n }\n\n /**\n * @param {Object} action\n */\n async executeSetOCGState(action) {\n if (!this.pdfDocument) {\n return;\n }\n const pdfDocument = this.pdfDocument,\n optionalContentConfig = await this.pdfViewer.optionalContentConfigPromise;\n\n if (pdfDocument !== this.pdfDocument) {\n return; // The document was closed while the optional content resolved.\n }\n optionalContentConfig.setOCGState(action);\n\n this.pdfViewer.optionalContentConfigPromise = Promise.resolve(\n optionalContentConfig\n );\n }\n\n static #isValidExplicitDest(dest) {\n if (!Array.isArray(dest) || dest.length < 2) {\n return false;\n }\n const [page, zoom, ...args] = dest;\n if (\n !(\n typeof page === \"object\" &&\n Number.isInteger(page?.num) &&\n Number.isInteger(page?.gen)\n ) &&\n !Number.isInteger(page)\n ) {\n return false;\n }\n if (!(typeof zoom === \"object\" && typeof zoom?.name === \"string\")) {\n return false;\n }\n let allowNull = true;\n switch (zoom.name) {\n case \"XYZ\":\n if (args.length !== 3) {\n return false;\n }\n break;\n case \"Fit\":\n case \"FitB\":\n return args.length === 0;\n case \"FitH\":\n case \"FitBH\":\n case \"FitV\":\n case \"FitBV\":\n if (args.length !== 1) {\n return false;\n }\n break;\n case \"FitR\":\n if (args.length !== 4) {\n return false;\n }\n allowNull = false;\n break;\n default:\n return false;\n }\n for (const arg of args) {\n if (!(typeof arg === \"number\" || (allowNull && arg === null))) {\n return false;\n }\n }\n return true;\n }\n}\n\n/**\n * @implements {IPDFLinkService}\n */\nclass SimpleLinkService extends PDFLinkService {\n setDocument(pdfDocument, baseUrl = null) {}\n}\n\nexport { LinkTarget, PDFLinkService, SimpleLinkService };\n","/* Copyright 2016 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst {\n AbortException,\n AnnotationEditorLayer,\n AnnotationEditorParamsType,\n AnnotationEditorType,\n AnnotationEditorUIManager,\n AnnotationLayer,\n AnnotationMode,\n build,\n CMapCompressionType,\n ColorPicker,\n createValidAbsoluteUrl,\n DOMSVGFactory,\n DrawLayer,\n FeatureTest,\n fetchData,\n getDocument,\n getFilenameFromUrl,\n getPdfFilenameFromUrl,\n getXfaPageViewport,\n GlobalWorkerOptions,\n ImageKind,\n InvalidPDFException,\n isDataScheme,\n isPdfFile,\n MissingPDFException,\n noContextMenu,\n normalizeUnicode,\n OPS,\n Outliner,\n PasswordResponses,\n PDFDataRangeTransport,\n PDFDateString,\n PDFWorker,\n PermissionFlag,\n PixelsPerInch,\n RenderingCancelledException,\n renderTextLayer,\n setLayerDimensions,\n shadow,\n TextLayer,\n UnexpectedResponseException,\n updateTextLayer,\n Util,\n VerbosityLevel,\n version,\n XfaLayer,\n} = globalThis.pdfjsLib;\n\nexport {\n AbortException,\n AnnotationEditorLayer,\n AnnotationEditorParamsType,\n AnnotationEditorType,\n AnnotationEditorUIManager,\n AnnotationLayer,\n AnnotationMode,\n build,\n CMapCompressionType,\n ColorPicker,\n createValidAbsoluteUrl,\n DOMSVGFactory,\n DrawLayer,\n FeatureTest,\n fetchData,\n getDocument,\n getFilenameFromUrl,\n getPdfFilenameFromUrl,\n getXfaPageViewport,\n GlobalWorkerOptions,\n ImageKind,\n InvalidPDFException,\n isDataScheme,\n isPdfFile,\n MissingPDFException,\n noContextMenu,\n normalizeUnicode,\n OPS,\n Outliner,\n PasswordResponses,\n PDFDataRangeTransport,\n PDFDateString,\n PDFWorker,\n PermissionFlag,\n PixelsPerInch,\n RenderingCancelledException,\n renderTextLayer,\n setLayerDimensions,\n shadow,\n TextLayer,\n UnexpectedResponseException,\n updateTextLayer,\n Util,\n VerbosityLevel,\n version,\n XfaLayer,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst WaitOnType = {\n EVENT: \"event\",\n TIMEOUT: \"timeout\",\n};\n\n/**\n * @typedef {Object} WaitOnEventOrTimeoutParameters\n * @property {Object} target - The event target, can for example be:\n * `window`, `document`, a DOM element, or an {EventBus} instance.\n * @property {string} name - The name of the event.\n * @property {number} delay - The delay, in milliseconds, after which the\n * timeout occurs (if the event wasn't already dispatched).\n */\n\n/**\n * Allows waiting for an event or a timeout, whichever occurs first.\n * Can be used to ensure that an action always occurs, even when an event\n * arrives late or not at all.\n *\n * @param {WaitOnEventOrTimeoutParameters}\n * @returns {Promise} A promise that is resolved with a {WaitOnType} value.\n */\nasync function waitOnEventOrTimeout({ target, name, delay = 0 }) {\n if (\n typeof target !== \"object\" ||\n !(name && typeof name === \"string\") ||\n !(Number.isInteger(delay) && delay >= 0)\n ) {\n throw new Error(\"waitOnEventOrTimeout - invalid parameters.\");\n }\n const { promise, resolve } = Promise.withResolvers();\n const ac = new AbortController();\n\n function handler(type) {\n ac.abort(); // Remove event listener.\n clearTimeout(timeout);\n\n resolve(type);\n }\n\n const evtMethod = target instanceof EventBus ? \"_on\" : \"addEventListener\";\n target[evtMethod](name, handler.bind(null, WaitOnType.EVENT), {\n signal: ac.signal,\n });\n\n const timeout = setTimeout(handler.bind(null, WaitOnType.TIMEOUT), delay);\n\n return promise;\n}\n\n/**\n * Simple event bus for an application. Listeners are attached using the `on`\n * and `off` methods. To raise an event, the `dispatch` method shall be used.\n */\nclass EventBus {\n #listeners = Object.create(null);\n\n /**\n * @param {string} eventName\n * @param {function} listener\n * @param {Object} [options]\n */\n on(eventName, listener, options = null) {\n this._on(eventName, listener, {\n external: true,\n once: options?.once,\n signal: options?.signal,\n });\n }\n\n /**\n * @param {string} eventName\n * @param {function} listener\n * @param {Object} [options]\n */\n off(eventName, listener, options = null) {\n this._off(eventName, listener);\n }\n\n /**\n * @param {string} eventName\n * @param {Object} data\n */\n dispatch(eventName, data) {\n const eventListeners = this.#listeners[eventName];\n if (!eventListeners || eventListeners.length === 0) {\n return;\n }\n let externalListeners;\n // Making copy of the listeners array in case if it will be modified\n // during dispatch.\n for (const { listener, external, once } of eventListeners.slice(0)) {\n if (once) {\n this._off(eventName, listener);\n }\n if (external) {\n (externalListeners ||= []).push(listener);\n continue;\n }\n listener(data);\n }\n // Dispatch any \"external\" listeners *after* the internal ones, to give the\n // viewer components time to handle events and update their state first.\n if (externalListeners) {\n for (const listener of externalListeners) {\n listener(data);\n }\n externalListeners = null;\n }\n }\n\n /**\n * @ignore\n */\n _on(eventName, listener, options = null) {\n let rmAbort = null;\n if (options?.signal instanceof AbortSignal) {\n const { signal } = options;\n if (signal.aborted) {\n console.error(\"Cannot use an `aborted` signal.\");\n return;\n }\n const onAbort = () => this._off(eventName, listener);\n rmAbort = () => signal.removeEventListener(\"abort\", onAbort);\n\n signal.addEventListener(\"abort\", onAbort);\n }\n\n const eventListeners = (this.#listeners[eventName] ||= []);\n eventListeners.push({\n listener,\n external: options?.external === true,\n once: options?.once === true,\n rmAbort,\n });\n }\n\n /**\n * @ignore\n */\n _off(eventName, listener, options = null) {\n const eventListeners = this.#listeners[eventName];\n if (!eventListeners) {\n return;\n }\n for (let i = 0, ii = eventListeners.length; i < ii; i++) {\n const evt = eventListeners[i];\n if (evt.listener === listener) {\n evt.rmAbort?.(); // Ensure that the `AbortSignal` listener is removed.\n eventListeners.splice(i, 1);\n return;\n }\n }\n }\n}\n\n/**\n * NOTE: Only used to support various PDF viewer tests in `mozilla-central`.\n */\nclass AutomationEventBus extends EventBus {\n dispatch(eventName, data) {\n if (typeof PDFJSDev !== \"undefined\" && !PDFJSDev.test(\"MOZCENTRAL\")) {\n throw new Error(\"Not implemented: AutomationEventBus.dispatch\");\n }\n super.dispatch(eventName, data);\n\n const detail = Object.create(null);\n if (data) {\n for (const key in data) {\n const value = data[key];\n if (key === \"source\") {\n if (value === window || value === document) {\n return; // No need to re-dispatch (already) global events.\n }\n continue; // Ignore the `source` property.\n }\n detail[key] = value;\n }\n }\n const event = new CustomEvent(eventName, {\n bubbles: true,\n cancelable: true,\n detail,\n });\n document.dispatchEvent(event);\n }\n}\n\nexport { AutomationEventBus, EventBus, waitOnEventOrTimeout, WaitOnType };\n","/* Copyright 2024 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./interfaces.js\").IL10n} IL10n */\n\nclass BaseExternalServices {\n constructor() {\n if (this.constructor === BaseExternalServices) {\n throw new Error(\"Cannot initialize BaseExternalServices.\");\n }\n }\n\n updateFindControlState(data) {}\n\n updateFindMatchesCount(data) {}\n\n initPassiveLoading() {}\n\n reportTelemetry(data) {}\n\n /**\n * @returns {Promise}\n */\n async createL10n() {\n throw new Error(\"Not implemented: createL10n\");\n }\n\n createScripting() {\n throw new Error(\"Not implemented: createScripting\");\n }\n\n updateEditorStates(data) {\n throw new Error(\"Not implemented: updateEditorStates\");\n }\n\n async getNimbusExperimentData() {}\n}\n\nexport { BaseExternalServices };\n","/* Copyright 2013 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AppOptions, OptionKind } from \"./app_options.js\";\n\n/**\n * BasePreferences - Abstract base class for storing persistent settings.\n * Used for settings that should be applied to all opened documents,\n * or every time the viewer is loaded.\n */\nclass BasePreferences {\n #browserDefaults = Object.freeze(\n typeof PDFJSDev === \"undefined\"\n ? AppOptions.getAll(OptionKind.BROWSER, /* defaultOnly = */ true)\n : PDFJSDev.eval(\"BROWSER_PREFERENCES\")\n );\n\n #defaults = Object.freeze(\n typeof PDFJSDev === \"undefined\"\n ? AppOptions.getAll(OptionKind.PREFERENCE, /* defaultOnly = */ true)\n : PDFJSDev.eval(\"DEFAULT_PREFERENCES\")\n );\n\n #prefs = Object.create(null);\n\n #initializedPromise = null;\n\n constructor() {\n if (this.constructor === BasePreferences) {\n throw new Error(\"Cannot initialize BasePreferences.\");\n }\n\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"CHROME\")) {\n Object.defineProperty(this, \"defaults\", {\n get() {\n return this.#defaults;\n },\n });\n }\n\n this.#initializedPromise = this._readFromStorage(this.#defaults).then(\n ({ browserPrefs, prefs }) => {\n const options = Object.create(null);\n\n for (const [name, val] of Object.entries(this.#browserDefaults)) {\n const prefVal = browserPrefs?.[name];\n options[name] = typeof prefVal === typeof val ? prefVal : val;\n }\n for (const [name, val] of Object.entries(this.#defaults)) {\n const prefVal = prefs?.[name];\n // Ignore preferences whose types don't match the default values.\n options[name] = this.#prefs[name] =\n typeof prefVal === typeof val ? prefVal : val;\n }\n AppOptions.setAll(options, /* init = */ true);\n\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n window.addEventListener(\"updatedPreference\", evt => {\n this.#updatePref(evt.detail);\n });\n }\n }\n );\n }\n\n /**\n * Stub function for writing preferences to storage.\n * @param {Object} prefObj The preferences that should be written to storage.\n * @returns {Promise} A promise that is resolved when the preference values\n * have been written.\n */\n async _writeToStorage(prefObj) {\n throw new Error(\"Not implemented: _writeToStorage\");\n }\n\n /**\n * Stub function for reading preferences from storage.\n * @param {Object} prefObj The preferences that should be read from storage.\n * @returns {Promise} A promise that is resolved with an {Object} containing\n * the preferences that have been read.\n */\n async _readFromStorage(prefObj) {\n throw new Error(\"Not implemented: _readFromStorage\");\n }\n\n #updatePref({ name, value }) {\n if (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) {\n throw new Error(\"Not implemented: #updatePref\");\n }\n\n if (name in this.#browserDefaults) {\n if (typeof value !== typeof this.#browserDefaults[name]) {\n return; // Invalid preference value.\n }\n } else if (name in this.#defaults) {\n if (typeof value !== typeof this.#defaults[name]) {\n return; // Invalid preference value.\n }\n this.#prefs[name] = value;\n } else {\n return; // Invalid preference.\n }\n AppOptions.set(name, value);\n }\n\n /**\n * Reset the preferences to their default values and update storage.\n * @returns {Promise} A promise that is resolved when the preference values\n * have been reset.\n */\n async reset() {\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n throw new Error(\"Please use `about:config` to change preferences.\");\n }\n await this.#initializedPromise;\n const oldPrefs = structuredClone(this.#prefs);\n\n this.#prefs = Object.create(null);\n try {\n await this._writeToStorage(this.#defaults);\n } catch (reason) {\n // Revert all preference values, since writing to storage failed.\n this.#prefs = oldPrefs;\n throw reason;\n }\n }\n\n /**\n * Set the value of a preference.\n * @param {string} name The name of the preference that should be changed.\n * @param {boolean|number|string} value The new value of the preference.\n * @returns {Promise} A promise that is resolved when the value has been set,\n * provided that the preference exists and the types match.\n */\n async set(name, value) {\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n throw new Error(\"Please use `about:config` to change preferences.\");\n }\n await this.#initializedPromise;\n const defaultValue = this.#defaults[name],\n oldPrefs = structuredClone(this.#prefs);\n\n if (defaultValue === undefined) {\n throw new Error(`Set preference: \"${name}\" is undefined.`);\n } else if (value === undefined) {\n throw new Error(\"Set preference: no value is specified.\");\n }\n const valueType = typeof value,\n defaultType = typeof defaultValue;\n\n if (valueType !== defaultType) {\n if (valueType === \"number\" && defaultType === \"string\") {\n value = value.toString();\n } else {\n throw new Error(\n `Set preference: \"${value}\" is a ${valueType}, expected a ${defaultType}.`\n );\n }\n } else if (valueType === \"number\" && !Number.isInteger(value)) {\n throw new Error(`Set preference: \"${value}\" must be an integer.`);\n }\n\n this.#prefs[name] = value;\n try {\n await this._writeToStorage(this.#prefs);\n } catch (reason) {\n // Revert all preference values, since writing to storage failed.\n this.#prefs = oldPrefs;\n throw reason;\n }\n }\n\n /**\n * Get the value of a preference.\n * @param {string} name The name of the preference whose value is requested.\n * @returns {Promise} A promise resolved with a {boolean|number|string}\n * containing the value of the preference.\n */\n async get(name) {\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n throw new Error(\"Not implemented: get\");\n }\n await this.#initializedPromise;\n const defaultValue = this.#defaults[name];\n\n if (defaultValue === undefined) {\n throw new Error(`Get preference: \"${name}\" is undefined.`);\n }\n return this.#prefs[name] ?? defaultValue;\n }\n\n get initializedPromise() {\n return this.#initializedPromise;\n }\n}\n\nexport { BasePreferences };\n","/**\n * The `FluentType` class is the base of Fluent's type system.\n *\n * Fluent types wrap JavaScript values and store additional configuration for\n * them, which can then be used in the `toString` method together with a proper\n * `Intl` formatter.\n */\nexport class FluentType {\n /**\n * Create a `FluentType` instance.\n *\n * @param value The JavaScript value to wrap.\n */\n constructor(value) {\n this.value = value;\n }\n /**\n * Unwrap the raw value stored by this `FluentType`.\n */\n valueOf() {\n return this.value;\n }\n}\n/**\n * A `FluentType` representing no correct value.\n */\nexport class FluentNone extends FluentType {\n /**\n * Create an instance of `FluentNone` with an optional fallback value.\n * @param value The fallback value of this `FluentNone`.\n */\n constructor(value = \"???\") {\n super(value);\n }\n /**\n * Format this `FluentNone` to the fallback string.\n */\n toString(scope) {\n return `{${this.value}}`;\n }\n}\n/**\n * A `FluentType` representing a number.\n *\n * A `FluentNumber` instance stores the number value of the number it\n * represents. It may also store an option bag of options which will be passed\n * to `Intl.NumerFormat` when the `FluentNumber` is formatted to a string.\n */\nexport class FluentNumber extends FluentType {\n /**\n * Create an instance of `FluentNumber` with options to the\n * `Intl.NumberFormat` constructor.\n *\n * @param value The number value of this `FluentNumber`.\n * @param opts Options which will be passed to `Intl.NumberFormat`.\n */\n constructor(value, opts = {}) {\n super(value);\n this.opts = opts;\n }\n /**\n * Format this `FluentNumber` to a string.\n */\n toString(scope) {\n try {\n const nf = scope.memoizeIntlObject(Intl.NumberFormat, this.opts);\n return nf.format(this.value);\n }\n catch (err) {\n scope.reportError(err);\n return this.value.toString(10);\n }\n }\n}\n/**\n * A `FluentType` representing a date and time.\n *\n * A `FluentDateTime` instance stores the number value of the date it\n * represents, as a numerical timestamp in milliseconds. It may also store an\n * option bag of options which will be passed to `Intl.DateTimeFormat` when the\n * `FluentDateTime` is formatted to a string.\n */\nexport class FluentDateTime extends FluentType {\n /**\n * Create an instance of `FluentDateTime` with options to the\n * `Intl.DateTimeFormat` constructor.\n *\n * @param value The number value of this `FluentDateTime`, in milliseconds.\n * @param opts Options which will be passed to `Intl.DateTimeFormat`.\n */\n constructor(value, opts = {}) {\n super(value);\n this.opts = opts;\n }\n /**\n * Format this `FluentDateTime` to a string.\n */\n toString(scope) {\n try {\n const dtf = scope.memoizeIntlObject(Intl.DateTimeFormat, this.opts);\n return dtf.format(this.value);\n }\n catch (err) {\n scope.reportError(err);\n return new Date(this.value).toISOString();\n }\n }\n}\n","/* global Intl */\n/**\n * @overview\n *\n * The role of the Fluent resolver is to format a `Pattern` to an instance of\n * `FluentValue`. For performance reasons, primitive strings are considered\n * such instances, too.\n *\n * Translations can contain references to other messages or variables,\n * conditional logic in form of select expressions, traits which describe their\n * grammatical features, and can use Fluent builtins which make use of the\n * `Intl` formatters to format numbers and dates into the bundle's languages.\n * See the documentation of the Fluent syntax for more information.\n *\n * In case of errors the resolver will try to salvage as much of the\n * translation as possible. In rare situations where the resolver didn't know\n * how to recover from an error it will return an instance of `FluentNone`.\n *\n * All expressions resolve to an instance of `FluentValue`. The caller should\n * use the `toString` method to convert the instance to a native value.\n *\n * Functions in this file pass around an instance of the `Scope` class, which\n * stores the data required for successful resolution and error recovery.\n */\nimport { FluentType, FluentNone, FluentNumber, FluentDateTime, } from \"./types.js\";\n/**\n * The maximum number of placeables which can be expanded in a single call to\n * `formatPattern`. The limit protects against the Billion Laughs and Quadratic\n * Blowup attacks. See https://msdn.microsoft.com/en-us/magazine/ee335713.aspx.\n */\nconst MAX_PLACEABLES = 100;\n/** Unicode bidi isolation characters. */\nconst FSI = \"\\u2068\";\nconst PDI = \"\\u2069\";\n/** Helper: match a variant key to the given selector. */\nfunction match(scope, selector, key) {\n if (key === selector) {\n // Both are strings.\n return true;\n }\n // XXX Consider comparing options too, e.g. minimumFractionDigits.\n if (key instanceof FluentNumber &&\n selector instanceof FluentNumber &&\n key.value === selector.value) {\n return true;\n }\n if (selector instanceof FluentNumber && typeof key === \"string\") {\n let category = scope\n .memoizeIntlObject(Intl.PluralRules, selector.opts)\n .select(selector.value);\n if (key === category) {\n return true;\n }\n }\n return false;\n}\n/** Helper: resolve the default variant from a list of variants. */\nfunction getDefault(scope, variants, star) {\n if (variants[star]) {\n return resolvePattern(scope, variants[star].value);\n }\n scope.reportError(new RangeError(\"No default\"));\n return new FluentNone();\n}\n/** Helper: resolve arguments to a call expression. */\nfunction getArguments(scope, args) {\n const positional = [];\n const named = Object.create(null);\n for (const arg of args) {\n if (arg.type === \"narg\") {\n named[arg.name] = resolveExpression(scope, arg.value);\n }\n else {\n positional.push(resolveExpression(scope, arg));\n }\n }\n return { positional, named };\n}\n/** Resolve an expression to a Fluent type. */\nfunction resolveExpression(scope, expr) {\n switch (expr.type) {\n case \"str\":\n return expr.value;\n case \"num\":\n return new FluentNumber(expr.value, {\n minimumFractionDigits: expr.precision,\n });\n case \"var\":\n return resolveVariableReference(scope, expr);\n case \"mesg\":\n return resolveMessageReference(scope, expr);\n case \"term\":\n return resolveTermReference(scope, expr);\n case \"func\":\n return resolveFunctionReference(scope, expr);\n case \"select\":\n return resolveSelectExpression(scope, expr);\n default:\n return new FluentNone();\n }\n}\n/** Resolve a reference to a variable. */\nfunction resolveVariableReference(scope, { name }) {\n let arg;\n if (scope.params) {\n // We're inside a TermReference. It's OK to reference undefined parameters.\n if (Object.prototype.hasOwnProperty.call(scope.params, name)) {\n arg = scope.params[name];\n }\n else {\n return new FluentNone(`$${name}`);\n }\n }\n else if (scope.args &&\n Object.prototype.hasOwnProperty.call(scope.args, name)) {\n // We're in the top-level Pattern or inside a MessageReference. Missing\n // variables references produce ReferenceErrors.\n arg = scope.args[name];\n }\n else {\n scope.reportError(new ReferenceError(`Unknown variable: $${name}`));\n return new FluentNone(`$${name}`);\n }\n // Return early if the argument already is an instance of FluentType.\n if (arg instanceof FluentType) {\n return arg;\n }\n // Convert the argument to a Fluent type.\n switch (typeof arg) {\n case \"string\":\n return arg;\n case \"number\":\n return new FluentNumber(arg);\n case \"object\":\n if (arg instanceof Date) {\n return new FluentDateTime(arg.getTime());\n }\n // eslint-disable-next-line no-fallthrough\n default:\n scope.reportError(new TypeError(`Variable type not supported: $${name}, ${typeof arg}`));\n return new FluentNone(`$${name}`);\n }\n}\n/** Resolve a reference to another message. */\nfunction resolveMessageReference(scope, { name, attr }) {\n const message = scope.bundle._messages.get(name);\n if (!message) {\n scope.reportError(new ReferenceError(`Unknown message: ${name}`));\n return new FluentNone(name);\n }\n if (attr) {\n const attribute = message.attributes[attr];\n if (attribute) {\n return resolvePattern(scope, attribute);\n }\n scope.reportError(new ReferenceError(`Unknown attribute: ${attr}`));\n return new FluentNone(`${name}.${attr}`);\n }\n if (message.value) {\n return resolvePattern(scope, message.value);\n }\n scope.reportError(new ReferenceError(`No value: ${name}`));\n return new FluentNone(name);\n}\n/** Resolve a call to a Term with key-value arguments. */\nfunction resolveTermReference(scope, { name, attr, args }) {\n const id = `-${name}`;\n const term = scope.bundle._terms.get(id);\n if (!term) {\n scope.reportError(new ReferenceError(`Unknown term: ${id}`));\n return new FluentNone(id);\n }\n if (attr) {\n const attribute = term.attributes[attr];\n if (attribute) {\n // Every TermReference has its own variables.\n scope.params = getArguments(scope, args).named;\n const resolved = resolvePattern(scope, attribute);\n scope.params = null;\n return resolved;\n }\n scope.reportError(new ReferenceError(`Unknown attribute: ${attr}`));\n return new FluentNone(`${id}.${attr}`);\n }\n scope.params = getArguments(scope, args).named;\n const resolved = resolvePattern(scope, term.value);\n scope.params = null;\n return resolved;\n}\n/** Resolve a call to a Function with positional and key-value arguments. */\nfunction resolveFunctionReference(scope, { name, args }) {\n // Some functions are built-in. Others may be provided by the runtime via\n // the `FluentBundle` constructor.\n let func = scope.bundle._functions[name];\n if (!func) {\n scope.reportError(new ReferenceError(`Unknown function: ${name}()`));\n return new FluentNone(`${name}()`);\n }\n if (typeof func !== \"function\") {\n scope.reportError(new TypeError(`Function ${name}() is not callable`));\n return new FluentNone(`${name}()`);\n }\n try {\n let resolved = getArguments(scope, args);\n return func(resolved.positional, resolved.named);\n }\n catch (err) {\n scope.reportError(err);\n return new FluentNone(`${name}()`);\n }\n}\n/** Resolve a select expression to the member object. */\nfunction resolveSelectExpression(scope, { selector, variants, star }) {\n let sel = resolveExpression(scope, selector);\n if (sel instanceof FluentNone) {\n return getDefault(scope, variants, star);\n }\n // Match the selector against keys of each variant, in order.\n for (const variant of variants) {\n const key = resolveExpression(scope, variant.key);\n if (match(scope, sel, key)) {\n return resolvePattern(scope, variant.value);\n }\n }\n return getDefault(scope, variants, star);\n}\n/** Resolve a pattern (a complex string with placeables). */\nexport function resolveComplexPattern(scope, ptn) {\n if (scope.dirty.has(ptn)) {\n scope.reportError(new RangeError(\"Cyclic reference\"));\n return new FluentNone();\n }\n // Tag the pattern as dirty for the purpose of the current resolution.\n scope.dirty.add(ptn);\n const result = [];\n // Wrap interpolations with Directional Isolate Formatting characters\n // only when the pattern has more than one element.\n const useIsolating = scope.bundle._useIsolating && ptn.length > 1;\n for (const elem of ptn) {\n if (typeof elem === \"string\") {\n result.push(scope.bundle._transform(elem));\n continue;\n }\n scope.placeables++;\n if (scope.placeables > MAX_PLACEABLES) {\n scope.dirty.delete(ptn);\n // This is a fatal error which causes the resolver to instantly bail out\n // on this pattern. The length check protects against excessive memory\n // usage, and throwing protects against eating up the CPU when long\n // placeables are deeply nested.\n throw new RangeError(`Too many placeables expanded: ${scope.placeables}, ` +\n `max allowed is ${MAX_PLACEABLES}`);\n }\n if (useIsolating) {\n result.push(FSI);\n }\n result.push(resolveExpression(scope, elem).toString(scope));\n if (useIsolating) {\n result.push(PDI);\n }\n }\n scope.dirty.delete(ptn);\n return result.join(\"\");\n}\n/**\n * Resolve a simple or a complex Pattern to a FluentString\n * (which is really the string primitive).\n */\nfunction resolvePattern(scope, value) {\n // Resolve a simple pattern.\n if (typeof value === \"string\") {\n return scope.bundle._transform(value);\n }\n return resolveComplexPattern(scope, value);\n}\n","export class Scope {\n constructor(bundle, errors, args) {\n /**\n * The Set of patterns already encountered during this resolution.\n * Used to detect and prevent cyclic resolutions.\n * @ignore\n */\n this.dirty = new WeakSet();\n /** A dict of parameters passed to a TermReference. */\n this.params = null;\n /**\n * The running count of placeables resolved so far.\n * Used to detect the Billion Laughs and Quadratic Blowup attacks.\n * @ignore\n */\n this.placeables = 0;\n this.bundle = bundle;\n this.errors = errors;\n this.args = args;\n }\n reportError(error) {\n if (!this.errors || !(error instanceof Error)) {\n throw error;\n }\n this.errors.push(error);\n }\n memoizeIntlObject(ctor, opts) {\n let cache = this.bundle._intls.get(ctor);\n if (!cache) {\n cache = {};\n this.bundle._intls.set(ctor, cache);\n }\n let id = JSON.stringify(opts);\n if (!cache[id]) {\n cache[id] = new ctor(this.bundle.locales, opts);\n }\n return cache[id];\n }\n}\n","/**\n * @overview\n *\n * The FTL resolver ships with a number of functions built-in.\n *\n * Each function take two arguments:\n * - args - an array of positional args\n * - opts - an object of key-value args\n *\n * Arguments to functions are guaranteed to already be instances of\n * `FluentValue`. Functions must return `FluentValues` as well.\n */\nimport { FluentNone, FluentNumber, FluentDateTime, } from \"./types.js\";\nfunction values(opts, allowed) {\n const unwrapped = Object.create(null);\n for (const [name, opt] of Object.entries(opts)) {\n if (allowed.includes(name)) {\n unwrapped[name] = opt.valueOf();\n }\n }\n return unwrapped;\n}\nconst NUMBER_ALLOWED = [\n \"unitDisplay\",\n \"currencyDisplay\",\n \"useGrouping\",\n \"minimumIntegerDigits\",\n \"minimumFractionDigits\",\n \"maximumFractionDigits\",\n \"minimumSignificantDigits\",\n \"maximumSignificantDigits\",\n];\n/**\n * The implementation of the `NUMBER()` builtin available to translations.\n *\n * Translations may call the `NUMBER()` builtin in order to specify formatting\n * options of a number. For example:\n *\n * pi = The value of π is {NUMBER($pi, maximumFractionDigits: 2)}.\n *\n * The implementation expects an array of `FluentValues` representing the\n * positional arguments, and an object of named `FluentValues` representing the\n * named parameters.\n *\n * The following options are recognized:\n *\n * unitDisplay\n * currencyDisplay\n * useGrouping\n * minimumIntegerDigits\n * minimumFractionDigits\n * maximumFractionDigits\n * minimumSignificantDigits\n * maximumSignificantDigits\n *\n * Other options are ignored.\n *\n * @param args The positional arguments passed to this `NUMBER()`.\n * @param opts The named argments passed to this `NUMBER()`.\n */\nexport function NUMBER(args, opts) {\n let arg = args[0];\n if (arg instanceof FluentNone) {\n return new FluentNone(`NUMBER(${arg.valueOf()})`);\n }\n if (arg instanceof FluentNumber) {\n return new FluentNumber(arg.valueOf(), {\n ...arg.opts,\n ...values(opts, NUMBER_ALLOWED),\n });\n }\n if (arg instanceof FluentDateTime) {\n return new FluentNumber(arg.valueOf(), {\n ...values(opts, NUMBER_ALLOWED),\n });\n }\n throw new TypeError(\"Invalid argument to NUMBER\");\n}\nconst DATETIME_ALLOWED = [\n \"dateStyle\",\n \"timeStyle\",\n \"fractionalSecondDigits\",\n \"dayPeriod\",\n \"hour12\",\n \"weekday\",\n \"era\",\n \"year\",\n \"month\",\n \"day\",\n \"hour\",\n \"minute\",\n \"second\",\n \"timeZoneName\",\n];\n/**\n * The implementation of the `DATETIME()` builtin available to translations.\n *\n * Translations may call the `DATETIME()` builtin in order to specify\n * formatting options of a number. For example:\n *\n * now = It's {DATETIME($today, month: \"long\")}.\n *\n * The implementation expects an array of `FluentValues` representing the\n * positional arguments, and an object of named `FluentValues` representing the\n * named parameters.\n *\n * The following options are recognized:\n *\n * dateStyle\n * timeStyle\n * fractionalSecondDigits\n * dayPeriod\n * hour12\n * weekday\n * era\n * year\n * month\n * day\n * hour\n * minute\n * second\n * timeZoneName\n *\n * Other options are ignored.\n *\n * @param args The positional arguments passed to this `DATETIME()`.\n * @param opts The named argments passed to this `DATETIME()`.\n */\nexport function DATETIME(args, opts) {\n let arg = args[0];\n if (arg instanceof FluentNone) {\n return new FluentNone(`DATETIME(${arg.valueOf()})`);\n }\n if (arg instanceof FluentDateTime) {\n return new FluentDateTime(arg.valueOf(), {\n ...arg.opts,\n ...values(opts, DATETIME_ALLOWED),\n });\n }\n if (arg instanceof FluentNumber) {\n return new FluentDateTime(arg.valueOf(), {\n ...values(opts, DATETIME_ALLOWED),\n });\n }\n throw new TypeError(\"Invalid argument to DATETIME\");\n}\n","const cache = new Map();\nexport function getMemoizerForLocale(locales) {\n const stringLocale = Array.isArray(locales) ? locales.join(\" \") : locales;\n let memoizer = cache.get(stringLocale);\n if (memoizer === undefined) {\n memoizer = new Map();\n cache.set(stringLocale, memoizer);\n }\n return memoizer;\n}\n","import { resolveComplexPattern } from \"./resolver.js\";\nimport { Scope } from \"./scope.js\";\nimport { FluentNone } from \"./types.js\";\nimport { NUMBER, DATETIME } from \"./builtins.js\";\nimport { getMemoizerForLocale } from \"./memoizer.js\";\n/**\n * Message bundles are single-language stores of translation resources. They are\n * responsible for formatting message values and attributes to strings.\n */\nexport class FluentBundle {\n /**\n * Create an instance of `FluentBundle`.\n *\n * @example\n * ```js\n * let bundle = new FluentBundle([\"en-US\", \"en\"]);\n *\n * let bundle = new FluentBundle(locales, {useIsolating: false});\n *\n * let bundle = new FluentBundle(locales, {\n * useIsolating: true,\n * functions: {\n * NODE_ENV: () => process.env.NODE_ENV\n * }\n * });\n * ```\n *\n * @param locales - Used to instantiate `Intl` formatters used by translations.\n * @param options - Optional configuration for the bundle.\n */\n constructor(locales, { functions, useIsolating = true, transform = (v) => v, } = {}) {\n /** @ignore */\n this._terms = new Map();\n /** @ignore */\n this._messages = new Map();\n this.locales = Array.isArray(locales) ? locales : [locales];\n this._functions = {\n NUMBER,\n DATETIME,\n ...functions,\n };\n this._useIsolating = useIsolating;\n this._transform = transform;\n this._intls = getMemoizerForLocale(locales);\n }\n /**\n * Check if a message is present in the bundle.\n *\n * @param id - The identifier of the message to check.\n */\n hasMessage(id) {\n return this._messages.has(id);\n }\n /**\n * Return a raw unformatted message object from the bundle.\n *\n * Raw messages are `{value, attributes}` shapes containing translation units\n * called `Patterns`. `Patterns` are implementation-specific; they should be\n * treated as black boxes and formatted with `FluentBundle.formatPattern`.\n *\n * @param id - The identifier of the message to check.\n */\n getMessage(id) {\n return this._messages.get(id);\n }\n /**\n * Add a translation resource to the bundle.\n *\n * @example\n * ```js\n * let res = new FluentResource(\"foo = Foo\");\n * bundle.addResource(res);\n * bundle.getMessage(\"foo\");\n * // → {value: .., attributes: {..}}\n * ```\n *\n * @param res\n * @param options\n */\n addResource(res, { allowOverrides = false, } = {}) {\n const errors = [];\n for (let i = 0; i < res.body.length; i++) {\n let entry = res.body[i];\n if (entry.id.startsWith(\"-\")) {\n // Identifiers starting with a dash (-) define terms. Terms are private\n // and cannot be retrieved from FluentBundle.\n if (allowOverrides === false && this._terms.has(entry.id)) {\n errors.push(new Error(`Attempt to override an existing term: \"${entry.id}\"`));\n continue;\n }\n this._terms.set(entry.id, entry);\n }\n else {\n if (allowOverrides === false && this._messages.has(entry.id)) {\n errors.push(new Error(`Attempt to override an existing message: \"${entry.id}\"`));\n continue;\n }\n this._messages.set(entry.id, entry);\n }\n }\n return errors;\n }\n /**\n * Format a `Pattern` to a string.\n *\n * Format a raw `Pattern` into a string. `args` will be used to resolve\n * references to variables passed as arguments to the translation.\n *\n * In case of errors `formatPattern` will try to salvage as much of the\n * translation as possible and will still return a string. For performance\n * reasons, the encountered errors are not returned but instead are appended\n * to the `errors` array passed as the third argument.\n *\n * If `errors` is omitted, the first encountered error will be thrown.\n *\n * @example\n * ```js\n * let errors = [];\n * bundle.addResource(\n * new FluentResource(\"hello = Hello, {$name}!\"));\n *\n * let hello = bundle.getMessage(\"hello\");\n * if (hello.value) {\n * bundle.formatPattern(hello.value, {name: \"Jane\"}, errors);\n * // Returns \"Hello, Jane!\" and `errors` is empty.\n *\n * bundle.formatPattern(hello.value, undefined, errors);\n * // Returns \"Hello, {$name}!\" and `errors` is now:\n * // []\n * }\n * ```\n */\n formatPattern(pattern, args = null, errors = null) {\n // Resolve a simple pattern without creating a scope. No error handling is\n // required; by definition simple patterns don't have placeables.\n if (typeof pattern === \"string\") {\n return this._transform(pattern);\n }\n // Resolve a complex pattern.\n let scope = new Scope(this, errors, args);\n try {\n let value = resolveComplexPattern(scope, pattern);\n return value.toString(scope);\n }\n catch (err) {\n if (scope.errors && err instanceof Error) {\n scope.errors.push(err);\n return new FluentNone().toString(scope);\n }\n throw err;\n }\n }\n}\n","// This regex is used to iterate through the beginnings of messages and terms.\n// With the /m flag, the ^ matches at the beginning of every line.\nconst RE_MESSAGE_START = /^(-?[a-zA-Z][\\w-]*) *= */gm;\n// Both Attributes and Variants are parsed in while loops. These regexes are\n// used to break out of them.\nconst RE_ATTRIBUTE_START = /\\.([a-zA-Z][\\w-]*) *= */y;\nconst RE_VARIANT_START = /\\*?\\[/y;\nconst RE_NUMBER_LITERAL = /(-?[0-9]+(?:\\.([0-9]+))?)/y;\nconst RE_IDENTIFIER = /([a-zA-Z][\\w-]*)/y;\nconst RE_REFERENCE = /([$-])?([a-zA-Z][\\w-]*)(?:\\.([a-zA-Z][\\w-]*))?/y;\nconst RE_FUNCTION_NAME = /^[A-Z][A-Z0-9_-]*$/;\n// A \"run\" is a sequence of text or string literal characters which don't\n// require any special handling. For TextElements such special characters are: {\n// (starts a placeable), and line breaks which require additional logic to check\n// if the next line is indented. For StringLiterals they are: \\ (starts an\n// escape sequence), \" (ends the literal), and line breaks which are not allowed\n// in StringLiterals. Note that string runs may be empty; text runs may not.\nconst RE_TEXT_RUN = /([^{}\\n\\r]+)/y;\nconst RE_STRING_RUN = /([^\\\\\"\\n\\r]*)/y;\n// Escape sequences.\nconst RE_STRING_ESCAPE = /\\\\([\\\\\"])/y;\nconst RE_UNICODE_ESCAPE = /\\\\u([a-fA-F0-9]{4})|\\\\U([a-fA-F0-9]{6})/y;\n// Used for trimming TextElements and indents.\nconst RE_LEADING_NEWLINES = /^\\n+/;\nconst RE_TRAILING_SPACES = / +$/;\n// Used in makeIndent to strip spaces from blank lines and normalize CRLF to LF.\nconst RE_BLANK_LINES = / *\\r?\\n/g;\n// Used in makeIndent to measure the indentation.\nconst RE_INDENT = /( *)$/;\n// Common tokens.\nconst TOKEN_BRACE_OPEN = /{\\s*/y;\nconst TOKEN_BRACE_CLOSE = /\\s*}/y;\nconst TOKEN_BRACKET_OPEN = /\\[\\s*/y;\nconst TOKEN_BRACKET_CLOSE = /\\s*] */y;\nconst TOKEN_PAREN_OPEN = /\\s*\\(\\s*/y;\nconst TOKEN_ARROW = /\\s*->\\s*/y;\nconst TOKEN_COLON = /\\s*:\\s*/y;\n// Note the optional comma. As a deviation from the Fluent EBNF, the parser\n// doesn't enforce commas between call arguments.\nconst TOKEN_COMMA = /\\s*,?\\s*/y;\nconst TOKEN_BLANK = /\\s+/y;\n/**\n * Fluent Resource is a structure storing parsed localization entries.\n */\nexport class FluentResource {\n constructor(source) {\n this.body = [];\n RE_MESSAGE_START.lastIndex = 0;\n let cursor = 0;\n // Iterate over the beginnings of messages and terms to efficiently skip\n // comments and recover from errors.\n while (true) {\n let next = RE_MESSAGE_START.exec(source);\n if (next === null) {\n break;\n }\n cursor = RE_MESSAGE_START.lastIndex;\n try {\n this.body.push(parseMessage(next[1]));\n }\n catch (err) {\n if (err instanceof SyntaxError) {\n // Don't report any Fluent syntax errors. Skip directly to the\n // beginning of the next message or term.\n continue;\n }\n throw err;\n }\n }\n // The parser implementation is inlined below for performance reasons,\n // as well as for convenience of accessing `source` and `cursor`.\n // The parser focuses on minimizing the number of false negatives at the\n // expense of increasing the risk of false positives. In other words, it\n // aims at parsing valid Fluent messages with a success rate of 100%, but it\n // may also parse a few invalid messages which the reference parser would\n // reject. The parser doesn't perform any validation and may produce entries\n // which wouldn't make sense in the real world. For best results users are\n // advised to validate translations with the fluent-syntax parser\n // pre-runtime.\n // The parser makes an extensive use of sticky regexes which can be anchored\n // to any offset of the source string without slicing it. Errors are thrown\n // to bail out of parsing of ill-formed messages.\n function test(re) {\n re.lastIndex = cursor;\n return re.test(source);\n }\n // Advance the cursor by the char if it matches. May be used as a predicate\n // (was the match found?) or, if errorClass is passed, as an assertion.\n function consumeChar(char, errorClass) {\n if (source[cursor] === char) {\n cursor++;\n return true;\n }\n if (errorClass) {\n throw new errorClass(`Expected ${char}`);\n }\n return false;\n }\n // Advance the cursor by the token if it matches. May be used as a predicate\n // (was the match found?) or, if errorClass is passed, as an assertion.\n function consumeToken(re, errorClass) {\n if (test(re)) {\n cursor = re.lastIndex;\n return true;\n }\n if (errorClass) {\n throw new errorClass(`Expected ${re.toString()}`);\n }\n return false;\n }\n // Execute a regex, advance the cursor, and return all capture groups.\n function match(re) {\n re.lastIndex = cursor;\n let result = re.exec(source);\n if (result === null) {\n throw new SyntaxError(`Expected ${re.toString()}`);\n }\n cursor = re.lastIndex;\n return result;\n }\n // Execute a regex, advance the cursor, and return the capture group.\n function match1(re) {\n return match(re)[1];\n }\n function parseMessage(id) {\n let value = parsePattern();\n let attributes = parseAttributes();\n if (value === null && Object.keys(attributes).length === 0) {\n throw new SyntaxError(\"Expected message value or attributes\");\n }\n return { id, value, attributes };\n }\n function parseAttributes() {\n let attrs = Object.create(null);\n while (test(RE_ATTRIBUTE_START)) {\n let name = match1(RE_ATTRIBUTE_START);\n let value = parsePattern();\n if (value === null) {\n throw new SyntaxError(\"Expected attribute value\");\n }\n attrs[name] = value;\n }\n return attrs;\n }\n function parsePattern() {\n let first;\n // First try to parse any simple text on the same line as the id.\n if (test(RE_TEXT_RUN)) {\n first = match1(RE_TEXT_RUN);\n }\n // If there's a placeable on the first line, parse a complex pattern.\n if (source[cursor] === \"{\" || source[cursor] === \"}\") {\n // Re-use the text parsed above, if possible.\n return parsePatternElements(first ? [first] : [], Infinity);\n }\n // RE_TEXT_VALUE stops at newlines. Only continue parsing the pattern if\n // what comes after the newline is indented.\n let indent = parseIndent();\n if (indent) {\n if (first) {\n // If there's text on the first line, the blank block is part of the\n // translation content in its entirety.\n return parsePatternElements([first, indent], indent.length);\n }\n // Otherwise, we're dealing with a block pattern, i.e. a pattern which\n // starts on a new line. Discrad the leading newlines but keep the\n // inline indent; it will be used by the dedentation logic.\n indent.value = trim(indent.value, RE_LEADING_NEWLINES);\n return parsePatternElements([indent], indent.length);\n }\n if (first) {\n // It was just a simple inline text after all.\n return trim(first, RE_TRAILING_SPACES);\n }\n return null;\n }\n // Parse a complex pattern as an array of elements.\n function parsePatternElements(elements = [], commonIndent) {\n while (true) {\n if (test(RE_TEXT_RUN)) {\n elements.push(match1(RE_TEXT_RUN));\n continue;\n }\n if (source[cursor] === \"{\") {\n elements.push(parsePlaceable());\n continue;\n }\n if (source[cursor] === \"}\") {\n throw new SyntaxError(\"Unbalanced closing brace\");\n }\n let indent = parseIndent();\n if (indent) {\n elements.push(indent);\n commonIndent = Math.min(commonIndent, indent.length);\n continue;\n }\n break;\n }\n let lastIndex = elements.length - 1;\n let lastElement = elements[lastIndex];\n // Trim the trailing spaces in the last element if it's a TextElement.\n if (typeof lastElement === \"string\") {\n elements[lastIndex] = trim(lastElement, RE_TRAILING_SPACES);\n }\n let baked = [];\n for (let element of elements) {\n if (element instanceof Indent) {\n // Dedent indented lines by the maximum common indent.\n element = element.value.slice(0, element.value.length - commonIndent);\n }\n if (element) {\n baked.push(element);\n }\n }\n return baked;\n }\n function parsePlaceable() {\n consumeToken(TOKEN_BRACE_OPEN, SyntaxError);\n let selector = parseInlineExpression();\n if (consumeToken(TOKEN_BRACE_CLOSE)) {\n return selector;\n }\n if (consumeToken(TOKEN_ARROW)) {\n let variants = parseVariants();\n consumeToken(TOKEN_BRACE_CLOSE, SyntaxError);\n return {\n type: \"select\",\n selector,\n ...variants,\n };\n }\n throw new SyntaxError(\"Unclosed placeable\");\n }\n function parseInlineExpression() {\n if (source[cursor] === \"{\") {\n // It's a nested placeable.\n return parsePlaceable();\n }\n if (test(RE_REFERENCE)) {\n let [, sigil, name, attr = null] = match(RE_REFERENCE);\n if (sigil === \"$\") {\n return { type: \"var\", name };\n }\n if (consumeToken(TOKEN_PAREN_OPEN)) {\n let args = parseArguments();\n if (sigil === \"-\") {\n // A parameterized term: -term(...).\n return { type: \"term\", name, attr, args };\n }\n if (RE_FUNCTION_NAME.test(name)) {\n return { type: \"func\", name, args };\n }\n throw new SyntaxError(\"Function names must be all upper-case\");\n }\n if (sigil === \"-\") {\n // A non-parameterized term: -term.\n return {\n type: \"term\",\n name,\n attr,\n args: [],\n };\n }\n return { type: \"mesg\", name, attr };\n }\n return parseLiteral();\n }\n function parseArguments() {\n let args = [];\n while (true) {\n switch (source[cursor]) {\n case \")\": // End of the argument list.\n cursor++;\n return args;\n case undefined: // EOF\n throw new SyntaxError(\"Unclosed argument list\");\n }\n args.push(parseArgument());\n // Commas between arguments are treated as whitespace.\n consumeToken(TOKEN_COMMA);\n }\n }\n function parseArgument() {\n let expr = parseInlineExpression();\n if (expr.type !== \"mesg\") {\n return expr;\n }\n if (consumeToken(TOKEN_COLON)) {\n // The reference is the beginning of a named argument.\n return {\n type: \"narg\",\n name: expr.name,\n value: parseLiteral(),\n };\n }\n // It's a regular message reference.\n return expr;\n }\n function parseVariants() {\n let variants = [];\n let count = 0;\n let star;\n while (test(RE_VARIANT_START)) {\n if (consumeChar(\"*\")) {\n star = count;\n }\n let key = parseVariantKey();\n let value = parsePattern();\n if (value === null) {\n throw new SyntaxError(\"Expected variant value\");\n }\n variants[count++] = { key, value };\n }\n if (count === 0) {\n return null;\n }\n if (star === undefined) {\n throw new SyntaxError(\"Expected default variant\");\n }\n return { variants, star };\n }\n function parseVariantKey() {\n consumeToken(TOKEN_BRACKET_OPEN, SyntaxError);\n let key;\n if (test(RE_NUMBER_LITERAL)) {\n key = parseNumberLiteral();\n }\n else {\n key = {\n type: \"str\",\n value: match1(RE_IDENTIFIER),\n };\n }\n consumeToken(TOKEN_BRACKET_CLOSE, SyntaxError);\n return key;\n }\n function parseLiteral() {\n if (test(RE_NUMBER_LITERAL)) {\n return parseNumberLiteral();\n }\n if (source[cursor] === '\"') {\n return parseStringLiteral();\n }\n throw new SyntaxError(\"Invalid expression\");\n }\n function parseNumberLiteral() {\n let [, value, fraction = \"\"] = match(RE_NUMBER_LITERAL);\n let precision = fraction.length;\n return {\n type: \"num\",\n value: parseFloat(value),\n precision,\n };\n }\n function parseStringLiteral() {\n consumeChar('\"', SyntaxError);\n let value = \"\";\n while (true) {\n value += match1(RE_STRING_RUN);\n if (source[cursor] === \"\\\\\") {\n value += parseEscapeSequence();\n continue;\n }\n if (consumeChar('\"')) {\n return { type: \"str\", value };\n }\n // We've reached an EOL of EOF.\n throw new SyntaxError(\"Unclosed string literal\");\n }\n }\n // Unescape known escape sequences.\n function parseEscapeSequence() {\n if (test(RE_STRING_ESCAPE)) {\n return match1(RE_STRING_ESCAPE);\n }\n if (test(RE_UNICODE_ESCAPE)) {\n let [, codepoint4, codepoint6] = match(RE_UNICODE_ESCAPE);\n let codepoint = parseInt(codepoint4 || codepoint6, 16);\n return codepoint <= 0xd7ff || 0xe000 <= codepoint\n ? // It's a Unicode scalar value.\n String.fromCodePoint(codepoint)\n : // Lonely surrogates can cause trouble when the parsing result is\n // saved using UTF-8. Use U+FFFD REPLACEMENT CHARACTER instead.\n \"�\";\n }\n throw new SyntaxError(\"Unknown escape sequence\");\n }\n // Parse blank space. Return it if it looks like indent before a pattern\n // line. Skip it othwerwise.\n function parseIndent() {\n let start = cursor;\n consumeToken(TOKEN_BLANK);\n // Check the first non-blank character after the indent.\n switch (source[cursor]) {\n case \".\":\n case \"[\":\n case \"*\":\n case \"}\":\n case undefined: // EOF\n // A special character. End the Pattern.\n return false;\n case \"{\":\n // Placeables don't require indentation (in EBNF: block-placeable).\n // Continue the Pattern.\n return makeIndent(source.slice(start, cursor));\n }\n // If the first character on the line is not one of the special characters\n // listed above, it's a regular text character. Check if there's at least\n // one space of indent before it.\n if (source[cursor - 1] === \" \") {\n // It's an indented text character (in EBNF: indented-char). Continue\n // the Pattern.\n return makeIndent(source.slice(start, cursor));\n }\n // A not-indented text character is likely the identifier of the next\n // message. End the Pattern.\n return false;\n }\n // Trim blanks in text according to the given regex.\n function trim(text, re) {\n return text.replace(re, \"\");\n }\n // Normalize a blank block and extract the indent details.\n function makeIndent(blank) {\n let value = blank.replace(RE_BLANK_LINES, \"\\n\");\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n let length = RE_INDENT.exec(blank)[1].length;\n return new Indent(value, length);\n }\n }\n}\nclass Indent {\n constructor(value, length) {\n this.value = value;\n this.length = length;\n }\n}\n","/**\n * @module fluent\n * @overview\n *\n * `fluent` is a JavaScript implementation of Project Fluent, a localization\n * framework designed to unleash the expressive power of the natural language.\n *\n */\nexport { FluentBundle } from \"./bundle.js\";\nexport { FluentResource } from \"./resource.js\";\nexport { FluentType, FluentNone, FluentNumber, FluentDateTime, } from \"./types.js\";\n","/* eslint no-console: [\"error\", {allow: [\"warn\"]}] */\n/* global console */\n// Match the opening angle bracket (<) in HTML tags, and HTML entities like\n// &, &, &.\nconst reOverlay = /<|&#?\\w+;/;\n/**\n * Elements allowed in translations even if they are not present in the source\n * HTML. They are text-level elements as defined by the HTML5 spec:\n * https://www.w3.org/TR/html5/text-level-semantics.html with the exception of:\n *\n * - a - because we don't allow href on it anyways,\n * - ruby, rt, rp - because we don't allow nested elements to be inserted.\n */\nconst TEXT_LEVEL_ELEMENTS = {\n \"http://www.w3.org/1999/xhtml\": [\n \"em\",\n \"strong\",\n \"small\",\n \"s\",\n \"cite\",\n \"q\",\n \"dfn\",\n \"abbr\",\n \"data\",\n \"time\",\n \"code\",\n \"var\",\n \"samp\",\n \"kbd\",\n \"sub\",\n \"sup\",\n \"i\",\n \"b\",\n \"u\",\n \"mark\",\n \"bdi\",\n \"bdo\",\n \"span\",\n \"br\",\n \"wbr\",\n ],\n};\nconst LOCALIZABLE_ATTRIBUTES = {\n \"http://www.w3.org/1999/xhtml\": {\n global: [\"title\", \"aria-label\", \"aria-valuetext\"],\n a: [\"download\"],\n area: [\"download\", \"alt\"],\n // value is special-cased in isAttrNameLocalizable\n input: [\"alt\", \"placeholder\"],\n menuitem: [\"label\"],\n menu: [\"label\"],\n optgroup: [\"label\"],\n option: [\"label\"],\n track: [\"label\"],\n img: [\"alt\"],\n textarea: [\"placeholder\"],\n th: [\"abbr\"],\n },\n \"http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul\": {\n global: [\n \"accesskey\",\n \"aria-label\",\n \"aria-valuetext\",\n \"label\",\n \"title\",\n \"tooltiptext\",\n ],\n description: [\"value\"],\n key: [\"key\", \"keycode\"],\n label: [\"value\"],\n textbox: [\"placeholder\", \"value\"],\n },\n};\n/**\n * Translate an element.\n *\n * Translate the element's text content and attributes. Some HTML markup is\n * allowed in the translation. The element's children with the data-l10n-name\n * attribute will be treated as arguments to the translation. If the\n * translation defines the same children, their attributes and text contents\n * will be used for translating the matching source child.\n *\n * @param {Element} element\n * @param {Object} translation\n * @private\n */\nexport default function translateElement(element, translation) {\n const { value } = translation;\n if (typeof value === \"string\") {\n if (element.localName === \"title\" &&\n element.namespaceURI === \"http://www.w3.org/1999/xhtml\") {\n // A special case for the HTML title element whose content must be text.\n element.textContent = value;\n }\n else if (!reOverlay.test(value)) {\n // If the translation doesn't contain any markup skip the overlay logic.\n element.textContent = value;\n }\n else {\n // Else parse the translation's HTML using an inert template element,\n // sanitize it and replace the element's content.\n const templateElement = element.ownerDocument.createElementNS(\"http://www.w3.org/1999/xhtml\", \"template\");\n templateElement.innerHTML = value;\n overlayChildNodes(templateElement.content, element);\n }\n }\n // Even if the translation doesn't define any localizable attributes, run\n // overlayAttributes to remove any localizable attributes set by previous\n // translations.\n overlayAttributes(translation, element);\n}\n/**\n * Replace child nodes of an element with child nodes of another element.\n *\n * The contents of the target element will be cleared and fully replaced with\n * sanitized contents of the source element.\n *\n * @param {DocumentFragment} fromFragment - The source of children to overlay.\n * @param {Element} toElement - The target of the overlay.\n * @private\n */\nfunction overlayChildNodes(fromFragment, toElement) {\n for (const childNode of fromFragment.childNodes) {\n if (childNode.nodeType === childNode.TEXT_NODE) {\n // Keep the translated text node.\n continue;\n }\n if (childNode.hasAttribute(\"data-l10n-name\")) {\n const sanitized = getNodeForNamedElement(toElement, childNode);\n fromFragment.replaceChild(sanitized, childNode);\n continue;\n }\n if (isElementAllowed(childNode)) {\n const sanitized = createSanitizedElement(childNode);\n fromFragment.replaceChild(sanitized, childNode);\n continue;\n }\n console.warn(`An element of forbidden type \"${childNode.localName}\" was found in ` +\n \"the translation. Only safe text-level elements and elements with \" +\n \"data-l10n-name are allowed.\");\n // If all else fails, replace the element with its text content.\n fromFragment.replaceChild(createTextNodeFromTextContent(childNode), childNode);\n }\n toElement.textContent = \"\";\n toElement.appendChild(fromFragment);\n}\nfunction hasAttribute(attributes, name) {\n if (!attributes) {\n return false;\n }\n for (let attr of attributes) {\n if (attr.name === name) {\n return true;\n }\n }\n return false;\n}\n/**\n * Transplant localizable attributes of an element to another element.\n *\n * Any localizable attributes already set on the target element will be\n * cleared.\n *\n * @param {Element|Object} fromElement - The source of child nodes to overlay.\n * @param {Element} toElement - The target of the overlay.\n * @private\n */\nfunction overlayAttributes(fromElement, toElement) {\n const explicitlyAllowed = toElement.hasAttribute(\"data-l10n-attrs\")\n ? toElement\n .getAttribute(\"data-l10n-attrs\")\n .split(\",\")\n .map(i => i.trim())\n : null;\n // Remove existing localizable attributes if they\n // will not be used in the new translation.\n for (const attr of Array.from(toElement.attributes)) {\n if (isAttrNameLocalizable(attr.name, toElement, explicitlyAllowed) &&\n !hasAttribute(fromElement.attributes, attr.name)) {\n toElement.removeAttribute(attr.name);\n }\n }\n // fromElement might be a {value, attributes} object as returned by\n // Localization.messageFromBundle. In which case attributes may be null to\n // save GC cycles.\n if (!fromElement.attributes) {\n return;\n }\n // Set localizable attributes.\n for (const attr of Array.from(fromElement.attributes)) {\n if (isAttrNameLocalizable(attr.name, toElement, explicitlyAllowed) &&\n toElement.getAttribute(attr.name) !== attr.value) {\n toElement.setAttribute(attr.name, attr.value);\n }\n }\n}\n/**\n * Sanitize a child element created by the translation.\n *\n * Try to find a corresponding child in sourceElement and use it as the base\n * for the sanitization. This will preserve functional attribtues defined on\n * the child element in the source HTML.\n *\n * @param {Element} sourceElement - The source for data-l10n-name lookups.\n * @param {Element} translatedChild - The translated child to be sanitized.\n * @returns {Element}\n * @private\n */\nfunction getNodeForNamedElement(sourceElement, translatedChild) {\n const childName = translatedChild.getAttribute(\"data-l10n-name\");\n const sourceChild = sourceElement.querySelector(`[data-l10n-name=\"${childName}\"]`);\n if (!sourceChild) {\n console.warn(`An element named \"${childName}\" wasn't found in the source.`);\n return createTextNodeFromTextContent(translatedChild);\n }\n if (sourceChild.localName !== translatedChild.localName) {\n console.warn(`An element named \"${childName}\" was found in the translation ` +\n `but its type ${translatedChild.localName} didn't match the ` +\n `element found in the source (${sourceChild.localName}).`);\n return createTextNodeFromTextContent(translatedChild);\n }\n // Remove it from sourceElement so that the translation cannot use\n // the same reference name again.\n sourceElement.removeChild(sourceChild);\n // We can't currently guarantee that a translation won't remove\n // sourceChild from the element completely, which could break the app if\n // it relies on an event handler attached to the sourceChild. Let's make\n // this limitation explicit for now by breaking the identitiy of the\n // sourceChild by cloning it. This will destroy all event handlers\n // attached to sourceChild via addEventListener and via on\n // properties.\n const clone = sourceChild.cloneNode(false);\n return shallowPopulateUsing(translatedChild, clone);\n}\n/**\n * Sanitize an allowed element.\n *\n * Text-level elements allowed in translations may only use safe attributes\n * and will have any nested markup stripped to text content.\n *\n * @param {Element} element - The element to be sanitized.\n * @returns {Element}\n * @private\n */\nfunction createSanitizedElement(element) {\n // Start with an empty element of the same type to remove nested children\n // and non-localizable attributes defined by the translation.\n const clone = element.ownerDocument.createElement(element.localName);\n return shallowPopulateUsing(element, clone);\n}\n/**\n * Convert an element to a text node.\n *\n * @param {Element} element - The element to be sanitized.\n * @returns {Node}\n * @private\n */\nfunction createTextNodeFromTextContent(element) {\n return element.ownerDocument.createTextNode(element.textContent);\n}\n/**\n * Check if element is allowed in the translation.\n *\n * This method is used by the sanitizer when the translation markup contains\n * an element which is not present in the source code.\n *\n * @param {Element} element\n * @returns {boolean}\n * @private\n */\nfunction isElementAllowed(element) {\n const allowed = TEXT_LEVEL_ELEMENTS[element.namespaceURI];\n return allowed && allowed.includes(element.localName);\n}\n/**\n * Check if attribute is allowed for the given element.\n *\n * This method is used by the sanitizer when the translation markup contains\n * DOM attributes, or when the translation has traits which map to DOM\n * attributes.\n *\n * `explicitlyAllowed` can be passed as a list of attributes explicitly\n * allowed on this element.\n *\n * @param {string} name\n * @param {Element} element\n * @param {Array} explicitlyAllowed\n * @returns {boolean}\n * @private\n */\nfunction isAttrNameLocalizable(name, element, explicitlyAllowed = null) {\n if (explicitlyAllowed && explicitlyAllowed.includes(name)) {\n return true;\n }\n const allowed = LOCALIZABLE_ATTRIBUTES[element.namespaceURI];\n if (!allowed) {\n return false;\n }\n const attrName = name.toLowerCase();\n const elemName = element.localName;\n // Is it a globally safe attribute?\n if (allowed.global.includes(attrName)) {\n return true;\n }\n // Are there no allowed attributes for this element?\n if (!allowed[elemName]) {\n return false;\n }\n // Is it allowed on this element?\n if (allowed[elemName].includes(attrName)) {\n return true;\n }\n // Special case for value on HTML inputs with type button, reset, submit\n if (element.namespaceURI === \"http://www.w3.org/1999/xhtml\" &&\n elemName === \"input\" &&\n attrName === \"value\") {\n const type = element.type.toLowerCase();\n if (type === \"submit\" || type === \"button\" || type === \"reset\") {\n return true;\n }\n }\n return false;\n}\n/**\n * Helper to set textContent and localizable attributes on an element.\n *\n * @param {Element} fromElement\n * @param {Element} toElement\n * @returns {Element}\n * @private\n */\nfunction shallowPopulateUsing(fromElement, toElement) {\n toElement.textContent = fromElement.textContent;\n overlayAttributes(fromElement, toElement);\n return toElement;\n}\n","/*\n * Base CachedIterable class.\n */\nexport default class CachedIterable extends Array {\n /**\n * Create a `CachedIterable` instance from an iterable or, if another\n * instance of `CachedIterable` is passed, return it without any\n * modifications.\n *\n * @param {Iterable} iterable\n * @returns {CachedIterable}\n */\n static from(iterable) {\n if (iterable instanceof this) {\n return iterable;\n }\n\n return new this(iterable);\n }\n}\n","import CachedIterable from \"./cached_iterable.mjs\";\n\n/*\n * CachedSyncIterable caches the elements yielded by an iterable.\n *\n * It can be used to iterate over an iterable many times without depleting the\n * iterable.\n */\nexport default class CachedSyncIterable extends CachedIterable {\n /**\n * Create an `CachedSyncIterable` instance.\n *\n * @param {Iterable} iterable\n * @returns {CachedSyncIterable}\n */\n constructor(iterable) {\n super();\n\n if (Symbol.iterator in Object(iterable)) {\n this.iterator = iterable[Symbol.iterator]();\n } else {\n throw new TypeError(\"Argument must implement the iteration protocol.\");\n }\n }\n\n [Symbol.iterator]() {\n const cached = this;\n let cur = 0;\n\n return {\n next() {\n if (cached.length <= cur) {\n cached.push(cached.iterator.next());\n }\n return cached[cur++];\n }\n };\n }\n\n /**\n * This method allows user to consume the next element from the iterator\n * into the cache.\n *\n * @param {number} count - number of elements to consume\n */\n touchNext(count = 1) {\n let idx = 0;\n while (idx++ < count) {\n const last = this[this.length - 1];\n if (last && last.done) {\n break;\n }\n this.push(this.iterator.next());\n }\n // Return the last cached {value, done} object to allow the calling\n // code to decide if it needs to call touchNext again.\n return this[this.length - 1];\n }\n}\n","import CachedIterable from \"./cached_iterable.mjs\";\n\n/*\n * CachedAsyncIterable caches the elements yielded by an async iterable.\n *\n * It can be used to iterate over an iterable many times without depleting the\n * iterable.\n */\nexport default class CachedAsyncIterable extends CachedIterable {\n /**\n * Create an `CachedAsyncIterable` instance.\n *\n * @param {Iterable} iterable\n * @returns {CachedAsyncIterable}\n */\n constructor(iterable) {\n super();\n\n if (Symbol.asyncIterator in Object(iterable)) {\n this.iterator = iterable[Symbol.asyncIterator]();\n } else if (Symbol.iterator in Object(iterable)) {\n this.iterator = iterable[Symbol.iterator]();\n } else {\n throw new TypeError(\"Argument must implement the iteration protocol.\");\n }\n }\n\n /**\n * Asynchronous iterator caching the yielded elements.\n *\n * Elements yielded by the original iterable will be cached and available\n * synchronously. Returns an async generator object implementing the\n * iterator protocol over the elements of the original (async or sync)\n * iterable.\n */\n [Symbol.asyncIterator]() {\n const cached = this;\n let cur = 0;\n\n return {\n async next() {\n if (cached.length <= cur) {\n cached.push(cached.iterator.next());\n }\n return cached[cur++];\n }\n };\n }\n\n /**\n * This method allows user to consume the next element from the iterator\n * into the cache.\n *\n * @param {number} count - number of elements to consume\n */\n async touchNext(count = 1) {\n let idx = 0;\n while (idx++ < count) {\n const last = this[this.length - 1];\n if (last && (await last).done) {\n break;\n }\n this.push(this.iterator.next());\n }\n // Return the last cached {value, done} object to allow the calling\n // code to decide if it needs to call touchNext again.\n return this[this.length - 1];\n }\n}\n","export {default as CachedSyncIterable} from \"./cached_sync_iterable.mjs\";\nexport {default as CachedAsyncIterable} from \"./cached_async_iterable.mjs\";\n","/* eslint no-console: [\"error\", { allow: [\"warn\", \"error\"] }] */\n/* global console */\nimport { CachedAsyncIterable } from \"cached-iterable\";\n/**\n * The `Localization` class is a central high-level API for vanilla\n * JavaScript use of Fluent.\n * It combines language negotiation, FluentBundle and I/O to\n * provide a scriptable API to format translations.\n */\nexport default class Localization {\n /**\n * @param {Array} resourceIds - List of resource IDs\n * @param {Function} generateBundles - Function that returns a\n * generator over FluentBundles\n *\n * @returns {Localization}\n */\n constructor(resourceIds = [], generateBundles) {\n this.resourceIds = resourceIds;\n this.generateBundles = generateBundles;\n this.onChange(true);\n }\n addResourceIds(resourceIds, eager = false) {\n this.resourceIds.push(...resourceIds);\n this.onChange(eager);\n return this.resourceIds.length;\n }\n removeResourceIds(resourceIds) {\n this.resourceIds = this.resourceIds.filter(r => !resourceIds.includes(r));\n this.onChange();\n return this.resourceIds.length;\n }\n /**\n * Format translations and handle fallback if needed.\n *\n * Format translations for `keys` from `FluentBundle` instances on this\n * DOMLocalization. In case of errors, fetch the next context in the\n * fallback chain.\n *\n * @param {Array} keys - Translation keys to format.\n * @param {Function} method - Formatting function.\n * @returns {Promise>}\n * @private\n */\n async formatWithFallback(keys, method) {\n const translations = [];\n let hasAtLeastOneBundle = false;\n for await (const bundle of this.bundles) {\n hasAtLeastOneBundle = true;\n const missingIds = keysFromBundle(method, bundle, keys, translations);\n if (missingIds.size === 0) {\n break;\n }\n if (typeof console !== \"undefined\") {\n const locale = bundle.locales[0];\n const ids = Array.from(missingIds).join(\", \");\n console.warn(`[fluent] Missing translations in ${locale}: ${ids}`);\n }\n }\n if (!hasAtLeastOneBundle && typeof console !== \"undefined\") {\n // eslint-disable-next-line max-len\n console.warn(`[fluent] Request for keys failed because no resource bundles got generated.\n keys: ${JSON.stringify(keys)}.\n resourceIds: ${JSON.stringify(this.resourceIds)}.`);\n }\n return translations;\n }\n /**\n * Format translations into `{value, attributes}` objects.\n *\n * The fallback logic is the same as in `formatValues`\n * but it returns `{value, attributes}` objects\n * which are suitable for the translation of DOM elements.\n *\n * Returns a Promise resolving to an array of the translation strings.\n *\n * @example\n * ```js\n * docL10n.formatMessages([\n * {id: 'hello', args: { who: 'Mary' }},\n * {id: 'welcome'}\n * ]).then(console.log);\n *\n * // [\n * // { value: 'Hello, Mary!', attributes: null },\n * // {\n * // value: 'Welcome!',\n * // attributes: [ { name: \"title\", value: 'Hello' } ]\n * // }\n * // ]\n * ```\n *\n * @param {Array} keys\n * @returns {Promise>}\n * @private\n */\n formatMessages(keys) {\n return this.formatWithFallback(keys, messageFromBundle);\n }\n /**\n * Retrieve translations corresponding to the passed keys.\n *\n * A generalized version of `DOMLocalization.formatValue`. Keys must\n * be `{id, args}` objects.\n *\n * Returns a Promise resolving to an array of the translation strings.\n *\n * @example\n * ```js\n * docL10n.formatValues([\n * {id: 'hello', args: { who: 'Mary' }},\n * {id: 'hello', args: { who: 'John' }},\n * {id: 'welcome'}\n * ]).then(console.log);\n *\n * // ['Hello, Mary!', 'Hello, John!', 'Welcome!']\n * ```\n *\n * @param {Array} keys\n * @returns {Promise>}\n */\n formatValues(keys) {\n return this.formatWithFallback(keys, valueFromBundle);\n }\n /**\n * Retrieve the translation corresponding to the `id` identifier.\n *\n * If passed, `args` is a simple hash object with a list of variables that\n * will be interpolated in the value of the translation.\n *\n * Returns a Promise resolving to the translation string.\n *\n * Use this sparingly for one-off messages which don't need to be\n * retranslated when the user changes their language preferences, e.g. in\n * notifications.\n *\n * @example\n * ```js\n * docL10n.formatValue(\n * 'hello', { who: 'world' }\n * ).then(console.log);\n *\n * // 'Hello, world!'\n * ```\n *\n * @param {string} id - Identifier of the translation to format\n * @param {Object} [args] - Optional external arguments\n * @returns {Promise}\n */\n async formatValue(id, args) {\n const [val] = await this.formatValues([{ id, args }]);\n return val;\n }\n handleEvent() {\n this.onChange();\n }\n /**\n * This method should be called when there's a reason to believe\n * that language negotiation or available resources changed.\n */\n onChange(eager = false) {\n this.bundles = CachedAsyncIterable.from(this.generateBundles(this.resourceIds));\n if (eager) {\n this.bundles.touchNext(2);\n }\n }\n}\n/**\n * Format the value of a message into a string or `null`.\n *\n * This function is passed as a method to `keysFromBundle` and resolve\n * a value of a single L10n Entity using provided `FluentBundle`.\n *\n * If the message doesn't have a value, return `null`.\n *\n * @param {FluentBundle} bundle\n * @param {Array} errors\n * @param {Object} message\n * @param {Object} args\n * @returns {string|null}\n * @private\n */\nfunction valueFromBundle(bundle, errors, message, args) {\n if (message.value) {\n return bundle.formatPattern(message.value, args, errors);\n }\n return null;\n}\n/**\n * Format all public values of a message into a {value, attributes} object.\n *\n * This function is passed as a method to `keysFromBundle` and resolve\n * a single L10n Entity using provided `FluentBundle`.\n *\n * The function will return an object with a value and attributes of the\n * entity.\n *\n * @param {FluentBundle} bundle\n * @param {Array} errors\n * @param {Object} message\n * @param {Object} args\n * @returns {Object}\n * @private\n */\nfunction messageFromBundle(bundle, errors, message, args) {\n const formatted = {\n value: null,\n attributes: null,\n };\n if (message.value) {\n formatted.value = bundle.formatPattern(message.value, args, errors);\n }\n let attrNames = Object.keys(message.attributes);\n if (attrNames.length > 0) {\n formatted.attributes = new Array(attrNames.length);\n for (let [i, name] of attrNames.entries()) {\n let value = bundle.formatPattern(message.attributes[name], args, errors);\n formatted.attributes[i] = { name, value };\n }\n }\n return formatted;\n}\n/**\n * This function is an inner function for `Localization.formatWithFallback`.\n *\n * It takes a `FluentBundle`, list of l10n-ids and a method to be used for\n * key resolution (either `valueFromBundle` or `messageFromBundle`) and\n * optionally a value returned from `keysFromBundle` executed against\n * another `FluentBundle`.\n *\n * The idea here is that if the previous `FluentBundle` did not resolve\n * all keys, we're calling this function with the next context to resolve\n * the remaining ones.\n *\n * In the function, we loop over `keys` and check if we have the `prev`\n * passed and if it has an error entry for the position we're in.\n *\n * If it doesn't, it means that we have a good translation for this key and\n * we return it. If it does, we'll try to resolve the key using the passed\n * `FluentBundle`.\n *\n * In the end, we fill the translations array, and return the Set with\n * missing ids.\n *\n * See `Localization.formatWithFallback` for more info on how this is used.\n *\n * @param {Function} method\n * @param {FluentBundle} bundle\n * @param {Array} keys\n * @param {{Array<{value: string, attributes: Object}>}} translations\n *\n * @returns {Set}\n * @private\n */\nfunction keysFromBundle(method, bundle, keys, translations) {\n const messageErrors = [];\n const missingIds = new Set();\n keys.forEach(({ id, args }, i) => {\n if (translations[i] !== undefined) {\n return;\n }\n let message = bundle.getMessage(id);\n if (message) {\n messageErrors.length = 0;\n translations[i] = method(bundle, messageErrors, message, args);\n if (messageErrors.length > 0 && typeof console !== \"undefined\") {\n const locale = bundle.locales[0];\n const errors = messageErrors.join(\", \");\n // eslint-disable-next-line max-len\n console.warn(`[fluent][resolver] errors in ${locale}/${id}: ${errors}.`);\n }\n }\n else {\n missingIds.add(id);\n }\n });\n return missingIds;\n}\n","import translateElement from \"./overlay.js\";\nimport Localization from \"./localization.js\";\nconst L10NID_ATTR_NAME = \"data-l10n-id\";\nconst L10NARGS_ATTR_NAME = \"data-l10n-args\";\nconst L10N_ELEMENT_QUERY = `[${L10NID_ATTR_NAME}]`;\n/**\n * The `DOMLocalization` class is responsible for fetching resources and\n * formatting translations.\n *\n * It implements the fallback strategy in case of errors encountered during the\n * formatting of translations and methods for observing DOM\n * trees with a `MutationObserver`.\n */\nexport default class DOMLocalization extends Localization {\n /**\n * @param {Array} resourceIds - List of resource IDs\n * @param {Function} generateBundles - Function that returns a\n * generator over FluentBundles\n * @returns {DOMLocalization}\n */\n constructor(resourceIds, generateBundles) {\n super(resourceIds, generateBundles);\n // A Set of DOM trees observed by the `MutationObserver`.\n this.roots = new Set();\n // requestAnimationFrame handler.\n this.pendingrAF = null;\n // list of elements pending for translation.\n this.pendingElements = new Set();\n this.windowElement = null;\n this.mutationObserver = null;\n this.observerConfig = {\n attributes: true,\n characterData: false,\n childList: true,\n subtree: true,\n attributeFilter: [L10NID_ATTR_NAME, L10NARGS_ATTR_NAME],\n };\n }\n onChange(eager = false) {\n super.onChange(eager);\n if (this.roots) {\n this.translateRoots();\n }\n }\n /**\n * Set the `data-l10n-id` and `data-l10n-args` attributes on DOM elements.\n * FluentDOM makes use of mutation observers to detect changes\n * to `data-l10n-*` attributes and translate elements asynchronously.\n * `setAttributes` is a convenience method which allows to translate\n * DOM elements declaratively.\n *\n * You should always prefer to use `data-l10n-id` on elements (statically in\n * HTML or dynamically via `setAttributes`) over manually retrieving\n * translations with `format`. The use of attributes ensures that the\n * elements can be retranslated when the user changes their language\n * preferences.\n *\n * ```javascript\n * localization.setAttributes(\n * document.querySelector('#welcome'), 'hello', { who: 'world' }\n * );\n * ```\n *\n * This will set the following attributes on the `#welcome` element.\n * The MutationObserver will pick up this change and will localize the element\n * asynchronously.\n *\n * ```html\n *

\n *

\n * ```\n *\n * @param {Element} element - Element to set attributes on\n * @param {string} id - l10n-id string\n * @param {Object} args - KVP list of l10n arguments\n * @returns {Element}\n */\n setAttributes(element, id, args) {\n element.setAttribute(L10NID_ATTR_NAME, id);\n if (args) {\n element.setAttribute(L10NARGS_ATTR_NAME, JSON.stringify(args));\n }\n else {\n element.removeAttribute(L10NARGS_ATTR_NAME);\n }\n return element;\n }\n /**\n * Get the `data-l10n-*` attributes from DOM elements.\n *\n * ```javascript\n * localization.getAttributes(\n * document.querySelector('#welcome')\n * );\n * // -> { id: 'hello', args: { who: 'world' } }\n * ```\n *\n * @param {Element} element - HTML element\n * @returns {{id: string, args: Object}}\n */\n getAttributes(element) {\n return {\n id: element.getAttribute(L10NID_ATTR_NAME),\n args: JSON.parse(element.getAttribute(L10NARGS_ATTR_NAME) || null),\n };\n }\n /**\n * Add `newRoot` to the list of roots managed by this `DOMLocalization`.\n *\n * Additionally, if this `DOMLocalization` has an observer, start observing\n * `newRoot` in order to translate mutations in it.\n *\n * @param {Element} newRoot - Root to observe.\n */\n connectRoot(newRoot) {\n for (const root of this.roots) {\n if (root === newRoot ||\n root.contains(newRoot) ||\n newRoot.contains(root)) {\n throw new Error(\"Cannot add a root that overlaps with existing root.\");\n }\n }\n if (this.windowElement) {\n if (this.windowElement !== newRoot.ownerDocument.defaultView) {\n throw new Error(`Cannot connect a root:\n DOMLocalization already has a root from a different window.`);\n }\n }\n else {\n this.windowElement = newRoot.ownerDocument.defaultView;\n this.mutationObserver = new this.windowElement.MutationObserver(mutations => this.translateMutations(mutations));\n }\n this.roots.add(newRoot);\n this.mutationObserver.observe(newRoot, this.observerConfig);\n }\n /**\n * Remove `root` from the list of roots managed by this `DOMLocalization`.\n *\n * Additionally, if this `DOMLocalization` has an observer, stop observing\n * `root`.\n *\n * Returns `true` if the root was the last one managed by this\n * `DOMLocalization`.\n *\n * @param {Element} root - Root to disconnect.\n * @returns {boolean}\n */\n disconnectRoot(root) {\n this.roots.delete(root);\n // Pause the mutation observer to stop observing `root`.\n this.pauseObserving();\n if (this.roots.size === 0) {\n this.mutationObserver = null;\n this.windowElement = null;\n this.pendingrAF = null;\n this.pendingElements.clear();\n return true;\n }\n // Resume observing all other roots.\n this.resumeObserving();\n return false;\n }\n /**\n * Translate all roots associated with this `DOMLocalization`.\n *\n * @returns {Promise}\n */\n translateRoots() {\n const roots = Array.from(this.roots);\n return Promise.all(roots.map(root => this.translateFragment(root)));\n }\n /**\n * Pauses the `MutationObserver`.\n *\n * @private\n */\n pauseObserving() {\n if (!this.mutationObserver) {\n return;\n }\n this.translateMutations(this.mutationObserver.takeRecords());\n this.mutationObserver.disconnect();\n }\n /**\n * Resumes the `MutationObserver`.\n *\n * @private\n */\n resumeObserving() {\n if (!this.mutationObserver) {\n return;\n }\n for (const root of this.roots) {\n this.mutationObserver.observe(root, this.observerConfig);\n }\n }\n /**\n * Translate mutations detected by the `MutationObserver`.\n *\n * @private\n */\n translateMutations(mutations) {\n for (const mutation of mutations) {\n switch (mutation.type) {\n case \"attributes\":\n if (mutation.target.hasAttribute(\"data-l10n-id\")) {\n this.pendingElements.add(mutation.target);\n }\n break;\n case \"childList\":\n for (const addedNode of mutation.addedNodes) {\n if (addedNode.nodeType === addedNode.ELEMENT_NODE) {\n if (addedNode.childElementCount) {\n for (const element of this.getTranslatables(addedNode)) {\n this.pendingElements.add(element);\n }\n }\n else if (addedNode.hasAttribute(L10NID_ATTR_NAME)) {\n this.pendingElements.add(addedNode);\n }\n }\n }\n break;\n }\n }\n // This fragment allows us to coalesce all pending translations\n // into a single requestAnimationFrame.\n if (this.pendingElements.size > 0) {\n if (this.pendingrAF === null) {\n this.pendingrAF = this.windowElement.requestAnimationFrame(() => {\n this.translateElements(Array.from(this.pendingElements));\n this.pendingElements.clear();\n this.pendingrAF = null;\n });\n }\n }\n }\n /**\n * Translate a DOM element or fragment asynchronously using this\n * `DOMLocalization` object.\n *\n * Manually trigger the translation (or re-translation) of a DOM fragment.\n * Use the `data-l10n-id` and `data-l10n-args` attributes to mark up the DOM\n * with information about which translations to use.\n *\n * Returns a `Promise` that gets resolved once the translation is complete.\n *\n * @param {DOMFragment} frag - Element or DocumentFragment to be translated\n * @returns {Promise}\n */\n translateFragment(frag) {\n return this.translateElements(this.getTranslatables(frag));\n }\n /**\n * Translate a list of DOM elements asynchronously using this\n * `DOMLocalization` object.\n *\n * Manually trigger the translation (or re-translation) of a list of elements.\n * Use the `data-l10n-id` and `data-l10n-args` attributes to mark up the DOM\n * with information about which translations to use.\n *\n * Returns a `Promise` that gets resolved once the translation is complete.\n *\n * @param {Array} elements - List of elements to be translated\n * @returns {Promise}\n */\n async translateElements(elements) {\n if (!elements.length) {\n return undefined;\n }\n const keys = elements.map(this.getKeysForElement);\n const translations = await this.formatMessages(keys);\n return this.applyTranslations(elements, translations);\n }\n /**\n * Applies translations onto elements.\n *\n * @param {Array} elements\n * @param {Array} translations\n * @private\n */\n applyTranslations(elements, translations) {\n this.pauseObserving();\n for (let i = 0; i < elements.length; i++) {\n if (translations[i] !== undefined) {\n translateElement(elements[i], translations[i]);\n }\n }\n this.resumeObserving();\n }\n /**\n * Collects all translatable child elements of the element.\n *\n * @param {Element} element\n * @returns {Array}\n * @private\n */\n getTranslatables(element) {\n const nodes = Array.from(element.querySelectorAll(L10N_ELEMENT_QUERY));\n if (typeof element.hasAttribute === \"function\" &&\n element.hasAttribute(L10NID_ATTR_NAME)) {\n nodes.push(element);\n }\n return nodes;\n }\n /**\n * Get the `data-l10n-*` attributes from DOM elements as a two-element\n * array.\n *\n * @param {Element} element\n * @returns {Object}\n * @private\n */\n getKeysForElement(element) {\n return {\n id: element.getAttribute(L10NID_ATTR_NAME),\n args: JSON.parse(element.getAttribute(L10NARGS_ATTR_NAME) || null),\n };\n }\n}\n","export { default as DOMLocalization } from \"./dom_localization.js\";\nexport { default as Localization } from \"./localization.js\";\n","/* Copyright 2023 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./interfaces\").IL10n} IL10n */\n\n/**\n * NOTE: The L10n-implementations should use lowercase language-codes\n * internally.\n * @implements {IL10n}\n */\nclass L10n {\n #dir;\n\n #lang;\n\n #l10n;\n\n constructor({ lang, isRTL }, l10n = null) {\n this.#lang = L10n.#fixupLangCode(lang);\n this.#l10n = l10n;\n this.#dir = isRTL ?? L10n.#isRTL(this.#lang) ? \"rtl\" : \"ltr\";\n }\n\n _setL10n(l10n) {\n this.#l10n = l10n;\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\")) {\n document.l10n = l10n;\n }\n }\n\n /** @inheritdoc */\n getLanguage() {\n return this.#lang;\n }\n\n /** @inheritdoc */\n getDirection() {\n return this.#dir;\n }\n\n /** @inheritdoc */\n async get(ids, args = null, fallback) {\n if (Array.isArray(ids)) {\n ids = ids.map(id => ({ id }));\n const messages = await this.#l10n.formatMessages(ids);\n return messages.map(message => message.value);\n }\n\n const messages = await this.#l10n.formatMessages([\n {\n id: ids,\n args,\n },\n ]);\n return messages?.[0].value || fallback;\n }\n\n /** @inheritdoc */\n async translate(element) {\n try {\n this.#l10n.connectRoot(element);\n await this.#l10n.translateRoots();\n } catch {\n // Element is under an existing root, so there is no need to add it again.\n }\n }\n\n /** @inheritdoc */\n pause() {\n this.#l10n.pauseObserving();\n }\n\n /** @inheritdoc */\n resume() {\n this.#l10n.resumeObserving();\n }\n\n static #fixupLangCode(langCode) {\n // Use only lowercase language-codes internally, and fallback to English.\n langCode = langCode?.toLowerCase() || \"en-us\";\n\n // Try to support \"incompletely\" specified language codes (see issue 13689).\n const PARTIAL_LANG_CODES = {\n en: \"en-us\",\n es: \"es-es\",\n fy: \"fy-nl\",\n ga: \"ga-ie\",\n gu: \"gu-in\",\n hi: \"hi-in\",\n hy: \"hy-am\",\n nb: \"nb-no\",\n ne: \"ne-np\",\n nn: \"nn-no\",\n pa: \"pa-in\",\n pt: \"pt-pt\",\n sv: \"sv-se\",\n zh: \"zh-cn\",\n };\n return PARTIAL_LANG_CODES[langCode] || langCode;\n }\n\n static #isRTL(lang) {\n const shortCode = lang.split(\"-\", 1)[0];\n return [\"ar\", \"he\", \"fa\", \"ps\", \"ur\"].includes(shortCode);\n }\n}\n\nconst GenericL10n = null;\n\nexport { GenericL10n, L10n };\n","/* Copyright 2017 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./interfaces\").IL10n} IL10n */\n\nimport { FluentBundle, FluentResource } from \"fluent-bundle\";\nimport { DOMLocalization } from \"fluent-dom\";\nimport { fetchData } from \"pdfjs-lib\";\nimport { L10n } from \"./l10n.js\";\n\nfunction createBundle(lang, text) {\n const resource = new FluentResource(text);\n const bundle = new FluentBundle(lang);\n const errors = bundle.addResource(resource);\n if (errors.length) {\n console.error(\"L10n errors\", errors);\n }\n return bundle;\n}\n\n/**\n * @implements {IL10n}\n */\nclass GenericL10n extends L10n {\n constructor(lang) {\n super({ lang });\n\n const generateBundles = !lang\n ? GenericL10n.#generateBundlesFallback.bind(\n GenericL10n,\n this.getLanguage()\n )\n : GenericL10n.#generateBundles.bind(\n GenericL10n,\n \"en-us\",\n this.getLanguage()\n );\n this._setL10n(new DOMLocalization([], generateBundles));\n }\n\n /**\n * Generate the bundles for Fluent.\n * @param {String} defaultLang - The fallback language to use for\n * translations.\n * @param {String} baseLang - The base language to use for translations.\n */\n static async *#generateBundles(defaultLang, baseLang) {\n const { baseURL, paths } = await this.#getPaths();\n\n const langs = [baseLang];\n if (defaultLang !== baseLang) {\n // Also fallback to the short-format of the base language\n // (see issue 17269).\n const shortLang = baseLang.split(\"-\", 1)[0];\n\n if (shortLang !== baseLang) {\n langs.push(shortLang);\n }\n langs.push(defaultLang);\n }\n for (const lang of langs) {\n const bundle = await this.#createBundle(lang, baseURL, paths);\n if (bundle) {\n yield bundle;\n }\n if (lang === \"en-us\") {\n yield this.#createBundleFallback(lang);\n }\n }\n }\n\n static async #createBundle(lang, baseURL, paths) {\n const path = paths[lang];\n if (!path) {\n return null;\n }\n const url = new URL(path, baseURL);\n const text = await fetchData(url, /* type = */ \"text\");\n\n return createBundle(lang, text);\n }\n\n static async #getPaths() {\n try {\n const { href } = document.querySelector(`link[type=\"application/l10n\"]`);\n const paths = await fetchData(href, /* type = */ \"json\");\n\n return { baseURL: href.replace(/[^/]*$/, \"\") || \"./\", paths };\n } catch {}\n return { baseURL: \"./\", paths: Object.create(null) };\n }\n\n static async *#generateBundlesFallback(lang) {\n yield this.#createBundleFallback(lang);\n }\n\n static async #createBundleFallback(lang) {\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\")) {\n throw new Error(\"Not implemented: #createBundleFallback\");\n }\n const text =\n typeof PDFJSDev === \"undefined\"\n ? await fetchData(\n new URL(\"../l10n/en-US/viewer.ftl\", window.location.href),\n /* type = */ \"text\"\n )\n : PDFJSDev.eval(\"DEFAULT_FTL\");\n\n return createBundle(lang, text);\n }\n}\n\nexport { GenericL10n };\n","/* Copyright 2020 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getPdfFilenameFromUrl } from \"pdfjs-lib\";\n\nasync function docProperties(pdfDocument) {\n const url = \"\",\n baseUrl = url.split(\"#\", 1)[0];\n // eslint-disable-next-line prefer-const\n let { info, metadata, contentDispositionFilename, contentLength } =\n await pdfDocument.getMetadata();\n\n if (!contentLength) {\n const { length } = await pdfDocument.getDownloadInfo();\n contentLength = length;\n }\n\n return {\n ...info,\n baseURL: baseUrl,\n filesize: contentLength,\n filename: contentDispositionFilename || getPdfFilenameFromUrl(url),\n metadata: metadata?.getRaw(),\n authors: metadata?.get(\"dc:creator\"),\n numPages: pdfDocument.numPages,\n URL: url,\n };\n}\n\nclass GenericScripting {\n constructor(sandboxBundleSrc) {\n this._ready = new Promise((resolve, reject) => {\n const sandbox =\n typeof PDFJSDev === \"undefined\"\n ? import(sandboxBundleSrc) // eslint-disable-line no-unsanitized/method\n : __non_webpack_import__(sandboxBundleSrc);\n sandbox\n .then(pdfjsSandbox => {\n resolve(pdfjsSandbox.QuickJSSandbox());\n })\n .catch(reject);\n });\n }\n\n async createSandbox(data) {\n const sandbox = await this._ready;\n sandbox.create(data);\n }\n\n async dispatchEventInSandbox(event) {\n const sandbox = await this._ready;\n setTimeout(() => sandbox.dispatchEvent(event), 0);\n }\n\n async destroySandbox() {\n const sandbox = await this._ready;\n sandbox.nukeSandbox();\n }\n}\n\nexport { docProperties, GenericScripting };\n","/* Copyright 2017 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AppOptions } from \"./app_options.js\";\nimport { BaseExternalServices } from \"./external_services.js\";\nimport { BasePreferences } from \"./preferences.js\";\nimport { GenericL10n } from \"./genericl10n.js\";\nimport { GenericScripting } from \"./generic_scripting.js\";\n\nif (typeof PDFJSDev !== \"undefined\" && !PDFJSDev.test(\"GENERIC\")) {\n throw new Error(\n 'Module \"pdfjs-web/genericcom\" shall not be used outside GENERIC build.'\n );\n}\n\nfunction initCom(app) {}\n\nclass Preferences extends BasePreferences {\n async _writeToStorage(prefObj) {\n localStorage.setItem(\"pdfjs.preferences\", JSON.stringify(prefObj));\n }\n\n async _readFromStorage(prefObj) {\n return { prefs: JSON.parse(localStorage.getItem(\"pdfjs.preferences\")) };\n }\n}\n\nclass ExternalServices extends BaseExternalServices {\n async createL10n() {\n return new GenericL10n(AppOptions.get(\"locale\"));\n }\n\n createScripting() {\n return new GenericScripting(AppOptions.get(\"sandboxBundleSrc\"));\n }\n}\n\nclass MLManager {\n async guess() {\n return null;\n }\n}\n\nexport { ExternalServices, initCom, MLManager, Preferences };\n","/* Copyright 2023 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DOMSVGFactory, shadow } from \"pdfjs-lib\";\n\nclass AltTextManager {\n #boundUpdateUIState = this.#updateUIState.bind(this);\n\n #boundSetPosition = this.#setPosition.bind(this);\n\n #boundOnClick = this.#onClick.bind(this);\n\n #currentEditor = null;\n\n #cancelButton;\n\n #dialog;\n\n #eventBus;\n\n #hasUsedPointer = false;\n\n #optionDescription;\n\n #optionDecorative;\n\n #overlayManager;\n\n #saveButton;\n\n #textarea;\n\n #uiManager;\n\n #previousAltText = null;\n\n #svgElement = null;\n\n #rectElement = null;\n\n #container;\n\n #telemetryData = null;\n\n constructor(\n {\n dialog,\n optionDescription,\n optionDecorative,\n textarea,\n cancelButton,\n saveButton,\n },\n container,\n overlayManager,\n eventBus\n ) {\n this.#dialog = dialog;\n this.#optionDescription = optionDescription;\n this.#optionDecorative = optionDecorative;\n this.#textarea = textarea;\n this.#cancelButton = cancelButton;\n this.#saveButton = saveButton;\n this.#overlayManager = overlayManager;\n this.#eventBus = eventBus;\n this.#container = container;\n\n dialog.addEventListener(\"close\", this.#close.bind(this));\n dialog.addEventListener(\"contextmenu\", event => {\n if (event.target !== this.#textarea) {\n event.preventDefault();\n }\n });\n cancelButton.addEventListener(\"click\", this.#finish.bind(this));\n saveButton.addEventListener(\"click\", this.#save.bind(this));\n optionDescription.addEventListener(\"change\", this.#boundUpdateUIState);\n optionDecorative.addEventListener(\"change\", this.#boundUpdateUIState);\n\n this.#overlayManager.register(dialog);\n }\n\n get _elements() {\n return shadow(this, \"_elements\", [\n this.#optionDescription,\n this.#optionDecorative,\n this.#textarea,\n this.#saveButton,\n this.#cancelButton,\n ]);\n }\n\n #createSVGElement() {\n if (this.#svgElement) {\n return;\n }\n\n // We create a mask to add to the dialog backdrop: the idea is to have a\n // darken background everywhere except on the editor to clearly see the\n // picture to describe.\n\n const svgFactory = new DOMSVGFactory();\n const svg = (this.#svgElement = svgFactory.createElement(\"svg\"));\n svg.setAttribute(\"width\", \"0\");\n svg.setAttribute(\"height\", \"0\");\n const defs = svgFactory.createElement(\"defs\");\n svg.append(defs);\n const mask = svgFactory.createElement(\"mask\");\n defs.append(mask);\n mask.setAttribute(\"id\", \"alttext-manager-mask\");\n mask.setAttribute(\"maskContentUnits\", \"objectBoundingBox\");\n let rect = svgFactory.createElement(\"rect\");\n mask.append(rect);\n rect.setAttribute(\"fill\", \"white\");\n rect.setAttribute(\"width\", \"1\");\n rect.setAttribute(\"height\", \"1\");\n rect.setAttribute(\"x\", \"0\");\n rect.setAttribute(\"y\", \"0\");\n\n rect = this.#rectElement = svgFactory.createElement(\"rect\");\n mask.append(rect);\n rect.setAttribute(\"fill\", \"black\");\n this.#dialog.append(svg);\n }\n\n async editAltText(uiManager, editor) {\n if (this.#currentEditor || !editor) {\n return;\n }\n\n this.#createSVGElement();\n\n this.#hasUsedPointer = false;\n for (const element of this._elements) {\n element.addEventListener(\"click\", this.#boundOnClick);\n }\n\n const { altText, decorative } = editor.altTextData;\n if (decorative === true) {\n this.#optionDecorative.checked = true;\n this.#optionDescription.checked = false;\n } else {\n this.#optionDecorative.checked = false;\n this.#optionDescription.checked = true;\n }\n this.#previousAltText = this.#textarea.value = altText?.trim() || \"\";\n this.#updateUIState();\n\n this.#currentEditor = editor;\n this.#uiManager = uiManager;\n this.#uiManager.removeEditListeners();\n this.#eventBus._on(\"resize\", this.#boundSetPosition);\n\n try {\n await this.#overlayManager.open(this.#dialog);\n this.#setPosition();\n } catch (ex) {\n this.#close();\n throw ex;\n }\n }\n\n #setPosition() {\n if (!this.#currentEditor) {\n return;\n }\n const dialog = this.#dialog;\n const { style } = dialog;\n const {\n x: containerX,\n y: containerY,\n width: containerW,\n height: containerH,\n } = this.#container.getBoundingClientRect();\n const { innerWidth: windowW, innerHeight: windowH } = window;\n const { width: dialogW, height: dialogH } = dialog.getBoundingClientRect();\n const { x, y, width, height } = this.#currentEditor.getClientDimensions();\n const MARGIN = 10;\n const isLTR = this.#uiManager.direction === \"ltr\";\n\n const xs = Math.max(x, containerX);\n const xe = Math.min(x + width, containerX + containerW);\n const ys = Math.max(y, containerY);\n const ye = Math.min(y + height, containerY + containerH);\n this.#rectElement.setAttribute(\"width\", `${(xe - xs) / windowW}`);\n this.#rectElement.setAttribute(\"height\", `${(ye - ys) / windowH}`);\n this.#rectElement.setAttribute(\"x\", `${xs / windowW}`);\n this.#rectElement.setAttribute(\"y\", `${ys / windowH}`);\n\n let left = null;\n let top = Math.max(y, 0);\n top += Math.min(windowH - (top + dialogH), 0);\n\n if (isLTR) {\n // Prefer to position the dialog \"after\" (so on the right) the editor.\n if (x + width + MARGIN + dialogW < windowW) {\n left = x + width + MARGIN;\n } else if (x > dialogW + MARGIN) {\n left = x - dialogW - MARGIN;\n }\n } else if (x > dialogW + MARGIN) {\n left = x - dialogW - MARGIN;\n } else if (x + width + MARGIN + dialogW < windowW) {\n left = x + width + MARGIN;\n }\n\n if (left === null) {\n top = null;\n left = Math.max(x, 0);\n left += Math.min(windowW - (left + dialogW), 0);\n if (y > dialogH + MARGIN) {\n top = y - dialogH - MARGIN;\n } else if (y + height + MARGIN + dialogH < windowH) {\n top = y + height + MARGIN;\n }\n }\n\n if (top !== null) {\n dialog.classList.add(\"positioned\");\n if (isLTR) {\n style.left = `${left}px`;\n } else {\n style.right = `${windowW - left - dialogW}px`;\n }\n style.top = `${top}px`;\n } else {\n dialog.classList.remove(\"positioned\");\n style.left = \"\";\n style.top = \"\";\n }\n }\n\n #finish() {\n if (this.#overlayManager.active === this.#dialog) {\n this.#overlayManager.close(this.#dialog);\n }\n }\n\n #close() {\n this.#currentEditor._reportTelemetry(\n this.#telemetryData || {\n action: \"alt_text_cancel\",\n alt_text_keyboard: !this.#hasUsedPointer,\n }\n );\n this.#telemetryData = null;\n\n this.#removeOnClickListeners();\n this.#uiManager?.addEditListeners();\n this.#eventBus._off(\"resize\", this.#boundSetPosition);\n this.#currentEditor.altTextFinish();\n this.#currentEditor = null;\n this.#uiManager = null;\n }\n\n #updateUIState() {\n this.#textarea.disabled = this.#optionDecorative.checked;\n }\n\n #save() {\n const altText = this.#textarea.value.trim();\n const decorative = this.#optionDecorative.checked;\n this.#currentEditor.altTextData = {\n altText,\n decorative,\n };\n this.#telemetryData = {\n action: \"alt_text_save\",\n alt_text_description: !!altText,\n alt_text_edit:\n !!this.#previousAltText && this.#previousAltText !== altText,\n alt_text_decorative: decorative,\n alt_text_keyboard: !this.#hasUsedPointer,\n };\n this.#finish();\n }\n\n #onClick(evt) {\n if (evt.detail === 0) {\n return; // The keyboard was used.\n }\n this.#hasUsedPointer = true;\n this.#removeOnClickListeners();\n }\n\n #removeOnClickListeners() {\n for (const element of this._elements) {\n element.removeEventListener(\"click\", this.#boundOnClick);\n }\n }\n\n destroy() {\n this.#uiManager = null; // Avoid re-adding the edit listeners.\n this.#finish();\n this.#svgElement?.remove();\n this.#svgElement = this.#rectElement = null;\n }\n}\n\nexport { AltTextManager };\n","/* Copyright 2022 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./event_utils.js\").EventBus} EventBus */\n\nimport { AnnotationEditorParamsType } from \"pdfjs-lib\";\n\n/**\n * @typedef {Object} AnnotationEditorParamsOptions\n * @property {HTMLInputElement} editorFreeTextFontSize\n * @property {HTMLInputElement} editorFreeTextColor\n * @property {HTMLInputElement} editorInkColor\n * @property {HTMLInputElement} editorInkThickness\n * @property {HTMLInputElement} editorInkOpacity\n * @property {HTMLButtonElement} editorStampAddImage\n * @property {HTMLInputElement} editorFreeHighlightThickness\n * @property {HTMLButtonElement} editorHighlightShowAll\n */\n\nclass AnnotationEditorParams {\n /**\n * @param {AnnotationEditorParamsOptions} options\n * @param {EventBus} eventBus\n */\n constructor(options, eventBus) {\n this.eventBus = eventBus;\n this.#bindListeners(options);\n }\n\n /**\n * @param {AnnotationEditorParamsOptions} options\n */\n #bindListeners({\n editorFreeTextFontSize,\n editorFreeTextColor,\n editorInkColor,\n editorInkThickness,\n editorInkOpacity,\n editorStampAddImage,\n editorFreeHighlightThickness,\n editorHighlightShowAll,\n }) {\n const dispatchEvent = (typeStr, value) => {\n this.eventBus.dispatch(\"switchannotationeditorparams\", {\n source: this,\n type: AnnotationEditorParamsType[typeStr],\n value,\n });\n };\n editorFreeTextFontSize.addEventListener(\"input\", function () {\n dispatchEvent(\"FREETEXT_SIZE\", this.valueAsNumber);\n });\n editorFreeTextColor.addEventListener(\"input\", function () {\n dispatchEvent(\"FREETEXT_COLOR\", this.value);\n });\n editorInkColor.addEventListener(\"input\", function () {\n dispatchEvent(\"INK_COLOR\", this.value);\n });\n editorInkThickness.addEventListener(\"input\", function () {\n dispatchEvent(\"INK_THICKNESS\", this.valueAsNumber);\n });\n editorInkOpacity.addEventListener(\"input\", function () {\n dispatchEvent(\"INK_OPACITY\", this.valueAsNumber);\n });\n editorStampAddImage.addEventListener(\"click\", () => {\n dispatchEvent(\"CREATE\");\n });\n editorFreeHighlightThickness.addEventListener(\"input\", function () {\n dispatchEvent(\"HIGHLIGHT_THICKNESS\", this.valueAsNumber);\n });\n editorHighlightShowAll.addEventListener(\"click\", function () {\n const checked = this.getAttribute(\"aria-pressed\") === \"true\";\n this.setAttribute(\"aria-pressed\", !checked);\n dispatchEvent(\"HIGHLIGHT_SHOW_ALL\", !checked);\n });\n\n this.eventBus._on(\"annotationeditorparamschanged\", evt => {\n for (const [type, value] of evt.details) {\n switch (type) {\n case AnnotationEditorParamsType.FREETEXT_SIZE:\n editorFreeTextFontSize.value = value;\n break;\n case AnnotationEditorParamsType.FREETEXT_COLOR:\n editorFreeTextColor.value = value;\n break;\n case AnnotationEditorParamsType.INK_COLOR:\n editorInkColor.value = value;\n break;\n case AnnotationEditorParamsType.INK_THICKNESS:\n editorInkThickness.value = value;\n break;\n case AnnotationEditorParamsType.INK_OPACITY:\n editorInkOpacity.value = value;\n break;\n case AnnotationEditorParamsType.HIGHLIGHT_THICKNESS:\n editorFreeHighlightThickness.value = value;\n break;\n case AnnotationEditorParamsType.HIGHLIGHT_FREE:\n editorFreeHighlightThickness.disabled = !value;\n break;\n case AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL:\n editorHighlightShowAll.setAttribute(\"aria-pressed\", value);\n break;\n }\n }\n });\n }\n}\n\nexport { AnnotationEditorParams };\n","/* Copyright 2024 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Used to compare floats: there is no exact equality due to rounding errors.\nconst PRECISION = 1e-1;\n\nclass CaretBrowsingMode {\n #mainContainer;\n\n #toolBarHeight;\n\n #viewerContainer;\n\n constructor(mainContainer, viewerContainer, toolbarContainer) {\n this.#mainContainer = mainContainer;\n this.#viewerContainer = viewerContainer;\n this.#toolBarHeight = toolbarContainer?.getBoundingClientRect().height ?? 0;\n }\n\n /**\n * Return true if the two rectangles are on the same line.\n * @param {DOMRect} rect1\n * @param {DOMRect} rect2\n * @returns {boolean}\n */\n #isOnSameLine(rect1, rect2) {\n const top1 = rect1.y;\n const bot1 = rect1.bottom;\n const mid1 = rect1.y + rect1.height / 2;\n\n const top2 = rect2.y;\n const bot2 = rect2.bottom;\n const mid2 = rect2.y + rect2.height / 2;\n\n return (top1 <= mid2 && mid2 <= bot1) || (top2 <= mid1 && mid1 <= bot2);\n }\n\n /**\n * Return `true` if the rectangle is:\n * - under the caret when `isUp === false`.\n * - over the caret when `isUp === true`.\n * @param {DOMRect} rect\n * @param {number} x\n * @param {number} y\n * @param {boolean} isUp\n * @returns {boolean}\n */\n #isUnderOver(rect, x, y, isUp) {\n const midY = rect.y + rect.height / 2;\n return (\n (isUp ? y >= midY : y <= midY) &&\n rect.x - PRECISION <= x &&\n x <= rect.right + PRECISION\n );\n }\n\n /**\n * Check if the rectangle is visible.\n * @param {DOMRect} rect\n * @returns {boolean}\n */\n #isVisible(rect) {\n return (\n rect.top >= this.#toolBarHeight &&\n rect.left >= 0 &&\n rect.bottom <=\n (window.innerHeight || document.documentElement.clientHeight) &&\n rect.right <= (window.innerWidth || document.documentElement.clientWidth)\n );\n }\n\n /**\n * Get the position of the caret.\n * @param {Selection} selection\n * @param {boolean} isUp\n * @returns {Array}\n */\n #getCaretPosition(selection, isUp) {\n const { focusNode, focusOffset } = selection;\n const range = document.createRange();\n range.setStart(focusNode, focusOffset);\n range.setEnd(focusNode, focusOffset);\n const rect = range.getBoundingClientRect();\n\n return [rect.x, isUp ? rect.top : rect.bottom];\n }\n\n static #caretPositionFromPoint(x, y) {\n if (\n (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) &&\n !document.caretPositionFromPoint\n ) {\n const { startContainer: offsetNode, startOffset: offset } =\n document.caretRangeFromPoint(x, y);\n return { offsetNode, offset };\n }\n return document.caretPositionFromPoint(x, y);\n }\n\n #setCaretPositionHelper(selection, caretX, select, element, rect) {\n rect ||= element.getBoundingClientRect();\n if (caretX <= rect.x + PRECISION) {\n if (select) {\n selection.extend(element.firstChild, 0);\n } else {\n selection.setPosition(element.firstChild, 0);\n }\n return;\n }\n if (rect.right - PRECISION <= caretX) {\n const { lastChild } = element;\n if (select) {\n selection.extend(lastChild, lastChild.length);\n } else {\n selection.setPosition(lastChild, lastChild.length);\n }\n return;\n }\n\n const midY = rect.y + rect.height / 2;\n let caretPosition = CaretBrowsingMode.#caretPositionFromPoint(caretX, midY);\n let parentElement = caretPosition.offsetNode?.parentElement;\n if (parentElement && parentElement !== element) {\n // There is an element on top of the one in the text layer, so we\n // need to hide all the elements (except the one in the text layer)\n // at this position in order to get the correct caret position.\n const elementsAtPoint = document.elementsFromPoint(caretX, midY);\n const savedVisibilities = [];\n for (const el of elementsAtPoint) {\n if (el === element) {\n break;\n }\n const { style } = el;\n savedVisibilities.push([el, style.visibility]);\n style.visibility = \"hidden\";\n }\n caretPosition = CaretBrowsingMode.#caretPositionFromPoint(caretX, midY);\n parentElement = caretPosition.offsetNode?.parentElement;\n for (const [el, visibility] of savedVisibilities) {\n el.style.visibility = visibility;\n }\n }\n if (parentElement !== element) {\n // The element targeted by caretPositionFromPoint isn't in the text\n // layer.\n if (select) {\n selection.extend(element.firstChild, 0);\n } else {\n selection.setPosition(element.firstChild, 0);\n }\n return;\n }\n if (select) {\n selection.extend(caretPosition.offsetNode, caretPosition.offset);\n } else {\n selection.setPosition(caretPosition.offsetNode, caretPosition.offset);\n }\n }\n\n /**\n * Set the caret position or extend the selection (it depends on the select\n * parameter).\n * @param {boolean} select\n * @param {Selection} selection\n * @param {Element} newLineElement\n * @param {DOMRect} newLineElementRect\n * @param {number} caretX\n */\n #setCaretPosition(\n select,\n selection,\n newLineElement,\n newLineElementRect,\n caretX\n ) {\n if (this.#isVisible(newLineElementRect)) {\n this.#setCaretPositionHelper(\n selection,\n caretX,\n select,\n newLineElement,\n newLineElementRect\n );\n return;\n }\n this.#mainContainer.addEventListener(\n \"scrollend\",\n this.#setCaretPositionHelper.bind(\n this,\n selection,\n caretX,\n select,\n newLineElement,\n null\n ),\n { once: true }\n );\n newLineElement.scrollIntoView();\n }\n\n /**\n * Get the node on the next page.\n * @param {Element} textLayer\n * @param {boolean} isUp\n * @returns {Node}\n */\n #getNodeOnNextPage(textLayer, isUp) {\n while (true) {\n const page = textLayer.closest(\".page\");\n const pageNumber = parseInt(page.getAttribute(\"data-page-number\"));\n const nextPage = isUp ? pageNumber - 1 : pageNumber + 1;\n textLayer = this.#viewerContainer.querySelector(\n `.page[data-page-number=\"${nextPage}\"] .textLayer`\n );\n if (!textLayer) {\n return null;\n }\n const walker = document.createTreeWalker(textLayer, NodeFilter.SHOW_TEXT);\n const node = isUp ? walker.lastChild() : walker.firstChild();\n if (node) {\n return node;\n }\n }\n }\n\n /**\n * Move the caret in the given direction.\n * @param {boolean} isUp\n * @param {boolean} select\n */\n moveCaret(isUp, select) {\n const selection = document.getSelection();\n if (selection.rangeCount === 0) {\n return;\n }\n const { focusNode } = selection;\n const focusElement =\n focusNode.nodeType !== Node.ELEMENT_NODE\n ? focusNode.parentElement\n : focusNode;\n const root = focusElement.closest(\".textLayer\");\n if (!root) {\n return;\n }\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);\n walker.currentNode = focusNode;\n\n // Move to the next element which is not on the same line as the focus\n // element.\n const focusRect = focusElement.getBoundingClientRect();\n let newLineElement = null;\n const nodeIterator = (\n isUp ? walker.previousSibling : walker.nextSibling\n ).bind(walker);\n while (nodeIterator()) {\n const element = walker.currentNode.parentElement;\n if (!this.#isOnSameLine(focusRect, element.getBoundingClientRect())) {\n newLineElement = element;\n break;\n }\n }\n\n if (!newLineElement) {\n // Need to find the next line on the next page.\n const node = this.#getNodeOnNextPage(root, isUp);\n if (!node) {\n return;\n }\n if (select) {\n const lastNode =\n (isUp ? walker.firstChild() : walker.lastChild()) || focusNode;\n selection.extend(lastNode, isUp ? 0 : lastNode.length);\n const range = document.createRange();\n range.setStart(node, isUp ? node.length : 0);\n range.setEnd(node, isUp ? node.length : 0);\n selection.addRange(range);\n return;\n }\n const [caretX] = this.#getCaretPosition(selection, isUp);\n const { parentElement } = node;\n this.#setCaretPosition(\n select,\n selection,\n parentElement,\n parentElement.getBoundingClientRect(),\n caretX\n );\n return;\n }\n\n // We've a candidate for the next line now we want to find the first element\n // which is under/over the caret.\n const [caretX, caretY] = this.#getCaretPosition(selection, isUp);\n const newLineElementRect = newLineElement.getBoundingClientRect();\n\n // Maybe the element on the new line is a valid candidate.\n if (this.#isUnderOver(newLineElementRect, caretX, caretY, isUp)) {\n this.#setCaretPosition(\n select,\n selection,\n newLineElement,\n newLineElementRect,\n caretX\n );\n return;\n }\n\n while (nodeIterator()) {\n // Search an element on the same line as newLineElement\n // which could be under/over the caret.\n const element = walker.currentNode.parentElement;\n const elementRect = element.getBoundingClientRect();\n if (!this.#isOnSameLine(newLineElementRect, elementRect)) {\n break;\n }\n if (this.#isUnderOver(elementRect, caretX, caretY, isUp)) {\n // We found the element.\n this.#setCaretPosition(select, selection, element, elementRect, caretX);\n return;\n }\n }\n\n // No element has been found so just put the caret on the element on the new\n // line.\n this.#setCaretPosition(\n select,\n selection,\n newLineElement,\n newLineElementRect,\n caretX\n );\n }\n}\n\nexport { CaretBrowsingMode };\n","/* Copyright 2013 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./interfaces\").IDownloadManager} IDownloadManager */\n\nimport { createValidAbsoluteUrl, isPdfFile } from \"pdfjs-lib\";\n\nif (typeof PDFJSDev !== \"undefined\" && !PDFJSDev.test(\"CHROME || GENERIC\")) {\n throw new Error(\n 'Module \"pdfjs-web/download_manager\" shall not be used ' +\n \"outside CHROME and GENERIC builds.\"\n );\n}\n\nfunction download(blobUrl, filename) {\n const a = document.createElement(\"a\");\n if (!a.click) {\n throw new Error('DownloadManager: \"a.click()\" is not supported.');\n }\n a.href = blobUrl;\n a.target = \"_parent\";\n // Use a.download if available. This increases the likelihood that\n // the file is downloaded instead of opened by another PDF plugin.\n if (\"download\" in a) {\n a.download = filename;\n }\n // must be in the document for recent Firefox versions,\n // otherwise .click() is ignored.\n (document.body || document.documentElement).append(a);\n a.click();\n a.remove();\n}\n\n/**\n * @implements {IDownloadManager}\n */\nclass DownloadManager {\n #openBlobUrls = new WeakMap();\n\n downloadUrl(url, filename, _options) {\n if (!createValidAbsoluteUrl(url, \"http://example.com\")) {\n console.error(`downloadUrl - not a valid URL: ${url}`);\n return; // restricted/invalid URL\n }\n download(url + \"#pdfjs.action=download\", filename);\n }\n\n downloadData(data, filename, contentType) {\n const blobUrl = URL.createObjectURL(\n new Blob([data], { type: contentType })\n );\n download(blobUrl, filename);\n }\n\n /**\n * @returns {boolean} Indicating if the data was opened.\n */\n openOrDownloadData(data, filename, dest = null) {\n const isPdfData = isPdfFile(filename);\n const contentType = isPdfData ? \"application/pdf\" : \"\";\n\n if (\n (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"COMPONENTS\")) &&\n isPdfData\n ) {\n let blobUrl = this.#openBlobUrls.get(data);\n if (!blobUrl) {\n blobUrl = URL.createObjectURL(new Blob([data], { type: contentType }));\n this.#openBlobUrls.set(data, blobUrl);\n }\n let viewerUrl;\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n // The current URL is the viewer, let's use it and append the file.\n viewerUrl = \"?file=\" + encodeURIComponent(blobUrl + \"#\" + filename);\n } else if (PDFJSDev.test(\"CHROME\")) {\n // In the Chrome extension, the URL is rewritten using the history API\n // in viewer.js, so an absolute URL must be generated.\n viewerUrl =\n // eslint-disable-next-line no-undef\n chrome.runtime.getURL(\"/content/web/viewer.html\") +\n \"?file=\" +\n encodeURIComponent(blobUrl + \"#\" + filename);\n }\n if (dest) {\n viewerUrl += `#${escape(dest)}`;\n }\n\n try {\n window.open(viewerUrl);\n return true;\n } catch (ex) {\n console.error(`openOrDownloadData: ${ex}`);\n // Release the `blobUrl`, since opening it failed, and fallback to\n // downloading the PDF file.\n URL.revokeObjectURL(blobUrl);\n this.#openBlobUrls.delete(data);\n }\n }\n\n this.downloadData(data, filename, contentType);\n return false;\n }\n\n download(blob, url, filename, _options) {\n const blobUrl = URL.createObjectURL(blob);\n download(blobUrl, filename);\n }\n}\n\nexport { DownloadManager };\n","/* Copyright 2014 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nclass OverlayManager {\n #overlays = new WeakMap();\n\n #active = null;\n\n get active() {\n return this.#active;\n }\n\n /**\n * @param {HTMLDialogElement} dialog - The overlay's DOM element.\n * @param {boolean} [canForceClose] - Indicates if opening the overlay closes\n * an active overlay. The default is `false`.\n * @returns {Promise} A promise that is resolved when the overlay has been\n * registered.\n */\n async register(dialog, canForceClose = false) {\n if (typeof dialog !== \"object\") {\n throw new Error(\"Not enough parameters.\");\n } else if (this.#overlays.has(dialog)) {\n throw new Error(\"The overlay is already registered.\");\n }\n this.#overlays.set(dialog, { canForceClose });\n\n dialog.addEventListener(\"cancel\", evt => {\n this.#active = null;\n });\n }\n\n /**\n * @param {HTMLDialogElement} dialog - The overlay's DOM element.\n * @returns {Promise} A promise that is resolved when the overlay has been\n * opened.\n */\n async open(dialog) {\n if (!this.#overlays.has(dialog)) {\n throw new Error(\"The overlay does not exist.\");\n } else if (this.#active) {\n if (this.#active === dialog) {\n throw new Error(\"The overlay is already active.\");\n } else if (this.#overlays.get(dialog).canForceClose) {\n await this.close();\n } else {\n throw new Error(\"Another overlay is currently active.\");\n }\n }\n this.#active = dialog;\n dialog.showModal();\n }\n\n /**\n * @param {HTMLDialogElement} dialog - The overlay's DOM element.\n * @returns {Promise} A promise that is resolved when the overlay has been\n * closed.\n */\n async close(dialog = this.#active) {\n if (!this.#overlays.has(dialog)) {\n throw new Error(\"The overlay does not exist.\");\n } else if (!this.#active) {\n throw new Error(\"The overlay is currently not active.\");\n } else if (this.#active !== dialog) {\n throw new Error(\"Another overlay is currently active.\");\n }\n dialog.close();\n this.#active = null;\n }\n}\n\nexport { OverlayManager };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./overlay_manager.js\").OverlayManager} OverlayManager */\n\nimport { PasswordResponses } from \"pdfjs-lib\";\n\n/**\n * @typedef {Object} PasswordPromptOptions\n * @property {HTMLDialogElement} dialog - The overlay's DOM element.\n * @property {HTMLParagraphElement} label - Label containing instructions for\n * entering the password.\n * @property {HTMLInputElement} input - Input field for entering the password.\n * @property {HTMLButtonElement} submitButton - Button for submitting the\n * password.\n * @property {HTMLButtonElement} cancelButton - Button for cancelling password\n * entry.\n */\n\nclass PasswordPrompt {\n #activeCapability = null;\n\n #updateCallback = null;\n\n #reason = null;\n\n /**\n * @param {PasswordPromptOptions} options\n * @param {OverlayManager} overlayManager - Manager for the viewer overlays.\n * @param {boolean} [isViewerEmbedded] - If the viewer is embedded, in e.g.\n * an + + + + + + diff --git a/src/renderer/src/components/ai-chart/container/text.vue b/src/renderer/src/components/ai-chart/container/text.vue new file mode 100644 index 0000000..3372051 --- /dev/null +++ b/src/renderer/src/components/ai-chart/container/text.vue @@ -0,0 +1,47 @@ + + + + + \ No newline at end of file diff --git a/src/renderer/src/components/ai-chart/index.vue b/src/renderer/src/components/ai-chart/index.vue new file mode 100644 index 0000000..5234683 --- /dev/null +++ b/src/renderer/src/components/ai-chart/index.vue @@ -0,0 +1,454 @@ + + + + + \ No newline at end of file diff --git a/src/renderer/src/components/avatar-handle/index.vue b/src/renderer/src/components/avatar-handle/index.vue new file mode 100644 index 0000000..774955f --- /dev/null +++ b/src/renderer/src/components/avatar-handle/index.vue @@ -0,0 +1,75 @@ + + + + + diff --git a/src/renderer/src/components/choose-textbook/index.vue b/src/renderer/src/components/choose-textbook/index.vue new file mode 100644 index 0000000..3c4414d --- /dev/null +++ b/src/renderer/src/components/choose-textbook/index.vue @@ -0,0 +1,313 @@ + + + + + diff --git a/src/renderer/src/components/choose-textbook/third.vue b/src/renderer/src/components/choose-textbook/third.vue new file mode 100644 index 0000000..ca8f65d --- /dev/null +++ b/src/renderer/src/components/choose-textbook/third.vue @@ -0,0 +1,293 @@ + + + + + diff --git a/src/renderer/src/components/choose-textbook/third/index.vue b/src/renderer/src/components/choose-textbook/third/index.vue new file mode 100644 index 0000000..dc5fd9e --- /dev/null +++ b/src/renderer/src/components/choose-textbook/third/index.vue @@ -0,0 +1,75 @@ + + + + + diff --git a/src/renderer/src/components/choose-textbook/third/selectSubject.vue b/src/renderer/src/components/choose-textbook/third/selectSubject.vue new file mode 100644 index 0000000..af4b57b --- /dev/null +++ b/src/renderer/src/components/choose-textbook/third/selectSubject.vue @@ -0,0 +1,35 @@ + + + + + diff --git a/src/renderer/src/components/classManage/select/index.vue b/src/renderer/src/components/classManage/select/index.vue new file mode 100644 index 0000000..6a11142 --- /dev/null +++ b/src/renderer/src/components/classManage/select/index.vue @@ -0,0 +1,23 @@ + + + diff --git a/src/renderer/src/components/common/cForm.vue b/src/renderer/src/components/common/cForm.vue new file mode 100644 index 0000000..72b1956 --- /dev/null +++ b/src/renderer/src/components/common/cForm.vue @@ -0,0 +1,208 @@ + + + diff --git a/src/renderer/src/components/common/index.js b/src/renderer/src/components/common/index.js new file mode 100644 index 0000000..d31d868 --- /dev/null +++ b/src/renderer/src/components/common/index.js @@ -0,0 +1,64 @@ + +/** + * 使用-批量导入--方式 + */ + +// 导入 import.meta.glob 用于获取所有符合要求的 .vue 文件 +const files = import.meta.glob('./!(index).vue', { eager: true }); + +export default { + install(Vue, options) { + Object.entries(files).forEach(([path, file]) => { + const fileName = path.split('/').pop().replace(/\.\w+$/, '') + // fileName == 'cDialog' && initDialog(Vue, file) // 弹窗--组件化 + Vue.component(fileName, file.default) + }); + } +} + +// 弹窗--函数化 +function initDialog(Vue, dialog) { + // 全局绑定 + Vue.prototype.$cDialog = (props) => { + // props.dialog = Object.assign({ isOpen: true }, props.dialog) // 默认配置 propsData: option + props.dialog.isOpen == null && (props.dialog.isOpen = true) // 默认打开 + props.isRemove == null && (props.isRemove = true) // 默认关闭后移除 + const Constructor = Vue.extend(dialog) + const Instance = new Constructor({ propsData: props }) + props.slots && (Instance.$slots = props.slots) // 插槽内容 + props.scopedSlots && (Instance.$scopedSlots = props.scopedSlots) // 作用域插槽内容 + props.content && (Instance.$slots.default = props.content) // 插槽内容 + document.body.appendChild(Instance.$mount().$el) + return Instance.showBox().then(v => { + props.callback && props.callback(v) + return Promise.resolve(v) + }).catch(v => { + props.callback && props.callback(v) + // 移除弹窗 + props.isRemove && document.body.removeChild(Instance.$mount().$el) + return Promise.reject(v) + }) + } + // 全局绑定2 + Vue.prototype.$cDialog2 = (props) => { + // props.dialog = Object.assign({ isOpen: true }, props.dialog) // 默认配置 propsData: option + props.dialog.isOpen == null && (props.dialog.isOpen = true) // 默认打开 + props.isRemove == null && (props.isRemove = true) // 默认关闭后移除 + const Constructor = Vue.extend(dialog) + const Instance = new Constructor({ propsData: props }) + props.slots && (Instance.$slots = props.slots) // 插槽内容 + props.scopedSlots && (Instance.$scopedSlots = props.scopedSlots) // 作用域插槽内容 + props.content && (Instance.$slots.default = props.content) // 插槽内容 + document.body.appendChild(Instance.$mount().$el) + Instance.showBox().then(v => { + props.callback && props.callback(v) + return Promise.resolve(v) + }).catch(v => { + props.callback && props.callback(v) + // 移除弹窗 + props.isRemove && document.body.removeChild(Instance.$mount().$el) + return Promise.reject(v) + }) + return Instance + } +} diff --git a/src/renderer/src/components/exam-question/examDetailsDrawer.vue b/src/renderer/src/components/exam-question/examDetailsDrawer.vue new file mode 100644 index 0000000..12de43c --- /dev/null +++ b/src/renderer/src/components/exam-question/examDetailsDrawer.vue @@ -0,0 +1,74 @@ + + + + + + \ No newline at end of file diff --git a/src/renderer/src/components/file-image/index.vue b/src/renderer/src/components/file-image/index.vue new file mode 100644 index 0000000..092c238 --- /dev/null +++ b/src/renderer/src/components/file-image/index.vue @@ -0,0 +1,50 @@ + + + + + diff --git a/src/renderer/src/components/file-preview/index.vue b/src/renderer/src/components/file-preview/index.vue new file mode 100644 index 0000000..9b2326d --- /dev/null +++ b/src/renderer/src/components/file-preview/index.vue @@ -0,0 +1,143 @@ + + + + diff --git a/src/renderer/src/components/file-upload/index.vue b/src/renderer/src/components/file-upload/index.vue new file mode 100644 index 0000000..f4829de --- /dev/null +++ b/src/renderer/src/components/file-upload/index.vue @@ -0,0 +1,52 @@ + + + diff --git a/src/renderer/src/components/move-file/index.vue b/src/renderer/src/components/move-file/index.vue new file mode 100644 index 0000000..a792459 --- /dev/null +++ b/src/renderer/src/components/move-file/index.vue @@ -0,0 +1,318 @@ + + + + + diff --git a/src/renderer/src/components/pdf/index copy.vue b/src/renderer/src/components/pdf/index copy.vue new file mode 100644 index 0000000..ed17c21 --- /dev/null +++ b/src/renderer/src/components/pdf/index copy.vue @@ -0,0 +1,419 @@ +pdfAdnFabric + + + + \ No newline at end of file diff --git a/src/renderer/src/components/pdf/index.vue b/src/renderer/src/components/pdf/index.vue new file mode 100644 index 0000000..a4044f4 --- /dev/null +++ b/src/renderer/src/components/pdf/index.vue @@ -0,0 +1,419 @@ +pdfAdnFabric + + + + \ No newline at end of file diff --git a/src/renderer/src/components/refile-preview/index.vue b/src/renderer/src/components/refile-preview/index.vue new file mode 100644 index 0000000..227a465 --- /dev/null +++ b/src/renderer/src/components/refile-preview/index.vue @@ -0,0 +1,118 @@ + + + + + diff --git a/src/renderer/src/components/refile-preview/types.ts b/src/renderer/src/components/refile-preview/types.ts new file mode 100644 index 0000000..167bbff --- /dev/null +++ b/src/renderer/src/components/refile-preview/types.ts @@ -0,0 +1,7 @@ +export interface FileProps { + id?: number; + type?: string; + fileType?: string; + raw?: File; + filePath?: string; +} diff --git a/src/renderer/src/components/refile-preview/useReadFile.ts b/src/renderer/src/components/refile-preview/useReadFile.ts new file mode 100644 index 0000000..d93e785 --- /dev/null +++ b/src/renderer/src/components/refile-preview/useReadFile.ts @@ -0,0 +1,261 @@ +import type { FileProps } from "@/components/refile-preview/types"; +import { onUnmounted, ref } from "vue"; +import axios from "axios"; + +export function useHooks(props: FileProps) { + const excelOptions = { + xls: props.fileType !== "xlsx", //预览xlsx文件设为false;预览xls文件设为true + minColLength: 0, // excel最少渲染多少列,如果想实现xlsx文件内容有几列,就渲染几列,可以将此值设置为0. + minRowLength: 0, // excel最少渲染多少行,如果想实现根据xlsx实际函数渲染,可以将此值设置为0. + widthOffset: 10, //如果渲染出来的结果感觉单元格宽度不够,可以在默认渲染的列表宽度上再加 Npx宽 + heightOffset: 10, //在默认渲染的列表高度上再加 Npx高 + beforeTransformData: workbookData => { + return workbookData; + }, //底层通过exceljs获取excel文件内容,通过该钩子函数,可以对获取的excel文件内容进行修改,比如某个单元格的数据显示不正确,可以在此自行修改每个单元格的value值。 + transformData: workbookData => { + return workbookData; + } //将获取到的excel数据进行处理之后且渲染到页面之前,可通过transformData对即将渲染的数据及样式进行修改,此时每个单元格的text值就是即将渲染到页面上的内容 + }; + const src = ref(); + const filePreviewRef = ref(); + /** + * 渲染完成 + */ + const renderedHandler = () => { + console.log("渲染完成"); + }; + /** + * 渲染失败 + * @param e + */ + const errorHandler = e => { + console.log("渲染失败", e); + }; + + /** + * 渲染文件 + */ + async function renderTheFile() { + if (props.type === "local") { + console.log("本地文件" + props.fileType); + isImage(props.fileType) && localImagePreview(props.raw); + isDoc(props.fileType) && localOfficePreview(props.raw); + isText(props.fileType) && localTextPreview(props.raw); + isVideo(props.fileType) && localVideoPreview(props.raw); + isAudio(props.fileType) && localAudioPreview(props.raw); + } else { + if (isVideo(props.fileType)) { + src.value = + import.meta.env.VITE_APP_BASE_URL + + "/upload/attachments/getTeamOfVideo?id=" + + props.id; + return; + } + if (isText(props.fileType)) { + const response = await axios.get( + import.meta.env.VITE_STATIC_URL + props.filePath, + { + responseType: "text" + } + ); + src.value = response.data; + return; + } + src.value = import.meta.env.VITE_STATIC_URL + props.filePath; + } + } + + /** + * 校验图片类型 + * @param type + */ + function isImage(type: string) { + const types = [ + "jpg", + "png", + "gif", + "jpeg", + "bmp", + "webp", + "svg", + "tiff", + "tif", + "jpeg", + "jfif", + "pjpeg", + "pjp" + ]; + return types.includes(type); + } + + /** + * 校验文档类型 + * @param type + */ + function isDoc(type: string) { + const types = ["docx", "doc", "xlsx", "xls", "pdf"]; + return types.includes(type); + } + + /** + * 校验文本类型 + * @param type + */ + function isText(type: string) { + const types = [ + "txt", + "md", + "log", + "json", + "xml", + "html", + "css", + "js", + "java", + "c", + "cpp", + "h", + "hpp", + "py", + "rb", + "go", + "sh", + "bat", + "ps1", + "psm1", + "ps1xml", + "psc1", + "psd1", + "psm1", + "ps1xml", + "psc1", + "psd1", + "ps1xml", + "psc1", + "ps1xml", + "psc1", + "psd1" + ]; + return types.includes(type); + } + + // 检验视频格式 + function isVideo(type: string) { + const types = [ + "mp4", + "avi", + "rmvb", + "mkv", + "flv", + "wmv", + "mov", + "webm", + "m4v", + "mpg", + "mpeg", + "3gp", + "3g2", + "vob", + "ogv", + "ogg", + "mts", + "m2ts", + "ts", + "m2v", + "mpe", + "mpv", + "m4p", + "m4v", + "mpv2", + "m4v", + "m4p", + "m4v", + "m4p" + ]; + return types.includes(type); + } + + // 检验音频文件 + function isAudio(type: string) { + const types = ["mp3", "wav", "ogg", "flac", "aac", "wma", "m4a", "wma"]; + return types.includes(type); + } + + /** + * 预览本地Office文件 + * @param file + */ + function localOfficePreview(file: File) { + const reader = new FileReader(); + reader.readAsArrayBuffer(file); + reader.onload = loadEvent => { + const arrayBuffer = loadEvent.target.result; + const blob = new Blob([arrayBuffer], { + type: "application/vnd.openxmlformats-officedocument.wordprocessingml.document" + }); + src.value = URL.createObjectURL(blob); + }; + } + + /** + * 预览本地图片 + * @param file + */ + function localImagePreview(file: File) { + const reader = new FileReader(); + reader.onload = e => { + src.value = e.target.result; + }; + reader.readAsDataURL(file); + } + + /** + * 预览本地文本 + * @param file + */ + function localTextPreview(file: File) { + const reader = new FileReader(); + reader.onload = e => { + src.value = e.target.result; + }; + reader.readAsText(file); + } + + /** + * 预览本地视频 + * @param file + */ + function localVideoPreview(file: File) { + src.value = URL.createObjectURL(file); + } + + function localAudioPreview(file: File) { + const reader = new FileReader(); + reader.onloadend = () => { + const blob = new Blob([reader.result], { type: "audio/mpeg" }); + src.value = URL.createObjectURL(blob); + }; + reader.readAsArrayBuffer(file); + } + + // 清理工作:当组件卸载时释放URL对象 + onUnmounted(() => { + if (src.value) { + isVideo(props.fileType) && URL.revokeObjectURL(src.value); + isAudio(props.fileType) && URL.revokeObjectURL(src.value); + } + }); + return { + excelOptions, + src, + filePreviewRef, + isImage, + renderedHandler, + errorHandler, + renderTheFile, + isVideo, + isText, + isAudio + }; +} + diff --git a/src/renderer/src/components/select-subject/index.vue b/src/renderer/src/components/select-subject/index.vue new file mode 100644 index 0000000..4c7cd97 --- /dev/null +++ b/src/renderer/src/components/select-subject/index.vue @@ -0,0 +1,167 @@ + + + + + \ No newline at end of file diff --git a/src/renderer/src/components/set-homework/index.vue b/src/renderer/src/components/set-homework/index.vue new file mode 100644 index 0000000..08b92a8 --- /dev/null +++ b/src/renderer/src/components/set-homework/index.vue @@ -0,0 +1,320 @@ + + + + + diff --git a/src/renderer/src/components/thirdFile-preview/index.vue b/src/renderer/src/components/thirdFile-preview/index.vue new file mode 100644 index 0000000..391ddd6 --- /dev/null +++ b/src/renderer/src/components/thirdFile-preview/index.vue @@ -0,0 +1,35 @@ + + + + \ No newline at end of file diff --git a/src/renderer/src/components/upload-dialog/index.vue b/src/renderer/src/components/upload-dialog/index.vue new file mode 100644 index 0000000..358ab5c --- /dev/null +++ b/src/renderer/src/components/upload-dialog/index.vue @@ -0,0 +1,264 @@ + + + + + diff --git a/src/renderer/src/components/whiteboard/components/ColorPicker.vue b/src/renderer/src/components/whiteboard/components/ColorPicker.vue new file mode 100644 index 0000000..a819480 --- /dev/null +++ b/src/renderer/src/components/whiteboard/components/ColorPicker.vue @@ -0,0 +1,130 @@ + + + + + diff --git a/src/renderer/src/components/whiteboard/components/Contextmenu.vue b/src/renderer/src/components/whiteboard/components/Contextmenu.vue new file mode 100644 index 0000000..691f0bd --- /dev/null +++ b/src/renderer/src/components/whiteboard/components/Contextmenu.vue @@ -0,0 +1,213 @@ + + + + + diff --git a/src/renderer/src/components/whiteboard/constants.js b/src/renderer/src/components/whiteboard/constants.js new file mode 100644 index 0000000..5209a6e --- /dev/null +++ b/src/renderer/src/components/whiteboard/constants.js @@ -0,0 +1,120 @@ +// 描边颜色 +export const strokeColorList = [ + '#000000', + '#343a40', + '#495057', + '#c92a2a', + '#a61e4d', + '#862e9c', + '#5f3dc4', + '#364fc7', + '#1864ab', + '#0b7285', + '#087f5b', + '#2b8a3e', + '#5c940d', + '#e67700', + '#d9480f' +] + +// 填充颜色 +export const fillColorList = [ + 'transparent', + '#ced4da', + '#868e96', + '#fa5252', + '#e64980', + '#be4bdb', + '#7950f2', + '#4c6ef5', + '#228be6', + '#15aabf', + '#12b886', + '#40c057', + '#82c91e', + '#fab005', + '#fd7e14' +] + +// 背景颜色 +export const backgroundColorList = [ + '#ffffff', + '#f8f9fa', + '#f1f3f5', + '#fff5f5', + '#fff0f6', + '#f8f0fc', + '#f3f0ff', + '#edf2ff', + '#e7f5ff', + '#e3fafc', + '#e6fcf5', + '#ebfbee', + '#f4fce3', + '#fff9db', + '#fff4e6' +] + +// 字体列表 +export const fontFamilyList = [ + { + name: '微软雅黑', + value: '微软雅黑, Microsoft YaHei' + }, + { + name: '宋体', + value: '宋体, SimSun, Songti SC' + }, + { + name: '楷体', + value: '楷体, 楷体_GB2312, SimKai, STKaiti' + }, + { + name: '黑体', + value: '黑体, SimHei, Heiti SC' + }, + { + name: '隶书', + value: '隶书, SimLi' + }, + { + name: 'Andale Mono', + value: 'andale mono' + }, + { + name: 'Arial', + value: 'arial, helvetica, sans-serif' + }, + { + name: 'arialBlack', + value: 'arial black, avant garde' + }, + { + name: 'Comic Sans Ms', + value: 'comic sans ms' + }, + { + name: 'Impact', + value: 'impact, chicago' + }, + { + name: 'Times New Roman', + value: 'times new roman' + }, + { + name: 'Sans-Serif', + value: 'sans-serif' + }, + { + name: 'serif', + value: 'serif' + } +] + +// 字号 +export const fontSizeList = [10, 12, 16, 18, 24, 32, 48].map(item => { + return { + name: item, + value: item + } +}) diff --git a/src/renderer/src/components/whiteboard/libs/icons.svg b/src/renderer/src/components/whiteboard/libs/icons.svg new file mode 100644 index 0000000..cc8298a --- /dev/null +++ b/src/renderer/src/components/whiteboard/libs/icons.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/renderer/src/components/whiteboard/libs/jsonTree.css b/src/renderer/src/components/whiteboard/libs/jsonTree.css new file mode 100644 index 0000000..3812440 --- /dev/null +++ b/src/renderer/src/components/whiteboard/libs/jsonTree.css @@ -0,0 +1,107 @@ +/* + * JSON Tree Viewer + * http://github.com/summerstyle/jsonTreeViewer + * + * Copyright 2017 Vera Lobacheva (http://iamvera.com) + * Released under the MIT license (LICENSE.txt) + */ + +/* Background for the tree. May use for element */ +.jsontree_bg { + background: #FFF; +} + +/* Styles for the container of the tree (e.g. fonts, margins etc.) */ +.jsontree_tree { + margin-left: 30px; + font-family: 'PT Mono', monospace; + font-size: 14px; +} + +/* Styles for a list of child nodes */ +.jsontree_child-nodes { + display: none; + margin-left: 35px; + margin-bottom: 5px; + line-height: 2; +} +.jsontree_node_expanded > .jsontree_value-wrapper > .jsontree_value > .jsontree_child-nodes { + display: block; +} + +/* Styles for labels */ +.jsontree_label-wrapper { + float: left; + margin-right: 8px; +} +.jsontree_label { + font-weight: normal; + vertical-align: top; + color: #000; + position: relative; + padding: 1px; + border-radius: 4px; + cursor: default; +} +.jsontree_node_marked > .jsontree_label-wrapper > .jsontree_label { + background: #fff2aa; +} + +/* Styles for values */ +.jsontree_value-wrapper { + display: block; + overflow: hidden; +} +.jsontree_node_complex > .jsontree_value-wrapper { + overflow: inherit; +} +.jsontree_value { + vertical-align: top; + display: inline; +} +.jsontree_value_null { + color: #777; + font-weight: bold; +} +.jsontree_value_string { + color: #025900; + font-weight: bold; +} +.jsontree_value_number { + color: #000E59; + font-weight: bold; +} +.jsontree_value_boolean { + color: #600100; + font-weight: bold; +} + +/* Styles for active elements */ +.jsontree_expand-button { + position: absolute; + top: 3px; + left: -15px; + display: block; + width: 11px; + height: 11px; + background-image: url('icons.svg'); +} +.jsontree_node_expanded > .jsontree_label-wrapper > .jsontree_label > .jsontree_expand-button { + background-position: 0 -11px; +} +.jsontree_show-more { + cursor: pointer; +} +.jsontree_node_expanded > .jsontree_value-wrapper > .jsontree_value > .jsontree_show-more { + display: none; +} +.jsontree_node_empty > .jsontree_label-wrapper > .jsontree_label > .jsontree_expand-button, +.jsontree_node_empty > .jsontree_value-wrapper > .jsontree_value > .jsontree_show-more { + display: none !important; +} +.jsontree_node_complex > .jsontree_label-wrapper > .jsontree_label { + cursor: pointer; +} +.jsontree_node_empty > .jsontree_label-wrapper > .jsontree_label { + cursor: default !important; +} diff --git a/src/renderer/src/components/whiteboard/libs/jsonTree.js b/src/renderer/src/components/whiteboard/libs/jsonTree.js new file mode 100644 index 0000000..b2de406 --- /dev/null +++ b/src/renderer/src/components/whiteboard/libs/jsonTree.js @@ -0,0 +1,822 @@ +/** + * JSON Tree library (a part of jsonTreeViewer) + * http://github.com/summerstyle/jsonTreeViewer + * + * Copyright 2017 Vera Lobacheva (http://iamvera.com) + * Released under the MIT license (LICENSE.txt) + */ + +var jsonTree = (function() { + + /* ---------- Utilities ---------- */ + var utils = { + + /* + * Returns js-"class" of value + * + * @param val {any type} - value + * @returns {string} - for example, "[object Function]" + */ + getClass : function(val) { + return Object.prototype.toString.call(val); + }, + + /** + * Checks for a type of value (for valid JSON data types). + * In other cases - throws an exception + * + * @param val {any type} - the value for new node + * @returns {string} ("object" | "array" | "null" | "boolean" | "number" | "string") + */ + getType : function(val) { + if (val === null) { + return 'null'; + } + + switch (typeof val) { + case 'number': + return 'number'; + + case 'string': + return 'string'; + + case 'boolean': + return 'boolean'; + } + + switch(utils.getClass(val)) { + case '[object Array]': + return 'array'; + + case '[object Object]': + return 'object'; + } + + throw new Error('Bad type: ' + utils.getClass(val)); + }, + + /** + * Applies for each item of list some function + * and checks for last element of the list + * + * @param obj {Object | Array} - a list or a dict with child nodes + * @param func {Function} - the function for each item + */ + forEachNode : function(obj, func) { + var type = utils.getType(obj), + isLast; + + switch (type) { + case 'array': + isLast = obj.length - 1; + + obj.forEach(function(item, i) { + func(i, item, i === isLast); + }); + + break; + + case 'object': + var keys = Object.keys(obj).sort(); + + isLast = keys.length - 1; + + keys.forEach(function(item, i) { + func(item, obj[item], i === isLast); + }); + + break; + } + + }, + + /** + * Implements the kind of an inheritance by + * using parent prototype and + * creating intermediate constructor + * + * @param Child {Function} - a child constructor + * @param Parent {Function} - a parent constructor + */ + inherits : (function() { + var F = function() {}; + + return function(Child, Parent) { + F.prototype = Parent.prototype; + Child.prototype = new F(); + Child.prototype.constructor = Child; + }; + })(), + + /* + * Checks for a valid type of root node* + * + * @param {any type} jsonObj - a value for root node + * @returns {boolean} - true for an object or an array, false otherwise + */ + isValidRoot : function(jsonObj) { + switch (utils.getType(jsonObj)) { + case 'object': + case 'array': + return true; + default: + return false; + } + }, + + /** + * Extends some object + */ + extend : function(targetObj, sourceObj) { + for (var prop in sourceObj) { + if (sourceObj.hasOwnProperty(prop)) { + targetObj[prop] = sourceObj[prop]; + } + } + } + }; + + + /* ---------- Node constructors ---------- */ + + /** + * The factory for creating nodes of defined type. + * + * ~~~ Node ~~~ is a structure element of an onject or an array + * with own label (a key of an object or an index of an array) + * and value of any json data type. The root object or array + * is a node without label. + * {... + * [+] "label": value, + * ...} + * + * Markup: + *
  • + * + * + * + * "label" + * + * : + * + * <(div|span) class="jsontree_value jsontree_value_(object|array|boolean|null|number|string)"> + * ... + * + *
  • + * + * @param label {string} - key name + * @param val {Object | Array | string | number | boolean | null} - a value of node + * @param isLast {boolean} - true if node is last in list of siblings + * + * @return {Node} + */ + function Node(label, val, isLast) { + var nodeType = utils.getType(val); + + if (nodeType in Node.CONSTRUCTORS) { + return new Node.CONSTRUCTORS[nodeType](label, val, isLast); + } else { + throw new Error('Bad type: ' + utils.getClass(val)); + } + } + + Node.CONSTRUCTORS = { + 'boolean' : NodeBoolean, + 'number' : NodeNumber, + 'string' : NodeString, + 'null' : NodeNull, + 'object' : NodeObject, + 'array' : NodeArray + }; + + + /* + * The constructor for simple types (string, number, boolean, null) + * {... + * [+] "label": value, + * ...} + * value = string || number || boolean || null + * + * Markup: + *
  • + * + * "age" + * : + * + * 25 + * , + *
  • + * + * @abstract + * @param label {string} - key name + * @param val {string | number | boolean | null} - a value of simple types + * @param isLast {boolean} - true if node is last in list of parent childNodes + */ + function _NodeSimple(label, val, isLast) { + if (this.constructor === _NodeSimple) { + throw new Error('This is abstract class'); + } + + var self = this, + el = document.createElement('li'), + labelEl, + template = function(label, val) { + var str = '\ + \ + "' + + label + + '" : \ + \ + \ + ' + + val + + '' + + (!isLast ? ',' : '') + + ''; + + return str; + }; + + self.label = label; + self.isComplex = false; + + el.classList.add('jsontree_node'); + el.innerHTML = template(label, val); + + self.el = el; + + labelEl = el.querySelector('.jsontree_label'); + + labelEl.addEventListener('click', function(e) { + if (e.altKey) { + self.toggleMarked(); + return; + } + + if (e.shiftKey) { + document.getSelection().removeAllRanges(); + alert(self.getJSONPath()); + return; + } + }, false); + } + + _NodeSimple.prototype = { + constructor : _NodeSimple, + + /** + * Mark node + */ + mark : function() { + this.el.classList.add('jsontree_node_marked'); + }, + + /** + * Unmark node + */ + unmark : function() { + this.el.classList.remove('jsontree_node_marked'); + }, + + /** + * Mark or unmark node + */ + toggleMarked : function() { + this.el.classList.toggle('jsontree_node_marked'); + }, + + /** + * Expands parent node of this node + * + * @param isRecursive {boolean} - if true, expands all parent nodes + * (from node to root) + */ + expandParent : function(isRecursive) { + if (!this.parent) { + return; + } + + this.parent.expand(); + this.parent.expandParent(isRecursive); + }, + + /** + * Returns JSON-path of this + * + * @param isInDotNotation {boolean} - kind of notation for returned json-path + * (by default, in bracket notation) + * @returns {string} + */ + getJSONPath : function(isInDotNotation) { + if (this.isRoot) { + return "$"; + } + + var currentPath; + + if (this.parent.type === 'array') { + currentPath = "[" + this.label + "]"; + } else { + currentPath = isInDotNotation ? "." + this.label : "['" + this.label + "']"; + } + + return this.parent.getJSONPath(isInDotNotation) + currentPath; + } + }; + + + /* + * The constructor for boolean values + * {... + * [+] "label": boolean, + * ...} + * boolean = true || false + * + * @constructor + * @param label {string} - key name + * @param val {boolean} - value of boolean type, true or false + * @param isLast {boolean} - true if node is last in list of parent childNodes + */ + function NodeBoolean(label, val, isLast) { + this.type = "boolean"; + + _NodeSimple.call(this, label, val, isLast); + } + utils.inherits(NodeBoolean,_NodeSimple); + + + /* + * The constructor for number values + * {... + * [+] "label": number, + * ...} + * number = 123 + * + * @constructor + * @param label {string} - key name + * @param val {number} - value of number type, for example 123 + * @param isLast {boolean} - true if node is last in list of parent childNodes + */ + function NodeNumber(label, val, isLast) { + this.type = "number"; + + _NodeSimple.call(this, label, val, isLast); + } + utils.inherits(NodeNumber,_NodeSimple); + + + /* + * The constructor for string values + * {... + * [+] "label": string, + * ...} + * string = "abc" + * + * @constructor + * @param label {string} - key name + * @param val {string} - value of string type, for example "abc" + * @param isLast {boolean} - true if node is last in list of parent childNodes + */ + function NodeString(label, val, isLast) { + this.type = "string"; + + _NodeSimple.call(this, label, '"' + val + '"', isLast); + } + utils.inherits(NodeString,_NodeSimple); + + + /* + * The constructor for null values + * {... + * [+] "label": null, + * ...} + * + * @constructor + * @param label {string} - key name + * @param val {null} - value (only null) + * @param isLast {boolean} - true if node is last in list of parent childNodes + */ + function NodeNull(label, val, isLast) { + this.type = "null"; + + _NodeSimple.call(this, label, val, isLast); + } + utils.inherits(NodeNull,_NodeSimple); + + + /* + * The constructor for complex types (object, array) + * {... + * [+] "label": value, + * ...} + * value = object || array + * + * Markup: + *
  • + * + * + * + * "label" + * + * : + * + *
    + * { + *
      + * } + * , + *
    + *
  • + * + * @abstract + * @param label {string} - key name + * @param val {Object | Array} - a value of complex types, object or array + * @param isLast {boolean} - true if node is last in list of parent childNodes + */ + function _NodeComplex(label, val, isLast) { + if (this.constructor === _NodeComplex) { + throw new Error('This is abstract class'); + } + + var self = this, + el = document.createElement('li'), + template = function(label, sym) { + var comma = (!isLast) ? ',' : '', + str = '\ +
    \ +
    \ + ' + sym[0] + '\ + \ +
      \ + ' + sym[1] + '' + + '
      ' + comma + + '
      '; + + if (label !== null) { + str = '\ + \ + ' + + '' + + '"' + label + + '" : \ + ' + str; + } + + return str; + }, + childNodesUl, + labelEl, + moreContentEl, + childNodes = []; + + self.label = label; + self.isComplex = true; + + el.classList.add('jsontree_node'); + el.classList.add('jsontree_node_complex'); + el.innerHTML = template(label, self.sym); + + childNodesUl = el.querySelector('.jsontree_child-nodes'); + + if (label !== null) { + labelEl = el.querySelector('.jsontree_label'); + moreContentEl = el.querySelector('.jsontree_show-more'); + + labelEl.addEventListener('click', function(e) { + if (e.altKey) { + self.toggleMarked(); + return; + } + + if (e.shiftKey) { + document.getSelection().removeAllRanges(); + alert(self.getJSONPath()); + return; + } + + self.toggle(e.ctrlKey || e.metaKey); + }, false); + + moreContentEl.addEventListener('click', function(e) { + self.toggle(e.ctrlKey || e.metaKey); + }, false); + + self.isRoot = false; + } else { + self.isRoot = true; + self.parent = null; + + el.classList.add('jsontree_node_expanded'); + } + + self.el = el; + self.childNodes = childNodes; + self.childNodesUl = childNodesUl; + + utils.forEachNode(val, function(label, node, isLast) { + self.addChild(new Node(label, node, isLast)); + }); + + self.isEmpty = !Boolean(childNodes.length); + if (self.isEmpty) { + el.classList.add('jsontree_node_empty'); + } + } + + utils.inherits(_NodeComplex, _NodeSimple); + + utils.extend(_NodeComplex.prototype, { + constructor : _NodeComplex, + + /* + * Add child node to list of child nodes + * + * @param child {Node} - child node + */ + addChild : function(child) { + this.childNodes.push(child); + this.childNodesUl.appendChild(child.el); + child.parent = this; + }, + + /* + * Expands this list of node child nodes + * + * @param isRecursive {boolean} - if true, expands all child nodes + */ + expand : function(isRecursive){ + if (this.isEmpty) { + return; + } + + if (!this.isRoot) { + this.el.classList.add('jsontree_node_expanded'); + } + + if (isRecursive) { + this.childNodes.forEach(function(item, i) { + if (item.isComplex) { + item.expand(isRecursive); + } + }); + } + }, + + /* + * Collapses this list of node child nodes + * + * @param isRecursive {boolean} - if true, collapses all child nodes + */ + collapse : function(isRecursive) { + if (this.isEmpty) { + return; + } + + if (!this.isRoot) { + this.el.classList.remove('jsontree_node_expanded'); + } + + if (isRecursive) { + this.childNodes.forEach(function(item, i) { + if (item.isComplex) { + item.collapse(isRecursive); + } + }); + } + }, + + /* + * Expands collapsed or collapses expanded node + * + * @param {boolean} isRecursive - Expand all child nodes if this node is expanded + * and collapse it otherwise + */ + toggle : function(isRecursive) { + if (this.isEmpty) { + return; + } + + this.el.classList.toggle('jsontree_node_expanded'); + + if (isRecursive) { + var isExpanded = this.el.classList.contains('jsontree_node_expanded'); + + this.childNodes.forEach(function(item, i) { + if (item.isComplex) { + item[isExpanded ? 'expand' : 'collapse'](isRecursive); + } + }); + } + }, + + /** + * Find child nodes that match some conditions and handle it + * + * @param {Function} matcher + * @param {Function} handler + * @param {boolean} isRecursive + */ + findChildren : function(matcher, handler, isRecursive) { + if (this.isEmpty) { + return; + } + + this.childNodes.forEach(function(item, i) { + if (matcher(item)) { + handler(item); + } + + if (item.isComplex && isRecursive) { + item.findChildren(matcher, handler, isRecursive); + } + }); + } + }); + + + /* + * The constructor for object values + * {... + * [+] "label": object, + * ...} + * object = {"abc": "def"} + * + * @constructor + * @param label {string} - key name + * @param val {Object} - value of object type, {"abc": "def"} + * @param isLast {boolean} - true if node is last in list of siblings + */ + function NodeObject(label, val, isLast) { + this.sym = ['{', '}']; + this.type = "object"; + + _NodeComplex.call(this, label, val, isLast); + } + utils.inherits(NodeObject,_NodeComplex); + + + /* + * The constructor for array values + * {... + * [+] "label": array, + * ...} + * array = [1,2,3] + * + * @constructor + * @param label {string} - key name + * @param val {Array} - value of array type, [1,2,3] + * @param isLast {boolean} - true if node is last in list of siblings + */ + function NodeArray(label, val, isLast) { + this.sym = ['[', ']']; + this.type = "array"; + + _NodeComplex.call(this, label, val, isLast); + } + utils.inherits(NodeArray, _NodeComplex); + + + /* ---------- The tree constructor ---------- */ + + /* + * The constructor for json tree. + * It contains only one Node (Array or Object), without property name. + * CSS-styles of .tree define main tree styles like font-family, + * font-size and own margins. + * + * Markup: + *
        + * {Node} + *
      + * + * @constructor + * @param jsonObj {Object | Array} - data for tree + * @param domEl {DOMElement} - DOM-element, wrapper for tree + */ + function Tree(jsonObj, domEl) { + this.wrapper = document.createElement('ul'); + this.wrapper.className = 'jsontree_tree clearfix'; + + this.rootNode = null; + + this.sourceJSONObj = jsonObj; + + this.loadData(jsonObj); + this.appendTo(domEl); + } + + Tree.prototype = { + constructor : Tree, + + /** + * Fill new data in current json tree + * + * @param {Object | Array} jsonObj - json-data + */ + loadData : function(jsonObj) { + if (!utils.isValidRoot(jsonObj)) { + alert('The root should be an object or an array'); + return; + } + + this.sourceJSONObj = jsonObj; + + this.rootNode = new Node(null, jsonObj, 'last'); + this.wrapper.innerHTML = ''; + this.wrapper.appendChild(this.rootNode.el); + }, + + /** + * Appends tree to DOM-element (or move it to new place) + * + * @param {DOMElement} domEl + */ + appendTo : function(domEl) { + domEl.appendChild(this.wrapper); + }, + + /** + * Expands all tree nodes (objects or arrays) recursively + * + * @param {Function} filterFunc - 'true' if this node should be expanded + */ + expand : function(filterFunc) { + if (this.rootNode.isComplex) { + if (typeof filterFunc == 'function') { + this.rootNode.childNodes.forEach(function(item, i) { + if (item.isComplex && filterFunc(item)) { + item.expand(); + } + }); + } else { + this.rootNode.expand('recursive'); + } + } + }, + + /** + * Collapses all tree nodes (objects or arrays) recursively + */ + collapse : function() { + if (typeof this.rootNode.collapse === 'function') { + this.rootNode.collapse('recursive'); + } + }, + + /** + * Returns the source json-string (pretty-printed) + * + * @param {boolean} isPrettyPrinted - 'true' for pretty-printed string + * @returns {string} - for exemple, '{"a":2,"b":3}' + */ + toSourceJSON : function(isPrettyPrinted) { + if (!isPrettyPrinted) { + return JSON.stringify(this.sourceJSONObj); + } + + var DELIMETER = "[%^$#$%^%]", + jsonStr = JSON.stringify(this.sourceJSONObj, null, DELIMETER); + + jsonStr = jsonStr.split("\n").join("
      "); + jsonStr = jsonStr.split(DELIMETER).join("    "); + + return jsonStr; + }, + + /** + * Find all nodes that match some conditions and handle it + */ + findAndHandle : function(matcher, handler) { + this.rootNode.findChildren(matcher, handler, 'isRecursive'); + }, + + /** + * Unmark all nodes + */ + unmarkAll : function() { + this.rootNode.findChildren(function(node) { + return true; + }, function(node) { + node.unmark(); + }, 'isRecursive'); + } + }; + + + /* ---------- Public methods ---------- */ + return { + /** + * Creates new tree by data and appends it to the DOM-element + * + * @param jsonObj {Object | Array} - json-data + * @param domEl {DOMElement} - the wrapper element + * @returns {Tree} + */ + create : function(jsonObj, domEl) { + return new Tree(jsonObj, domEl); + } + }; +})(); +export default { + jsonTree +} \ No newline at end of file diff --git a/src/renderer/src/components/whiteboard/whiteboard.vue b/src/renderer/src/components/whiteboard/whiteboard.vue new file mode 100644 index 0000000..fdd15fc --- /dev/null +++ b/src/renderer/src/components/whiteboard/whiteboard.vue @@ -0,0 +1,915 @@ + + + + + + diff --git a/src/renderer/src/components/window-tools/index.vue b/src/renderer/src/components/window-tools/index.vue new file mode 100644 index 0000000..da66f80 --- /dev/null +++ b/src/renderer/src/components/window-tools/index.vue @@ -0,0 +1,78 @@ + + + + + \ No newline at end of file diff --git a/src/renderer/src/constants/draw.js b/src/renderer/src/constants/draw.js new file mode 100644 index 0000000..b637688 --- /dev/null +++ b/src/renderer/src/constants/draw.js @@ -0,0 +1,105 @@ +/** + * @description 静态常量-用于fabric 中定义的常量 + * @author zdg + * @date 2023-06-07 + */ + +export const DrawType = { + FreeStyle: 'freeStyle', + Shape: 'shape' +} + +export const DrawStyle = { + Basic: 'basic', + Rainbow: 'rainbow', + Shape: 'shape', + Material: 'material', + Pixels: 'pixels', + MultiColor: 'multiColor', + Text: 'text', + MultiLine: 'multiLine', + Reticulate: 'reticulate', + MultiPoint: 'multiPoint', + Wiggle: 'wiggle', + Thorn: 'thorn' +} + +export const DrawShape = { + Bubble: 'bubble', + Star: 'star', + Love: 'love', + Butterfly: 'butterfly', + Snow: 'snow', + Music: 'music', + Sun: 'sun', + Moon: 'moon', + Leaf: 'leaf', + Flower: 'flower' +} + +export const MATERIAL_TYPE = { + CRAYON: 'crayon', + CARBON: 'carbon', + CLOTH: 'cloth', + OIL: 'oil', + CRAYON_DARK: 'crayonDark' +} + +export const MultiColorType = { + COL: 'col', + ROW: 'row', + CIRCLE: 'circle' +} + +// index.js 迁移至当前 +export const ActionMode = { + DRAW: 'draw', + ERASE: 'erase', + SELECT: 'select', + Board: 'board' +} + +export const FREESTYLE_ELEMENT_CUSTOM_TYPE = { + IMAGE: 'image', + I_TEXT: 'itext', + RAINBOW: 'rainbow', + SHAPE: 'shape', + PIXELS: 'pixels', + DRAW_TEXT: 'drawText', + MULTI_LINE: 'multiLine', + RETICULATE: 'reticulate', + MULTI_POINT: 'multiPoint', + WIGGLE: 'wiggle', + THORN: 'thorn' +} + +export const SHAPE_ELEMENT_CUSTOM_TYPE = { + SHAPE_LINE: 'shapeLine', + SHAPE_RECT: 'shapeRect', + SHAPE_CIRCLE: 'shapeCircle', + SHAPE_ELLIPSE: 'shapeEllipse', + SHAPE_TRIANGLE: 'shapeTriangle', + SHAPE_ARROW_LINE: 'shapeArrowLine', + SHAPE_ARROW_OUTLINE: 'shapeArrowOutline', + SHAPE_CLOUD: 'shapeCloud', + SHAPE_TOOLTIPS: 'shapeTooltips', + SHAPE_LIGHTNING: 'shapeLightning', + SHAPE_CLOSE: 'shapeClose', + SHAPE_CHECK: 'shapeCheck', + SHAPE_INFO: 'shapeInfo', + SHAPE_BACKSPACE: 'shapeBackspace', + SHAPE_BLOCK: 'shapeBlock', + SHAPE_SPEAKER: 'shapeSpeaker', + SHAPE_SEARCH: 'shapeSearch', + SHAPE_INFO_OUTLINE: 'shapeInfoOutline', + SHAPE_HEART: 'shapeHeart', + SHAPE_ALERT: 'shapeAlert' +} + +export const ELEMENT_CUSTOM_TYPE = { + // freeStyle + ...FREESTYLE_ELEMENT_CUSTOM_TYPE, + + // shape + ...SHAPE_ELEMENT_CUSTOM_TYPE +} diff --git a/src/renderer/src/directive/drag.js b/src/renderer/src/directive/drag.js new file mode 100644 index 0000000..9eddc29 --- /dev/null +++ b/src/renderer/src/directive/drag.js @@ -0,0 +1,81 @@ +/** + * @description: v-drag + * @author zdg + * @date 2023-06-07 + */ +// 工具包 +const utils = { + // Creates an event handler that can be used in Vue code + // setup start moving end + vueDragEvent: (el, action) => { + el.dispatchEvent(new Event(`drag-${action}`)) + }, + dragStart: (el, target, axis, snap, e) => { + // el.style.cursor = 'move' + // el.onmousedown = function (e) { + // const disX = e.clientX - el.offsetLeft + // const disY = e.clientY - el.offsetTop + // document.onmousemove = function (e) { + // const left = e.clientX - disX + // const top= e.clientY - disY + // } + // } + }, +} +// 首次向元素添加可拖动配置 | Add draggable configuration to element for the first time +const mountedHook = (el, binding) => { + console.log(el, binding) + const value = binding.value || {} + const handleSelector = value instanceof Object ? value.el : value // 获取元素 + const isOpen = value instanceof Object ? value.open || true : true // 是否开启拖拽 默认:开启 + const handleArray = [] // 拖拽元素 + if (!isOpen) return false // 没有开启不加载后面的代码 + let axis + // Store all the DOM elements that will be used as handles. + // They can be declared using a string with a CSS tag, class or id, or using Vue refs. + if (!!handleSelector) { + if (handleSelector instanceof HTMLElement) { + handleArray.push(handleSelector); + } else { + // handleArray.push(document.querySelectorAll(handleSelector)); + document.querySelectorAll(handleSelector).forEach((child) => { + handleArray.push(child); + }); + } + } + if (handleArray.length !== 0) { + // Define move element and apply CSS class + // el.classList.add(window.data.class.usesHandle); + + handleArray.forEach((grabElement) => { + // Apply CSS class to each grab element + // grabElement.classList.add(window.data.class.handle); + + // Add events to start drag with handle + grabElement.onmousedown = (e) => utils.dragStart(grabElement, el, axis, e); + grabElement.ontouchstart = (e) => utils.dragStart(grabElement, el, axis, e); + }); + } else { + // Add events to start drag without handle + el.onmousedown = (e) => utils.dragStart(el, el, axis, e); + el.ontouchstart = (e) => utils.dragStart(el, el, axis, e); + } + // Vue event on setup + utils.vueDragEvent(el, 'setup') +} +export default { + // Hooks for Vue3 + mounted(el, binding) { + mountedHook(el, binding) + }, + // Hooks for Vue2 + inserted(el, binding) { + mountedHook(el, binding) + }, + + update(el, binding){ + }, + updated(el, binding){ + + }, +} \ No newline at end of file diff --git a/src/renderer/src/hooks/useClassTask.js b/src/renderer/src/hooks/useClassTask.js new file mode 100644 index 0000000..cf960da --- /dev/null +++ b/src/renderer/src/hooks/useClassTask.js @@ -0,0 +1,118 @@ +import { listEntpcoursework,getEvaluationclue } from '@/api/classTask'; +import { processList } from '@/hooks/useProcessList'; + +const isJson = (str) => { + if (typeof str == 'string') { + try { + let obj = JSON.parse(str) + if (typeof obj == 'object' && obj) { + return true + } else { + return false + } + } catch (e) { + return false + } + } +} + + +/** + * @description 编辑作业配置 + * @param {*} row + */ +export const editListItem = (row, courseObj) => { + return new Promise((resolve, reject) => { + // 作业内容编辑-跳转到设计界面-传参 + let classtaskObj = { + id: '', // + bookName: '', // 课程名称 + uniquekey: '', // 设计中的标题 + title: '', // 设计中的说明 + worktype: '', // 设计中的作业类型 + quizlist: [], // 设计中的试题列表 + chooseWorkLists: [],// 设计中的框架梳理list + fileHomeworkList: [],// 设计中的常规作业list + whiteboardObj: '',// 设计中的课堂展示对象 + question: '', // 设计中的[课堂展示]的问题 + }; + console.log('编辑的行', row); + + //重新更新[新任务]中右侧列表数据 + var listCourseWork = []; + for (var i=0; i < row.entpcourseworklistarray.length; i++) { + listCourseWork.push(row.entpcourseworklistarray[i]); + } + + if (listCourseWork.length > 0) { + classtaskObj.id= row.id; // + classtaskObj.bookObj = courseObj; // 教材对象 + classtaskObj.bookName = row.evaltitle? row.evalparenttitle? row.evalparenttitle+'/'+row.evaltitle : row.evaltitle: row.evalparenttitle// 课程名称:单元/章节: 单元 + classtaskObj.uniquekey= row.uniquekey; // 设计中的标题 + classtaskObj.title= row.title; // 设计中的说明 + classtaskObj.worktype= row.worktype; // 设计中的作业类型 + classtaskObj.quizlist= []; // 设计中的试题列表 + classtaskObj.chooseWorkLists = []; //设计中的 框架梳理list + classtaskObj.fileHomeworkList = []; //设计中的 常规作业list + classtaskObj.whiteboardObj = ''; //设计中的 课堂展示对象 + + + if (row.worktype == '框架梳理') { + // 框架梳理对应只有一个内容 + getEvaluationclue(listCourseWork[0].id).then(res => { + if ( res.data==null || res.data==undefined ) { + return ; + } + res.data.worktype = '框架梳理'; + res.data.score = listCourseWork[0].score; + classtaskObj.chooseWorkLists.push(res.data); + // + // console.log('框架梳理', classtaskObj); + return resolve(classtaskObj); + }); + } + else if (row.worktype == '习题训练') { + const ids = listCourseWork.map(item => item.id).join(","); + listEntpcoursework({ids: ids, pageSize: 50}).then(idres => { + // for (var i=0; i]+>/g, ''); + // } + // 格式化试题 + if(idres.rows&&idres.rows.length > 0){ + processList(idres.rows); + //重新将task中的分值更新 + row.entpcourseworklistarray.forEach(item => { + const quizItem = idres.rows.find(quiz => quiz.id === item.id); + if (quizItem) { + quizItem.score = item.score; + quizItem.scoreOrigin = item.score; + } + }); + + classtaskObj.quizlist = idres.rows; + // + // console.log('习题训练', classtaskObj); + return resolve(classtaskObj); + } + }) + } + else if (row.worktype == '课堂展示') { + console.log('row.课堂展示', row.workcodes); + const workcodes = JSON.parse(row.workcodes); + classtaskObj.whiteboardObj = JSON.stringify(workcodes.json); + classtaskObj.question = row.worktag; + // console.log('课堂展示', classtaskObj); + return resolve(classtaskObj); + } + else if (row.worktype == '常规作业') { + if(isJson(row.workcodes)){ + classtaskObj.fileHomeworkList = JSON.parse(row.workcodes); + // + // console.log('常规作业', classtaskObj); + return resolve(classtaskObj); + } + } + } + }); +} + diff --git a/src/renderer/src/hooks/useGetHomework.js b/src/renderer/src/hooks/useGetHomework.js new file mode 100644 index 0000000..e07a2de --- /dev/null +++ b/src/renderer/src/hooks/useGetHomework.js @@ -0,0 +1,149 @@ +import useUserStore from '@/store/modules/user' +import { homeworklist, listEntpcourse } from '@/api/teaching/classwork' +import { addEntpcourse } from '@/api/teaching/classwork' + +const userStore = useUserStore() +// 当前选中教材章节节点 +let curNode = null +// 查询作业列表所需要的ID +let chapterId = null + +export const useGetHomework = async (node) => { + /** + * node + * 左侧选择章节的节点数据 + */ + if (!node) return + curNode = node + + // 获取查询作业列表所需ID + let { rows } = await getChapterId() + if (rows.length > 0) { + chapterId = rows[0].id + } else { + // 没有则 传教新的entpcourse 再次查询 + await createEntpcourse() + let { rows } = await getChapterId() + chapterId = rows[0].id + } + + return new Promise(async (resolve) =>{ + const res = await getHomeWorkList() + resolve({res,chapterId}) + }) + + +} + +// 根据教材章节ID 查询作业列表所需ID +const getChapterId = () => { + return listEntpcourse({ + evalid: curNode.id ? curNode.id : curNode.parentNode.id, + edituserid: userStore.user.userId, + pageSize: 500 + }) +} + +// 创建新的entpcourse +const createEntpcourse = () => { + // 参照 web AIx 传入参数 + var cform = {} + cform.entpid = userStore.user.deptId + cform.level = 1 + cform.parentid = 0 + cform.dictid = 0 + cform.evalid = curNode.id + cform.evalparentid = 0 + cform.edusubject = curNode.edusubject + cform.edudegree = curNode.edudegree + cform.edustage = curNode.edustage + cform.coursetype = '课标学科' + cform.coursetitle = curNode.itemtitle + cform.coursedesc = '' + cform.status = '' + cform.dflag = 0 + cform.edituserid = userStore.user.userId + cform.createblankfile = 'yes' + return addEntpcourse(cform) +} + +const getHomeWorkList = async () => { + return await homeworklist({ + entpcourseid: chapterId, + edituserid: userStore.user.userId, + orderby: "timestamp DESC", + pageSize: 100, + status: '10' + }).then((res) => { + //以下代码 参照AIx web端 作业布置 + let list = [] + for (var i = 0; i < res.rows.length; i++) { + res.rows[i].taskconfig = [] + + // 处理任务类型的UI + // if (res.rows[i].worktype == '学习目标定位') { + // res.rows[i].workclass = 'success'; + // res.rows[i].workcodesList = JSON.parse(res.rows[i].workcodes); + // } else + // 课标研读 目标设定 教材研读 框架梳理 学科定位 TODO 后续接入在添加 + if (res.rows[i].worktype == '课堂展示') { + res.rows[i].workclass = 'primary'; + } else if (res.rows[i].worktype == '框架梳理') { + res.rows[i].workclass = 'warning'; + } else if (res.rows[i].worktype == '常规作业') { + res.rows[i].workclass = 'info'; + } else if (res.rows[i].worktype == '习题训练') { + res.rows[i].workclass = 'danger'; + } else { + res.rows[i].workclass = 'primary'; + } + + // 找child + for (var j = 0; j < res.rows.length; j++) { + if (res.rows[j].parentid == res.rows[i].id) { + var ss = [] + if (res.rows[j].classworkdatastudentids != null) { + ss = JSON.parse('[' + res.rows[j].classworkdatastudentids + ']') + } + var js = { + id: res.rows[j].id, + classid: res.rows[j].classid, + classcaption: res.rows[j].classcaption, + parentid: 0, + worktype: '', + workkey: res.rows[j].workkey, + worktag: '', + entpcourseid: 0, + evalid: 0, + edusubject: '', + edudegree: '', + workdate: '', + title: '', + workcodes: '', + studentlist: ss, + deaddate: res.rows[j].deaddate, + timelength: res.rows[j].timelength, + weights: res.rows[j].weights, + feedtype: res.rows[j].feedtype + } + res.rows[i].taskconfig.push(js) + } + } + res.rows[i].fileShowName = res.rows[i].uniquekey + + // 注意slideid>0的,这一些作业是添加到PPT页面的,所以在作业管理中不能出现 + // 2024-05-15,酉阳,jackyshen + if (res.rows[i].classid == 0 && res.rows[i].slideid == 0) { + list.push(res.rows[i]) + } + + // 如果是习题训练任务,则检查一共有多少道 + if (res.rows[i].entpcourseworklist != '') { + res.rows[i].entpcourseworklistarray = JSON.parse('[' + res.rows[i].entpcourseworklist + ']') + } else { + res.rows[i].entpcourseworklistarray = [] + } + } + return list + }) +} diff --git a/src/renderer/src/hooks/useGetSubject.js b/src/renderer/src/hooks/useGetSubject.js new file mode 100644 index 0000000..2b61a08 --- /dev/null +++ b/src/renderer/src/hooks/useGetSubject.js @@ -0,0 +1,82 @@ +import { ref } from 'vue' +import useUserStore from '@/store/modules/user' +import { listEvaluation } from '@/api/subject' +import { sessionStore } from '@/utils/store' + +export const useGetSubject = async () =>{ + + // user store + const userStore = useUserStore() + const { edustage, edusubject } = userStore.user + // 章节List + const unitList = ref([]) + // 教材List + let subjectList = null + // 单元章节树结构 + let treeData = null + + // 根据学科 + 学段 获取所有单元章节 + const getSubjectUnit = async () =>{ + if(sessionStore.get('subject.unitList')){ + unitList.value = sessionStore.get('subject.unitList') + } + else{ + const unitParams = { + edusubject, + edustage, + itemgroup: 'textbook', + orderby: 'orderidx asc', + pageSize: 10000 + } + const { rows } = await listEvaluation(unitParams) + unitList.value = rows + sessionStore.set('subject.unitList', rows) + } + await getSubject() + } + + // 根据学科 + 学段 获取教材 + const getSubject = async () =>{ + + if(sessionStore.get('subject.bookList')){ + subjectList = sessionStore.get('subject.bookList') + } + else{ + const subjectParams = { + itemkey: "version", + edusubject, + edustage, + pageSize: 10000, + orderby: 'orderidx asc' + } + const { rows } = await listEvaluation(subjectParams) + subjectList = rows + sessionStore.set('subject.bookList', rows) + treeData = getTreeData(subjectList[0].id) + // 设置一个默认的curNode + let curNode + if(treeData[0].children && treeData[0].children.length){ + curNode = treeData[0].children[0] + } + else{ + curNode = treeData[0] + } + sessionStore.set('subject.curNode', curNode) + } + } + + // 单元章节数据转为“树”结构 + const getTreeData = (bookId) =>{ + // 根据当前教材的id 查找出对应的章节 + let data = unitList.value.filter(item => item.rootid == bookId && item.level == 1) + data.forEach( item => { + item.children = unitList.value.filter( item2 => item2.parentid == item.id && item2.level == 2) + }) + return data + } + + await getSubjectUnit() + + return { subjectList, treeData, getTreeData } + +} \ No newline at end of file diff --git a/src/renderer/src/hooks/useProcessList.js b/src/renderer/src/hooks/useProcessList.js new file mode 100644 index 0000000..e7329eb --- /dev/null +++ b/src/renderer/src/hooks/useProcessList.js @@ -0,0 +1,333 @@ +export const isJson = (str) => { + if (typeof str == 'string') { + try { + let obj = JSON.parse(str) + if (typeof obj == 'object' && obj) { + return true + } else { + return false + } + } catch (e) { + return false + } + } +} + +/** + * @description processList 格式化试题 + * @param {*} row + * @param {*} aloneOption 选择题中选项是否为每行一个 + */ +export const processList = (row, aloneOption=false) => { + for (var i = 0; i < row.length; i++) { + if (isJson(row[i].workanalysis)) { + //1、先默认格式化 格式化各项内容(待优化, 后续界面显示的为format的值) + row[i].titleFormat = row[i].title // 题目 + row[i].examdateFormat = row[i].examdate // ?考试日期 eg: 2024-07-11 14:39:27" + row[i].workdescFormat = row[i].workdesc // 题目选项 + row[i].workanswerFormat = row[i].workanswer // 题目正确答案 + if (row[i].workanswerFormat == null || row[i].workanswerFormat == '') { + row[i].workanswerFormat = '见试题解答内容' + } + + // workanalysis 解析内容(analyse:解答; method:分析; discuss:点评; ) + var jjj = JSON.parse(row[i].workanalysis) + row[i].analyse = jjj.analyse + row[i].method = jjj.method + row[i].discuss = jjj.discuss + //row[i].discusscollapse = false; + if (row[i].examdate !== null && row[i].examdate !== undefined) { + row[i].examdate = row[i].examdate.substring(0, 10) + } + + // 具体题型数据结构处理 + if (row[i].worktype == '复合题') { + // 旧类型 + if (row[i].title.indexOf('!@#$%') !== -1) { + // 1.选项解析替换 + const options = JSON.parse(row[i].workdesc) + // 题目(背景材料+复合题目) + const bjTitle = row[i].title.split('!@#$%')[0] + const tmTitles = row[i].title.split('!@#$%').filter((it, ix) => ix > 0) + // console.log(bjTitle,'背景标题'); + // console.log(tmTitles,'复合题目'); + let titls = [] + options.forEach((element, index1) => { + const workDescArr = element.split('#&') + let tmp = '' + let j = 0 + for(; j${char}.${workDescArr[j]}`; + } + else { + if(j%2 == 0){ + tmp += `
      `; + } + + tmp += `
      ${char}.${workDescArr[j]}
      `; + if(j%2 == 1){ + tmp += '
      '; + } + } + } + // j此刻已自增1, 故当选项为单数时, 需要补充结束标签 + if(!aloneOption && j%2 == 1){ + tmp += ''; + } + + // workDescArr为 [''] 表示为 判断题或者填空题,这里不需要选项 + if (workDescArr[0] != '') { + titls.splice(index1, 1, tmp) + } else { + titls.splice(index1, 1, '') + } + }) + const s = [] + tmTitles.map((it, ix) => { + s.push(it) + titls.map((it2, ix2) => { + if (ix == ix2) { + s.push(it2) + } + }) + }) + // console.log(s,'?????????????????') + + row[i].titleFormat = bjTitle + s.join('') + row[i].workdescFormat = '' + + //2.答案 - 数字转为ABCD + const answerArr = JSON.parse(row[i].workanswer) + let indexLabel = 1 + let arr = [] + answerArr.forEach((item) => { + const arrTmp = item.answer.split('#&') + let value = `(${indexLabel})` + arrTmp.forEach((element, i) => { + if (item.type == '单选题' || item.type == '多选题') { + value += `${String.fromCharCode(65 + Number(element))}` + } + if (item.type == '判断题' || item.type == '填空题') { + // 去除下 html标签 + value += `${element.replace(/<[^>]+>/g, '')}` + (i == arrTmp.length - 1 ? '' : '、') + } + if (item.type == '主观题') { + if (element) { + console.log(element, 'element') + value += item.answer + } else { + value += '答案不唯一,请参考分析解答点评!' + } + } + }) + arr.push(value) + indexLabel++ + }) + const answer = arr.join('
      ') + + row[i].workanswerFormat = answer + } else { + // 处理[题干显示] - 不再需要处理 + // row[i].titleFormat = row[i].title; // 仅占位提示 + + /** + * 处理[选项显示] - 特殊结构 + * [ + * {type: '单选题', title: '题目1', options: ['ABC123','ABC123']}, + * {type: '多选题', title: '题目1', options: ['ABC123','ABC123']}, + * {type: '填空题', title: '题目1', options: []}, + * {type: '判断题', title: '题目1', options: []}, + * {type: '主观题', title: '题目1', options: []}, + * ] + */ + let workDescArr = JSON.parse(row[i].workdesc) + let workDescHtml = `
      ${index + 1}. ${item.title}
      ` + let tmp = '' + let j = 0 + let optionsArr = item.options + for(; j${char}.${optionsArr[j]}`; + } + else { + if(j%2 == 0){ + tmp += `
      `; + } + + tmp += `
      ${char}.${optionsArr[j]}
      `; + if(j%2 == 1){ + tmp += '
      '; + } + } + } + // j此刻已自增1, 故当选项为单数时, 需要补充结束标签 + if(!aloneOption && j%2 == 1){ + tmp += ''; + } + workDescHtml += tmp + } else if (item.type == '填空题' || item.type == '判断题' || item.type == '主观题') { + workDescHtml += `
      ${index + 1}. ${item.title}
      ` + } + }) + workDescHtml += '' + row[i].workdescFormat = workDescHtml + + /** + * 处理[答案显示] - 特殊结构 + * [ + * {type: '单选题', answer: ['0']}, + * {type: '多选题', answer: ['0','1']}, + * {type: '填空题', answer: ['填空1','填空2']}, + * {type: '判断题', answer: ['0'/'1']}, + * {type: '主观题', answer: [xxxx]}, + * ] + */ + let workAnswerArr = JSON.parse(row[i].workanswer) + let workAnswerHtml = `` + workAnswerArr.map((item, index) => { + const answerArr = item.answer //JSON.parse(item.answer); + if (item.type == '单选题' || item.type == '多选题') { + const answer = answerArr + .map((item) => { + return String.fromCharCode(65 + Number(item)) + }) + .join('') + workAnswerHtml += `
      ${index + 1}. ${answer}
      ` + } else if (item.type == '填空题') { + const answer = answerArr.join('、') + workAnswerHtml += `
      ${index + 1}. ${answer}
      ` + } else if (item.type == '判断题') { + const answer = answerArr + .map((item) => { + return item === '1' ? '正确' : '错误' + }) + .join('、') + workAnswerHtml += `
      ${index + 1}. ${answer}
      ` + } else if (item.type == '主观题') { + // 复合题里面的主观题只有一个答案,或没填 + const answer = answerArr.join('、') + if (answerArr[0]) { + workAnswerHtml += `
      ${index + 1}. ${answer}
      ` + } else { + workAnswerHtml += `
      ${index + 1}. ${answer}答案不唯一,请参考分析解答点评!
      ` + } + } + }) + row[i].workanswerFormat = workAnswerHtml + } + } else if ( + row[i].worktype == '主观题' || + (row[i].worktype !== '单选题' && + row[i].worktype !== '多选题' && + row[i].worktype !== '填空题' && + row[i].worktype !== '判断题') + ) { + // 处理[选项显示] - 主观题中无选项, 故置空 + row[i].workdescFormat = '' + row[i].workanswerFormat = '' + // 答案处理- eg: "\"不唯一的答案,参考\"" + if (row[i].workanswer && row[i].workanswer != '') { + row[i].workanswerFormat = JSON.parse(row[i].workanswer) + } + } else { + // 单选题|多选题|填空题|判断题|主观题?(待确认是否归在这里) + // 通用选项结构 ['ABC123','ABC123'] | ['ABC123','ABC123'] | [](填空题无选项) | [](判断题无选项) + let workDescArr = [] + if ( + row[i].workdesc.charAt(0) === '[' && + row[i].workdesc.charAt(row[i].workdesc.length - 1) === ']' + ) { + //123会直接被转换, 且不是数组对象, 故手动判断是否有[和]两个字符 + workDescArr = JSON.parse(row[i].workdesc) + } else if (row[i].workdesc.indexOf('#&') !== -1) { + workDescArr = row[i].workdesc.split('#&') + } else if (row[i].workdesc.indexOf(',') !== -1) { + workDescArr = row[i].workdesc.split(',') + } else { + // 单字符串直接添加至空数组(待考虑确认) + workDescArr.push(row[i].workdesc) + } + + // 单选题|多选题|填空题|判断题|主观题?(待确认是否归在这里) + // 通用答案结构 ['0'] | ['0','1'] | ['填空1','填空2'] | ['0'/'1'] + let workAnswerArr = [] + if ( + row[i].workanswer.charAt(0) === '[' && + row[i].workanswer.charAt(row[i].workanswer.length - 1) === ']' + ) { + // 123会直接被转换, 且不是数组对象, 故手动判断是否有[和]两个字符 + workAnswerArr = JSON.parse(row[i].workanswer) + } else if (row[i].workanswer.indexOf('#&') !== -1) { + workAnswerArr = row[i].workanswer.split('#&') + } else if (row[i].workanswer.indexOf(',') !== -1) { + workAnswerArr = row[i].workanswer.split(',') + } else { + // 单字符串直接添加至空数组(待考虑确认) + workAnswerArr.push(row[i].workanswer) + } + + // 具体题型处理 + if (row[i].worktype == '单选题' || row[i].worktype == '多选题') { + // 处理[选项显示] - 拼接ABCD首序号 + let tmp = '' + let j = 0 + for(; j${char}.${workDescArr[j]}`; + } + else { + if(j%2 == 0){ + tmp += `
      `; + } + + tmp += `
      ${char}.${workDescArr[j]}
      `; + if(j%2 == 1){ + tmp += '
      '; + } + } + } + if(!aloneOption && j%2== 0){ + tmp += ''; + } + row[i].workdescFormat = tmp + + // 处理[答案显示] - 转换ABCD + let arr2Char = workAnswerArr + .map((item) => { + return String.fromCharCode(65 + Number(item)) + }) + .join('') + row[i].workanswerFormat = arr2Char + } else if (row[i].worktype == '填空题') { + // 处理[选项显示] - 填空题中无选项, 故置空 + row[i].workdescFormat = '' + + // 处理[答案显示] - 逗号连接 + row[i].workanswerFormat = workAnswerArr.join('、') + } else if (row[i].worktype == '判断题') { + // 处理[选项显示] - 判断题中无选项, 故置空 + row[i].workdescFormat = '' + + // 处理[答案显示] - 1-正常 0-错误 + const answer = workAnswerArr + .map((item) => { + return item === '1' ? '正确' : '错误' + }) + .join('、') + row[i].workanswerFormat = answer + } + // else { + // // 其余类型试题类型(因学科不同, 大多为主观题类型, 结构为数组) + // row[i].workanswerFormat = workAnswerArr.join('、') + // } + } + } + } +} diff --git a/src/renderer/src/layout/components/AppMain.vue b/src/renderer/src/layout/components/AppMain.vue new file mode 100644 index 0000000..22cc830 --- /dev/null +++ b/src/renderer/src/layout/components/AppMain.vue @@ -0,0 +1,191 @@ + + + + + diff --git a/src/renderer/src/layout/components/Header.vue b/src/renderer/src/layout/components/Header.vue new file mode 100644 index 0000000..a01a158 --- /dev/null +++ b/src/renderer/src/layout/components/Header.vue @@ -0,0 +1,360 @@ + + + + + diff --git a/src/renderer/src/layout/components/Uploader.vue b/src/renderer/src/layout/components/Uploader.vue new file mode 100644 index 0000000..43ee118 --- /dev/null +++ b/src/renderer/src/layout/components/Uploader.vue @@ -0,0 +1,225 @@ + + + diff --git a/src/renderer/src/layout/index.vue b/src/renderer/src/layout/index.vue new file mode 100644 index 0000000..c09647d --- /dev/null +++ b/src/renderer/src/layout/index.vue @@ -0,0 +1,56 @@ + + + + + diff --git a/src/renderer/src/main.js b/src/renderer/src/main.js new file mode 100644 index 0000000..395ec45 --- /dev/null +++ b/src/renderer/src/main.js @@ -0,0 +1,45 @@ +import './assets/main.css' + +import { createApp } from 'vue' + +import ElementPlus from 'element-plus' +import zhLocale from 'element-plus/es/locale/lang/zh-cn' +import 'element-plus/dist/index.css' +import './assets/iconfont/iconfont.css' +import './assets/iconfont/iconfont' +import 'virtual:windi.css' +import request from "@/utils/request"; + +import { store } from '@/store' +import App from './App.vue' +import router from './router' +import log from 'electron-log/renderer' // 渲染进程日志-文件记录 +import customComponent from '@/components/common' // 自定义组件 +import plugins from './plugins' // plugins插件 + +if(process.env.NODE_ENV != 'development') { // 非开发环境,将日志打印到日志文件 + Object.assign(console, log.functions) // 渲染进程日志-控制台替换 +} + +const app = createApp(App) + + +//专为菁优网配置的请求转发 +app.config.globalProperties.$requestGetJYW = (url,config)=>{ + config.params = config.params?config.params:{} + config.params["getjypath"] = url; + return request({ + url: "/jy/proxy", + method: config.method||"get", + params: config.params + }) +} + + + +app.use(router) + .use(store) + .use(ElementPlus, { locale: zhLocale }) + .use(customComponent) // 自定义组件 + .use(plugins) + .mount('#app') \ No newline at end of file diff --git a/src/renderer/src/plugins/cache.js b/src/renderer/src/plugins/cache.js new file mode 100644 index 0000000..6b5c00b --- /dev/null +++ b/src/renderer/src/plugins/cache.js @@ -0,0 +1,77 @@ +const sessionCache = { + set (key, value) { + if (!sessionStorage) { + return + } + if (key != null && value != null) { + sessionStorage.setItem(key, value) + } + }, + get (key) { + if (!sessionStorage) { + return null + } + if (key == null) { + return null + } + return sessionStorage.getItem(key) + }, + setJSON (key, jsonValue) { + if (jsonValue != null) { + this.set(key, JSON.stringify(jsonValue)) + } + }, + getJSON (key) { + const value = this.get(key) + if (value != null) { + return JSON.parse(value) + } + }, + remove (key) { + sessionStorage.removeItem(key); + } +} +const localCache = { + set (key, value) { + if (!localStorage) { + return + } + if (key != null && value != null) { + localStorage.setItem(key, value) + } + }, + get (key) { + if (!localStorage) { + return null + } + if (key == null) { + return null + } + return localStorage.getItem(key) + }, + setJSON (key, jsonValue) { + if (jsonValue != null) { + this.set(key, JSON.stringify(jsonValue)) + } + }, + getJSON (key) { + const value = this.get(key) + if (value != null) { + return JSON.parse(value) + } + }, + remove (key) { + localStorage.removeItem(key); + } +} + +export default { + /** + * 会话级缓存 + */ + session: sessionCache, + /** + * 本地缓存 + */ + local: localCache +} diff --git a/src/renderer/src/plugins/fabric/i18n/en.json b/src/renderer/src/plugins/fabric/i18n/en.json new file mode 100644 index 0000000..fab59fb --- /dev/null +++ b/src/renderer/src/plugins/fabric/i18n/en.json @@ -0,0 +1,152 @@ +{ + "tool": { + "draw": "Draw", + "eraser": "Eraser", + "select": "Select", + "board": "Board" + }, + "title": { + "drawType": "Draw Type", + "drawStyle": "Draw Style", + "drawWidth": "Draw Width", + "drawColor": "Draw Color", + "shadow": "Shadow", + "AI": "AI", + "shapeType": "Shape Type", + "shapeCount": "Shape Count", + "materialType": "Material Type", + "multiColorType": "MultiColor Type", + "drawText": "Draw Text", + "fontFamily": "Font Family", + "shapeLinePointCount": "Point Count", + "borderType": "Border Type", + "borderStyle": "Border Style", + "fillStyle": "Fill Style", + "eraserWidth": "Eraser Width", + "opacity": "Opacity", + "layer": "Layer", + "imageFilters": "Image Filters", + "fontStyle": "Font Style", + "canvasBackground": "Canvas Background", + "canvasSize": "Canvas Size", + "drawCache": "Draw Cache", + "guideLine": "GuideLine" + }, + "canvasSize": { + "width": "Width", + "height": "Height" + }, + "drawType": { + "freeStyle": "FreeStyle", + "shape": "Shape" + }, + "style": { + "basic": "Basic", + "rainbow": "Rainbow", + "shape": "Shape", + "material": "Material", + "pixels": "Pixels", + "multiColor": "MultiColor", + "text": "Text", + "multiLine": "MultiLine", + "reticulate": "Reticulate", + "multiPoint": "MultiPoint", + "wiggle": "Wiggle", + "thorn": "Thorn" + }, + "operate": { + "undo": "undo", + "redo": "redo", + "copy": "copy", + "delete": "delete", + "text": "add text", + "image": "upload image", + "clean": "clean", + "save": "Save as image", + "fileList": "File List" + }, + "info": { + "welecome": "Welcome to star", + "FreeStyle": { + "line1": "Provides 12 different styles of brushes, including Basic Brush, Rainbow Brush, Multi-Shape Brush, Multi-Material Brush, Pixel Brush, Multi-Color Brush, Text Brush, Multi-Line Connection Brush, Reticulate Brush, Multi-Point Connection Brush, Wiggle Brush, Thorn Brush. Satisfy the diversified drawing", + "line2": "All brushes support color and brush width configurations", + "line3": "MultiShape allows flexible configuration of shape types and quantities", + "line4": "Material and MultiColor allows you to adjust the material type of the brush", + "line5": "Text drawing support for cyclic text and font configuration" + }, + "ShapeDraw": { + "line1": "A variety of common shapes are provided for drawing, with support for multi-point segments and arrows. The shapes support border and fill styles." + }, + "EraserMode": { + "line1": "Eraser mode linearly erases all content", + "line2": "Supports linear width configurations" + }, + "SelectMode": { + "line1": "In selection mode, you can click on the content of the drawing to select it", + "line2": "Click handle supports drag and drop, zoom and rotate operations, providing flexible editing options", + "line3": "Selecting images supports multiple filter configurations", + "line4": "Support for font configuration when selecting text", + "line5": "Layer settings are supported for all drawings, including Move Layer Up, Move Layer Down, Move to Top, and Move to Bottom", + "line6": "All drawings support transparency configurations" + }, + "BoardMode": { + "line1": "The drawing board supports background configuration, including colour, background image, and transparency", + "line2": "The drawing board supports customized width and height configurations", + "line3": "Support for drawing cache enable. Enabling caching will improve drawing performance in the presence of large amounts of drawing content, while disabling caching will improve canvas clarity.", + "line4": "Supports guide line on and off" + }, + "BorderConfig": { + "line1": "The bottom left button shows the current zoom ratio in real time, click it to reset the zoom ratio", + "line2": "The list of buttons in the center, in order from left to right, are: Undo, Redo, Copy Current Selection, Delete Current Selection, Draw Text, Upload Image, Clear Drawing, Save as Image, and Open File List", + "line3": "PC: Hold down the Space key and click the left mouse button to move the canvas, scroll the mouse wheel to realize the canvas zoom, hold down the Backspace key to delete the selected content, and hold down the Ctrl + V keys to paste the clipboard image at the same time", + "line4": "Mobile: support for dragging and zooming the canvas after a two-finger press" + }, + "FileConfig": { + "line1": "Multi-file configuration: support multiple canvas switching, each canvas can be customized title, add, delete, and provide upload and download" + } + }, + "cleanModal":{ + "title": "Confirm clearing content?", + "confirm": "Confirmed", + "cancel": "Cancel" + }, + "deleteFileModal": { + "title": "Confirm deleting the current file?", + "confirm": "Confirmed", + "cancel": "Cancel" + }, + "toast": { + "uploadFileFail": "Upload failed, please try again" + }, + "filters": { + "Sepia": "Sepia", + "Invert": "Invert", + "BlackWhite": "BlackWhite", + "Grayscale": "Grayscale", + "Blur": "Blur", + "Vintage": "Vintage", + "BlendColor": "BlendColor", + "Brownie": "Brownie", + "Kodachrome": "Kodachrome", + "Pixelate": "Pixelate", + "Polaroid": "Polaroid", + "Technicolor": "Technicolor", + "Brightness": "Brightness", + "Noise": "Noise", + "Convolute": "Emboss" + }, + "fontStyle": { + "bold": "Bold", + "italic": "Italic", + "underLine": "UnderLine", + "lineThrough": "LineThrough" + }, + "boardConfig": { + "cacheTip": "In the presence of a large amount of drawing content, enabling caching will improve drawing performance, while disabling caching will improve canvas sharpness" + }, + "request": { + "tip": "Please feel free to draw...", + "loading": "Loading data, please wait...", + "error": "Something went wrong. Please try again later." + } +} \ No newline at end of file diff --git a/src/renderer/src/plugins/fabric/i18n/index.js b/src/renderer/src/plugins/fabric/i18n/index.js new file mode 100644 index 0000000..f231339 --- /dev/null +++ b/src/renderer/src/plugins/fabric/i18n/index.js @@ -0,0 +1,21 @@ +// import i18n from 'i18next' +// import { initReactI18next } from 'react-i18next' +// import en from './en.json' +// import zh from './zh.json' +// import useBoardStore from '@/store/board' + +// const lang = useBoardStore.getState().language + +// i18n.use(initReactI18next).init({ +// resources: { +// en: { +// translation: en +// }, +// zh: { +// translation: zh +// } +// }, +// lng: lang +// }) + +// export default i18n diff --git a/src/renderer/src/plugins/fabric/i18n/zh.json b/src/renderer/src/plugins/fabric/i18n/zh.json new file mode 100644 index 0000000..15c25df --- /dev/null +++ b/src/renderer/src/plugins/fabric/i18n/zh.json @@ -0,0 +1,152 @@ +{ + "tool": { + "draw": "绘画", + "eraser": "橡皮擦", + "select": "选择", + "board": "画板" + }, + "title": { + "drawType": "绘画类型", + "drawStyle": "绘画风格", + "drawWidth": "画笔宽度", + "drawColor": "画笔颜色", + "shadow": "阴影", + "AI": "AI", + "shapeType": "形状类型", + "shapeCount": "形状数量", + "materialType": "素材类型", + "multiColorType": "多色类型", + "drawText": "文字内容", + "fontFamily": "字体", + "shapeLinePointCount": "线段端点", + "borderType": "边框类型", + "borderStyle": "边框样式", + "fillStyle": "填充样式", + "eraserWidth": "橡皮擦宽度", + "opacity": "透明度", + "layer": "图层", + "imageFilters": "图像滤镜", + "fontStyle": "字体样式", + "canvasBackground": "画板背景", + "canvasSize": "画板尺寸", + "drawCache": "绘制缓存", + "guideLine": "辅助线" + }, + "canvasSize": { + "width": "宽度", + "height": "高度" + }, + "drawType": { + "freeStyle": "自由绘画", + "shape": "形状绘画" + }, + "style": { + "basic": "基础", + "rainbow": "彩虹 ", + "shape": "多形状", + "material": "素材", + "pixels": "像素", + "multiColor": "多色", + "text": "文字", + "multiLine": "多线连接", + "reticulate": "网状", + "multiPoint": "多点连接", + "wiggle": "波浪曲线", + "thorn": "荆棘" + }, + "operate": { + "undo": "撤销", + "redo": "重做", + "copy": "复制", + "delete": "删除", + "text": "添加文字", + "image": "上传图片", + "clean": "清除画板", + "save": "保存为图片", + "fileList": "文件列表" + }, + "info": { + "welecome": "欢迎Star", + "FreeStyle": { + "line1": "提供了 12 种不同风格的画笔,包括基本画笔,彩虹画笔,多形状画笔,多素材画笔,像素画笔,多色画笔,文字画笔,多线连接画笔,网状画笔,多点连接画笔,波浪曲线画笔,荆棘画笔。满足多样化的绘画", + "line2": "所有画笔均支持颜色和画笔宽度的配置", + "line3": "多形状可以灵活配置形状类型和数量", + "line4": "素材和多色可以调整画笔的素材类型", + "line5": "文字绘制支持循环文案配置和字体修改" + }, + "ShapeDraw": { + "line1": "提供了多种常见形状的绘制, 并支持多端点线段以及箭头. 并且这些形状均支持边框和填充的样式配置" + }, + "EraserMode": { + "line1": "橡皮擦模式可以线性擦除所有内容", + "line2": "支持线性宽度配置" + }, + "SelectMode": { + "line1": "在选择模式下,可以通过点击绘画内容进行框选", + "line2": "点击手柄支持拖拽、缩放和旋转操作,提供灵活的编辑方式", + "line3": "选择图片支持多种滤镜配置", + "line4": "选择文字时,支持字体设置", + "line5": "所有绘制内容均支持图层设置,包括向上移动层级、向下移动层级、移动至顶层和移动至底层", + "line6": "所有绘制内容支持透明度配置" + }, + "BoardMode": { + "line1": "画板支持配置背景配置, 包括颜色, 背景图, 透明度", + "line2": "画板支持自定义宽高配置", + "line3": "支持绘制缓存开启. 在存在大量绘制内容的情况下,启用缓存将提高绘制性能,而禁用缓存则会提升画布清晰度", + "line4": "支持辅助线的开启与关闭" + }, + "BorderConfig": { + "line1": "左下角按钮实时显示当前缩放比例,点击即可重置缩放比例", + "line2": "中间按钮列表按从左到右的顺序分别为:撤销、反撤销、复制当前选择内容、删除当前选择内容、绘制文字、上传图片、清除绘制内容、保存为图片、打开文件列表", + "line3": "电脑端:按住 Space 键并点击鼠标左键可移动画布,滚动鼠标滚轮实现画布缩放,按住 Backspace 键可删除已选内容,同时按住 Ctrl 键 + V 键可粘贴剪贴板图片", + "line4": "移动端:支持双指按压后拖拽和缩放画布" + }, + "FileConfig": { + "line1": "多文件配置:支持多个画布切换,每个画布可自定义标题、增加、删除,并提供上传和下载功能" + } + }, + "cleanModal":{ + "title": "确认清除内容?", + "confirm": "确认", + "cancel": "取消" + }, + "deleteFileModal": { + "title": "确认删除当前文件吗?", + "confirm": "确认", + "cancel": "取消" + }, + "toast": { + "uploadFileFail": "上传失败,请重试" + }, + "filters": { + "Sepia": "复古", + "Invert": "底片", + "BlackWhite": "黑白", + "Grayscale": "灰度", + "Blur": "模糊", + "Vintage": "古典", + "BlendColor": "混色", + "Brownie": "棕仙", + "Kodachrome": "胶片", + "Pixelate": "像素", + "Polaroid": "宝丽来", + "Technicolor": "彩色", + "Brightness": "增亮", + "Noise": "噪点", + "Convolute": "浮雕" + }, + "fontStyle": { + "bold": "粗体", + "italic": "斜体", + "underLine": "下划线", + "lineThrough": "删除线" + }, + "boardConfig": { + "cacheTip": "在存在大量绘制内容的情况下,启用缓存将提高绘制性能,而禁用缓存则会提升画布清晰度" + }, + "request": { + "tip": "请自由绘画...", + "loading": "正在加载数据,请稍候...", + "error": "出错了。请稍后再试。" + } +} \ No newline at end of file diff --git a/src/renderer/src/plugins/fabric/index.js b/src/renderer/src/plugins/fabric/index.js new file mode 100644 index 0000000..6a11848 --- /dev/null +++ b/src/renderer/src/plugins/fabric/index.js @@ -0,0 +1,1796 @@ +/** + * @description 封装fabric js + */ +import { fabric } from 'fabric' +// import { fabric } from 'fabric-with-erasing' +// import fabric from './fabric' +// import * as fabric from 'fabric' +import { diff, unpatch, patch } from 'jsondiffpatch' + +function baseBrush() { + /** ERASER_START */ + + /** + * add `eraser` to enlivened props + */ + fabric.Object.ENLIVEN_PROPS.push('eraser'); + + var __drawClipPath = fabric.Object.prototype._drawClipPath; + var _needsItsOwnCache = fabric.Object.prototype.needsItsOwnCache; + var _toObject = fabric.Object.prototype.toObject; + var _getSvgCommons = fabric.Object.prototype.getSvgCommons; + var __createBaseClipPathSVGMarkup = fabric.Object.prototype._createBaseClipPathSVGMarkup; + var __createBaseSVGMarkup = fabric.Object.prototype._createBaseSVGMarkup; + + fabric.Object.prototype.cacheProperties.push('eraser'); + fabric.Object.prototype.stateProperties.push('eraser'); + + /** + * @fires erasing:end + */ + fabric.util.object.extend(fabric.Object.prototype, { + /** + * Indicates whether this object can be erased by {@link fabric.EraserBrush} + * The `deep` option introduces fine grained control over a group's `erasable` property. + * When set to `deep` the eraser will erase nested objects if they are erasable, leaving the group and the other objects untouched. + * When set to `true` the eraser will erase the entire group. Once the group changes the eraser is propagated to its children for proper functionality. + * When set to `false` the eraser will leave all objects including the group untouched. + * @tutorial {@link http://fabricjs.com/erasing#erasable_property} + * @type boolean | 'deep' + * @default true + */ + erasable: true, + + /** + * @tutorial {@link http://fabricjs.com/erasing#eraser} + * @type fabric.Eraser + */ + eraser: undefined, + + /** + * @override + * @returns Boolean + */ + needsItsOwnCache: function () { + return _needsItsOwnCache.call(this) || !!this.eraser; + }, + + /** + * draw eraser above clip path + * @override + * @private + * @param {CanvasRenderingContext2D} ctx + * @param {fabric.Object} clipPath + */ + _drawClipPath: function (ctx, clipPath) { + __drawClipPath.call(this, ctx, clipPath); + if (this.eraser) { + // update eraser size to match instance + var size = this._getNonTransformedDimensions(); + this.eraser.isType('eraser') && this.eraser.set({ + width: size.x, + height: size.y + }); + __drawClipPath.call(this, ctx, this.eraser); + } + }, + + /** + * Returns an object representation of an instance + * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output + * @return {Object} Object representation of an instance + */ + toObject: function (propertiesToInclude) { + var object = _toObject.call(this, ['erasable'].concat(propertiesToInclude)); + if (this.eraser && !this.eraser.excludeFromExport) { + object.eraser = this.eraser.toObject(propertiesToInclude); + } + return object; + }, + + /* _TO_SVG_START_ */ + /** + * Returns id attribute for svg output + * @override + * @return {String} + */ + getSvgCommons: function () { + return _getSvgCommons.call(this) + (this.eraser ? 'mask="url(#' + this.eraser.clipPathId + ')" ' : ''); + }, + + /** + * create svg markup for eraser + * use to achieve erasing for svg, credit: https://travishorn.com/removing-parts-of-shapes-in-svg-b539a89e5649 + * must be called before object markup creation as it relies on the `clipPathId` property of the mask + * @param {Function} [reviver] + * @returns + */ + _createEraserSVGMarkup: function (reviver) { + if (this.eraser) { + this.eraser.clipPathId = 'MASK_' + fabric.Object.__uid++; + return [ + '', + this.eraser.toSVG(reviver), + '', '\n' + ].join(''); + } + return ''; + }, + + /** + * @private + */ + _createBaseClipPathSVGMarkup: function (objectMarkup, options) { + return [ + this._createEraserSVGMarkup(options && options.reviver), + __createBaseClipPathSVGMarkup.call(this, objectMarkup, options) + ].join(''); + }, + + /** + * @private + */ + _createBaseSVGMarkup: function (objectMarkup, options) { + return [ + this._createEraserSVGMarkup(options && options.reviver), + __createBaseSVGMarkup.call(this, objectMarkup, options) + ].join(''); + } + /* _TO_SVG_END_ */ + }); + + var __restoreObjectsState = fabric.Group.prototype._restoreObjectsState; + fabric.util.object.extend(fabric.Group.prototype, { + /** + * @private + * @param {fabric.Path} path + */ + _addEraserPathToObjects: function (path) { + this._objects.forEach(function (object) { + fabric.EraserBrush.prototype._addPathToObjectEraser.call( + fabric.EraserBrush.prototype, + object, + path + ); + }); + }, + + /** + * Applies the group's eraser to its objects + * @tutorial {@link http://fabricjs.com/erasing#erasable_property} + */ + applyEraserToObjects: function () { + var _this = this, eraser = this.eraser; + if (eraser) { + delete this.eraser; + var transform = _this.calcTransformMatrix(); + eraser.clone(function (eraser) { + var clipPath = _this.clipPath; + eraser.getObjects('path') + .forEach(function (path) { + // first we transform the path from the group's coordinate system to the canvas' + var originalTransform = fabric.util.multiplyTransformMatrices( + transform, + path.calcTransformMatrix() + ); + fabric.util.applyTransformToObject(path, originalTransform); + if (clipPath) { + clipPath.clone(function (_clipPath) { + var eraserPath = fabric.EraserBrush.prototype.applyClipPathToPath.call( + fabric.EraserBrush.prototype, + path, + _clipPath, + transform + ); + _this._addEraserPathToObjects(eraserPath); + }, ['absolutePositioned', 'inverted']); + } + else { + _this._addEraserPathToObjects(path); + } + }); + }); + } + }, + + /** + * Propagate the group's eraser to its objects, crucial for proper functionality of the eraser within the group and nested objects. + * @private + */ + _restoreObjectsState: function () { + this.erasable === true && this.applyEraserToObjects(); + return __restoreObjectsState.call(this); + } + }); + + /** + * An object's Eraser + * @private + * @class fabric.Eraser + * @extends fabric.Group + * @memberof fabric + */ + fabric.Eraser = fabric.util.createClass(fabric.Group, { + /** + * @readonly + * @static + */ + type: 'eraser', + + /** + * @default + */ + originX: 'center', + + /** + * @default + */ + originY: 'center', + + drawObject: function (ctx) { + ctx.save(); + ctx.fillStyle = 'black'; + ctx.fillRect(-this.width / 2, -this.height / 2, this.width, this.height); + ctx.restore(); + this.callSuper('drawObject', ctx); + }, + + /** + * eraser should retain size + * dimensions should not change when paths are added or removed + * handled by {@link fabric.Object#_drawClipPath} + * @override + * @private + */ + _getBounds: function () { + // noop + }, + + /* _TO_SVG_START_ */ + /** + * Returns svg representation of an instance + * use to achieve erasing for svg, credit: https://travishorn.com/removing-parts-of-shapes-in-svg-b539a89e5649 + * for masking we need to add a white rect before all paths + * + * @param {Function} [reviver] Method for further parsing of svg representation. + * @return {String} svg representation of an instance + */ + _toSVG: function (reviver) { + var svgString = ['\n']; + var x = -this.width / 2, y = -this.height / 2; + var rectSvg = [ + '\n' + ].join(''); + svgString.push('\t\t', rectSvg); + for (var i = 0, len = this._objects.length; i < len; i++) { + svgString.push('\t\t', this._objects[i].toSVG(reviver)); + } + svgString.push('\n'); + return svgString; + }, + /* _TO_SVG_END_ */ + }); + + /** + * Returns {@link fabric.Eraser} instance from an object representation + * @static + * @memberOf fabric.Eraser + * @param {Object} object Object to create an Eraser from + * @param {Function} [callback] Callback to invoke when an eraser instance is created + */ + fabric.Eraser.fromObject = function (object, callback) { + var objects = object.objects; + fabric.util.enlivenObjects(objects, function (enlivenedObjects) { + var options = fabric.util.object.clone(object, true); + delete options.objects; + fabric.util.enlivenObjectEnlivables(object, options, function () { + callback && callback(new fabric.Eraser(enlivenedObjects, options, true)); + }); + }); + }; + + var __renderOverlay = fabric.Canvas.prototype._renderOverlay; + /** + * @fires erasing:start + * @fires erasing:end + */ + fabric.util.object.extend(fabric.Canvas.prototype, { + /** + * Used by {@link #renderAll} + * @returns boolean + */ + isErasing: function () { + return ( + this.isDrawingMode && + this.freeDrawingBrush && + this.freeDrawingBrush.type === 'eraser' && + this.freeDrawingBrush._isErasing + ); + }, + + /** + * While erasing the brush clips out the erasing path from canvas + * so we need to render it on top of canvas every render + * @param {CanvasRenderingContext2D} ctx + */ + _renderOverlay: function (ctx) { + __renderOverlay.call(this, ctx); + if (this.isErasing() && !this.freeDrawingBrush.inverted) { + this.freeDrawingBrush._render(); + } + } + }); + + /** + * EraserBrush class + * Supports selective erasing meaning that only erasable objects are affected by the eraser brush. + * Supports **inverted** erasing meaning that the brush can "undo" erasing. + * + * In order to support selective erasing, the brush clips the entire canvas + * and then draws all non-erasable objects over the erased path using a pattern brush so to speak (masking). + * If brush is **inverted** there is no need to clip canvas. The brush draws all erasable objects without their eraser. + * This achieves the desired effect of seeming to erase or unerase only erasable objects. + * After erasing is done the created path is added to all intersected objects' `eraser` property. + * + * In order to update the EraserBrush call `preparePattern`. + * It may come in handy when canvas changes during erasing (i.e animations) and you want the eraser to reflect the changes. + * + * @tutorial {@link http://fabricjs.com/erasing} + * @class fabric.EraserBrush + * @extends fabric.PencilBrush + * @memberof fabric + */ + fabric.EraserBrush = fabric.util.createClass( + fabric.PencilBrush, + /** @lends fabric.EraserBrush.prototype */ { + type: 'eraser', + + /** + * When set to `true` the brush will create a visual effect of undoing erasing + */ + inverted: false, + + /** + * @private + */ + _isErasing: false, + + /** + * + * @private + * @param {fabric.Object} object + * @returns boolean + */ + _isErasable: function (object) { + return object.erasable !== false; + }, + + /** + * @private + * This is designed to support erasing a collection with both erasable and non-erasable objects. + * Iterates over collections to allow nested selective erasing. + * Prepares the pattern brush that will draw on the top context to achieve the desired visual effect. + * If brush is **NOT** inverted render all non-erasable objects. + * If brush is inverted render all erasable objects that have been erased with their clip path inverted. + * This will render the erased parts as if they were not erased. + * + * @param {fabric.Collection} collection + * @param {CanvasRenderingContext2D} ctx + * @param {{ visibility: fabric.Object[], eraser: fabric.Object[], collection: fabric.Object[] }} restorationContext + */ + _prepareCollectionTraversal: function (collection, ctx, restorationContext) { + collection.forEachObject(function (obj) { + if (obj.forEachObject && obj.erasable === 'deep') { + // traverse + this._prepareCollectionTraversal(obj, ctx, restorationContext); + } + else if (!this.inverted && obj.erasable && obj.visible) { + // render only non-erasable objects + obj.visible = false; + collection.dirty = true; + restorationContext.visibility.push(obj); + restorationContext.collection.push(collection); + } + else if (this.inverted && obj.visible) { + // render only erasable objects that were erased + if (obj.erasable && obj.eraser) { + obj.eraser.inverted = true; + obj.dirty = true; + collection.dirty = true; + restorationContext.eraser.push(obj); + restorationContext.collection.push(collection); + } + else { + obj.visible = false; + collection.dirty = true; + restorationContext.visibility.push(obj); + restorationContext.collection.push(collection); + } + } + }, this); + }, + + /** + * Prepare the pattern for the erasing brush + * This pattern will be drawn on the top context, achieving a visual effect of erasing only erasable objects + * @todo decide how overlay color should behave when `inverted === true`, currently draws over it which is undesirable + * @private + */ + preparePattern: function () { + if (!this._patternCanvas) { + this._patternCanvas = fabric.util.createCanvasElement(); + } + var canvas = this._patternCanvas; + canvas.width = this.canvas.width; + canvas.height = this.canvas.height; + var patternCtx = canvas.getContext('2d'); + if (this.canvas._isRetinaScaling()) { + var retinaScaling = this.canvas.getRetinaScaling(); + this.canvas.__initRetinaScaling(retinaScaling, canvas, patternCtx); + } + var backgroundImage = this.canvas.backgroundImage, + bgErasable = backgroundImage && this._isErasable(backgroundImage), + overlayImage = this.canvas.overlayImage, + overlayErasable = overlayImage && this._isErasable(overlayImage); + if (!this.inverted && ((backgroundImage && !bgErasable) || !!this.canvas.backgroundColor)) { + if (bgErasable) { this.canvas.backgroundImage = undefined; } + this.canvas._renderBackground(patternCtx); + if (bgErasable) { this.canvas.backgroundImage = backgroundImage; } + } + else if (this.inverted && (backgroundImage && bgErasable)) { + var color = this.canvas.backgroundColor; + this.canvas.backgroundColor = undefined; + this.canvas._renderBackground(patternCtx); + this.canvas.backgroundColor = color; + } + patternCtx.save(); + patternCtx.transform.apply(patternCtx, this.canvas.viewportTransform); + var restorationContext = { visibility: [], eraser: [], collection: [] }; + this._prepareCollectionTraversal(this.canvas, patternCtx, restorationContext); + this.canvas._renderObjects(patternCtx, this.canvas._objects); + restorationContext.visibility.forEach(function (obj) { obj.visible = true; }); + restorationContext.eraser.forEach(function (obj) { + obj.eraser.inverted = false; + obj.dirty = true; + }); + restorationContext.collection.forEach(function (obj) { obj.dirty = true; }); + patternCtx.restore(); + if (!this.inverted && ((overlayImage && !overlayErasable) || !!this.canvas.overlayColor)) { + if (overlayErasable) { this.canvas.overlayImage = undefined; } + __renderOverlay.call(this.canvas, patternCtx); + if (overlayErasable) { this.canvas.overlayImage = overlayImage; } + } + else if (this.inverted && (overlayImage && overlayErasable)) { + var color = this.canvas.overlayColor; + this.canvas.overlayColor = undefined; + __renderOverlay.call(this.canvas, patternCtx); + this.canvas.overlayColor = color; + } + }, + + /** + * Sets brush styles + * @private + * @param {CanvasRenderingContext2D} ctx + */ + _setBrushStyles: function (ctx) { + this.callSuper('_setBrushStyles', ctx); + ctx.strokeStyle = 'black'; + }, + + /** + * **Customiztion** + * + * if you need the eraser to update on each render (i.e animating during erasing) override this method by **adding** the following (performance may suffer): + * @example + * ``` + * if(ctx === this.canvas.contextTop) { + * this.preparePattern(); + * } + * ``` + * + * @override fabric.BaseBrush#_saveAndTransform + * @param {CanvasRenderingContext2D} ctx + */ + _saveAndTransform: function (ctx) { + this.callSuper('_saveAndTransform', ctx); + this._setBrushStyles(ctx); + ctx.globalCompositeOperation = ctx === this.canvas.getContext() ? 'destination-out' : 'source-over'; + }, + + /** + * We indicate {@link fabric.PencilBrush} to repaint itself if necessary + * @returns + */ + needsFullRender: function () { + return true; + }, + + /** + * + * @param {fabric.Point} pointer + * @param {fabric.IEvent} options + * @returns + */ + onMouseDown: function (pointer, options) { + if (!this.canvas._isMainEvent(options.e)) { + return; + } + this._prepareForDrawing(pointer); + // capture coordinates immediately + // this allows to draw dots (when movement never occurs) + this._captureDrawingPath(pointer); + + // prepare for erasing + this.preparePattern(); + this._isErasing = true; + this.canvas.fire('erasing:start'); + this._render(); + }, + + /** + * Rendering Logic: + * 1. Use brush to clip canvas by rendering it on top of canvas (unnecessary if `inverted === true`) + * 2. Render brush with canvas pattern on top context + * + */ + _render: function () { + var ctx; + if (!this.inverted) { + // clip canvas + ctx = this.canvas.getContext(); + this.callSuper('_render', ctx); + } + // render brush and mask it with image of non erasables + ctx = this.canvas.contextTop; + this.canvas.clearContext(ctx); + this.callSuper('_render', ctx); + ctx.save(); + var t = this.canvas.getRetinaScaling(), s = 1 / t; + ctx.scale(s, s); + ctx.globalCompositeOperation = 'source-in'; + ctx.drawImage(this._patternCanvas, 0, 0); + ctx.restore(); + }, + + /** + * Creates fabric.Path object + * @override + * @private + * @param {(string|number)[][]} pathData Path data + * @return {fabric.Path} Path to add on canvas + * @returns + */ + createPath: function (pathData) { + var path = this.callSuper('createPath', pathData); + path.globalCompositeOperation = this.inverted ? 'source-over' : 'destination-out'; + path.stroke = this.inverted ? 'white' : 'black'; + return path; + }, + + /** + * Utility to apply a clip path to a path. + * Used to preserve clipping on eraser paths in nested objects. + * Called when a group has a clip path that should be applied to the path before applying erasing on the group's objects. + * @param {fabric.Path} path The eraser path in canvas coordinate plane + * @param {fabric.Object} clipPath The clipPath to apply to the path + * @param {number[]} clipPathContainerTransformMatrix The transform matrix of the object that the clip path belongs to + * @returns {fabric.Path} path with clip path + */ + applyClipPathToPath: function (path, clipPath, clipPathContainerTransformMatrix) { + var pathInvTransform = fabric.util.invertTransform(path.calcTransformMatrix()), + clipPathTransform = clipPath.calcTransformMatrix(), + transform = clipPath.absolutePositioned ? + pathInvTransform : + fabric.util.multiplyTransformMatrices( + pathInvTransform, + clipPathContainerTransformMatrix + ); + // when passing down a clip path it becomes relative to the parent + // so we transform it acoordingly and set `absolutePositioned` to false + clipPath.absolutePositioned = false; + fabric.util.applyTransformToObject( + clipPath, + fabric.util.multiplyTransformMatrices( + transform, + clipPathTransform + ) + ); + // We need to clip `path` with both `clipPath` and it's own clip path if existing (`path.clipPath`) + // so in turn `path` erases an object only where it overlaps with all it's clip paths, regardless of how many there are. + // this is done because both clip paths may have nested clip paths of their own (this method walks down a collection => this may reccur), + // so we can't assign one to the other's clip path property. + path.clipPath = path.clipPath ? fabric.util.mergeClipPaths(clipPath, path.clipPath) : clipPath; + return path; + }, + + /** + * Utility to apply a clip path to a path. + * Used to preserve clipping on eraser paths in nested objects. + * Called when a group has a clip path that should be applied to the path before applying erasing on the group's objects. + * @param {fabric.Path} path The eraser path + * @param {fabric.Object} object The clipPath to apply to path belongs to object + * @param {Function} callback Callback to be invoked with the cloned path after applying the clip path + */ + clonePathWithClipPath: function (path, object, callback) { + var objTransform = object.calcTransformMatrix(); + var clipPath = object.clipPath; + var _this = this; + path.clone(function (_path) { + clipPath.clone(function (_clipPath) { + callback(_this.applyClipPathToPath(_path, _clipPath, objTransform)); + }, ['absolutePositioned', 'inverted']); + }); + }, + + /** + * Adds path to object's eraser, walks down object's descendants if necessary + * + * @fires erasing:end on object + * @param {fabric.Object} obj + * @param {fabric.Path} path + */ + _addPathToObjectEraser: function (obj, path) { + var _this = this; + // object is collection, i.e group + if (obj.forEachObject && obj.erasable === 'deep') { + var targets = obj._objects.filter(function (_obj) { + return _obj.erasable; + }); + if (targets.length > 0 && obj.clipPath) { + this.clonePathWithClipPath(path, obj, function (_path) { + targets.forEach(function (_obj) { + _this._addPathToObjectEraser(_obj, _path); + }); + }); + } + else if (targets.length > 0) { + targets.forEach(function (_obj) { + _this._addPathToObjectEraser(_obj, path); + }); + } + return; + } + // prepare eraser + var eraser = obj.eraser; + if (!eraser) { + eraser = new fabric.Eraser(); + obj.eraser = eraser; + } + // clone and add path + path.clone(function (path) { + // http://fabricjs.com/using-transformations + var desiredTransform = fabric.util.multiplyTransformMatrices( + fabric.util.invertTransform( + obj.calcTransformMatrix() + ), + path.calcTransformMatrix() + ); + fabric.util.applyTransformToObject(path, desiredTransform); + eraser.addWithUpdate(path); + obj.set('dirty', true); + obj.fire('erasing:end', { + path: path + }); + if (obj.group && Array.isArray(_this.__subTargets)) { + _this.__subTargets.push(obj); + } + }); + }, + + /** + * Add the eraser path to canvas drawables' clip paths + * + * @param {fabric.Canvas} source + * @param {fabric.Canvas} path + * @returns {Object} canvas drawables that were erased by the path + */ + applyEraserToCanvas: function (path) { + var canvas = this.canvas; + var drawables = {}; + [ + 'backgroundImage', + 'overlayImage', + ].forEach(function (prop) { + var drawable = canvas[prop]; + if (drawable && drawable.erasable) { + this._addPathToObjectEraser(drawable, path); + drawables[prop] = drawable; + } + }, this); + return drawables; + }, + + /** + * On mouseup after drawing the path on contextTop canvas + * we use the points captured to create an new fabric path object + * and add it to every intersected erasable object. + */ + _finalizeAndAddPath: function () { + var ctx = this.canvas.contextTop, canvas = this.canvas; + ctx.closePath(); + if (this.decimate) { + this._points = this.decimatePoints(this._points, this.decimate); + } + + // clear + canvas.clearContext(canvas.contextTop); + this._isErasing = false; + + var pathData = this._points && this._points.length > 1 ? + this.convertPointsToSVGPath(this._points) : + null; + if (!pathData || this._isEmptySVGPath(pathData)) { + canvas.fire('erasing:end'); + // do not create 0 width/height paths, as they are + // rendered inconsistently across browsers + // Firefox 4, for example, renders a dot, + // whereas Chrome 10 renders nothing + canvas.requestRenderAll(); + return; + } + + var path = this.createPath(pathData); + // needed for `intersectsWithObject` + path.setCoords(); + // commense event sequence + canvas.fire('before:path:created', { path: path }); + + // finalize erasing + var drawables = this.applyEraserToCanvas(path); + var _this = this; + this.__subTargets = []; + var targets = []; + canvas.forEachObject(function (obj) { + if (obj.erasable && obj.intersectsWithObject(path, true, true)) { + _this._addPathToObjectEraser(obj, path); + targets.push(obj); + } + }); + // fire erasing:end + canvas.fire('erasing:end', { + path: path, + targets: targets, + subTargets: this.__subTargets, + drawables: drawables + }); + delete this.__subTargets; + + canvas.requestRenderAll(); + this._resetShadow(); + + // fire event 'path' created + canvas.fire('path:created', { path: path }); + } + } + ); + + /** ERASER_END */ +} +baseBrush() // 加载橡皮擦到组件上 +// 当前使用到的常量|类型(枚举) ============================ +export class TYPES { + static ActionMode = { + DRAW: 'draw', // 画笔模式 + ERASE: 'erase', // 橡皮擦模式 + SELECT: 'select', // 选择模式 + Board: 'board', // 画板模式 + OTHER: 'other', // 其他模式 + } + // 画笔类型 + static DrawType = { + FreeStyle: 'freeStyle', + Shape: 'shape' + } + // 画笔样式 + static DrawStyle = { + Basic: 'basic', + Rainbow: 'rainbow', + Shape: 'shape', + Material: 'material', + Pixels: 'pixels', + MultiColor: 'multiColor', + Text: 'text', + MultiLine: 'multiLine', + Reticulate: 'reticulate', + MultiPoint: 'multiPoint', + Wiggle: 'wiggle', + Thorn: 'thorn' + } + // 各种形状 + static DrawShape = { + Bubble: 'bubble', + Star: 'star', + Love: 'love', + Butterfly: 'butterfly', + Snow: 'snow', + Music: 'music', + Sun: 'sun', + Moon: 'moon', + Leaf: 'leaf', + Flower: 'flower' + } + // 材质类型 + static MATERIAL_TYPE = { + CRAYON: 'crayon', + CARBON: 'carbon', + CLOTH: 'cloth', + OIL: 'oil', + CRAYON_DARK: 'crayonDark' + } + // 多颜色类型 + static MultiColorType = { + COL: 'col', + ROW: 'row', + CIRCLE: 'circle' + } + // 画笔元素 + static FREESTYLE_ELEMENT_CUSTOM_TYPE = { + IMAGE: 'image', + I_TEXT: 'itext', + RAINBOW: 'rainbow', + SHAPE: 'shape', + PIXELS: 'pixels', + DRAW_TEXT: 'drawText', + MULTI_LINE: 'multiLine', + RETICULATE: 'reticulate', + MULTI_POINT: 'multiPoint', + WIGGLE: 'wiggle', + THORN: 'thorn' + } + // 形状元素 + static SHAPE_ELEMENT_CUSTOM_TYPE = { + SHAPE_LINE: 'shapeLine', + SHAPE_RECT: 'shapeRect', + SHAPE_CIRCLE: 'shapeCircle', + SHAPE_ELLIPSE: 'shapeEllipse', + SHAPE_TRIANGLE: 'shapeTriangle', + SHAPE_ARROW_LINE: 'shapeArrowLine', + SHAPE_ARROW_OUTLINE: 'shapeArrowOutline', + SHAPE_CLOUD: 'shapeCloud', + SHAPE_TOOLTIPS: 'shapeTooltips', + SHAPE_LIGHTNING: 'shapeLightning', + SHAPE_CLOSE: 'shapeClose', + SHAPE_CHECK: 'shapeCheck', + SHAPE_INFO: 'shapeInfo', + SHAPE_BACKSPACE: 'shapeBackspace', + SHAPE_BLOCK: 'shapeBlock', + SHAPE_SPEAKER: 'shapeSpeaker', + SHAPE_SEARCH: 'shapeSearch', + SHAPE_INFO_OUTLINE: 'shapeInfoOutline', + SHAPE_HEART: 'shapeHeart', + SHAPE_ALERT: 'shapeAlert' + } + // 元素类型 + static ELEMENT_CUSTOM_TYPE = { + ...this.FREESTYLE_ELEMENT_CUSTOM_TYPE, + ...this.SHAPE_ELEMENT_CUSTOM_TYPE + } +} +// 公共方法-工具类 +export class Utils { + static lineUtils = { + polygonPositionHandler: (fabricControl, fabricObject) => { + const points = fabricObject.points + const x = points[fabricControl.pointIndex].x - fabricObject.pathOffset.x + const y = points[fabricControl.pointIndex].y - fabricObject.pathOffset.y + return fabric.util.transformPoint( + { x, y }, + fabric.util.multiplyTransformMatrices( + fabricObject.canvas?.viewportTransform, + fabricObject.calcTransformMatrix() + ) + ) + }, + anchorWrapper: (anchorIndex, fn) => { + return function (eventData, transform, x, y ) { + const fabricObject = transform.target + const points = fabricObject.points + const absolutePoint = fabric.util.transformPoint( + { + x: points[anchorIndex].x - fabricObject.pathOffset.x, + y: points[anchorIndex].y - fabricObject.pathOffset.y + }, + fabricObject.calcTransformMatrix() + ) + const actionPerformed = fn(eventData, transform, x, y) + fabricObject._setPositionDimensions({}) + const polygonBaseSize = getObjectSizeWithStroke(fabricObject) + + const newX = + (points[anchorIndex].x - fabricObject.pathOffset.x) / polygonBaseSize.x + const newY = + (points[anchorIndex].y - fabricObject.pathOffset.y) / polygonBaseSize.y + fabricObject.setPositionByOrigin( + absolutePoint, + (newX + 0.5), + (newY + 0.5) + ) + return actionPerformed + } + }, + actionHandler: (transform,x, y) => { + const polygon = transform.target, + currentControl = polygon.controls[polygon.__corner], + mouseLocalPosition = polygon.toLocalPoint( + new fabric.Point(x, y), + 'center', + 'center' + ), + polygonBaseSize = getObjectSizeWithStroke(polygon), + size = polygon._getTransformedDimensions(0, 0), + finalPointPosition = { + x: + (mouseLocalPosition.x * polygonBaseSize.x) / size.x + + polygon.pathOffset.x, + y: + (mouseLocalPosition.y * polygonBaseSize.y) / size.y + + polygon.pathOffset.y + } + + const points = polygon.points + points[currentControl.pointIndex] = finalPointPosition + + return true + } + } + static arrowLineUtils = { + pathPositionHandler: (fabricControl, fabricObject) => { + const paths = fabricObject.path + const x = paths[fabricControl.pointIndex][1] - fabricObject.pathOffset.x + const y = paths[fabricControl.pointIndex][2] - fabricObject.pathOffset.y + return fabric.util.transformPoint( + { x, y }, + fabric.util.multiplyTransformMatrices( + fabricObject.canvas?.viewportTransform, + fabricObject.calcTransformMatrix() + ) + ) + }, + anchorWrapper: (anchorIndex, fn) => { + return function (eventData, transform, x, y) { + const fabricObject = transform.target + const paths = fabricObject.path + const absolutePoint = fabric.util.transformPoint( + { + x: paths[anchorIndex][1] - fabricObject.pathOffset.x, + y: paths[anchorIndex][2] - fabricObject.pathOffset.y + }, + fabricObject.calcTransformMatrix() + ) + const actionPerformed = fn(eventData, transform, x, y) + fabricObject._setPath(fabricObject.path) + const pathBaseSize = getObjectSizeWithStroke(fabricObject) + + const newX = + (paths[anchorIndex][1] - fabricObject.pathOffset.x) / pathBaseSize.x + const newY = + (paths[anchorIndex][2] - fabricObject.pathOffset.y) / pathBaseSize.y + fabricObject.setPositionByOrigin( + absolutePoint, + (newX + 0.5), + (newY + 0.5) + ) + return actionPerformed + } + }, + actionHandler: (transform, x, y) => { + const pathObj = transform.target, + currentControl = pathObj.controls[pathObj.__corner], + mouseLocalPosition = pathObj.toLocalPoint( + new fabric.Point(x, y), + 'center', + 'center' + ), + pathBaseSize = getObjectSizeWithStroke(pathObj), + size = pathObj._getTransformedDimensions(0, 0), + finalPointPosition = { + x: + (mouseLocalPosition.x * pathBaseSize.x) / size.x + pathObj.pathOffset.x, + y: (mouseLocalPosition.y * pathBaseSize.y) / size.y + pathObj.pathOffset.y + } + + const path = pathObj.path + path[currentControl.pointIndex][1] = finalPointPosition.x + path[currentControl.pointIndex][2] = finalPointPosition.y + + if ( + currentControl.pointIndex === path?.length - 5 || + currentControl.pointIndex === path?.length - 6 + ) { + const point1 = path[path.length - 6] + const point2 = path[path.length - 5] + const newPath = calculateArrowSlidePath( + path, + point1[1], + point1[2], + point2[1], + point2[2] + ) + pathObj._setPath(newPath) + } + + return true + } + } + // 获取uuid string|number|all + static uuidv4(str = 'xxxxxxxx') { + if(str=='all') str = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx' + else if (typeof str == 'number') str = ''.padEnd(str,'x') + return str.replace(/[xy]/g,c=> { + const r=Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); + return v.toString(16); + }) + } + // 设置对象属性 + static setObjectAttr(obj, type) { + const id = Date.now() + obj.set({id, _customType: type}) + } + // 获取fabric-canvas json + static getCanvasJSON(canvas) { + if (canvas) { + return ( + // 返回额外属性 + canvas.toDatalessJSON([ + 'id', + '_customType', + 'perPixelTargetFind', + 'objectCaching' + ]) ?? {} + ) + } + return {} + } + // 克隆对象 + static cloneDeep(obj = {}) { + return JSON.parse(JSON.stringify(obj)) + } + /** + * Handling canvas json loaded data + * Used to initialize undo redo + * @param canvas fabric.Canvas + */ + static handleCanvasJSONLoaded(canvas){ + const this_ = this + canvas.getObjects().forEach((obj) => { + if (obj._customType === TYPES.ELEMENT_CUSTOM_TYPE.SHAPE_LINE) { + const points = obj.points + const lastControl = points.length - 1 + obj.controls = points.reduce(function (acc, point, index) { + acc['p' + index] = new fabric.Control({ + positionHandler: this_.lineUtils.polygonPositionHandler, + actionHandler: this_.lineUtils.anchorWrapper( + index > 0 ? index - 1 : lastControl, + this_.lineUtils.actionHandler + ), + actionName: 'polylineEndPoint', + pointIndex: index + }) + return acc + }, {}) + } + + if (obj._customType === TYPES.ELEMENT_CUSTOM_TYPE.SHAPE_ARROW_LINE) { + const paths = (obj).path + obj.controls = paths + .slice(0, paths.length - 4) + .reduce(function (acc, point, index) { + acc['p' + index] = new fabric.Control({ + positionHandler: this_.arrowLineUtils.pathPositionHandler, + actionHandler: this_.arrowLineUtils.anchorWrapper( + index > 0 ? index - 1 : paths.length - 5, + this_.arrowLineUtils.actionHandler + ), + actionName: 'pathEndPoint', + pointIndex: index + }) + return acc + }, {}) + } + }) + } + // 获取对象大小-宽度 + static getWidth(width, fabricVue) { + return width / fabricVue.canvas?.getZoom() ?? 1 + } +} +// ====== 自由绘画 start ======== +export class RainbowElement{ // 彩虹 + points = [] // fabric.Point[] + group // fabric.Group + constructor() { + this.group = new fabric.Group([], {perPixelTargetFind: true}) + // paintBoard.canvas?.add(group) + // 设置对象属性 {id, type} + Utils.setObjectAttr(this.group, TYPES.ELEMENT_CUSTOM_TYPE.RAINBOW) + } +} +// ====== 自由绘画 end ======== +// 自由绘画 FreeStyle ============================ +// "basic": "基础", +// "rainbow": "彩虹 ", +// "shape": "多形状", +// "material": "素材", +// "pixels": "像素", +// "multiColor": "多色", +// "text": "文字", +// "multiLine": "多线连接", +// "reticulate": "网状", +// "multiPoint": "多点连接", +// "wiggle": "波浪曲线", +// "thorn": "荆棘" +export const FreeStyle = { + // 普通画笔-basic + renderPencilBrush: (fabricVue) => { + const canvas = fabricVue?.canvas + const drawConfig = fabricVue?.drawConfig + const pencilBrush = new fabric.PencilBrush(canvas) + canvas.isDrawingMode = true + canvas.freeDrawingBrush = pencilBrush + canvas.freeDrawingBrush.width = Utils.getWidth(drawConfig.drawWidth, fabricVue) + canvas.freeDrawingBrush.color = drawConfig.drawColors[0] + canvas.freeDrawingBrush.shadow = new fabric.Shadow({ + blur: Utils.getWidth(drawConfig.shadowWidth, fabricVue), + offsetX: 0, + offsetY: 0, + color: drawConfig.shadowColor + }) + }, + // 橡皮擦-设置为-自由绘图画笔 + renderEraserBrush: (fabricVue) => { + const canvas = fabricVue?.canvas + const drawConfig = fabricVue?.drawConfig + const eraserBrush = new fabric.EraserBrush(canvas) + const width = Utils.getWidth(drawConfig.eraserWidth, fabricVue) + canvas.isDrawingMode = true + canvas.freeDrawingBrush = eraserBrush + canvas.freeDrawingBrush.width = width + canvas.freeDrawingBrush.color = '#FFF' + // FabricVue.canvas.freeDrawingCursor = `url(/imgs/erase.svg) 10 10,crosshair` + canvas.freeDrawingCursor = FreeStyle.reaserSvg(width) + }, + reaserSvg: (width, color = '#ccc') => { // 橡皮擦-鼠标样式(自定义) + const svg = ` + + + ` + const svgUrl = `data:image/svg+xml;base64,${btoa(svg)}` + return `url(${svgUrl}) ${width/2} ${width}, crosshair` + } +} +// 事件类 +// -- 点击事件 +export class CanvasClickEvent { + updateInkHook + FabricVue // fabric-canvas 对象 + isMouseDown = false // 是否按下鼠标 + isSpaceKeyDown = false // 是否按下空格键 + startPoint // 开始点坐标fabric.Point | undefined + currentElement = null // 当前鼠标移动会绘制元素 The current mouse move draws the element + + mouseDownTime = 0 // 鼠标按下时间 + autoDrawInk = [[], [], []] // 自动绘制 google auto draw ink Array> + isDrawBasic = false // 是否默认绘制 + + constructor(fabricVue) { + this.FabricVue = fabricVue + this.initCanvasEvent() + } + // 初始化 + initCanvasEvent() { + const canvas = this.FabricVue?.canvas + if (!canvas) throw new Error('canvas is null') + // canvas?.on('mouse:down', e => this.mouseDown(e)) // 事件:按下鼠标 + // canvas?.on('mouse:move', e => this.mouseMove(e)) // 事件:移动鼠标 + // canvas?.on('mouse:up', e => this.mouseUp(e)) // 事件:抬起鼠标 + // canvas?.on('mouse:dblclick', e => this.mouseDblclick(e)) // 事件:双击鼠标 + canvas?.on('mouse:down', this.mouseDown.bind(this) ) // 事件:按下鼠标 + canvas?.on('mouse:move', this.mouseMove.bind(this)) // 事件:移动鼠标 + canvas?.on('mouse:up', this.mouseUp.bind(this)) // 事件:抬起鼠标 + canvas?.on('mouse:dblclick', this.mouseDblclick.bind(this)) // 事件:双击鼠标 + } + // 事件:按下鼠标 + mouseDown(e) { + this.isMouseDown = true + if (this.isSpaceKeyDown) return + this.startPoint = e.absolutePointer + let currentElement = null + const { boardConfig, drawConfig } = this.FabricVue || {} + const isDraw = boardConfig.mode === TYPES.ActionMode.DRAW + if (isDraw) { + if (boardConfig.drawType == TYPES.DrawType.Shape) { // 形状绘画 + // switch (useShapeStore.shapeStyle) { + // case ShapeStyle.Rect: + // currentElement = new RectShape(e.absolutePointer) + // break + // case ShapeStyle.Circle: + // currentElement = new CircleShape(e.absolutePointer) + // break + // case ShapeStyle.Line: + // currentElement = new LineShape(e.absolutePointer) + // break + // case ShapeStyle.Ellipse: + // currentElement = new EllipseShape(e.absolutePointer) + // break + // case ShapeStyle.Triangle: + // currentElement = new TriangleShape(e.absolutePointer) + // break + // case ShapeStyle.ArrowLine: + // currentElement = new ArrowLineShape(e.absolutePointer) + // break + // case ShapeStyle.ArrowOutline: + // currentElement = new ArrowOutlineShape(e.absolutePointer) + // break + // case ShapeStyle.Cloud: + // currentElement = new CloudShape(e.absolutePointer) + // break + // case ShapeStyle.Tooltips: + // currentElement = new TooltipsShape(e.absolutePointer) + // break + // case ShapeStyle.Lightning: + // currentElement = new LightningShape(e.absolutePointer) + // break + // case ShapeStyle.Close: + // currentElement = new CloseShape(e.absolutePointer) + // break + // case ShapeStyle.Check: + // currentElement = new CheckShap(e.absolutePointer) + // break + // case ShapeStyle.Info: + // currentElement = new InfoShape(e.absolutePointer) + // break + // case ShapeStyle.Backspace: + // currentElement = new BackspaceShape(e.absolutePointer) + // break + // case ShapeStyle.Block: + // currentElement = new BlockShap(e.absolutePointer) + // break + // case ShapeStyle.Speaker: + // currentElement = new SpeakerShape(e.absolutePointer) + // break + // case ShapeStyle.Search: + // currentElement = new SearchShape(e.absolutePointer) + // break + // case ShapeStyle.InfoOutline: + // currentElement = new InfoOutlineShape(e.absolutePointer) + // break + // case ShapeStyle.Heart: + // currentElement = new HeartShape(e.absolutePointer) + // break + // case ShapeStyle.Alert: + // currentElement = new AlertShape(e.absolutePointer) + // break + // default: + // break + // } + } else if (boardConfig.drawType == TYPES.DrawType.FreeStyle) { // 自由绘画 + switch (drawConfig.drawStyle){ + // case TYPES.DrawStyle.Shape: // 多形状 + // currentElement = new ShapeElement() + // break + // case TYPES.DrawStyle.Pixels: // 像素 + // currentElement = new PixelsElement() + // break + // case TYPES.DrawStyle.Text: // 文本 + // currentElement = new DrawTextElement() + // break + // case TYPES.DrawStyle.MultiLine: // 多线 + // currentElement = new MultiLineElement() + // break + // case TYPES.DrawStyle.Reticulate: // 网状 + // currentElement = new ReticulateElement() + // break + // case TYPES.DrawStyle.Rainbow: // 彩虹 + // currentElement = new RainbowElement() + // break + // case TYPES.DrawStyle.Thorn: // 荆棘 + // currentElement = new ThornElement() + // break + // case TYPES.DrawStyle.MultiPoint: // 多点 + // currentElement = new MultiPointElement() + // break + // case TYPES.DrawStyle.Wiggle: // 波浪 + // currentElement = new WiggleElement() + // break + case TYPES.DrawStyle.Basic: // 基础画笔 + // FreeStyle.renderPencilBrush(this.FabricVue) + this.isDrawBasic = true + break + } + } + } + this.currentElement = currentElement + } + // 事件:移动鼠标 + mouseMove(e) { + if (this.isMouseDown) { + // 按下空格键,拖动画布,停止绘画。Press space, drag the canvas, stop drawing. + if (this.isSpaceKeyDown) { + canvas.relativePan(new fabric.Point(e.e.movementX, e.e.movementY)) + return + } + // 两个手指拖动,禁止绘画 two touch disabled drawing on mobile + if (this.FabricVue.evnet?.touchEvent?.isTwoTouch) return + const { boardConfig } = this.FabricVue||{} + const isDraw = boardConfig.mode === TYPES.ActionMode.DRAW && !!this.currentElement + if (isDraw) this.currentElement.addPosition(e.absolutePointer) + } + } + // 事件:抬起鼠标 + mouseUp(e) { + this.isMouseDown = false + if (this.currentElement) { + const { x: startX, y: startY } = this.startPoint + const { x: endX, y: endY } = e.absolutePointer + if (startX === endX && startY === endY) { // 无变化 + this.currentElement.destroy() + } + const isLine = this.currentElement instanceof LineShape || this.currentElement instanceof ArrowLineShape + if (isLine) this.currentElement?.mouseUp() + this.FabricVue?.history?.saveState() + } + if (this.isDrawBasic) { // 基础画笔-无element对象-但是要保存 + this.FabricVue?.history?.saveState() + } + } + // 事件:双击鼠标 + mouseDblclick(e) { + if (e?.absolutePointer) { + const { x, y } = e.absolutePointer + this.FabricVue.textElement?.loadText(x, y) + } + } + // 设置空格键状态 + setSpaceKeyDownState(isSpaceKeyDown) { + this.isSpaceKeyDown = isSpaceKeyDown + } + // 钩子:更新ink + changeInkHookFn(fn) { + this.updateInkHook = fn + } +} +// -- 主事件:canvas +export class CanvasEvent { + FabricVue // fabric-canvas 对象 + clickEvent // 点击事件 CanvasClickEvent + zoomEvent // 缩放事件 CanvasZoomEvent + objectEvent // 对象事件 ObjectEvent + windowEvent // window事件 WindowEvent + touchEvent // 触摸事件 CanvasTouchEvent + constructor(fabricVue) { + this.FabricVue = fabricVue + this.clickEvent = new CanvasClickEvent(fabricVue) + + // const zoomEvent = new CanvasZoomEvent() + // this.zoomEvent = zoomEvent + + // const objectEvent = new ObjectEvent() + // this.objectEvent = objectEvent + + // const windowEvent = new WindowEvent() + // this.windowEvent = windowEvent + + // const touchEvent = new CanvasTouchEvent() + } + // 移除事件 + removeEvent() { + this.windowEvent?.removeWindowEvent() + this.touchEvent?.removeTouchEvent() + } +} +// 历史类 +export class History { + FabricVue + diffs = [] + canvasData = {} + index = 0 + + constructor(fabricVue) { + this.FabricVue = fabricVue + const canvas = fabricVue.canvas + if (canvas) { + const canvasJson = Utils.getCanvasJSON(canvas) + this.canvasData = Utils.cloneDeep(canvasJson ?? {}) + } + } + // 缓存相关数据json + saveState() { + const canvas = this.FabricVue?.canvas + if (canvas) { + this.diffs = this.diffs.slice(0, this.index) + const canvasJson = Utils.getCanvasJSON(canvas) + const delta = diff(canvasJson, this.canvasData) + this.diffs.push(delta) + + // More than 50 operations, remove initial state + if (this.diffs.length > 50) { + this.diffs.shift() + } else { + this.index++ + } + this.canvasData = Utils.cloneDeep(canvasJson ?? {}) + } + } + // 撤销 + undo() { + const canvas = this.FabricVue?.canvas + if (canvas && this.index > 0) { + const delta = this.diffs[this.index - 1] + this.index-- + const canvasJson = patch(this.canvasData, delta) + // 重新加载数据 + canvas.loadFromJSON(canvasJson, () => { + Utils.handleCanvasJSONLoaded(canvas) + canvas.requestRenderAll() // 批量重绘 + this.canvasData = Utils.cloneDeep(canvasJson ?? {}) + // this.FabricVue.triggerHook() // 重新加载-自定义钩子 + // if ((delta)?.backgroundImage) { // 重新加载背景 + // handleBackgroundImageWhenCanvasSizeChange() + // } + }) + } + } + // 退回|重做 + redo() { + const canvas = this.FabricVue?.canvas + if (this.index < this.diffs.length && canvas) { + const delta = this.diffs[this.index] + this.index++ + const canvasJson = unpatch(this.canvasData, delta) + canvas.loadFromJSON(canvasJson, () => { + Utils.handleCanvasJSONLoaded(canvas) + canvas.requestRenderAll() + this.canvasData = Utils.cloneDeep(canvasJson ?? {}) + + // FabricVue.triggerHook() + // if ((delta)?.backgroundImage) { + // bgUtils.handleBackgroundImageWhenCanvasSizeChange() + // } + }) + } + } + // 清除记录 + clean() { + this.FabricVue?.canvas?.clear() + this.index = 0 + this.diffs = [] + this.canvasData = {} + } + // 重新加载历史记录 + initHistory() { + const canvas = this.FabricVue.canvas + if (canvas) { + const canvasJson = Utils.getCanvasJSON(canvas) + this.canvasData = canvasJson + this.index = 0 + this.diffs = [] + } + } +} +// 封装fabric-canvas +export class fabricVue { + canvas = null // fabric-canvas 对象 + evnet = null // 事件对象 + history = null // 历史记录 + textElement // 文本节点 + hookFn = [] // 钩子 + defConfig // 默认配置-canvas + drawConfig // 默认配置-画笔 + boardConfig // 默认配置-画板 + publicConfig // 公共属性-配置 + + /** 构造函数 */ + constructor() { + // this.textElement = new TextElement() // 创建文本节点 + const initLanguage = ['en', 'en-US', 'en-us'].includes(navigator.language) ? 'en' : 'zh' + this.drawConfig = { // 默认配置 + drawWidth: 1, + drawColors: ['#000000'], + shadowWidth: 0, + shadowColor: '#000000', + drawTextValue: 'draw', + drawStyle: TYPES.DrawStyle.Basic, + drawShapeCount: 2, + materialType: TYPES.MATERIAL_TYPE.CRAYON, + drawShape: TYPES.DrawShape.Bubble, + eraserWidth: 20, + multiColorType: TYPES.MultiColorType.COL, + textFontFamily: 'Georgia', + openAutoDraw: false, + fontStyles: [], + } + this.boardConfig = { // 默认配置 + mode: TYPES.ActionMode.DRAW, + drawType: TYPES.DrawType.FreeStyle, + language: initLanguage, + canvasWidth: 1, + canvasHeight: 1, + backgroundColor: 'rgba(255, 255, 255, 1)', + backgroundOpacity: 1, + hasBackgroundImage: false, + backgroundImageOpacity: 1, + isObjectCaching: true, + openGuideLine: false, + } + this.defConfig = { // 默认配置-canvas + // 它用于指定选中对象时显示的选择框的颜色 + selectionColor: 'rgba(101, 204, 138, 0.3)', + // 用于控制在组合(group)对象时是否保留每个对象的堆叠顺序 + preserveObjectStacking: true, + // 它用于控制是否在高分辨率显示器(例如 Retina 显示器)上启用图像的像素级缩放 + enableRetinaScaling: true, + // 锁定背景,不受缩放影响 false + backgroundVpt: false, + // 默认全屏模式 + width: window.innerWidth, + height: window.innerHeight, + } + this.publicConfig = { // 公共属性配置 + Object: { // 默认配置-对象上 + // 设置对象边框的颜色(Rect、Circle、Ellipse、Path) + borderColor: '#65CC8A', + // 设置对象角落的颜色(Rect、RoundRect、Circle 和 Ellipse 类型的对象) + cornerColor: '#65CC8A', + // 设置角落的形状(Rect、RoundRect、Circle 和 Ellipse 类型的对象) + // circle rect round [圆形,直角(默认),圆角] + cornerStyle: 'circle', + // 设置边框虚线的样式(Rect、Circle、Ellipse、Path) + borderDashArray: [3, 3], + // 矩形(Rect)、圆角矩形(RoundRect)、圆形(Circle)和椭圆形(Ellipse)对象的角落是否透明 + transparentCorners: false + }, + Line: { + // 设置边缘连接方式为 miter bevel round|尖角(默认) 斜角切割线 圆形连接 + strokeLineJoin: 'round', + // 设置结束连接方式为 butt round square|直角(默认) 圆形 正方形 + strokeLineCap: 'round' + } + } + } + /** + * 初始化canvas + * @param {*} canvasEl canvas元素 + * @returns boolean 是否初始化成功 + */ + initCanvas(canvasEl, option = {}) { + return new Promise(async(resolve) => { + if (!canvasEl) resolve(false) + this.canvas = new fabric.Canvas(canvasEl, { + ...this.defConfig, ...option + }) + fabric.Object.prototype.set(this.publicConfig.Object) + fabric.Line.prototype.set(this.publicConfig.Line) + this.evnet = new CanvasEvent(this) // 创建相关事件 + this.history = new History(this) // 创建历史记录 + // await this.initCanvasStorage() + this.handleMode() // 默认模式 + resolve(true) + }) + } + /** + * handle mode of operation + * @param mode current mode + */ + handleMode(mode) { + if (!this.canvas) return + if (!mode) mode = this.boardConfig.mode + const objectSet = { + selectable: false, + hoverCursor: 'default' + } + switch (mode) { + case TYPES.ActionMode.DRAW:{ // 绘画 + const isDraw = this.boardConfig.drawType === TYPES.DrawType.FreeStyle + if (isDraw) { + switch(this.drawConfig.drawStyle) { + case TYPES.DrawStyle.Basic: + FreeStyle.renderPencilBrush(this) + break + // case TYPES.DrawStyle.Material: + // this.canvas.isDrawingMode = true + // material.render({}) + // break + // case TYPES.DrawStyle.MultiColor: + // renderMultiColor({}) + // break + default: + this.canvas.isDrawingMode = false + break + } + } + break} + case TYPES.ActionMode.ERASE: // 橡皮擦 + FreeStyle.renderEraserBrush(this) + this.canvas.discardActiveObject() + break + case TYPES.ActionMode.Board: // 画板-属性设置 + case TYPES.ActionMode.SELECT: // 选择 + objectSet.selectable = true + objectSet.hoverCursor = undefined + this.canvas.selection = true + break + case TYPES.ActionMode.OTHER: // 其他(工具选择) + this.canvas.isDrawingMode = false + objectSet.selectable = false + this.canvas.freeDrawingCursor = 'default' + break + default: + break + } + fabric.Object.prototype.set(objectSet) + this.canvas.forEachObject((obj) => { + if (obj._customType === TYPES.ELEMENT_CUSTOM_TYPE.I_TEXT) { + obj.selectable = objectSet.selectable + obj.hoverCursor = objectSet.hoverCursor + } + }) + this.canvas.requestRenderAll() + } + // 移除画布 + removeCanvas() { + if (this.canvas) { + this?.canvas?.dispose() + this.evnet?.removeEvent() + this.canvas = null + } + } + /** + * delete active objects + */ + deleteObject() { + // Disable deletion in text input state + if (this.textElement?.isTextEditing) { + return + } + if (this.canvas) { + const activeObjects = this.canvas.getActiveObjects() + if (activeObjects?.length) { + this.canvas.discardActiveObject() + activeObjects?.forEach((obj) => { + this.canvas?.remove(obj) + }) + this.render() + } + } + } + /** + * render and save history state + */ + render() { + if (this.canvas) { + this.canvas?.requestRenderAll() + this.history?.saveState() + } + } + /** + * save as Image + */ + saveImage() { + if (this.canvas) { + const link = document.createElement('a') + link.href = this.canvas.toDataURL() + link.download = 'paint-board.png' + link.click() + } + } + /** + * copy active objects + */ + copyObject() { + const canvas = this.canvas + if (!canvas) { + return + } + const targets = canvas.getActiveObjects() + if (targets.length <= 0) { + return + } + canvas.discardActiveObject() + const copys = targets.map((target) => { + return new Promise((resolve) => { + target?.clone((cloned) => { + const id = Utils.uuidv4('all') + cloned.set({ + left: (cloned?.left || 0) + 10, + top: (cloned?.top || 0) + 10, + evented: true, + id, + perPixelTargetFind: true + }) + resolve(cloned) + canvas.add(cloned) + }) + }) + }) + Promise.all(copys).then((objs) => { + const activeSelection = new fabric.ActiveSelection(objs, { + canvas: canvas + }) + canvas.setActiveObject(activeSelection) + this.render() + }) + } + /** + * Moving active objects via fabric's bringForward method + * 通过fabric的bringForward方法移动活动对象之上 + */ + bringForWard() { + const canvas = this.canvas + if (canvas) { + const object = canvas.getActiveObject() + if (object) { + canvas.bringForward(object, true) + this.render() + } + } + } + /** + * Moving active objects via fabric's sendBackwards method + * 通过fabric的sendBackwards方法移动活动对象之下 + */ + seendBackWard() { + const canvas = this.canvas + if (canvas) { + const object = canvas.getActiveObject() + if (object) { + canvas.sendBackwards(object, true) + this.render() + } + } + } + // bringForWard 方法的简写 移动活动对象之上 + bringToFront() { + const canvas = this.canvas + if (canvas) { + const object = canvas.getActiveObject() + if (object) { + canvas.bringToFront(object) + this.render() + } + } + } + // seendBackWard 方法的简写 移动活动对象之下 + sendToBack() { + const canvas = this.canvas + if (canvas) { + const object = canvas.getActiveObject() + if (object) { + canvas.sendToBack(object) + this.render() + } + } + } + /** + * Add hook fn to trigger on update|在更新时添加钩钩fn以触发 + * @param fn hook fn () => void + */ + addHookFn(fn) { + this.hookFn.push(fn) + } + /** + * remove trigger hook fn | 移除触发钩fn + * @param fn hook fn () => void + */ + removeHookFn(fn) { + const hookIndex = this.hookFn.findIndex((v) => v === fn) + if (hookIndex > -1) { + this.hookFn.splice(hookIndex, 1) + } + } + + /** + * trigger hook fn + */ + triggerHook() { + this.hookFn.map((fn) => { + fn?.() + }) + } +} +export const FabricVue = new fabricVue() +export default FabricVue + diff --git a/src/renderer/src/plugins/imChat/enumbers.js b/src/renderer/src/plugins/imChat/enumbers.js new file mode 100644 index 0000000..05d12c3 --- /dev/null +++ b/src/renderer/src/plugins/imChat/enumbers.js @@ -0,0 +1,1267 @@ +/** + * @brief 错误码 + * 详细 [错误码](https://cloud.tencent.com/document/product/269/1671),请您移步官网查看 + */ +const TIMErrCode= { + ERR_SUCC : 0, + ERR_IN_PROGESS : 6015, + ERR_INVALID_PARAMETERS : 6017, + ERR_IO_OPERATION_FAILED : 6022, + ERR_INVALID_JSON : 6027, + ERR_OUT_OF_MEMORY : 6028, + ERR_PARSE_RESPONSE_FAILED : 6001, + ERR_SERIALIZE_REQ_FAILED : 6002, + ERR_SDK_NOT_INITIALIZED : 6013, + ERR_LOADMSG_FAILED : 6005, + ERR_DATABASE_OPERATE_FAILED : 6019, + ERR_SDK_COMM_CROSS_THREAD : 7001, + ERR_SDK_COMM_TINYID_EMPTY : 7002, + ERR_SDK_COMM_INVALID_IDENTIFIER : 7003, + ERR_SDK_COMM_FILE_NOT_FOUND : 7004, + ERR_SDK_COMM_FILE_TOO_LARGE : 7005, + ERR_SDK_COMM_FILE_SIZE_EMPTY : 7006, + ERR_SDK_COMM_FILE_OPEN_FAILED : 7007, + ERR_SDK_COMM_API_CALL_FREQUENCY_LIMIT : 7008, + ERR_SDK_COMM_INTERRUPT : 7009, + ERR_SDK_COMM_DATABASE_FAILURE : 7010, + ERR_SDK_COMM_DATABASE_NOTFOUND : 7011, + ERR_SDK_INTERNAL_ERROR : 7012, + ERR_SDK_NOT_LOGGED_IN : 6014, + ERR_NO_PREVIOUS_LOGIN : 6026, + ERR_USER_SIG_EXPIRED : 6206, + ERR_LOGIN_KICKED_OFF_BY_OTHER : 6208, + ERR_SDK_ACCOUNT_LOGIN_IN_PROCESS : 7501, + ERR_SDK_ACCOUNT_LOGOUT_IN_PROCESS : 7502, + ERR_SDK_ACCOUNT_TLS_INIT_FAILED : 7503, + ERR_SDK_ACCOUNT_TLS_NOT_INITIALIZED : 7504, + ERR_SDK_ACCOUNT_TLS_TRANSPKG_ERROR : 7505, + ERR_SDK_ACCOUNT_TLS_DECRYPT_FAILED : 7506, + ERR_SDK_ACCOUNT_TLS_REQUEST_FAILED : 7507, + ERR_SDK_ACCOUNT_TLS_REQUEST_TIMEOUT : 7508, + ERR_INVALID_CONVERSATION : 6004, + ERR_FILE_TRANS_AUTH_FAILED : 6006, + ERR_FILE_TRANS_NO_SERVER : 6007, + ERR_FILE_TRANS_UPLOAD_FAILED : 6008, + ERR_IMAGE_UPLOAD_FAILED_NOTIMAGE : 6031, + ERR_FILE_TRANS_DOWNLOAD_FAILED : 6009, + ERR_HTTP_REQ_FAILED : 6010, + ERR_INVALID_MSG_ELEM : 6016, + ERR_INVALID_SDK_OBJECT : 6021, + ERR_SDK_MSG_BODY_SIZE_LIMIT : 8001, + ERR_SDK_MSG_KEY_REQ_DIFFER_RSP : 8002, + ERR_SDK_IMAGE_CONVERT_ERROR : 8003, + ERR_SDK_IMAGE_CI_BLOCK : 8004, + ERR_MERGER_MSG_LAYERS_OVER_LIMIT : 8005, + ERR_SDK_SIGNALING_INVALID_INVITE_ID : 8010, + ERR_SDK_SIGNALING_NO_PERMISSION : 8011, + ERR_SDK_INVALID_CANCEL_MESSAGE : 8020, + ERR_SDK_SEND_MESSAGE_FAILED_WITH_CANCEL : 8021, + ERR_SDK_GROUP_INVALID_ID : 8501, + ERR_SDK_GROUP_INVALID_NAME : 8502, + ERR_SDK_GROUP_INVALID_INTRODUCTION : 8503, + ERR_SDK_GROUP_INVALID_NOTIFICATION : 8504, + ERR_SDK_GROUP_INVALID_FACE_URL : 8505, + ERR_SDK_GROUP_INVALID_NAME_CARD : 8506, + ERR_SDK_GROUP_MEMBER_COUNT_LIMIT : 8507, + ERR_SDK_GROUP_JOIN_PRIVATE_GROUP_DENY : 8508, + ERR_SDK_GROUP_INVITE_SUPER_DENY : 8509, + ERR_SDK_GROUP_INVITE_NO_MEMBER : 8510, + ERR_SDK_GROUP_ATTR_FREQUENCY_LIMIT : 8511, + ERR_SDK_GROUP_GET_ONLINE_MEMBER_COUNT_LIMIT : 8512, + ERR_SDK_GROUP_GET_GROUPS_INFO_LIMIT : 8513, + ERR_SDK_GROUP_GET_JOINED_GROUP_LIMIT : 8514, + ERR_SDK_FRIENDSHIP_INVALID_PROFILE_KEY : 9001, + ERR_SDK_FRIENDSHIP_INVALID_ADD_REMARK : 9002, + ERR_SDK_FRIENDSHIP_INVALID_ADD_WORDING : 9003, + ERR_SDK_FRIENDSHIP_INVALID_ADD_SOURCE : 9004, + ERR_SDK_FRIENDSHIP_FRIEND_GROUP_EMPTY : 9005, + ERR_SDK_FRIENDSHIP_EXCEED_THE_LIMIT : 9006, + ERR_SDK_NET_ENCODE_FAILED : 9501, + ERR_SDK_NET_DECODE_FAILED : 9502, + ERR_SDK_NET_AUTH_INVALID : 9503, + ERR_SDK_NET_COMPRESS_FAILED : 9504, + ERR_SDK_NET_UNCOMPRESS_FAILED : 9505, + ERR_SDK_NET_FREQ_LIMIT : 9506, + ERR_SDK_NET_REQ_COUNT_LIMIT : 9507, + ERR_SDK_NET_DISCONNECT : 9508, + ERR_SDK_NET_ALLREADY_CONN : 9509, + ERR_SDK_NET_CONN_TIMEOUT : 9510, + ERR_SDK_NET_CONN_REFUSE : 9511, + ERR_SDK_NET_NET_UNREACH : 9512, + ERR_SDK_NET_SOCKET_NO_BUFF : 9513, + ERR_SDK_NET_RESET_BY_PEER : 9514, + ERR_SDK_NET_SOCKET_INVALID : 9515, + ERR_SDK_NET_HOST_GETADDRINFO_FAILED : 9516, + ERR_SDK_NET_CONNECT_RESET : 9517, + ERR_SDK_NET_WAIT_INQUEUE_TIMEOUT : 9518, + ERR_SDK_NET_WAIT_SEND_TIMEOUT : 9519, + ERR_SDK_NET_WAIT_ACK_TIMEOUT : 9520, + ERR_SDK_NET_WAIT_SEND_REMAINING_TIMEOUT : 9521, + ERR_SDK_NET_PKG_SIZE_LIMIT : 9522, + ERR_SDK_NET_WAIT_SEND_TIMEOUT_NO_NETWORK : 9523, + ERR_SDK_NET_WAIT_ACK_TIMEOUT_NO_NETWORK : 9524, + ERR_SDK_NET_SEND_REMAINING_TIMEOUT_NO_NETWORK : 9525, + ERR_SVR_SSO_CONNECT_LIMIT : -302, + ERR_SVR_SSO_VCODE : -10000, + ERR_SVR_SSO_D2_EXPIRED : -10001, + ERR_SVR_SSO_A2_UP_INVALID : -10003, + ERR_SVR_SSO_A2_DOWN_INVALID : -10004, + ERR_SVR_SSO_EMPTY_KEY : -10005, + ERR_SVR_SSO_UIN_INVALID : -10006, + ERR_SVR_SSO_VCODE_TIMEOUT : -10007, + ERR_SVR_SSO_NO_IMEI_AND_A2 : -10008, + ERR_SVR_SSO_COOKIE_INVALID : -10009, + ERR_SVR_SSO_DOWN_TIP : -10101, + ERR_SVR_SSO_DISCONNECT : -10102, + ERR_SVR_SSO_IDENTIFIER_INVALID : -10103, + ERR_SVR_SSO_CLIENT_CLOSE : -10104, + ERR_SVR_SSO_MSFSDK_QUIT : -10105, + ERR_SVR_SSO_D2KEY_WRONG : -10106, + ERR_SVR_SSO_UNSURPPORT : -10107, + ERR_SVR_SSO_PREPAID_ARREARS : -10108, + ERR_SVR_SSO_PACKET_WRONG : -10109, + ERR_SVR_SSO_APPID_BLACK_LIST : -10110, + ERR_SVR_SSO_CMD_BLACK_LIST : -10111, + ERR_SVR_SSO_APPID_WITHOUT_USING : -10112, + ERR_SVR_SSO_FREQ_LIMIT : -10113, + ERR_SVR_SSO_OVERLOAD : -10114, + ERR_SVR_RES_NOT_FOUND : 114000, + ERR_SVR_RES_ACCESS_DENY : 114001, + ERR_SVR_RES_SIZE_LIMIT : 114002, + ERR_SVR_RES_SEND_CANCEL : 114003, + ERR_SVR_RES_READ_FAILED : 114004, + ERR_SVR_RES_TRANSFER_TIMEOUT : 114005, + ERR_SVR_RES_INVALID_PARAMETERS : 114011, + ERR_SVR_RES_INVALID_FILE_MD5 : 115066, + ERR_SVR_RES_INVALID_PART_MD5 : 115068, + ERR_SVR_COMM_INVALID_HTTP_URL : 60002, + ERR_SVR_COMM_REQ_JSON_PARSE_FAILED : 60003, + ERR_SVR_COMM_INVALID_ACCOUNT : 60004, + ERR_SVR_COMM_INVALID_ACCOUNT_EX : 60005, + ERR_SVR_COMM_INVALID_SDKAPPID : 60006, + ERR_SVR_COMM_REST_FREQ_LIMIT : 60007, + ERR_SVR_COMM_REQUEST_TIMEOUT : 60008, + ERR_SVR_COMM_INVALID_RES : 60009, + ERR_SVR_COMM_ID_NOT_ADMIN : 60010, + ERR_SVR_COMM_SDKAPPID_FREQ_LIMIT : 60011, + ERR_SVR_COMM_SDKAPPID_MISS : 60012, + ERR_SVR_COMM_RSP_JSON_PARSE_FAILED : 60013, + ERR_SVR_COMM_EXCHANGE_ACCOUNT_TIMEUT : 60014, + ERR_SVR_COMM_INVALID_ID_FORMAT : 60015, + ERR_SVR_COMM_SDKAPPID_FORBIDDEN : 60016, + ERR_SVR_COMM_REQ_FORBIDDEN : 60017, + ERR_SVR_COMM_REQ_FREQ_LIMIT : 60018, + ERR_SVR_COMM_REQ_FREQ_LIMIT_EX : 60019, + ERR_SVR_COMM_INVALID_SERVICE : 60020, + ERR_SVR_COMM_SENSITIVE_TEXT : 80001, + ERR_SVR_COMM_BODY_SIZE_LIMIT : 80002, + ERR_SVR_ACCOUNT_USERSIG_EXPIRED : 70001, + ERR_SVR_ACCOUNT_USERSIG_EMPTY : 70002, + ERR_SVR_ACCOUNT_USERSIG_CHECK_FAILED : 70003, + ERR_SVR_ACCOUNT_USERSIG_CHECK_FAILED_EX : 70005, + ERR_SVR_ACCOUNT_USERSIG_MISMATCH_PUBLICKEY : 70009, + ERR_SVR_ACCOUNT_USERSIG_MISMATCH_ID : 70013, + ERR_SVR_ACCOUNT_USERSIG_MISMATCH_SDKAPPID : 70014, + ERR_SVR_ACCOUNT_USERSIG_PUBLICKEY_NOT_FOUND : 70016, + ERR_SVR_ACCOUNT_SDKAPPID_NOT_FOUND : 70020, + ERR_SVR_ACCOUNT_INVALID_USERSIG : 70052, + ERR_SVR_ACCOUNT_NOT_FOUND : 70107, + ERR_SVR_ACCOUNT_SEC_RSTR : 70114, + ERR_SVR_ACCOUNT_INTERNAL_TIMEOUT : 70169, + ERR_SVR_ACCOUNT_INVALID_COUNT : 70206, + ERR_SVR_ACCOUNT_INVALID_PARAMETERS : 70402, + ERR_SVR_ACCOUNT_ADMIN_REQUIRED : 70403, + ERR_SVR_ACCOUNT_FREQ_LIMIT : 70050, + ERR_SVR_ACCOUNT_BLACKLIST : 70051, + ERR_SVR_ACCOUNT_COUNT_LIMIT : 70398, + ERR_SVR_ACCOUNT_INTERNAL_ERROR : 70500, + ERR_SVR_PROFILE_INVALID_PARAMETERS : 40001, + ERR_SVR_PROFILE_ACCOUNT_MISS : 40002, + ERR_SVR_PROFILE_ACCOUNT_NOT_FOUND : 40003, + ERR_SVR_PROFILE_ADMIN_REQUIRED : 40004, + ERR_SVR_PROFILE_SENSITIVE_TEXT : 40005, + ERR_SVR_PROFILE_INTERNAL_ERROR : 40006, + ERR_SVR_PROFILE_READ_PERMISSION_REQUIRED : 40007, + ERR_SVR_PROFILE_WRITE_PERMISSION_REQUIRED : 40008, + ERR_SVR_PROFILE_TAG_NOT_FOUND : 40009, + ERR_SVR_PROFILE_SIZE_LIMIT : 40601, + ERR_SVR_PROFILE_VALUE_ERROR : 40605, + ERR_SVR_PROFILE_INVALID_VALUE_FORMAT : 40610, + ERR_SVR_FRIENDSHIP_INVALID_PARAMETERS : 30001, + ERR_SVR_FRIENDSHIP_INVALID_SDKAPPID : 30002, + ERR_SVR_FRIENDSHIP_ACCOUNT_NOT_FOUND : 30003, + ERR_SVR_FRIENDSHIP_ADMIN_REQUIRED : 30004, + ERR_SVR_FRIENDSHIP_SENSITIVE_TEXT : 30005, + ERR_SVR_FRIENDSHIP_INTERNAL_ERROR : 30006, + ERR_SVR_FRIENDSHIP_NET_TIMEOUT : 30007, + ERR_SVR_FRIENDSHIP_WRITE_CONFLICT : 30008, + ERR_SVR_FRIENDSHIP_ADD_FRIEND_DENY : 30009, + ERR_SVR_FRIENDSHIP_COUNT_LIMIT : 30010, + ERR_SVR_FRIENDSHIP_GROUP_COUNT_LIMIT : 30011, + ERR_SVR_FRIENDSHIP_PENDENCY_LIMIT : 30012, + ERR_SVR_FRIENDSHIP_BLACKLIST_LIMIT : 30013, + ERR_SVR_FRIENDSHIP_PEER_FRIEND_LIMIT : 30014, + ERR_SVR_FRIENDSHIP_IN_SELF_BLACKLIST : 30515, + ERR_SVR_FRIENDSHIP_ALLOW_TYPE_DENY_ANY : 30516, + ERR_SVR_FRIENDSHIP_IN_PEER_BLACKLIST : 30525, + ERR_SVR_FRIENDSHIP_ALLOW_TYPE_NEED_CONFIRM : 30539, + ERR_SVR_FRIENDSHIP_ADD_FRIEND_SEC_RSTR : 30540, + ERR_SVR_FRIENDSHIP_PENDENCY_NOT_FOUND : 30614, + ERR_SVR_FRIENDSHIP_DEL_NONFRIEND : 31704, + ERR_SVR_FRIENDSHIP_DEL_FRIEND_SEC_RSTR : 31707, + ERR_SVR_FRIENDSHIP_ACCOUNT_NOT_FOUND_EX : 31804, + ERR_SVR_CONV_ACCOUNT_NOT_FOUND : 50001, + ERR_SVR_CONV_INVALID_PARAMETERS : 50002, + ERR_SVR_CONV_ADMIN_REQUIRED : 50003, + ERR_SVR_CONV_INTERNAL_ERROR : 50004, + ERR_SVR_CONV_NET_TIMEOUT : 50005, + ERR_SVR_MSG_PKG_PARSE_FAILED : 20001, + ERR_SVR_MSG_INTERNAL_AUTH_FAILED : 20002, + ERR_SVR_MSG_INVALID_ID : 20003, + ERR_SVR_MSG_NET_ERROR : 20004, + ERR_SVR_MSG_INTERNAL_ERROR1 : 20005, + ERR_SVR_MSG_PUSH_DENY : 20006, + ERR_SVR_MSG_IN_PEER_BLACKLIST : 20007, + ERR_SVR_MSG_BOTH_NOT_FRIEND : 20009, + ERR_SVR_MSG_NOT_PEER_FRIEND : 20010, + ERR_SVR_MSG_NOT_SELF_FRIEND : 20011, + ERR_SVR_MSG_SHUTUP_DENY : 20012, + ERR_SVR_MSG_REVOKE_TIME_LIMIT : 20016, + ERR_SVR_MSG_DEL_RAMBLE_INTERNAL_ERROR : 20018, + ERR_SVR_MSG_JSON_PARSE_FAILED : 90001, + ERR_SVR_MSG_INVALID_JSON_BODY_FORMAT : 90002, + ERR_SVR_MSG_INVALID_TO_ACCOUNT : 90003, + ERR_SVR_MSG_INVALID_RAND : 90005, + ERR_SVR_MSG_INVALID_TIMESTAMP : 90006, + ERR_SVR_MSG_BODY_NOT_ARRAY : 90007, + ERR_SVR_MSG_ADMIN_REQUIRED : 90009, + ERR_SVR_MSG_INVALID_JSON_FORMAT : 90010, + ERR_SVR_MSG_TO_ACCOUNT_COUNT_LIMIT : 90011, + ERR_SVR_MSG_TO_ACCOUNT_NOT_FOUND : 90012, + ERR_SVR_MSG_TIME_LIMIT : 90026, + ERR_SVR_MSG_INVALID_SYNCOTHERMACHINE : 90031, + ERR_SVR_MSG_INVALID_MSGLIFETIME : 90044, + ERR_SVR_MSG_ACCOUNT_NOT_FOUND : 90048, + ERR_SVR_MSG_INTERNAL_ERROR2 : 90994, + ERR_SVR_MSG_INTERNAL_ERROR3 : 90995, + ERR_SVR_MSG_INTERNAL_ERROR4 : 91000, + ERR_SVR_MSG_INTERNAL_ERROR5 : 90992, + ERR_SVR_MSG_BODY_SIZE_LIMIT : 93000, + ERR_SVR_MSG_LONGPOLLING_COUNT_LIMIT : 91101, + ERR_SVR_GROUP_INTERNAL_ERROR : 10002, + ERR_SVR_GROUP_API_NAME_ERROR : 10003, + ERR_SVR_GROUP_INVALID_PARAMETERS : 10004, + ERR_SVR_GROUP_ACOUNT_COUNT_LIMIT : 10005, + ERR_SVR_GROUP_FREQ_LIMIT : 10006, + ERR_SVR_GROUP_PERMISSION_DENY : 10007, + ERR_SVR_GROUP_INVALID_REQ : 10008, + ERR_SVR_GROUP_SUPER_NOT_ALLOW_QUIT : 10009, + ERR_SVR_GROUP_NOT_FOUND : 10010, + ERR_SVR_GROUP_JSON_PARSE_FAILED : 10011, + ERR_SVR_GROUP_INVALID_ID : 10012, + ERR_SVR_GROUP_ALLREADY_MEMBER : 10013, + ERR_SVR_GROUP_FULL_MEMBER_COUNT : 10014, + ERR_SVR_GROUP_INVALID_GROUPID : 10015, + ERR_SVR_GROUP_REJECT_FROM_THIRDPARTY : 10016, + ERR_SVR_GROUP_SHUTUP_DENY : 10017, + ERR_SVR_GROUP_RSP_SIZE_LIMIT : 10018, + ERR_SVR_GROUP_ACCOUNT_NOT_FOUND : 10019, + ERR_SVR_GROUP_GROUPID_IN_USED : 10021, + ERR_SVR_GROUP_SEND_MSG_FREQ_LIMIT : 10023, + ERR_SVR_GROUP_REQ_ALLREADY_BEEN_PROCESSED : 10024, + ERR_SVR_GROUP_GROUPID_IN_USED_FOR_SUPER : 10025, + ERR_SVR_GROUP_SDKAPPID_DENY : 10026, + ERR_SVR_GROUP_REVOKE_MSG_NOT_FOUND : 10030, + ERR_SVR_GROUP_REVOKE_MSG_TIME_LIMIT : 10031, + ERR_SVR_GROUP_REVOKE_MSG_DENY : 10032, + ERR_SVR_GROUP_NOT_ALLOW_REVOKE_MSG : 10033, + ERR_SVR_GROUP_REMOVE_MSG_DENY : 10034, + ERR_SVR_GROUP_NOT_ALLOW_REMOVE_MSG : 10035, + ERR_SVR_GROUP_AVCHATROOM_COUNT_LIMIT : 10036, + ERR_SVR_GROUP_COUNT_LIMIT : 10037, + ERR_SVR_GROUP_MEMBER_COUNT_LIMIT : 10038, + ERR_NO_SUCC_RESULT : 6003, + ERR_TO_USER_INVALID : 6011, + ERR_REQUEST_TIMEOUT : 6012, + ERR_INIT_CORE_FAIL : 6018, + ERR_EXPIRED_SESSION_NODE : 6020, + ERR_LOGGED_OUT_BEFORE_LOGIN_FINISHED : 6023, + ERR_TLSSDK_NOT_INITIALIZED : 6024, + ERR_TLSSDK_USER_NOT_FOUND : 6025, + ERR_BIND_FAIL_UNKNOWN : 6100, + ERR_BIND_FAIL_NO_SSOTICKET : 6101, + ERR_BIND_FAIL_REPEATD_BIND : 6102, + ERR_BIND_FAIL_TINYID_NULL : 6103, + ERR_BIND_FAIL_GUID_NULL : 6104, + ERR_BIND_FAIL_UNPACK_REGPACK_FAILED : 6105, + ERR_BIND_FAIL_REG_TIMEOUT : 6106, + ERR_BIND_FAIL_ISBINDING : 6107, + ERR_PACKET_FAIL_UNKNOWN : 6120, + ERR_PACKET_FAIL_REQ_NO_NET : 6121, + ERR_PACKET_FAIL_RESP_NO_NET : 6122, + ERR_PACKET_FAIL_REQ_NO_AUTH : 6123, + ERR_PACKET_FAIL_SSO_ERR : 6124, + ERR_PACKET_FAIL_REQ_TIMEOUT : 6125, + ERR_PACKET_FAIL_RESP_TIMEOUT : 6126, + ERR_PACKET_FAIL_REQ_ON_RESEND : 6127, + ERR_PACKET_FAIL_RESP_NO_RESEND : 6128, + ERR_PACKET_FAIL_FLOW_SAVE_FILTERED : 6129, + ERR_PACKET_FAIL_REQ_OVER_LOAD : 6130, + ERR_PACKET_FAIL_LOGIC_ERR : 6131, + ERR_FRIENDSHIP_PROXY_NOT_SYNCED : 6150, + ERR_FRIENDSHIP_PROXY_SYNCING : 6151, + ERR_FRIENDSHIP_PROXY_SYNCED_FAIL : 6152, + ERR_FRIENDSHIP_PROXY_LOCAL_CHECK_ERR : 6153, + ERR_GROUP_INVALID_FIELD : 6160, + ERR_GROUP_STORAGE_DISABLED : 6161, + ERR_LOADGRPINFO_FAILED : 6162, + ERR_REQ_NO_NET_ON_REQ : 6200, + ERR_REQ_NO_NET_ON_RSP : 6201, + ERR_SERIVCE_NOT_READY : 6205, + ERR_LOGIN_AUTH_FAILED : 6207, + ERR_NEVER_CONNECT_AFTER_LAUNCH : 6209, + ERR_REQ_FAILED : 6210, + ERR_REQ_INVALID_REQ : 6211, + ERR_REQ_OVERLOADED : 6212, + ERR_REQ_KICK_OFF : 6213, + ERR_REQ_SERVICE_SUSPEND : 6214, + ERR_REQ_INVALID_SIGN : 6215, + ERR_REQ_INVALID_COOKIE : 6216, + ERR_LOGIN_TLS_RSP_PARSE_FAILED : 6217, + ERR_LOGIN_OPENMSG_TIMEOUT : 6218, + ERR_LOGIN_OPENMSG_RSP_PARSE_FAILED : 6219, + ERR_LOGIN_TLS_DECRYPT_FAILED : 6220, + ERR_WIFI_NEED_AUTH : 6221, + ERR_USER_CANCELED : 6222, + ERR_REVOKE_TIME_LIMIT_EXCEED : 6223, + ERR_LACK_UGC_EXT : 6224, + ERR_AUTOLOGIN_NEED_USERSIG : 6226, + ERR_QAL_NO_SHORT_CONN_AVAILABLE : 6300, + ERR_REQ_CONTENT_ATTACK : 80101, + ERR_LOGIN_SIG_EXPIRE : 70101, + ERR_SDK_HAD_INITIALIZED : 90101, + ERR_OPENBDH_BASE : 115000, + ERR_REQUEST_NO_NET_ONREQ : 6250, + ERR_REQUEST_NO_NET_ONRSP : 6251, + ERR_REQUEST_FAILED : 6252, + ERR_REQUEST_INVALID_REQ : 6253, + ERR_REQUEST_OVERLOADED : 6254, + ERR_REQUEST_KICK_OFF : 6255, + ERR_REQUEST_SERVICE_SUSPEND : 6256, + ERR_REQUEST_INVALID_SIGN : 6257, + ERR_REQUEST_INVALID_COOKIE : 6258 +} +/** +* @brief 调用接口的返回值 + +* @note +* 若接口参数中有回调,只有当接口返回TIM_SUCC时,回调才会被调用 +* +* | 名称 | 含义 | 值 | +* | ---- | ---- | ---- | +* | TIM_SUCC | 接口调用成功 | 0 | +* | TIM_ERR_SDKUNINIT | 失败,IM SDK未初始化 | -1 | +* | TIM_ERR_NOTLOGIN | 失败,IM SDK未初始化 | -2 | +* | TIM_ERR_JSON | 接口调用失败,错误的Json格式或Json Key | -3 | +* | TIM_ERR_PARAM | 接口调用失败,参数错误 | -4 | +* | TIM_ERR_CONV | 接口调用失败,无效的会话 | -5 | +* | TIM_ERR_GROUP | 接口调用失败,无效的群组 | -6 | +*/ +const TIMResult= { + TIM_SUCC : 0, + TIM_ERR_SDKUNINIT : -1, + TIM_ERR_NOTLOGIN : -2, + TIM_ERR_JSON : -3, + TIM_ERR_PARAM : -4, + TIM_ERR_CONV : -5, + TIM_ERR_GROUP : -6 +} +/** +* @brief 日志级别 +* +* | 名称 | 含义 | 值(number) | +* | ---- | ---- | ---- | +* | kTIMLog_Off | 关闭日志输出 | 0 | +* | kTIMLog_Test | 全量日志 | 1 | +* | kTIMLog_Verbose| 开发调试过程中一些详细信息日志 | 2 | +* | kTIMLog_Debug | 调试日志 | 3 | +* | kTIMLog_Info | 信息日志 | 4 | +* | kTIMLog_Warn | 警告日志 | 5 | +* | kTIMLog_Error | 错误日志 | 6 | +* | kTIMLog_Assert | 断言日志 | 7 | +*/ +const TIMLogLevel= { + kTIMLog_Off : 0, + kTIMLog_Test : 1, + kTIMLog_Verbose : 2, + kTIMLog_Debug : 3, + kTIMLog_Info : 4, + kTIMLog_Warn : 5, + kTIMLog_Error : 6, + kTIMLog_Assert : 7 +} +/** +* @brief 登陆状态 +* +* | 名称 | 含义 | 值(number) | +* | ---- | ---- | ---- | +* | kTIMLoginStatus_Logined | 已登陆 | 1 | +* | kTIMLoginStatus_Logining | 登陆中 | 2 | +* | kTIMLoginStatus_UnLogined | 未登陆 | 3 | +* | kTIMLoginStatus_Logouting | 登出中 | 4 | +*/ +const TIMLoginStatus= { + kTIMLoginStatus_Logined : 1, + kTIMLoginStatus_Logining : 2, + kTIMLoginStatus_UnLogined : 3, + kTIMLoginStatus_Logouting : 4 +} +/** +* @brief 连接事件类型 +* +* | 名称 | 含义 | 值(enum) | +* | ---- | ---- | ---- | +* | kTIMConnected | 已连接 | kTIMConnected | +* | kTIMDisconnected | 失去连接 | kTIMDisconnected | +* | kTIMConnecting | 正在连接 | kTIMConnecting | +* | kTIMConnectFailed | 连接失败 | kTIMConnectFailed | +*/ +const TIMNetworkStatus= { + kTIMConnected : 0, + kTIMDisconnected : 1, + kTIMConnecting : 2, + kTIMConnectFailed : 3 +} +/** +* @brief 会话事件类型 +* +* | 名称 | 含义 | 值(enum) | +* | ---- | ---- | ---- | +* | kTIMConvEvent_Add | 会话新增,例如收到一条新消息,产生一个新的会话是事件触发 | kTIMConvEvent_Add | +* | kTIMConvEvent_Del | 会话删除,例如自己删除某会话时会触发 | kTIMConvEvent_Del | +* | kTIMConvEvent_Update | 会话更新,会话内消息的未读计数变化和收到新消息时触发 | kTIMConvEvent_Update | +* | kTIMConvEvent_Start | 会话开始 | kTIMConvEvent_Start | +* | kTIMConvEvent_Finish | 会话结束 | kTIMConvEvent_Finish | +*/ +const TIMConvEvent= { + kTIMConvEvent_Add : 0, + kTIMConvEvent_Del : 1, + kTIMConvEvent_Update : 2, + kTIMConvEvent_Start : 3, + kTIMConvEvent_Finish : 4 +} +/** +* @brief 会话类型 +* +* | 名称 | 含义 | 值(enum) | +* | ---- | ---- | ---- | +* | kTIMConv_Invalid | 无效会话 | kTIMConv_Invalid | +* | kTIMConv_C2C | 个人会话 | kTIMConv_C2C | +* | kTIMConv_Group | 群组会话 | kTIMConv_Group | +* | kTIMConv_System | 系统会话 | kTIMConv_System | +*/ +const TIMConvType= { + kTIMConv_Invalid : 0, + kTIMConv_C2C : 1, + kTIMConv_Group : 2, + kTIMConv_System : 3 +} +/** +* @brief 平台信息 +* +* | 名称 | 含义 | 值(enum/number) | +* | ---- | ---- | ---- | +* | kTIMPlatform_Other | 未知平台 | 0(number) | +* | kTIMPlatform_Windows | Windows平台 | kTIMPlatform_Windows | +* | kTIMPlatform_Android | Android平台 | kTIMPlatform_Android | +* | kTIMPlatform_IOS | iOS平台 | kTIMPlatform_IOS | +* | kTIMPlatform_Mac | MacOS平台 | kTIMPlatform_Mac | +* | kTIMPlatform_Simulator | iOS模拟器平台 | kTIMPlatform_Simulator | +*/ +const TIMPlatform= { + kTIMPlatform_Other : 0, + kTIMPlatform_Windows : 1, + kTIMPlatform_Android : 2, + kTIMPlatform_IOS : 3, + kTIMPlatform_Mac : 4, + kTIMPlatform_Simulator : 5 +} +/** +* @brief 群组成员信息标识 +* +* | 名称 | 含义 | 值(number) | +* | ---- | ---- | ---- | +* | kTIMPlatform_Other | 无 | 0x00 | +* | kTIMPlatform_Windows | 加入时间 | 0x01 | +* | kTIMPlatform_Android | 群消息接收选项 | 0x01 << 1 | +* | kTIMPlatform_IOS | 成员已读消息seq | 0x01 << 2 | +* | kTIMPlatform_IOS | 成员角色 | 0x01 << 3 | +* | kTIMPlatform_Mac | 禁言时间。当该值为0时表示没有被禁言 | 0x01 << 4, | +* | kTIMPlatform_Simulator | iOS模拟器平台 | 0x01 << 5 | +*/ +const TIMGroupMemberInfoFlag= { + kTIMGroupMemberInfoFlag_None : 0, + kTIMGroupMemberInfoFlag_JoinTime : 1, + kTIMGroupMemberInfoFlag_MsgFlag : 2, + kTIMGroupMemberInfoFlag_MsgSeq : 4, + kTIMGroupMemberInfoFlag_MemberRole : 8, + kTIMGroupMemberInfoFlag_ShutupUntill : 16, + kTIMGroupMemberInfoFlag_NameCard : 32 +} +/** +* @brief 群组成员角色标识 +* +* | 名称 | 含义 | 值(number) | +* | ---- | ---- | ---- | +* | kTIMGroupMemberRoleFlag_All | 获取全部角色类型 | 0x00 | +* | kTIMGroupMemberRoleFlag_Owner | 获取所有者(群主) | 0x01 | +* | kTIMGroupMemberRoleFlag_Admin | 获取管理员,不包括群主 | 0x01 << 1 | +* | kTIMGroupMemberRoleFlag_Member | 获取普通群成员,不包括群主和管理员 | 0x01 << 2 | +*/ +const TIMGroupMemberRoleFlag= { + kTIMGroupMemberRoleFlag_All : 0, + kTIMGroupMemberRoleFlag_Owner : 1, + kTIMGroupMemberRoleFlag_Admin : 2, + kTIMGroupMemberRoleFlag_Member : 4 +} +/** +* @brief 群组成员信息标识 +* +* | 名称 | 含义 | 值(number) | +* | ---- | ---- | ---- | +* | kTIMGroupInfoFlag_None | 无 | 0x00 | +* | kTIMGroupInfoFlag_Name | 群组名称 | 0x01 | +* | kTIMGroupInfoFlag_CreateTime | 群组创建时间 | 0x01 << 1 | +* | kTIMGroupInfoFlag_OwnerUin | 群组创建者帐号 | 0x01 << 2 | +* | kTIMGroupInfoFlag_Seq | seq | 0x01 << 3 | +* | kTIMGroupInfoFlag_LastTime | 群组信息最后修改时间 | 0x01 << 4 | +* | kTIMGroupInfoFlag_NextMsgSeq | 下一个消息的seq | 0x01 << 5 | +* | kTIMGroupInfoFlag_LastMsgTime | 最新群组消息时间 | 0x01 << 6 | +* | kTIMGroupInfoFlag_AppId | AppId | 0x01 << 7 | +* | kTIMGroupInfoFlag_MemberNum | 群组成员数量 | 0x01 << 8 | +* | kTIMGroupInfoFlag_MaxMemberNum | 群组成员最大数量 | 0x01 << 9 | +* | kTIMGroupInfoFlag_Notification | 群公告内容 | 0x01 << 10 | +* | kTIMGroupInfoFlag_Introduction | 群简介内容 | 0x01 << 11| +* | kTIMGroupInfoFlag_FaceUrl | 群头像URL | 0x01 << 12 | +* | kTIMGroupInfoFlag_AddOption | 加群选项 | 0x01 << 13 | +* | kTIMGroupInfoFlag_GroupType | 群类型 | 0x01 << 14 | +* | kTIMGroupInfoFlag_LastMsg | 群组内最新一条消息 | 0x01 << 15 | +* | kTIMGroupInfoFlag_OnlineNum | 群组在线成员数 | 0x01 << 16 | +* | kTIMGroupInfoFlag_Visible | 群组是否可见 | 0x01 << 17 | +* | kTIMGroupInfoFlag_Searchable | 群组是否可以搜索 | 0x01 << 18 | +* | kTIMGroupInfoFlag_ShutupAll | 群组是否全禁言 | 0x01 << 19 | +*/ +const TIMGroupGetInfoFlag= { + kTIMGroupInfoFlag_None : 0, + kTIMGroupInfoFlag_Name : 1, + kTIMGroupInfoFlag_CreateTime : 2, + kTIMGroupInfoFlag_OwnerUin : 4, + kTIMGroupInfoFlag_Seq : 8, + kTIMGroupInfoFlag_LastTime : 16, + kTIMGroupInfoFlag_NextMsgSeq : 32, + kTIMGroupInfoFlag_LastMsgTime : 64, + kTIMGroupInfoFlag_AppId : 128, + kTIMGroupInfoFlag_MemberNum : 256, + kTIMGroupInfoFlag_MaxMemberNum : 512, + kTIMGroupInfoFlag_Notification : 1024, + kTIMGroupInfoFlag_Introduction : 2048, + kTIMGroupInfoFlag_FaceUrl : 4096, + kTIMGroupInfoFlag_AddOption : 8192, + kTIMGroupInfoFlag_GroupType : 16384, + kTIMGroupInfoFlag_LastMsg : 32768, + kTIMGroupInfoFlag_OnlineNum : 65536, + kTIMGroupInfoFlag_Visible : 131072, + kTIMGroupInfoFlag_Searchable : 262144, + kTIMGroupInfoFlag_ShutupAll : 524288 +} +/** +* @brief Android离线推送模式 +* +* | 名称 | 含义 | 值(enum) | +* | ---- | ---- | ---- | +* | kTIMAndroidOfflinePushNotifyMode_Normal | 普通通知栏消息模式,离线消息下发后,点击通知栏消息直接启动应用,不会给应用进行回调 | kTIMAndroidOfflinePushNotifyMode_Normal | +* | kTIMAndroidOfflinePushNotifyMode_Custom | 自定义消息模式,离线消息下发后,点击通知栏消息会给应用进行回调 | kTIMAndroidOfflinePushNotifyMode_Custom | +*/ +const TIMAndroidOfflinePushNotifyMode= { + kTIMAndroidOfflinePushNotifyMode_Normal : 0, + kTIMAndroidOfflinePushNotifyMode_Custom : 1 +} +/** +* @brief 推送规则 +* +* | 名称 | 含义 | 值(enum) | +* | ---- | ---- | ---- | +* | kTIMOfflinePushFlag_Default | 按照默认规则进行推送 | kTIMOfflinePushFlag_Default | +* | kTIMOfflinePushFlag_NoPush | 不进行推送 | kTIMOfflinePushFlag_NoPush | +*/ +const TIMOfflinePushFlag= { + kTIMOfflinePushFlag_Default : 0, + kTIMOfflinePushFlag_NoPush : 1 +} +/** +* @brief 消息当前状态定义 +* +* | 名称 | 含义 | 值(number) | +* | ---- | ---- | ---- | +* | kTIMMsg_Sending | 消息正在发送 | 1 | +* | kTIMMsg_SendSucc | 消息发送成功 | 2 | +* | kTIMMsg_SendFail | 消息发送失败 | 3 | +* | kTIMMsg_Deleted | 消息已删除 | 4 | +* | kTIMMsg_LocalImported | 消息导入状态 | 5 | +* | kTIMMsg_Revoked | 消息撤回状态 | 6 | +* | kTIMMsg_Cancel | 消息取消 | 7 | +*/ +const TIMMsgStatus= { + kTIMMsg_Sending : 1, + kTIMMsg_SendSucc : 2, + kTIMMsg_SendFail : 3, + kTIMMsg_Deleted : 4, + kTIMMsg_LocalImported : 5, + kTIMMsg_Revoked : 6, + kTIMMsg_Cancel : 7 +} +/** +* @brief 标识消息的优先级,数字越大优先级越低 +* +* | 名称 | 含义 | 值(enum) | +* | ---- | ---- | ---- | +* | kTIMMsgPriority_High | 优先级最高,一般为红包或者礼物消息 | kTIMMsgPriority_High | +* | kTIMMsgPriority_Normal | 表示优先级次之,建议为普通消息 | kTIMMsgPriority_Normal | +* | kTIMMsgPriority_Low | 建议为点赞消息等 | kTIMMsgPriority_Low | +* | kTIMMsgPriority_Lowest | 消息发送失败 | kTIMMsgPriority_Lowest | +*/ +const TIMMsgPriority= { + kTIMMsgPriority_High : 0, + kTIMMsgPriority_Normal : 1, + kTIMMsgPriority_Low : 2, + kTIMMsgPriority_Lowest : 3 +} +/** +* @brief 元素的类型 +* +* | 名称 | 含义 | 值(enum/number) | +* | ---- | ---- | ---- | +* | kTIMElem_Text | 文本元素 | kTIMElem_Text | +* | kTIMElem_Image | 图片元素 | kTIMElem_Image | +* | kTIMElem_Sound | 声音元素 | kTIMElem_Sound | +* | kTIMElem_Custom | 自定义元素 | kTIMElem_Custom | +* | kTIMElem_File | 文件元素 | kTIMElem_File | +* | kTIMElem_GroupTips | 群组系统消息元素 | kTIMElem_GroupTips | +* | kTIMElem_Face | 表情元素 | kTIMElem_Face | +* | kTIMElem_Location | 位置元素 | kTIMElem_Location | +* | kTIMElem_GroupReport | 群组系统通知元素 | kTIMElem_GroupReport | +* | kTIMElem_Video | 视频元素 | kTIMElem_Video | +* | kTIMElem_FriendChange | 关系链变更消息元素 | kTIMElem_FriendChange | +* | kTIMElem_ProfileChange | 资料变更消息元素 | kTIMElem_ProfileChange | +* | kTIMElem_Merge | 合并消息素 | kTIMElem_Merge | +* | kTIMElem_Invalid | 未知元素类型 | -1 | +*/ +const TIMElemType= { + kTIMElem_Text : 0, + kTIMElem_Image : 1, + kTIMElem_Sound : 2, + kTIMElem_Custom : 3, + kTIMElem_File : 4, + kTIMElem_GroupTips : 5, + kTIMElem_Face : 6, + kTIMElem_Location : 7, + kTIMElem_GroupReport : 8, + kTIMElem_Video : 9, + kTIMElem_FriendChange : 10, + kTIMElem_ProfileChange : 11, + kTIMElem_Merge : 12, + kTIMElem_Invalid : -1 +} +/** +* @brief 图片质量级别 +* +* | 名称 | 含义 | 值(enum/number) | +* | ---- | ---- | ---- | +* | kTIMImageLevel_Orig | 原图发送 | kTIMImageLevel_Orig | +* | kTIMImageLevel_Compression | 高压缩率图发送(图片较小,默认值) | kTIMImageLevel_Compression | +* | kTIMImageLevel_HD | 高清图发送(图片较大) | kTIMImageLevel_HD | +*/ +const TIMImageLevel= { + kTIMImageLevel_Orig : 0, + kTIMImageLevel_Compression : 1, + kTIMImageLevel_HD : 2 +} +/** +* @brief 群组信息修改的类型 +* +* | 名称 | 含义 | 值(enum) | +* | ---- | ---- | ---- | +* | kTIMGroupTipChangeFlag_Unknown | 未知的修改 | kTIMGroupTipChangeFlag_Unknown | +* | kTIMGroupTipChangeFlag_Name | 修改群组名称 | kTIMGroupTipChangeFlag_Name | +* | kTIMGroupTipChangeFlag_Introduction | 修改群简介 | kTIMGroupTipChangeFlag_Introduction | +* | kTIMGroupTipChangeFlag_Notification | 修改群公告 | kTIMGroupTipChangeFlag_Notification | +* | kTIMGroupTipChangeFlag_FaceUrl | 修改群头像URL | kTIMGroupTipChangeFlag_FaceUrl | +* | kTIMGroupTipChangeFlag_Owner | 修改群所有者 | kTIMGroupTipChangeFlag_Owner | +* | kTIMGroupTipChangeFlag_Custom | 修改群自定义信息 | kTIMGroupTipChangeFlag_Custom | +* | kTIMGroupTipChangeFlag_Attribute | 群属性变更 (新增) | kTIMGroupTipChangeFlag_Attribute | +*/ +const TIMGroupTipGroupChangeFlag= { + kTIMGroupTipChangeFlag_Unknown : 0, + kTIMGroupTipChangeFlag_Name : 1, + kTIMGroupTipChangeFlag_Introduction : 2, + kTIMGroupTipChangeFlag_Notification : 3, + kTIMGroupTipChangeFlag_FaceUrl : 4, + kTIMGroupTipChangeFlag_Owner : 5, + kTIMGroupTipChangeFlag_Custom : 6, + kTIMGroupTipChangeFlag_Attribute : 7, + kTIMGroupTipChangeFlag_ShutupAll : 8, + kTIMGroupTipChangeFlag_MessageReceiveOpt : 10, + kTIMGroupTipChangeFlag_GroupAddOpt : 11, + kTIMGroupTipChangeFlag_GroupApproveOpt : 12 +} +/** +* @brief 群组系统消息类型 +* +* | 名称 | 含义 | 值(enum) | +* | ---- | ---- | ---- | +* | kTIMGroupTip_None | 无效的群提示 | kTIMGroupTip_None | +* | kTIMGroupTip_Invite | 邀请加入提示 | kTIMGroupTip_Invite | +* | kTIMGroupTip_Quit | 退群提示 | kTIMGroupTip_Quit | +* | kTIMGroupTip_Kick | 踢人提示 | kTIMGroupTip_Kick | +* | kTIMGroupTip_SetAdmin | 设置管理员提示 | kTIMGroupTip_SetAdmin | +* | kTIMGroupTip_CancelAdmin | 取消管理员提示 | kTIMGroupTip_CancelAdmin | +* | kTIMGroupTip_GroupInfoChange | 群信息修改提示 | kTIMGroupTip_GroupInfoChange | +* | kTIMGroupTip_MemberInfoChange | 群成员信息修改提示 | kTIMGroupTip_MemberInfoChange | +*/ +const TIMGroupTipType= { + kTIMGroupTip_None : 0, + kTIMGroupTip_Invite : 1, + kTIMGroupTip_Quit : 2, + kTIMGroupTip_Kick : 3, + kTIMGroupTip_SetAdmin : 4, + kTIMGroupTip_CancelAdmin : 5, + kTIMGroupTip_GroupInfoChange : 6, + kTIMGroupTip_MemberInfoChange : 7 +} +/** +* @brief 群组系统通知类型 +* +* | 名称 | 含义 | 值(enum) | +* | ---- | ---- | ---- | +* | kTIMGroupReport_None | 未知类型 | kTIMGroupReport_None | +* | kTIMGroupReport_AddRequest | 申请加群(只有管理员会接收到) | kTIMGroupReport_AddRequest | +* | kTIMGroupReport_AddAccept | 申请加群被同意(只有申请人自己接收到) | kTIMGroupReport_AddAccept | +* | kTIMGroupReport_AddRefuse | 申请加群被拒绝(只有申请人自己接收到) | kTIMGroupReport_AddRefuse | +* | kTIMGroupReport_BeKicked | 被管理员踢出群(只有被踢者接收到) | kTIMGroupReport_BeKicked | +* | kTIMGroupReport_Delete | 群被解散(全员接收) | kTIMGroupReport_AddRefuse | +* | kTIMGroupReport_Create | 创建群(创建者接收, 不展示) | kTIMGroupReport_Create | +* | kTIMGroupReport_Invite | 邀请加群(被邀请者接收) | kTIMGroupReport_Invite | +* | kTIMGroupReport_Quit | 主动退群(主动退出者接收, 不展示) | kTIMGroupReport_Quit | +* | kTIMGroupReport_GrantAdmin | 设置管理员(被设置者接收) | kTIMGroupReport_GrantAdmin | +* | kTIMGroupReport_CancelAdmin | 取消管理员(被取消者接收) | kTIMGroupReport_CancelAdmin | +* | kTIMGroupReport_GroupRecycle | 群已被回收(全员接收, 不展示) | kTIMGroupReport_GroupRecycle | +* | kTIMGroupReport_InviteReq | 邀请加群(只有被邀请者会接收到) | kTIMGroupReport_InviteReq | +* | kTIMGroupReport_InviteAccept | 邀请加群被同意(只有发出邀请者会接收到) | kTIMGroupReport_InviteAccept | +* | kTIMGroupReport_InviteRefuse | 邀请加群被拒绝(只有发出邀请者会接收到) | kTIMGroupReport_InviteRefuse | +* | kTIMGroupReport_ReadReport | 已读上报多终端同步通知(只有上报人自己收到) | kTIMGroupReport_ReadReport | +* | kTIMGroupReport_UserDefine | 用户自定义通知(默认全员接收) | kTIMGroupReport_UserDefine | +*/ +const TIMGroupReportType= { + kTIMGroupReport_None : 0, + kTIMGroupReport_AddRequest : 1, + kTIMGroupReport_AddAccept : 2, + kTIMGroupReport_AddRefuse : 3, + kTIMGroupReport_BeKicked : 4, + kTIMGroupReport_Delete : 5, + kTIMGroupReport_Create : 6, + kTIMGroupReport_Invite : 7, + kTIMGroupReport_Quit : 8, + kTIMGroupReport_GrantAdmin : 9, + kTIMGroupReport_CancelAdmin : 10, + kTIMGroupReport_GroupRecycle : 11, + kTIMGroupReport_InviteReq : 12, + kTIMGroupReport_InviteAccept : 13, + kTIMGroupReport_InviteRefuse : 14, + kTIMGroupReport_ReadReport : 15, + kTIMGroupReport_UserDefine : 16 +} +/** +* @brief 资料变更类型 +* +* | 名称 | 含义 | 值(enum) | +* | ---- | ---- | ---- | +* | kTIMGroupReport_None | 未知类型 | kTIMGroupReport_None | +* | kTIMProfileChange_Profile | 资料修改 | kTIMProfileChange_Profile | +*/ +const TIMProfileChangeType= { + kTIMProfileChange_None : 0, + kTIMProfileChange_Profile : 1 +} +/** +* @brief 好友变更类型 +* +* | 名称 | 含义 | 值(enum) | +* | ---- | ---- | ---- | +* | kTIMFriendChange_None | 未知类型 | kTIMFriendChange_None | +* | kTIMFriendChange_FriendAdd | 好友表增加 | kTIMFriendChange_FriendAdd | +* | kTIMFriendChange_FriendDel | 好友表删除 | kTIMFriendChange_FriendDel | +* | kTIMFriendChange_PendencyAdd | 未决增加 | kTIMFriendChange_PendencyAdd | +* | kTIMFriendChange_PendencyDel | 未决删除 | kTIMFriendChange_PendencyDel | +* | kTIMFriendChange_BlackListAdd | 黑名单添加 | kTIMFriendChange_BlackListAdd | +* | kTIMFriendChange_BlackListDel | 黑名单删除 | kTIMFriendChange_BlackListDel | +* | kTIMFriendChange_PendencyReadedReport | 未决已读上报 | kTIMFriendChange_PendencyReadedReport | +* | kTIMFriendChange_FriendProfileUpdate | 好友数据更新 | kTIMFriendChange_FriendProfileUpdate | +* | kTIMFriendChange_FriendGroupAdd | 分组增加 | kTIMFriendChange_FriendGroupAdd | +* | kTIMFriendChange_FriendGroupDel | 分组删除 | kTIMFriendChange_FriendGroupDel | +* | kTIMFriendChange_FriendGroupModify | 分组修改 | kTIMFriendChange_FriendGroupModify | +*/ +const TIMFriendChangeType= { + kTIMFriendChange_None : 0, + kTIMFriendChange_FriendAdd : 1, + kTIMFriendChange_FriendDel : 2, + kTIMFriendChange_PendencyAdd : 3, + kTIMFriendChange_PendencyDel : 4, + kTIMFriendChange_BlackListAdd : 5, + kTIMFriendChange_BlackListDel : 6, + kTIMFriendChange_PendencyReadedReport : 7, + kTIMFriendChange_FriendProfileUpdate : 8, + kTIMFriendChange_FriendGroupAdd : 9, + kTIMFriendChange_FriendGroupDel : 10, + kTIMFriendChange_FriendGroupModify : 11 +} +/** +* @brief 消息接收选项 +* +* | 名称 | 含义 | 值(enum) | +* | ---- | ---- | ---- | +* | kTIMRecvMsgOpt_Receive | 在线正常接收消息,离线时会进行 APNs 推送 | kTIMRecvMsgOpt_Receive | +* | kTIMRecvMsgOpt_Not_Receive | 不会接收到消息,离线不会有推送通知 | kTIMRecvMsgOpt_Not_Receive | +* | kTIMRecvMsgOpt_Not_Notify | 在线正常接收消息,离线不会有推送通知 | kTIMRecvMsgOpt_Not_Notify | +*/ +const TIMReceiveMessageOpt= { + kTIMRecvMsgOpt_Receive : 0, + kTIMRecvMsgOpt_Not_Receive : 1, + kTIMRecvMsgOpt_Not_Notify : 2 +} +/** +* @brief UUID类型 +* +* | 名称 | 含义 | 值(enum/number) | +* | ---- | ---- | ---- | +* | kTIMDownload_VideoThumb | 视频缩略图 | 0 | +* | kTIMDownload_File | 文件 | kTIMDownload_File | +* | kTIMDownload_Video | 视频 | kTIMDownload_Video | +* | kTIMDownload_Sound | 声音 | kTIMDownload_Sound | +*/ +const TIMDownloadType= { + kTIMDownload_VideoThumb : 0, + kTIMDownload_File : 1, + kTIMDownload_Video : 2, + kTIMDownload_Sound : 3 +} +/** +* @brief @ 类型 +* +* | 名称 | 含义 | 值(enum/number) | +* | ---- | ---- | ---- | +* | kTIMGroup_At_Me | @ 我 | 1 | +* | kTIMGroup_At_All | @ 群里所有人 | kTIMGroup_At_All | +* | kTIMGroup_At_All_At_ME | @ 群里所有人并且单独 @ 我 | kTIMGroup_At_All_At_ME | +*/ +const TIMGroupAtType= { + kTIMGroup_At_Me : 1, + kTIMGroup_At_All : 2, + kTIMGroup_At_All_At_ME : 3 +} +const TIMConversationMarkType= { + kTIMConversationMarkTypeStar : 1, + kTIMConversationMarkTypeUnread : 2, + kTIMConversationMarkTypeFold : 4, + kTIMConversationMarkTypeHide : 8 +} +/** +* @brief 群组加群选项 +* +* | 名称 | 含义 | 值(number) | +* | ---- | ---- | ---- | +* | kTIMGroupAddOpt_Forbid | 禁止加群 | 0 | +* | kTIMGroupAddOpt_Auth | 需要管理员审批 | 1 | +* | kTIMGroupAddOpt_Any | 任何人都可以加群 | 2 | +*/ +const TIMGroupAddOption= { + kTIMGroupAddOpt_Forbid : 0, + kTIMGroupAddOpt_Auth : 1, + kTIMGroupAddOpt_Any : 2 +} +/** +* @brief 群组类型 +* +* | 名称 | 含义 | 值(enum) | +* | ---- | ---- | ---- | +* | kTIMGroup_Public | 公开群 | kTIMGroup_Public | +* | kTIMGroup_Private | 私有群 | kTIMGroup_Private | +* | kTIMGroup_ChatRoom | 聊天室 | kTIMGroup_ChatRoom | +* | kTIMGroup_BChatRoom | 在线成员广播大群 | kTIMGroup_BChatRoom | +* | kTIMGroup_AVChatRoom | 互动直播聊天室 | kTIMGroup_AVChatRoom | +*/ +const TIMGroupType= { + kTIMGroup_Public : 0, + kTIMGroup_Private : 1, + kTIMGroup_ChatRoom : 2, + kTIMGroup_BChatRoom : 3, + kTIMGroup_AVChatRoom : 4, + kTIMGroup_Community : 5 +} +/** +* @brief 群组成员角色类型 +* +* | 名称 | 含义 | 值(enum) | +* | ---- | ---- | ---- | +* | kTIMMemberRole_None | 未定义 | kTIMMemberRole_None | +* | kTIMMemberRole_Normal | 群成员 | kTIMMemberRole_Normal | +* | kTIMMemberRole_Admin | 管理员 | kTIMMemberRole_Admin | +* | kTIMMemberRole_Owner | 超级管理员(群主) | kTIMMemberRole_Owner | +*/ +const TIMGroupMemberRole= { + kTIMMemberRole_None : 0, + kTIMMemberRole_Normal : 1, + kTIMMemberRole_Admin : 2, + kTIMMemberRole_Owner : 3 +} +/** +* @brief 群组基础信息 +* +* | 名称 | 含义 | 值(enum) | +* | ---- | ---- | ---- | +* | kTIMGroupMember_HandledErr | 失败 | kTIMGroupMember_HandledErr | +* | kTIMGroupMember_HandledSuc | 成功 | kTIMGroupMember_HandledSuc | +* | kTIMGroupMember_Included | 已是群成员 | kTIMGroupMember_Included | +* | kTIMGroupMember_Invited | 已发送邀请 | kTIMGroupMember_Invited | +*/ +const HandleGroupMemberResult= { + kTIMGroupMember_HandledErr : 0, + kTIMGroupMember_HandledSuc : 1, + kTIMGroupMember_Included : 2, + kTIMGroupMember_Invited : 3 +} +/** +* @brief 设置(修改)群组信息的类型 +* +* | 名称 | 含义 | 值(number) | +* | ---- | ---- | ---- | +* | kTIMGroupModifyInfoFlag_None | 无 | 0x00 | +* | kTIMGroupModifyInfoFlag_Name | 修改群组名称 | 0x01 | +* | kTIMGroupModifyInfoFlag_Notification | 修改群公告 | 0x01 << 1 | +* | kTIMGroupModifyInfoFlag_Introduction | 修改群简介 | 0x01 << 2 | +* | kTIMGroupModifyInfoFlag_FaceUrl | 修改群头像URL | 0x01 << 3 | +* | kTIMGroupModifyInfoFlag_AddOption | 修改群组添加选项 | 0x01 << 4 | +* | kTIMGroupModifyInfoFlag_MaxMmeberNum | 修改群最大成员数 | 0x01 << 5 | +* | kTIMGroupModifyInfoFlag_Visible | 修改群是否可见 | 0x01 << 6 | +* | kTIMGroupModifyInfoFlag_Searchable | 修改群是否被搜索 | 0x01 << 7 | +* | kTIMGroupModifyInfoFlag_ShutupAll | 修改群是否全体禁言 | 0x01 << 8 | +* | kTIMGroupModifyInfoFlag_Custom | 修改群自定义信息 | 0x01 << 9 | +* | kTIMGroupModifyInfoFlag_Owner | 修改群主 | 0x01 << 31 | +*/ +const TIMGroupModifyInfoFlag= { + kTIMGroupModifyInfoFlag_None : 0, + kTIMGroupModifyInfoFlag_Name : 1, + kTIMGroupModifyInfoFlag_Notification : 2, + kTIMGroupModifyInfoFlag_Introduction : 4, + kTIMGroupModifyInfoFlag_FaceUrl : 8, + kTIMGroupModifyInfoFlag_AddOption : 16, + kTIMGroupModifyInfoFlag_MaxMemberNum : 32, + kTIMGroupModifyInfoFlag_Visible : 64, + kTIMGroupModifyInfoFlag_Searchable : 128, + kTIMGroupModifyInfoFlag_ShutupAll : 256, + kTIMGroupModifyInfoFlag_Custom : 512, + kTIMGroupTopicModifyInfoFlag_CustomString : 2048, + kTIMGroupModifyInfoFlag_ApproveOption : 4096, + kTIMGroupModifyInfoFlag_Owner : -2147483648 +} +/** +* @brief 设置(修改)群成员信息的类型 +* +* | 名称 | 含义 | 值(number) | +* | ---- | ---- | ---- | +* | kTIMGroupMemberModifyFlag_None | 无 | 0x00 | +* | kTIMGroupMemberModifyFlag_MsgFlag | 修改消息接收选项 | 0x01 | +* | kTIMGroupMemberModifyFlag_MemberRole | 修改成员角色 | 0x01 << 1 | +* | kTIMGroupMemberModifyFlag_ShutupTime | 修改禁言时间 | 0x01 << 2 | +* | kTIMGroupMemberModifyFlag_NameCard | 修改群名片 | 0x01 << 3 | +* | kTIMGroupMemberModifyFlag_Custom | 修改群成员自定义信息 | 0x01 << 4 | +*/ +const TIMGroupMemberModifyInfoFlag= { + kTIMGroupMemberModifyFlag_None : 0, + kTIMGroupMemberModifyFlag_MsgFlag : 1, + kTIMGroupMemberModifyFlag_MemberRole : 2, + kTIMGroupMemberModifyFlag_ShutupTime : 4, + kTIMGroupMemberModifyFlag_NameCard : 8, + kTIMGroupMemberModifyFlag_Custom : 16 +} +/** +* @brief 未决请求类型 +* +* | 名称 | 含义 | 值(number) | +* | ---- | ---- | ---- | +* | kTIMGroupPendency_RequestJoin | 请求加群 | 0 | +* | kTIMGroupPendency_InviteJoin | 邀请加群 | 1 | +* | kTIMGroupPendency_ReqAndInvite | 邀请和请求的 | 2 | +*/ +const TIMGroupPendencyType= { + kTIMGroupPendency_RequestJoin : 0, + kTIMGroupPendency_InviteJoin : 1, + kTIMGroupPendency_ReqAndInvite : 2 +} +/** +* @brief 群未决处理状态 +* +* | 名称 | 含义 | 值(number) | +* | ---- | ---- | ---- | +* | kTIMGroupPendency_NotHandle | 未处理 | 0 | +* | kTIMGroupPendency_OtherHandle | 他人处理 | 1 | +* | kTIMGroupPendency_OperatorHandle | 操作方处理 | 2 | +*/ +const TIMGroupPendencyHandle= { + kTIMGroupPendency_NotHandle : 0, + kTIMGroupPendency_OtherHandle : 1, + kTIMGroupPendency_OperatorHandle : 2 +} +/** +* @brief 群未决处理操作类型 +* +* | 名称 | 含义 | 值(number) | +* | ---- | ---- | ---- | +* | kTIMGroupPendency_Refuse | 拒绝 | 0 | +* | kTIMGroupPendency_Accept | 同意 | 1 | +*/ +const TIMGroupPendencyHandleResult= { + kTIMGroupPendency_Refuse : 0, + kTIMGroupPendency_Accept : 1 +} +/** +* @brief 群搜索 Field 的枚举 +* +* | 名称 | 含义 | 值(number) | +* | ---- | ---- | ---- | +* | kTIMGroupSearchFieldKey_GroupId | 群 ID | 0x01 | +* | kTIMGroupSearchFieldKey_GroupName | 群名称 | 0x01 << 1 | +*/ +const TIMGroupSearchFieldKey= { + kTIMGroupSearchFieldKey_GroupId : 1, + kTIMGroupSearchFieldKey_GroupName : 2 +} +/** +* @brief 群成员搜索 Field 的枚举 +* +* | 名称 | 含义 | 值(number) | +* | ---- | ---- | ---- | +* | kTIMGroupMemberSearchFieldKey_Identifier | 用户 ID | 0x01 | +* | kTIMGroupMemberSearchFieldKey_NikeName | 昵称 | 0x01 << 1 | +* | kTIMGroupMemberSearchFieldKey_Remark | 备注 | 0x01 << 2 | +* | kTIMGroupMemberSearchFieldKey_NameCard | 名片 | 0x01 << 3 | +*/ +const TIMGroupMemberSearchFieldKey= { + kTIMGroupMemberSearchFieldKey_Identifier : 1, + kTIMGroupMemberSearchFieldKey_NickName : 2, + kTIMGroupMemberSearchFieldKey_Remark : 4, + kTIMGroupMemberSearchFieldKey_NameCard : 8 +} +/** +* @brief 用户性别类型 +* +* | 名称 | 含义 | 值(enum) | +* | ---- | ---- | ---- | +* | kTIMGenderType_Unkown | 未知性别 | kTIMGenderType_Unkown | +* | kTIMGenderType_Male | 性别男 | kTIMGenderType_Male | +* | kTIMGenderType_Female | 性别女 | kTIMGenderType_Female | +*/ +const TIMGenderType= { + kTIMGenderType_Unknown : 0, + kTIMGenderType_Male : 1, + kTIMGenderType_Female : 2 +} +/** +* @brief 用户加好友的选项 +* +* | 名称 | 含义 | 值(enum) | +* | ---- | ---- | ---- | +* | kTIMProfileAddPermission_Unknown | 未知 | kTIMProfileAddPermission_Unknown | +* | kTIMProfileAddPermission_AllowAny | 允许任何人添加好友 | kTIMProfileAddPermission_AllowAny | +* | kTIMProfileAddPermission_NeedConfirm | 添加好友需要验证 | kTIMProfileAddPermission_NeedConfirm | +* | kTIMProfileAddPermission_DenyAny | 拒绝任何人添加好友 | kTIMProfileAddPermission_DenyAny | +*/ +const TIMProfileAddPermission= { + kTIMProfileAddPermission_Unknown : 0, + kTIMProfileAddPermission_AllowAny : 1, + kTIMProfileAddPermission_NeedConfirm : 2, + kTIMProfileAddPermission_DenyAny : 3 +} +/** +* @brief 好友类型 +* +* | 名称 | 含义 | 值(enum) | +* | ---- | ---- | ---- | +* | FriendTypeSignle | 单向好友:用户A的好友表中有用户B,但B的好友表中却没有A | FriendTypeSignle | +* | FriendTypeBoth | 双向好友:用户A的好友表中有用户B,B的好友表中也有A | FriendTypeBoth | +*/ +const TIMFriendType= { + FriendTypeSingle : 0, + FriendTypeBoth : 1 +} +/** +* @brief 好友添加请求未决类型 +* +* | 名称 | 含义 | 值(enum) | +* | ---- | ---- | ---- | +* | FriendPendencyTypeComeIn | 别人发给我的 | FriendPendencyTypeComeIn | +* | FriendPendencyTypeSendOut | 我发给别人的 | FriendPendencyTypeSendOut | +* | FriendPendencyTypeBoth | 双向的 | FriendPendencyTypeBoth | +*/ +const TIMFriendPendencyType= { + FriendPendencyTypeComeIn : 0, + FriendPendencyTypeSendOut : 1, + FriendPendencyTypeBoth : 2 +} +/** +* @brief 好友添加请求响应的动作类型 +* +* | 名称 | 含义 | 值(enum) | +* | ---- | ---- | ---- | +* | ResponseActionAgree | 同意 | ResponseActionAgree | +* | ResponseActionAgreeAndAdd | 同意并添加 | ResponseActionAgreeAndAdd | +* | ResponseActionReject | 拒绝 | ResponseActionReject | +*/ +const TIMFriendResponseAction= { + ResponseActionAgree : 0, + ResponseActionAgreeAndAdd : 1, + ResponseActionReject : 2 +} +/** +* @brief 二者之间的关系 +* +* | 名称 | 含义 | 值(enum) | +* | ---- | ---- | ---- | +* | FriendCheckNoRelation | 无关系 | FriendCheckNoRelation | +* | FriendCheckAWithB | 仅A中有B | FriendCheckAWithB | +* | FriendCheckBWithA | 仅B中有A | FriendCheckBWithA | +* | FriendCheckBothWay | 双向的 | FriendCheckBothWay | +*/ +const TIMFriendCheckRelation= { + FriendCheckNoRelation : 0, + FriendCheckAWithB : 1, + FriendCheckBWithA : 2, + FriendCheckBothWay : 3 +} +/** +* @brief 好友搜索的枚举 +* +* | 名称 | 含义 | 值(number) | +* | ---- | ---- | ---- | +* | kTIMFriendshipSearchFieldKey_Identifier | userid | 0x01 | +* | kTIMFriendshipSearchFieldKey_NikeName | 昵称 | 0x01 << 1 | +* | kTIMFriendshipSearchFieldKey_Remark | 备注 | 0x01 << 2 | +*/ +const TIMFriendshipSearchFieldKey= { + kTIMFriendshipSearchFieldKey_Identifier : 1, + kTIMFriendshipSearchFieldKey_NickName : 2, + kTIMFriendshipSearchFieldKey_Remark : 4 +} +/** +* @brief 二者之间的关系 +* +* | 名称 | 含义 | 值(number) | +* | ---- | ---- | ---- | +* | kTIMFriendshipRelationType_None | 未知关系 | 0 | +* | kTIMFriendshipRelationType_InMyFriendList | 向好友:对方是我的好友,我不是对方的好友 | 0x01 << 1 | +* | kTIMFriendshipRelationType_InOtherFriendList | 单向好友:对方不是我的好友,我是对方的好友 | 0x01 << 2 | +* | kTIMFriendshipRelationType_BothFriend | 双向好友 | 0x01 <<2 TODO 值感觉不对 | +*/ +const TIMFriendshipRelationType= { + kTIMFriendshipRelationType_None : 0, + kTIMFriendshipRelationType_InMyFriendList : 2, + kTIMFriendshipRelationType_InOtherFriendList : 4, + kTIMFriendshipRelationType_BothFriend : 4 +} +/** +* @brief 实验性接口的操作类型 +*/ +const TIMInternalOperation= { + kTIMInternalOperationSSOData : "internal_operation_sso_data", + kTIMInternalOperationUserId2TinyId : "internal_operation_userid_tinyid", + kTIMInternalOperationTinyId2UserId : "internal_operation_tinyid_userid", + kTIMInternalOperationSetEnv : "internal_operation_set_env", + kTIMInternalOperationSetMaxRetryCount : "internal_operation_set_max_retry_count", + kTIMInternalOperationSetPrivatizationInfo : "internal_operation_set_privatization_info", + kTIMInternalOperationInitLocalStorage : "internal_operation_init_local_storage", + kTIMInternalOperationSetUIPlatform : "internal_operation_set_ui_platform", + kTIMInternalOperationSetCosSaveRegionForConversation : "internal_operation_set_cos_save_region_for_conversation", + kTIMInternalOperationSetIPv6Prior : "internal_operation_set_ipv6_prior", + kTIMInternalOperationSetPacketRequestTimeout : "internal_operation_set_packet_request_timeout", + kTIMInternalOperationSetCustomServerInfo : "internal_operation_set_custom_server_info", + kTIMInternalOperationSetQuicChannelInfo : "internal_operation_set_quic_channel_info", + kTIMInternalOperationSetSM4GCMCallback : "internal_operation_set_sm4_gcm_callback", + kTIMInternalOperationSetDatabaseEncryptInfo : "internal_operation_set_database_encrypt_info", + kTIMInternalOperationIsCommercialAbilityEnabled : "internal_operation_is_commercial_ability_enabled", + kTIMInternalOperationSetOfflinePushState : "internal_operation_set_offline_push_state", + kTIMInternalOperationGetOfflinePushState : "internal_operation_get_offline_push_state", + kTIMInternalOperationGetMessageRevoker : "internal_operation_get_message_revoker", + kTIMInternalOperationWriteLog : "internal_operation_write_log", + kTIMInternalOperationClearLocalHistoryMessage : "internal_operation_clear_local_history_message" +} +/** +* @brief ios 离线推送的类型 +*/ +const TIMIOSOfflinePushType= { + TIMIOSOfflinePushType_APNS : 0, + TIMIOSOfflinePushType_VOIP : 1 +} +/** +* @brief 离线推送注册的token类型 +*/ +const TIMOfflinePushTokenType= { + TIMOfflinePushTokenType_Default : 0, + TIMOfflinePushTokenType_TPNS : 1, + TIMOfflinePushTokenType_VOIP : 2 +} +/** +* @brief 用户状态类型 +*/ +const TIMUserStatusType= { + kTIMUserStatusType_Unkown : 0, + kTIMUserStatusType_Online : 1, + kTIMUserStatusType_Offline : 2, + kTIMUserStatusType_UnLogined : 3 +} +const TIMSignalingActionType= { + TIMSignalingActionType_Unknown : 0, + TIMSignalingActionType_Invite : 1, + TIMSignalingActionType_CancelInvite : 2, + TIMSignalingActionType_AcceptInvite : 3, + TIMSignalingActionType_RejectInvite : 4, + TIMSignalingActionType_InviteTimeout : 5 +} +const TIMPermissionGroupModifyInfoFlag= { + kTIMPermissionGroupModifyInfoFlag_None : 0, + kTIMPermissionGroupModifyInfoFlag_Name : 1, + kTIMPermissionGroupModifyInfoFlag_GroupPermission : 2, + kTIMPermissionGroupModifyInfoFlag_CustomData : 4 +} +const V2TIMCommunityPermissionValue= { + V2TIM_COMMUNITY_PERMISSION_MANAGE_GROUP_INFO : 1, + V2TIM_COMMUNITY_PERMISSION_MANAGE_GROUP_MEMBER : 2, + V2TIM_COMMUNITY_PERMISSION_MANAGE_PERMISSION_GROUP_INFO : 4, + V2TIM_COMMUNITY_PERMISSION_MANAGE_PERMISSION_GROUP_MEMBER : 8, + V2TIM_COMMUNITY_PERMISSION_MANAGE_TOPIC_IN_COMMUNITY : 16, + V2TIM_COMMUNITY_PERMISSION_MUTE_MEMBER : 32, + V2TIM_COMMUNITY_PERMISSION_SEND_MESSAGE : 64, + V2TIM_COMMUNITY_PERMISSION_AT_ALL : 128, + V2TIM_COMMUNITY_PERMISSION_GET_HISTORY_MESSAGE : 256, + V2TIM_COMMUNITY_PERMISSION_REVOKE_OTHER_MEMBER_MESSAGE : 512, + V2TIM_COMMUNITY_PERMISSION_BAN_MEMBER : 1024 +} +const V2TIMTopicPermissionValue= { + V2TIM_TOPIC_PERMISSION_MANAGE_TOPIC : 1, + V2TIM_TOPIC_PERMISSION_MANAGE_TOPIC_PERMISSION : 2, + V2TIM_TOPIC_PERMISSION_MUTE_MEMBER : 4, + V2TIM_TOPIC_PERMISSION_SEND_MESSAGE : 8, + V2TIM_TOPIC_PERMISSION_GET_HISTORY_MESSAGE : 16, + V2TIM_TOPIC_PERMISSION_REVOKE_OTHER_MEMBER_MESSAGE : 32, + V2TIM_TOPIC_PERMISSION_AT_ALL : 64 +} + +export { HandleGroupMemberResult, TIMAndroidOfflinePushNotifyMode, TIMConvEvent, TIMConvType, TIMConversationMarkType, TIMDownloadType, TIMElemType, TIMErrCode, TIMFriendChangeType, TIMFriendCheckRelation, TIMFriendPendencyType, TIMFriendResponseAction, TIMFriendType, TIMFriendshipRelationType, TIMFriendshipSearchFieldKey, TIMGenderType, TIMGroupAddOption, TIMGroupAtType, TIMGroupGetInfoFlag, TIMGroupMemberInfoFlag, TIMGroupMemberModifyInfoFlag, TIMGroupMemberRole, TIMGroupMemberRoleFlag, TIMGroupMemberSearchFieldKey, TIMGroupModifyInfoFlag, TIMGroupPendencyHandle, TIMGroupPendencyHandleResult, TIMGroupPendencyType, TIMGroupReportType, TIMGroupSearchFieldKey, TIMGroupTipGroupChangeFlag, TIMGroupTipType, TIMGroupType, TIMIOSOfflinePushType, TIMImageLevel, TIMInternalOperation, TIMLogLevel, TIMLoginStatus, TIMMsgPriority, TIMMsgStatus, TIMNetworkStatus, TIMOfflinePushFlag, TIMOfflinePushTokenType, TIMPermissionGroupModifyInfoFlag, TIMPlatform, TIMProfileAddPermission, TIMProfileChangeType, TIMReceiveMessageOpt, TIMResult, TIMSignalingActionType, TIMUserStatusType, V2TIMCommunityPermissionValue, V2TIMTopicPermissionValue }; diff --git a/src/renderer/src/plugins/imChat/imLiseners.js b/src/renderer/src/plugins/imChat/imLiseners.js new file mode 100644 index 0000000..0342a76 --- /dev/null +++ b/src/renderer/src/plugins/imChat/imLiseners.js @@ -0,0 +1,420 @@ +/** + * @description im 事件监听 + * @author zdg + * @date 2023-07-07 + */ +// @ts-ignore +const API = window?.api || {} +const timRenderInstance = API?.getTimRender?.() || {} + +// im 事件监听 +export class IMListeners { + // 初始化监听 + static initListeners(callback) { + /** + * 注销消息监听事件 + */ + timRenderInstance.TIMRemoveRecvNewMsgCallback() + /** + * @brief 增加接收新消息回调 + * @param cb 新消息回调函数,请参考[TIMRecvNewMsgCallback](TIMCloudCallback.h) + * @param user_data 用户自定义数据,ImSDK只负责传回给回调函数cb,不做任何处理 + * + * @note + * 如果用户是登录状态,ImSDK收到新消息会通过此接口设置的回调抛出,另外需要注意,抛出的消息不一定是未读的消息, + * 只是本地曾经没有过的消息(例如在另外一个终端已读,拉取最近联系人消息时可以获取会话最后一条消息,如果本地没有,会通过此方法抛出)。 + * 在用户登录之后,ImSDK会拉取离线消息,为了不漏掉消息通知,需要在登录之前注册新消息通知。 + */ + timRenderInstance.TIMAddRecvNewMsgCallback({ + callback:(args)=>{ + callback({ + type: 'TIMAddRecvNewMsgCallback', + data: JSON.parse(args[0]) + }) + }, + user_data: "test" + }) + + + /** + * @brief 1.3 设置消息已读回执回调 + * @param cb 消息已读回执回调,请参考[TIMMsgReadedReceiptCallback](TIMCloudCallback.h) + * @param user_data 用户自定义数据,ImSDK只负责传回给回调函数cb,不做任何处理 + * + * @note + * 发送方发送消息,接收方调用接口[TIMMsgReportReaded]()上报该消息已读,发送方ImSDK会通过此接口设置的回调抛出。 + */ + timRenderInstance.TIMSetMsgReadedReceiptCallback({ + callback:(args)=>{ + callback({ + type: 'TIMSetMsgReadedReceiptCallback', + data: JSON.parse(args[0]) + }) + }, + user_data: "test" + }) + + + /** + * @brief 1.4 设置接收的消息被撤回回调 + * @param cb 消息撤回通知回调,请参考[TIMMsgRevokeCallback](TIMCloudCallback.h) + * @param user_data 用户自定义数据,ImSDK只负责传回给回调函数cb,不做任何处理 + * + * @note + * 发送方发送消息,接收方收到消息。此时发送方调用接口[TIMMsgRevoke]()撤回该消息,接收方的ImSDK会通过此接口设置的回调抛出。 + */ + timRenderInstance.TIMSetMsgRevokeCallback({ + callback:(args)=>{ + callback({ + type: 'TIMSetMsgRevokeCallback', + data: JSON.parse(args[0]) + }); + }, + user_data: "test" + }) + + + + /** + * @brief 1.5 设置消息内元素相关文件上传进度回调 + * @param cb 文件上传进度回调,请参考[TIMMsgElemUploadProgressCallback](TIMCloudCallback.h) + * @param user_data 用户自定义数据,ImSDK只负责传回给回调函数cb,不做任何处理 + * + * @note + * 设置消息元素上传进度回调。当消息内包含图片、声音、文件、视频元素时,ImSDK会上传这些文件,并触发此接口设置的回调,用户可以根据回调感知上传的进度 + */ + timRenderInstance.TIMSetMsgElemUploadProgressCallback({ + callback:(args)=>{ + try{ + const [message, index, cur_size, total_size, user_data] = JSON.parse(args) + callback({ + type: 'TIMSetMsgElemUploadProgressCallback', + data: { + message: JSON.parse(message), + index, + cur_size, + total_size, + user_data + } + }) + }catch(err){ + throw err; + } + }, + user_data: "test" + }) + + /** + * @brief 1.6 设置群组系统消息回调 + * @param cb 群消息回调,请参考[TIMGroupTipsEventCallback](TIMCloudCallback.h) + * @param user_data 用户自定义数据,ImSDK只负责传回给回调函数cb,不做任何处理 + * + * @note + * 群组系统消息事件包括 加入群、退出群、踢出群、设置管理员、取消管理员、群资料变更、群成员资料变更。此消息是针对所有群组成员下发的 + */ + timRenderInstance.TIMSetGroupTipsEventCallback({ + callback:(args)=>{ + callback({ + type: 'TIMSetGroupTipsEventCallback', + data: JSON.parse(args[0]) + }) + }, + }) + + + /** + * @brief 1.7 设置群组属性变更回调 + * @param cb 群组属性变更回调,请参考[TIMGroupAttributeChangedCallback](TIMCloudCallback.h) + * @param user_data 用户自定义数据,ImSDK只负责传回给回调函数cb,不做任何处理 + * + * @note + * 某个已加入的群的属性被修改了,会返回所在群组的所有属性(该群所有的成员都能收到) + */ + timRenderInstance.TIMSetGroupAttributeChangedCallback({ + callback: (...args) => {callback({ type: 'TIMSetGroupAttributeChangedCallback', data: args })}, + userData: "" + }) + + + + /** + * @brief 1.8 设置会话事件回调 + * @param cb 会话事件回调,请参考[TIMConvEventCallback](TIMCloudCallback.h) + * @param user_data 用户自定义数据,ImSDK只负责传回给回调函数cb,不做任何处理 + * + * @note + * > 会话事件包括: + * >> 会话新增 + * >> 会话删除 + * >> 会话更新。 + * >> 会话开始 + * >> 会话结束 + * > 任何产生一个新会话的操作都会触发会话新增事件,例如调用接口[TIMConvCreate]()创建会话,接收到未知会话的第一条消息等。 + * 任何已有会话变化的操作都会触发会话更新事件,例如收到会话新消息,消息撤回,已读上报等。 + * 调用接口[TIMConvDelete]()删除会话成功时会触发会话删除事件。 + */ + timRenderInstance.TIMSetConvEventCallback({ + callback:(args)=>{ + callback({ + type: 'TIMSetConvEventCallback', + data: { + type:args[0], + data:args[1]!=="" ? JSON.parse(args[1]) : [] + } + }) + }, + user_data:"TIMSetConvEventCallback" + }) + + /** + * @brief 1.9 设置会话未读消息总数变更的回调 + * @param cb 会话未读消息总数变更的回调,请参考[TIMConvTotalUnreadMessageCountChangedCallback](TIMCloudCallback.h) + * @param user_data 用户自定义数据,ImSDK只负责传回给回调函数cb,不做任何处理 + * + */ + timRenderInstance.TIMSetConvTotalUnreadMessageCountChangedCallback({ + callback:(args)=>{ + callback({ + type: 'TIMSetConvTotalUnreadMessageCountChangedCallback', + data: args[0] + }) + } + }) + + + /** + * @brief 1.10 设置网络连接状态监听回调 + * @param cb 连接事件回调,请参考[TIMNetworkStatusListenerCallback](TIMCloudCallback.h) + * @param user_data 用户自定义数据,ImSDK只负责传回给回调函数cb,不做任何处理 + * + * @note + * > 当调用接口 [TIMInit]() 时,ImSDK会去连接云后台。此接口设置的回调用于监听网络连接的状态。 + * > 网络连接状态包含四个:正在连接、连接失败、连接成功、已连接。这里的网络事件不表示用户本地网络状态,仅指明ImSDK是否与即时通信IM云Server连接状态。 + * > 可选设置,如果要用户感知是否已经连接服务器,需要设置此回调,用于通知调用者跟通讯后台链接的连接和断开事件,另外,如果断开网络,等网络恢复后会自动重连,自动拉取消息通知用户,用户无需关心网络状态,仅作通知之用 + * > 只要用户处于登录状态,ImSDK内部会进行断网重连,用户无需关心。 + */ + timRenderInstance.TIMSetNetworkStatusListenerCallback({ + callback: (...args) => {callback({ type: 'TIMSetNetworkStatusListenerCallback', data: args })}, + userData: "" + }) + + /** + * @brief 1.11 设置被踢下线通知回调 + * @param cb 踢下线回调,请参考[TIMKickedOfflineCallback](TIMCloudCallback.h) + * @param user_data 用户自定义数据,ImSDK只负责传回给回调函数cb,不做任何处理 + * + * @note + * > 用户如果在其他终端登录,会被踢下线,这时会收到用户被踢下线的通知,出现这种情况常规的做法是提示用户进行操作(退出,或者再次把对方踢下线)。 + * > 用户如果在离线状态下被踢,下次登录将会失败,可以给用户一个非常强的提醒(登录错误码ERR_IMSDK_KICKED_BY_OTHERS:6208),开发者也可以选择忽略这次错误,再次登录即可。 + * > 用户在线情况下的互踢情况: + * + 用户在设备1登录,保持在线状态下,该用户又在设备2登录,这时用户会在设备1上强制下线,收到 TIMKickedOfflineCallback 回调。 + * 用户在设备1上收到回调后,提示用户,可继续调用login上线,强制设备2下线。这里是在线情况下互踢过程。 + * > 用户离线状态互踢: + * + 用户在设备1登录,没有进行logout情况下进程退出。该用户在设备2登录,此时由于用户不在线,无法感知此事件, + * 为了显式提醒用户,避免无感知的互踢,用户在设备1重新登录时,会返回(ERR_IMSDK_KICKED_BY_OTHERS:6208)错误码,表明之前被踢,是否需要把对方踢下线。 + * 如果需要,则再次调用login强制上线,设备2的登录的实例将会收到 TIMKickedOfflineCallback 回调。 + */ + timRenderInstance.TIMSetKickedOfflineCallback({ + callback: (...args) => { + callback({ + type: 'TIMSetKickedOfflineCallback', + data: args + }); + }, + userData: "" + }) + + + /** + * @brief 1.12 设置票据过期回调 + * @param cb 票据过期回调,请参考[TIMUserSigExpiredCallback](TIMCloudCallback.h) + * @param user_data 用户自定义数据,ImSDK只负责传回给回调函数cb,不做任何处理 + * + * @note + * 用户票据,可能会存在过期的情况,如果用户票据过期,此接口设置的回调会调用。 + * [TIMLogin]()也将会返回70001错误码。开发者可根据错误码或者票据过期回调进行票据更换 + */ + timRenderInstance.TIMSetUserSigExpiredCallback({ + callback: (...args) => {callback({ type: 'TIMSetUserSigExpiredCallback', data: args })}, + userData: "" + }) + + + /** + * @brief 1.13 设置添加好友的回调 + * @param cb 添加好友回调,请参考[TIMOnAddFriendCallback](TIMCloudCallback.h) + * @param user_data 用户自定义数据,ImSDK只负责传回给回调函数cb,不做任何处理 + * + * @note + * 此回调为了多终端同步。例如A设备、B设备都登录了同一帐号的ImSDK,A设备添加了好友,B设备ImSDK会收到添加好友的推送,ImSDK通过此回调告知开发者。 + */ + timRenderInstance.TIMSetOnAddFriendCallback({ + callback: (...args) => { + console.log('=====添加好友=====', args) + callback({ type: 'TIMSetOnAddFriendCallback', data: args }) + }, + userData: "" + }) + + + /** + * @brief 1.14 设置删除好友的回调 + * @param cb 删除好友回调,请参考[TIMOnDeleteFriendCallback](TIMCloudCallback.h) + * @param user_data 用户自定义数据,ImSDK只负责传回给回调函数cb,不做任何处理 + * + * @note + * 此回调为了多终端同步。例如A设备、B设备都登录了同一帐号的ImSDK,A设备删除了好友,B设备ImSDK会收到删除好友的推送,ImSDK通过此回调告知开发者。 + */ + timRenderInstance.TIMSetOnDeleteFriendCallback({ + callback: (...args) => {callback({ type: 'TIMSetOnDeleteFriendCallback', data: args })}, + userData: "" + }) + + /** + * @brief 1.15 设置更新好友资料的回调 + * @param cb 更新好友资料回调,请参考[TIMUpdateFriendProfileCallback](TIMCloudCallback.h) + * @param user_data 用户自定义数据,ImSDK只负责传回给回调函数cb,不做任何处理 + * + * @note + * 此回调为了多终端同步。例如A设备、B设备都登录了同一帐号的ImSDK,A设备更新了好友资料,B设备ImSDK会收到更新好友资料的推送,ImSDK通过此回调告知开发者。 + */ + timRenderInstance.TIMSetUpdateFriendProfileCallback({ + callback: (...args) => {callback({ type: 'TIMSetUpdateFriendProfileCallback', data: args })}, + userData: "" + }) + + + /** + * @brief 1.16 设置好友添加请求的回调 + * @param cb 好友添加请求回调,请参考[TIMFriendAddRequestCallback](TIMCloudCallback.h) + * @param user_data 用户自定义数据,ImSDK只负责传回给回调函数cb,不做任何处理 + * + * @note + * 当前登入用户设置添加好友需要确认时,如果有用户请求加当前登入用户为好友,会收到好友添加请求的回调,ImSDK通过此回调告知开发者。如果多终端登入同一帐号,每个终端都会收到这个回调。 + */ + timRenderInstance.TIMSetFriendAddRequestCallback({ + callback: (...args) => { + console.log('=====添加好友请求=====', JSON.parse(args[0][0])); + callback({ + type: 'TIMSetFriendAddRequestCallback', + data: JSON.parse(args[0][0]) + }) + }, + userData: "" + }) + + + /** + * @brief 1.17 设置好友申请删除的回调 + * @param cb 好友申请删除回调,请参考[TIMFriendApplicationListDeletedCallback](TIMCloudCallback.h) + * @param user_data 用户自定义数据,ImSDK只负责传回给回调函数cb,不做任何处理 + * + * @note + * 1. 主动删除好友申请 + * 2. 拒绝好友申请 + * 3. 同意好友申请 + * 4. 申请加别人好友被拒绝 + */ + timRenderInstance.TIMSetFriendApplicationListDeletedCallback({ + callback: (...args) => {callback({ type: 'TIMSetFriendApplicationListDeletedCallback', data: args })}, + userData: "" + }) + + /** + * @brief 1.18 设置好友申请已读的回调 + * @param cb 好友申请已读回调,请参考[TIMFriendApplicationListReadCallback](TIMCloudCallback.h) + * @param user_data 用户自定义数据,ImSDK只负责传回给回调函数cb,不做任何处理 + * + * @note + * 如果调用 setFriendApplicationRead 设置好友申请列表已读,会收到这个回调(主要用于多端同步) + */ + + timRenderInstance.TIMSetFriendApplicationListReadCallback({ + callback: (...args) => {callback({ type: 'TIMSetFriendApplicationListReadCallback', data: args })}, + userData: "" + }) + + + /** + * @brief 1.19 设置黑名单新增的回调 + * @param cb 黑名单新增的回调,请参考[TIMFriendBlackListAddedCallback](TIMCloudCallback.h) + * @param user_data 用户自定义数据,ImSDK只负责传回给回调函数cb,不做任何处理 + * + */ + timRenderInstance.TIMSetFriendBlackListAddedCallback({ + callback: (...args) => {callback({ type: 'TIMSetFriendBlackListAddedCallback', data: args })}, + userData: "" + }) + + /** + * @brief 1.20 设置黑名单删除的回调 + * @param cb 黑名单删除的回调,请参考[TIMFriendBlackListDeletedCallback](TIMCloudCallback.h) + * @param user_data 用户自定义数据,ImSDK只负责传回给回调函数cb,不做任何处理 + * + */ + timRenderInstance.TIMSetFriendBlackListDeletedCallback({ + callback: (...args) => {callback({ type: 'TIMSetFriendBlackListDeletedCallback', data: args })}, + userData: "" + }) + + + /** + * @brief 1.22 设置消息在云端被修改后回传回来的消息更新通知回调 + * @param cb 消息更新回调,请参考[TIMMsgUpdateCallback](TIMCloudCallback.h) + * @param user_data 用户自定义数据,ImSDK只负责传回给回调函数cb,不做任何处理 + * + * @note + * > 当您发送的消息在服务端被修改后,ImSDK会通过该回调通知给您 + * > 您可以在您自己的服务器上拦截所有即时通信IM消息 [发单聊消息之前回调](https://cloud.tencent.com/document/product/269/1632) + * > 设置成功之后,即时通信IM服务器会将您的用户发送的每条消息都同步地通知给您的业务服务器。 + * > 您的业务服务器可以对该条消息进行修改(例如过滤敏感词),如果您的服务器对消息进行了修改,ImSDK就会通过此回调通知您。 + */ + timRenderInstance.TIMSetMsgUpdateCallback({ + callback: (...args) => {callback({ type: 'TIMSetMsgUpdateCallback', data: args })}, + userData: "" + }) + timRenderInstance.TIMOnInvited({ + callback:(data)=>{ + callback({ + type: 'TIMOnInvited', + data: data + }) + } + }) + timRenderInstance.TIMOnRejected({ + callback:(data)=>{ + callback({ + type: 'TIMOnRejected', + data: data + }) + } + }) + timRenderInstance.TIMOnAccepted({ + callback:(data)=>{ + callback({ + type: 'TIMOnAccepted', + data: data + }) + } + }) + timRenderInstance.TIMOnCancelled({ + callback:(data)=>{ + callback({ + type: 'TIMOnCancelled', + data: data + }) + } + }) + + timRenderInstance.TIMOnTimeout({ + callback:(data)=>{ + callback({ + type: 'TIMOnTimeout', + data: data + }) + } + }) + } +} + +export default { timRenderInstance, initListeners: IMListeners.initListeners } \ No newline at end of file diff --git a/src/renderer/src/plugins/imChat/index.js b/src/renderer/src/plugins/imChat/index.js new file mode 100644 index 0000000..bb2250b --- /dev/null +++ b/src/renderer/src/plugins/imChat/index.js @@ -0,0 +1,349 @@ +/** + * @description imChat 腾讯-即时通讯(无ui) + * 文档地址:https://cloud.tencent.com/document/product/269/75285 + * 文档地址:https://cloud.tencent.com/document/product/269/63007 (electron) + * @author: zdg + * @date 2023-07-03 + */ +// const TimRender = require('im_electron_sdk/dist/render') +import * as TYPES from './enumbers' // sdk相关枚举 +import MsgEnum from './msgEnum' // 消息相关枚举(自定义) +import IMListeners from './imLiseners' // im消息-监听器 +// @ts-ignore +const API = window.api +// TIM生成签名 +// import * as GenerateUserSig from './userSig' // 引入签名生成器 +const isDev = process.env.NODE_ENV == 'development' // 环境 +export class ImChat { + timChat // imChat对象 + SDKAppID // sdkID + secretKey // key + userID // 用户id + timGroupId // 群组id + userSig // 签名 + status = { // 状态 + isLogin: false, // 是否登录 + isConnect: false, // 是否连接 + } + defOption = { // 默认配置 + // 日志等级-全量日志 + log_level: TYPES.TIMLogLevel.kTIMLog_Off, + // 群组类型-会议群(Meeting),成员上限 6000 人 + group_type: TYPES.TIMGroupType.kTIMGroup_ChatRoom, + } + + + /** + * @description 构造函数 + * @param {number} SDKAppID + * @param {string} userSig + * @param {string} userID + * @param {boolean} isInit + */ + constructor(SDKAppID, userSig, userID, isInit) { + this.SDKAppID = SDKAppID + this.userSig = userSig + this.userID = userID + // window.test = this + if (isInit) this.init() + } + // 设置配置 + async setConfig() { + const log_level = TYPES.TIMLogLevel.kTIMLog_Error + await this.timChat.TIMSetConfig({ // TIMSetConfigParam + json_config: { // JSONCongfig + set_config_log_level: log_level, + set_config_callback_log_level: log_level, + set_config_is_log_output_console: true, + // set_config_user_config: { // 用户配置 + // user_config_is_read_receipt: true, // true表示要收已读回执事件 + // user_config_is_sync_report: true, // true表示服务端要删掉已读状态 + // user_config_is_ignore_grouptips_unread: true, // true表示群tips不计入群消息已读计数 + // user_config_is_is_disable_storage: false, // 是否禁用本地数据库,true表示禁用,false表示不禁用。默认是false + // user_config_group_getinfo_option // 获取群组信息默认选项 + // user_config_group_member_getinfo_option // 获取群组成员信息默认选项 + // }, + // set_config_user_define_data // 自定义数据,如果需要,初始化前设置 + }, + user_data: '', + }) + // 日志监听 + this.timChat.TIMSetLogCallback({ + callback: data => { + const [type, log] = data + if (type == log_level) { // 打印对应日志 + this.setConsole('%cchat-log ', log) + } + }, + user_data: '' + }) + } + // 初始化-imChat + init() { + return new Promise(async(resolve, reject) => { + try { + if(!API) reject('preload api获取失败, 初始化-未完成') + // this.timChat = await API.getTimRender() + this.timChat = IMListeners.timRenderInstance + const code = await this.timChat.TIMInit() + if (code == 0) { // 初始化成功 + this.setConsole('%cim-chat: init', '初始化成功') + this.status.isConnect = true + // this.setConfig() // 设置日志级别 + resolve(this) + } else { // 失败:具体请看code + console.error('[im-chat]:初始化失败', code) + reject(code) + } + } catch (error) {reject(error)} + }) + } + // 生成签名 + genTestUserSig() { + // const options = { + // SDKAppID: this.SDKAppID, + // secretKey: this.secretKey, + // userID: this.userID, + // } + // const { userSig } = GenerateUserSig.genTestUserSig(options) + // this.userSig = userSig + } + /** + * @description 监听消息 + * @param {Function} callback + */ + watch(callback) { + // // 先移除监听 + // this.timChat.TIMRemoveRecvNewMsgCallback() + // // 消息监听 + // this.timChat.TIMAddRecvNewMsgCallback({ + // callback, user_data: this.toStr('msg') + // }) + // // 群消息监听 + // // 群组系统消息事件包括 加入群、退出群、踢出群、设置管理员、取消管理员、群资料变更、群成员资料变更。此消息是针对所有群组成员下发的 + // this.timChat.TIMSetGroupTipsEventCallback({ + // // callback, user_data: this.toStr('msg-group') + // callback: (data) => { + // // console.log('群消息', group_tips_event) + // this.setConsole('%c群消息', data) + // }, + // }) + if (this.timChat && this.status.isConnect) { // 连接成功允许监听 + this.setConsole('%cim-chat: watch', '监听成功') + IMListeners.initListeners(callback) + } else { + this.setConsole('%cim-chat: watch', '监听失败, 未连接') + } + } + // 登录 + login() { + const fn = async (resolve, reject) => { + const option = { + userID: this.userID, + userSig: this.userSig, + } + // 获取登录状态 + // [1,2,3,4] | [已登陆,登录中,未登录,登出中] + // console.log('登录', this) + const status = await this.timChat.TIMGetLoginStatus() + if (status == 3) { // 未登录 + const res = await this.timChat.TIMLogin(option) + if (res && res.code == 0) { + // console.log('登录成功', res) + this.setConsole('%cim-chat: login', '登录成功') + this.status.isLogin = true + resolve({status:0, msg:'登录成功', data:res}) + } else reject(res) + } else { + if (status == 1) { // 已登录 + this.setConsole('%cim-chat: login', '已登录') + resolve({status, msg:'已登录'}) + } else if (status == 2) { // 登录中 + this.setConsole('%cim-chat: login', '登录中') + resolve({status, msg:'登录中'}) + } else if (status == 4) { // 登出中 + this.setConsole('%cim-chat: login', '登出中') + resolve({status, msg:'登出中'}) + } + } + + } + return new Promise(fn) + } + // 登出 + logout() { + if (!this.timChat) return + return this.timChat.TIMLogout().then(res => { + this.setConsole('%cim-chat: logout', '登出成功') + this.status.isLogin = false + this.status.isConnect = false + this.timChat.TIMUninit() // 反初始化 + return res + }).catch(error => { + this.setConsole('%cim-chat: logout', '登出失败', error) + return error + }) + } + /** + * @description 创建群组 群名和初始成员 userID + * @param {any} name + * @param {any[]} memberList + */ + createGroup(name, memberList=[]) { + if (!this.timChat) return + if (!!this.timGroupId) return console.log('群组已存在') + // 转换初始成员id,userID 转 group_member_info_identifier + if (memberList && memberList.length) { + memberList = memberList.map(o => ({group_member_info_identifier:o.userID})) + } + const option = { // CreateGroupParams + params: { // GroupParams + // create_group_param_group_name: 群组名称(必填) + // create_group_param_group_id: 群组ID,不填时创建成功回调会返回一个后台分配的群ID + // create_group_param_group_type 群组类型,默认为Public + // create_group_param_group_member_array 群组初始成员数组 + // create_group_param_notification 群组公告 + // create_group_param_introduction 群组简介 + // create_group_param_face_url 群组头像URL + // create_group_param_add_option 加群选项,默认为Any + // create_group_param_max_member_num 群组最大成员数 + // create_group_param_custom_info 请参考自定义字段 + create_group_param_group_name: name, + create_group_param_group_type: this.defOption.group_type, + create_group_param_max_member_num: 200, + create_group_param_group_member_array: memberList + }, + data: '', // 用户自定义数据 + } + // @TGS#3XVNI6ZOG + return this.timChat.TIMGroupCreate(option).then(res => { + if (res && res.code == 0) { + this.setConsole('%c创建群组成功', res) + const timGroupId = res?.json_param?.create_group_result_groupid + if (!!timGroupId && timGroupId != 'undefined'){ + // this.setConsole('%c创建群组成功', timGroupId) + this.timGroupId = timGroupId + // this.setGroupMsgReceive() + } + } + return res + }) + } + // 删除群组 + deleteGroup(timGroupId) { + const groupId = timGroupId || this.timGroupId + if (!groupId) return + return this.timChat.TIMGroupDelete({ + groupId, + data: '', // 用户自定义数据 + }) + } + /** + * @description 设置群消息接收 + * @param {string} timGroupId + */ + setGroupMsgReceive(timGroupId) { + if (!this.timGroupId) this.timGroupId = timGroupId || '' + if (!this.timGroupId) return console.log('timGroupId为空') + return this.timChat.TIMMsgSetGroupReceiveMessageOpt({ + groupId: this.timGroupId, + opt: TYPES.TIMReceiveMessageOpt.kTIMRecvMsgOpt_Receive, + data: '', // 用户自定义数据 + }) + } + // 获取群组列表 + getGroupList() { + return this.timChat.TIMGroupGetJoinedGroupList().then(res => { + console.log('获取群组列表', res) + return res + }).catch(error => { + console.log('获取群组列表失败', error) + return error + }) + } + /** + * @description 发送消息 + * @param {any} conv_id + * @param {any} msg + */ + sendMsg(conv_id, msg) { + if (!conv_id) return console.log('conv_id为空') + if (typeof msg == 'object') msg = JSON.stringify(msg) + const option = { + conv_id, + conv_type: TYPES.TIMConvType.kTIMConv_Group, + params: { + message_elem_array: [{ + elem_type: TYPES.TIMElemType.kTIMElem_Text, + text_elem_content: msg + }], + // message_conv_id: conv_id, + // message_conv_type: TYPES.TIMConvType.kTIMConv_Group, + // message_sender: this.userID + }, + user_data: '', // 用户自定义数据 + // callback: (data) => {} + } + // console.log('发送消息', option) + this.setConsole('%cim-chat: 发送消息【req】', conv_id, msg) + return this.timChat.TIMMsgSendMessageV2(option).then(res => { + this.setConsole('%cim-chat: 发送消息【res】', JSON.stringify(res)) + return res + }) + } + /** + * @description 发送群消息 + * @param {any} msg + * @param {*} head + * @param {*} type + */ + sendMsgGroup(msg, head, type) { + const msgObj = this.getMsgObj(head, msg, type) + // console.log('发送群消息', msgObj) + return this.sendMsg(this.timGroupId, msgObj) + } + // 发送关闭(下课)消息 + sendMsgClosed(){ + const msg = this.getMsgObj(MsgEnum.HEADS.MSG_closed, '下课') + return this.sendMsg(this.timGroupId, msg) + } + /** + * @description 获取消息对象 + * @param {string} msgHead + * @param {string} msg + * @param {string} type + * @param {string|number} sender + */ + getMsgObj(msgHead, msg, type, sender, option={}) { + if (!msgHead) throw new Error('msgHead is required') + if (!msg) throw new Error('msg is required') + if (typeof msg === 'object') msg = JSON.stringify(msg) + return { + msgKey: msgHead, + msgcontent: msg, + msgType: type || MsgEnum.TYPES.TEACHER, // 默认为老师 + senduserid: sender ?? this.userID, + ...option + } + } + /** + * @description 设置控制台样式 + * @param {string} hearStr + * @param {string[]} args + */ + setConsole(hearStr,...args) { + const css = 'color: #fff;background-color:#2ccb92;padding:3px 5px;border-radius:3px;' + const time = new Date().toLocaleTimeString() + if (!hearStr) hearStr = '%c' + time + console.log(hearStr, css, ...args) + } + /** + * @description 获取数据字符串 + * @param {*} data + * @returns + */ + toStr = (data) => { + if (typeof data === 'string') data = {type: data} + return JSON.stringify(data) + } +} \ No newline at end of file diff --git a/src/renderer/src/plugins/imChat/msgEnum.js b/src/renderer/src/plugins/imChat/msgEnum.js new file mode 100644 index 0000000..da8e486 --- /dev/null +++ b/src/renderer/src/plugins/imChat/msgEnum.js @@ -0,0 +1,137 @@ +/** + * @description 消息枚举 + * @author zdg + * @date 2021-07-05 14:07:01 + */ + +export class MsgEnum { + /** + * @description: 消息类型 + * + * | 名称 | 含义 | 值(enum) | + * | ---- | ---- | ---- | + * | SYSTEM | 系统消息 | system | + * | TEACHER | 老师消息 | teacher | + * | STUDENT | 学生消息 | student | + * | NOTICE | 通知消息 | notice | + */ + static TYPES = { + /** @desc: 系统消息 */ + SYSTEM: 'system', + /** @desc: 老师消息 */ + TEACHER: 'teacher', + /** @desc: 学生消息 */ + STUDENT: 'student', + /** @desc: 通知消息 */ + NOTICE: 'notice' + } + /** + * @description: 消息头-类型 + * + * | 名称 | 含义 | 值(enum) | + * | ---- | ---- | ---- | + * | --- | 以下为旧定义-消息头 | --- | + * | MSG_closed | 结束课程(下课) | closed | + * | MSG_onlineStatus | 在线状态 | onlineStatus | + * | MSG_pushQuizOfClassWorkdata2Public | 老师端:把选中的学生习题作业,推到大屏 | pushQuizOfClassWorkdata2Public | + * | MSG_pushClassWorkdata2Public | 老师端:把选中的学生作业,推到大屏 | pushClassWorkdata2Public | + * | MSG_shareStudentPresentdata2All | 把某个学生的展示成果数据推给全班所有学生 | shareStudentPresentdata2All | + * | MSG_pushStudentPresentdata2Public | 老师端:课堂展示活动,把选中的学生展示数据,推到大屏 | pushStudentPresentdata2Public | + * | MSG_pushClassWorkPresentList2Public | 老师端:课堂展示活动,任务列表,推到大屏 | pushClassWorkPresentList2Public | + * | MSG_activePageType | 课标研读-分页切换 | activePageType | + * | MSG_slideFlapping | 幻灯片-切换 | slideFlapping | + * | MSG_anmationclick | 幻灯片-动画切换 | anmationclick | + * | MSG_classcourseopen | 群组创建成功 | classcourseopen | + * | MSG_classquizfeedback | 学生的测练结果反馈 | classquizfeedback | + * | MSG_classtaskfeedback | 老师端:接收到学生反馈消息-课堂测练中的其他任务 | classtaskfeedback | + * | MSG_studentfeedback | 老师端:学生反馈的消息,具体要看其中的feedbackkey,类别较繁杂 | studentfeedback | + * | MSG_studentfeedbackcancel | 老师端:学生反馈的消息取消,如取消学会了,取消困惑 | studentfeedbackcancel | + * | MSG_classshowdata | 学生提交的课堂展示数据-要在老师端显示,再由老师选择推送到公屏上 | classshowdata | + * | MSG_classWorkOfPresentDataUpdate | 学生在公屏上展示并完善后,保存后,老师端要更新 | classWorkOfPresentDataUpdate | + * | MSG_classlecturePagesrc | 课堂讲授活动,选择不同的内容 | classlecturePagesrc | + * | --- | 以下为新定义-消息头 | --- | + * | MSG_0001 | 点赞 | 0x0001 | + * | MSG_0002 | xx | 0x0002 | + * | MSG_0003 | xx | 0x0003 | + */ + static HEADS = { + // === 旧定义-消息头(兼容以前) === + /** @desc: 结束课程(下课) */ + MSG_closed : 'closed', + /** @desc: 在线状态 */ + MSG_onlineStatus : 'onlineStatus', + /** @desc: 老师端:把选中的学生习题作业,推到大屏 */ + MSG_pushQuizOfClassWorkdata2Public : 'pushQuizOfClassWorkdata2Public', + /** @desc: 老师端:把选中的学生作业,推到大屏 */ + MSG_pushClassWorkdata2Public : 'pushClassWorkdata2Public', + /** @desc: 把某个学生的展示成果数据推给全班所有学生 */ + MSG_shareStudentPresentdata2All : 'shareStudentPresentdata2All', + /** @desc: 老师端:课堂展示活动,把选中的学生展示数据,推到大屏 */ + MSG_pushStudentPresentdata2Public : 'pushStudentPresentdata2Public', + /** @desc: 老师端:课堂展示活动,任务列表,推到大屏 */ + MSG_pushClassWorkPresentList2Public : 'pushClassWorkPresentList2Public', + /** @desc: 课标研读-分页切换 */ + MSG_activePageType : 'activePageType', + /** @desc: 幻灯片-切换 */ + MSG_slideFlapping : 'slideFlapping', + /** @desc: 幻灯片-动画切换 */ + MSG_anmationclick : 'anmationclick', + /** @desc: 群组创建成功 */ + MSG_classcourseopen : 'classcourseopen', + /** @desc: 学生的测练结果反馈 */ + MSG_classquizfeedback : 'classquizfeedback', + /** @desc: 老师端:接收到学生反馈消息-课堂测练中的其他任务 */ + MSG_classtaskfeedback : 'classtaskfeedback', + /** @desc: 老师端:学生反馈的消息,具体要看其中的feedbackkey,类别较繁杂 */ + MSG_studentfeedback : 'studentfeedback', + /** @desc: 老师端:学生反馈的消息取消,如取消学会了,取消困惑 */ + MSG_studentfeedbackcancel : 'studentfeedbackcancel', + /** @desc: 学生提交的课堂展示数据-要在老师端显示,再由老师选择推送到公屏上 */ + MSG_classshowdata : 'classshowdata', + /** @desc: 学生在公屏上展示并完善后,保存后,老师端要更新 */ + MSG_classWorkOfPresentDataUpdate : 'classWorkOfPresentDataUpdate', + /** @desc: 课堂讲授活动,选择不同的内容 */ + MSG_classlecturePagesrc : 'classlecturePagesrc', + // === 新定义-消息头 === + /** @desc: 点赞 */ + MSG_0001: 0x0001, + /** @desc: 疑惑 */ + MSG_0002: 0x0002, + MSG_0003: 0x0003, + MSG_0004: 0x0004, + MSG_0005: 0x0005, + MSG_0006: 0x0006, + MSG_0007: 0x0007, + MSG_0008: 0x0008, + MSG_0009: 0x0009, + MSG_0010: 0x000a, + MSG_0011: 0x000b, + MSG_0012: 0x000c, + MSG_0013: 0x000d, + MSG_0014: 0x000e, + MSG_0015: 0x000f, + /** @desc: 作业推送 */ + MSG_0016: 0x0010, + MSG_0017: 0x0011, + MSG_0018: 0x0012, + MSG_0019: 0x0013, + MSG_0020: 0x0014, + MSG_0021: 0x0015, + MSG_0022: 0x0016, + MSG_0023: 0x0017, + MSG_0024: 0x0018, + MSG_0025: 0x0019, + MSG_0026: 0x001a, + MSG_0027: 0x001b, + MSG_0028: 0x001c, + MSG_0029: 0x001d, + MSG_0030: 0x001e, + MSG_0031: 0x001f, + MSG_0032: 0x0020, + MSG_0033: 0x0021, + MSG_0034: 0x0022, + MSG_0035: 0x0023, + } +} + +export { MsgEnum as default } \ No newline at end of file diff --git a/src/renderer/src/plugins/index.js b/src/renderer/src/plugins/index.js new file mode 100644 index 0000000..8b5c431 --- /dev/null +++ b/src/renderer/src/plugins/index.js @@ -0,0 +1,18 @@ +// import tab from './tab' +// import auth from './auth' +// import cache from './cache' +import modal from './modal' +// import download from './download' + +export default function installPlugins(app){ + // 页签操作 + // app.config.globalProperties.$tab = tab + // // 认证对象 + // app.config.globalProperties.$auth = auth + // // 缓存对象 + // app.config.globalProperties.$cache = cache + // 模态框对象 + app.config.globalProperties.$modal = modal + // 下载文件 + // app.config.globalProperties.$download = download +} diff --git a/src/renderer/src/plugins/modal.js b/src/renderer/src/plugins/modal.js new file mode 100644 index 0000000..b59e14d --- /dev/null +++ b/src/renderer/src/plugins/modal.js @@ -0,0 +1,82 @@ +import { ElMessage, ElMessageBox, ElNotification, ElLoading } from 'element-plus' + +let loadingInstance; + +export default { + // 消息提示 + msg(content) { + ElMessage.info(content) + }, + // 错误消息 + msgError(content) { + ElMessage.error(content) + }, + // 成功消息 + msgSuccess(content) { + ElMessage.success(content) + }, + // 警告消息 + msgWarning(content) { + ElMessage.warning(content) + }, + // 弹出提示 + alert(content) { + ElMessageBox.alert(content, "系统提示") + }, + // 错误提示 + alertError(content) { + ElMessageBox.alert(content, "系统提示", { type: 'error' }) + }, + // 成功提示 + alertSuccess(content) { + ElMessageBox.alert(content, "系统提示", { type: 'success' }) + }, + // 警告提示 + alertWarning(content) { + ElMessageBox.alert(content, "系统提示", { type: 'warning' }) + }, + // 通知提示 + notify(content) { + ElNotification.info(content) + }, + // 错误通知 + notifyError(content) { + ElNotification.error(content); + }, + // 成功通知 + notifySuccess(content) { + ElNotification.success(content) + }, + // 警告通知 + notifyWarning(content) { + ElNotification.warning(content) + }, + // 确认窗体 + confirm(content) { + return ElMessageBox.confirm(content, "系统提示", { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: "warning", + }) + }, + // 提交内容 + prompt(content) { + return ElMessageBox.prompt(content, "系统提示", { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: "warning", + }) + }, + // 打开遮罩层 + loading(content) { + loadingInstance = ElLoading.service({ + lock: true, + text: content, + background: "rgba(0, 0, 0, 0.7)", + }) + }, + // 关闭遮罩层 + closeLoading() { + loadingInstance.close(); + } +} diff --git a/src/renderer/src/plugins/shareStore.js b/src/renderer/src/plugins/shareStore.js new file mode 100644 index 0000000..3b3c819 --- /dev/null +++ b/src/renderer/src/plugins/shareStore.js @@ -0,0 +1,234 @@ +/** + * 共享数据状态-多窗口 + */ +const isNode = typeof require !== 'undefined' // 是否支持node函数 +const { ipcRenderer } = isNode?require('electron'):{} // app使用 +import { sessionStore } from '@/utils/store' +import CircularJSON from 'circular-json' +import _ from 'lodash' + +// import { diff } from 'jsondiffpatch' +// const Remote = isNode?require('@electron/remote'):{} // 远程模块 + +const exArrs = ['subject'] // 不需要同步key-排除 + +export function shareStorePlugin({store}) { + store.$subscribe((mutation, state) => { // 自动同步 + // mutation 变量包含了变化前后的状态 + // mutation.events: key newValue target oldValue oldTarget + // state 是变化后的状态 + // console.log('store.$subscribe', mutation, state, store) + // 在存储变化的时候执行 + // const storeName = store.$id + const storeName = mutation.storeId + // 用于多窗口共享(需要共享的状态名称) + const names = ['tool'] + if (names.includes(storeName)) stateSyncWatch(storeName, state) // 需要同步 + }) + + // 暴露方法-手动同步 + store.stateSync = (storeName, key, value) => { + const state = store.$state + if (!storeName && !!key && !!value) stateSync(storeName, key, value, state) + else stateSyncAll(store) + } + // 暴露方法-发送当前状态-新窗口 + store.stateSyncInit = wid => stateSyncInit(wid, store) + // 监听主线程消息-同步数据 + stateChange(store) +} + +// 同步数据-发送给主线程-单独 +function stateSync(storeName, key, value, state) { + // console.log('state-change', storeName, key, value) + try { + const { data, keystr } = filterByKey(state, key, value) + const jsonStr = JSON.stringify(data) // 从新组装-json数据 + // 更新本地数据-session + sessionStore.set(keystr, value) + // 通知主线程更新 + ipcRenderer?.invoke('pinia-state-change', storeName, jsonStr) + // console.log('======',keystr, jsonStr ) + } catch (error) { + console.log('state-change-error', error) + } +} +// 同步数据-发送给主线程-单独($subscribe-监听使用) +function stateSyncWatch(storeName, newState) { + const oldState = sessionStore.store // 旧数据 + exArrs.forEach(k => Object.keys(oldState).includes(k) && (delete oldState[k])) + const diffData = findDifferences(oldState, newState) + if(!_.keys(diffData).length) return // 没有变化就终止执行 + // 数据处理: 找出差异 + // console.log('state-change-diffData', diffData) + try { + let pinaValue = {} // store pina状态管理需要的数据格式 + // 数据转换处理 + for(const key in diffData) { + const value = diffData[key] + const newValue = {} // 重新组装pinia需要的数据 {a:{b:1}} 这种 + const keyArr = key.split('.') || [] + keyArr.reduce((o,c,i)=>{o[c] = i === keyArr.length-1 ? value : {};return o[c]}, newValue) + // 合并数据 loadsh _.merge() 函数 + _.merge(pinaValue, newValue) + } + const piniaArr = _.toPairs(pinaValue) // 对象转换为数组 {a:1} toPairs [['a',1]] + const setData = (key, value) => { + // 无数据就终止执行 + if (!key) return + // 更新本地数据-session + // 直接获取当前最新值(整体更新),上面获取到value是差异值,并不能知道删除还是新增 + const newValAll = _.get(newState, key) + const oldValAll = sessionStore.get(key) + // 没变化也终止执行 + if (_.isEqual(oldValAll, newValAll)) return + // 更新本地数据-session + sessionStore.set(key, newValAll) + + // 数据处理: pina-store + const jsonStr = JSON.stringify(pinaValue) // 从新组装-json数据 + // 通知主线程更新 + ipcRenderer?.invoke('pinia-state-change', storeName, jsonStr) + // console.log('======',key, value, jsonStr ) + } + // 数据处理: electron-store + for(let [key, value] of piniaArr) { + setData(key, value) + } + } catch (error) { + console.log('state-change-error', error) + } +} + +// 同步数据-发送给主线程-全量更新 +function stateSyncAll(store) { + const storeName = store.$id + const jsonStr = circularSafeStringify(store.$state) + // 通知主线程更新 + ipcRenderer?.invoke('pinia-state-change', storeName, jsonStr) +} + +// 发送当前数据状态 +function stateSyncInit(wid, store) { + const storeName = store.$id + const curJson = JSON.stringify(store.$state) // 当前数据 + // 发送同步数据给新窗口-更新状态 + ipcRenderer.invoke('pinia-state-init', wid, storeName, curJson) +} + +// 监听session数据变化 +function sessionWatch(store) { + const unsubscribe = sessionStore.onDidAnyChange((newV, oldV) => { + if (newV !== oldV) { + // console.log('session-change', newV, oldV) + // 通知主线程更新 + // ipcRenderer?.invoke('pinia-state-change', storeName, jsonStr) + } + }) + // unsubscribe() 取消监听 +} + +// 同步数据-接收主线程消息 +function stateChange(store) { + const storeName = store.$id + ipcRenderer?.on('pinia-state-set', (e, sName, jsonStr) => { + if (sName == storeName) { // 更新对应数据 + // console.log('state-set', jsonStr, sName) + const curJson = circularSafeStringify(store.$state) // 当前数据 + const isUp = curJson != jsonStr // 不同的时候才写入,不然会导致触发数据变化监听,导致死循环 + if (!isUp) return + const stateJson = JSON.parse(jsonStr) // 新数据 + // 更新状态 + store.$patch(stateJson) + // 您可以通过将其 $state 属性设置为新对象来替换 Store 的整个状态 + // store.$state = stateJson + } + }) +} +//解决JSON.stringify嵌套循环产生的bug +const circularSafeStringify = (obj) => { + const cache = new Set(); + return JSON.stringify(obj, (key, value) => { + if (typeof value === "object" && value !== null) { + if (cache.has(value)) { + // 当前对象已经存在于缓存中,说明存在循环引用,返回占位符或其他处理方式 + return "[Circular Reference]"; + } + cache.add(value); + } + return value; + }); +} + +// 过滤对象 +const filterByKey = (obj, key, value) => { + let res = { data:{}, keystr:'' } + for (let k in obj) { + if (obj.hasOwnProperty(k)) { + const isEqual = JSON.stringify(obj[k]) === JSON.stringify(value) // 值是否相同 + if (k === key && isEqual) { + // 如果匹配,则添加到新对象中 + res.data[k] = obj[k]; + res.keystr = k; + } else { + if (obj[k] !== null && typeof obj[k] === 'object') { + // 如果是对象,则递归处理 + const {data, keystr} = filterByKey(obj[k], key, value) + if(!!keystr) { + res.data[k] = data + res.keystr = `${k}.${keystr}` + } + } + } + } + } + return res; +} + +// 获取对象值 +const getObjValue = (obj, key) => { + +} + +// 找出两个对象之间的差异 +const findDifferences = (obj1, obj2) => { + const differences = {}; + function compareObjects(o1, o2, path = '') { + if (o1 == null) return + if (o2 == null) return + for (const key in o1) { + if (o1.hasOwnProperty(key)) { + const newPath = path ? `${path}.${key}` : key; + if(!o2) return + if (o2.hasOwnProperty(key)) { + const v1 = toJsonStr(o1[key]) + const v2 = toJsonStr(o2[key]) + if (typeof o1[key] === 'object' && typeof o2[key] === 'object' && !Array.isArray(o1[key])) { + compareObjects(o1[key], o2[key], newPath); + } else if (v1 !== v2) { + differences[newPath] = o2[key]; + } + } else { + differences[newPath] = o2[key]; + } + } + } + + for (const key in o2) { + if (o2.hasOwnProperty(key) && !o1.hasOwnProperty(key)) { + const newPath = path ? `${path}.${key}` : key; + differences[newPath] = o2[key]; + } + } + } + + compareObjects(objClone(obj1), objClone(obj2)); + // 特殊处理 + + + return differences; +} +// 对象克隆 +const objClone = (obj) => JSON.parse(CircularJSON.stringify(obj)) +// 转换为json +const toJsonStr = (obj) => CircularJSON.stringify(obj) diff --git a/src/renderer/src/router/index.js b/src/renderer/src/router/index.js new file mode 100644 index 0000000..2615d40 --- /dev/null +++ b/src/renderer/src/router/index.js @@ -0,0 +1,135 @@ +/* + * @Author: 苦逼程序猿 + * @Date: 2024-09-06 16:15:32 + * @Warning: 千行代码,Bug露锋芒。 + */ +import { createRouter, createWebHashHistory } from 'vue-router' + +import Layout from '../layout/index.vue' +import { toolRouters } from './tool' + +export const constantRoutes = [ + { + path: '/login', + component: () => import('@/views/login/index.vue'), + // component: ()=> import('../login/index.vue'), + hidden: true + }, + { + path: '/fullscreenpdf', + component: () => import('@/views/fullScreenPdf/index.vue'), + name: 'fullscreenpdf', + meta: {title: '全屏显示PDF'} + }, + { + path: '/teachClassTask', + component: () => import('@/views/classTask/teachClassTask.vue'), + hidden: true + }, + { + path: '/', + component: Layout, + redirect: '/home', + children: [ + { + path: '/home', + component: () => import('@/views/desktop/index.vue'), + name: 'desktop', + meta: {title: '主页'} + }, + { + path: '/homepage', + component: () => import('@/views/homePage/index.vue'), + name: 'homepage', + meta: {title: '主页'} + }, + { + path: '/resource', + component: () => import('@/views/resource/index.vue'), + name: 'resource', + meta: {title: '资源库'} + }, + { + path: '/prepare', + component: () => import('@/views/prepare/index.vue'), + name: 'prepare', + meta: {title: '教学实践'} + }, + { + path: '/teach', + component: () => import('@/views/teach/index.vue'), + name: 'teach', + meta: {title: '授课'} + }, + { + path: '/standardanalysis', + component: () => import('@/views/teach/standardAnalysis/index.vue'), + name: 'standardanalysis', + meta: {title: '课标分析'} + }, + { + path: '/textbookAnalysis', + component: () => import('@/views/textbookAnalysis/index.vue'), + name: 'textbookAnalysis', + meta: {title: '教材分析'} + }, + { + path: '/profile', + component: () => import('@/views/profile/index.vue'), + name: 'profile', + meta: {title: '个人中心'} + }, + { + path: '/testpdf', + component: () => import('@/views/testPdf/index.vue'), + name: 'testpdf', + meta: {title: '测试PDF'} + }, + + { + path: '/classReserv', + component: () => import('@/views/classManage/classReserv.vue'), + name: 'classReserv', + meta: {title: '课程预约'} + }, + { + path: '/class', + component: () => import('@/views/classManage/index.vue'), + name: 'class', + meta: {title: '班级中心'}, + }, + { + path: '/classTaskAssign', + component: () => import('@/views/classTask/classTaskAssign.vue'), + name: 'classTaskAssign', + meta: {title: '作业布置'}, + }, + { + path: '/classTask', + component: () => import('@/views/classTask/classTask.vue'), + name: 'classCorrect', + meta: {title: '作业批改'}, + }, + { + path: '/newClassTask', + component: () => import('@/views/classTask/newClassTask.vue'), + name: 'newClassCorrect', + meta: {title: '作业设计'}, + }, + { + path: '/examReport', + component: () => import('@/views/examReport/index.vue'), + name: 'examReport', + meta: {title: '考试分析'} + }, + ] + }, + ...toolRouters +] + +const router = createRouter({ + history: createWebHashHistory(), //hash 模式 + routes: constantRoutes +}) + +export default router diff --git a/src/renderer/src/router/tool.js b/src/renderer/src/router/tool.js new file mode 100644 index 0000000..ef55df0 --- /dev/null +++ b/src/renderer/src/router/tool.js @@ -0,0 +1,35 @@ +/** + * @description: 工具路由 + * @author: zdg + * @date 2021-07-05 14:07:01 + */ +export const toolRouters = [ + { + path: '/tool', + children: [ + { + path: 'sphere', + component: () => import('@/views/tool/sphere.vue'), + name: 'toolSphere', + meta: {title: '悬浮球'} + }, + { + path: 'test', + component: () => import('@/views/tool/test.vue'), + name: 'toolTest', + meta: {title: '测试'} + }, + ] + }, + { + path: '/classBegins', + children: [ + { + path: 'index', + component: () => import('@/views/classBegins/index.vue'), + name: 'classBegins', + meta: {title: '上课'} + }, + ] + } +] \ No newline at end of file diff --git a/src/renderer/src/store/index.js b/src/renderer/src/store/index.js new file mode 100644 index 0000000..3dfcd54 --- /dev/null +++ b/src/renderer/src/store/index.js @@ -0,0 +1,9 @@ +import { createPinia } from 'pinia' +import piniaPluginPersistedstate from 'pinia-plugin-persistedstate' +import { shareStorePlugin } from '@/plugins/shareStore' + +const pinia = createPinia() //创建pinia实例 +pinia.use(piniaPluginPersistedstate) //将插件添加到 pinia 实例上 +pinia.use(shareStorePlugin) // 多窗口数据状态共享 + +export const store = pinia \ No newline at end of file diff --git a/src/renderer/src/store/modules/classTask.js b/src/renderer/src/store/modules/classTask.js new file mode 100644 index 0000000..f0008cf --- /dev/null +++ b/src/renderer/src/store/modules/classTask.js @@ -0,0 +1,28 @@ +import { defineStore } from 'pinia' +import { } from '@/api/classTask/index.js' +import { listClassmain } from '@/api/classManage/index' + +const useClassTaskStore = defineStore('classTask',{ + state: () => ({ + classListIds: [], + }), + actions: { + listClassmain(params) { + // 获取班级列表 + return new Promise((resolve, reject) => { + listClassmain(params) + .then((res) => { + this.classListIds = res.rows&&res.rows.map((item) => item.id) + resolve(res) + }) + .catch((error) => { + reject(error) + }) + }) + }, + }, + persist: true +}) +export default useClassTaskStore + + diff --git a/src/renderer/src/store/modules/delClass.js b/src/renderer/src/store/modules/delClass.js new file mode 100644 index 0000000..cd91643 --- /dev/null +++ b/src/renderer/src/store/modules/delClass.js @@ -0,0 +1,22 @@ +/* + author: yangws + time: 2024-20-24 17:20:50 + function: 用于删除班级更新主页面 +*/ +import { defineStore } from "pinia" + +const delClassDemo = defineStore( + 'del', + { + state: () => ({ + idDelete: false + }), + actions: { + //删除提醒 + isDelClass(){ + this.idDelete = true + } + } + }) + +export default delClassDemo diff --git a/src/renderer/src/store/modules/overview.js b/src/renderer/src/store/modules/overview.js new file mode 100644 index 0000000..40acf50 --- /dev/null +++ b/src/renderer/src/store/modules/overview.js @@ -0,0 +1,23 @@ +import { defineStore } from 'pinia' +const overviewStore = defineStore( + 'overview', + { + state: () => { + return { + tableList:[], + allData:[] + } + }, + actions: { + getTableList(data){ + this.tableList = [...data] + }, + //整理的所有列表 + getAllData(data){ + this.allData = [...data] + } + } + }) +export default overviewStore + + diff --git a/src/renderer/src/store/modules/route.js b/src/renderer/src/store/modules/route.js new file mode 100644 index 0000000..9275ddd --- /dev/null +++ b/src/renderer/src/store/modules/route.js @@ -0,0 +1,15 @@ +import { defineStore } from 'pinia' + +const routerStore = defineStore('router', { + state: () => ({ + nowRouter: [] + }), + actions: { + setNowRouter(payload) { + this.nowRouter = payload + } + }, + mutations: {}, + persist: true +}) +export default routerStore diff --git a/src/renderer/src/store/modules/thirdTextbook.js b/src/renderer/src/store/modules/thirdTextbook.js new file mode 100644 index 0000000..0c499da --- /dev/null +++ b/src/renderer/src/store/modules/thirdTextbook.js @@ -0,0 +1,23 @@ +import { defineStore } from 'pinia' + +const useThirdStore = defineStore('third', { + state: () => ({ + activeGrade:'', + gradeName:'', + subjectName:'', + textbookVersionId:'' + }), + actions: { + // 登录 + getSelectBookInfo(params){ + this.activeGrade = params.activeGrade + this.gradeName = params.gradeName + this.subjectName = params.subjectName + this.textbookVersionId = params.textbookVersionId + } + + }, + persist: true +}) + +export default useThirdStore diff --git a/src/renderer/src/store/modules/tool.js b/src/renderer/src/store/modules/tool.js new file mode 100644 index 0000000..f2ff2b0 --- /dev/null +++ b/src/renderer/src/store/modules/tool.js @@ -0,0 +1,37 @@ +/** + * 工具类-窗口-状态管理 + */ +import { defineStore } from 'pinia' +import { sessionStore } from '@/utils/store' + +// 默认数据 +const defData = sessionStore.store || {} +const exArrs = ['subject'] +exArrs.forEach(k => Object.keys(defData).includes(k) && (delete defData[k])) + +// 延时 +const sleep = ms => new Promise(resolve => setTimeout(resolve, ms)) + +export const useToolState = defineStore('tool', { + state: () => ({ + model: 'select', // 悬浮球-当前模式 + showBoardAll: false, // 全屏画板-是否显示 + isPdfWin: false, // pdf窗口是否打开 + isToolWin: false, // 工具窗口是否打开 + isTaskWin: false, // 批改窗口是否打开 + curSubjectNode: { + querySearch: {} // 查询资源所需参数 + }, + ...defData // 默认数据-覆盖上面的配置(不要删除, 会导致新窗口-获取状态失败) + }), + actions: { + async resetDef() { // 重置数据-下课 + this.model = 'select' // 悬浮球-当前模式 + await sleep(50) // 休眠50ms + this.showBoardAll = false // 全屏画板-是否显示 + await sleep(50) // 休眠50ms + this.isToolWin = false // 工具窗口是否打开 + await sleep(50) // 休眠50ms + } + } +}) diff --git a/src/renderer/src/store/modules/uploader.js b/src/renderer/src/store/modules/uploader.js new file mode 100644 index 0000000..1f2d01a --- /dev/null +++ b/src/renderer/src/store/modules/uploader.js @@ -0,0 +1,38 @@ +import { defineStore } from 'pinia' +import { ElMessage } from 'element-plus' + +const uploaderStore = defineStore('uploader', { + state: () => ({ + uploadList: [] + }), + actions: { + removeUploadFile(uid) { + for (let i = 0; i < this.uploadList.length; i++) { + if (this.uploadList[i].uid === uid) { + this.uploadList.splice(i, 1) + return + } + } + }, + pushFile(payload) { + let _this = this + let arr = payload.filter((item) => { + const MAX_SIZE = 500 * 1024 * 1024; // 2MB + if (item.size > MAX_SIZE) { + ElMessage.error('文件大小不能超过 100MB!'); + return false; + } + return !isHave(item.uid) + }) + _this.uploadList.push(...arr) + function isHave(uid) { + return _this.uploadList.some((item) => { + return item.uid === uid + }) + } + } + }, + mutations: {}, + persist: true +}) +export default uploaderStore diff --git a/src/renderer/src/store/modules/user.js b/src/renderer/src/store/modules/user.js new file mode 100644 index 0000000..3a45327 --- /dev/null +++ b/src/renderer/src/store/modules/user.js @@ -0,0 +1,105 @@ +import { defineStore } from 'pinia' +import { login, logout, getInfo } from '@/api/login' +import { getToken, setToken, removeToken } from '@/utils/auth' +import defAva from '@/assets/images/user.png' + +const useUserStore = defineStore('user', { + state: () => ({ + token: getToken(), + id: '', + name: '', + avatar: '', + roles: [], + permissions: [], + user: {} + }), + actions: { + // 登录 + login(userInfo) { + const username = userInfo.username.trim() + const password = userInfo.password + const code = userInfo.code + const uuid = userInfo.uuid + return new Promise((resolve, reject) => { + login(username, password, code, uuid) + .then((res) => { + setToken(res.token) + this.token = res.token + resolve(res) + }) + .catch((error) => { + reject(error) + }) + }) + }, + // 获取用户信息 + getInfo() { + return new Promise((resolve, reject) => { + getInfo() + .then((res) => { + // res.user.avatar = import.meta.env.VITE_APP_BASE_API + res.user.avatar + const user = res.user + this.user = user + const avatar = user.avatar == '' || user.avatar == null ? defAva : user.avatar + + if (res.roles && res.roles.length > 0) { + // 验证返回的roles是否是一个非空数组 + this.roles = res.roles + this.permissions = res.permissions + } else { + this.roles = ['ROLE_DEFAULT'] + } + + this.id = user.userId + this.userName = user.userName + this.nickName = user.nickName + this.avatar = avatar + this.userType = user.userType + this.deptId = user.deptId + this.deptName = user.deptName + this.deptLogo = user.deptLogo + this.deptSlogan = user.deptSlogan + this.activeDeptId = user.activeDeptId + this.activeDeptName = user.activeDeptName + this.parentDeptId = user.parentDeptId + this.parentDeptName = user.parentDeptName + this.edusubject = user.edusubject + this.edudegree = user.edudegree + this.edustage = user.edustage + this.userType = user.userType + this.studentId = user.studentId + this.timUserId = user.timuserid + this.plainpwd = user.plainpwd + + this.roles = res.roles + + resolve(res) + }) + .catch((error) => { + reject(error) + }) + }) + }, + // 退出系统 + logOut() { + return new Promise((resolve, reject) => { + logout(this.token) + .then(() => { + this.token = '' + this.roles = [] + this.permissions = [] + localStorage.clear() + removeToken() + resolve() + }) + .catch((error) => { + removeToken() // zdg: 网络异常时,清除前端退出进入登录页 + reject(error) + }) + }) + } + }, + persist: true +}) + +export default useUserStore diff --git a/src/renderer/src/utils/aichat.js b/src/renderer/src/utils/aichat.js new file mode 100644 index 0000000..85dcdc5 --- /dev/null +++ b/src/renderer/src/utils/aichat.js @@ -0,0 +1,80 @@ +import axios from "axios"; +import { getSignature } from "./index"; + +let appId = "01ec9aa3"; +let secret = "M2QxMDAxMjYyYTEzODMwMGRkZTQ4NmUy"; +let timestamp = Math.floor(Date.now() / 1000); +let signature = getSignature(appId, secret, timestamp); + +export function text2Text(data) { + return axios({ + url: "v1/chat/completions", + method: "post", + headers: { + "Content-Type": "application/json", + Authorization: "Bearer yjCwlZCeUtBYvjHAQZdk:FtWNmJSWcZMCmTBQZfoH", + Accept: "*/*", + }, + data: { + model: "4.0Ultra", + messages: data, + stream: false, + }, + }); +} +export function uploadDoc(data) { + return axios({ + url: "openapi/v1/file/upload", + method: "post", + headers: { + "Content-Type": "multipart/form-data", + appId: appId, + timestamp: timestamp, + signature: signature, + }, + data: data, + }); +} +export function queryDocStatus(data) { + return axios({ + url: "openapi/v1/file/status", + method: "post", + headers: { + "Content-Type": "application/form-data", + appId: appId, + timestamp: timestamp, + signature: signature, + }, + data: data + }); +} +export function chatByDoc(fileId, data) { + const wsUrl = `wss://chatdoc.xfyun.cn/openapi/chat?fileId=${fileId}&appId=${appId}×tamp=${timestamp}&signature=${signature}`; + + const ws = new WebSocket(wsUrl); + + ws.onopen = () => { + const messageBody = { + fileIds: [fileId], + messages: data, + chatExtends: { + wikiPromptTpl: + "请将以下内容作为已知信息:\n\n请根据以上内容回答用户的问题。\n问题:\n回答:", + wikiFilterScore: 0.82, + temperature: 0.5, + sparkWhenWithoutEmbedding: false, + }, + }; + + ws.send(JSON.stringify(messageBody)); + }; + + ws.onmessage = (event) => { + const response = JSON.parse(event.data); + console.log("WebSocket 消息:", response); + }; + + ws.onerror = (error) => { + console.error("WebSocket 错误:", error); + }; +} \ No newline at end of file diff --git a/src/renderer/src/utils/auth.js b/src/renderer/src/utils/auth.js new file mode 100644 index 0000000..f15d648 --- /dev/null +++ b/src/renderer/src/utils/auth.js @@ -0,0 +1,15 @@ +import Cookies from 'js-cookie' + +const TokenKey = 'Admin-Token' + +export function getToken() { + return localStorage.getItem(TokenKey) +} + +export function setToken(token) { + return localStorage.setItem(TokenKey, token) +} + +export function removeToken() { + return localStorage.removeItem(TokenKey) +} diff --git a/src/renderer/src/utils/chat.js b/src/renderer/src/utils/chat.js new file mode 100644 index 0000000..aaefa2c --- /dev/null +++ b/src/renderer/src/utils/chat.js @@ -0,0 +1,97 @@ +/** +* 实现单例模式 +*/ +import useUserStore from '@/store/modules/user' +import { ImChat } from '@/plugins/imChat' +import * as http from '@/api/apiService' // 自定义api service + +export class Chat { + instance = null; + sdkAppId = 0; // 应用id + sign = ''; // 签名 + imUserId = ''; // 用户id + imChat = null; // IM实例 + + constructor() { + if (!Chat.instance) { // 存在的时候 + Chat.instance = this; + } + return Chat.instance; + } + /** + * 初始化 获取IM签名 + * @param {*} isInit : 是否初始化IM + * @param {*} isLogin : 是否登录IM + * @param {*} callback: 监听消息回调函数 + * @returns Promise + */ + async init(isInit = true, isLogin = true, callback) { + // 特殊处理,只传1个参数且为函数,则默认为callback,isInit和isLogin默认为true + if (typeof isInit == 'function'){ + callback = isInit + isInit = true + isLogin = true + } + const userStore = useUserStore() + const { timuserid: imUserId } = userStore.user + // 获取腾讯云签名 + const res = await http.imChat.getTxCloudSign({imUserId}) + if (res && res.code == 200) { + const { sdkAppId, sign } = res.data + this.sdkAppId = sdkAppId + this.sign = sign + this.imUserId = imUserId + // 初始化IM + if (isInit) return await this.initIM(isLogin, callback) + } + } + // 初始化IM + async initIM(isLogin, callback) { + const imChat = new ImChat(this.sdkAppId, this.sign, this.imUserId) + this.imChat = imChat + await imChat.init() // 初始化IM + callback && this.listenMsg(callback) // 监听消息 + if(isLogin) await imChat.login() // 登录IM + return imChat + } + // 监听消息 + async listenMsg(callback) { + if (!callback) return + if (!this.imChat) return + await this.imChat?.watch(msg => callback(msg)) + } + // 解散群 + async dismissGroup(groupId) { + if (!this.imChat) return + await this.imChat?.deleteGroup(groupId) + } + // 退出登录 + async logout() { + if (!this.imChat) return + await this.imChat?.logout() + this.imChat = null + } + // 发群消息 + async sendMsg(conv_id, msg) { + if (!this.imChat) return + await this.imChat?.sendMsg(conv_id, msg) + } + // 发群消息 + async sendMsgGroup(msg, head, type) { + if (!this.imChat) return + this.imChat?.sendMsgGroup(msg, head, type) + } + // 发群消息 + async sendMsgGroupId(groupId, msg, head, type) { + if (!this.imChat) return + const msgObj = this.imChat?.getMsgObj(head, msg, type) + this.imChat?.sendMsg(groupId, msgObj) + } + // 获取群列表 + async getGroupList() { + if (!this.imChat) return + return await this.imChat?.getGroupList() + } +} + +export default new Chat() diff --git a/src/renderer/src/utils/comm.js b/src/renderer/src/utils/comm.js new file mode 100644 index 0000000..a0d457f --- /dev/null +++ b/src/renderer/src/utils/comm.js @@ -0,0 +1,353 @@ + +/** + * @description 公共工具类 + * @author zdg + * @date 2024-4-26 + */ + +// ============= 文件工具--相关 =================== +/** + * 获取上传文件 + */ +export function getFiles() { + const cb = resolve => { + const fileDom = document.createElement('input') + fileDom.type = 'file' + fileDom.onchange = e => { + resolve(e.target.files) + return fileDom.remove() + } + fileDom.click() + } + return new Promise(cb) +} + +// ============= 数学公式--相关 =================== +/** + * @description 计算两点直线距离 (获取直径) + * (欧几里得距离公式): [ \text{distance} = \sqrt{(x2 - x1)^2 + (y2 - y1)^2} ] + * @param {*} x1 + * @param {*} y1 + * @param {*} x2 + * @param {*} y2 + */ +export function getDistance(x1,y1,x2,y2) { + return Math.sqrt(Math.pow((x2 - x1), 2) + Math.pow((y2 - y1), 2)) +} +// 获取半径 +export function getRadius(x1,y1,x2,y2) { return getDistance(x1,y1,x2,y2) / 2 } + +/** + * 计算某个值在总数中所占的百分比。 + * + * 此函数用于根据给定的值和总数,计算该值占总数的百分比。它还支持指定百分比的小数位数。 + * 如果计算结果小于0,则返回0;如果大于100,则返回100,以确保百分比的合理范围。 + * + * @param {number} v - 待计算的值。 + * @param {number} total - 总数。 + * @param {number} [step=2] - 百分比的小数位数,默认为2。 + * @returns {number} - 返回计算后的百分比,保证在0到100之间。 + */ +export function getPercent(v, total, step=2) { + !v && (v = 0) + !total && (total = 1) + // 计算百分比,保留指定的小数位,并转换为数字类型 + let res = (v / total * 100).toFixed(step)-0 + + // 确保百分比在0到100之间 + return res < 0 ? 0 : res > 100 ? 100 : res +} + +// ============= 格式化--相关 =================== + +/** + * @description 手机号隐藏中间几位 + * @param {*} phone 手机号 + * @param {*} start 前面保留几位 默认 3位 + * @param {*} end 后面保留几位 默认 3位 + * @param {*} rstr 替换字符 默认 **** + * @returns + */ +export function phoneHideFormat(phone, start = 3, end = 4, rstr = '****') { + // const reg = /^(\d{3})\d*(\d{4})$/ + if (!phone) return '' + const reg = new RegExp(`(\\d\{${start}\})\\d*(\\d\{${end}\})`) + return phone.replace(reg, `$1${rstr}$2`) +} + +// ============= 习题工具--相关 =================== +/** + * @description 将字符串转换为数组 + * @param {*} str + * @returns + */ +export function quizStrToList(str = '') { + if (!str) return [] + let resList = [] + if (isJson(str, true)) resList = JSON.parse(str) // 数组对象 + else if (str.includes('#&')) resList = str.split('#&') // 字符串数组 #& + else if (str.includes(',')) resList = str.split(',') // 字符串数组 , + else resList = [str] + return resList +} + +// ============= 常用工具--相关 =================== + +export function isJson(str, isArray = false) { + if(typeof str == 'string'){ + try { + const res = JSON.parse(str) + let isBool = typeof res == 'object' && res + if(isBool && isArray) isBool = Array.isArray(res) + return isBool + } catch (error) {} + } + return false +} + +//获取临时唯一ID +export const generateUniqueID = ()=> { + const date = new Date(); + const timestamp = date.getTime().toString(36); // 使用36进制转换时间戳 + const random = Math.random().toString(36).substring(2, 9); // 获取随机数的一部分并转换为36进制 + return timestamp + random; +} + +// 清理参数中的undefined、null +export const removePropertyOf = function(obj){ + Object.keys(obj).forEach(item=>{ + if(obj[item] === undefined || obj[item] === null) delete obj[item] + }) + return obj; +} + +/** + * 移除children 为空 -- tree + */ +export function removeTree(list) { + var this_ = this + for (var i in list) { + if (list[i].children.length == 0) { + list[i].children = undefined + } else { + this_.removeTree(list[i].children) + } + } + return list +} + +// ============= 校验工具--相关 =================== + +// url校验 +export const validateUrl = (url) => { + const regex = /^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/; + if (!regex.test(url.trim())) { + return false; + } else { + return true; + } +} + +// ============= 时间工具--相关 =================== + +/** + * @description 时间 秒 转化 时分秒 + * @param {*} seconds + * @returns + */ +export function formatTime(seconds) { + seconds = parseInt(seconds) // 转换整数 + const h = (Math.floor(seconds / 3600)+'').padStart(2,'0') + const m = (Math.floor((seconds % 3600) / 60)+'').padStart(2,'0') + const s = ((seconds % 60)+'').padStart(2,'0') + return `${h}:${m}:${s}` +} + +/** + * @description 时间格式化 + * @param {*} time + * @param {*} fmt + * @returns + */ +export function formatDate(time, fmt = 'yyyy-MM-dd') { + let date + if (time) { + if (typeof time === 'object') { + date = time + } else { + if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) { + time = parseInt(time) + } + if ((typeof time === 'number') && (time.toString().length === 10)) { + time = time * 1000 + } + date = new Date(time) + } + } else { + date = new Date() + } + if (/(y+)/.test(fmt)) { + fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length)) + } + const o = { + 'M+': date.getMonth() + 1, + 'd+': date.getDate(), + 'h+': date.getHours(), + 'm+': date.getMinutes(), + 's+': date.getSeconds(), + 'a': date.getDay() + } + for (const k in o) { + if (new RegExp(`(${k})`).test(fmt)) { + if (k === 'a') { + const str = ['日', '一', '二', '三', '四', '五', '六'][o[k]] + fmt = fmt.replace(RegExp.$1, str) + continue + } + const str = o[k] + '' + // fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? str : padLeftZero(str)) + fmt = fmt.replace(RegExp.$1, str.padStart(2, '0')) + } + } + return fmt +} +/** + * 快速获取日期 + * num: 1 今日 2 昨日 3 本周 4 上周 5 本月 + * bool: true 有时分秒 false | null 不要时分秒 + */ +export function getDateStr(num, bool) { + let now = new Date() // 当前日期 + let nowDayOfWeek = now.getDay() // 今天本周的第几天 + let nowDay = now.getDate() // 当前日 + let nowMonth = now.getMonth() // 当前月 + let nowYear = now.getYear() // 当前年 + nowYear += (nowYear < 2000) ? 1900 : 0 // + let monthStartDate = new Date(nowYear, nowMonth, 1) + let monthEndDate = new Date(nowYear, nowMonth + 1, 1) + let days = (monthEndDate - monthStartDate) / (1000 * 60 * 60 * 24) + + let fmt = 'yyyy-MM-dd' + let startTime = '' + let endTime = '' + + if (num == 1) { // 今日 + startTime = formatDate(now, fmt) + endTime = startTime + } + if (num == 2) { // 昨日 + now.setDate(nowDay - 1) + startTime = formatDate(now, fmt) + endTime = startTime + } + if (num == 3) { // 本周 + startTime = formatDate(new Date(nowYear, nowMonth, nowDay - nowDayOfWeek), fmt) + endTime = formatDate(new Date(nowYear, nowMonth, nowDay + (6 - nowDayOfWeek)), fmt) + } + if (num == 4) { // 上周 + startTime = formatDate(new Date(nowYear, nowMonth, nowDay - nowDayOfWeek - 7), fmt) + endTime = formatDate(new Date(nowYear, nowMonth, nowDay - nowDayOfWeek - 1), fmt) + } + if (num == 5) { // 本月 + startTime = formatDate(new Date(nowYear, nowMonth, 1), fmt) + endTime = formatDate(new Date(nowYear, nowMonth, days), fmt) + } + if (num == 6) { // 本年 + startTime = formatDate(new Date(nowYear, 0, 1), fmt) + endTime = formatDate(new Date(nowYear, 11, 31), fmt) + } + if (bool) { + startTime += ' 00:00:00' + endTime += ' 23:59:59' + } + return [startTime, endTime] +} +/** + * 获取 昨天 今天 明天 一周前 一月前 1-5 + */ +export function getDateStr1(num, fmt = 'yyyy-MM-dd hh:mm:ss') { + const now = new Date() // 当前日期 + const curr = Date.now() // 当前时间戳 + if (num == 1) return formatDate(new Date(curr-(24*60*60*1000)),fmt) // 昨天 + else if (num == 2) return formatDate(now,fmt) // 今天 + else if (num == 3) return formatDate(new Date(curr+(24*60*60*1000)),fmt) // 明天 + else if (num == 4) return formatDate(new Date(curr-(7*24*60*60*1000)),fmt) // 一周前 + else if (num == 5) return formatDate(new Date(curr-(30*24*60*60*1000)),fmt) // 一月前 + return '' +} +/** + * 获取当前 0:0:0:0 时间 + * @param {*} [fmt] 格式 'yyyy-MM-dd hh:mm:ss' + */ +export function getDateNow(fmt) { + const date = new Date() + date.setHours(0, 0, 0, 0) + if (fmt) return formatDate(date, fmt) + return date +} +/** 默认加上-时分秒 */ +export function toTimeStr(arr = ['','']) { + return [`${arr[0]} 00:00:00`, `${arr[1]} 23:59:59`] +} + +/** + * 秒转时分 + */ +export function timeToStr(time,str = '时分秒', isPad = false) { + let s = parseInt(time) + let h = 0, m = 0 // 初始化时|分 + if (s >= 60) { + // 如果秒数大于60,将秒数转换成整数 + m = parseInt(s / 60) // 获取分钟,除以60取整数,得到整数分钟 + s = parseInt(s % 60) // 获取秒数,秒数取佘,得到整数秒数 + if (m >= 60) { // 如果分钟大于60,将分钟转换成小时 + h = parseInt(m / 60) // 获取小时,获取分钟除以60,得到整数小时 + m = parseInt(m % 60) // 获取小时后取佘的分,获取分钟除以60取佘的分 + } + } + const toStr = v => v.toString().padStart(2, '0') // 转换字符 + const arr = str.split('') + if (isPad) return `${h?toStr(h)+arr[0]:''}${m?toStr(m)+arr[1]:''}${toStr(s)}${arr[2]||''}` + return `${h?h+arr[0]:''}${m?m+arr[1]:''}${s?s+arr[2]||'':''}` +} + +/** + * 防抖:一定时间内,如果函数被连续调用,则只执行最后一次调用。 + * debounce(() => { + console.log('Input event handled'); + }, 300); + * @param {*} func + * @param {*} wait + * @returns + */ +export function debounce(func, wait) { + let timeout; + return function() { + const context = this; + const args = arguments; + clearTimeout(timeout); + timeout = setTimeout(() => func.apply(context, args), wait); + }; +} + +/** + * 节流:一定时间内,函数最多只执行一次 + * throttle(() => { + console.log('Scroll event handled'); + }, 300); + * @param {*} func + * @param {*} wait + * @returns + */ +export function throttle(func, wait) { + let lastTime = 0; + return function() { + const context = this; + const args = arguments; + const now = new Date(); + if (now - lastTime >= wait) { + func.apply(context, args); + lastTime = now; + } + }; +} diff --git a/src/renderer/src/utils/common.js b/src/renderer/src/utils/common.js new file mode 100644 index 0000000..7e9449b --- /dev/null +++ b/src/renderer/src/utils/common.js @@ -0,0 +1,23 @@ +import request from './request' +import axios from 'axios' + +export const uploadServer = (data) => { + return request({ + url: '/common/upload', + method: 'post', + headers: { + 'Content-Type': 'multipart/form-data' + }, + data: data + }) +} +//通过url获取文件 +export const getJSONFile = (url) => { + return new Promise((resolve, reject) => { + axios.get(url).then(res => { + resolve(res) + }).catch(err => { + reject(err) + }) + }) +} \ No newline at end of file diff --git a/src/renderer/src/utils/date.js b/src/renderer/src/utils/date.js new file mode 100644 index 0000000..d967f24 --- /dev/null +++ b/src/renderer/src/utils/date.js @@ -0,0 +1,169 @@ +// 判断是不是昨天 +const isYestday = (date) => { + var yesterday = new Date(new Date() - 1000 * 60 * 60 * 24) + return ( + yesterday.getYear() === date.getYear() && + yesterday.getMonth() === date.getMonth() && + yesterday.getDate() === date.getDate() + ) +} + +// 判断是不是今年 +const isYear = (date) => { + return date.getYear() === new Date().getYear() +} + +//将时间转为 yy/mm/dd hh:mm:ss +const formatDateTime = (date) => { + if (!date) { + return '' + } + var dateObject = new Date(date) + var y = dateObject.getFullYear() + var m = dateObject.getMonth() + 1 + m = m < 10 ? '0' + m : m + var d = dateObject.getDate() + d = d < 10 ? '0' + d : d + var h = dateObject.getHours() + h = h < 10 ? '0' + h : h + var minute = dateObject.getMinutes() + minute = minute < 10 ? '0' + minute : minute + var second = dateObject.getSeconds() + second = second < 10 ? '0' + second : second + return y + '/' + m + '/' + d + ' ' + h + ':' + minute + ':' + second +} + +/** + * 将时间戳转换为文本描述。 + * + * 此函数旨在将时间戳转换为更易读的文本格式,以便用户可以更直观地理解时间信息。 + * 通过传入的时间,函数将生成对应的时间文本,如"刚刚"、"5分钟前"、"昨天"等。 + * 如果设置了simple参数为true,则会返回更简单的23/06/25,只显示年月日,如果是今年只返回月和日。 + * + * @param {string} timeStamp - 需要转换的时间。 + * @param {boolean} simple - 是否使用简单的格式,默认为false,如:23/06/25、06/25。 + * @returns {string} - 转换后的时间文本。 + */ +export const toTimeText = (timeStamp, simple) => { + if (!timeStamp) { + return '' + } + var dateTime = new Date(timeStamp) + var currentTime = Date.parse(new Date()) //当前时间 + var timeDiff = currentTime - dateTime //与当前时间误差 + var timeText = '' + if (timeDiff <= 60000) { + //一分钟内 + timeText = '刚刚' + } else if (timeDiff > 60000 && timeDiff < 3600000) { + //1小时内 + timeText = Math.floor(timeDiff / 60000) + '分钟前' + } else if (timeDiff >= 3600000 && timeDiff < 86400000 && !isYestday(dateTime)) { + //今日 + timeText = formatDateTime(dateTime).substr(11, 5) + } else if (isYestday(dateTime)) { + //昨天 + timeText = '昨天' + formatDateTime(dateTime).substr(11, 5) + } else if (isYear(dateTime)) { + //今年 + timeText = formatDateTime(dateTime).substr(5, simple ? 5 : 14) + } else { + //不属于今年 + timeText = formatDateTime(dateTime) + if (simple) { + timeText = timeText.substr(2, 8) + } + } + return timeText +} + +/** + * + * @returns 当前年-月-日 + */ +export const getCurrentTime = (format)=> { + const now = new Date(); + const year = now.getFullYear(); + const month = (now.getMonth() + 1).toString().padStart(2, '0'); + const day = now.getDate().toString().padStart(2, '0'); + const hours = now.getHours().toString().padStart(2, '0'); + const minutes = now.getMinutes().toString().padStart(2, '0'); + if(format == 'YYYY-MM-DD HH:mm'){ + return `${year}-${month}-${day} ${hours}:${minutes}`; + } + if(format == 'YYYY-MM-DD'){ + return `${year}-${month}-${day}`; + } + if(format == 'HH:mm'){ + return `${hours}:${minutes}`; + } + if(format == 'MMDD'){ + return `${month}${day}`; + } + if(format == 'HH'){ + return `${hours}`; + } + if(format == 'HH+3'){ + //往后延时3个小时 + const hours = (now.getHours()+3).toString().padStart(2, '0'); + return `${hours}` + } + if(format == 'mm'){ + return `${minutes}`; + } +} +/** + * + * @param {number} m 指定时间 + * @returns 指定时间之后的 小时:分钟 + */ +export const getAfterMinutes = (m) => { + const now = new Date(); + const afterMinutes = new Date(now.getTime() + m * 60 * 1000); + let hours = afterMinutes.getHours(); + hours = hours < 10 ? ('0' + hours) : hours + let minutes = afterMinutes.getMinutes(); + minutes = minutes < 10 ? ('0' + minutes) : minutes + return `${hours}:${minutes}`; +} + +/** + * 表格时间格式化 + */ +export function formatDate(cellValue) { + if (cellValue == null || cellValue == "") return ""; + var date = new Date(cellValue) + var year = date.getFullYear() + var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1 + var day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate() + var hours = date.getHours() < 10 ? '0' + date.getHours() : date.getHours() + var minutes = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes() + var seconds = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds() + return year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds +} +export function getTimeDate() { + var date = new Date() + var year = date.getFullYear() + var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1 + var day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate() + var hours = date.getHours() < 10 ? '0' + date.getHours() : date.getHours() + var minutes = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes() + var seconds = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds() + return year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds +} + +/** + * 获取明天日期 + * @returns + */ +export function getTomorrow() { + let date = new Date(); + var year = date.getFullYear() + var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1 + var day = date.getDate()+1 < 10 ? '0' + date.getDate()+1 : date.getDate()+1 + + // 获取明天的日期 .getDate() + 1 + let tomorrow = `${year}-${month}-${day}`; + + return tomorrow; +} diff --git a/src/renderer/src/utils/errorCode.js b/src/renderer/src/utils/errorCode.js new file mode 100644 index 0000000..d2111ee --- /dev/null +++ b/src/renderer/src/utils/errorCode.js @@ -0,0 +1,6 @@ +export default { + '401': '认证失败,无法访问系统资源', + '403': '当前操作没有权限', + '404': '访问资源不存在', + 'default': '系统未知错误,请反馈给管理员' +} diff --git a/src/renderer/src/utils/examQuestion/jyeoo.js b/src/renderer/src/utils/examQuestion/jyeoo.js new file mode 100644 index 0000000..8fb0a67 --- /dev/null +++ b/src/renderer/src/utils/examQuestion/jyeoo.js @@ -0,0 +1,262 @@ +const JY_TOKEN = 'CA82641DA86072DEFD39E287335E035FDA6AEEC0549B58F54F4408734C8683FFAF0585CFA3B25091E588A03A65C66A80F5FF613F539D600954007A35DFFBFDC3C7BB982771C5E13F0918642CFD7596CE3718F06E5579238D92EC809AC6F4C82A9FE4B0E232A67DD3594D4DAC1C219CCBC4A7A093344446107EB11DC317526D0594249DEBBD82B740C794CF5A7065E1982B7779AF16AD25D7'; +const JY_SUBJECT = [ + {id: 10, subject: 'math3', name: '小学数学'}, + {id: 11, subject: 'chinese3', name: '小学语文'}, + {id: 12, subject: 'english3', name: '小学英语'}, + {id: 14, subject: 'science3', name: '小学科学'}, + {id: 15, subject: 'politics3', name: '小学道德与法治'}, + {id: 20, subject: 'math', name: '初中数学'}, + {id: 21, subject: 'physics', name: '初中物理'}, + {id: 22, subject: 'chemistry', name: '初中化学'}, + {id: 23, subject: 'bio', name: '初中生物'}, + {id: 24, subject: 'science', name: '初中科学'}, + {id: 25, subject: 'geography', name: '初中地理'}, + {id: 26, subject: 'chinese', name: '初中语文'}, + {id: 27, subject: 'english', name: '初中英语'}, + {id: 28, subject: 'politics', name: '初中道德与法治'}, + {id: 29, subject: 'history', name: '初中历史'}, + {id: 30, subject: 'math2', name: '高中数学'}, + {id: 31, subject: 'physics2', name: '高中物理'}, + {id: 32, subject: 'chemistry2', name: '高中化学'}, + {id: 33, subject: 'bio2', name: '高中生物'}, + {id: 35, subject: 'geography2', name: '高中地理'}, + {id: 36, subject: 'chinese2', name: '高中语文'}, + {id: 37, subject: 'english2', name: '高中英语'}, + {id: 38, subject: 'politics2', name: '高中政治'}, + {id: 39, subject: 'history2', name: '高中历史'}, +]; + + +export const JYApiListCT = async (_this, name = '高中历史') => { + if (name === '初中政治') { + name = '初中道德与法治'; + } + const obj = JY_SUBJECT.filter(item => item.name == name); + if(obj.length < 1) { + return []; + } + const res = await _this.$requestGetJYW(`/${obj[0].subject}/common`, { + headers: { + authorization: `Token ${JY_TOKEN}` + }, + params: { + tp: 1, + }, + }); + if (res.code !== 200) { + return []; + } + let arrCT = [{ + label: "不限", + value: 0 + }] + res.data.forEach(item=> { + if (item.Value === '选择题') { + item.Value = '单选题'; + } + const tmp = { + label: item.Value, + value: item.Key, + } + arrCT.push(tmp); + }) + return arrCT; +} + +export const JYApiListOriginYear = () => { + const arrYear = [{label: '不限', value: '-1'}]; + let i = 0; + for( ; i < 10; i++) { + const year = new Date().getFullYear(); + const s ={ + label: `${year - i}`, + value: `${year - i}`, + } + arrYear.push(s); + }; + //arrYear.push({label: '更早', value: '0'}) + return arrYear; +} + +export const JYApiListSO = async (_this, name = '高中历史') => { + if (name === '初中政治') { + name = '初中道德与法治'; + } + + const obj = JY_SUBJECT.filter(item => item.name == name); + if(obj.length < 1) { + return []; + } + const res = await _this.$requestGetJYW(`/${obj[0].subject}/common`, { + headers: { + authorization: `Token ${JY_TOKEN}` + }, + params: { + tp: 2, + }, + }); + if (res.code !== 200) { + return []; + } + const arrSO = [{"Value": "不限", "Key": 0}, ...res.data]; + return arrSO; +} + + + +export const JYApiListPoint = async (_this, name = '高中历史') => { + if (name === '初中政治') { + name = '初中道德与法治'; + } + + const obj = JY_SUBJECT.filter(item => item.name == name); + if(obj.length < 1) { + return []; + } + const res = await _this.$requestGetJYW(`/${obj[0].subject}/point`, { + headers: { + authorization: `Token ${JY_TOKEN}` + }, + }); + if (res.code !== 200) { + return []; + } + return res.data; +} + + +/** + * @desc: 获取菁优网的版本内容 + * @return: {*} + */ +export const JYApiListVersion = async (_this, query, hasPoints=true) => { + const listVersion = { + status: 0, + msg: '', + data: [], + }; + if (query.stage === '' || query.subject === '') { + listVersion.msg = '未选中学段或学科!'; + return listVersion; + } + let name = `${query.stage}${query.subject}`; + if (name === '初中政治') { + name = '初中道德与法治'; + } + const result = JY_SUBJECT.filter( item => item.name===name); + if (result.length === 0) { + listVersion.msg = `[${name}]未找到对应菁优网教材版本, 请检查学段或学科是否匹配!`; + return listVersion; + } + const JYBook = await _this.$requestGetJYW(`/${result[0].subject}/book2`, { + headers: { + // JYToken仅占位, 实际后续已未使用该token + authorization: `Token ${JY_TOKEN}` + }, + }); + if (JYBook.code !== 200) { + listVersion.msg = `[${name}]获取菁优网教材版本失败!`; + return listVersion; + } + query.list.forEach(ele => { + if (ele.thirdkey == null) { + listVersion.msg = `[${name}-${ele.itemtitle}]菁优网教材字段标识未设置!`; + return; + } + let nPos = ele.thirdkey.indexOf('-'); + if (nPos === -1) { + listVersion.msg = `[${name}-${ele.itemtitle}-${ele.thirdkey}]菁优网教材字段标识设置有误!`; + return; + } + let editionName = ele.thirdkey.substring(0, nPos); + let typeName = ele.thirdkey.substring(nPos+1); + const resVersion = JYBook.data.filter( item => { + // 高中以typeName为标识, 而小学/初中以Name为标识 + const JYTypeName = query.stage=='高中' ? item.TypeName : item.Name; + if (item.EditionName.trim() === editionName.trim() && JYTypeName.trim() === typeName.trim()) { + return true; + } + }) + + if (resVersion.length === 0) { + listVersion.msg = `[${name}-${ele.thirdkey}]菁优网教材字段标识查询不存在!`; + return; + } + if (resVersion[0].Children.length === 0) { + listVersion.msg = `[${name}]菁优网教材字段标识查询单元内容为空!`; + return; + } + const children = JYApiListLession(resVersion[0], hasPoints); + // 高中以typeName为标识, 而小学/初中以Name为标识 + let JYTypeName = query.stage=='高中' ? resVersion[0].TypeName : resVersion[0].Name; + JYTypeName = JYTypeName.trim(); + const reset = { + id: resVersion[0].ID, + label: resVersion[0].Name.trim(), + nodeType: 'version', + children: children, + editionName: resVersion[0].EditionName.trim(), + typeName: JYTypeName, + } + listVersion.data.push(reset); + }) + + if(listVersion.data.length > 0){ + listVersion.status = 1; + } + return listVersion; +} + + +const JYApiListLession = (item, hasPoints) => { + const list = []; + item.Children.forEach(element => { + const tempList = formatCurJYLession(element, hasPoints); + list.push(tempList); + }); + return list; +} + +const formatCurJYLession = (item, hasPoints) => { + const obj = { + id: item.ID, + label: item.Name.trim(), + nodeType: 'unit', + children: [], + } + if(hasPoints) { + if (item.Children.length === 0 && !item.hasOwnProperty('Points')) { + obj.nodeType = 'points'; + obj.id = item.No; + return obj; + } + else if (item.Children.length > 0 ){ + for(let i=0; i 0){ + obj.nodeType = 'lession'; + for(let i=0; i 0 ){ + for(let i=0; i{ + if (typeof str == 'string') { + try { + let obj=JSON.parse(str); + if(typeof obj == 'object' && obj ){ + return true; + }else{ + return false; + } + } catch(e) { + return false; + } + } +}; + + +/** + * @description processExamQuestion 格式化试题 + * @param {*} row + */ +export const processExamQuestion = (row) => { + for (var i=0; iix>0); + // console.log(bjTitle,'背景标题'); + // console.log(tmTitles,'复合题目'); + let titls = []; + options.forEach((element,index1) => { + const workDescArr = element.split('#&'); + let tmp = ''; + let j=0; + for(; j`; + } + const char = String.fromCharCode(65+j); + tmp += `
      ${char}.${workDescArr[j]}
      `; + if(j%2 == 1){ + tmp += ''; + } + + } + // j此刻已自增1, 故当选项为单数时, 需要补充结束标签 + if(j%2 == 1){ + tmp += ''; + } + + // workDescArr为 [''] 表示为 判断题或者填空题,这里不需要选项 + if(workDescArr[0] != ''){ + titls.splice(index1, 1, tmp); + }else{ + titls.splice(index1, 1, ''); + } + }); + const s = []; + tmTitles.map((it,ix)=>{ + s.push(it); + titls.map((it2,ix2)=>{ + if(ix == ix2){ + s.push(it2); + } + }) + }) + // console.log(s,'?????????????????') + + row[i].titleFormat = bjTitle + s.join(''); + row[i].workdescFormat = ''; + + + //2.答案 - 数字转为ABCD + const answerArr = JSON.parse(row[i].workanswer); + let indexLabel = 1; + let arr = []; + answerArr.forEach(item => { + const arrTmp = item.answer.split('#&'); + let value = `(${indexLabel})`; + arrTmp.forEach((element,i) => { + if(item.type == '单选题' || item.type == '多选题'){ + value += `${String.fromCharCode(65+Number(element))}`; + } + if(item.type == '判断题' || item.type == '填空题'){ + // 去除下 html标签 + value += `${element.replace(/<[^>]+>/g, '')}`+ (i==arrTmp.length-1?'':'、'); + } + if(item.type == '主观题') { + if(element){ + console.log(element,'element') + value += item.answer; + }else{ + value += '答案不唯一,请参考分析解答点评!'; + } + } + }) + arr.push(value); + indexLabel++; + }) + const answer = arr.join('
      '); + + row[i].workanswerFormat = answer; + } + else { + // 处理[题干显示] - 不再需要处理 + // row[i].titleFormat = row[i].title; // 仅占位提示 + + /** + * 处理[选项显示] - 特殊结构 + * [ + * {type: '单选题', title: '题目1', options: ['ABC123','ABC123']}, + * {type: '多选题', title: '题目1', options: ['ABC123','ABC123']}, + * {type: '填空题', title: '题目1', options: []}, + * {type: '判断题', title: '题目1', options: []}, + * {type: '主观题', title: '题目1', options: []}, + * ] + */ + let workDescArr = JSON.parse(row[i].workdesc); + let workDescHtml = `
      ${index+1}. ${item.title}
      `; + let tmp = ''; + let j=0; + let optionsArr = item.options; + for(; j`; + } + const char = String.fromCharCode(65+j); + tmp += `
      ${char}.${optionsArr[j]}
      `; + if(j%2 == 1){ + tmp += ''; + } + } + // j此刻已自增1, 故当选项为单数时, 需要补充结束标签 + if(j%2 == 1){ + tmp += ''; + } + + workDescHtml += tmp; + } + else if(item.type == '填空题' || item.type == '判断题' || item.type == '主观题'){ + workDescHtml += `
      ${index+1}. ${item.title}
      `; + } + }) + workDescHtml += ''; + row[i].workdescFormat = workDescHtml; + + /** + * 处理[答案显示] - 特殊结构 + * [ + * {type: '单选题', answer: ['0']}, + * {type: '多选题', answer: ['0','1']}, + * {type: '填空题', answer: ['填空1','填空2']}, + * {type: '判断题', answer: ['0'/'1']}, + * {type: '主观题', answer: [xxxx]}, + * ] + */ + let workAnswerArr = JSON.parse(row[i].workanswer); + let workAnswerHtml = ``; + workAnswerArr.map( (item, index) => { + const answerArr = item.answer; //JSON.parse(item.answer); + if(item.type == '单选题' || item.type == '多选题'){ + const answer = answerArr.map( (item) => { + return String.fromCharCode(65+Number(item)) + }).join(''); + workAnswerHtml += `
      ${index+1}. ${answer}
      `; + } + else if(item.type == '填空题' ){ + const answer = answerArr.join('、'); + workAnswerHtml += `
      ${index+1}. ${answer}
      `; + } + else if(item.type == '判断题' ){ + const answer = answerArr.map( (item) => { + return item === '1' ? '正确' : '错误' + }).join('、'); + workAnswerHtml += `
      ${index+1}. ${answer}
      `; + } + else if(item.type == '主观题' ){ + // 复合题里面的主观题只有一个答案,或没填 + const answer = answerArr.join('、'); + if(answerArr[0]){ + workAnswerHtml += `
      ${index+1}. ${answer}
      `; + }else{ + workAnswerHtml += `
      ${index+1}. ${answer}答案不唯一,请参考分析解答点评!
      `; + } + } + }) + row[i].workanswerFormat = workAnswerHtml; + } + + } + else if(row[i].worktype == '主观题' || (row[i].worktype!=='单选题' && row[i].worktype!=='多选题' && row[i].worktype!=='填空题' && row[i].worktype!=='判断题')) { + // 处理[选项显示] - 主观题中无选项, 故置空 + row[i].workdescFormat = ''; + row[i].workanswerFormat = ''; + // 答案处理- eg: "\"不唯一的答案,参考\"" + if (row[i].workanswer && row[i].workanswer != '') { + row[i].workanswerFormat = JSON.parse(row[i].workanswer); + } + } + else { + // 单选题|多选题|填空题|判断题|主观题?(待确认是否归在这里) + // 通用选项结构 ['ABC123','ABC123'] | ['ABC123','ABC123'] | [](填空题无选项) | [](判断题无选项) + let workDescArr = []; + if (row[i].workdesc.charAt(0) === '[' && row[i].workdesc.charAt(row[i].workdesc.length - 1) === ']') { + //123会直接被转换, 且不是数组对象, 故手动判断是否有[和]两个字符 + workDescArr = JSON.parse(row[i].workdesc); + } + else if(row[i].workdesc.indexOf('#&') !== -1) { + workDescArr = row[i].workdesc.split('#&'); + } + else if(row[i].workdesc.indexOf(',') !== -1){ + workDescArr = row[i].workdesc.split(','); + } + else { + // 单字符串直接添加至空数组(待考虑确认) + workDescArr.push(row[i].workdesc); + } + + // 单选题|多选题|填空题|判断题|主观题?(待确认是否归在这里) + // 通用答案结构 ['0'] | ['0','1'] | ['填空1','填空2'] | ['0'/'1'] + let workAnswerArr = []; + if (row[i].workanswer.charAt(0) === '[' && row[i].workanswer.charAt(row[i].workanswer.length - 1) === ']') { + // 123会直接被转换, 且不是数组对象, 故手动判断是否有[和]两个字符 + workAnswerArr = JSON.parse(row[i].workanswer); + } + else if(row[i].workanswer.indexOf('#&') !== -1) { + workAnswerArr = row[i].workanswer.split('#&'); + } + else if(row[i].workanswer.indexOf(',') !== -1){ + workAnswerArr = row[i].workanswer.split(','); + } + else { + // 单字符串直接添加至空数组(待考虑确认) + workAnswerArr.push(row[i].workanswer); + } + + // 具体题型处理 + if(row[i].worktype == '单选题' || row[i].worktype == '多选题' ){ + // 处理[选项显示] - 拼接ABCD首序号 + let tmp = ''; + let j=0; + for(; j`; + } + const char = String.fromCharCode(65+j); + tmp += `
      ${char}.${workDescArr[j]}
      `; + if(j%2 == 1){ + tmp += ''; + } + } + if(j%2== 0){ + tmp += ''; + } + row[i].workdescFormat = tmp; + + // 处理[答案显示] - 转换ABCD + let arr2Char = workAnswerArr.map( (item) => { + return String.fromCharCode(65+Number(item)) + }).join(''); + row[i].workanswerFormat = arr2Char; + } + else if(row[i].worktype == '填空题'){ + // 处理[选项显示] - 填空题中无选项, 故置空 + row[i].workdescFormat = ''; + + // 处理[答案显示] - 逗号连接 + row[i].workanswerFormat = workAnswerArr.join('、'); + } + else if(row[i].worktype == '判断题'){ + // 处理[选项显示] - 判断题中无选项, 故置空 + row[i].workdescFormat = ''; + + // 处理[答案显示] - 1-正常 0-错误 + const answer = workAnswerArr.map( (item) => { + return item === '1' ? '正确' : '错误' + }).join('、'); + row[i].workanswerFormat = answer; + } + } + } + } +} \ No newline at end of file diff --git a/src/renderer/src/utils/hasPermission.js b/src/renderer/src/utils/hasPermission.js new file mode 100644 index 0000000..4d7cb4a --- /dev/null +++ b/src/renderer/src/utils/hasPermission.js @@ -0,0 +1,17 @@ + +import useUserStore from '@/store/modules/user' + +import array from 'lodash/array' +export const hasPermission = (value, def = true) => { + // 不传值,默认视为有权限,不做鉴权 + if (!value) { + return def + } + const allCodeList = useUserStore().roles + // 如果不是数组,直接判断pinia里的权限数组有没有相同的元素即可 + if (!Array.isArray(value)) { + return allCodeList.includes(value) + } + // intersection是lodash提供的一个方法,用于返回一个所有给定数组都存在的元素组成的数组 + return array.intersection(value, allCodeList).length > 0 +} diff --git a/src/renderer/src/utils/index.js b/src/renderer/src/utils/index.js new file mode 100644 index 0000000..e7bf6a4 --- /dev/null +++ b/src/renderer/src/utils/index.js @@ -0,0 +1,33 @@ +import CryptoJS from 'crypto-js'; + +// 生成签名的主方法 +export function getSignature(appId, secret, ts) { + try { + const auth = md5(appId + ts); + return hmacSHA1Encrypt(auth, secret); + } catch (error) { + console.error('Error generating signature:', error); + return null; + } +} + +// MD5 加密 +function md5(cipherText) { + try { + return CryptoJS.MD5(cipherText).toString(); // 使用 CryptoJS 进行 MD5 加密 + } catch (error) { + console.error('Error in MD5 hashing:', error); + return null; + } +} + +// HMAC-SHA1 加密 +function hmacSHA1Encrypt(encryptText, encryptKey) { + try { + // 使用 CryptoJS 进行 HMAC-SHA1 加密,并转换为 Base64 格式 + return CryptoJS.HmacSHA1(encryptText, encryptKey).toString(CryptoJS.enc.Base64); + } catch (error) { + console.error('Error in HMAC-SHA1 encryption:', error); + return null; + } +} diff --git a/src/renderer/src/utils/jsencrypt.js b/src/renderer/src/utils/jsencrypt.js new file mode 100644 index 0000000..048e6d1 --- /dev/null +++ b/src/renderer/src/utils/jsencrypt.js @@ -0,0 +1,30 @@ +import JSEncrypt from "jsencrypt" + +// 密钥对生成 http://web.chacuo.net/netrsakeypair + +const publicKey = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdH\n' + + 'nzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ==' + +const privateKey = 'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY\n' + + '7Nt+PrgrxkiA50efORdI5U5lsW79MmFnusUA355oaSXcLhu5xxB38SMSyP2KvuKN\n' + + 'PuH3owIDAQABAkAfoiLyL+Z4lf4Myxk6xUDgLaWGximj20CUf+5BKKnlrK+Ed8gA\n' + + 'kM0HqoTt2UZwA5E2MzS4EI2gjfQhz5X28uqxAiEA3wNFxfrCZlSZHb0gn2zDpWow\n' + + 'cSxQAgiCstxGUoOqlW8CIQDDOerGKH5OmCJ4Z21v+F25WaHYPxCFMvwxpcw99Ecv\n' + + 'DQIgIdhDTIqD2jfYjPTY8Jj3EDGPbH2HHuffvflECt3Ek60CIQCFRlCkHpi7hthh\n' + + 'YhovyloRYsM+IS9h/0BzlEAuO0ktMQIgSPT3aFAgJYwKpqRYKlLDVcflZFCKY7u3\n' + + 'UP8iWi1Qw0Y=' + +// 加密 +export function encrypt(txt) { + const encryptor = new JSEncrypt() + encryptor.setPublicKey(publicKey) // 设置公钥 + return encryptor.encrypt(txt) // 对数据进行加密 +} + +// 解密 +export function decrypt(txt) { + const encryptor = new JSEncrypt() + encryptor.setPrivateKey(privateKey) // 设置私钥 + return encryptor.decrypt(txt) // 对数据进行解密 +} + diff --git a/src/renderer/src/utils/linkConfig.js b/src/renderer/src/utils/linkConfig.js new file mode 100644 index 0000000..e5da707 --- /dev/null +++ b/src/renderer/src/utils/linkConfig.js @@ -0,0 +1,64 @@ +import useUserStore from '@/store/modules/user' +export const baseConfig = (token) => { + const userStore = token ? {} : useUserStore() + return { + // Electron 设置cookie + url: import.meta.env.VITE_APP_BUILD_BASE_PATH, + // url: 'https://file.ysaix.com:7868', + //cookie 名称 这里为 token + name: 'Admin-Token', + //cookie 值 + value: token ? '' : userStore.token, + // 域名 + domain: import.meta.env.VITE_APP_DOMAIN + } +} + +export default () => { + return { + // 作业布置 + homeWork: { + data: { ...baseConfig() }, + // 完整路径 + fullPath: `${baseConfig().url}/teaching/classtaskassign?titleName=%E4%BD%9C%E4%B8%9A%E5%B8%83%E7%BD%AE` + }, + + // 作业反馈 + feedback: { + data: { ...baseConfig() }, + // 完整路径 + fullPath: `${baseConfig().url}/teaching/classtaskassign?titleName=作业反馈` + }, + + // 高考研读 + gk: { + data: { ...baseConfig() }, + fullPath: `${baseConfig().url}/education/colentrance` + }, + + // 课标研读 + standard: { + data: { ...baseConfig() }, + fullPath: `${baseConfig().url}/teaching/chatwithstandard` + }, + + // 教学大模型 + aiModel: { + data: { ...baseConfig() }, + fullPath: `${baseConfig().url}/platofai` + }, + // 文件资源 布置作业 + filehomework: { + data: { ...baseConfig() }, + + fullPath: `${baseConfig().url}/teaching/classtaskassign?titleName=作业布置` + }, + + getBaseData: () => { + return { + data: { ...baseConfig() }, + fullPath: `${baseConfig().url}` + } + } + } +} diff --git a/src/renderer/src/utils/pdfAndFabric.js b/src/renderer/src/utils/pdfAndFabric.js new file mode 100644 index 0000000..8763356 --- /dev/null +++ b/src/renderer/src/utils/pdfAndFabric.js @@ -0,0 +1,212 @@ + +// 所有事件 +export function handleevent(canvas, imgarr, type = 'defalut') { + // // 鼠标按下 + // canvas.on('mouse:down', function (e) {}) + // // // 监听鼠标移动事件 + // // canvas.on('mouse:move', (options) => { + // // console.log('Mouse move event:', options); + // // }); + + // // 监听鼠标释放事件 + // canvas.on('mouse:up', (options) => { + // //判断是点击的哪一个 + // if (type == 'defalut') { + // if (imgarr.value[0].index == 0) { + // imgarr.value[0].JSONdata = canvas.toJSON() + // } + // if (imgarr.value[1]?.index == 0) { + // imgarr.value[1].JSONdata = canvas.toJSON() + // } + // } else { + // if (imgarr.value[0].index == 1) { + // imgarr.value[0].JSONdata = canvas.toJSON() + // } + // if (imgarr.value[1]?.index == 1) { + // imgarr.value[1].JSONdata = canvas.toJSON() + // } + // } + // console.log(imgarr.value) + + // }) +} +// 保存数据 +export function savecanvsStore(imgarr, canvsStore) { + canvsStore.pageArr = mergeAndReplace(canvsStore.pageArr, imgarr.value) +} +// 重显数据 +export function displayData(FabricVue, canvsStore, canvasobj, fabric, img) { + + // 初始化 + const canvas = FabricVue.value.canvas + if (!canvas) { + return + } + if (!canvsStore.pageArr.length) { + fabric.Image.fromURL( + img.src, + (image) => { + image.set({ + left: 0, + top: 0, + scaleX: canvas.width / img.width, + scaleY: canvas.height / img.height, + erasable: false // 不允许擦拭 + }) + // FabricVue.setBackgroundImage(image, FabricVue.renderAll.bind(FabricVue)) + // setBackgroundImage(image,FabricVue) + // canvas.setBackgroundImage(image, canvas.renderAll.bind(canvas)); + + canvas.setBackgroundImage(image, () => { + canvas.renderAll.bind(canvas) + FabricVue.value.render() + }) + }, + {crossOrigin: 'anonymous'} + ) + return + } + + const isfind=findObjectByPage(canvsStore.pageArr,canvasobj.page) + if(isfind){ + const canvdata={ + objects:JSON.parse(isfind.JSONdata), + version: "5.3.0" + } + requestAnimationFrame(function () { + canvas.loadFromJSON(canvdata, () => { + // 在所有对象加载完成后重新渲染画布 + // Utils.handleCanvasJSONLoaded(canvas) + canvas.requestRenderAll() // 批量重绘 + }) + fabric.Image.fromURL( + img.src, + (image) => { + image.set({ + left: 0, + top: 0, + scaleX: canvas.width / img.width, + scaleY: canvas.height / img.height, + selectable: false, + evented: false, + erasable: false // 不允许擦拭 + }) + // canvas.setBackgroundImage(image, canvas.renderAll.bind(canvas)); + canvas.setBackgroundImage(image, () => { + canvas.renderAll.bind(canvas) + FabricVue.value.render() + }) + }, + {crossOrigin: 'anonymous'} + ) + // 渲染所有对象 + canvas.requestRenderAll() // 批量重绘 + }) + }else{ + // 使用 requestAnimationFrame 来更新画布,确保在下一帧进行重绘 + // // 清除 Canvas + // canvas.clear() + requestAnimationFrame(function () { + fabric.Image.fromURL( + img.src, + (image) => { + image.set({ + left: 0, + top: 0, + scaleX: canvas.width / img.width, + scaleY: canvas.height / img.height, + selectable: false, + evented: false, + erasable: false // 不允许擦拭 + }) + // canvas.setBackgroundImage(image, canvas.renderAll.bind(canvas)); + canvas.setBackgroundImage(image, () => { + canvas.renderAll.bind(canvas) + FabricVue.value.render() + }) + }, + {crossOrigin: 'anonymous'} + ) + // 渲染所有对象 + canvas.requestRenderAll() // 批量重绘 + }) + } + + // canvsStore.pageArr.forEach((item) => { + // //初始化 + // if (item.page == canvasobj.page) { + // // item.JSONdata + // canvas.loadFromJSON(JSON.parse(item.JSONdata), () => { + // // 在所有对象加载完成后重新渲染画布 + // // Utils.handleCanvasJSONLoaded(canvas) + // canvas.requestRenderAll() // 批量重绘 + // }) + // } else { + + // // 使用 requestAnimationFrame 来更新画布,确保在下一帧进行重绘 + // // // 清除 Canvas + // // canvas.clear() + // requestAnimationFrame(function () { + // fabric.Image.fromURL( + // img.src, + // (image) => { + // image.set({ + // left: 0, + // top: 0, + // scaleX: canvas.width / img.width, + // scaleY: canvas.height / img.height, + // selectable: false, + // evented: false, + // erasable: false // 不允许擦拭 + // }) + // // canvas.setBackgroundImage(image, canvas.renderAll.bind(canvas)); + // canvas.setBackgroundImage(image, () => { + // canvas.renderAll.bind(canvas) + // FabricVue.value.render() + // }) + // }, + // {crossOrigin: 'anonymous'} + // ) + // // 渲染所有对象 + // canvas.requestRenderAll() // 批量重绘 + // }) + // } + // }) +} +// 找到page一样的 +const findObjectByPage=(array, page)=> { + const foundObject = array.find(obj => obj.page === page); + return foundObject || false; +} + +//page 一样替换 +const mergeAndReplace = (arr1, arr2) => { + + + // 创建一个映射,将 arr2 中的对象按 page 属性存储 + let map = new Map(arr2.map((item) => [item.page, item])) + + // 使用 map 替换 arr1 中相应 page 的对象,并添加 arr2 中的对象 + arr1 = arr1.map((item) => (map.has(item.page) ? map.get(item.page) : item)) + + // 将 map 中存在但 arr1 中不存在的对象添加到 arr1 + for (let [page, obj] of map) { + if (!arr1.some((item) => item.page === page)) { + arr1.push(obj) + } + } + return arr1 +} + +// 初始化数据 +export function initcanvasdata(canvas) { + canvas.value.clear() // 清除 Canvas + // 设置画布的背景色或其他属性 + canvas.value.backgroundColor = 'rgba(255, 255, 255, 1)' // 白色背景 + + // 使用 requestAnimationFrame 来更新画布,确保在下一帧进行重绘 + requestAnimationFrame(function () { + // 渲染所有对象 + canvas.value.renderAll.bind(canvas.value) + }) +} diff --git a/src/renderer/src/utils/ppt-request.js b/src/renderer/src/utils/ppt-request.js new file mode 100644 index 0000000..ccfc55f --- /dev/null +++ b/src/renderer/src/utils/ppt-request.js @@ -0,0 +1,100 @@ +import axios from "axios"; +import { getSignature } from "./index"; +import { ElMessage } from "element-plus"; +import request from '@/utils/request' + +let appId = "a3c84da2"; +let secret = "OTZkZDdhNDQ4MDk0NTZiYjcyY2RjZmYz"; +let timestamp = Math.floor(Date.now() / 1000); +let signature = getSignature(appId, secret, timestamp); +let req = (url, type, data)=>{ + let config = { + headers: { + "Content-Type": "application/json", + appId: appId, + timestamp: timestamp, + signature: signature, + }, + url: url, + method: type, + } + if (type === "GET") { + config.params = data; + } else { + config.data = data; + } + return request(config) +} + +/*const instance = axios.create({ + // baseURL: import.meta.env.VITE_APP_ENV === "development"?"/parth":import.meta.env.VITE_APP_BASE_API, + baseURL: "/dev-api", + headers: { + "Content-Type": "application/json", + 'Authorization': 'Bearer ' + getToken(), + appId: appId, + timestamp: timestamp, + signature: signature, + }, +});*/ + +const createOutline = async (data) => { + console.log("createOutline data:", data); + try { + const response = await req( + "/api/aippt/createOutline", + "POST", + data + ); + console.log("createOutline response:", response); + if (response.code == 81002) { + ElMessage.error("并发数量超过限制"); + } + return response.data; + } catch (error) { + console.error("请求失败:", error); + throw error; + } +}; +const getBackGround = async () => { + try { + const response = await req("/api/aippt/themeList", "GET"); + return response.data; + } catch (error) { + console.error("请求失败:", error); + throw error; + } +}; +const createPPT = async (data) => { + try { + const response = await req("/api/aippt/create", "POST", data); + console.log("createOutline response:", response); + + return response.data; + } catch (error) { + console.error("请求失败:", error); + throw error; + } +}; +const createByOutline = async (data) => { + try { + const response = await req("/api/aippt/createByOutline","POST", data); + console.log("createByOutline response:", response); + + return response.data; + } catch (error) { + console.error("请求失败:", error); + throw error; + } +}; +const getProgress = async (id) => { + try { + const response = await req(`/api/aippt/progress?sid=${id}`, "GET"); + return response.data; + } catch (error) { + console.error("请求失败:", error); + throw error; + } +}; + +export { createOutline, getBackGround, createPPT, getProgress, createByOutline }; diff --git a/src/renderer/src/utils/request.js b/src/renderer/src/utils/request.js new file mode 100644 index 0000000..e588a2a --- /dev/null +++ b/src/renderer/src/utils/request.js @@ -0,0 +1,123 @@ +import axios from 'axios' +import { ElNotification , ElMessageBox, ElMessage, ElLoading } from 'element-plus' +import { getToken } from '@/utils/auth' +import errorCode from '@/utils/errorCode' +import { tansParams, blobValidate } from '@/utils/ruoyi' +import cache from '@/plugins/cache' +const { ipcRenderer } = window.electron || {} + +import useUserStore from '@/store/modules/user' + + +// 是否显示重新登录 +export let isRelogin = { show: false }; + +axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8' +// 创建axios实例 +const service = axios.create({ + // axios中请求配置有baseURL选项,表示请求URL公共部分 + baseURL: import.meta.env.VITE_APP_BASE_API, + // 超时 + timeout: 100000 +}) + +// request拦截器 +service.interceptors.request.use(config => { + // 是否需要设置 token + const isToken = (config.headers || {}).isToken === false + // 是否需要防止数据重复提交 + const isRepeatSubmit = (config.headers || {}).repeatSubmit === false + if (getToken() && !isToken) { + config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改 + } + // get请求映射params参数 + if (config.method === 'get' && config.params) { + let url = config.url + '?' + tansParams(config.params); + url = url.slice(0, -1); + config.params = {}; + config.url = url; + } + if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) { + const requestObj = { + url: config.url, + data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data, + time: new Date().getTime() + } + const requestSize = Object.keys(JSON.stringify(requestObj)).length; // 请求数据大小 + const limitSize = 5 * 1024 * 1024; // 限制存放数据5M + if (requestSize >= limitSize) { + console.warn(`[${config.url}]: ` + '请求数据大小超出允许的5M限制,无法进行防重复提交验证。') + return config; + } + const sessionObj = cache.session.getJSON('sessionObj') + if (sessionObj === undefined || sessionObj === null || sessionObj === '') { + cache.session.setJSON('sessionObj', requestObj) + } else { + const s_url = sessionObj.url; // 请求地址 + const s_data = sessionObj.data; // 请求数据 + const s_time = sessionObj.time; // 请求时间 + const interval = 2000; // 间隔时间(ms),小于此时间视为重复提交 + cache.session.setJSON('sessionObj', requestObj) + } + } + return config +}, error => { + console.log(error) + Promise.reject(error) +}) + +// 响应拦截器 +service.interceptors.response.use(res => { + // 未设置状态码则默认成功状态 + const code = res.data.code || 200; + // 获取错误信息 + const msg = errorCode[code] || res.data.msg || errorCode['default'] + // 二进制数据则直接返回 + if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') { + return res.data + } + if (code === 401) { + if (!isRelogin.show) { + isRelogin.show = true; + ElMessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning' }).then(() => { + isRelogin.show = false; + useUserStore().logOut().then(() => { + ipcRenderer && ipcRenderer.send('openLoginWindow') + }) + }).catch(() => { + isRelogin.show = false; + }); + } + return Promise.reject('') + } else if (code === 500) { + ElMessage({ message: msg, type: 'error' }) + return Promise.reject(new Error(msg)) + } else if (code === 601) { + ElMessage({ message: msg, type: 'warning' }) + return Promise.reject(new Error(msg)) + } else if (code !== 200) { + ElNotification.error({ title: msg }) + return Promise.reject('error') + } else { + return Promise.resolve(res.data) + } + }, + error => { + console.log('err' + error) + let { message } = error; + if (message == "Network Error") { + message = "后端接口连接异常"; + } else if (message.includes("timeout")) { + message = "系统接口请求超时"; + } else if (message.includes("Request failed with status code")) { + message = "系统接口" + message.substr(message.length - 3) + "异常"; + } + ElMessage({ message: message, type: 'error', duration: 5 * 1000 }) + return Promise.reject(error) + } +) + +// 通用下载方法 + + +export default service diff --git a/src/renderer/src/utils/resourceDict.js b/src/renderer/src/utils/resourceDict.js new file mode 100644 index 0000000..c86aaf8 --- /dev/null +++ b/src/renderer/src/utils/resourceDict.js @@ -0,0 +1,120 @@ +export const tabs = [ + { + label: '平台', + value: '平台' + }, + { + label: '校本', + value: '校本' + }, + { + label: '第三方', + value: '第三方' + }, +] + + +// 资源格式 +export const resourceFormat = [ + { + label: 'word', + value: 'word' + }, + { + label: 'ppt', + value: 'ppt' + }, + { + label: 'pptx', + value: 'pptx' + }, + { + label: 'mp3', + value: 'mp3' + }, + { + label: 'mp4', + value: 'mp4' + }, + { + label: 'JPG', + value: 'jpg' + }, + { + label: 'PNG', + value: 'png' + }, + { + label: 'RAR', + value: 'rar' + }, + { + label: 'TXT', + value: 'txt' + } +] + +// 资源类型 +export const resourceType = [ + { + label: '课例库', + value: "'apt','课件','教案'" + }, + { + label: '作业库', + value: '作业', + disabled: true + }, + + { + label: '素材库', + value: "'素材'" + }, + { + label: '习题库', + value: '习题', + disabled: true + } +] +// 年级划分 +export const gradeList = [ + { + label:'小学', + value:1 + }, + { + label:'初中', + value:2 + }, + { + label:'高中', + value:3 + }, +] +//课件类别 +export const coursewareTypeList = [ + { + label:'全部', + value:'' + }, + { + label:'课件', + value:3 + }, + { + label:'教案', + value:8 + }, + { + label:'试卷', + value:7 + }, + { + label:'学案', + value:4 + }, + { + label:'素材', + value:6 + }, +] diff --git a/src/renderer/src/utils/ruoyi.js b/src/renderer/src/utils/ruoyi.js new file mode 100644 index 0000000..8d7971e --- /dev/null +++ b/src/renderer/src/utils/ruoyi.js @@ -0,0 +1,273 @@ + + +/** + * 通用js方法封装处理 + * Copyright (c) 2019 ruoyi + */ + +// 日期格式化 +export function parseTime(time, pattern) { + if (arguments.length === 0 || !time) { + return null + } + const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}' + let date + if (typeof time === 'object') { + date = time + } else { + if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) { + time = parseInt(time) + } else if (typeof time === 'string') { + time = time.replace(new RegExp(/-/gm), '/').replace('T', ' ').replace(new RegExp(/\.[\d]{3}/gm), ''); + } + if ((typeof time === 'number') && (time.toString().length === 10)) { + time = time * 1000 + } + date = new Date(time) + } + const formatObj = { + y: date.getFullYear(), + m: date.getMonth() + 1, + d: date.getDate(), + h: date.getHours(), + i: date.getMinutes(), + s: date.getSeconds(), + a: date.getDay() + } + const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => { + let value = formatObj[key] + // Note: getDay() returns 0 on Sunday + if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value] } + if (result.length > 0 && value < 10) { + value = '0' + value + } + return value || 0 + }) + return time_str +} + +// 表单重置 +export function resetForm(refName) { + if (this.$refs[refName]) { + this.$refs[refName].resetFields(); + } +} + +// 添加日期范围 +export function addDateRange(params, dateRange, propName) { + let search = params; + search.params = typeof (search.params) === 'object' && search.params !== null && !Array.isArray(search.params) ? search.params : {}; + dateRange = Array.isArray(dateRange) ? dateRange : []; + if (typeof (propName) === 'undefined') { + search.params['beginTime'] = dateRange[0]; + search.params['endTime'] = dateRange[1]; + } else { + search.params['begin' + propName] = dateRange[0]; + search.params['end' + propName] = dateRange[1]; + } + return search; +} + +// 回显数据字典 +export function selectDictLabel(datas, value) { + if (value === undefined) { + return ""; + } + var actions = []; + Object.keys(datas).some((key) => { + if (datas[key].value == ('' + value)) { + actions.push(datas[key].label); + return true; + } + }) + if (actions.length === 0) { + actions.push(value); + } + return actions.join(''); +} + +// 回显数据字典(字符串数组) +export function selectDictLabels(datas, value, separator) { + if (value === undefined || value.length ===0) { + return ""; + } + if (Array.isArray(value)) { + value = value.join(","); + } + var actions = []; + var currentSeparator = undefined === separator ? "," : separator; + var temp = value.split(currentSeparator); + Object.keys(value.split(currentSeparator)).some((val) => { + var match = false; + Object.keys(datas).some((key) => { + if (datas[key].value == ('' + temp[val])) { + actions.push(datas[key].label + currentSeparator); + match = true; + } + }) + if (!match) { + actions.push(temp[val] + currentSeparator); + } + }) + return actions.join('').substring(0, actions.join('').length - 1); +} + +// 字符串格式化(%s ) +export function sprintf(str) { + var args = arguments, flag = true, i = 1; + str = str.replace(/%s/g, function () { + var arg = args[i++]; + if (typeof arg === 'undefined') { + flag = false; + return ''; + } + return arg; + }); + return flag ? str : ''; +} + +// 转换字符串,undefined,null等转化为"" +export function parseStrEmpty(str) { + if (!str || str == "undefined" || str == "null") { + return ""; + } + return str; +} + +// 数据合并 +export function mergeRecursive(source, target) { + for (var p in target) { + try { + if (target[p].constructor == Object) { + source[p] = mergeRecursive(source[p], target[p]); + } else { + source[p] = target[p]; + } + } catch (e) { + source[p] = target[p]; + } + } + return source; +}; + +/** + * 构造树型结构数据 + * @param {*} data 数据源 + * @param {*} id id字段 默认 'id' + * @param {*} parentId 父节点字段 默认 'parentId' + * @param {*} children 孩子节点字段 默认 'children' + */ +export function handleTree(data, id, parentId, children) { + let config = { + id: id || 'id', + parentId: parentId || 'parentId', + childrenList: children || 'children' + }; + + var childrenListMap = {}; + var nodeIds = {}; + var tree = []; + + for (let d of data) { + let parentId = d[config.parentId]; + if (childrenListMap[parentId] == null) { + childrenListMap[parentId] = []; + } + nodeIds[d[config.id]] = d; + childrenListMap[parentId].push(d); + } + + for (let d of data) { + let parentId = d[config.parentId]; + if (nodeIds[parentId] == null) { + tree.push(d); + } + } + + for (let t of tree) { + adaptToChildrenList(t); + } + + function adaptToChildrenList(o) { + if (childrenListMap[o[config.id]] !== null) { + o[config.childrenList] = childrenListMap[o[config.id]]; + } + if (o[config.childrenList]) { + for (let c of o[config.childrenList]) { + adaptToChildrenList(c); + } + } + } + return tree; +} + +/** +* 参数处理 +* @param {*} params 参数 +*/ +export function tansParams(params) { + let result = '' + for (const propName of Object.keys(params)) { + const value = params[propName]; + var part = encodeURIComponent(propName) + "="; + if (typeof value === 'object') { + for (const key of Object.keys(value)) { + if (value[key] !== null && value[key] !== "" && typeof (value[key]) !== 'undefined') { + let params = propName + '[' + key + ']'; + var subPart = encodeURIComponent(params) + "="; + result += subPart + encodeURIComponent(value[key]) + "&"; + } + } + } else { + result += part + encodeURIComponent(value) + "&"; + } + /*if (value !== null && value !== "" && typeof (value) !== "undefined") { + + }*/ + } + return result +} + + +// 返回项目路径 +export function getNormalPath(p) { + if (p.length === 0 || !p || p == 'undefined') { + return p + }; + let res = p.replace('//', '/') + if (res[res.length - 1] === '/') { + return res.slice(0, res.length - 1) + } + return res; +} + +// 验证是否为blob格式 +export function blobValidate(data) { + return data.type !== 'application/json' +} + +// 获取文件后缀 +export const getFileSuffix = (filename) => { + return filename.substring(filename.lastIndexOf('.') + 1); +} + +// 获取文件名(不带后缀) +export const getFileName = (filename) => { + // 使用正则表达式匹配文件名部分(不包括后缀) + if(!filename) return + return filename.replace(/\.[^/.]+$/, ""); +} + +// 清除当前选中的教材 章节 相关信息 +export const clearBookInfo = () =>{ + //当前选中的教材 + localStorage.removeItem('curBook') + // 当前选中的节点 + localStorage.removeItem('curNode') + // 所有章节单元数据 + localStorage.removeItem('unitList') + // 所有教材数据 + localStorage.removeItem('subjectList') + // 展开的节点 + localStorage.removeItem('defaultExpandedKeys') +} \ No newline at end of file diff --git a/src/renderer/src/utils/store.js b/src/renderer/src/utils/store.js new file mode 100644 index 0000000..aef349c --- /dev/null +++ b/src/renderer/src/utils/store.js @@ -0,0 +1,25 @@ +/** + * @description : 存储对象-本地存储 封装工具(渲染器) + * @author : zdg + * @date : 2024-09-03 + */ +const isNode = typeof require !== 'undefined' // 是否支持node函数 +const Store = isNode?require('electron-store'):null // 持久化存储 + +// 暴露sessionStore存储对象 +export const sessionStore = Store ? new Store({ + name: 'session-store', // 存储文件名 + fileExtension: 'ini', // 文件后缀名 + encryptionKey: 'BvPLmgCC4DSIG0KkTec5' // 数据加密-防止用户直接改配置 +}) : {} + +// 暴露localStore存储对象 +export const localStore = Store ? new Store({ + name: 'local-store', // 存储文件名 + fileExtension: 'ini', // 文件后缀名 + encryptionKey: '6CyoHQmUaPmLzvVsh' // 数据加密-防止用户直接改配置 +}) : {} + +export default { + sessionStore, localStore +} \ No newline at end of file diff --git a/src/renderer/src/utils/talkFile/index.js b/src/renderer/src/utils/talkFile/index.js new file mode 100644 index 0000000..ae5dfbb --- /dev/null +++ b/src/renderer/src/utils/talkFile/index.js @@ -0,0 +1,114 @@ +const { ipcRenderer } = window.electron || {} + +export const asyncLocalFile = (item) => { + return new Promise((resolve) => { + //判断是否需要从线上拿新的文件 + isAsyncLocalFile(item.fileNewName, item.lastModifyTime, item.fileMd5).then( + ({ isAsync, type }) => { + item.async = !isAsync + if (isAsync === true) { + item.async = 'on' + if (type === 'down') { + console.log(item) + ipcRenderer.send('download-file-default', { + url: item.fileFullPath, + fileName: item.fileNewName + }) + ipcRenderer.once('download-file-default' + item.fileNewName, (e, isSuccess) => { + item.async = isSuccess + resolve() + }) + } + if (type === 'upload') { + let cookie = localStorage.getItem('Admin-Token') + ipcRenderer.send('upload-file-change', { + id: item.id, + fileNewName: item.fileNewName, + cookie, + fileType: item.fileType + }) + ipcRenderer.once( + 'upload-file-change-success' + item.fileNewName, + (e, { data, md5 }) => { + item.fileSize = data.fileSize + item.md5 = md5 + item.async = true + resolve() + } + ) + } + } else { + resolve() + } + } + ) + }) +} + +export const isHaveLocalFile = async (fileNewName) => { + return new Promise((resolve, reject) => { + ipcRenderer.send('is-have-local-file', fileNewName) + ipcRenderer.once('is-have-local-file-reply' + fileNewName, (e, isHave) => { + resolve(isHave) + }) + }) +} + +export const isAsyncLocalFile = async (fileNewName, lastModifyTime, md5) => { + return new Promise((resolve, reject) => { + ipcRenderer.send('is-async-local-file', { fileNewName, lastModifyTime, md5 }) + ipcRenderer.once('is-async-local-file-reply' + fileNewName, (e, { isAsync, type }) => { + resolve({ isAsync, type }) + }) + }) +} + +export const parseCataByNode = (node) => { + if (node.parentNode) { + let arr = parseCataByNode(node.parentNode) + arr.push(node.id) + return arr + } else { + return [node.id] + } +} + +export const exportFile = async (list) => { + return new Promise((resolve, reject) => { + ipcRenderer.send('export-file-default', list) + ipcRenderer.once('export-file-default-reply', (e, res) => { + resolve(res) + }) + }) +} + +export const creatPPT = (name, uploadData) => { + JSON.parse(JSON.stringify(uploadData)) + return new Promise((resolve, reject) => { + let cookie = localStorage.getItem('Admin-Token') + ipcRenderer.send('creat-file-default', { + name, + uploadData: JSON.parse(JSON.stringify(uploadData)), + cookie + }) + ipcRenderer.once('creat-file-default-reply', (e, res) => { + resolve(res) + }) + }) +} + +export const creatAIPPT = (name, url, uploadData) => { + JSON.parse(JSON.stringify(uploadData)) + return new Promise((resolve, reject) => { + let cookie = localStorage.getItem('Admin-Token') + ipcRenderer.send('creat-ai-file-default', { + name, + url, + uploadData: JSON.parse(JSON.stringify(uploadData)), + cookie + }) + ipcRenderer.once('creat-ai-file-default-reply', (e, res) => { + resolve(res) + }) + }) +} diff --git a/src/renderer/src/utils/tool.js b/src/renderer/src/utils/tool.js new file mode 100644 index 0000000..84fc77b --- /dev/null +++ b/src/renderer/src/utils/tool.js @@ -0,0 +1,408 @@ +/** + * @description: electron 封装的工具函数 + */ +// const { ipcRenderer } = window.electron || {} +// import { ipcRenderer } from 'electron' // 渲染器里面可以使用ipcRenderer +// Remote.app.getAppPath() E:\njys-work\AIx_Smarttalk\dist\win-unpacked\resources\app.asar +// path.join(__dirname) 根目录 E:\njys-work\AIx_Smarttalk\dist\win-unpacked\resources\app.asar\out\renderer + +const isNode = typeof require !== 'undefined' // 是否支持node函数 +const path = isNode?require('path'):{} +const Remote = isNode?require('@electron/remote'):{} +const { ipcRenderer } = isNode?require('electron'):window.electron || {} +const API = isNode?window.api:{} // preload-api +import { useToolState } from '@/store/modules/tool' // 获取store状态 +import store from './store' +import { baseConfig } from './linkConfig' // 外部连接-配置 +// 常用变量 +const BaseUrl = isNode?process.env['ELECTRON_RENDERER_URL']+'/#':'' +const isDev = isNode?process.env.NODE_ENV !== 'production':'' + +const appPath = isNode?Remote.app.getAppPath():'' // 应用目录 + +// 暴露Remote中的属性 +export const ipcMain = Remote?.ipcMain || {} + +// 暴露sessionStore存储对象 +export const sessionStore = store.sessionStore + +// 暴露localStore存储对象 +export const localStore = store.localStore + +// 暴露Store存储对象 +export const Store = store +// 延时 +const sleep = ms => new Promise(resolve => setTimeout(resolve, ms)) +/** + * 获取静态资源,开发和生产环境 + * @param {*} url + * @param {*} type 类型 app 应用内 user (用户目录 selfFile 自定义文件路径) + * @returns + */ +export const getStaticUrl = (url = '', type = 'app', exitPath = '', isFile = false) => { + if (isDev) return url + else { // 生产环境获取-url + switch(type) { + case 'app': return path.join(__dirname, url) // 应用目录 + case 'user': return (isFile?'file://':'')+path.join(Remote.app.getPath('userData'),exitPath, url) // 用户目录 + default: return '' + } + } +} + +export const getAppInstallUrl = (url = '', type = 'app', exitPath = '', isFile = false) => { + if (isDev) return url + else { // 生产环境获取-url + switch(type) { + case 'app': return path.join(__dirname, url) // 应用目录 + case 'user': return (isFile?'file://':'')+path.join(Remote.app.getAppPath(),exitPath, url) // 用户目录 + // case 'user': return (isFile?'file://':'')+path.join(Remote.app.getPath('userData'),exitPath, url) // 用户目录 + default: return '' + } + } +} +/** + * @description 消息发送-nodejs 消息发送 + * @form src/main/tool.js 来源 + * @param {*} key 消息key + * tool-sphere:create 创建-悬浮球 + * @param {*} data 参数 + * url:路由地址,width:窗口宽度,height:窗口高度,option:自定义选项 + * @returns + */ +export function ipcMsgSend(key, data, type) { + if (type == 'old') { + return new Promise((resolve) => { + // 返回结果-监听 + ipcRenderer?.once(`${key}-reply`, (e, res) => { + resolve(res) + }) + // 发送消息 + ipcRenderer?.send(key, data) + }) + } else if (type == 'send') { // 单独发送 + ipcRenderer?.send(key, data) + } else { // 新版本-默认 + return ipcRenderer?.invoke(key, data) + } +} +export function ipcMsgSend2(key, ...args) { + return ipcRenderer?.send(key, ...args) +} +export function ipcMsgInvoke(key, ...args) { + return ipcRenderer?.invoke(key, ...args) +} +/** + * @description 封装ipcRenderer事件监听 + * @param {*} fn on once handle invoke + * @param {*} key + * @param {Function} cb 回调函数 + * @returns + */ +export function ipcHandle(fn,key, cb) { + return ipcRenderer[fn](key, cb) + // return ipcRenderer?.[fn]?.(key, cb) +} +/** + * 创建-窗口 调用该方法 + * @param {*} type 类型 + * tool-sphere 创建-悬浮球 + * @param {*} data 参数 + * @returns + */ +let wins_tool = null +let winPdf=null +let winChild=null +export const createWindow = async (type, data) => { + switch(type) { + case 'tool-sphere': { // 创建-悬浮球 + if (wins_tool) return console.error('createWindow: win is have') + if (!type) return console.error('createWindow: type is null') + const option = data.option||{} + const defOption = { + frame: false, // 要创建无边框窗口 + resizable: false, // 禁止窗口大小缩放 + transparent: true, // 设置透明 + alwaysOnTop: true, // 窗口是否总是显示在其他窗口之前 + type: 'toolbar', // 创建的窗口类型为工具栏窗口 + // parent: mainWin, // 父窗口 + // autoClose: true, // 关闭窗口后自动关闭 + } + data.isConsole = true // 是否开启控制台 + data.isWeb = false // 是否开启web安全 + data.option = {...defOption, ...option} + wins_tool = await toolWindow(type, data) + wins_tool.type = type // 唯一标识 + wins_tool.show() + wins_tool.setFullScreen(true) // 设置窗口为全屏 + wins_tool.setIgnoreMouseEvents(true, {forward: true}) // 忽略鼠标事件但是事件继续传递给窗口 + wins_tool.setAlwaysOnTop(true,'screen-saver') // 将窗口设置为顶层窗口 + wins_tool.setVisibleOnAllWorkspaces(true) // 如果窗口在所有工作区都可见 + if (import.meta.env.VITE_SHOW_DEV_TOOLS === 'true') wins_tool.webContents.openDevTools() // 打开调试工具 + eventHandles(type, wins_tool) // 事件监听处理 + return wins_tool + } + case 'open-PDF': { //课本展示-pdf + if(winPdf){ //判断是否已经打开 + if (winPdf.isMinimized()){ + winPdf.restore(); + } else{ + winPdf.focus(); + // toolState.isPdfWin=true + } + + return + } + const option = data.option||{} + const defOption = { + frame: false, // 要创建无边框窗口 + resizable: true, // 禁止窗口大小缩放 + alwaysOnTop: false, // 窗口是否总是显示在其他窗口之前 + } + data.isConsole = true // 是否开启控制台 + data.option = {...defOption, ...option} + const win = await toolWindow(type, data) + win.type = type // 唯一标识 + win.show() + win.setFullScreen(true) // 设置窗口为全屏 + if (import.meta.env.VITE_SHOW_DEV_TOOLS === 'true') win.webContents.openDevTools() // 打开调试工具 + eventHandles(type, win) // 事件监听处理 + winPdf=win + break + } + case 'open-taskwin': { //作业批改-web + if(winChild){ //判断是否已经打开 + winChild.focus(); + return + } + const option = data.option||{} + const defOption = { + // width: 1280,// 1920, + // height: 720,// 1080, + width: 1450, + minWidth: 1200, + height: 800, + minHeight: 700, + frame: true, // 要创建无边框窗口 + // resizable: true, // 禁止窗口大小缩放 + alwaysOnTop: false, // 窗口是否总是显示在其他窗口之前 + title:'子窗口', + show: false, //创建时窗口不可见 + maximizable: true, + autoHideMenuBar: true,// 自动隐藏菜单栏 + } + data.isConsole = true // 是否开启控制台 + data.option = {...defOption, ...option} + winChild = await toolWindow(type, data) + winChild.type = type // 唯一标识 + winChild.show() + winChild.setFullScreen(false) // 设置窗口为全屏 + eventHandles(type, winChild) // 事件监听处理 + return winChild + } + default: + break + } +} +/** + * @description: 基础-创建工具-窗口 + * @param {*} url 路由地址 + * @param {number} [width=800] 窗口宽度 + * @param {number} [height=600] 窗口高度 + * @param {{}} [option={}] 自定义选项 + * @author: zdg + * @date 2021-07-05 14:07:01 + */ +export function toolWindow(type, {url, isConsole, isWeb=true, option={}}) { + // width = window.screen.width + let width = option?.width || 800 + let height = option?.height || 600 + const mainWin = Remote.getCurrentWindow() // 获取主窗口对象 + const devUrl = `${BaseUrl}${url}` + const buildUrl = path.join(__dirname, 'index.html') + const urlAll = isDev ? devUrl : buildUrl + return new Promise(async(resolve) => { + const config = { + width, height, + icon: path.join(appPath, '/resources/logo2.ico'), + webPreferences: { + preload: path.join(API.preloadPath, '/index.js'), + sandbox: false, + nodeIntegration: true, // nodeApi调用 + contextIsolation: false, // 沙箱取消 + devTools: true + }, + ...option + } + // 创建-新窗口 + let win = new Remote.BrowserWindow(config) + // 新窗口-创建事件(如:主进程加载远程服务) + await ipcMsgInvoke('new-window', {id:win.id, type}) + console.log(`渲染进程 [${type}]: 窗口创建-成功${Date.now()}`) + if (!isDev) win.loadFile(urlAll,{hash: url}) // 加载文件 + else win.loadURL(urlAll) // 加载url + win.once('ready-to-show', () => { // 窗口加载完成 + resolve(win) + }) + // 主窗口关闭事件 + mainWin.once('closed', () => { win.destroy()}) + // 内部监听器 + win.webContents.on('did-finish-load', () => { + // setTimeout(() => { + // toolState.stateSyncInit(win.id) // 同步状态 + // }, 200); + }) + // 内部监听器-是否打印 + if (!!isConsole) { + win.webContents.on('console-message', (e,leve,m,lin,s) => { + if(m.startsWith('%c')){ // 特殊打印 + const arr = m.match(/(%c[^ ]+)(?:\s+(.*;))(.*)/) + console.log(arr[1],arr[2],arr[3]) + } else console.log(`[${win.type}]`,m) + }) + } + }) +} +/** + * 窗口创建-事件处理 + * @param {*} type 事件类型 + * @param {*} win 窗口对象 + */ +const eventHandles = (type, win) => { + const toolState = useToolState() // 获取store状态 + const winAll = Remote.BrowserWindow.getAllWindows() + const mainWin = winAll.find(o => o.type == 'main') // 主窗口对象 + // 公共方法 + const publicMethods = ({onClosed}={}) => { + // 监听主窗口-关闭事件 + mainWin.once('close', () => {winPdf=null;win.destroy();}) + win.on('closed', () => { + if(onClosed) onClosed() // 自定义关闭事件 + win = null + wins_tool = null + winChild=null + }) + + // 新窗口-创建事件(如:主进程加载远程服务) + // ipcRenderer.send('new-window', {id:win.id, type}) + } + switch(type) { + case 'tool-sphere': { // 创建-悬浮球 + // 监听设置穿透 + const setIgnore = (_, ignore) => {win.setIgnoreMouseEvents(ignore, {forward: true})} + Remote.ipcMain.handle('tool-sphere:set:ignore', setIgnore) // 异步 + // 关闭窗口 + Remote.ipcMain.handleOnce('tool-sphere:close', () => {win&&win.destroy()}) + // // 放大监听-测试 + // Remote.ipcMain.once('maximize-window', () => {win&&win.destroy()}) + const on = { + onClosed: () => { + Remote.ipcMain.removeHandler('tool-sphere:set:ignore', setIgnore) + // Remote.ipcMain.removeHandler('tool-sphere:reset') + // Remote.ipcMain.removeAllListeners() // 移除所有监听事件 + // 设置状态(再次设置-防止未设置到) + if(toolState.isToolWin) toolState.isToolWin = false + // sessionStore.set('isToolWin', false) + } + } + publicMethods(on) // 加载公共方法 + break} + case 'open-PDF': { + // 最小化窗口 minimize() + Remote.ipcMain.handle('open-PDF:minimize', () => { + // winPdf=null + // win&&win.destroy() + win&&win.minimize(); //缩小功能 + }) + // 关闭窗口 + Remote.ipcMain.once('open-PDF:close', () => { + winPdf=null + win&&win.destroy() + }) + + // 监听窗口的激活事件 + win.on('focus', async () => { + console.log('激活窗口') + toolState.isPdfWin=true + await sleep(20) // 延时 + toolState.showBoardAll=false //恢复默认值 + // await sleep(50) // 延时 + // 穿透开启 + if (toolState.isToolWin) ipcRenderer.invoke('tool-sphere:set:ignore', true) + }); + const on = { + onClosed: () => { + Remote.ipcMain.removeHandler('open-PDF:minimize') + // 设置状态(再次设置-防止未设置到) + if(toolState.isPdfWin) toolState.isPdfWin = false + } + } + publicMethods(on) // 加载公共方法 + break} + case 'open-taskwin': { // -子窗口 + // 监听窗口的激活事件 + win.on('focus', async () => { + toolState.isTaskWin=true + // win&&win.reload(); //刷新该窗口 + }); + // 监听窗口关闭事件 + win.on('closed', function () { + console.log('关闭窗口') + // 设置状态(再次设置-防止未设置到) + if(toolState.isTaskWin) toolState.isTaskWin = false + winChild=null + win&&win.destroy() + }); + const on = { + onClosed: () => { + } + } + publicMethods(on) // 加载公共方法 + break; + } + default: + break + } +} + +/** + * @description 外部跳转-web网页 + * @param {*} path + * @param {*} params + */ +export const toLinkWeb = (path) => { + const config = baseConfig() + // console.log(config) + const fullPath = config.url + path + // 通知主进程 + ipcRenderer.send('openWindow', { + key: `win-${Date.now()}`, + fullPath: fullPath, + cookieData: { ...config } + }) +} +/** + * @description 外部跳转-web网页 + * @param {*} path + * @param {*} params + */ +export const toRoter = (path) => { + const config = baseConfig() + // console.log(config) + // const fullPath = config.url + path + // 通知主进程 + ipcRenderer.send('openWindow', { + key: `win-${Date.now()}`, + fullPath: path, + cookieData: { ...config } + }) +} +// const taskHandles = () => { +// // 设置任务栏上下文菜单 +// const contextMenu = new Remote.Menu() +// contextMenu.append(new Remote.MenuItem({ +// label: '关闭', +// click: () => {Remote.app.quit()} +// })) +// } + diff --git a/src/renderer/src/views/classBegins/index.vue b/src/renderer/src/views/classBegins/index.vue new file mode 100644 index 0000000..9e9c83d --- /dev/null +++ b/src/renderer/src/views/classBegins/index.vue @@ -0,0 +1,202 @@ + + + + + diff --git a/src/renderer/src/views/classManage/aside.vue b/src/renderer/src/views/classManage/aside.vue new file mode 100644 index 0000000..346c89d --- /dev/null +++ b/src/renderer/src/views/classManage/aside.vue @@ -0,0 +1,60 @@ + + + + + diff --git a/src/renderer/src/views/classManage/basicGroup.vue b/src/renderer/src/views/classManage/basicGroup.vue new file mode 100644 index 0000000..a96285b --- /dev/null +++ b/src/renderer/src/views/classManage/basicGroup.vue @@ -0,0 +1,418 @@ + + + + + diff --git a/src/renderer/src/views/classManage/classInfo.vue b/src/renderer/src/views/classManage/classInfo.vue new file mode 100644 index 0000000..b451e5a --- /dev/null +++ b/src/renderer/src/views/classManage/classInfo.vue @@ -0,0 +1,75 @@ + + + + + diff --git a/src/renderer/src/views/classManage/classReserv.vue b/src/renderer/src/views/classManage/classReserv.vue new file mode 100644 index 0000000..ccb539c --- /dev/null +++ b/src/renderer/src/views/classManage/classReserv.vue @@ -0,0 +1,121 @@ + + + + + diff --git a/src/renderer/src/views/classManage/index.vue b/src/renderer/src/views/classManage/index.vue new file mode 100644 index 0000000..59557d9 --- /dev/null +++ b/src/renderer/src/views/classManage/index.vue @@ -0,0 +1,318 @@ + + + + + diff --git a/src/renderer/src/views/classManage/reserv-item-apt.vue b/src/renderer/src/views/classManage/reserv-item-apt.vue new file mode 100644 index 0000000..59c1137 --- /dev/null +++ b/src/renderer/src/views/classManage/reserv-item-apt.vue @@ -0,0 +1,99 @@ + + + diff --git a/src/renderer/src/views/classManage/reserv-item.vue b/src/renderer/src/views/classManage/reserv-item.vue new file mode 100644 index 0000000..2a67aa6 --- /dev/null +++ b/src/renderer/src/views/classManage/reserv-item.vue @@ -0,0 +1,122 @@ + + + diff --git a/src/renderer/src/views/classManage/studentList.vue b/src/renderer/src/views/classManage/studentList.vue new file mode 100644 index 0000000..01eb377 --- /dev/null +++ b/src/renderer/src/views/classManage/studentList.vue @@ -0,0 +1,462 @@ + + + + + diff --git a/src/renderer/src/views/classTask/classTask.vue b/src/renderer/src/views/classTask/classTask.vue new file mode 100644 index 0000000..055fa37 --- /dev/null +++ b/src/renderer/src/views/classTask/classTask.vue @@ -0,0 +1,522 @@ + + + + + diff --git a/src/renderer/src/views/classTask/classTaskAssign.vue b/src/renderer/src/views/classTask/classTaskAssign.vue new file mode 100644 index 0000000..8b58f5b --- /dev/null +++ b/src/renderer/src/views/classTask/classTaskAssign.vue @@ -0,0 +1,940 @@ + + + + + + + + diff --git a/src/renderer/src/views/classTask/container/classOverview.vue b/src/renderer/src/views/classTask/container/classOverview.vue new file mode 100644 index 0000000..e3d51b7 --- /dev/null +++ b/src/renderer/src/views/classTask/container/classOverview.vue @@ -0,0 +1,261 @@ + + + diff --git a/src/renderer/src/views/classTask/container/classOverview/distribution.vue b/src/renderer/src/views/classTask/container/classOverview/distribution.vue new file mode 100644 index 0000000..ab7a702 --- /dev/null +++ b/src/renderer/src/views/classTask/container/classOverview/distribution.vue @@ -0,0 +1,23 @@ + + + + + \ No newline at end of file diff --git a/src/renderer/src/views/classTask/container/classOverview/distribution/echarts.vue b/src/renderer/src/views/classTask/container/classOverview/distribution/echarts.vue new file mode 100644 index 0000000..ed70dfa --- /dev/null +++ b/src/renderer/src/views/classTask/container/classOverview/distribution/echarts.vue @@ -0,0 +1,125 @@ + + + + + \ No newline at end of file diff --git a/src/renderer/src/views/classTask/container/classOverview/distribution/stuList.vue b/src/renderer/src/views/classTask/container/classOverview/distribution/stuList.vue new file mode 100644 index 0000000..29d1425 --- /dev/null +++ b/src/renderer/src/views/classTask/container/classOverview/distribution/stuList.vue @@ -0,0 +1,137 @@ + + + + + \ No newline at end of file diff --git a/src/renderer/src/views/classTask/container/classOverview/knowledge.vue b/src/renderer/src/views/classTask/container/classOverview/knowledge.vue new file mode 100644 index 0000000..851f587 --- /dev/null +++ b/src/renderer/src/views/classTask/container/classOverview/knowledge.vue @@ -0,0 +1,104 @@ + + + + + \ No newline at end of file diff --git a/src/renderer/src/views/classTask/container/classOverview/timeAnalyse.vue b/src/renderer/src/views/classTask/container/classOverview/timeAnalyse.vue new file mode 100644 index 0000000..b79cb65 --- /dev/null +++ b/src/renderer/src/views/classTask/container/classOverview/timeAnalyse.vue @@ -0,0 +1,152 @@ + + + + + diff --git a/src/renderer/src/views/classTask/container/classTask/item-dialog-score.vue b/src/renderer/src/views/classTask/container/classTask/item-dialog-score.vue new file mode 100644 index 0000000..a3d3909 --- /dev/null +++ b/src/renderer/src/views/classTask/container/classTask/item-dialog-score.vue @@ -0,0 +1,992 @@ + + + + + diff --git a/src/renderer/src/views/classTask/container/classTask/prevReadImgFileDialog.vue b/src/renderer/src/views/classTask/container/classTask/prevReadImgFileDialog.vue new file mode 100644 index 0000000..2205b17 --- /dev/null +++ b/src/renderer/src/views/classTask/container/classTask/prevReadImgFileDialog.vue @@ -0,0 +1,179 @@ + + + + + diff --git a/src/renderer/src/views/classTask/container/classTask/task-item.vue b/src/renderer/src/views/classTask/container/classTask/task-item.vue new file mode 100644 index 0000000..50fbf48 --- /dev/null +++ b/src/renderer/src/views/classTask/container/classTask/task-item.vue @@ -0,0 +1,108 @@ + + + diff --git a/src/renderer/src/views/classTask/container/item-dialog.vue b/src/renderer/src/views/classTask/container/item-dialog.vue new file mode 100644 index 0000000..a37a4c5 --- /dev/null +++ b/src/renderer/src/views/classTask/container/item-dialog.vue @@ -0,0 +1,802 @@ + + + + + + + diff --git a/src/renderer/src/views/classTask/container/newTask/prevReadMsg-Dialog.vue b/src/renderer/src/views/classTask/container/newTask/prevReadMsg-Dialog.vue new file mode 100644 index 0000000..953e677 --- /dev/null +++ b/src/renderer/src/views/classTask/container/newTask/prevReadMsg-Dialog.vue @@ -0,0 +1,148 @@ + + + + + diff --git a/src/renderer/src/views/classTask/container/newTask/taskTypeView.vue b/src/renderer/src/views/classTask/container/newTask/taskTypeView.vue new file mode 100644 index 0000000..3252c0f --- /dev/null +++ b/src/renderer/src/views/classTask/container/newTask/taskTypeView.vue @@ -0,0 +1,988 @@ + + + + + + diff --git a/src/renderer/src/views/classTask/container/quizStats.vue b/src/renderer/src/views/classTask/container/quizStats.vue new file mode 100644 index 0000000..cd824c9 --- /dev/null +++ b/src/renderer/src/views/classTask/container/quizStats.vue @@ -0,0 +1,449 @@ + + + + \ No newline at end of file diff --git a/src/renderer/src/views/classTask/newClassTask.vue b/src/renderer/src/views/classTask/newClassTask.vue new file mode 100644 index 0000000..bf73688 --- /dev/null +++ b/src/renderer/src/views/classTask/newClassTask.vue @@ -0,0 +1,189 @@ + + + + + + diff --git a/src/renderer/src/views/classTask/teachClassTask.vue b/src/renderer/src/views/classTask/teachClassTask.vue new file mode 100644 index 0000000..b1f7c9e --- /dev/null +++ b/src/renderer/src/views/classTask/teachClassTask.vue @@ -0,0 +1,800 @@ + + + + + + diff --git a/src/renderer/src/views/desktop/container/work-trend.vue b/src/renderer/src/views/desktop/container/work-trend.vue new file mode 100644 index 0000000..d723e5a --- /dev/null +++ b/src/renderer/src/views/desktop/container/work-trend.vue @@ -0,0 +1,214 @@ + + + + \ No newline at end of file diff --git a/src/renderer/src/views/desktop/index.vue b/src/renderer/src/views/desktop/index.vue new file mode 100644 index 0000000..8352c8b --- /dev/null +++ b/src/renderer/src/views/desktop/index.vue @@ -0,0 +1,366 @@ + + + + + \ No newline at end of file diff --git a/src/renderer/src/views/examReport/container/examMocks.vue b/src/renderer/src/views/examReport/container/examMocks.vue new file mode 100644 index 0000000..e93cf4f --- /dev/null +++ b/src/renderer/src/views/examReport/container/examMocks.vue @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/src/renderer/src/views/examReport/container/examReview.vue b/src/renderer/src/views/examReport/container/examReview.vue new file mode 100644 index 0000000..6503399 --- /dev/null +++ b/src/renderer/src/views/examReport/container/examReview.vue @@ -0,0 +1,120 @@ + + + + + \ No newline at end of file diff --git a/src/renderer/src/views/examReport/container/pointAnalysis.vue b/src/renderer/src/views/examReport/container/pointAnalysis.vue new file mode 100644 index 0000000..5acb979 --- /dev/null +++ b/src/renderer/src/views/examReport/container/pointAnalysis.vue @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/src/renderer/src/views/examReport/index.vue b/src/renderer/src/views/examReport/index.vue new file mode 100644 index 0000000..ff4b637 --- /dev/null +++ b/src/renderer/src/views/examReport/index.vue @@ -0,0 +1,302 @@ + + + + + + + + + + + diff --git a/src/renderer/src/views/fullScreenPdf/index.vue b/src/renderer/src/views/fullScreenPdf/index.vue new file mode 100644 index 0000000..cb404c8 --- /dev/null +++ b/src/renderer/src/views/fullScreenPdf/index.vue @@ -0,0 +1,35 @@ + + + + diff --git a/src/renderer/src/views/homePage/index.vue b/src/renderer/src/views/homePage/index.vue new file mode 100644 index 0000000..21beed9 --- /dev/null +++ b/src/renderer/src/views/homePage/index.vue @@ -0,0 +1,245 @@ + + + + diff --git a/src/renderer/src/views/login/components/Register.vue b/src/renderer/src/views/login/components/Register.vue new file mode 100644 index 0000000..e2d1731 --- /dev/null +++ b/src/renderer/src/views/login/components/Register.vue @@ -0,0 +1,528 @@ + + + + + diff --git a/src/renderer/src/views/login/index.vue b/src/renderer/src/views/login/index.vue new file mode 100644 index 0000000..b883d6d --- /dev/null +++ b/src/renderer/src/views/login/index.vue @@ -0,0 +1,264 @@ + + + diff --git a/src/renderer/src/views/prepare/container/ai-ppt.vue b/src/renderer/src/views/prepare/container/ai-ppt.vue new file mode 100644 index 0000000..f8cdc12 --- /dev/null +++ b/src/renderer/src/views/prepare/container/ai-ppt.vue @@ -0,0 +1,719 @@ + + + + + + diff --git a/src/renderer/src/views/prepare/container/class-start.vue b/src/renderer/src/views/prepare/container/class-start.vue new file mode 100644 index 0000000..7913a5c --- /dev/null +++ b/src/renderer/src/views/prepare/container/class-start.vue @@ -0,0 +1,384 @@ + + + + + diff --git a/src/renderer/src/views/prepare/container/file-list-item.vue b/src/renderer/src/views/prepare/container/file-list-item.vue new file mode 100644 index 0000000..eeb77d0 --- /dev/null +++ b/src/renderer/src/views/prepare/container/file-list-item.vue @@ -0,0 +1,375 @@ + + + + + diff --git a/src/renderer/src/views/prepare/container/file-oper-batch.vue b/src/renderer/src/views/prepare/container/file-oper-batch.vue new file mode 100644 index 0000000..3747f92 --- /dev/null +++ b/src/renderer/src/views/prepare/container/file-oper-batch.vue @@ -0,0 +1,102 @@ + + + diff --git a/src/renderer/src/views/prepare/container/kj-list-item.vue b/src/renderer/src/views/prepare/container/kj-list-item.vue new file mode 100644 index 0000000..7a9a56a --- /dev/null +++ b/src/renderer/src/views/prepare/container/kj-list-item.vue @@ -0,0 +1,459 @@ + + + + + diff --git a/src/renderer/src/views/prepare/container/ppt-dialog.vue b/src/renderer/src/views/prepare/container/ppt-dialog.vue new file mode 100644 index 0000000..7c96b3c --- /dev/null +++ b/src/renderer/src/views/prepare/container/ppt-dialog.vue @@ -0,0 +1,47 @@ + + + + + diff --git a/src/renderer/src/views/prepare/container/reserv.vue b/src/renderer/src/views/prepare/container/reserv.vue new file mode 100644 index 0000000..116b5e9 --- /dev/null +++ b/src/renderer/src/views/prepare/container/reserv.vue @@ -0,0 +1,332 @@ + + + diff --git a/src/renderer/src/views/prepare/index.vue b/src/renderer/src/views/prepare/index.vue new file mode 100644 index 0000000..5285014 --- /dev/null +++ b/src/renderer/src/views/prepare/index.vue @@ -0,0 +1,1006 @@ + + + + + diff --git a/src/renderer/src/views/profile/cropperImage.vue b/src/renderer/src/views/profile/cropperImage.vue new file mode 100644 index 0000000..702315b --- /dev/null +++ b/src/renderer/src/views/profile/cropperImage.vue @@ -0,0 +1,268 @@ + + + + + + diff --git a/src/renderer/src/views/profile/index.vue b/src/renderer/src/views/profile/index.vue new file mode 100644 index 0000000..8423f02 --- /dev/null +++ b/src/renderer/src/views/profile/index.vue @@ -0,0 +1,153 @@ + + + + + diff --git a/src/renderer/src/views/profile/resetPwd.vue b/src/renderer/src/views/profile/resetPwd.vue new file mode 100644 index 0000000..b4d2ccb --- /dev/null +++ b/src/renderer/src/views/profile/resetPwd.vue @@ -0,0 +1,75 @@ + + + + \ No newline at end of file diff --git a/src/renderer/src/views/profile/userAvatar.vue b/src/renderer/src/views/profile/userAvatar.vue new file mode 100644 index 0000000..6f876fa --- /dev/null +++ b/src/renderer/src/views/profile/userAvatar.vue @@ -0,0 +1,130 @@ + + + + + diff --git a/src/renderer/src/views/profile/userInfo.vue b/src/renderer/src/views/profile/userInfo.vue new file mode 100644 index 0000000..2d9d1a2 --- /dev/null +++ b/src/renderer/src/views/profile/userInfo.vue @@ -0,0 +1,182 @@ + + + diff --git a/src/renderer/src/views/resource/container/resoure-list.vue b/src/renderer/src/views/resource/container/resoure-list.vue new file mode 100644 index 0000000..517d97f --- /dev/null +++ b/src/renderer/src/views/resource/container/resoure-list.vue @@ -0,0 +1,318 @@ + + + + + + diff --git a/src/renderer/src/views/resource/container/resoure-search.vue b/src/renderer/src/views/resource/container/resoure-search.vue new file mode 100644 index 0000000..9d3344e --- /dev/null +++ b/src/renderer/src/views/resource/container/resoure-search.vue @@ -0,0 +1,125 @@ + + + + diff --git a/src/renderer/src/views/resource/container/third-list.vue b/src/renderer/src/views/resource/container/third-list.vue new file mode 100644 index 0000000..0039e24 --- /dev/null +++ b/src/renderer/src/views/resource/container/third-list.vue @@ -0,0 +1,239 @@ + + + + + diff --git a/src/renderer/src/views/resource/index.vue b/src/renderer/src/views/resource/index.vue new file mode 100644 index 0000000..35a5350 --- /dev/null +++ b/src/renderer/src/views/resource/index.vue @@ -0,0 +1,139 @@ + + + + + diff --git a/src/renderer/src/views/resource/store.js b/src/renderer/src/views/resource/store.js new file mode 100644 index 0000000..f1228fb --- /dev/null +++ b/src/renderer/src/views/resource/store.js @@ -0,0 +1,147 @@ +import { defineStore } from 'pinia' +import { getSmarttalkPage } from '@/api/file/index' +import { getBookList } from '@/api/file/third' +import { tabs, resourceType, resourceFormat } from '@/utils/resourceDict' +import useUserStore from '@/store/modules/user' +import { hasPermission } from '@/utils/hasPermission' + +const userStore = useUserStore() + +const resourceTypeList = [ + ...resourceType +] +const resourceFormatList = [ + { + label: '资源格式', + value: -1 + }, + ...resourceFormat +] + +// 校本资源为学校ID +tabs.forEach((item) => { + if (item.label == '校本资源') { + item.value = userStore.user.deptId + } +}) + +const structQuery = { + pageNum: 1, + pageSize: 10 +} + +export default defineStore('resource', { + state: () => ({ + tabs, + resourceTypeList, + resourceFormatList, + + searchKey: '', + + //节点数据 + nodeData: {}, + loading: false, + // + isCreate: true, + //查询条件 + query: { + textbookId: '', + fileSource: tabs[0].value, + //资源格式 mp3 ppt ... + fileSuffix: -1, + // 资源类型 课件 素材 教案 + fileFlags: resourceType[0].value, + fileRoot: '资源', + fileName: '', + orderByColumn: 'uploadTime', + isAsc: 'desc', + ...structQuery + }, + //第三方的查询条件 + thirdQuery:{ + page:1, + perPage:20, + chapterId:0, + bookId:0, + stage:0, + subjectId:0, + type:'', + title:'' + }, + result: { + list: [], + total: 0 + }, + //第三方的数据单独处理 + thirdResult:{ + list: [], + total: 0, + }, + }), + actions: { + handleQuery() { + try { + this.loading = true + if(this.query.fileSource !== '第三方'){ + let data = { ...this.query } + if (data.fileSuffix == -1) { + data.fileSuffix = '' + } + getSmarttalkPage(data).then((res) => { + this.result.total = res.total + this.result.list = res.rows + this.loading = false + }) + }else{ + let data = JSON.parse(JSON.stringify(this.thirdQuery)) + if (data.title) { + data.title.trim() + }else{ + data.title = null + } + getBookList(data).then((res) => { + if(res.code === 200){ + if(res.data.code === 0){ + this.thirdResult.total = res.data.page.totalCount + this.thirdResult.list = [...res.data.data] + this.loading = false + } + } + }) + } + } finally { + // this.loading = false + } + }, + changeTab(val) { + this.query.fileSource = val + this.getCreate() + this.handleQuery() + }, + changeType(val) { + this.query.fileFlags = val + this.handleQuery() + }, + thirdChangeType(val) { + this.thirdQuery.type = val + this.handleQuery() + }, + //第三方的切换类型区别开 + changeSuffix(val) { + this.query.fileSuffix = val + this.handleQuery() + }, + // 关键词搜索 + changeName() { + this.handleQuery() + }, + getCreate(){ + if(this.query.fileSource == '平台' || this.query.fileSource == '第三方' ){ + this.isCreate = hasPermission(['platformmanager']) + } + else{ + this.isCreate = hasPermission(['schoolteacher','headmaster']) + } + }, + } +}) diff --git a/src/renderer/src/views/teach/index.vue b/src/renderer/src/views/teach/index.vue new file mode 100644 index 0000000..8078997 --- /dev/null +++ b/src/renderer/src/views/teach/index.vue @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/src/renderer/src/views/teach/standardAnalysis/index.vue b/src/renderer/src/views/teach/standardAnalysis/index.vue new file mode 100644 index 0000000..75b027b --- /dev/null +++ b/src/renderer/src/views/teach/standardAnalysis/index.vue @@ -0,0 +1,556 @@ + + + diff --git a/src/renderer/src/views/testPdf/index.vue b/src/renderer/src/views/testPdf/index.vue new file mode 100644 index 0000000..5030519 --- /dev/null +++ b/src/renderer/src/views/testPdf/index.vue @@ -0,0 +1,24 @@ + + + + diff --git a/src/renderer/src/views/textbookAnalysis/index.vue b/src/renderer/src/views/textbookAnalysis/index.vue new file mode 100644 index 0000000..f48a21c --- /dev/null +++ b/src/renderer/src/views/textbookAnalysis/index.vue @@ -0,0 +1,577 @@ + + + diff --git a/src/renderer/src/views/tool/components/board.vue b/src/renderer/src/views/tool/components/board.vue new file mode 100644 index 0000000..6aa1686 --- /dev/null +++ b/src/renderer/src/views/tool/components/board.vue @@ -0,0 +1,67 @@ + + + \ No newline at end of file diff --git a/src/renderer/src/views/tool/components/homework.vue b/src/renderer/src/views/tool/components/homework.vue new file mode 100644 index 0000000..04505d2 --- /dev/null +++ b/src/renderer/src/views/tool/components/homework.vue @@ -0,0 +1,372 @@ + + + + + \ No newline at end of file diff --git a/src/renderer/src/views/tool/components/imChat.vue b/src/renderer/src/views/tool/components/imChat.vue new file mode 100644 index 0000000..637254c --- /dev/null +++ b/src/renderer/src/views/tool/components/imChat.vue @@ -0,0 +1,116 @@ + + + + + \ No newline at end of file diff --git a/src/renderer/src/views/tool/components/lesson.vue b/src/renderer/src/views/tool/components/lesson.vue new file mode 100644 index 0000000..687693c --- /dev/null +++ b/src/renderer/src/views/tool/components/lesson.vue @@ -0,0 +1,96 @@ + + + + + \ No newline at end of file diff --git a/src/renderer/src/views/tool/components/side.vue b/src/renderer/src/views/tool/components/side.vue new file mode 100644 index 0000000..29083db --- /dev/null +++ b/src/renderer/src/views/tool/components/side.vue @@ -0,0 +1,172 @@ + + + diff --git a/src/renderer/src/views/tool/components/upvote.vue b/src/renderer/src/views/tool/components/upvote.vue new file mode 100644 index 0000000..91c1fcc --- /dev/null +++ b/src/renderer/src/views/tool/components/upvote.vue @@ -0,0 +1,273 @@ + + + + \ No newline at end of file diff --git a/src/renderer/src/views/tool/createHomework.js b/src/renderer/src/views/tool/createHomework.js new file mode 100644 index 0000000..dc1a8cf --- /dev/null +++ b/src/renderer/src/views/tool/createHomework.js @@ -0,0 +1,226 @@ + +import useUserStore from '@/store/modules/user' +import { addClassworkReturnId } from '@/api/teaching/classwork' +import { listClassworkdata } from '@/api/classTask' +import { homeworklist } from '@/api/teaching/classwork' + + + +export const createHomework = ({ uniquekey, evalid, data, entpcourseid }) => { + const usertore = useUserStore().user + + var formObj = {} + formObj.id = 0 + + formObj.deaddate = '' + formObj.entpid = usertore.deptId + formObj.level = 1 + formObj.parentid = 0 + formObj.worktype = '常规作业' + formObj.workkey = '' + formObj.worktag = '' + + formObj.uniquekey = uniquekey + + formObj.classid = 0 + formObj.classcourseid = 0 + + formObj.entpcourseid = entpcourseid + + formObj.slideid = 0 + + formObj.workcodes = JSON.stringify(data) + + formObj.edusubject = usertore.edusubject + formObj.evalid = evalid + + formObj.edustage = usertore.edustage + formObj.status = '' + formObj.edituserid = usertore.userId + formObj.entpcourseworklist = JSON.stringify([{ id: -2, score: '10' }]) + return addClassworkReturnId(formObj) +} + +let classWorkList = [] + +/** + * 获取班级作业 + */ +export const getClassWorkList = async (id) => { + // 班级作业数据,包含多个班级 homeworklist + const response = await homeworklist({ id }) + + /** + * 2024-10-17 由于 后面截止时间加了 时分,特加判断 + * 1、进行中、以前是以明天判断。现改为传当天的日期,并根据当前日期的时分与截止日期进行判断, + * 2、已结束、以前默认是以明天判断。现依然以明天为判断,并根据当前日期时分大于截止日期时分判断。 + */ + + let list = response.rows + + for (var i = 0; i < list.length; i++) { + // 初始化部分新增字段值 + list[i].workdatalist = [] + list[i].workdatacount = 0 // 人数 + list[i].workdatalistVisible = false + list[i].workdatafeedbackcount = 0 // 已交人数 + list[i].feedtimelength = 0 + list[i].rightAnswerCount = 0 + list[i].scoingRate = 0 + '%' // 得分率 + list[i].averagetime = 0 // 平均用时 + + // ---------------------------------------------- + // 处理任务类型的UI + if (list[i].worktype == '学习目标定位') { + list[i].workclass = 'success' + list[i].workcodesList = JSON.parse(list[i].workcodes) + } else if (list[i].worktype == '教材研读') { + list[i].workclass = 'primary' + } else if (list[i].worktype == '框架梳理') { + list[i].workclass = 'warning' + } else if (list[i].worktype == '学科定位') { + list[i].workclass = 'info' + } else if (list[i].worktype == '习题训练') { + list[i].workclass = 'danger' + } else { + list[i].workclass = '' + } + // 如果是习题训练任务,则检查一共有多少道 + if (list[i].entpcourseworklist != '') { + list[i].entpcourseworklistarray = JSON.parse('[' + list[i].entpcourseworklist + ']') + } else { + list[i].entpcourseworklistarray = [] + } + // 根据 classworkdatastudentids 初始化判断分配的人数 + if ( + list[i].classworkdatastudentids != '' && + list[i].classworkdatastudentids != null && + list[i].classworkdatastudentids != 'null' + ) { + const stuList = JSON.parse('[' + list[i].classworkdatastudentids + ']') + list[i].workdatacount = stuList.length + } + } + // 显示分配人数(workdatacount)>0 的 + if (list && list.length > 0) { + classWorkList = list && list.filter((item) => item.workdatacount > 0) + //TODO: 这里没分页,貌似这个 total 不重要,后续看 + } else { + classWorkList = [] + } + + return classWorkList +} + +export const getStudentClassWorkData = async () => { + const ids = classWorkList.map((item) => item.id).join(',') + if (ids == '') { + return + } + const res = await listClassworkdata({ + classworkids: ids, + pageSize: 1000 + }) + + for (var t = 0; t < classWorkList.length; t++) { + for (var i = 0; i < res.rows.length; i++) { + if ( + res.rows[i].classworkid == classWorkList[t].id && + res.rows[i].finishtimelength != '0' + ) { + console.log('==================') + // 有几个学生完成/正在完成学习任务 + // 至少resultcount不是0 + classWorkList[t].workdatafeedbackcount++ + + // 在参与学习任务的人中,汇总计算用时 + classWorkList[t].feedtimelength += parseInt(res.rows[i].finishtimelength) + + // 计算得分率 + if ( + res.rows[i].classworkevallist != '' && + res.rows[i].classworkevallist != null && + res.rows[i].classworkevallist != 'null' + ) { + let replacedString = res.rows[i].classworkevallist.replace(/""/g, '"') + // 将标签中双引号改为转义, 测试数据: "{\"id\":172907, \"rating\":0, \"teacherRating\":0, \"entpcourseworkid\":358520, \"feedcontent\":\"④①⑤③②\", \"score\":4, \"rightanswer\":\"④①⑤③②\"},{\"id\":172908, \"rating\":0, \"teacherRating\":0, \"entpcourseworkid\":358521, \"feedcontent\":\"气壮山威,鲲鹏展翅楚云飞\", \"score\":4, \"rightanswer\":\"志远天高,春风杨柳麓山青\"},{\"id\":172909, \"rating\":0, \"teacherRating\":0, \"entpcourseworkid\":363096, \"feedcontent\":\"《红烛》化用“蜡矩”这一古典意象,赋予它新的含义,赞美了红烛以“蜡炬成灰”来点亮世界的奉献精神。\", \"score\":4, \"rightanswer\":\"《立在地球边上放号》中,全诗采用间接抒情的方式,描绘了太平洋的浪潮,吟唱了一曲惊心动魄的力的颂歌,意在赞美摧毁旧世界、创造新生活的“五四”精神。\"},{\"id\":172910, \"rating\":0, \"teacherRating\":0, \"entpcourseworkid\":363098, \"feedcontent\":\"毛泽东重游橘子洲,面对如画的秋色和大好的革命形势,回忆过去战斗的岁月,不禁心潮起伏,浮想联翩。\", \"score\":4, \"rightanswer\":\"毛泽东重游橘子洲,面对如画的秋色和大好的革命形势,回忆过去战斗的岁月,不禁心潮起伏,浮想联翩。\"},{\"id\":172911, \"rating\":0, \"teacherRating\":0, \"entpcourseworkid\":363100, \"feedcontent\":\"毛泽东重游橘子洲,面对如画的秋色和大好的革命形势,回忆过去战斗的岁月,不禁心潮起伏,浮想联翩。\", \"score\":4, \"rightanswer\":\"毛泽东重游橘子洲,面对如画的秋色和大好的革命形势,回忆过去战斗的岁月,不禁心潮起伏,浮想联翩。\"}" + replacedString = escapeHtmlQuotes(res.rows[i].classworkevallist).replace( + /"(\[.*\])"/g, + '$1' + ) + replacedString = escapeHtmlQuotes(res.rows[i].classworkevallist) + var evalarray + try { + evalarray = JSON.parse('[' + res.rows[i].classworkevallist + ']') + } catch { + evalarray = JSON.parse('[' + replacedString + ']') + } + + for (var e = 0; e < evalarray.length; e++) { + if (res.rows[i].worktype == '常规作业') { + evalarray[e].feedcontent = escapeHtmlQuotes(evalarray[e].feedcontent).replace( + /"(\[.*\])"/g, + '$1' + ) + evalarray[e].feedcontent = escapeHtmlQuotes(evalarray[e].feedcontent) + } + if (evalarray[e].feedcontent == evalarray[e].rightanswer) { + // 正确,得分 + classWorkList[t].rightAnswerCount++ + } + } + } + } + // 当前这个学习任务,共推送给了几个学生,workdatacount + if (res.rows[i].classworkid == classWorkList[t].id) { + classWorkList[t].workdatalist.push(res.rows[i]) + } + } + // 计算完成进度 workdatacount人数要大于0 + if ( + classWorkList[t].workdataresultcount > 0 && + classWorkList[t].workdatacount > 0 + ) { + classWorkList[t].finishpercent = parseInt( + (classWorkList[t].workdataresultcount / classWorkList[t].workdatacount) * 100 + ) + } else { + classWorkList[t].finishpercent = 0 + } + + // 以下四个参数,都要计算 + // 2024-04-12,酉阳,by jackyshen + + // 计算参与学习任务的平均用时 + if (classWorkList[t].workdatafeedbackcount > 0) { + classWorkList[t].averagetime = Math.ceil( + classWorkList[t].feedtimelength / classWorkList[t].workdatafeedbackcount / 60 + ).toFixed(0) + } else { + classWorkList[t].averagetime = 0 + } + + // 计算批阅异常,需要获取每个题目的类型,找出主观题 + // 暂缓 + + // 计算平均得分率: 正确题数/(题目总数*学生人数)*100 + if ( + classWorkList[t].entpcourseworklistarray && + classWorkList[t].entpcourseworklistarray.length > 0 + ) { + var dd = + (classWorkList[t].rightAnswerCount / + (classWorkList[t].entpcourseworklistarray.length * + classWorkList[t].workdatacount)) * + 100 + classWorkList[t].scoingRate = dd.toFixed(0) + '%' + } else { + classWorkList[t].scoingRate = '0%' + } + + + // 设定典型作答,需要获取每个题目的类型,找出主观题 + // 暂缓 + } + return classWorkList +} diff --git a/src/renderer/src/views/tool/directive/drag.js b/src/renderer/src/views/tool/directive/drag.js new file mode 100644 index 0000000..9751fde --- /dev/null +++ b/src/renderer/src/views/tool/directive/drag.js @@ -0,0 +1,123 @@ + +/** + * @description 工具栏-拖拽 自定义指令 + */ +class Drag { + isDrag = false // 是否开始拖拽 + rafId // requestAnimationFrame id + x = 0 // 鼠标按下时的x坐标 + y = 0 // 鼠标按下时的y坐标 + data // 其他参数 元素实际坐标值 + el; handle; // el, handle 挂载元素和拖拽元素 + pos // 拖拽元素实际坐标值 + max // 拖拽元素最大边界 + // 构造器 + constructor(el, binding) { + this.el = el + const { value } = binding + const handleSelector = value instanceof Object ? value.handle : value + if (!!handleSelector) { + if (handleSelector instanceof HTMLElement) this.handle = handleSelector + else { + this.handle = document.querySelector(handleSelector) + // .forEach((child) => { this.handleArray.push(child) }) + } + } + if (!this.handle) this.handle = el // 默认为当前元素 + // 被拖拽元素初始坐标 + const pos = this.handle?.getBoundingClientRect() + this.data = {left:this.toRound(pos.left), top:this.toRound(pos.top)} + this.pos = pos + this.max = {w: window.innerWidth, h: window.innerHeight} + } + // 移入 + down(e) { + this.isDrag = true + const {cx, cy} = this.getMousePos(e) + this.x = cx + this.y = cy + this.getCurPos() // 被拖拽元素初始坐标 + // 手动-触发事件 v-drag-start + this.el.dispatchEvent(new CustomEvent('v-drag-start', {detail:{drag: this}})) + } + // 移动过程 + move = (e) => { + if (!this.isDrag) return + if (this.rafId) cancelAnimationFrame(this.rafId) // 清除上一次动画 + this.rafId = requestAnimationFrame(() => this.updatePosition(e)) + } + // 移出 + up = (e) => { + // e.preventDefault(); // 阻止默认行为 + // e.stopPropagation(); // 阻止事件传播 + this.isDrag = false + cancelAnimationFrame(this.rafId) + this.rafId = null + document.removeEventListener('mousemove', this.move); + document.removeEventListener('mouseup', this.up); + document.addEventListener('touchmove', this.move); + document.addEventListener('touchend', this.up); + // 手动-触发事件 v-drag-start + this.el.dispatchEvent(new CustomEvent('v-drag-end', {detail:{drag: this}})) + } + // 业务逻辑 + updatePosition(e) { + const {cx, cy} = this.getMousePos(e) + const {left, top} = this.data + const dx = cx - this.x + const dy = cy - this.y + this.x = cx + this.y = cy + const {x, y} = this.getPos(left + dx, top + dy) // 调用边界函数 + this.data.left = x // 设置边界-x + this.data.top = y // 设置边界-y + // console.log(JSON.stringify(this)) + this.handle.style.left = `${this.data?.left}px` + this.handle.style.top = `${this.data?.top}px` + this.handle.style.bottom = 'unset' + this.handle.style.transform = 'unset' + this.rafId = requestAnimationFrame(() => this.updatePosition(e)) + } + // 获取鼠标位置 | Get mouse position + getMousePos(e){ + let cx = e.clientX || e.touches[0].clientX + let cy = e.clientY || e.touches[0].clientY + cx = this.toRound(cx) + cy = this.toRound(cy) + return {cx, cy} + } + // 获取移动后坐标 + getPos(x, y) { + // 边界控制:图标元素 + // const w = this.max.w - this.toRound(this.el.clientWidth) + // const h = this.max.h - this.toRound(this.el.clientHeight) + // 边界控制:整个工具 + const w = this.max.w - this.toRound(this.handle.clientWidth) + const h = this.max.h - this.toRound(this.handle.clientHeight) + x = x < 0 ? 0 : x > w ? w : x + y = y < 0 ? 0 : y > h ? h : y + return { x, y } + } + getCurPos(dom) { + const pos = this[dom||'handle']?.getBoundingClientRect() + this.data = {left:this.toRound(pos.left), top:this.toRound(pos.top)} + } + // 小数转整数 + toRound = v => Math.round(v) +} +export default { + mounted(el, binding) { + // const { style } = binding.value + const drag = new Drag(el, binding) + const dragStart = (e) => { + // console.log('start', e) + drag.down(e) + document.addEventListener('mousemove', drag.move); + document.addEventListener('mouseup', drag.up); + document.addEventListener('touchmove', drag.move); + document.addEventListener('touchend', drag.up); + } + el.addEventListener('mousedown', dragStart) + el.addEventListener('touchstart', dragStart) + }, +} \ No newline at end of file diff --git a/src/renderer/src/views/tool/directive/ignore.js b/src/renderer/src/views/tool/directive/ignore.js new file mode 100644 index 0000000..b7e3e26 --- /dev/null +++ b/src/renderer/src/views/tool/directive/ignore.js @@ -0,0 +1,46 @@ +/** + * 处理元素是否穿透-窗口 + */ +import { ipcMsgSend } from '@/utils/tool' +class Ignore { + el // 绑定元素 + binding // 绑定对象(参数) + value // 绑定值 + isAuto // 是否自动控制 + constructor(el, binding) { + this.el = el + this.binding = binding + this.value = binding.value + this.isAuto = !(this.value && this.value instanceof Boolean) + } + // 设置是否穿透 + send(bool) { + ipcMsgSend('tool-sphere:set:ignore', bool) + } + // 监听元素移入移出,自动设置 + mounted() { + this.el.addEventListener('mouseenter', e => { // 进入 + this.send(false) // 元素不穿透,鼠标有效 + this.changeHandle(e) + }) + this.el.addEventListener('mouseleave', e => { // 离开 + this.send(true) // 元素穿透,鼠标无效 + this.changeHandle(e) + }) + } + changeHandle(e) { + const data = {detail:{ignore: this, e, type: e.type}} + const customEvent = new CustomEvent('ignore-mounted', data) + this.el.dispatchEvent(customEvent) + } +} +export default { + mounted(el, binding) { + const ignore = new Ignore(el, binding) + if (ignore.isAuto) { // 自动控制 + ignore.mounted() + } else { // 手动设置 + ignore.send(ignore.value) + } + } +} \ No newline at end of file diff --git a/src/renderer/src/views/tool/sphere.vue b/src/renderer/src/views/tool/sphere.vue new file mode 100644 index 0000000..452a63c --- /dev/null +++ b/src/renderer/src/views/tool/sphere.vue @@ -0,0 +1,330 @@ + + + + + diff --git a/src/renderer/src/views/tool/test.vue b/src/renderer/src/views/tool/test.vue new file mode 100644 index 0000000..49cbbd3 --- /dev/null +++ b/src/renderer/src/views/tool/test.vue @@ -0,0 +1,60 @@ + + + + + \ No newline at end of file